Skip to content

Instantly share code, notes, and snippets.

@Stvad
Last active May 9, 2022 00:13
Show Gist options
  • Save Stvad/e441997e880a47026772cd6872501d2a to your computer and use it in GitHub Desktop.
Save Stvad/e441997e880a47026772cd6872501d2a to your computer and use it in GitHub Desktop.
Parcel-build-issue
// modules are defined as an array
// [ module function, map of requires ]
//
// map of requires is short require name -> numeric require
//
// anything defined in a previous bundle is accessed via the
// orig method which is the require for previous bundles
(function (modules, entry, mainEntry, parcelRequireName, globalName) {
/* eslint-disable no-undef */
var globalObject =
typeof globalThis !== 'undefined'
? globalThis
: typeof self !== 'undefined'
? self
: typeof window !== 'undefined'
? window
: typeof global !== 'undefined'
? global
: {};
/* eslint-enable no-undef */
// Save the require from previous bundle to this closure if any
var previousRequire =
typeof globalObject[parcelRequireName] === 'function' &&
globalObject[parcelRequireName];
var cache = previousRequire.cache || {};
// Do not use `require` to prevent Webpack from trying to bundle this call
var nodeRequire =
typeof module !== 'undefined' &&
typeof module.require === 'function' &&
module.require.bind(module);
function newRequire(name, jumped) {
if (!cache[name]) {
if (!modules[name]) {
// if we cannot find the module within our internal map or
// cache jump to the current global require ie. the last bundle
// that was added to the page.
var currentRequire =
typeof globalObject[parcelRequireName] === 'function' &&
globalObject[parcelRequireName];
if (!jumped && currentRequire) {
return currentRequire(name, true);
}
// If there are other bundles on this page the require from the
// previous one is saved to 'previousRequire'. Repeat this as
// many times as there are bundles until the module is found or
// we exhaust the require chain.
if (previousRequire) {
return previousRequire(name, true);
}
// Try the node require function if it exists.
if (nodeRequire && typeof name === 'string') {
return nodeRequire(name);
}
var err = new Error("Cannot find module '" + name + "'");
err.code = 'MODULE_NOT_FOUND';
throw err;
}
localRequire.resolve = resolve;
localRequire.cache = {};
var module = (cache[name] = new newRequire.Module(name));
modules[name][0].call(
module.exports,
localRequire,
module,
module.exports,
this
);
}
return cache[name].exports;
function localRequire(x) {
var res = localRequire.resolve(x);
return res === false ? {} : newRequire(res);
}
function resolve(x) {
var id = modules[name][1][x];
return id != null ? id : x;
}
}
function Module(moduleName) {
this.id = moduleName;
this.bundle = newRequire;
this.exports = {};
}
newRequire.isParcelRequire = true;
newRequire.Module = Module;
newRequire.modules = modules;
newRequire.cache = cache;
newRequire.parent = previousRequire;
newRequire.register = function (id, exports) {
modules[id] = [
function (require, module) {
module.exports = exports;
},
{},
];
};
Object.defineProperty(newRequire, 'root', {
get: function () {
return globalObject[parcelRequireName];
},
});
globalObject[parcelRequireName] = newRequire;
for (var i = 0; i < entry.length; i++) {
newRequire(entry[i]);
}
if (mainEntry) {
// Expose entry point to Node, AMD or browser globals
// Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
var mainExports = newRequire(mainEntry);
// CommonJS
if (typeof exports === 'object' && typeof module !== 'undefined') {
module.exports = mainExports;
// RequireJS
} else if (typeof define === 'function' && define.amd) {
define(function () {
return mainExports;
});
// <script>
} else if (globalName) {
this[globalName] = mainExports;
}
}
})({"kooYn":[function(require,module,exports) {
"use strict";
/* global chrome, browser */ var env = typeof chrome == 'undefined' ? browser : chrome;
env.runtime.onMessage.addListener(function(msg) {
if (msg.__parcel_hmr_reload__) env.runtime.reload();
});
},{}],"r2Esq":[function(require,module,exports) {
var Refresh = require('react-refresh/runtime');
Refresh.injectIntoGlobalHook(window);
window.$RefreshReg$ = function() {};
window.$RefreshSig$ = function() {
return function(type) {
return type;
};
};
},{"react-refresh/runtime":"iHEsY"}],"iHEsY":[function(require,module,exports) {
'use strict';
module.exports = require('./cjs/react-refresh-runtime.development.js');
},{"./cjs/react-refresh-runtime.development.js":"2ELAt"}],"2ELAt":[function(require,module,exports) {
/** @license React v0.9.0
* react-refresh-runtime.development.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/ 'use strict';
(function() {
// ATTENTION
// When adding new symbols to this file,
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
// nor polyfill, then a plain number is used for performance.
var REACT_ELEMENT_TYPE = 0xeac7;
var REACT_PORTAL_TYPE = 0xeaca;
var REACT_FRAGMENT_TYPE = 0xeacb;
var REACT_STRICT_MODE_TYPE = 0xeacc;
var REACT_PROFILER_TYPE = 0xead2;
var REACT_PROVIDER_TYPE = 0xeacd;
var REACT_CONTEXT_TYPE = 0xeace;
var REACT_FORWARD_REF_TYPE = 0xead0;
var REACT_SUSPENSE_TYPE = 0xead1;
var REACT_SUSPENSE_LIST_TYPE = 0xead8;
var REACT_MEMO_TYPE = 0xead3;
var REACT_LAZY_TYPE = 0xead4;
var REACT_BLOCK_TYPE = 0xead9;
var REACT_SERVER_BLOCK_TYPE = 0xeada;
var REACT_FUNDAMENTAL_TYPE = 0xead5;
var REACT_SCOPE_TYPE = 0xead7;
var REACT_OPAQUE_ID_TYPE = 0xeae0;
var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;
var REACT_OFFSCREEN_TYPE = 0xeae2;
var REACT_LEGACY_HIDDEN_TYPE = 0xeae3;
if (typeof Symbol === 'function' && Symbol.for) {
var symbolFor = Symbol.for;
REACT_ELEMENT_TYPE = symbolFor('react.element');
REACT_PORTAL_TYPE = symbolFor('react.portal');
REACT_FRAGMENT_TYPE = symbolFor('react.fragment');
REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');
REACT_PROFILER_TYPE = symbolFor('react.profiler');
REACT_PROVIDER_TYPE = symbolFor('react.provider');
REACT_CONTEXT_TYPE = symbolFor('react.context');
REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');
REACT_SUSPENSE_TYPE = symbolFor('react.suspense');
REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');
REACT_MEMO_TYPE = symbolFor('react.memo');
REACT_LAZY_TYPE = symbolFor('react.lazy');
REACT_BLOCK_TYPE = symbolFor('react.block');
REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');
REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');
REACT_SCOPE_TYPE = symbolFor('react.scope');
REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id');
REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');
REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen');
REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');
}
var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; // We never remove these associations.
// It's OK to reference families, but use WeakMap/Set for types.
var allFamiliesByID = new Map();
var allFamiliesByType = new PossiblyWeakMap();
var allSignaturesByType = new PossiblyWeakMap(); // This WeakMap is read by React, so we only put families
// that have actually been edited here. This keeps checks fast.
// $FlowIssue
var updatedFamiliesByType = new PossiblyWeakMap(); // This is cleared on every performReactRefresh() call.
// It is an array of [Family, NextType] tuples.
var pendingUpdates = []; // This is injected by the renderer via DevTools global hook.
var helpersByRendererID = new Map();
var helpersByRoot = new Map(); // We keep track of mounted roots so we can schedule updates.
var mountedRoots = new Set(); // If a root captures an error, we remember it so we can retry on edit.
var failedRoots = new Set(); // In environments that support WeakMap, we also remember the last element for every root.
// It needs to be weak because we do this even for roots that failed to mount.
// If there is no WeakMap, we won't attempt to do retrying.
// $FlowIssue
var rootElements = typeof WeakMap === 'function' ? new WeakMap() : null;
var isPerformingRefresh = false;
function computeFullKey(signature) {
if (signature.fullKey !== null) return signature.fullKey;
var fullKey = signature.ownKey;
var hooks;
try {
hooks = signature.getCustomHooks();
} catch (err) {
// This can happen in an edge case, e.g. if expression like Foo.useSomething
// depends on Foo which is lazily initialized during rendering.
// In that case just assume we'll have to remount.
signature.forceReset = true;
signature.fullKey = fullKey;
return fullKey;
}
for(var i = 0; i < hooks.length; i++){
var hook = hooks[i];
if (typeof hook !== 'function') {
// Something's wrong. Assume we need to remount.
signature.forceReset = true;
signature.fullKey = fullKey;
return fullKey;
}
var nestedHookSignature = allSignaturesByType.get(hook);
if (nestedHookSignature === undefined) continue;
var nestedHookKey = computeFullKey(nestedHookSignature);
if (nestedHookSignature.forceReset) signature.forceReset = true;
fullKey += '\n---\n' + nestedHookKey;
}
signature.fullKey = fullKey;
return fullKey;
}
function haveEqualSignatures(prevType, nextType) {
var prevSignature = allSignaturesByType.get(prevType);
var nextSignature = allSignaturesByType.get(nextType);
if (prevSignature === undefined && nextSignature === undefined) return true;
if (prevSignature === undefined || nextSignature === undefined) return false;
if (computeFullKey(prevSignature) !== computeFullKey(nextSignature)) return false;
if (nextSignature.forceReset) return false;
return true;
}
function isReactClass(type) {
return type.prototype && type.prototype.isReactComponent;
}
function canPreserveStateBetween(prevType, nextType) {
if (isReactClass(prevType) || isReactClass(nextType)) return false;
if (haveEqualSignatures(prevType, nextType)) return true;
return false;
}
function resolveFamily(type) {
// Only check updated types to keep lookups fast.
return updatedFamiliesByType.get(type);
} // If we didn't care about IE11, we could use new Map/Set(iterable).
function cloneMap(map) {
var clone = new Map();
map.forEach(function(value, key) {
clone.set(key, value);
});
return clone;
}
function cloneSet(set) {
var clone = new Set();
set.forEach(function(value) {
clone.add(value);
});
return clone;
}
function performReactRefresh() {
if (pendingUpdates.length === 0) return null;
if (isPerformingRefresh) return null;
isPerformingRefresh = true;
try {
var staleFamilies = new Set();
var updatedFamilies = new Set();
var updates = pendingUpdates;
pendingUpdates = [];
updates.forEach(function(_ref) {
var family = _ref[0], nextType = _ref[1];
// Now that we got a real edit, we can create associations
// that will be read by the React reconciler.
var prevType = family.current;
updatedFamiliesByType.set(prevType, family);
updatedFamiliesByType.set(nextType, family);
family.current = nextType; // Determine whether this should be a re-render or a re-mount.
if (canPreserveStateBetween(prevType, nextType)) updatedFamilies.add(family);
else staleFamilies.add(family);
}); // TODO: rename these fields to something more meaningful.
var update = {
updatedFamilies: updatedFamilies,
// Families that will re-render preserving state
staleFamilies: staleFamilies // Families that will be remounted
};
helpersByRendererID.forEach(function(helpers) {
// Even if there are no roots, set the handler on first update.
// This ensures that if *new* roots are mounted, they'll use the resolve handler.
helpers.setRefreshHandler(resolveFamily);
});
var didError = false;
var firstError = null; // We snapshot maps and sets that are mutated during commits.
// If we don't do this, there is a risk they will be mutated while
// we iterate over them. For example, trying to recover a failed root
// may cause another root to be added to the failed list -- an infinite loop.
var failedRootsSnapshot = cloneSet(failedRoots);
var mountedRootsSnapshot = cloneSet(mountedRoots);
var helpersByRootSnapshot = cloneMap(helpersByRoot);
failedRootsSnapshot.forEach(function(root) {
var helpers = helpersByRootSnapshot.get(root);
if (helpers === undefined) throw new Error('Could not find helpers for a root. This is a bug in React Refresh.');
failedRoots.has(root);
if (rootElements === null) return;
if (!rootElements.has(root)) return;
var element = rootElements.get(root);
try {
helpers.scheduleRoot(root, element);
} catch (err) {
if (!didError) {
didError = true;
firstError = err;
} // Keep trying other roots.
}
});
mountedRootsSnapshot.forEach(function(root) {
var helpers = helpersByRootSnapshot.get(root);
if (helpers === undefined) throw new Error('Could not find helpers for a root. This is a bug in React Refresh.');
mountedRoots.has(root);
try {
helpers.scheduleRefresh(root, update);
} catch (err) {
if (!didError) {
didError = true;
firstError = err;
} // Keep trying other roots.
}
});
if (didError) throw firstError;
return update;
} finally{
isPerformingRefresh = false;
}
}
function register(type, id) {
if (type === null) return;
if (typeof type !== 'function' && typeof type !== 'object') return;
// This can happen in an edge case, e.g. if we register
// return value of a HOC but it returns a cached component.
// Ignore anything but the first registration for each type.
if (allFamiliesByType.has(type)) return;
// Create family or remember to update it.
// None of this bookkeeping affects reconciliation
// until the first performReactRefresh() call above.
var family = allFamiliesByID.get(id);
if (family === undefined) {
family = {
current: type
};
allFamiliesByID.set(id, family);
} else pendingUpdates.push([
family,
type
]);
allFamiliesByType.set(type, family); // Visit inner types because we might not have registered them.
if (typeof type === 'object' && type !== null) switch(type.$$typeof){
case REACT_FORWARD_REF_TYPE:
register(type.render, id + '$render');
break;
case REACT_MEMO_TYPE:
register(type.type, id + '$type');
break;
}
}
function setSignature(type, key) {
var forceReset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var getCustomHooks = arguments.length > 3 ? arguments[3] : undefined;
allSignaturesByType.set(type, {
forceReset: forceReset,
ownKey: key,
fullKey: null,
getCustomHooks: getCustomHooks || function() {
return [];
}
});
} // This is lazily called during first render for a type.
// It captures Hook list at that time so inline requires don't break comparisons.
function collectCustomHooksForSignature(type) {
var signature = allSignaturesByType.get(type);
if (signature !== undefined) computeFullKey(signature);
}
function getFamilyByID(id) {
return allFamiliesByID.get(id);
}
function getFamilyByType(type) {
return allFamiliesByType.get(type);
}
function findAffectedHostInstances(families) {
var affectedInstances = new Set();
mountedRoots.forEach(function(root) {
var helpers = helpersByRoot.get(root);
if (helpers === undefined) throw new Error('Could not find helpers for a root. This is a bug in React Refresh.');
var instancesForRoot = helpers.findHostInstancesForRefresh(root, families);
instancesForRoot.forEach(function(inst) {
affectedInstances.add(inst);
});
});
return affectedInstances;
}
function injectIntoGlobalHook(globalObject) {
// For React Native, the global hook will be set up by require('react-devtools-core').
// That code will run before us. So we need to monkeypatch functions on existing hook.
// For React Web, the global hook will be set up by the extension.
// This will also run before us.
var hook = globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__;
if (hook === undefined) {
// However, if there is no DevTools extension, we'll need to set up the global hook ourselves.
// Note that in this case it's important that renderer code runs *after* this method call.
// Otherwise, the renderer will think that there is no global hook, and won't do the injection.
var nextID = 0;
globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook = {
renderers: new Map(),
supportsFiber: true,
inject: function(injected) {
return nextID++;
},
onScheduleFiberRoot: function(id, root, children) {},
onCommitFiberRoot: function(id, root, maybePriorityLevel, didError) {},
onCommitFiberUnmount: function() {}
};
} // Here, we just want to get a reference to scheduleRefresh.
var oldInject = hook.inject;
hook.inject = function(injected) {
var id = oldInject.apply(this, arguments);
if (typeof injected.scheduleRefresh === 'function' && typeof injected.setRefreshHandler === 'function') // This version supports React Refresh.
helpersByRendererID.set(id, injected);
return id;
}; // Do the same for any already injected roots.
// This is useful if ReactDOM has already been initialized.
// https://github.com/facebook/react/issues/17626
hook.renderers.forEach(function(injected, id) {
if (typeof injected.scheduleRefresh === 'function' && typeof injected.setRefreshHandler === 'function') // This version supports React Refresh.
helpersByRendererID.set(id, injected);
}); // We also want to track currently mounted roots.
var oldOnCommitFiberRoot = hook.onCommitFiberRoot;
var oldOnScheduleFiberRoot = hook.onScheduleFiberRoot || function() {};
hook.onScheduleFiberRoot = function(id, root, children) {
if (!isPerformingRefresh) {
// If it was intentionally scheduled, don't attempt to restore.
// This includes intentionally scheduled unmounts.
failedRoots.delete(root);
if (rootElements !== null) rootElements.set(root, children);
}
return oldOnScheduleFiberRoot.apply(this, arguments);
};
hook.onCommitFiberRoot = function(id, root, maybePriorityLevel, didError) {
var helpers = helpersByRendererID.get(id);
if (helpers === undefined) return;
helpersByRoot.set(root, helpers);
var current = root.current;
var alternate = current.alternate; // We need to determine whether this root has just (un)mounted.
// This logic is copy-pasted from similar logic in the DevTools backend.
// If this breaks with some refactoring, you'll want to update DevTools too.
if (alternate !== null) {
var wasMounted = alternate.memoizedState != null && alternate.memoizedState.element != null;
var isMounted = current.memoizedState != null && current.memoizedState.element != null;
if (!wasMounted && isMounted) {
// Mount a new root.
mountedRoots.add(root);
failedRoots.delete(root);
} else if (wasMounted && isMounted) ;
else if (wasMounted && !isMounted) {
// Unmount an existing root.
mountedRoots.delete(root);
if (didError) // We'll remount it on future edits.
failedRoots.add(root);
else helpersByRoot.delete(root);
} else if (!wasMounted && !isMounted) {
if (didError) // We'll remount it on future edits.
failedRoots.add(root);
}
} else // Mount a new root.
mountedRoots.add(root);
return oldOnCommitFiberRoot.apply(this, arguments);
};
}
function hasUnrecoverableErrors() {
// TODO: delete this after removing dependency in RN.
return false;
} // Exposed for testing.
function _getMountedRootCount() {
return mountedRoots.size;
} // This is a wrapper over more primitive functions for setting signature.
// Signatures let us decide whether the Hook order has changed on refresh.
//
// This function is intended to be used as a transform target, e.g.:
// var _s = createSignatureFunctionForTransform()
//
// function Hello() {
// const [foo, setFoo] = useState(0);
// const value = useCustomHook();
// _s(); /* Second call triggers collecting the custom Hook list.
// * This doesn't happen during the module evaluation because we
// * don't want to change the module order with inline requires.
// * Next calls are noops. */
// return <h1>Hi</h1>;
// }
//
// /* First call specifies the signature: */
// _s(
// Hello,
// 'useState{[foo, setFoo]}(0)',
// () => [useCustomHook], /* Lazy to avoid triggering inline requires */
// );
function createSignatureFunctionForTransform() {
// We'll fill in the signature in two steps.
// First, we'll know the signature itself. This happens outside the component.
// Then, we'll know the references to custom Hooks. This happens inside the component.
// After that, the returned function will be a fast path no-op.
var status = 'needsSignature';
var savedType;
var hasCustomHooks;
return function(type, key, forceReset, getCustomHooks) {
switch(status){
case 'needsSignature':
if (type !== undefined) {
// If we received an argument, this is the initial registration call.
savedType = type;
hasCustomHooks = typeof getCustomHooks === 'function';
setSignature(type, key, forceReset, getCustomHooks); // The next call we expect is from inside a function, to fill in the custom Hooks.
status = 'needsCustomHooks';
}
break;
case 'needsCustomHooks':
if (hasCustomHooks) collectCustomHooksForSignature(savedType);
status = 'resolved';
break;
}
return type;
};
}
function isLikelyComponentType(type) {
switch(typeof type){
case 'function':
// First, deal with classes.
if (type.prototype != null) {
if (type.prototype.isReactComponent) // React class.
return true;
var ownNames = Object.getOwnPropertyNames(type.prototype);
if (ownNames.length > 1 || ownNames[0] !== 'constructor') // This looks like a class.
return false;
// eslint-disable-next-line no-proto
if (type.prototype.__proto__ !== Object.prototype) // It has a superclass.
return false;
// Pass through.
// This looks like a regular function with empty prototype.
} // For plain functions and arrows, use name as a heuristic.
var name = type.name || type.displayName;
return typeof name === 'string' && /^[A-Z]/.test(name);
case 'object':
if (type != null) switch(type.$$typeof){
case REACT_FORWARD_REF_TYPE:
case REACT_MEMO_TYPE:
// Definitely React components.
return true;
default:
return false;
}
return false;
default:
return false;
}
}
exports._getMountedRootCount = _getMountedRootCount;
exports.collectCustomHooksForSignature = collectCustomHooksForSignature;
exports.createSignatureFunctionForTransform = createSignatureFunctionForTransform;
exports.findAffectedHostInstances = findAffectedHostInstances;
exports.getFamilyByID = getFamilyByID;
exports.getFamilyByType = getFamilyByType;
exports.hasUnrecoverableErrors = hasUnrecoverableErrors;
exports.injectIntoGlobalHook = injectIntoGlobalHook;
exports.isLikelyComponentType = isLikelyComponentType;
exports.performReactRefresh = performReactRefresh;
exports.register = register;
exports.setSignature = setSignature;
})();
},{}],"5CmU8":[function(require,module,exports) {
var HMR_HOST = null;
var HMR_PORT = 1234;
var HMR_SECURE = false;
var HMR_ENV_HASH = "7cd8f9507a2eefe6";
module.bundle.HMR_BUNDLE_ID = "8aed77609fe39aa7";
"use strict";
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _iterableToArray(iter) {
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) return _arrayLikeToArray(arr);
}
function _createForOfIteratorHelper(o, allowArrayLike) {
var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
if (!it) {
if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
if (it) o = it;
var i = 0;
var F = function F() {};
return {
s: F,
n: function n() {
if (i >= o.length) return {
done: true
};
return {
done: false,
value: o[i++]
};
},
e: function e(_e) {
throw _e;
},
f: F
};
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var normalCompletion = true, didErr = false, err;
return {
s: function s() {
it = it.call(o);
},
n: function n() {
var step = it.next();
normalCompletion = step.done;
return step;
},
e: function e(_e2) {
didErr = true;
err = _e2;
},
f: function f() {
try {
if (!normalCompletion && it.return != null) it.return();
} finally{
if (didErr) throw err;
}
}
};
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
if (typeof o === "string") return _arrayLikeToArray(o, minLen);
var n = Object.prototype.toString.call(o).slice(8, -1);
if (n === "Object" && o.constructor) n = o.constructor.name;
if (n === "Map" || n === "Set") return Array.from(o);
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
}
function _arrayLikeToArray(arr, len) {
if (len == null || len > arr.length) len = arr.length;
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
return arr2;
}
/* global HMR_HOST, HMR_PORT, HMR_ENV_HASH, HMR_SECURE, chrome, browser */ /*::
import type {
HMRAsset,
HMRMessage,
} from '@parcel/reporter-dev-server/src/HMRServer.js';
interface ParcelRequire {
(string): mixed;
cache: {|[string]: ParcelModule|};
hotData: mixed;
Module: any;
parent: ?ParcelRequire;
isParcelRequire: true;
modules: {|[string]: [Function, {|[string]: string|}]|};
HMR_BUNDLE_ID: string;
root: ParcelRequire;
}
interface ParcelModule {
hot: {|
data: mixed,
accept(cb: (Function) => void): void,
dispose(cb: (mixed) => void): void,
// accept(deps: Array<string> | string, cb: (Function) => void): void,
// decline(): void,
_acceptCallbacks: Array<(Function) => void>,
_disposeCallbacks: Array<(mixed) => void>,
|};
}
interface ExtensionContext {
runtime: {|
reload(): void,
|};
}
declare var module: {bundle: ParcelRequire, ...};
declare var HMR_HOST: string;
declare var HMR_PORT: string;
declare var HMR_ENV_HASH: string;
declare var HMR_SECURE: boolean;
declare var chrome: ExtensionContext;
declare var browser: ExtensionContext;
*/ var OVERLAY_ID = '__parcel__error__overlay__';
var OldModule = module.bundle.Module;
function Module(moduleName) {
OldModule.call(this, moduleName);
this.hot = {
data: module.bundle.hotData,
_acceptCallbacks: [],
_disposeCallbacks: [],
accept: function accept(fn) {
this._acceptCallbacks.push(fn || function() {});
},
dispose: function dispose(fn) {
this._disposeCallbacks.push(fn);
}
};
module.bundle.hotData = undefined;
}
module.bundle.Module = Module;
var checkedAssets, acceptedAssets, assetsToAccept /*: Array<[ParcelRequire, string]> */ ;
function getHostname() {
return HMR_HOST || (location.protocol.indexOf('http') === 0 ? location.hostname : 'localhost');
}
function getPort() {
return HMR_PORT || location.port;
} // eslint-disable-next-line no-redeclare
var parent = module.bundle.parent;
if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') {
var hostname = getHostname();
var port = getPort();
var protocol = HMR_SECURE || location.protocol == 'https:' && !/localhost|127.0.0.1|0.0.0.0/.test(hostname) ? 'wss' : 'ws';
var ws = new WebSocket(protocol + '://' + hostname + (port ? ':' + port : '') + '/'); // $FlowFixMe
ws.onmessage = function(event) {
checkedAssets = {} /*: {|[string]: boolean|} */ ;
acceptedAssets = {} /*: {|[string]: boolean|} */ ;
assetsToAccept = [];
var data = JSON.parse(event.data);
if (data.type === 'update') {
// Remove error overlay if there is one
if (typeof document !== 'undefined') removeErrorOverlay();
var assets = data.assets.filter(function(asset) {
return asset.envHash === HMR_ENV_HASH;
}); // Handle HMR Update
var handled = assets.every(function(asset) {
return asset.type === 'css' || asset.type === 'js' && hmrAcceptCheck(module.bundle.root, asset.id, asset.depsByBundle);
});
if (handled) {
console.clear();
assets.forEach(function(asset) {
hmrApply(module.bundle.root, asset);
});
for(var i = 0; i < assetsToAccept.length; i++){
var id = assetsToAccept[i][1];
if (!acceptedAssets[id]) hmrAcceptRun(assetsToAccept[i][0], id);
}
} else if ('reload' in location) location.reload();
else {
// Web extension context
var ext = typeof chrome === 'undefined' ? typeof browser === 'undefined' ? null : browser : chrome;
if (ext && ext.runtime && ext.runtime.reload) ext.runtime.reload();
}
}
if (data.type === 'error') {
// Log parcel errors to console
var _iterator = _createForOfIteratorHelper(data.diagnostics.ansi), _step;
try {
for(_iterator.s(); !(_step = _iterator.n()).done;){
var ansiDiagnostic = _step.value;
var stack = ansiDiagnostic.codeframe ? ansiDiagnostic.codeframe : ansiDiagnostic.stack;
console.error('🚨 [parcel]: ' + ansiDiagnostic.message + '\n' + stack + '\n\n' + ansiDiagnostic.hints.join('\n'));
}
} catch (err) {
_iterator.e(err);
} finally{
_iterator.f();
}
if (typeof document !== 'undefined') {
// Render the fancy html overlay
removeErrorOverlay();
var overlay = createErrorOverlay(data.diagnostics.html); // $FlowFixMe
document.body.appendChild(overlay);
}
}
};
ws.onerror = function(e) {
console.error(e.message);
};
ws.onclose = function() {
console.warn('[parcel] 🚨 Connection to the HMR server was lost');
};
}
function removeErrorOverlay() {
var overlay = document.getElementById(OVERLAY_ID);
if (overlay) {
overlay.remove();
console.log('[parcel] ✨ Error resolved');
}
}
function createErrorOverlay(diagnostics) {
var overlay = document.createElement('div');
overlay.id = OVERLAY_ID;
var errorHTML = '<div style="background: black; opacity: 0.85; font-size: 16px; color: white; position: fixed; height: 100%; width: 100%; top: 0px; left: 0px; padding: 30px; font-family: Menlo, Consolas, monospace; z-index: 9999;">';
var _iterator2 = _createForOfIteratorHelper(diagnostics), _step2;
try {
for(_iterator2.s(); !(_step2 = _iterator2.n()).done;){
var diagnostic = _step2.value;
var stack = diagnostic.codeframe ? diagnostic.codeframe : diagnostic.stack;
errorHTML += "\n <div>\n <div style=\"font-size: 18px; font-weight: bold; margin-top: 20px;\">\n \uD83D\uDEA8 ".concat(diagnostic.message, "\n </div>\n <pre>").concat(stack, "</pre>\n <div>\n ").concat(diagnostic.hints.map(function(hint) {
return '<div>💡 ' + hint + '</div>';
}).join(''), "\n </div>\n ").concat(diagnostic.documentation ? "<div>\uD83D\uDCDD <a style=\"color: violet\" href=\"".concat(diagnostic.documentation, "\" target=\"_blank\">Learn more</a></div>") : '', "\n </div>\n ");
}
} catch (err) {
_iterator2.e(err);
} finally{
_iterator2.f();
}
errorHTML += '</div>';
overlay.innerHTML = errorHTML;
return overlay;
}
function getParents(bundle, id) /*: Array<[ParcelRequire, string]> */ {
var modules = bundle.modules;
if (!modules) return [];
var parents = [];
var k, d, dep;
for(k in modules)for(d in modules[k][1]){
dep = modules[k][1][d];
if (dep === id || Array.isArray(dep) && dep[dep.length - 1] === id) parents.push([
bundle,
k
]);
}
if (bundle.parent) parents = parents.concat(getParents(bundle.parent, id));
return parents;
}
function updateLink(link) {
var newLink = link.cloneNode();
newLink.onload = function() {
if (link.parentNode !== null) // $FlowFixMe
link.parentNode.removeChild(link);
};
newLink.setAttribute('href', link.getAttribute('href').split('?')[0] + '?' + Date.now()); // $FlowFixMe
link.parentNode.insertBefore(newLink, link.nextSibling);
}
var cssTimeout = null;
function reloadCSS() {
if (cssTimeout) return;
cssTimeout = setTimeout(function() {
var links = document.querySelectorAll('link[rel="stylesheet"]');
for(var i = 0; i < links.length; i++){
// $FlowFixMe[incompatible-type]
var href = links[i].getAttribute('href');
var hostname = getHostname();
var servedFromHMRServer = hostname === 'localhost' ? new RegExp('^(https?:\\/\\/(0.0.0.0|127.0.0.1)|localhost):' + getPort()).test(href) : href.indexOf(hostname + ':' + getPort());
var absolute = /^https?:\/\//i.test(href) && href.indexOf(location.origin) !== 0 && !servedFromHMRServer;
if (!absolute) updateLink(links[i]);
}
cssTimeout = null;
}, 50);
}
function hmrApply(bundle, asset) {
var modules = bundle.modules;
if (!modules) return;
if (asset.type === 'css') reloadCSS();
else if (asset.type === 'js') {
var deps = asset.depsByBundle[bundle.HMR_BUNDLE_ID];
if (deps) {
if (modules[asset.id]) {
// Remove dependencies that are removed and will become orphaned.
// This is necessary so that if the asset is added back again, the cache is gone, and we prevent a full page reload.
var oldDeps = modules[asset.id][1];
for(var dep in oldDeps)if (!deps[dep] || deps[dep] !== oldDeps[dep]) {
var id = oldDeps[dep];
var parents = getParents(module.bundle.root, id);
if (parents.length === 1) hmrDelete(module.bundle.root, id);
}
}
var fn = new Function('require', 'module', 'exports', asset.output);
modules[asset.id] = [
fn,
deps
];
} else if (bundle.parent) hmrApply(bundle.parent, asset);
}
}
function hmrDelete(bundle, id1) {
var modules = bundle.modules;
if (!modules) return;
if (modules[id1]) {
// Collect dependencies that will become orphaned when this module is deleted.
var deps = modules[id1][1];
var orphans = [];
for(var dep in deps){
var parents = getParents(module.bundle.root, deps[dep]);
if (parents.length === 1) orphans.push(deps[dep]);
} // Delete the module. This must be done before deleting dependencies in case of circular dependencies.
delete modules[id1];
delete bundle.cache[id1]; // Now delete the orphans.
orphans.forEach(function(id) {
hmrDelete(module.bundle.root, id);
});
} else if (bundle.parent) hmrDelete(bundle.parent, id1);
}
function hmrAcceptCheck(bundle, id, depsByBundle) {
if (hmrAcceptCheckOne(bundle, id, depsByBundle)) return true;
// Traverse parents breadth first. All possible ancestries must accept the HMR update, or we'll reload.
var parents = getParents(module.bundle.root, id);
var accepted = false;
while(parents.length > 0){
var v = parents.shift();
var a = hmrAcceptCheckOne(v[0], v[1], null);
if (a) // If this parent accepts, stop traversing upward, but still consider siblings.
accepted = true;
else {
// Otherwise, queue the parents in the next level upward.
var p = getParents(module.bundle.root, v[1]);
if (p.length === 0) {
// If there are no parents, then we've reached an entry without accepting. Reload.
accepted = false;
break;
}
parents.push.apply(parents, _toConsumableArray(p));
}
}
return accepted;
}
function hmrAcceptCheckOne(bundle, id, depsByBundle) {
var modules = bundle.modules;
if (!modules) return;
if (depsByBundle && !depsByBundle[bundle.HMR_BUNDLE_ID]) {
// If we reached the root bundle without finding where the asset should go,
// there's nothing to do. Mark as "accepted" so we don't reload the page.
if (!bundle.parent) return true;
return hmrAcceptCheck(bundle.parent, id, depsByBundle);
}
if (checkedAssets[id]) return true;
checkedAssets[id] = true;
var cached = bundle.cache[id];
assetsToAccept.push([
bundle,
id
]);
if (!cached || cached.hot && cached.hot._acceptCallbacks.length) return true;
}
function hmrAcceptRun(bundle, id) {
var cached = bundle.cache[id];
bundle.hotData = {};
if (cached && cached.hot) cached.hot.data = bundle.hotData;
if (cached && cached.hot && cached.hot._disposeCallbacks.length) cached.hot._disposeCallbacks.forEach(function(cb) {
cb(bundle.hotData);
});
delete bundle.cache[id];
bundle(id);
cached = bundle.cache[id];
if (cached && cached.hot && cached.hot._acceptCallbacks.length) cached.hot._acceptCallbacks.forEach(function(cb) {
var assetsToAlsoAccept = cb(function() {
return getParents(module.bundle.root, id);
});
if (assetsToAlsoAccept && assetsToAccept.length) // $FlowFixMe[method-unbinding]
assetsToAccept.push.apply(assetsToAccept, assetsToAlsoAccept);
});
acceptedAssets[id] = true;
}
},{}],"8iMmq":[function(require,module,exports) {
var _optionsStorage = require("./options/options-storage");
var _webextensionPolyfill = require("webextension-polyfill"); // compatibility between v2 and v3 manifest
_webextensionPolyfill.action?.onClicked.addListener(async ()=>_webextensionPolyfill.runtime.openOptionsPage()
);
_webextensionPolyfill.browserAction?.onClicked.addListener(async ()=>_webextensionPolyfill.runtime.openOptionsPage()
);
const copyPageFragment = 'copy-page-fragment';
_webextensionPolyfill.contextMenus.create({
id: copyPageFragment,
title: 'Copy Page Fragment',
contexts: [
'all'
]
});
_webextensionPolyfill.contextMenus.onClicked.addListener((info, tab)=>{
if (info.menuItemId === copyPageFragment) _webextensionPolyfill.tabs.sendMessage(tab?.id, {
type: copyPageFragment,
elementId: info.targetElementId
});
});
},{"./options/options-storage":"aFPxT","webextension-polyfill":"kPFTQ"}],"aFPxT":[function(require,module,exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
parcelHelpers.export(exports, "optionsStorage", ()=>optionsStorage
);
parcelHelpers.export(exports, "Options", ()=>Options
);
var _webextOptionsSync = require("webext-options-sync");
var _webextOptionsSyncDefault = parcelHelpers.interopDefault(_webextOptionsSync);
var _iframe = require("./defaults/iframe");
const defaults = {
renderBlocklist: 'gwern.net, wikipedia.org, youtube.com, roam.garden',
iframeDomainWhitelist: _iframe.whitelistDomains.join(', '),
iframeSubdomainWhitelist: _iframe.allowSubdomainsFrom.join(', ')
};
const optionsStorage = new _webextOptionsSyncDefault.default({
defaults,
migrations: [
_webextOptionsSyncDefault.default.migrations.removeUnused
],
logging: true,
storageType: 'local'
});
const Options = {
async all () {
return await optionsStorage.getAll();
},
renderBlocklist: csvSetting('renderBlocklist'),
iframe: {
domainWhitelist: csvSetting('iframeDomainWhitelist'),
subdomainWhitelist: csvSetting('iframeSubdomainWhitelist')
}
};
function csvSetting(name) {
return async ()=>{
const all = await Options.all();
return parseCsv(all[name]);
};
}
const parseCsv = (csv)=>csv.split(',').map((s)=>s.trim()
)
;
},{"webext-options-sync":"5Apzs","./defaults/iframe":"V5L4L","@parcel/transformer-js/src/esmodule-helpers.js":"8ISrk"}],"5Apzs":[function(require,module,exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
parcelHelpers.export(exports, "default", ()=>OptionsSync
);
var _webextDetectPage = require("webext-detect-page");
function throttle(delay, noTrailing, callback, debounceMode) {
var timeoutID;
var cancelled = false;
var lastExec = 0;
function clearExistingTimeout() {
timeoutID && clearTimeout(timeoutID);
}
if ("boolean" != typeof noTrailing) {
debounceMode = callback;
callback = noTrailing;
noTrailing = void 0;
}
function wrapper() {
for(var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++)arguments_[_key] = arguments[_key];
var self = this;
var elapsed = Date.now() - lastExec;
if (!cancelled) {
debounceMode && !timeoutID && exec();
clearExistingTimeout();
void 0 === debounceMode && elapsed > delay ? exec() : true !== noTrailing && (timeoutID = setTimeout(debounceMode ? clear : exec, void 0 === debounceMode ? delay - elapsed : delay));
}
function exec() {
lastExec = Date.now();
callback.apply(self, arguments_);
}
function clear() {
timeoutID = void 0;
}
}
wrapper.cancel = function() {
clearExistingTimeout();
cancelled = true;
};
return wrapper;
}
class TypeRegistry {
constructor(initial = {}){
this.registeredTypes = initial;
}
get(type) {
return void 0 !== this.registeredTypes[type] ? this.registeredTypes[type] : this.registeredTypes.default;
}
register(type, item) {
void 0 === this.registeredTypes[type] && (this.registeredTypes[type] = item);
}
registerDefault(item) {
this.register("default", item);
}
}
class KeyExtractors extends TypeRegistry {
constructor(options){
super(options);
this.registerDefault((el)=>el.getAttribute("name") || ""
);
}
}
class InputReaders extends TypeRegistry {
constructor(options1){
super(options1);
this.registerDefault((el)=>el.value
);
this.register("checkbox", (el)=>null !== el.getAttribute("value") ? el.checked ? el.getAttribute("value") : null : el.checked
);
this.register("select", (el)=>(function(elem) {
var value, option, i;
var options = elem.options;
var index = elem.selectedIndex;
var one = "select-one" === elem.type;
var values = one ? null : [];
var max = one ? index + 1 : options.length;
i = index < 0 ? max : one ? index : 0;
for(; i < max; i++)if (((option = options[i]).selected || i === index) && !option.disabled && !(option.parentNode.disabled && "optgroup" === option.parentNode.tagName.toLowerCase())) {
value = option.value;
if (one) return value;
values.push(value);
}
return values;
})(el)
);
}
}
class KeyAssignmentValidators extends TypeRegistry {
constructor(options){
super(options);
this.registerDefault(()=>true
);
this.register("radio", (el)=>el.checked
);
}
}
function keySplitter(key) {
let matches = key.match(/[^[\]]+/g);
let lastKey;
if (key.length > 1 && key.indexOf("[]") === key.length - 2) {
lastKey = matches.pop();
matches.push([
lastKey
]);
}
return matches;
}
function getElementType(el) {
let typeAttr;
let tagName = el.tagName;
let type = tagName;
if ("input" === tagName.toLowerCase()) {
typeAttr = el.getAttribute("type");
type = typeAttr || "text";
}
return type.toLowerCase();
}
function getInputElements(element, options) {
return Array.prototype.filter.call(element.querySelectorAll("input,select,textarea"), (el)=>{
if ("input" === el.tagName.toLowerCase() && ("submit" === el.type || "reset" === el.type)) return false;
let myType = getElementType(el);
let identifier = options.keyExtractors.get(myType)(el);
let foundInInclude = -1 !== (options.include || []).indexOf(identifier);
let foundInExclude = -1 !== (options.exclude || []).indexOf(identifier);
let foundInIgnored = false;
let reject = false;
if (options.ignoredTypes) for (let selector of options.ignoredTypes)el.matches(selector) && (foundInIgnored = true);
reject = !foundInInclude && (!!options.include || foundInExclude || foundInIgnored);
return !reject;
});
}
function assignKeyValue(obj, keychain, value) {
if (!keychain) return obj;
var key = keychain.shift();
obj[key] || (obj[key] = Array.isArray(key) ? [] : {});
0 === keychain.length && (Array.isArray(obj[key]) ? null !== value && obj[key].push(value) : obj[key] = value);
keychain.length > 0 && assignKeyValue(obj[key], keychain, value);
return obj;
}
function serialize(element, options = {}) {
let data = {};
options.keySplitter = options.keySplitter || keySplitter;
options.keyExtractors = new KeyExtractors(options.keyExtractors || {});
options.inputReaders = new InputReaders(options.inputReaders || {});
options.keyAssignmentValidators = new KeyAssignmentValidators(options.keyAssignmentValidators || {});
Array.prototype.forEach.call(getInputElements(element, options), (el)=>{
let type = getElementType(el);
let key = options.keyExtractors.get(type)(el);
let value = options.inputReaders.get(type)(el);
if (options.keyAssignmentValidators.get(type)(el, key, value)) {
let keychain = options.keySplitter(key);
data = assignKeyValue(data, keychain, value);
}
});
return data;
}
class InputWriters extends TypeRegistry {
constructor(options){
super(options);
this.registerDefault((el, value)=>{
el.value = value;
});
this.register("checkbox", (el, value)=>{
null === value ? el.indeterminate = true : el.checked = Array.isArray(value) ? -1 !== value.indexOf(el.value) : value;
});
this.register("radio", function(el, value) {
void 0 !== value && (el.checked = el.value === value.toString());
});
this.register("select", setSelectValue);
}
}
function setSelectValue(elem, value) {
var optionSet, option;
var options = elem.options;
var values = function(arr) {
var ret = [];
null !== arr && (Array.isArray(arr) ? ret.push.apply(ret, arr) : ret.push(arr));
return ret;
}(value);
var i = options.length;
for(; i--;){
option = options[i];
if (values.indexOf(option.value) > -1) {
option.setAttribute("selected", true);
optionSet = true;
}
}
optionSet || (elem.selectedIndex = -1);
}
function keyJoiner(parentKey, childKey) {
return parentKey + "[" + childKey + "]";
}
function flattenData(data, parentKey, options = {}) {
let flatData = {};
let keyJoiner$1 = options.keyJoiner || keyJoiner;
for(let keyName in data){
if (!data.hasOwnProperty(keyName)) continue;
let value = data[keyName];
let hash = {};
parentKey && (keyName = keyJoiner$1(parentKey, keyName));
if (Array.isArray(value)) {
hash[keyName + "[]"] = value;
hash[keyName] = value;
} else "object" == typeof value ? hash = flattenData(value, keyName, options) : hash[keyName] = value;
Object.assign(flatData, hash);
}
return flatData;
}
function deserialize(form, data, options = {}) {
let flattenedData = flattenData(data, null, options);
options.keyExtractors = new KeyExtractors(options.keyExtractors || {});
options.inputWriters = new InputWriters(options.inputWriters || {});
Array.prototype.forEach.call(getInputElements(form, options), (el)=>{
let type = getElementType(el);
let key = options.keyExtractors.get(type)(el);
options.inputWriters.get(type)(el, flattenedData[key]);
});
}
var lzString = {
exports: {}
};
module = lzString, LZString = function() {
var f = String.fromCharCode;
var keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$";
var baseReverseDic = {};
function getBaseValue(alphabet, character) {
if (!baseReverseDic[alphabet]) {
baseReverseDic[alphabet] = {};
for(var i = 0; i < alphabet.length; i++)baseReverseDic[alphabet][alphabet.charAt(i)] = i;
}
return baseReverseDic[alphabet][character];
}
var LZString1 = {
compressToBase64: function(input) {
if (null == input) return "";
var res = LZString1._compress(input, 6, function(a) {
return keyStrBase64.charAt(a);
});
switch(res.length % 4){
default:
case 0:
return res;
case 1:
return res + "===";
case 2:
return res + "==";
case 3:
return res + "=";
}
},
decompressFromBase64: function(input) {
return null == input ? "" : "" == input ? null : LZString1._decompress(input.length, 32, function(index) {
return getBaseValue(keyStrBase64, input.charAt(index));
});
},
compressToUTF16: function(input) {
return null == input ? "" : LZString1._compress(input, 15, function(a) {
return f(a + 32);
}) + " ";
},
decompressFromUTF16: function(compressed) {
return null == compressed ? "" : "" == compressed ? null : LZString1._decompress(compressed.length, 16384, function(index) {
return compressed.charCodeAt(index) - 32;
});
},
compressToUint8Array: function(uncompressed) {
var compressed = LZString1.compress(uncompressed);
var buf = new Uint8Array(2 * compressed.length);
for(var i = 0, TotalLen = compressed.length; i < TotalLen; i++){
var current_value = compressed.charCodeAt(i);
buf[2 * i] = current_value >>> 8;
buf[2 * i + 1] = current_value % 256;
}
return buf;
},
decompressFromUint8Array: function(compressed) {
if (null == compressed) return LZString1.decompress(compressed);
var buf = new Array(compressed.length / 2);
for(var i = 0, TotalLen = buf.length; i < TotalLen; i++)buf[i] = 256 * compressed[2 * i] + compressed[2 * i + 1];
var result = [];
buf.forEach(function(c) {
result.push(f(c));
});
return LZString1.decompress(result.join(""));
},
compressToEncodedURIComponent: function(input) {
return null == input ? "" : LZString1._compress(input, 6, function(a) {
return keyStrUriSafe.charAt(a);
});
},
decompressFromEncodedURIComponent: function(input) {
if (null == input) return "";
if ("" == input) return null;
input = input.replace(/ /g, "+");
return LZString1._decompress(input.length, 32, function(index) {
return getBaseValue(keyStrUriSafe, input.charAt(index));
});
},
compress: function(uncompressed) {
return LZString1._compress(uncompressed, 16, function(a) {
return f(a);
});
},
_compress: function(uncompressed, bitsPerChar, getCharFromInt) {
if (null == uncompressed) return "";
var i, value, ii, context_dictionary = {}, context_dictionaryToCreate = {}, context_c = "", context_wc = "", context_w = "", context_enlargeIn = 2, context_dictSize = 3, context_numBits = 2, context_data = [], context_data_val = 0, context_data_position = 0;
for(ii = 0; ii < uncompressed.length; ii += 1){
context_c = uncompressed.charAt(ii);
if (!Object.prototype.hasOwnProperty.call(context_dictionary, context_c)) {
context_dictionary[context_c] = context_dictSize++;
context_dictionaryToCreate[context_c] = true;
}
context_wc = context_w + context_c;
if (Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) context_w = context_wc;
else {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for(i = 0; i < context_numBits; i++){
context_data_val <<= 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
}
value = context_w.charCodeAt(0);
for(i = 0; i < 8; i++){
context_data_val = context_data_val << 1 | 1 & value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
value >>= 1;
}
} else {
value = 1;
for(i = 0; i < context_numBits; i++){
context_data_val = context_data_val << 1 | value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
value = 0;
}
value = context_w.charCodeAt(0);
for(i = 0; i < 16; i++){
context_data_val = context_data_val << 1 | 1 & value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
value >>= 1;
}
}
if (0 == --context_enlargeIn) {
context_enlargeIn = Math.pow(2, context_numBits);
context_numBits++;
}
delete context_dictionaryToCreate[context_w];
} else {
value = context_dictionary[context_w];
for(i = 0; i < context_numBits; i++){
context_data_val = context_data_val << 1 | 1 & value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
value >>= 1;
}
}
if (0 == --context_enlargeIn) {
context_enlargeIn = Math.pow(2, context_numBits);
context_numBits++;
}
context_dictionary[context_wc] = context_dictSize++;
context_w = String(context_c);
}
}
if ("" !== context_w) {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for(i = 0; i < context_numBits; i++){
context_data_val <<= 1;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
}
value = context_w.charCodeAt(0);
for(i = 0; i < 8; i++){
context_data_val = context_data_val << 1 | 1 & value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
value >>= 1;
}
} else {
value = 1;
for(i = 0; i < context_numBits; i++){
context_data_val = context_data_val << 1 | value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
value = 0;
}
value = context_w.charCodeAt(0);
for(i = 0; i < 16; i++){
context_data_val = context_data_val << 1 | 1 & value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
value >>= 1;
}
}
if (0 == --context_enlargeIn) {
context_enlargeIn = Math.pow(2, context_numBits);
context_numBits++;
}
delete context_dictionaryToCreate[context_w];
} else {
value = context_dictionary[context_w];
for(i = 0; i < context_numBits; i++){
context_data_val = context_data_val << 1 | 1 & value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
value >>= 1;
}
}
if (0 == --context_enlargeIn) {
context_enlargeIn = Math.pow(2, context_numBits);
context_numBits++;
}
}
value = 2;
for(i = 0; i < context_numBits; i++){
context_data_val = context_data_val << 1 | 1 & value;
if (context_data_position == bitsPerChar - 1) {
context_data_position = 0;
context_data.push(getCharFromInt(context_data_val));
context_data_val = 0;
} else context_data_position++;
value >>= 1;
}
for(;;){
context_data_val <<= 1;
if (context_data_position == bitsPerChar - 1) {
context_data.push(getCharFromInt(context_data_val));
break;
}
context_data_position++;
}
return context_data.join("");
},
decompress: function(compressed) {
return null == compressed ? "" : "" == compressed ? null : LZString1._decompress(compressed.length, 32768, function(index) {
return compressed.charCodeAt(index);
});
},
_decompress: function(length, resetValue, getNextValue) {
var i, w, bits, resb, maxpower, power, c, dictionary = [], enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = [], data = {
val: getNextValue(0),
position: resetValue,
index: 1
};
for(i = 0; i < 3; i += 1)dictionary[i] = i;
bits = 0;
maxpower = Math.pow(2, 2);
power = 1;
for(; power != maxpower;){
resb = data.val & data.position;
data.position >>= 1;
if (0 == data.position) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
switch(bits){
case 0:
bits = 0;
maxpower = Math.pow(2, 8);
power = 1;
for(; power != maxpower;){
resb = data.val & data.position;
data.position >>= 1;
if (0 == data.position) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
c = f(bits);
break;
case 1:
bits = 0;
maxpower = Math.pow(2, 16);
power = 1;
for(; power != maxpower;){
resb = data.val & data.position;
data.position >>= 1;
if (0 == data.position) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
c = f(bits);
break;
case 2:
return "";
}
dictionary[3] = c;
w = c;
result.push(c);
for(;;){
if (data.index > length) return "";
bits = 0;
maxpower = Math.pow(2, numBits);
power = 1;
for(; power != maxpower;){
resb = data.val & data.position;
data.position >>= 1;
if (0 == data.position) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
switch(c = bits){
case 0:
bits = 0;
maxpower = Math.pow(2, 8);
power = 1;
for(; power != maxpower;){
resb = data.val & data.position;
data.position >>= 1;
if (0 == data.position) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
dictionary[dictSize++] = f(bits);
c = dictSize - 1;
enlargeIn--;
break;
case 1:
bits = 0;
maxpower = Math.pow(2, 16);
power = 1;
for(; power != maxpower;){
resb = data.val & data.position;
data.position >>= 1;
if (0 == data.position) {
data.position = resetValue;
data.val = getNextValue(data.index++);
}
bits |= (resb > 0 ? 1 : 0) * power;
power <<= 1;
}
dictionary[dictSize++] = f(bits);
c = dictSize - 1;
enlargeIn--;
break;
case 2:
return result.join("");
}
if (0 == enlargeIn) {
enlargeIn = Math.pow(2, numBits);
numBits++;
}
if (dictionary[c]) entry = dictionary[c];
else {
if (c !== dictSize) return null;
entry = w + w.charAt(0);
}
result.push(entry);
dictionary[dictSize++] = w + entry.charAt(0);
w = entry;
if (0 == --enlargeIn) {
enlargeIn = Math.pow(2, numBits);
numBits++;
}
}
}
};
return LZString1;
}(), null != module && (module.exports = LZString);
var module, LZString;
class OptionsSync {
constructor({ defaults: defaults = {} , storageName: storageName = "options" , migrations: migrations = [] , logging: logging = true , storageType: storageType = "sync" } = {}){
Object.defineProperty(this, "storageName", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "storageType", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "defaults", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "_form", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "_migrations", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.storageName = storageName;
this.defaults = defaults;
this.storageType = storageType;
this._handleFormInput = (delay = 300, atBegin = this._handleFormInput.bind(this), void 0 === callback ? throttle(delay, atBegin, false) : throttle(delay, callback, false !== atBegin));
var delay, atBegin, callback;
this._handleStorageChangeOnForm = this._handleStorageChangeOnForm.bind(this);
logging || (this._log = ()=>{});
this._migrations = this._runMigrations(migrations);
}
get storage() {
return chrome.storage[this.storageType];
}
async getAll() {
await this._migrations;
return this._getAll();
}
async setAll(newOptions) {
await this._migrations;
return this._setAll(newOptions);
}
async set(newOptions) {
return this.setAll({
...await this.getAll(),
...newOptions
});
}
async syncForm(form) {
this._form = form instanceof HTMLFormElement ? form : document.querySelector(form);
this._form.addEventListener("input", this._handleFormInput);
this._form.addEventListener("submit", this._handleFormSubmit);
chrome.storage.onChanged.addListener(this._handleStorageChangeOnForm);
this._updateForm(this._form, await this.getAll());
}
async stopSyncForm() {
if (this._form) {
this._form.removeEventListener("input", this._handleFormInput);
this._form.removeEventListener("submit", this._handleFormSubmit);
chrome.storage.onChanged.removeListener(this._handleStorageChangeOnForm);
delete this._form;
}
}
_log(method, ...args) {
console[method](...args);
}
async _getAll() {
return new Promise((resolve, reject)=>{
this.storage.get(this.storageName, (result)=>{
chrome.runtime.lastError ? reject(chrome.runtime.lastError) : resolve(this._decode(result[this.storageName]));
});
});
}
async _setAll(newOptions) {
this._log("log", "Saving options", newOptions);
return new Promise((resolve, reject)=>{
this.storage.set({
[this.storageName]: this._encode(newOptions)
}, ()=>{
chrome.runtime.lastError ? reject(chrome.runtime.lastError) : resolve();
});
});
}
_encode(options) {
const thinnedOptions = {
...options
};
for (const [key, value] of Object.entries(thinnedOptions))this.defaults[key] === value && delete thinnedOptions[key];
this._log("log", "Without the default values", thinnedOptions);
return lzString.exports.compressToEncodedURIComponent(JSON.stringify(thinnedOptions));
}
_decode(options) {
let decompressed = options;
"string" == typeof options && (decompressed = JSON.parse(lzString.exports.decompressFromEncodedURIComponent(options)));
return {
...this.defaults,
...decompressed
};
}
async _runMigrations(migrations) {
if (0 === migrations.length || !_webextDetectPage.isBackground() || !await async function() {
return new Promise((resolve)=>{
const callback = (installType)=>{
if ("development" !== installType) {
chrome.runtime.onInstalled.addListener(()=>{
resolve(true);
});
setTimeout(resolve, 500, false);
} else resolve(true);
};
chrome.management?.getSelf ? chrome.management.getSelf(({ installType: installType })=>{
callback(installType);
}) : callback("unknown");
});
}()) return;
const options = await this._getAll();
const initial = JSON.stringify(options);
this._log("log", "Found these stored options", {
...options
});
this._log("info", "Will run", migrations.length, 1 === migrations.length ? "migration" : " migrations");
for (const migrate of migrations)migrate(options, this.defaults);
initial !== JSON.stringify(options) && await this._setAll(options);
}
async _handleFormInput({ target: target }) {
const field = target;
if (field.name) {
await this.set(this._parseForm(field.form));
field.form.dispatchEvent(new CustomEvent("options-sync:form-synced", {
bubbles: true
}));
}
}
_handleFormSubmit(event) {
event.preventDefault();
}
_updateForm(form, options) {
const currentFormState = this._parseForm(form);
for (const [key, value] of Object.entries(options))currentFormState[key] === value && delete options[key];
const include = Object.keys(options);
include.length > 0 && deserialize(form, options, {
include: include
});
}
_parseForm(form) {
const include = [];
for (const field of form.querySelectorAll("[name]"))field.validity.valid && !field.disabled && include.push(field.name.replace(/\[.*]/, ""));
return serialize(form, {
include: include
});
}
_handleStorageChangeOnForm(changes, areaName) {
areaName !== this.storageType || !changes[this.storageName] || document.hasFocus() && this._form.contains(document.activeElement) || this._updateForm(this._form, this._decode(changes[this.storageName].newValue));
}
}
Object.defineProperty(OptionsSync, "migrations", {
enumerable: true,
configurable: true,
writable: true,
value: {
removeUnused (options, defaults) {
for (const key of Object.keys(options))key in defaults || delete options[key];
}
}
});
},{"webext-detect-page":"gkIGC","@parcel/transformer-js/src/esmodule-helpers.js":"8ISrk"}],"gkIGC":[function(require,module,exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
parcelHelpers.export(exports, "disableWebextDetectPageCache", ()=>disableWebextDetectPageCache
);
parcelHelpers.export(exports, "isWebPage", ()=>isWebPage
);
parcelHelpers.export(exports, "isExtensionContext", ()=>isExtensionContext
);
parcelHelpers.export(exports, "isContentScript", ()=>isContentScript
);
parcelHelpers.export(exports, "isBackground", ()=>isBackground
);
parcelHelpers.export(exports, "isBackgroundPage", ()=>isBackgroundPage
);
parcelHelpers.export(exports, "isBackgroundWorker", ()=>isBackgroundWorker
);
parcelHelpers.export(exports, "isOptionsPage", ()=>isOptionsPage
);
parcelHelpers.export(exports, "isDevToolsPage", ()=>isDevToolsPage
);
parcelHelpers.export(exports, "isFirefox", ()=>isFirefox
);
parcelHelpers.export(exports, "isChrome", ()=>isChrome
);
parcelHelpers.export(exports, "isSafari", ()=>isSafari
);
parcelHelpers.export(exports, "contextNames", ()=>contextNames
);
parcelHelpers.export(exports, "getContextName", ()=>getContextName
);
let cache = true;
function disableWebextDetectPageCache() {
cache = false;
}
function isCurrentPathname(path) {
if (!path) return false;
try {
const { pathname } = new URL(path, location.origin);
return pathname === location.pathname;
} catch {
return false;
}
}
function getManifest(_version) {
return globalThis.chrome?.runtime?.getManifest?.();
}
function once(function_) {
let result;
return ()=>{
if (!cache || typeof result === 'undefined') result = function_();
return result;
};
}
const isWebPage = once(()=>globalThis.location?.protocol.startsWith('http')
);
const isExtensionContext = once(()=>typeof globalThis.chrome?.extension === 'object'
);
const isContentScript = once(()=>isExtensionContext() && isWebPage()
);
const isBackground = ()=>isBackgroundPage() || isBackgroundWorker()
;
const isBackgroundPage = once(()=>{
const manifest = getManifest(2);
if (manifest && isCurrentPathname(manifest.background_page || manifest.background?.page)) return true;
return Boolean(manifest?.background?.scripts && isCurrentPathname('/_generated_background_page.html'));
});
const isBackgroundWorker = once(()=>isCurrentPathname(getManifest(3)?.background?.service_worker)
);
const isOptionsPage = once(()=>{
if (!isExtensionContext() || !chrome.runtime.getManifest) return false;
const { options_ui: optionsUi } = chrome.runtime.getManifest();
if (typeof optionsUi?.page !== 'string') return false;
const url = new URL(optionsUi.page, location.origin);
return url.pathname === location.pathname;
});
const isDevToolsPage = once(()=>{
if (!isExtensionContext() || !chrome.devtools) return false;
const { devtools_page: devtoolsPage } = chrome.runtime.getManifest();
if (typeof devtoolsPage !== 'string') return false;
const url = new URL(devtoolsPage, location.origin);
return url.pathname === location.pathname;
});
const isFirefox = ()=>globalThis.navigator?.userAgent.includes('Firefox')
;
const isChrome = ()=>globalThis.navigator?.userAgent.includes('Chrome')
;
const isSafari = ()=>!isChrome() && globalThis.navigator?.userAgent.includes('Safari')
;
const contextNames = {
contentScript: isContentScript,
background: isBackground,
options: isOptionsPage,
devToolsPage: isDevToolsPage,
extension: isExtensionContext,
web: isWebPage
};
function getContextName() {
for (const [name, test] of Object.entries(contextNames)){
if (test()) return name;
}
return 'unknown';
}
},{"@parcel/transformer-js/src/esmodule-helpers.js":"8ISrk"}],"8ISrk":[function(require,module,exports) {
exports.interopDefault = function(a) {
return a && a.__esModule ? a : {
default: a
};
};
exports.defineInteropFlag = function(a) {
Object.defineProperty(a, '__esModule', {
value: true
});
};
exports.exportAll = function(source, dest) {
Object.keys(source).forEach(function(key) {
if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) return;
Object.defineProperty(dest, key, {
enumerable: true,
get: function() {
return source[key];
}
});
});
return dest;
};
exports.export = function(dest, destName, get) {
Object.defineProperty(dest, destName, {
enumerable: true,
get: get
});
};
},{}],"V5L4L":[function(require,module,exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
parcelHelpers.export(exports, "allowSubdomainsFrom", ()=>allowSubdomainsFrom
);
parcelHelpers.export(exports, "whitelistDomains", ()=>whitelistDomains
);
// stolen from https://github.com/gwern/gwern.net/blob/1bb7737e59eba4ff1579b7fb2d7ad2e2402ce847/build/LinkLive.hs
// Todo maintain in sync?
/* eslint-disable comma-style, @typescript-eslint/quotes, quotes */ const goodGwernDomains = [
"1dollarscan.com",
"80000hours.org",
"abandonedfootnotes.blogspot.com",
"academic.oup.com",
"academic.oup.com",
"academictorrents.com",
"ageing.oxfordjournals.org",
"ai.googleblog.com",
"aje.oxfordjournals.org",
"apenwarr.ca",
"archive.org",
"archive.ph",
"archivebox.io",
"bam-dataset.org",
"bam.kalzumeus.com",
"beepb00p.xyz",
"bellard.org",
"blog.beeminder.com",
"blog.google.com",
"blog.otoro.net",
"blog.pinboard.in",
"blogs.nvidia.com",
"bmk.sh",
"boingboing.net",
"camelcamelcamel.com",
"cat-unbound.org",
"causal-effects.com",
"citeseerx.ist.psu.edu",
"clinicaltrials.gov",
"conifer.rhizome.org",
"cran.r-project.org",
"ctan.org",
"danluu.com",
"danwang.co",
"distill.pub",
"docs.google.com",
"duckduckgo.com",
"dwarffortresswiki.org",
"en.bitcoin.it",
"en.touhouwiki.net",
"en.wikibooks.org",
"en.wikichip.org",
"en.wikifur.com",
"en.wikiquote.org",
"en.wikisource.org",
"en.wiktionary.org",
"equilibriabook.com",
"eurekamaga.com",
"everything2.com",
"explorabl.es",
"feeds.feedburner.com",
"files.eric.ed.gov",
"forum.effectivealtruism.org",
"forum.evageeks.org",
"foundation.wikimedia.org",
"fullfrontal.moe",
"greaterwrong.com",
"guzey.com",
"idlewords.com",
"iqcomparisonsite.com",
"jamanetwork.com",
"jasoncrawford.org",
"jtoomim.org",
"kalzumeus.com",
"keras.io",
"kill-the-newsletter.com",
"kk.org",
"knightcolumbia.org",
"ledge-cli.org",
"lesswrong.com",
"libgen.rs",
"library.bz",
"marginalrevolution.com",
"mattlakeman.org",
"mc-stan.org",
"meta.wikimedia.org",
"michaelnielsen.org",
"ncase.me",
"nintil.com",
"norvig.com",
"notes.pinboard.in",
"numinous.productions",
"nymag.com",
"openai.com",
"ourworldindata.org",
"pandoc.org",
"papers.ssrn.com",
"parametric.press",
"patrickcollison.com",
"pdfs.semanticscholar.org",
"personalitytest.net",
"philpapers.org",
"pinboard.in",
"plato.stanford.edu",
"playground.tensorflow.org",
"popcon.ubuntu.com",
"press.etc.cmu.edu",
"progressstudies.school",
"psychcentral.com",
"publicdomainreview.org",
"publishing.cdlib.org",
"qntm.org",
"quantum.country",
"qwantz.com",
"racket-lang.org",
"rationality.org",
"rdiff-backup.net",
"ricon.dev",
"rootsofprogress.org",
"row1.ca",
"safebooru.org",
"scholars-stage.org",
"sciencebasedmedicine.org",
"sevensecularsermons.org",
"shiny.app",
"sifter.org",
"slatestarcodex.com",
"spreadsheets.google.com",
"statmodeling.stat.columbia.edu",
"stats.grok.se",
"text.npr.org",
"thefirstaibook.com",
"thisanimedoesnotexist.ai",
"thiscatdoesnotexist.com",
"thisrentaldoesnotexist.com",
"training.kalzumeus.com",
"unsongbook.com",
"upload.wikimedia.org",
"vast.ai",
"videolectures.net",
"wayback.archive-it.org",
"web.archive.org",
"wiki.evageeks.org",
"wiki.haskell.org",
"www.aleph.se",
"www.antipope.org",
"www.archive-it.org",
"www.barnesandnoble.com",
"www.buzzricksons.jp",
"www.cdc.gov",
"www.cogmed.com",
"www.cogtest.com",
"www.cram.com",
"www.cryonicscalculator.com",
"www.cylab.cmu.edu",
"www.dafont.com",
"www.davidsongifted.org",
"www.deeplearningbook.org",
"www.discoverbooks.com",
"www.doc88.com",
"www.drmaciver.com",
"www.e-codices.unifr.ch",
"www.ecologyandsociety.org",
"www.econlib.org",
"www.economist.com",
"www.econtalk.org",
"www.equator-network.org",
"www.equestriadaily.com",
"www.evamonkey.com",
"www.filfre.net",
"www.find-more-books.com",
"www.frontiersin.org",
"www.genetics.org",
"www.gizmodo.com.au",
"www.gnxp.com",
"www.google-melange.com",
"www.greaterwrong.com",
"www.gutenberg.org",
"www.haskell.org",
"www.hpmor.com",
"www.html-tidy.org",
"www.iarpa.gov",
"www.iqtest.com",
"www.joelonsoftware.com",
"www.johndcook.com",
"www.kalzumeus.com",
"www.lesswrong.com",
"www.librarything.com",
"www.mail-archive.com",
"www.mediawiki.org",
"www.metafor-project.org",
"www.motherjones.com",
"www.ncbi.nlm.nih.gov",
"www.npr.org",
"www.ohyouprettythings.com",
"www.overcomingbias.com",
"www.poetryfoundation.org",
"www.proquest.com",
"www.psychiatryinvestigation.org",
"www.r-bloggers.com",
"www.rdocumentation.org",
"www.ribbonfarm.com",
"www.rifters.com",
"www.sapa-project.org",
"www.schneier.com",
"www.sciencedirect.com",
"www.sciencenews.org",
"www.sciencenewsline.com",
"www.shawwn.com",
"www.simplify.so",
"www.snpedia.com",
"www.stat.columbia.edu",
"www.stat.columbia.edu",
"www.straighttalkonevidence.org",
"www.tarsnap.com",
"www.theatlantic.com",
"www.theindiaforum.in",
"www.theparisreview.org",
"www.thisfursonadoesnotexist.com",
"www.thispersondoesnotexist.com",
"www.thiswaifudoesnotexist.net",
"www.thisworddoesnotexist.com",
"www.thriftbooks.com",
"www.urbandictionary.com",
"www.vanityfair.com",
"www.vocativ.com",
"www.w3.org",
"www.washingtonpost.com",
"www.whichfaceisreal.com",
"www.winehq.org",
"www.wolfewiki.com",
"www.wsj.com",
"www.yalelawjournal.org",
"www.youtube.com",
"xkcd.com",
"xtools.wmflabs.org",
"mail.haskell.org",
"hackage.haskell.org",
"online.wsj.com",
"www.microsoft.com",
"intelligence.org",
"eprint.iacr.org",
"www.explainxkcd.com",
"www.silverhandmeadery.com",
"www.nickbostrom.com",
"well.blogs.nytimes.com",
"www.gwern.net",
"rjlipton.wordpress.com",
"jaspervdj.be",
"jama.jamanetwork.com",
"blog.codinghorror.com",
"aiimpacts.org",
"web.archive.org",
"www.fhi.ox.ac.uk",
"www.cjas.org",
"blog.google",
"archinte.jamanetwork.com",
"aclanthology.org",
"www.clinicaltrials.gov",
"proceedings.mlr.press",
"diff.wikimedia.org",
"www.scottaaronson.com",
"www.eugenewei.com",
"www.alignmentforum.org",
"www.wired.com",
"www.evaotaku.com",
"www.stuff.co.nz",
"texample.net",
"www.dailymail.co.uk",
"www.memteaimports.com",
"boards.fireden.net",
"webcitation.org",
"www.reuters.com",
"mail.haskell.org",
"gameprogrammingpatterns.com",
"digital.library.unt.edu",
"www.salon.com",
"www.metopera.org",
"dnstats.net",
"www.thecut.com",
"animekritik.wordpress.com",
"www.fadedpage.com",
"www.dailydot.com",
"www.candyjapan.com",
"nautil.us",
"emilkirkegaard.dk",
"www.independent.co.uk",
"www.edwardtufte.com",
"www.brookings.edu",
"www.blockchain.com",
"web.stanford.edu",
"mitpress.mit.edu",
"freakonomics.com",
"forums.animesuki.com",
"eli.thegreenplace.net",
"www.theregister.com",
"www.alcor.org",
"the-liliquarium.livejournal.com",
"socghop.appspot.com",
"people.csail.mit.edu",
"findarticles.com",
"dataprivacylab.org",
"blog.23andme.com",
"andrewmayneblog.wordpress.com",
"www.thefreelibrary.com",
"www.sfgate.com",
"www.rrauction.com",
"www.merkle.com",
"www.links.org",
"www.bartleby.com",
"wavemotioncannon.com",
"www.baltimoresun.com",
"unenumerated.blogspot.com",
"scottaaronson.blog",
"rjlipton.wordpress.com",
"mason.gmu.edu",
"ilovetypography.com",
"humanvarieties.org",
"googlesystem.blogspot.com",
"www.yudkowsky.net",
"arr.am",
"www.worldcat.org",
"www.supermemo.com",
"www.standard.co.uk",
"www.orlandosentinel.com",
"www.nbcnews.com",
"www.mercurynews.com",
"www.math.uwaterloo.ca",
"www.jefftk.com",
"www.gq.com",
"www.businessweek.com",
"www.austlii.edu.au",
"www.aiweirdness.com",
"w.atwiki.jp",
"vitalik.ca",
"unqualified-reservations.blogspot.com",
"thegrandnarrative.com",
"sre.google",
"signalvnoise.com",
"shkspr.mobi",
"qualiacomputing.com",
"penelope.uchicago.edu",
"parahumans.wordpress.com",
"palladiummag.com",
"packdeps.haskellers.com",
"ohtori.nu",
"my.vanderbilt.edu",
"mathworld.wolfram.com",
"magenta.tensorflow.org",
"infoproc.blogspot.com",
"highnoongmt.wordpress.com",
"googleprojectzero.blogspot.com",
"forum.quantifiedself.com",
"foreignpolicy.com",
"engineering.fb.com",
"cdn.openai.com",
"cdn.discordapp.com",
"blog.acolyer.org",
"web.archive.org",
"articles.latimes.com",
"alumni.media.mit.edu",
"agtb.wordpress.com",
"zlkj.in",
"www.wakapoetry.net",
"www.vetta.org",
"www.unz.com",
"www.unicode.org",
"www.unc.edu",
"www.tor.com",
"www.tomodachi.de",
"www.thestranger.com",
"www.the-scientist.com",
"www.tabletmag.com",
"www.syracuse.com",
"www.sun-modalert.com",
"www.spiegel.de",
"www.sankakucomplex.com",
"www.sacbee.com",
"www.rwagner.net",
"www.richardcarrier.info",
"www.rationaloptimist.com",
"www.pragmatic.ml",
"www.popsci.com",
"www.owenstephens.co.uk",
"www.nydailynews.com",
"www.oregonlive.com",
"www.miamiherald.com",
"www.lrb.co.uk",
"www.livestrong.com",
"www.karger.com",
"www.japansociety.org",
"www.japaninc.com",
"www.grandforksherald.com",
"www.genealogy.math.ndsu.nodak.edu",
"www.gawker.com",
"www.fathomevents.com",
"www.dartmouth.edu",
"www.culhwch.info",
"www.cs.virginia.edu",
"www.cnn.com",
"www.chicagotribune.com",
"www.cbsnews.com",
"www.bemmu.com",
"www.4nrx-uk.md",
"warontherocks.com",
"venturebeat.com",
"time.com",
"threadreaderapp.com",
"thelastpsychiatrist.com",
"taooftea.com",
"takimag.com",
"synapse.koreamed.org",
"stratechery.com",
"srconstantin.wordpress.com",
"spikejapan.wordpress.com",
"soranews24.com",
"senrigan.io",
"retractionwatch.com",
"replicationindex.com",
"queue.acm.org",
"phys.org",
"originstamp.com",
"opinionator.blogs.nytimes.com",
"okmij.org",
"web.archive.org",
"web.archive.org",
"newcriterion.com",
"neurosciencenews.com",
"my.pgp-hms.org",
"meteuphoric.com",
"meehl.umn.edu",
"mathshistory.st-andrews.ac.uk",
"longtermrisk.org",
"jtauber.com",
"journal.stuffwithstuff.com",
"ideas.repec.org",
"harpers.org",
"hapgood.us",
"googleblog.blogspot.com",
"globalguerrillas.typepad.com",
"felinegenetics.missouri.edu",
"eva-fan.com",
"esolangs.org",
"eileenormsby.com",
"diyhpl.us",
"egamebook.com",
"donsbot.com",
"cs.stanford.edu",
"crookedtimber.org",
"care.diabetesjournals.org",
"caniuse.com",
"bldgblog.com",
"betabeat.com",
"www.chinadaily.com.cn",
"googlesystem.blogspot.com",
"paulfchristiano.com",
"people.csail.mit.edu",
"quantifiedself.com",
"socghop.appspot.com",
"unenumerated.blogspot.com",
"web.archive.org",
"www.aging-us.com",
"www.belfasttelegraph.co.uk",
"www.benkuhn.net",
"www.bostonglobe.com",
"www.brainpreservation.org",
"www.bu.edu",
"www.c82.net",
"www.catalogtree.net",
"www.cia.gov",
"www.dailymail.co.uk",
"www.ft.com",
"www.mangaupdates.com",
"www.mentalfloss.com",
"www.sacbee.com",
"www.sankakucomplex.com",
"dresdencodak.com",
"downloads.haskell.org",
"ageofem.com",
"ai.google",
"aleph.se",
"altjapan.typepad.com",
"ansuz.sooke.bc.ca",
"apnews.com",
"arima.cylab.cmu.edu",
"bair.berkeley.edu",
"behavioralscientist.org",
"believermag.com",
"bitcoin-otc.com",
"bits.blogs.nytimes.com",
"blog.8faces.com",
"blog.cr.yp.to",
"blog.csdn.net",
"blog.ethereum.org",
"blog.nuclearsecrecy.com",
"blog.youtube",
"blogs.wsj.com",
"cacm.acm.org",
"carbonplan.org",
"casual-effects.com",
"cognitivemedium.com",
"commons.wikimedia.org",
"courses.csail.mit.edu",
"daniellakens.blogspot.com",
"data.bls.gov",
"datacolada.org",
"dealbook.nytimes.com",
"dialnet.unirioja.es",
"dominiccummings.com",
"dumps.wikimedia.org",
"energycontrol.org",
"exac.broadinstitute.org",
"familiarcycle.net",
"fras.uk",
"galois.com",
"gamefaqs.gamespot.com",
"github.blog",
"globalvoices.org",
"google-summer-of-code-2009-haskell.googlecode.com",
"gradientscience.org",
"gutenberg.net.au",
"handbook-5-1.cochrane.org",
"healthland.time.com",
"hub.darcs.net",
"iforcedabot.com",
"inhumanexperiment.blogspot.com",
"isomerdesign.com",
"jessegalef.com",
"justgetflux.com",
"komonews.com",
"krebsonsecurity.com",
"langsec.org",
"latimesblogs.latimes.com",
"lettersofnote.com",
"lifescivc.com",
"lithub.com",
"lucumr.pocoo.org",
"mako.cc",
"neojaponisme.com",
"nbc-2.com",
"mlg.eng.cam.ac.uk",
"minimaxir.com",
"milan.cvitkovic.net",
"medicalxpress.com",
"www.collectorsweekly.com",
"www.cato-unbound.org",
"www.alexirpan.com",
"www.alessonislearned.com",
"www.adelaidenow.com.au",
"www.abcb.com",
"writings.stephenwolfram.com",
"writeswith.com",
"wikimediafoundation.org",
"washingtonmonthly.com",
"trixter.oldskool.org",
"tools.wmflabs.org",
"tomcritchlow.com",
"thehardestscience.com",
"strategy.wikimedia.org",
"spp.fas.org",
"sociologicalscience.com",
"socialsciences.mcmaster.ca",
"sf-encyclopedia.com",
"search.wikileaks.org",
"schoolgirlmilkycrisis.com",
"scarybeastsecurity.blogspot.com",
"reflectivedisequilibrium.blogspot.com",
"readwrite.com",
"quillette.com",
"psychonautwiki.org",
"psych.hanover.edu",
"programme.exordo.com",
"politicalcalculations.blogspot.com",
"pharmacyreviewer.co",
"petertodd.org",
"pediatrics.aappublications.org",
"pages.jh.edu",
"orionmagazine.org",
"nyaa.si",
"nootropicsdepot.com",
"ngm.nationalgeographic.com",
"thebaffler.com",
"svilentodorov.xyz",
"www.computerworld.com",
"vinoshipper.com",
"www.mcall.com",
"www.latimes.com",
"www.koreatimes.co.kr",
"www.kooslooijesteijn.net",
"www.khara.co.jp",
"www.justinpinkney.com",
"www.johnsonessays.com",
"www.inkandswitch.com",
"www.independent.ie",
"www.incompleteideas.net",
"www.hsx.com",
"www.heraldsun.com.au",
"www.harrowell.org.uk",
"www.globalsecurity.org",
"www.ghibli.jp",
"www.galbithink.org",
"www.fast.ai",
"www.evacommentary.org",
"www.discoverteas.com",
"www.depauw.edu",
"www.deseret.com",
"www.davidbrin.com",
"www.davidbordwell.net",
"www.dagbladet.no",
"www.daemonology.net",
"www.cs.odu.edu",
"www.cs.dartmouth.edu",
"www.couriermail.com.au",
"www.hbs.edu",
"www.infranken.de",
"www.pelleas.net",
"www.pewresearch.org",
"www.pcmag.com",
"www.oricon.co.jp",
"www.nyaa.eu",
"www.nps.gov",
"www.nplusonemag.com",
"www.noisebridge.net",
"www.nextplatform.com",
"www.nextbigfuture.com",
"www.newstatesman.com",
"www.newsday.com",
"www.metzdowd.com",
"www.zeit.de",
"www.webmd.com",
"www.usnews.com",
"www.uk-anime.net",
"www.tranquiltuesdays.com",
"www.thesmokinggun.com",
"www.scienceagogo.com",
"www.scielo.br",
"www.rxshop.md",
"www.righto.com",
"www.project-imas.com",
"www.wired.co.uk",
"www.talyarkoni.org",
"www.statnews.com",
"www.sleep-journal.com",
"www.slate.com",
"www.sjsu.edu",
"www.sirlin.net",
"www.shawlocal.com",
"www.sciencemadness.org",
"abcnews.go.com",
"www.washingtontimes.com",
"abcnotation.com",
"www.princeton.edu",
"r6.ca",
"www.technologyreview.com",
"www.ncbi.nlm.nih.gov",
"retractionwatch.com",
"www.dartmouth.edu",
"www.cnn.com",
"www.yf.io",
"www.wtnh.com",
"www.writingroutines.com",
"www.wheels.org",
"www.vesta.earth",
"www.uliwestphal.de",
"www.ubu.com",
"www.tt-forums.net",
"www.trubrain.com",
"www.trentonbricken.com",
"www.tomshardware.com",
"www.themtank.org",
"www.thedenverchannel.com",
"www.systutorials.com",
"www.sumsar.net",
"www.stripes.com",
"www.ssc.wisc.edu",
"www.sqlite.org",
"www.spring.org.uk",
"www.spiked-online.com",
"www.siliconera.com",
"www.rosebud.ai",
"www.reg.ru",
"www.punchlinedesign.net",
"www.prolific.co",
"www.politico.com",
"www.orbuch.com",
"www.nationalgeographic.com",
"www.microdose.me",
"www.lifeview.com",
"www.lehighvalleylive.com",
"www.ledger-cli.org",
"www.jdmoyer.com",
"www.jamesfadiman.com",
"www.itmedia.co.jp",
"www.intechopen.com",
"www.freakonomicsexperiments.com",
"www.eduref.net",
"www.coderelay.io",
"www.cleveland.com",
"www.chrisstucchio.com",
"www.chrisplaysgames.com",
"www.broadinstitute.org",
"www.becker-posner-blog.com",
"www.artnome.com",
"www.andzuck.com",
"www.allencheng.com",
"www.alicemaz.com",
"www.adamsmith.org",
"www.aboutamazon.com",
"www-cs-faculty.stanford.edu",
"wiki.lesswrong.com",
"whyevolutionistrue.com",
"web.media.mit.edu",
"vfxblog.com",
"vdfresearch.org",
"vastabrupt.com",
"vasilishynkarenka.com",
"tug.org",
"tosche.net",
"thoughtcrime.crummy.com",
"thiseyedoesnotexist.com",
"thenewstatistics.com",
"thebrowser.com",
"the-toast.net",
"teageegeepea.tripod.com",
"stevenson.lab.uconn.edu",
"stephenmalina.com",
"status451.com",
"stackroboflow.com",
"slimemoldtimemold.com",
"seths.blog",
"scientistatwork.blogs.nytimes.com",
"sciencebulletin.org",
"science.ksc.nasa.gov",
"samoburja.com",
"ruder.io",
"read-the-samples.netlify.app",
"quadrant.org.au",
"pytorch.org",
"pudding.cool",
"projects.tampabay.com",
"projects.jsonline.com",
"poets.org",
"poemanalysis.com",
"personal.math.ubc.ca",
"people.idsia.ch",
"people.com",
"oscarbonilla.com",
"orwell.ru",
"opensource.adobe.com",
"ooo.ghostbows.ooo",
"news.nationalgeographic.com",
"mssv.net",
"mosaicscience.com",
"ml.berkeley.edu",
"mkv25.net",
"mathbabe.org",
"mailchi.mp",
"magazine.atavist.com",
"longitudinal.blog",
"littlebiggy.org",
"lavaan.ugent.be",
"larryniven.net",
"laion.ai",
"kojimars.at.webry.info",
"kevinlynagh.com",
"kev.town",
"kajsotala.fi",
"journals.biologists.com",
"beza1e1.tuxen.de",
"web.archive.org",
"www.pcworld.com",
"www.unqualified-reservations.org",
"evaotaku.com",
"forre.st",
"mikepower.pressfolios.com",
"www.coyneoftherealm.com",
"wiki.openttdcoop.org",
"quinndunki.com",
"learning.mpi-sws.org",
"jov.arvojournals.org",
"jakewestfall.org",
"e2eml.school",
"defector.com",
"davidepstein.com",
"corpgov.law.harvard.edu",
"copilot.github.com",
"constancecrozier.com",
"complearn.org",
"compdemocracy.org",
"catonmat.net",
"calhoun.nps.edu",
"bwc.thelab.dc.gov",
"blog.thinkst.com",
"blog.regehr.org",
"blog.cryptographyengineering.com",
"b-ok.cc",
"archive.seattletimes.com",
"architext.design",
"andymatuschak.org",
"alexanderetz.com",
"advertising-effects.chicagobooth.edu",
"about.google",
"6thfloor.blogs.nytimes.com",
"www2.biology.ualberta.ca",
"www.wesjones.com",
"www.urbandharma.org",
"www.tlmc.eu",
"www.rfreitas.com",
"www.moserware.com",
"ew.com",
"examples.yourdictionary.com",
"fs.blog",
"freedomdefined.org",
"fibery.io",
"fastmoe.ai",
"joshmitteldorf.scienceblog.com",
"jonmillward.com",
"johncwright.livejournal.com",
"joa.sh",
"jgeekstudies.org",
"jdlm.info",
"jaypsong.blog",
"jax.readthedocs.io",
"jamesyu.org",
"image-net.org",
"ifdo.ca",
"historycooperative.org",
"herbsutter.com",
"hdsr.mitpress.mit.edu",
"hakaimagazine.com",
"gutenberg.ca",
"gpt3demo.com",
"gondwanaland.com",
"gaotianyu.xyz",
"futurism.com",
"extras.denverpost.com",
"eurekamag.com",
"eukaryotewritesblog.com",
"etienne.se",
"endlessvn.io",
"statmodeling.stat.columbia.edu",
"archive.nytimes.com",
"www.michaellight.net",
"www.otakustudy.com",
"www.baka-tsuki.org",
"story.californiasunday.com",
"thispersondoesnotexist.com",
"metropolitician.blogs.com",
"pauillac.inria.fr",
"asktog.com",
"www.unf.edu"
];
const allowSubdomainsFromGwern = [
'.allennlp.org',
'.archive.org',
'.archiveteam.org',
'.bandcamp.com',
'.eleuther.ai',
'.fandom.com',
'.github.io',
'.givewell.org',
'.greenspun.com',
'.humanprogress.org',
'.imagemagick.org',
'.mementoweb.org',
'.metafilter.com',
'.nomeata.de',
'.obormot.net',
'.tumblr.com',
'.xkcd.com',
'.wikipedia.org',
'.wordpress.com',
'.blogspot.com'
];
const allowSubdomainsFrom = [
'.wikidata.org',
'.roam.garden',
...allowSubdomainsFromGwern
];
const whitelistDomains = [
"manifold.markets",
...goodGwernDomains
];
},{"@parcel/transformer-js/src/esmodule-helpers.js":"8ISrk"}],"kPFTQ":[function(require,module,exports) {
(function(global, factory) {
if (typeof define === "function" && define.amd) define("webextension-polyfill", [
"module"
], factory);
else {
var mod;
factory(module);
}
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function(module) {
/* webextension-polyfill - v0.9.0 - Fri Mar 25 2022 17:00:23 */ /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ /* vim: set sts=2 sw=2 et tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict";
if (typeof globalThis != "object" || typeof chrome != "object" || !chrome || !chrome.runtime || !chrome.runtime.id) throw new Error("This script should only be loaded in a browser extension.");
if (typeof globalThis.browser === "undefined" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) {
const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.";
const SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)"; // Wrapping the bulk of this polyfill in a one-time-use function is a minor
// optimization for Firefox. Since Spidermonkey does not fully parse the
// contents of a function until the first time it's called, and since it will
// never actually need to be called, this allows the polyfill to be included
// in Firefox nearly for free.
const wrapAPIs = (extensionAPIs)=>{
// NOTE: apiMetadata is associated to the content of the api-metadata.json file
// at build time by replacing the following "include" with the content of the
// JSON file.
const apiMetadata = {
"alarms": {
"clear": {
"minArgs": 0,
"maxArgs": 1
},
"clearAll": {
"minArgs": 0,
"maxArgs": 0
},
"get": {
"minArgs": 0,
"maxArgs": 1
},
"getAll": {
"minArgs": 0,
"maxArgs": 0
}
},
"bookmarks": {
"create": {
"minArgs": 1,
"maxArgs": 1
},
"get": {
"minArgs": 1,
"maxArgs": 1
},
"getChildren": {
"minArgs": 1,
"maxArgs": 1
},
"getRecent": {
"minArgs": 1,
"maxArgs": 1
},
"getSubTree": {
"minArgs": 1,
"maxArgs": 1
},
"getTree": {
"minArgs": 0,
"maxArgs": 0
},
"move": {
"minArgs": 2,
"maxArgs": 2
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"removeTree": {
"minArgs": 1,
"maxArgs": 1
},
"search": {
"minArgs": 1,
"maxArgs": 1
},
"update": {
"minArgs": 2,
"maxArgs": 2
}
},
"browserAction": {
"disable": {
"minArgs": 0,
"maxArgs": 1,
"fallbackToNoCallback": true
},
"enable": {
"minArgs": 0,
"maxArgs": 1,
"fallbackToNoCallback": true
},
"getBadgeBackgroundColor": {
"minArgs": 1,
"maxArgs": 1
},
"getBadgeText": {
"minArgs": 1,
"maxArgs": 1
},
"getPopup": {
"minArgs": 1,
"maxArgs": 1
},
"getTitle": {
"minArgs": 1,
"maxArgs": 1
},
"openPopup": {
"minArgs": 0,
"maxArgs": 0
},
"setBadgeBackgroundColor": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
},
"setBadgeText": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
},
"setIcon": {
"minArgs": 1,
"maxArgs": 1
},
"setPopup": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
},
"setTitle": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
}
},
"browsingData": {
"remove": {
"minArgs": 2,
"maxArgs": 2
},
"removeCache": {
"minArgs": 1,
"maxArgs": 1
},
"removeCookies": {
"minArgs": 1,
"maxArgs": 1
},
"removeDownloads": {
"minArgs": 1,
"maxArgs": 1
},
"removeFormData": {
"minArgs": 1,
"maxArgs": 1
},
"removeHistory": {
"minArgs": 1,
"maxArgs": 1
},
"removeLocalStorage": {
"minArgs": 1,
"maxArgs": 1
},
"removePasswords": {
"minArgs": 1,
"maxArgs": 1
},
"removePluginData": {
"minArgs": 1,
"maxArgs": 1
},
"settings": {
"minArgs": 0,
"maxArgs": 0
}
},
"commands": {
"getAll": {
"minArgs": 0,
"maxArgs": 0
}
},
"contextMenus": {
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"removeAll": {
"minArgs": 0,
"maxArgs": 0
},
"update": {
"minArgs": 2,
"maxArgs": 2
}
},
"cookies": {
"get": {
"minArgs": 1,
"maxArgs": 1
},
"getAll": {
"minArgs": 1,
"maxArgs": 1
},
"getAllCookieStores": {
"minArgs": 0,
"maxArgs": 0
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"set": {
"minArgs": 1,
"maxArgs": 1
}
},
"devtools": {
"inspectedWindow": {
"eval": {
"minArgs": 1,
"maxArgs": 2,
"singleCallbackArg": false
}
},
"panels": {
"create": {
"minArgs": 3,
"maxArgs": 3,
"singleCallbackArg": true
},
"elements": {
"createSidebarPane": {
"minArgs": 1,
"maxArgs": 1
}
}
}
},
"downloads": {
"cancel": {
"minArgs": 1,
"maxArgs": 1
},
"download": {
"minArgs": 1,
"maxArgs": 1
},
"erase": {
"minArgs": 1,
"maxArgs": 1
},
"getFileIcon": {
"minArgs": 1,
"maxArgs": 2
},
"open": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
},
"pause": {
"minArgs": 1,
"maxArgs": 1
},
"removeFile": {
"minArgs": 1,
"maxArgs": 1
},
"resume": {
"minArgs": 1,
"maxArgs": 1
},
"search": {
"minArgs": 1,
"maxArgs": 1
},
"show": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
}
},
"extension": {
"isAllowedFileSchemeAccess": {
"minArgs": 0,
"maxArgs": 0
},
"isAllowedIncognitoAccess": {
"minArgs": 0,
"maxArgs": 0
}
},
"history": {
"addUrl": {
"minArgs": 1,
"maxArgs": 1
},
"deleteAll": {
"minArgs": 0,
"maxArgs": 0
},
"deleteRange": {
"minArgs": 1,
"maxArgs": 1
},
"deleteUrl": {
"minArgs": 1,
"maxArgs": 1
},
"getVisits": {
"minArgs": 1,
"maxArgs": 1
},
"search": {
"minArgs": 1,
"maxArgs": 1
}
},
"i18n": {
"detectLanguage": {
"minArgs": 1,
"maxArgs": 1
},
"getAcceptLanguages": {
"minArgs": 0,
"maxArgs": 0
}
},
"identity": {
"launchWebAuthFlow": {
"minArgs": 1,
"maxArgs": 1
}
},
"idle": {
"queryState": {
"minArgs": 1,
"maxArgs": 1
}
},
"management": {
"get": {
"minArgs": 1,
"maxArgs": 1
},
"getAll": {
"minArgs": 0,
"maxArgs": 0
},
"getSelf": {
"minArgs": 0,
"maxArgs": 0
},
"setEnabled": {
"minArgs": 2,
"maxArgs": 2
},
"uninstallSelf": {
"minArgs": 0,
"maxArgs": 1
}
},
"notifications": {
"clear": {
"minArgs": 1,
"maxArgs": 1
},
"create": {
"minArgs": 1,
"maxArgs": 2
},
"getAll": {
"minArgs": 0,
"maxArgs": 0
},
"getPermissionLevel": {
"minArgs": 0,
"maxArgs": 0
},
"update": {
"minArgs": 2,
"maxArgs": 2
}
},
"pageAction": {
"getPopup": {
"minArgs": 1,
"maxArgs": 1
},
"getTitle": {
"minArgs": 1,
"maxArgs": 1
},
"hide": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
},
"setIcon": {
"minArgs": 1,
"maxArgs": 1
},
"setPopup": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
},
"setTitle": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
},
"show": {
"minArgs": 1,
"maxArgs": 1,
"fallbackToNoCallback": true
}
},
"permissions": {
"contains": {
"minArgs": 1,
"maxArgs": 1
},
"getAll": {
"minArgs": 0,
"maxArgs": 0
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"request": {
"minArgs": 1,
"maxArgs": 1
}
},
"runtime": {
"getBackgroundPage": {
"minArgs": 0,
"maxArgs": 0
},
"getPlatformInfo": {
"minArgs": 0,
"maxArgs": 0
},
"openOptionsPage": {
"minArgs": 0,
"maxArgs": 0
},
"requestUpdateCheck": {
"minArgs": 0,
"maxArgs": 0
},
"sendMessage": {
"minArgs": 1,
"maxArgs": 3
},
"sendNativeMessage": {
"minArgs": 2,
"maxArgs": 2
},
"setUninstallURL": {
"minArgs": 1,
"maxArgs": 1
}
},
"sessions": {
"getDevices": {
"minArgs": 0,
"maxArgs": 1
},
"getRecentlyClosed": {
"minArgs": 0,
"maxArgs": 1
},
"restore": {
"minArgs": 0,
"maxArgs": 1
}
},
"storage": {
"local": {
"clear": {
"minArgs": 0,
"maxArgs": 0
},
"get": {
"minArgs": 0,
"maxArgs": 1
},
"getBytesInUse": {
"minArgs": 0,
"maxArgs": 1
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"set": {
"minArgs": 1,
"maxArgs": 1
}
},
"managed": {
"get": {
"minArgs": 0,
"maxArgs": 1
},
"getBytesInUse": {
"minArgs": 0,
"maxArgs": 1
}
},
"sync": {
"clear": {
"minArgs": 0,
"maxArgs": 0
},
"get": {
"minArgs": 0,
"maxArgs": 1
},
"getBytesInUse": {
"minArgs": 0,
"maxArgs": 1
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"set": {
"minArgs": 1,
"maxArgs": 1
}
}
},
"tabs": {
"captureVisibleTab": {
"minArgs": 0,
"maxArgs": 2
},
"create": {
"minArgs": 1,
"maxArgs": 1
},
"detectLanguage": {
"minArgs": 0,
"maxArgs": 1
},
"discard": {
"minArgs": 0,
"maxArgs": 1
},
"duplicate": {
"minArgs": 1,
"maxArgs": 1
},
"executeScript": {
"minArgs": 1,
"maxArgs": 2
},
"get": {
"minArgs": 1,
"maxArgs": 1
},
"getCurrent": {
"minArgs": 0,
"maxArgs": 0
},
"getZoom": {
"minArgs": 0,
"maxArgs": 1
},
"getZoomSettings": {
"minArgs": 0,
"maxArgs": 1
},
"goBack": {
"minArgs": 0,
"maxArgs": 1
},
"goForward": {
"minArgs": 0,
"maxArgs": 1
},
"highlight": {
"minArgs": 1,
"maxArgs": 1
},
"insertCSS": {
"minArgs": 1,
"maxArgs": 2
},
"move": {
"minArgs": 2,
"maxArgs": 2
},
"query": {
"minArgs": 1,
"maxArgs": 1
},
"reload": {
"minArgs": 0,
"maxArgs": 2
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"removeCSS": {
"minArgs": 1,
"maxArgs": 2
},
"sendMessage": {
"minArgs": 2,
"maxArgs": 3
},
"setZoom": {
"minArgs": 1,
"maxArgs": 2
},
"setZoomSettings": {
"minArgs": 1,
"maxArgs": 2
},
"update": {
"minArgs": 1,
"maxArgs": 2
}
},
"topSites": {
"get": {
"minArgs": 0,
"maxArgs": 0
}
},
"webNavigation": {
"getAllFrames": {
"minArgs": 1,
"maxArgs": 1
},
"getFrame": {
"minArgs": 1,
"maxArgs": 1
}
},
"webRequest": {
"handlerBehaviorChanged": {
"minArgs": 0,
"maxArgs": 0
}
},
"windows": {
"create": {
"minArgs": 0,
"maxArgs": 1
},
"get": {
"minArgs": 1,
"maxArgs": 2
},
"getAll": {
"minArgs": 0,
"maxArgs": 1
},
"getCurrent": {
"minArgs": 0,
"maxArgs": 1
},
"getLastFocused": {
"minArgs": 0,
"maxArgs": 1
},
"remove": {
"minArgs": 1,
"maxArgs": 1
},
"update": {
"minArgs": 2,
"maxArgs": 2
}
}
};
if (Object.keys(apiMetadata).length === 0) throw new Error("api-metadata.json has not been included in browser-polyfill");
/**
* A WeakMap subclass which creates and stores a value for any key which does
* not exist when accessed, but behaves exactly as an ordinary WeakMap
* otherwise.
*
* @param {function} createItem
* A function which will be called in order to create the value for any
* key which does not exist, the first time it is accessed. The
* function receives, as its only argument, the key being created.
*/ class DefaultWeakMap extends WeakMap {
constructor(createItem, items){
super(items);
this.createItem = createItem;
}
get(key) {
if (!this.has(key)) this.set(key, this.createItem(key));
return super.get(key);
}
}
/**
* Returns true if the given object is an object with a `then` method, and can
* therefore be assumed to behave as a Promise.
*
* @param {*} value The value to test.
* @returns {boolean} True if the value is thenable.
*/ const isThenable = (value)=>{
return value && typeof value === "object" && typeof value.then === "function";
};
/**
* Creates and returns a function which, when called, will resolve or reject
* the given promise based on how it is called:
*
* - If, when called, `chrome.runtime.lastError` contains a non-null object,
* the promise is rejected with that value.
* - If the function is called with exactly one argument, the promise is
* resolved to that value.
* - Otherwise, the promise is resolved to an array containing all of the
* function's arguments.
*
* @param {object} promise
* An object containing the resolution and rejection functions of a
* promise.
* @param {function} promise.resolve
* The promise's resolution function.
* @param {function} promise.reject
* The promise's rejection function.
* @param {object} metadata
* Metadata about the wrapped method which has created the callback.
* @param {boolean} metadata.singleCallbackArg
* Whether or not the promise is resolved with only the first
* argument of the callback, alternatively an array of all the
* callback arguments is resolved. By default, if the callback
* function is invoked with only a single argument, that will be
* resolved to the promise, while all arguments will be resolved as
* an array if multiple are given.
*
* @returns {function}
* The generated callback function.
*/ const makeCallback = (promise, metadata)=>{
return (...callbackArgs)=>{
if (extensionAPIs.runtime.lastError) promise.reject(new Error(extensionAPIs.runtime.lastError.message));
else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) promise.resolve(callbackArgs[0]);
else promise.resolve(callbackArgs);
};
};
const pluralizeArguments = (numArgs)=>numArgs == 1 ? "argument" : "arguments"
;
/**
* Creates a wrapper function for a method with the given name and metadata.
*
* @param {string} name
* The name of the method which is being wrapped.
* @param {object} metadata
* Metadata about the method being wrapped.
* @param {integer} metadata.minArgs
* The minimum number of arguments which must be passed to the
* function. If called with fewer than this number of arguments, the
* wrapper will raise an exception.
* @param {integer} metadata.maxArgs
* The maximum number of arguments which may be passed to the
* function. If called with more than this number of arguments, the
* wrapper will raise an exception.
* @param {boolean} metadata.singleCallbackArg
* Whether or not the promise is resolved with only the first
* argument of the callback, alternatively an array of all the
* callback arguments is resolved. By default, if the callback
* function is invoked with only a single argument, that will be
* resolved to the promise, while all arguments will be resolved as
* an array if multiple are given.
*
* @returns {function(object, ...*)}
* The generated wrapper function.
*/ const wrapAsyncFunction = (name, metadata)=>{
return function asyncFunctionWrapper(target, ...args) {
if (args.length < metadata.minArgs) throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
if (args.length > metadata.maxArgs) throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
return new Promise((resolve, reject)=>{
if (metadata.fallbackToNoCallback) // This API method has currently no callback on Chrome, but it return a promise on Firefox,
// and so the polyfill will try to call it with a callback first, and it will fallback
// to not passing the callback if the first call fails.
try {
target[name](...args, makeCallback({
resolve,
reject
}, metadata));
} catch (cbError) {
console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError);
target[name](...args); // Update the API method metadata, so that the next API calls will not try to
// use the unsupported callback anymore.
metadata.fallbackToNoCallback = false;
metadata.noCallback = true;
resolve();
}
else if (metadata.noCallback) {
target[name](...args);
resolve();
} else target[name](...args, makeCallback({
resolve,
reject
}, metadata));
});
};
};
/**
* Wraps an existing method of the target object, so that calls to it are
* intercepted by the given wrapper function. The wrapper function receives,
* as its first argument, the original `target` object, followed by each of
* the arguments passed to the original method.
*
* @param {object} target
* The original target object that the wrapped method belongs to.
* @param {function} method
* The method being wrapped. This is used as the target of the Proxy
* object which is created to wrap the method.
* @param {function} wrapper
* The wrapper function which is called in place of a direct invocation
* of the wrapped method.
*
* @returns {Proxy<function>}
* A Proxy object for the given method, which invokes the given wrapper
* method in its place.
*/ const wrapMethod = (target, method, wrapper)=>{
return new Proxy(method, {
apply (targetMethod, thisObj, args) {
return wrapper.call(thisObj, target, ...args);
}
});
};
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
/**
* Wraps an object in a Proxy which intercepts and wraps certain methods
* based on the given `wrappers` and `metadata` objects.
*
* @param {object} target
* The target object to wrap.
*
* @param {object} [wrappers = {}]
* An object tree containing wrapper functions for special cases. Any
* function present in this object tree is called in place of the
* method in the same location in the `target` object tree. These
* wrapper methods are invoked as described in {@see wrapMethod}.
*
* @param {object} [metadata = {}]
* An object tree containing metadata used to automatically generate
* Promise-based wrapper functions for asynchronous. Any function in
* the `target` object tree which has a corresponding metadata object
* in the same location in the `metadata` tree is replaced with an
* automatically-generated wrapper function, as described in
* {@see wrapAsyncFunction}
*
* @returns {Proxy<object>}
*/ const wrapObject = (target, wrappers = {}, metadata = {})=>{
let cache = Object.create(null);
let handlers = {
has (proxyTarget, prop) {
return prop in target || prop in cache;
},
get (proxyTarget, prop, receiver) {
if (prop in cache) return cache[prop];
if (!(prop in target)) return undefined;
let value1 = target[prop];
if (typeof value1 === "function") {
// This is a method on the underlying object. Check if we need to do
// any wrapping.
if (typeof wrappers[prop] === "function") // We have a special-case wrapper for this method.
value1 = wrapMethod(target, target[prop], wrappers[prop]);
else if (hasOwnProperty(metadata, prop)) {
// This is an async method that we have metadata for. Create a
// Promise wrapper for it.
let wrapper = wrapAsyncFunction(prop, metadata[prop]);
value1 = wrapMethod(target, target[prop], wrapper);
} else // This is a method that we don't know or care about. Return the
// original method, bound to the underlying object.
value1 = value1.bind(target);
} else if (typeof value1 === "object" && value1 !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) // This is an object that we need to do some wrapping for the children
// of. Create a sub-object wrapper for it with the appropriate child
// metadata.
value1 = wrapObject(value1, wrappers[prop], metadata[prop]);
else if (hasOwnProperty(metadata, "*")) // Wrap all properties in * namespace.
value1 = wrapObject(value1, wrappers[prop], metadata["*"]);
else {
// We don't need to do any wrapping for this property,
// so just forward all access to the underlying object.
Object.defineProperty(cache, prop, {
configurable: true,
enumerable: true,
get () {
return target[prop];
},
set (value) {
target[prop] = value;
}
});
return value1;
}
cache[prop] = value1;
return value1;
},
set (proxyTarget, prop, value, receiver) {
if (prop in cache) cache[prop] = value;
else target[prop] = value;
return true;
},
defineProperty (proxyTarget, prop, desc) {
return Reflect.defineProperty(cache, prop, desc);
},
deleteProperty (proxyTarget, prop) {
return Reflect.deleteProperty(cache, prop);
}
}; // Per contract of the Proxy API, the "get" proxy handler must return the
// original value of the target if that value is declared read-only and
// non-configurable. For this reason, we create an object with the
// prototype set to `target` instead of using `target` directly.
// Otherwise we cannot return a custom object for APIs that
// are declared read-only and non-configurable, such as `chrome.devtools`.
//
// The proxy handlers themselves will still use the original `target`
// instead of the `proxyTarget`, so that the methods and properties are
// dereferenced via the original targets.
let proxyTarget = Object.create(target);
return new Proxy(proxyTarget, handlers);
};
/**
* Creates a set of wrapper functions for an event object, which handles
* wrapping of listener functions that those messages are passed.
*
* A single wrapper is created for each listener function, and stored in a
* map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`
* retrieve the original wrapper, so that attempts to remove a
* previously-added listener work as expected.
*
* @param {DefaultWeakMap<function, function>} wrapperMap
* A DefaultWeakMap object which will create the appropriate wrapper
* for a given listener function when one does not exist, and retrieve
* an existing one when it does.
*
* @returns {object}
*/ const wrapEvent = (wrapperMap)=>({
addListener (target, listener, ...args) {
target.addListener(wrapperMap.get(listener), ...args);
},
hasListener (target, listener) {
return target.hasListener(wrapperMap.get(listener));
},
removeListener (target, listener) {
target.removeListener(wrapperMap.get(listener));
}
})
;
const onRequestFinishedWrappers = new DefaultWeakMap((listener)=>{
if (typeof listener !== "function") return listener;
/**
* Wraps an onRequestFinished listener function so that it will return a
* `getContent()` property which returns a `Promise` rather than using a
* callback API.
*
* @param {object} req
* The HAR entry object representing the network request.
*/ return function onRequestFinished(req) {
const wrappedReq = wrapObject(req, {}, {
getContent: {
minArgs: 0,
maxArgs: 0
}
});
listener(wrappedReq);
};
}); // Keep track if the deprecation warning has been logged at least once.
let loggedSendResponseDeprecationWarning = false;
const onMessageWrappers = new DefaultWeakMap((listener)=>{
if (typeof listener !== "function") return listener;
/**
* Wraps a message listener function so that it may send responses based on
* its return value, rather than by returning a sentinel value and calling a
* callback. If the listener function returns a Promise, the response is
* sent when the promise either resolves or rejects.
*
* @param {*} message
* The message sent by the other end of the channel.
* @param {object} sender
* Details about the sender of the message.
* @param {function(*)} sendResponse
* A callback which, when called with an arbitrary argument, sends
* that value as a response.
* @returns {boolean}
* True if the wrapped listener returned a Promise, which will later
* yield a response. False otherwise.
*/ return function onMessage(message1, sender, sendResponse) {
let didCallSendResponse = false;
let wrappedSendResponse;
let sendResponsePromise = new Promise((resolve)=>{
wrappedSendResponse = function(response) {
if (!loggedSendResponseDeprecationWarning) {
console.warn(SEND_RESPONSE_DEPRECATION_WARNING, new Error().stack);
loggedSendResponseDeprecationWarning = true;
}
didCallSendResponse = true;
resolve(response);
};
});
let result;
try {
result = listener(message1, sender, wrappedSendResponse);
} catch (err1) {
result = Promise.reject(err1);
}
const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called
// wrappedSendResponse synchronously, we can exit earlier
// because there will be no response sent from this listener.
if (result !== true && !isResultThenable && !didCallSendResponse) return false;
// A small helper to send the message if the promise resolves
// and an error if the promise rejects (a wrapped sendMessage has
// to translate the message into a resolved promise or a rejected
// promise).
const sendPromisedResult = (promise)=>{
promise.then((msg)=>{
// send the message value.
sendResponse(msg);
}, (error)=>{
// Send a JSON representation of the error if the rejected value
// is an instance of error, or the object itself otherwise.
let message;
if (error && (error instanceof Error || typeof error.message === "string")) message = error.message;
else message = "An unexpected error occurred";
sendResponse({
__mozWebExtensionPolyfillReject__: true,
message
});
}).catch((err)=>{
// Print an error on the console if unable to send the response.
console.error("Failed to send onMessage rejected reply", err);
});
}; // If the listener returned a Promise, send the resolved value as a
// result, otherwise wait the promise related to the wrappedSendResponse
// callback to resolve and send it as a response.
if (isResultThenable) sendPromisedResult(result);
else sendPromisedResult(sendResponsePromise);
// Let Chrome know that the listener is replying.
return true;
};
});
const wrappedSendMessageCallback = ({ reject , resolve }, reply)=>{
if (extensionAPIs.runtime.lastError) {
// Detect when none of the listeners replied to the sendMessage call and resolve
// the promise to undefined as in Firefox.
// See https://github.com/mozilla/webextension-polyfill/issues/130
if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) resolve();
else reject(new Error(extensionAPIs.runtime.lastError.message));
} else if (reply && reply.__mozWebExtensionPolyfillReject__) // Convert back the JSON representation of the error into
// an Error instance.
reject(new Error(reply.message));
else resolve(reply);
};
const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args)=>{
if (args.length < metadata.minArgs) throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
if (args.length > metadata.maxArgs) throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
return new Promise((resolve, reject)=>{
const wrappedCb = wrappedSendMessageCallback.bind(null, {
resolve,
reject
});
args.push(wrappedCb);
apiNamespaceObj.sendMessage(...args);
});
};
const staticWrappers = {
devtools: {
network: {
onRequestFinished: wrapEvent(onRequestFinishedWrappers)
}
},
runtime: {
onMessage: wrapEvent(onMessageWrappers),
onMessageExternal: wrapEvent(onMessageWrappers),
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 1,
maxArgs: 3
})
},
tabs: {
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 2,
maxArgs: 3
})
}
};
const settingMetadata = {
clear: {
minArgs: 1,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
};
apiMetadata.privacy = {
network: {
"*": settingMetadata
},
services: {
"*": settingMetadata
},
websites: {
"*": settingMetadata
}
};
return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
}; // The build process adds a UMD wrapper around this file, which makes the
// `module` variable available.
module.exports = wrapAPIs(chrome);
} else module.exports = globalThis.browser;
});
},{}]},["kooYn","r2Esq","5CmU8","8iMmq"], "8iMmq", "parcelRequire94c2")
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFlBQVksQ0FBQztBQUViLDRCQUE0QixDQUM1QixJQUFJLEdBQUcsR0FBRyxPQUFPLE1BQU0sSUFBSSxXQUFXLEdBQUcsT0FBTyxHQUFHLE1BQU0sQUFBQztBQUMxRCxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBVSxHQUFHLEVBQUU7SUFDL0MsSUFBSSxHQUFHLENBQUMscUJBQXFCLEVBQzNCLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Q0FFeEIsQ0FBQyxDQUFDOzs7QUNQSCxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQUFBQztBQUUvQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDckMsTUFBTSxDQUFDLFlBQVksR0FBRyxXQUFXLEVBQUUsQ0FBQztBQUNwQyxNQUFNLENBQUMsWUFBWSxHQUFHLFdBQVc7SUFDL0IsT0FBTyxTQUFTLElBQUksRUFBRTtRQUNwQixPQUFPLElBQUksQ0FBQztLQUNiLENBQUM7Q0FDSCxDQUFDOzs7QUNURixZQUFZLENBQUM7QUFLWCxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDOzs7QUNMekU7Ozs7Ozs7R0FPRyxDQUVILFlBQVksQ0FBQztBQUdWLENBQUEsV0FBVztJQUdkLFlBQVk7SUFDWix3Q0FBd0M7SUFDeEMsa0ZBQWtGO0lBQ2xGLG1GQUFtRjtJQUNuRiw2REFBNkQ7SUFDN0QsSUFBSSxrQkFBa0IsR0FBRyxNQUFNLEFBQUM7SUFDaEMsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLEFBQUM7SUFDL0IsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLEFBQUM7SUFDakMsSUFBSSxzQkFBc0IsR0FBRyxNQUFNLEFBQUM7SUFDcEMsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLEFBQUM7SUFDakMsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLEFBQUM7SUFDakMsSUFBSSxrQkFBa0IsR0FBRyxNQUFNLEFBQUM7SUFDaEMsSUFBSSxzQkFBc0IsR0FBRyxNQUFNLEFBQUM7SUFDcEMsSUFBSSxtQkFBbUIsR0FBRyxNQUFNLEFBQUM7SUFDakMsSUFBSSx3QkFBd0IsR0FBRyxNQUFNLEFBQUM7SUFDdEMsSUFBSSxlQUFlLEdBQUcsTUFBTSxBQUFDO0lBQzdCLElBQUksZUFBZSxHQUFHLE1BQU0sQUFBQztJQUM3QixJQUFJLGdCQUFnQixHQUFHLE1BQU0sQUFBQztJQUM5QixJQUFJLHVCQUF1QixHQUFHLE1BQU0sQUFBQztJQUNyQyxJQUFJLHNCQUFzQixHQUFHLE1BQU0sQUFBQztJQUNwQyxJQUFJLGdCQUFnQixHQUFHLE1BQU0sQUFBQztJQUM5QixJQUFJLG9CQUFvQixHQUFHLE1BQU0sQUFBQztJQUNsQyxJQUFJLDZCQUE2QixHQUFHLE1BQU0sQUFBQztJQUMzQyxJQUFJLG9CQUFvQixHQUFHLE1BQU0sQUFBQztJQUNsQyxJQUFJLHdCQUF3QixHQUFHLE1BQU0sQUFBQztJQUV0QyxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFO1FBQzlDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEFBQUM7UUFDM0Isa0JBQWtCLEdBQUcsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2hELGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM5QyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxzQkFBc0IsR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN4RCxtQkFBbUIsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxtQkFBbUIsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNsRCxrQkFBa0IsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEQsc0JBQXNCLEdBQUcsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEQsbUJBQW1CLEdBQUcsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDbEQsd0JBQXdCLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUQsZUFBZSxHQUFHLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxlQUFlLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1Qyx1QkFBdUIsR0FBRyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMxRCxzQkFBc0IsR0FBRyxTQUFTLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN4RCxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDcEQsNkJBQTZCLEdBQUcsU0FBUyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDcEUsb0JBQW9CLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDcEQsd0JBQXdCLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixDQUFDLENBQUM7S0FDN0Q7SUFFRCxJQUFJLGVBQWUsR0FBRyxPQUFPLE9BQU8sS0FBSyxVQUFVLEdBQUcsT0FBTyxHQUFHLEdBQUcsQUFBQyxFQUFDLHNDQUFzQztJQUMzRyxnRUFBZ0U7SUFFaEUsSUFBSSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQUFBQztJQUNoQyxJQUFJLGlCQUFpQixHQUFHLElBQUksZUFBZSxFQUFFLEFBQUM7SUFDOUMsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLGVBQWUsRUFBRSxBQUFDLEVBQUMseURBQXlEO0lBQzFHLCtEQUErRDtJQUMvRCxhQUFhO0lBRWIsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLGVBQWUsRUFBRSxBQUFDLEVBQUMsdURBQXVEO0lBQzFHLCtDQUErQztJQUUvQyxJQUFJLGNBQWMsR0FBRyxFQUFFLEFBQUMsRUFBQyw2REFBNkQ7SUFFdEYsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxBQUFDO0lBQ3BDLElBQUksYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFLEFBQUMsRUFBQyw2REFBNkQ7SUFFNUYsSUFBSSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsQUFBQyxFQUFDLHVFQUF1RTtJQUVyRyxJQUFJLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBRSxBQUFDLEVBQUMsMEZBQTBGO0lBQ3ZILDhFQUE4RTtJQUM5RSwyREFBMkQ7SUFDM0QsYUFBYTtJQUViLElBQUksWUFBWSxHQUNoQixPQUFPLE9BQU8sS0FBSyxVQUFVLEdBQUcsSUFBSSxPQUFPLEVBQUUsR0FBRyxJQUFJLEFBQUM7SUFDckQsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLEFBQUM7SUFFaEMsU0FBUyxjQUFjLENBQUMsU0FBUyxFQUFFO1FBQ2pDLElBQUksU0FBUyxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQzVCLE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUczQixJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsTUFBTSxBQUFDO1FBQy9CLElBQUksS0FBSyxBQUFDO1FBRVYsSUFBSTtZQUNGLEtBQUssR0FBRyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDcEMsQ0FBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLDRFQUE0RTtZQUM1RSwrREFBK0Q7WUFDL0Qsa0RBQWtEO1lBQ2xELFNBQVMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQzVCLFNBQVMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQzVCLE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBRUQsSUFBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUU7WUFDckMsSUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxBQUFDO1lBRXBCLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxFQUFFO2dCQUM5QixnREFBZ0Q7Z0JBQ2hELFNBQVMsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixTQUFTLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztnQkFDNUIsT0FBTyxPQUFPLENBQUM7YUFDaEI7WUFFRCxJQUFJLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQUFBQztZQUV4RCxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFHbkMsU0FBUztZQUdYLElBQUksYUFBYSxHQUFHLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxBQUFDO1lBRXhELElBQUksbUJBQW1CLENBQUMsVUFBVSxFQUNoQyxTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUc5QixPQUFPLElBQUksU0FBUyxHQUFHLGFBQWEsQ0FBQztTQUN0QztRQUVELFNBQVMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzVCLE9BQU8sT0FBTyxDQUFDO0tBQ2hCO0lBRUQsU0FBUyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFO1FBQy9DLElBQUksYUFBYSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQUFBQztRQUN0RCxJQUFJLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEFBQUM7UUFFdEQsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQzVELE9BQU8sSUFBSSxDQUFDO1FBR2QsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQzVELE9BQU8sS0FBSyxDQUFDO1FBR2YsSUFBSSxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUNqRSxPQUFPLEtBQUssQ0FBQztRQUdmLElBQUksYUFBYSxDQUFDLFVBQVUsRUFDMUIsT0FBTyxLQUFLLENBQUM7UUFHZixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDO0tBQzFEO0lBRUQsU0FBUyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFO1FBQ25ELElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsRUFDbEQsT0FBTyxLQUFLLENBQUM7UUFHZixJQUFJLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFDekMsT0FBTyxJQUFJLENBQUM7UUFHZCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsU0FBUyxhQUFhLENBQUMsSUFBSSxFQUFFO1FBQzNCLGlEQUFpRDtRQUNqRCxPQUFPLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN4QyxDQUFDLG9FQUFvRTtJQUd0RSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDckIsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQUFBQztRQUN0QixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVUsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUNoQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN2QixDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3JCLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLEFBQUM7UUFDdEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFVLEtBQUssRUFBRTtZQUMzQixLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xCLENBQUMsQ0FBQztRQUNILE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxTQUFTLG1CQUFtQixHQUFHO1FBRTdCLElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzdCLE9BQU8sSUFBSSxDQUFDO1FBR2QsSUFBSSxtQkFBbUIsRUFDckIsT0FBTyxJQUFJLENBQUM7UUFHZCxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFFM0IsSUFBSTtZQUNGLElBQUksYUFBYSxHQUFHLElBQUksR0FBRyxFQUFFLEFBQUM7WUFDOUIsSUFBSSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQUUsQUFBQztZQUNoQyxJQUFJLE9BQU8sR0FBRyxjQUFjLEFBQUM7WUFDN0IsY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVUsSUFBSSxFQUFFO2dCQUM5QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ2hCLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEFBQUM7Z0JBQ3ZCLDBEQUEwRDtnQkFDMUQsNkNBQTZDO2dCQUM3QyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxBQUFDO2dCQUM5QixxQkFBcUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFDLDhEQUE4RDtnQkFFekYsSUFBSSx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQzdDLGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBRTVCLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7YUFFN0IsQ0FBQyxDQUFDLENBQUMsMERBQTBEO1lBRTlELElBQUksTUFBTSxHQUFHO2dCQUNYLGVBQWUsRUFBRSxlQUFlO2dCQUNoQyxnREFBZ0Q7Z0JBQ2hELGFBQWEsRUFBRSxhQUFhLENBQUMsa0NBQWtDO2FBRWhFLEFBQUM7WUFDRixtQkFBbUIsQ0FBQyxPQUFPLENBQUMsU0FBVSxPQUFPLEVBQUU7Z0JBQzdDLCtEQUErRDtnQkFDL0QsaUZBQWlGO2dCQUNqRixPQUFPLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDMUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxRQUFRLEdBQUcsS0FBSyxBQUFDO1lBQ3JCLElBQUksVUFBVSxHQUFHLElBQUksQUFBQyxFQUFDLDZEQUE2RDtZQUNwRixrRUFBa0U7WUFDbEUscUVBQXFFO1lBQ3JFLDZFQUE2RTtZQUU3RSxJQUFJLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQUFBQztZQUNoRCxJQUFJLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQUFBQztZQUNsRCxJQUFJLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsQUFBQztZQUNwRCxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsU0FBVSxJQUFJLEVBQUU7Z0JBQzFDLElBQUksT0FBTyxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQUFBQztnQkFFOUMsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7Z0JBR25GLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQ3pCO2dCQUVELElBQUksWUFBWSxLQUFLLElBQUksRUFDdkIsT0FBTztnQkFHVCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFDekIsT0FBTztnQkFHVCxJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxBQUFDO2dCQUVyQyxJQUFJO29CQUNGLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUNyQyxDQUFDLE9BQU8sR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ2IsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIsVUFBVSxHQUFHLEdBQUcsQ0FBQztxQkFDbEIsQ0FBQywyQkFBMkI7aUJBRTlCO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFNBQVUsSUFBSSxFQUFFO2dCQUMzQyxJQUFJLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEFBQUM7Z0JBRTlDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDO2dCQUduRixZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUMxQjtnQkFFRCxJQUFJO29CQUNGLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUN2QyxDQUFDLE9BQU8sR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ2IsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIsVUFBVSxHQUFHLEdBQUcsQ0FBQztxQkFDbEIsQ0FBQywyQkFBMkI7aUJBRTlCO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsSUFBSSxRQUFRLEVBQ1YsTUFBTSxVQUFVLENBQUM7WUFHbkIsT0FBTyxNQUFNLENBQUM7U0FDZixRQUFTO1lBQ1IsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1NBQzdCO0tBQ0Y7SUFDRCxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFO1FBRXhCLElBQUksSUFBSSxLQUFLLElBQUksRUFDZixPQUFPO1FBR1QsSUFBSSxPQUFPLElBQUksS0FBSyxVQUFVLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUN4RCxPQUFPO1FBQ1IsQ0FBQyx1REFBdUQ7UUFDekQsMkRBQTJEO1FBQzNELDREQUE0RDtRQUc1RCxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFDN0IsT0FBTztRQUNSLENBQUMsMENBQTBDO1FBQzVDLGtEQUFrRDtRQUNsRCxvREFBb0Q7UUFHcEQsSUFBSSxNQUFNLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQUFBQztRQUVyQyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDeEIsTUFBTSxHQUFHO2dCQUNQLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQztZQUNGLGVBQWUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ2pDLE1BQ0MsY0FBYyxDQUFDLElBQUksQ0FBQztZQUFDLE1BQU07WUFBRSxJQUFJO1NBQUMsQ0FBQyxDQUFDO1FBR3RDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywrREFBK0Q7UUFFcEcsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLElBQUksRUFDM0MsT0FBUSxJQUFJLENBQUMsUUFBUTtZQUNuQixLQUFLLHNCQUFzQjtnQkFDekIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO2dCQUN0QyxNQUFNO1lBRVIsS0FBSyxlQUFlO2dCQUNsQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUM7Z0JBQ2xDLE1BQU07U0FDVDtLQUdOO0lBQ0QsU0FBUyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtRQUMvQixJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEFBQUM7UUFDM0YsSUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQUFBQztRQUduRSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQzVCLFVBQVUsRUFBRSxVQUFVO1lBQ3RCLE1BQU0sRUFBRSxHQUFHO1lBQ1gsT0FBTyxFQUFFLElBQUk7WUFDYixjQUFjLEVBQUUsY0FBYyxJQUFJLFdBQVk7Z0JBQzVDLE9BQU8sRUFBRSxDQUFDO2FBQ1g7U0FDRixDQUFDLENBQUM7S0FFTixDQUFDLHdEQUF3RDtJQUMxRCxpRkFBaUY7SUFFakYsU0FBUyw4QkFBOEIsQ0FBQyxJQUFJLEVBQUU7UUFFMUMsSUFBSSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxBQUFDO1FBRTlDLElBQUksU0FBUyxLQUFLLFNBQVMsRUFDekIsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBRy9CO0lBQ0QsU0FBUyxhQUFhLENBQUMsRUFBRSxFQUFFO1FBRXZCLE9BQU8sZUFBZSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUVsQztJQUNELFNBQVMsZUFBZSxDQUFDLElBQUksRUFBRTtRQUUzQixPQUFPLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUV0QztJQUNELFNBQVMseUJBQXlCLENBQUMsUUFBUSxFQUFFO1FBRXpDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQUFBQztRQUNsQyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVUsSUFBSSxFQUFFO1lBQ25DLElBQUksT0FBTyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEFBQUM7WUFFdEMsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7WUFHeEYsSUFBSSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxBQUFDO1lBQzNFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxTQUFVLElBQUksRUFBRTtnQkFDdkMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdCLENBQUMsQ0FBQztTQUNKLENBQUMsQ0FBQztRQUNILE9BQU8saUJBQWlCLENBQUM7S0FFNUI7SUFDRCxTQUFTLG9CQUFvQixDQUFDLFlBQVksRUFBRTtRQUV4QyxzRkFBc0Y7UUFDdEYsc0ZBQXNGO1FBQ3RGLGtFQUFrRTtRQUNsRSxnQ0FBZ0M7UUFDaEMsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDLDhCQUE4QixBQUFDO1FBRXZELElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUN0Qiw4RkFBOEY7WUFDOUYsMEZBQTBGO1lBQzFGLCtGQUErRjtZQUMvRixJQUFJLE1BQU0sR0FBRyxDQUFDLEFBQUM7WUFDZixZQUFZLENBQUMsOEJBQThCLEdBQUcsSUFBSSxHQUFHO2dCQUNuRCxTQUFTLEVBQUUsSUFBSSxHQUFHLEVBQUU7Z0JBQ3BCLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixNQUFNLEVBQUUsU0FBVSxRQUFRLEVBQUU7b0JBQzFCLE9BQU8sTUFBTSxFQUFFLENBQUM7aUJBQ2pCO2dCQUNELG1CQUFtQixFQUFFLFNBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRTtnQkFDckQsaUJBQWlCLEVBQUUsU0FBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUN2RSxvQkFBb0IsRUFBRSxXQUFZLEVBQUU7YUFDckMsQ0FBQztTQUNILENBQUMsNERBQTREO1FBRzlELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLEFBQUM7UUFFNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFVLFFBQVEsRUFBRTtZQUNoQyxJQUFJLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQUFBQztZQUUxQyxJQUFJLE9BQU8sUUFBUSxDQUFDLGVBQWUsS0FBSyxVQUFVLElBQUksT0FBTyxRQUFRLENBQUMsaUJBQWlCLEtBQUssVUFBVSxFQUNwRyx1Q0FBdUM7WUFDdkMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUd4QyxPQUFPLEVBQUUsQ0FBQztTQUNYLENBQUMsQ0FBQyw4Q0FBOEM7UUFDakQsMkRBQTJEO1FBQzNELGlEQUFpRDtRQUdqRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFVLFFBQVEsRUFBRSxFQUFFLEVBQUU7WUFDN0MsSUFBSSxPQUFPLFFBQVEsQ0FBQyxlQUFlLEtBQUssVUFBVSxJQUFJLE9BQU8sUUFBUSxDQUFDLGlCQUFpQixLQUFLLFVBQVUsRUFDcEcsdUNBQXVDO1lBQ3ZDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FFekMsQ0FBQyxDQUFDLENBQUMsaURBQWlEO1FBRXJELElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixBQUFDO1FBRWxELElBQUksc0JBQXNCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixJQUFJLFdBQVksRUFBRSxBQUFDO1FBRXhFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDeEIsK0RBQStEO2dCQUMvRCxrREFBa0Q7Z0JBQ2xELFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXpCLElBQUksWUFBWSxLQUFLLElBQUksRUFDdkIsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFFcEM7WUFFRCxPQUFPLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDdEQsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFO1lBQ3pFLElBQUksT0FBTyxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQUFBQztZQUUxQyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQ3ZCLE9BQU87WUFHVCxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNqQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxBQUFDO1lBQzNCLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEFBQUMsRUFBQywrREFBK0Q7WUFDbEcsd0VBQXdFO1lBQ3hFLDRFQUE0RTtZQUU1RSxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3RCLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxhQUFhLElBQUksSUFBSSxJQUFJLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLElBQUksQUFBQztnQkFDNUYsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxJQUFJLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksSUFBSSxBQUFDO2dCQUV2RixJQUFJLENBQUMsVUFBVSxJQUFJLFNBQVMsRUFBRTtvQkFDNUIsb0JBQW9CO29CQUNwQixZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN2QixXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMxQixNQUFNLElBQUksVUFBVSxJQUFJLFNBQVM7cUJBQVMsSUFBSSxVQUFVLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ3ZFLDRCQUE0QjtvQkFDNUIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFMUIsSUFBSSxRQUFRLEVBQ1Ysb0NBQW9DO29CQUNwQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3lCQUV0QixhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUU5QixNQUFNLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLEVBQ2xDO29CQUFBLElBQUksUUFBUSxFQUNWLG9DQUFvQztvQkFDcEMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDdkIsQUFDRjthQUNGLE1BQ0Msb0JBQW9CO1lBQ3BCLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFHekIsT0FBTyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQ3BELENBQUM7S0FFTDtJQUNELFNBQVMsc0JBQXNCLEdBQUc7UUFDaEMscURBQXFEO1FBQ3JELE9BQU8sS0FBSyxDQUFDO0tBQ2QsQ0FBQyx1QkFBdUI7SUFFekIsU0FBUyxvQkFBb0IsR0FBRztRQUU1QixPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUM7S0FFNUIsQ0FBQyx5RUFBeUU7SUFDM0UsMEVBQTBFO0lBQzFFLEVBQUU7SUFDRixvRUFBb0U7SUFDcEUsaURBQWlEO0lBQ2pELEVBQUU7SUFDRixxQkFBcUI7SUFDckIsdUNBQXVDO0lBQ3ZDLG1DQUFtQztJQUNuQyxtRUFBbUU7SUFDbkUseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSxzQ0FBc0M7SUFDdEMsd0JBQXdCO0lBQ3hCLElBQUk7SUFDSixFQUFFO0lBQ0YsNENBQTRDO0lBQzVDLE1BQU07SUFDTixXQUFXO0lBQ1gsa0NBQWtDO0lBQ2xDLDBFQUEwRTtJQUMxRSxLQUFLO0lBRUwsU0FBUyxtQ0FBbUMsR0FBRztRQUUzQyw0Q0FBNEM7UUFDNUMsOEVBQThFO1FBQzlFLHNGQUFzRjtRQUN0RiwrREFBK0Q7UUFDL0QsSUFBSSxNQUFNLEdBQUcsZ0JBQWdCLEFBQUM7UUFDOUIsSUFBSSxTQUFTLEFBQUM7UUFDZCxJQUFJLGNBQWMsQUFBQztRQUNuQixPQUFPLFNBQVUsSUFBSSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFO1lBQ3RELE9BQVEsTUFBTTtnQkFDWixLQUFLLGdCQUFnQjtvQkFDbkIsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO3dCQUN0QixxRUFBcUU7d0JBQ3JFLFNBQVMsR0FBRyxJQUFJLENBQUM7d0JBQ2pCLGNBQWMsR0FBRyxPQUFPLGNBQWMsS0FBSyxVQUFVLENBQUM7d0JBQ3RELFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLGtGQUFrRjt3QkFFdkksTUFBTSxHQUFHLGtCQUFrQixDQUFDO3FCQUM3QjtvQkFFRCxNQUFNO2dCQUVSLEtBQUssa0JBQWtCO29CQUNyQixJQUFJLGNBQWMsRUFDaEIsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBRzVDLE1BQU0sR0FBRyxVQUFVLENBQUM7b0JBQ3BCLE1BQU07YUFDVDtZQUVELE9BQU8sSUFBSSxDQUFDO1NBQ2IsQ0FBQztLQUVMO0lBQ0QsU0FBUyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUU7UUFFakMsT0FBUSxPQUFPLElBQUk7WUFDakIsS0FBSyxVQUFVO2dCQUVYLDRCQUE0QjtnQkFDNUIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtvQkFDMUIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUNqQyxlQUFlO29CQUNmLE9BQU8sSUFBSSxDQUFDO29CQUdkLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEFBQUM7b0JBRTFELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLGFBQWEsRUFDdEQsMkJBQTJCO29CQUMzQixPQUFPLEtBQUssQ0FBQztvQkFDZCxDQUFDLG9DQUFvQztvQkFHdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUMvQyx1QkFBdUI7b0JBQ3ZCLE9BQU8sS0FBSyxDQUFDO29CQUNkLENBQUMsZ0JBQWdCO2dCQUNsQiwyREFBMkQ7aUJBRTVELENBQUMsMkRBQTJEO2dCQUc3RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEFBQUM7Z0JBQ3pDLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRzNELEtBQUssUUFBUTtnQkFFVCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQ2QsT0FBUSxJQUFJLENBQUMsUUFBUTtvQkFDbkIsS0FBSyxzQkFBc0IsQ0FBQztvQkFDNUIsS0FBSyxlQUFlO3dCQUNsQiwrQkFBK0I7d0JBQy9CLE9BQU8sSUFBSSxDQUFDO29CQUVkO3dCQUNFLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFHSCxPQUFPLEtBQUssQ0FBQztZQUdqQjtnQkFFSSxPQUFPLEtBQUssQ0FBQztTQUVsQjtLQUVKO0lBRUQsT0FBTyxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO0lBQ3BELE9BQU8sQ0FBQyw4QkFBOEIsR0FBRyw4QkFBOEIsQ0FBQztJQUN4RSxPQUFPLENBQUMsbUNBQW1DLEdBQUcsbUNBQW1DLENBQUM7SUFDbEYsT0FBTyxDQUFDLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO0lBQzlELE9BQU8sQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3RDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQzFDLE9BQU8sQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztJQUN4RCxPQUFPLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7SUFDcEQsT0FBTyxDQUFDLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0lBQ3RELE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztJQUNsRCxPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUM1QixPQUFPLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztDQUNqQyxDQUFBLEVBQUcsQ0FBQzs7O0FDN3BCUCxJQUFJLFFBQVEsR0FBRyxJQUFJLEFBQUM7QUFBQSxJQUFJLFFBQVEsR0FBRyxJQUFJLEFBQUM7QUFBQSxJQUFJLFVBQVUsR0FBRyxLQUFLLEFBQUM7QUFBQSxJQUFJLFlBQVksR0FBRyxrQkFBa0IsQUFBQztBQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLGtCQUFrQixDQUFDO0FBQUEsWUFBWSxDQUFDO0FBRW5LLFNBQVMsa0JBQWtCLENBQUMsR0FBRyxFQUFFO0lBQUUsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLENBQUMsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO0NBQUU7QUFFekosU0FBUyxrQkFBa0IsR0FBRztJQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsc0lBQXNJLENBQUMsQ0FBQztDQUFFO0FBRTlMLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFO0lBQUUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksRUFBRSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FBRTtBQUU5SixTQUFTLGtCQUFrQixDQUFDLEdBQUcsRUFBRTtJQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0NBQUU7QUFFM0YsU0FBUywwQkFBMEIsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFO0lBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxBQUFDO0lBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSyxDQUFBLEVBQUUsR0FBRywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQSxJQUFLLGNBQWMsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRTtZQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7WUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEFBQUM7WUFBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLEFBQUM7WUFBQyxPQUFPO2dCQUFFLENBQUMsRUFBRSxDQUFDO2dCQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsR0FBRztvQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU87d0JBQUUsSUFBSSxFQUFFLElBQUk7cUJBQUUsQ0FBQztvQkFBQyxPQUFPO3dCQUFFLElBQUksRUFBRSxLQUFLO3dCQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7cUJBQUUsQ0FBQztpQkFBRTtnQkFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUFFLE1BQU0sRUFBRSxDQUFDO2lCQUFFO2dCQUFFLENBQUMsRUFBRSxDQUFDO2FBQUUsQ0FBQztTQUFFO1FBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyx1SUFBdUksQ0FBQyxDQUFDO0tBQUU7SUFBQyxJQUFJLGdCQUFnQixHQUFHLElBQUksRUFBRSxNQUFNLEdBQUcsS0FBSyxFQUFFLEdBQUcsQUFBQztJQUFDLE9BQU87UUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUc7WUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUFFO1FBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxHQUFHO1lBQUUsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxBQUFDO1lBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFDLE9BQU8sSUFBSSxDQUFDO1NBQUU7UUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFO1lBQUUsTUFBTSxHQUFHLElBQUksQ0FBQztZQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7U0FBRTtRQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsR0FBRztZQUFFLElBQUk7Z0JBQUUsSUFBSSxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUFFLFFBQVM7Z0JBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxHQUFHLENBQUM7YUFBRTtTQUFFO0tBQUUsQ0FBQztDQUFFO0FBRXQrQixTQUFTLDJCQUEyQixDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUU7SUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU87SUFBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxPQUFPLGlCQUFpQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxBQUFDO0lBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUMsSUFBSSxDQUFDLEtBQUssV0FBVyxJQUFJLDJDQUEyQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Q0FBRTtBQUVoYSxTQUFTLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUU7SUFBRSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFBQyxJQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQUcsT0FBTyxJQUFJLENBQUM7Q0FBRTtBQUV2TCwwRUFBMEUsQ0FFMUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXVDRSxDQUNGLElBQUksVUFBVSxHQUFHLDRCQUE0QixBQUFDO0FBQzlDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxBQUFDO0FBRXJDLFNBQVMsTUFBTSxDQUFDLFVBQVUsRUFBRTtJQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsR0FBRyxHQUFHO1FBQ1QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTztRQUMzQixnQkFBZ0IsRUFBRSxFQUFFO1FBQ3BCLGlCQUFpQixFQUFFLEVBQUU7UUFDckIsTUFBTSxFQUFFLFNBQVMsTUFBTSxDQUFDLEVBQUUsRUFBRTtZQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxXQUFZLEVBQUUsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsT0FBTyxFQUFFLFNBQVMsT0FBTyxDQUFDLEVBQUUsRUFBRTtZQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2pDO0tBQ0YsQ0FBQztJQUNGLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztDQUNuQztBQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQUM5QixJQUFJLGFBQWEsRUFFZixjQUFjLEVBRWQsY0FBYyxDQUNoQixxQ0FBcUMsQ0FEckIsQUFFZjtBQUVELFNBQVMsV0FBVyxHQUFHO0lBQ3JCLE9BQU8sUUFBUSxJQUFLLENBQUEsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFBLEFBQUMsQ0FBQztDQUNoRztBQUVELFNBQVMsT0FBTyxHQUFHO0lBQ2pCLE9BQU8sUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUM7Q0FDbEMsQ0FBQyx3Q0FBd0M7QUFHMUMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEFBQUM7QUFFbEMsSUFBSSxBQUFDLENBQUEsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFBLElBQUssT0FBTyxTQUFTLEtBQUssV0FBVyxFQUFFO0lBQzVFLElBQUksUUFBUSxHQUFHLFdBQVcsRUFBRSxBQUFDO0lBQzdCLElBQUksSUFBSSxHQUFHLE9BQU8sRUFBRSxBQUFDO0lBQ3JCLElBQUksUUFBUSxHQUFHLFVBQVUsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsSUFBSSxDQUFDLDhCQUE4QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQUFBQztJQUMzSCxJQUFJLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxHQUFHLFFBQVEsR0FBSSxDQUFBLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQSxHQUFJLEdBQUcsQ0FBQyxBQUFDLEVBQUMsYUFBYTtJQUVuRyxFQUFFLENBQUMsU0FBUyxHQUFHLFNBQVUsS0FBSyxFQUU1QjtRQUNBLGFBQWEsR0FBRyxFQUFFLENBQ2xCLDRCQUE0QixDQURWLENBRWpCO1FBQ0QsY0FBYyxHQUFHLEVBQUUsQ0FDbkIsNEJBQTRCLENBRFQsQ0FFbEI7UUFDRCxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksSUFBSSxHQUVOLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxBQUFDO1FBRXpCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDMUIsdUNBQXVDO1lBQ3ZDLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUNqQyxrQkFBa0IsRUFBRSxDQUFDO1lBR3ZCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVUsS0FBSyxFQUFFO2dCQUMvQyxPQUFPLEtBQUssQ0FBQyxPQUFPLEtBQUssWUFBWSxDQUFDO2FBQ3ZDLENBQUMsQUFBQyxFQUFDLG9CQUFvQjtZQUV4QixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVUsS0FBSyxFQUFFO2dCQUMxQyxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUN4SCxDQUFDLEFBQUM7WUFFSCxJQUFJLE9BQU8sRUFBRTtnQkFDWCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBVSxLQUFLLEVBQUU7b0JBQzlCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDckMsQ0FBQyxDQUFDO2dCQUVILElBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFFO29CQUM5QyxJQUFJLEVBQUUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEFBQUM7b0JBRTlCLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEVBQ3JCLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7aUJBRTFDO2FBQ0YsTUFBTSxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQzdCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztpQkFDYjtnQkFDTCx3QkFBd0I7Z0JBQ3hCLElBQUksR0FBRyxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsR0FBRyxPQUFPLE9BQU8sS0FBSyxXQUFXLEdBQUcsSUFBSSxHQUFHLE9BQU8sR0FBRyxNQUFNLEFBQUM7Z0JBRW5HLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQzFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7YUFFeEI7U0FDRjtRQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDekIsK0JBQStCO1lBQy9CLElBQUksU0FBUyxHQUFHLDBCQUEwQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQzdELEtBQUssQUFBQztZQUVWLElBQUk7Z0JBQ0YsSUFBSyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxBQUFDLENBQUEsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQSxDQUFFLElBQUksRUFBRztvQkFDbEQsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLEtBQUssQUFBQztvQkFDakMsSUFBSSxLQUFLLEdBQUcsY0FBYyxDQUFDLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEFBQUM7b0JBQ3ZGLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUJBQWMsR0FBTSxjQUFjLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsTUFBTSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ2xIO2FBQ0wsQ0FBQyxPQUFPLEdBQUcsRUFBRTtnQkFDWixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2xCLFFBQVM7Z0JBQ1IsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ2Y7WUFFRCxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRTtnQkFDbkMsZ0NBQWdDO2dCQUNoQyxrQkFBa0IsRUFBRSxDQUFDO2dCQUNyQixJQUFJLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxBQUFDLEVBQUMsYUFBYTtnQkFFdEUsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDcEM7U0FDRjtLQUNGLENBQUM7SUFFRixFQUFFLENBQUMsT0FBTyxHQUFHLFNBQVUsQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzFCLENBQUM7SUFFRixFQUFFLENBQUMsT0FBTyxHQUFHLFdBQVk7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxxREFBa0QsQ0FBSSxDQUFDO0tBQ2xFLENBQUY7Q0FDSDtBQUVELFNBQVMsa0JBQWtCLEdBQUc7SUFDNUIsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQUFBQztJQUVsRCxJQUFJLE9BQU8sRUFBRTtRQUNYLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUEyQixDQUFHLENBQUM7S0FDMUM7Q0FDSjtBQUVELFNBQVMsa0JBQWtCLENBQUMsV0FBVyxFQUFFO0lBQ3ZDLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEFBQUM7SUFDNUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFDeEIsSUFBSSxTQUFTLEdBQUcsd05BQXdOLEFBQUM7SUFFek8sSUFBSSxVQUFVLEdBQUcsMEJBQTBCLENBQUMsV0FBVyxDQUFDLEVBQ3BELE1BQU0sQUFBQztJQUVYLElBQUk7UUFDRixJQUFLLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEFBQUMsQ0FBQSxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFBLENBQUUsSUFBSSxFQUFHO1lBQ3JELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEFBQUM7WUFDOUIsSUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLEFBQUM7WUFDM0UsU0FBUyxJQUFJLHVIQUF1SCxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLGlDQUFpQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFVLElBQUksRUFBRTtnQkFDaFMsT0FBTyxZQUFTLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQzthQUNwQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLDRCQUE0QixDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsc0RBQXNELENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsMkNBQTJDLENBQUMsR0FBRyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztTQUNqUDtLQUNGLENBQUMsT0FBTyxHQUFHLEVBQUU7UUFDWixVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ25CLFFBQVM7UUFDUixVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDaEI7SUFFRCxTQUFTLElBQUksUUFBUSxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzlCLE9BQU8sT0FBTyxDQUFDO0NBQ2hCO0FBRUQsU0FBUyxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFDOUIscUNBQXFDLENBQ3JDO0lBQ0UsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQUFBQztJQUU3QixJQUFJLENBQUMsT0FBTyxFQUNWLE9BQU8sRUFBRSxDQUFDO0lBR1osSUFBSSxPQUFPLEdBQUcsRUFBRSxBQUFDO0lBQ2pCLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEFBQUM7SUFFZCxJQUFLLENBQUMsSUFBSSxPQUFPLENBQ2YsSUFBSyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFO1FBQ3ZCLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFdkIsSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUNoRSxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTTtZQUFFLENBQUM7U0FBQyxDQUFDLENBQUM7S0FFN0I7SUFHSCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQ2YsT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUcxRCxPQUFPLE9BQU8sQ0FBQztDQUNoQjtBQUVELFNBQVMsVUFBVSxDQUFDLElBQUksRUFBRTtJQUN4QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEFBQUM7SUFFL0IsT0FBTyxDQUFDLE1BQU0sR0FBRyxXQUFZO1FBQzNCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQzFCLGFBQWE7UUFDYixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUVyQyxDQUFDO0lBRUYsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWE7SUFFMUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztDQUN6RDtBQUVELElBQUksVUFBVSxHQUFHLElBQUksQUFBQztBQUV0QixTQUFTLFNBQVMsR0FBRztJQUNuQixJQUFJLFVBQVUsRUFDWixPQUFPO0lBR1QsVUFBVSxHQUFHLFVBQVUsQ0FBQyxXQUFZO1FBQ2xDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxBQUFDO1FBRWhFLElBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFFO1lBQ3JDLGdDQUFnQztZQUNoQyxJQUFJLElBQUksR0FFTixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxBQUFDO1lBQ2hDLElBQUksUUFBUSxHQUFHLFdBQVcsRUFBRSxBQUFDO1lBQzdCLElBQUksbUJBQW1CLEdBQUcsUUFBUSxLQUFLLFdBQVcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxnREFBZ0QsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsT0FBTyxFQUFFLENBQUMsQUFBQztZQUNwTCxJQUFJLFFBQVEsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixBQUFDO1lBRXpHLElBQUksQ0FBQyxRQUFRLEVBQ1gsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBRXhCO1FBRUQsVUFBVSxHQUFHLElBQUksQ0FBQztLQUNuQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQ1I7QUFFRCxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBRXRCLEtBQUssRUFFTDtJQUNBLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEFBQUM7SUFFN0IsSUFBSSxDQUFDLE9BQU8sRUFDVixPQUFPO0lBR1QsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssRUFDdEIsU0FBUyxFQUFFLENBQUM7U0FDUCxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO1FBQzlCLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxBQUFDO1FBRXBELElBQUksSUFBSSxFQUFFO1lBQ1IsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNyQixpRUFBaUU7Z0JBQ2pFLG9IQUFvSDtnQkFDcEgsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFBQztnQkFFbkMsSUFBSyxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDNUMsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxBQUFDO29CQUN0QixJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEFBQUM7b0JBRWpELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ3RCLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFFckM7YUFFSjtZQUVELElBQUksRUFBRSxHQUFHLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQUFBQztZQUNwRSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHO2dCQUFDLEVBQUU7Z0JBQUUsSUFBSTthQUFDLENBQUM7U0FDaEMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQ3RCLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBRWxDO0NBQ0Y7QUFFRCxTQUFTLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRSxFQUFFO0lBQzdCLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEFBQUM7SUFFN0IsSUFBSSxDQUFDLE9BQU8sRUFDVixPQUFPO0lBR1QsSUFBSSxPQUFPLENBQUMsR0FBRSxDQUFDLEVBQUU7UUFDZiw4RUFBOEU7UUFDOUUsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxBQUFDO1FBQzFCLElBQUksT0FBTyxHQUFHLEVBQUUsQUFBQztRQUVqQixJQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBRTtZQUNwQixJQUFJLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEFBQUM7WUFFeEQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUUzQixDQUFDLHNHQUFzRztRQUd4RyxPQUFPLE9BQU8sQ0FBQyxHQUFFLENBQUMsQ0FBQztRQUNuQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQywwQkFBMEI7UUFFbkQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFVLEVBQUUsRUFBRTtZQUM1QixTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDbkMsQ0FBQyxDQUFDO0tBQ0osTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQ3RCLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUUsQ0FBQyxDQUFDO0NBRWhDO0FBRUQsU0FBUyxjQUFjLENBQUMsTUFBTSxFQUU1QixFQUFFLEVBRUYsWUFBWSxFQUVaO0lBQ0EsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUM3QyxPQUFPLElBQUksQ0FBQztJQUNiLENBQUMsdUdBQXVHO0lBR3pHLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQUFBQztJQUNqRCxJQUFJLFFBQVEsR0FBRyxLQUFLLEFBQUM7SUFFckIsTUFBTyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBRTtRQUN6QixJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLEFBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQUFBQztRQUU1QyxJQUFJLENBQUMsRUFDSCwrRUFBK0U7UUFDL0UsUUFBUSxHQUFHLElBQUksQ0FBQzthQUNYO1lBQ0wseURBQXlEO1lBQ3pELElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQUFBQztZQUU3QyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNsQixrRkFBa0Y7Z0JBQ2xGLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ2pCLE1BQU07YUFDUDtZQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3BEO0tBQ0Y7SUFFRCxPQUFPLFFBQVEsQ0FBQztDQUNqQjtBQUVELFNBQVMsaUJBQWlCLENBQUMsTUFBTSxFQUUvQixFQUFFLEVBRUYsWUFBWSxFQUVaO0lBQ0EsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQUFBQztJQUU3QixJQUFJLENBQUMsT0FBTyxFQUNWLE9BQU87SUFHVCxJQUFJLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDdkQsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFDaEIsT0FBTyxJQUFJLENBQUM7UUFHZCxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztLQUN4RDtJQUVELElBQUksYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUNuQixPQUFPLElBQUksQ0FBQztJQUdkLGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDekIsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQUFBQztJQUM5QixjQUFjLENBQUMsSUFBSSxDQUFDO1FBQUMsTUFBTTtRQUFFLEVBQUU7S0FBQyxDQUFDLENBQUM7SUFFbEMsSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUM3RCxPQUFPLElBQUksQ0FBQztDQUVmO0FBRUQsU0FBUyxZQUFZLENBQUMsTUFBTSxFQUUxQixFQUFFLEVBRUY7SUFDQSxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxBQUFDO0lBQzlCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBRXBCLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFHbkMsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFDN0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBVSxFQUFFLEVBQUU7UUFDakQsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNwQixDQUFDLENBQUM7SUFHTCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ1gsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFMUIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFDNUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsU0FBVSxFQUFFLEVBQUU7UUFDaEQsSUFBSSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsV0FBWTtZQUN0QyxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUMzQyxDQUFDLEFBQUM7UUFFSCxJQUFJLGtCQUFrQixJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQzdDLCtCQUErQjtRQUMvQixjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztLQUVqRSxDQUFDLENBQUM7SUFHTCxjQUFjLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0NBQzNCOzs7QUN0ZUQsMERBQUE7QUFFQSw0RCxFQUVBLDJDQUZBO0FBR0FBLHFCQUFPLENBQUNDLE1BQVIsRUFBZ0JDLFNBQWhCLENBQTBCQyxXQUExQixDQUFzQyxVQUFZSCxxQkFBTyxDQUFDSSxPQUFSLENBQWdCQyxlQUFoQixFQUFsRDtBQUFBLENBQUFMLENBQUFBO0FBQ0FBLHFCQUFPLENBQUNNLGFBQVIsRUFBdUJKLFNBQXZCLENBQWlDQyxXQUFqQyxDQUE2QyxVQUFZSCxxQkFBTyxDQUFDSSxPQUFSLENBQWdCQyxlQUFoQixFQUF6RDtBQUFBLENBQUFMLENBQUFBO0FBRUEsTUFBTU8sZ0JBQWdCLEdBQUcsb0JBQXpCLEFBQUE7QUFFQVAscUJBQU8sQ0FBQ1EsWUFBUixDQUFxQkMsTUFBckIsQ0FBNEI7SUFDM0JDLEVBQUUsRUFBRUgsZ0JBRHVCO0lBRTNCSSxLQUFLLEVBQUUsb0JBRm9CO0lBRzNCQyxRQUFRLEVBQUU7UUFBQyxLQUFEO0tBQVZBO0NBSEQsQ0FBNEIsQ0FBQTtBQU01QloscUJBQU8sQ0FBQ1EsWUFBUixDQUFxQk4sU0FBckIsQ0FBK0JDLFdBQS9CLENBQTJDLENBQUNVLElBQUQsRUFBT0MsR0FBUCxHQUFlO0lBQ3pELElBQUlELElBQUksQ0FBQ0UsVUFBTCxLQUFvQlIsZ0JBQXhCLEVBQ01QLHFCQUFPLENBQUNnQixJQUFSLENBQWFDLFdBQWIsQ0FBeUJILEdBQUcsRUFBRUosRUFBTCxFQUFVO1FBQUNRLElBQUksRUFBRVgsZ0JBQVA7UUFBeUJZLFNBQVMsRUFBRU4sSUFBSSxDQUFDTyxlQUFoQkQ7S0FBNUQsQ0FBTCxDQUF3QztDQUYxQyxDQUlDLENBQUE7OztBQ3BCRDs7b0RBU2FVLGNBQWM7OzZDQVNkSyxPQUFPOztBQWxCcEIsdURBQUE7O0FBQ0EsMENBQUE7QUFFQSxNQUFNVixRQUFRLEdBQUc7SUFDaEJDLGVBQWUsRUFBRSxvREFERDtJQUVoQkMscUJBQXFCLEVBQUVILHdCQUFnQixDQUFDSSxJQUFqQixDQUFzQixJQUF0QixDQUZQO0lBR2hCQyx3QkFBd0IsRUFBRU4sMkJBQW1CLENBQUNLLElBQXBCLENBQXlCLElBQXpCLENBQTFCQztDQUhELEFBQWlCO0FBTVYsTUFBTUMsY0FBYyxHQUFHLElBQUlSLGlDQUFKLENBQWdCO0lBQzdDRyxRQUQ2QztJQUU3Q00sVUFBVSxFQUFFO1FBQ1hULGlDQUFXLENBQUNTLFVBQVosQ0FBdUJDLFlBRFo7S0FGaUM7SUFLN0NDLE9BQU8sRUFBRSxJQUxvQztJQU03Q0MsV0FBVyxFQUFFLE9BQWJBO0NBTjZCLENBQXZCLEFBQXVDO0FBU3ZDLE1BQU1DLE9BQU8sR0FBRztJQUN0QixNQUFNQyxHQUFOLElBQVk7UUFDWCxPQUFPLE1BQU1OLGNBQWMsQ0FBQ08sTUFBZixFQUFOLENBQVA7S0FGcUI7SUFLdEJYLGVBQWUsRUFBRVksVUFBVSxDQUFDLGlCQUFELENBTEw7SUFPdEJDLE1BQU0sRUFBRTtRQUNQQyxlQUFlLEVBQUVGLFVBQVUsQ0FBQyx1QkFBRCxDQURwQjtRQUVQRyxrQkFBa0IsRUFBRUgsVUFBVSxDQUFDLDBCQUFELENBQTlCRztLQUZPO0NBUEYsQUFBZ0I7QUFldkIsU0FBU0gsVUFBVCxDQUFvQkssSUFBcEIsRUFBdUM7SUFDdEMsT0FBTyxVQUFZO1FBQ2xCLE1BQU1QLEdBQUcsR0FBRyxNQUFNRCxPQUFPLENBQUNDLEdBQVIsRUFBbEIsQUFBQTtRQUNBLE9BQU9RLFFBQVEsQ0FBQ1IsR0FBRyxDQUFDTyxJQUFELENBQUosQ0FBZixDQUFBO0tBRkQsQ0FHQztDQUNEO0FBRUQsTUFBTUMsUUFBUSxHQUFHLENBQUNDLEdBQUQsR0FBaUJBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVLEdBQVYsQ0FBQSxDQUFlQyxHQUFmLENBQW1CQyxDQUFBQSxDQUFDLEdBQUlBLENBQUMsQ0FBQ0MsSUFBRixFQUF4QjtJQUFBLENBQWxDO0FBQUE7OztBQ3hDQTs7QUE4eEJBLDZDQUFTLFdBQVc7Q0FBYztBQTl4QmxDLHFEQUFrRDtBQUVsRCxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUU7SUFDekQsSUFBSSxTQUFTLEFBQUM7SUFDZCxJQUFJLFNBQVMsR0FBRyxLQUFLLEFBQUM7SUFDdEIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxBQUFDO0lBQ2pCLFNBQVMsb0JBQW9CLEdBQUc7UUFDNUIsU0FBUyxJQUFJLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUN4QztJQUNELElBQUksU0FBUyxJQUFJLE9BQU8sVUFBVSxFQUFFO1FBQ2hDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDeEIsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUN0QixVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUM7S0FDdkI7SUFDRCxTQUFTLE9BQU8sR0FBRztRQUNmLElBQUssSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEksSUFBSSxJQUFJLEdBQUcsSUFBSSxBQUFDO1FBQ2hCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLEFBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNaLFlBQVksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNyQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxLQUFLLFlBQVksSUFBSSxPQUFPLEdBQUcsS0FBSyxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksS0FBSyxVQUFVLElBQUssQ0FBQSxTQUFTLEdBQUcsVUFBVSxDQUFDLFlBQVksR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLFlBQVksR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFBLEFBQUMsQ0FBQztTQUN6TDtRQUNELFNBQVMsSUFBSSxHQUFHO1lBQ1osUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0QixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNwQztRQUNELFNBQVMsS0FBSyxHQUFHO1lBQ2IsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQ3RCO0tBQ0o7SUFDRCxPQUFPLENBQUMsTUFBTSxHQUFHLFdBQVc7UUFDeEIsb0JBQW9CLEVBQUUsQ0FBQztRQUN2QixTQUFTLEdBQUcsSUFBSSxDQUFDO0tBQ3BCLENBQUM7SUFDRixPQUFPLE9BQU8sQ0FBQztDQUNsQjtBQUVELE1BQU0sWUFBWTtJQUNkLFlBQVksT0FBTyxHQUFHLEVBQUUsQ0FBRTtRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztLQUNsQztJQUNELEdBQUcsQ0FBQyxJQUFJLEVBQUU7UUFDTixPQUFPLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztLQUM1RztJQUNELFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1FBQ2pCLEtBQUssQ0FBQyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUssQ0FBQSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQSxBQUFDLENBQUM7S0FDaEY7SUFDRCxlQUFlLENBQUMsSUFBSSxFQUFFO1FBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ2xDO0NBQ0o7QUFFRCxNQUFNLGFBQWEsU0FBUyxZQUFZO0lBQ3BDLFlBQVksT0FBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxlQUFlLENBQUUsQ0FBQSxFQUFFLEdBQUksRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1FBQUEsQ0FBRSxDQUFDO0tBQy9EO0NBQ0o7QUFFRCxNQUFNLFlBQVksU0FBUyxZQUFZO0lBQ25DLFlBQVksUUFBTyxDQUFFO1FBQ2pCLEtBQUssQ0FBQyxRQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxlQUFlLENBQUUsQ0FBQSxFQUFFLEdBQUksRUFBRSxDQUFDLEtBQUs7UUFBQSxDQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUcsQ0FBQSxFQUFFLEdBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTztRQUFBLENBQUUsQ0FBQztRQUNqSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRyxDQUFBLEVBQUUsR0FBSSxDQUFBLFNBQVMsSUFBSSxFQUFFO2dCQUMxQyxJQUFJLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxBQUFDO2dCQUNyQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxBQUFDO2dCQUMzQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxBQUFDO2dCQUMvQixJQUFJLEdBQUcsR0FBRyxZQUFZLEtBQUssSUFBSSxDQUFDLElBQUksQUFBQztnQkFDckMsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFFLEFBQUM7Z0JBQzdCLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEFBQUM7Z0JBQzNDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFFLElBQUksQUFBQyxDQUFBLEFBQUMsQ0FBQSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUUsUUFBUSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUEsSUFBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBRSxDQUFBLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLFVBQVUsS0FBSyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQSxBQUFDLEVBQUU7b0JBQ3BMLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUNyQixJQUFJLEdBQUcsRUFBRSxPQUFPLEtBQUssQ0FBQztvQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDdEI7Z0JBQ0QsT0FBTyxNQUFNLENBQUM7YUFDakIsQ0FBQSxDQUFDLEVBQUUsQ0FBQztRQUFBLENBQUUsQ0FBQztLQUNYO0NBQ0o7QUFFRCxNQUFNLHVCQUF1QixTQUFTLFlBQVk7SUFDOUMsWUFBWSxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBRSxJQUFNLElBQUk7UUFBQSxDQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUcsQ0FBQSxFQUFFLEdBQUksRUFBRSxDQUFDLE9BQU87UUFBQSxDQUFFLENBQUM7S0FDOUM7Q0FDSjtBQUVELFNBQVMsV0FBVyxDQUFDLEdBQUcsRUFBRTtJQUN0QixJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxZQUFZLEFBQUM7SUFDcEMsSUFBSSxPQUFPLEFBQUM7SUFDWixJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDeEQsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTztTQUFFLENBQUMsQ0FBQztLQUM3QjtJQUNELE9BQU8sT0FBTyxDQUFDO0NBQ2xCO0FBRUQsU0FBUyxjQUFjLENBQUMsRUFBRSxFQUFFO0lBQ3hCLElBQUksUUFBUSxBQUFDO0lBQ2IsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQUFBQztJQUN6QixJQUFJLElBQUksR0FBRyxPQUFPLEFBQUM7SUFDbkIsSUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFO1FBQ25DLFFBQVEsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLElBQUksR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDO0tBQzdCO0lBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Q0FDN0I7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUU7SUFDeEMsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLEVBQUcsQ0FBQSxFQUFFLEdBQUk7UUFDekYsSUFBSSxPQUFPLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsSUFBSyxDQUFBLFFBQVEsS0FBSyxFQUFFLENBQUMsSUFBSSxJQUFJLE9BQU8sS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFBLEFBQUMsRUFBRSxPQUFPLEtBQUssQ0FBQztRQUN4RyxJQUFJLE1BQU0sR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDLEFBQUM7UUFDaEMsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEFBQUM7UUFDdkQsSUFBSSxjQUFjLEdBQUcsRUFBRSxLQUFLLEFBQUMsQ0FBQSxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQSxDQUFFLE9BQU8sQ0FBQyxVQUFVLENBQUMsQUFBQztRQUN4RSxJQUFJLGNBQWMsR0FBRyxFQUFFLEtBQUssQUFBQyxDQUFBLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBLENBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxBQUFDO1FBQ3hFLElBQUksY0FBYyxHQUFHLEtBQUssQUFBQztRQUMzQixJQUFJLE1BQU0sR0FBRyxLQUFLLEFBQUM7UUFDbkIsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxRQUFRLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFLLENBQUEsY0FBYyxHQUFHLElBQUksQ0FBQSxBQUFDLENBQUM7UUFDckgsTUFBTSxHQUFHLENBQUMsY0FBYyxJQUFLLENBQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUssY0FBYyxJQUFJLGNBQWMsQUFBQyxDQUFBLEFBQUMsQ0FBQztRQUN0RixPQUFPLENBQUMsTUFBTSxDQUFDO0tBQ2xCLENBQUUsQ0FBQztDQUNQO0FBRUQsU0FBUyxjQUFjLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7SUFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEdBQUcsQ0FBQztJQUMxQixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEFBQUM7SUFDM0IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFLLENBQUEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQSxBQUFDLENBQUM7QUFDdEQsSUFBQSxDQUFDLEtBQUssUUFBUSxDQUFDLE1BQU0sSUFBSyxDQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUEsQUFBQyxDQUFDO0lBQy9HLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sR0FBRyxDQUFDO0NBQ2Q7QUFFRCxTQUFTLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRTtJQUN0QyxJQUFJLElBQUksR0FBRyxFQUFFLEFBQUM7SUFDZCxPQUFPLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDO0lBQ3pELE9BQU8sQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RSxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEUsT0FBTyxDQUFDLHVCQUF1QixHQUFHLElBQUksdUJBQXVCLENBQUMsT0FBTyxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUcsQ0FBQSxFQUFFLEdBQUk7UUFDcEUsSUFBSSxJQUFJLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQyxBQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxBQUFDO1FBQzlDLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxBQUFDO1FBQy9DLElBQUksT0FBTyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzNELElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEFBQUM7WUFDeEMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2hEO0tBQ0osQ0FBRSxDQUFDO0lBQ0osT0FBTyxJQUFJLENBQUM7Q0FDZjtBQUVELE1BQU0sWUFBWSxTQUFTLFlBQVk7SUFDbkMsWUFBWSxPQUFPLENBQUU7UUFDakIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUs7WUFDakMsRUFBRSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7U0FDcEIsQ0FBRSxDQUFDO1FBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxHQUFLO1lBQ3RDLElBQUksS0FBSyxLQUFLLEdBQUcsRUFBRSxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDekgsQ0FBRSxDQUFDO1FBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUcsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFO1lBQ3hDLEtBQUssQ0FBQyxLQUFLLEtBQUssSUFBSyxDQUFBLEVBQUUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUEsQUFBQyxDQUFDO1NBQ3BFLENBQUUsQ0FBQztRQUNKLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0tBQzNDO0NBQ0o7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0lBQ2pDLElBQUksU0FBUyxFQUFFLE1BQU0sQUFBQztJQUN0QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxBQUFDO0lBQzNCLElBQUksTUFBTSxHQUFHLFNBQVMsR0FBRyxFQUFFO1FBQ3ZCLElBQUksR0FBRyxHQUFHLEVBQUUsQUFBQztRQUNiLElBQUksS0FBSyxHQUFHLElBQUssQ0FBQSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBLEFBQUMsQ0FBQztRQUNoRixPQUFPLEdBQUcsQ0FBQztLQUNkLENBQUMsS0FBSyxDQUFDLEFBQUM7SUFDVCxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxBQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxFQUFFLEVBQUk7UUFDVCxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ25DLE1BQU0sQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDcEI7S0FDSjtJQUNELFNBQVMsSUFBSyxDQUFBLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFBLEFBQUMsQ0FBQztDQUMxQztBQUVELFNBQVMsU0FBUyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUU7SUFDcEMsT0FBTyxTQUFTLEdBQUcsR0FBRyxHQUFHLFFBQVEsR0FBRyxHQUFHLENBQUM7Q0FDM0M7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUU7SUFDaEQsSUFBSSxRQUFRLEdBQUcsRUFBRSxBQUFDO0lBQ2xCLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksU0FBUyxBQUFDO0lBQ2pELElBQUssSUFBSSxPQUFPLElBQUksSUFBSSxDQUFFO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVM7UUFDNUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxBQUFDO1FBQzFCLElBQUksSUFBSSxHQUFHLEVBQUUsQUFBQztRQUNkLFNBQVMsSUFBSyxDQUFBLE9BQU8sR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFBLEFBQUMsQ0FBQztRQUN6RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztTQUN6QixNQUFNLFFBQVEsSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0RyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNqQztJQUNELE9BQU8sUUFBUSxDQUFDO0NBQ25CO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFO0lBQzNDLElBQUksYUFBYSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxBQUFDO0lBQ3JELE9BQU8sQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RSxPQUFPLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRyxDQUFBLEVBQUUsR0FBSTtRQUNqRSxJQUFJLElBQUksR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDLEFBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEFBQUM7UUFDOUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzFELENBQUUsQ0FBQztDQUNQO0FBRUQsSUFBSSxRQUFRLEdBQUc7SUFDWCxPQUFPLEVBQUUsRUFBRTtDQUNkLEFBQUM7QUFFRixNQUFNLEdBQUcsUUFBUSxFQUFFLFFBQVEsR0FBRyxXQUFXO0lBQ3JDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEFBQUM7SUFDNUIsSUFBSSxZQUFZLEdBQUcsbUVBQW1FLEFBQUM7SUFDdkYsSUFBSSxhQUFhLEdBQUcsbUVBQW1FLEFBQUM7SUFDeEYsSUFBSSxjQUFjLEdBQUcsRUFBRSxBQUFDO0lBQ3hCLFNBQVMsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUU7UUFDdkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzQixjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzlCLElBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFFLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzlGO1FBQ0QsT0FBTyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDOUM7SUFDRCxJQUFJLFNBQVEsR0FBRztRQUNYLGdCQUFnQixFQUFFLFNBQVMsS0FBSyxFQUFFO1lBQzlCLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLEdBQUcsR0FBRyxTQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUcsU0FBUyxDQUFDLEVBQUU7Z0JBQ2hELE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqQyxDQUFFLEFBQUM7WUFDSixPQUFRLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDcEIsUUFBUTtnQkFDUixLQUFLLENBQUM7b0JBQ0osT0FBTyxHQUFHLENBQUM7Z0JBRWIsS0FBSyxDQUFDO29CQUNKLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQztnQkFFckIsS0FBSyxDQUFDO29CQUNKLE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQztnQkFFcEIsS0FBSyxDQUFDO29CQUNKLE9BQU8sR0FBRyxHQUFHLEdBQUcsQ0FBQzthQUNwQjtTQUNKO1FBQ0Qsb0JBQW9CLEVBQUUsU0FBUyxLQUFLLEVBQUU7WUFDbEMsT0FBTyxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxTQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFHLFNBQVMsS0FBSyxFQUFFO2dCQUNyRyxPQUFPLFlBQVksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2FBQzFELENBQUUsQ0FBQztTQUNQO1FBQ0QsZUFBZSxFQUFFLFNBQVMsS0FBSyxFQUFFO1lBQzdCLE9BQU8sSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLEdBQUcsU0FBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFHLFNBQVMsQ0FBQyxFQUFFO2dCQUNuRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7YUFDcEIsQ0FBRSxHQUFHLEdBQUcsQ0FBQztTQUNiO1FBQ0QsbUJBQW1CLEVBQUUsU0FBUyxVQUFVLEVBQUU7WUFDdEMsT0FBTyxJQUFJLElBQUksVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksVUFBVSxHQUFHLElBQUksR0FBRyxTQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFHLFNBQVMsS0FBSyxFQUFFO2dCQUN2SCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQzVDLENBQUUsQ0FBQztTQUNQO1FBQ0Qsb0JBQW9CLEVBQUUsU0FBUyxZQUFZLEVBQUU7WUFDekMsSUFBSSxVQUFVLEdBQUcsU0FBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQUFBQztZQUNqRCxJQUFJLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxBQUFDO1lBQ2hELElBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUU7Z0JBQzdELElBQUksYUFBYSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEFBQUM7Z0JBQzdDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsYUFBYSxLQUFLLENBQUMsQ0FBQztnQkFDakMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsYUFBYSxHQUFHLEdBQUcsQ0FBQzthQUN4QztZQUNELE9BQU8sR0FBRyxDQUFDO1NBQ2Q7UUFDRCx3QkFBd0IsRUFBRSxTQUFTLFVBQVUsRUFBRTtZQUMzQyxJQUFJLElBQUksSUFBSSxVQUFVLEVBQUUsT0FBTyxTQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9ELElBQUksR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEFBQUM7WUFDM0MsSUFBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDbkgsSUFBSSxNQUFNLEdBQUcsRUFBRSxBQUFDO1lBQ2hCLEdBQUcsQ0FBQyxPQUFPLENBQUUsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckIsQ0FBRSxDQUFDO1lBQ0osT0FBTyxTQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMvQztRQUNELDZCQUE2QixFQUFFLFNBQVMsS0FBSyxFQUFFO1lBQzNDLE9BQU8sSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLEdBQUcsU0FBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFHLFNBQVMsQ0FBQyxFQUFFO2dCQUNsRSxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEMsQ0FBRSxDQUFDO1NBQ1A7UUFDRCxpQ0FBaUMsRUFBRSxTQUFTLEtBQUssRUFBRTtZQUMvQyxJQUFJLElBQUksSUFBSSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxFQUFFLElBQUksS0FBSyxFQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzdCLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sU0FBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRyxTQUFTLEtBQUssRUFBRTtnQkFDM0QsT0FBTyxZQUFZLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUMzRCxDQUFFLENBQUM7U0FDUDtRQUNELFFBQVEsRUFBRSxTQUFTLFlBQVksRUFBRTtZQUM3QixPQUFPLFNBQVEsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLEVBQUUsRUFBRyxTQUFTLENBQUMsRUFBRTtnQkFDckQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDZixDQUFFLENBQUM7U0FDUDtRQUNELFNBQVMsRUFBRSxTQUFTLFlBQVksRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFO1lBQzNELElBQUksSUFBSSxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixHQUFHLEVBQUUsRUFBRSwwQkFBMEIsR0FBRyxFQUFFLEVBQUUsU0FBUyxHQUFHLEVBQUUsRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFLFNBQVMsR0FBRyxFQUFFLEVBQUUsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixHQUFHLENBQUMsRUFBRSxlQUFlLEdBQUcsQ0FBQyxFQUFFLFlBQVksR0FBRyxFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLHFCQUFxQixHQUFHLENBQUMsQUFBQztZQUNsUSxJQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBRTtnQkFDNUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLEVBQUU7b0JBQ3RFLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLENBQUM7b0JBQ25ELDBCQUEwQixDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQztpQkFDaEQ7Z0JBQ0QsVUFBVSxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0JBQ25DLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsR0FBRyxVQUFVLENBQUM7cUJBQU07b0JBQ25HLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLFNBQVMsQ0FBQyxFQUFFO3dCQUM3RSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFOzRCQUMvQixJQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBRTtnQ0FDbEMsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDO2dDQUN2QixJQUFJLHFCQUFxQixJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0NBQzFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztvQ0FDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO29DQUNwRCxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7aUNBQ3hCLE1BQU0scUJBQXFCLEVBQUUsQ0FBQzs2QkFDbEM7NEJBQ0QsS0FBSyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ2hDLElBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFFO2dDQUNwQixnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQ0FDckQsSUFBSSxxQkFBcUIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO29DQUMxQyxxQkFBcUIsR0FBRyxDQUFDLENBQUM7b0NBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztvQ0FDcEQsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2lDQUN4QixNQUFNLHFCQUFxQixFQUFFLENBQUM7Z0NBQy9CLEtBQUssS0FBSyxDQUFDLENBQUM7NkJBQ2Y7eUJBQ0osTUFBTTs0QkFDSCxLQUFLLEdBQUcsQ0FBQyxDQUFDOzRCQUNWLElBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFFO2dDQUNsQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dDQUNqRCxJQUFJLHFCQUFxQixJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0NBQzFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztvQ0FDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO29DQUNwRCxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7aUNBQ3hCLE1BQU0scUJBQXFCLEVBQUUsQ0FBQztnQ0FDL0IsS0FBSyxHQUFHLENBQUMsQ0FBQzs2QkFDYjs0QkFDRCxLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDaEMsSUFBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUU7Z0NBQ3JCLGdCQUFnQixHQUFHLGdCQUFnQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dDQUNyRCxJQUFJLHFCQUFxQixJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0NBQzFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztvQ0FDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO29DQUNwRCxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7aUNBQ3hCLE1BQU0scUJBQXFCLEVBQUUsQ0FBQztnQ0FDL0IsS0FBSyxLQUFLLENBQUMsQ0FBQzs2QkFDZjt5QkFDSjt3QkFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFOzRCQUMxQixpQkFBaUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQzs0QkFDakQsZUFBZSxFQUFFLENBQUM7eUJBQ3JCO3dCQUNELE9BQU8sMEJBQTBCLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ2hELE1BQU07d0JBQ0gsS0FBSyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUN0QyxJQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBRTs0QkFDbEMsZ0JBQWdCLEdBQUcsZ0JBQWdCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7NEJBQ3JELElBQUkscUJBQXFCLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtnQ0FDMUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO2dDQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0NBQ3BELGdCQUFnQixHQUFHLENBQUMsQ0FBQzs2QkFDeEIsTUFBTSxxQkFBcUIsRUFBRSxDQUFDOzRCQUMvQixLQUFLLEtBQUssQ0FBQyxDQUFDO3lCQUNmO3FCQUNKO29CQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7d0JBQzFCLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO3dCQUNqRCxlQUFlLEVBQUUsQ0FBQztxQkFDckI7b0JBQ0Qsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztvQkFDcEQsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDakM7YUFDSjtZQUNELElBQUksRUFBRSxLQUFLLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsU0FBUyxDQUFDLEVBQUU7b0JBQzdFLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUU7d0JBQy9CLElBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFFOzRCQUNsQyxnQkFBZ0IsS0FBSyxDQUFDLENBQUM7NEJBQ3ZCLElBQUkscUJBQXFCLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtnQ0FDMUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO2dDQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0NBQ3BELGdCQUFnQixHQUFHLENBQUMsQ0FBQzs2QkFDeEIsTUFBTSxxQkFBcUIsRUFBRSxDQUFDO3lCQUNsQzt3QkFDRCxLQUFLLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDaEMsSUFBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUU7NEJBQ3BCLGdCQUFnQixHQUFHLGdCQUFnQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDOzRCQUNyRCxJQUFJLHFCQUFxQixJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7Z0NBQzFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQztnQ0FDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dDQUNwRCxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7NkJBQ3hCLE1BQU0scUJBQXFCLEVBQUUsQ0FBQzs0QkFDL0IsS0FBSyxLQUFLLENBQUMsQ0FBQzt5QkFDZjtxQkFDSixNQUFNO3dCQUNILEtBQUssR0FBRyxDQUFDLENBQUM7d0JBQ1YsSUFBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUU7NEJBQ2xDLGdCQUFnQixHQUFHLGdCQUFnQixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7NEJBQ2pELElBQUkscUJBQXFCLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtnQ0FDMUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO2dDQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0NBQ3BELGdCQUFnQixHQUFHLENBQUMsQ0FBQzs2QkFDeEIsTUFBTSxxQkFBcUIsRUFBRSxDQUFDOzRCQUMvQixLQUFLLEdBQUcsQ0FBQyxDQUFDO3lCQUNiO3dCQUNELEtBQUssR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNoQyxJQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBRTs0QkFDckIsZ0JBQWdCLEdBQUcsZ0JBQWdCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7NEJBQ3JELElBQUkscUJBQXFCLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtnQ0FDMUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO2dDQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7Z0NBQ3BELGdCQUFnQixHQUFHLENBQUMsQ0FBQzs2QkFDeEIsTUFBTSxxQkFBcUIsRUFBRSxDQUFDOzRCQUMvQixLQUFLLEtBQUssQ0FBQyxDQUFDO3lCQUNmO3FCQUNKO29CQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7d0JBQzFCLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO3dCQUNqRCxlQUFlLEVBQUUsQ0FBQztxQkFDckI7b0JBQ0QsT0FBTywwQkFBMEIsQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDaEQsTUFBTTtvQkFDSCxLQUFLLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3RDLElBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFFO3dCQUNsQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQzt3QkFDckQsSUFBSSxxQkFBcUIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFOzRCQUMxQyxxQkFBcUIsR0FBRyxDQUFDLENBQUM7NEJBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQzs0QkFDcEQsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO3lCQUN4QixNQUFNLHFCQUFxQixFQUFFLENBQUM7d0JBQy9CLEtBQUssS0FBSyxDQUFDLENBQUM7cUJBQ2Y7aUJBQ0o7Z0JBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRTtvQkFDMUIsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQ2pELGVBQWUsRUFBRSxDQUFDO2lCQUNyQjthQUNKO1lBQ0QsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUNWLElBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFFO2dCQUNsQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDckQsSUFBSSxxQkFBcUIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO29CQUMxQyxxQkFBcUIsR0FBRyxDQUFDLENBQUM7b0JBQzFCLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztvQkFDcEQsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO2lCQUN4QixNQUFNLHFCQUFxQixFQUFFLENBQUM7Z0JBQy9CLEtBQUssS0FBSyxDQUFDLENBQUM7YUFDZjtZQUNELE9BQVM7Z0JBQ0wsZ0JBQWdCLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLHFCQUFxQixJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0JBQzFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztvQkFDcEQsTUFBTTtpQkFDVDtnQkFDRCxxQkFBcUIsRUFBRSxDQUFDO2FBQzNCO1lBQ0QsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsVUFBVSxFQUFFLFNBQVMsVUFBVSxFQUFFO1lBQzdCLE9BQU8sSUFBSSxJQUFJLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLFVBQVUsR0FBRyxJQUFJLEdBQUcsU0FBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRyxTQUFTLEtBQUssRUFBRTtnQkFDdkgsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3ZDLENBQUUsQ0FBQztTQUNQO1FBQ0QsV0FBVyxFQUFFLFNBQVMsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUU7WUFDcEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxHQUFHLEVBQUUsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsRUFBRSxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHO2dCQUNqSSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDcEIsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLEtBQUssRUFBRSxDQUFDO2FBQ1gsQUFBQztZQUNGLElBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ1QsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFCLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDVixNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUk7Z0JBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDO2dCQUNwQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7aUJBQ3pDO2dCQUNELElBQUksSUFBSSxBQUFDLENBQUEsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksS0FBSyxDQUFDO2dCQUNuQyxLQUFLLEtBQUssQ0FBQyxDQUFDO2FBQ2Y7WUFDRCxPQUFRLElBQUk7Z0JBQ1YsS0FBSyxDQUFDO29CQUNKLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQ1QsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMxQixLQUFLLEdBQUcsQ0FBQyxDQUFDO29CQUNWLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBSTt3QkFDdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzt3QkFDaEMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUM7d0JBQ3BCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7NEJBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDOzRCQUMzQixJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQzt5QkFDekM7d0JBQ0QsSUFBSSxJQUFJLEFBQUMsQ0FBQSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUEsR0FBSSxLQUFLLENBQUM7d0JBQ25DLEtBQUssS0FBSyxDQUFDLENBQUM7cUJBQ2Y7b0JBQ0QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDWixNQUFNO2dCQUVSLEtBQUssQ0FBQztvQkFDSixJQUFJLEdBQUcsQ0FBQyxDQUFDO29CQUNULFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDM0IsS0FBSyxHQUFHLENBQUMsQ0FBQztvQkFDVixNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUk7d0JBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7d0JBQ2hDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDO3dCQUNwQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFOzRCQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQzs0QkFDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7eUJBQ3pDO3dCQUNELElBQUksSUFBSSxBQUFDLENBQUEsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksS0FBSyxDQUFDO3dCQUNuQyxLQUFLLEtBQUssQ0FBQyxDQUFDO3FCQUNmO29CQUNELENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ1osTUFBTTtnQkFFUixLQUFLLENBQUM7b0JBQ0osT0FBTyxFQUFFLENBQUM7YUFDYjtZQUNELFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixPQUFTO2dCQUNMLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ25DLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ1QsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNWLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBSTtvQkFDdkIsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO3dCQUMzQixJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztxQkFDekM7b0JBQ0QsSUFBSSxJQUFJLEFBQUMsQ0FBQSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUEsR0FBSSxLQUFLLENBQUM7b0JBQ25DLEtBQUssS0FBSyxDQUFDLENBQUM7aUJBQ2Y7Z0JBQ0QsT0FBUSxDQUFDLEdBQUcsSUFBSTtvQkFDZCxLQUFLLENBQUM7d0JBQ0osSUFBSSxHQUFHLENBQUMsQ0FBQzt3QkFDVCxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzFCLEtBQUssR0FBRyxDQUFDLENBQUM7d0JBQ1YsTUFBTSxLQUFLLElBQUksUUFBUSxFQUFJOzRCQUN2QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOzRCQUNoQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQzs0QkFDcEIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQ0FDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7Z0NBQzNCLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDOzZCQUN6Qzs0QkFDRCxJQUFJLElBQUksQUFBQyxDQUFBLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxHQUFJLEtBQUssQ0FBQzs0QkFDbkMsS0FBSyxLQUFLLENBQUMsQ0FBQzt5QkFDZjt3QkFDRCxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ2pDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO3dCQUNqQixTQUFTLEVBQUUsQ0FBQzt3QkFDWixNQUFNO29CQUVSLEtBQUssQ0FBQzt3QkFDSixJQUFJLEdBQUcsQ0FBQyxDQUFDO3dCQUNULFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDM0IsS0FBSyxHQUFHLENBQUMsQ0FBQzt3QkFDVixNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUk7NEJBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7NEJBQ2hDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDOzRCQUNwQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dDQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztnQ0FDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7NkJBQ3pDOzRCQUNELElBQUksSUFBSSxBQUFDLENBQUEsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBLEdBQUksS0FBSyxDQUFDOzRCQUNuQyxLQUFLLEtBQUssQ0FBQyxDQUFDO3lCQUNmO3dCQUNELFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDakMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7d0JBQ2pCLFNBQVMsRUFBRSxDQUFDO3dCQUNaLE1BQU07b0JBRVIsS0FBSyxDQUFDO3dCQUNKLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDMUI7Z0JBQ0QsSUFBSSxDQUFDLElBQUksU0FBUyxFQUFFO29CQUNoQixTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQ2pDLE9BQU8sRUFBRSxDQUFDO2lCQUNiO2dCQUNELElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQU07b0JBQzNDLElBQUksQ0FBQyxLQUFLLFFBQVEsRUFBRSxPQUFPLElBQUksQ0FBQztvQkFDaEMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzQjtnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNuQixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0MsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDVixJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtvQkFDbEIsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNqQyxPQUFPLEVBQUUsQ0FBQztpQkFDYjthQUNKO1NBQ0o7S0FDSixBQUFDO0lBQ0YsT0FBTyxTQUFRLENBQUM7Q0FDbkIsRUFBRSxFQUFFLElBQUksSUFBSSxNQUFNLElBQUssQ0FBQSxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQSxBQUFDLENBQUM7QUFFbkQsSUFBSSxNQUFNLEVBQUUsUUFBUSxBQUFDO0FBRXJCLE1BQU0sV0FBVztJQUNiLFlBQVksRUFBQyxRQUFRLEVBQUUsUUFBUSxHQUFHLEVBQUUsQ0FBQSxFQUFFLFdBQVcsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFBLEVBQUUsVUFBVSxFQUFFLFVBQVUsR0FBRyxFQUFFLENBQUEsRUFBRSxPQUFPLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FBQSxFQUFFLFdBQVcsRUFBRSxXQUFXLEdBQUcsTUFBTSxDQUFBLEVBQUMsR0FBRyxFQUFFLENBQUU7UUFDdkssTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQ3ZDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQztTQUNoQixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDdkMsVUFBVSxFQUFFLElBQUk7WUFDaEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQ2hCLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUNwQyxVQUFVLEVBQUUsSUFBSTtZQUNoQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsSUFBSTtZQUNkLEtBQUssRUFBRSxLQUFLLENBQUM7U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ2pDLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQztTQUNoQixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDdkMsVUFBVSxFQUFFLElBQUk7WUFDaEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDO1NBQ2hCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBSSxDQUFBLEtBQUssR0FBRyxHQUFHLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQ2hGLEtBQUssQ0FBQyxLQUFLLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUEsQUFBQyxDQUFDO1FBQ3RHLElBQUksS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEFBQUM7UUFDN0IsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0UsT0FBTyxJQUFLLENBQUEsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFNLEVBQUUsQ0FBQSxBQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ3REO0lBQ0QsSUFBSSxPQUFPLEdBQUc7UUFDVixPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQzNDO0lBQ0QsTUFBTSxNQUFNLEdBQUc7UUFDWCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDekI7SUFDRCxNQUFNLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDckIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUNuQztJQUNELE1BQU0sR0FBRyxDQUFDLFVBQVUsRUFBRTtRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDZixHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN0QixHQUFHLFVBQVU7U0FDaEIsQ0FBQyxDQUFDO0tBQ047SUFDRCxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUU7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFlBQVksZUFBZSxHQUFHLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlELE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztLQUNyRDtJQUNELE1BQU0sWUFBWSxHQUFHO1FBQ2pCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUN6RSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDckI7S0FDSjtJQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUU7UUFDbEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsTUFBTSxPQUFPLEdBQUc7UUFDWixPQUFPLElBQUksT0FBTyxDQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBSztZQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFHLENBQUEsTUFBTSxHQUFJO2dCQUMxQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqSCxDQUFFLENBQUM7U0FDUCxDQUFFLENBQUM7S0FDUDtJQUNELE1BQU0sT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUMvQyxPQUFPLElBQUksT0FBTyxDQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sR0FBSztZQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDYixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUMvQyxFQUFHLElBQU07Z0JBQ04sTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7YUFDM0UsQ0FBRSxDQUFDO1NBQ1AsQ0FBRSxDQUFDO0tBQ1A7SUFDRCxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQ2IsTUFBTSxjQUFjLEdBQUc7WUFDbkIsR0FBRyxPQUFPO1NBQ2IsQUFBQztRQUNGLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RILElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLDRCQUE0QixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7S0FDekY7SUFDRCxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQ2IsSUFBSSxZQUFZLEdBQUcsT0FBTyxBQUFDO1FBQzNCLFFBQVEsSUFBSSxPQUFPLE9BQU8sSUFBSyxDQUFBLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsaUNBQWlDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxBQUFDLENBQUM7UUFDdkgsT0FBTztZQUNILEdBQUcsSUFBSSxDQUFDLFFBQVE7WUFDaEIsR0FBRyxZQUFZO1NBQ2xCLENBQUM7S0FDTDtJQUNELE1BQU0sY0FBYyxDQUFDLFVBQVUsRUFBRTtRQUM3QixJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsOEJBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxpQkFBaUI7WUFDdEUsT0FBTyxJQUFJLE9BQU8sQ0FBRSxDQUFBLE9BQU8sR0FBSTtnQkFDM0IsTUFBTSxRQUFRLEdBQUcsQ0FBQSxXQUFXLEdBQUk7b0JBQzVCLElBQUksYUFBYSxLQUFLLFdBQVcsRUFBRTt3QkFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFFLElBQU07NEJBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQzt5QkFDakIsQ0FBRSxDQUFDO3dCQUNKLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUNuQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDeEIsQUFBQztnQkFDRixNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBRSxDQUFDLEVBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQSxFQUFDLEdBQUs7b0JBQ3BGLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDekIsQ0FBRSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUM3QixDQUFFLENBQUM7U0FDUCxFQUFFLEVBQUUsT0FBTztRQUNaLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxBQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEFBQUM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsNEJBQTRCLEVBQUU7WUFDM0MsR0FBRyxPQUFPO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxNQUFNLEdBQUcsV0FBVyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1FBQ3hHLEtBQUssTUFBTSxPQUFPLElBQUksVUFBVSxDQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUN0RTtJQUNELE1BQU0sZ0JBQWdCLENBQUMsRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFBLEVBQUMsRUFBRTtRQUNyQyxNQUFNLEtBQUssR0FBRyxNQUFNLEFBQUM7UUFDckIsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ1osTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxXQUFXLENBQUMsMEJBQTBCLEVBQUU7Z0JBQ2pFLE9BQU8sRUFBRSxJQUFJO2FBQ2hCLENBQUMsQ0FBQyxDQUFDO1NBQ1A7S0FDSjtJQUNELGlCQUFpQixDQUFDLEtBQUssRUFBRTtRQUNyQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7S0FDMUI7SUFDRCxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRTtRQUN2QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEFBQUM7UUFDL0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNHLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEFBQUM7UUFDckMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDN0MsT0FBTyxFQUFFLE9BQU87U0FDbkIsQ0FBQyxDQUFDO0tBQ047SUFDRCxVQUFVLENBQUMsSUFBSSxFQUFFO1FBQ2IsTUFBTSxPQUFPLEdBQUcsRUFBRSxBQUFDO1FBQ25CLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUksT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQ25CLE9BQU8sRUFBRSxPQUFPO1NBQ25CLENBQUMsQ0FBQztLQUNOO0lBQ0QsMEJBQTBCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRTtRQUMxQyxRQUFRLEtBQUssSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7S0FDdk47Q0FDSjtBQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRTtJQUM3QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsSUFBSTtJQUNsQixRQUFRLEVBQUUsSUFBSTtJQUNkLEtBQUssRUFBRTtRQUNILFlBQVksRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFO1lBQzVCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBRSxHQUFHLElBQUksUUFBUSxJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2xGO0tBQ0o7Q0FDSixDQUFDLENBQUM7OztBQzV4Qkg7O0FBQ0Esa0VBQWdCLDRCQUE0QjtDQUUzQzsrQ0EwQlksU0FBUzs7d0RBRVQsa0JBQWtCOztxREFFbEIsZUFBZTs7a0RBRWYsWUFBWTs7c0RBRVosZ0JBQWdCOzt3REFVaEIsa0JBQWtCOzttREFFbEIsYUFBYTs7b0RBWWIsY0FBYzs7K0NBWWQsU0FBUzs7OENBRVQsUUFBUTs7OENBRVIsUUFBUTs7a0RBQ1IsWUFBWTs7QUFRekIsb0RBQWdCLGNBQWM7Q0FPN0I7QUE3RkQsSUFBSSxLQUFLLEdBQUcsSUFBSSxBQUFDO0FBQ1YsU0FBUyw0QkFBNEIsR0FBRztJQUMzQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0NBQ2pCO0FBQ0QsU0FBUyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUU7SUFDN0IsSUFBSSxDQUFDLElBQUksRUFDTCxPQUFPLEtBQUssQ0FBQztJQUVqQixJQUFJO1FBQ0EsTUFBTSxFQUFFLFFBQVEsQ0FBQSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQUFBQztRQUNwRCxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDO0tBQ3pDLENBQ0QsT0FBTTtRQUNGLE9BQU8sS0FBSyxDQUFDO0tBQ2hCO0NBQ0o7QUFDRCxTQUFTLFdBQVcsQ0FBQyxRQUFRLEVBQUU7SUFDM0IsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEtBQUs7Q0FDdEQ7QUFDRCxTQUFTLElBQUksQ0FBQyxTQUFTLEVBQUU7SUFDckIsSUFBSSxNQUFNLEFBQUM7SUFDWCxPQUFPLElBQU07UUFDVCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFDdkMsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBRXpCLE9BQU8sTUFBTSxDQUFDO0tBQ2pCLENBQUM7Q0FDTDtBQUVNLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7QUFBQSxDQUFDLEFBQUM7QUFFL0UsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsSUFBTSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxLQUFLLFFBQVE7QUFBQSxDQUFDLEFBQUM7QUFFeEYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQU0sa0JBQWtCLEVBQUUsSUFBSSxTQUFTLEVBQUU7QUFBQSxDQUFDLEFBQUM7QUFFeEUsTUFBTSxZQUFZLEdBQUcsSUFBTSxnQkFBZ0IsRUFBRSxJQUFJLGtCQUFrQixFQUFFO0FBQUM7QUFFdEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBTTtJQUN2QyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEFBQUM7SUFDaEMsSUFBSSxRQUFRLElBQ0wsaUJBQWlCLENBQUMsUUFBUSxDQUFDLGVBQWUsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUMzRSxPQUFPLElBQUksQ0FBQztJQUVoQixPQUFPLE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLE9BQU8sSUFDckMsaUJBQWlCLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxDQUFDO0NBQ2pFLENBQUMsQUFBQztBQUVJLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLElBQU0saUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUM7QUFBQSxDQUFDLEFBQUM7QUFFckcsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQU07SUFDcEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFDcEQsT0FBTyxLQUFLLENBQUM7SUFFakIsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUEsRUFBRSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEFBQUM7SUFDL0QsSUFBSSxPQUFPLFNBQVMsRUFBRSxJQUFJLEtBQUssUUFBUSxFQUNuQyxPQUFPLEtBQUssQ0FBQztJQUVqQixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQUFBQztJQUNyRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQztDQUM3QyxDQUFDLEFBQUM7QUFFSSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBTTtJQUNyQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQ3pDLE9BQU8sS0FBSyxDQUFDO0lBRWpCLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFBLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxBQUFDO0lBQ3JFLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUNoQyxPQUFPLEtBQUssQ0FBQztJQUVqQixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxBQUFDO0lBQ25ELE9BQU8sR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsUUFBUSxDQUFDO0NBQzdDLENBQUMsQUFBQztBQUVJLE1BQU0sU0FBUyxHQUFHLElBQU0sVUFBVSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUFDO0FBRTVFLE1BQU0sUUFBUSxHQUFHLElBQU0sVUFBVSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUFDO0FBRTFFLE1BQU0sUUFBUSxHQUFHLElBQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0FBQUM7QUFDekYsTUFBTSxZQUFZLEdBQUc7SUFDeEIsYUFBYSxFQUFFLGVBQWU7SUFDOUIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsT0FBTyxFQUFFLGFBQWE7SUFDdEIsWUFBWSxFQUFFLGNBQWM7SUFDNUIsU0FBUyxFQUFFLGtCQUFrQjtJQUM3QixHQUFHLEVBQUUsU0FBUztDQUNqQixBQUFDO0FBQ0ssU0FBUyxjQUFjLEdBQUc7SUFDN0IsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUU7UUFDckQsSUFBSSxJQUFJLEVBQUUsRUFDTixPQUFPLElBQUksQ0FBQztLQUVuQjtJQUNELE9BQU8sU0FBUyxDQUFDO0NBQ3BCOzs7QUM3RkQsT0FBTyxDQUFDLGNBQWMsR0FBRyxTQUFVLENBQUMsRUFBRTtJQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsR0FBRztRQUFDLE9BQU8sRUFBRSxDQUFDO0tBQUMsQ0FBQztDQUM3QyxDQUFDO0FBRUYsT0FBTyxDQUFDLGlCQUFpQixHQUFHLFNBQVUsQ0FBQyxFQUFFO0lBQ3ZDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRTtRQUFDLEtBQUssRUFBRSxJQUFJO0tBQUMsQ0FBQyxDQUFDO0NBQ3ZELENBQUM7QUFFRixPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVUsTUFBTSxFQUFFLElBQUksRUFBRTtJQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFVLEdBQUcsRUFBRTtRQUN6QyxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLFlBQVksSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUN2RSxPQUFPO1FBR1QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO1lBQy9CLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLEdBQUcsRUFBRSxXQUFZO2dCQUNmLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3BCO1NBQ0YsQ0FBQyxDQUFDO0tBQ0osQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDO0FBRUYsT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFVLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO0lBQzlDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtRQUNwQyxVQUFVLEVBQUUsSUFBSTtRQUNoQixHQUFHLEVBQUUsR0FBRztLQUNULENBQUMsQ0FBQztDQUNKLENBQUM7OztBQzNCRjs7eURBbTJCYTFCLG1CQUFtQjs7c0RBTW5CQyxnQkFBZ0I7O0FBNTJCN0IsaUhBQUE7QUFDQSx5QkFBQTtBQUNBLG1FQUFBLENBQ0EsTUFBTTBCLGdCQUFnQixHQUFHO0lBQ3hCLGlCQUR3QjtJQUV0QixnQkFGc0I7SUFHdEIsaUNBSHNCO0lBSXRCLGtCQUpzQjtJQUt0QixrQkFMc0I7SUFNdEIsc0JBTnNCO0lBT3RCLDJCQVBzQjtJQVF0QixtQkFSc0I7SUFTdEIsd0JBVHNCO0lBVXRCLGFBVnNCO0lBV3RCLGFBWHNCO0lBWXRCLFlBWnNCO0lBYXRCLGVBYnNCO0lBY3RCLGlCQWRzQjtJQWV0QixtQkFmc0I7SUFnQnRCLGNBaEJzQjtJQWlCdEIsYUFqQnNCO0lBa0J0QixvQkFsQnNCO0lBbUJ0QixpQkFuQnNCO0lBb0J0QixnQkFwQnNCO0lBcUJ0QixrQkFyQnNCO0lBc0J0QixrQkF0QnNCO0lBdUJ0QixRQXZCc0I7SUF3QnRCLGdCQXhCc0I7SUF5QnRCLHFCQXpCc0I7SUEwQnRCLGlCQTFCc0I7SUEyQnRCLG9CQTNCc0I7SUE0QnRCLHVCQTVCc0I7SUE2QnRCLG9CQTdCc0I7SUE4QnRCLHFCQTlCc0I7SUErQnRCLG9CQS9Cc0I7SUFnQ3RCLFVBaENzQjtJQWlDdEIsWUFqQ3NCO0lBa0N0QixZQWxDc0I7SUFtQ3RCLGFBbkNzQjtJQW9DdEIsaUJBcENzQjtJQXFDdEIsZ0JBckNzQjtJQXNDdEIsdUJBdENzQjtJQXVDdEIsZUF2Q3NCO0lBd0N0QixtQkF4Q3NCO0lBeUN0QixrQkF6Q3NCO0lBMEN0QixpQkExQ3NCO0lBMkN0QixnQkEzQ3NCO0lBNEN0QixrQkE1Q3NCO0lBNkN0QixtQkE3Q3NCO0lBOEN0QixtQkE5Q3NCO0lBK0N0QixvQkEvQ3NCO0lBZ0R0QixnQkFoRHNCO0lBaUR0QixpQkFqRHNCO0lBa0R0QixjQWxEc0I7SUFtRHRCLHNCQW5Ec0I7SUFvRHRCLG1CQXBEc0I7SUFxRHRCLDZCQXJEc0I7SUFzRHRCLG9CQXREc0I7SUF1RHRCLDBCQXZEc0I7SUF3RHRCLGlCQXhEc0I7SUF5RHRCLGtCQXpEc0I7SUEwRHRCLFdBMURzQjtJQTJEdEIsZUEzRHNCO0lBNER0QixzQkE1RHNCO0lBNkR0QixpQkE3RHNCO0lBOER0QixtQkE5RHNCO0lBK0R0QixhQS9Ec0I7SUFnRXRCLGVBaEVzQjtJQWlFdEIsVUFqRXNCO0lBa0V0Qix5QkFsRXNCO0lBbUV0QixRQW5Fc0I7SUFvRXRCLG9CQXBFc0I7SUFxRXRCLGVBckVzQjtJQXNFdEIsZUF0RXNCO0lBdUV0QixXQXZFc0I7SUF3RXRCLFlBeEVzQjtJQXlFdEIsd0JBekVzQjtJQTBFdEIsaUJBMUVzQjtJQTJFdEIsYUEzRXNCO0lBNEV0QixvQkE1RXNCO0lBNkV0QixvQkE3RXNCO0lBOEV0QixVQTlFc0I7SUErRXRCLFlBL0VzQjtJQWdGdEIsWUFoRnNCO0lBaUZ0QixtQkFqRnNCO0lBa0Z0QixzQkFsRnNCO0lBbUZ0QixXQW5Gc0I7SUFvRnRCLFlBcEZzQjtJQXFGdEIsb0JBckZzQjtJQXNGdEIsWUF0RnNCO0lBdUZ0QixpQkF2RnNCO0lBd0Z0QixrQkF4RnNCO0lBeUZ0QixxQkF6RnNCO0lBMEZ0QiwwQkExRnNCO0lBMkZ0QixxQkEzRnNCO0lBNEZ0QixnQkE1RnNCO0lBNkZ0QixhQTdGc0I7SUE4RnRCLG9CQTlGc0I7SUErRnRCLDJCQS9Gc0I7SUFnR3RCLG1CQWhHc0I7SUFpR3RCLG1CQWpHc0I7SUFrR3RCLHdCQWxHc0I7SUFtR3RCLGtCQW5Hc0I7SUFvR3RCLHdCQXBHc0I7SUFxR3RCLHNCQXJHc0I7SUFzR3RCLFVBdEdzQjtJQXVHdEIsaUJBdkdzQjtJQXdHdEIsWUF4R3NCO0lBeUd0QixpQkF6R3NCO0lBMEd0QixpQkExR3NCO0lBMkd0QixrQkEzR3NCO0lBNEd0QixXQTVHc0I7SUE2R3RCLHFCQTdHc0I7SUE4R3RCLFNBOUdzQjtJQStHdEIsZUEvR3NCO0lBZ0h0QixvQkFoSHNCO0lBaUh0QiwwQkFqSHNCO0lBa0h0Qix5QkFsSHNCO0lBbUh0QixXQW5Ic0I7SUFvSHRCLFlBcEhzQjtJQXFIdEIsb0JBckhzQjtJQXNIdEIseUJBdEhzQjtJQXVIdEIsZ0NBdkhzQjtJQXdIdEIsZUF4SHNCO0lBeUh0QixjQXpIc0I7SUEwSHRCLG9CQTFIc0I7SUEySHRCLDBCQTNIc0I7SUE0SHRCLHlCQTVIc0I7SUE2SHRCLDRCQTdIc0I7SUE4SHRCLHdCQTlIc0I7SUErSHRCLGdCQS9Ic0I7SUFnSXRCLHNCQWhJc0I7SUFpSXRCLFNBaklzQjtJQWtJdEIsbUJBbElzQjtJQW1JdEIsd0JBbklzQjtJQW9JdEIsaUJBcElzQjtJQXFJdEIsbUJBcklzQjtJQXNJdEIsa0JBdElzQjtJQXVJdEIsY0F2SXNCO0lBd0l0QixrQkF4SXNCO0lBeUl0QixvQkF6SXNCO0lBMEl0Qix3QkExSXNCO0lBMkl0QixxQkEzSXNCO0lBNEl0QixhQTVJc0I7SUE2SXRCLGdCQTdJc0I7SUE4SXRCLGlCQTlJc0I7SUErSXRCLGNBL0lzQjtJQWdKdEIsNEJBaEpzQjtJQWlKdEIsbUJBakpzQjtJQWtKdEIsZ0JBbEpzQjtJQW1KdEIsd0JBbkpzQjtJQW9KdEIsMEJBcEpzQjtJQXFKdEIsdUJBckpzQjtJQXNKdEIsZUF0SnNCO0lBdUp0QixtQkF2SnNCO0lBd0p0Qix3QkF4SnNCO0lBeUp0QiwyQkF6SnNCO0lBMEp0QixpQkExSnNCO0lBMkp0QixtQkEzSnNCO0lBNEp0QixrQkE1SnNCO0lBNkp0Qix5QkE3SnNCO0lBOEp0Qix3QkE5SnNCO0lBK0p0QixtQkEvSnNCO0lBZ0t0QixnQkFoS3NCO0lBaUt0Qix5QkFqS3NCO0lBa0t0QixxQkFsS3NCO0lBbUt0QixrQkFuS3NCO0lBb0t0QixvQkFwS3NCO0lBcUt0QixjQXJLc0I7SUFzS3RCLHdCQXRLc0I7SUF1S3RCLHNCQXZLc0I7SUF3S3RCLG1CQXhLc0I7SUF5S3RCLGlCQXpLc0I7SUEwS3RCLGVBMUtzQjtJQTJLdEIsbUJBM0tzQjtJQTRLdEIsZUE1S3NCO0lBNkt0QixnQkE3S3NCO0lBOEt0Qix3QkE5S3NCO0lBK0t0QixtQkEvS3NCO0lBZ0x0QixtQkFoTHNCO0lBaUx0QixtQkFqTHNCO0lBa0x0QixzQkFsTHNCO0lBbUx0QixzQkFuTHNCO0lBb0x0QixtQkFwTHNCO0lBcUx0Qix5QkFyTHNCO0lBc0x0QixxQkF0THNCO0lBdUx0QixzQkF2THNCO0lBd0x0QixhQXhMc0I7SUF5THRCLDJCQXpMc0I7SUEwTHRCLHdCQTFMc0I7SUEyTHRCLDBCQTNMc0I7SUE0THRCLGtCQTVMc0I7SUE2THRCLGlDQTdMc0I7SUE4THRCLG9CQTlMc0I7SUErTHRCLHdCQS9Mc0I7SUFnTXRCLG9CQWhNc0I7SUFpTXRCLGlCQWpNc0I7SUFrTXRCLHNCQWxNc0I7SUFtTXRCLGtCQW5Nc0I7SUFvTXRCLHVCQXBNc0I7SUFxTXRCLHFCQXJNc0I7SUFzTXRCLHlCQXRNc0I7SUF1TXRCLGdCQXZNc0I7SUF3TXRCLGlCQXhNc0I7SUF5TXRCLGlCQXpNc0I7SUEwTXRCLHVCQTFNc0I7SUEyTXRCLHVCQTNNc0I7SUE0TXRCLGdDQTVNc0I7SUE2TXRCLGlCQTdNc0I7SUE4TXRCLHFCQTlNc0I7SUErTXRCLHNCQS9Nc0I7SUFnTnRCLHdCQWhOc0I7SUFpTnRCLGlDQWpOc0I7SUFrTnRCLGdDQWxOc0I7SUFtTnRCLCtCQW5Oc0I7SUFvTnRCLDhCQXBOc0I7SUFxTnRCLHFCQXJOc0I7SUFzTnRCLHlCQXROc0I7SUF1TnRCLG9CQXZOc0I7SUF3TnRCLGlCQXhOc0I7SUF5TnRCLFlBek5zQjtJQTBOdEIsd0JBMU5zQjtJQTJOdEIseUJBM05zQjtJQTROdEIsZ0JBNU5zQjtJQTZOdEIsbUJBN05zQjtJQThOdEIsYUE5TnNCO0lBK050Qix3QkEvTnNCO0lBZ090QixpQkFoT3NCO0lBaU90QixVQWpPc0I7SUFrT3RCLG9CQWxPc0I7SUFtT3RCLGtCQW5Pc0I7SUFvT3RCLHFCQXBPc0I7SUFxT3RCLGdCQXJPc0I7SUFzT3RCLG1CQXRPc0I7SUF1T3RCLGtCQXZPc0I7SUF3T3RCLGlCQXhPc0I7SUF5T3RCLHFCQXpPc0I7SUEwT3RCLDJCQTFPc0I7SUEyT3RCLHFCQTNPc0I7SUE0T3RCLHdCQTVPc0I7SUE2T3RCLGVBN09zQjtJQThPdEIsd0JBOU9zQjtJQStPdEIsY0EvT3NCO0lBZ1B0QixzQkFoUHNCO0lBaVB0Qix1QkFqUHNCO0lBa1B0QixlQWxQc0I7SUFtUHRCLGlCQW5Qc0I7SUFvUHRCLGtCQXBQc0I7SUFxUHRCLGNBclBzQjtJQXNQdEIsYUF0UHNCO0lBdVB0QiwwQkF2UHNCO0lBd1B0QixrQkF4UHNCO0lBeVB0Qix3QkF6UHNCO0lBMFB0Qix1QkExUHNCO0lBMlB0QixvQkEzUHNCO0lBNFB0Qix1QkE1UHNCO0lBNlB0QixtQkE3UHNCO0lBOFB0Qix3QkE5UHNCO0lBK1B0QixlQS9Qc0I7SUFnUXRCLGtCQWhRc0I7SUFpUXRCLGlCQWpRc0I7SUFrUXRCLGNBbFFzQjtJQW1RdEIscUJBblFzQjtJQW9RdEIsdUJBcFFzQjtJQXFRdEIsb0JBclFzQjtJQXNRdEIsaUJBdFFzQjtJQXVRdEIsaUJBdlFzQjtJQXdRdEIsa0JBeFFzQjtJQXlRdEIsNkJBelFzQjtJQTBRdEIseUJBMVFzQjtJQTJRdEIsZUEzUXNCO0lBNFF0QixrQkE1UXNCO0lBNlF0QixhQTdRc0I7SUE4UXRCLGdCQTlRc0I7SUErUXRCLDJCQS9Rc0I7SUFnUnRCLG1CQWhSc0I7SUFpUnRCLGtCQWpSc0I7SUFrUnRCLG9CQWxSc0I7SUFtUnRCLFdBblJzQjtJQW9SdEIsbUJBcFJzQjtJQXFSdEIsdUJBclJzQjtJQXNSdEIscUJBdFJzQjtJQXVSdEIsbUJBdlJzQjtJQXdSdEIsb0JBeFJzQjtJQXlSdEIsa0JBelJzQjtJQTBSdEIsa0JBMVJzQjtJQTJSdEIsa0JBM1JzQjtJQTRSdEIsc0JBNVJzQjtJQTZSdEIsdUJBN1JzQjtJQThSdEIscUJBOVJzQjtJQStSdEIsZUEvUnNCO0lBZ1N0QixpQ0FoU3NCO0lBaVN0QixxQkFqU3NCO0lBa1N0QixzQkFsU3NCO0lBbVN0QixrQkFuU3NCO0lBb1N0QixvQkFwU3NCO0lBcVN0QixrQkFyU3NCO0lBc1N0QiwrQkF0U3NCO0lBdVN0Qix3QkF2U3NCO0lBd1N0QixnQkF4U3NCO0lBeVN0QixtQkF6U3NCO0lBMFN0QixnQkExU3NCO0lBMlN0QixlQTNTc0I7SUE0U3RCLGtCQTVTc0I7SUE2U3RCLHNCQTdTc0I7SUE4U3RCLHNCQTlTc0I7SUErU3RCLDJCQS9Tc0I7SUFnVHRCLG9CQWhUc0I7SUFpVHRCLHdCQWpUc0I7SUFrVHRCLGVBbFRzQjtJQW1UdEIscUJBblRzQjtJQW9UdEIsb0JBcFRzQjtJQXFUdEIsMkJBclRzQjtJQXNUdEIsbUJBdFRzQjtJQXVUdEIsUUF2VHNCO0lBd1R0QixrQkF4VHNCO0lBeVR0QixtQkF6VHNCO0lBMFR0QixvQkExVHNCO0lBMlR0Qix5QkEzVHNCO0lBNFR0QixpQkE1VHNCO0lBNlR0QixxQkE3VHNCO0lBOFR0Qix1QkE5VHNCO0lBK1R0QixnQkEvVHNCO0lBZ1V0QixZQWhVc0I7SUFpVXRCLHNCQWpVc0I7SUFrVXRCLG9CQWxVc0I7SUFtVXRCLHFCQW5Vc0I7SUFvVXRCLGFBcFVzQjtJQXFVdEIsWUFyVXNCO0lBc1V0Qix1Q0F0VXNCO0lBdVV0Qix1QkF2VXNCO0lBd1V0QixZQXhVc0I7SUF5VXRCLGtCQXpVc0I7SUEwVXRCLGFBMVVzQjtJQTJVdEIscUJBM1VzQjtJQTRVdEIsdUJBNVVzQjtJQTZVdEIsMEJBN1VzQjtJQThVdEIsa0JBOVVzQjtJQStVdEIseUJBL1VzQjtJQWdWdEIsV0FoVnNCO0lBaVZ0QixtQkFqVnNCO0lBa1Z0Qix1QkFsVnNCO0lBbVZ0Qix3QkFuVnNCO0lBb1Z0Qix1QkFwVnNCO0lBcVZ0QiwyQkFyVnNCO0lBc1Z0QixnQ0F0VnNCO0lBdVZ0QiwwQkF2VnNCO0lBd1Z0QixtQkF4VnNCO0lBeVZ0QixvQkF6VnNCO0lBMFZ0QixnQkExVnNCO0lBMlZ0QixvQkEzVnNCO0lBNFZ0QixrQkE1VnNCO0lBNlZ0QixpQkE3VnNCO0lBOFZ0QixzQkE5VnNCO0lBK1Z0QixzQkEvVnNCO0lBZ1d0QixvQkFoV3NCO0lBaVd0QixTQWpXc0I7SUFrV3RCLG9CQWxXc0I7SUFtV3RCLGVBbldzQjtJQW9XdEIsYUFwV3NCO0lBcVd0QixpQkFyV3NCO0lBc1d0QixhQXRXc0I7SUF1V3RCLGFBdldzQjtJQXdXdEIsa0JBeFdzQjtJQXlXdEIscUJBeldzQjtJQTBXdEIsdUJBMVdzQjtJQTJXdEIsbUJBM1dzQjtJQTRXdEIsa0JBNVdzQjtJQTZXdEIsc0JBN1dzQjtJQThXdEIsZ0JBOVdzQjtJQStXdEIsd0JBL1dzQjtJQWdYdEIsZ0JBaFhzQjtJQWlYdEIsaUJBalhzQjtJQWtYdEIseUJBbFhzQjtJQW1YdEIsMEJBblhzQjtJQW9YdEIsa0JBcFhzQjtJQXFYdEIsZ0JBclhzQjtJQXNYdEIsd0JBdFhzQjtJQXVYdEIscUJBdlhzQjtJQXdYdEIsb0JBeFhzQjtJQXlYdEIscUJBelhzQjtJQTBYdEIsZUExWHNCO0lBMlh0QixvQkEzWHNCO0lBNFh0QixnQkE1WHNCO0lBNlh0QixzQkE3WHNCO0lBOFh0QixrQkE5WHNCO0lBK1h0QiwwQkEvWHNCO0lBZ1l0QixtQ0FoWXNCO0lBaVl0QixnQkFqWXNCO0lBa1l0QixzQkFsWXNCO0lBbVl0QixtQkFuWXNCO0lBb1l0QixrQkFwWXNCO0lBcVl0QixxQkFyWXNCO0lBc1l0QixhQXRZc0I7SUF1WXRCLHdCQXZZc0I7SUF3WXRCLGlCQXhZc0I7SUF5WXRCLGVBellzQjtJQTBZdEIsZ0JBMVlzQjtJQTJZdEIsbUJBM1lzQjtJQTRZdEIsaUJBNVlzQjtJQTZZdEIsVUE3WXNCO0lBOFl0QixxQkE5WXNCO0lBK1l0Qix5QkEvWXNCO0lBZ1p0QixjQWhac0I7SUFpWnRCLGFBalpzQjtJQWtadEIsc0JBbFpzQjtJQW1adEIsaUJBblpzQjtJQW9adEIsNEJBcFpzQjtJQXFadEIsMEJBclpzQjtJQXNadEIsZ0JBdFpzQjtJQXVadEIsYUF2WnNCO0lBd1p0QixxQkF4WnNCO0lBeVp0QixzQkF6WnNCO0lBMFp0QixlQTFac0I7SUEyWnRCLFVBM1pzQjtJQTRadEIsaUJBNVpzQjtJQTZadEIsK0JBN1pzQjtJQThadEIsV0E5WnNCO0lBK1p0QixpQkEvWnNCO0lBZ2F0QixpQkFoYXNCO0lBaWF0QixrQkFqYXNCO0lBa2F0QixzQkFsYXNCO0lBbWF0QixnQkFuYXNCO0lBb2F0QixpQkFwYXNCO0lBcWF0QixlQXJhc0I7SUFzYXRCLCtCQXRhc0I7SUF1YXRCLGtCQXZhc0I7SUF3YXRCLGFBeGFzQjtJQXlhdEIsNEJBemFzQjtJQTBhdEIsaUJBMWFzQjtJQTJhdEIsYUEzYXNCO0lBNGF0QixZQTVhc0I7SUE2YXRCLHlCQTdhc0I7SUE4YXRCLDhCQTlhc0I7SUErYXRCLDZCQS9hc0I7SUFnYnRCLGFBaGJzQjtJQWlidEIsY0FqYnNCO0lBa2J0QixrQkFsYnNCO0lBbWJ0QixXQW5ic0I7SUFvYnRCLGVBcGJzQjtJQXFidEIsYUFyYnNCO0lBc2J0QixpQkF0YnNCO0lBdWJ0QixtQkF2YnNCO0lBd2J0QiwyQkF4YnNCO0lBeWJ0QixhQXpic0I7SUEwYnRCLGNBMWJzQjtJQTJidEIsY0EzYnNCO0lBNGJ0Qix1QkE1YnNCO0lBNmJ0QiwyQkE3YnNCO0lBOGJ0QixxQkE5YnNCO0lBK2J0QixzQkEvYnNCO0lBZ2N0QixvQkFoY3NCO0lBaWN0QixxQkFqY3NCO0lBa2N0QiwyQkFsY3NCO0lBbWN0QixpQkFuY3NCO0lBb2N0QixrQkFwY3NCO0lBcWN0Qiw0QkFyY3NCO0lBc2N0QixpQkF0Y3NCO0lBdWN0QixxQkF2Y3NCO0lBd2N0QiwyQkF4Y3NCO0lBeWN0QixZQXpjc0I7SUEwY3RCLGFBMWNzQjtJQTJjdEIscUJBM2NzQjtJQTRjdEIsYUE1Y3NCO0lBNmN0QixxQkE3Y3NCO0lBOGN0QixZQTljc0I7SUErY3RCLHNCQS9jc0I7SUFnZHRCLHFCQWhkc0I7SUFpZHRCLGdCQWpkc0I7SUFrZHRCLHdCQWxkc0I7SUFtZHRCLGtCQW5kc0I7SUFvZHRCLHVCQXBkc0I7SUFxZHRCLGFBcmRzQjtJQXNkdEIsV0F0ZHNCO0lBdWR0QixVQXZkc0I7SUF3ZHRCLHNCQXhkc0I7SUF5ZHRCLG1CQXpkc0I7SUEwZHRCLFlBMWRzQjtJQTJkdEIscUJBM2RzQjtJQTRkdEIsbUJBNWRzQjtJQTZkdEIseUJBN2RzQjtJQThkdEIsaUJBOWRzQjtJQStkdEIsaUJBL2RzQjtJQWdldEIsd0JBaGVzQjtJQWlldEIsaUJBamVzQjtJQWtldEIsZUFsZXNCO0lBbWV0QixlQW5lc0I7SUFvZXRCLG1CQXBlc0I7SUFxZXRCLHlCQXJlc0I7SUFzZXRCLGNBdGVzQjtJQXVldEIsZUF2ZXNCO0lBd2V0QixjQXhlc0I7SUF5ZXRCLGdCQXplc0I7SUEwZXRCLG9CQTFlc0I7SUEyZXRCLHFCQTNlc0I7SUE0ZXRCLHVCQTVlc0I7SUE2ZXRCLHVCQTdlc0I7SUE4ZXRCLDJCQTllc0I7SUErZXRCLGNBL2VzQjtJQWdmdEIsZ0JBaGZzQjtJQWlmdEIsc0JBamZzQjtJQWtmdEIscUJBbGZzQjtJQW1mdEIscUJBbmZzQjtJQW9mdEIscUJBcGZzQjtJQXFmdEIsbUJBcmZzQjtJQXNmdEIseUJBdGZzQjtJQXVmdEIsbUJBdmZzQjtJQXdmdEIsU0F4ZnNCO0lBeWZ0QixZQXpmc0I7SUEwZnRCLHVCQTFmc0I7SUEyZnRCLGFBM2ZzQjtJQTRmdEIsa0JBNWZzQjtJQTZmdEIsbURBN2ZzQjtJQThmdEIscUJBOWZzQjtJQStmdEIsa0JBL2ZzQjtJQWdnQnRCLDJCQWhnQnNCO0lBaWdCdEIscUJBamdCc0I7SUFrZ0J0QixlQWxnQnNCO0lBbWdCdEIsaUJBbmdCc0I7SUFvZ0J0QixnQ0FwZ0JzQjtJQXFnQnRCLGtCQXJnQnNCO0lBc2dCdEIsZ0JBdGdCc0I7SUF1Z0J0QixpQkF2Z0JzQjtJQXdnQnRCLGNBeGdCc0I7SUF5Z0J0QixxQkF6Z0JzQjtJQTBnQnRCLGFBMWdCc0I7SUEyZ0J0QiwwQkEzZ0JzQjtJQTRnQnRCLG1CQTVnQnNCO0lBNmdCdEIsZUE3Z0JzQjtJQThnQnRCLFlBOWdCc0I7SUErZ0J0QixrQkEvZ0JzQjtJQWdoQnRCLFNBaGhCc0I7SUFpaEJ0QixrQkFqaEJzQjtJQWtoQnRCLFdBbGhCc0I7SUFtaEJ0QixtQkFuaEJzQjtJQW9oQnRCLGVBcGhCc0I7SUFxaEJ0QixxQkFyaEJzQjtJQXNoQnRCLG1CQXRoQnNCO0lBdWhCdEIsMEJBdmhCc0I7SUF3aEJ0QixzQkF4aEJzQjtJQXloQnRCLG1CQXpoQnNCO0lBMGhCdEIsMEJBMWhCc0I7SUEyaEJ0Qix3QkEzaEJzQjtJQTRoQnRCLGNBNWhCc0I7SUE2aEJ0Qiw2QkE3aEJzQjtJQThoQnRCLGdCQTloQnNCO0lBK2hCdEIseUJBL2hCc0I7SUFnaUJ0Qix1QkFoaUJzQjtJQWlpQnRCLHNCQWppQnNCO0lBa2lCdEIsbUJBbGlCc0I7SUFtaUJ0QixrQkFuaUJzQjtJQW9pQnRCLHVCQXBpQnNCO0lBcWlCdEIsd0JBcmlCc0I7SUFzaUJ0QixhQXRpQnNCO0lBdWlCdEIseUJBdmlCc0I7SUF3aUJ0Qiw0QkF4aUJzQjtJQXlpQnRCLHFCQXppQnNCO0lBMGlCdEIsc0JBMWlCc0I7SUEyaUJ0QiwyQkEzaUJzQjtJQTRpQnRCLGlDQTVpQnNCO0lBNmlCdEIsdUNBN2lCc0I7SUE4aUJ0QixlQTlpQnNCO0lBK2lCdEIsZUEvaUJzQjtJQWdqQnRCLG9CQWhqQnNCO0lBaWpCdEIsbUJBampCc0I7SUFrakJ0QixzQkFsakJzQjtJQW1qQnRCLG9DQW5qQnNCO0lBb2pCdEIscUJBcGpCc0I7SUFxakJ0QixlQXJqQnNCO0lBc2pCdEIsZ0NBdGpCc0I7SUF1akJ0QixjQXZqQnNCO0lBd2pCdEIsbUJBeGpCc0I7SUF5akJ0QixTQXpqQnNCO0lBMGpCdEIscUJBMWpCc0I7SUEyakJ0Qiw0QkEzakJzQjtJQTRqQnRCLGdCQTVqQnNCO0lBNmpCdEIsbUJBN2pCc0I7SUE4akJ0Qix1QkE5akJzQjtJQStqQnRCLGlCQS9qQnNCO0lBZ2tCdEIsZUFoa0JzQjtJQWlrQnRCLGlCQWprQnNCO0lBa2tCdEIsc0JBbGtCc0I7SUFta0J0QiwwQkFua0JzQjtJQW9rQnRCLGlCQXBrQnNCO0lBcWtCdEIsdUJBcmtCc0I7SUFza0J0Qix1QkF0a0JzQjtJQXVrQnRCLHNCQXZrQnNCO0lBd2tCdEIsb0JBeGtCc0I7SUF5a0J0Qix5QkF6a0JzQjtJQTBrQnRCLGFBMWtCc0I7SUEya0J0QixzQkEza0JzQjtJQTRrQnRCLHNCQTVrQnNCO0lBNmtCdEIsd0JBN2tCc0I7SUE4a0J0QixlQTlrQnNCO0lBK2tCdEIsb0JBL2tCc0I7SUFnbEJ0QixhQWhsQnNCO0lBaWxCdEIsdUJBamxCc0I7SUFrbEJ0QixzQkFsbEJzQjtJQW1sQnRCLGdCQW5sQnNCO0lBb2xCdEIsaUJBcGxCc0I7SUFxbEJ0QixtQkFybEJzQjtJQXNsQnRCLHVCQXRsQnNCO0lBdWxCdEIsa0JBdmxCc0I7SUF3bEJ0QixxQkF4bEJzQjtJQXlsQnRCLGdCQXpsQnNCO0lBMGxCdEIsc0JBMWxCc0I7SUEybEJ0Qix3QkEzbEJzQjtJQTRsQnRCLGFBNWxCc0I7SUE2bEJ0QixrQkE3bEJzQjtJQThsQnRCLGlCQTlsQnNCO0lBK2xCdEIscUJBL2xCc0I7SUFnbUJ0QixlQWhtQnNCO0lBaW1CdEIsa0JBam1Cc0I7SUFrbUJ0QixhQWxtQnNCO0lBbW1CdEIsYUFubUJzQjtJQW9tQnRCLHFCQXBtQnNCO0lBcW1CdEIscUJBcm1Cc0I7SUFzbUJ0QixzQkF0bUJzQjtJQXVtQnRCLHVCQXZtQnNCO0lBd21CdEIsc0JBeG1Cc0I7SUF5bUJ0QixpQkF6bUJzQjtJQTBtQnRCLGtCQTFtQnNCO0lBMm1CdEIsYUEzbUJzQjtJQTRtQnRCLGVBNW1Cc0I7SUE2bUJ0QixnQkE3bUJzQjtJQThtQnRCLGtCQTltQnNCO0lBK21CdEIsMEJBL21Cc0I7SUFnbkJ0Qix1QkFobkJzQjtJQWluQnRCLHNCQWpuQnNCO0lBa25CdEIsZUFsbkJzQjtJQW1uQnRCLGVBbm5Cc0I7SUFvbkJ0QixnQkFwbkJzQjtJQXFuQnRCLHNCQXJuQnNCO0lBc25CdEIsaUJBdG5Cc0I7SUF1bkJ0QixvQkF2bkJzQjtJQXduQnRCLGtCQXhuQnNCO0lBeW5CdEIsdUJBem5Cc0I7SUEwbkJ0QixlQTFuQnNCO0lBMm5CdEIsY0EzbkJzQjtJQTRuQnRCLGdCQTVuQnNCO0lBNm5CdEIsbUJBN25Cc0I7SUE4bkJ0Qix3QkE5bkJzQjtJQStuQnRCLGdCQS9uQnNCO0lBZ29CdEIseUJBaG9Cc0I7SUFpb0J0QixpQkFqb0JzQjtJQWtvQnRCLG1CQWxvQnNCO0lBbW9CdEIsT0Fub0JzQjtJQW9vQnRCLDBCQXBvQnNCO0lBcW9CdEIsc0JBcm9Cc0I7SUFzb0J0QixxQkF0b0JzQjtJQXVvQnRCLG1CQXZvQnNCO0lBd29CdEIsYUF4b0JzQjtJQXlvQnRCLFdBem9Cc0I7SUEwb0J0QixjQTFvQnNCO0lBMm9CdEIseUJBM29Cc0I7SUE0b0J0QixnQkE1b0JzQjtJQTZvQnRCLGlCQTdvQnNCO0lBOG9CdEIsb0JBOW9Cc0I7SUErb0J0QixhQS9vQnNCO0lBZ3BCdEIsbUJBaHBCc0I7SUFpcEJ0QixrQkFqcEJzQjtJQWtwQnRCLHdCQWxwQnNCO0lBbXBCdEIsc0JBbnBCc0I7SUFvcEJ0QixrQkFwcEJzQjtJQXFwQnRCLDBCQXJwQnNCO0lBc3BCdEIsc0JBdHBCc0I7SUF1cEJ0QixnQkF2cEJzQjtJQXdwQnRCLGlCQXhwQnNCO0lBeXBCdEIsa0JBenBCc0I7SUEwcEJ0QixnQkExcEJzQjtJQTJwQnRCLG1CQTNwQnNCO0lBNHBCdEIsdUJBNXBCc0I7SUE2cEJ0QixvQkE3cEJzQjtJQThwQnRCLGdCQTlwQnNCO0lBK3BCdEIsWUEvcEJzQjtJQWdxQnRCLHlCQWhxQnNCO0lBaXFCdEIsaUJBanFCc0I7SUFrcUJ0QixrQkFscUJzQjtJQW1xQnRCLGdCQW5xQnNCO0lBb3FCdEIsNEJBcHFCc0I7SUFxcUJ0QixrQkFycUJzQjtJQXNxQnRCLGtCQXRxQnNCO0lBdXFCdEIsMEJBdnFCc0I7SUF3cUJ0QixvQkF4cUJzQjtJQXlxQnRCLGlCQXpxQnNCO0lBMHFCdEIsc0JBMXFCc0I7SUEycUJ0QixtQkEzcUJzQjtJQTRxQnRCLG9CQTVxQnNCO0lBNnFCdEIsaUNBN3FCc0I7SUE4cUJ0QixnQkE5cUJzQjtJQStxQnRCLGtCQS9xQnNCO0lBZ3JCdEIsbUJBaHJCc0I7SUFpckJ0Qix1QkFqckJzQjtJQWtyQnRCLHlCQWxyQnNCO0lBbXJCdEIsd0JBbnJCc0I7SUFvckJ0Qiw0QkFwckJzQjtJQXFyQnRCLGlCQXJyQnNCO0lBc3JCdEIsaUJBdHJCc0I7SUF1ckJ0QixvQkF2ckJzQjtJQXdyQnRCLGtCQXhyQnNCO0lBeXJCdEIsbUJBenJCc0I7SUEwckJ0QixxQkExckJzQjtJQTJyQnRCLDZCQTNyQnNCO0lBNHJCdEIsb0JBNXJCc0I7SUE2ckJ0Qix3QkE3ckJzQjtJQThyQnRCLG1CQTlyQnNCO0lBK3JCdEIsYUEvckJzQjtJQWdzQnRCLGlCQWhzQnNCO0lBaXNCdEIsZ0JBanNCc0I7SUFrc0J0Qix1QkFsc0JzQjtJQW1zQnRCLFNBbnNCc0I7SUFvc0J0QixZQXBzQnNCO0lBcXNCdEIseUJBcnNCc0I7SUFzc0J0Qix5QkF0c0JzQjtJQXVzQnRCLHNCQXZzQnNCO0lBd3NCdEIsZ0JBeHNCc0I7SUF5c0J0QixlQXpzQnNCO0lBMHNCdEIseUJBMXNCc0I7SUEyc0J0Qix5QkEzc0JzQjtJQTRzQnRCLG1CQTVzQnNCO0lBNnNCdEIsZUE3c0JzQjtJQThzQnRCLG1CQTlzQnNCO0lBK3NCdEIsdUJBL3NCc0I7SUFndEJ0QixZQWh0QnNCO0lBaXRCdEIsbUNBanRCc0I7SUFrdEJ0QixxQkFsdEJzQjtJQW10QnRCLHNCQW50QnNCO0lBb3RCdEIsZUFwdEJzQjtJQXF0QnRCLFVBcnRCc0I7SUFzdEJ0Qiw4QkF0dEJzQjtJQXV0QnRCLGlCQXZ0QnNCO0lBd3RCdEIsYUF4dEJzQjtJQXl0QnRCLGNBenRCc0I7SUEwdEJ0Qix1QkExdEJzQjtJQTJ0QnRCLHVCQTN0QnNCO0lBNHRCdEIsV0E1dEJzQjtJQTZ0QnRCLGtCQTd0QnNCO0lBOHRCdEIsc0JBOXRCc0I7SUErdEJ0QixpQkEvdEJzQjtJQWd1QnRCLFlBaHVCc0I7SUFpdUJ0QixrQkFqdUJzQjtJQWt1QnRCLFdBbHVCc0I7SUFtdUJ0QixzQkFudUJzQjtJQW91QnRCLG1CQXB1QnNCO0lBcXVCdEIsNkJBcnVCc0I7SUFzdUJ0QixVQXR1QnNCO0lBdXVCdEIsbUJBdnVCc0I7SUF3dUJ0QixpQkF4dUJzQjtJQXl1QnRCLFdBenVCc0I7SUEwdUJ0QixjQTF1QnNCO0lBMnVCdEIsWUEzdUJzQjtJQTR1QnRCLHNCQTV1QnNCO0lBNnVCdEIsbUJBN3VCc0I7SUE4dUJ0QixpQkE5dUJzQjtJQSt1QnRCLGlCQS91QnNCO0lBZ3ZCdEIsZ0JBaHZCc0I7SUFpdkJ0QixVQWp2QnNCO0lBa3ZCdEIsd0JBbHZCc0I7SUFtdkJ0QixpQkFudkJzQjtJQW92QnRCLFVBcHZCc0I7SUFxdkJ0QixjQXJ2QnNCO0lBc3ZCdEIseUJBdHZCc0I7SUF1dkJ0QixrQkF2dkJzQjtJQXd2QnRCLGlCQXh2QnNCO0lBeXZCdEIsaUJBenZCc0I7SUEwdkJ0QixrQ0ExdkJzQjtJQTJ2QnRCLGNBM3ZCc0I7SUE0dkJ0QixVQTV2QnNCO0lBNnZCdEIsMkJBN3ZCc0I7SUE4dkJ0Qix5QkE5dkJzQjtJQSt2QnRCLHNCQS92QnNCO0lBZ3dCdEIsZ0JBaHdCc0I7SUFpd0J0QixzQkFqd0JzQjtJQWt3QnRCLHNCQWx3QnNCO0lBbXdCdEIsa0JBbndCc0I7SUFvd0J0QixjQXB3QnNCO0lBcXdCdEIsY0Fyd0JzQjtJQXN3QnRCLGtCQXR3QnNCO0lBdXdCdEIseUJBdndCc0I7SUF3d0J0QixvQkF4d0JzQjtJQXl3QnRCLHNCQXp3QnNCO0lBMHdCdEIsZUExd0JzQjtJQTJ3QnRCLG1CQTN3QnNCO0lBNHdCdEIsY0E1d0JzQjtJQTZ3QnRCLGlCQTd3QnNCO0lBOHdCdEIsbUJBOXdCc0I7SUErd0J0QixrQkEvd0JzQjtJQWd4QnRCLGlCQWh4QnNCO0lBaXhCdEIsa0NBanhCc0I7SUFreEJ0QixTQWx4QnNCO0lBbXhCdEIsMEJBbnhCc0I7SUFveEJ0QixrQkFweEJzQjtJQXF4QnRCLG1CQXJ4QnNCO0lBc3hCdEIsa0JBdHhCc0I7SUF1eEJ0QixzQ0F2eEJzQjtJQXd4QnRCLGNBeHhCc0I7SUF5eEJ0Qiw0QkF6eEJzQjtJQTB4QnRCLDBCQTF4QnNCO0lBMnhCdEIsa0JBM3hCc0I7SUE0eEJ0QixxQkE1eEJzQjtJQTZ4QnRCLGFBN3hCc0I7SUE4eEJ0QixrQkE5eEJzQjtJQSt4QnRCLG1CQS94QnNCO0lBZ3lCdEIsUUFoeUJzQjtJQWl5QnRCLDZCQWp5QnNCO0lBa3lCdEIsU0FseUJzQjtJQW15QnRCLG9CQW55QnNCO0lBb3lCdEIsV0FweUJzQjtJQXF5QnRCLFlBcnlCc0I7SUFzeUJ0QixnQ0F0eUJzQjtJQXV5QnRCLGlCQXZ5QnNCO0lBd3lCdEIsNkJBeHlCc0I7SUF5eUJ0QixRQXp5QnNCO0lBMHlCdEIsa0JBMXlCc0I7SUEyeUJ0QixXQTN5QnNCO0lBNHlCdEIsZUE1eUJzQjtJQTZ5QnRCLG9CQTd5QnNCO0lBOHlCdEIsYUE5eUJzQjtJQSt5QnRCLGVBL3lCc0I7SUFnekJ0QixTQWh6QnNCO0lBaXpCdEIsd0JBanpCc0I7SUFrekJ0QixnQkFsekJzQjtJQW16QnRCLHVCQW56QnNCO0lBb3pCdEIsbUJBcHpCc0I7SUFxekJ0QixjQXJ6QnNCO0lBc3pCdEIsY0F0ekJzQjtJQXV6QnRCLGtCQXZ6QnNCO0lBd3pCdEIsZUF4ekJzQjtJQXl6QnRCLGNBenpCc0I7SUEwekJ0Qix1QkExekJzQjtJQTJ6QnRCLGVBM3pCc0I7SUE0ekJ0Qix5QkE1ekJzQjtJQTZ6QnRCLFlBN3pCc0I7SUE4ekJ0QixjQTl6QnNCO0lBK3pCdEIsZ0NBL3pCc0I7SUFnMEJ0QixxQkFoMEJzQjtJQWkwQnRCLHNCQWowQnNCO0lBazBCdEIsb0JBbDBCc0I7SUFtMEJ0QixvQkFuMEJzQjtJQW8wQnRCLDRCQXAwQnNCO0lBcTBCdEIsNEJBcjBCc0I7SUFzMEJ0QiwyQkF0MEJzQjtJQXUwQnRCLG1CQXYwQnNCO0lBdzBCdEIsWUF4MEJzQjtJQXkwQnRCLGFBejBCc0I7Q0FBekIsQUFBQTtBQTQwQkEsTUFBTUMsd0JBQXdCLEdBQUc7SUFDaEMsZUFEZ0M7SUFFaEMsY0FGZ0M7SUFHaEMsa0JBSGdDO0lBSWhDLGVBSmdDO0lBS2hDLGNBTGdDO0lBTWhDLGFBTmdDO0lBT2hDLFlBUGdDO0lBUWhDLGVBUmdDO0lBU2hDLGdCQVRnQztJQVVoQyxvQkFWZ0M7SUFXaEMsa0JBWGdDO0lBWWhDLGlCQVpnQztJQWFoQyxpQkFiZ0M7SUFjaEMsYUFkZ0M7SUFlaEMsY0FmZ0M7SUFnQmhDLGFBaEJnQztJQWlCaEMsV0FqQmdDO0lBa0JoQyxnQkFsQmdDO0lBbUJoQyxnQkFuQmdDO0lBb0JoQyxlQXBCZ0M7Q0FBakMsQUFBQTtBQXVCTyxNQUFNNUIsbUJBQW1CLEdBQUc7SUFDbEMsZUFEa0M7SUFFbEMsY0FGa0M7T0FHL0I0Qix3QkFIK0I7Q0FBNUIsQUFBUDtBQU1PLE1BQU0zQixnQkFBZ0IsR0FBRztJQUMvQixrQkFEK0I7T0FFNUIwQixnQkFGNEI7Q0FBekIsQUFBUDs7O0EsQyxTLE0sRSxPLEU7SSxJLE8sTSxLLFUsSSxNLEMsRyxFLE0sQyx1QixFO1EsUTtLLEUsTyxDLEM7UztZLEc7USxPLEMsTSxDLEM7SztDLEMsQyxPLFUsSyxXLEcsVSxHLE8sSSxLLFcsRyxJLEcsSSxFLFMsTSxFO0lDNTJCQSwrREFBQSxDQUNBLDZEQUFBLENBQ0EsbUNBQUEsQ0FDQTs7Z0VBRUEsQ0FDQSxZQUFBLENBQUE7SUFFQSxJQUFJLE9BQU9FLFVBQVAsSUFBcUIsUUFBckIsSUFBaUMsT0FBT0MsTUFBUCxJQUFpQixRQUFsRCxJQUE4RCxDQUFDQSxNQUEvRCxJQUF5RSxDQUFDQSxNQUFNLENBQUNoRCxPQUFqRixJQUE0RixDQUFDZ0QsTUFBTSxDQUFDaEQsT0FBUCxDQUFlTSxFQUFoSCxFQUNFLE1BQU0sSUFBSTJDLEtBQUosQ0FBVSwyREFBVixDQUFOLENBQUE7SUFHRixJQUFJLE9BQU9GLFVBQVUsQ0FBQ25ELE9BQWxCLEtBQThCLFdBQTlCLElBQTZDc0QsTUFBTSxDQUFDQyxjQUFQLENBQXNCSixVQUFVLENBQUNuRCxPQUFqQyxDQUFBLEtBQThDc0QsTUFBTSxDQUFDRSxTQUF0RyxFQUFpSDtRQUMvRyxNQUFNQyxnREFBZ0QsR0FBRyx5REFBekQsQUFBQTtRQUNBLE1BQU1DLGlDQUFpQyxHQUFHLHdQQUExQyxBQUYrRyxFQUkvRywyRUFGQTtRQUdBLHdFQUFBO1FBQ0EsNkVBQUE7UUFDQSw0RUFBQTtRQUNBLDhCQUFBO1FBQ0EsTUFBTUMsUUFBUSxHQUFHQyxDQUFBQSxhQUFhLEdBQUk7WUFDaEMsK0VBQUE7WUFDQSw2RUFBQTtZQUNBLGFBQUE7WUFDQSxNQUFNQyxXQUFXLEdBQUc7Z0JBQ2xCLFFBQUEsRUFBVTtvQkFDUixPQUFBLEVBQVM7d0JBQ1AsU0FBQSxFQUFXLENBREo7d0JBRVAsU0FBQSxFQUFXLENBQVg7cUJBSE07b0JBS1IsVUFBQSxFQUFZO3dCQUNWLFNBQUEsRUFBVyxDQUREO3dCQUVWLFNBQUEsRUFBVyxDQUFYO3FCQVBNO29CQVNSLEtBQUEsRUFBTzt3QkFDTCxTQUFBLEVBQVcsQ0FETjt3QkFFTCxTQUFBLEVBQVcsQ0FBWDtxQkFYTTtvQkFhUixRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBRlE7aUJBZE07Z0JBbUJsQixXQUFBLEVBQWE7b0JBQ1gsUUFBQSxFQUFVO3dCQUNSLFNBQUEsRUFBVyxDQURIO3dCQUVSLFNBQUEsRUFBVyxDQUFYO3FCQUhTO29CQUtYLEtBQUEsRUFBTzt3QkFDTCxTQUFBLEVBQVcsQ0FETjt3QkFFTCxTQUFBLEVBQVcsQ0FBWDtxQkFQUztvQkFTWCxhQUFBLEVBQWU7d0JBQ2IsU0FBQSxFQUFXLENBREU7d0JBRWIsU0FBQSxFQUFXLENBQVg7cUJBWFM7b0JBYVgsV0FBQSxFQUFhO3dCQUNYLFNBQUEsRUFBVyxDQURBO3dCQUVYLFNBQUEsRUFBVyxDQUFYO3FCQWZTO29CQWlCWCxZQUFBLEVBQWM7d0JBQ1osU0FBQSxFQUFXLENBREM7d0JBRVosU0FBQSxFQUFXLENBQVg7cUJBbkJTO29CQXFCWCxTQUFBLEVBQVc7d0JBQ1QsU0FBQSxFQUFXLENBREY7d0JBRVQsU0FBQSxFQUFXLENBQVg7cUJBdkJTO29CQXlCWCxNQUFBLEVBQVE7d0JBQ04sU0FBQSxFQUFXLENBREw7d0JBRU4sU0FBQSxFQUFXLENBQVg7cUJBM0JTO29CQTZCWCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBL0JTO29CQWlDWCxZQUFBLEVBQWM7d0JBQ1osU0FBQSxFQUFXLENBREM7d0JBRVosU0FBQSxFQUFXLENBQVg7cUJBbkNTO29CQXFDWCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBdkNTO29CQXlDWCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBRlE7aUJBNURNO2dCQWlFbEIsZUFBQSxFQUFpQjtvQkFDZixTQUFBLEVBQVc7d0JBQ1QsU0FBQSxFQUFXLENBREY7d0JBRVQsU0FBQSxFQUFXLENBRkY7d0JBR1Qsc0JBQUEsRUFBd0IsSUFBeEI7cUJBSmE7b0JBTWYsUUFBQSxFQUFVO3dCQUNSLFNBQUEsRUFBVyxDQURIO3dCQUVSLFNBQUEsRUFBVyxDQUZIO3dCQUdSLHNCQUFBLEVBQXdCLElBQXhCO3FCQVRhO29CQVdmLHlCQUFBLEVBQTJCO3dCQUN6QixTQUFBLEVBQVcsQ0FEYzt3QkFFekIsU0FBQSxFQUFXLENBQVg7cUJBYmE7b0JBZWYsY0FBQSxFQUFnQjt3QkFDZCxTQUFBLEVBQVcsQ0FERzt3QkFFZCxTQUFBLEVBQVcsQ0FBWDtxQkFqQmE7b0JBbUJmLFVBQUEsRUFBWTt3QkFDVixTQUFBLEVBQVcsQ0FERDt3QkFFVixTQUFBLEVBQVcsQ0FBWDtxQkFyQmE7b0JBdUJmLFVBQUEsRUFBWTt3QkFDVixTQUFBLEVBQVcsQ0FERDt3QkFFVixTQUFBLEVBQVcsQ0FBWDtxQkF6QmE7b0JBMkJmLFdBQUEsRUFBYTt3QkFDWCxTQUFBLEVBQVcsQ0FEQTt3QkFFWCxTQUFBLEVBQVcsQ0FBWDtxQkE3QmE7b0JBK0JmLHlCQUFBLEVBQTJCO3dCQUN6QixTQUFBLEVBQVcsQ0FEYzt3QkFFekIsU0FBQSxFQUFXLENBRmM7d0JBR3pCLHNCQUFBLEVBQXdCLElBQXhCO3FCQWxDYTtvQkFvQ2YsY0FBQSxFQUFnQjt3QkFDZCxTQUFBLEVBQVcsQ0FERzt3QkFFZCxTQUFBLEVBQVcsQ0FGRzt3QkFHZCxzQkFBQSxFQUF3QixJQUF4QjtxQkF2Q2E7b0JBeUNmLFNBQUEsRUFBVzt3QkFDVCxTQUFBLEVBQVcsQ0FERjt3QkFFVCxTQUFBLEVBQVcsQ0FBWDtxQkEzQ2E7b0JBNkNmLFVBQUEsRUFBWTt3QkFDVixTQUFBLEVBQVcsQ0FERDt3QkFFVixTQUFBLEVBQVcsQ0FGRDt3QkFHVixzQkFBQSxFQUF3QixJQUF4QjtxQkFoRGE7b0JBa0RmLFVBQUEsRUFBWTt3QkFDVixTQUFBLEVBQVcsQ0FERDt3QkFFVixTQUFBLEVBQVcsQ0FGRDt3QkFHVixzQkFBQSxFQUF3QixJQUF4QjtxQkFIVTtpQkFuSEk7Z0JBeUhsQixjQUFBLEVBQWdCO29CQUNkLFFBQUEsRUFBVTt3QkFDUixTQUFBLEVBQVcsQ0FESDt3QkFFUixTQUFBLEVBQVcsQ0FBWDtxQkFIWTtvQkFLZCxhQUFBLEVBQWU7d0JBQ2IsU0FBQSxFQUFXLENBREU7d0JBRWIsU0FBQSxFQUFXLENBQVg7cUJBUFk7b0JBU2QsZUFBQSxFQUFpQjt3QkFDZixTQUFBLEVBQVcsQ0FESTt3QkFFZixTQUFBLEVBQVcsQ0FBWDtxQkFYWTtvQkFhZCxpQkFBQSxFQUFtQjt3QkFDakIsU0FBQSxFQUFXLENBRE07d0JBRWpCLFNBQUEsRUFBVyxDQUFYO3FCQWZZO29CQWlCZCxnQkFBQSxFQUFrQjt3QkFDaEIsU0FBQSxFQUFXLENBREs7d0JBRWhCLFNBQUEsRUFBVyxDQUFYO3FCQW5CWTtvQkFxQmQsZUFBQSxFQUFpQjt3QkFDZixTQUFBLEVBQVcsQ0FESTt3QkFFZixTQUFBLEVBQVcsQ0FBWDtxQkF2Qlk7b0JBeUJkLG9CQUFBLEVBQXNCO3dCQUNwQixTQUFBLEVBQVcsQ0FEUzt3QkFFcEIsU0FBQSxFQUFXLENBQVg7cUJBM0JZO29CQTZCZCxpQkFBQSxFQUFtQjt3QkFDakIsU0FBQSxFQUFXLENBRE07d0JBRWpCLFNBQUEsRUFBVyxDQUFYO3FCQS9CWTtvQkFpQ2Qsa0JBQUEsRUFBb0I7d0JBQ2xCLFNBQUEsRUFBVyxDQURPO3dCQUVsQixTQUFBLEVBQVcsQ0FBWDtxQkFuQ1k7b0JBcUNkLFVBQUEsRUFBWTt3QkFDVixTQUFBLEVBQVcsQ0FERDt3QkFFVixTQUFBLEVBQVcsQ0FBWDtxQkFGVTtpQkE5Skk7Z0JBbUtsQixVQUFBLEVBQVk7b0JBQ1YsUUFBQSxFQUFVO3dCQUNSLFNBQUEsRUFBVyxDQURIO3dCQUVSLFNBQUEsRUFBVyxDQUFYO3FCQUZRO2lCQXBLTTtnQkF5S2xCLGNBQUEsRUFBZ0I7b0JBQ2QsUUFBQSxFQUFVO3dCQUNSLFNBQUEsRUFBVyxDQURIO3dCQUVSLFNBQUEsRUFBVyxDQUFYO3FCQUhZO29CQUtkLFdBQUEsRUFBYTt3QkFDWCxTQUFBLEVBQVcsQ0FEQTt3QkFFWCxTQUFBLEVBQVcsQ0FBWDtxQkFQWTtvQkFTZCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBRlE7aUJBbExNO2dCQXVMbEIsU0FBQSxFQUFXO29CQUNULEtBQUEsRUFBTzt3QkFDTCxTQUFBLEVBQVcsQ0FETjt3QkFFTCxTQUFBLEVBQVcsQ0FBWDtxQkFITztvQkFLVCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBUE87b0JBU1Qsb0JBQUEsRUFBc0I7d0JBQ3BCLFNBQUEsRUFBVyxDQURTO3dCQUVwQixTQUFBLEVBQVcsQ0FBWDtxQkFYTztvQkFhVCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBZk87b0JBaUJULEtBQUEsRUFBTzt3QkFDTCxTQUFBLEVBQVcsQ0FETjt3QkFFTCxTQUFBLEVBQVcsQ0FBWDtxQkFGSztpQkF4TVM7Z0JBNk1sQixVQUFBLEVBQVk7b0JBQ1YsaUJBQUEsRUFBbUI7d0JBQ2pCLE1BQUEsRUFBUTs0QkFDTixTQUFBLEVBQVcsQ0FETDs0QkFFTixTQUFBLEVBQVcsQ0FGTDs0QkFHTixtQkFBQSxFQUFxQixLQUFyQjt5QkFITTtxQkFGQTtvQkFRVixRQUFBLEVBQVU7d0JBQ1IsUUFBQSxFQUFVOzRCQUNSLFNBQUEsRUFBVyxDQURIOzRCQUVSLFNBQUEsRUFBVyxDQUZIOzRCQUdSLG1CQUFBLEVBQXFCLElBQXJCO3lCQUpNO3dCQU1SLFVBQUEsRUFBWTs0QkFDVixtQkFBQSxFQUFxQjtnQ0FDbkIsU0FBQSxFQUFXLENBRFE7Z0NBRW5CLFNBQUEsRUFBVyxDQUFYOzZCQUZtQjt5QkFEWDtxQkFOSjtpQkFyTk07Z0JBbU9sQixXQUFBLEVBQWE7b0JBQ1gsUUFBQSxFQUFVO3dCQUNSLFNBQUEsRUFBVyxDQURIO3dCQUVSLFNBQUEsRUFBVyxDQUFYO3FCQUhTO29CQUtYLFVBQUEsRUFBWTt3QkFDVixTQUFBLEVBQVcsQ0FERDt3QkFFVixTQUFBLEVBQVcsQ0FBWDtxQkFQUztvQkFTWCxPQUFBLEVBQVM7d0JBQ1AsU0FBQSxFQUFXLENBREo7d0JBRVAsU0FBQSxFQUFXLENBQVg7cUJBWFM7b0JBYVgsYUFBQSxFQUFlO3dCQUNiLFNBQUEsRUFBVyxDQURFO3dCQUViLFNBQUEsRUFBVyxDQUFYO3FCQWZTO29CQWlCWCxNQUFBLEVBQVE7d0JBQ04sU0FBQSxFQUFXLENBREw7d0JBRU4sU0FBQSxFQUFXLENBRkw7d0JBR04sc0JBQUEsRUFBd0IsSUFBeEI7cUJBcEJTO29CQXNCWCxPQUFBLEVBQVM7d0JBQ1AsU0FBQSxFQUFXLENBREo7d0JBRVAsU0FBQSxFQUFXLENBQVg7cUJBeEJTO29CQTBCWCxZQUFBLEVBQWM7d0JBQ1osU0FBQSxFQUFXLENBREM7d0JBRVosU0FBQSxFQUFXLENBQVg7cUJBNUJTO29CQThCWCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBaENTO29CQWtDWCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBcENTO29CQXNDWCxNQUFBLEVBQVE7d0JBQ04sU0FBQSxFQUFXLENBREw7d0JBRU4sU0FBQSxFQUFXLENBRkw7d0JBR04sc0JBQUEsRUFBd0IsSUFBeEI7cUJBSE07aUJBelFRO2dCQStRbEIsV0FBQSxFQUFhO29CQUNYLDJCQUFBLEVBQTZCO3dCQUMzQixTQUFBLEVBQVcsQ0FEZ0I7d0JBRTNCLFNBQUEsRUFBVyxDQUFYO3FCQUhTO29CQUtYLDBCQUFBLEVBQTRCO3dCQUMxQixTQUFBLEVBQVcsQ0FEZTt3QkFFMUIsU0FBQSxFQUFXLENBQVg7cUJBRjBCO2lCQXBSWjtnQkF5UmxCLFNBQUEsRUFBVztvQkFDVCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBSE87b0JBS1QsV0FBQSxFQUFhO3dCQUNYLFNBQUEsRUFBVyxDQURBO3dCQUVYLFNBQUEsRUFBVyxDQUFYO3FCQVBPO29CQVNULGFBQUEsRUFBZTt3QkFDYixTQUFBLEVBQVcsQ0FERTt3QkFFYixTQUFBLEVBQVcsQ0FBWDtxQkFYTztvQkFhVCxXQUFBLEVBQWE7d0JBQ1gsU0FBQSxFQUFXLENBREE7d0JBRVgsU0FBQSxFQUFXLENBQVg7cUJBZk87b0JBaUJULFdBQUEsRUFBYTt3QkFDWCxTQUFBLEVBQVcsQ0FEQTt3QkFFWCxTQUFBLEVBQVcsQ0FBWDtxQkFuQk87b0JBcUJULFFBQUEsRUFBVTt3QkFDUixTQUFBLEVBQVcsQ0FESDt3QkFFUixTQUFBLEVBQVcsQ0FBWDtxQkFGUTtpQkE5U007Z0JBbVRsQixNQUFBLEVBQVE7b0JBQ04sZ0JBQUEsRUFBa0I7d0JBQ2hCLFNBQUEsRUFBVyxDQURLO3dCQUVoQixTQUFBLEVBQVcsQ0FBWDtxQkFISTtvQkFLTixvQkFBQSxFQUFzQjt3QkFDcEIsU0FBQSxFQUFXLENBRFM7d0JBRXBCLFNBQUEsRUFBVyxDQUFYO3FCQUZvQjtpQkF4VE47Z0JBNlRsQixVQUFBLEVBQVk7b0JBQ1YsbUJBQUEsRUFBcUI7d0JBQ25CLFNBQUEsRUFBVyxDQURRO3dCQUVuQixTQUFBLEVBQVcsQ0FBWDtxQkFGbUI7aUJBOVRMO2dCQW1VbEIsTUFBQSxFQUFRO29CQUNOLFlBQUEsRUFBYzt3QkFDWixTQUFBLEVBQVcsQ0FEQzt3QkFFWixTQUFBLEVBQVcsQ0FBWDtxQkFGWTtpQkFwVUU7Z0JBeVVsQixZQUFBLEVBQWM7b0JBQ1osS0FBQSxFQUFPO3dCQUNMLFNBQUEsRUFBVyxDQUROO3dCQUVMLFNBQUEsRUFBVyxDQUFYO3FCQUhVO29CQUtaLFFBQUEsRUFBVTt3QkFDUixTQUFBLEVBQVcsQ0FESDt3QkFFUixTQUFBLEVBQVcsQ0FBWDtxQkFQVTtvQkFTWixTQUFBLEVBQVc7d0JBQ1QsU0FBQSxFQUFXLENBREY7d0JBRVQsU0FBQSxFQUFXLENBQVg7cUJBWFU7b0JBYVosWUFBQSxFQUFjO3dCQUNaLFNBQUEsRUFBVyxDQURDO3dCQUVaLFNBQUEsRUFBVyxDQUFYO3FCQWZVO29CQWlCWixlQUFBLEVBQWlCO3dCQUNmLFNBQUEsRUFBVyxDQURJO3dCQUVmLFNBQUEsRUFBVyxDQUFYO3FCQUZlO2lCQTFWRDtnQkErVmxCLGVBQUEsRUFBaUI7b0JBQ2YsT0FBQSxFQUFTO3dCQUNQLFNBQUEsRUFBVyxDQURKO3dCQUVQLFNBQUEsRUFBVyxDQUFYO3FCQUhhO29CQUtmLFFBQUEsRUFBVTt3QkFDUixTQUFBLEVBQVcsQ0FESDt3QkFFUixTQUFBLEVBQVcsQ0FBWDtxQkFQYTtvQkFTZixRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBWGE7b0JBYWYsb0JBQUEsRUFBc0I7d0JBQ3BCLFNBQUEsRUFBVyxDQURTO3dCQUVwQixTQUFBLEVBQVcsQ0FBWDtxQkFmYTtvQkFpQmYsUUFBQSxFQUFVO3dCQUNSLFNBQUEsRUFBVyxDQURIO3dCQUVSLFNBQUEsRUFBVyxDQUFYO3FCQUZRO2lCQWhYTTtnQkFxWGxCLFlBQUEsRUFBYztvQkFDWixVQUFBLEVBQVk7d0JBQ1YsU0FBQSxFQUFXLENBREQ7d0JBRVYsU0FBQSxFQUFXLENBQVg7cUJBSFU7b0JBS1osVUFBQSxFQUFZO3dCQUNWLFNBQUEsRUFBVyxDQUREO3dCQUVWLFNBQUEsRUFBVyxDQUFYO3FCQVBVO29CQVNaLE1BQUEsRUFBUTt3QkFDTixTQUFBLEVBQVcsQ0FETDt3QkFFTixTQUFBLEVBQVcsQ0FGTDt3QkFHTixzQkFBQSxFQUF3QixJQUF4QjtxQkFaVTtvQkFjWixTQUFBLEVBQVc7d0JBQ1QsU0FBQSxFQUFXLENBREY7d0JBRVQsU0FBQSxFQUFXLENBQVg7cUJBaEJVO29CQWtCWixVQUFBLEVBQVk7d0JBQ1YsU0FBQSxFQUFXLENBREQ7d0JBRVYsU0FBQSxFQUFXLENBRkQ7d0JBR1Ysc0JBQUEsRUFBd0IsSUFBeEI7cUJBckJVO29CQXVCWixVQUFBLEVBQVk7d0JBQ1YsU0FBQSxFQUFXLENBREQ7d0JBRVYsU0FBQSxFQUFXLENBRkQ7d0JBR1Ysc0JBQUEsRUFBd0IsSUFBeEI7cUJBMUJVO29CQTRCWixNQUFBLEVBQVE7d0JBQ04sU0FBQSxFQUFXLENBREw7d0JBRU4sU0FBQSxFQUFXLENBRkw7d0JBR04sc0JBQUEsRUFBd0IsSUFBeEI7cUJBSE07aUJBalpRO2dCQXVabEIsYUFBQSxFQUFlO29CQUNiLFVBQUEsRUFBWTt3QkFDVixTQUFBLEVBQVcsQ0FERDt3QkFFVixTQUFBLEVBQVcsQ0FBWDtxQkFIVztvQkFLYixRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBUFc7b0JBU2IsUUFBQSxFQUFVO3dCQUNSLFNBQUEsRUFBVyxDQURIO3dCQUVSLFNBQUEsRUFBVyxDQUFYO3FCQVhXO29CQWFiLFNBQUEsRUFBVzt3QkFDVCxTQUFBLEVBQVcsQ0FERjt3QkFFVCxTQUFBLEVBQVcsQ0FBWDtxQkFGUztpQkFwYUs7Z0JBeWFsQixTQUFBLEVBQVc7b0JBQ1QsbUJBQUEsRUFBcUI7d0JBQ25CLFNBQUEsRUFBVyxDQURRO3dCQUVuQixTQUFBLEVBQVcsQ0FBWDtxQkFITztvQkFLVCxpQkFBQSxFQUFtQjt3QkFDakIsU0FBQSxFQUFXLENBRE07d0JBRWpCLFNBQUEsRUFBVyxDQUFYO3FCQVBPO29CQVNULGlCQUFBLEVBQW1CO3dCQUNqQixTQUFBLEVBQVcsQ0FETTt3QkFFakIsU0FBQSxFQUFXLENBQVg7cUJBWE87b0JBYVQsb0JBQUEsRUFBc0I7d0JBQ3BCLFNBQUEsRUFBVyxDQURTO3dCQUVwQixTQUFBLEVBQVcsQ0FBWDtxQkFmTztvQkFpQlQsYUFBQSxFQUFlO3dCQUNiLFNBQUEsRUFBVyxDQURFO3dCQUViLFNBQUEsRUFBVyxDQUFYO3FCQW5CTztvQkFxQlQsbUJBQUEsRUFBcUI7d0JBQ25CLFNBQUEsRUFBVyxDQURRO3dCQUVuQixTQUFBLEVBQVcsQ0FBWDtxQkF2Qk87b0JBeUJULGlCQUFBLEVBQW1CO3dCQUNqQixTQUFBLEVBQVcsQ0FETTt3QkFFakIsU0FBQSxFQUFXLENBQVg7cUJBRmlCO2lCQWxjSDtnQkF1Y2xCLFVBQUEsRUFBWTtvQkFDVixZQUFBLEVBQWM7d0JBQ1osU0FBQSxFQUFXLENBREM7d0JBRVosU0FBQSxFQUFXLENBQVg7cUJBSFE7b0JBS1YsbUJBQUEsRUFBcUI7d0JBQ25CLFNBQUEsRUFBVyxDQURRO3dCQUVuQixTQUFBLEVBQVcsQ0FBWDtxQkFQUTtvQkFTVixTQUFBLEVBQVc7d0JBQ1QsU0FBQSxFQUFXLENBREY7d0JBRVQsU0FBQSxFQUFXLENBQVg7cUJBRlM7aUJBaGRLO2dCQXFkbEIsU0FBQSxFQUFXO29CQUNULE9BQUEsRUFBUzt3QkFDUCxPQUFBLEVBQVM7NEJBQ1AsU0FBQSxFQUFXLENBREo7NEJBRVAsU0FBQSxFQUFXLENBQVg7eUJBSEs7d0JBS1AsS0FBQSxFQUFPOzRCQUNMLFNBQUEsRUFBVyxDQUROOzRCQUVMLFNBQUEsRUFBVyxDQUFYO3lCQVBLO3dCQVNQLGVBQUEsRUFBaUI7NEJBQ2YsU0FBQSxFQUFXLENBREk7NEJBRWYsU0FBQSxFQUFXLENBQVg7eUJBWEs7d0JBYVAsUUFBQSxFQUFVOzRCQUNSLFNBQUEsRUFBVyxDQURIOzRCQUVSLFNBQUEsRUFBVyxDQUFYO3lCQWZLO3dCQWlCUCxLQUFBLEVBQU87NEJBQ0wsU0FBQSxFQUFXLENBRE47NEJBRUwsU0FBQSxFQUFXLENBQVg7eUJBRks7cUJBbEJBO29CQXVCVCxTQUFBLEVBQVc7d0JBQ1QsS0FBQSxFQUFPOzRCQUNMLFNBQUEsRUFBVyxDQUROOzRCQUVMLFNBQUEsRUFBVyxDQUFYO3lCQUhPO3dCQUtULGVBQUEsRUFBaUI7NEJBQ2YsU0FBQSxFQUFXLENBREk7NEJBRWYsU0FBQSxFQUFXLENBQVg7eUJBRmU7cUJBNUJWO29CQWlDVCxNQUFBLEVBQVE7d0JBQ04sT0FBQSxFQUFTOzRCQUNQLFNBQUEsRUFBVyxDQURKOzRCQUVQLFNBQUEsRUFBVyxDQUFYO3lCQUhJO3dCQUtOLEtBQUEsRUFBTzs0QkFDTCxTQUFBLEVBQVcsQ0FETjs0QkFFTCxTQUFBLEVBQVcsQ0FBWDt5QkFQSTt3QkFTTixlQUFBLEVBQWlCOzRCQUNmLFNBQUEsRUFBVyxDQURJOzRCQUVmLFNBQUEsRUFBVyxDQUFYO3lCQVhJO3dCQWFOLFFBQUEsRUFBVTs0QkFDUixTQUFBLEVBQVcsQ0FESDs0QkFFUixTQUFBLEVBQVcsQ0FBWDt5QkFmSTt3QkFpQk4sS0FBQSxFQUFPOzRCQUNMLFNBQUEsRUFBVyxDQUROOzRCQUVMLFNBQUEsRUFBVyxDQUFYO3lCQUZLO3FCQWpCRDtpQkF0ZlE7Z0JBNmdCbEIsTUFBQSxFQUFRO29CQUNOLG1CQUFBLEVBQXFCO3dCQUNuQixTQUFBLEVBQVcsQ0FEUTt3QkFFbkIsU0FBQSxFQUFXLENBQVg7cUJBSEk7b0JBS04sUUFBQSxFQUFVO3dCQUNSLFNBQUEsRUFBVyxDQURIO3dCQUVSLFNBQUEsRUFBVyxDQUFYO3FCQVBJO29CQVNOLGdCQUFBLEVBQWtCO3dCQUNoQixTQUFBLEVBQVcsQ0FESzt3QkFFaEIsU0FBQSxFQUFXLENBQVg7cUJBWEk7b0JBYU4sU0FBQSxFQUFXO3dCQUNULFNBQUEsRUFBVyxDQURGO3dCQUVULFNBQUEsRUFBVyxDQUFYO3FCQWZJO29CQWlCTixXQUFBLEVBQWE7d0JBQ1gsU0FBQSxFQUFXLENBREE7d0JBRVgsU0FBQSxFQUFXLENBQVg7cUJBbkJJO29CQXFCTixlQUFBLEVBQWlCO3dCQUNmLFNBQUEsRUFBVyxDQURJO3dCQUVmLFNBQUEsRUFBVyxDQUFYO3FCQXZCSTtvQkF5Qk4sS0FBQSxFQUFPO3dCQUNMLFNBQUEsRUFBVyxDQUROO3dCQUVMLFNBQUEsRUFBVyxDQUFYO3FCQTNCSTtvQkE2Qk4sWUFBQSxFQUFjO3dCQUNaLFNBQUEsRUFBVyxDQURDO3dCQUVaLFNBQUEsRUFBVyxDQUFYO3FCQS9CSTtvQkFpQ04sU0FBQSxFQUFXO3dCQUNULFNBQUEsRUFBVyxDQURGO3dCQUVULFNBQUEsRUFBVyxDQUFYO3FCQW5DSTtvQkFxQ04saUJBQUEsRUFBbUI7d0JBQ2pCLFNBQUEsRUFBVyxDQURNO3dCQUVqQixTQUFBLEVBQVcsQ0FBWDtxQkF2Q0k7b0JBeUNOLFFBQUEsRUFBVTt3QkFDUixTQUFBLEVBQVcsQ0FESDt3QkFFUixTQUFBLEVBQVcsQ0FBWDtxQkEzQ0k7b0JBNkNOLFdBQUEsRUFBYTt3QkFDWCxTQUFBLEVBQVcsQ0FEQTt3QkFFWCxTQUFBLEVBQVcsQ0FBWDtxQkEvQ0k7b0JBaUROLFdBQUEsRUFBYTt3QkFDWCxTQUFBLEVBQVcsQ0FEQTt3QkFFWCxTQUFBLEVBQVcsQ0FBWDtxQkFuREk7b0JBcUROLFdBQUEsRUFBYTt3QkFDWCxTQUFBLEVBQVcsQ0FEQTt3QkFFWCxTQUFBLEVBQVcsQ0FBWDtxQkF2REk7b0JBeUROLE1BQUEsRUFBUTt3QkFDTixTQUFBLEVBQVcsQ0FETDt3QkFFTixTQUFBLEVBQVcsQ0FBWDtxQkEzREk7b0JBNkROLE9BQUEsRUFBUzt3QkFDUCxTQUFBLEVBQVcsQ0FESjt3QkFFUCxTQUFBLEVBQVcsQ0FBWDtxQkEvREk7b0JBaUVOLFFBQUEsRUFBVTt3QkFDUixTQUFBLEVBQVcsQ0FESDt3QkFFUixTQUFBLEVBQVcsQ0FBWDtxQkFuRUk7b0JBcUVOLFFBQUEsRUFBVTt3QkFDUixTQUFBLEVBQVcsQ0FESDt3QkFFUixTQUFBLEVBQVcsQ0FBWDtxQkF2RUk7b0JBeUVOLFdBQUEsRUFBYTt3QkFDWCxTQUFBLEVBQVcsQ0FEQTt3QkFFWCxTQUFBLEVBQVcsQ0FBWDtxQkEzRUk7b0JBNkVOLGFBQUEsRUFBZTt3QkFDYixTQUFBLEVBQVcsQ0FERTt3QkFFYixTQUFBLEVBQVcsQ0FBWDtxQkEvRUk7b0JBaUZOLFNBQUEsRUFBVzt3QkFDVCxTQUFBLEVBQVcsQ0FERjt3QkFFVCxTQUFBLEVBQVcsQ0FBWDtxQkFuRkk7b0JBcUZOLGlCQUFBLEVBQW1CO3dCQUNqQixTQUFBLEVBQVcsQ0FETTt3QkFFakIsU0FBQSxFQUFXLENBQVg7cUJBdkZJO29CQXlGTixRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBRlE7aUJBdG1CTTtnQkEybUJsQixVQUFBLEVBQVk7b0JBQ1YsS0FBQSxFQUFPO3dCQUNMLFNBQUEsRUFBVyxDQUROO3dCQUVMLFNBQUEsRUFBVyxDQUFYO3FCQUZLO2lCQTVtQlM7Z0JBaW5CbEIsZUFBQSxFQUFpQjtvQkFDZixjQUFBLEVBQWdCO3dCQUNkLFNBQUEsRUFBVyxDQURHO3dCQUVkLFNBQUEsRUFBVyxDQUFYO3FCQUhhO29CQUtmLFVBQUEsRUFBWTt3QkFDVixTQUFBLEVBQVcsQ0FERDt3QkFFVixTQUFBLEVBQVcsQ0FBWDtxQkFGVTtpQkF0bkJJO2dCQTJuQmxCLFlBQUEsRUFBYztvQkFDWix3QkFBQSxFQUEwQjt3QkFDeEIsU0FBQSxFQUFXLENBRGE7d0JBRXhCLFNBQUEsRUFBVyxDQUFYO3FCQUZ3QjtpQkE1bkJWO2dCQWlvQmxCLFNBQUEsRUFBVztvQkFDVCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBSE87b0JBS1QsS0FBQSxFQUFPO3dCQUNMLFNBQUEsRUFBVyxDQUROO3dCQUVMLFNBQUEsRUFBVyxDQUFYO3FCQVBPO29CQVNULFFBQUEsRUFBVTt3QkFDUixTQUFBLEVBQVcsQ0FESDt3QkFFUixTQUFBLEVBQVcsQ0FBWDtxQkFYTztvQkFhVCxZQUFBLEVBQWM7d0JBQ1osU0FBQSxFQUFXLENBREM7d0JBRVosU0FBQSxFQUFXLENBQVg7cUJBZk87b0JBaUJULGdCQUFBLEVBQWtCO3dCQUNoQixTQUFBLEVBQVcsQ0FESzt3QkFFaEIsU0FBQSxFQUFXLENBQVg7cUJBbkJPO29CQXFCVCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBdkJPO29CQXlCVCxRQUFBLEVBQVU7d0JBQ1IsU0FBQSxFQUFXLENBREg7d0JBRVIsU0FBQSxFQUFXLENBQVg7cUJBRlE7aUJBekJEO2FBam9CYixBQUFvQjtZQWlxQnBCLElBQUlQLE1BQU0sQ0FBQ1EsSUFBUCxDQUFZRCxXQUFaLENBQUEsQ0FBeUJFLE1BQXpCLEtBQW9DLENBQXhDLEVBQ0UsTUFBTSxJQUFJVixLQUFKLENBQVUsNkRBQVYsQ0FBTixDQUFBO1lBR0Y7Ozs7Ozs7OztTQVNKLENBQ0ksTUFBTVcsY0FBTixTQUE2QkMsT0FBN0I7Z0JBQ0VDLFlBQVlDLFVBQUQsRUFBYUMsS0FBSyxBQUFsQixDQUFnQztvQkFDekMsS0FBQSxDQUFNQSxLQUFOLENBQUEsQ0FBQTtvQkFDQSxJQUFBLENBQUtELFVBQUwsR0FBa0JBLFVBQWxCLENBQUE7aUJBQ0Q7Z0JBRURHLEdBQUcsQ0FBQ0MsR0FBRCxFQUFNO29CQUNQLElBQUksQ0FBQyxJQUFBLENBQUtDLEdBQUwsQ0FBU0QsR0FBVCxDQUFMLEVBQ0UsSUFBQSxDQUFLRSxHQUFMLENBQVNGLEdBQVQsRUFBYyxJQUFBLENBQUtKLFVBQUwsQ0FBZ0JJLEdBQWhCLENBQWQsQ0FBQSxDQUFBO29CQUdGLE9BQU8sS0FBQSxDQUFNRCxHQUFOLENBQVVDLEdBQVYsQ0FBUCxDQUFBO2lCQUNEO2FBWmtDO1lBZXJDOzs7Ozs7U0FNSixDQUNJLE1BQU1HLFVBQVUsR0FBR0MsQ0FBQUEsS0FBSyxHQUFJO2dCQUMxQixPQUFPQSxLQUFLLElBQUksT0FBT0EsS0FBUCxLQUFpQixRQUExQixJQUFzQyxPQUFPQSxLQUFLLENBQUNDLElBQWIsS0FBc0IsVUFBbkUsQ0FBQTthQURGLEFBRUM7WUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBOEJKLENBQ0ksTUFBTUMsWUFBWSxHQUFHLENBQUNDLE9BQUQsRUFBVUMsUUFBVixHQUF1QjtnQkFDMUMsT0FBTyxDQUFJQyxHQUFBQSxZQUFKLEdBQXFCO29CQUMxQixJQUFJcEIsYUFBYSxDQUFDeEQsT0FBZCxDQUFzQjZFLFNBQTFCLEVBQ0VILE9BQU8sQ0FBQ0ksTUFBUixDQUFlLElBQUk3QixLQUFKLENBQVVPLGFBQWEsQ0FBQ3hELE9BQWQsQ0FBc0I2RSxTQUF0QixDQUFnQ0UsT0FBMUMsQ0FBZixDQUFBTCxDQUFBQTt5QkFDSyxJQUFJQyxRQUFRLENBQUNLLGlCQUFULElBQ0NKLFlBQVksQ0FBQ2pCLE1BQWIsSUFBdUIsQ0FBdkIsSUFBNEJnQixRQUFRLENBQUNLLGlCQUFULEtBQStCLEtBRGhFLEVBRUxOLE9BQU8sQ0FBQ08sT0FBUixDQUFnQkwsWUFBWSxDQUFDLENBQUQsQ0FBNUIsQ0FBQUYsQ0FBQUE7eUJBRUFBLE9BQU8sQ0FBQ08sT0FBUixDQUFnQkwsWUFBaEIsQ0FBQUYsQ0FBQUE7aUJBUEosQ0FTQzthQVZILEFBV0M7WUFFRCxNQUFNUSxrQkFBa0IsR0FBSUMsQ0FBQUEsT0FBRCxHQUFhQSxPQUFPLElBQUksQ0FBWCxHQUFlLFVBQWYsR0FBNEIsV0FBcEU7WUFBQTtZQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBeUJKLENBQ0ksTUFBTUMsaUJBQWlCLEdBQUcsQ0FBQzlDLElBQUQsRUFBT3FDLFFBQVAsR0FBb0I7Z0JBQzVDLE9BQU8sU0FBU1Usb0JBQVQsQ0FBOEJDLE1BQTlCLEVBQXNDLEdBQUdDLElBQXpDLEVBQStDO29CQUNwRCxJQUFJQSxJQUFJLENBQUM1QixNQUFMLEdBQWNnQixRQUFRLENBQUNhLE9BQTNCLEVBQ0UsTUFBTSxJQUFJdkMsS0FBSixDQUFXLENBQUEsa0JBQUEsRUFBb0IwQixRQUFRLENBQUNhLE9BQVEsQ0FBQSxDQUFBLEVBQUdOLGtCQUFrQixDQUFDUCxRQUFRLENBQUNhLE9BQVYsQ0FBbUIsQ0FBQSxLQUFBLEVBQU9sRCxJQUFLLENBQUEsUUFBQSxFQUFVaUQsSUFBSSxDQUFDNUIsTUFBTyxDQUFBLENBQTFILENBQU4sQ0FBQTtvQkFHRixJQUFJNEIsSUFBSSxDQUFDNUIsTUFBTCxHQUFjZ0IsUUFBUSxDQUFDYyxPQUEzQixFQUNFLE1BQU0sSUFBSXhDLEtBQUosQ0FBVyxDQUFBLGlCQUFBLEVBQW1CMEIsUUFBUSxDQUFDYyxPQUFRLENBQUEsQ0FBQSxFQUFHUCxrQkFBa0IsQ0FBQ1AsUUFBUSxDQUFDYyxPQUFWLENBQW1CLENBQUEsS0FBQSxFQUFPbkQsSUFBSyxDQUFBLFFBQUEsRUFBVWlELElBQUksQ0FBQzVCLE1BQU8sQ0FBQSxDQUF6SCxDQUFOLENBQUE7b0JBR0YsT0FBTyxJQUFJK0IsT0FBSixDQUFZLENBQUNULE9BQUQsRUFBVUgsTUFBVixHQUFxQjt3QkFDdEMsSUFBSUgsUUFBUSxDQUFDZ0Isb0JBQWIsRUFDRSwyRkFBQTt3QkFDQSxzRkFBQTt3QkFDQSx1REFBQTt3QkFDQSxJQUFJOzRCQUNGTCxNQUFNLENBQUNoRCxJQUFELENBQU4sSUFBZ0JpRCxJQUFoQixFQUFzQmQsWUFBWSxDQUFDO2dDQUFDUSxPQUFEO2dDQUFVSCxNQUFBQTs2QkFBWCxFQUFvQkgsUUFBcEIsQ0FBbEMsQ0FBbUMsQ0FBQTt5QkFEckMsQ0FFRSxPQUFPaUIsT0FBUCxFQUFnQjs0QkFDaEJDLE9BQU8sQ0FBQ0MsSUFBUixDQUFjLENBQUEsRUFBRXhELElBQUssQ0FBQSw0REFBQSxDQUFSLEdBQ0EsOENBRGIsRUFDNkRzRCxPQUQ3RCxDQUFBQyxDQUFBQTs0QkFHQVAsTUFBTSxDQUFDaEQsSUFBRCxDQUFOLElBQWdCaUQsSUFBaEIsQ0FBQSxDQUpnQixDQU1oQiw2RUFGQUQ7NEJBR0Esd0NBQUE7NEJBQ0FYLFFBQVEsQ0FBQ2dCLG9CQUFULEdBQWdDLEtBQWhDLENBQUFoQjs0QkFDQUEsUUFBUSxDQUFDb0IsVUFBVCxHQUFzQixJQUF0QixDQUFBcEI7NEJBRUFNLE9BQU8sRUFBUEEsQ0FBQUE7eUJBQ0Q7NkJBQ0ksSUFBSU4sUUFBUSxDQUFDb0IsVUFBYixFQUF5Qjs0QkFDOUJULE1BQU0sQ0FBQ2hELElBQUQsQ0FBTixJQUFnQmlELElBQWhCLENBQUFELENBQUFBOzRCQUNBTCxPQUFPLEVBQVBBLENBQUFBO3lCQUZLLE1BSUxLLE1BQU0sQ0FBQ2hELElBQUQsQ0FBTixJQUFnQmlELElBQWhCLEVBQXNCZCxZQUFZLENBQUM7NEJBQUNRLE9BQUQ7NEJBQVVILE1BQUFBO3lCQUFYLEVBQW9CSCxRQUFwQixDQUFsQyxDQUFtQyxDQUFBO3FCQXhCaEMsQ0FBUCxDQTBCQztpQkFuQ0gsQ0FvQ0M7YUFyQ0gsQUFzQ0M7WUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBa0JKLENBQ0ksTUFBTXFCLFVBQVUsR0FBRyxDQUFDVixNQUFELEVBQVNXLE1BQVQsRUFBaUJDLE9BQWpCLEdBQTZCO2dCQUM5QyxPQUFPLElBQUlDLEtBQUosQ0FBVUYsTUFBVixFQUFrQjtvQkFDdkJHLEtBQUssRUFBQ0MsWUFBRCxFQUFlQyxPQUFmLEVBQXdCZixJQUF4QixFQUE4Qjt3QkFDakMsT0FBT1csT0FBTyxDQUFDSyxJQUFSLENBQWFELE9BQWIsRUFBc0JoQixNQUF0QixLQUFpQ0MsSUFBakMsQ0FBUCxDQUFBO3FCQUNEO2lCQUhJLENBQVAsQ0FBeUI7YUFEM0IsQUFNQztZQUVELElBQUlpQixjQUFjLEdBQUdDLFFBQVEsQ0FBQ0YsSUFBVCxDQUFjRyxJQUFkLENBQW1CeEQsTUFBTSxDQUFDRSxTQUFQLENBQWlCb0QsY0FBcEMsQ0FBckIsQUFBQTtZQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBc0JKLENBQ0ksTUFBTUcsVUFBVSxHQUFHLENBQUNyQixNQUFELEVBQVNzQixRQUFRLEdBQUcsRUFBcEIsRUFBd0JqQyxRQUFRLEdBQUcsRUFBbkMsR0FBMEM7Z0JBQzNELElBQUlrQyxLQUFLLEdBQUczRCxNQUFNLENBQUM3QyxNQUFQLENBQWMsSUFBZCxDQUFaLEFBQUE7Z0JBQ0EsSUFBSXlHLFFBQVEsR0FBRztvQkFDYjFDLEdBQUcsRUFBQzJDLFdBQUQsRUFBY0MsSUFBZCxFQUFvQjt3QkFDckIsT0FBT0EsSUFBSSxJQUFJMUIsTUFBUixJQUFrQjBCLElBQUksSUFBSUgsS0FBakMsQ0FBQTtxQkFGVztvQkFLYjNDLEdBQUcsRUFBQzZDLFdBQUQsRUFBY0MsSUFBZCxFQUFvQkMsUUFBcEIsRUFBOEI7d0JBQy9CLElBQUlELElBQUksSUFBSUgsS0FBWixFQUNFLE9BQU9BLEtBQUssQ0FBQ0csSUFBRCxDQUFaLENBQUE7d0JBR0YsSUFBSSxDQUFFQSxDQUFBQSxJQUFJLElBQUkxQixNQUFWLENBQUEsQUFBSixFQUNFLE9BQU9yQixTQUFQLENBQUE7d0JBR0YsSUFBSU0sTUFBSyxHQUFHZSxNQUFNLENBQUMwQixJQUFELENBQWxCLEFBQUE7d0JBRUEsSUFBSSxPQUFPekMsTUFBUCxLQUFpQixVQUFyQixFQUFpQzs0QkFDL0Isb0VBQUE7NEJBQ0EsZ0JBQUE7NEJBRUEsSUFBSSxPQUFPcUMsUUFBUSxDQUFDSSxJQUFELENBQWYsS0FBMEIsVUFBOUIsRUFDRSxrREFBQTs0QkFDQXpDLE1BQUssR0FBR3lCLFVBQVUsQ0FBQ1YsTUFBRCxFQUFTQSxNQUFNLENBQUMwQixJQUFELENBQWYsRUFBdUJKLFFBQVEsQ0FBQ0ksSUFBRCxDQUEvQixDQUFsQixDQUFBekM7aUNBQ0ssSUFBSWlDLGNBQWMsQ0FBQzdCLFFBQUQsRUFBV3FDLElBQVgsQ0FBbEIsRUFBb0M7Z0NBQ3pDLDhEQUFBO2dDQUNBLDBCQUFBO2dDQUNBLElBQUlkLE9BQU8sR0FBR2QsaUJBQWlCLENBQUM0QixJQUFELEVBQU9yQyxRQUFRLENBQUNxQyxJQUFELENBQWYsQ0FBL0IsQUFBQTtnQ0FDQXpDLE1BQUssR0FBR3lCLFVBQVUsQ0FBQ1YsTUFBRCxFQUFTQSxNQUFNLENBQUMwQixJQUFELENBQWYsRUFBdUJkLE9BQXZCLENBQWxCLENBQUEzQjs2QkFKSyxNQU1MLGdFQUFBOzRCQUNBLG1EQUFBOzRCQUNBQSxNQUFLLEdBQUdBLE1BQUssQ0FBQ21DLElBQU4sQ0FBV3BCLE1BQVgsQ0FBUixDQUFBZjt5QkFmSixNQWlCTyxJQUFJLE9BQU9BLE1BQVAsS0FBaUIsUUFBakIsSUFBNkJBLE1BQUssS0FBSyxJQUF2QyxJQUNDaUMsQ0FBQUEsY0FBYyxDQUFDSSxRQUFELEVBQVdJLElBQVgsQ0FBZCxJQUNBUixjQUFjLENBQUM3QixRQUFELEVBQVdxQyxJQUFYLENBRmYsQ0FBQSxBQUFKLEVBR0wsc0VBQUE7d0JBQ0Esb0VBQUE7d0JBQ0EsWUFBQTt3QkFDQXpDLE1BQUssR0FBR29DLFVBQVUsQ0FBQ3BDLE1BQUQsRUFBUXFDLFFBQVEsQ0FBQ0ksSUFBRCxDQUFoQixFQUF3QnJDLFFBQVEsQ0FBQ3FDLElBQUQsQ0FBaEMsQ0FBbEIsQ0FBQXpDOzZCQUNLLElBQUlpQyxjQUFjLENBQUM3QixRQUFELEVBQVcsR0FBWCxDQUFsQixFQUNMLHNDQUFBO3dCQUNBSixNQUFLLEdBQUdvQyxVQUFVLENBQUNwQyxNQUFELEVBQVFxQyxRQUFRLENBQUNJLElBQUQsQ0FBaEIsRUFBd0JyQyxRQUFRLENBQUMsR0FBRCxDQUFoQyxDQUFsQixDQUFBSjs2QkFDSzs0QkFDTCxzREFBQTs0QkFDQSx1REFBQTs0QkFDQXJCLE1BQU0sQ0FBQ2dFLGNBQVAsQ0FBc0JMLEtBQXRCLEVBQTZCRyxJQUE3QixFQUFtQztnQ0FDakNHLFlBQVksRUFBRSxJQURtQjtnQ0FFakNDLFVBQVUsRUFBRSxJQUZxQjtnQ0FHakNsRCxHQUFHLElBQUc7b0NBQ0osT0FBT29CLE1BQU0sQ0FBQzBCLElBQUQsQ0FBYixDQUFBO2lDQUorQjtnQ0FNakMzQyxHQUFHLEVBQUNFLEtBQUQsRUFBUTtvQ0FDVGUsTUFBTSxDQUFDMEIsSUFBRCxDQUFOLEdBQWV6QyxLQUFmLENBQUFlO2lDQUNEOzZCQVJILENBQW1DLENBQUE7NEJBV25DLE9BQU9mLE1BQVAsQ0FBQTt5QkFDRDt3QkFFRHNDLEtBQUssQ0FBQ0csSUFBRCxDQUFMLEdBQWN6QyxNQUFkLENBQUFzQzt3QkFDQSxPQUFPdEMsTUFBUCxDQUFBO3FCQTdEVztvQkFnRWJGLEdBQUcsRUFBQzBDLFdBQUQsRUFBY0MsSUFBZCxFQUFvQnpDLEtBQXBCLEVBQTJCMEMsUUFBM0IsRUFBcUM7d0JBQ3RDLElBQUlELElBQUksSUFBSUgsS0FBWixFQUNFQSxLQUFLLENBQUNHLElBQUQsQ0FBTCxHQUFjekMsS0FBZCxDQUFBc0M7NkJBRUF2QixNQUFNLENBQUMwQixJQUFELENBQU4sR0FBZXpDLEtBQWYsQ0FBQWU7d0JBRUYsT0FBTyxJQUFQLENBQUE7cUJBdEVXO29CQXlFYjRCLGNBQWMsRUFBQ0gsV0FBRCxFQUFjQyxJQUFkLEVBQW9CSyxJQUFwQixFQUEwQjt3QkFDdEMsT0FBT0MsT0FBTyxDQUFDSixjQUFSLENBQXVCTCxLQUF2QixFQUE4QkcsSUFBOUIsRUFBb0NLLElBQXBDLENBQVAsQ0FBQTtxQkExRVc7b0JBNkViRSxjQUFjLEVBQUNSLFdBQUQsRUFBY0MsSUFBZCxFQUFvQjt3QkFDaEMsT0FBT00sT0FBTyxDQUFDQyxjQUFSLENBQXVCVixLQUF2QixFQUE4QkcsSUFBOUIsQ0FBUCxDQUFBO3FCQUNEO2lCQS9FSCxBQUYyRCxFQW9GM0QseUVBbEZlO2dCQW1GZix1RUFBQTtnQkFDQSxrRUFBQTtnQkFDQSxnRUFBQTtnQkFDQSwyREFBQTtnQkFDQSwwRUFBQTtnQkFDQSxFQUFBO2dCQUNBLHFFQUFBO2dCQUNBLHVFQUFBO2dCQUNBLHlDQUFBO2dCQUNBLElBQUlELFdBQVcsR0FBRzdELE1BQU0sQ0FBQzdDLE1BQVAsQ0FBY2lGLE1BQWQsQ0FBbEIsQUFBQTtnQkFDQSxPQUFPLElBQUlhLEtBQUosQ0FBVVksV0FBVixFQUF1QkQsUUFBdkIsQ0FBUCxDQUFBO2FBL0ZGLEFBZ0dDO1lBRUQ7Ozs7Ozs7Ozs7Ozs7OztTQWVKLENBQ0ksTUFBTVUsU0FBUyxHQUFHQyxDQUFBQSxVQUFVLEdBQUssQ0FBQTtvQkFDL0IxSCxXQUFXLEVBQUN1RixNQUFELEVBQVNvQyxRQUFULEVBQW1CLEdBQUduQyxJQUF0QixFQUE0Qjt3QkFDckNELE1BQU0sQ0FBQ3ZGLFdBQVAsQ0FBbUIwSCxVQUFVLENBQUN2RCxHQUFYLENBQWV3RCxRQUFmLENBQW5CLEtBQWdEbkMsSUFBaEQsQ0FBQUQsQ0FBQUE7cUJBRjZCO29CQUsvQnFDLFdBQVcsRUFBQ3JDLE1BQUQsRUFBU29DLFFBQVQsRUFBbUI7d0JBQzVCLE9BQU9wQyxNQUFNLENBQUNxQyxXQUFQLENBQW1CRixVQUFVLENBQUN2RCxHQUFYLENBQWV3RCxRQUFmLENBQW5CLENBQVAsQ0FBQTtxQkFONkI7b0JBUy9CRSxjQUFjLEVBQUN0QyxNQUFELEVBQVNvQyxRQUFULEVBQW1CO3dCQUMvQnBDLE1BQU0sQ0FBQ3NDLGNBQVAsQ0FBc0JILFVBQVUsQ0FBQ3ZELEdBQVgsQ0FBZXdELFFBQWYsQ0FBdEIsQ0FBQXBDLENBQUFBO3FCQUNEO2lCQVh5QixDQUFBO1lBQUs7WUFjakMsTUFBTXVDLHlCQUF5QixHQUFHLElBQUlqRSxjQUFKLENBQW1COEQsQ0FBQUEsUUFBUSxHQUFJO2dCQUMvRCxJQUFJLE9BQU9BLFFBQVAsS0FBb0IsVUFBeEIsRUFDRSxPQUFPQSxRQUFQLENBQUE7Z0JBR0Y7Ozs7Ozs7V0FPTixDQUNNLE9BQU8sU0FBU0ksaUJBQVQsQ0FBMkJDLEdBQTNCLEVBQWdDO29CQUNyQyxNQUFNQyxVQUFVLEdBQUdyQixVQUFVLENBQUNvQixHQUFELEVBQU0sRUFBbkMsRUFBc0Q7d0JBQ3BERSxVQUFVLEVBQUU7NEJBQ1Z6QyxPQUFPLEVBQUUsQ0FEQzs0QkFFVkMsT0FBTyxFQUFFLENBQVRBO3lCQUZVO3FCQURlLENBQTdCLEFBQXNEO29CQU10RGlDLFFBQVEsQ0FBQ00sVUFBRCxDQUFSLENBQUFOO2lCQVBGLENBUUM7YUFyQitCLENBQWxDLEFBai9CZ0MsRUF5Z0NoQyx1RUFGQztZQUdELElBQUlRLG9DQUFvQyxHQUFHLEtBQTNDLEFBQUE7WUFFQSxNQUFNQyxpQkFBaUIsR0FBRyxJQUFJdkUsY0FBSixDQUFtQjhELENBQUFBLFFBQVEsR0FBSTtnQkFDdkQsSUFBSSxPQUFPQSxRQUFQLEtBQW9CLFVBQXhCLEVBQ0UsT0FBT0EsUUFBUCxDQUFBO2dCQUdGOzs7Ozs7Ozs7Ozs7Ozs7O1dBZ0JOLENBQ00sT0FBTyxTQUFTVSxTQUFULENBQW1CckQsUUFBbkIsRUFBNEJzRCxNQUE1QixFQUFvQ0MsWUFBcEMsRUFBa0Q7b0JBQ3ZELElBQUlDLG1CQUFtQixHQUFHLEtBQTFCLEFBQUE7b0JBRUEsSUFBSUMsbUJBQUosQUFBQTtvQkFDQSxJQUFJQyxtQkFBbUIsR0FBRyxJQUFJL0MsT0FBSixDQUFZVCxDQUFBQSxPQUFPLEdBQUk7d0JBQy9DdUQsbUJBQW1CLEdBQUcsU0FBU0UsUUFBVCxFQUFtQjs0QkFDdkMsSUFBSSxDQUFDUixvQ0FBTCxFQUEyQztnQ0FDekNyQyxPQUFPLENBQUNDLElBQVIsQ0FBYXhDLGlDQUFiLEVBQWdELElBQUlMLEtBQUosRUFBQSxDQUFZMEYsS0FBNUQsQ0FBQTlDLENBQUFBO2dDQUNBcUMsb0NBQW9DLEdBQUcsSUFBdkMsQ0FBQUE7NkJBQ0Q7NEJBQ0RLLG1CQUFtQixHQUFHLElBQXRCLENBQUFBOzRCQUNBdEQsT0FBTyxDQUFDeUQsUUFBRCxDQUFQLENBQUF6RDt5QkFORixDQU9DO3FCQVJ1QixDQUExQixBQVNDO29CQUVELElBQUkyRCxNQUFKLEFBQUE7b0JBQ0EsSUFBSTt3QkFDRkEsTUFBTSxHQUFHbEIsUUFBUSxDQUFDM0MsUUFBRCxFQUFVc0QsTUFBVixFQUFrQkcsbUJBQWxCLENBQWpCLENBQUFJO3FCQURGLENBRUUsT0FBT0MsSUFBUCxFQUFZO3dCQUNaRCxNQUFNLEdBQUdsRCxPQUFPLENBQUNaLE1BQVIsQ0FBZStELElBQWYsQ0FBVCxDQUFBRDtxQkFDRDtvQkFFRCxNQUFNRSxnQkFBZ0IsR0FBR0YsTUFBTSxLQUFLLElBQVgsSUFBbUJ0RSxVQUFVLENBQUNzRSxNQUFELENBQXRELEFBdEJ1RCxFQXdCdkQsK0RBRkE7b0JBR0EseURBQUE7b0JBQ0EsNkRBQUE7b0JBQ0EsSUFBSUEsTUFBTSxLQUFLLElBQVgsSUFBbUIsQ0FBQ0UsZ0JBQXBCLElBQXdDLENBQUNQLG1CQUE3QyxFQUNFLE9BQU8sS0FBUCxDQUFBO29CQTVCcUQsQ0ErQnZELDZEQUZDO29CQUdELGlFQUFBO29CQUNBLGlFQUFBO29CQUNBLFlBQUE7b0JBQ0EsTUFBTVEsa0JBQWtCLEdBQUlyRSxDQUFBQSxPQUFELEdBQWE7d0JBQ3RDQSxPQUFPLENBQUNGLElBQVIsQ0FBYXdFLENBQUFBLEdBQUcsR0FBSTs0QkFDbEIsMEJBQUE7NEJBQ0FWLFlBQVksQ0FBQ1UsR0FBRCxDQUFaLENBQUFWO3lCQUZGLEVBR0dXLENBQUFBLEtBQUssR0FBSTs0QkFDVixnRUFBQTs0QkFDQSwyREFBQTs0QkFDQSxJQUFJbEUsT0FBSixBQUFBOzRCQUNBLElBQUlrRSxLQUFLLElBQUtBLENBQUFBLEtBQUssWUFBWWhHLEtBQWpCLElBQ1YsT0FBT2dHLEtBQUssQ0FBQ2xFLE9BQWIsS0FBeUIsUUFEcEIsQ0FBQSxBQUFULEVBRUVBLE9BQU8sR0FBR2tFLEtBQUssQ0FBQ2xFLE9BQWhCLENBQUFBO2lDQUVBQSxPQUFPLEdBQUcsOEJBQVYsQ0FBQUE7NEJBR0Z1RCxZQUFZLENBQUM7Z0NBQ1hZLGlDQUFpQyxFQUFFLElBRHhCO2dDQUVYbkUsT0FBQUE7NkJBRlUsQ0FBWixDQUFhO3lCQWRmLENBQUEsQ0FrQkdvRSxLQWxCSCxDQWtCU04sQ0FBQUEsR0FBRyxHQUFJOzRCQUNkLGdFQUFBOzRCQUNBaEQsT0FBTyxDQUFDb0QsS0FBUixDQUFjLHlDQUFkLEVBQXlESixHQUF6RCxDQUFBaEQsQ0FBQUE7eUJBcEJGLENBcUJDLENBQUE7cUJBdEJILEFBbkN1RCxFQTREdkQsbUVBRkM7b0JBR0Qsd0VBQUE7b0JBQ0EsaURBQUE7b0JBQ0EsSUFBSWlELGdCQUFKLEVBQ0VDLGtCQUFrQixDQUFDSCxNQUFELENBQWxCLENBQUFHO3lCQUVBQSxrQkFBa0IsQ0FBQ04sbUJBQUQsQ0FBbEIsQ0FBQU07b0JBbEVxRCxDQXFFdkQsaURBRkM7b0JBR0QsT0FBTyxJQUFQLENBQUE7aUJBdEVGLENBdUVDO2FBN0Z1QixDQUExQixBQThGQztZQUVELE1BQU1LLDBCQUEwQixHQUFHLENBQUMsRUFBQ3RFLE1BQUQsQ0FBQSxFQUFTRyxPQUFBQSxDQUFBQSxFQUFWLEVBQW9Cb0UsS0FBcEIsR0FBOEI7Z0JBQy9ELElBQUk3RixhQUFhLENBQUN4RCxPQUFkLENBQXNCNkUsU0FBMUI7b0JBQ0UsZ0ZBQUE7b0JBQ0EsMENBQUE7b0JBQ0Esa0VBQUE7b0JBQ0EsSUFBSXJCLGFBQWEsQ0FBQ3hELE9BQWQsQ0FBc0I2RSxTQUF0QixDQUFnQ0UsT0FBaEMsS0FBNEMxQixnREFBaEQsRUFDRTRCLE9BQU8sRUFBUEEsQ0FBQUE7eUJBRUFILE1BQU0sQ0FBQyxJQUFJN0IsS0FBSixDQUFVTyxhQUFhLENBQUN4RCxPQUFkLENBQXNCNkUsU0FBdEIsQ0FBZ0NFLE9BQTFDLENBQUQsQ0FBTixDQUFBRDt1QkFFRyxJQUFJdUUsS0FBSyxJQUFJQSxLQUFLLENBQUNILGlDQUFuQixFQUNMLHlEQUFBO2dCQUNBLHFCQUFBO2dCQUNBcEUsTUFBTSxDQUFDLElBQUk3QixLQUFKLENBQVVvRyxLQUFLLENBQUN0RSxPQUFoQixDQUFELENBQU4sQ0FBQUQ7cUJBRUFHLE9BQU8sQ0FBQ29FLEtBQUQsQ0FBUCxDQUFBcEU7YUFmSixBQWlCQztZQUVELE1BQU1xRSxrQkFBa0IsR0FBRyxDQUFDaEgsSUFBRCxFQUFPcUMsUUFBUCxFQUFpQjRFLGVBQWpCLEVBQXFDaEUsR0FBQUEsSUFBckMsR0FBOEM7Z0JBQ3ZFLElBQUlBLElBQUksQ0FBQzVCLE1BQUwsR0FBY2dCLFFBQVEsQ0FBQ2EsT0FBM0IsRUFDRSxNQUFNLElBQUl2QyxLQUFKLENBQVcsQ0FBQSxrQkFBQSxFQUFvQjBCLFFBQVEsQ0FBQ2EsT0FBUSxDQUFBLENBQUEsRUFBR04sa0JBQWtCLENBQUNQLFFBQVEsQ0FBQ2EsT0FBVixDQUFtQixDQUFBLEtBQUEsRUFBT2xELElBQUssQ0FBQSxRQUFBLEVBQVVpRCxJQUFJLENBQUM1QixNQUFPLENBQUEsQ0FBMUgsQ0FBTixDQUFBO2dCQUdGLElBQUk0QixJQUFJLENBQUM1QixNQUFMLEdBQWNnQixRQUFRLENBQUNjLE9BQTNCLEVBQ0UsTUFBTSxJQUFJeEMsS0FBSixDQUFXLENBQUEsaUJBQUEsRUFBbUIwQixRQUFRLENBQUNjLE9BQVEsQ0FBQSxDQUFBLEVBQUdQLGtCQUFrQixDQUFDUCxRQUFRLENBQUNjLE9BQVYsQ0FBbUIsQ0FBQSxLQUFBLEVBQU9uRCxJQUFLLENBQUEsUUFBQSxFQUFVaUQsSUFBSSxDQUFDNUIsTUFBTyxDQUFBLENBQXpILENBQU4sQ0FBQTtnQkFHRixPQUFPLElBQUkrQixPQUFKLENBQVksQ0FBQ1QsT0FBRCxFQUFVSCxNQUFWLEdBQXFCO29CQUN0QyxNQUFNMEUsU0FBUyxHQUFHSiwwQkFBMEIsQ0FBQzFDLElBQTNCLENBQWdDLElBQWhDLEVBQXNDO3dCQUFDekIsT0FBRDt3QkFBVUgsTUFBQUE7cUJBQWhELENBQWxCLEFBQXdEO29CQUN4RFMsSUFBSSxDQUFDa0UsSUFBTCxDQUFVRCxTQUFWLENBQUFqRSxDQUFBQTtvQkFDQWdFLGVBQWUsQ0FBQzFJLFdBQWhCLElBQStCMEUsSUFBL0IsQ0FBQWdFLENBQUFBO2lCQUhLLENBQVAsQ0FJQzthQWJILEFBY0M7WUFFRCxNQUFNRyxjQUFjLEdBQUc7Z0JBQ3JCQyxRQUFRLEVBQUU7b0JBQ1JDLE9BQU8sRUFBRTt3QkFDUDlCLGlCQUFpQixFQUFFTixTQUFTLENBQUNLLHlCQUFELENBQTVCQztxQkFETztpQkFGVTtnQkFNckI5SCxPQUFPLEVBQUU7b0JBQ1BvSSxTQUFTLEVBQUVaLFNBQVMsQ0FBQ1csaUJBQUQsQ0FEYjtvQkFFUDBCLGlCQUFpQixFQUFFckMsU0FBUyxDQUFDVyxpQkFBRCxDQUZyQjtvQkFHUHRILFdBQVcsRUFBRXlJLGtCQUFrQixDQUFDNUMsSUFBbkIsQ0FBd0IsSUFBeEIsRUFBOEIsYUFBOUIsRUFBNkM7d0JBQUNsQixPQUFPLEVBQUUsQ0FBVjt3QkFBYUMsT0FBTyxFQUFFLENBQVRBO3FCQUExRCxDQUE2QztpQkFUdkM7Z0JBV3JCN0UsSUFBSSxFQUFFO29CQUNKQyxXQUFXLEVBQUV5SSxrQkFBa0IsQ0FBQzVDLElBQW5CLENBQXdCLElBQXhCLEVBQThCLGFBQTlCLEVBQTZDO3dCQUFDbEIsT0FBTyxFQUFFLENBQVY7d0JBQWFDLE9BQU8sRUFBRSxDQUFUQTtxQkFBMUQsQ0FBNkM7aUJBRHREO2FBWFIsQUFBdUI7WUFldkIsTUFBTXFFLGVBQWUsR0FBRztnQkFDdEJDLEtBQUssRUFBRTtvQkFBQ3ZFLE9BQU8sRUFBRSxDQUFWO29CQUFhQyxPQUFPLEVBQUUsQ0FBVEE7aUJBREU7Z0JBRXRCdkIsR0FBRyxFQUFFO29CQUFDc0IsT0FBTyxFQUFFLENBQVY7b0JBQWFDLE9BQU8sRUFBRSxDQUFUQTtpQkFGSTtnQkFHdEJwQixHQUFHLEVBQUU7b0JBQUNtQixPQUFPLEVBQUUsQ0FBVjtvQkFBYUMsT0FBTyxFQUFFLENBQVRBO2lCQUFiO2FBSFAsQUFBd0I7WUFLeEJoQyxXQUFXLENBQUN1RyxPQUFaLEdBQXNCO2dCQUNwQkosT0FBTyxFQUFFO29CQUFDLEdBQUEsRUFBS0UsZUFBTDtpQkFEVTtnQkFFcEJHLFFBQVEsRUFBRTtvQkFBQyxHQUFBLEVBQUtILGVBQUw7aUJBRlM7Z0JBR3BCSSxRQUFRLEVBQUU7b0JBQUMsR0FBQSxFQUFLSixlQUFMO2lCQUFEO2FBSFosQ0FBc0I7WUFNdEIsT0FBT25ELFVBQVUsQ0FBQ25ELGFBQUQsRUFBZ0JrRyxjQUFoQixFQUFnQ2pHLFdBQWhDLENBQWpCLENBQUE7U0F6cUNGLEFBVCtHLEVBcXJDL0cseUVBRkM7UUFHRCwrQkFBQTtRQUNBMEcsTUFBTSxDQUFDQyxPQUFQLEdBQWlCN0csUUFBUSxDQUFDUCxNQUFELENBQXpCLENBQUFtSDtLQXZyQ0YsTUF5ckNFQSxNQUFNLENBQUNDLE9BQVAsR0FBaUJySCxVQUFVLENBQUNuRCxPQUE1QixDQUFBdUs7QyxDLEMiLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9AcGFyY2VsL3J1bnRpbWUtd2ViZXh0ZW5zaW9uL2xpYi9ydW50aW1lLTI5NmUzNzk2MmIwNzA3N2QuanMiLCJub2RlX21vZHVsZXMvQHBhcmNlbC9ydW50aW1lLXJlYWN0LXJlZnJlc2gvbGliL3J1bnRpbWUtODRjY2VmZjNmYTFjZDlkMy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWZyZXNoL3J1bnRpbWUuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVmcmVzaC9janMvcmVhY3QtcmVmcmVzaC1ydW50aW1lLmRldmVsb3BtZW50LmpzIiwibm9kZV9tb2R1bGVzL0BwYXJjZWwvcnVudGltZS1icm93c2VyLWhtci9saWIvcnVudGltZS03YWMwNDQ5Nzk2NGVkYmNmLmpzIiwic291cmNlL2JhY2tncm91bmQudHMiLCJzb3VyY2Uvb3B0aW9ucy9vcHRpb25zLXN0b3JhZ2UudHMiLCJub2RlX21vZHVsZXMvd2ViZXh0LW9wdGlvbnMtc3luYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy93ZWJleHQtZGV0ZWN0LXBhZ2UvaW5kZXguanMiLCJub2RlX21vZHVsZXMvQHBhcmNlbC90cmFuc2Zvcm1lci1qcy9zcmMvZXNtb2R1bGUtaGVscGVycy5qcyIsInNvdXJjZS9vcHRpb25zL2RlZmF1bHRzL2lmcmFtZS50cyIsIm5vZGVfbW9kdWxlcy93ZWJleHRlbnNpb24tcG9seWZpbGwvZGlzdC9icm93c2VyLXBvbHlmaWxsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBnbG9iYWwgY2hyb21lLCBicm93c2VyICovXG52YXIgZW52ID0gdHlwZW9mIGNocm9tZSA9PSAndW5kZWZpbmVkJyA/IGJyb3dzZXIgOiBjaHJvbWU7XG5lbnYucnVudGltZS5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoZnVuY3Rpb24gKG1zZykge1xuICBpZiAobXNnLl9fcGFyY2VsX2htcl9yZWxvYWRfXykge1xuICAgIGVudi5ydW50aW1lLnJlbG9hZCgpO1xuICB9XG59KTsiLCJcbnZhciBSZWZyZXNoID0gcmVxdWlyZSgncmVhY3QtcmVmcmVzaC9ydW50aW1lJyk7XG5cblJlZnJlc2guaW5qZWN0SW50b0dsb2JhbEhvb2sod2luZG93KTtcbndpbmRvdy4kUmVmcmVzaFJlZyQgPSBmdW5jdGlvbigpIHt9O1xud2luZG93LiRSZWZyZXNoU2lnJCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gZnVuY3Rpb24odHlwZSkge1xuICAgIHJldHVybiB0eXBlO1xuICB9O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtcmVmcmVzaC1ydW50aW1lLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LXJlZnJlc2gtcnVudGltZS5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYwLjkuMFxuICogcmVhY3QtcmVmcmVzaC1ydW50aW1lLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IDB4ZWFjYTtcbnZhciBSRUFDVF9GUkFHTUVOVF9UWVBFID0gMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IDB4ZWFjZTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IDB4ZWFkOTtcbnZhciBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IDB4ZWFkYTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gMHhlYWQ1O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSAweGVhZDc7XG52YXIgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSAweGVhZTA7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAweGVhZTE7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSAweGVhZTI7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gMHhlYWUzO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnBvcnRhbCcpO1xuICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mcmFnbWVudCcpO1xuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbnZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7IC8vIFdlIG5ldmVyIHJlbW92ZSB0aGVzZSBhc3NvY2lhdGlvbnMuXG4vLyBJdCdzIE9LIHRvIHJlZmVyZW5jZSBmYW1pbGllcywgYnV0IHVzZSBXZWFrTWFwL1NldCBmb3IgdHlwZXMuXG5cbnZhciBhbGxGYW1pbGllc0J5SUQgPSBuZXcgTWFwKCk7XG52YXIgYWxsRmFtaWxpZXNCeVR5cGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG52YXIgYWxsU2lnbmF0dXJlc0J5VHlwZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTsgLy8gVGhpcyBXZWFrTWFwIGlzIHJlYWQgYnkgUmVhY3QsIHNvIHdlIG9ubHkgcHV0IGZhbWlsaWVzXG4vLyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBlZGl0ZWQgaGVyZS4gVGhpcyBrZWVwcyBjaGVja3MgZmFzdC5cbi8vICRGbG93SXNzdWVcblxudmFyIHVwZGF0ZWRGYW1pbGllc0J5VHlwZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTsgLy8gVGhpcyBpcyBjbGVhcmVkIG9uIGV2ZXJ5IHBlcmZvcm1SZWFjdFJlZnJlc2goKSBjYWxsLlxuLy8gSXQgaXMgYW4gYXJyYXkgb2YgW0ZhbWlseSwgTmV4dFR5cGVdIHR1cGxlcy5cblxudmFyIHBlbmRpbmdVcGRhdGVzID0gW107IC8vIFRoaXMgaXMgaW5qZWN0ZWQgYnkgdGhlIHJlbmRlcmVyIHZpYSBEZXZUb29scyBnbG9iYWwgaG9vay5cblxudmFyIGhlbHBlcnNCeVJlbmRlcmVySUQgPSBuZXcgTWFwKCk7XG52YXIgaGVscGVyc0J5Um9vdCA9IG5ldyBNYXAoKTsgLy8gV2Uga2VlcCB0cmFjayBvZiBtb3VudGVkIHJvb3RzIHNvIHdlIGNhbiBzY2hlZHVsZSB1cGRhdGVzLlxuXG52YXIgbW91bnRlZFJvb3RzID0gbmV3IFNldCgpOyAvLyBJZiBhIHJvb3QgY2FwdHVyZXMgYW4gZXJyb3IsIHdlIHJlbWVtYmVyIGl0IHNvIHdlIGNhbiByZXRyeSBvbiBlZGl0LlxuXG52YXIgZmFpbGVkUm9vdHMgPSBuZXcgU2V0KCk7IC8vIEluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgV2Vha01hcCwgd2UgYWxzbyByZW1lbWJlciB0aGUgbGFzdCBlbGVtZW50IGZvciBldmVyeSByb290LlxuLy8gSXQgbmVlZHMgdG8gYmUgd2VhayBiZWNhdXNlIHdlIGRvIHRoaXMgZXZlbiBmb3Igcm9vdHMgdGhhdCBmYWlsZWQgdG8gbW91bnQuXG4vLyBJZiB0aGVyZSBpcyBubyBXZWFrTWFwLCB3ZSB3b24ndCBhdHRlbXB0IHRvIGRvIHJldHJ5aW5nLlxuLy8gJEZsb3dJc3N1ZVxuXG52YXIgcm9vdEVsZW1lbnRzID0gLy8gJEZsb3dJc3N1ZVxudHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBuZXcgV2Vha01hcCgpIDogbnVsbDtcbnZhciBpc1BlcmZvcm1pbmdSZWZyZXNoID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGNvbXB1dGVGdWxsS2V5KHNpZ25hdHVyZSkge1xuICBpZiAoc2lnbmF0dXJlLmZ1bGxLZXkgIT09IG51bGwpIHtcbiAgICByZXR1cm4gc2lnbmF0dXJlLmZ1bGxLZXk7XG4gIH1cblxuICB2YXIgZnVsbEtleSA9IHNpZ25hdHVyZS5vd25LZXk7XG4gIHZhciBob29rcztcblxuICB0cnkge1xuICAgIGhvb2tzID0gc2lnbmF0dXJlLmdldEN1c3RvbUhvb2tzKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpbiBhbiBlZGdlIGNhc2UsIGUuZy4gaWYgZXhwcmVzc2lvbiBsaWtlIEZvby51c2VTb21ldGhpbmdcbiAgICAvLyBkZXBlbmRzIG9uIEZvbyB3aGljaCBpcyBsYXppbHkgaW5pdGlhbGl6ZWQgZHVyaW5nIHJlbmRlcmluZy5cbiAgICAvLyBJbiB0aGF0IGNhc2UganVzdCBhc3N1bWUgd2UnbGwgaGF2ZSB0byByZW1vdW50LlxuICAgIHNpZ25hdHVyZS5mb3JjZVJlc2V0ID0gdHJ1ZTtcbiAgICBzaWduYXR1cmUuZnVsbEtleSA9IGZ1bGxLZXk7XG4gICAgcmV0dXJuIGZ1bGxLZXk7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGhvb2sgPSBob29rc1tpXTtcblxuICAgIGlmICh0eXBlb2YgaG9vayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU29tZXRoaW5nJ3Mgd3JvbmcuIEFzc3VtZSB3ZSBuZWVkIHRvIHJlbW91bnQuXG4gICAgICBzaWduYXR1cmUuZm9yY2VSZXNldCA9IHRydWU7XG4gICAgICBzaWduYXR1cmUuZnVsbEtleSA9IGZ1bGxLZXk7XG4gICAgICByZXR1cm4gZnVsbEtleTtcbiAgICB9XG5cbiAgICB2YXIgbmVzdGVkSG9va1NpZ25hdHVyZSA9IGFsbFNpZ25hdHVyZXNCeVR5cGUuZ2V0KGhvb2spO1xuXG4gICAgaWYgKG5lc3RlZEhvb2tTaWduYXR1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTm8gc2lnbmF0dXJlIG1lYW5zIEhvb2sgd2Fzbid0IGluIHRoZSBzb3VyY2UgY29kZSwgZS5nLiBpbiBhIGxpYnJhcnkuXG4gICAgICAvLyBXZSdsbCBza2lwIGl0IGJlY2F1c2Ugd2UgY2FuIGFzc3VtZSBpdCB3b24ndCBjaGFuZ2UgZHVyaW5nIHRoaXMgc2Vzc2lvbi5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBuZXN0ZWRIb29rS2V5ID0gY29tcHV0ZUZ1bGxLZXkobmVzdGVkSG9va1NpZ25hdHVyZSk7XG5cbiAgICBpZiAobmVzdGVkSG9va1NpZ25hdHVyZS5mb3JjZVJlc2V0KSB7XG4gICAgICBzaWduYXR1cmUuZm9yY2VSZXNldCA9IHRydWU7XG4gICAgfVxuXG4gICAgZnVsbEtleSArPSAnXFxuLS0tXFxuJyArIG5lc3RlZEhvb2tLZXk7XG4gIH1cblxuICBzaWduYXR1cmUuZnVsbEtleSA9IGZ1bGxLZXk7XG4gIHJldHVybiBmdWxsS2V5O1xufVxuXG5mdW5jdGlvbiBoYXZlRXF1YWxTaWduYXR1cmVzKHByZXZUeXBlLCBuZXh0VHlwZSkge1xuICB2YXIgcHJldlNpZ25hdHVyZSA9IGFsbFNpZ25hdHVyZXNCeVR5cGUuZ2V0KHByZXZUeXBlKTtcbiAgdmFyIG5leHRTaWduYXR1cmUgPSBhbGxTaWduYXR1cmVzQnlUeXBlLmdldChuZXh0VHlwZSk7XG5cbiAgaWYgKHByZXZTaWduYXR1cmUgPT09IHVuZGVmaW5lZCAmJiBuZXh0U2lnbmF0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcmV2U2lnbmF0dXJlID09PSB1bmRlZmluZWQgfHwgbmV4dFNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGNvbXB1dGVGdWxsS2V5KHByZXZTaWduYXR1cmUpICE9PSBjb21wdXRlRnVsbEtleShuZXh0U2lnbmF0dXJlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChuZXh0U2lnbmF0dXJlLmZvcmNlUmVzZXQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNSZWFjdENsYXNzKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUucHJvdG90eXBlICYmIHR5cGUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIGNhblByZXNlcnZlU3RhdGVCZXR3ZWVuKHByZXZUeXBlLCBuZXh0VHlwZSkge1xuICBpZiAoaXNSZWFjdENsYXNzKHByZXZUeXBlKSB8fCBpc1JlYWN0Q2xhc3MobmV4dFR5cGUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGhhdmVFcXVhbFNpZ25hdHVyZXMocHJldlR5cGUsIG5leHRUeXBlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRmFtaWx5KHR5cGUpIHtcbiAgLy8gT25seSBjaGVjayB1cGRhdGVkIHR5cGVzIHRvIGtlZXAgbG9va3VwcyBmYXN0LlxuICByZXR1cm4gdXBkYXRlZEZhbWlsaWVzQnlUeXBlLmdldCh0eXBlKTtcbn0gLy8gSWYgd2UgZGlkbid0IGNhcmUgYWJvdXQgSUUxMSwgd2UgY291bGQgdXNlIG5ldyBNYXAvU2V0KGl0ZXJhYmxlKS5cblxuXG5mdW5jdGlvbiBjbG9uZU1hcChtYXApIHtcbiAgdmFyIGNsb25lID0gbmV3IE1hcCgpO1xuICBtYXAuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgIGNsb25lLnNldChrZXksIHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gY2xvbmVTZXQoc2V0KSB7XG4gIHZhciBjbG9uZSA9IG5ldyBTZXQoKTtcbiAgc2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgY2xvbmUuYWRkKHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiBjbG9uZTtcbn1cblxuZnVuY3Rpb24gcGVyZm9ybVJlYWN0UmVmcmVzaCgpIHtcblxuICBpZiAocGVuZGluZ1VwZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoaXNQZXJmb3JtaW5nUmVmcmVzaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaXNQZXJmb3JtaW5nUmVmcmVzaCA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgdXBkYXRlZEZhbWlsaWVzID0gbmV3IFNldCgpO1xuICAgIHZhciB1cGRhdGVzID0gcGVuZGluZ1VwZGF0ZXM7XG4gICAgcGVuZGluZ1VwZGF0ZXMgPSBbXTtcbiAgICB1cGRhdGVzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBmYW1pbHkgPSBfcmVmWzBdLFxuICAgICAgICAgIG5leHRUeXBlID0gX3JlZlsxXTtcbiAgICAgIC8vIE5vdyB0aGF0IHdlIGdvdCBhIHJlYWwgZWRpdCwgd2UgY2FuIGNyZWF0ZSBhc3NvY2lhdGlvbnNcbiAgICAgIC8vIHRoYXQgd2lsbCBiZSByZWFkIGJ5IHRoZSBSZWFjdCByZWNvbmNpbGVyLlxuICAgICAgdmFyIHByZXZUeXBlID0gZmFtaWx5LmN1cnJlbnQ7XG4gICAgICB1cGRhdGVkRmFtaWxpZXNCeVR5cGUuc2V0KHByZXZUeXBlLCBmYW1pbHkpO1xuICAgICAgdXBkYXRlZEZhbWlsaWVzQnlUeXBlLnNldChuZXh0VHlwZSwgZmFtaWx5KTtcbiAgICAgIGZhbWlseS5jdXJyZW50ID0gbmV4dFR5cGU7IC8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgc2hvdWxkIGJlIGEgcmUtcmVuZGVyIG9yIGEgcmUtbW91bnQuXG5cbiAgICAgIGlmIChjYW5QcmVzZXJ2ZVN0YXRlQmV0d2VlbihwcmV2VHlwZSwgbmV4dFR5cGUpKSB7XG4gICAgICAgIHVwZGF0ZWRGYW1pbGllcy5hZGQoZmFtaWx5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YWxlRmFtaWxpZXMuYWRkKGZhbWlseSk7XG4gICAgICB9XG4gICAgfSk7IC8vIFRPRE86IHJlbmFtZSB0aGVzZSBmaWVsZHMgdG8gc29tZXRoaW5nIG1vcmUgbWVhbmluZ2Z1bC5cblxuICAgIHZhciB1cGRhdGUgPSB7XG4gICAgICB1cGRhdGVkRmFtaWxpZXM6IHVwZGF0ZWRGYW1pbGllcyxcbiAgICAgIC8vIEZhbWlsaWVzIHRoYXQgd2lsbCByZS1yZW5kZXIgcHJlc2VydmluZyBzdGF0ZVxuICAgICAgc3RhbGVGYW1pbGllczogc3RhbGVGYW1pbGllcyAvLyBGYW1pbGllcyB0aGF0IHdpbGwgYmUgcmVtb3VudGVkXG5cbiAgICB9O1xuICAgIGhlbHBlcnNCeVJlbmRlcmVySUQuZm9yRWFjaChmdW5jdGlvbiAoaGVscGVycykge1xuICAgICAgLy8gRXZlbiBpZiB0aGVyZSBhcmUgbm8gcm9vdHMsIHNldCB0aGUgaGFuZGxlciBvbiBmaXJzdCB1cGRhdGUuXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBpZiAqbmV3KiByb290cyBhcmUgbW91bnRlZCwgdGhleSdsbCB1c2UgdGhlIHJlc29sdmUgaGFuZGxlci5cbiAgICAgIGhlbHBlcnMuc2V0UmVmcmVzaEhhbmRsZXIocmVzb2x2ZUZhbWlseSk7XG4gICAgfSk7XG4gICAgdmFyIGRpZEVycm9yID0gZmFsc2U7XG4gICAgdmFyIGZpcnN0RXJyb3IgPSBudWxsOyAvLyBXZSBzbmFwc2hvdCBtYXBzIGFuZCBzZXRzIHRoYXQgYXJlIG11dGF0ZWQgZHVyaW5nIGNvbW1pdHMuXG4gICAgLy8gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlcmUgaXMgYSByaXNrIHRoZXkgd2lsbCBiZSBtdXRhdGVkIHdoaWxlXG4gICAgLy8gd2UgaXRlcmF0ZSBvdmVyIHRoZW0uIEZvciBleGFtcGxlLCB0cnlpbmcgdG8gcmVjb3ZlciBhIGZhaWxlZCByb290XG4gICAgLy8gbWF5IGNhdXNlIGFub3RoZXIgcm9vdCB0byBiZSBhZGRlZCB0byB0aGUgZmFpbGVkIGxpc3QgLS0gYW4gaW5maW5pdGUgbG9vcC5cblxuICAgIHZhciBmYWlsZWRSb290c1NuYXBzaG90ID0gY2xvbmVTZXQoZmFpbGVkUm9vdHMpO1xuICAgIHZhciBtb3VudGVkUm9vdHNTbmFwc2hvdCA9IGNsb25lU2V0KG1vdW50ZWRSb290cyk7XG4gICAgdmFyIGhlbHBlcnNCeVJvb3RTbmFwc2hvdCA9IGNsb25lTWFwKGhlbHBlcnNCeVJvb3QpO1xuICAgIGZhaWxlZFJvb3RzU25hcHNob3QuZm9yRWFjaChmdW5jdGlvbiAocm9vdCkge1xuICAgICAgdmFyIGhlbHBlcnMgPSBoZWxwZXJzQnlSb290U25hcHNob3QuZ2V0KHJvb3QpO1xuXG4gICAgICBpZiAoaGVscGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgaGVscGVycyBmb3IgYSByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0IFJlZnJlc2guJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZmFpbGVkUm9vdHMuaGFzKHJvb3QpKSB7Ly8gTm8gbG9uZ2VyIGZhaWxlZC5cbiAgICAgIH1cblxuICAgICAgaWYgKHJvb3RFbGVtZW50cyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghcm9vdEVsZW1lbnRzLmhhcyhyb290KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBlbGVtZW50ID0gcm9vdEVsZW1lbnRzLmdldChyb290KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaGVscGVycy5zY2hlZHVsZVJvb3Qocm9vdCwgZWxlbWVudCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFkaWRFcnJvcikge1xuICAgICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICBmaXJzdEVycm9yID0gZXJyO1xuICAgICAgICB9IC8vIEtlZXAgdHJ5aW5nIG90aGVyIHJvb3RzLlxuXG4gICAgICB9XG4gICAgfSk7XG4gICAgbW91bnRlZFJvb3RzU25hcHNob3QuZm9yRWFjaChmdW5jdGlvbiAocm9vdCkge1xuICAgICAgdmFyIGhlbHBlcnMgPSBoZWxwZXJzQnlSb290U25hcHNob3QuZ2V0KHJvb3QpO1xuXG4gICAgICBpZiAoaGVscGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgaGVscGVycyBmb3IgYSByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0IFJlZnJlc2guJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghbW91bnRlZFJvb3RzLmhhcyhyb290KSkgey8vIE5vIGxvbmdlciBtb3VudGVkLlxuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBoZWxwZXJzLnNjaGVkdWxlUmVmcmVzaChyb290LCB1cGRhdGUpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghZGlkRXJyb3IpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgZmlyc3RFcnJvciA9IGVycjtcbiAgICAgICAgfSAvLyBLZWVwIHRyeWluZyBvdGhlciByb290cy5cblxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGRpZEVycm9yKSB7XG4gICAgICB0aHJvdyBmaXJzdEVycm9yO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGU7XG4gIH0gZmluYWxseSB7XG4gICAgaXNQZXJmb3JtaW5nUmVmcmVzaCA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiByZWdpc3Rlcih0eXBlLCBpZCkge1xuICB7XG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBUaGlzIGNhbiBoYXBwZW4gaW4gYW4gZWRnZSBjYXNlLCBlLmcuIGlmIHdlIHJlZ2lzdGVyXG4gICAgLy8gcmV0dXJuIHZhbHVlIG9mIGEgSE9DIGJ1dCBpdCByZXR1cm5zIGEgY2FjaGVkIGNvbXBvbmVudC5cbiAgICAvLyBJZ25vcmUgYW55dGhpbmcgYnV0IHRoZSBmaXJzdCByZWdpc3RyYXRpb24gZm9yIGVhY2ggdHlwZS5cblxuXG4gICAgaWYgKGFsbEZhbWlsaWVzQnlUeXBlLmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gQ3JlYXRlIGZhbWlseSBvciByZW1lbWJlciB0byB1cGRhdGUgaXQuXG4gICAgLy8gTm9uZSBvZiB0aGlzIGJvb2trZWVwaW5nIGFmZmVjdHMgcmVjb25jaWxpYXRpb25cbiAgICAvLyB1bnRpbCB0aGUgZmlyc3QgcGVyZm9ybVJlYWN0UmVmcmVzaCgpIGNhbGwgYWJvdmUuXG5cblxuICAgIHZhciBmYW1pbHkgPSBhbGxGYW1pbGllc0J5SUQuZ2V0KGlkKTtcblxuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFtaWx5ID0ge1xuICAgICAgICBjdXJyZW50OiB0eXBlXG4gICAgICB9O1xuICAgICAgYWxsRmFtaWxpZXNCeUlELnNldChpZCwgZmFtaWx5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGVuZGluZ1VwZGF0ZXMucHVzaChbZmFtaWx5LCB0eXBlXSk7XG4gICAgfVxuXG4gICAgYWxsRmFtaWxpZXNCeVR5cGUuc2V0KHR5cGUsIGZhbWlseSk7IC8vIFZpc2l0IGlubmVyIHR5cGVzIGJlY2F1c2Ugd2UgbWlnaHQgbm90IGhhdmUgcmVnaXN0ZXJlZCB0aGVtLlxuXG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgIHJlZ2lzdGVyKHR5cGUucmVuZGVyLCBpZCArICckcmVuZGVyJyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgcmVnaXN0ZXIodHlwZS50eXBlLCBpZCArICckdHlwZScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gc2V0U2lnbmF0dXJlKHR5cGUsIGtleSkge1xuICB2YXIgZm9yY2VSZXNldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gIHZhciBnZXRDdXN0b21Ib29rcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogdW5kZWZpbmVkO1xuXG4gIHtcbiAgICBhbGxTaWduYXR1cmVzQnlUeXBlLnNldCh0eXBlLCB7XG4gICAgICBmb3JjZVJlc2V0OiBmb3JjZVJlc2V0LFxuICAgICAgb3duS2V5OiBrZXksXG4gICAgICBmdWxsS2V5OiBudWxsLFxuICAgICAgZ2V0Q3VzdG9tSG9va3M6IGdldEN1c3RvbUhvb2tzIHx8IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIFRoaXMgaXMgbGF6aWx5IGNhbGxlZCBkdXJpbmcgZmlyc3QgcmVuZGVyIGZvciBhIHR5cGUuXG4vLyBJdCBjYXB0dXJlcyBIb29rIGxpc3QgYXQgdGhhdCB0aW1lIHNvIGlubGluZSByZXF1aXJlcyBkb24ndCBicmVhayBjb21wYXJpc29ucy5cblxuZnVuY3Rpb24gY29sbGVjdEN1c3RvbUhvb2tzRm9yU2lnbmF0dXJlKHR5cGUpIHtcbiAge1xuICAgIHZhciBzaWduYXR1cmUgPSBhbGxTaWduYXR1cmVzQnlUeXBlLmdldCh0eXBlKTtcblxuICAgIGlmIChzaWduYXR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29tcHV0ZUZ1bGxLZXkoc2lnbmF0dXJlKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEZhbWlseUJ5SUQoaWQpIHtcbiAge1xuICAgIHJldHVybiBhbGxGYW1pbGllc0J5SUQuZ2V0KGlkKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0RmFtaWx5QnlUeXBlKHR5cGUpIHtcbiAge1xuICAgIHJldHVybiBhbGxGYW1pbGllc0J5VHlwZS5nZXQodHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmRBZmZlY3RlZEhvc3RJbnN0YW5jZXMoZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBhZmZlY3RlZEluc3RhbmNlcyA9IG5ldyBTZXQoKTtcbiAgICBtb3VudGVkUm9vdHMuZm9yRWFjaChmdW5jdGlvbiAocm9vdCkge1xuICAgICAgdmFyIGhlbHBlcnMgPSBoZWxwZXJzQnlSb290LmdldChyb290KTtcblxuICAgICAgaWYgKGhlbHBlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGhlbHBlcnMgZm9yIGEgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdCBSZWZyZXNoLicpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5zdGFuY2VzRm9yUm9vdCA9IGhlbHBlcnMuZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoKHJvb3QsIGZhbWlsaWVzKTtcbiAgICAgIGluc3RhbmNlc0ZvclJvb3QuZm9yRWFjaChmdW5jdGlvbiAoaW5zdCkge1xuICAgICAgICBhZmZlY3RlZEluc3RhbmNlcy5hZGQoaW5zdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWZmZWN0ZWRJbnN0YW5jZXM7XG4gIH1cbn1cbmZ1bmN0aW9uIGluamVjdEludG9HbG9iYWxIb29rKGdsb2JhbE9iamVjdCkge1xuICB7XG4gICAgLy8gRm9yIFJlYWN0IE5hdGl2ZSwgdGhlIGdsb2JhbCBob29rIHdpbGwgYmUgc2V0IHVwIGJ5IHJlcXVpcmUoJ3JlYWN0LWRldnRvb2xzLWNvcmUnKS5cbiAgICAvLyBUaGF0IGNvZGUgd2lsbCBydW4gYmVmb3JlIHVzLiBTbyB3ZSBuZWVkIHRvIG1vbmtleXBhdGNoIGZ1bmN0aW9ucyBvbiBleGlzdGluZyBob29rLlxuICAgIC8vIEZvciBSZWFjdCBXZWIsIHRoZSBnbG9iYWwgaG9vayB3aWxsIGJlIHNldCB1cCBieSB0aGUgZXh0ZW5zaW9uLlxuICAgIC8vIFRoaXMgd2lsbCBhbHNvIHJ1biBiZWZvcmUgdXMuXG4gICAgdmFyIGhvb2sgPSBnbG9iYWxPYmplY3QuX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4gICAgaWYgKGhvb2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSG93ZXZlciwgaWYgdGhlcmUgaXMgbm8gRGV2VG9vbHMgZXh0ZW5zaW9uLCB3ZSdsbCBuZWVkIHRvIHNldCB1cCB0aGUgZ2xvYmFsIGhvb2sgb3Vyc2VsdmVzLlxuICAgICAgLy8gTm90ZSB0aGF0IGluIHRoaXMgY2FzZSBpdCdzIGltcG9ydGFudCB0aGF0IHJlbmRlcmVyIGNvZGUgcnVucyAqYWZ0ZXIqIHRoaXMgbWV0aG9kIGNhbGwuXG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSByZW5kZXJlciB3aWxsIHRoaW5rIHRoYXQgdGhlcmUgaXMgbm8gZ2xvYmFsIGhvb2ssIGFuZCB3b24ndCBkbyB0aGUgaW5qZWN0aW9uLlxuICAgICAgdmFyIG5leHRJRCA9IDA7XG4gICAgICBnbG9iYWxPYmplY3QuX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID0gaG9vayA9IHtcbiAgICAgICAgcmVuZGVyZXJzOiBuZXcgTWFwKCksXG4gICAgICAgIHN1cHBvcnRzRmliZXI6IHRydWUsXG4gICAgICAgIGluamVjdDogZnVuY3Rpb24gKGluamVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIG5leHRJRCsrO1xuICAgICAgICB9LFxuICAgICAgICBvblNjaGVkdWxlRmliZXJSb290OiBmdW5jdGlvbiAoaWQsIHJvb3QsIGNoaWxkcmVuKSB7fSxcbiAgICAgICAgb25Db21taXRGaWJlclJvb3Q6IGZ1bmN0aW9uIChpZCwgcm9vdCwgbWF5YmVQcmlvcml0eUxldmVsLCBkaWRFcnJvcikge30sXG4gICAgICAgIG9uQ29tbWl0RmliZXJVbm1vdW50OiBmdW5jdGlvbiAoKSB7fVxuICAgICAgfTtcbiAgICB9IC8vIEhlcmUsIHdlIGp1c3Qgd2FudCB0byBnZXQgYSByZWZlcmVuY2UgdG8gc2NoZWR1bGVSZWZyZXNoLlxuXG5cbiAgICB2YXIgb2xkSW5qZWN0ID0gaG9vay5pbmplY3Q7XG5cbiAgICBob29rLmluamVjdCA9IGZ1bmN0aW9uIChpbmplY3RlZCkge1xuICAgICAgdmFyIGlkID0gb2xkSW5qZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgIGlmICh0eXBlb2YgaW5qZWN0ZWQuc2NoZWR1bGVSZWZyZXNoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbmplY3RlZC5zZXRSZWZyZXNoSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUaGlzIHZlcnNpb24gc3VwcG9ydHMgUmVhY3QgUmVmcmVzaC5cbiAgICAgICAgaGVscGVyc0J5UmVuZGVyZXJJRC5zZXQoaWQsIGluamVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlkO1xuICAgIH07IC8vIERvIHRoZSBzYW1lIGZvciBhbnkgYWxyZWFkeSBpbmplY3RlZCByb290cy5cbiAgICAvLyBUaGlzIGlzIHVzZWZ1bCBpZiBSZWFjdERPTSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTc2MjZcblxuXG4gICAgaG9vay5yZW5kZXJlcnMuZm9yRWFjaChmdW5jdGlvbiAoaW5qZWN0ZWQsIGlkKSB7XG4gICAgICBpZiAodHlwZW9mIGluamVjdGVkLnNjaGVkdWxlUmVmcmVzaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5qZWN0ZWQuc2V0UmVmcmVzaEhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVGhpcyB2ZXJzaW9uIHN1cHBvcnRzIFJlYWN0IFJlZnJlc2guXG4gICAgICAgIGhlbHBlcnNCeVJlbmRlcmVySUQuc2V0KGlkLCBpbmplY3RlZCk7XG4gICAgICB9XG4gICAgfSk7IC8vIFdlIGFsc28gd2FudCB0byB0cmFjayBjdXJyZW50bHkgbW91bnRlZCByb290cy5cblxuICAgIHZhciBvbGRPbkNvbW1pdEZpYmVyUm9vdCA9IGhvb2sub25Db21taXRGaWJlclJvb3Q7XG5cbiAgICB2YXIgb2xkT25TY2hlZHVsZUZpYmVyUm9vdCA9IGhvb2sub25TY2hlZHVsZUZpYmVyUm9vdCB8fCBmdW5jdGlvbiAoKSB7fTtcblxuICAgIGhvb2sub25TY2hlZHVsZUZpYmVyUm9vdCA9IGZ1bmN0aW9uIChpZCwgcm9vdCwgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghaXNQZXJmb3JtaW5nUmVmcmVzaCkge1xuICAgICAgICAvLyBJZiBpdCB3YXMgaW50ZW50aW9uYWxseSBzY2hlZHVsZWQsIGRvbid0IGF0dGVtcHQgdG8gcmVzdG9yZS5cbiAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyBpbnRlbnRpb25hbGx5IHNjaGVkdWxlZCB1bm1vdW50cy5cbiAgICAgICAgZmFpbGVkUm9vdHMuZGVsZXRlKHJvb3QpO1xuXG4gICAgICAgIGlmIChyb290RWxlbWVudHMgIT09IG51bGwpIHtcbiAgICAgICAgICByb290RWxlbWVudHMuc2V0KHJvb3QsIGNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2xkT25TY2hlZHVsZUZpYmVyUm9vdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBob29rLm9uQ29tbWl0RmliZXJSb290ID0gZnVuY3Rpb24gKGlkLCByb290LCBtYXliZVByaW9yaXR5TGV2ZWwsIGRpZEVycm9yKSB7XG4gICAgICB2YXIgaGVscGVycyA9IGhlbHBlcnNCeVJlbmRlcmVySUQuZ2V0KGlkKTtcblxuICAgICAgaWYgKGhlbHBlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGhlbHBlcnNCeVJvb3Quc2V0KHJvb3QsIGhlbHBlcnMpO1xuICAgICAgdmFyIGN1cnJlbnQgPSByb290LmN1cnJlbnQ7XG4gICAgICB2YXIgYWx0ZXJuYXRlID0gY3VycmVudC5hbHRlcm5hdGU7IC8vIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyByb290IGhhcyBqdXN0ICh1biltb3VudGVkLlxuICAgICAgLy8gVGhpcyBsb2dpYyBpcyBjb3B5LXBhc3RlZCBmcm9tIHNpbWlsYXIgbG9naWMgaW4gdGhlIERldlRvb2xzIGJhY2tlbmQuXG4gICAgICAvLyBJZiB0aGlzIGJyZWFrcyB3aXRoIHNvbWUgcmVmYWN0b3JpbmcsIHlvdSdsbCB3YW50IHRvIHVwZGF0ZSBEZXZUb29scyB0b28uXG5cbiAgICAgIGlmIChhbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHdhc01vdW50ZWQgPSBhbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSAhPSBudWxsICYmIGFsdGVybmF0ZS5tZW1vaXplZFN0YXRlLmVsZW1lbnQgIT0gbnVsbDtcbiAgICAgICAgdmFyIGlzTW91bnRlZCA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAhPSBudWxsICYmIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5lbGVtZW50ICE9IG51bGw7XG5cbiAgICAgICAgaWYgKCF3YXNNb3VudGVkICYmIGlzTW91bnRlZCkge1xuICAgICAgICAgIC8vIE1vdW50IGEgbmV3IHJvb3QuXG4gICAgICAgICAgbW91bnRlZFJvb3RzLmFkZChyb290KTtcbiAgICAgICAgICBmYWlsZWRSb290cy5kZWxldGUocm9vdCk7XG4gICAgICAgIH0gZWxzZSBpZiAod2FzTW91bnRlZCAmJiBpc01vdW50ZWQpIDsgZWxzZSBpZiAod2FzTW91bnRlZCAmJiAhaXNNb3VudGVkKSB7XG4gICAgICAgICAgLy8gVW5tb3VudCBhbiBleGlzdGluZyByb290LlxuICAgICAgICAgIG1vdW50ZWRSb290cy5kZWxldGUocm9vdCk7XG5cbiAgICAgICAgICBpZiAoZGlkRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFdlJ2xsIHJlbW91bnQgaXQgb24gZnV0dXJlIGVkaXRzLlxuICAgICAgICAgICAgZmFpbGVkUm9vdHMuYWRkKHJvb3QpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWxwZXJzQnlSb290LmRlbGV0ZShyb290KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXdhc01vdW50ZWQgJiYgIWlzTW91bnRlZCkge1xuICAgICAgICAgIGlmIChkaWRFcnJvcikge1xuICAgICAgICAgICAgLy8gV2UnbGwgcmVtb3VudCBpdCBvbiBmdXR1cmUgZWRpdHMuXG4gICAgICAgICAgICBmYWlsZWRSb290cy5hZGQocm9vdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNb3VudCBhIG5ldyByb290LlxuICAgICAgICBtb3VudGVkUm9vdHMuYWRkKHJvb3QpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2xkT25Db21taXRGaWJlclJvb3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBoYXNVbnJlY292ZXJhYmxlRXJyb3JzKCkge1xuICAvLyBUT0RPOiBkZWxldGUgdGhpcyBhZnRlciByZW1vdmluZyBkZXBlbmRlbmN5IGluIFJOLlxuICByZXR1cm4gZmFsc2U7XG59IC8vIEV4cG9zZWQgZm9yIHRlc3RpbmcuXG5cbmZ1bmN0aW9uIF9nZXRNb3VudGVkUm9vdENvdW50KCkge1xuICB7XG4gICAgcmV0dXJuIG1vdW50ZWRSb290cy5zaXplO1xuICB9XG59IC8vIFRoaXMgaXMgYSB3cmFwcGVyIG92ZXIgbW9yZSBwcmltaXRpdmUgZnVuY3Rpb25zIGZvciBzZXR0aW5nIHNpZ25hdHVyZS5cbi8vIFNpZ25hdHVyZXMgbGV0IHVzIGRlY2lkZSB3aGV0aGVyIHRoZSBIb29rIG9yZGVyIGhhcyBjaGFuZ2VkIG9uIHJlZnJlc2guXG4vL1xuLy8gVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgdHJhbnNmb3JtIHRhcmdldCwgZS5nLjpcbi8vIHZhciBfcyA9IGNyZWF0ZVNpZ25hdHVyZUZ1bmN0aW9uRm9yVHJhbnNmb3JtKClcbi8vXG4vLyBmdW5jdGlvbiBIZWxsbygpIHtcbi8vICAgY29uc3QgW2Zvbywgc2V0Rm9vXSA9IHVzZVN0YXRlKDApO1xuLy8gICBjb25zdCB2YWx1ZSA9IHVzZUN1c3RvbUhvb2soKTtcbi8vICAgX3MoKTsgLyogU2Vjb25kIGNhbGwgdHJpZ2dlcnMgY29sbGVjdGluZyB0aGUgY3VzdG9tIEhvb2sgbGlzdC5cbi8vICAgICAgICAgICogVGhpcyBkb2Vzbid0IGhhcHBlbiBkdXJpbmcgdGhlIG1vZHVsZSBldmFsdWF0aW9uIGJlY2F1c2Ugd2Vcbi8vICAgICAgICAgICogZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIG1vZHVsZSBvcmRlciB3aXRoIGlubGluZSByZXF1aXJlcy5cbi8vICAgICAgICAgICogTmV4dCBjYWxscyBhcmUgbm9vcHMuICovXG4vLyAgIHJldHVybiA8aDE+SGk8L2gxPjtcbi8vIH1cbi8vXG4vLyAvKiBGaXJzdCBjYWxsIHNwZWNpZmllcyB0aGUgc2lnbmF0dXJlOiAqL1xuLy8gX3MoXG4vLyAgIEhlbGxvLFxuLy8gICAndXNlU3RhdGV7W2Zvbywgc2V0Rm9vXX0oMCknLFxuLy8gICAoKSA9PiBbdXNlQ3VzdG9tSG9va10sIC8qIExhenkgdG8gYXZvaWQgdHJpZ2dlcmluZyBpbmxpbmUgcmVxdWlyZXMgKi9cbi8vICk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVNpZ25hdHVyZUZ1bmN0aW9uRm9yVHJhbnNmb3JtKCkge1xuICB7XG4gICAgLy8gV2UnbGwgZmlsbCBpbiB0aGUgc2lnbmF0dXJlIGluIHR3byBzdGVwcy5cbiAgICAvLyBGaXJzdCwgd2UnbGwga25vdyB0aGUgc2lnbmF0dXJlIGl0c2VsZi4gVGhpcyBoYXBwZW5zIG91dHNpZGUgdGhlIGNvbXBvbmVudC5cbiAgICAvLyBUaGVuLCB3ZSdsbCBrbm93IHRoZSByZWZlcmVuY2VzIHRvIGN1c3RvbSBIb29rcy4gVGhpcyBoYXBwZW5zIGluc2lkZSB0aGUgY29tcG9uZW50LlxuICAgIC8vIEFmdGVyIHRoYXQsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiB3aWxsIGJlIGEgZmFzdCBwYXRoIG5vLW9wLlxuICAgIHZhciBzdGF0dXMgPSAnbmVlZHNTaWduYXR1cmUnO1xuICAgIHZhciBzYXZlZFR5cGU7XG4gICAgdmFyIGhhc0N1c3RvbUhvb2tzO1xuICAgIHJldHVybiBmdW5jdGlvbiAodHlwZSwga2V5LCBmb3JjZVJlc2V0LCBnZXRDdXN0b21Ib29rcykge1xuICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgY2FzZSAnbmVlZHNTaWduYXR1cmUnOlxuICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHJlY2VpdmVkIGFuIGFyZ3VtZW50LCB0aGlzIGlzIHRoZSBpbml0aWFsIHJlZ2lzdHJhdGlvbiBjYWxsLlxuICAgICAgICAgICAgc2F2ZWRUeXBlID0gdHlwZTtcbiAgICAgICAgICAgIGhhc0N1c3RvbUhvb2tzID0gdHlwZW9mIGdldEN1c3RvbUhvb2tzID09PSAnZnVuY3Rpb24nO1xuICAgICAgICAgICAgc2V0U2lnbmF0dXJlKHR5cGUsIGtleSwgZm9yY2VSZXNldCwgZ2V0Q3VzdG9tSG9va3MpOyAvLyBUaGUgbmV4dCBjYWxsIHdlIGV4cGVjdCBpcyBmcm9tIGluc2lkZSBhIGZ1bmN0aW9uLCB0byBmaWxsIGluIHRoZSBjdXN0b20gSG9va3MuXG5cbiAgICAgICAgICAgIHN0YXR1cyA9ICduZWVkc0N1c3RvbUhvb2tzJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICduZWVkc0N1c3RvbUhvb2tzJzpcbiAgICAgICAgICBpZiAoaGFzQ3VzdG9tSG9va3MpIHtcbiAgICAgICAgICAgIGNvbGxlY3RDdXN0b21Ib29rc0ZvclNpZ25hdHVyZShzYXZlZFR5cGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN0YXR1cyA9ICdyZXNvbHZlZCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGlzTGlrZWx5Q29tcG9uZW50VHlwZSh0eXBlKSB7XG4gIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB0eXBlKSB7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIHtcbiAgICAgICAgICAvLyBGaXJzdCwgZGVhbCB3aXRoIGNsYXNzZXMuXG4gICAgICAgICAgaWYgKHR5cGUucHJvdG90eXBlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh0eXBlLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICAgIC8vIFJlYWN0IGNsYXNzLlxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG93bk5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModHlwZS5wcm90b3R5cGUpO1xuXG4gICAgICAgICAgICBpZiAob3duTmFtZXMubGVuZ3RoID4gMSB8fCBvd25OYW1lc1swXSAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgICAgICAvLyBUaGlzIGxvb2tzIGxpa2UgYSBjbGFzcy5cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG9cblxuXG4gICAgICAgICAgICBpZiAodHlwZS5wcm90b3R5cGUuX19wcm90b19fICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgICAgICAgIC8vIEl0IGhhcyBhIHN1cGVyY2xhc3MuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gLy8gUGFzcyB0aHJvdWdoLlxuICAgICAgICAgICAgLy8gVGhpcyBsb29rcyBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiB3aXRoIGVtcHR5IHByb3RvdHlwZS5cblxuICAgICAgICAgIH0gLy8gRm9yIHBsYWluIGZ1bmN0aW9ucyBhbmQgYXJyb3dzLCB1c2UgbmFtZSBhcyBhIGhldXJpc3RpYy5cblxuXG4gICAgICAgICAgdmFyIG5hbWUgPSB0eXBlLm5hbWUgfHwgdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIC9eW0EtWl0vLnRlc3QobmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIC8vIERlZmluaXRlbHkgUmVhY3QgY29tcG9uZW50cy5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLl9nZXRNb3VudGVkUm9vdENvdW50ID0gX2dldE1vdW50ZWRSb290Q291bnQ7XG5leHBvcnRzLmNvbGxlY3RDdXN0b21Ib29rc0ZvclNpZ25hdHVyZSA9IGNvbGxlY3RDdXN0b21Ib29rc0ZvclNpZ25hdHVyZTtcbmV4cG9ydHMuY3JlYXRlU2lnbmF0dXJlRnVuY3Rpb25Gb3JUcmFuc2Zvcm0gPSBjcmVhdGVTaWduYXR1cmVGdW5jdGlvbkZvclRyYW5zZm9ybTtcbmV4cG9ydHMuZmluZEFmZmVjdGVkSG9zdEluc3RhbmNlcyA9IGZpbmRBZmZlY3RlZEhvc3RJbnN0YW5jZXM7XG5leHBvcnRzLmdldEZhbWlseUJ5SUQgPSBnZXRGYW1pbHlCeUlEO1xuZXhwb3J0cy5nZXRGYW1pbHlCeVR5cGUgPSBnZXRGYW1pbHlCeVR5cGU7XG5leHBvcnRzLmhhc1VucmVjb3ZlcmFibGVFcnJvcnMgPSBoYXNVbnJlY292ZXJhYmxlRXJyb3JzO1xuZXhwb3J0cy5pbmplY3RJbnRvR2xvYmFsSG9vayA9IGluamVjdEludG9HbG9iYWxIb29rO1xuZXhwb3J0cy5pc0xpa2VseUNvbXBvbmVudFR5cGUgPSBpc0xpa2VseUNvbXBvbmVudFR5cGU7XG5leHBvcnRzLnBlcmZvcm1SZWFjdFJlZnJlc2ggPSBwZXJmb3JtUmVhY3RSZWZyZXNoO1xuZXhwb3J0cy5yZWdpc3RlciA9IHJlZ2lzdGVyO1xuZXhwb3J0cy5zZXRTaWduYXR1cmUgPSBzZXRTaWduYXR1cmU7XG4gIH0pKCk7XG59XG4iLCJ2YXIgSE1SX0hPU1QgPSBudWxsO3ZhciBITVJfUE9SVCA9IDEyMzQ7dmFyIEhNUl9TRUNVUkUgPSBmYWxzZTt2YXIgSE1SX0VOVl9IQVNIID0gXCI3Y2Q4Zjk1MDdhMmVlZmU2XCI7bW9kdWxlLmJ1bmRsZS5ITVJfQlVORExFX0lEID0gXCI4YWVkNzc2MDlmZTM5YWE3XCI7XCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgcmV0dXJuIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IF9pdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBfbm9uSXRlcmFibGVTcHJlYWQoKTsgfVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpOyB9XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikgeyBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpOyB9XG5cbmZ1bmN0aW9uIF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKG8sIGFsbG93QXJyYXlMaWtlKSB7IHZhciBpdCA9IHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdIHx8IG9bXCJAQGl0ZXJhdG9yXCJdOyBpZiAoIWl0KSB7IGlmIChBcnJheS5pc0FycmF5KG8pIHx8IChpdCA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvKSkgfHwgYWxsb3dBcnJheUxpa2UgJiYgbyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHsgaWYgKGl0KSBvID0gaXQ7IHZhciBpID0gMDsgdmFyIEYgPSBmdW5jdGlvbiBGKCkge307IHJldHVybiB7IHM6IEYsIG46IGZ1bmN0aW9uIG4oKSB7IGlmIChpID49IG8ubGVuZ3RoKSByZXR1cm4geyBkb25lOiB0cnVlIH07IHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb1tpKytdIH07IH0sIGU6IGZ1bmN0aW9uIGUoX2UpIHsgdGhyb3cgX2U7IH0sIGY6IEYgfTsgfSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7IH0gdmFyIG5vcm1hbENvbXBsZXRpb24gPSB0cnVlLCBkaWRFcnIgPSBmYWxzZSwgZXJyOyByZXR1cm4geyBzOiBmdW5jdGlvbiBzKCkgeyBpdCA9IGl0LmNhbGwobyk7IH0sIG46IGZ1bmN0aW9uIG4oKSB7IHZhciBzdGVwID0gaXQubmV4dCgpOyBub3JtYWxDb21wbGV0aW9uID0gc3RlcC5kb25lOyByZXR1cm4gc3RlcDsgfSwgZTogZnVuY3Rpb24gZShfZTIpIHsgZGlkRXJyID0gdHJ1ZTsgZXJyID0gX2UyOyB9LCBmOiBmdW5jdGlvbiBmKCkgeyB0cnkgeyBpZiAoIW5vcm1hbENvbXBsZXRpb24gJiYgaXQucmV0dXJuICE9IG51bGwpIGl0LnJldHVybigpOyB9IGZpbmFsbHkgeyBpZiAoZGlkRXJyKSB0aHJvdyBlcnI7IH0gfSB9OyB9XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHsgaWYgKCFvKSByZXR1cm47IGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7IHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTsgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTsgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7IGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTsgfVxuXG5mdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikgeyBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH1cblxuLyogZ2xvYmFsIEhNUl9IT1NULCBITVJfUE9SVCwgSE1SX0VOVl9IQVNILCBITVJfU0VDVVJFLCBjaHJvbWUsIGJyb3dzZXIgKi9cblxuLyo6OlxuaW1wb3J0IHR5cGUge1xuICBITVJBc3NldCxcbiAgSE1STWVzc2FnZSxcbn0gZnJvbSAnQHBhcmNlbC9yZXBvcnRlci1kZXYtc2VydmVyL3NyYy9ITVJTZXJ2ZXIuanMnO1xuaW50ZXJmYWNlIFBhcmNlbFJlcXVpcmUge1xuICAoc3RyaW5nKTogbWl4ZWQ7XG4gIGNhY2hlOiB7fFtzdHJpbmddOiBQYXJjZWxNb2R1bGV8fTtcbiAgaG90RGF0YTogbWl4ZWQ7XG4gIE1vZHVsZTogYW55O1xuICBwYXJlbnQ6ID9QYXJjZWxSZXF1aXJlO1xuICBpc1BhcmNlbFJlcXVpcmU6IHRydWU7XG4gIG1vZHVsZXM6IHt8W3N0cmluZ106IFtGdW5jdGlvbiwge3xbc3RyaW5nXTogc3RyaW5nfH1dfH07XG4gIEhNUl9CVU5ETEVfSUQ6IHN0cmluZztcbiAgcm9vdDogUGFyY2VsUmVxdWlyZTtcbn1cbmludGVyZmFjZSBQYXJjZWxNb2R1bGUge1xuICBob3Q6IHt8XG4gICAgZGF0YTogbWl4ZWQsXG4gICAgYWNjZXB0KGNiOiAoRnVuY3Rpb24pID0+IHZvaWQpOiB2b2lkLFxuICAgIGRpc3Bvc2UoY2I6IChtaXhlZCkgPT4gdm9pZCk6IHZvaWQsXG4gICAgLy8gYWNjZXB0KGRlcHM6IEFycmF5PHN0cmluZz4gfCBzdHJpbmcsIGNiOiAoRnVuY3Rpb24pID0+IHZvaWQpOiB2b2lkLFxuICAgIC8vIGRlY2xpbmUoKTogdm9pZCxcbiAgICBfYWNjZXB0Q2FsbGJhY2tzOiBBcnJheTwoRnVuY3Rpb24pID0+IHZvaWQ+LFxuICAgIF9kaXNwb3NlQ2FsbGJhY2tzOiBBcnJheTwobWl4ZWQpID0+IHZvaWQ+LFxuICB8fTtcbn1cbmludGVyZmFjZSBFeHRlbnNpb25Db250ZXh0IHtcbiAgcnVudGltZToge3xcbiAgICByZWxvYWQoKTogdm9pZCxcbiAgfH07XG59XG5kZWNsYXJlIHZhciBtb2R1bGU6IHtidW5kbGU6IFBhcmNlbFJlcXVpcmUsIC4uLn07XG5kZWNsYXJlIHZhciBITVJfSE9TVDogc3RyaW5nO1xuZGVjbGFyZSB2YXIgSE1SX1BPUlQ6IHN0cmluZztcbmRlY2xhcmUgdmFyIEhNUl9FTlZfSEFTSDogc3RyaW5nO1xuZGVjbGFyZSB2YXIgSE1SX1NFQ1VSRTogYm9vbGVhbjtcbmRlY2xhcmUgdmFyIGNocm9tZTogRXh0ZW5zaW9uQ29udGV4dDtcbmRlY2xhcmUgdmFyIGJyb3dzZXI6IEV4dGVuc2lvbkNvbnRleHQ7XG4qL1xudmFyIE9WRVJMQVlfSUQgPSAnX19wYXJjZWxfX2Vycm9yX19vdmVybGF5X18nO1xudmFyIE9sZE1vZHVsZSA9IG1vZHVsZS5idW5kbGUuTW9kdWxlO1xuXG5mdW5jdGlvbiBNb2R1bGUobW9kdWxlTmFtZSkge1xuICBPbGRNb2R1bGUuY2FsbCh0aGlzLCBtb2R1bGVOYW1lKTtcbiAgdGhpcy5ob3QgPSB7XG4gICAgZGF0YTogbW9kdWxlLmJ1bmRsZS5ob3REYXRhLFxuICAgIF9hY2NlcHRDYWxsYmFja3M6IFtdLFxuICAgIF9kaXNwb3NlQ2FsbGJhY2tzOiBbXSxcbiAgICBhY2NlcHQ6IGZ1bmN0aW9uIGFjY2VwdChmbikge1xuICAgICAgdGhpcy5fYWNjZXB0Q2FsbGJhY2tzLnB1c2goZm4gfHwgZnVuY3Rpb24gKCkge30pO1xuICAgIH0sXG4gICAgZGlzcG9zZTogZnVuY3Rpb24gZGlzcG9zZShmbikge1xuICAgICAgdGhpcy5fZGlzcG9zZUNhbGxiYWNrcy5wdXNoKGZuKTtcbiAgICB9XG4gIH07XG4gIG1vZHVsZS5idW5kbGUuaG90RGF0YSA9IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmJ1bmRsZS5Nb2R1bGUgPSBNb2R1bGU7XG52YXIgY2hlY2tlZEFzc2V0c1xuLyo6IHt8W3N0cmluZ106IGJvb2xlYW58fSAqL1xuLCBhY2NlcHRlZEFzc2V0c1xuLyo6IHt8W3N0cmluZ106IGJvb2xlYW58fSAqL1xuLCBhc3NldHNUb0FjY2VwdFxuLyo6IEFycmF5PFtQYXJjZWxSZXF1aXJlLCBzdHJpbmddPiAqL1xuO1xuXG5mdW5jdGlvbiBnZXRIb3N0bmFtZSgpIHtcbiAgcmV0dXJuIEhNUl9IT1NUIHx8IChsb2NhdGlvbi5wcm90b2NvbC5pbmRleE9mKCdodHRwJykgPT09IDAgPyBsb2NhdGlvbi5ob3N0bmFtZSA6ICdsb2NhbGhvc3QnKTtcbn1cblxuZnVuY3Rpb24gZ2V0UG9ydCgpIHtcbiAgcmV0dXJuIEhNUl9QT1JUIHx8IGxvY2F0aW9uLnBvcnQ7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblxuXG52YXIgcGFyZW50ID0gbW9kdWxlLmJ1bmRsZS5wYXJlbnQ7XG5cbmlmICgoIXBhcmVudCB8fCAhcGFyZW50LmlzUGFyY2VsUmVxdWlyZSkgJiYgdHlwZW9mIFdlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgdmFyIGhvc3RuYW1lID0gZ2V0SG9zdG5hbWUoKTtcbiAgdmFyIHBvcnQgPSBnZXRQb3J0KCk7XG4gIHZhciBwcm90b2NvbCA9IEhNUl9TRUNVUkUgfHwgbG9jYXRpb24ucHJvdG9jb2wgPT0gJ2h0dHBzOicgJiYgIS9sb2NhbGhvc3R8MTI3LjAuMC4xfDAuMC4wLjAvLnRlc3QoaG9zdG5hbWUpID8gJ3dzcycgOiAnd3MnO1xuICB2YXIgd3MgPSBuZXcgV2ViU29ja2V0KHByb3RvY29sICsgJzovLycgKyBob3N0bmFtZSArIChwb3J0ID8gJzonICsgcG9ydCA6ICcnKSArICcvJyk7IC8vICRGbG93Rml4TWVcblxuICB3cy5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnRcbiAgLyo6IHtkYXRhOiBzdHJpbmcsIC4uLn0gKi9cbiAgKSB7XG4gICAgY2hlY2tlZEFzc2V0cyA9IHt9XG4gICAgLyo6IHt8W3N0cmluZ106IGJvb2xlYW58fSAqL1xuICAgIDtcbiAgICBhY2NlcHRlZEFzc2V0cyA9IHt9XG4gICAgLyo6IHt8W3N0cmluZ106IGJvb2xlYW58fSAqL1xuICAgIDtcbiAgICBhc3NldHNUb0FjY2VwdCA9IFtdO1xuICAgIHZhciBkYXRhXG4gICAgLyo6IEhNUk1lc3NhZ2UgKi9cbiAgICA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAndXBkYXRlJykge1xuICAgICAgLy8gUmVtb3ZlIGVycm9yIG92ZXJsYXkgaWYgdGhlcmUgaXMgb25lXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZW1vdmVFcnJvck92ZXJsYXkoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFzc2V0cyA9IGRhdGEuYXNzZXRzLmZpbHRlcihmdW5jdGlvbiAoYXNzZXQpIHtcbiAgICAgICAgcmV0dXJuIGFzc2V0LmVudkhhc2ggPT09IEhNUl9FTlZfSEFTSDtcbiAgICAgIH0pOyAvLyBIYW5kbGUgSE1SIFVwZGF0ZVxuXG4gICAgICB2YXIgaGFuZGxlZCA9IGFzc2V0cy5ldmVyeShmdW5jdGlvbiAoYXNzZXQpIHtcbiAgICAgICAgcmV0dXJuIGFzc2V0LnR5cGUgPT09ICdjc3MnIHx8IGFzc2V0LnR5cGUgPT09ICdqcycgJiYgaG1yQWNjZXB0Q2hlY2sobW9kdWxlLmJ1bmRsZS5yb290LCBhc3NldC5pZCwgYXNzZXQuZGVwc0J5QnVuZGxlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICBjb25zb2xlLmNsZWFyKCk7XG4gICAgICAgIGFzc2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChhc3NldCkge1xuICAgICAgICAgIGhtckFwcGx5KG1vZHVsZS5idW5kbGUucm9vdCwgYXNzZXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzc2V0c1RvQWNjZXB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGlkID0gYXNzZXRzVG9BY2NlcHRbaV1bMV07XG5cbiAgICAgICAgICBpZiAoIWFjY2VwdGVkQXNzZXRzW2lkXSkge1xuICAgICAgICAgICAgaG1yQWNjZXB0UnVuKGFzc2V0c1RvQWNjZXB0W2ldWzBdLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCdyZWxvYWQnIGluIGxvY2F0aW9uKSB7XG4gICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2ViIGV4dGVuc2lvbiBjb250ZXh0XG4gICAgICAgIHZhciBleHQgPSB0eXBlb2YgY2hyb21lID09PSAndW5kZWZpbmVkJyA/IHR5cGVvZiBicm93c2VyID09PSAndW5kZWZpbmVkJyA/IG51bGwgOiBicm93c2VyIDogY2hyb21lO1xuXG4gICAgICAgIGlmIChleHQgJiYgZXh0LnJ1bnRpbWUgJiYgZXh0LnJ1bnRpbWUucmVsb2FkKSB7XG4gICAgICAgICAgZXh0LnJ1bnRpbWUucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAvLyBMb2cgcGFyY2VsIGVycm9ycyB0byBjb25zb2xlXG4gICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGF0YS5kaWFnbm9zdGljcy5hbnNpKSxcbiAgICAgICAgICBfc3RlcDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChfaXRlcmF0b3IucygpOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm4oKSkuZG9uZTspIHtcbiAgICAgICAgICB2YXIgYW5zaURpYWdub3N0aWMgPSBfc3RlcC52YWx1ZTtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBhbnNpRGlhZ25vc3RpYy5jb2RlZnJhbWUgPyBhbnNpRGlhZ25vc3RpYy5jb2RlZnJhbWUgOiBhbnNpRGlhZ25vc3RpYy5zdGFjaztcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCfwn5qoIFtwYXJjZWxdOiAnICsgYW5zaURpYWdub3N0aWMubWVzc2FnZSArICdcXG4nICsgc3RhY2sgKyAnXFxuXFxuJyArIGFuc2lEaWFnbm9zdGljLmhpbnRzLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIF9pdGVyYXRvci5lKGVycik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBfaXRlcmF0b3IuZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBSZW5kZXIgdGhlIGZhbmN5IGh0bWwgb3ZlcmxheVxuICAgICAgICByZW1vdmVFcnJvck92ZXJsYXkoKTtcbiAgICAgICAgdmFyIG92ZXJsYXkgPSBjcmVhdGVFcnJvck92ZXJsYXkoZGF0YS5kaWFnbm9zdGljcy5odG1sKTsgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdzLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKTtcbiAgfTtcblxuICB3cy5vbmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUud2FybignW3BhcmNlbF0g8J+aqCBDb25uZWN0aW9uIHRvIHRoZSBITVIgc2VydmVyIHdhcyBsb3N0Jyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUVycm9yT3ZlcmxheSgpIHtcbiAgdmFyIG92ZXJsYXkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChPVkVSTEFZX0lEKTtcblxuICBpZiAob3ZlcmxheSkge1xuICAgIG92ZXJsYXkucmVtb3ZlKCk7XG4gICAgY29uc29sZS5sb2coJ1twYXJjZWxdIOKcqCBFcnJvciByZXNvbHZlZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVycm9yT3ZlcmxheShkaWFnbm9zdGljcykge1xuICB2YXIgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBvdmVybGF5LmlkID0gT1ZFUkxBWV9JRDtcbiAgdmFyIGVycm9ySFRNTCA9ICc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDogYmxhY2s7IG9wYWNpdHk6IDAuODU7IGZvbnQtc2l6ZTogMTZweDsgY29sb3I6IHdoaXRlOyBwb3NpdGlvbjogZml4ZWQ7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDMwcHg7IGZvbnQtZmFtaWx5OiBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZTsgei1pbmRleDogOTk5OTtcIj4nO1xuXG4gIHZhciBfaXRlcmF0b3IyID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIoZGlhZ25vc3RpY3MpLFxuICAgICAgX3N0ZXAyO1xuXG4gIHRyeSB7XG4gICAgZm9yIChfaXRlcmF0b3IyLnMoKTsgIShfc3RlcDIgPSBfaXRlcmF0b3IyLm4oKSkuZG9uZTspIHtcbiAgICAgIHZhciBkaWFnbm9zdGljID0gX3N0ZXAyLnZhbHVlO1xuICAgICAgdmFyIHN0YWNrID0gZGlhZ25vc3RpYy5jb2RlZnJhbWUgPyBkaWFnbm9zdGljLmNvZGVmcmFtZSA6IGRpYWdub3N0aWMuc3RhY2s7XG4gICAgICBlcnJvckhUTUwgKz0gXCJcXG4gICAgICA8ZGl2PlxcbiAgICAgICAgPGRpdiBzdHlsZT1cXFwiZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMjBweDtcXFwiPlxcbiAgICAgICAgICBcXHVEODNEXFx1REVBOCBcIi5jb25jYXQoZGlhZ25vc3RpYy5tZXNzYWdlLCBcIlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8cHJlPlwiKS5jb25jYXQoc3RhY2ssIFwiPC9wcmU+XFxuICAgICAgICA8ZGl2PlxcbiAgICAgICAgICBcIikuY29uY2F0KGRpYWdub3N0aWMuaGludHMubWFwKGZ1bmN0aW9uIChoaW50KSB7XG4gICAgICAgIHJldHVybiAnPGRpdj7wn5KhICcgKyBoaW50ICsgJzwvZGl2Pic7XG4gICAgICB9KS5qb2luKCcnKSwgXCJcXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgXCIpLmNvbmNhdChkaWFnbm9zdGljLmRvY3VtZW50YXRpb24gPyBcIjxkaXY+XFx1RDgzRFxcdURDREQgPGEgc3R5bGU9XFxcImNvbG9yOiB2aW9sZXRcXFwiIGhyZWY9XFxcIlwiLmNvbmNhdChkaWFnbm9zdGljLmRvY3VtZW50YXRpb24sIFwiXFxcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCI+TGVhcm4gbW9yZTwvYT48L2Rpdj5cIikgOiAnJywgXCJcXG4gICAgICA8L2Rpdj5cXG4gICAgXCIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2l0ZXJhdG9yMi5lKGVycik7XG4gIH0gZmluYWxseSB7XG4gICAgX2l0ZXJhdG9yMi5mKCk7XG4gIH1cblxuICBlcnJvckhUTUwgKz0gJzwvZGl2Pic7XG4gIG92ZXJsYXkuaW5uZXJIVE1MID0gZXJyb3JIVE1MO1xuICByZXR1cm4gb3ZlcmxheTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50cyhidW5kbGUsIGlkKVxuLyo6IEFycmF5PFtQYXJjZWxSZXF1aXJlLCBzdHJpbmddPiAqL1xue1xuICB2YXIgbW9kdWxlcyA9IGJ1bmRsZS5tb2R1bGVzO1xuXG4gIGlmICghbW9kdWxlcykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBwYXJlbnRzID0gW107XG4gIHZhciBrLCBkLCBkZXA7XG5cbiAgZm9yIChrIGluIG1vZHVsZXMpIHtcbiAgICBmb3IgKGQgaW4gbW9kdWxlc1trXVsxXSkge1xuICAgICAgZGVwID0gbW9kdWxlc1trXVsxXVtkXTtcblxuICAgICAgaWYgKGRlcCA9PT0gaWQgfHwgQXJyYXkuaXNBcnJheShkZXApICYmIGRlcFtkZXAubGVuZ3RoIC0gMV0gPT09IGlkKSB7XG4gICAgICAgIHBhcmVudHMucHVzaChbYnVuZGxlLCBrXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGJ1bmRsZS5wYXJlbnQpIHtcbiAgICBwYXJlbnRzID0gcGFyZW50cy5jb25jYXQoZ2V0UGFyZW50cyhidW5kbGUucGFyZW50LCBpZCkpO1xuICB9XG5cbiAgcmV0dXJuIHBhcmVudHM7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxpbmsobGluaykge1xuICB2YXIgbmV3TGluayA9IGxpbmsuY2xvbmVOb2RlKCk7XG5cbiAgbmV3TGluay5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGxpbmsucGFyZW50Tm9kZSAhPT0gbnVsbCkge1xuICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgbGluay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGxpbmspO1xuICAgIH1cbiAgfTtcblxuICBuZXdMaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIC8vICRGbG93Rml4TWVcbiAgbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zcGxpdCgnPycpWzBdICsgJz8nICsgRGF0ZS5ub3coKSk7IC8vICRGbG93Rml4TWVcblxuICBsaW5rLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0xpbmssIGxpbmsubmV4dFNpYmxpbmcpO1xufVxuXG52YXIgY3NzVGltZW91dCA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlbG9hZENTUygpIHtcbiAgaWYgKGNzc1RpbWVvdXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjc3NUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9XCJzdHlsZXNoZWV0XCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS10eXBlXVxuICAgICAgdmFyIGhyZWZcbiAgICAgIC8qOiBzdHJpbmcgKi9cbiAgICAgID0gbGlua3NbaV0uZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgICB2YXIgaG9zdG5hbWUgPSBnZXRIb3N0bmFtZSgpO1xuICAgICAgdmFyIHNlcnZlZEZyb21ITVJTZXJ2ZXIgPSBob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgPyBuZXcgUmVnRXhwKCdeKGh0dHBzPzpcXFxcL1xcXFwvKDAuMC4wLjB8MTI3LjAuMC4xKXxsb2NhbGhvc3QpOicgKyBnZXRQb3J0KCkpLnRlc3QoaHJlZikgOiBocmVmLmluZGV4T2YoaG9zdG5hbWUgKyAnOicgKyBnZXRQb3J0KCkpO1xuICAgICAgdmFyIGFic29sdXRlID0gL15odHRwcz86XFwvXFwvL2kudGVzdChocmVmKSAmJiBocmVmLmluZGV4T2YobG9jYXRpb24ub3JpZ2luKSAhPT0gMCAmJiAhc2VydmVkRnJvbUhNUlNlcnZlcjtcblxuICAgICAgaWYgKCFhYnNvbHV0ZSkge1xuICAgICAgICB1cGRhdGVMaW5rKGxpbmtzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjc3NUaW1lb3V0ID0gbnVsbDtcbiAgfSwgNTApO1xufVxuXG5mdW5jdGlvbiBobXJBcHBseShidW5kbGVcbi8qOiBQYXJjZWxSZXF1aXJlICovXG4sIGFzc2V0XG4vKjogIEhNUkFzc2V0ICovXG4pIHtcbiAgdmFyIG1vZHVsZXMgPSBidW5kbGUubW9kdWxlcztcblxuICBpZiAoIW1vZHVsZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXNzZXQudHlwZSA9PT0gJ2NzcycpIHtcbiAgICByZWxvYWRDU1MoKTtcbiAgfSBlbHNlIGlmIChhc3NldC50eXBlID09PSAnanMnKSB7XG4gICAgdmFyIGRlcHMgPSBhc3NldC5kZXBzQnlCdW5kbGVbYnVuZGxlLkhNUl9CVU5ETEVfSURdO1xuXG4gICAgaWYgKGRlcHMpIHtcbiAgICAgIGlmIChtb2R1bGVzW2Fzc2V0LmlkXSkge1xuICAgICAgICAvLyBSZW1vdmUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIHJlbW92ZWQgYW5kIHdpbGwgYmVjb21lIG9ycGhhbmVkLlxuICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IGlmIHRoZSBhc3NldCBpcyBhZGRlZCBiYWNrIGFnYWluLCB0aGUgY2FjaGUgaXMgZ29uZSwgYW5kIHdlIHByZXZlbnQgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuICAgICAgICB2YXIgb2xkRGVwcyA9IG1vZHVsZXNbYXNzZXQuaWRdWzFdO1xuXG4gICAgICAgIGZvciAodmFyIGRlcCBpbiBvbGREZXBzKSB7XG4gICAgICAgICAgaWYgKCFkZXBzW2RlcF0gfHwgZGVwc1tkZXBdICE9PSBvbGREZXBzW2RlcF0pIHtcbiAgICAgICAgICAgIHZhciBpZCA9IG9sZERlcHNbZGVwXTtcbiAgICAgICAgICAgIHZhciBwYXJlbnRzID0gZ2V0UGFyZW50cyhtb2R1bGUuYnVuZGxlLnJvb3QsIGlkKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgIGhtckRlbGV0ZShtb2R1bGUuYnVuZGxlLnJvb3QsIGlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGZuID0gbmV3IEZ1bmN0aW9uKCdyZXF1aXJlJywgJ21vZHVsZScsICdleHBvcnRzJywgYXNzZXQub3V0cHV0KTtcbiAgICAgIG1vZHVsZXNbYXNzZXQuaWRdID0gW2ZuLCBkZXBzXTtcbiAgICB9IGVsc2UgaWYgKGJ1bmRsZS5wYXJlbnQpIHtcbiAgICAgIGhtckFwcGx5KGJ1bmRsZS5wYXJlbnQsIGFzc2V0KTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaG1yRGVsZXRlKGJ1bmRsZSwgaWQpIHtcbiAgdmFyIG1vZHVsZXMgPSBidW5kbGUubW9kdWxlcztcblxuICBpZiAoIW1vZHVsZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAobW9kdWxlc1tpZF0pIHtcbiAgICAvLyBDb2xsZWN0IGRlcGVuZGVuY2llcyB0aGF0IHdpbGwgYmVjb21lIG9ycGhhbmVkIHdoZW4gdGhpcyBtb2R1bGUgaXMgZGVsZXRlZC5cbiAgICB2YXIgZGVwcyA9IG1vZHVsZXNbaWRdWzFdO1xuICAgIHZhciBvcnBoYW5zID0gW107XG5cbiAgICBmb3IgKHZhciBkZXAgaW4gZGVwcykge1xuICAgICAgdmFyIHBhcmVudHMgPSBnZXRQYXJlbnRzKG1vZHVsZS5idW5kbGUucm9vdCwgZGVwc1tkZXBdKTtcblxuICAgICAgaWYgKHBhcmVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIG9ycGhhbnMucHVzaChkZXBzW2RlcF0pO1xuICAgICAgfVxuICAgIH0gLy8gRGVsZXRlIHRoZSBtb2R1bGUuIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBkZWxldGluZyBkZXBlbmRlbmNpZXMgaW4gY2FzZSBvZiBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG5cblxuICAgIGRlbGV0ZSBtb2R1bGVzW2lkXTtcbiAgICBkZWxldGUgYnVuZGxlLmNhY2hlW2lkXTsgLy8gTm93IGRlbGV0ZSB0aGUgb3JwaGFucy5cblxuICAgIG9ycGhhbnMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGhtckRlbGV0ZShtb2R1bGUuYnVuZGxlLnJvb3QsIGlkKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChidW5kbGUucGFyZW50KSB7XG4gICAgaG1yRGVsZXRlKGJ1bmRsZS5wYXJlbnQsIGlkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBobXJBY2NlcHRDaGVjayhidW5kbGVcbi8qOiBQYXJjZWxSZXF1aXJlICovXG4sIGlkXG4vKjogc3RyaW5nICovXG4sIGRlcHNCeUJ1bmRsZVxuLyo6ID97IFtzdHJpbmddOiB7IFtzdHJpbmddOiBzdHJpbmcgfSB9Ki9cbikge1xuICBpZiAoaG1yQWNjZXB0Q2hlY2tPbmUoYnVuZGxlLCBpZCwgZGVwc0J5QnVuZGxlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIFRyYXZlcnNlIHBhcmVudHMgYnJlYWR0aCBmaXJzdC4gQWxsIHBvc3NpYmxlIGFuY2VzdHJpZXMgbXVzdCBhY2NlcHQgdGhlIEhNUiB1cGRhdGUsIG9yIHdlJ2xsIHJlbG9hZC5cblxuXG4gIHZhciBwYXJlbnRzID0gZ2V0UGFyZW50cyhtb2R1bGUuYnVuZGxlLnJvb3QsIGlkKTtcbiAgdmFyIGFjY2VwdGVkID0gZmFsc2U7XG5cbiAgd2hpbGUgKHBhcmVudHMubGVuZ3RoID4gMCkge1xuICAgIHZhciB2ID0gcGFyZW50cy5zaGlmdCgpO1xuICAgIHZhciBhID0gaG1yQWNjZXB0Q2hlY2tPbmUodlswXSwgdlsxXSwgbnVsbCk7XG5cbiAgICBpZiAoYSkge1xuICAgICAgLy8gSWYgdGhpcyBwYXJlbnQgYWNjZXB0cywgc3RvcCB0cmF2ZXJzaW5nIHVwd2FyZCwgYnV0IHN0aWxsIGNvbnNpZGVyIHNpYmxpbmdzLlxuICAgICAgYWNjZXB0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlcndpc2UsIHF1ZXVlIHRoZSBwYXJlbnRzIGluIHRoZSBuZXh0IGxldmVsIHVwd2FyZC5cbiAgICAgIHZhciBwID0gZ2V0UGFyZW50cyhtb2R1bGUuYnVuZGxlLnJvb3QsIHZbMV0pO1xuXG4gICAgICBpZiAocC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHBhcmVudHMsIHRoZW4gd2UndmUgcmVhY2hlZCBhbiBlbnRyeSB3aXRob3V0IGFjY2VwdGluZy4gUmVsb2FkLlxuICAgICAgICBhY2NlcHRlZCA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcGFyZW50cy5wdXNoLmFwcGx5KHBhcmVudHMsIF90b0NvbnN1bWFibGVBcnJheShwKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFjY2VwdGVkO1xufVxuXG5mdW5jdGlvbiBobXJBY2NlcHRDaGVja09uZShidW5kbGVcbi8qOiBQYXJjZWxSZXF1aXJlICovXG4sIGlkXG4vKjogc3RyaW5nICovXG4sIGRlcHNCeUJ1bmRsZVxuLyo6ID97IFtzdHJpbmddOiB7IFtzdHJpbmddOiBzdHJpbmcgfSB9Ki9cbikge1xuICB2YXIgbW9kdWxlcyA9IGJ1bmRsZS5tb2R1bGVzO1xuXG4gIGlmICghbW9kdWxlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChkZXBzQnlCdW5kbGUgJiYgIWRlcHNCeUJ1bmRsZVtidW5kbGUuSE1SX0JVTkRMRV9JRF0pIHtcbiAgICAvLyBJZiB3ZSByZWFjaGVkIHRoZSByb290IGJ1bmRsZSB3aXRob3V0IGZpbmRpbmcgd2hlcmUgdGhlIGFzc2V0IHNob3VsZCBnbyxcbiAgICAvLyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uIE1hcmsgYXMgXCJhY2NlcHRlZFwiIHNvIHdlIGRvbid0IHJlbG9hZCB0aGUgcGFnZS5cbiAgICBpZiAoIWJ1bmRsZS5wYXJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBobXJBY2NlcHRDaGVjayhidW5kbGUucGFyZW50LCBpZCwgZGVwc0J5QnVuZGxlKTtcbiAgfVxuXG4gIGlmIChjaGVja2VkQXNzZXRzW2lkXSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY2hlY2tlZEFzc2V0c1tpZF0gPSB0cnVlO1xuICB2YXIgY2FjaGVkID0gYnVuZGxlLmNhY2hlW2lkXTtcbiAgYXNzZXRzVG9BY2NlcHQucHVzaChbYnVuZGxlLCBpZF0pO1xuXG4gIGlmICghY2FjaGVkIHx8IGNhY2hlZC5ob3QgJiYgY2FjaGVkLmhvdC5fYWNjZXB0Q2FsbGJhY2tzLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhtckFjY2VwdFJ1bihidW5kbGVcbi8qOiBQYXJjZWxSZXF1aXJlICovXG4sIGlkXG4vKjogc3RyaW5nICovXG4pIHtcbiAgdmFyIGNhY2hlZCA9IGJ1bmRsZS5jYWNoZVtpZF07XG4gIGJ1bmRsZS5ob3REYXRhID0ge307XG5cbiAgaWYgKGNhY2hlZCAmJiBjYWNoZWQuaG90KSB7XG4gICAgY2FjaGVkLmhvdC5kYXRhID0gYnVuZGxlLmhvdERhdGE7XG4gIH1cblxuICBpZiAoY2FjaGVkICYmIGNhY2hlZC5ob3QgJiYgY2FjaGVkLmhvdC5fZGlzcG9zZUNhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICBjYWNoZWQuaG90Ll9kaXNwb3NlQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7XG4gICAgICBjYihidW5kbGUuaG90RGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGUgYnVuZGxlLmNhY2hlW2lkXTtcbiAgYnVuZGxlKGlkKTtcbiAgY2FjaGVkID0gYnVuZGxlLmNhY2hlW2lkXTtcblxuICBpZiAoY2FjaGVkICYmIGNhY2hlZC5ob3QgJiYgY2FjaGVkLmhvdC5fYWNjZXB0Q2FsbGJhY2tzLmxlbmd0aCkge1xuICAgIGNhY2hlZC5ob3QuX2FjY2VwdENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgdmFyIGFzc2V0c1RvQWxzb0FjY2VwdCA9IGNiKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGdldFBhcmVudHMobW9kdWxlLmJ1bmRsZS5yb290LCBpZCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGFzc2V0c1RvQWxzb0FjY2VwdCAmJiBhc3NldHNUb0FjY2VwdC5sZW5ndGgpIHtcbiAgICAgICAgLy8gJEZsb3dGaXhNZVttZXRob2QtdW5iaW5kaW5nXVxuICAgICAgICBhc3NldHNUb0FjY2VwdC5wdXNoLmFwcGx5KGFzc2V0c1RvQWNjZXB0LCBhc3NldHNUb0Fsc29BY2NlcHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWNjZXB0ZWRBc3NldHNbaWRdID0gdHJ1ZTtcbn0iLCJpbXBvcnQgJy4vb3B0aW9ucy9vcHRpb25zLXN0b3JhZ2UnXG5cbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJ1xuXG4vLyBjb21wYXRpYmlsaXR5IGJldHdlZW4gdjIgYW5kIHYzIG1hbmlmZXN0XG5icm93c2VyLmFjdGlvbj8ub25DbGlja2VkLmFkZExpc3RlbmVyKGFzeW5jICgpID0+IGJyb3dzZXIucnVudGltZS5vcGVuT3B0aW9uc1BhZ2UoKSlcbmJyb3dzZXIuYnJvd3NlckFjdGlvbj8ub25DbGlja2VkLmFkZExpc3RlbmVyKGFzeW5jICgpID0+IGJyb3dzZXIucnVudGltZS5vcGVuT3B0aW9uc1BhZ2UoKSlcblxuY29uc3QgY29weVBhZ2VGcmFnbWVudCA9ICdjb3B5LXBhZ2UtZnJhZ21lbnQnXG5cbmJyb3dzZXIuY29udGV4dE1lbnVzLmNyZWF0ZSh7XG5cdGlkOiBjb3B5UGFnZUZyYWdtZW50LFxuXHR0aXRsZTogJ0NvcHkgUGFnZSBGcmFnbWVudCcsXG5cdGNvbnRleHRzOiBbJ2FsbCddLFxufSlcblxuYnJvd3Nlci5jb250ZXh0TWVudXMub25DbGlja2VkLmFkZExpc3RlbmVyKChpbmZvLCB0YWIpID0+IHtcblx0aWYgKGluZm8ubWVudUl0ZW1JZCA9PT0gY29weVBhZ2VGcmFnbWVudCkge1xuXHRcdHZvaWQgYnJvd3Nlci50YWJzLnNlbmRNZXNzYWdlKHRhYj8uaWQhLCB7dHlwZTogY29weVBhZ2VGcmFnbWVudCwgZWxlbWVudElkOiBpbmZvLnRhcmdldEVsZW1lbnRJZH0pXG5cdH1cbn0pXG4iLCJpbXBvcnQgT3B0aW9uc1N5bmMgZnJvbSAnd2ViZXh0LW9wdGlvbnMtc3luYydcbmltcG9ydCB7YWxsb3dTdWJkb21haW5zRnJvbSwgd2hpdGVsaXN0RG9tYWluc30gZnJvbSAnLi9kZWZhdWx0cy9pZnJhbWUnXG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuXHRyZW5kZXJCbG9ja2xpc3Q6ICdnd2Vybi5uZXQsIHdpa2lwZWRpYS5vcmcsIHlvdXR1YmUuY29tLCByb2FtLmdhcmRlbicsXG5cdGlmcmFtZURvbWFpbldoaXRlbGlzdDogd2hpdGVsaXN0RG9tYWlucy5qb2luKCcsICcpLFxuXHRpZnJhbWVTdWJkb21haW5XaGl0ZWxpc3Q6IGFsbG93U3ViZG9tYWluc0Zyb20uam9pbignLCAnKSxcbn1cblxuZXhwb3J0IGNvbnN0IG9wdGlvbnNTdG9yYWdlID0gbmV3IE9wdGlvbnNTeW5jKHtcblx0ZGVmYXVsdHMsXG5cdG1pZ3JhdGlvbnM6IFtcblx0XHRPcHRpb25zU3luYy5taWdyYXRpb25zLnJlbW92ZVVudXNlZCxcblx0XSxcblx0bG9nZ2luZzogdHJ1ZSxcblx0c3RvcmFnZVR5cGU6ICdsb2NhbCcsXG59KVxuXG5leHBvcnQgY29uc3QgT3B0aW9ucyA9IHtcblx0YXN5bmMgYWxsKCkge1xuXHRcdHJldHVybiBhd2FpdCBvcHRpb25zU3RvcmFnZS5nZXRBbGwoKSBhcyB0eXBlb2YgZGVmYXVsdHNcblx0fSxcblxuXHRyZW5kZXJCbG9ja2xpc3Q6IGNzdlNldHRpbmcoJ3JlbmRlckJsb2NrbGlzdCcpLFxuXG5cdGlmcmFtZToge1xuXHRcdGRvbWFpbldoaXRlbGlzdDogY3N2U2V0dGluZygnaWZyYW1lRG9tYWluV2hpdGVsaXN0JyksXG5cdFx0c3ViZG9tYWluV2hpdGVsaXN0OiBjc3ZTZXR0aW5nKCdpZnJhbWVTdWJkb21haW5XaGl0ZWxpc3QnKSxcblx0fSxcbn1cblxudHlwZSBTZXR0aW5nTmFtZSA9IGtleW9mIHR5cGVvZiBkZWZhdWx0c1xuXG5mdW5jdGlvbiBjc3ZTZXR0aW5nKG5hbWU6IFNldHRpbmdOYW1lKSB7XG5cdHJldHVybiBhc3luYyAoKSA9PiB7XG5cdFx0Y29uc3QgYWxsID0gYXdhaXQgT3B0aW9ucy5hbGwoKVxuXHRcdHJldHVybiBwYXJzZUNzdihhbGxbbmFtZV0pXG5cdH1cbn1cblxuY29uc3QgcGFyc2VDc3YgPSAoY3N2OiBzdHJpbmcpID0+IGNzdi5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKVxuIiwiaW1wb3J0IHsgaXNCYWNrZ3JvdW5kIH0gZnJvbSBcIndlYmV4dC1kZXRlY3QtcGFnZVwiO1xuXG5mdW5jdGlvbiB0aHJvdHRsZShkZWxheSwgbm9UcmFpbGluZywgY2FsbGJhY2ssIGRlYm91bmNlTW9kZSkge1xuICAgIHZhciB0aW1lb3V0SUQ7XG4gICAgdmFyIGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgIHZhciBsYXN0RXhlYyA9IDA7XG4gICAgZnVuY3Rpb24gY2xlYXJFeGlzdGluZ1RpbWVvdXQoKSB7XG4gICAgICAgIHRpbWVvdXRJRCAmJiBjbGVhclRpbWVvdXQodGltZW91dElEKTtcbiAgICB9XG4gICAgaWYgKFwiYm9vbGVhblwiICE9IHR5cGVvZiBub1RyYWlsaW5nKSB7XG4gICAgICAgIGRlYm91bmNlTW9kZSA9IGNhbGxiYWNrO1xuICAgICAgICBjYWxsYmFjayA9IG5vVHJhaWxpbmc7XG4gICAgICAgIG5vVHJhaWxpbmcgPSB2b2lkIDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmd1bWVudHNfID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykgYXJndW1lbnRzX1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgZWxhcHNlZCA9IERhdGUubm93KCkgLSBsYXN0RXhlYztcbiAgICAgICAgaWYgKCFjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIGRlYm91bmNlTW9kZSAmJiAhdGltZW91dElEICYmIGV4ZWMoKTtcbiAgICAgICAgICAgIGNsZWFyRXhpc3RpbmdUaW1lb3V0KCk7XG4gICAgICAgICAgICB2b2lkIDAgPT09IGRlYm91bmNlTW9kZSAmJiBlbGFwc2VkID4gZGVsYXkgPyBleGVjKCkgOiB0cnVlICE9PSBub1RyYWlsaW5nICYmICh0aW1lb3V0SUQgPSBzZXRUaW1lb3V0KGRlYm91bmNlTW9kZSA/IGNsZWFyIDogZXhlYywgdm9pZCAwID09PSBkZWJvdW5jZU1vZGUgPyBkZWxheSAtIGVsYXBzZWQgOiBkZWxheSkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICAgICAgICBsYXN0RXhlYyA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBjYWxsYmFjay5hcHBseShzZWxmLCBhcmd1bWVudHNfKTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgICAgIHRpbWVvdXRJRCA9IHZvaWQgMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB3cmFwcGVyLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBjbGVhckV4aXN0aW5nVGltZW91dCgpO1xuICAgICAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbmNsYXNzIFR5cGVSZWdpc3RyeSB7XG4gICAgY29uc3RydWN0b3IoaW5pdGlhbCA9IHt9KSB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJlZFR5cGVzID0gaW5pdGlhbDtcbiAgICB9XG4gICAgZ2V0KHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdGhpcy5yZWdpc3RlcmVkVHlwZXNbdHlwZV0gPyB0aGlzLnJlZ2lzdGVyZWRUeXBlc1t0eXBlXSA6IHRoaXMucmVnaXN0ZXJlZFR5cGVzLmRlZmF1bHQ7XG4gICAgfVxuICAgIHJlZ2lzdGVyKHR5cGUsIGl0ZW0pIHtcbiAgICAgICAgdm9pZCAwID09PSB0aGlzLnJlZ2lzdGVyZWRUeXBlc1t0eXBlXSAmJiAodGhpcy5yZWdpc3RlcmVkVHlwZXNbdHlwZV0gPSBpdGVtKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJEZWZhdWx0KGl0ZW0pIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihcImRlZmF1bHRcIiwgaXRlbSk7XG4gICAgfVxufVxuXG5jbGFzcyBLZXlFeHRyYWN0b3JzIGV4dGVuZHMgVHlwZVJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRGVmYXVsdCgoZWwgPT4gZWwuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiKSk7XG4gICAgfVxufVxuXG5jbGFzcyBJbnB1dFJlYWRlcnMgZXh0ZW5kcyBUeXBlUmVnaXN0cnkge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEZWZhdWx0KChlbCA9PiBlbC52YWx1ZSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKFwiY2hlY2tib3hcIiwgKGVsID0+IG51bGwgIT09IGVsLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpID8gZWwuY2hlY2tlZCA/IGVsLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpIDogbnVsbCA6IGVsLmNoZWNrZWQpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihcInNlbGVjdFwiLCAoZWwgPT4gZnVuY3Rpb24oZWxlbSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlLCBvcHRpb24sIGk7XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGVsZW0ub3B0aW9ucztcbiAgICAgICAgICAgIHZhciBpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleDtcbiAgICAgICAgICAgIHZhciBvbmUgPSBcInNlbGVjdC1vbmVcIiA9PT0gZWxlbS50eXBlO1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXTtcbiAgICAgICAgICAgIHZhciBtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGkgPSBpbmRleCA8IDAgPyBtYXggOiBvbmUgPyBpbmRleCA6IDA7XG4gICAgICAgICAgICBmb3IgKDtpIDwgbWF4OyBpKyspIGlmICgoKG9wdGlvbiA9IG9wdGlvbnNbaV0pLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4KSAmJiAhb3B0aW9uLmRpc2FibGVkICYmICEob3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgJiYgXCJvcHRncm91cFwiID09PSBvcHRpb24ucGFyZW50Tm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBvcHRpb24udmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKG9uZSkgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgICAgIH0oZWwpKSk7XG4gICAgfVxufVxuXG5jbGFzcyBLZXlBc3NpZ25tZW50VmFsaWRhdG9ycyBleHRlbmRzIFR5cGVSZWdpc3RyeSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRlZmF1bHQoKCgpID0+IHRydWUpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihcInJhZGlvXCIsIChlbCA9PiBlbC5jaGVja2VkKSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBrZXlTcGxpdHRlcihrZXkpIHtcbiAgICBsZXQgbWF0Y2hlcyA9IGtleS5tYXRjaCgvW15bXFxdXSsvZyk7XG4gICAgbGV0IGxhc3RLZXk7XG4gICAgaWYgKGtleS5sZW5ndGggPiAxICYmIGtleS5pbmRleE9mKFwiW11cIikgPT09IGtleS5sZW5ndGggLSAyKSB7XG4gICAgICAgIGxhc3RLZXkgPSBtYXRjaGVzLnBvcCgpO1xuICAgICAgICBtYXRjaGVzLnB1c2goWyBsYXN0S2V5IF0pO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudFR5cGUoZWwpIHtcbiAgICBsZXQgdHlwZUF0dHI7XG4gICAgbGV0IHRhZ05hbWUgPSBlbC50YWdOYW1lO1xuICAgIGxldCB0eXBlID0gdGFnTmFtZTtcbiAgICBpZiAoXCJpbnB1dFwiID09PSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgdHlwZUF0dHIgPSBlbC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuICAgICAgICB0eXBlID0gdHlwZUF0dHIgfHwgXCJ0ZXh0XCI7XG4gICAgfVxuICAgIHJldHVybiB0eXBlLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIGdldElucHV0RWxlbWVudHMoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXQsc2VsZWN0LHRleHRhcmVhXCIpLCAoZWwgPT4ge1xuICAgICAgICBpZiAoXCJpbnB1dFwiID09PSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgJiYgKFwic3VibWl0XCIgPT09IGVsLnR5cGUgfHwgXCJyZXNldFwiID09PSBlbC50eXBlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgbXlUeXBlID0gZ2V0RWxlbWVudFR5cGUoZWwpO1xuICAgICAgICBsZXQgaWRlbnRpZmllciA9IG9wdGlvbnMua2V5RXh0cmFjdG9ycy5nZXQobXlUeXBlKShlbCk7XG4gICAgICAgIGxldCBmb3VuZEluSW5jbHVkZSA9IC0xICE9PSAob3B0aW9ucy5pbmNsdWRlIHx8IFtdKS5pbmRleE9mKGlkZW50aWZpZXIpO1xuICAgICAgICBsZXQgZm91bmRJbkV4Y2x1ZGUgPSAtMSAhPT0gKG9wdGlvbnMuZXhjbHVkZSB8fCBbXSkuaW5kZXhPZihpZGVudGlmaWVyKTtcbiAgICAgICAgbGV0IGZvdW5kSW5JZ25vcmVkID0gZmFsc2U7XG4gICAgICAgIGxldCByZWplY3QgPSBmYWxzZTtcbiAgICAgICAgaWYgKG9wdGlvbnMuaWdub3JlZFR5cGVzKSBmb3IgKGxldCBzZWxlY3RvciBvZiBvcHRpb25zLmlnbm9yZWRUeXBlcykgZWwubWF0Y2hlcyhzZWxlY3RvcikgJiYgKGZvdW5kSW5JZ25vcmVkID0gdHJ1ZSk7XG4gICAgICAgIHJlamVjdCA9ICFmb3VuZEluSW5jbHVkZSAmJiAoISFvcHRpb25zLmluY2x1ZGUgfHwgKGZvdW5kSW5FeGNsdWRlIHx8IGZvdW5kSW5JZ25vcmVkKSk7XG4gICAgICAgIHJldHVybiAhcmVqZWN0O1xuICAgIH0pKTtcbn1cblxuZnVuY3Rpb24gYXNzaWduS2V5VmFsdWUob2JqLCBrZXljaGFpbiwgdmFsdWUpIHtcbiAgICBpZiAoIWtleWNoYWluKSByZXR1cm4gb2JqO1xuICAgIHZhciBrZXkgPSBrZXljaGFpbi5zaGlmdCgpO1xuICAgIG9ialtrZXldIHx8IChvYmpba2V5XSA9IEFycmF5LmlzQXJyYXkoa2V5KSA/IFtdIDoge30pO1xuICAgIDAgPT09IGtleWNoYWluLmxlbmd0aCAmJiAoQXJyYXkuaXNBcnJheShvYmpba2V5XSkgPyBudWxsICE9PSB2YWx1ZSAmJiBvYmpba2V5XS5wdXNoKHZhbHVlKSA6IG9ialtrZXldID0gdmFsdWUpO1xuICAgIGtleWNoYWluLmxlbmd0aCA+IDAgJiYgYXNzaWduS2V5VmFsdWUob2JqW2tleV0sIGtleWNoYWluLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gc2VyaWFsaXplKGVsZW1lbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBkYXRhID0ge307XG4gICAgb3B0aW9ucy5rZXlTcGxpdHRlciA9IG9wdGlvbnMua2V5U3BsaXR0ZXIgfHwga2V5U3BsaXR0ZXI7XG4gICAgb3B0aW9ucy5rZXlFeHRyYWN0b3JzID0gbmV3IEtleUV4dHJhY3RvcnMob3B0aW9ucy5rZXlFeHRyYWN0b3JzIHx8IHt9KTtcbiAgICBvcHRpb25zLmlucHV0UmVhZGVycyA9IG5ldyBJbnB1dFJlYWRlcnMob3B0aW9ucy5pbnB1dFJlYWRlcnMgfHwge30pO1xuICAgIG9wdGlvbnMua2V5QXNzaWdubWVudFZhbGlkYXRvcnMgPSBuZXcgS2V5QXNzaWdubWVudFZhbGlkYXRvcnMob3B0aW9ucy5rZXlBc3NpZ25tZW50VmFsaWRhdG9ycyB8fCB7fSk7XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChnZXRJbnB1dEVsZW1lbnRzKGVsZW1lbnQsIG9wdGlvbnMpLCAoZWwgPT4ge1xuICAgICAgICBsZXQgdHlwZSA9IGdldEVsZW1lbnRUeXBlKGVsKTtcbiAgICAgICAgbGV0IGtleSA9IG9wdGlvbnMua2V5RXh0cmFjdG9ycy5nZXQodHlwZSkoZWwpO1xuICAgICAgICBsZXQgdmFsdWUgPSBvcHRpb25zLmlucHV0UmVhZGVycy5nZXQodHlwZSkoZWwpO1xuICAgICAgICBpZiAob3B0aW9ucy5rZXlBc3NpZ25tZW50VmFsaWRhdG9ycy5nZXQodHlwZSkoZWwsIGtleSwgdmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQga2V5Y2hhaW4gPSBvcHRpb25zLmtleVNwbGl0dGVyKGtleSk7XG4gICAgICAgICAgICBkYXRhID0gYXNzaWduS2V5VmFsdWUoZGF0YSwga2V5Y2hhaW4sIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgICByZXR1cm4gZGF0YTtcbn1cblxuY2xhc3MgSW5wdXRXcml0ZXJzIGV4dGVuZHMgVHlwZVJlZ2lzdHJ5IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRGVmYXVsdCgoKGVsLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgZWwudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKFwiY2hlY2tib3hcIiwgKChlbCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIG51bGwgPT09IHZhbHVlID8gZWwuaW5kZXRlcm1pbmF0ZSA9IHRydWUgOiBlbC5jaGVja2VkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAtMSAhPT0gdmFsdWUuaW5kZXhPZihlbC52YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKFwicmFkaW9cIiwgKGZ1bmN0aW9uKGVsLCB2YWx1ZSkge1xuICAgICAgICAgICAgdm9pZCAwICE9PSB2YWx1ZSAmJiAoZWwuY2hlY2tlZCA9IGVsLnZhbHVlID09PSB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKFwic2VsZWN0XCIsIHNldFNlbGVjdFZhbHVlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldFNlbGVjdFZhbHVlKGVsZW0sIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvblNldCwgb3B0aW9uO1xuICAgIHZhciBvcHRpb25zID0gZWxlbS5vcHRpb25zO1xuICAgIHZhciB2YWx1ZXMgPSBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgdmFyIHJldCA9IFtdO1xuICAgICAgICBudWxsICE9PSBhcnIgJiYgKEFycmF5LmlzQXJyYXkoYXJyKSA/IHJldC5wdXNoLmFwcGx5KHJldCwgYXJyKSA6IHJldC5wdXNoKGFycikpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0odmFsdWUpO1xuICAgIHZhciBpID0gb3B0aW9ucy5sZW5ndGg7XG4gICAgZm9yICg7aS0tOyApIHtcbiAgICAgICAgb3B0aW9uID0gb3B0aW9uc1tpXTtcbiAgICAgICAgaWYgKHZhbHVlcy5pbmRleE9mKG9wdGlvbi52YWx1ZSkgPiAtMSkge1xuICAgICAgICAgICAgb3B0aW9uLnNldEF0dHJpYnV0ZShcInNlbGVjdGVkXCIsIHRydWUpO1xuICAgICAgICAgICAgb3B0aW9uU2V0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvcHRpb25TZXQgfHwgKGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xKTtcbn1cblxuZnVuY3Rpb24ga2V5Sm9pbmVyKHBhcmVudEtleSwgY2hpbGRLZXkpIHtcbiAgICByZXR1cm4gcGFyZW50S2V5ICsgXCJbXCIgKyBjaGlsZEtleSArIFwiXVwiO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuRGF0YShkYXRhLCBwYXJlbnRLZXksIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBmbGF0RGF0YSA9IHt9O1xuICAgIGxldCBrZXlKb2luZXIkMSA9IG9wdGlvbnMua2V5Sm9pbmVyIHx8IGtleUpvaW5lcjtcbiAgICBmb3IgKGxldCBrZXlOYW1lIGluIGRhdGEpIHtcbiAgICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KGtleU5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgbGV0IHZhbHVlID0gZGF0YVtrZXlOYW1lXTtcbiAgICAgICAgbGV0IGhhc2ggPSB7fTtcbiAgICAgICAgcGFyZW50S2V5ICYmIChrZXlOYW1lID0ga2V5Sm9pbmVyJDEocGFyZW50S2V5LCBrZXlOYW1lKSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgaGFzaFtrZXlOYW1lICsgXCJbXVwiXSA9IHZhbHVlO1xuICAgICAgICAgICAgaGFzaFtrZXlOYW1lXSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2UgXCJvYmplY3RcIiA9PSB0eXBlb2YgdmFsdWUgPyBoYXNoID0gZmxhdHRlbkRhdGEodmFsdWUsIGtleU5hbWUsIG9wdGlvbnMpIDogaGFzaFtrZXlOYW1lXSA9IHZhbHVlO1xuICAgICAgICBPYmplY3QuYXNzaWduKGZsYXREYXRhLCBoYXNoKTtcbiAgICB9XG4gICAgcmV0dXJuIGZsYXREYXRhO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZShmb3JtLCBkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBsZXQgZmxhdHRlbmVkRGF0YSA9IGZsYXR0ZW5EYXRhKGRhdGEsIG51bGwsIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMua2V5RXh0cmFjdG9ycyA9IG5ldyBLZXlFeHRyYWN0b3JzKG9wdGlvbnMua2V5RXh0cmFjdG9ycyB8fCB7fSk7XG4gICAgb3B0aW9ucy5pbnB1dFdyaXRlcnMgPSBuZXcgSW5wdXRXcml0ZXJzKG9wdGlvbnMuaW5wdXRXcml0ZXJzIHx8IHt9KTtcbiAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGdldElucHV0RWxlbWVudHMoZm9ybSwgb3B0aW9ucyksIChlbCA9PiB7XG4gICAgICAgIGxldCB0eXBlID0gZ2V0RWxlbWVudFR5cGUoZWwpO1xuICAgICAgICBsZXQga2V5ID0gb3B0aW9ucy5rZXlFeHRyYWN0b3JzLmdldCh0eXBlKShlbCk7XG4gICAgICAgIG9wdGlvbnMuaW5wdXRXcml0ZXJzLmdldCh0eXBlKShlbCwgZmxhdHRlbmVkRGF0YVtrZXldKTtcbiAgICB9KSk7XG59XG5cbnZhciBselN0cmluZyA9IHtcbiAgICBleHBvcnRzOiB7fVxufTtcblxubW9kdWxlID0gbHpTdHJpbmcsIExaU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGYgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xuICAgIHZhciBrZXlTdHJCYXNlNjQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XG4gICAgdmFyIGtleVN0clVyaVNhZmUgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky0kXCI7XG4gICAgdmFyIGJhc2VSZXZlcnNlRGljID0ge307XG4gICAgZnVuY3Rpb24gZ2V0QmFzZVZhbHVlKGFscGhhYmV0LCBjaGFyYWN0ZXIpIHtcbiAgICAgICAgaWYgKCFiYXNlUmV2ZXJzZURpY1thbHBoYWJldF0pIHtcbiAgICAgICAgICAgIGJhc2VSZXZlcnNlRGljW2FscGhhYmV0XSA9IHt9O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbHBoYWJldC5sZW5ndGg7IGkrKykgYmFzZVJldmVyc2VEaWNbYWxwaGFiZXRdW2FscGhhYmV0LmNoYXJBdChpKV0gPSBpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlUmV2ZXJzZURpY1thbHBoYWJldF1bY2hhcmFjdGVyXTtcbiAgICB9XG4gICAgdmFyIExaU3RyaW5nID0ge1xuICAgICAgICBjb21wcmVzc1RvQmFzZTY0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT0gaW5wdXQpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgdmFyIHJlcyA9IExaU3RyaW5nLl9jb21wcmVzcyhpbnB1dCwgNiwgKGZ1bmN0aW9uKGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5U3RyQmFzZTY0LmNoYXJBdChhKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHN3aXRjaCAocmVzLmxlbmd0aCAlIDQpIHtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXM7XG5cbiAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHJldHVybiByZXMgKyBcIj09PVwiO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzICsgXCI9PVwiO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzICsgXCI9XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRlY29tcHJlc3NGcm9tQmFzZTY0OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gaW5wdXQgPyBcIlwiIDogXCJcIiA9PSBpbnB1dCA/IG51bGwgOiBMWlN0cmluZy5fZGVjb21wcmVzcyhpbnB1dC5sZW5ndGgsIDMyLCAoZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZVZhbHVlKGtleVN0ckJhc2U2NCwgaW5wdXQuY2hhckF0KGluZGV4KSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXByZXNzVG9VVEYxNjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsID09IGlucHV0ID8gXCJcIiA6IExaU3RyaW5nLl9jb21wcmVzcyhpbnB1dCwgMTUsIChmdW5jdGlvbihhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGYoYSArIDMyKTtcbiAgICAgICAgICAgIH0pKSArIFwiIFwiO1xuICAgICAgICB9LFxuICAgICAgICBkZWNvbXByZXNzRnJvbVVURjE2OiBmdW5jdGlvbihjb21wcmVzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBjb21wcmVzc2VkID8gXCJcIiA6IFwiXCIgPT0gY29tcHJlc3NlZCA/IG51bGwgOiBMWlN0cmluZy5fZGVjb21wcmVzcyhjb21wcmVzc2VkLmxlbmd0aCwgMTYzODQsIChmdW5jdGlvbihpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wcmVzc2VkLmNoYXJDb2RlQXQoaW5kZXgpIC0gMzI7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXByZXNzVG9VaW50OEFycmF5OiBmdW5jdGlvbih1bmNvbXByZXNzZWQpIHtcbiAgICAgICAgICAgIHZhciBjb21wcmVzc2VkID0gTFpTdHJpbmcuY29tcHJlc3ModW5jb21wcmVzc2VkKTtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgVWludDhBcnJheSgyICogY29tcHJlc3NlZC5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIFRvdGFsTGVuID0gY29tcHJlc3NlZC5sZW5ndGg7IGkgPCBUb3RhbExlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRfdmFsdWUgPSBjb21wcmVzc2VkLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgICAgICAgICAgYnVmWzIgKiBpXSA9IGN1cnJlbnRfdmFsdWUgPj4+IDg7XG4gICAgICAgICAgICAgICAgYnVmWzIgKiBpICsgMV0gPSBjdXJyZW50X3ZhbHVlICUgMjU2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJ1ZjtcbiAgICAgICAgfSxcbiAgICAgICAgZGVjb21wcmVzc0Zyb21VaW50OEFycmF5OiBmdW5jdGlvbihjb21wcmVzc2VkKSB7XG4gICAgICAgICAgICBpZiAobnVsbCA9PSBjb21wcmVzc2VkKSByZXR1cm4gTFpTdHJpbmcuZGVjb21wcmVzcyhjb21wcmVzc2VkKTtcbiAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQXJyYXkoY29tcHJlc3NlZC5sZW5ndGggLyAyKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBUb3RhbExlbiA9IGJ1Zi5sZW5ndGg7IGkgPCBUb3RhbExlbjsgaSsrKSBidWZbaV0gPSAyNTYgKiBjb21wcmVzc2VkWzIgKiBpXSArIGNvbXByZXNzZWRbMiAqIGkgKyAxXTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGJ1Zi5mb3JFYWNoKChmdW5jdGlvbihjKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZihjKSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gTFpTdHJpbmcuZGVjb21wcmVzcyhyZXN1bHQuam9pbihcIlwiKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gaW5wdXQgPyBcIlwiIDogTFpTdHJpbmcuX2NvbXByZXNzKGlucHV0LCA2LCAoZnVuY3Rpb24oYSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXlTdHJVcmlTYWZlLmNoYXJBdChhKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVjb21wcmVzc0Zyb21FbmNvZGVkVVJJQ29tcG9uZW50OiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT0gaW5wdXQpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgaWYgKFwiXCIgPT0gaW5wdXQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC8gL2csIFwiK1wiKTtcbiAgICAgICAgICAgIHJldHVybiBMWlN0cmluZy5fZGVjb21wcmVzcyhpbnB1dC5sZW5ndGgsIDMyLCAoZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmFzZVZhbHVlKGtleVN0clVyaVNhZmUsIGlucHV0LmNoYXJBdChpbmRleCkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBjb21wcmVzczogZnVuY3Rpb24odW5jb21wcmVzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gTFpTdHJpbmcuX2NvbXByZXNzKHVuY29tcHJlc3NlZCwgMTYsIChmdW5jdGlvbihhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGYoYSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgICAgIF9jb21wcmVzczogZnVuY3Rpb24odW5jb21wcmVzc2VkLCBiaXRzUGVyQ2hhciwgZ2V0Q2hhckZyb21JbnQpIHtcbiAgICAgICAgICAgIGlmIChudWxsID09IHVuY29tcHJlc3NlZCkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICB2YXIgaSwgdmFsdWUsIGlpLCBjb250ZXh0X2RpY3Rpb25hcnkgPSB7fSwgY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGUgPSB7fSwgY29udGV4dF9jID0gXCJcIiwgY29udGV4dF93YyA9IFwiXCIsIGNvbnRleHRfdyA9IFwiXCIsIGNvbnRleHRfZW5sYXJnZUluID0gMiwgY29udGV4dF9kaWN0U2l6ZSA9IDMsIGNvbnRleHRfbnVtQml0cyA9IDIsIGNvbnRleHRfZGF0YSA9IFtdLCBjb250ZXh0X2RhdGFfdmFsID0gMCwgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IHVuY29tcHJlc3NlZC5sZW5ndGg7IGlpICs9IDEpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0X2MgPSB1bmNvbXByZXNzZWQuY2hhckF0KGlpKTtcbiAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb250ZXh0X2RpY3Rpb25hcnksIGNvbnRleHRfYykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kaWN0aW9uYXJ5W2NvbnRleHRfY10gPSBjb250ZXh0X2RpY3RTaXplKys7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGljdGlvbmFyeVRvQ3JlYXRlW2NvbnRleHRfY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0X3djID0gY29udGV4dF93ICsgY29udGV4dF9jO1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29udGV4dF9kaWN0aW9uYXJ5LCBjb250ZXh0X3djKSkgY29udGV4dF93ID0gY29udGV4dF93YzsgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGUsIGNvbnRleHRfdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0X3cuY2hhckNvZGVBdCgwKSA8IDI1Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZXh0X251bUJpdHM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsIDw8PSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29udGV4dF93LmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gY29udGV4dF9kYXRhX3ZhbCA8PCAxIHwgMSAmIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YS5wdXNoKGdldENoYXJGcm9tSW50KGNvbnRleHRfZGF0YV92YWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID4+PSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZXh0X251bUJpdHM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gY29udGV4dF9kYXRhX3ZhbCA8PCAxIHwgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0X2RhdGFfcG9zaXRpb24gPT0gYml0c1BlckNoYXIgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnRleHRfdy5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSBjb250ZXh0X2RhdGFfdmFsIDw8IDEgfCAxICYgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0X2RhdGFfcG9zaXRpb24gPT0gYml0c1BlckNoYXIgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPj49IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gLS1jb250ZXh0X2VubGFyZ2VJbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZW5sYXJnZUluID0gTWF0aC5wb3coMiwgY29udGV4dF9udW1CaXRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X251bUJpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0X2RpY3Rpb25hcnlUb0NyZWF0ZVtjb250ZXh0X3ddO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb250ZXh0X2RpY3Rpb25hcnlbY29udGV4dF93XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZXh0X251bUJpdHM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSBjb250ZXh0X2RhdGFfdmFsIDw8IDEgfCAxICYgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhciAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPj49IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gLS1jb250ZXh0X2VubGFyZ2VJbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9lbmxhcmdlSW4gPSBNYXRoLnBvdygyLCBjb250ZXh0X251bUJpdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9udW1CaXRzKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kaWN0aW9uYXJ5W2NvbnRleHRfd2NdID0gY29udGV4dF9kaWN0U2l6ZSsrO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0X3cgPSBTdHJpbmcoY29udGV4dF9jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJcIiAhPT0gY29udGV4dF93KSB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjb250ZXh0X2RpY3Rpb25hcnlUb0NyZWF0ZSwgY29udGV4dF93KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dF93LmNoYXJDb2RlQXQoMCkgPCAyNTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZXh0X251bUJpdHM7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPDw9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhciAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnRleHRfdy5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSBjb250ZXh0X2RhdGFfdmFsIDw8IDEgfCAxICYgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhciAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPj49IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dF9udW1CaXRzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gY29udGV4dF9kYXRhX3ZhbCA8PCAxIHwgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhciAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb250ZXh0X3cuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA9IGNvbnRleHRfZGF0YV92YWwgPDwgMSB8IDEgJiB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA+Pj0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSAtLWNvbnRleHRfZW5sYXJnZUluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2VubGFyZ2VJbiA9IE1hdGgucG93KDIsIGNvbnRleHRfbnVtQml0cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X251bUJpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29udGV4dF9kaWN0aW9uYXJ5VG9DcmVhdGVbY29udGV4dF93XTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnRleHRfZGljdGlvbmFyeVtjb250ZXh0X3ddO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dF9udW1CaXRzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSBjb250ZXh0X2RhdGFfdmFsIDw8IDEgfCAxICYgdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGNvbnRleHRfZGF0YV9wb3NpdGlvbisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPj49IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKDAgPT0gLS1jb250ZXh0X2VubGFyZ2VJbikge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2VubGFyZ2VJbiA9IE1hdGgucG93KDIsIGNvbnRleHRfbnVtQml0cyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRfbnVtQml0cysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlID0gMjtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb250ZXh0X251bUJpdHM7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnRleHRfZGF0YV92YWwgPSBjb250ZXh0X2RhdGFfdmFsIDw8IDEgfCAxICYgdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHRfZGF0YV9wb3NpdGlvbiA9PSBiaXRzUGVyQ2hhciAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3Bvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dF9kYXRhLnB1c2goZ2V0Q2hhckZyb21JbnQoY29udGV4dF9kYXRhX3ZhbCkpO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfdmFsID0gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgY29udGV4dF9kYXRhX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgICAgdmFsdWUgPj49IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICAgICAgY29udGV4dF9kYXRhX3ZhbCA8PD0gMTtcbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dF9kYXRhX3Bvc2l0aW9uID09IGJpdHNQZXJDaGFyIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGEucHVzaChnZXRDaGFyRnJvbUludChjb250ZXh0X2RhdGFfdmFsKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0X2RhdGFfcG9zaXRpb24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0X2RhdGEuam9pbihcIlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVjb21wcmVzczogZnVuY3Rpb24oY29tcHJlc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gY29tcHJlc3NlZCA/IFwiXCIgOiBcIlwiID09IGNvbXByZXNzZWQgPyBudWxsIDogTFpTdHJpbmcuX2RlY29tcHJlc3MoY29tcHJlc3NlZC5sZW5ndGgsIDMyNzY4LCAoZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcHJlc3NlZC5jaGFyQ29kZUF0KGluZGV4KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgX2RlY29tcHJlc3M6IGZ1bmN0aW9uKGxlbmd0aCwgcmVzZXRWYWx1ZSwgZ2V0TmV4dFZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgaSwgdywgYml0cywgcmVzYiwgbWF4cG93ZXIsIHBvd2VyLCBjLCBkaWN0aW9uYXJ5ID0gW10sIGVubGFyZ2VJbiA9IDQsIGRpY3RTaXplID0gNCwgbnVtQml0cyA9IDMsIGVudHJ5ID0gXCJcIiwgcmVzdWx0ID0gW10sIGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdmFsOiBnZXROZXh0VmFsdWUoMCksXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHJlc2V0VmFsdWUsXG4gICAgICAgICAgICAgICAgaW5kZXg6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArPSAxKSBkaWN0aW9uYXJ5W2ldID0gaTtcbiAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgICAgbWF4cG93ZXIgPSBNYXRoLnBvdygyLCAyKTtcbiAgICAgICAgICAgIHBvd2VyID0gMTtcbiAgICAgICAgICAgIGZvciAoO3Bvd2VyICE9IG1heHBvd2VyOyApIHtcbiAgICAgICAgICAgICAgICByZXNiID0gZGF0YS52YWwgJiBkYXRhLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIGRhdGEucG9zaXRpb24gPj49IDE7XG4gICAgICAgICAgICAgICAgaWYgKDAgPT0gZGF0YS5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYml0cyB8PSAocmVzYiA+IDAgPyAxIDogMCkgKiBwb3dlcjtcbiAgICAgICAgICAgICAgICBwb3dlciA8PD0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaCAoYml0cykge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgICAgICAgbWF4cG93ZXIgPSBNYXRoLnBvdygyLCA4KTtcbiAgICAgICAgICAgICAgICBwb3dlciA9IDE7XG4gICAgICAgICAgICAgICAgZm9yICg7cG93ZXIgIT0gbWF4cG93ZXI7ICkge1xuICAgICAgICAgICAgICAgICAgICByZXNiID0gZGF0YS52YWwgJiBkYXRhLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBkYXRhLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudmFsID0gZ2V0TmV4dFZhbHVlKGRhdGEuaW5kZXgrKyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYml0cyB8PSAocmVzYiA+IDAgPyAxIDogMCkgKiBwb3dlcjtcbiAgICAgICAgICAgICAgICAgICAgcG93ZXIgPDw9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGMgPSBmKGJpdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgICAgICAgICBtYXhwb3dlciA9IE1hdGgucG93KDIsIDE2KTtcbiAgICAgICAgICAgICAgICBwb3dlciA9IDE7XG4gICAgICAgICAgICAgICAgZm9yICg7cG93ZXIgIT0gbWF4cG93ZXI7ICkge1xuICAgICAgICAgICAgICAgICAgICByZXNiID0gZGF0YS52YWwgJiBkYXRhLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBkYXRhLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudmFsID0gZ2V0TmV4dFZhbHVlKGRhdGEuaW5kZXgrKyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYml0cyB8PSAocmVzYiA+IDAgPyAxIDogMCkgKiBwb3dlcjtcbiAgICAgICAgICAgICAgICAgICAgcG93ZXIgPDw9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGMgPSBmKGJpdHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpY3Rpb25hcnlbM10gPSBjO1xuICAgICAgICAgICAgdyA9IGM7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjKTtcbiAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5pbmRleCA+IGxlbmd0aCkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgICAgICAgbWF4cG93ZXIgPSBNYXRoLnBvdygyLCBudW1CaXRzKTtcbiAgICAgICAgICAgICAgICBwb3dlciA9IDE7XG4gICAgICAgICAgICAgICAgZm9yICg7cG93ZXIgIT0gbWF4cG93ZXI7ICkge1xuICAgICAgICAgICAgICAgICAgICByZXNiID0gZGF0YS52YWwgJiBkYXRhLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID4+PSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBkYXRhLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudmFsID0gZ2V0TmV4dFZhbHVlKGRhdGEuaW5kZXgrKyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYml0cyB8PSAocmVzYiA+IDAgPyAxIDogMCkgKiBwb3dlcjtcbiAgICAgICAgICAgICAgICAgICAgcG93ZXIgPDw9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA9IGJpdHMpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgYml0cyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIG1heHBvd2VyID0gTWF0aC5wb3coMiwgOCk7XG4gICAgICAgICAgICAgICAgICAgIHBvd2VyID0gMTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICg7cG93ZXIgIT0gbWF4cG93ZXI7ICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzYiA9IGRhdGEudmFsICYgZGF0YS5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucG9zaXRpb24gPj49IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBkYXRhLnBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wb3NpdGlvbiA9IHJlc2V0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS52YWwgPSBnZXROZXh0VmFsdWUoZGF0YS5pbmRleCsrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgfD0gKHJlc2IgPiAwID8gMSA6IDApICogcG93ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3dlciA8PD0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2RpY3RTaXplKytdID0gZihiaXRzKTtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGRpY3RTaXplIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgZW5sYXJnZUluLS07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAgICAgICAgICAgICBtYXhwb3dlciA9IE1hdGgucG93KDIsIDE2KTtcbiAgICAgICAgICAgICAgICAgICAgcG93ZXIgPSAxO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKDtwb3dlciAhPSBtYXhwb3dlcjsgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNiID0gZGF0YS52YWwgJiBkYXRhLnBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5wb3NpdGlvbiA+Pj0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09IGRhdGEucG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnBvc2l0aW9uID0gcmVzZXRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnZhbCA9IGdldE5leHRWYWx1ZShkYXRhLmluZGV4KyspO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYml0cyB8PSAocmVzYiA+IDAgPyAxIDogMCkgKiBwb3dlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyIDw8PSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlbZGljdFNpemUrK10gPSBmKGJpdHMpO1xuICAgICAgICAgICAgICAgICAgICBjID0gZGljdFNpemUgLSAxO1xuICAgICAgICAgICAgICAgICAgICBlbmxhcmdlSW4tLTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoMCA9PSBlbmxhcmdlSW4pIHtcbiAgICAgICAgICAgICAgICAgICAgZW5sYXJnZUluID0gTWF0aC5wb3coMiwgbnVtQml0cyk7XG4gICAgICAgICAgICAgICAgICAgIG51bUJpdHMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRpY3Rpb25hcnlbY10pIGVudHJ5ID0gZGljdGlvbmFyeVtjXTsgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjICE9PSBkaWN0U2l6ZSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gdyArIHcuY2hhckF0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgZGljdGlvbmFyeVtkaWN0U2l6ZSsrXSA9IHcgKyBlbnRyeS5jaGFyQXQoMCk7XG4gICAgICAgICAgICAgICAgdyA9IGVudHJ5O1xuICAgICAgICAgICAgICAgIGlmICgwID09IC0tZW5sYXJnZUluKSB7XG4gICAgICAgICAgICAgICAgICAgIGVubGFyZ2VJbiA9IE1hdGgucG93KDIsIG51bUJpdHMpO1xuICAgICAgICAgICAgICAgICAgICBudW1CaXRzKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gTFpTdHJpbmc7XG59KCksIG51bGwgIT0gbW9kdWxlICYmIChtb2R1bGUuZXhwb3J0cyA9IExaU3RyaW5nKTtcblxudmFyIG1vZHVsZSwgTFpTdHJpbmc7XG5cbmNsYXNzIE9wdGlvbnNTeW5jIHtcbiAgICBjb25zdHJ1Y3Rvcih7ZGVmYXVsdHM6IGRlZmF1bHRzID0ge30sIHN0b3JhZ2VOYW1lOiBzdG9yYWdlTmFtZSA9IFwib3B0aW9uc1wiLCBtaWdyYXRpb25zOiBtaWdyYXRpb25zID0gW10sIGxvZ2dpbmc6IGxvZ2dpbmcgPSB0cnVlLCBzdG9yYWdlVHlwZTogc3RvcmFnZVR5cGUgPSBcInN5bmNcIn0gPSB7fSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzdG9yYWdlTmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJzdG9yYWdlVHlwZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJkZWZhdWx0c1wiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJfZm9ybVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJfbWlncmF0aW9uc1wiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0b3JhZ2VOYW1lID0gc3RvcmFnZU5hbWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICAgICAgdGhpcy5zdG9yYWdlVHlwZSA9IHN0b3JhZ2VUeXBlO1xuICAgICAgICB0aGlzLl9oYW5kbGVGb3JtSW5wdXQgPSAoZGVsYXkgPSAzMDAsIGF0QmVnaW4gPSB0aGlzLl9oYW5kbGVGb3JtSW5wdXQuYmluZCh0aGlzKSwgXG4gICAgICAgIHZvaWQgMCA9PT0gY2FsbGJhY2sgPyB0aHJvdHRsZShkZWxheSwgYXRCZWdpbiwgZmFsc2UpIDogdGhyb3R0bGUoZGVsYXksIGNhbGxiYWNrLCBmYWxzZSAhPT0gYXRCZWdpbikpO1xuICAgICAgICB2YXIgZGVsYXksIGF0QmVnaW4sIGNhbGxiYWNrO1xuICAgICAgICB0aGlzLl9oYW5kbGVTdG9yYWdlQ2hhbmdlT25Gb3JtID0gdGhpcy5faGFuZGxlU3RvcmFnZUNoYW5nZU9uRm9ybS5iaW5kKHRoaXMpO1xuICAgICAgICBsb2dnaW5nIHx8ICh0aGlzLl9sb2cgPSAoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMuX21pZ3JhdGlvbnMgPSB0aGlzLl9ydW5NaWdyYXRpb25zKG1pZ3JhdGlvbnMpO1xuICAgIH1cbiAgICBnZXQgc3RvcmFnZSgpIHtcbiAgICAgICAgcmV0dXJuIGNocm9tZS5zdG9yYWdlW3RoaXMuc3RvcmFnZVR5cGVdO1xuICAgIH1cbiAgICBhc3luYyBnZXRBbGwoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX21pZ3JhdGlvbnM7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBbGwoKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0QWxsKG5ld09wdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5fbWlncmF0aW9ucztcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldEFsbChuZXdPcHRpb25zKTtcbiAgICB9XG4gICAgYXN5bmMgc2V0KG5ld09wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0QWxsKHtcbiAgICAgICAgICAgIC4uLmF3YWl0IHRoaXMuZ2V0QWxsKCksXG4gICAgICAgICAgICAuLi5uZXdPcHRpb25zXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBzeW5jRm9ybShmb3JtKSB7XG4gICAgICAgIHRoaXMuX2Zvcm0gPSBmb3JtIGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ID8gZm9ybSA6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZm9ybSk7XG4gICAgICAgIHRoaXMuX2Zvcm0uYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsIHRoaXMuX2hhbmRsZUZvcm1JbnB1dCk7XG4gICAgICAgIHRoaXMuX2Zvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCB0aGlzLl9oYW5kbGVGb3JtU3VibWl0KTtcbiAgICAgICAgY2hyb21lLnN0b3JhZ2Uub25DaGFuZ2VkLmFkZExpc3RlbmVyKHRoaXMuX2hhbmRsZVN0b3JhZ2VDaGFuZ2VPbkZvcm0pO1xuICAgICAgICB0aGlzLl91cGRhdGVGb3JtKHRoaXMuX2Zvcm0sIGF3YWl0IHRoaXMuZ2V0QWxsKCkpO1xuICAgIH1cbiAgICBhc3luYyBzdG9wU3luY0Zvcm0oKSB7XG4gICAgICAgIGlmICh0aGlzLl9mb3JtKSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCB0aGlzLl9oYW5kbGVGb3JtSW5wdXQpO1xuICAgICAgICAgICAgdGhpcy5fZm9ybS5yZW1vdmVFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIHRoaXMuX2hhbmRsZUZvcm1TdWJtaXQpO1xuICAgICAgICAgICAgY2hyb21lLnN0b3JhZ2Uub25DaGFuZ2VkLnJlbW92ZUxpc3RlbmVyKHRoaXMuX2hhbmRsZVN0b3JhZ2VDaGFuZ2VPbkZvcm0pO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2Zvcm07XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2xvZyhtZXRob2QsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc29sZVttZXRob2RdKC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyBfZ2V0QWxsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5nZXQodGhpcy5zdG9yYWdlTmFtZSwgKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yID8gcmVqZWN0KGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikgOiByZXNvbHZlKHRoaXMuX2RlY29kZShyZXN1bHRbdGhpcy5zdG9yYWdlTmFtZV0pKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICBhc3luYyBfc2V0QWxsKG5ld09wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fbG9nKFwibG9nXCIsIFwiU2F2aW5nIG9wdGlvbnNcIiwgbmV3T3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldCh7XG4gICAgICAgICAgICAgICAgW3RoaXMuc3RvcmFnZU5hbWVdOiB0aGlzLl9lbmNvZGUobmV3T3B0aW9ucylcbiAgICAgICAgICAgIH0sICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yID8gcmVqZWN0KGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikgOiByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgX2VuY29kZShvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHRoaW5uZWRPcHRpb25zID0ge1xuICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlubmVkT3B0aW9ucykpIHRoaXMuZGVmYXVsdHNba2V5XSA9PT0gdmFsdWUgJiYgZGVsZXRlIHRoaW5uZWRPcHRpb25zW2tleV07XG4gICAgICAgIHRoaXMuX2xvZyhcImxvZ1wiLCBcIldpdGhvdXQgdGhlIGRlZmF1bHQgdmFsdWVzXCIsIHRoaW5uZWRPcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIGx6U3RyaW5nLmV4cG9ydHMuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkodGhpbm5lZE9wdGlvbnMpKTtcbiAgICB9XG4gICAgX2RlY29kZShvcHRpb25zKSB7XG4gICAgICAgIGxldCBkZWNvbXByZXNzZWQgPSBvcHRpb25zO1xuICAgICAgICBcInN0cmluZ1wiID09IHR5cGVvZiBvcHRpb25zICYmIChkZWNvbXByZXNzZWQgPSBKU09OLnBhcnNlKGx6U3RyaW5nLmV4cG9ydHMuZGVjb21wcmVzc0Zyb21FbmNvZGVkVVJJQ29tcG9uZW50KG9wdGlvbnMpKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi50aGlzLmRlZmF1bHRzLFxuICAgICAgICAgICAgLi4uZGVjb21wcmVzc2VkXG4gICAgICAgIH07XG4gICAgfVxuICAgIGFzeW5jIF9ydW5NaWdyYXRpb25zKG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgaWYgKDAgPT09IG1pZ3JhdGlvbnMubGVuZ3RoIHx8ICFpc0JhY2tncm91bmQoKSB8fCAhYXdhaXQgYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gaW5zdGFsbFR5cGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBpbnN0YWxsVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUub25JbnN0YWxsZWQuYWRkTGlzdGVuZXIoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCA1MDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjaHJvbWUubWFuYWdlbWVudD8uZ2V0U2VsZiA/IGNocm9tZS5tYW5hZ2VtZW50LmdldFNlbGYoKCh7aW5zdGFsbFR5cGU6IGluc3RhbGxUeXBlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpbnN0YWxsVHlwZSk7XG4gICAgICAgICAgICAgICAgfSkpIDogY2FsbGJhY2soXCJ1bmtub3duXCIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9KCkpIHJldHVybjtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IHRoaXMuX2dldEFsbCgpO1xuICAgICAgICBjb25zdCBpbml0aWFsID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuX2xvZyhcImxvZ1wiLCBcIkZvdW5kIHRoZXNlIHN0b3JlZCBvcHRpb25zXCIsIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2xvZyhcImluZm9cIiwgXCJXaWxsIHJ1blwiLCBtaWdyYXRpb25zLmxlbmd0aCwgMSA9PT0gbWlncmF0aW9ucy5sZW5ndGggPyBcIm1pZ3JhdGlvblwiIDogXCIgbWlncmF0aW9uc1wiKTtcbiAgICAgICAgZm9yIChjb25zdCBtaWdyYXRlIG9mIG1pZ3JhdGlvbnMpIG1pZ3JhdGUob3B0aW9ucywgdGhpcy5kZWZhdWx0cyk7XG4gICAgICAgIGluaXRpYWwgIT09IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpICYmIGF3YWl0IHRoaXMuX3NldEFsbChvcHRpb25zKTtcbiAgICB9XG4gICAgYXN5bmMgX2hhbmRsZUZvcm1JbnB1dCh7dGFyZ2V0OiB0YXJnZXR9KSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGFyZ2V0O1xuICAgICAgICBpZiAoZmllbGQubmFtZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXQodGhpcy5fcGFyc2VGb3JtKGZpZWxkLmZvcm0pKTtcbiAgICAgICAgICAgIGZpZWxkLmZvcm0uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJvcHRpb25zLXN5bmM6Zm9ybS1zeW5jZWRcIiwge1xuICAgICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWVcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfaGFuZGxlRm9ybVN1Ym1pdChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBfdXBkYXRlRm9ybShmb3JtLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGb3JtU3RhdGUgPSB0aGlzLl9wYXJzZUZvcm0oZm9ybSk7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpKSBjdXJyZW50Rm9ybVN0YXRlW2tleV0gPT09IHZhbHVlICYmIGRlbGV0ZSBvcHRpb25zW2tleV07XG4gICAgICAgIGNvbnN0IGluY2x1ZGUgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcbiAgICAgICAgaW5jbHVkZS5sZW5ndGggPiAwICYmIGRlc2VyaWFsaXplKGZvcm0sIG9wdGlvbnMsIHtcbiAgICAgICAgICAgIGluY2x1ZGU6IGluY2x1ZGVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9wYXJzZUZvcm0oZm9ybSkge1xuICAgICAgICBjb25zdCBpbmNsdWRlID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZm9ybS5xdWVyeVNlbGVjdG9yQWxsKFwiW25hbWVdXCIpKSBmaWVsZC52YWxpZGl0eS52YWxpZCAmJiAhZmllbGQuZGlzYWJsZWQgJiYgaW5jbHVkZS5wdXNoKGZpZWxkLm5hbWUucmVwbGFjZSgvXFxbLipdLywgXCJcIikpO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplKGZvcm0sIHtcbiAgICAgICAgICAgIGluY2x1ZGU6IGluY2x1ZGVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9oYW5kbGVTdG9yYWdlQ2hhbmdlT25Gb3JtKGNoYW5nZXMsIGFyZWFOYW1lKSB7XG4gICAgICAgIGFyZWFOYW1lICE9PSB0aGlzLnN0b3JhZ2VUeXBlIHx8ICFjaGFuZ2VzW3RoaXMuc3RvcmFnZU5hbWVdIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkgJiYgdGhpcy5fZm9ybS5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB8fCB0aGlzLl91cGRhdGVGb3JtKHRoaXMuX2Zvcm0sIHRoaXMuX2RlY29kZShjaGFuZ2VzW3RoaXMuc3RvcmFnZU5hbWVdLm5ld1ZhbHVlKSk7XG4gICAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoT3B0aW9uc1N5bmMsIFwibWlncmF0aW9uc1wiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IHtcbiAgICAgICAgcmVtb3ZlVW51c2VkKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvcHRpb25zKSkga2V5IGluIGRlZmF1bHRzIHx8IGRlbGV0ZSBvcHRpb25zW2tleV07XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IHsgT3B0aW9uc1N5bmMgYXMgZGVmYXVsdCB9O1xuIiwibGV0IGNhY2hlID0gdHJ1ZTtcbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlV2ViZXh0RGV0ZWN0UGFnZUNhY2hlKCkge1xuICAgIGNhY2hlID0gZmFsc2U7XG59XG5mdW5jdGlvbiBpc0N1cnJlbnRQYXRobmFtZShwYXRoKSB7XG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBwYXRobmFtZSB9ID0gbmV3IFVSTChwYXRoLCBsb2NhdGlvbi5vcmlnaW4pO1xuICAgICAgICByZXR1cm4gcGF0aG5hbWUgPT09IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRNYW5pZmVzdChfdmVyc2lvbikge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLmNocm9tZT8ucnVudGltZT8uZ2V0TWFuaWZlc3Q/LigpO1xufVxuZnVuY3Rpb24gb25jZShmdW5jdGlvbl8pIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmICghY2FjaGUgfHwgdHlwZW9mIHJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmN0aW9uXygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbn1cbi8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29kZSBpcyBiZWluZyBydW4gb24gaHR0cChzKTovLyBwYWdlcyAoaXQgY291bGQgYmUgaW4gYSBjb250ZW50IHNjcmlwdCBvciByZWd1bGFyIHdlYiBjb250ZXh0KSAqL1xuZXhwb3J0IGNvbnN0IGlzV2ViUGFnZSA9IG9uY2UoKCkgPT4gZ2xvYmFsVGhpcy5sb2NhdGlvbj8ucHJvdG9jb2wuc3RhcnRzV2l0aCgnaHR0cCcpKTtcbi8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29kZSBpcyBiZWluZyBydW4gaW4gZXh0ZW5zaW9uIGNvbnRleHRzIHRoYXQgaGF2ZSBhY2Nlc3MgdG8gdGhlIGNocm9tZSBBUEkgKi9cbmV4cG9ydCBjb25zdCBpc0V4dGVuc2lvbkNvbnRleHQgPSBvbmNlKCgpID0+IHR5cGVvZiBnbG9iYWxUaGlzLmNocm9tZT8uZXh0ZW5zaW9uID09PSAnb2JqZWN0Jyk7XG4vKiogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvZGUgaXMgYmVpbmcgcnVuIGluIGEgY29udGVudCBzY3JpcHQgKi9cbmV4cG9ydCBjb25zdCBpc0NvbnRlbnRTY3JpcHQgPSBvbmNlKCgpID0+IGlzRXh0ZW5zaW9uQ29udGV4dCgpICYmIGlzV2ViUGFnZSgpKTtcbi8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29kZSBpcyBiZWluZyBydW4gaW4gYSBiYWNrZ3JvdW5kIGNvbnRleHQgKi9cbmV4cG9ydCBjb25zdCBpc0JhY2tncm91bmQgPSAoKSA9PiBpc0JhY2tncm91bmRQYWdlKCkgfHwgaXNCYWNrZ3JvdW5kV29ya2VyKCk7XG4vKiogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvZGUgaXMgYmVpbmcgcnVuIGluIGEgYmFja2dyb3VuZCBwYWdlICovXG5leHBvcnQgY29uc3QgaXNCYWNrZ3JvdW5kUGFnZSA9IG9uY2UoKCkgPT4ge1xuICAgIGNvbnN0IG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3QoMik7XG4gICAgaWYgKG1hbmlmZXN0XG4gICAgICAgICYmIGlzQ3VycmVudFBhdGhuYW1lKG1hbmlmZXN0LmJhY2tncm91bmRfcGFnZSB8fCBtYW5pZmVzdC5iYWNrZ3JvdW5kPy5wYWdlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIEJvb2xlYW4obWFuaWZlc3Q/LmJhY2tncm91bmQ/LnNjcmlwdHNcbiAgICAgICAgJiYgaXNDdXJyZW50UGF0aG5hbWUoJy9fZ2VuZXJhdGVkX2JhY2tncm91bmRfcGFnZS5odG1sJykpO1xufSk7XG4vKiogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvZGUgaXMgYmVpbmcgcnVuIGluIGEgYmFja2dyb3VuZCB3b3JrZXIgKi9cbmV4cG9ydCBjb25zdCBpc0JhY2tncm91bmRXb3JrZXIgPSBvbmNlKCgpID0+IGlzQ3VycmVudFBhdGhuYW1lKGdldE1hbmlmZXN0KDMpPy5iYWNrZ3JvdW5kPy5zZXJ2aWNlX3dvcmtlcikpO1xuLyoqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2RlIGlzIGJlaW5nIHJ1biBpbiBhbiBvcHRpb25zIHBhZ2UuIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgY3VycmVudCBwYWdl4oCZcyBVUkwgbWF0Y2hlcyB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGUgZXh0ZW5zaW9uJ3MgYG1hbmlmZXN0Lmpzb25gICovXG5leHBvcnQgY29uc3QgaXNPcHRpb25zUGFnZSA9IG9uY2UoKCkgPT4ge1xuICAgIGlmICghaXNFeHRlbnNpb25Db250ZXh0KCkgfHwgIWNocm9tZS5ydW50aW1lLmdldE1hbmlmZXN0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgeyBvcHRpb25zX3VpOiBvcHRpb25zVWkgfSA9IGNocm9tZS5ydW50aW1lLmdldE1hbmlmZXN0KCk7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zVWk/LnBhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChvcHRpb25zVWkucGFnZSwgbG9jYXRpb24ub3JpZ2luKTtcbiAgICByZXR1cm4gdXJsLnBhdGhuYW1lID09PSBsb2NhdGlvbi5wYXRobmFtZTtcbn0pO1xuLyoqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2RlIGlzIGJlaW5nIHJ1biBpbiBhIGRldiB0b29scyBwYWdlLiBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIGN1cnJlbnQgcGFnZeKAmXMgVVJMIG1hdGNoZXMgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIGV4dGVuc2lvbidzIGBtYW5pZmVzdC5qc29uYCBgZGV2dG9vbHNfcGFnZWAgZmllbGQuICovXG5leHBvcnQgY29uc3QgaXNEZXZUb29sc1BhZ2UgPSBvbmNlKCgpID0+IHtcbiAgICBpZiAoIWlzRXh0ZW5zaW9uQ29udGV4dCgpIHx8ICFjaHJvbWUuZGV2dG9vbHMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7IGRldnRvb2xzX3BhZ2U6IGRldnRvb2xzUGFnZSB9ID0gY2hyb21lLnJ1bnRpbWUuZ2V0TWFuaWZlc3QoKTtcbiAgICBpZiAodHlwZW9mIGRldnRvb2xzUGFnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGRldnRvb2xzUGFnZSwgbG9jYXRpb24ub3JpZ2luKTtcbiAgICByZXR1cm4gdXJsLnBhdGhuYW1lID09PSBsb2NhdGlvbi5wYXRobmFtZTtcbn0pO1xuLyoqIExvb3NlbHkgZGV0ZWN0IEZpcmVmb3ggdmlhIHVzZXIgYWdlbnQgKi9cbmV4cG9ydCBjb25zdCBpc0ZpcmVmb3ggPSAoKSA9PiBnbG9iYWxUaGlzLm5hdmlnYXRvcj8udXNlckFnZW50LmluY2x1ZGVzKCdGaXJlZm94Jyk7XG4vKiogTG9vc2VseSBkZXRlY3QgQ2hyb21lIHZpYSB1c2VyIGFnZW50IChtaWdodCBhbHNvIGluY2x1ZGUgQ2hyb21pdW0gYW5kIGZvcmtzIGxpa2UgT3BlcmEpICovXG5leHBvcnQgY29uc3QgaXNDaHJvbWUgPSAoKSA9PiBnbG9iYWxUaGlzLm5hdmlnYXRvcj8udXNlckFnZW50LmluY2x1ZGVzKCdDaHJvbWUnKTtcbi8qKiBMb29zZWx5IGRldGVjdCBTYWZhcmkgdmlhIHVzZXIgYWdlbnQgKi9cbmV4cG9ydCBjb25zdCBpc1NhZmFyaSA9ICgpID0+ICFpc0Nocm9tZSgpICYmIGdsb2JhbFRoaXMubmF2aWdhdG9yPy51c2VyQWdlbnQuaW5jbHVkZXMoJ1NhZmFyaScpO1xuZXhwb3J0IGNvbnN0IGNvbnRleHROYW1lcyA9IHtcbiAgICBjb250ZW50U2NyaXB0OiBpc0NvbnRlbnRTY3JpcHQsXG4gICAgYmFja2dyb3VuZDogaXNCYWNrZ3JvdW5kLFxuICAgIG9wdGlvbnM6IGlzT3B0aW9uc1BhZ2UsXG4gICAgZGV2VG9vbHNQYWdlOiBpc0RldlRvb2xzUGFnZSxcbiAgICBleHRlbnNpb246IGlzRXh0ZW5zaW9uQ29udGV4dCxcbiAgICB3ZWI6IGlzV2ViUGFnZSxcbn07XG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUoKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdGVzdF0gb2YgT2JqZWN0LmVudHJpZXMoY29udGV4dE5hbWVzKSkge1xuICAgICAgICBpZiAodGVzdCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3Vua25vd24nO1xufVxuIiwiZXhwb3J0cy5pbnRlcm9wRGVmYXVsdCA9IGZ1bmN0aW9uIChhKSB7XG4gIHJldHVybiBhICYmIGEuX19lc01vZHVsZSA/IGEgOiB7ZGVmYXVsdDogYX07XG59O1xuXG5leHBvcnRzLmRlZmluZUludGVyb3BGbGFnID0gZnVuY3Rpb24gKGEpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsICdfX2VzTW9kdWxlJywge3ZhbHVlOiB0cnVlfSk7XG59O1xuXG5leHBvcnRzLmV4cG9ydEFsbCA9IGZ1bmN0aW9uIChzb3VyY2UsIGRlc3QpIHtcbiAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoa2V5ID09PSAnZGVmYXVsdCcgfHwga2V5ID09PSAnX19lc01vZHVsZScgfHwgZGVzdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlc3QsIGtleSwge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc291cmNlW2tleV07XG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gZGVzdDtcbn07XG5cbmV4cG9ydHMuZXhwb3J0ID0gZnVuY3Rpb24gKGRlc3QsIGRlc3ROYW1lLCBnZXQpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRlc3QsIGRlc3ROYW1lLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGdldCxcbiAgfSk7XG59O1xuIiwiLy8gc3RvbGVuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2d3ZXJuL2d3ZXJuLm5ldC9ibG9iLzFiYjc3MzdlNTllYmE0ZmYxNTc5YjdmYjJkN2FkMmUyNDAyY2U4NDcvYnVpbGQvTGlua0xpdmUuaHNcbi8vIFRvZG8gbWFpbnRhaW4gaW4gc3luYz9cbi8qIGVzbGludC1kaXNhYmxlIGNvbW1hLXN0eWxlLCBAdHlwZXNjcmlwdC1lc2xpbnQvcXVvdGVzLCBxdW90ZXMgKi9cbmNvbnN0IGdvb2RHd2VybkRvbWFpbnMgPSBbXG5cdFwiMWRvbGxhcnNjYW4uY29tXCJcblx0LCBcIjgwMDAwaG91cnMub3JnXCJcblx0LCBcImFiYW5kb25lZGZvb3Rub3Rlcy5ibG9nc3BvdC5jb21cIlxuXHQsIFwiYWNhZGVtaWMub3VwLmNvbVwiXG5cdCwgXCJhY2FkZW1pYy5vdXAuY29tXCJcblx0LCBcImFjYWRlbWljdG9ycmVudHMuY29tXCJcblx0LCBcImFnZWluZy5veGZvcmRqb3VybmFscy5vcmdcIlxuXHQsIFwiYWkuZ29vZ2xlYmxvZy5jb21cIlxuXHQsIFwiYWplLm94Zm9yZGpvdXJuYWxzLm9yZ1wiXG5cdCwgXCJhcGVud2Fyci5jYVwiXG5cdCwgXCJhcmNoaXZlLm9yZ1wiXG5cdCwgXCJhcmNoaXZlLnBoXCJcblx0LCBcImFyY2hpdmVib3guaW9cIlxuXHQsIFwiYmFtLWRhdGFzZXQub3JnXCJcblx0LCBcImJhbS5rYWx6dW1ldXMuY29tXCJcblx0LCBcImJlZXBiMDBwLnh5elwiXG5cdCwgXCJiZWxsYXJkLm9yZ1wiXG5cdCwgXCJibG9nLmJlZW1pbmRlci5jb21cIlxuXHQsIFwiYmxvZy5nb29nbGUuY29tXCJcblx0LCBcImJsb2cub3Rvcm8ubmV0XCJcblx0LCBcImJsb2cucGluYm9hcmQuaW5cIlxuXHQsIFwiYmxvZ3MubnZpZGlhLmNvbVwiXG5cdCwgXCJibWsuc2hcIlxuXHQsIFwiYm9pbmdib2luZy5uZXRcIlxuXHQsIFwiY2FtZWxjYW1lbGNhbWVsLmNvbVwiXG5cdCwgXCJjYXQtdW5ib3VuZC5vcmdcIlxuXHQsIFwiY2F1c2FsLWVmZmVjdHMuY29tXCJcblx0LCBcImNpdGVzZWVyeC5pc3QucHN1LmVkdVwiXG5cdCwgXCJjbGluaWNhbHRyaWFscy5nb3ZcIlxuXHQsIFwiY29uaWZlci5yaGl6b21lLm9yZ1wiXG5cdCwgXCJjcmFuLnItcHJvamVjdC5vcmdcIlxuXHQsIFwiY3Rhbi5vcmdcIlxuXHQsIFwiZGFubHV1LmNvbVwiXG5cdCwgXCJkYW53YW5nLmNvXCJcblx0LCBcImRpc3RpbGwucHViXCJcblx0LCBcImRvY3MuZ29vZ2xlLmNvbVwiXG5cdCwgXCJkdWNrZHVja2dvLmNvbVwiXG5cdCwgXCJkd2FyZmZvcnRyZXNzd2lraS5vcmdcIlxuXHQsIFwiZW4uYml0Y29pbi5pdFwiXG5cdCwgXCJlbi50b3Vob3V3aWtpLm5ldFwiXG5cdCwgXCJlbi53aWtpYm9va3Mub3JnXCJcblx0LCBcImVuLndpa2ljaGlwLm9yZ1wiXG5cdCwgXCJlbi53aWtpZnVyLmNvbVwiXG5cdCwgXCJlbi53aWtpcXVvdGUub3JnXCJcblx0LCBcImVuLndpa2lzb3VyY2Uub3JnXCJcblx0LCBcImVuLndpa3Rpb25hcnkub3JnXCJcblx0LCBcImVxdWlsaWJyaWFib29rLmNvbVwiXG5cdCwgXCJldXJla2FtYWdhLmNvbVwiXG5cdCwgXCJldmVyeXRoaW5nMi5jb21cIlxuXHQsIFwiZXhwbG9yYWJsLmVzXCJcblx0LCBcImZlZWRzLmZlZWRidXJuZXIuY29tXCJcblx0LCBcImZpbGVzLmVyaWMuZWQuZ292XCJcblx0LCBcImZvcnVtLmVmZmVjdGl2ZWFsdHJ1aXNtLm9yZ1wiXG5cdCwgXCJmb3J1bS5ldmFnZWVrcy5vcmdcIlxuXHQsIFwiZm91bmRhdGlvbi53aWtpbWVkaWEub3JnXCJcblx0LCBcImZ1bGxmcm9udGFsLm1vZVwiXG5cdCwgXCJncmVhdGVyd3JvbmcuY29tXCJcblx0LCBcImd1emV5LmNvbVwiXG5cdCwgXCJpZGxld29yZHMuY29tXCJcblx0LCBcImlxY29tcGFyaXNvbnNpdGUuY29tXCJcblx0LCBcImphbWFuZXR3b3JrLmNvbVwiXG5cdCwgXCJqYXNvbmNyYXdmb3JkLm9yZ1wiXG5cdCwgXCJqdG9vbWltLm9yZ1wiXG5cdCwgXCJrYWx6dW1ldXMuY29tXCJcblx0LCBcImtlcmFzLmlvXCJcblx0LCBcImtpbGwtdGhlLW5ld3NsZXR0ZXIuY29tXCJcblx0LCBcImtrLm9yZ1wiXG5cdCwgXCJrbmlnaHRjb2x1bWJpYS5vcmdcIlxuXHQsIFwibGVkZ2UtY2xpLm9yZ1wiXG5cdCwgXCJsZXNzd3JvbmcuY29tXCJcblx0LCBcImxpYmdlbi5yc1wiXG5cdCwgXCJsaWJyYXJ5LmJ6XCJcblx0LCBcIm1hcmdpbmFscmV2b2x1dGlvbi5jb21cIlxuXHQsIFwibWF0dGxha2VtYW4ub3JnXCJcblx0LCBcIm1jLXN0YW4ub3JnXCJcblx0LCBcIm1ldGEud2lraW1lZGlhLm9yZ1wiXG5cdCwgXCJtaWNoYWVsbmllbHNlbi5vcmdcIlxuXHQsIFwibmNhc2UubWVcIlxuXHQsIFwibmludGlsLmNvbVwiXG5cdCwgXCJub3J2aWcuY29tXCJcblx0LCBcIm5vdGVzLnBpbmJvYXJkLmluXCJcblx0LCBcIm51bWlub3VzLnByb2R1Y3Rpb25zXCJcblx0LCBcIm55bWFnLmNvbVwiXG5cdCwgXCJvcGVuYWkuY29tXCJcblx0LCBcIm91cndvcmxkaW5kYXRhLm9yZ1wiXG5cdCwgXCJwYW5kb2Mub3JnXCJcblx0LCBcInBhcGVycy5zc3JuLmNvbVwiXG5cdCwgXCJwYXJhbWV0cmljLnByZXNzXCJcblx0LCBcInBhdHJpY2tjb2xsaXNvbi5jb21cIlxuXHQsIFwicGRmcy5zZW1hbnRpY3NjaG9sYXIub3JnXCJcblx0LCBcInBlcnNvbmFsaXR5dGVzdC5uZXRcIlxuXHQsIFwicGhpbHBhcGVycy5vcmdcIlxuXHQsIFwicGluYm9hcmQuaW5cIlxuXHQsIFwicGxhdG8uc3RhbmZvcmQuZWR1XCJcblx0LCBcInBsYXlncm91bmQudGVuc29yZmxvdy5vcmdcIlxuXHQsIFwicG9wY29uLnVidW50dS5jb21cIlxuXHQsIFwicHJlc3MuZXRjLmNtdS5lZHVcIlxuXHQsIFwicHJvZ3Jlc3NzdHVkaWVzLnNjaG9vbFwiXG5cdCwgXCJwc3ljaGNlbnRyYWwuY29tXCJcblx0LCBcInB1YmxpY2RvbWFpbnJldmlldy5vcmdcIlxuXHQsIFwicHVibGlzaGluZy5jZGxpYi5vcmdcIlxuXHQsIFwicW50bS5vcmdcIlxuXHQsIFwicXVhbnR1bS5jb3VudHJ5XCJcblx0LCBcInF3YW50ei5jb21cIlxuXHQsIFwicmFja2V0LWxhbmcub3JnXCJcblx0LCBcInJhdGlvbmFsaXR5Lm9yZ1wiXG5cdCwgXCJyZGlmZi1iYWNrdXAubmV0XCJcblx0LCBcInJpY29uLmRldlwiXG5cdCwgXCJyb290c29mcHJvZ3Jlc3Mub3JnXCJcblx0LCBcInJvdzEuY2FcIlxuXHQsIFwic2FmZWJvb3J1Lm9yZ1wiXG5cdCwgXCJzY2hvbGFycy1zdGFnZS5vcmdcIlxuXHQsIFwic2NpZW5jZWJhc2VkbWVkaWNpbmUub3JnXCJcblx0LCBcInNldmVuc2VjdWxhcnNlcm1vbnMub3JnXCJcblx0LCBcInNoaW55LmFwcFwiXG5cdCwgXCJzaWZ0ZXIub3JnXCJcblx0LCBcInNsYXRlc3RhcmNvZGV4LmNvbVwiXG5cdCwgXCJzcHJlYWRzaGVldHMuZ29vZ2xlLmNvbVwiXG5cdCwgXCJzdGF0bW9kZWxpbmcuc3RhdC5jb2x1bWJpYS5lZHVcIlxuXHQsIFwic3RhdHMuZ3Jvay5zZVwiXG5cdCwgXCJ0ZXh0Lm5wci5vcmdcIlxuXHQsIFwidGhlZmlyc3RhaWJvb2suY29tXCJcblx0LCBcInRoaXNhbmltZWRvZXNub3RleGlzdC5haVwiXG5cdCwgXCJ0aGlzY2F0ZG9lc25vdGV4aXN0LmNvbVwiXG5cdCwgXCJ0aGlzcmVudGFsZG9lc25vdGV4aXN0LmNvbVwiXG5cdCwgXCJ0cmFpbmluZy5rYWx6dW1ldXMuY29tXCJcblx0LCBcInVuc29uZ2Jvb2suY29tXCJcblx0LCBcInVwbG9hZC53aWtpbWVkaWEub3JnXCJcblx0LCBcInZhc3QuYWlcIlxuXHQsIFwidmlkZW9sZWN0dXJlcy5uZXRcIlxuXHQsIFwid2F5YmFjay5hcmNoaXZlLWl0Lm9yZ1wiXG5cdCwgXCJ3ZWIuYXJjaGl2ZS5vcmdcIlxuXHQsIFwid2lraS5ldmFnZWVrcy5vcmdcIlxuXHQsIFwid2lraS5oYXNrZWxsLm9yZ1wiXG5cdCwgXCJ3d3cuYWxlcGguc2VcIlxuXHQsIFwid3d3LmFudGlwb3BlLm9yZ1wiXG5cdCwgXCJ3d3cuYXJjaGl2ZS1pdC5vcmdcIlxuXHQsIFwid3d3LmJhcm5lc2FuZG5vYmxlLmNvbVwiXG5cdCwgXCJ3d3cuYnV6enJpY2tzb25zLmpwXCJcblx0LCBcInd3dy5jZGMuZ292XCJcblx0LCBcInd3dy5jb2dtZWQuY29tXCJcblx0LCBcInd3dy5jb2d0ZXN0LmNvbVwiXG5cdCwgXCJ3d3cuY3JhbS5jb21cIlxuXHQsIFwid3d3LmNyeW9uaWNzY2FsY3VsYXRvci5jb21cIlxuXHQsIFwid3d3LmN5bGFiLmNtdS5lZHVcIlxuXHQsIFwid3d3LmRhZm9udC5jb21cIlxuXHQsIFwid3d3LmRhdmlkc29uZ2lmdGVkLm9yZ1wiXG5cdCwgXCJ3d3cuZGVlcGxlYXJuaW5nYm9vay5vcmdcIlxuXHQsIFwid3d3LmRpc2NvdmVyYm9va3MuY29tXCJcblx0LCBcInd3dy5kb2M4OC5jb21cIlxuXHQsIFwid3d3LmRybWFjaXZlci5jb21cIlxuXHQsIFwid3d3LmUtY29kaWNlcy51bmlmci5jaFwiXG5cdCwgXCJ3d3cuZWNvbG9neWFuZHNvY2lldHkub3JnXCJcblx0LCBcInd3dy5lY29ubGliLm9yZ1wiXG5cdCwgXCJ3d3cuZWNvbm9taXN0LmNvbVwiXG5cdCwgXCJ3d3cuZWNvbnRhbGsub3JnXCJcblx0LCBcInd3dy5lcXVhdG9yLW5ldHdvcmsub3JnXCJcblx0LCBcInd3dy5lcXVlc3RyaWFkYWlseS5jb21cIlxuXHQsIFwid3d3LmV2YW1vbmtleS5jb21cIlxuXHQsIFwid3d3LmZpbGZyZS5uZXRcIlxuXHQsIFwid3d3LmZpbmQtbW9yZS1ib29rcy5jb21cIlxuXHQsIFwid3d3LmZyb250aWVyc2luLm9yZ1wiXG5cdCwgXCJ3d3cuZ2VuZXRpY3Mub3JnXCJcblx0LCBcInd3dy5naXptb2RvLmNvbS5hdVwiXG5cdCwgXCJ3d3cuZ254cC5jb21cIlxuXHQsIFwid3d3Lmdvb2dsZS1tZWxhbmdlLmNvbVwiXG5cdCwgXCJ3d3cuZ3JlYXRlcndyb25nLmNvbVwiXG5cdCwgXCJ3d3cuZ3V0ZW5iZXJnLm9yZ1wiXG5cdCwgXCJ3d3cuaGFza2VsbC5vcmdcIlxuXHQsIFwid3d3LmhwbW9yLmNvbVwiXG5cdCwgXCJ3d3cuaHRtbC10aWR5Lm9yZ1wiXG5cdCwgXCJ3d3cuaWFycGEuZ292XCJcblx0LCBcInd3dy5pcXRlc3QuY29tXCJcblx0LCBcInd3dy5qb2Vsb25zb2Z0d2FyZS5jb21cIlxuXHQsIFwid3d3LmpvaG5kY29vay5jb21cIlxuXHQsIFwid3d3LmthbHp1bWV1cy5jb21cIlxuXHQsIFwid3d3Lmxlc3N3cm9uZy5jb21cIlxuXHQsIFwid3d3LmxpYnJhcnl0aGluZy5jb21cIlxuXHQsIFwid3d3Lm1haWwtYXJjaGl2ZS5jb21cIlxuXHQsIFwid3d3Lm1lZGlhd2lraS5vcmdcIlxuXHQsIFwid3d3Lm1ldGFmb3ItcHJvamVjdC5vcmdcIlxuXHQsIFwid3d3Lm1vdGhlcmpvbmVzLmNvbVwiXG5cdCwgXCJ3d3cubmNiaS5ubG0ubmloLmdvdlwiXG5cdCwgXCJ3d3cubnByLm9yZ1wiXG5cdCwgXCJ3d3cub2h5b3VwcmV0dHl0aGluZ3MuY29tXCJcblx0LCBcInd3dy5vdmVyY29taW5nYmlhcy5jb21cIlxuXHQsIFwid3d3LnBvZXRyeWZvdW5kYXRpb24ub3JnXCJcblx0LCBcInd3dy5wcm9xdWVzdC5jb21cIlxuXHQsIFwid3d3LnBzeWNoaWF0cnlpbnZlc3RpZ2F0aW9uLm9yZ1wiXG5cdCwgXCJ3d3cuci1ibG9nZ2Vycy5jb21cIlxuXHQsIFwid3d3LnJkb2N1bWVudGF0aW9uLm9yZ1wiXG5cdCwgXCJ3d3cucmliYm9uZmFybS5jb21cIlxuXHQsIFwid3d3LnJpZnRlcnMuY29tXCJcblx0LCBcInd3dy5zYXBhLXByb2plY3Qub3JnXCJcblx0LCBcInd3dy5zY2huZWllci5jb21cIlxuXHQsIFwid3d3LnNjaWVuY2VkaXJlY3QuY29tXCJcblx0LCBcInd3dy5zY2llbmNlbmV3cy5vcmdcIlxuXHQsIFwid3d3LnNjaWVuY2VuZXdzbGluZS5jb21cIlxuXHQsIFwid3d3LnNoYXd3bi5jb21cIlxuXHQsIFwid3d3LnNpbXBsaWZ5LnNvXCJcblx0LCBcInd3dy5zbnBlZGlhLmNvbVwiXG5cdCwgXCJ3d3cuc3RhdC5jb2x1bWJpYS5lZHVcIlxuXHQsIFwid3d3LnN0YXQuY29sdW1iaWEuZWR1XCJcblx0LCBcInd3dy5zdHJhaWdodHRhbGtvbmV2aWRlbmNlLm9yZ1wiXG5cdCwgXCJ3d3cudGFyc25hcC5jb21cIlxuXHQsIFwid3d3LnRoZWF0bGFudGljLmNvbVwiXG5cdCwgXCJ3d3cudGhlaW5kaWFmb3J1bS5pblwiXG5cdCwgXCJ3d3cudGhlcGFyaXNyZXZpZXcub3JnXCJcblx0LCBcInd3dy50aGlzZnVyc29uYWRvZXNub3RleGlzdC5jb21cIlxuXHQsIFwid3d3LnRoaXNwZXJzb25kb2Vzbm90ZXhpc3QuY29tXCJcblx0LCBcInd3dy50aGlzd2FpZnVkb2Vzbm90ZXhpc3QubmV0XCJcblx0LCBcInd3dy50aGlzd29yZGRvZXNub3RleGlzdC5jb21cIlxuXHQsIFwid3d3LnRocmlmdGJvb2tzLmNvbVwiXG5cdCwgXCJ3d3cudXJiYW5kaWN0aW9uYXJ5LmNvbVwiXG5cdCwgXCJ3d3cudmFuaXR5ZmFpci5jb21cIlxuXHQsIFwid3d3LnZvY2F0aXYuY29tXCJcblx0LCBcInd3dy53My5vcmdcIlxuXHQsIFwid3d3Lndhc2hpbmd0b25wb3N0LmNvbVwiXG5cdCwgXCJ3d3cud2hpY2hmYWNlaXNyZWFsLmNvbVwiXG5cdCwgXCJ3d3cud2luZWhxLm9yZ1wiXG5cdCwgXCJ3d3cud29sZmV3aWtpLmNvbVwiXG5cdCwgXCJ3d3cud3NqLmNvbVwiXG5cdCwgXCJ3d3cueWFsZWxhd2pvdXJuYWwub3JnXCJcblx0LCBcInd3dy55b3V0dWJlLmNvbVwiXG5cdCwgXCJ4a2NkLmNvbVwiXG5cdCwgXCJ4dG9vbHMud21mbGFicy5vcmdcIlxuXHQsIFwibWFpbC5oYXNrZWxsLm9yZ1wiXG5cdCwgXCJoYWNrYWdlLmhhc2tlbGwub3JnXCJcblx0LCBcIm9ubGluZS53c2ouY29tXCJcblx0LCBcInd3dy5taWNyb3NvZnQuY29tXCJcblx0LCBcImludGVsbGlnZW5jZS5vcmdcIlxuXHQsIFwiZXByaW50LmlhY3Iub3JnXCJcblx0LCBcInd3dy5leHBsYWlueGtjZC5jb21cIlxuXHQsIFwid3d3LnNpbHZlcmhhbmRtZWFkZXJ5LmNvbVwiXG5cdCwgXCJ3d3cubmlja2Jvc3Ryb20uY29tXCJcblx0LCBcIndlbGwuYmxvZ3Mubnl0aW1lcy5jb21cIlxuXHQsIFwid3d3Lmd3ZXJuLm5ldFwiXG5cdCwgXCJyamxpcHRvbi53b3JkcHJlc3MuY29tXCJcblx0LCBcImphc3BlcnZkai5iZVwiXG5cdCwgXCJqYW1hLmphbWFuZXR3b3JrLmNvbVwiXG5cdCwgXCJibG9nLmNvZGluZ2hvcnJvci5jb21cIlxuXHQsIFwiYWlpbXBhY3RzLm9yZ1wiXG5cdCwgXCJ3ZWIuYXJjaGl2ZS5vcmdcIlxuXHQsIFwid3d3LmZoaS5veC5hYy51a1wiXG5cdCwgXCJ3d3cuY2phcy5vcmdcIlxuXHQsIFwiYmxvZy5nb29nbGVcIlxuXHQsIFwiYXJjaGludGUuamFtYW5ldHdvcmsuY29tXCJcblx0LCBcImFjbGFudGhvbG9neS5vcmdcIlxuXHQsIFwid3d3LmNsaW5pY2FsdHJpYWxzLmdvdlwiXG5cdCwgXCJwcm9jZWVkaW5ncy5tbHIucHJlc3NcIlxuXHQsIFwiZGlmZi53aWtpbWVkaWEub3JnXCJcblx0LCBcInd3dy5zY290dGFhcm9uc29uLmNvbVwiXG5cdCwgXCJ3d3cuZXVnZW5ld2VpLmNvbVwiXG5cdCwgXCJ3d3cuYWxpZ25tZW50Zm9ydW0ub3JnXCJcblx0LCBcInd3dy53aXJlZC5jb21cIlxuXHQsIFwid3d3LmV2YW90YWt1LmNvbVwiXG5cdCwgXCJ3d3cuc3R1ZmYuY28ubnpcIlxuXHQsIFwidGV4YW1wbGUubmV0XCJcblx0LCBcInd3dy5kYWlseW1haWwuY28udWtcIlxuXHQsIFwid3d3Lm1lbXRlYWltcG9ydHMuY29tXCJcblx0LCBcImJvYXJkcy5maXJlZGVuLm5ldFwiXG5cdCwgXCJ3ZWJjaXRhdGlvbi5vcmdcIlxuXHQsIFwid3d3LnJldXRlcnMuY29tXCJcblx0LCBcIm1haWwuaGFza2VsbC5vcmdcIlxuXHQsIFwiZ2FtZXByb2dyYW1taW5ncGF0dGVybnMuY29tXCJcblx0LCBcImRpZ2l0YWwubGlicmFyeS51bnQuZWR1XCJcblx0LCBcInd3dy5zYWxvbi5jb21cIlxuXHQsIFwid3d3Lm1ldG9wZXJhLm9yZ1wiXG5cdCwgXCJkbnN0YXRzLm5ldFwiXG5cdCwgXCJ3d3cudGhlY3V0LmNvbVwiXG5cdCwgXCJhbmltZWtyaXRpay53b3JkcHJlc3MuY29tXCJcblx0LCBcInd3dy5mYWRlZHBhZ2UuY29tXCJcblx0LCBcInd3dy5kYWlseWRvdC5jb21cIlxuXHQsIFwid3d3LmNhbmR5amFwYW4uY29tXCJcblx0LCBcIm5hdXRpbC51c1wiXG5cdCwgXCJlbWlsa2lya2VnYWFyZC5ka1wiXG5cdCwgXCJ3d3cuaW5kZXBlbmRlbnQuY28udWtcIlxuXHQsIFwid3d3LmVkd2FyZHR1ZnRlLmNvbVwiXG5cdCwgXCJ3d3cuYnJvb2tpbmdzLmVkdVwiXG5cdCwgXCJ3d3cuYmxvY2tjaGFpbi5jb21cIlxuXHQsIFwid2ViLnN0YW5mb3JkLmVkdVwiXG5cdCwgXCJtaXRwcmVzcy5taXQuZWR1XCJcblx0LCBcImZyZWFrb25vbWljcy5jb21cIlxuXHQsIFwiZm9ydW1zLmFuaW1lc3VraS5jb21cIlxuXHQsIFwiZWxpLnRoZWdyZWVucGxhY2UubmV0XCJcblx0LCBcInd3dy50aGVyZWdpc3Rlci5jb21cIlxuXHQsIFwid3d3LmFsY29yLm9yZ1wiXG5cdCwgXCJ0aGUtbGlsaXF1YXJpdW0ubGl2ZWpvdXJuYWwuY29tXCJcblx0LCBcInNvY2dob3AuYXBwc3BvdC5jb21cIlxuXHQsIFwicGVvcGxlLmNzYWlsLm1pdC5lZHVcIlxuXHQsIFwiZmluZGFydGljbGVzLmNvbVwiXG5cdCwgXCJkYXRhcHJpdmFjeWxhYi5vcmdcIlxuXHQsIFwiYmxvZy4yM2FuZG1lLmNvbVwiXG5cdCwgXCJhbmRyZXdtYXluZWJsb2cud29yZHByZXNzLmNvbVwiXG5cdCwgXCJ3d3cudGhlZnJlZWxpYnJhcnkuY29tXCJcblx0LCBcInd3dy5zZmdhdGUuY29tXCJcblx0LCBcInd3dy5ycmF1Y3Rpb24uY29tXCJcblx0LCBcInd3dy5tZXJrbGUuY29tXCJcblx0LCBcInd3dy5saW5rcy5vcmdcIlxuXHQsIFwid3d3LmJhcnRsZWJ5LmNvbVwiXG5cdCwgXCJ3YXZlbW90aW9uY2Fubm9uLmNvbVwiXG5cdCwgXCJ3d3cuYmFsdGltb3Jlc3VuLmNvbVwiXG5cdCwgXCJ1bmVudW1lcmF0ZWQuYmxvZ3Nwb3QuY29tXCJcblx0LCBcInNjb3R0YWFyb25zb24uYmxvZ1wiXG5cdCwgXCJyamxpcHRvbi53b3JkcHJlc3MuY29tXCJcblx0LCBcIm1hc29uLmdtdS5lZHVcIlxuXHQsIFwiaWxvdmV0eXBvZ3JhcGh5LmNvbVwiXG5cdCwgXCJodW1hbnZhcmlldGllcy5vcmdcIlxuXHQsIFwiZ29vZ2xlc3lzdGVtLmJsb2dzcG90LmNvbVwiXG5cdCwgXCJ3d3cueXVka293c2t5Lm5ldFwiXG5cdCwgXCJhcnIuYW1cIlxuXHQsIFwid3d3LndvcmxkY2F0Lm9yZ1wiXG5cdCwgXCJ3d3cuc3VwZXJtZW1vLmNvbVwiXG5cdCwgXCJ3d3cuc3RhbmRhcmQuY28udWtcIlxuXHQsIFwid3d3Lm9ybGFuZG9zZW50aW5lbC5jb21cIlxuXHQsIFwid3d3Lm5iY25ld3MuY29tXCJcblx0LCBcInd3dy5tZXJjdXJ5bmV3cy5jb21cIlxuXHQsIFwid3d3Lm1hdGgudXdhdGVybG9vLmNhXCJcblx0LCBcInd3dy5qZWZmdGsuY29tXCJcblx0LCBcInd3dy5ncS5jb21cIlxuXHQsIFwid3d3LmJ1c2luZXNzd2Vlay5jb21cIlxuXHQsIFwid3d3LmF1c3RsaWkuZWR1LmF1XCJcblx0LCBcInd3dy5haXdlaXJkbmVzcy5jb21cIlxuXHQsIFwidy5hdHdpa2kuanBcIlxuXHQsIFwidml0YWxpay5jYVwiXG5cdCwgXCJ1bnF1YWxpZmllZC1yZXNlcnZhdGlvbnMuYmxvZ3Nwb3QuY29tXCJcblx0LCBcInRoZWdyYW5kbmFycmF0aXZlLmNvbVwiXG5cdCwgXCJzcmUuZ29vZ2xlXCJcblx0LCBcInNpZ25hbHZub2lzZS5jb21cIlxuXHQsIFwic2hrc3ByLm1vYmlcIlxuXHQsIFwicXVhbGlhY29tcHV0aW5nLmNvbVwiXG5cdCwgXCJwZW5lbG9wZS51Y2hpY2Fnby5lZHVcIlxuXHQsIFwicGFyYWh1bWFucy53b3JkcHJlc3MuY29tXCJcblx0LCBcInBhbGxhZGl1bW1hZy5jb21cIlxuXHQsIFwicGFja2RlcHMuaGFza2VsbGVycy5jb21cIlxuXHQsIFwib2h0b3JpLm51XCJcblx0LCBcIm15LnZhbmRlcmJpbHQuZWR1XCJcblx0LCBcIm1hdGh3b3JsZC53b2xmcmFtLmNvbVwiXG5cdCwgXCJtYWdlbnRhLnRlbnNvcmZsb3cub3JnXCJcblx0LCBcImluZm9wcm9jLmJsb2dzcG90LmNvbVwiXG5cdCwgXCJoaWdobm9vbmdtdC53b3JkcHJlc3MuY29tXCJcblx0LCBcImdvb2dsZXByb2plY3R6ZXJvLmJsb2dzcG90LmNvbVwiXG5cdCwgXCJmb3J1bS5xdWFudGlmaWVkc2VsZi5jb21cIlxuXHQsIFwiZm9yZWlnbnBvbGljeS5jb21cIlxuXHQsIFwiZW5naW5lZXJpbmcuZmIuY29tXCJcblx0LCBcImNkbi5vcGVuYWkuY29tXCJcblx0LCBcImNkbi5kaXNjb3JkYXBwLmNvbVwiXG5cdCwgXCJibG9nLmFjb2x5ZXIub3JnXCJcblx0LCBcIndlYi5hcmNoaXZlLm9yZ1wiXG5cdCwgXCJhcnRpY2xlcy5sYXRpbWVzLmNvbVwiXG5cdCwgXCJhbHVtbmkubWVkaWEubWl0LmVkdVwiXG5cdCwgXCJhZ3RiLndvcmRwcmVzcy5jb21cIlxuXHQsIFwiemxrai5pblwiXG5cdCwgXCJ3d3cud2FrYXBvZXRyeS5uZXRcIlxuXHQsIFwid3d3LnZldHRhLm9yZ1wiXG5cdCwgXCJ3d3cudW56LmNvbVwiXG5cdCwgXCJ3d3cudW5pY29kZS5vcmdcIlxuXHQsIFwid3d3LnVuYy5lZHVcIlxuXHQsIFwid3d3LnRvci5jb21cIlxuXHQsIFwid3d3LnRvbW9kYWNoaS5kZVwiXG5cdCwgXCJ3d3cudGhlc3RyYW5nZXIuY29tXCJcblx0LCBcInd3dy50aGUtc2NpZW50aXN0LmNvbVwiXG5cdCwgXCJ3d3cudGFibGV0bWFnLmNvbVwiXG5cdCwgXCJ3d3cuc3lyYWN1c2UuY29tXCJcblx0LCBcInd3dy5zdW4tbW9kYWxlcnQuY29tXCJcblx0LCBcInd3dy5zcGllZ2VsLmRlXCJcblx0LCBcInd3dy5zYW5rYWt1Y29tcGxleC5jb21cIlxuXHQsIFwid3d3LnNhY2JlZS5jb21cIlxuXHQsIFwid3d3LnJ3YWduZXIubmV0XCJcblx0LCBcInd3dy5yaWNoYXJkY2Fycmllci5pbmZvXCJcblx0LCBcInd3dy5yYXRpb25hbG9wdGltaXN0LmNvbVwiXG5cdCwgXCJ3d3cucHJhZ21hdGljLm1sXCJcblx0LCBcInd3dy5wb3BzY2kuY29tXCJcblx0LCBcInd3dy5vd2Vuc3RlcGhlbnMuY28udWtcIlxuXHQsIFwid3d3Lm55ZGFpbHluZXdzLmNvbVwiXG5cdCwgXCJ3d3cub3JlZ29ubGl2ZS5jb21cIlxuXHQsIFwid3d3Lm1pYW1paGVyYWxkLmNvbVwiXG5cdCwgXCJ3d3cubHJiLmNvLnVrXCJcblx0LCBcInd3dy5saXZlc3Ryb25nLmNvbVwiXG5cdCwgXCJ3d3cua2FyZ2VyLmNvbVwiXG5cdCwgXCJ3d3cuamFwYW5zb2NpZXR5Lm9yZ1wiXG5cdCwgXCJ3d3cuamFwYW5pbmMuY29tXCJcblx0LCBcInd3dy5ncmFuZGZvcmtzaGVyYWxkLmNvbVwiXG5cdCwgXCJ3d3cuZ2VuZWFsb2d5Lm1hdGgubmRzdS5ub2Rhay5lZHVcIlxuXHQsIFwid3d3Lmdhd2tlci5jb21cIlxuXHQsIFwid3d3LmZhdGhvbWV2ZW50cy5jb21cIlxuXHQsIFwid3d3LmRhcnRtb3V0aC5lZHVcIlxuXHQsIFwid3d3LmN1bGh3Y2guaW5mb1wiXG5cdCwgXCJ3d3cuY3MudmlyZ2luaWEuZWR1XCJcblx0LCBcInd3dy5jbm4uY29tXCJcblx0LCBcInd3dy5jaGljYWdvdHJpYnVuZS5jb21cIlxuXHQsIFwid3d3LmNic25ld3MuY29tXCJcblx0LCBcInd3dy5iZW1tdS5jb21cIlxuXHQsIFwid3d3LjRucngtdWsubWRcIlxuXHQsIFwid2Fyb250aGVyb2Nrcy5jb21cIlxuXHQsIFwidmVudHVyZWJlYXQuY29tXCJcblx0LCBcInRpbWUuY29tXCJcblx0LCBcInRocmVhZHJlYWRlcmFwcC5jb21cIlxuXHQsIFwidGhlbGFzdHBzeWNoaWF0cmlzdC5jb21cIlxuXHQsIFwidGFvb2Z0ZWEuY29tXCJcblx0LCBcInRha2ltYWcuY29tXCJcblx0LCBcInN5bmFwc2Uua29yZWFtZWQub3JnXCJcblx0LCBcInN0cmF0ZWNoZXJ5LmNvbVwiXG5cdCwgXCJzcmNvbnN0YW50aW4ud29yZHByZXNzLmNvbVwiXG5cdCwgXCJzcGlrZWphcGFuLndvcmRwcmVzcy5jb21cIlxuXHQsIFwic29yYW5ld3MyNC5jb21cIlxuXHQsIFwic2VucmlnYW4uaW9cIlxuXHQsIFwicmV0cmFjdGlvbndhdGNoLmNvbVwiXG5cdCwgXCJyZXBsaWNhdGlvbmluZGV4LmNvbVwiXG5cdCwgXCJxdWV1ZS5hY20ub3JnXCJcblx0LCBcInBoeXMub3JnXCJcblx0LCBcIm9yaWdpbnN0YW1wLmNvbVwiXG5cdCwgXCJvcGluaW9uYXRvci5ibG9ncy5ueXRpbWVzLmNvbVwiXG5cdCwgXCJva21pai5vcmdcIlxuXHQsIFwid2ViLmFyY2hpdmUub3JnXCJcblx0LCBcIndlYi5hcmNoaXZlLm9yZ1wiXG5cdCwgXCJuZXdjcml0ZXJpb24uY29tXCJcblx0LCBcIm5ldXJvc2NpZW5jZW5ld3MuY29tXCJcblx0LCBcIm15LnBncC1obXMub3JnXCJcblx0LCBcIm1ldGV1cGhvcmljLmNvbVwiXG5cdCwgXCJtZWVobC51bW4uZWR1XCJcblx0LCBcIm1hdGhzaGlzdG9yeS5zdC1hbmRyZXdzLmFjLnVrXCJcblx0LCBcImxvbmd0ZXJtcmlzay5vcmdcIlxuXHQsIFwianRhdWJlci5jb21cIlxuXHQsIFwiam91cm5hbC5zdHVmZndpdGhzdHVmZi5jb21cIlxuXHQsIFwiaWRlYXMucmVwZWMub3JnXCJcblx0LCBcImhhcnBlcnMub3JnXCJcblx0LCBcImhhcGdvb2QudXNcIlxuXHQsIFwiZ29vZ2xlYmxvZy5ibG9nc3BvdC5jb21cIlxuXHQsIFwiZ2xvYmFsZ3VlcnJpbGxhcy50eXBlcGFkLmNvbVwiXG5cdCwgXCJmZWxpbmVnZW5ldGljcy5taXNzb3VyaS5lZHVcIlxuXHQsIFwiZXZhLWZhbi5jb21cIlxuXHQsIFwiZXNvbGFuZ3Mub3JnXCJcblx0LCBcImVpbGVlbm9ybXNieS5jb21cIlxuXHQsIFwiZGl5aHBsLnVzXCJcblx0LCBcImVnYW1lYm9vay5jb21cIlxuXHQsIFwiZG9uc2JvdC5jb21cIlxuXHQsIFwiY3Muc3RhbmZvcmQuZWR1XCJcblx0LCBcImNyb29rZWR0aW1iZXIub3JnXCJcblx0LCBcImNhcmUuZGlhYmV0ZXNqb3VybmFscy5vcmdcIlxuXHQsIFwiY2FuaXVzZS5jb21cIlxuXHQsIFwiYmxkZ2Jsb2cuY29tXCJcblx0LCBcImJldGFiZWF0LmNvbVwiXG5cdCwgXCJ3d3cuY2hpbmFkYWlseS5jb20uY25cIlxuXHQsIFwiZ29vZ2xlc3lzdGVtLmJsb2dzcG90LmNvbVwiXG5cdCwgXCJwYXVsZmNocmlzdGlhbm8uY29tXCJcblx0LCBcInBlb3BsZS5jc2FpbC5taXQuZWR1XCJcblx0LCBcInF1YW50aWZpZWRzZWxmLmNvbVwiXG5cdCwgXCJzb2NnaG9wLmFwcHNwb3QuY29tXCJcblx0LCBcInVuZW51bWVyYXRlZC5ibG9nc3BvdC5jb21cIlxuXHQsIFwid2ViLmFyY2hpdmUub3JnXCJcblx0LCBcInd3dy5hZ2luZy11cy5jb21cIlxuXHQsIFwid3d3LmJlbGZhc3R0ZWxlZ3JhcGguY28udWtcIlxuXHQsIFwid3d3LmJlbmt1aG4ubmV0XCJcblx0LCBcInd3dy5ib3N0b25nbG9iZS5jb21cIlxuXHQsIFwid3d3LmJyYWlucHJlc2VydmF0aW9uLm9yZ1wiXG5cdCwgXCJ3d3cuYnUuZWR1XCJcblx0LCBcInd3dy5jODIubmV0XCJcblx0LCBcInd3dy5jYXRhbG9ndHJlZS5uZXRcIlxuXHQsIFwid3d3LmNpYS5nb3ZcIlxuXHQsIFwid3d3LmRhaWx5bWFpbC5jby51a1wiXG5cdCwgXCJ3d3cuZnQuY29tXCJcblx0LCBcInd3dy5tYW5nYXVwZGF0ZXMuY29tXCJcblx0LCBcInd3dy5tZW50YWxmbG9zcy5jb21cIlxuXHQsIFwid3d3LnNhY2JlZS5jb21cIlxuXHQsIFwid3d3LnNhbmtha3Vjb21wbGV4LmNvbVwiXG5cdCwgXCJkcmVzZGVuY29kYWsuY29tXCJcblx0LCBcImRvd25sb2Fkcy5oYXNrZWxsLm9yZ1wiXG5cdCwgXCJhZ2VvZmVtLmNvbVwiXG5cdCwgXCJhaS5nb29nbGVcIlxuXHQsIFwiYWxlcGguc2VcIlxuXHQsIFwiYWx0amFwYW4udHlwZXBhZC5jb21cIlxuXHQsIFwiYW5zdXouc29va2UuYmMuY2FcIlxuXHQsIFwiYXBuZXdzLmNvbVwiXG5cdCwgXCJhcmltYS5jeWxhYi5jbXUuZWR1XCJcblx0LCBcImJhaXIuYmVya2VsZXkuZWR1XCJcblx0LCBcImJlaGF2aW9yYWxzY2llbnRpc3Qub3JnXCJcblx0LCBcImJlbGlldmVybWFnLmNvbVwiXG5cdCwgXCJiaXRjb2luLW90Yy5jb21cIlxuXHQsIFwiYml0cy5ibG9ncy5ueXRpbWVzLmNvbVwiXG5cdCwgXCJibG9nLjhmYWNlcy5jb21cIlxuXHQsIFwiYmxvZy5jci55cC50b1wiXG5cdCwgXCJibG9nLmNzZG4ubmV0XCJcblx0LCBcImJsb2cuZXRoZXJldW0ub3JnXCJcblx0LCBcImJsb2cubnVjbGVhcnNlY3JlY3kuY29tXCJcblx0LCBcImJsb2cueW91dHViZVwiXG5cdCwgXCJibG9ncy53c2ouY29tXCJcblx0LCBcImNhY20uYWNtLm9yZ1wiXG5cdCwgXCJjYXJib25wbGFuLm9yZ1wiXG5cdCwgXCJjYXN1YWwtZWZmZWN0cy5jb21cIlxuXHQsIFwiY29nbml0aXZlbWVkaXVtLmNvbVwiXG5cdCwgXCJjb21tb25zLndpa2ltZWRpYS5vcmdcIlxuXHQsIFwiY291cnNlcy5jc2FpbC5taXQuZWR1XCJcblx0LCBcImRhbmllbGxha2Vucy5ibG9nc3BvdC5jb21cIlxuXHQsIFwiZGF0YS5ibHMuZ292XCJcblx0LCBcImRhdGFjb2xhZGEub3JnXCJcblx0LCBcImRlYWxib29rLm55dGltZXMuY29tXCJcblx0LCBcImRpYWxuZXQudW5pcmlvamEuZXNcIlxuXHQsIFwiZG9taW5pY2N1bW1pbmdzLmNvbVwiXG5cdCwgXCJkdW1wcy53aWtpbWVkaWEub3JnXCJcblx0LCBcImVuZXJneWNvbnRyb2wub3JnXCJcblx0LCBcImV4YWMuYnJvYWRpbnN0aXR1dGUub3JnXCJcblx0LCBcImZhbWlsaWFyY3ljbGUubmV0XCJcblx0LCBcImZyYXMudWtcIlxuXHQsIFwiZ2Fsb2lzLmNvbVwiXG5cdCwgXCJnYW1lZmFxcy5nYW1lc3BvdC5jb21cIlxuXHQsIFwiZ2l0aHViLmJsb2dcIlxuXHQsIFwiZ2xvYmFsdm9pY2VzLm9yZ1wiXG5cdCwgXCJnb29nbGUtc3VtbWVyLW9mLWNvZGUtMjAwOS1oYXNrZWxsLmdvb2dsZWNvZGUuY29tXCJcblx0LCBcImdyYWRpZW50c2NpZW5jZS5vcmdcIlxuXHQsIFwiZ3V0ZW5iZXJnLm5ldC5hdVwiXG5cdCwgXCJoYW5kYm9vay01LTEuY29jaHJhbmUub3JnXCJcblx0LCBcImhlYWx0aGxhbmQudGltZS5jb21cIlxuXHQsIFwiaHViLmRhcmNzLm5ldFwiXG5cdCwgXCJpZm9yY2VkYWJvdC5jb21cIlxuXHQsIFwiaW5odW1hbmV4cGVyaW1lbnQuYmxvZ3Nwb3QuY29tXCJcblx0LCBcImlzb21lcmRlc2lnbi5jb21cIlxuXHQsIFwiamVzc2VnYWxlZi5jb21cIlxuXHQsIFwianVzdGdldGZsdXguY29tXCJcblx0LCBcImtvbW9uZXdzLmNvbVwiXG5cdCwgXCJrcmVic29uc2VjdXJpdHkuY29tXCJcblx0LCBcImxhbmdzZWMub3JnXCJcblx0LCBcImxhdGltZXNibG9ncy5sYXRpbWVzLmNvbVwiXG5cdCwgXCJsZXR0ZXJzb2Zub3RlLmNvbVwiXG5cdCwgXCJsaWZlc2NpdmMuY29tXCJcblx0LCBcImxpdGh1Yi5jb21cIlxuXHQsIFwibHVjdW1yLnBvY29vLm9yZ1wiXG5cdCwgXCJtYWtvLmNjXCJcblx0LCBcIm5lb2phcG9uaXNtZS5jb21cIlxuXHQsIFwibmJjLTIuY29tXCJcblx0LCBcIm1sZy5lbmcuY2FtLmFjLnVrXCJcblx0LCBcIm1pbmltYXhpci5jb21cIlxuXHQsIFwibWlsYW4uY3ZpdGtvdmljLm5ldFwiXG5cdCwgXCJtZWRpY2FseHByZXNzLmNvbVwiXG5cdCwgXCJ3d3cuY29sbGVjdG9yc3dlZWtseS5jb21cIlxuXHQsIFwid3d3LmNhdG8tdW5ib3VuZC5vcmdcIlxuXHQsIFwid3d3LmFsZXhpcnBhbi5jb21cIlxuXHQsIFwid3d3LmFsZXNzb25pc2xlYXJuZWQuY29tXCJcblx0LCBcInd3dy5hZGVsYWlkZW5vdy5jb20uYXVcIlxuXHQsIFwid3d3LmFiY2IuY29tXCJcblx0LCBcIndyaXRpbmdzLnN0ZXBoZW53b2xmcmFtLmNvbVwiXG5cdCwgXCJ3cml0ZXN3aXRoLmNvbVwiXG5cdCwgXCJ3aWtpbWVkaWFmb3VuZGF0aW9uLm9yZ1wiXG5cdCwgXCJ3YXNoaW5ndG9ubW9udGhseS5jb21cIlxuXHQsIFwidHJpeHRlci5vbGRza29vbC5vcmdcIlxuXHQsIFwidG9vbHMud21mbGFicy5vcmdcIlxuXHQsIFwidG9tY3JpdGNobG93LmNvbVwiXG5cdCwgXCJ0aGVoYXJkZXN0c2NpZW5jZS5jb21cIlxuXHQsIFwic3RyYXRlZ3kud2lraW1lZGlhLm9yZ1wiXG5cdCwgXCJzcHAuZmFzLm9yZ1wiXG5cdCwgXCJzb2Npb2xvZ2ljYWxzY2llbmNlLmNvbVwiXG5cdCwgXCJzb2NpYWxzY2llbmNlcy5tY21hc3Rlci5jYVwiXG5cdCwgXCJzZi1lbmN5Y2xvcGVkaWEuY29tXCJcblx0LCBcInNlYXJjaC53aWtpbGVha3Mub3JnXCJcblx0LCBcInNjaG9vbGdpcmxtaWxreWNyaXNpcy5jb21cIlxuXHQsIFwic2NhcnliZWFzdHNlY3VyaXR5LmJsb2dzcG90LmNvbVwiXG5cdCwgXCJyZWZsZWN0aXZlZGlzZXF1aWxpYnJpdW0uYmxvZ3Nwb3QuY29tXCJcblx0LCBcInJlYWR3cml0ZS5jb21cIlxuXHQsIFwicXVpbGxldHRlLmNvbVwiXG5cdCwgXCJwc3ljaG9uYXV0d2lraS5vcmdcIlxuXHQsIFwicHN5Y2guaGFub3Zlci5lZHVcIlxuXHQsIFwicHJvZ3JhbW1lLmV4b3Jkby5jb21cIlxuXHQsIFwicG9saXRpY2FsY2FsY3VsYXRpb25zLmJsb2dzcG90LmNvbVwiXG5cdCwgXCJwaGFybWFjeXJldmlld2VyLmNvXCJcblx0LCBcInBldGVydG9kZC5vcmdcIlxuXHQsIFwicGVkaWF0cmljcy5hYXBwdWJsaWNhdGlvbnMub3JnXCJcblx0LCBcInBhZ2VzLmpoLmVkdVwiXG5cdCwgXCJvcmlvbm1hZ2F6aW5lLm9yZ1wiXG5cdCwgXCJueWFhLnNpXCJcblx0LCBcIm5vb3Ryb3BpY3NkZXBvdC5jb21cIlxuXHQsIFwibmdtLm5hdGlvbmFsZ2VvZ3JhcGhpYy5jb21cIlxuXHQsIFwidGhlYmFmZmxlci5jb21cIlxuXHQsIFwic3ZpbGVudG9kb3Jvdi54eXpcIlxuXHQsIFwid3d3LmNvbXB1dGVyd29ybGQuY29tXCJcblx0LCBcInZpbm9zaGlwcGVyLmNvbVwiXG5cdCwgXCJ3d3cubWNhbGwuY29tXCJcblx0LCBcInd3dy5sYXRpbWVzLmNvbVwiXG5cdCwgXCJ3d3cua29yZWF0aW1lcy5jby5rclwiXG5cdCwgXCJ3d3cua29vc2xvb2lqZXN0ZWlqbi5uZXRcIlxuXHQsIFwid3d3LmtoYXJhLmNvLmpwXCJcblx0LCBcInd3dy5qdXN0aW5waW5rbmV5LmNvbVwiXG5cdCwgXCJ3d3cuam9obnNvbmVzc2F5cy5jb21cIlxuXHQsIFwid3d3Lmlua2FuZHN3aXRjaC5jb21cIlxuXHQsIFwid3d3LmluZGVwZW5kZW50LmllXCJcblx0LCBcInd3dy5pbmNvbXBsZXRlaWRlYXMubmV0XCJcblx0LCBcInd3dy5oc3guY29tXCJcblx0LCBcInd3dy5oZXJhbGRzdW4uY29tLmF1XCJcblx0LCBcInd3dy5oYXJyb3dlbGwub3JnLnVrXCJcblx0LCBcInd3dy5nbG9iYWxzZWN1cml0eS5vcmdcIlxuXHQsIFwid3d3LmdoaWJsaS5qcFwiXG5cdCwgXCJ3d3cuZ2FsYml0aGluay5vcmdcIlxuXHQsIFwid3d3LmZhc3QuYWlcIlxuXHQsIFwid3d3LmV2YWNvbW1lbnRhcnkub3JnXCJcblx0LCBcInd3dy5kaXNjb3ZlcnRlYXMuY29tXCJcblx0LCBcInd3dy5kZXBhdXcuZWR1XCJcblx0LCBcInd3dy5kZXNlcmV0LmNvbVwiXG5cdCwgXCJ3d3cuZGF2aWRicmluLmNvbVwiXG5cdCwgXCJ3d3cuZGF2aWRib3Jkd2VsbC5uZXRcIlxuXHQsIFwid3d3LmRhZ2JsYWRldC5ub1wiXG5cdCwgXCJ3d3cuZGFlbW9ub2xvZ3kubmV0XCJcblx0LCBcInd3dy5jcy5vZHUuZWR1XCJcblx0LCBcInd3dy5jcy5kYXJ0bW91dGguZWR1XCJcblx0LCBcInd3dy5jb3VyaWVybWFpbC5jb20uYXVcIlxuXHQsIFwid3d3Lmhicy5lZHVcIlxuXHQsIFwid3d3LmluZnJhbmtlbi5kZVwiXG5cdCwgXCJ3d3cucGVsbGVhcy5uZXRcIlxuXHQsIFwid3d3LnBld3Jlc2VhcmNoLm9yZ1wiXG5cdCwgXCJ3d3cucGNtYWcuY29tXCJcblx0LCBcInd3dy5vcmljb24uY28uanBcIlxuXHQsIFwid3d3Lm55YWEuZXVcIlxuXHQsIFwid3d3Lm5wcy5nb3ZcIlxuXHQsIFwid3d3Lm5wbHVzb25lbWFnLmNvbVwiXG5cdCwgXCJ3d3cubm9pc2VicmlkZ2UubmV0XCJcblx0LCBcInd3dy5uZXh0cGxhdGZvcm0uY29tXCJcblx0LCBcInd3dy5uZXh0YmlnZnV0dXJlLmNvbVwiXG5cdCwgXCJ3d3cubmV3c3RhdGVzbWFuLmNvbVwiXG5cdCwgXCJ3d3cubmV3c2RheS5jb21cIlxuXHQsIFwid3d3Lm1ldHpkb3dkLmNvbVwiXG5cdCwgXCJ3d3cuemVpdC5kZVwiXG5cdCwgXCJ3d3cud2VibWQuY29tXCJcblx0LCBcInd3dy51c25ld3MuY29tXCJcblx0LCBcInd3dy51ay1hbmltZS5uZXRcIlxuXHQsIFwid3d3LnRyYW5xdWlsdHVlc2RheXMuY29tXCJcblx0LCBcInd3dy50aGVzbW9raW5nZ3VuLmNvbVwiXG5cdCwgXCJ3d3cuc2NpZW5jZWFnb2dvLmNvbVwiXG5cdCwgXCJ3d3cuc2NpZWxvLmJyXCJcblx0LCBcInd3dy5yeHNob3AubWRcIlxuXHQsIFwid3d3LnJpZ2h0by5jb21cIlxuXHQsIFwid3d3LnByb2plY3QtaW1hcy5jb21cIlxuXHQsIFwid3d3LndpcmVkLmNvLnVrXCJcblx0LCBcInd3dy50YWx5YXJrb25pLm9yZ1wiXG5cdCwgXCJ3d3cuc3RhdG5ld3MuY29tXCJcblx0LCBcInd3dy5zbGVlcC1qb3VybmFsLmNvbVwiXG5cdCwgXCJ3d3cuc2xhdGUuY29tXCJcblx0LCBcInd3dy5zanN1LmVkdVwiXG5cdCwgXCJ3d3cuc2lybGluLm5ldFwiXG5cdCwgXCJ3d3cuc2hhd2xvY2FsLmNvbVwiXG5cdCwgXCJ3d3cuc2NpZW5jZW1hZG5lc3Mub3JnXCJcblx0LCBcImFiY25ld3MuZ28uY29tXCJcblx0LCBcInd3dy53YXNoaW5ndG9udGltZXMuY29tXCJcblx0LCBcImFiY25vdGF0aW9uLmNvbVwiXG5cdCwgXCJ3d3cucHJpbmNldG9uLmVkdVwiXG5cdCwgXCJyNi5jYVwiXG5cdCwgXCJ3d3cudGVjaG5vbG9neXJldmlldy5jb21cIlxuXHQsIFwid3d3Lm5jYmkubmxtLm5paC5nb3ZcIlxuXHQsIFwicmV0cmFjdGlvbndhdGNoLmNvbVwiXG5cdCwgXCJ3d3cuZGFydG1vdXRoLmVkdVwiXG5cdCwgXCJ3d3cuY25uLmNvbVwiXG5cdCwgXCJ3d3cueWYuaW9cIlxuXHQsIFwid3d3Lnd0bmguY29tXCJcblx0LCBcInd3dy53cml0aW5ncm91dGluZXMuY29tXCJcblx0LCBcInd3dy53aGVlbHMub3JnXCJcblx0LCBcInd3dy52ZXN0YS5lYXJ0aFwiXG5cdCwgXCJ3d3cudWxpd2VzdHBoYWwuZGVcIlxuXHQsIFwid3d3LnVidS5jb21cIlxuXHQsIFwid3d3LnR0LWZvcnVtcy5uZXRcIlxuXHQsIFwid3d3LnRydWJyYWluLmNvbVwiXG5cdCwgXCJ3d3cudHJlbnRvbmJyaWNrZW4uY29tXCJcblx0LCBcInd3dy50b21zaGFyZHdhcmUuY29tXCJcblx0LCBcInd3dy50aGVtdGFuay5vcmdcIlxuXHQsIFwid3d3LnRoZWRlbnZlcmNoYW5uZWwuY29tXCJcblx0LCBcInd3dy5zeXN0dXRvcmlhbHMuY29tXCJcblx0LCBcInd3dy5zdW1zYXIubmV0XCJcblx0LCBcInd3dy5zdHJpcGVzLmNvbVwiXG5cdCwgXCJ3d3cuc3NjLndpc2MuZWR1XCJcblx0LCBcInd3dy5zcWxpdGUub3JnXCJcblx0LCBcInd3dy5zcHJpbmcub3JnLnVrXCJcblx0LCBcInd3dy5zcGlrZWQtb25saW5lLmNvbVwiXG5cdCwgXCJ3d3cuc2lsaWNvbmVyYS5jb21cIlxuXHQsIFwid3d3LnJvc2VidWQuYWlcIlxuXHQsIFwid3d3LnJlZy5ydVwiXG5cdCwgXCJ3d3cucHVuY2hsaW5lZGVzaWduLm5ldFwiXG5cdCwgXCJ3d3cucHJvbGlmaWMuY29cIlxuXHQsIFwid3d3LnBvbGl0aWNvLmNvbVwiXG5cdCwgXCJ3d3cub3JidWNoLmNvbVwiXG5cdCwgXCJ3d3cubmF0aW9uYWxnZW9ncmFwaGljLmNvbVwiXG5cdCwgXCJ3d3cubWljcm9kb3NlLm1lXCJcblx0LCBcInd3dy5saWZldmlldy5jb21cIlxuXHQsIFwid3d3LmxlaGlnaHZhbGxleWxpdmUuY29tXCJcblx0LCBcInd3dy5sZWRnZXItY2xpLm9yZ1wiXG5cdCwgXCJ3d3cuamRtb3llci5jb21cIlxuXHQsIFwid3d3LmphbWVzZmFkaW1hbi5jb21cIlxuXHQsIFwid3d3Lml0bWVkaWEuY28uanBcIlxuXHQsIFwid3d3LmludGVjaG9wZW4uY29tXCJcblx0LCBcInd3dy5mcmVha29ub21pY3NleHBlcmltZW50cy5jb21cIlxuXHQsIFwid3d3LmVkdXJlZi5uZXRcIlxuXHQsIFwid3d3LmNvZGVyZWxheS5pb1wiXG5cdCwgXCJ3d3cuY2xldmVsYW5kLmNvbVwiXG5cdCwgXCJ3d3cuY2hyaXNzdHVjY2hpby5jb21cIlxuXHQsIFwid3d3LmNocmlzcGxheXNnYW1lcy5jb21cIlxuXHQsIFwid3d3LmJyb2FkaW5zdGl0dXRlLm9yZ1wiXG5cdCwgXCJ3d3cuYmVja2VyLXBvc25lci1ibG9nLmNvbVwiXG5cdCwgXCJ3d3cuYXJ0bm9tZS5jb21cIlxuXHQsIFwid3d3LmFuZHp1Y2suY29tXCJcblx0LCBcInd3dy5hbGxlbmNoZW5nLmNvbVwiXG5cdCwgXCJ3d3cuYWxpY2VtYXouY29tXCJcblx0LCBcInd3dy5hZGFtc21pdGgub3JnXCJcblx0LCBcInd3dy5hYm91dGFtYXpvbi5jb21cIlxuXHQsIFwid3d3LWNzLWZhY3VsdHkuc3RhbmZvcmQuZWR1XCJcblx0LCBcIndpa2kubGVzc3dyb25nLmNvbVwiXG5cdCwgXCJ3aHlldm9sdXRpb25pc3RydWUuY29tXCJcblx0LCBcIndlYi5tZWRpYS5taXQuZWR1XCJcblx0LCBcInZmeGJsb2cuY29tXCJcblx0LCBcInZkZnJlc2VhcmNoLm9yZ1wiXG5cdCwgXCJ2YXN0YWJydXB0LmNvbVwiXG5cdCwgXCJ2YXNpbGlzaHlua2FyZW5rYS5jb21cIlxuXHQsIFwidHVnLm9yZ1wiXG5cdCwgXCJ0b3NjaGUubmV0XCJcblx0LCBcInRob3VnaHRjcmltZS5jcnVtbXkuY29tXCJcblx0LCBcInRoaXNleWVkb2Vzbm90ZXhpc3QuY29tXCJcblx0LCBcInRoZW5ld3N0YXRpc3RpY3MuY29tXCJcblx0LCBcInRoZWJyb3dzZXIuY29tXCJcblx0LCBcInRoZS10b2FzdC5uZXRcIlxuXHQsIFwidGVhZ2VlZ2VlcGVhLnRyaXBvZC5jb21cIlxuXHQsIFwic3RldmVuc29uLmxhYi51Y29ubi5lZHVcIlxuXHQsIFwic3RlcGhlbm1hbGluYS5jb21cIlxuXHQsIFwic3RhdHVzNDUxLmNvbVwiXG5cdCwgXCJzdGFja3JvYm9mbG93LmNvbVwiXG5cdCwgXCJzbGltZW1vbGR0aW1lbW9sZC5jb21cIlxuXHQsIFwic2V0aHMuYmxvZ1wiXG5cdCwgXCJzY2llbnRpc3RhdHdvcmsuYmxvZ3Mubnl0aW1lcy5jb21cIlxuXHQsIFwic2NpZW5jZWJ1bGxldGluLm9yZ1wiXG5cdCwgXCJzY2llbmNlLmtzYy5uYXNhLmdvdlwiXG5cdCwgXCJzYW1vYnVyamEuY29tXCJcblx0LCBcInJ1ZGVyLmlvXCJcblx0LCBcInJlYWQtdGhlLXNhbXBsZXMubmV0bGlmeS5hcHBcIlxuXHQsIFwicXVhZHJhbnQub3JnLmF1XCJcblx0LCBcInB5dG9yY2gub3JnXCJcblx0LCBcInB1ZGRpbmcuY29vbFwiXG5cdCwgXCJwcm9qZWN0cy50YW1wYWJheS5jb21cIlxuXHQsIFwicHJvamVjdHMuanNvbmxpbmUuY29tXCJcblx0LCBcInBvZXRzLm9yZ1wiXG5cdCwgXCJwb2VtYW5hbHlzaXMuY29tXCJcblx0LCBcInBlcnNvbmFsLm1hdGgudWJjLmNhXCJcblx0LCBcInBlb3BsZS5pZHNpYS5jaFwiXG5cdCwgXCJwZW9wbGUuY29tXCJcblx0LCBcIm9zY2FyYm9uaWxsYS5jb21cIlxuXHQsIFwib3J3ZWxsLnJ1XCJcblx0LCBcIm9wZW5zb3VyY2UuYWRvYmUuY29tXCJcblx0LCBcIm9vby5naG9zdGJvd3Mub29vXCJcblx0LCBcIm5ld3MubmF0aW9uYWxnZW9ncmFwaGljLmNvbVwiXG5cdCwgXCJtc3N2Lm5ldFwiXG5cdCwgXCJtb3NhaWNzY2llbmNlLmNvbVwiXG5cdCwgXCJtbC5iZXJrZWxleS5lZHVcIlxuXHQsIFwibWt2MjUubmV0XCJcblx0LCBcIm1hdGhiYWJlLm9yZ1wiXG5cdCwgXCJtYWlsY2hpLm1wXCJcblx0LCBcIm1hZ2F6aW5lLmF0YXZpc3QuY29tXCJcblx0LCBcImxvbmdpdHVkaW5hbC5ibG9nXCJcblx0LCBcImxpdHRsZWJpZ2d5Lm9yZ1wiXG5cdCwgXCJsYXZhYW4udWdlbnQuYmVcIlxuXHQsIFwibGFycnluaXZlbi5uZXRcIlxuXHQsIFwibGFpb24uYWlcIlxuXHQsIFwia29qaW1hcnMuYXQud2VicnkuaW5mb1wiXG5cdCwgXCJrZXZpbmx5bmFnaC5jb21cIlxuXHQsIFwia2V2LnRvd25cIlxuXHQsIFwia2Fqc290YWxhLmZpXCJcblx0LCBcImpvdXJuYWxzLmJpb2xvZ2lzdHMuY29tXCJcblx0LCBcImJlemExZTEudHV4ZW4uZGVcIlxuXHQsIFwid2ViLmFyY2hpdmUub3JnXCJcblx0LCBcInd3dy5wY3dvcmxkLmNvbVwiXG5cdCwgXCJ3d3cudW5xdWFsaWZpZWQtcmVzZXJ2YXRpb25zLm9yZ1wiXG5cdCwgXCJldmFvdGFrdS5jb21cIlxuXHQsIFwiZm9ycmUuc3RcIlxuXHQsIFwibWlrZXBvd2VyLnByZXNzZm9saW9zLmNvbVwiXG5cdCwgXCJ3d3cuY295bmVvZnRoZXJlYWxtLmNvbVwiXG5cdCwgXCJ3aWtpLm9wZW50dGRjb29wLm9yZ1wiXG5cdCwgXCJxdWlubmR1bmtpLmNvbVwiXG5cdCwgXCJsZWFybmluZy5tcGktc3dzLm9yZ1wiXG5cdCwgXCJqb3YuYXJ2b2pvdXJuYWxzLm9yZ1wiXG5cdCwgXCJqYWtld2VzdGZhbGwub3JnXCJcblx0LCBcImUyZW1sLnNjaG9vbFwiXG5cdCwgXCJkZWZlY3Rvci5jb21cIlxuXHQsIFwiZGF2aWRlcHN0ZWluLmNvbVwiXG5cdCwgXCJjb3JwZ292Lmxhdy5oYXJ2YXJkLmVkdVwiXG5cdCwgXCJjb3BpbG90LmdpdGh1Yi5jb21cIlxuXHQsIFwiY29uc3RhbmNlY3Jvemllci5jb21cIlxuXHQsIFwiY29tcGxlYXJuLm9yZ1wiXG5cdCwgXCJjb21wZGVtb2NyYWN5Lm9yZ1wiXG5cdCwgXCJjYXRvbm1hdC5uZXRcIlxuXHQsIFwiY2FsaG91bi5ucHMuZWR1XCJcblx0LCBcImJ3Yy50aGVsYWIuZGMuZ292XCJcblx0LCBcImJsb2cudGhpbmtzdC5jb21cIlxuXHQsIFwiYmxvZy5yZWdlaHIub3JnXCJcblx0LCBcImJsb2cuY3J5cHRvZ3JhcGh5ZW5naW5lZXJpbmcuY29tXCJcblx0LCBcImItb2suY2NcIlxuXHQsIFwiYXJjaGl2ZS5zZWF0dGxldGltZXMuY29tXCJcblx0LCBcImFyY2hpdGV4dC5kZXNpZ25cIlxuXHQsIFwiYW5keW1hdHVzY2hhay5vcmdcIlxuXHQsIFwiYWxleGFuZGVyZXR6LmNvbVwiXG5cdCwgXCJhZHZlcnRpc2luZy1lZmZlY3RzLmNoaWNhZ29ib290aC5lZHVcIlxuXHQsIFwiYWJvdXQuZ29vZ2xlXCJcblx0LCBcIjZ0aGZsb29yLmJsb2dzLm55dGltZXMuY29tXCJcblx0LCBcInd3dzIuYmlvbG9neS51YWxiZXJ0YS5jYVwiXG5cdCwgXCJ3d3cud2Vzam9uZXMuY29tXCJcblx0LCBcInd3dy51cmJhbmRoYXJtYS5vcmdcIlxuXHQsIFwid3d3LnRsbWMuZXVcIlxuXHQsIFwid3d3LnJmcmVpdGFzLmNvbVwiXG5cdCwgXCJ3d3cubW9zZXJ3YXJlLmNvbVwiXG5cdCwgXCJldy5jb21cIlxuXHQsIFwiZXhhbXBsZXMueW91cmRpY3Rpb25hcnkuY29tXCJcblx0LCBcImZzLmJsb2dcIlxuXHQsIFwiZnJlZWRvbWRlZmluZWQub3JnXCJcblx0LCBcImZpYmVyeS5pb1wiXG5cdCwgXCJmYXN0bW9lLmFpXCJcblx0LCBcImpvc2htaXR0ZWxkb3JmLnNjaWVuY2VibG9nLmNvbVwiXG5cdCwgXCJqb25taWxsd2FyZC5jb21cIlxuXHQsIFwiam9obmN3cmlnaHQubGl2ZWpvdXJuYWwuY29tXCJcblx0LCBcImpvYS5zaFwiXG5cdCwgXCJqZ2Vla3N0dWRpZXMub3JnXCJcblx0LCBcImpkbG0uaW5mb1wiXG5cdCwgXCJqYXlwc29uZy5ibG9nXCJcblx0LCBcImpheC5yZWFkdGhlZG9jcy5pb1wiXG5cdCwgXCJqYW1lc3l1Lm9yZ1wiXG5cdCwgXCJpbWFnZS1uZXQub3JnXCJcblx0LCBcImlmZG8uY2FcIlxuXHQsIFwiaGlzdG9yeWNvb3BlcmF0aXZlLm9yZ1wiXG5cdCwgXCJoZXJic3V0dGVyLmNvbVwiXG5cdCwgXCJoZHNyLm1pdHByZXNzLm1pdC5lZHVcIlxuXHQsIFwiaGFrYWltYWdhemluZS5jb21cIlxuXHQsIFwiZ3V0ZW5iZXJnLmNhXCJcblx0LCBcImdwdDNkZW1vLmNvbVwiXG5cdCwgXCJnb25kd2FuYWxhbmQuY29tXCJcblx0LCBcImdhb3RpYW55dS54eXpcIlxuXHQsIFwiZnV0dXJpc20uY29tXCJcblx0LCBcImV4dHJhcy5kZW52ZXJwb3N0LmNvbVwiXG5cdCwgXCJldXJla2FtYWcuY29tXCJcblx0LCBcImV1a2FyeW90ZXdyaXRlc2Jsb2cuY29tXCJcblx0LCBcImV0aWVubmUuc2VcIlxuXHQsIFwiZW5kbGVzc3ZuLmlvXCJcblx0LCBcInN0YXRtb2RlbGluZy5zdGF0LmNvbHVtYmlhLmVkdVwiXG5cdCwgXCJhcmNoaXZlLm55dGltZXMuY29tXCJcblx0LCBcInd3dy5taWNoYWVsbGlnaHQubmV0XCJcblx0LCBcInd3dy5vdGFrdXN0dWR5LmNvbVwiXG5cdCwgXCJ3d3cuYmFrYS10c3VraS5vcmdcIlxuXHQsIFwic3RvcnkuY2FsaWZvcm5pYXN1bmRheS5jb21cIlxuXHQsIFwidGhpc3BlcnNvbmRvZXNub3RleGlzdC5jb21cIlxuXHQsIFwibWV0cm9wb2xpdGljaWFuLmJsb2dzLmNvbVwiXG5cdCwgXCJwYXVpbGxhYy5pbnJpYS5mclwiXG5cdCwgXCJhc2t0b2cuY29tXCJcblx0LCBcInd3dy51bmYuZWR1XCIsXG5dXG5cbmNvbnN0IGFsbG93U3ViZG9tYWluc0Zyb21Hd2VybiA9IFtcblx0Jy5hbGxlbm5scC5vcmcnLFxuXHQnLmFyY2hpdmUub3JnJyxcblx0Jy5hcmNoaXZldGVhbS5vcmcnLFxuXHQnLmJhbmRjYW1wLmNvbScsXG5cdCcuZWxldXRoZXIuYWknLFxuXHQnLmZhbmRvbS5jb20nLFxuXHQnLmdpdGh1Yi5pbycsXG5cdCcuZ2l2ZXdlbGwub3JnJyxcblx0Jy5ncmVlbnNwdW4uY29tJyxcblx0Jy5odW1hbnByb2dyZXNzLm9yZycsXG5cdCcuaW1hZ2VtYWdpY2sub3JnJyxcblx0Jy5tZW1lbnRvd2ViLm9yZycsXG5cdCcubWV0YWZpbHRlci5jb20nLFxuXHQnLm5vbWVhdGEuZGUnLFxuXHQnLm9ib3Jtb3QubmV0Jyxcblx0Jy50dW1ibHIuY29tJyxcblx0Jy54a2NkLmNvbScsXG5cdCcud2lraXBlZGlhLm9yZycsXG5cdCcud29yZHByZXNzLmNvbScsXG5cdCcuYmxvZ3Nwb3QuY29tJyxcbl1cblxuZXhwb3J0IGNvbnN0IGFsbG93U3ViZG9tYWluc0Zyb20gPSBbXG5cdCcud2lraWRhdGEub3JnJyxcblx0Jy5yb2FtLmdhcmRlbicsXG5cdC4uLmFsbG93U3ViZG9tYWluc0Zyb21Hd2Vybixcbl1cblxuZXhwb3J0IGNvbnN0IHdoaXRlbGlzdERvbWFpbnMgPSBbXG5cdFwibWFuaWZvbGQubWFya2V0c1wiLFxuXHQuLi5nb29kR3dlcm5Eb21haW5zLFxuXVxuIiwiLyogd2ViZXh0ZW5zaW9uLXBvbHlmaWxsIC0gdjAuOS4wIC0gRnJpIE1hciAyNSAyMDIyIDE3OjAwOjIzICovXG4vKiAtKi0gTW9kZTogaW5kZW50LXRhYnMtbW9kZTogbmlsOyBqcy1pbmRlbnQtbGV2ZWw6IDIgLSotICovXG4vKiB2aW06IHNldCBzdHM9MiBzdz0yIGV0IHR3PTgwOiAqL1xuLyogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHA6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy4gKi9cblwidXNlIHN0cmljdFwiO1xuXG5pZiAodHlwZW9mIGdsb2JhbFRoaXMgIT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2hyb21lICE9IFwib2JqZWN0XCIgfHwgIWNocm9tZSB8fCAhY2hyb21lLnJ1bnRpbWUgfHwgIWNocm9tZS5ydW50aW1lLmlkKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIlRoaXMgc2NyaXB0IHNob3VsZCBvbmx5IGJlIGxvYWRlZCBpbiBhIGJyb3dzZXIgZXh0ZW5zaW9uLlwiKTtcbn1cblxuaWYgKHR5cGVvZiBnbG9iYWxUaGlzLmJyb3dzZXIgPT09IFwidW5kZWZpbmVkXCIgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbFRoaXMuYnJvd3NlcikgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgY29uc3QgQ0hST01FX1NFTkRfTUVTU0FHRV9DQUxMQkFDS19OT19SRVNQT05TRV9NRVNTQUdFID0gXCJUaGUgbWVzc2FnZSBwb3J0IGNsb3NlZCBiZWZvcmUgYSByZXNwb25zZSB3YXMgcmVjZWl2ZWQuXCI7XG4gIGNvbnN0IFNFTkRfUkVTUE9OU0VfREVQUkVDQVRJT05fV0FSTklORyA9IFwiUmV0dXJuaW5nIGEgUHJvbWlzZSBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBzZW5kIGEgcmVwbHkgZnJvbSBhbiBvbk1lc3NhZ2Uvb25NZXNzYWdlRXh0ZXJuYWwgbGlzdGVuZXIsIGFzIHRoZSBzZW5kUmVzcG9uc2Ugd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHNwZWNzIChTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9Nb3ppbGxhL0FkZC1vbnMvV2ViRXh0ZW5zaW9ucy9BUEkvcnVudGltZS9vbk1lc3NhZ2UpXCI7XG5cbiAgLy8gV3JhcHBpbmcgdGhlIGJ1bGsgb2YgdGhpcyBwb2x5ZmlsbCBpbiBhIG9uZS10aW1lLXVzZSBmdW5jdGlvbiBpcyBhIG1pbm9yXG4gIC8vIG9wdGltaXphdGlvbiBmb3IgRmlyZWZveC4gU2luY2UgU3BpZGVybW9ua2V5IGRvZXMgbm90IGZ1bGx5IHBhcnNlIHRoZVxuICAvLyBjb250ZW50cyBvZiBhIGZ1bmN0aW9uIHVudGlsIHRoZSBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgc2luY2UgaXQgd2lsbFxuICAvLyBuZXZlciBhY3R1YWxseSBuZWVkIHRvIGJlIGNhbGxlZCwgdGhpcyBhbGxvd3MgdGhlIHBvbHlmaWxsIHRvIGJlIGluY2x1ZGVkXG4gIC8vIGluIEZpcmVmb3ggbmVhcmx5IGZvciBmcmVlLlxuICBjb25zdCB3cmFwQVBJcyA9IGV4dGVuc2lvbkFQSXMgPT4ge1xuICAgIC8vIE5PVEU6IGFwaU1ldGFkYXRhIGlzIGFzc29jaWF0ZWQgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGFwaS1tZXRhZGF0YS5qc29uIGZpbGVcbiAgICAvLyBhdCBidWlsZCB0aW1lIGJ5IHJlcGxhY2luZyB0aGUgZm9sbG93aW5nIFwiaW5jbHVkZVwiIHdpdGggdGhlIGNvbnRlbnQgb2YgdGhlXG4gICAgLy8gSlNPTiBmaWxlLlxuICAgIGNvbnN0IGFwaU1ldGFkYXRhID0ge1xuICAgICAgXCJhbGFybXNcIjoge1xuICAgICAgICBcImNsZWFyXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImNsZWFyQWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImJvb2ttYXJrc1wiOiB7XG4gICAgICAgIFwiY3JlYXRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRDaGlsZHJlblwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRSZWNlbnRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0U3ViVHJlZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRUcmVlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcIm1vdmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVRyZWVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VhcmNoXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiYnJvd3NlckFjdGlvblwiOiB7XG4gICAgICAgIFwiZGlzYWJsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZW5hYmxlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRCYWRnZUJhY2tncm91bmRDb2xvclwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRCYWRnZVRleHRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0UG9wdXBcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VGl0bGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwib3BlblBvcHVwXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInNldEJhZGdlQmFja2dyb3VuZENvbG9yXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRCYWRnZVRleHRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNldEljb25cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0UG9wdXBcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNldFRpdGxlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiYnJvd3NpbmdEYXRhXCI6IHtcbiAgICAgICAgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlQ2FjaGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlQ29va2llc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVEb3dubG9hZHNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlRm9ybURhdGFcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlSGlzdG9yeVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVMb2NhbFN0b3JhZ2VcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlUGFzc3dvcmRzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVBsdWdpbkRhdGFcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0dGluZ3NcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImNvbW1hbmRzXCI6IHtcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImNvbnRleHRNZW51c1wiOiB7XG4gICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImNvb2tpZXNcIjoge1xuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsQ29va2llU3RvcmVzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImRldnRvb2xzXCI6IHtcbiAgICAgICAgXCJpbnNwZWN0ZWRXaW5kb3dcIjoge1xuICAgICAgICAgIFwiZXZhbFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAyLFxuICAgICAgICAgICAgXCJzaW5nbGVDYWxsYmFja0FyZ1wiOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJwYW5lbHNcIjoge1xuICAgICAgICAgIFwiY3JlYXRlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAzLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDMsXG4gICAgICAgICAgICBcInNpbmdsZUNhbGxiYWNrQXJnXCI6IHRydWVcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZWxlbWVudHNcIjoge1xuICAgICAgICAgICAgXCJjcmVhdGVTaWRlYmFyUGFuZVwiOiB7XG4gICAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZG93bmxvYWRzXCI6IHtcbiAgICAgICAgXCJjYW5jZWxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG93bmxvYWRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZXJhc2VcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0RmlsZUljb25cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwib3BlblwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicGF1c2VcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlRmlsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXN1bWVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VhcmNoXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNob3dcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJleHRlbnNpb25cIjoge1xuICAgICAgICBcImlzQWxsb3dlZEZpbGVTY2hlbWVBY2Nlc3NcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwiaXNBbGxvd2VkSW5jb2duaXRvQWNjZXNzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJoaXN0b3J5XCI6IHtcbiAgICAgICAgXCJhZGRVcmxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGVsZXRlQWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcImRlbGV0ZVJhbmdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImRlbGV0ZVVybFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRWaXNpdHNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VhcmNoXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJpMThuXCI6IHtcbiAgICAgICAgXCJkZXRlY3RMYW5ndWFnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBY2NlcHRMYW5ndWFnZXNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImlkZW50aXR5XCI6IHtcbiAgICAgICAgXCJsYXVuY2hXZWJBdXRoRmxvd1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiaWRsZVwiOiB7XG4gICAgICAgIFwicXVlcnlTdGF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwibWFuYWdlbWVudFwiOiB7XG4gICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRTZWxmXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInNldEVuYWJsZWRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwidW5pbnN0YWxsU2VsZlwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwibm90aWZpY2F0aW9uc1wiOiB7XG4gICAgICAgIFwiY2xlYXJcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiY3JlYXRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImdldEFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRQZXJtaXNzaW9uTGV2ZWxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJwYWdlQWN0aW9uXCI6IHtcbiAgICAgICAgXCJnZXRQb3B1cFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRUaXRsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJoaWRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRJY29uXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNldFBvcHVwXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRUaXRsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2hvd1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInBlcm1pc3Npb25zXCI6IHtcbiAgICAgICAgXCJjb250YWluc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInJ1bnRpbWVcIjoge1xuICAgICAgICBcImdldEJhY2tncm91bmRQYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcImdldFBsYXRmb3JtSW5mb1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJvcGVuT3B0aW9uc1BhZ2VcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVxdWVzdFVwZGF0ZUNoZWNrXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInNlbmRNZXNzYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogM1xuICAgICAgICB9LFxuICAgICAgICBcInNlbmROYXRpdmVNZXNzYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInNldFVuaW5zdGFsbFVSTFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwic2Vzc2lvbnNcIjoge1xuICAgICAgICBcImdldERldmljZXNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0UmVjZW50bHlDbG9zZWRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVzdG9yZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwic3RvcmFnZVwiOiB7XG4gICAgICAgIFwibG9jYWxcIjoge1xuICAgICAgICAgIFwiY2xlYXJcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRCeXRlc0luVXNlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWFuYWdlZFwiOiB7XG4gICAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRCeXRlc0luVXNlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic3luY1wiOiB7XG4gICAgICAgICAgXCJjbGVhclwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImdldEJ5dGVzSW5Vc2VcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJyZW1vdmVcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzZXRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwidGFic1wiOiB7XG4gICAgICAgIFwiY2FwdHVyZVZpc2libGVUYWJcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwiY3JlYXRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImRldGVjdExhbmd1YWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImRpc2NhcmRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZHVwbGljYXRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImV4ZWN1dGVTY3JpcHRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEN1cnJlbnRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0Wm9vbVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRab29tU2V0dGluZ3NcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ29CYWNrXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdvRm9yd2FyZFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJoaWdobGlnaHRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiaW5zZXJ0Q1NTXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcIm1vdmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwicXVlcnlcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVsb2FkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVDU1NcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VuZE1lc3NhZ2VcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAzXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0Wm9vbVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRab29tU2V0dGluZ3NcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJ0b3BTaXRlc1wiOiB7XG4gICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJ3ZWJOYXZpZ2F0aW9uXCI6IHtcbiAgICAgICAgXCJnZXRBbGxGcmFtZXNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0RnJhbWVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIndlYlJlcXVlc3RcIjoge1xuICAgICAgICBcImhhbmRsZXJCZWhhdmlvckNoYW5nZWRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIndpbmRvd3NcIjoge1xuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEN1cnJlbnRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0TGFzdEZvY3VzZWRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoYXBpTWV0YWRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYXBpLW1ldGFkYXRhLmpzb24gaGFzIG5vdCBiZWVuIGluY2x1ZGVkIGluIGJyb3dzZXItcG9seWZpbGxcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBXZWFrTWFwIHN1YmNsYXNzIHdoaWNoIGNyZWF0ZXMgYW5kIHN0b3JlcyBhIHZhbHVlIGZvciBhbnkga2V5IHdoaWNoIGRvZXNcbiAgICAgKiBub3QgZXhpc3Qgd2hlbiBhY2Nlc3NlZCwgYnV0IGJlaGF2ZXMgZXhhY3RseSBhcyBhbiBvcmRpbmFyeSBXZWFrTWFwXG4gICAgICogb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY3JlYXRlSXRlbVxuICAgICAqICAgICAgICBBIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgdmFsdWUgZm9yIGFueVxuICAgICAqICAgICAgICBrZXkgd2hpY2ggZG9lcyBub3QgZXhpc3QsIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGFjY2Vzc2VkLiBUaGVcbiAgICAgKiAgICAgICAgZnVuY3Rpb24gcmVjZWl2ZXMsIGFzIGl0cyBvbmx5IGFyZ3VtZW50LCB0aGUga2V5IGJlaW5nIGNyZWF0ZWQuXG4gICAgICovXG4gICAgY2xhc3MgRGVmYXVsdFdlYWtNYXAgZXh0ZW5kcyBXZWFrTWFwIHtcbiAgICAgIGNvbnN0cnVjdG9yKGNyZWF0ZUl0ZW0sIGl0ZW1zID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN1cGVyKGl0ZW1zKTtcbiAgICAgICAgdGhpcy5jcmVhdGVJdGVtID0gY3JlYXRlSXRlbTtcbiAgICAgIH1cblxuICAgICAgZ2V0KGtleSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgICB0aGlzLnNldChrZXksIHRoaXMuY3JlYXRlSXRlbShrZXkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBhbiBvYmplY3Qgd2l0aCBhIGB0aGVuYCBtZXRob2QsIGFuZCBjYW5cbiAgICAgKiB0aGVyZWZvcmUgYmUgYXNzdW1lZCB0byBiZWhhdmUgYXMgYSBQcm9taXNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdGhlbmFibGUuXG4gICAgICovXG4gICAgY29uc3QgaXNUaGVuYWJsZSA9IHZhbHVlID0+IHtcbiAgICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09IFwiZnVuY3Rpb25cIjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCByZXNvbHZlIG9yIHJlamVjdFxuICAgICAqIHRoZSBnaXZlbiBwcm9taXNlIGJhc2VkIG9uIGhvdyBpdCBpcyBjYWxsZWQ6XG4gICAgICpcbiAgICAgKiAtIElmLCB3aGVuIGNhbGxlZCwgYGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcmAgY29udGFpbnMgYSBub24tbnVsbCBvYmplY3QsXG4gICAgICogICB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCB3aXRoIHRoYXQgdmFsdWUuXG4gICAgICogLSBJZiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggZXhhY3RseSBvbmUgYXJndW1lbnQsIHRoZSBwcm9taXNlIGlzXG4gICAgICogICByZXNvbHZlZCB0byB0aGF0IHZhbHVlLlxuICAgICAqIC0gT3RoZXJ3aXNlLCB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCB0byBhbiBhcnJheSBjb250YWluaW5nIGFsbCBvZiB0aGVcbiAgICAgKiAgIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHByb21pc2VcbiAgICAgKiAgICAgICAgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlc29sdXRpb24gYW5kIHJlamVjdGlvbiBmdW5jdGlvbnMgb2YgYVxuICAgICAqICAgICAgICBwcm9taXNlLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHByb21pc2UucmVzb2x2ZVxuICAgICAqICAgICAgICBUaGUgcHJvbWlzZSdzIHJlc29sdXRpb24gZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gcHJvbWlzZS5yZWplY3RcbiAgICAgKiAgICAgICAgVGhlIHByb21pc2UncyByZWplY3Rpb24gZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG1ldGFkYXRhXG4gICAgICogICAgICAgIE1ldGFkYXRhIGFib3V0IHRoZSB3cmFwcGVkIG1ldGhvZCB3aGljaCBoYXMgY3JlYXRlZCB0aGUgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtZXRhZGF0YS5zaW5nbGVDYWxsYmFja0FyZ1xuICAgICAqICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIG9ubHkgdGhlIGZpcnN0XG4gICAgICogICAgICAgIGFyZ3VtZW50IG9mIHRoZSBjYWxsYmFjaywgYWx0ZXJuYXRpdmVseSBhbiBhcnJheSBvZiBhbGwgdGhlXG4gICAgICogICAgICAgIGNhbGxiYWNrIGFyZ3VtZW50cyBpcyByZXNvbHZlZC4gQnkgZGVmYXVsdCwgaWYgdGhlIGNhbGxiYWNrXG4gICAgICogICAgICAgIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCBvbmx5IGEgc2luZ2xlIGFyZ3VtZW50LCB0aGF0IHdpbGwgYmVcbiAgICAgKiAgICAgICAgcmVzb2x2ZWQgdG8gdGhlIHByb21pc2UsIHdoaWxlIGFsbCBhcmd1bWVudHMgd2lsbCBiZSByZXNvbHZlZCBhc1xuICAgICAqICAgICAgICBhbiBhcnJheSBpZiBtdWx0aXBsZSBhcmUgZ2l2ZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb259XG4gICAgICogICAgICAgIFRoZSBnZW5lcmF0ZWQgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAgICovXG4gICAgY29uc3QgbWFrZUNhbGxiYWNrID0gKHByb21pc2UsIG1ldGFkYXRhKSA9PiB7XG4gICAgICByZXR1cm4gKC4uLmNhbGxiYWNrQXJncykgPT4ge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAgIHByb21pc2UucmVqZWN0KG5ldyBFcnJvcihleHRlbnNpb25BUElzLnJ1bnRpbWUubGFzdEVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YS5zaW5nbGVDYWxsYmFja0FyZyB8fFxuICAgICAgICAgICAgICAgICAgIChjYWxsYmFja0FyZ3MubGVuZ3RoIDw9IDEgJiYgbWV0YWRhdGEuc2luZ2xlQ2FsbGJhY2tBcmcgIT09IGZhbHNlKSkge1xuICAgICAgICAgIHByb21pc2UucmVzb2x2ZShjYWxsYmFja0FyZ3NbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb21pc2UucmVzb2x2ZShjYWxsYmFja0FyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBwbHVyYWxpemVBcmd1bWVudHMgPSAobnVtQXJncykgPT4gbnVtQXJncyA9PSAxID8gXCJhcmd1bWVudFwiIDogXCJhcmd1bWVudHNcIjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB3cmFwcGVyIGZ1bmN0aW9uIGZvciBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogICAgICAgIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hpY2ggaXMgYmVpbmcgd3JhcHBlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gbWV0YWRhdGFcbiAgICAgKiAgICAgICAgTWV0YWRhdGEgYWJvdXQgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkLlxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbWV0YWRhdGEubWluQXJnc1xuICAgICAqICAgICAgICBUaGUgbWluaW11bSBudW1iZXIgb2YgYXJndW1lbnRzIHdoaWNoIG11c3QgYmUgcGFzc2VkIHRvIHRoZVxuICAgICAqICAgICAgICBmdW5jdGlvbi4gSWYgY2FsbGVkIHdpdGggZmV3ZXIgdGhhbiB0aGlzIG51bWJlciBvZiBhcmd1bWVudHMsIHRoZVxuICAgICAqICAgICAgICB3cmFwcGVyIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLlxuICAgICAqIEBwYXJhbSB7aW50ZWdlcn0gbWV0YWRhdGEubWF4QXJnc1xuICAgICAqICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnRzIHdoaWNoIG1heSBiZSBwYXNzZWQgdG8gdGhlXG4gICAgICogICAgICAgIGZ1bmN0aW9uLiBJZiBjYWxsZWQgd2l0aCBtb3JlIHRoYW4gdGhpcyBudW1iZXIgb2YgYXJndW1lbnRzLCB0aGVcbiAgICAgKiAgICAgICAgd3JhcHBlciB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG1ldGFkYXRhLnNpbmdsZUNhbGxiYWNrQXJnXG4gICAgICogICAgICAgIFdoZXRoZXIgb3Igbm90IHRoZSBwcm9taXNlIGlzIHJlc29sdmVkIHdpdGggb25seSB0aGUgZmlyc3RcbiAgICAgKiAgICAgICAgYXJndW1lbnQgb2YgdGhlIGNhbGxiYWNrLCBhbHRlcm5hdGl2ZWx5IGFuIGFycmF5IG9mIGFsbCB0aGVcbiAgICAgKiAgICAgICAgY2FsbGJhY2sgYXJndW1lbnRzIGlzIHJlc29sdmVkLiBCeSBkZWZhdWx0LCBpZiB0aGUgY2FsbGJhY2tcbiAgICAgKiAgICAgICAgZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIG9ubHkgYSBzaW5nbGUgYXJndW1lbnQsIHRoYXQgd2lsbCBiZVxuICAgICAqICAgICAgICByZXNvbHZlZCB0byB0aGUgcHJvbWlzZSwgd2hpbGUgYWxsIGFyZ3VtZW50cyB3aWxsIGJlIHJlc29sdmVkIGFzXG4gICAgICogICAgICAgIGFuIGFycmF5IGlmIG11bHRpcGxlIGFyZSBnaXZlbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtmdW5jdGlvbihvYmplY3QsIC4uLiopfVxuICAgICAqICAgICAgIFRoZSBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBjb25zdCB3cmFwQXN5bmNGdW5jdGlvbiA9IChuYW1lLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFzeW5jRnVuY3Rpb25XcmFwcGVyKHRhcmdldCwgLi4uYXJncykge1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPCBtZXRhZGF0YS5taW5BcmdzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBsZWFzdCAke21ldGFkYXRhLm1pbkFyZ3N9ICR7cGx1cmFsaXplQXJndW1lbnRzKG1ldGFkYXRhLm1pbkFyZ3MpfSBmb3IgJHtuYW1lfSgpLCBnb3QgJHthcmdzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IG1ldGFkYXRhLm1heEFyZ3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IG1vc3QgJHttZXRhZGF0YS5tYXhBcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5tYXhBcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGlmIChtZXRhZGF0YS5mYWxsYmFja1RvTm9DYWxsYmFjaykge1xuICAgICAgICAgICAgLy8gVGhpcyBBUEkgbWV0aG9kIGhhcyBjdXJyZW50bHkgbm8gY2FsbGJhY2sgb24gQ2hyb21lLCBidXQgaXQgcmV0dXJuIGEgcHJvbWlzZSBvbiBGaXJlZm94LFxuICAgICAgICAgICAgLy8gYW5kIHNvIHRoZSBwb2x5ZmlsbCB3aWxsIHRyeSB0byBjYWxsIGl0IHdpdGggYSBjYWxsYmFjayBmaXJzdCwgYW5kIGl0IHdpbGwgZmFsbGJhY2tcbiAgICAgICAgICAgIC8vIHRvIG5vdCBwYXNzaW5nIHRoZSBjYWxsYmFjayBpZiB0aGUgZmlyc3QgY2FsbCBmYWlscy5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHRhcmdldFtuYW1lXSguLi5hcmdzLCBtYWtlQ2FsbGJhY2soe3Jlc29sdmUsIHJlamVjdH0sIG1ldGFkYXRhKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChjYkVycm9yKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgJHtuYW1lfSBBUEkgbWV0aG9kIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHRoZSBjYWxsYmFjayBwYXJhbWV0ZXIsIGAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmYWxsaW5nIGJhY2sgdG8gY2FsbCBpdCB3aXRob3V0IGEgY2FsbGJhY2s6IFwiLCBjYkVycm9yKTtcblxuICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncyk7XG5cbiAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBBUEkgbWV0aG9kIG1ldGFkYXRhLCBzbyB0aGF0IHRoZSBuZXh0IEFQSSBjYWxscyB3aWxsIG5vdCB0cnkgdG9cbiAgICAgICAgICAgICAgLy8gdXNlIHRoZSB1bnN1cHBvcnRlZCBjYWxsYmFjayBhbnltb3JlLlxuICAgICAgICAgICAgICBtZXRhZGF0YS5mYWxsYmFja1RvTm9DYWxsYmFjayA9IGZhbHNlO1xuICAgICAgICAgICAgICBtZXRhZGF0YS5ub0NhbGxiYWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChtZXRhZGF0YS5ub0NhbGxiYWNrKSB7XG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncyk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtuYW1lXSguLi5hcmdzLCBtYWtlQ2FsbGJhY2soe3Jlc29sdmUsIHJlamVjdH0sIG1ldGFkYXRhKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFdyYXBzIGFuIGV4aXN0aW5nIG1ldGhvZCBvZiB0aGUgdGFyZ2V0IG9iamVjdCwgc28gdGhhdCBjYWxscyB0byBpdCBhcmVcbiAgICAgKiBpbnRlcmNlcHRlZCBieSB0aGUgZ2l2ZW4gd3JhcHBlciBmdW5jdGlvbi4gVGhlIHdyYXBwZXIgZnVuY3Rpb24gcmVjZWl2ZXMsXG4gICAgICogYXMgaXRzIGZpcnN0IGFyZ3VtZW50LCB0aGUgb3JpZ2luYWwgYHRhcmdldGAgb2JqZWN0LCBmb2xsb3dlZCBieSBlYWNoIG9mXG4gICAgICogdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIG9yaWdpbmFsIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXRcbiAgICAgKiAgICAgICAgVGhlIG9yaWdpbmFsIHRhcmdldCBvYmplY3QgdGhhdCB0aGUgd3JhcHBlZCBtZXRob2QgYmVsb25ncyB0by5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2RcbiAgICAgKiAgICAgICAgVGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkLiBUaGlzIGlzIHVzZWQgYXMgdGhlIHRhcmdldCBvZiB0aGUgUHJveHlcbiAgICAgKiAgICAgICAgb2JqZWN0IHdoaWNoIGlzIGNyZWF0ZWQgdG8gd3JhcCB0aGUgbWV0aG9kLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHdyYXBwZXJcbiAgICAgKiAgICAgICAgVGhlIHdyYXBwZXIgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGluIHBsYWNlIG9mIGEgZGlyZWN0IGludm9jYXRpb25cbiAgICAgKiAgICAgICAgb2YgdGhlIHdyYXBwZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb3h5PGZ1bmN0aW9uPn1cbiAgICAgKiAgICAgICAgQSBQcm94eSBvYmplY3QgZm9yIHRoZSBnaXZlbiBtZXRob2QsIHdoaWNoIGludm9rZXMgdGhlIGdpdmVuIHdyYXBwZXJcbiAgICAgKiAgICAgICAgbWV0aG9kIGluIGl0cyBwbGFjZS5cbiAgICAgKi9cbiAgICBjb25zdCB3cmFwTWV0aG9kID0gKHRhcmdldCwgbWV0aG9kLCB3cmFwcGVyKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb3h5KG1ldGhvZCwge1xuICAgICAgICBhcHBseSh0YXJnZXRNZXRob2QsIHRoaXNPYmosIGFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gd3JhcHBlci5jYWxsKHRoaXNPYmosIHRhcmdldCwgLi4uYXJncyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgbGV0IGhhc093blByb3BlcnR5ID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gICAgLyoqXG4gICAgICogV3JhcHMgYW4gb2JqZWN0IGluIGEgUHJveHkgd2hpY2ggaW50ZXJjZXB0cyBhbmQgd3JhcHMgY2VydGFpbiBtZXRob2RzXG4gICAgICogYmFzZWQgb24gdGhlIGdpdmVuIGB3cmFwcGVyc2AgYW5kIGBtZXRhZGF0YWAgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXRcbiAgICAgKiAgICAgICAgVGhlIHRhcmdldCBvYmplY3QgdG8gd3JhcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbd3JhcHBlcnMgPSB7fV1cbiAgICAgKiAgICAgICAgQW4gb2JqZWN0IHRyZWUgY29udGFpbmluZyB3cmFwcGVyIGZ1bmN0aW9ucyBmb3Igc3BlY2lhbCBjYXNlcy4gQW55XG4gICAgICogICAgICAgIGZ1bmN0aW9uIHByZXNlbnQgaW4gdGhpcyBvYmplY3QgdHJlZSBpcyBjYWxsZWQgaW4gcGxhY2Ugb2YgdGhlXG4gICAgICogICAgICAgIG1ldGhvZCBpbiB0aGUgc2FtZSBsb2NhdGlvbiBpbiB0aGUgYHRhcmdldGAgb2JqZWN0IHRyZWUuIFRoZXNlXG4gICAgICogICAgICAgIHdyYXBwZXIgbWV0aG9kcyBhcmUgaW52b2tlZCBhcyBkZXNjcmliZWQgaW4ge0BzZWUgd3JhcE1ldGhvZH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW21ldGFkYXRhID0ge31dXG4gICAgICogICAgICAgIEFuIG9iamVjdCB0cmVlIGNvbnRhaW5pbmcgbWV0YWRhdGEgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlXG4gICAgICogICAgICAgIFByb21pc2UtYmFzZWQgd3JhcHBlciBmdW5jdGlvbnMgZm9yIGFzeW5jaHJvbm91cy4gQW55IGZ1bmN0aW9uIGluXG4gICAgICogICAgICAgIHRoZSBgdGFyZ2V0YCBvYmplY3QgdHJlZSB3aGljaCBoYXMgYSBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIG9iamVjdFxuICAgICAqICAgICAgICBpbiB0aGUgc2FtZSBsb2NhdGlvbiBpbiB0aGUgYG1ldGFkYXRhYCB0cmVlIGlzIHJlcGxhY2VkIHdpdGggYW5cbiAgICAgKiAgICAgICAgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbiwgYXMgZGVzY3JpYmVkIGluXG4gICAgICogICAgICAgIHtAc2VlIHdyYXBBc3luY0Z1bmN0aW9ufVxuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb3h5PG9iamVjdD59XG4gICAgICovXG4gICAgY29uc3Qgd3JhcE9iamVjdCA9ICh0YXJnZXQsIHdyYXBwZXJzID0ge30sIG1ldGFkYXRhID0ge30pID0+IHtcbiAgICAgIGxldCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICBsZXQgaGFuZGxlcnMgPSB7XG4gICAgICAgIGhhcyhwcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgICAgIHJldHVybiBwcm9wIGluIHRhcmdldCB8fCBwcm9wIGluIGNhY2hlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldChwcm94eVRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgICBpZiAocHJvcCBpbiBjYWNoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlW3Byb3BdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgdmFsdWUgPSB0YXJnZXRbcHJvcF07XG5cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBtZXRob2Qgb24gdGhlIHVuZGVybHlpbmcgb2JqZWN0LiBDaGVjayBpZiB3ZSBuZWVkIHRvIGRvXG4gICAgICAgICAgICAvLyBhbnkgd3JhcHBpbmcuXG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd3JhcHBlcnNbcHJvcF0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgc3BlY2lhbC1jYXNlIHdyYXBwZXIgZm9yIHRoaXMgbWV0aG9kLlxuICAgICAgICAgICAgICB2YWx1ZSA9IHdyYXBNZXRob2QodGFyZ2V0LCB0YXJnZXRbcHJvcF0sIHdyYXBwZXJzW3Byb3BdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzT3duUHJvcGVydHkobWV0YWRhdGEsIHByb3ApKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgd2UgaGF2ZSBtZXRhZGF0YSBmb3IuIENyZWF0ZSBhXG4gICAgICAgICAgICAgIC8vIFByb21pc2Ugd3JhcHBlciBmb3IgaXQuXG4gICAgICAgICAgICAgIGxldCB3cmFwcGVyID0gd3JhcEFzeW5jRnVuY3Rpb24ocHJvcCwgbWV0YWRhdGFbcHJvcF0pO1xuICAgICAgICAgICAgICB2YWx1ZSA9IHdyYXBNZXRob2QodGFyZ2V0LCB0YXJnZXRbcHJvcF0sIHdyYXBwZXIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG1ldGhvZCB0aGF0IHdlIGRvbid0IGtub3cgb3IgY2FyZSBhYm91dC4gUmV0dXJuIHRoZVxuICAgICAgICAgICAgICAvLyBvcmlnaW5hbCBtZXRob2QsIGJvdW5kIHRvIHRoZSB1bmRlcmx5aW5nIG9iamVjdC5cbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5iaW5kKHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgIChoYXNPd25Qcm9wZXJ0eSh3cmFwcGVycywgcHJvcCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICBoYXNPd25Qcm9wZXJ0eShtZXRhZGF0YSwgcHJvcCkpKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGFuIG9iamVjdCB0aGF0IHdlIG5lZWQgdG8gZG8gc29tZSB3cmFwcGluZyBmb3IgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICAvLyBvZi4gQ3JlYXRlIGEgc3ViLW9iamVjdCB3cmFwcGVyIGZvciBpdCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjaGlsZFxuICAgICAgICAgICAgLy8gbWV0YWRhdGEuXG4gICAgICAgICAgICB2YWx1ZSA9IHdyYXBPYmplY3QodmFsdWUsIHdyYXBwZXJzW3Byb3BdLCBtZXRhZGF0YVtwcm9wXSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNPd25Qcm9wZXJ0eShtZXRhZGF0YSwgXCIqXCIpKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGFsbCBwcm9wZXJ0aWVzIGluICogbmFtZXNwYWNlLlxuICAgICAgICAgICAgdmFsdWUgPSB3cmFwT2JqZWN0KHZhbHVlLCB3cmFwcGVyc1twcm9wXSwgbWV0YWRhdGFbXCIqXCJdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgd3JhcHBpbmcgZm9yIHRoaXMgcHJvcGVydHksXG4gICAgICAgICAgICAvLyBzbyBqdXN0IGZvcndhcmQgYWxsIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBvYmplY3QuXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2FjaGUsIHByb3AsIHtcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhY2hlW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldChwcm94eVRhcmdldCwgcHJvcCwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgaWYgKHByb3AgaW4gY2FjaGUpIHtcbiAgICAgICAgICAgIGNhY2hlW3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBkZWZpbmVQcm9wZXJ0eShwcm94eVRhcmdldCwgcHJvcCwgZGVzYykge1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmRlZmluZVByb3BlcnR5KGNhY2hlLCBwcm9wLCBkZXNjKTtcbiAgICAgICAgfSxcblxuICAgICAgICBkZWxldGVQcm9wZXJ0eShwcm94eVRhcmdldCwgcHJvcCkge1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KGNhY2hlLCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFBlciBjb250cmFjdCBvZiB0aGUgUHJveHkgQVBJLCB0aGUgXCJnZXRcIiBwcm94eSBoYW5kbGVyIG11c3QgcmV0dXJuIHRoZVxuICAgICAgLy8gb3JpZ2luYWwgdmFsdWUgb2YgdGhlIHRhcmdldCBpZiB0aGF0IHZhbHVlIGlzIGRlY2xhcmVkIHJlYWQtb25seSBhbmRcbiAgICAgIC8vIG5vbi1jb25maWd1cmFibGUuIEZvciB0aGlzIHJlYXNvbiwgd2UgY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZVxuICAgICAgLy8gcHJvdG90eXBlIHNldCB0byBgdGFyZ2V0YCBpbnN0ZWFkIG9mIHVzaW5nIGB0YXJnZXRgIGRpcmVjdGx5LlxuICAgICAgLy8gT3RoZXJ3aXNlIHdlIGNhbm5vdCByZXR1cm4gYSBjdXN0b20gb2JqZWN0IGZvciBBUElzIHRoYXRcbiAgICAgIC8vIGFyZSBkZWNsYXJlZCByZWFkLW9ubHkgYW5kIG5vbi1jb25maWd1cmFibGUsIHN1Y2ggYXMgYGNocm9tZS5kZXZ0b29sc2AuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHByb3h5IGhhbmRsZXJzIHRoZW1zZWx2ZXMgd2lsbCBzdGlsbCB1c2UgdGhlIG9yaWdpbmFsIGB0YXJnZXRgXG4gICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBgcHJveHlUYXJnZXRgLCBzbyB0aGF0IHRoZSBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGFyZVxuICAgICAgLy8gZGVyZWZlcmVuY2VkIHZpYSB0aGUgb3JpZ2luYWwgdGFyZ2V0cy5cbiAgICAgIGxldCBwcm94eVRhcmdldCA9IE9iamVjdC5jcmVhdGUodGFyZ2V0KTtcbiAgICAgIHJldHVybiBuZXcgUHJveHkocHJveHlUYXJnZXQsIGhhbmRsZXJzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNldCBvZiB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgYW4gZXZlbnQgb2JqZWN0LCB3aGljaCBoYW5kbGVzXG4gICAgICogd3JhcHBpbmcgb2YgbGlzdGVuZXIgZnVuY3Rpb25zIHRoYXQgdGhvc2UgbWVzc2FnZXMgYXJlIHBhc3NlZC5cbiAgICAgKlxuICAgICAqIEEgc2luZ2xlIHdyYXBwZXIgaXMgY3JlYXRlZCBmb3IgZWFjaCBsaXN0ZW5lciBmdW5jdGlvbiwgYW5kIHN0b3JlZCBpbiBhXG4gICAgICogbWFwLiBTdWJzZXF1ZW50IGNhbGxzIHRvIGBhZGRMaXN0ZW5lcmAsIGBoYXNMaXN0ZW5lcmAsIG9yIGByZW1vdmVMaXN0ZW5lcmBcbiAgICAgKiByZXRyaWV2ZSB0aGUgb3JpZ2luYWwgd3JhcHBlciwgc28gdGhhdCAgYXR0ZW1wdHMgdG8gcmVtb3ZlIGFcbiAgICAgKiBwcmV2aW91c2x5LWFkZGVkIGxpc3RlbmVyIHdvcmsgYXMgZXhwZWN0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RlZmF1bHRXZWFrTWFwPGZ1bmN0aW9uLCBmdW5jdGlvbj59IHdyYXBwZXJNYXBcbiAgICAgKiAgICAgICAgQSBEZWZhdWx0V2Vha01hcCBvYmplY3Qgd2hpY2ggd2lsbCBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIHdyYXBwZXJcbiAgICAgKiAgICAgICAgZm9yIGEgZ2l2ZW4gbGlzdGVuZXIgZnVuY3Rpb24gd2hlbiBvbmUgZG9lcyBub3QgZXhpc3QsIGFuZCByZXRyaWV2ZVxuICAgICAqICAgICAgICBhbiBleGlzdGluZyBvbmUgd2hlbiBpdCBkb2VzLlxuICAgICAqXG4gICAgICogQHJldHVybnMge29iamVjdH1cbiAgICAgKi9cbiAgICBjb25zdCB3cmFwRXZlbnQgPSB3cmFwcGVyTWFwID0+ICh7XG4gICAgICBhZGRMaXN0ZW5lcih0YXJnZXQsIGxpc3RlbmVyLCAuLi5hcmdzKSB7XG4gICAgICAgIHRhcmdldC5hZGRMaXN0ZW5lcih3cmFwcGVyTWFwLmdldChsaXN0ZW5lciksIC4uLmFyZ3MpO1xuICAgICAgfSxcblxuICAgICAgaGFzTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gdGFyZ2V0Lmhhc0xpc3RlbmVyKHdyYXBwZXJNYXAuZ2V0KGxpc3RlbmVyKSk7XG4gICAgICB9LFxuXG4gICAgICByZW1vdmVMaXN0ZW5lcih0YXJnZXQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRhcmdldC5yZW1vdmVMaXN0ZW5lcih3cmFwcGVyTWFwLmdldChsaXN0ZW5lcikpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG9uUmVxdWVzdEZpbmlzaGVkV3JhcHBlcnMgPSBuZXcgRGVmYXVsdFdlYWtNYXAobGlzdGVuZXIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5lcjtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBXcmFwcyBhbiBvblJlcXVlc3RGaW5pc2hlZCBsaXN0ZW5lciBmdW5jdGlvbiBzbyB0aGF0IGl0IHdpbGwgcmV0dXJuIGFcbiAgICAgICAqIGBnZXRDb250ZW50KClgIHByb3BlcnR5IHdoaWNoIHJldHVybnMgYSBgUHJvbWlzZWAgcmF0aGVyIHRoYW4gdXNpbmcgYVxuICAgICAgICogY2FsbGJhY2sgQVBJLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSByZXFcbiAgICAgICAqICAgICAgICBUaGUgSEFSIGVudHJ5IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG5ldHdvcmsgcmVxdWVzdC5cbiAgICAgICAqL1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIG9uUmVxdWVzdEZpbmlzaGVkKHJlcSkge1xuICAgICAgICBjb25zdCB3cmFwcGVkUmVxID0gd3JhcE9iamVjdChyZXEsIHt9IC8qIHdyYXBwZXJzICovLCB7XG4gICAgICAgICAgZ2V0Q29udGVudDoge1xuICAgICAgICAgICAgbWluQXJnczogMCxcbiAgICAgICAgICAgIG1heEFyZ3M6IDAsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxpc3RlbmVyKHdyYXBwZWRSZXEpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIEtlZXAgdHJhY2sgaWYgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcgaGFzIGJlZW4gbG9nZ2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgbGV0IGxvZ2dlZFNlbmRSZXNwb25zZURlcHJlY2F0aW9uV2FybmluZyA9IGZhbHNlO1xuXG4gICAgY29uc3Qgb25NZXNzYWdlV3JhcHBlcnMgPSBuZXcgRGVmYXVsdFdlYWtNYXAobGlzdGVuZXIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5lcjtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBXcmFwcyBhIG1lc3NhZ2UgbGlzdGVuZXIgZnVuY3Rpb24gc28gdGhhdCBpdCBtYXkgc2VuZCByZXNwb25zZXMgYmFzZWQgb25cbiAgICAgICAqIGl0cyByZXR1cm4gdmFsdWUsIHJhdGhlciB0aGFuIGJ5IHJldHVybmluZyBhIHNlbnRpbmVsIHZhbHVlIGFuZCBjYWxsaW5nIGFcbiAgICAgICAqIGNhbGxiYWNrLiBJZiB0aGUgbGlzdGVuZXIgZnVuY3Rpb24gcmV0dXJucyBhIFByb21pc2UsIHRoZSByZXNwb25zZSBpc1xuICAgICAgICogc2VudCB3aGVuIHRoZSBwcm9taXNlIGVpdGhlciByZXNvbHZlcyBvciByZWplY3RzLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7Kn0gbWVzc2FnZVxuICAgICAgICogICAgICAgIFRoZSBtZXNzYWdlIHNlbnQgYnkgdGhlIG90aGVyIGVuZCBvZiB0aGUgY2hhbm5lbC5cbiAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBzZW5kZXJcbiAgICAgICAqICAgICAgICBEZXRhaWxzIGFib3V0IHRoZSBzZW5kZXIgb2YgdGhlIG1lc3NhZ2UuXG4gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCopfSBzZW5kUmVzcG9uc2VcbiAgICAgICAqICAgICAgICBBIGNhbGxiYWNrIHdoaWNoLCB3aGVuIGNhbGxlZCB3aXRoIGFuIGFyYml0cmFyeSBhcmd1bWVudCwgc2VuZHNcbiAgICAgICAqICAgICAgICB0aGF0IHZhbHVlIGFzIGEgcmVzcG9uc2UuXG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgICAqICAgICAgICBUcnVlIGlmIHRoZSB3cmFwcGVkIGxpc3RlbmVyIHJldHVybmVkIGEgUHJvbWlzZSwgd2hpY2ggd2lsbCBsYXRlclxuICAgICAgICogICAgICAgIHlpZWxkIGEgcmVzcG9uc2UuIEZhbHNlIG90aGVyd2lzZS5cbiAgICAgICAqL1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIG9uTWVzc2FnZShtZXNzYWdlLCBzZW5kZXIsIHNlbmRSZXNwb25zZSkge1xuICAgICAgICBsZXQgZGlkQ2FsbFNlbmRSZXNwb25zZSA9IGZhbHNlO1xuXG4gICAgICAgIGxldCB3cmFwcGVkU2VuZFJlc3BvbnNlO1xuICAgICAgICBsZXQgc2VuZFJlc3BvbnNlUHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgIHdyYXBwZWRTZW5kUmVzcG9uc2UgPSBmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKCFsb2dnZWRTZW5kUmVzcG9uc2VEZXByZWNhdGlvbldhcm5pbmcpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFNFTkRfUkVTUE9OU0VfREVQUkVDQVRJT05fV0FSTklORywgbmV3IEVycm9yKCkuc3RhY2spO1xuICAgICAgICAgICAgICBsb2dnZWRTZW5kUmVzcG9uc2VEZXByZWNhdGlvbldhcm5pbmcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlkQ2FsbFNlbmRSZXNwb25zZSA9IHRydWU7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGxpc3RlbmVyKG1lc3NhZ2UsIHNlbmRlciwgd3JhcHBlZFNlbmRSZXNwb25zZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlc3VsdCA9IFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc1Jlc3VsdFRoZW5hYmxlID0gcmVzdWx0ICE9PSB0cnVlICYmIGlzVGhlbmFibGUocmVzdWx0KTtcblxuICAgICAgICAvLyBJZiB0aGUgbGlzdGVuZXIgZGlkbid0IHJldHVybmVkIHRydWUgb3IgYSBQcm9taXNlLCBvciBjYWxsZWRcbiAgICAgICAgLy8gd3JhcHBlZFNlbmRSZXNwb25zZSBzeW5jaHJvbm91c2x5LCB3ZSBjYW4gZXhpdCBlYXJsaWVyXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlcmUgd2lsbCBiZSBubyByZXNwb25zZSBzZW50IGZyb20gdGhpcyBsaXN0ZW5lci5cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSAmJiAhaXNSZXN1bHRUaGVuYWJsZSAmJiAhZGlkQ2FsbFNlbmRSZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgc21hbGwgaGVscGVyIHRvIHNlbmQgdGhlIG1lc3NhZ2UgaWYgdGhlIHByb21pc2UgcmVzb2x2ZXNcbiAgICAgICAgLy8gYW5kIGFuIGVycm9yIGlmIHRoZSBwcm9taXNlIHJlamVjdHMgKGEgd3JhcHBlZCBzZW5kTWVzc2FnZSBoYXNcbiAgICAgICAgLy8gdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIGludG8gYSByZXNvbHZlZCBwcm9taXNlIG9yIGEgcmVqZWN0ZWRcbiAgICAgICAgLy8gcHJvbWlzZSkuXG4gICAgICAgIGNvbnN0IHNlbmRQcm9taXNlZFJlc3VsdCA9IChwcm9taXNlKSA9PiB7XG4gICAgICAgICAgcHJvbWlzZS50aGVuKG1zZyA9PiB7XG4gICAgICAgICAgICAvLyBzZW5kIHRoZSBtZXNzYWdlIHZhbHVlLlxuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKG1zZyk7XG4gICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgLy8gU2VuZCBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGlmIHRoZSByZWplY3RlZCB2YWx1ZVxuICAgICAgICAgICAgLy8gaXMgYW4gaW5zdGFuY2Ugb2YgZXJyb3IsIG9yIHRoZSBvYmplY3QgaXRzZWxmIG90aGVyd2lzZS5cbiAgICAgICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICAgICAgaWYgKGVycm9yICYmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZW5kUmVzcG9uc2Uoe1xuICAgICAgICAgICAgICBfX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X186IHRydWUsXG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgLy8gUHJpbnQgYW4gZXJyb3Igb24gdGhlIGNvbnNvbGUgaWYgdW5hYmxlIHRvIHNlbmQgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBzZW5kIG9uTWVzc2FnZSByZWplY3RlZCByZXBseVwiLCBlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciByZXR1cm5lZCBhIFByb21pc2UsIHNlbmQgdGhlIHJlc29sdmVkIHZhbHVlIGFzIGFcbiAgICAgICAgLy8gcmVzdWx0LCBvdGhlcndpc2Ugd2FpdCB0aGUgcHJvbWlzZSByZWxhdGVkIHRvIHRoZSB3cmFwcGVkU2VuZFJlc3BvbnNlXG4gICAgICAgIC8vIGNhbGxiYWNrIHRvIHJlc29sdmUgYW5kIHNlbmQgaXQgYXMgYSByZXNwb25zZS5cbiAgICAgICAgaWYgKGlzUmVzdWx0VGhlbmFibGUpIHtcbiAgICAgICAgICBzZW5kUHJvbWlzZWRSZXN1bHQocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZW5kUHJvbWlzZWRSZXN1bHQoc2VuZFJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMZXQgQ2hyb21lIGtub3cgdGhhdCB0aGUgbGlzdGVuZXIgaXMgcmVwbHlpbmcuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHdyYXBwZWRTZW5kTWVzc2FnZUNhbGxiYWNrID0gKHtyZWplY3QsIHJlc29sdmV9LCByZXBseSkgPT4ge1xuICAgICAgaWYgKGV4dGVuc2lvbkFQSXMucnVudGltZS5sYXN0RXJyb3IpIHtcbiAgICAgICAgLy8gRGV0ZWN0IHdoZW4gbm9uZSBvZiB0aGUgbGlzdGVuZXJzIHJlcGxpZWQgdG8gdGhlIHNlbmRNZXNzYWdlIGNhbGwgYW5kIHJlc29sdmVcbiAgICAgICAgLy8gdGhlIHByb21pc2UgdG8gdW5kZWZpbmVkIGFzIGluIEZpcmVmb3guXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS93ZWJleHRlbnNpb24tcG9seWZpbGwvaXNzdWVzLzEzMFxuICAgICAgICBpZiAoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvci5tZXNzYWdlID09PSBDSFJPTUVfU0VORF9NRVNTQUdFX0NBTExCQUNLX05PX1JFU1BPTlNFX01FU1NBR0UpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihleHRlbnNpb25BUElzLnJ1bnRpbWUubGFzdEVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZXBseSAmJiByZXBseS5fX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X18pIHtcbiAgICAgICAgLy8gQ29udmVydCBiYWNrIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBpbnRvXG4gICAgICAgIC8vIGFuIEVycm9yIGluc3RhbmNlLlxuICAgICAgICByZWplY3QobmV3IEVycm9yKHJlcGx5Lm1lc3NhZ2UpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUocmVwbHkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB3cmFwcGVkU2VuZE1lc3NhZ2UgPSAobmFtZSwgbWV0YWRhdGEsIGFwaU5hbWVzcGFjZU9iaiwgLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgbWV0YWRhdGEubWluQXJncykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGF0IGxlYXN0ICR7bWV0YWRhdGEubWluQXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWluQXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPiBtZXRhZGF0YS5tYXhBcmdzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbW9zdCAke21ldGFkYXRhLm1heEFyZ3N9ICR7cGx1cmFsaXplQXJndW1lbnRzKG1ldGFkYXRhLm1heEFyZ3MpfSBmb3IgJHtuYW1lfSgpLCBnb3QgJHthcmdzLmxlbmd0aH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZENiID0gd3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2suYmluZChudWxsLCB7cmVzb2x2ZSwgcmVqZWN0fSk7XG4gICAgICAgIGFyZ3MucHVzaCh3cmFwcGVkQ2IpO1xuICAgICAgICBhcGlOYW1lc3BhY2VPYmouc2VuZE1lc3NhZ2UoLi4uYXJncyk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhdGljV3JhcHBlcnMgPSB7XG4gICAgICBkZXZ0b29sczoge1xuICAgICAgICBuZXR3b3JrOiB7XG4gICAgICAgICAgb25SZXF1ZXN0RmluaXNoZWQ6IHdyYXBFdmVudChvblJlcXVlc3RGaW5pc2hlZFdyYXBwZXJzKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBydW50aW1lOiB7XG4gICAgICAgIG9uTWVzc2FnZTogd3JhcEV2ZW50KG9uTWVzc2FnZVdyYXBwZXJzKSxcbiAgICAgICAgb25NZXNzYWdlRXh0ZXJuYWw6IHdyYXBFdmVudChvbk1lc3NhZ2VXcmFwcGVycyksXG4gICAgICAgIHNlbmRNZXNzYWdlOiB3cmFwcGVkU2VuZE1lc3NhZ2UuYmluZChudWxsLCBcInNlbmRNZXNzYWdlXCIsIHttaW5BcmdzOiAxLCBtYXhBcmdzOiAzfSksXG4gICAgICB9LFxuICAgICAgdGFiczoge1xuICAgICAgICBzZW5kTWVzc2FnZTogd3JhcHBlZFNlbmRNZXNzYWdlLmJpbmQobnVsbCwgXCJzZW5kTWVzc2FnZVwiLCB7bWluQXJnczogMiwgbWF4QXJnczogM30pLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IHNldHRpbmdNZXRhZGF0YSA9IHtcbiAgICAgIGNsZWFyOiB7bWluQXJnczogMSwgbWF4QXJnczogMX0sXG4gICAgICBnZXQ6IHttaW5BcmdzOiAxLCBtYXhBcmdzOiAxfSxcbiAgICAgIHNldDoge21pbkFyZ3M6IDEsIG1heEFyZ3M6IDF9LFxuICAgIH07XG4gICAgYXBpTWV0YWRhdGEucHJpdmFjeSA9IHtcbiAgICAgIG5ldHdvcms6IHtcIipcIjogc2V0dGluZ01ldGFkYXRhfSxcbiAgICAgIHNlcnZpY2VzOiB7XCIqXCI6IHNldHRpbmdNZXRhZGF0YX0sXG4gICAgICB3ZWJzaXRlczoge1wiKlwiOiBzZXR0aW5nTWV0YWRhdGF9LFxuICAgIH07XG5cbiAgICByZXR1cm4gd3JhcE9iamVjdChleHRlbnNpb25BUElzLCBzdGF0aWNXcmFwcGVycywgYXBpTWV0YWRhdGEpO1xuICB9O1xuXG4gIC8vIFRoZSBidWlsZCBwcm9jZXNzIGFkZHMgYSBVTUQgd3JhcHBlciBhcm91bmQgdGhpcyBmaWxlLCB3aGljaCBtYWtlcyB0aGVcbiAgLy8gYG1vZHVsZWAgdmFyaWFibGUgYXZhaWxhYmxlLlxuICBtb2R1bGUuZXhwb3J0cyA9IHdyYXBBUElzKGNocm9tZSk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbFRoaXMuYnJvd3Nlcjtcbn1cbiJdLCJuYW1lcyI6WyJicm93c2VyIiwiYWN0aW9uIiwib25DbGlja2VkIiwiYWRkTGlzdGVuZXIiLCJydW50aW1lIiwib3Blbk9wdGlvbnNQYWdlIiwiYnJvd3NlckFjdGlvbiIsImNvcHlQYWdlRnJhZ21lbnQiLCJjb250ZXh0TWVudXMiLCJjcmVhdGUiLCJpZCIsInRpdGxlIiwiY29udGV4dHMiLCJpbmZvIiwidGFiIiwibWVudUl0ZW1JZCIsInRhYnMiLCJzZW5kTWVzc2FnZSIsInR5cGUiLCJlbGVtZW50SWQiLCJ0YXJnZXRFbGVtZW50SWQiLCJPcHRpb25zU3luYyIsImFsbG93U3ViZG9tYWluc0Zyb20iLCJ3aGl0ZWxpc3REb21haW5zIiwiZGVmYXVsdHMiLCJyZW5kZXJCbG9ja2xpc3QiLCJpZnJhbWVEb21haW5XaGl0ZWxpc3QiLCJqb2luIiwiaWZyYW1lU3ViZG9tYWluV2hpdGVsaXN0Iiwib3B0aW9uc1N0b3JhZ2UiLCJtaWdyYXRpb25zIiwicmVtb3ZlVW51c2VkIiwibG9nZ2luZyIsInN0b3JhZ2VUeXBlIiwiT3B0aW9ucyIsImFsbCIsImdldEFsbCIsImNzdlNldHRpbmciLCJpZnJhbWUiLCJkb21haW5XaGl0ZWxpc3QiLCJzdWJkb21haW5XaGl0ZWxpc3QiLCJTZXR0aW5nTmFtZSIsIm5hbWUiLCJwYXJzZUNzdiIsImNzdiIsInNwbGl0IiwibWFwIiwicyIsInRyaW0iLCJnb29kR3dlcm5Eb21haW5zIiwiYWxsb3dTdWJkb21haW5zRnJvbUd3ZXJuIiwiZ2xvYmFsVGhpcyIsImNocm9tZSIsIkVycm9yIiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJwcm90b3R5cGUiLCJDSFJPTUVfU0VORF9NRVNTQUdFX0NBTExCQUNLX05PX1JFU1BPTlNFX01FU1NBR0UiLCJTRU5EX1JFU1BPTlNFX0RFUFJFQ0FUSU9OX1dBUk5JTkciLCJ3cmFwQVBJcyIsImV4dGVuc2lvbkFQSXMiLCJhcGlNZXRhZGF0YSIsImtleXMiLCJsZW5ndGgiLCJEZWZhdWx0V2Vha01hcCIsIldlYWtNYXAiLCJjb25zdHJ1Y3RvciIsImNyZWF0ZUl0ZW0iLCJpdGVtcyIsInVuZGVmaW5lZCIsImdldCIsImtleSIsImhhcyIsInNldCIsImlzVGhlbmFibGUiLCJ2YWx1ZSIsInRoZW4iLCJtYWtlQ2FsbGJhY2siLCJwcm9taXNlIiwibWV0YWRhdGEiLCJjYWxsYmFja0FyZ3MiLCJsYXN0RXJyb3IiLCJyZWplY3QiLCJtZXNzYWdlIiwic2luZ2xlQ2FsbGJhY2tBcmciLCJyZXNvbHZlIiwicGx1cmFsaXplQXJndW1lbnRzIiwibnVtQXJncyIsIndyYXBBc3luY0Z1bmN0aW9uIiwiYXN5bmNGdW5jdGlvbldyYXBwZXIiLCJ0YXJnZXQiLCJhcmdzIiwibWluQXJncyIsIm1heEFyZ3MiLCJQcm9taXNlIiwiZmFsbGJhY2tUb05vQ2FsbGJhY2siLCJjYkVycm9yIiwiY29uc29sZSIsIndhcm4iLCJub0NhbGxiYWNrIiwid3JhcE1ldGhvZCIsIm1ldGhvZCIsIndyYXBwZXIiLCJQcm94eSIsImFwcGx5IiwidGFyZ2V0TWV0aG9kIiwidGhpc09iaiIsImNhbGwiLCJoYXNPd25Qcm9wZXJ0eSIsIkZ1bmN0aW9uIiwiYmluZCIsIndyYXBPYmplY3QiLCJ3cmFwcGVycyIsImNhY2hlIiwiaGFuZGxlcnMiLCJwcm94eVRhcmdldCIsInByb3AiLCJyZWNlaXZlciIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiZW51bWVyYWJsZSIsImRlc2MiLCJSZWZsZWN0IiwiZGVsZXRlUHJvcGVydHkiLCJ3cmFwRXZlbnQiLCJ3cmFwcGVyTWFwIiwibGlzdGVuZXIiLCJoYXNMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwib25SZXF1ZXN0RmluaXNoZWRXcmFwcGVycyIsIm9uUmVxdWVzdEZpbmlzaGVkIiwicmVxIiwid3JhcHBlZFJlcSIsImdldENvbnRlbnQiLCJsb2dnZWRTZW5kUmVzcG9uc2VEZXByZWNhdGlvbldhcm5pbmciLCJvbk1lc3NhZ2VXcmFwcGVycyIsIm9uTWVzc2FnZSIsInNlbmRlciIsInNlbmRSZXNwb25zZSIsImRpZENhbGxTZW5kUmVzcG9uc2UiLCJ3cmFwcGVkU2VuZFJlc3BvbnNlIiwic2VuZFJlc3BvbnNlUHJvbWlzZSIsInJlc3BvbnNlIiwic3RhY2siLCJyZXN1bHQiLCJlcnIiLCJpc1Jlc3VsdFRoZW5hYmxlIiwic2VuZFByb21pc2VkUmVzdWx0IiwibXNnIiwiZXJyb3IiLCJfX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X18iLCJjYXRjaCIsIndyYXBwZWRTZW5kTWVzc2FnZUNhbGxiYWNrIiwicmVwbHkiLCJ3cmFwcGVkU2VuZE1lc3NhZ2UiLCJhcGlOYW1lc3BhY2VPYmoiLCJ3cmFwcGVkQ2IiLCJwdXNoIiwic3RhdGljV3JhcHBlcnMiLCJkZXZ0b29scyIsIm5ldHdvcmsiLCJvbk1lc3NhZ2VFeHRlcm5hbCIsInNldHRpbmdNZXRhZGF0YSIsImNsZWFyIiwicHJpdmFjeSIsInNlcnZpY2VzIiwid2Vic2l0ZXMiLCJtb2R1bGUiLCJleHBvcnRzIl0sInZlcnNpb24iOjMsImZpbGUiOiJiYWNrZ3JvdW5kLjlmZTM5YWE3LmpzLm1hcCJ9
(() => {
var $parcel$global = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : "undefined" != typeof window ? window : "undefined" != typeof global ? global : {}, $parcel$modules = {}, $parcel$inits = {}, parcelRequire = $parcel$global.parcelRequire94c2;
null == parcelRequire && ((parcelRequire = function(id) {
if (id in $parcel$modules) return $parcel$modules[id].exports;
if (id in $parcel$inits) {
var init = $parcel$inits[id];
delete $parcel$inits[id];
var module = {
id: id,
exports: {}
};
return $parcel$modules[id] = module, init.call(module.exports, module, module.exports),
module.exports;
}
var err = new Error("Cannot find module '" + id + "'");
throw err.code = "MODULE_NOT_FOUND", err;
}).register = function(id, init) {
$parcel$inits[id] = init;
}, $parcel$global.parcelRequire94c2 = parcelRequire), parcelRequire("lbnQL");
var $dBVaG = parcelRequire("dBVaG");
$dBVaG.action?.onClicked.addListener((async () => $dBVaG.runtime.openOptionsPage())),
$dBVaG.browserAction?.onClicked.addListener((async () => $dBVaG.runtime.openOptionsPage()));
$dBVaG.contextMenus.create({
id: "copy-page-fragment",
title: "Copy Page Fragment",
contexts: [ "all" ]
}), $dBVaG.contextMenus.onClicked.addListener(((info, tab) => {
"copy-page-fragment" === info.menuItemId && $dBVaG.tabs.sendMessage(tab?.id, {
type: "copy-page-fragment",
elementId: info.targetElementId
});
}));
})();
!function(modules, entry, mainEntry, parcelRequireName, globalName) {
var globalObject = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : "undefined" != typeof window ? window : "undefined" != typeof global ? global : {}, previousRequire = "function" == typeof globalObject.parcelRequire94c2 && globalObject.parcelRequire94c2, cache = previousRequire.cache || {}, nodeRequire = "undefined" != typeof module && "function" == typeof module.require && module.require.bind(module);
function newRequire(name, jumped) {
if (!cache[name]) {
if (!modules[name]) {
var currentRequire = "function" == typeof globalObject.parcelRequire94c2 && globalObject.parcelRequire94c2;
if (!jumped && currentRequire) return currentRequire(name, !0);
if (previousRequire) return previousRequire(name, !0);
if (nodeRequire && "string" == typeof name) return nodeRequire(name);
var err = new Error("Cannot find module '" + name + "'");
throw err.code = "MODULE_NOT_FOUND", err;
}
localRequire.resolve = function(x) {
var id = modules[name][1][x];
return null != id ? id : x;
}, localRequire.cache = {};
var module = cache[name] = new newRequire.Module(name);
modules[name][0].call(module.exports, localRequire, module, module.exports, this);
}
return cache[name].exports;
function localRequire(x) {
var res = localRequire.resolve(x);
return !1 === res ? {} : newRequire(res);
}
}
newRequire.isParcelRequire = !0, newRequire.Module = function(moduleName) {
this.id = moduleName, this.bundle = newRequire, this.exports = {};
}, newRequire.modules = modules, newRequire.cache = cache, newRequire.parent = previousRequire,
newRequire.register = function(id, exports) {
modules[id] = [ function(require, module) {
module.exports = exports;
}, {} ];
}, Object.defineProperty(newRequire, "root", {
get: function() {
return globalObject.parcelRequire94c2;
}
}), globalObject.parcelRequire94c2 = newRequire;
for (var i = 0; i < entry.length; i++) newRequire(entry[i]);
var mainExports = newRequire("kvVio");
"object" == typeof exports && "undefined" != typeof module ? module.exports = mainExports : "function" == typeof define && define.amd && define((function() {
return mainExports;
}));
}({
kvVio: [ function(require, module, exports) {
require("./options/options-storage");
var _webextensionPolyfill = require("webextension-polyfill");
_webextensionPolyfill.action?.onClicked.addListener((async () => _webextensionPolyfill.runtime.openOptionsPage())),
_webextensionPolyfill.browserAction?.onClicked.addListener((async () => _webextensionPolyfill.runtime.openOptionsPage()));
_webextensionPolyfill.contextMenus.create({
id: "copy-page-fragment",
title: "Copy Page Fragment",
contexts: [ "all" ]
}), _webextensionPolyfill.contextMenus.onClicked.addListener(((info, tab) => {
"copy-page-fragment" === info.menuItemId && _webextensionPolyfill.tabs.sendMessage(tab?.id, {
type: "copy-page-fragment",
elementId: info.targetElementId
});
}));
}, {
"./options/options-storage": "1UbB4",
"webextension-polyfill": "evG41"
} ],
"1UbB4": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "optionsStorage", (() => optionsStorage)),
parcelHelpers.export(exports, "Options", (() => Options));
var _webextOptionsSync = require("webext-options-sync"), _webextOptionsSyncDefault = parcelHelpers.interopDefault(_webextOptionsSync), _iframe = require("./defaults/iframe");
const defaults = {
renderBlocklist: "gwern.net, wikipedia.org, youtube.com, roam.garden",
iframeDomainWhitelist: _iframe.whitelistDomains.join(", "),
iframeSubdomainWhitelist: _iframe.allowSubdomainsFrom.join(", ")
}, optionsStorage = new _webextOptionsSyncDefault.default({
defaults: defaults,
migrations: [ _webextOptionsSyncDefault.default.migrations.removeUnused ],
logging: !0,
storageType: "local"
}), Options = {
all: async () => await optionsStorage.getAll(),
renderBlocklist: csvSetting("renderBlocklist"),
iframe: {
domainWhitelist: csvSetting("iframeDomainWhitelist"),
subdomainWhitelist: csvSetting("iframeSubdomainWhitelist")
}
};
function csvSetting(name) {
return async () => {
const all = await Options.all();
return parseCsv(all[name]);
};
}
const parseCsv = csv => csv.split(",").map((s => s.trim()));
}, {
"webext-options-sync": "3Rt0m",
"./defaults/iframe": "2AAva",
"@parcel/transformer-js/src/esmodule-helpers.js": "an6EU"
} ],
"3Rt0m": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "default", (() => OptionsSync));
var _webextDetectPage = require("webext-detect-page");
function throttle(delay, noTrailing, callback, debounceMode) {
var timeoutID, cancelled = !1, lastExec = 0;
function clearExistingTimeout() {
timeoutID && clearTimeout(timeoutID);
}
function wrapper() {
for (var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++) arguments_[_key] = arguments[_key];
var self = this, elapsed = Date.now() - lastExec;
function exec() {
lastExec = Date.now(), callback.apply(self, arguments_);
}
function clear() {
timeoutID = void 0;
}
cancelled || (debounceMode && !timeoutID && exec(), clearExistingTimeout(), void 0 === debounceMode && elapsed > delay ? exec() : !0 !== noTrailing && (timeoutID = setTimeout(debounceMode ? clear : exec, void 0 === debounceMode ? delay - elapsed : delay)));
}
return "boolean" != typeof noTrailing && (debounceMode = callback, callback = noTrailing,
noTrailing = void 0), wrapper.cancel = function() {
clearExistingTimeout(), cancelled = !0;
}, wrapper;
}
class TypeRegistry {
constructor(initial = {}) {
this.registeredTypes = initial;
}
get(type) {
return void 0 !== this.registeredTypes[type] ? this.registeredTypes[type] : this.registeredTypes.default;
}
register(type, item) {
void 0 === this.registeredTypes[type] && (this.registeredTypes[type] = item);
}
registerDefault(item) {
this.register("default", item);
}
}
class KeyExtractors extends TypeRegistry {
constructor(options) {
super(options), this.registerDefault((el => el.getAttribute("name") || ""));
}
}
class InputReaders extends TypeRegistry {
constructor(options1) {
super(options1), this.registerDefault((el => el.value)), this.register("checkbox", (el => null !== el.getAttribute("value") ? el.checked ? el.getAttribute("value") : null : el.checked)),
this.register("select", (el => function(elem) {
var value, option, i, options = elem.options, index = elem.selectedIndex, one = "select-one" === elem.type, values = one ? null : [], max = one ? index + 1 : options.length;
for (i = index < 0 ? max : one ? index : 0; i < max; i++) if (((option = options[i]).selected || i === index) && !option.disabled && (!option.parentNode.disabled || "optgroup" !== option.parentNode.tagName.toLowerCase())) {
if (value = option.value, one) return value;
values.push(value);
}
return values;
}(el)));
}
}
class KeyAssignmentValidators extends TypeRegistry {
constructor(options) {
super(options), this.registerDefault((() => !0)), this.register("radio", (el => el.checked));
}
}
function keySplitter(key) {
let lastKey, matches = key.match(/[^[\]]+/g);
return key.length > 1 && key.indexOf("[]") === key.length - 2 && (lastKey = matches.pop(),
matches.push([ lastKey ])), matches;
}
function getElementType(el) {
let typeAttr, tagName = el.tagName, type = tagName;
return "input" === tagName.toLowerCase() && (typeAttr = el.getAttribute("type"),
type = typeAttr || "text"), type.toLowerCase();
}
function getInputElements(element, options) {
return Array.prototype.filter.call(element.querySelectorAll("input,select,textarea"), (el => {
if ("input" === el.tagName.toLowerCase() && ("submit" === el.type || "reset" === el.type)) return !1;
let myType = getElementType(el), identifier = options.keyExtractors.get(myType)(el), foundInInclude = -1 !== (options.include || []).indexOf(identifier), foundInExclude = -1 !== (options.exclude || []).indexOf(identifier), foundInIgnored = !1, reject = !1;
if (options.ignoredTypes) for (let selector of options.ignoredTypes) el.matches(selector) && (foundInIgnored = !0);
return reject = !foundInInclude && (!!options.include || foundInExclude || foundInIgnored),
!reject;
}));
}
function assignKeyValue(obj, keychain, value) {
if (!keychain) return obj;
var key = keychain.shift();
return obj[key] || (obj[key] = Array.isArray(key) ? [] : {}), 0 === keychain.length && (Array.isArray(obj[key]) ? null !== value && obj[key].push(value) : obj[key] = value),
keychain.length > 0 && assignKeyValue(obj[key], keychain, value), obj;
}
function serialize(element, options = {}) {
let data = {};
return options.keySplitter = options.keySplitter || keySplitter, options.keyExtractors = new KeyExtractors(options.keyExtractors || {}),
options.inputReaders = new InputReaders(options.inputReaders || {}), options.keyAssignmentValidators = new KeyAssignmentValidators(options.keyAssignmentValidators || {}),
Array.prototype.forEach.call(getInputElements(element, options), (el => {
let type = getElementType(el), key = options.keyExtractors.get(type)(el), value = options.inputReaders.get(type)(el);
if (options.keyAssignmentValidators.get(type)(el, key, value)) {
let keychain = options.keySplitter(key);
data = assignKeyValue(data, keychain, value);
}
})), data;
}
class InputWriters extends TypeRegistry {
constructor(options) {
super(options), this.registerDefault(((el, value) => {
el.value = value;
})), this.register("checkbox", ((el, value) => {
null === value ? el.indeterminate = !0 : el.checked = Array.isArray(value) ? -1 !== value.indexOf(el.value) : value;
})), this.register("radio", (function(el, value) {
void 0 !== value && (el.checked = el.value === value.toString());
})), this.register("select", setSelectValue);
}
}
function setSelectValue(elem, value) {
for (var optionSet, option, arr, ret, options = elem.options, values = (ret = [],
null !== (arr = value) && (Array.isArray(arr) ? ret.push.apply(ret, arr) : ret.push(arr)),
ret), i = options.length; i--; ) option = options[i], values.indexOf(option.value) > -1 && (option.setAttribute("selected", !0),
optionSet = !0);
optionSet || (elem.selectedIndex = -1);
}
function keyJoiner(parentKey, childKey) {
return parentKey + "[" + childKey + "]";
}
function flattenData(data, parentKey, options = {}) {
let flatData = {}, keyJoiner$1 = options.keyJoiner || keyJoiner;
for (let keyName in data) {
if (!data.hasOwnProperty(keyName)) continue;
let value = data[keyName], hash = {};
parentKey && (keyName = keyJoiner$1(parentKey, keyName)), Array.isArray(value) ? (hash[keyName + "[]"] = value,
hash[keyName] = value) : "object" == typeof value ? hash = flattenData(value, keyName, options) : hash[keyName] = value,
Object.assign(flatData, hash);
}
return flatData;
}
function deserialize(form, data, options = {}) {
let flattenedData = flattenData(data, null, options);
options.keyExtractors = new KeyExtractors(options.keyExtractors || {}), options.inputWriters = new InputWriters(options.inputWriters || {}),
Array.prototype.forEach.call(getInputElements(form, options), (el => {
let type = getElementType(el), key = options.keyExtractors.get(type)(el);
options.inputWriters.get(type)(el, flattenedData[key]);
}));
}
var LZString, lzString = {
exports: {}
};
module = lzString, LZString = function() {
var f = String.fromCharCode, keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$", baseReverseDic = {};
function getBaseValue(alphabet, character) {
if (!baseReverseDic[alphabet]) {
baseReverseDic[alphabet] = {};
for (var i = 0; i < alphabet.length; i++) baseReverseDic[alphabet][alphabet.charAt(i)] = i;
}
return baseReverseDic[alphabet][character];
}
var LZString1 = {
compressToBase64: function(input) {
if (null == input) return "";
var res = LZString1._compress(input, 6, (function(a) {
return keyStrBase64.charAt(a);
}));
switch (res.length % 4) {
default:
case 0:
return res;
case 1:
return res + "===";
case 2:
return res + "==";
case 3:
return res + "=";
}
},
decompressFromBase64: function(input) {
return null == input ? "" : "" == input ? null : LZString1._decompress(input.length, 32, (function(index) {
return getBaseValue(keyStrBase64, input.charAt(index));
}));
},
compressToUTF16: function(input) {
return null == input ? "" : LZString1._compress(input, 15, (function(a) {
return f(a + 32);
})) + " ";
},
decompressFromUTF16: function(compressed) {
return null == compressed ? "" : "" == compressed ? null : LZString1._decompress(compressed.length, 16384, (function(index) {
return compressed.charCodeAt(index) - 32;
}));
},
compressToUint8Array: function(uncompressed) {
for (var compressed = LZString1.compress(uncompressed), buf = new Uint8Array(2 * compressed.length), i = 0, TotalLen = compressed.length; i < TotalLen; i++) {
var current_value = compressed.charCodeAt(i);
buf[2 * i] = current_value >>> 8, buf[2 * i + 1] = current_value % 256;
}
return buf;
},
decompressFromUint8Array: function(compressed) {
if (null == compressed) return LZString1.decompress(compressed);
for (var buf = new Array(compressed.length / 2), i = 0, TotalLen = buf.length; i < TotalLen; i++) buf[i] = 256 * compressed[2 * i] + compressed[2 * i + 1];
var result = [];
return buf.forEach((function(c) {
result.push(f(c));
})), LZString1.decompress(result.join(""));
},
compressToEncodedURIComponent: function(input) {
return null == input ? "" : LZString1._compress(input, 6, (function(a) {
return keyStrUriSafe.charAt(a);
}));
},
decompressFromEncodedURIComponent: function(input) {
return null == input ? "" : "" == input ? null : (input = input.replace(/ /g, "+"),
LZString1._decompress(input.length, 32, (function(index) {
return getBaseValue(keyStrUriSafe, input.charAt(index));
})));
},
compress: function(uncompressed) {
return LZString1._compress(uncompressed, 16, (function(a) {
return f(a);
}));
},
_compress: function(uncompressed, bitsPerChar, getCharFromInt) {
if (null == uncompressed) return "";
var i, value, ii, context_dictionary = {}, context_dictionaryToCreate = {}, context_c = "", context_wc = "", context_w = "", context_enlargeIn = 2, context_dictSize = 3, context_numBits = 2, context_data = [], context_data_val = 0, context_data_position = 0;
for (ii = 0; ii < uncompressed.length; ii += 1) if (context_c = uncompressed.charAt(ii),
Object.prototype.hasOwnProperty.call(context_dictionary, context_c) || (context_dictionary[context_c] = context_dictSize++,
context_dictionaryToCreate[context_c] = !0), context_wc = context_w + context_c,
Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) context_w = context_wc; else {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for (i = 0; i < context_numBits; i++) context_data_val <<= 1, context_data_position == bitsPerChar - 1 ? (context_data_position = 0,
context_data.push(getCharFromInt(context_data_val)), context_data_val = 0) : context_data_position++;
for (value = context_w.charCodeAt(0), i = 0; i < 8; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
} else {
for (value = 1, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value = 0;
for (value = context_w.charCodeAt(0), i = 0; i < 16; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
}
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++),
delete context_dictionaryToCreate[context_w];
} else for (value = context_dictionary[context_w], i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++),
context_dictionary[context_wc] = context_dictSize++, context_w = String(context_c);
}
if ("" !== context_w) {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for (i = 0; i < context_numBits; i++) context_data_val <<= 1, context_data_position == bitsPerChar - 1 ? (context_data_position = 0,
context_data.push(getCharFromInt(context_data_val)), context_data_val = 0) : context_data_position++;
for (value = context_w.charCodeAt(0), i = 0; i < 8; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
} else {
for (value = 1, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value = 0;
for (value = context_w.charCodeAt(0), i = 0; i < 16; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
}
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++),
delete context_dictionaryToCreate[context_w];
} else for (value = context_dictionary[context_w], i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++);
}
for (value = 2, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
for (;;) {
if (context_data_val <<= 1, context_data_position == bitsPerChar - 1) {
context_data.push(getCharFromInt(context_data_val));
break;
}
context_data_position++;
}
return context_data.join("");
},
decompress: function(compressed) {
return null == compressed ? "" : "" == compressed ? null : LZString1._decompress(compressed.length, 32768, (function(index) {
return compressed.charCodeAt(index);
}));
},
_decompress: function(length, resetValue, getNextValue) {
var i, w, bits, resb, maxpower, power, c, dictionary = [], enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = [], data = {
val: getNextValue(0),
position: resetValue,
index: 1
};
for (i = 0; i < 3; i += 1) dictionary[i] = i;
for (bits = 0, maxpower = Math.pow(2, 2), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
switch (bits) {
case 0:
for (bits = 0, maxpower = Math.pow(2, 8), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
c = f(bits);
break;
case 1:
for (bits = 0, maxpower = Math.pow(2, 16), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
c = f(bits);
break;
case 2:
return "";
}
for (dictionary[3] = c, w = c, result.push(c); ;) {
if (data.index > length) return "";
for (bits = 0, maxpower = Math.pow(2, numBits), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
switch (c = bits) {
case 0:
for (bits = 0, maxpower = Math.pow(2, 8), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
dictionary[dictSize++] = f(bits), c = dictSize - 1, enlargeIn--;
break;
case 1:
for (bits = 0, maxpower = Math.pow(2, 16), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
dictionary[dictSize++] = f(bits), c = dictSize - 1, enlargeIn--;
break;
case 2:
return result.join("");
}
if (0 == enlargeIn && (enlargeIn = Math.pow(2, numBits), numBits++), dictionary[c]) entry = dictionary[c]; else {
if (c !== dictSize) return null;
entry = w + w.charAt(0);
}
result.push(entry), dictionary[dictSize++] = w + entry.charAt(0), w = entry, 0 == --enlargeIn && (enlargeIn = Math.pow(2, numBits),
numBits++);
}
}
};
return LZString1;
}(), null != module && (module.exports = LZString);
class OptionsSync {
constructor({defaults: defaults = {}, storageName: storageName = "options", migrations: migrations = [], logging: logging = !0, storageType: storageType = "sync"} = {}) {
Object.defineProperty(this, "storageName", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), Object.defineProperty(this, "storageType", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), Object.defineProperty(this, "defaults", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), Object.defineProperty(this, "_form", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), Object.defineProperty(this, "_migrations", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), this.storageName = storageName, this.defaults = defaults, this.storageType = storageType,
this._handleFormInput = (300, throttle(300, this._handleFormInput.bind(this), !1)),
this._handleStorageChangeOnForm = this._handleStorageChangeOnForm.bind(this), logging || (this._log = () => {}),
this._migrations = this._runMigrations(migrations);
}
get storage() {
return chrome.storage[this.storageType];
}
async getAll() {
return await this._migrations, this._getAll();
}
async setAll(newOptions) {
return await this._migrations, this._setAll(newOptions);
}
async set(newOptions) {
return this.setAll({
...await this.getAll(),
...newOptions
});
}
async syncForm(form) {
this._form = form instanceof HTMLFormElement ? form : document.querySelector(form),
this._form.addEventListener("input", this._handleFormInput), this._form.addEventListener("submit", this._handleFormSubmit),
chrome.storage.onChanged.addListener(this._handleStorageChangeOnForm), this._updateForm(this._form, await this.getAll());
}
async stopSyncForm() {
this._form && (this._form.removeEventListener("input", this._handleFormInput), this._form.removeEventListener("submit", this._handleFormSubmit),
chrome.storage.onChanged.removeListener(this._handleStorageChangeOnForm), delete this._form);
}
_log(method, ...args) {
console[method](...args);
}
async _getAll() {
return new Promise(((resolve, reject) => {
this.storage.get(this.storageName, (result => {
chrome.runtime.lastError ? reject(chrome.runtime.lastError) : resolve(this._decode(result[this.storageName]));
}));
}));
}
async _setAll(newOptions) {
return this._log("log", "Saving options", newOptions), new Promise(((resolve, reject) => {
this.storage.set({
[this.storageName]: this._encode(newOptions)
}, (() => {
chrome.runtime.lastError ? reject(chrome.runtime.lastError) : resolve();
}));
}));
}
_encode(options) {
const thinnedOptions = {
...options
};
for (const [key, value] of Object.entries(thinnedOptions)) this.defaults[key] === value && delete thinnedOptions[key];
return this._log("log", "Without the default values", thinnedOptions), lzString.exports.compressToEncodedURIComponent(JSON.stringify(thinnedOptions));
}
_decode(options) {
let decompressed = options;
return "string" == typeof options && (decompressed = JSON.parse(lzString.exports.decompressFromEncodedURIComponent(options))),
{
...this.defaults,
...decompressed
};
}
async _runMigrations(migrations) {
if (0 === migrations.length || !_webextDetectPage.isBackground() || !await async function() {
return new Promise((resolve => {
const callback = installType => {
"development" !== installType ? (chrome.runtime.onInstalled.addListener((() => {
resolve(!0);
})), setTimeout(resolve, 500, !1)) : resolve(!0);
};
chrome.management?.getSelf ? chrome.management.getSelf((({installType: installType}) => {
callback(installType);
})) : callback("unknown");
}));
}()) return;
const options = await this._getAll(), initial = JSON.stringify(options);
this._log("log", "Found these stored options", {
...options
}), this._log("info", "Will run", migrations.length, 1 === migrations.length ? "migration" : " migrations");
for (const migrate of migrations) migrate(options, this.defaults);
initial !== JSON.stringify(options) && await this._setAll(options);
}
async _handleFormInput({target: target}) {
const field = target;
field.name && (await this.set(this._parseForm(field.form)), field.form.dispatchEvent(new CustomEvent("options-sync:form-synced", {
bubbles: !0
})));
}
_handleFormSubmit(event) {
event.preventDefault();
}
_updateForm(form, options) {
const currentFormState = this._parseForm(form);
for (const [key, value] of Object.entries(options)) currentFormState[key] === value && delete options[key];
const include = Object.keys(options);
include.length > 0 && deserialize(form, options, {
include: include
});
}
_parseForm(form) {
const include = [];
for (const field of form.querySelectorAll("[name]")) field.validity.valid && !field.disabled && include.push(field.name.replace(/\[.*]/, ""));
return serialize(form, {
include: include
});
}
_handleStorageChangeOnForm(changes, areaName) {
areaName !== this.storageType || !changes[this.storageName] || document.hasFocus() && this._form.contains(document.activeElement) || this._updateForm(this._form, this._decode(changes[this.storageName].newValue));
}
}
Object.defineProperty(OptionsSync, "migrations", {
enumerable: !0,
configurable: !0,
writable: !0,
value: {
removeUnused(options, defaults) {
for (const key of Object.keys(options)) key in defaults || delete options[key];
}
}
});
}, {
"webext-detect-page": "9ZOqF",
"@parcel/transformer-js/src/esmodule-helpers.js": "an6EU"
} ],
"9ZOqF": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "disableWebextDetectPageCache", (() => disableWebextDetectPageCache)),
parcelHelpers.export(exports, "isWebPage", (() => isWebPage)), parcelHelpers.export(exports, "isExtensionContext", (() => isExtensionContext)),
parcelHelpers.export(exports, "isContentScript", (() => isContentScript)), parcelHelpers.export(exports, "isBackground", (() => isBackground)),
parcelHelpers.export(exports, "isBackgroundPage", (() => isBackgroundPage)), parcelHelpers.export(exports, "isBackgroundWorker", (() => isBackgroundWorker)),
parcelHelpers.export(exports, "isOptionsPage", (() => isOptionsPage)), parcelHelpers.export(exports, "isDevToolsPage", (() => isDevToolsPage)),
parcelHelpers.export(exports, "isFirefox", (() => isFirefox)), parcelHelpers.export(exports, "isChrome", (() => isChrome)),
parcelHelpers.export(exports, "isSafari", (() => isSafari)), parcelHelpers.export(exports, "contextNames", (() => contextNames)),
parcelHelpers.export(exports, "getContextName", (() => getContextName));
let cache = !0;
function disableWebextDetectPageCache() {
cache = !1;
}
function isCurrentPathname(path) {
if (!path) return !1;
try {
const {pathname: pathname} = new URL(path, location.origin);
return pathname === location.pathname;
} catch {
return !1;
}
}
function getManifest(_version) {
return globalThis.chrome?.runtime?.getManifest?.();
}
function once(function_) {
let result;
return () => (cache && void 0 !== result || (result = function_()), result);
}
const isWebPage = once((() => globalThis.location?.protocol.startsWith("http"))), isExtensionContext = once((() => "object" == typeof globalThis.chrome?.extension)), isContentScript = once((() => isExtensionContext() && isWebPage())), isBackground = () => isBackgroundPage() || isBackgroundWorker(), isBackgroundPage = once((() => {
const manifest = getManifest();
return !(!manifest || !isCurrentPathname(manifest.background_page || manifest.background?.page)) || Boolean(manifest?.background?.scripts && isCurrentPathname("/_generated_background_page.html"));
})), isBackgroundWorker = once((() => isCurrentPathname(getManifest()?.background?.service_worker))), isOptionsPage = once((() => {
if (!isExtensionContext() || !chrome.runtime.getManifest) return !1;
const {options_ui: optionsUi} = chrome.runtime.getManifest();
if ("string" != typeof optionsUi?.page) return !1;
return new URL(optionsUi.page, location.origin).pathname === location.pathname;
})), isDevToolsPage = once((() => {
if (!isExtensionContext() || !chrome.devtools) return !1;
const {devtools_page: devtoolsPage} = chrome.runtime.getManifest();
if ("string" != typeof devtoolsPage) return !1;
return new URL(devtoolsPage, location.origin).pathname === location.pathname;
})), isFirefox = () => globalThis.navigator?.userAgent.includes("Firefox"), isChrome = () => globalThis.navigator?.userAgent.includes("Chrome"), isSafari = () => !isChrome() && globalThis.navigator?.userAgent.includes("Safari"), contextNames = {
contentScript: isContentScript,
background: isBackground,
options: isOptionsPage,
devToolsPage: isDevToolsPage,
extension: isExtensionContext,
web: isWebPage
};
function getContextName() {
for (const [name, test] of Object.entries(contextNames)) if (test()) return name;
return "unknown";
}
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "an6EU"
} ],
an6EU: [ function(require, module, exports) {
exports.interopDefault = function(a) {
return a && a.__esModule ? a : {
default: a
};
}, exports.defineInteropFlag = function(a) {
Object.defineProperty(a, "__esModule", {
value: !0
});
}, exports.exportAll = function(source, dest) {
return Object.keys(source).forEach((function(key) {
"default" === key || "__esModule" === key || dest.hasOwnProperty(key) || Object.defineProperty(dest, key, {
enumerable: !0,
get: function() {
return source[key];
}
});
})), dest;
}, exports.export = function(dest, destName, get) {
Object.defineProperty(dest, destName, {
enumerable: !0,
get: get
});
};
}, {} ],
"2AAva": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "allowSubdomainsFrom", (() => allowSubdomainsFrom)),
parcelHelpers.export(exports, "whitelistDomains", (() => whitelistDomains));
const allowSubdomainsFrom = [ ".wikidata.org", ".roam.garden", ".allennlp.org", ".archive.org", ".archiveteam.org", ".bandcamp.com", ".eleuther.ai", ".fandom.com", ".github.io", ".givewell.org", ".greenspun.com", ".humanprogress.org", ".imagemagick.org", ".mementoweb.org", ".metafilter.com", ".nomeata.de", ".obormot.net", ".tumblr.com", ".xkcd.com", ".wikipedia.org", ".wordpress.com", ".blogspot.com" ], whitelistDomains = [ "manifold.markets", "1dollarscan.com", "80000hours.org", "abandonedfootnotes.blogspot.com", "academic.oup.com", "academic.oup.com", "academictorrents.com", "ageing.oxfordjournals.org", "ai.googleblog.com", "aje.oxfordjournals.org", "apenwarr.ca", "archive.org", "archive.ph", "archivebox.io", "bam-dataset.org", "bam.kalzumeus.com", "beepb00p.xyz", "bellard.org", "blog.beeminder.com", "blog.google.com", "blog.otoro.net", "blog.pinboard.in", "blogs.nvidia.com", "bmk.sh", "boingboing.net", "camelcamelcamel.com", "cat-unbound.org", "causal-effects.com", "citeseerx.ist.psu.edu", "clinicaltrials.gov", "conifer.rhizome.org", "cran.r-project.org", "ctan.org", "danluu.com", "danwang.co", "distill.pub", "docs.google.com", "duckduckgo.com", "dwarffortresswiki.org", "en.bitcoin.it", "en.touhouwiki.net", "en.wikibooks.org", "en.wikichip.org", "en.wikifur.com", "en.wikiquote.org", "en.wikisource.org", "en.wiktionary.org", "equilibriabook.com", "eurekamaga.com", "everything2.com", "explorabl.es", "feeds.feedburner.com", "files.eric.ed.gov", "forum.effectivealtruism.org", "forum.evageeks.org", "foundation.wikimedia.org", "fullfrontal.moe", "greaterwrong.com", "guzey.com", "idlewords.com", "iqcomparisonsite.com", "jamanetwork.com", "jasoncrawford.org", "jtoomim.org", "kalzumeus.com", "keras.io", "kill-the-newsletter.com", "kk.org", "knightcolumbia.org", "ledge-cli.org", "lesswrong.com", "libgen.rs", "library.bz", "marginalrevolution.com", "mattlakeman.org", "mc-stan.org", "meta.wikimedia.org", "michaelnielsen.org", "ncase.me", "nintil.com", "norvig.com", "notes.pinboard.in", "numinous.productions", "nymag.com", "openai.com", "ourworldindata.org", "pandoc.org", "papers.ssrn.com", "parametric.press", "patrickcollison.com", "pdfs.semanticscholar.org", "personalitytest.net", "philpapers.org", "pinboard.in", "plato.stanford.edu", "playground.tensorflow.org", "popcon.ubuntu.com", "press.etc.cmu.edu", "progressstudies.school", "psychcentral.com", "publicdomainreview.org", "publishing.cdlib.org", "qntm.org", "quantum.country", "qwantz.com", "racket-lang.org", "rationality.org", "rdiff-backup.net", "ricon.dev", "rootsofprogress.org", "row1.ca", "safebooru.org", "scholars-stage.org", "sciencebasedmedicine.org", "sevensecularsermons.org", "shiny.app", "sifter.org", "slatestarcodex.com", "spreadsheets.google.com", "statmodeling.stat.columbia.edu", "stats.grok.se", "text.npr.org", "thefirstaibook.com", "thisanimedoesnotexist.ai", "thiscatdoesnotexist.com", "thisrentaldoesnotexist.com", "training.kalzumeus.com", "unsongbook.com", "upload.wikimedia.org", "vast.ai", "videolectures.net", "wayback.archive-it.org", "web.archive.org", "wiki.evageeks.org", "wiki.haskell.org", "www.aleph.se", "www.antipope.org", "www.archive-it.org", "www.barnesandnoble.com", "www.buzzricksons.jp", "www.cdc.gov", "www.cogmed.com", "www.cogtest.com", "www.cram.com", "www.cryonicscalculator.com", "www.cylab.cmu.edu", "www.dafont.com", "www.davidsongifted.org", "www.deeplearningbook.org", "www.discoverbooks.com", "www.doc88.com", "www.drmaciver.com", "www.e-codices.unifr.ch", "www.ecologyandsociety.org", "www.econlib.org", "www.economist.com", "www.econtalk.org", "www.equator-network.org", "www.equestriadaily.com", "www.evamonkey.com", "www.filfre.net", "www.find-more-books.com", "www.frontiersin.org", "www.genetics.org", "www.gizmodo.com.au", "www.gnxp.com", "www.google-melange.com", "www.greaterwrong.com", "www.gutenberg.org", "www.haskell.org", "www.hpmor.com", "www.html-tidy.org", "www.iarpa.gov", "www.iqtest.com", "www.joelonsoftware.com", "www.johndcook.com", "www.kalzumeus.com", "www.lesswrong.com", "www.librarything.com", "www.mail-archive.com", "www.mediawiki.org", "www.metafor-project.org", "www.motherjones.com", "www.ncbi.nlm.nih.gov", "www.npr.org", "www.ohyouprettythings.com", "www.overcomingbias.com", "www.poetryfoundation.org", "www.proquest.com", "www.psychiatryinvestigation.org", "www.r-bloggers.com", "www.rdocumentation.org", "www.ribbonfarm.com", "www.rifters.com", "www.sapa-project.org", "www.schneier.com", "www.sciencedirect.com", "www.sciencenews.org", "www.sciencenewsline.com", "www.shawwn.com", "www.simplify.so", "www.snpedia.com", "www.stat.columbia.edu", "www.stat.columbia.edu", "www.straighttalkonevidence.org", "www.tarsnap.com", "www.theatlantic.com", "www.theindiaforum.in", "www.theparisreview.org", "www.thisfursonadoesnotexist.com", "www.thispersondoesnotexist.com", "www.thiswaifudoesnotexist.net", "www.thisworddoesnotexist.com", "www.thriftbooks.com", "www.urbandictionary.com", "www.vanityfair.com", "www.vocativ.com", "www.w3.org", "www.washingtonpost.com", "www.whichfaceisreal.com", "www.winehq.org", "www.wolfewiki.com", "www.wsj.com", "www.yalelawjournal.org", "www.youtube.com", "xkcd.com", "xtools.wmflabs.org", "mail.haskell.org", "hackage.haskell.org", "online.wsj.com", "www.microsoft.com", "intelligence.org", "eprint.iacr.org", "www.explainxkcd.com", "www.silverhandmeadery.com", "www.nickbostrom.com", "well.blogs.nytimes.com", "www.gwern.net", "rjlipton.wordpress.com", "jaspervdj.be", "jama.jamanetwork.com", "blog.codinghorror.com", "aiimpacts.org", "web.archive.org", "www.fhi.ox.ac.uk", "www.cjas.org", "blog.google", "archinte.jamanetwork.com", "aclanthology.org", "www.clinicaltrials.gov", "proceedings.mlr.press", "diff.wikimedia.org", "www.scottaaronson.com", "www.eugenewei.com", "www.alignmentforum.org", "www.wired.com", "www.evaotaku.com", "www.stuff.co.nz", "texample.net", "www.dailymail.co.uk", "www.memteaimports.com", "boards.fireden.net", "webcitation.org", "www.reuters.com", "mail.haskell.org", "gameprogrammingpatterns.com", "digital.library.unt.edu", "www.salon.com", "www.metopera.org", "dnstats.net", "www.thecut.com", "animekritik.wordpress.com", "www.fadedpage.com", "www.dailydot.com", "www.candyjapan.com", "nautil.us", "emilkirkegaard.dk", "www.independent.co.uk", "www.edwardtufte.com", "www.brookings.edu", "www.blockchain.com", "web.stanford.edu", "mitpress.mit.edu", "freakonomics.com", "forums.animesuki.com", "eli.thegreenplace.net", "www.theregister.com", "www.alcor.org", "the-liliquarium.livejournal.com", "socghop.appspot.com", "people.csail.mit.edu", "findarticles.com", "dataprivacylab.org", "blog.23andme.com", "andrewmayneblog.wordpress.com", "www.thefreelibrary.com", "www.sfgate.com", "www.rrauction.com", "www.merkle.com", "www.links.org", "www.bartleby.com", "wavemotioncannon.com", "www.baltimoresun.com", "unenumerated.blogspot.com", "scottaaronson.blog", "rjlipton.wordpress.com", "mason.gmu.edu", "ilovetypography.com", "humanvarieties.org", "googlesystem.blogspot.com", "www.yudkowsky.net", "arr.am", "www.worldcat.org", "www.supermemo.com", "www.standard.co.uk", "www.orlandosentinel.com", "www.nbcnews.com", "www.mercurynews.com", "www.math.uwaterloo.ca", "www.jefftk.com", "www.gq.com", "www.businessweek.com", "www.austlii.edu.au", "www.aiweirdness.com", "w.atwiki.jp", "vitalik.ca", "unqualified-reservations.blogspot.com", "thegrandnarrative.com", "sre.google", "signalvnoise.com", "shkspr.mobi", "qualiacomputing.com", "penelope.uchicago.edu", "parahumans.wordpress.com", "palladiummag.com", "packdeps.haskellers.com", "ohtori.nu", "my.vanderbilt.edu", "mathworld.wolfram.com", "magenta.tensorflow.org", "infoproc.blogspot.com", "highnoongmt.wordpress.com", "googleprojectzero.blogspot.com", "forum.quantifiedself.com", "foreignpolicy.com", "engineering.fb.com", "cdn.openai.com", "cdn.discordapp.com", "blog.acolyer.org", "web.archive.org", "articles.latimes.com", "alumni.media.mit.edu", "agtb.wordpress.com", "zlkj.in", "www.wakapoetry.net", "www.vetta.org", "www.unz.com", "www.unicode.org", "www.unc.edu", "www.tor.com", "www.tomodachi.de", "www.thestranger.com", "www.the-scientist.com", "www.tabletmag.com", "www.syracuse.com", "www.sun-modalert.com", "www.spiegel.de", "www.sankakucomplex.com", "www.sacbee.com", "www.rwagner.net", "www.richardcarrier.info", "www.rationaloptimist.com", "www.pragmatic.ml", "www.popsci.com", "www.owenstephens.co.uk", "www.nydailynews.com", "www.oregonlive.com", "www.miamiherald.com", "www.lrb.co.uk", "www.livestrong.com", "www.karger.com", "www.japansociety.org", "www.japaninc.com", "www.grandforksherald.com", "www.genealogy.math.ndsu.nodak.edu", "www.gawker.com", "www.fathomevents.com", "www.dartmouth.edu", "www.culhwch.info", "www.cs.virginia.edu", "www.cnn.com", "www.chicagotribune.com", "www.cbsnews.com", "www.bemmu.com", "www.4nrx-uk.md", "warontherocks.com", "venturebeat.com", "time.com", "threadreaderapp.com", "thelastpsychiatrist.com", "taooftea.com", "takimag.com", "synapse.koreamed.org", "stratechery.com", "srconstantin.wordpress.com", "spikejapan.wordpress.com", "soranews24.com", "senrigan.io", "retractionwatch.com", "replicationindex.com", "queue.acm.org", "phys.org", "originstamp.com", "opinionator.blogs.nytimes.com", "okmij.org", "web.archive.org", "web.archive.org", "newcriterion.com", "neurosciencenews.com", "my.pgp-hms.org", "meteuphoric.com", "meehl.umn.edu", "mathshistory.st-andrews.ac.uk", "longtermrisk.org", "jtauber.com", "journal.stuffwithstuff.com", "ideas.repec.org", "harpers.org", "hapgood.us", "googleblog.blogspot.com", "globalguerrillas.typepad.com", "felinegenetics.missouri.edu", "eva-fan.com", "esolangs.org", "eileenormsby.com", "diyhpl.us", "egamebook.com", "donsbot.com", "cs.stanford.edu", "crookedtimber.org", "care.diabetesjournals.org", "caniuse.com", "bldgblog.com", "betabeat.com", "www.chinadaily.com.cn", "googlesystem.blogspot.com", "paulfchristiano.com", "people.csail.mit.edu", "quantifiedself.com", "socghop.appspot.com", "unenumerated.blogspot.com", "web.archive.org", "www.aging-us.com", "www.belfasttelegraph.co.uk", "www.benkuhn.net", "www.bostonglobe.com", "www.brainpreservation.org", "www.bu.edu", "www.c82.net", "www.catalogtree.net", "www.cia.gov", "www.dailymail.co.uk", "www.ft.com", "www.mangaupdates.com", "www.mentalfloss.com", "www.sacbee.com", "www.sankakucomplex.com", "dresdencodak.com", "downloads.haskell.org", "ageofem.com", "ai.google", "aleph.se", "altjapan.typepad.com", "ansuz.sooke.bc.ca", "apnews.com", "arima.cylab.cmu.edu", "bair.berkeley.edu", "behavioralscientist.org", "believermag.com", "bitcoin-otc.com", "bits.blogs.nytimes.com", "blog.8faces.com", "blog.cr.yp.to", "blog.csdn.net", "blog.ethereum.org", "blog.nuclearsecrecy.com", "blog.youtube", "blogs.wsj.com", "cacm.acm.org", "carbonplan.org", "casual-effects.com", "cognitivemedium.com", "commons.wikimedia.org", "courses.csail.mit.edu", "daniellakens.blogspot.com", "data.bls.gov", "datacolada.org", "dealbook.nytimes.com", "dialnet.unirioja.es", "dominiccummings.com", "dumps.wikimedia.org", "energycontrol.org", "exac.broadinstitute.org", "familiarcycle.net", "fras.uk", "galois.com", "gamefaqs.gamespot.com", "github.blog", "globalvoices.org", "google-summer-of-code-2009-haskell.googlecode.com", "gradientscience.org", "gutenberg.net.au", "handbook-5-1.cochrane.org", "healthland.time.com", "hub.darcs.net", "iforcedabot.com", "inhumanexperiment.blogspot.com", "isomerdesign.com", "jessegalef.com", "justgetflux.com", "komonews.com", "krebsonsecurity.com", "langsec.org", "latimesblogs.latimes.com", "lettersofnote.com", "lifescivc.com", "lithub.com", "lucumr.pocoo.org", "mako.cc", "neojaponisme.com", "nbc-2.com", "mlg.eng.cam.ac.uk", "minimaxir.com", "milan.cvitkovic.net", "medicalxpress.com", "www.collectorsweekly.com", "www.cato-unbound.org", "www.alexirpan.com", "www.alessonislearned.com", "www.adelaidenow.com.au", "www.abcb.com", "writings.stephenwolfram.com", "writeswith.com", "wikimediafoundation.org", "washingtonmonthly.com", "trixter.oldskool.org", "tools.wmflabs.org", "tomcritchlow.com", "thehardestscience.com", "strategy.wikimedia.org", "spp.fas.org", "sociologicalscience.com", "socialsciences.mcmaster.ca", "sf-encyclopedia.com", "search.wikileaks.org", "schoolgirlmilkycrisis.com", "scarybeastsecurity.blogspot.com", "reflectivedisequilibrium.blogspot.com", "readwrite.com", "quillette.com", "psychonautwiki.org", "psych.hanover.edu", "programme.exordo.com", "politicalcalculations.blogspot.com", "pharmacyreviewer.co", "petertodd.org", "pediatrics.aappublications.org", "pages.jh.edu", "orionmagazine.org", "nyaa.si", "nootropicsdepot.com", "ngm.nationalgeographic.com", "thebaffler.com", "svilentodorov.xyz", "www.computerworld.com", "vinoshipper.com", "www.mcall.com", "www.latimes.com", "www.koreatimes.co.kr", "www.kooslooijesteijn.net", "www.khara.co.jp", "www.justinpinkney.com", "www.johnsonessays.com", "www.inkandswitch.com", "www.independent.ie", "www.incompleteideas.net", "www.hsx.com", "www.heraldsun.com.au", "www.harrowell.org.uk", "www.globalsecurity.org", "www.ghibli.jp", "www.galbithink.org", "www.fast.ai", "www.evacommentary.org", "www.discoverteas.com", "www.depauw.edu", "www.deseret.com", "www.davidbrin.com", "www.davidbordwell.net", "www.dagbladet.no", "www.daemonology.net", "www.cs.odu.edu", "www.cs.dartmouth.edu", "www.couriermail.com.au", "www.hbs.edu", "www.infranken.de", "www.pelleas.net", "www.pewresearch.org", "www.pcmag.com", "www.oricon.co.jp", "www.nyaa.eu", "www.nps.gov", "www.nplusonemag.com", "www.noisebridge.net", "www.nextplatform.com", "www.nextbigfuture.com", "www.newstatesman.com", "www.newsday.com", "www.metzdowd.com", "www.zeit.de", "www.webmd.com", "www.usnews.com", "www.uk-anime.net", "www.tranquiltuesdays.com", "www.thesmokinggun.com", "www.scienceagogo.com", "www.scielo.br", "www.rxshop.md", "www.righto.com", "www.project-imas.com", "www.wired.co.uk", "www.talyarkoni.org", "www.statnews.com", "www.sleep-journal.com", "www.slate.com", "www.sjsu.edu", "www.sirlin.net", "www.shawlocal.com", "www.sciencemadness.org", "abcnews.go.com", "www.washingtontimes.com", "abcnotation.com", "www.princeton.edu", "r6.ca", "www.technologyreview.com", "www.ncbi.nlm.nih.gov", "retractionwatch.com", "www.dartmouth.edu", "www.cnn.com", "www.yf.io", "www.wtnh.com", "www.writingroutines.com", "www.wheels.org", "www.vesta.earth", "www.uliwestphal.de", "www.ubu.com", "www.tt-forums.net", "www.trubrain.com", "www.trentonbricken.com", "www.tomshardware.com", "www.themtank.org", "www.thedenverchannel.com", "www.systutorials.com", "www.sumsar.net", "www.stripes.com", "www.ssc.wisc.edu", "www.sqlite.org", "www.spring.org.uk", "www.spiked-online.com", "www.siliconera.com", "www.rosebud.ai", "www.reg.ru", "www.punchlinedesign.net", "www.prolific.co", "www.politico.com", "www.orbuch.com", "www.nationalgeographic.com", "www.microdose.me", "www.lifeview.com", "www.lehighvalleylive.com", "www.ledger-cli.org", "www.jdmoyer.com", "www.jamesfadiman.com", "www.itmedia.co.jp", "www.intechopen.com", "www.freakonomicsexperiments.com", "www.eduref.net", "www.coderelay.io", "www.cleveland.com", "www.chrisstucchio.com", "www.chrisplaysgames.com", "www.broadinstitute.org", "www.becker-posner-blog.com", "www.artnome.com", "www.andzuck.com", "www.allencheng.com", "www.alicemaz.com", "www.adamsmith.org", "www.aboutamazon.com", "www-cs-faculty.stanford.edu", "wiki.lesswrong.com", "whyevolutionistrue.com", "web.media.mit.edu", "vfxblog.com", "vdfresearch.org", "vastabrupt.com", "vasilishynkarenka.com", "tug.org", "tosche.net", "thoughtcrime.crummy.com", "thiseyedoesnotexist.com", "thenewstatistics.com", "thebrowser.com", "the-toast.net", "teageegeepea.tripod.com", "stevenson.lab.uconn.edu", "stephenmalina.com", "status451.com", "stackroboflow.com", "slimemoldtimemold.com", "seths.blog", "scientistatwork.blogs.nytimes.com", "sciencebulletin.org", "science.ksc.nasa.gov", "samoburja.com", "ruder.io", "read-the-samples.netlify.app", "quadrant.org.au", "pytorch.org", "pudding.cool", "projects.tampabay.com", "projects.jsonline.com", "poets.org", "poemanalysis.com", "personal.math.ubc.ca", "people.idsia.ch", "people.com", "oscarbonilla.com", "orwell.ru", "opensource.adobe.com", "ooo.ghostbows.ooo", "news.nationalgeographic.com", "mssv.net", "mosaicscience.com", "ml.berkeley.edu", "mkv25.net", "mathbabe.org", "mailchi.mp", "magazine.atavist.com", "longitudinal.blog", "littlebiggy.org", "lavaan.ugent.be", "larryniven.net", "laion.ai", "kojimars.at.webry.info", "kevinlynagh.com", "kev.town", "kajsotala.fi", "journals.biologists.com", "beza1e1.tuxen.de", "web.archive.org", "www.pcworld.com", "www.unqualified-reservations.org", "evaotaku.com", "forre.st", "mikepower.pressfolios.com", "www.coyneoftherealm.com", "wiki.openttdcoop.org", "quinndunki.com", "learning.mpi-sws.org", "jov.arvojournals.org", "jakewestfall.org", "e2eml.school", "defector.com", "davidepstein.com", "corpgov.law.harvard.edu", "copilot.github.com", "constancecrozier.com", "complearn.org", "compdemocracy.org", "catonmat.net", "calhoun.nps.edu", "bwc.thelab.dc.gov", "blog.thinkst.com", "blog.regehr.org", "blog.cryptographyengineering.com", "b-ok.cc", "archive.seattletimes.com", "architext.design", "andymatuschak.org", "alexanderetz.com", "advertising-effects.chicagobooth.edu", "about.google", "6thfloor.blogs.nytimes.com", "www2.biology.ualberta.ca", "www.wesjones.com", "www.urbandharma.org", "www.tlmc.eu", "www.rfreitas.com", "www.moserware.com", "ew.com", "examples.yourdictionary.com", "fs.blog", "freedomdefined.org", "fibery.io", "fastmoe.ai", "joshmitteldorf.scienceblog.com", "jonmillward.com", "johncwright.livejournal.com", "joa.sh", "jgeekstudies.org", "jdlm.info", "jaypsong.blog", "jax.readthedocs.io", "jamesyu.org", "image-net.org", "ifdo.ca", "historycooperative.org", "herbsutter.com", "hdsr.mitpress.mit.edu", "hakaimagazine.com", "gutenberg.ca", "gpt3demo.com", "gondwanaland.com", "gaotianyu.xyz", "futurism.com", "extras.denverpost.com", "eurekamag.com", "eukaryotewritesblog.com", "etienne.se", "endlessvn.io", "statmodeling.stat.columbia.edu", "archive.nytimes.com", "www.michaellight.net", "www.otakustudy.com", "www.baka-tsuki.org", "story.californiasunday.com", "thispersondoesnotexist.com", "metropolitician.blogs.com", "pauillac.inria.fr", "asktog.com", "www.unf.edu" ];
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "an6EU"
} ],
evG41: [ function(require, module, exports) {
var factory;
"undefined" != typeof globalThis ? globalThis : "undefined" != typeof self && self,
factory = function(module) {
"use strict";
if ("object" != typeof globalThis || "object" != typeof chrome || !chrome || !chrome.runtime || !chrome.runtime.id) throw new Error("This script should only be loaded in a browser extension.");
if (void 0 === globalThis.browser || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) {
const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.", SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)", wrapAPIs = extensionAPIs => {
const apiMetadata = {
alarms: {
clear: {
minArgs: 0,
maxArgs: 1
},
clearAll: {
minArgs: 0,
maxArgs: 0
},
get: {
minArgs: 0,
maxArgs: 1
},
getAll: {
minArgs: 0,
maxArgs: 0
}
},
bookmarks: {
create: {
minArgs: 1,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 1
},
getChildren: {
minArgs: 1,
maxArgs: 1
},
getRecent: {
minArgs: 1,
maxArgs: 1
},
getSubTree: {
minArgs: 1,
maxArgs: 1
},
getTree: {
minArgs: 0,
maxArgs: 0
},
move: {
minArgs: 2,
maxArgs: 2
},
remove: {
minArgs: 1,
maxArgs: 1
},
removeTree: {
minArgs: 1,
maxArgs: 1
},
search: {
minArgs: 1,
maxArgs: 1
},
update: {
minArgs: 2,
maxArgs: 2
}
},
browserAction: {
disable: {
minArgs: 0,
maxArgs: 1,
fallbackToNoCallback: !0
},
enable: {
minArgs: 0,
maxArgs: 1,
fallbackToNoCallback: !0
},
getBadgeBackgroundColor: {
minArgs: 1,
maxArgs: 1
},
getBadgeText: {
minArgs: 1,
maxArgs: 1
},
getPopup: {
minArgs: 1,
maxArgs: 1
},
getTitle: {
minArgs: 1,
maxArgs: 1
},
openPopup: {
minArgs: 0,
maxArgs: 0
},
setBadgeBackgroundColor: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setBadgeText: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setIcon: {
minArgs: 1,
maxArgs: 1
},
setPopup: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setTitle: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
}
},
browsingData: {
remove: {
minArgs: 2,
maxArgs: 2
},
removeCache: {
minArgs: 1,
maxArgs: 1
},
removeCookies: {
minArgs: 1,
maxArgs: 1
},
removeDownloads: {
minArgs: 1,
maxArgs: 1
},
removeFormData: {
minArgs: 1,
maxArgs: 1
},
removeHistory: {
minArgs: 1,
maxArgs: 1
},
removeLocalStorage: {
minArgs: 1,
maxArgs: 1
},
removePasswords: {
minArgs: 1,
maxArgs: 1
},
removePluginData: {
minArgs: 1,
maxArgs: 1
},
settings: {
minArgs: 0,
maxArgs: 0
}
},
commands: {
getAll: {
minArgs: 0,
maxArgs: 0
}
},
contextMenus: {
remove: {
minArgs: 1,
maxArgs: 1
},
removeAll: {
minArgs: 0,
maxArgs: 0
},
update: {
minArgs: 2,
maxArgs: 2
}
},
cookies: {
get: {
minArgs: 1,
maxArgs: 1
},
getAll: {
minArgs: 1,
maxArgs: 1
},
getAllCookieStores: {
minArgs: 0,
maxArgs: 0
},
remove: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
},
devtools: {
inspectedWindow: {
eval: {
minArgs: 1,
maxArgs: 2,
singleCallbackArg: !1
}
},
panels: {
create: {
minArgs: 3,
maxArgs: 3,
singleCallbackArg: !0
},
elements: {
createSidebarPane: {
minArgs: 1,
maxArgs: 1
}
}
}
},
downloads: {
cancel: {
minArgs: 1,
maxArgs: 1
},
download: {
minArgs: 1,
maxArgs: 1
},
erase: {
minArgs: 1,
maxArgs: 1
},
getFileIcon: {
minArgs: 1,
maxArgs: 2
},
open: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
pause: {
minArgs: 1,
maxArgs: 1
},
removeFile: {
minArgs: 1,
maxArgs: 1
},
resume: {
minArgs: 1,
maxArgs: 1
},
search: {
minArgs: 1,
maxArgs: 1
},
show: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
}
},
extension: {
isAllowedFileSchemeAccess: {
minArgs: 0,
maxArgs: 0
},
isAllowedIncognitoAccess: {
minArgs: 0,
maxArgs: 0
}
},
history: {
addUrl: {
minArgs: 1,
maxArgs: 1
},
deleteAll: {
minArgs: 0,
maxArgs: 0
},
deleteRange: {
minArgs: 1,
maxArgs: 1
},
deleteUrl: {
minArgs: 1,
maxArgs: 1
},
getVisits: {
minArgs: 1,
maxArgs: 1
},
search: {
minArgs: 1,
maxArgs: 1
}
},
i18n: {
detectLanguage: {
minArgs: 1,
maxArgs: 1
},
getAcceptLanguages: {
minArgs: 0,
maxArgs: 0
}
},
identity: {
launchWebAuthFlow: {
minArgs: 1,
maxArgs: 1
}
},
idle: {
queryState: {
minArgs: 1,
maxArgs: 1
}
},
management: {
get: {
minArgs: 1,
maxArgs: 1
},
getAll: {
minArgs: 0,
maxArgs: 0
},
getSelf: {
minArgs: 0,
maxArgs: 0
},
setEnabled: {
minArgs: 2,
maxArgs: 2
},
uninstallSelf: {
minArgs: 0,
maxArgs: 1
}
},
notifications: {
clear: {
minArgs: 1,
maxArgs: 1
},
create: {
minArgs: 1,
maxArgs: 2
},
getAll: {
minArgs: 0,
maxArgs: 0
},
getPermissionLevel: {
minArgs: 0,
maxArgs: 0
},
update: {
minArgs: 2,
maxArgs: 2
}
},
pageAction: {
getPopup: {
minArgs: 1,
maxArgs: 1
},
getTitle: {
minArgs: 1,
maxArgs: 1
},
hide: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setIcon: {
minArgs: 1,
maxArgs: 1
},
setPopup: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setTitle: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
show: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
}
},
permissions: {
contains: {
minArgs: 1,
maxArgs: 1
},
getAll: {
minArgs: 0,
maxArgs: 0
},
remove: {
minArgs: 1,
maxArgs: 1
},
request: {
minArgs: 1,
maxArgs: 1
}
},
runtime: {
getBackgroundPage: {
minArgs: 0,
maxArgs: 0
},
getPlatformInfo: {
minArgs: 0,
maxArgs: 0
},
openOptionsPage: {
minArgs: 0,
maxArgs: 0
},
requestUpdateCheck: {
minArgs: 0,
maxArgs: 0
},
sendMessage: {
minArgs: 1,
maxArgs: 3
},
sendNativeMessage: {
minArgs: 2,
maxArgs: 2
},
setUninstallURL: {
minArgs: 1,
maxArgs: 1
}
},
sessions: {
getDevices: {
minArgs: 0,
maxArgs: 1
},
getRecentlyClosed: {
minArgs: 0,
maxArgs: 1
},
restore: {
minArgs: 0,
maxArgs: 1
}
},
storage: {
local: {
clear: {
minArgs: 0,
maxArgs: 0
},
get: {
minArgs: 0,
maxArgs: 1
},
getBytesInUse: {
minArgs: 0,
maxArgs: 1
},
remove: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
},
managed: {
get: {
minArgs: 0,
maxArgs: 1
},
getBytesInUse: {
minArgs: 0,
maxArgs: 1
}
},
sync: {
clear: {
minArgs: 0,
maxArgs: 0
},
get: {
minArgs: 0,
maxArgs: 1
},
getBytesInUse: {
minArgs: 0,
maxArgs: 1
},
remove: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
}
},
tabs: {
captureVisibleTab: {
minArgs: 0,
maxArgs: 2
},
create: {
minArgs: 1,
maxArgs: 1
},
detectLanguage: {
minArgs: 0,
maxArgs: 1
},
discard: {
minArgs: 0,
maxArgs: 1
},
duplicate: {
minArgs: 1,
maxArgs: 1
},
executeScript: {
minArgs: 1,
maxArgs: 2
},
get: {
minArgs: 1,
maxArgs: 1
},
getCurrent: {
minArgs: 0,
maxArgs: 0
},
getZoom: {
minArgs: 0,
maxArgs: 1
},
getZoomSettings: {
minArgs: 0,
maxArgs: 1
},
goBack: {
minArgs: 0,
maxArgs: 1
},
goForward: {
minArgs: 0,
maxArgs: 1
},
highlight: {
minArgs: 1,
maxArgs: 1
},
insertCSS: {
minArgs: 1,
maxArgs: 2
},
move: {
minArgs: 2,
maxArgs: 2
},
query: {
minArgs: 1,
maxArgs: 1
},
reload: {
minArgs: 0,
maxArgs: 2
},
remove: {
minArgs: 1,
maxArgs: 1
},
removeCSS: {
minArgs: 1,
maxArgs: 2
},
sendMessage: {
minArgs: 2,
maxArgs: 3
},
setZoom: {
minArgs: 1,
maxArgs: 2
},
setZoomSettings: {
minArgs: 1,
maxArgs: 2
},
update: {
minArgs: 1,
maxArgs: 2
}
},
topSites: {
get: {
minArgs: 0,
maxArgs: 0
}
},
webNavigation: {
getAllFrames: {
minArgs: 1,
maxArgs: 1
},
getFrame: {
minArgs: 1,
maxArgs: 1
}
},
webRequest: {
handlerBehaviorChanged: {
minArgs: 0,
maxArgs: 0
}
},
windows: {
create: {
minArgs: 0,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 2
},
getAll: {
minArgs: 0,
maxArgs: 1
},
getCurrent: {
minArgs: 0,
maxArgs: 1
},
getLastFocused: {
minArgs: 0,
maxArgs: 1
},
remove: {
minArgs: 1,
maxArgs: 1
},
update: {
minArgs: 2,
maxArgs: 2
}
}
};
if (0 === Object.keys(apiMetadata).length) throw new Error("api-metadata.json has not been included in browser-polyfill");
class DefaultWeakMap extends WeakMap {
constructor(createItem, items) {
super(items), this.createItem = createItem;
}
get(key) {
return this.has(key) || this.set(key, this.createItem(key)), super.get(key);
}
}
const makeCallback = (promise, metadata) => (...callbackArgs) => {
extensionAPIs.runtime.lastError ? promise.reject(new Error(extensionAPIs.runtime.lastError.message)) : metadata.singleCallbackArg || callbackArgs.length <= 1 && !1 !== metadata.singleCallbackArg ? promise.resolve(callbackArgs[0]) : promise.resolve(callbackArgs);
}, pluralizeArguments = numArgs => 1 == numArgs ? "argument" : "arguments", wrapMethod = (target, method, wrapper) => new Proxy(method, {
apply: (targetMethod, thisObj, args) => wrapper.call(thisObj, target, ...args)
});
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
const wrapObject = (target, wrappers = {}, metadata = {}) => {
let cache = Object.create(null), handlers = {
has: (proxyTarget, prop) => prop in target || prop in cache,
get(proxyTarget, prop, receiver) {
if (prop in cache) return cache[prop];
if (!(prop in target)) return;
let value1 = target[prop];
if ("function" == typeof value1) if ("function" == typeof wrappers[prop]) value1 = wrapMethod(target, target[prop], wrappers[prop]); else if (hasOwnProperty(metadata, prop)) {
let wrapper = ((name, metadata) => function(target, ...args) {
if (args.length < metadata.minArgs) throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
if (args.length > metadata.maxArgs) throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
return new Promise(((resolve, reject) => {
if (metadata.fallbackToNoCallback) try {
target[name](...args, makeCallback({
resolve: resolve,
reject: reject
}, metadata));
} catch (cbError) {
console.warn(`${name} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `, cbError),
target[name](...args), metadata.fallbackToNoCallback = !1, metadata.noCallback = !0,
resolve();
} else metadata.noCallback ? (target[name](...args), resolve()) : target[name](...args, makeCallback({
resolve: resolve,
reject: reject
}, metadata));
}));
})(prop, metadata[prop]);
value1 = wrapMethod(target, target[prop], wrapper);
} else value1 = value1.bind(target); else if ("object" == typeof value1 && null !== value1 && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) value1 = wrapObject(value1, wrappers[prop], metadata[prop]); else {
if (!hasOwnProperty(metadata, "*")) return Object.defineProperty(cache, prop, {
configurable: !0,
enumerable: !0,
get: () => target[prop],
set(value) {
target[prop] = value;
}
}), value1;
value1 = wrapObject(value1, wrappers[prop], metadata["*"]);
}
return cache[prop] = value1, value1;
},
set: (proxyTarget, prop, value, receiver) => (prop in cache ? cache[prop] = value : target[prop] = value,
!0),
defineProperty: (proxyTarget, prop, desc) => Reflect.defineProperty(cache, prop, desc),
deleteProperty: (proxyTarget, prop) => Reflect.deleteProperty(cache, prop)
}, proxyTarget = Object.create(target);
return new Proxy(proxyTarget, handlers);
}, wrapEvent = wrapperMap => ({
addListener(target, listener, ...args) {
target.addListener(wrapperMap.get(listener), ...args);
},
hasListener: (target, listener) => target.hasListener(wrapperMap.get(listener)),
removeListener(target, listener) {
target.removeListener(wrapperMap.get(listener));
}
}), onRequestFinishedWrappers = new DefaultWeakMap((listener => "function" != typeof listener ? listener : function(req) {
const wrappedReq = wrapObject(req, {}, {
getContent: {
minArgs: 0,
maxArgs: 0
}
});
listener(wrappedReq);
}));
let loggedSendResponseDeprecationWarning = !1;
const onMessageWrappers = new DefaultWeakMap((listener => "function" != typeof listener ? listener : function(message1, sender, sendResponse) {
let wrappedSendResponse, result, didCallSendResponse = !1, sendResponsePromise = new Promise((resolve => {
wrappedSendResponse = function(response) {
loggedSendResponseDeprecationWarning || (console.warn(SEND_RESPONSE_DEPRECATION_WARNING, (new Error).stack),
loggedSendResponseDeprecationWarning = !0), didCallSendResponse = !0, resolve(response);
};
}));
try {
result = listener(message1, sender, wrappedSendResponse);
} catch (err1) {
result = Promise.reject(err1);
}
const isResultThenable = !0 !== result && (value = result) && "object" == typeof value && "function" == typeof value.then;
var value;
if (!0 !== result && !isResultThenable && !didCallSendResponse) return !1;
const sendPromisedResult = promise => {
promise.then((msg => {
sendResponse(msg);
}), (error => {
let message;
message = error && (error instanceof Error || "string" == typeof error.message) ? error.message : "An unexpected error occurred",
sendResponse({
__mozWebExtensionPolyfillReject__: !0,
message: message
});
})).catch((err => {
console.error("Failed to send onMessage rejected reply", err);
}));
};
return sendPromisedResult(isResultThenable ? result : sendResponsePromise), !0;
})), wrappedSendMessageCallback = ({reject: reject, resolve: resolve}, reply) => {
extensionAPIs.runtime.lastError ? extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE ? resolve() : reject(new Error(extensionAPIs.runtime.lastError.message)) : reply && reply.__mozWebExtensionPolyfillReject__ ? reject(new Error(reply.message)) : resolve(reply);
}, wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
if (args.length < metadata.minArgs) throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
if (args.length > metadata.maxArgs) throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
return new Promise(((resolve, reject) => {
const wrappedCb = wrappedSendMessageCallback.bind(null, {
resolve: resolve,
reject: reject
});
args.push(wrappedCb), apiNamespaceObj.sendMessage(...args);
}));
}, staticWrappers = {
devtools: {
network: {
onRequestFinished: wrapEvent(onRequestFinishedWrappers)
}
},
runtime: {
onMessage: wrapEvent(onMessageWrappers),
onMessageExternal: wrapEvent(onMessageWrappers),
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 1,
maxArgs: 3
})
},
tabs: {
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 2,
maxArgs: 3
})
}
}, settingMetadata = {
clear: {
minArgs: 1,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
};
return apiMetadata.privacy = {
network: {
"*": settingMetadata
},
services: {
"*": settingMetadata
},
websites: {
"*": settingMetadata
}
}, wrapObject(extensionAPIs, staticWrappers, apiMetadata);
};
module.exports = wrapAPIs(chrome);
} else module.exports = globalThis.browser;
}, "function" == typeof define && define.amd ? define("webextension-polyfill", [ "module" ], factory) : factory(module);
}, {} ]
}, [ "kvVio" ]);
(() => {
var $parcel$global = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : "undefined" != typeof window ? window : "undefined" != typeof global ? global : {}, $parcel$modules = {}, $parcel$inits = {}, parcelRequire = $parcel$global.parcelRequire94c2;
null == parcelRequire && ((parcelRequire = function(id) {
if (id in $parcel$modules) return $parcel$modules[id].exports;
if (id in $parcel$inits) {
var init = $parcel$inits[id];
delete $parcel$inits[id];
var module = {
id: id,
exports: {}
};
return $parcel$modules[id] = module, init.call(module.exports, module, module.exports),
module.exports;
}
var err = new Error("Cannot find module '" + id + "'");
throw err.code = "MODULE_NOT_FOUND", err;
}).register = function(id, init) {
$parcel$inits[id] = init;
}, $parcel$global.parcelRequire94c2 = parcelRequire), parcelRequire.register("6eSS9", (function(module, exports) {
var factory;
"undefined" != typeof globalThis ? globalThis : "undefined" != typeof self && self,
factory = function(module) {
"use strict";
if ("object" != typeof globalThis || "object" != typeof chrome || !chrome || !chrome.runtime || !chrome.runtime.id) throw new Error("This script should only be loaded in a browser extension.");
if (void 0 === globalThis.browser || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) {
const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.", SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)", wrapAPIs = extensionAPIs => {
const apiMetadata = {
alarms: {
clear: {
minArgs: 0,
maxArgs: 1
},
clearAll: {
minArgs: 0,
maxArgs: 0
},
get: {
minArgs: 0,
maxArgs: 1
},
getAll: {
minArgs: 0,
maxArgs: 0
}
},
bookmarks: {
create: {
minArgs: 1,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 1
},
getChildren: {
minArgs: 1,
maxArgs: 1
},
getRecent: {
minArgs: 1,
maxArgs: 1
},
getSubTree: {
minArgs: 1,
maxArgs: 1
},
getTree: {
minArgs: 0,
maxArgs: 0
},
move: {
minArgs: 2,
maxArgs: 2
},
remove: {
minArgs: 1,
maxArgs: 1
},
removeTree: {
minArgs: 1,
maxArgs: 1
},
search: {
minArgs: 1,
maxArgs: 1
},
update: {
minArgs: 2,
maxArgs: 2
}
},
browserAction: {
disable: {
minArgs: 0,
maxArgs: 1,
fallbackToNoCallback: !0
},
enable: {
minArgs: 0,
maxArgs: 1,
fallbackToNoCallback: !0
},
getBadgeBackgroundColor: {
minArgs: 1,
maxArgs: 1
},
getBadgeText: {
minArgs: 1,
maxArgs: 1
},
getPopup: {
minArgs: 1,
maxArgs: 1
},
getTitle: {
minArgs: 1,
maxArgs: 1
},
openPopup: {
minArgs: 0,
maxArgs: 0
},
setBadgeBackgroundColor: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setBadgeText: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setIcon: {
minArgs: 1,
maxArgs: 1
},
setPopup: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setTitle: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
}
},
browsingData: {
remove: {
minArgs: 2,
maxArgs: 2
},
removeCache: {
minArgs: 1,
maxArgs: 1
},
removeCookies: {
minArgs: 1,
maxArgs: 1
},
removeDownloads: {
minArgs: 1,
maxArgs: 1
},
removeFormData: {
minArgs: 1,
maxArgs: 1
},
removeHistory: {
minArgs: 1,
maxArgs: 1
},
removeLocalStorage: {
minArgs: 1,
maxArgs: 1
},
removePasswords: {
minArgs: 1,
maxArgs: 1
},
removePluginData: {
minArgs: 1,
maxArgs: 1
},
settings: {
minArgs: 0,
maxArgs: 0
}
},
commands: {
getAll: {
minArgs: 0,
maxArgs: 0
}
},
contextMenus: {
remove: {
minArgs: 1,
maxArgs: 1
},
removeAll: {
minArgs: 0,
maxArgs: 0
},
update: {
minArgs: 2,
maxArgs: 2
}
},
cookies: {
get: {
minArgs: 1,
maxArgs: 1
},
getAll: {
minArgs: 1,
maxArgs: 1
},
getAllCookieStores: {
minArgs: 0,
maxArgs: 0
},
remove: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
},
devtools: {
inspectedWindow: {
eval: {
minArgs: 1,
maxArgs: 2,
singleCallbackArg: !1
}
},
panels: {
create: {
minArgs: 3,
maxArgs: 3,
singleCallbackArg: !0
},
elements: {
createSidebarPane: {
minArgs: 1,
maxArgs: 1
}
}
}
},
downloads: {
cancel: {
minArgs: 1,
maxArgs: 1
},
download: {
minArgs: 1,
maxArgs: 1
},
erase: {
minArgs: 1,
maxArgs: 1
},
getFileIcon: {
minArgs: 1,
maxArgs: 2
},
open: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
pause: {
minArgs: 1,
maxArgs: 1
},
removeFile: {
minArgs: 1,
maxArgs: 1
},
resume: {
minArgs: 1,
maxArgs: 1
},
search: {
minArgs: 1,
maxArgs: 1
},
show: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
}
},
extension: {
isAllowedFileSchemeAccess: {
minArgs: 0,
maxArgs: 0
},
isAllowedIncognitoAccess: {
minArgs: 0,
maxArgs: 0
}
},
history: {
addUrl: {
minArgs: 1,
maxArgs: 1
},
deleteAll: {
minArgs: 0,
maxArgs: 0
},
deleteRange: {
minArgs: 1,
maxArgs: 1
},
deleteUrl: {
minArgs: 1,
maxArgs: 1
},
getVisits: {
minArgs: 1,
maxArgs: 1
},
search: {
minArgs: 1,
maxArgs: 1
}
},
i18n: {
detectLanguage: {
minArgs: 1,
maxArgs: 1
},
getAcceptLanguages: {
minArgs: 0,
maxArgs: 0
}
},
identity: {
launchWebAuthFlow: {
minArgs: 1,
maxArgs: 1
}
},
idle: {
queryState: {
minArgs: 1,
maxArgs: 1
}
},
management: {
get: {
minArgs: 1,
maxArgs: 1
},
getAll: {
minArgs: 0,
maxArgs: 0
},
getSelf: {
minArgs: 0,
maxArgs: 0
},
setEnabled: {
minArgs: 2,
maxArgs: 2
},
uninstallSelf: {
minArgs: 0,
maxArgs: 1
}
},
notifications: {
clear: {
minArgs: 1,
maxArgs: 1
},
create: {
minArgs: 1,
maxArgs: 2
},
getAll: {
minArgs: 0,
maxArgs: 0
},
getPermissionLevel: {
minArgs: 0,
maxArgs: 0
},
update: {
minArgs: 2,
maxArgs: 2
}
},
pageAction: {
getPopup: {
minArgs: 1,
maxArgs: 1
},
getTitle: {
minArgs: 1,
maxArgs: 1
},
hide: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setIcon: {
minArgs: 1,
maxArgs: 1
},
setPopup: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setTitle: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
show: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
}
},
permissions: {
contains: {
minArgs: 1,
maxArgs: 1
},
getAll: {
minArgs: 0,
maxArgs: 0
},
remove: {
minArgs: 1,
maxArgs: 1
},
request: {
minArgs: 1,
maxArgs: 1
}
},
runtime: {
getBackgroundPage: {
minArgs: 0,
maxArgs: 0
},
getPlatformInfo: {
minArgs: 0,
maxArgs: 0
},
openOptionsPage: {
minArgs: 0,
maxArgs: 0
},
requestUpdateCheck: {
minArgs: 0,
maxArgs: 0
},
sendMessage: {
minArgs: 1,
maxArgs: 3
},
sendNativeMessage: {
minArgs: 2,
maxArgs: 2
},
setUninstallURL: {
minArgs: 1,
maxArgs: 1
}
},
sessions: {
getDevices: {
minArgs: 0,
maxArgs: 1
},
getRecentlyClosed: {
minArgs: 0,
maxArgs: 1
},
restore: {
minArgs: 0,
maxArgs: 1
}
},
storage: {
local: {
clear: {
minArgs: 0,
maxArgs: 0
},
get: {
minArgs: 0,
maxArgs: 1
},
getBytesInUse: {
minArgs: 0,
maxArgs: 1
},
remove: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
},
managed: {
get: {
minArgs: 0,
maxArgs: 1
},
getBytesInUse: {
minArgs: 0,
maxArgs: 1
}
},
sync: {
clear: {
minArgs: 0,
maxArgs: 0
},
get: {
minArgs: 0,
maxArgs: 1
},
getBytesInUse: {
minArgs: 0,
maxArgs: 1
},
remove: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
}
},
tabs: {
captureVisibleTab: {
minArgs: 0,
maxArgs: 2
},
create: {
minArgs: 1,
maxArgs: 1
},
detectLanguage: {
minArgs: 0,
maxArgs: 1
},
discard: {
minArgs: 0,
maxArgs: 1
},
duplicate: {
minArgs: 1,
maxArgs: 1
},
executeScript: {
minArgs: 1,
maxArgs: 2
},
get: {
minArgs: 1,
maxArgs: 1
},
getCurrent: {
minArgs: 0,
maxArgs: 0
},
getZoom: {
minArgs: 0,
maxArgs: 1
},
getZoomSettings: {
minArgs: 0,
maxArgs: 1
},
goBack: {
minArgs: 0,
maxArgs: 1
},
goForward: {
minArgs: 0,
maxArgs: 1
},
highlight: {
minArgs: 1,
maxArgs: 1
},
insertCSS: {
minArgs: 1,
maxArgs: 2
},
move: {
minArgs: 2,
maxArgs: 2
},
query: {
minArgs: 1,
maxArgs: 1
},
reload: {
minArgs: 0,
maxArgs: 2
},
remove: {
minArgs: 1,
maxArgs: 1
},
removeCSS: {
minArgs: 1,
maxArgs: 2
},
sendMessage: {
minArgs: 2,
maxArgs: 3
},
setZoom: {
minArgs: 1,
maxArgs: 2
},
setZoomSettings: {
minArgs: 1,
maxArgs: 2
},
update: {
minArgs: 1,
maxArgs: 2
}
},
topSites: {
get: {
minArgs: 0,
maxArgs: 0
}
},
webNavigation: {
getAllFrames: {
minArgs: 1,
maxArgs: 1
},
getFrame: {
minArgs: 1,
maxArgs: 1
}
},
webRequest: {
handlerBehaviorChanged: {
minArgs: 0,
maxArgs: 0
}
},
windows: {
create: {
minArgs: 0,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 2
},
getAll: {
minArgs: 0,
maxArgs: 1
},
getCurrent: {
minArgs: 0,
maxArgs: 1
},
getLastFocused: {
minArgs: 0,
maxArgs: 1
},
remove: {
minArgs: 1,
maxArgs: 1
},
update: {
minArgs: 2,
maxArgs: 2
}
}
};
if (0 === Object.keys(apiMetadata).length) throw new Error("api-metadata.json has not been included in browser-polyfill");
class DefaultWeakMap extends WeakMap {
constructor(createItem, items) {
super(items), this.createItem = createItem;
}
get(key) {
return this.has(key) || this.set(key, this.createItem(key)), super.get(key);
}
}
const makeCallback = (promise, metadata) => (...callbackArgs) => {
extensionAPIs.runtime.lastError ? promise.reject(new Error(extensionAPIs.runtime.lastError.message)) : metadata.singleCallbackArg || callbackArgs.length <= 1 && !1 !== metadata.singleCallbackArg ? promise.resolve(callbackArgs[0]) : promise.resolve(callbackArgs);
}, pluralizeArguments = numArgs => 1 == numArgs ? "argument" : "arguments", wrapMethod = (target, method, wrapper) => new Proxy(method, {
apply: (targetMethod, thisObj, args) => wrapper.call(thisObj, target, ...args)
});
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
const wrapObject = (target, wrappers = {}, metadata = {}) => {
let cache = Object.create(null), handlers = {
has: (proxyTarget, prop) => prop in target || prop in cache,
get(proxyTarget, prop, receiver) {
if (prop in cache) return cache[prop];
if (!(prop in target)) return;
let value1 = target[prop];
if ("function" == typeof value1) if ("function" == typeof wrappers[prop]) value1 = wrapMethod(target, target[prop], wrappers[prop]); else if (hasOwnProperty(metadata, prop)) {
let wrapper = ((name, metadata) => function(target, ...args) {
if (args.length < metadata.minArgs) throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
if (args.length > metadata.maxArgs) throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
return new Promise(((resolve, reject) => {
if (metadata.fallbackToNoCallback) try {
target[name](...args, makeCallback({
resolve: resolve,
reject: reject
}, metadata));
} catch (cbError) {
console.warn(`${name} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `, cbError),
target[name](...args), metadata.fallbackToNoCallback = !1, metadata.noCallback = !0,
resolve();
} else metadata.noCallback ? (target[name](...args), resolve()) : target[name](...args, makeCallback({
resolve: resolve,
reject: reject
}, metadata));
}));
})(prop, metadata[prop]);
value1 = wrapMethod(target, target[prop], wrapper);
} else value1 = value1.bind(target); else if ("object" == typeof value1 && null !== value1 && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) value1 = wrapObject(value1, wrappers[prop], metadata[prop]); else {
if (!hasOwnProperty(metadata, "*")) return Object.defineProperty(cache, prop, {
configurable: !0,
enumerable: !0,
get: () => target[prop],
set(value) {
target[prop] = value;
}
}), value1;
value1 = wrapObject(value1, wrappers[prop], metadata["*"]);
}
return cache[prop] = value1, value1;
},
set: (proxyTarget, prop, value, receiver) => (prop in cache ? cache[prop] = value : target[prop] = value,
!0),
defineProperty: (proxyTarget, prop, desc) => Reflect.defineProperty(cache, prop, desc),
deleteProperty: (proxyTarget, prop) => Reflect.deleteProperty(cache, prop)
}, proxyTarget = Object.create(target);
return new Proxy(proxyTarget, handlers);
}, wrapEvent = wrapperMap => ({
addListener(target, listener, ...args) {
target.addListener(wrapperMap.get(listener), ...args);
},
hasListener: (target, listener) => target.hasListener(wrapperMap.get(listener)),
removeListener(target, listener) {
target.removeListener(wrapperMap.get(listener));
}
}), onRequestFinishedWrappers = new DefaultWeakMap((listener => "function" != typeof listener ? listener : function(req) {
const wrappedReq = wrapObject(req, {}, {
getContent: {
minArgs: 0,
maxArgs: 0
}
});
listener(wrappedReq);
}));
let loggedSendResponseDeprecationWarning = !1;
const onMessageWrappers = new DefaultWeakMap((listener => "function" != typeof listener ? listener : function(message1, sender, sendResponse) {
let wrappedSendResponse, result, didCallSendResponse = !1, sendResponsePromise = new Promise((resolve => {
wrappedSendResponse = function(response) {
loggedSendResponseDeprecationWarning || (console.warn(SEND_RESPONSE_DEPRECATION_WARNING, (new Error).stack),
loggedSendResponseDeprecationWarning = !0), didCallSendResponse = !0, resolve(response);
};
}));
try {
result = listener(message1, sender, wrappedSendResponse);
} catch (err1) {
result = Promise.reject(err1);
}
const isResultThenable = !0 !== result && (value = result) && "object" == typeof value && "function" == typeof value.then;
var value;
if (!0 !== result && !isResultThenable && !didCallSendResponse) return !1;
const sendPromisedResult = promise => {
promise.then((msg => {
sendResponse(msg);
}), (error => {
let message;
message = error && (error instanceof Error || "string" == typeof error.message) ? error.message : "An unexpected error occurred",
sendResponse({
__mozWebExtensionPolyfillReject__: !0,
message: message
});
})).catch((err => {
console.error("Failed to send onMessage rejected reply", err);
}));
};
return sendPromisedResult(isResultThenable ? result : sendResponsePromise), !0;
})), wrappedSendMessageCallback = ({reject: reject, resolve: resolve}, reply) => {
extensionAPIs.runtime.lastError ? extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE ? resolve() : reject(new Error(extensionAPIs.runtime.lastError.message)) : reply && reply.__mozWebExtensionPolyfillReject__ ? reject(new Error(reply.message)) : resolve(reply);
}, wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
if (args.length < metadata.minArgs) throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
if (args.length > metadata.maxArgs) throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
return new Promise(((resolve, reject) => {
const wrappedCb = wrappedSendMessageCallback.bind(null, {
resolve: resolve,
reject: reject
});
args.push(wrappedCb), apiNamespaceObj.sendMessage(...args);
}));
}, staticWrappers = {
devtools: {
network: {
onRequestFinished: wrapEvent(onRequestFinishedWrappers)
}
},
runtime: {
onMessage: wrapEvent(onMessageWrappers),
onMessageExternal: wrapEvent(onMessageWrappers),
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 1,
maxArgs: 3
})
},
tabs: {
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 2,
maxArgs: 3
})
}
}, settingMetadata = {
clear: {
minArgs: 1,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
};
return apiMetadata.privacy = {
network: {
"*": settingMetadata
},
services: {
"*": settingMetadata
},
websites: {
"*": settingMetadata
}
}, wrapObject(extensionAPIs, staticWrappers, apiMetadata);
};
module.exports = wrapAPIs(chrome);
} else module.exports = globalThis.browser;
}, "function" == typeof define && define.amd ? define("webextension-polyfill", [ "module" ], factory) : factory(module);
}));
let $f046e78e22aef39d$var$cache = !0;
function $f046e78e22aef39d$var$isCurrentPathname(path) {
if (!path) return !1;
try {
const {pathname: pathname} = new URL(path, location.origin);
return pathname === location.pathname;
} catch {
return !1;
}
}
function $f046e78e22aef39d$var$getManifest(_version) {
return globalThis.chrome?.runtime?.getManifest?.();
}
function $f046e78e22aef39d$var$once(function_) {
let result;
return () => ($f046e78e22aef39d$var$cache && void 0 !== result || (result = function_()),
result);
}
const $f046e78e22aef39d$export$e7c4a1c4ed7f09ac = $f046e78e22aef39d$var$once((() => globalThis.location?.protocol.startsWith("http"))), $f046e78e22aef39d$export$1291dbea3b2eb4e1 = $f046e78e22aef39d$var$once((() => "object" == typeof globalThis.chrome?.extension)), $f046e78e22aef39d$export$d0790c2ac1fc6894 = ($f046e78e22aef39d$var$once((() => $f046e78e22aef39d$export$1291dbea3b2eb4e1() && $f046e78e22aef39d$export$e7c4a1c4ed7f09ac())),
() => $f046e78e22aef39d$export$ede7a9f5470a0118() || $f046e78e22aef39d$export$933c8adc355f9a14()), $f046e78e22aef39d$export$ede7a9f5470a0118 = $f046e78e22aef39d$var$once((() => {
const manifest = $f046e78e22aef39d$var$getManifest();
return !(!manifest || !$f046e78e22aef39d$var$isCurrentPathname(manifest.background_page || manifest.background?.page)) || Boolean(manifest?.background?.scripts && $f046e78e22aef39d$var$isCurrentPathname("/_generated_background_page.html"));
})), $f046e78e22aef39d$export$933c8adc355f9a14 = $f046e78e22aef39d$var$once((() => $f046e78e22aef39d$var$isCurrentPathname($f046e78e22aef39d$var$getManifest()?.background?.service_worker)));
$f046e78e22aef39d$var$once((() => {
if (!$f046e78e22aef39d$export$1291dbea3b2eb4e1() || !chrome.runtime.getManifest) return !1;
const {options_ui: optionsUi} = chrome.runtime.getManifest();
if ("string" != typeof optionsUi?.page) return !1;
return new URL(optionsUi.page, location.origin).pathname === location.pathname;
})), $f046e78e22aef39d$var$once((() => {
if (!$f046e78e22aef39d$export$1291dbea3b2eb4e1() || !chrome.devtools) return !1;
const {devtools_page: devtoolsPage} = chrome.runtime.getManifest();
if ("string" != typeof devtoolsPage) return !1;
return new URL(devtoolsPage, location.origin).pathname === location.pathname;
}));
function $b80fd2360d77010c$var$throttle(delay, noTrailing, callback, debounceMode) {
var timeoutID, cancelled = !1, lastExec = 0;
function clearExistingTimeout() {
timeoutID && clearTimeout(timeoutID);
}
function wrapper() {
for (var _len = arguments.length, arguments_ = new Array(_len), _key = 0; _key < _len; _key++) arguments_[_key] = arguments[_key];
var self = this, elapsed = Date.now() - lastExec;
function exec() {
lastExec = Date.now(), callback.apply(self, arguments_);
}
function clear() {
timeoutID = void 0;
}
cancelled || (debounceMode && !timeoutID && exec(), clearExistingTimeout(), void 0 === debounceMode && elapsed > delay ? exec() : !0 !== noTrailing && (timeoutID = setTimeout(debounceMode ? clear : exec, void 0 === debounceMode ? delay - elapsed : delay)));
}
return "boolean" != typeof noTrailing && (debounceMode = callback, callback = noTrailing,
noTrailing = void 0), wrapper.cancel = function() {
clearExistingTimeout(), cancelled = !0;
}, wrapper;
}
class $b80fd2360d77010c$var$TypeRegistry {
constructor(initial = {}) {
this.registeredTypes = initial;
}
get(type) {
return void 0 !== this.registeredTypes[type] ? this.registeredTypes[type] : this.registeredTypes.default;
}
register(type, item) {
void 0 === this.registeredTypes[type] && (this.registeredTypes[type] = item);
}
registerDefault(item) {
this.register("default", item);
}
}
class $b80fd2360d77010c$var$KeyExtractors extends $b80fd2360d77010c$var$TypeRegistry {
constructor(options) {
super(options), this.registerDefault((el => el.getAttribute("name") || ""));
}
}
class $b80fd2360d77010c$var$InputReaders extends $b80fd2360d77010c$var$TypeRegistry {
constructor(options1) {
super(options1), this.registerDefault((el => el.value)), this.register("checkbox", (el => null !== el.getAttribute("value") ? el.checked ? el.getAttribute("value") : null : el.checked)),
this.register("select", (el => function(elem) {
var value, option, i, options = elem.options, index = elem.selectedIndex, one = "select-one" === elem.type, values = one ? null : [], max = one ? index + 1 : options.length;
for (i = index < 0 ? max : one ? index : 0; i < max; i++) if (((option = options[i]).selected || i === index) && !option.disabled && (!option.parentNode.disabled || "optgroup" !== option.parentNode.tagName.toLowerCase())) {
if (value = option.value, one) return value;
values.push(value);
}
return values;
}(el)));
}
}
class $b80fd2360d77010c$var$KeyAssignmentValidators extends $b80fd2360d77010c$var$TypeRegistry {
constructor(options) {
super(options), this.registerDefault((() => !0)), this.register("radio", (el => el.checked));
}
}
function $b80fd2360d77010c$var$keySplitter(key) {
let lastKey, matches = key.match(/[^[\]]+/g);
return key.length > 1 && key.indexOf("[]") === key.length - 2 && (lastKey = matches.pop(),
matches.push([ lastKey ])), matches;
}
function $b80fd2360d77010c$var$getElementType(el) {
let typeAttr, tagName = el.tagName, type = tagName;
return "input" === tagName.toLowerCase() && (typeAttr = el.getAttribute("type"),
type = typeAttr || "text"), type.toLowerCase();
}
function $b80fd2360d77010c$var$getInputElements(element, options) {
return Array.prototype.filter.call(element.querySelectorAll("input,select,textarea"), (el => {
if ("input" === el.tagName.toLowerCase() && ("submit" === el.type || "reset" === el.type)) return !1;
let myType = $b80fd2360d77010c$var$getElementType(el), identifier = options.keyExtractors.get(myType)(el), foundInInclude = -1 !== (options.include || []).indexOf(identifier), foundInExclude = -1 !== (options.exclude || []).indexOf(identifier), foundInIgnored = !1, reject = !1;
if (options.ignoredTypes) for (let selector of options.ignoredTypes) el.matches(selector) && (foundInIgnored = !0);
return reject = !foundInInclude && (!!options.include || foundInExclude || foundInIgnored),
!reject;
}));
}
function $b80fd2360d77010c$var$assignKeyValue(obj, keychain, value) {
if (!keychain) return obj;
var key = keychain.shift();
return obj[key] || (obj[key] = Array.isArray(key) ? [] : {}), 0 === keychain.length && (Array.isArray(obj[key]) ? null !== value && obj[key].push(value) : obj[key] = value),
keychain.length > 0 && $b80fd2360d77010c$var$assignKeyValue(obj[key], keychain, value),
obj;
}
function $b80fd2360d77010c$var$serialize(element, options = {}) {
let data = {};
return options.keySplitter = options.keySplitter || $b80fd2360d77010c$var$keySplitter,
options.keyExtractors = new $b80fd2360d77010c$var$KeyExtractors(options.keyExtractors || {}),
options.inputReaders = new $b80fd2360d77010c$var$InputReaders(options.inputReaders || {}),
options.keyAssignmentValidators = new $b80fd2360d77010c$var$KeyAssignmentValidators(options.keyAssignmentValidators || {}),
Array.prototype.forEach.call($b80fd2360d77010c$var$getInputElements(element, options), (el => {
let type = $b80fd2360d77010c$var$getElementType(el), key = options.keyExtractors.get(type)(el), value = options.inputReaders.get(type)(el);
if (options.keyAssignmentValidators.get(type)(el, key, value)) {
let keychain = options.keySplitter(key);
data = $b80fd2360d77010c$var$assignKeyValue(data, keychain, value);
}
})), data;
}
class $b80fd2360d77010c$var$InputWriters extends $b80fd2360d77010c$var$TypeRegistry {
constructor(options) {
super(options), this.registerDefault(((el, value) => {
el.value = value;
})), this.register("checkbox", ((el, value) => {
null === value ? el.indeterminate = !0 : el.checked = Array.isArray(value) ? -1 !== value.indexOf(el.value) : value;
})), this.register("radio", (function(el, value) {
void 0 !== value && (el.checked = el.value === value.toString());
})), this.register("select", $b80fd2360d77010c$var$setSelectValue);
}
}
function $b80fd2360d77010c$var$setSelectValue(elem, value) {
for (var optionSet, option, arr, ret, options = elem.options, values = (ret = [],
null !== (arr = value) && (Array.isArray(arr) ? ret.push.apply(ret, arr) : ret.push(arr)),
ret), i = options.length; i--; ) option = options[i], values.indexOf(option.value) > -1 && (option.setAttribute("selected", !0),
optionSet = !0);
optionSet || (elem.selectedIndex = -1);
}
function $b80fd2360d77010c$var$keyJoiner(parentKey, childKey) {
return parentKey + "[" + childKey + "]";
}
function $b80fd2360d77010c$var$flattenData(data, parentKey, options = {}) {
let flatData = {}, keyJoiner$1 = options.keyJoiner || $b80fd2360d77010c$var$keyJoiner;
for (let keyName in data) {
if (!data.hasOwnProperty(keyName)) continue;
let value = data[keyName], hash = {};
parentKey && (keyName = keyJoiner$1(parentKey, keyName)), Array.isArray(value) ? (hash[keyName + "[]"] = value,
hash[keyName] = value) : "object" == typeof value ? hash = $b80fd2360d77010c$var$flattenData(value, keyName, options) : hash[keyName] = value,
Object.assign(flatData, hash);
}
return flatData;
}
function $b80fd2360d77010c$var$deserialize(form, data, options = {}) {
let flattenedData = $b80fd2360d77010c$var$flattenData(data, null, options);
options.keyExtractors = new $b80fd2360d77010c$var$KeyExtractors(options.keyExtractors || {}),
options.inputWriters = new $b80fd2360d77010c$var$InputWriters(options.inputWriters || {}),
Array.prototype.forEach.call($b80fd2360d77010c$var$getInputElements(form, options), (el => {
let type = $b80fd2360d77010c$var$getElementType(el), key = options.keyExtractors.get(type)(el);
options.inputWriters.get(type)(el, flattenedData[key]);
}));
}
var $b80fd2360d77010c$var$module, $b80fd2360d77010c$var$LZString, $b80fd2360d77010c$var$lzString = {
exports: {}
};
$b80fd2360d77010c$var$module = $b80fd2360d77010c$var$lzString, $b80fd2360d77010c$var$LZString = function() {
var f = String.fromCharCode, keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$", baseReverseDic = {};
function getBaseValue(alphabet, character) {
if (!baseReverseDic[alphabet]) {
baseReverseDic[alphabet] = {};
for (var i = 0; i < alphabet.length; i++) baseReverseDic[alphabet][alphabet.charAt(i)] = i;
}
return baseReverseDic[alphabet][character];
}
var LZString = {
compressToBase64: function(input) {
if (null == input) return "";
var res = LZString._compress(input, 6, (function(a) {
return keyStrBase64.charAt(a);
}));
switch (res.length % 4) {
default:
case 0:
return res;
case 1:
return res + "===";
case 2:
return res + "==";
case 3:
return res + "=";
}
},
decompressFromBase64: function(input) {
return null == input ? "" : "" == input ? null : LZString._decompress(input.length, 32, (function(index) {
return getBaseValue(keyStrBase64, input.charAt(index));
}));
},
compressToUTF16: function(input) {
return null == input ? "" : LZString._compress(input, 15, (function(a) {
return f(a + 32);
})) + " ";
},
decompressFromUTF16: function(compressed) {
return null == compressed ? "" : "" == compressed ? null : LZString._decompress(compressed.length, 16384, (function(index) {
return compressed.charCodeAt(index) - 32;
}));
},
compressToUint8Array: function(uncompressed) {
for (var compressed = LZString.compress(uncompressed), buf = new Uint8Array(2 * compressed.length), i = 0, TotalLen = compressed.length; i < TotalLen; i++) {
var current_value = compressed.charCodeAt(i);
buf[2 * i] = current_value >>> 8, buf[2 * i + 1] = current_value % 256;
}
return buf;
},
decompressFromUint8Array: function(compressed) {
if (null == compressed) return LZString.decompress(compressed);
for (var buf = new Array(compressed.length / 2), i = 0, TotalLen = buf.length; i < TotalLen; i++) buf[i] = 256 * compressed[2 * i] + compressed[2 * i + 1];
var result = [];
return buf.forEach((function(c) {
result.push(f(c));
})), LZString.decompress(result.join(""));
},
compressToEncodedURIComponent: function(input) {
return null == input ? "" : LZString._compress(input, 6, (function(a) {
return keyStrUriSafe.charAt(a);
}));
},
decompressFromEncodedURIComponent: function(input) {
return null == input ? "" : "" == input ? null : (input = input.replace(/ /g, "+"),
LZString._decompress(input.length, 32, (function(index) {
return getBaseValue(keyStrUriSafe, input.charAt(index));
})));
},
compress: function(uncompressed) {
return LZString._compress(uncompressed, 16, (function(a) {
return f(a);
}));
},
_compress: function(uncompressed, bitsPerChar, getCharFromInt) {
if (null == uncompressed) return "";
var i, value, ii, context_dictionary = {}, context_dictionaryToCreate = {}, context_c = "", context_wc = "", context_w = "", context_enlargeIn = 2, context_dictSize = 3, context_numBits = 2, context_data = [], context_data_val = 0, context_data_position = 0;
for (ii = 0; ii < uncompressed.length; ii += 1) if (context_c = uncompressed.charAt(ii),
Object.prototype.hasOwnProperty.call(context_dictionary, context_c) || (context_dictionary[context_c] = context_dictSize++,
context_dictionaryToCreate[context_c] = !0), context_wc = context_w + context_c,
Object.prototype.hasOwnProperty.call(context_dictionary, context_wc)) context_w = context_wc; else {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for (i = 0; i < context_numBits; i++) context_data_val <<= 1, context_data_position == bitsPerChar - 1 ? (context_data_position = 0,
context_data.push(getCharFromInt(context_data_val)), context_data_val = 0) : context_data_position++;
for (value = context_w.charCodeAt(0), i = 0; i < 8; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
} else {
for (value = 1, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value = 0;
for (value = context_w.charCodeAt(0), i = 0; i < 16; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
}
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++),
delete context_dictionaryToCreate[context_w];
} else for (value = context_dictionary[context_w], i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++),
context_dictionary[context_wc] = context_dictSize++, context_w = String(context_c);
}
if ("" !== context_w) {
if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate, context_w)) {
if (context_w.charCodeAt(0) < 256) {
for (i = 0; i < context_numBits; i++) context_data_val <<= 1, context_data_position == bitsPerChar - 1 ? (context_data_position = 0,
context_data.push(getCharFromInt(context_data_val)), context_data_val = 0) : context_data_position++;
for (value = context_w.charCodeAt(0), i = 0; i < 8; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
} else {
for (value = 1, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value = 0;
for (value = context_w.charCodeAt(0), i = 0; i < 16; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
}
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++),
delete context_dictionaryToCreate[context_w];
} else for (value = context_dictionary[context_w], i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
0 == --context_enlargeIn && (context_enlargeIn = Math.pow(2, context_numBits), context_numBits++);
}
for (value = 2, i = 0; i < context_numBits; i++) context_data_val = context_data_val << 1 | 1 & value,
context_data_position == bitsPerChar - 1 ? (context_data_position = 0, context_data.push(getCharFromInt(context_data_val)),
context_data_val = 0) : context_data_position++, value >>= 1;
for (;;) {
if (context_data_val <<= 1, context_data_position == bitsPerChar - 1) {
context_data.push(getCharFromInt(context_data_val));
break;
}
context_data_position++;
}
return context_data.join("");
},
decompress: function(compressed) {
return null == compressed ? "" : "" == compressed ? null : LZString._decompress(compressed.length, 32768, (function(index) {
return compressed.charCodeAt(index);
}));
},
_decompress: function(length, resetValue, getNextValue) {
var i, w, bits, resb, maxpower, power, c, dictionary = [], enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = [], data = {
val: getNextValue(0),
position: resetValue,
index: 1
};
for (i = 0; i < 3; i += 1) dictionary[i] = i;
for (bits = 0, maxpower = Math.pow(2, 2), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
switch (bits) {
case 0:
for (bits = 0, maxpower = Math.pow(2, 8), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
c = f(bits);
break;
case 1:
for (bits = 0, maxpower = Math.pow(2, 16), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
c = f(bits);
break;
case 2:
return "";
}
for (dictionary[3] = c, w = c, result.push(c); ;) {
if (data.index > length) return "";
for (bits = 0, maxpower = Math.pow(2, numBits), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
switch (c = bits) {
case 0:
for (bits = 0, maxpower = Math.pow(2, 8), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
dictionary[dictSize++] = f(bits), c = dictSize - 1, enlargeIn--;
break;
case 1:
for (bits = 0, maxpower = Math.pow(2, 16), power = 1; power != maxpower; ) resb = data.val & data.position,
data.position >>= 1, 0 == data.position && (data.position = resetValue, data.val = getNextValue(data.index++)),
bits |= (resb > 0 ? 1 : 0) * power, power <<= 1;
dictionary[dictSize++] = f(bits), c = dictSize - 1, enlargeIn--;
break;
case 2:
return result.join("");
}
if (0 == enlargeIn && (enlargeIn = Math.pow(2, numBits), numBits++), dictionary[c]) entry = dictionary[c]; else {
if (c !== dictSize) return null;
entry = w + w.charAt(0);
}
result.push(entry), dictionary[dictSize++] = w + entry.charAt(0), w = entry, 0 == --enlargeIn && (enlargeIn = Math.pow(2, numBits),
numBits++);
}
}
};
return LZString;
}(), null != $b80fd2360d77010c$var$module && ($b80fd2360d77010c$var$module.exports = $b80fd2360d77010c$var$LZString);
class $b80fd2360d77010c$export$2e2bcd8739ae039 {
constructor({defaults: defaults = {}, storageName: storageName = "options", migrations: migrations = [], logging: logging = !0, storageType: storageType = "sync"} = {}) {
Object.defineProperty(this, "storageName", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), Object.defineProperty(this, "storageType", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), Object.defineProperty(this, "defaults", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), Object.defineProperty(this, "_form", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), Object.defineProperty(this, "_migrations", {
enumerable: !0,
configurable: !0,
writable: !0,
value: void 0
}), this.storageName = storageName, this.defaults = defaults, this.storageType = storageType,
this._handleFormInput = (300, $b80fd2360d77010c$var$throttle(300, this._handleFormInput.bind(this), !1)),
this._handleStorageChangeOnForm = this._handleStorageChangeOnForm.bind(this), logging || (this._log = () => {}),
this._migrations = this._runMigrations(migrations);
}
get storage() {
return chrome.storage[this.storageType];
}
async getAll() {
return await this._migrations, this._getAll();
}
async setAll(newOptions) {
return await this._migrations, this._setAll(newOptions);
}
async set(newOptions) {
return this.setAll({
...await this.getAll(),
...newOptions
});
}
async syncForm(form) {
this._form = form instanceof HTMLFormElement ? form : document.querySelector(form),
this._form.addEventListener("input", this._handleFormInput), this._form.addEventListener("submit", this._handleFormSubmit),
chrome.storage.onChanged.addListener(this._handleStorageChangeOnForm), this._updateForm(this._form, await this.getAll());
}
async stopSyncForm() {
this._form && (this._form.removeEventListener("input", this._handleFormInput), this._form.removeEventListener("submit", this._handleFormSubmit),
chrome.storage.onChanged.removeListener(this._handleStorageChangeOnForm), delete this._form);
}
_log(method, ...args) {
console[method](...args);
}
async _getAll() {
return new Promise(((resolve, reject) => {
this.storage.get(this.storageName, (result => {
chrome.runtime.lastError ? reject(chrome.runtime.lastError) : resolve(this._decode(result[this.storageName]));
}));
}));
}
async _setAll(newOptions) {
return this._log("log", "Saving options", newOptions), new Promise(((resolve, reject) => {
this.storage.set({
[this.storageName]: this._encode(newOptions)
}, (() => {
chrome.runtime.lastError ? reject(chrome.runtime.lastError) : resolve();
}));
}));
}
_encode(options) {
const thinnedOptions = {
...options
};
for (const [key, value] of Object.entries(thinnedOptions)) this.defaults[key] === value && delete thinnedOptions[key];
return this._log("log", "Without the default values", thinnedOptions), $b80fd2360d77010c$var$lzString.exports.compressToEncodedURIComponent(JSON.stringify(thinnedOptions));
}
_decode(options) {
let decompressed = options;
return "string" == typeof options && (decompressed = JSON.parse($b80fd2360d77010c$var$lzString.exports.decompressFromEncodedURIComponent(options))),
{
...this.defaults,
...decompressed
};
}
async _runMigrations(migrations) {
if (0 === migrations.length || !$f046e78e22aef39d$export$d0790c2ac1fc6894() || !await async function() {
return new Promise((resolve => {
const callback = installType => {
"development" !== installType ? (chrome.runtime.onInstalled.addListener((() => {
resolve(!0);
})), setTimeout(resolve, 500, !1)) : resolve(!0);
};
chrome.management?.getSelf ? chrome.management.getSelf((({installType: installType}) => {
callback(installType);
})) : callback("unknown");
}));
}()) return;
const options = await this._getAll(), initial = JSON.stringify(options);
this._log("log", "Found these stored options", {
...options
}), this._log("info", "Will run", migrations.length, 1 === migrations.length ? "migration" : " migrations");
for (const migrate of migrations) migrate(options, this.defaults);
initial !== JSON.stringify(options) && await this._setAll(options);
}
async _handleFormInput({target: target}) {
const field = target;
field.name && (await this.set(this._parseForm(field.form)), field.form.dispatchEvent(new CustomEvent("options-sync:form-synced", {
bubbles: !0
})));
}
_handleFormSubmit(event) {
event.preventDefault();
}
_updateForm(form, options) {
const currentFormState = this._parseForm(form);
for (const [key, value] of Object.entries(options)) currentFormState[key] === value && delete options[key];
const include = Object.keys(options);
include.length > 0 && $b80fd2360d77010c$var$deserialize(form, options, {
include: include
});
}
_parseForm(form) {
const include = [];
for (const field of form.querySelectorAll("[name]")) field.validity.valid && !field.disabled && include.push(field.name.replace(/\[.*]/, ""));
return $b80fd2360d77010c$var$serialize(form, {
include: include
});
}
_handleStorageChangeOnForm(changes, areaName) {
areaName !== this.storageType || !changes[this.storageName] || document.hasFocus() && this._form.contains(document.activeElement) || this._updateForm(this._form, this._decode(changes[this.storageName].newValue));
}
}
Object.defineProperty($b80fd2360d77010c$export$2e2bcd8739ae039, "migrations", {
enumerable: !0,
configurable: !0,
writable: !0,
value: {
removeUnused(options, defaults) {
for (const key of Object.keys(options)) key in defaults || delete options[key];
}
}
});
const $257eb53020aecc3f$export$8aab31ab0bf990c8 = [ ".wikidata.org", ".roam.garden", ".allennlp.org", ".archive.org", ".archiveteam.org", ".bandcamp.com", ".eleuther.ai", ".fandom.com", ".github.io", ".givewell.org", ".greenspun.com", ".humanprogress.org", ".imagemagick.org", ".mementoweb.org", ".metafilter.com", ".nomeata.de", ".obormot.net", ".tumblr.com", ".xkcd.com", ".wikipedia.org", ".wordpress.com", ".blogspot.com" ], $75c9c0e6bbf7a434$export$fd598f5d6ce00b10 = new $b80fd2360d77010c$export$2e2bcd8739ae039({
defaults: {
renderBlocklist: "gwern.net, wikipedia.org, youtube.com, roam.garden",
iframeDomainWhitelist: [ "manifold.markets", "1dollarscan.com", "80000hours.org", "abandonedfootnotes.blogspot.com", "academic.oup.com", "academic.oup.com", "academictorrents.com", "ageing.oxfordjournals.org", "ai.googleblog.com", "aje.oxfordjournals.org", "apenwarr.ca", "archive.org", "archive.ph", "archivebox.io", "bam-dataset.org", "bam.kalzumeus.com", "beepb00p.xyz", "bellard.org", "blog.beeminder.com", "blog.google.com", "blog.otoro.net", "blog.pinboard.in", "blogs.nvidia.com", "bmk.sh", "boingboing.net", "camelcamelcamel.com", "cat-unbound.org", "causal-effects.com", "citeseerx.ist.psu.edu", "clinicaltrials.gov", "conifer.rhizome.org", "cran.r-project.org", "ctan.org", "danluu.com", "danwang.co", "distill.pub", "docs.google.com", "duckduckgo.com", "dwarffortresswiki.org", "en.bitcoin.it", "en.touhouwiki.net", "en.wikibooks.org", "en.wikichip.org", "en.wikifur.com", "en.wikiquote.org", "en.wikisource.org", "en.wiktionary.org", "equilibriabook.com", "eurekamaga.com", "everything2.com", "explorabl.es", "feeds.feedburner.com", "files.eric.ed.gov", "forum.effectivealtruism.org", "forum.evageeks.org", "foundation.wikimedia.org", "fullfrontal.moe", "greaterwrong.com", "guzey.com", "idlewords.com", "iqcomparisonsite.com", "jamanetwork.com", "jasoncrawford.org", "jtoomim.org", "kalzumeus.com", "keras.io", "kill-the-newsletter.com", "kk.org", "knightcolumbia.org", "ledge-cli.org", "lesswrong.com", "libgen.rs", "library.bz", "marginalrevolution.com", "mattlakeman.org", "mc-stan.org", "meta.wikimedia.org", "michaelnielsen.org", "ncase.me", "nintil.com", "norvig.com", "notes.pinboard.in", "numinous.productions", "nymag.com", "openai.com", "ourworldindata.org", "pandoc.org", "papers.ssrn.com", "parametric.press", "patrickcollison.com", "pdfs.semanticscholar.org", "personalitytest.net", "philpapers.org", "pinboard.in", "plato.stanford.edu", "playground.tensorflow.org", "popcon.ubuntu.com", "press.etc.cmu.edu", "progressstudies.school", "psychcentral.com", "publicdomainreview.org", "publishing.cdlib.org", "qntm.org", "quantum.country", "qwantz.com", "racket-lang.org", "rationality.org", "rdiff-backup.net", "ricon.dev", "rootsofprogress.org", "row1.ca", "safebooru.org", "scholars-stage.org", "sciencebasedmedicine.org", "sevensecularsermons.org", "shiny.app", "sifter.org", "slatestarcodex.com", "spreadsheets.google.com", "statmodeling.stat.columbia.edu", "stats.grok.se", "text.npr.org", "thefirstaibook.com", "thisanimedoesnotexist.ai", "thiscatdoesnotexist.com", "thisrentaldoesnotexist.com", "training.kalzumeus.com", "unsongbook.com", "upload.wikimedia.org", "vast.ai", "videolectures.net", "wayback.archive-it.org", "web.archive.org", "wiki.evageeks.org", "wiki.haskell.org", "www.aleph.se", "www.antipope.org", "www.archive-it.org", "www.barnesandnoble.com", "www.buzzricksons.jp", "www.cdc.gov", "www.cogmed.com", "www.cogtest.com", "www.cram.com", "www.cryonicscalculator.com", "www.cylab.cmu.edu", "www.dafont.com", "www.davidsongifted.org", "www.deeplearningbook.org", "www.discoverbooks.com", "www.doc88.com", "www.drmaciver.com", "www.e-codices.unifr.ch", "www.ecologyandsociety.org", "www.econlib.org", "www.economist.com", "www.econtalk.org", "www.equator-network.org", "www.equestriadaily.com", "www.evamonkey.com", "www.filfre.net", "www.find-more-books.com", "www.frontiersin.org", "www.genetics.org", "www.gizmodo.com.au", "www.gnxp.com", "www.google-melange.com", "www.greaterwrong.com", "www.gutenberg.org", "www.haskell.org", "www.hpmor.com", "www.html-tidy.org", "www.iarpa.gov", "www.iqtest.com", "www.joelonsoftware.com", "www.johndcook.com", "www.kalzumeus.com", "www.lesswrong.com", "www.librarything.com", "www.mail-archive.com", "www.mediawiki.org", "www.metafor-project.org", "www.motherjones.com", "www.ncbi.nlm.nih.gov", "www.npr.org", "www.ohyouprettythings.com", "www.overcomingbias.com", "www.poetryfoundation.org", "www.proquest.com", "www.psychiatryinvestigation.org", "www.r-bloggers.com", "www.rdocumentation.org", "www.ribbonfarm.com", "www.rifters.com", "www.sapa-project.org", "www.schneier.com", "www.sciencedirect.com", "www.sciencenews.org", "www.sciencenewsline.com", "www.shawwn.com", "www.simplify.so", "www.snpedia.com", "www.stat.columbia.edu", "www.stat.columbia.edu", "www.straighttalkonevidence.org", "www.tarsnap.com", "www.theatlantic.com", "www.theindiaforum.in", "www.theparisreview.org", "www.thisfursonadoesnotexist.com", "www.thispersondoesnotexist.com", "www.thiswaifudoesnotexist.net", "www.thisworddoesnotexist.com", "www.thriftbooks.com", "www.urbandictionary.com", "www.vanityfair.com", "www.vocativ.com", "www.w3.org", "www.washingtonpost.com", "www.whichfaceisreal.com", "www.winehq.org", "www.wolfewiki.com", "www.wsj.com", "www.yalelawjournal.org", "www.youtube.com", "xkcd.com", "xtools.wmflabs.org", "mail.haskell.org", "hackage.haskell.org", "online.wsj.com", "www.microsoft.com", "intelligence.org", "eprint.iacr.org", "www.explainxkcd.com", "www.silverhandmeadery.com", "www.nickbostrom.com", "well.blogs.nytimes.com", "www.gwern.net", "rjlipton.wordpress.com", "jaspervdj.be", "jama.jamanetwork.com", "blog.codinghorror.com", "aiimpacts.org", "web.archive.org", "www.fhi.ox.ac.uk", "www.cjas.org", "blog.google", "archinte.jamanetwork.com", "aclanthology.org", "www.clinicaltrials.gov", "proceedings.mlr.press", "diff.wikimedia.org", "www.scottaaronson.com", "www.eugenewei.com", "www.alignmentforum.org", "www.wired.com", "www.evaotaku.com", "www.stuff.co.nz", "texample.net", "www.dailymail.co.uk", "www.memteaimports.com", "boards.fireden.net", "webcitation.org", "www.reuters.com", "mail.haskell.org", "gameprogrammingpatterns.com", "digital.library.unt.edu", "www.salon.com", "www.metopera.org", "dnstats.net", "www.thecut.com", "animekritik.wordpress.com", "www.fadedpage.com", "www.dailydot.com", "www.candyjapan.com", "nautil.us", "emilkirkegaard.dk", "www.independent.co.uk", "www.edwardtufte.com", "www.brookings.edu", "www.blockchain.com", "web.stanford.edu", "mitpress.mit.edu", "freakonomics.com", "forums.animesuki.com", "eli.thegreenplace.net", "www.theregister.com", "www.alcor.org", "the-liliquarium.livejournal.com", "socghop.appspot.com", "people.csail.mit.edu", "findarticles.com", "dataprivacylab.org", "blog.23andme.com", "andrewmayneblog.wordpress.com", "www.thefreelibrary.com", "www.sfgate.com", "www.rrauction.com", "www.merkle.com", "www.links.org", "www.bartleby.com", "wavemotioncannon.com", "www.baltimoresun.com", "unenumerated.blogspot.com", "scottaaronson.blog", "rjlipton.wordpress.com", "mason.gmu.edu", "ilovetypography.com", "humanvarieties.org", "googlesystem.blogspot.com", "www.yudkowsky.net", "arr.am", "www.worldcat.org", "www.supermemo.com", "www.standard.co.uk", "www.orlandosentinel.com", "www.nbcnews.com", "www.mercurynews.com", "www.math.uwaterloo.ca", "www.jefftk.com", "www.gq.com", "www.businessweek.com", "www.austlii.edu.au", "www.aiweirdness.com", "w.atwiki.jp", "vitalik.ca", "unqualified-reservations.blogspot.com", "thegrandnarrative.com", "sre.google", "signalvnoise.com", "shkspr.mobi", "qualiacomputing.com", "penelope.uchicago.edu", "parahumans.wordpress.com", "palladiummag.com", "packdeps.haskellers.com", "ohtori.nu", "my.vanderbilt.edu", "mathworld.wolfram.com", "magenta.tensorflow.org", "infoproc.blogspot.com", "highnoongmt.wordpress.com", "googleprojectzero.blogspot.com", "forum.quantifiedself.com", "foreignpolicy.com", "engineering.fb.com", "cdn.openai.com", "cdn.discordapp.com", "blog.acolyer.org", "web.archive.org", "articles.latimes.com", "alumni.media.mit.edu", "agtb.wordpress.com", "zlkj.in", "www.wakapoetry.net", "www.vetta.org", "www.unz.com", "www.unicode.org", "www.unc.edu", "www.tor.com", "www.tomodachi.de", "www.thestranger.com", "www.the-scientist.com", "www.tabletmag.com", "www.syracuse.com", "www.sun-modalert.com", "www.spiegel.de", "www.sankakucomplex.com", "www.sacbee.com", "www.rwagner.net", "www.richardcarrier.info", "www.rationaloptimist.com", "www.pragmatic.ml", "www.popsci.com", "www.owenstephens.co.uk", "www.nydailynews.com", "www.oregonlive.com", "www.miamiherald.com", "www.lrb.co.uk", "www.livestrong.com", "www.karger.com", "www.japansociety.org", "www.japaninc.com", "www.grandforksherald.com", "www.genealogy.math.ndsu.nodak.edu", "www.gawker.com", "www.fathomevents.com", "www.dartmouth.edu", "www.culhwch.info", "www.cs.virginia.edu", "www.cnn.com", "www.chicagotribune.com", "www.cbsnews.com", "www.bemmu.com", "www.4nrx-uk.md", "warontherocks.com", "venturebeat.com", "time.com", "threadreaderapp.com", "thelastpsychiatrist.com", "taooftea.com", "takimag.com", "synapse.koreamed.org", "stratechery.com", "srconstantin.wordpress.com", "spikejapan.wordpress.com", "soranews24.com", "senrigan.io", "retractionwatch.com", "replicationindex.com", "queue.acm.org", "phys.org", "originstamp.com", "opinionator.blogs.nytimes.com", "okmij.org", "web.archive.org", "web.archive.org", "newcriterion.com", "neurosciencenews.com", "my.pgp-hms.org", "meteuphoric.com", "meehl.umn.edu", "mathshistory.st-andrews.ac.uk", "longtermrisk.org", "jtauber.com", "journal.stuffwithstuff.com", "ideas.repec.org", "harpers.org", "hapgood.us", "googleblog.blogspot.com", "globalguerrillas.typepad.com", "felinegenetics.missouri.edu", "eva-fan.com", "esolangs.org", "eileenormsby.com", "diyhpl.us", "egamebook.com", "donsbot.com", "cs.stanford.edu", "crookedtimber.org", "care.diabetesjournals.org", "caniuse.com", "bldgblog.com", "betabeat.com", "www.chinadaily.com.cn", "googlesystem.blogspot.com", "paulfchristiano.com", "people.csail.mit.edu", "quantifiedself.com", "socghop.appspot.com", "unenumerated.blogspot.com", "web.archive.org", "www.aging-us.com", "www.belfasttelegraph.co.uk", "www.benkuhn.net", "www.bostonglobe.com", "www.brainpreservation.org", "www.bu.edu", "www.c82.net", "www.catalogtree.net", "www.cia.gov", "www.dailymail.co.uk", "www.ft.com", "www.mangaupdates.com", "www.mentalfloss.com", "www.sacbee.com", "www.sankakucomplex.com", "dresdencodak.com", "downloads.haskell.org", "ageofem.com", "ai.google", "aleph.se", "altjapan.typepad.com", "ansuz.sooke.bc.ca", "apnews.com", "arima.cylab.cmu.edu", "bair.berkeley.edu", "behavioralscientist.org", "believermag.com", "bitcoin-otc.com", "bits.blogs.nytimes.com", "blog.8faces.com", "blog.cr.yp.to", "blog.csdn.net", "blog.ethereum.org", "blog.nuclearsecrecy.com", "blog.youtube", "blogs.wsj.com", "cacm.acm.org", "carbonplan.org", "casual-effects.com", "cognitivemedium.com", "commons.wikimedia.org", "courses.csail.mit.edu", "daniellakens.blogspot.com", "data.bls.gov", "datacolada.org", "dealbook.nytimes.com", "dialnet.unirioja.es", "dominiccummings.com", "dumps.wikimedia.org", "energycontrol.org", "exac.broadinstitute.org", "familiarcycle.net", "fras.uk", "galois.com", "gamefaqs.gamespot.com", "github.blog", "globalvoices.org", "google-summer-of-code-2009-haskell.googlecode.com", "gradientscience.org", "gutenberg.net.au", "handbook-5-1.cochrane.org", "healthland.time.com", "hub.darcs.net", "iforcedabot.com", "inhumanexperiment.blogspot.com", "isomerdesign.com", "jessegalef.com", "justgetflux.com", "komonews.com", "krebsonsecurity.com", "langsec.org", "latimesblogs.latimes.com", "lettersofnote.com", "lifescivc.com", "lithub.com", "lucumr.pocoo.org", "mako.cc", "neojaponisme.com", "nbc-2.com", "mlg.eng.cam.ac.uk", "minimaxir.com", "milan.cvitkovic.net", "medicalxpress.com", "www.collectorsweekly.com", "www.cato-unbound.org", "www.alexirpan.com", "www.alessonislearned.com", "www.adelaidenow.com.au", "www.abcb.com", "writings.stephenwolfram.com", "writeswith.com", "wikimediafoundation.org", "washingtonmonthly.com", "trixter.oldskool.org", "tools.wmflabs.org", "tomcritchlow.com", "thehardestscience.com", "strategy.wikimedia.org", "spp.fas.org", "sociologicalscience.com", "socialsciences.mcmaster.ca", "sf-encyclopedia.com", "search.wikileaks.org", "schoolgirlmilkycrisis.com", "scarybeastsecurity.blogspot.com", "reflectivedisequilibrium.blogspot.com", "readwrite.com", "quillette.com", "psychonautwiki.org", "psych.hanover.edu", "programme.exordo.com", "politicalcalculations.blogspot.com", "pharmacyreviewer.co", "petertodd.org", "pediatrics.aappublications.org", "pages.jh.edu", "orionmagazine.org", "nyaa.si", "nootropicsdepot.com", "ngm.nationalgeographic.com", "thebaffler.com", "svilentodorov.xyz", "www.computerworld.com", "vinoshipper.com", "www.mcall.com", "www.latimes.com", "www.koreatimes.co.kr", "www.kooslooijesteijn.net", "www.khara.co.jp", "www.justinpinkney.com", "www.johnsonessays.com", "www.inkandswitch.com", "www.independent.ie", "www.incompleteideas.net", "www.hsx.com", "www.heraldsun.com.au", "www.harrowell.org.uk", "www.globalsecurity.org", "www.ghibli.jp", "www.galbithink.org", "www.fast.ai", "www.evacommentary.org", "www.discoverteas.com", "www.depauw.edu", "www.deseret.com", "www.davidbrin.com", "www.davidbordwell.net", "www.dagbladet.no", "www.daemonology.net", "www.cs.odu.edu", "www.cs.dartmouth.edu", "www.couriermail.com.au", "www.hbs.edu", "www.infranken.de", "www.pelleas.net", "www.pewresearch.org", "www.pcmag.com", "www.oricon.co.jp", "www.nyaa.eu", "www.nps.gov", "www.nplusonemag.com", "www.noisebridge.net", "www.nextplatform.com", "www.nextbigfuture.com", "www.newstatesman.com", "www.newsday.com", "www.metzdowd.com", "www.zeit.de", "www.webmd.com", "www.usnews.com", "www.uk-anime.net", "www.tranquiltuesdays.com", "www.thesmokinggun.com", "www.scienceagogo.com", "www.scielo.br", "www.rxshop.md", "www.righto.com", "www.project-imas.com", "www.wired.co.uk", "www.talyarkoni.org", "www.statnews.com", "www.sleep-journal.com", "www.slate.com", "www.sjsu.edu", "www.sirlin.net", "www.shawlocal.com", "www.sciencemadness.org", "abcnews.go.com", "www.washingtontimes.com", "abcnotation.com", "www.princeton.edu", "r6.ca", "www.technologyreview.com", "www.ncbi.nlm.nih.gov", "retractionwatch.com", "www.dartmouth.edu", "www.cnn.com", "www.yf.io", "www.wtnh.com", "www.writingroutines.com", "www.wheels.org", "www.vesta.earth", "www.uliwestphal.de", "www.ubu.com", "www.tt-forums.net", "www.trubrain.com", "www.trentonbricken.com", "www.tomshardware.com", "www.themtank.org", "www.thedenverchannel.com", "www.systutorials.com", "www.sumsar.net", "www.stripes.com", "www.ssc.wisc.edu", "www.sqlite.org", "www.spring.org.uk", "www.spiked-online.com", "www.siliconera.com", "www.rosebud.ai", "www.reg.ru", "www.punchlinedesign.net", "www.prolific.co", "www.politico.com", "www.orbuch.com", "www.nationalgeographic.com", "www.microdose.me", "www.lifeview.com", "www.lehighvalleylive.com", "www.ledger-cli.org", "www.jdmoyer.com", "www.jamesfadiman.com", "www.itmedia.co.jp", "www.intechopen.com", "www.freakonomicsexperiments.com", "www.eduref.net", "www.coderelay.io", "www.cleveland.com", "www.chrisstucchio.com", "www.chrisplaysgames.com", "www.broadinstitute.org", "www.becker-posner-blog.com", "www.artnome.com", "www.andzuck.com", "www.allencheng.com", "www.alicemaz.com", "www.adamsmith.org", "www.aboutamazon.com", "www-cs-faculty.stanford.edu", "wiki.lesswrong.com", "whyevolutionistrue.com", "web.media.mit.edu", "vfxblog.com", "vdfresearch.org", "vastabrupt.com", "vasilishynkarenka.com", "tug.org", "tosche.net", "thoughtcrime.crummy.com", "thiseyedoesnotexist.com", "thenewstatistics.com", "thebrowser.com", "the-toast.net", "teageegeepea.tripod.com", "stevenson.lab.uconn.edu", "stephenmalina.com", "status451.com", "stackroboflow.com", "slimemoldtimemold.com", "seths.blog", "scientistatwork.blogs.nytimes.com", "sciencebulletin.org", "science.ksc.nasa.gov", "samoburja.com", "ruder.io", "read-the-samples.netlify.app", "quadrant.org.au", "pytorch.org", "pudding.cool", "projects.tampabay.com", "projects.jsonline.com", "poets.org", "poemanalysis.com", "personal.math.ubc.ca", "people.idsia.ch", "people.com", "oscarbonilla.com", "orwell.ru", "opensource.adobe.com", "ooo.ghostbows.ooo", "news.nationalgeographic.com", "mssv.net", "mosaicscience.com", "ml.berkeley.edu", "mkv25.net", "mathbabe.org", "mailchi.mp", "magazine.atavist.com", "longitudinal.blog", "littlebiggy.org", "lavaan.ugent.be", "larryniven.net", "laion.ai", "kojimars.at.webry.info", "kevinlynagh.com", "kev.town", "kajsotala.fi", "journals.biologists.com", "beza1e1.tuxen.de", "web.archive.org", "www.pcworld.com", "www.unqualified-reservations.org", "evaotaku.com", "forre.st", "mikepower.pressfolios.com", "www.coyneoftherealm.com", "wiki.openttdcoop.org", "quinndunki.com", "learning.mpi-sws.org", "jov.arvojournals.org", "jakewestfall.org", "e2eml.school", "defector.com", "davidepstein.com", "corpgov.law.harvard.edu", "copilot.github.com", "constancecrozier.com", "complearn.org", "compdemocracy.org", "catonmat.net", "calhoun.nps.edu", "bwc.thelab.dc.gov", "blog.thinkst.com", "blog.regehr.org", "blog.cryptographyengineering.com", "b-ok.cc", "archive.seattletimes.com", "architext.design", "andymatuschak.org", "alexanderetz.com", "advertising-effects.chicagobooth.edu", "about.google", "6thfloor.blogs.nytimes.com", "www2.biology.ualberta.ca", "www.wesjones.com", "www.urbandharma.org", "www.tlmc.eu", "www.rfreitas.com", "www.moserware.com", "ew.com", "examples.yourdictionary.com", "fs.blog", "freedomdefined.org", "fibery.io", "fastmoe.ai", "joshmitteldorf.scienceblog.com", "jonmillward.com", "johncwright.livejournal.com", "joa.sh", "jgeekstudies.org", "jdlm.info", "jaypsong.blog", "jax.readthedocs.io", "jamesyu.org", "image-net.org", "ifdo.ca", "historycooperative.org", "herbsutter.com", "hdsr.mitpress.mit.edu", "hakaimagazine.com", "gutenberg.ca", "gpt3demo.com", "gondwanaland.com", "gaotianyu.xyz", "futurism.com", "extras.denverpost.com", "eurekamag.com", "eukaryotewritesblog.com", "etienne.se", "endlessvn.io", "statmodeling.stat.columbia.edu", "archive.nytimes.com", "www.michaellight.net", "www.otakustudy.com", "www.baka-tsuki.org", "story.californiasunday.com", "thispersondoesnotexist.com", "metropolitician.blogs.com", "pauillac.inria.fr", "asktog.com", "www.unf.edu" ].join(", "),
iframeSubdomainWhitelist: $257eb53020aecc3f$export$8aab31ab0bf990c8.join(", ")
},
migrations: [ $b80fd2360d77010c$export$2e2bcd8739ae039.migrations.removeUnused ],
logging: !0,
storageType: "local"
}), $75c9c0e6bbf7a434$export$c019608e5b5bb4cb = {
all: async () => await $75c9c0e6bbf7a434$export$fd598f5d6ce00b10.getAll(),
renderBlocklist: $75c9c0e6bbf7a434$var$csvSetting("renderBlocklist"),
iframe: {
domainWhitelist: $75c9c0e6bbf7a434$var$csvSetting("iframeDomainWhitelist"),
subdomainWhitelist: $75c9c0e6bbf7a434$var$csvSetting("iframeSubdomainWhitelist")
}
};
function $75c9c0e6bbf7a434$var$csvSetting(name) {
return async () => {
const all = await $75c9c0e6bbf7a434$export$c019608e5b5bb4cb.all();
return $75c9c0e6bbf7a434$var$parseCsv(all[name]);
};
}
const $75c9c0e6bbf7a434$var$parseCsv = csv => csv.split(",").map((s => s.trim()));
var $6eSS9 = parcelRequire("6eSS9");
$6eSS9.action?.onClicked.addListener((async () => $6eSS9.runtime.openOptionsPage())),
$6eSS9.browserAction?.onClicked.addListener((async () => $6eSS9.runtime.openOptionsPage()));
$6eSS9.contextMenus.create({
id: "copy-page-fragment",
title: "Copy Page Fragment",
contexts: [ "all" ]
}), $6eSS9.contextMenus.onClicked.addListener(((info, tab) => {
"copy-page-fragment" === info.menuItemId && $6eSS9.tabs.sendMessage(tab?.id, {
type: "copy-page-fragment",
elementId: info.targetElementId
});
}));
})();
!function(modules, entry, mainEntry, parcelRequireName, globalName) {
var globalObject = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof self ? self : "undefined" != typeof window ? window : "undefined" != typeof global ? global : {}, previousRequire = "function" == typeof globalObject.parcelRequire94c2 && globalObject.parcelRequire94c2, cache = previousRequire.cache || {}, nodeRequire = "undefined" != typeof module && "function" == typeof module.require && module.require.bind(module);
function newRequire(name, jumped) {
if (!cache[name]) {
if (!modules[name]) {
var currentRequire = "function" == typeof globalObject.parcelRequire94c2 && globalObject.parcelRequire94c2;
if (!jumped && currentRequire) return currentRequire(name, !0);
if (previousRequire) return previousRequire(name, !0);
if (nodeRequire && "string" == typeof name) return nodeRequire(name);
var err = new Error("Cannot find module '" + name + "'");
throw err.code = "MODULE_NOT_FOUND", err;
}
localRequire.resolve = function(x) {
var id = modules[name][1][x];
return null != id ? id : x;
}, localRequire.cache = {};
var module = cache[name] = new newRequire.Module(name);
modules[name][0].call(module.exports, localRequire, module, module.exports, this);
}
return cache[name].exports;
function localRequire(x) {
var res = localRequire.resolve(x);
return !1 === res ? {} : newRequire(res);
}
}
newRequire.isParcelRequire = !0, newRequire.Module = function(moduleName) {
this.id = moduleName, this.bundle = newRequire, this.exports = {};
}, newRequire.modules = modules, newRequire.cache = cache, newRequire.parent = previousRequire,
newRequire.register = function(id, exports) {
modules[id] = [ function(require, module) {
module.exports = exports;
}, {} ];
}, Object.defineProperty(newRequire, "root", {
get: function() {
return globalObject.parcelRequire94c2;
}
}), globalObject.parcelRequire94c2 = newRequire;
for (var i = 0; i < entry.length; i++) newRequire(entry[i]);
var mainExports = newRequire("ceFB6");
"object" == typeof exports && "undefined" != typeof module ? module.exports = mainExports : "function" == typeof define && define.amd && define((function() {
return mainExports;
}));
}({
ceFB6: [ function(require, module, exports) {
var _optionsStorage = require("../options/options-storage"), _linkRenderer = require("../rendering/link-renderer"), _tippy = require("../utils/tippy"), _copyFragment = require("./copy-fragment"), _utils = require("./background-simulation/utils");
_copyFragment.setupEventHandlers();
async function initPreview(link) {
const previewElement = await _linkRenderer.render(new URL(link.href));
previewElement && (link.classList.add("link-with-preview"), _tippy.showTippy(link, previewElement));
}
const checkIfLinkAndInit = node => {
if (node instanceof HTMLAnchorElement || node instanceof HTMLAreaElement) initPreview(node); else if (node instanceof HTMLElement) {
node.querySelectorAll("a, area").forEach(initPreview);
}
};
(async () => {
if (await (async () => (await _optionsStorage.Options.renderBlocklist()).every((domain => !window.location.hostname.endsWith(domain))))()) {
await _utils.backgroundSimulation.setup();
!async function() {
Array.from(document.links).forEach(initPreview);
}(), new MutationObserver((mutations1 => {
mutations1.flatMap((mutations => Array.from(mutations.addedNodes))).forEach(checkIfLinkAndInit);
})).observe(document.body, {
childList: !0,
subtree: !0
});
}
})();
}, {
"../options/options-storage": "cC9ui",
"../rendering/link-renderer": "1nDdc",
"../utils/tippy": "e2a04",
"./copy-fragment": "lLqAJ",
"./background-simulation/utils": "f9TqR"
} ],
"1nDdc": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "render", (() => render));
var _reactDom = require("react-dom"), _textFragmentRenderer = require("./text-fragment-renderer"), _iframeRenderer = require("./iframe-renderer"), _wikipediaRenderer = require("./wikipedia-renderer"), _async = require("../common/async");
const allRenderers = [ new _textFragmentRenderer.TextFragmentRenderer, new _wikipediaRenderer.WikipediaRenderer, new _iframeRenderer.IframeRenderer ], render = async (link, renderers = allRenderers) => {
if (!await canRender(link, renderers)) return null;
const renderContainer = function() {
const renderContainer = document.createElement("div");
return renderContainer.className = "link-preview-container", renderContainer;
}();
return buildReactComponent(renderers, link)?.then((component => {
_reactDom.render(component, renderContainer);
})), renderContainer;
}, canRender = async (link, renderers = allRenderers) => _async.someAsync(renderers, (renderer => renderer.canRender(link))), buildReactComponent = async (renderers, link) => {
const renderer = await _async.findAsync(renderers, (r => r.canRender(link)));
if (!renderer) throw new Error("No matching renderer found");
return renderer.render(link);
};
}, {
"react-dom": "kkIn3",
"./text-fragment-renderer": "6T5b7",
"./iframe-renderer": "ldmw9",
"./wikipedia-renderer": "jpmSP",
"../common/async": "ajAj2",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"6T5b7": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "TextFragmentRenderer", (() => TextFragmentRenderer));
var _jsxRuntime = require("@emotion/react/jsx-runtime"), _utils = require("../content/background-simulation/utils");
class TextFragmentRenderer {
async canRender(url) {
return url.href.includes(":~:");
}
async render(url) {
const elementsByFragment = await _utils.backgroundSimulation.execute({
type: "get-fragment-elements",
url: url.href
});
return _jsxRuntime.jsx("div", {
className: "text-fragment-preview",
children: elementsByFragment.map(((elements, index) => _jsxRuntime.jsx("div", {
dangerouslySetInnerHTML: {
__html: elements
}
}, index)))
});
}
}
}, {
"@emotion/react/jsx-runtime": "1M0aq",
"../content/background-simulation/utils": "f9TqR",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
f9TqR: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "backgroundSimulation", (() => backgroundSimulation));
var _webextensionPolyfill = require("webextension-polyfill");
const backgroundSimulation = new class {
ongoingExecutions=new Map;
get url() {
return _webextensionPolyfill.runtime.getURL("up_/content/background-simulation/index.html");
}
async setup() {
if (this.iframe) return this.iframe;
const iframe = function(url) {
const iframe = document.createElement("iframe");
return iframe.src = url, iframe.style.display = "none", document.body.appendChild(iframe),
iframe;
}(this.url);
return this.setupExecutionResultHandler(), new Promise((resolve => {
iframe.onload = () => {
this.iframe = iframe, resolve(iframe);
};
}));
}
setupExecutionResultHandler() {
window.addEventListener("message", (event => {
if ("command-result" === event.data.type) {
const [resolve, reject] = this.ongoingExecutions.get(event.data.id);
event.data.result ? resolve(event.data.result) : reject(event.data.error), this.ongoingExecutions.delete(event.data.id);
}
}));
}
async execute(command) {
const commandId = this.initiateExecution(command);
return new Promise(((resolve, reject) => {
this.ongoingExecutions.set(commandId, [ resolve, reject ]);
}));
}
initiateExecution(command) {
const commandId = crypto.randomUUID();
return this.iframe?.contentWindow?.postMessage({
...command,
commandId: commandId
}, "*"), commandId;
}
};
}, {
"webextension-polyfill": "1SqAv",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"1SqAv": [ function(require, module, exports) {
var factory;
"undefined" != typeof globalThis ? globalThis : "undefined" != typeof self && self,
factory = function(module) {
"use strict";
if ("object" != typeof globalThis || "object" != typeof chrome || !chrome || !chrome.runtime || !chrome.runtime.id) throw new Error("This script should only be loaded in a browser extension.");
if (void 0 === globalThis.browser || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) {
const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.", SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)", wrapAPIs = extensionAPIs => {
const apiMetadata = {
alarms: {
clear: {
minArgs: 0,
maxArgs: 1
},
clearAll: {
minArgs: 0,
maxArgs: 0
},
get: {
minArgs: 0,
maxArgs: 1
},
getAll: {
minArgs: 0,
maxArgs: 0
}
},
bookmarks: {
create: {
minArgs: 1,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 1
},
getChildren: {
minArgs: 1,
maxArgs: 1
},
getRecent: {
minArgs: 1,
maxArgs: 1
},
getSubTree: {
minArgs: 1,
maxArgs: 1
},
getTree: {
minArgs: 0,
maxArgs: 0
},
move: {
minArgs: 2,
maxArgs: 2
},
remove: {
minArgs: 1,
maxArgs: 1
},
removeTree: {
minArgs: 1,
maxArgs: 1
},
search: {
minArgs: 1,
maxArgs: 1
},
update: {
minArgs: 2,
maxArgs: 2
}
},
browserAction: {
disable: {
minArgs: 0,
maxArgs: 1,
fallbackToNoCallback: !0
},
enable: {
minArgs: 0,
maxArgs: 1,
fallbackToNoCallback: !0
},
getBadgeBackgroundColor: {
minArgs: 1,
maxArgs: 1
},
getBadgeText: {
minArgs: 1,
maxArgs: 1
},
getPopup: {
minArgs: 1,
maxArgs: 1
},
getTitle: {
minArgs: 1,
maxArgs: 1
},
openPopup: {
minArgs: 0,
maxArgs: 0
},
setBadgeBackgroundColor: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setBadgeText: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setIcon: {
minArgs: 1,
maxArgs: 1
},
setPopup: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setTitle: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
}
},
browsingData: {
remove: {
minArgs: 2,
maxArgs: 2
},
removeCache: {
minArgs: 1,
maxArgs: 1
},
removeCookies: {
minArgs: 1,
maxArgs: 1
},
removeDownloads: {
minArgs: 1,
maxArgs: 1
},
removeFormData: {
minArgs: 1,
maxArgs: 1
},
removeHistory: {
minArgs: 1,
maxArgs: 1
},
removeLocalStorage: {
minArgs: 1,
maxArgs: 1
},
removePasswords: {
minArgs: 1,
maxArgs: 1
},
removePluginData: {
minArgs: 1,
maxArgs: 1
},
settings: {
minArgs: 0,
maxArgs: 0
}
},
commands: {
getAll: {
minArgs: 0,
maxArgs: 0
}
},
contextMenus: {
remove: {
minArgs: 1,
maxArgs: 1
},
removeAll: {
minArgs: 0,
maxArgs: 0
},
update: {
minArgs: 2,
maxArgs: 2
}
},
cookies: {
get: {
minArgs: 1,
maxArgs: 1
},
getAll: {
minArgs: 1,
maxArgs: 1
},
getAllCookieStores: {
minArgs: 0,
maxArgs: 0
},
remove: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
},
devtools: {
inspectedWindow: {
eval: {
minArgs: 1,
maxArgs: 2,
singleCallbackArg: !1
}
},
panels: {
create: {
minArgs: 3,
maxArgs: 3,
singleCallbackArg: !0
},
elements: {
createSidebarPane: {
minArgs: 1,
maxArgs: 1
}
}
}
},
downloads: {
cancel: {
minArgs: 1,
maxArgs: 1
},
download: {
minArgs: 1,
maxArgs: 1
},
erase: {
minArgs: 1,
maxArgs: 1
},
getFileIcon: {
minArgs: 1,
maxArgs: 2
},
open: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
pause: {
minArgs: 1,
maxArgs: 1
},
removeFile: {
minArgs: 1,
maxArgs: 1
},
resume: {
minArgs: 1,
maxArgs: 1
},
search: {
minArgs: 1,
maxArgs: 1
},
show: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
}
},
extension: {
isAllowedFileSchemeAccess: {
minArgs: 0,
maxArgs: 0
},
isAllowedIncognitoAccess: {
minArgs: 0,
maxArgs: 0
}
},
history: {
addUrl: {
minArgs: 1,
maxArgs: 1
},
deleteAll: {
minArgs: 0,
maxArgs: 0
},
deleteRange: {
minArgs: 1,
maxArgs: 1
},
deleteUrl: {
minArgs: 1,
maxArgs: 1
},
getVisits: {
minArgs: 1,
maxArgs: 1
},
search: {
minArgs: 1,
maxArgs: 1
}
},
i18n: {
detectLanguage: {
minArgs: 1,
maxArgs: 1
},
getAcceptLanguages: {
minArgs: 0,
maxArgs: 0
}
},
identity: {
launchWebAuthFlow: {
minArgs: 1,
maxArgs: 1
}
},
idle: {
queryState: {
minArgs: 1,
maxArgs: 1
}
},
management: {
get: {
minArgs: 1,
maxArgs: 1
},
getAll: {
minArgs: 0,
maxArgs: 0
},
getSelf: {
minArgs: 0,
maxArgs: 0
},
setEnabled: {
minArgs: 2,
maxArgs: 2
},
uninstallSelf: {
minArgs: 0,
maxArgs: 1
}
},
notifications: {
clear: {
minArgs: 1,
maxArgs: 1
},
create: {
minArgs: 1,
maxArgs: 2
},
getAll: {
minArgs: 0,
maxArgs: 0
},
getPermissionLevel: {
minArgs: 0,
maxArgs: 0
},
update: {
minArgs: 2,
maxArgs: 2
}
},
pageAction: {
getPopup: {
minArgs: 1,
maxArgs: 1
},
getTitle: {
minArgs: 1,
maxArgs: 1
},
hide: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setIcon: {
minArgs: 1,
maxArgs: 1
},
setPopup: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
setTitle: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
},
show: {
minArgs: 1,
maxArgs: 1,
fallbackToNoCallback: !0
}
},
permissions: {
contains: {
minArgs: 1,
maxArgs: 1
},
getAll: {
minArgs: 0,
maxArgs: 0
},
remove: {
minArgs: 1,
maxArgs: 1
},
request: {
minArgs: 1,
maxArgs: 1
}
},
runtime: {
getBackgroundPage: {
minArgs: 0,
maxArgs: 0
},
getPlatformInfo: {
minArgs: 0,
maxArgs: 0
},
openOptionsPage: {
minArgs: 0,
maxArgs: 0
},
requestUpdateCheck: {
minArgs: 0,
maxArgs: 0
},
sendMessage: {
minArgs: 1,
maxArgs: 3
},
sendNativeMessage: {
minArgs: 2,
maxArgs: 2
},
setUninstallURL: {
minArgs: 1,
maxArgs: 1
}
},
sessions: {
getDevices: {
minArgs: 0,
maxArgs: 1
},
getRecentlyClosed: {
minArgs: 0,
maxArgs: 1
},
restore: {
minArgs: 0,
maxArgs: 1
}
},
storage: {
local: {
clear: {
minArgs: 0,
maxArgs: 0
},
get: {
minArgs: 0,
maxArgs: 1
},
getBytesInUse: {
minArgs: 0,
maxArgs: 1
},
remove: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
},
managed: {
get: {
minArgs: 0,
maxArgs: 1
},
getBytesInUse: {
minArgs: 0,
maxArgs: 1
}
},
sync: {
clear: {
minArgs: 0,
maxArgs: 0
},
get: {
minArgs: 0,
maxArgs: 1
},
getBytesInUse: {
minArgs: 0,
maxArgs: 1
},
remove: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
}
},
tabs: {
captureVisibleTab: {
minArgs: 0,
maxArgs: 2
},
create: {
minArgs: 1,
maxArgs: 1
},
detectLanguage: {
minArgs: 0,
maxArgs: 1
},
discard: {
minArgs: 0,
maxArgs: 1
},
duplicate: {
minArgs: 1,
maxArgs: 1
},
executeScript: {
minArgs: 1,
maxArgs: 2
},
get: {
minArgs: 1,
maxArgs: 1
},
getCurrent: {
minArgs: 0,
maxArgs: 0
},
getZoom: {
minArgs: 0,
maxArgs: 1
},
getZoomSettings: {
minArgs: 0,
maxArgs: 1
},
goBack: {
minArgs: 0,
maxArgs: 1
},
goForward: {
minArgs: 0,
maxArgs: 1
},
highlight: {
minArgs: 1,
maxArgs: 1
},
insertCSS: {
minArgs: 1,
maxArgs: 2
},
move: {
minArgs: 2,
maxArgs: 2
},
query: {
minArgs: 1,
maxArgs: 1
},
reload: {
minArgs: 0,
maxArgs: 2
},
remove: {
minArgs: 1,
maxArgs: 1
},
removeCSS: {
minArgs: 1,
maxArgs: 2
},
sendMessage: {
minArgs: 2,
maxArgs: 3
},
setZoom: {
minArgs: 1,
maxArgs: 2
},
setZoomSettings: {
minArgs: 1,
maxArgs: 2
},
update: {
minArgs: 1,
maxArgs: 2
}
},
topSites: {
get: {
minArgs: 0,
maxArgs: 0
}
},
webNavigation: {
getAllFrames: {
minArgs: 1,
maxArgs: 1
},
getFrame: {
minArgs: 1,
maxArgs: 1
}
},
webRequest: {
handlerBehaviorChanged: {
minArgs: 0,
maxArgs: 0
}
},
windows: {
create: {
minArgs: 0,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 2
},
getAll: {
minArgs: 0,
maxArgs: 1
},
getCurrent: {
minArgs: 0,
maxArgs: 1
},
getLastFocused: {
minArgs: 0,
maxArgs: 1
},
remove: {
minArgs: 1,
maxArgs: 1
},
update: {
minArgs: 2,
maxArgs: 2
}
}
};
if (0 === Object.keys(apiMetadata).length) throw new Error("api-metadata.json has not been included in browser-polyfill");
class DefaultWeakMap extends WeakMap {
constructor(createItem, items) {
super(items), this.createItem = createItem;
}
get(key) {
return this.has(key) || this.set(key, this.createItem(key)), super.get(key);
}
}
const makeCallback = (promise, metadata) => (...callbackArgs) => {
extensionAPIs.runtime.lastError ? promise.reject(new Error(extensionAPIs.runtime.lastError.message)) : metadata.singleCallbackArg || callbackArgs.length <= 1 && !1 !== metadata.singleCallbackArg ? promise.resolve(callbackArgs[0]) : promise.resolve(callbackArgs);
}, pluralizeArguments = numArgs => 1 == numArgs ? "argument" : "arguments", wrapMethod = (target, method, wrapper) => new Proxy(method, {
apply: (targetMethod, thisObj, args) => wrapper.call(thisObj, target, ...args)
});
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
const wrapObject = (target, wrappers = {}, metadata = {}) => {
let cache = Object.create(null), handlers = {
has: (proxyTarget, prop) => prop in target || prop in cache,
get(proxyTarget, prop, receiver) {
if (prop in cache) return cache[prop];
if (!(prop in target)) return;
let value1 = target[prop];
if ("function" == typeof value1) if ("function" == typeof wrappers[prop]) value1 = wrapMethod(target, target[prop], wrappers[prop]); else if (hasOwnProperty(metadata, prop)) {
let wrapper = ((name, metadata) => function(target, ...args) {
if (args.length < metadata.minArgs) throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
if (args.length > metadata.maxArgs) throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
return new Promise(((resolve, reject) => {
if (metadata.fallbackToNoCallback) try {
target[name](...args, makeCallback({
resolve: resolve,
reject: reject
}, metadata));
} catch (cbError) {
console.warn(`${name} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `, cbError),
target[name](...args), metadata.fallbackToNoCallback = !1, metadata.noCallback = !0,
resolve();
} else metadata.noCallback ? (target[name](...args), resolve()) : target[name](...args, makeCallback({
resolve: resolve,
reject: reject
}, metadata));
}));
})(prop, metadata[prop]);
value1 = wrapMethod(target, target[prop], wrapper);
} else value1 = value1.bind(target); else if ("object" == typeof value1 && null !== value1 && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) value1 = wrapObject(value1, wrappers[prop], metadata[prop]); else {
if (!hasOwnProperty(metadata, "*")) return Object.defineProperty(cache, prop, {
configurable: !0,
enumerable: !0,
get: () => target[prop],
set(value) {
target[prop] = value;
}
}), value1;
value1 = wrapObject(value1, wrappers[prop], metadata["*"]);
}
return cache[prop] = value1, value1;
},
set: (proxyTarget, prop, value, receiver) => (prop in cache ? cache[prop] = value : target[prop] = value,
!0),
defineProperty: (proxyTarget, prop, desc) => Reflect.defineProperty(cache, prop, desc),
deleteProperty: (proxyTarget, prop) => Reflect.deleteProperty(cache, prop)
}, proxyTarget = Object.create(target);
return new Proxy(proxyTarget, handlers);
}, wrapEvent = wrapperMap => ({
addListener(target, listener, ...args) {
target.addListener(wrapperMap.get(listener), ...args);
},
hasListener: (target, listener) => target.hasListener(wrapperMap.get(listener)),
removeListener(target, listener) {
target.removeListener(wrapperMap.get(listener));
}
}), onRequestFinishedWrappers = new DefaultWeakMap((listener => "function" != typeof listener ? listener : function(req) {
const wrappedReq = wrapObject(req, {}, {
getContent: {
minArgs: 0,
maxArgs: 0
}
});
listener(wrappedReq);
}));
let loggedSendResponseDeprecationWarning = !1;
const onMessageWrappers = new DefaultWeakMap((listener => "function" != typeof listener ? listener : function(message1, sender, sendResponse) {
let wrappedSendResponse, result, didCallSendResponse = !1, sendResponsePromise = new Promise((resolve => {
wrappedSendResponse = function(response) {
loggedSendResponseDeprecationWarning || (console.warn(SEND_RESPONSE_DEPRECATION_WARNING, (new Error).stack),
loggedSendResponseDeprecationWarning = !0), didCallSendResponse = !0, resolve(response);
};
}));
try {
result = listener(message1, sender, wrappedSendResponse);
} catch (err1) {
result = Promise.reject(err1);
}
const isResultThenable = !0 !== result && (value = result) && "object" == typeof value && "function" == typeof value.then;
var value;
if (!0 !== result && !isResultThenable && !didCallSendResponse) return !1;
const sendPromisedResult = promise => {
promise.then((msg => {
sendResponse(msg);
}), (error => {
let message;
message = error && (error instanceof Error || "string" == typeof error.message) ? error.message : "An unexpected error occurred",
sendResponse({
__mozWebExtensionPolyfillReject__: !0,
message: message
});
})).catch((err => {
console.error("Failed to send onMessage rejected reply", err);
}));
};
return sendPromisedResult(isResultThenable ? result : sendResponsePromise), !0;
})), wrappedSendMessageCallback = ({reject: reject, resolve: resolve}, reply) => {
extensionAPIs.runtime.lastError ? extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE ? resolve() : reject(new Error(extensionAPIs.runtime.lastError.message)) : reply && reply.__mozWebExtensionPolyfillReject__ ? reject(new Error(reply.message)) : resolve(reply);
}, wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
if (args.length < metadata.minArgs) throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
if (args.length > metadata.maxArgs) throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
return new Promise(((resolve, reject) => {
const wrappedCb = wrappedSendMessageCallback.bind(null, {
resolve: resolve,
reject: reject
});
args.push(wrappedCb), apiNamespaceObj.sendMessage(...args);
}));
}, staticWrappers = {
devtools: {
network: {
onRequestFinished: wrapEvent(onRequestFinishedWrappers)
}
},
runtime: {
onMessage: wrapEvent(onMessageWrappers),
onMessageExternal: wrapEvent(onMessageWrappers),
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 1,
maxArgs: 3
})
},
tabs: {
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 2,
maxArgs: 3
})
}
}, settingMetadata = {
clear: {
minArgs: 1,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
};
return apiMetadata.privacy = {
network: {
"*": settingMetadata
},
services: {
"*": settingMetadata
},
websites: {
"*": settingMetadata
}
}, wrapObject(extensionAPIs, staticWrappers, apiMetadata);
};
module.exports = wrapAPIs(chrome);
} else module.exports = globalThis.browser;
}, "function" == typeof define && define.amd ? define("webextension-polyfill", [ "module" ], factory) : factory(module);
}, {} ],
ldmw9: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "IframeRenderer", (() => IframeRenderer));
var _jsxRuntime = require("@emotion/react/jsx-runtime"), _optionsStorage = require("../options/options-storage");
class IframeRenderer {
async canRender(url) {
const domainWhitelist = await _optionsStorage.Options.iframe.domainWhitelist(), subdomainWhitelist = await _optionsStorage.Options.iframe.subdomainWhitelist();
return domainWhitelist.some((domain => url.hostname.includes(domain))) || subdomainWhitelist.some((domain => url.hostname.endsWith(domain)));
}
async render(url) {
return _jsxRuntime.jsx("iframe", {
className: "iframe-preview",
src: url.href
});
}
}
}, {
"@emotion/react/jsx-runtime": "1M0aq",
"../options/options-storage": "cC9ui",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
jpmSP: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "WikipediaRenderer", (() => WikipediaRenderer));
var _jsxRuntime = require("@emotion/react/jsx-runtime");
class WikipediaRenderer {
async canRender(url) {
return regex.test(url.href);
}
async render(url) {
return _jsxRuntime.jsx("iframe", {
className: "wikipedia-preview",
src: rewriteToMobile(url.href)
});
}
}
function rewriteToMobile(link) {
const match = link.match(regex);
if (match.length > 4) return link;
const finalComponent = match[3];
return `https://${match[1]}.m.${match[2]}.org/wiki/${finalComponent}${(finalComponent => finalComponent.includes("#") ? "" : "#firstHeading")(finalComponent)}`;
}
const regex = /^https?:\/\/([\w]+)(?:\.m)?\.(wikipedia|wikibooks|wikiversity|wikivoyage|wikisource|wikiquote|wikinews|wikimedia)\.org\/wiki\/(.+)/;
}, {
"@emotion/react/jsx-runtime": "1M0aq",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
ajAj2: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "someAsync", (() => someAsync)),
parcelHelpers.export(exports, "findIndexAsync", (() => findIndexAsync)), parcelHelpers.export(exports, "findAsync", (() => findAsync)),
parcelHelpers.export(exports, "mapAsync", (() => mapAsync)), parcelHelpers.export(exports, "delay", (() => delay));
const someAsync = async (arr, fn) => {
const mapped = arr.map(fn);
for (const item of mapped) if (await item) return !0;
return !1;
}, findIndexAsync = async (arr, asyncCallback) => {
for (let i = 0; i < arr.length; i++) if (await asyncCallback(arr[i])) return i;
return -1;
}, findAsync = async (arr, asyncCallback) => {
const mapped = arr.map(asyncCallback);
return arr[await findIndexAsync(mapped, (result => result))];
}, mapAsync = async (arr, asyncCallback) => {
const mapped = arr.map(asyncCallback);
return Promise.all(mapped);
}, delay = ms => new Promise((resolve => {
setTimeout(resolve, ms);
}));
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
e2a04: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "showTippy", (() => showTippy));
var _tippyJs = require("tippy.js"), _tippyJsDefault = parcelHelpers.interopDefault(_tippyJs), _keyboard = require("../common/keyboard"), _shadowCss = require("bundle-text:../content/shadow.css"), _shadowCssDefault = parcelHelpers.interopDefault(_shadowCss), _introductionCounter = require("./introduction-counter");
const shadowRoot = function() {
const shadowContainer = document.createElement("div");
shadowContainer.className = "transclude-shadow-container";
const shadowRoot1 = shadowContainer.attachShadow({
mode: "open"
}), style = document.createElement("style");
return style.innerText = _shadowCssDefault.default, shadowRoot1.append(style), document.body.append(shadowContainer),
shadowRoot1;
}();
function showTippy(link, previewElement) {
_tippyJsDefault.default(link, {
content: previewElement,
plugins: [ buttonPressPlugin("Alt") ],
placement: "bottom",
arrow: !0,
appendTo: () => shadowRoot,
animation: "fade",
interactive: !0,
theme: "light",
maxWidth: "55em",
delay: [ 0, 400 ],
onShow() {}
}), async function(link) {
await _introductionCounter.IntroShownCount.isOverLimit() || _tippyJsDefault.default(link, {
content: 'Press "Alt" key while hovering over the link to see the preview',
appendTo: () => shadowRoot,
onShow() {
_introductionCounter.IntroShownCount.increment();
}
});
}(link);
}
const buttonPressPlugin = keyName1 => ({
name: "showOnButtonPress",
defaultValue: !0,
fn(instance1) {
const originalOnShow = instance1.props.onShow;
let forceShow = !1;
instance1.props.onShow = instance => forceShow ? (forceShow = !1, void originalOnShow(instance)) : !!_keyboard.isKeyDown(keyName1) && void 0;
const keyDownHandler = e => {
e.key === keyName1 && (forceShow = !0, instance1.show());
};
return {
onTrigger(instance, event) {
document.addEventListener("keydown", keyDownHandler);
},
onUntrigger(instance, event) {
forceShow = !1, document.removeEventListener("keydown", keyDownHandler);
}
};
}
});
}, {
"tippy.js": "7hfX0",
"../common/keyboard": "f1zol",
"bundle-text:../content/shadow.css": "4ThBa",
"./introduction-counter": "iXBST",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"7hfX0": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "animateFill", (() => animateFill)),
parcelHelpers.export(exports, "createSingleton", (() => createSingleton)), parcelHelpers.export(exports, "delegate", (() => delegate)),
parcelHelpers.export(exports, "followCursor", (() => followCursor)), parcelHelpers.export(exports, "hideAll", (() => hideAll)),
parcelHelpers.export(exports, "inlinePositioning", (() => inlinePositioning)), parcelHelpers.export(exports, "roundArrow", (() => ROUND_ARROW)),
parcelHelpers.export(exports, "sticky", (() => sticky));
/**!
* tippy.js v6.3.7
* (c) 2017-2021 atomiks
* MIT License
*/
var _core = require("@popperjs/core"), ROUND_ARROW = '<svg width="16" height="6" xmlns="http://www.w3.org/2000/svg"><path d="M0 6s1.796-.013 4.67-3.615C5.851.9 6.93.006 8 0c1.07-.006 2.148.887 3.343 2.385C14.233 6.005 16 6 16 6H0z"></svg>', TOUCH_OPTIONS = {
passive: !0,
capture: !0
}, TIPPY_DEFAULT_APPEND_TO = function() {
return document.body;
};
function getValueAtIndexOrReturn(value, index, defaultValue) {
if (Array.isArray(value)) {
var v = value[index];
return null == v ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v;
}
return value;
}
function isType(value, type) {
var str = {}.toString.call(value);
return 0 === str.indexOf("[object") && str.indexOf(type + "]") > -1;
}
function invokeWithArgsOrReturn(value, args) {
return "function" == typeof value ? value.apply(void 0, args) : value;
}
function debounce(fn, ms) {
return 0 === ms ? fn : function(arg) {
clearTimeout(timeout), timeout = setTimeout((function() {
fn(arg);
}), ms);
};
var timeout;
}
function removeProperties(obj, keys) {
var clone = Object.assign({}, obj);
return keys.forEach((function(key) {
delete clone[key];
})), clone;
}
function normalizeToArray(value) {
return [].concat(value);
}
function pushIfUnique(arr, value) {
-1 === arr.indexOf(value) && arr.push(value);
}
function getBasePlacement(placement) {
return placement.split("-")[0];
}
function arrayFrom(value) {
return [].slice.call(value);
}
function removeUndefinedProps(obj) {
return Object.keys(obj).reduce((function(acc, key) {
return void 0 !== obj[key] && (acc[key] = obj[key]), acc;
}), {});
}
function div() {
return document.createElement("div");
}
function isElement(value) {
return [ "Element", "Fragment" ].some((function(type) {
return isType(value, type);
}));
}
function isMouseEvent(value) {
return isType(value, "MouseEvent");
}
function isReferenceElement(value) {
return !(!value || !value._tippy || value._tippy.reference !== value);
}
function getArrayOfElements(value) {
return isElement(value) ? [ value ] : function(value) {
return isType(value, "NodeList");
}(value) ? arrayFrom(value) : Array.isArray(value) ? value : arrayFrom(document.querySelectorAll(value));
}
function setTransitionDuration(els, value) {
els.forEach((function(el) {
el && (el.style.transitionDuration = value + "ms");
}));
}
function setVisibilityState(els, state) {
els.forEach((function(el) {
el && el.setAttribute("data-state", state);
}));
}
function getOwnerDocument(elementOrElements) {
var _element$ownerDocumen, element = normalizeToArray(elementOrElements)[0];
return null != element && null != (_element$ownerDocumen = element.ownerDocument) && _element$ownerDocumen.body ? element.ownerDocument : document;
}
function updateTransitionEndListener(box, action, listener) {
var method = action + "EventListener";
[ "transitionend", "webkitTransitionEnd" ].forEach((function(event) {
box[method](event, listener);
}));
}
function actualContains(parent, child) {
for (var target = child; target; ) {
var _target$getRootNode;
if (parent.contains(target)) return !0;
target = null == target.getRootNode || null == (_target$getRootNode = target.getRootNode()) ? void 0 : _target$getRootNode.host;
}
return !1;
}
var currentInput = {
isTouch: !1
}, lastMouseMoveTime = 0;
function onDocumentTouchStart() {
currentInput.isTouch || (currentInput.isTouch = !0, window.performance && document.addEventListener("mousemove", onDocumentMouseMove));
}
function onDocumentMouseMove() {
var now = performance.now();
now - lastMouseMoveTime < 20 && (currentInput.isTouch = !1, document.removeEventListener("mousemove", onDocumentMouseMove)),
lastMouseMoveTime = now;
}
function onWindowBlur() {
var activeElement = document.activeElement;
if (isReferenceElement(activeElement)) {
var instance = activeElement._tippy;
activeElement.blur && !instance.state.isVisible && activeElement.blur();
}
}
var isIE11 = !!("undefined" != typeof window && "undefined" != typeof document) && !!window.msCrypto;
var pluginProps = {
animateFill: !1,
followCursor: !1,
inlinePositioning: !1,
sticky: !1
}, defaultProps = Object.assign({
appendTo: TIPPY_DEFAULT_APPEND_TO,
aria: {
content: "auto",
expanded: "auto"
},
delay: 0,
duration: [ 300, 250 ],
getReferenceClientRect: null,
hideOnClick: !0,
ignoreAttributes: !1,
interactive: !1,
interactiveBorder: 2,
interactiveDebounce: 0,
moveTransition: "",
offset: [ 0, 10 ],
onAfterUpdate: function() {},
onBeforeUpdate: function() {},
onCreate: function() {},
onDestroy: function() {},
onHidden: function() {},
onHide: function() {},
onMount: function() {},
onShow: function() {},
onShown: function() {},
onTrigger: function() {},
onUntrigger: function() {},
onClickOutside: function() {},
placement: "top",
plugins: [],
popperOptions: {},
render: null,
showOnCreate: !1,
touch: !0,
trigger: "mouseenter focus",
triggerTarget: null
}, pluginProps, {
allowHTML: !1,
animation: "fade",
arrow: !0,
content: "",
inertia: !1,
maxWidth: 350,
role: "tooltip",
theme: "",
zIndex: 9999
}), defaultKeys = Object.keys(defaultProps);
function getExtendedPassedProps(passedProps) {
var pluginProps1 = (passedProps.plugins || []).reduce((function(acc, plugin) {
var _name, name = plugin.name, defaultValue = plugin.defaultValue;
name && (acc[name] = void 0 !== passedProps[name] ? passedProps[name] : null != (_name = defaultProps[name]) ? _name : defaultValue);
return acc;
}), {});
return Object.assign({}, passedProps, pluginProps1);
}
function evaluateProps(reference, props) {
var out = Object.assign({}, props, {
content: invokeWithArgsOrReturn(props.content, [ reference ])
}, props.ignoreAttributes ? {} : function(reference, plugins) {
return (plugins ? Object.keys(getExtendedPassedProps(Object.assign({}, defaultProps, {
plugins: plugins
}))) : defaultKeys).reduce((function(acc, key) {
var valueAsString = (reference.getAttribute("data-tippy-" + key) || "").trim();
if (!valueAsString) return acc;
if ("content" === key) acc[key] = valueAsString; else try {
acc[key] = JSON.parse(valueAsString);
} catch (e) {
acc[key] = valueAsString;
}
return acc;
}), {});
}(reference, props.plugins));
return out.aria = Object.assign({}, defaultProps.aria, out.aria), out.aria = {
expanded: "auto" === out.aria.expanded ? props.interactive : out.aria.expanded,
content: "auto" === out.aria.content ? props.interactive ? null : "describedby" : out.aria.content
}, out;
}
function dangerouslySetInnerHTML(element, html) {
element.innerHTML = html;
}
function createArrowElement(value) {
var arrow = div();
return !0 === value ? arrow.className = "tippy-arrow" : (arrow.className = "tippy-svg-arrow",
isElement(value) ? arrow.appendChild(value) : dangerouslySetInnerHTML(arrow, value)),
arrow;
}
function setContent(content, props) {
isElement(props.content) ? (dangerouslySetInnerHTML(content, ""), content.appendChild(props.content)) : "function" != typeof props.content && (props.allowHTML ? dangerouslySetInnerHTML(content, props.content) : content.textContent = props.content);
}
function getChildren(popper) {
var box = popper.firstElementChild, boxChildren = arrayFrom(box.children);
return {
box: box,
content: boxChildren.find((function(node) {
return node.classList.contains("tippy-content");
})),
arrow: boxChildren.find((function(node) {
return node.classList.contains("tippy-arrow") || node.classList.contains("tippy-svg-arrow");
})),
backdrop: boxChildren.find((function(node) {
return node.classList.contains("tippy-backdrop");
}))
};
}
function render(instance) {
var popper = div(), box1 = div();
box1.className = "tippy-box", box1.setAttribute("data-state", "hidden"), box1.setAttribute("tabindex", "-1");
var content1 = div();
function onUpdate(prevProps, nextProps) {
var _getChildren = getChildren(popper), box = _getChildren.box, content = _getChildren.content, arrow = _getChildren.arrow;
nextProps.theme ? box.setAttribute("data-theme", nextProps.theme) : box.removeAttribute("data-theme"),
"string" == typeof nextProps.animation ? box.setAttribute("data-animation", nextProps.animation) : box.removeAttribute("data-animation"),
nextProps.inertia ? box.setAttribute("data-inertia", "") : box.removeAttribute("data-inertia"),
box.style.maxWidth = "number" == typeof nextProps.maxWidth ? nextProps.maxWidth + "px" : nextProps.maxWidth,
nextProps.role ? box.setAttribute("role", nextProps.role) : box.removeAttribute("role"),
prevProps.content === nextProps.content && prevProps.allowHTML === nextProps.allowHTML || setContent(content, instance.props),
nextProps.arrow ? arrow ? prevProps.arrow !== nextProps.arrow && (box.removeChild(arrow),
box.appendChild(createArrowElement(nextProps.arrow))) : box.appendChild(createArrowElement(nextProps.arrow)) : arrow && box.removeChild(arrow);
}
return content1.className = "tippy-content", content1.setAttribute("data-state", "hidden"),
setContent(content1, instance.props), popper.appendChild(box1), box1.appendChild(content1),
onUpdate(instance.props, instance.props), {
popper: popper,
onUpdate: onUpdate
};
}
render.$$tippy = !0;
var idCounter = 1, mouseMoveListeners = [], mountedInstances = [];
function createTippy(reference, passedProps) {
var showTimeout, hideTimeout, scheduleHideAnimationFrame, lastTriggerEvent, currentTransitionEndListener, onFirstUpdate, currentTarget, arr, props = evaluateProps(reference, Object.assign({}, defaultProps, getExtendedPassedProps(removeUndefinedProps(passedProps)))), isVisibleFromClick = !1, didHideDueToDocumentMouseDown = !1, didTouchMove = !1, ignoreOnFirstUpdate = !1, listeners = [], debouncedOnMouseMove = debounce(onMouseMove, props.interactiveDebounce), id1 = idCounter++, plugins = (arr = props.plugins).filter((function(item, index) {
return arr.indexOf(item) === index;
})), instance1 = {
id: id1,
reference: reference,
popper: div(),
popperInstance: null,
props: props,
state: {
isEnabled: !0,
isVisible: !1,
isDestroyed: !1,
isMounted: !1,
isShown: !1
},
plugins: plugins,
clearDelayTimeouts: function() {
clearTimeout(showTimeout), clearTimeout(hideTimeout), cancelAnimationFrame(scheduleHideAnimationFrame);
},
setProps: function(partialProps) {
0;
if (instance1.state.isDestroyed) return;
invokeHook("onBeforeUpdate", [ instance1, partialProps ]), removeListeners();
var prevProps = instance1.props, nextProps = evaluateProps(reference, Object.assign({}, prevProps, removeUndefinedProps(partialProps), {
ignoreAttributes: !0
}));
instance1.props = nextProps, addListeners(), prevProps.interactiveDebounce !== nextProps.interactiveDebounce && (cleanupInteractiveMouseListeners(),
debouncedOnMouseMove = debounce(onMouseMove, nextProps.interactiveDebounce));
prevProps.triggerTarget && !nextProps.triggerTarget ? normalizeToArray(prevProps.triggerTarget).forEach((function(node) {
node.removeAttribute("aria-expanded");
})) : nextProps.triggerTarget && reference.removeAttribute("aria-expanded");
handleAriaExpandedAttribute(), handleStyles(), onUpdate && onUpdate(prevProps, nextProps);
instance1.popperInstance && (createPopperInstance(), getNestedPopperTree().forEach((function(nestedPopper) {
requestAnimationFrame(nestedPopper._tippy.popperInstance.forceUpdate);
})));
invokeHook("onAfterUpdate", [ instance1, partialProps ]);
},
setContent: function(content) {
instance1.setProps({
content: content
});
},
show: function() {
0;
var isAlreadyVisible = instance1.state.isVisible, isDestroyed = instance1.state.isDestroyed, isDisabled = !instance1.state.isEnabled, isTouchAndTouchDisabled = currentInput.isTouch && !instance1.props.touch, duration = getValueAtIndexOrReturn(instance1.props.duration, 0, defaultProps.duration);
if (isAlreadyVisible || isDestroyed || isDisabled || isTouchAndTouchDisabled) return;
if (getCurrentTarget().hasAttribute("disabled")) return;
if (invokeHook("onShow", [ instance1 ], !1), !1 === instance1.props.onShow(instance1)) return;
instance1.state.isVisible = !0, getIsDefaultRenderFn() && (popper1.style.visibility = "visible");
handleStyles(), addDocumentPress(), instance1.state.isMounted || (popper1.style.transition = "none");
if (getIsDefaultRenderFn()) {
var _getDefaultTemplateCh2 = getDefaultTemplateChildren(), box = _getDefaultTemplateCh2.box, content = _getDefaultTemplateCh2.content;
setTransitionDuration([ box, content ], 0);
}
onFirstUpdate = function() {
var _instance$popperInsta2;
if (instance1.state.isVisible && !ignoreOnFirstUpdate) {
if (ignoreOnFirstUpdate = !0, popper1.offsetHeight, popper1.style.transition = instance1.props.moveTransition,
getIsDefaultRenderFn() && instance1.props.animation) {
var _getDefaultTemplateCh3 = getDefaultTemplateChildren(), _box = _getDefaultTemplateCh3.box, _content = _getDefaultTemplateCh3.content;
setTransitionDuration([ _box, _content ], duration), setVisibilityState([ _box, _content ], "visible");
}
handleAriaContentAttribute(), handleAriaExpandedAttribute(), pushIfUnique(mountedInstances, instance1),
null == (_instance$popperInsta2 = instance1.popperInstance) || _instance$popperInsta2.forceUpdate(),
invokeHook("onMount", [ instance1 ]), instance1.props.animation && getIsDefaultRenderFn() && function(duration, callback) {
onTransitionEnd(duration, callback);
}(duration, (function() {
instance1.state.isShown = !0, invokeHook("onShown", [ instance1 ]);
}));
}
}, function() {
var parentNode, appendTo = instance1.props.appendTo, node = getCurrentTarget();
parentNode = instance1.props.interactive && appendTo === TIPPY_DEFAULT_APPEND_TO || "parent" === appendTo ? node.parentNode : invokeWithArgsOrReturn(appendTo, [ node ]);
parentNode.contains(popper1) || parentNode.appendChild(popper1);
instance1.state.isMounted = !0, createPopperInstance(), !1;
}();
},
hide: function() {
0;
var isAlreadyHidden = !instance1.state.isVisible, isDestroyed = instance1.state.isDestroyed, isDisabled = !instance1.state.isEnabled, duration = getValueAtIndexOrReturn(instance1.props.duration, 1, defaultProps.duration);
if (isAlreadyHidden || isDestroyed || isDisabled) return;
if (invokeHook("onHide", [ instance1 ], !1), !1 === instance1.props.onHide(instance1)) return;
instance1.state.isVisible = !1, instance1.state.isShown = !1, ignoreOnFirstUpdate = !1,
isVisibleFromClick = !1, getIsDefaultRenderFn() && (popper1.style.visibility = "hidden");
if (cleanupInteractiveMouseListeners(), removeDocumentPress(), handleStyles(!0),
getIsDefaultRenderFn()) {
var _getDefaultTemplateCh4 = getDefaultTemplateChildren(), box = _getDefaultTemplateCh4.box, content = _getDefaultTemplateCh4.content;
instance1.props.animation && (setTransitionDuration([ box, content ], duration),
setVisibilityState([ box, content ], "hidden"));
}
handleAriaContentAttribute(), handleAriaExpandedAttribute(), instance1.props.animation ? getIsDefaultRenderFn() && function(duration, callback) {
onTransitionEnd(duration, (function() {
!instance1.state.isVisible && popper1.parentNode && popper1.parentNode.contains(popper1) && callback();
}));
}(duration, instance1.unmount) : instance1.unmount();
},
hideWithInteractivity: function(event) {
0;
getDocument().addEventListener("mousemove", debouncedOnMouseMove), pushIfUnique(mouseMoveListeners, debouncedOnMouseMove),
debouncedOnMouseMove(event);
},
enable: function() {
instance1.state.isEnabled = !0;
},
disable: function() {
instance1.hide(), instance1.state.isEnabled = !1;
},
unmount: function() {
0;
instance1.state.isVisible && instance1.hide();
if (!instance1.state.isMounted) return;
destroyPopperInstance(), getNestedPopperTree().forEach((function(nestedPopper) {
nestedPopper._tippy.unmount();
})), popper1.parentNode && popper1.parentNode.removeChild(popper1);
mountedInstances = mountedInstances.filter((function(i) {
return i !== instance1;
})), instance1.state.isMounted = !1, invokeHook("onHidden", [ instance1 ]);
},
destroy: function() {
0;
if (instance1.state.isDestroyed) return;
instance1.clearDelayTimeouts(), instance1.unmount(), removeListeners(), delete reference._tippy,
instance1.state.isDestroyed = !0, invokeHook("onDestroy", [ instance1 ]);
}
};
if (!props.render) return instance1;
var _props$render = props.render(instance1), popper1 = _props$render.popper, onUpdate = _props$render.onUpdate;
popper1.setAttribute("data-tippy-root", ""), popper1.id = "tippy-" + instance1.id,
instance1.popper = popper1, reference._tippy = instance1, popper1._tippy = instance1;
var pluginsHooks = plugins.map((function(plugin) {
return plugin.fn(instance1);
})), hasAriaExpanded = reference.hasAttribute("aria-expanded");
return addListeners(), handleAriaExpandedAttribute(), handleStyles(), invokeHook("onCreate", [ instance1 ]),
props.showOnCreate && scheduleShow(), popper1.addEventListener("mouseenter", (function() {
instance1.props.interactive && instance1.state.isVisible && instance1.clearDelayTimeouts();
})), popper1.addEventListener("mouseleave", (function() {
instance1.props.interactive && instance1.props.trigger.indexOf("mouseenter") >= 0 && getDocument().addEventListener("mousemove", debouncedOnMouseMove);
})), instance1;
function getNormalizedTouchSettings() {
var touch = instance1.props.touch;
return Array.isArray(touch) ? touch : [ touch, 0 ];
}
function getIsCustomTouchBehavior() {
return "hold" === getNormalizedTouchSettings()[0];
}
function getIsDefaultRenderFn() {
var _instance$props$rende;
return !(null == (_instance$props$rende = instance1.props.render) || !_instance$props$rende.$$tippy);
}
function getCurrentTarget() {
return currentTarget || reference;
}
function getDocument() {
var parent = getCurrentTarget().parentNode;
return parent ? getOwnerDocument(parent) : document;
}
function getDefaultTemplateChildren() {
return getChildren(popper1);
}
function getDelay(isShow) {
return instance1.state.isMounted && !instance1.state.isVisible || currentInput.isTouch || lastTriggerEvent && "focus" === lastTriggerEvent.type ? 0 : getValueAtIndexOrReturn(instance1.props.delay, isShow ? 0 : 1, defaultProps.delay);
}
function handleStyles(fromHide) {
void 0 === fromHide && (fromHide = !1), popper1.style.pointerEvents = instance1.props.interactive && !fromHide ? "" : "none",
popper1.style.zIndex = "" + instance1.props.zIndex;
}
function invokeHook(hook, args, shouldInvokePropsHook) {
var _instance$props;
(void 0 === shouldInvokePropsHook && (shouldInvokePropsHook = !0), pluginsHooks.forEach((function(pluginHooks) {
pluginHooks[hook] && pluginHooks[hook].apply(pluginHooks, args);
})), shouldInvokePropsHook) && (_instance$props = instance1.props)[hook].apply(_instance$props, args);
}
function handleAriaContentAttribute() {
var aria = instance1.props.aria;
if (aria.content) {
var attr = "aria-" + aria.content, id = popper1.id;
normalizeToArray(instance1.props.triggerTarget || reference).forEach((function(node) {
var currentValue = node.getAttribute(attr);
if (instance1.state.isVisible) node.setAttribute(attr, currentValue ? currentValue + " " + id : id); else {
var nextValue = currentValue && currentValue.replace(id, "").trim();
nextValue ? node.setAttribute(attr, nextValue) : node.removeAttribute(attr);
}
}));
}
}
function handleAriaExpandedAttribute() {
!hasAriaExpanded && instance1.props.aria.expanded && normalizeToArray(instance1.props.triggerTarget || reference).forEach((function(node) {
instance1.props.interactive ? node.setAttribute("aria-expanded", instance1.state.isVisible && node === getCurrentTarget() ? "true" : "false") : node.removeAttribute("aria-expanded");
}));
}
function cleanupInteractiveMouseListeners() {
getDocument().removeEventListener("mousemove", debouncedOnMouseMove), mouseMoveListeners = mouseMoveListeners.filter((function(listener) {
return listener !== debouncedOnMouseMove;
}));
}
function onDocumentPress(event) {
if (!currentInput.isTouch || !didTouchMove && "mousedown" !== event.type) {
var actualTarget = event.composedPath && event.composedPath()[0] || event.target;
if (!instance1.props.interactive || !actualContains(popper1, actualTarget)) {
if (normalizeToArray(instance1.props.triggerTarget || reference).some((function(el) {
return actualContains(el, actualTarget);
}))) {
if (currentInput.isTouch) return;
if (instance1.state.isVisible && instance1.props.trigger.indexOf("click") >= 0) return;
} else invokeHook("onClickOutside", [ instance1, event ]);
!0 === instance1.props.hideOnClick && (instance1.clearDelayTimeouts(), instance1.hide(),
didHideDueToDocumentMouseDown = !0, setTimeout((function() {
didHideDueToDocumentMouseDown = !1;
})), instance1.state.isMounted || removeDocumentPress());
}
}
}
function onTouchMove() {
didTouchMove = !0;
}
function onTouchStart() {
didTouchMove = !1;
}
function addDocumentPress() {
var doc = getDocument();
doc.addEventListener("mousedown", onDocumentPress, !0), doc.addEventListener("touchend", onDocumentPress, TOUCH_OPTIONS),
doc.addEventListener("touchstart", onTouchStart, TOUCH_OPTIONS), doc.addEventListener("touchmove", onTouchMove, TOUCH_OPTIONS);
}
function removeDocumentPress() {
var doc = getDocument();
doc.removeEventListener("mousedown", onDocumentPress, !0), doc.removeEventListener("touchend", onDocumentPress, TOUCH_OPTIONS),
doc.removeEventListener("touchstart", onTouchStart, TOUCH_OPTIONS), doc.removeEventListener("touchmove", onTouchMove, TOUCH_OPTIONS);
}
function onTransitionEnd(duration, callback) {
var box = getDefaultTemplateChildren().box;
function listener(event) {
event.target === box && (updateTransitionEndListener(box, "remove", listener), callback());
}
if (0 === duration) return callback();
updateTransitionEndListener(box, "remove", currentTransitionEndListener), updateTransitionEndListener(box, "add", listener),
currentTransitionEndListener = listener;
}
function on(eventType, handler, options) {
void 0 === options && (options = !1), normalizeToArray(instance1.props.triggerTarget || reference).forEach((function(node) {
node.addEventListener(eventType, handler, options), listeners.push({
node: node,
eventType: eventType,
handler: handler,
options: options
});
}));
}
function addListeners() {
var value;
getIsCustomTouchBehavior() && (on("touchstart", onTrigger, {
passive: !0
}), on("touchend", onMouseLeave, {
passive: !0
})), (value = instance1.props.trigger, value.split(/\s+/).filter(Boolean)).forEach((function(eventType) {
if ("manual" !== eventType) switch (on(eventType, onTrigger), eventType) {
case "mouseenter":
on("mouseleave", onMouseLeave);
break;
case "focus":
on(isIE11 ? "focusout" : "blur", onBlurOrFocusOut);
break;
case "focusin":
on("focusout", onBlurOrFocusOut);
}
}));
}
function removeListeners() {
listeners.forEach((function(_ref) {
var node = _ref.node, eventType = _ref.eventType, handler = _ref.handler, options = _ref.options;
node.removeEventListener(eventType, handler, options);
})), listeners = [];
}
function onTrigger(event) {
var _lastTriggerEvent, shouldScheduleClickHide = !1;
if (instance1.state.isEnabled && !isEventListenerStopped(event) && !didHideDueToDocumentMouseDown) {
var wasFocused = "focus" === (null == (_lastTriggerEvent = lastTriggerEvent) ? void 0 : _lastTriggerEvent.type);
lastTriggerEvent = event, currentTarget = event.currentTarget, handleAriaExpandedAttribute(),
!instance1.state.isVisible && isMouseEvent(event) && mouseMoveListeners.forEach((function(listener) {
return listener(event);
})), "click" === event.type && (instance1.props.trigger.indexOf("mouseenter") < 0 || isVisibleFromClick) && !1 !== instance1.props.hideOnClick && instance1.state.isVisible ? shouldScheduleClickHide = !0 : scheduleShow(event),
"click" === event.type && (isVisibleFromClick = !shouldScheduleClickHide), shouldScheduleClickHide && !wasFocused && scheduleHide(event);
}
}
function onMouseMove(event) {
var target = event.target, isCursorOverReferenceOrPopper = getCurrentTarget().contains(target) || popper1.contains(target);
"mousemove" === event.type && isCursorOverReferenceOrPopper || function(popperTreeData, event) {
var clientX = event.clientX, clientY = event.clientY;
return popperTreeData.every((function(_ref) {
var popperRect = _ref.popperRect, popperState = _ref.popperState, interactiveBorder = _ref.props.interactiveBorder, basePlacement = getBasePlacement(popperState.placement), offsetData = popperState.modifiersData.offset;
if (!offsetData) return !0;
var topDistance = "bottom" === basePlacement ? offsetData.top.y : 0, bottomDistance = "top" === basePlacement ? offsetData.bottom.y : 0, leftDistance = "right" === basePlacement ? offsetData.left.x : 0, rightDistance = "left" === basePlacement ? offsetData.right.x : 0, exceedsTop = popperRect.top - clientY + topDistance > interactiveBorder, exceedsBottom = clientY - popperRect.bottom - bottomDistance > interactiveBorder, exceedsLeft = popperRect.left - clientX + leftDistance > interactiveBorder, exceedsRight = clientX - popperRect.right - rightDistance > interactiveBorder;
return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;
}));
}(getNestedPopperTree().concat(popper1).map((function(popper) {
var _instance$popperInsta, state = null == (_instance$popperInsta = popper._tippy.popperInstance) ? void 0 : _instance$popperInsta.state;
return state ? {
popperRect: popper.getBoundingClientRect(),
popperState: state,
props: props
} : null;
})).filter(Boolean), event) && (cleanupInteractiveMouseListeners(), scheduleHide(event));
}
function onMouseLeave(event) {
isEventListenerStopped(event) || instance1.props.trigger.indexOf("click") >= 0 && isVisibleFromClick || (instance1.props.interactive ? instance1.hideWithInteractivity(event) : scheduleHide(event));
}
function onBlurOrFocusOut(event) {
instance1.props.trigger.indexOf("focusin") < 0 && event.target !== getCurrentTarget() || instance1.props.interactive && event.relatedTarget && popper1.contains(event.relatedTarget) || scheduleHide(event);
}
function isEventListenerStopped(event) {
return !!currentInput.isTouch && getIsCustomTouchBehavior() !== event.type.indexOf("touch") >= 0;
}
function createPopperInstance() {
destroyPopperInstance();
var _instance$props2 = instance1.props, popperOptions = _instance$props2.popperOptions, placement = _instance$props2.placement, offset = _instance$props2.offset, getReferenceClientRect = _instance$props2.getReferenceClientRect, moveTransition = _instance$props2.moveTransition, arrow = getIsDefaultRenderFn() ? getChildren(popper1).arrow : null, computedReference = getReferenceClientRect ? {
getBoundingClientRect: getReferenceClientRect,
contextElement: getReferenceClientRect.contextElement || getCurrentTarget()
} : reference, modifiers = [ {
name: "offset",
options: {
offset: offset
}
}, {
name: "preventOverflow",
options: {
padding: {
top: 2,
bottom: 2,
left: 5,
right: 5
}
}
}, {
name: "flip",
options: {
padding: 5
}
}, {
name: "computeStyles",
options: {
adaptive: !moveTransition
}
}, {
name: "$$tippy",
enabled: !0,
phase: "beforeWrite",
requires: [ "computeStyles" ],
fn: function(_ref2) {
var state = _ref2.state;
if (getIsDefaultRenderFn()) {
var box = getDefaultTemplateChildren().box;
[ "placement", "reference-hidden", "escaped" ].forEach((function(attr) {
"placement" === attr ? box.setAttribute("data-placement", state.placement) : state.attributes.popper["data-popper-" + attr] ? box.setAttribute("data-" + attr, "") : box.removeAttribute("data-" + attr);
})), state.attributes.popper = {};
}
}
} ];
getIsDefaultRenderFn() && arrow && modifiers.push({
name: "arrow",
options: {
element: arrow,
padding: 3
}
}), modifiers.push.apply(modifiers, (null == popperOptions ? void 0 : popperOptions.modifiers) || []),
instance1.popperInstance = _core.createPopper(computedReference, popper1, Object.assign({}, popperOptions, {
placement: placement,
onFirstUpdate: onFirstUpdate,
modifiers: modifiers
}));
}
function destroyPopperInstance() {
instance1.popperInstance && (instance1.popperInstance.destroy(), instance1.popperInstance = null);
}
function getNestedPopperTree() {
return arrayFrom(popper1.querySelectorAll("[data-tippy-root]"));
}
function scheduleShow(event) {
instance1.clearDelayTimeouts(), event && invokeHook("onTrigger", [ instance1, event ]),
addDocumentPress();
var delay = getDelay(!0), _getNormalizedTouchSe = getNormalizedTouchSettings(), touchValue = _getNormalizedTouchSe[0], touchDelay = _getNormalizedTouchSe[1];
currentInput.isTouch && "hold" === touchValue && touchDelay && (delay = touchDelay),
delay ? showTimeout = setTimeout((function() {
instance1.show();
}), delay) : instance1.show();
}
function scheduleHide(event) {
if (instance1.clearDelayTimeouts(), invokeHook("onUntrigger", [ instance1, event ]),
instance1.state.isVisible) {
if (!(instance1.props.trigger.indexOf("mouseenter") >= 0 && instance1.props.trigger.indexOf("click") >= 0 && [ "mouseleave", "mousemove" ].indexOf(event.type) >= 0 && isVisibleFromClick)) {
var delay = getDelay(!1);
delay ? hideTimeout = setTimeout((function() {
instance1.state.isVisible && instance1.hide();
}), delay) : scheduleHideAnimationFrame = requestAnimationFrame((function() {
instance1.hide();
}));
}
} else removeDocumentPress();
}
}
function tippy(targets, optionalProps) {
void 0 === optionalProps && (optionalProps = {});
var plugins = defaultProps.plugins.concat(optionalProps.plugins || []);
document.addEventListener("touchstart", onDocumentTouchStart, TOUCH_OPTIONS), window.addEventListener("blur", onWindowBlur);
var passedProps = Object.assign({}, optionalProps, {
plugins: plugins
}), instances = getArrayOfElements(targets).reduce((function(acc, reference) {
var instance = reference && createTippy(reference, passedProps);
return instance && acc.push(instance), acc;
}), []);
return isElement(targets) ? instances[0] : instances;
}
tippy.defaultProps = defaultProps, tippy.setDefaultProps = function(partialProps) {
Object.keys(partialProps).forEach((function(key) {
defaultProps[key] = partialProps[key];
}));
}, tippy.currentInput = currentInput;
var hideAll = function(_temp) {
var _ref = void 0 === _temp ? {} : _temp, excludedReferenceOrInstance = _ref.exclude, duration = _ref.duration;
mountedInstances.forEach((function(instance) {
var isExcluded = !1;
if (excludedReferenceOrInstance && (isExcluded = isReferenceElement(excludedReferenceOrInstance) ? instance.reference === excludedReferenceOrInstance : instance.popper === excludedReferenceOrInstance.popper),
!isExcluded) {
var originalDuration = instance.props.duration;
instance.setProps({
duration: duration
}), instance.hide(), instance.state.isDestroyed || instance.setProps({
duration: originalDuration
});
}
}));
}, applyStylesModifier = Object.assign({}, _core.applyStyles, {
effect: function(_ref) {
var state = _ref.state, initialStyles = {
popper: {
position: state.options.strategy,
left: "0",
top: "0",
margin: "0"
},
arrow: {
position: "absolute"
},
reference: {}
};
Object.assign(state.elements.popper.style, initialStyles.popper), state.styles = initialStyles,
state.elements.arrow && Object.assign(state.elements.arrow.style, initialStyles.arrow);
}
}), createSingleton = function(tippyInstances, optionalProps) {
var _optionalProps$popper;
void 0 === optionalProps && (optionalProps = {});
var currentTarget, individualInstances = tippyInstances, references = [], triggerTargets = [], overrides = optionalProps.overrides, interceptSetPropsCleanups = [], shownOnCreate = !1;
function setTriggerTargets() {
triggerTargets = individualInstances.map((function(instance) {
return normalizeToArray(instance.props.triggerTarget || instance.reference);
})).reduce((function(acc, item) {
return acc.concat(item);
}), []);
}
function setReferences() {
references = individualInstances.map((function(instance) {
return instance.reference;
}));
}
function enableInstances(isEnabled) {
individualInstances.forEach((function(instance) {
isEnabled ? instance.enable() : instance.disable();
}));
}
function interceptSetProps(singleton) {
return individualInstances.map((function(instance) {
var originalSetProps = instance.setProps;
return instance.setProps = function(props) {
originalSetProps(props), instance.reference === currentTarget && singleton.setProps(props);
}, function() {
instance.setProps = originalSetProps;
};
}));
}
function prepareInstance(singleton, target) {
var index = triggerTargets.indexOf(target);
if (target !== currentTarget) {
currentTarget = target;
var overrideProps = (overrides || []).concat("content").reduce((function(acc, prop) {
return acc[prop] = individualInstances[index].props[prop], acc;
}), {});
singleton.setProps(Object.assign({}, overrideProps, {
getReferenceClientRect: "function" == typeof overrideProps.getReferenceClientRect ? overrideProps.getReferenceClientRect : function() {
var _references$index;
return null == (_references$index = references[index]) ? void 0 : _references$index.getBoundingClientRect();
}
}));
}
}
enableInstances(!1), setReferences(), setTriggerTargets();
var plugin = {
fn: function() {
return {
onDestroy: function() {
enableInstances(!0);
},
onHidden: function() {
currentTarget = null;
},
onClickOutside: function(instance) {
instance.props.showOnCreate && !shownOnCreate && (shownOnCreate = !0, currentTarget = null);
},
onShow: function(instance) {
instance.props.showOnCreate && !shownOnCreate && (shownOnCreate = !0, prepareInstance(instance, references[0]));
},
onTrigger: function(instance, event) {
prepareInstance(instance, event.currentTarget);
}
};
}
}, singleton1 = tippy(div(), Object.assign({}, removeProperties(optionalProps, [ "overrides" ]), {
plugins: [ plugin ].concat(optionalProps.plugins || []),
triggerTarget: triggerTargets,
popperOptions: Object.assign({}, optionalProps.popperOptions, {
modifiers: [].concat((null == (_optionalProps$popper = optionalProps.popperOptions) ? void 0 : _optionalProps$popper.modifiers) || [], [ applyStylesModifier ])
})
})), originalShow = singleton1.show;
singleton1.show = function(target) {
if (originalShow(), !currentTarget && null == target) return prepareInstance(singleton1, references[0]);
if (!currentTarget || null != target) {
if ("number" == typeof target) return references[target] && prepareInstance(singleton1, references[target]);
if (individualInstances.indexOf(target) >= 0) {
var ref = target.reference;
return prepareInstance(singleton1, ref);
}
return references.indexOf(target) >= 0 ? prepareInstance(singleton1, target) : void 0;
}
}, singleton1.showNext = function() {
var first = references[0];
if (!currentTarget) return singleton1.show(0);
var index = references.indexOf(currentTarget);
singleton1.show(references[index + 1] || first);
}, singleton1.showPrevious = function() {
var last = references[references.length - 1];
if (!currentTarget) return singleton1.show(last);
var index = references.indexOf(currentTarget), target = references[index - 1] || last;
singleton1.show(target);
};
var originalSetProps1 = singleton1.setProps;
return singleton1.setProps = function(props) {
overrides = props.overrides || overrides, originalSetProps1(props);
}, singleton1.setInstances = function(nextInstances) {
enableInstances(!0), interceptSetPropsCleanups.forEach((function(fn) {
return fn();
})), individualInstances = nextInstances, enableInstances(!1), setReferences(),
setTriggerTargets(), interceptSetPropsCleanups = interceptSetProps(singleton1),
singleton1.setProps({
triggerTarget: triggerTargets
});
}, interceptSetPropsCleanups = interceptSetProps(singleton1), singleton1;
}, BUBBLING_EVENTS_MAP = {
mouseover: "mouseenter",
focusin: "focus",
click: "click"
};
function delegate(targets, props) {
var listeners = [], childTippyInstances = [], disabled = !1, target = props.target, nativeProps = removeProperties(props, [ "target" ]), parentProps = Object.assign({}, nativeProps, {
trigger: "manual",
touch: !1
}), childProps = Object.assign({
touch: defaultProps.touch
}, nativeProps, {
showOnCreate: !0
}), returnValue = tippy(targets, parentProps);
function onTrigger(event) {
if (event.target && !disabled) {
var targetNode = event.target.closest(target);
if (targetNode) {
var trigger = targetNode.getAttribute("data-tippy-trigger") || props.trigger || defaultProps.trigger;
if (!targetNode._tippy && !("touchstart" === event.type && "boolean" == typeof childProps.touch || "touchstart" !== event.type && trigger.indexOf(BUBBLING_EVENTS_MAP[event.type]) < 0)) {
var instance = tippy(targetNode, childProps);
instance && (childTippyInstances = childTippyInstances.concat(instance));
}
}
}
}
function on(node, eventType, handler, options) {
void 0 === options && (options = !1), node.addEventListener(eventType, handler, options),
listeners.push({
node: node,
eventType: eventType,
handler: handler,
options: options
});
}
return normalizeToArray(returnValue).forEach((function(instance2) {
var reference, originalDestroy = instance2.destroy, originalEnable = instance2.enable, originalDisable = instance2.disable;
instance2.destroy = function(shouldDestroyChildInstances) {
void 0 === shouldDestroyChildInstances && (shouldDestroyChildInstances = !0), shouldDestroyChildInstances && childTippyInstances.forEach((function(instance) {
instance.destroy();
})), childTippyInstances = [], listeners.forEach((function(_ref) {
var node = _ref.node, eventType = _ref.eventType, handler = _ref.handler, options = _ref.options;
node.removeEventListener(eventType, handler, options);
})), listeners = [], originalDestroy();
}, instance2.enable = function() {
originalEnable(), childTippyInstances.forEach((function(instance) {
return instance.enable();
})), disabled = !1;
}, instance2.disable = function() {
originalDisable(), childTippyInstances.forEach((function(instance) {
return instance.disable();
})), disabled = !0;
}, on(reference = instance2.reference, "touchstart", onTrigger, TOUCH_OPTIONS),
on(reference, "mouseover", onTrigger), on(reference, "focusin", onTrigger), on(reference, "click", onTrigger);
})), returnValue;
}
var animateFill = {
name: "animateFill",
defaultValue: !1,
fn: function(instance) {
var _instance$props$rende;
if (null == (_instance$props$rende = instance.props.render) || !_instance$props$rende.$$tippy) return {};
var _getChildren = getChildren(instance.popper), box = _getChildren.box, content = _getChildren.content, backdrop = instance.props.animateFill ? function() {
var backdrop = div();
return backdrop.className = "tippy-backdrop", setVisibilityState([ backdrop ], "hidden"),
backdrop;
}() : null;
return {
onCreate: function() {
backdrop && (box.insertBefore(backdrop, box.firstElementChild), box.setAttribute("data-animatefill", ""),
box.style.overflow = "hidden", instance.setProps({
arrow: !1,
animation: "shift-away"
}));
},
onMount: function() {
if (backdrop) {
var transitionDuration = box.style.transitionDuration, duration = Number(transitionDuration.replace("ms", ""));
content.style.transitionDelay = Math.round(duration / 10) + "ms", backdrop.style.transitionDuration = transitionDuration,
setVisibilityState([ backdrop ], "visible");
}
},
onShow: function() {
backdrop && (backdrop.style.transitionDuration = "0ms");
},
onHide: function() {
backdrop && setVisibilityState([ backdrop ], "hidden");
}
};
}
};
var mouseCoords = {
clientX: 0,
clientY: 0
}, activeInstances = [];
function storeMouseCoords(_ref) {
var clientX = _ref.clientX, clientY = _ref.clientY;
mouseCoords = {
clientX: clientX,
clientY: clientY
};
}
var followCursor = {
name: "followCursor",
defaultValue: !1,
fn: function(instance) {
var reference = instance.reference, doc = getOwnerDocument(instance.props.triggerTarget || reference), isInternalUpdate = !1, wasFocusEvent = !1, isUnmounted = !0, prevProps = instance.props;
function getIsInitialBehavior() {
return "initial" === instance.props.followCursor && instance.state.isVisible;
}
function addListener() {
doc.addEventListener("mousemove", onMouseMove);
}
function removeListener() {
doc.removeEventListener("mousemove", onMouseMove);
}
function unsetGetReferenceClientRect() {
isInternalUpdate = !0, instance.setProps({
getReferenceClientRect: null
}), isInternalUpdate = !1;
}
function onMouseMove(event) {
var isCursorOverReference = !event.target || reference.contains(event.target), followCursor1 = instance.props.followCursor, clientX = event.clientX, clientY = event.clientY, rect1 = reference.getBoundingClientRect(), relativeX = clientX - rect1.left, relativeY = clientY - rect1.top;
!isCursorOverReference && instance.props.interactive || instance.setProps({
getReferenceClientRect: function() {
var rect = reference.getBoundingClientRect(), x = clientX, y = clientY;
"initial" === followCursor1 && (x = rect.left + relativeX, y = rect.top + relativeY);
var top = "horizontal" === followCursor1 ? rect.top : y, right = "vertical" === followCursor1 ? rect.right : x, bottom = "horizontal" === followCursor1 ? rect.bottom : y, left = "vertical" === followCursor1 ? rect.left : x;
return {
width: right - left,
height: bottom - top,
top: top,
right: right,
bottom: bottom,
left: left
};
}
});
}
function create() {
instance.props.followCursor && (activeInstances.push({
instance: instance,
doc: doc
}), function(doc) {
doc.addEventListener("mousemove", storeMouseCoords);
}(doc));
}
function destroy() {
0 === (activeInstances = activeInstances.filter((function(data) {
return data.instance !== instance;
}))).filter((function(data) {
return data.doc === doc;
})).length && function(doc) {
doc.removeEventListener("mousemove", storeMouseCoords);
}(doc);
}
return {
onCreate: create,
onDestroy: destroy,
onBeforeUpdate: function() {
prevProps = instance.props;
},
onAfterUpdate: function(_, _ref2) {
var followCursor2 = _ref2.followCursor;
isInternalUpdate || void 0 !== followCursor2 && prevProps.followCursor !== followCursor2 && (destroy(),
followCursor2 ? (create(), !instance.state.isMounted || wasFocusEvent || getIsInitialBehavior() || addListener()) : (removeListener(),
unsetGetReferenceClientRect()));
},
onMount: function() {
instance.props.followCursor && !wasFocusEvent && (isUnmounted && (onMouseMove(mouseCoords),
isUnmounted = !1), getIsInitialBehavior() || addListener());
},
onTrigger: function(_, event) {
isMouseEvent(event) && (mouseCoords = {
clientX: event.clientX,
clientY: event.clientY
}), wasFocusEvent = "focus" === event.type;
},
onHidden: function() {
instance.props.followCursor && (unsetGetReferenceClientRect(), removeListener(),
isUnmounted = !0);
}
};
}
};
var inlinePositioning = {
name: "inlinePositioning",
defaultValue: !1,
fn: function(instance) {
var placement1, reference = instance.reference;
var cursorRectIndex = -1, isInternalUpdate = !1, triedPlacements = [], modifier = {
name: "tippyInlinePositioning",
enabled: !0,
phase: "afterWrite",
fn: function(_ref2) {
var state = _ref2.state;
instance.props.inlinePositioning && (-1 !== triedPlacements.indexOf(state.placement) && (triedPlacements = []),
placement1 !== state.placement && -1 === triedPlacements.indexOf(state.placement) && (triedPlacements.push(state.placement),
instance.setProps({
getReferenceClientRect: function() {
return function(currentBasePlacement, boundingRect, clientRects, cursorRectIndex) {
if (clientRects.length < 2 || null === currentBasePlacement) return boundingRect;
if (2 === clientRects.length && cursorRectIndex >= 0 && clientRects[0].left > clientRects[1].right) return clientRects[cursorRectIndex] || boundingRect;
switch (currentBasePlacement) {
case "top":
case "bottom":
var firstRect = clientRects[0], lastRect = clientRects[clientRects.length - 1], isTop = "top" === currentBasePlacement, top = firstRect.top, bottom = lastRect.bottom, left = isTop ? firstRect.left : lastRect.left, right = isTop ? firstRect.right : lastRect.right;
return {
top: top,
bottom: bottom,
left: left,
right: right,
width: right - left,
height: bottom - top
};
case "left":
case "right":
var minLeft = Math.min.apply(Math, clientRects.map((function(rects) {
return rects.left;
}))), maxRight = Math.max.apply(Math, clientRects.map((function(rects) {
return rects.right;
}))), measureRects = clientRects.filter((function(rect) {
return "left" === currentBasePlacement ? rect.left === minLeft : rect.right === maxRight;
})), _top = measureRects[0].top, _bottom = measureRects[measureRects.length - 1].bottom;
return {
top: _top,
bottom: _bottom,
left: minLeft,
right: maxRight,
width: maxRight - minLeft,
height: _bottom - _top
};
default:
return boundingRect;
}
}(getBasePlacement(state.placement), reference.getBoundingClientRect(), arrayFrom(reference.getClientRects()), cursorRectIndex);
}
})), placement1 = state.placement);
}
};
function addModifier() {
var partialProps;
isInternalUpdate || (partialProps = function(props, modifier) {
var _props$popperOptions;
return {
popperOptions: Object.assign({}, props.popperOptions, {
modifiers: [].concat(((null == (_props$popperOptions = props.popperOptions) ? void 0 : _props$popperOptions.modifiers) || []).filter((function(_ref) {
return _ref.name !== modifier.name;
})), [ modifier ])
})
};
}(instance.props, modifier), isInternalUpdate = !0, instance.setProps(partialProps),
isInternalUpdate = !1);
}
return {
onCreate: addModifier,
onAfterUpdate: addModifier,
onTrigger: function(_, event) {
if (isMouseEvent(event)) {
var rects = arrayFrom(instance.reference.getClientRects()), cursorRect = rects.find((function(rect) {
return rect.left - 2 <= event.clientX && rect.right + 2 >= event.clientX && rect.top - 2 <= event.clientY && rect.bottom + 2 >= event.clientY;
})), index = rects.indexOf(cursorRect);
cursorRectIndex = index > -1 ? index : cursorRectIndex;
}
},
onHidden: function() {
cursorRectIndex = -1;
}
};
}
};
var sticky = {
name: "sticky",
defaultValue: !1,
fn: function(instance) {
var reference = instance.reference, popper = instance.popper;
function shouldCheck(value) {
return !0 === instance.props.sticky || instance.props.sticky === value;
}
var prevRefRect = null, prevPopRect = null;
function updatePosition() {
var currentRefRect = shouldCheck("reference") ? (instance.popperInstance ? instance.popperInstance.state.elements.reference : reference).getBoundingClientRect() : null, currentPopRect = shouldCheck("popper") ? popper.getBoundingClientRect() : null;
(currentRefRect && areRectsDifferent(prevRefRect, currentRefRect) || currentPopRect && areRectsDifferent(prevPopRect, currentPopRect)) && instance.popperInstance && instance.popperInstance.update(),
prevRefRect = currentRefRect, prevPopRect = currentPopRect, instance.state.isMounted && requestAnimationFrame(updatePosition);
}
return {
onMount: function() {
instance.props.sticky && updatePosition();
}
};
}
};
function areRectsDifferent(rectA, rectB) {
return !rectA || !rectB || (rectA.top !== rectB.top || rectA.right !== rectB.right || rectA.bottom !== rectB.bottom || rectA.left !== rectB.left);
}
tippy.setDefaultProps({
render: render
}), exports.default = tippy;
}, {
"@popperjs/core": "9n031",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"9n031": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "popperGenerator", (() => _createPopperJs.popperGenerator)),
parcelHelpers.export(exports, "detectOverflow", (() => _createPopperJs.detectOverflow)),
parcelHelpers.export(exports, "createPopperBase", (() => _createPopperJs.createPopper)),
parcelHelpers.export(exports, "createPopper", (() => _popperJs.createPopper)), parcelHelpers.export(exports, "createPopperLite", (() => _popperLiteJs.createPopper));
var _enumsJs = require("./enums.js");
parcelHelpers.exportAll(_enumsJs, exports);
var _indexJs = require("./modifiers/index.js");
parcelHelpers.exportAll(_indexJs, exports);
var _createPopperJs = require("./createPopper.js"), _popperJs = require("./popper.js"), _popperLiteJs = require("./popper-lite.js");
}, {
"./enums.js": "kQLMu",
"./modifiers/index.js": "ln0cD",
"./createPopper.js": "lQ4nN",
"./popper.js": "26CfC",
"./popper-lite.js": !1,
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
kQLMu: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "top", (() => top)),
parcelHelpers.export(exports, "bottom", (() => bottom)), parcelHelpers.export(exports, "right", (() => right)),
parcelHelpers.export(exports, "left", (() => left)), parcelHelpers.export(exports, "auto", (() => auto)),
parcelHelpers.export(exports, "basePlacements", (() => basePlacements)), parcelHelpers.export(exports, "start", (() => start)),
parcelHelpers.export(exports, "end", (() => end)), parcelHelpers.export(exports, "clippingParents", (() => clippingParents)),
parcelHelpers.export(exports, "viewport", (() => viewport)), parcelHelpers.export(exports, "popper", (() => popper)),
parcelHelpers.export(exports, "reference", (() => reference)), parcelHelpers.export(exports, "variationPlacements", (() => variationPlacements)),
parcelHelpers.export(exports, "placements", (() => placements)), parcelHelpers.export(exports, "beforeRead", (() => beforeRead)),
parcelHelpers.export(exports, "read", (() => read)), parcelHelpers.export(exports, "afterRead", (() => afterRead)),
parcelHelpers.export(exports, "beforeMain", (() => beforeMain)), parcelHelpers.export(exports, "main", (() => main)),
parcelHelpers.export(exports, "afterMain", (() => afterMain)), parcelHelpers.export(exports, "beforeWrite", (() => beforeWrite)),
parcelHelpers.export(exports, "write", (() => write)), parcelHelpers.export(exports, "afterWrite", (() => afterWrite)),
parcelHelpers.export(exports, "modifierPhases", (() => modifierPhases));
var top = "top", bottom = "bottom", right = "right", left = "left", auto = "auto", basePlacements = [ top, bottom, right, left ], start = "start", end = "end", clippingParents = "clippingParents", viewport = "viewport", popper = "popper", reference = "reference", variationPlacements = basePlacements.reduce((function(acc, placement) {
return acc.concat([ placement + "-" + start, placement + "-" + end ]);
}), []), placements = [].concat(basePlacements, [ auto ]).reduce((function(acc, placement) {
return acc.concat([ placement, placement + "-" + start, placement + "-" + end ]);
}), []), beforeRead = "beforeRead", read = "read", afterRead = "afterRead", beforeMain = "beforeMain", main = "main", afterMain = "afterMain", beforeWrite = "beforeWrite", write = "write", afterWrite = "afterWrite", modifierPhases = [ beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite ];
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
ln0cD: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "applyStyles", (() => _applyStylesJsDefault.default)),
parcelHelpers.export(exports, "arrow", (() => _arrowJsDefault.default)), parcelHelpers.export(exports, "computeStyles", (() => _computeStylesJsDefault.default)),
parcelHelpers.export(exports, "eventListeners", (() => _eventListenersJsDefault.default)),
parcelHelpers.export(exports, "flip", (() => _flipJsDefault.default)), parcelHelpers.export(exports, "hide", (() => _hideJsDefault.default)),
parcelHelpers.export(exports, "offset", (() => _offsetJsDefault.default)), parcelHelpers.export(exports, "popperOffsets", (() => _popperOffsetsJsDefault.default)),
parcelHelpers.export(exports, "preventOverflow", (() => _preventOverflowJsDefault.default));
var _applyStylesJs = require("./applyStyles.js"), _applyStylesJsDefault = parcelHelpers.interopDefault(_applyStylesJs), _arrowJs = require("./arrow.js"), _arrowJsDefault = parcelHelpers.interopDefault(_arrowJs), _computeStylesJs = require("./computeStyles.js"), _computeStylesJsDefault = parcelHelpers.interopDefault(_computeStylesJs), _eventListenersJs = require("./eventListeners.js"), _eventListenersJsDefault = parcelHelpers.interopDefault(_eventListenersJs), _flipJs = require("./flip.js"), _flipJsDefault = parcelHelpers.interopDefault(_flipJs), _hideJs = require("./hide.js"), _hideJsDefault = parcelHelpers.interopDefault(_hideJs), _offsetJs = require("./offset.js"), _offsetJsDefault = parcelHelpers.interopDefault(_offsetJs), _popperOffsetsJs = require("./popperOffsets.js"), _popperOffsetsJsDefault = parcelHelpers.interopDefault(_popperOffsetsJs), _preventOverflowJs = require("./preventOverflow.js"), _preventOverflowJsDefault = parcelHelpers.interopDefault(_preventOverflowJs);
}, {
"./applyStyles.js": "g9e3L",
"./arrow.js": "aUDNz",
"./computeStyles.js": "7Rnjv",
"./eventListeners.js": "jJJc4",
"./flip.js": "54GNY",
"./hide.js": "jqmt6",
"./offset.js": "bnuzp",
"./popperOffsets.js": "hfVqm",
"./preventOverflow.js": "jRFnb",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
g9e3L: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getNodeNameJs = require("../dom-utils/getNodeName.js"), _getNodeNameJsDefault = parcelHelpers.interopDefault(_getNodeNameJs), _instanceOfJs = require("../dom-utils/instanceOf.js");
exports.default = {
name: "applyStyles",
enabled: !0,
phase: "write",
fn: function(_ref) {
var state = _ref.state;
Object.keys(state.elements).forEach((function(name1) {
var style = state.styles[name1] || {}, attributes = state.attributes[name1] || {}, element = state.elements[name1];
_instanceOfJs.isHTMLElement(element) && _getNodeNameJsDefault.default(element) && (Object.assign(element.style, style),
Object.keys(attributes).forEach((function(name) {
var value = attributes[name];
!1 === value ? element.removeAttribute(name) : element.setAttribute(name, !0 === value ? "" : value);
})));
}));
},
effect: function(_ref2) {
var state = _ref2.state, initialStyles = {
popper: {
position: state.options.strategy,
left: "0",
top: "0",
margin: "0"
},
arrow: {
position: "absolute"
},
reference: {}
};
return Object.assign(state.elements.popper.style, initialStyles.popper), state.styles = initialStyles,
state.elements.arrow && Object.assign(state.elements.arrow.style, initialStyles.arrow),
function() {
Object.keys(state.elements).forEach((function(name) {
var element = state.elements[name], attributes = state.attributes[name] || {}, style1 = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]).reduce((function(style, property) {
return style[property] = "", style;
}), {});
_instanceOfJs.isHTMLElement(element) && _getNodeNameJsDefault.default(element) && (Object.assign(element.style, style1),
Object.keys(attributes).forEach((function(attribute) {
element.removeAttribute(attribute);
})));
}));
};
},
requires: [ "computeStyles" ]
};
}, {
"../dom-utils/getNodeName.js": "hivMZ",
"../dom-utils/instanceOf.js": "foGAa",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
hivMZ: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(element) {
return element ? (element.nodeName || "").toLowerCase() : null;
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
foGAa: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "isElement", (() => isElement)),
parcelHelpers.export(exports, "isHTMLElement", (() => isHTMLElement)), parcelHelpers.export(exports, "isShadowRoot", (() => isShadowRoot));
var _getWindowJs = require("./getWindow.js"), _getWindowJsDefault = parcelHelpers.interopDefault(_getWindowJs);
function isElement(node) {
return node instanceof _getWindowJsDefault.default(node).Element || node instanceof Element;
}
function isHTMLElement(node) {
return node instanceof _getWindowJsDefault.default(node).HTMLElement || node instanceof HTMLElement;
}
function isShadowRoot(node) {
return "undefined" != typeof ShadowRoot && (node instanceof _getWindowJsDefault.default(node).ShadowRoot || node instanceof ShadowRoot);
}
}, {
"./getWindow.js": "7pu1d",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"7pu1d": [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(node) {
if (null == node) return window;
if ("[object Window]" !== node.toString()) {
var ownerDocument = node.ownerDocument;
return ownerDocument && ownerDocument.defaultView || window;
}
return node;
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
aUDNz: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getBasePlacementJs = require("../utils/getBasePlacement.js"), _getBasePlacementJsDefault = parcelHelpers.interopDefault(_getBasePlacementJs), _getLayoutRectJs = require("../dom-utils/getLayoutRect.js"), _getLayoutRectJsDefault = parcelHelpers.interopDefault(_getLayoutRectJs), _containsJs = require("../dom-utils/contains.js"), _containsJsDefault = parcelHelpers.interopDefault(_containsJs), _getOffsetParentJs = require("../dom-utils/getOffsetParent.js"), _getOffsetParentJsDefault = parcelHelpers.interopDefault(_getOffsetParentJs), _getMainAxisFromPlacementJs = require("../utils/getMainAxisFromPlacement.js"), _getMainAxisFromPlacementJsDefault = parcelHelpers.interopDefault(_getMainAxisFromPlacementJs), _withinJs = require("../utils/within.js"), _mergePaddingObjectJs = require("../utils/mergePaddingObject.js"), _mergePaddingObjectJsDefault = parcelHelpers.interopDefault(_mergePaddingObjectJs), _expandToHashMapJs = require("../utils/expandToHashMap.js"), _expandToHashMapJsDefault = parcelHelpers.interopDefault(_expandToHashMapJs), _enumsJs = require("../enums.js");
require("../dom-utils/instanceOf.js");
exports.default = {
name: "arrow",
enabled: !0,
phase: "main",
fn: function(_ref) {
var _state$modifiersData$, state = _ref.state, name = _ref.name, options = _ref.options, arrowElement = state.elements.arrow, popperOffsets = state.modifiersData.popperOffsets, basePlacement = _getBasePlacementJsDefault.default(state.placement), axis = _getMainAxisFromPlacementJsDefault.default(basePlacement), len = [ _enumsJs.left, _enumsJs.right ].indexOf(basePlacement) >= 0 ? "height" : "width";
if (arrowElement && popperOffsets) {
var paddingObject = function(padding, state) {
return padding = "function" == typeof padding ? padding(Object.assign({}, state.rects, {
placement: state.placement
})) : padding, _mergePaddingObjectJsDefault.default("number" != typeof padding ? padding : _expandToHashMapJsDefault.default(padding, _enumsJs.basePlacements));
}(options.padding, state), arrowRect = _getLayoutRectJsDefault.default(arrowElement), minProp = "y" === axis ? _enumsJs.top : _enumsJs.left, maxProp = "y" === axis ? _enumsJs.bottom : _enumsJs.right, endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len], startDiff = popperOffsets[axis] - state.rects.reference[axis], arrowOffsetParent = _getOffsetParentJsDefault.default(arrowElement), clientSize = arrowOffsetParent ? "y" === axis ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0, centerToReference = endDiff / 2 - startDiff / 2, min = paddingObject[minProp], max = clientSize - arrowRect[len] - paddingObject[maxProp], center = clientSize / 2 - arrowRect[len] / 2 + centerToReference, offset = _withinJs.within(min, center, max), axisProp = axis;
state.modifiersData[name] = ((_state$modifiersData$ = {})[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center,
_state$modifiersData$);
}
},
effect: function(_ref2) {
var state = _ref2.state, _options$element = _ref2.options.element, arrowElement = void 0 === _options$element ? "[data-popper-arrow]" : _options$element;
null != arrowElement && ("string" != typeof arrowElement || (arrowElement = state.elements.popper.querySelector(arrowElement))) && _containsJsDefault.default(state.elements.popper, arrowElement) && (state.elements.arrow = arrowElement);
},
requires: [ "popperOffsets" ],
requiresIfExists: [ "preventOverflow" ]
};
}, {
"../utils/getBasePlacement.js": "5q6AZ",
"../dom-utils/getLayoutRect.js": "24cMZ",
"../dom-utils/contains.js": "gYZ0J",
"../dom-utils/getOffsetParent.js": "9uhgd",
"../utils/getMainAxisFromPlacement.js": "3Z8vY",
"../utils/within.js": "4wtXl",
"../utils/mergePaddingObject.js": "62DO2",
"../utils/expandToHashMap.js": "hOCRp",
"../enums.js": "kQLMu",
"../dom-utils/instanceOf.js": "foGAa",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"5q6AZ": [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports);
require("../enums.js");
exports.default = function(placement) {
return placement.split("-")[0];
};
}, {
"../enums.js": "kQLMu",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"24cMZ": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getBoundingClientRectJs = require("./getBoundingClientRect.js"), _getBoundingClientRectJsDefault = parcelHelpers.interopDefault(_getBoundingClientRectJs);
exports.default = function(element) {
var clientRect = _getBoundingClientRectJsDefault.default(element), width = element.offsetWidth, height = element.offsetHeight;
return Math.abs(clientRect.width - width) <= 1 && (width = clientRect.width), Math.abs(clientRect.height - height) <= 1 && (height = clientRect.height),
{
x: element.offsetLeft,
y: element.offsetTop,
width: width,
height: height
};
};
}, {
"./getBoundingClientRect.js": "cOs5z",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
cOs5z: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports);
var _instanceOfJs = require("./instanceOf.js"), _mathJs = require("../utils/math.js");
exports.default = function(element, includeScale) {
void 0 === includeScale && (includeScale = !1);
var rect = element.getBoundingClientRect(), scaleX = 1, scaleY = 1;
if (_instanceOfJs.isHTMLElement(element) && includeScale) {
var offsetHeight = element.offsetHeight, offsetWidth = element.offsetWidth;
offsetWidth > 0 && (scaleX = _mathJs.round(rect.width) / offsetWidth || 1), offsetHeight > 0 && (scaleY = _mathJs.round(rect.height) / offsetHeight || 1);
}
return {
width: rect.width / scaleX,
height: rect.height / scaleY,
top: rect.top / scaleY,
right: rect.right / scaleX,
bottom: rect.bottom / scaleY,
left: rect.left / scaleX,
x: rect.left / scaleX,
y: rect.top / scaleY
};
};
}, {
"./instanceOf.js": "foGAa",
"../utils/math.js": "dcLBN",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
dcLBN: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "max", (() => max)),
parcelHelpers.export(exports, "min", (() => min)), parcelHelpers.export(exports, "round", (() => round));
var max = Math.max, min = Math.min, round = Math.round;
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
gYZ0J: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports);
var _instanceOfJs = require("./instanceOf.js");
exports.default = function(parent, child) {
var rootNode = child.getRootNode && child.getRootNode();
if (parent.contains(child)) return !0;
if (rootNode && _instanceOfJs.isShadowRoot(rootNode)) {
var next = child;
do {
if (next && parent.isSameNode(next)) return !0;
next = next.parentNode || next.host;
} while (next);
}
return !1;
};
}, {
"./instanceOf.js": "foGAa",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"9uhgd": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getWindowJs = require("./getWindow.js"), _getWindowJsDefault = parcelHelpers.interopDefault(_getWindowJs), _getNodeNameJs = require("./getNodeName.js"), _getNodeNameJsDefault = parcelHelpers.interopDefault(_getNodeNameJs), _getComputedStyleJs = require("./getComputedStyle.js"), _getComputedStyleJsDefault = parcelHelpers.interopDefault(_getComputedStyleJs), _instanceOfJs = require("./instanceOf.js"), _isTableElementJs = require("./isTableElement.js"), _isTableElementJsDefault = parcelHelpers.interopDefault(_isTableElementJs), _getParentNodeJs = require("./getParentNode.js"), _getParentNodeJsDefault = parcelHelpers.interopDefault(_getParentNodeJs);
function getTrueOffsetParent(element) {
return _instanceOfJs.isHTMLElement(element) && "fixed" !== _getComputedStyleJsDefault.default(element).position ? element.offsetParent : null;
}
exports.default = function(element) {
for (var window = _getWindowJsDefault.default(element), offsetParent = getTrueOffsetParent(element); offsetParent && _isTableElementJsDefault.default(offsetParent) && "static" === _getComputedStyleJsDefault.default(offsetParent).position; ) offsetParent = getTrueOffsetParent(offsetParent);
return offsetParent && ("html" === _getNodeNameJsDefault.default(offsetParent) || "body" === _getNodeNameJsDefault.default(offsetParent) && "static" === _getComputedStyleJsDefault.default(offsetParent).position) ? window : offsetParent || function(element) {
var isFirefox = -1 !== navigator.userAgent.toLowerCase().indexOf("firefox");
if (-1 !== navigator.userAgent.indexOf("Trident") && _instanceOfJs.isHTMLElement(element) && "fixed" === _getComputedStyleJsDefault.default(element).position) return null;
var currentNode = _getParentNodeJsDefault.default(element);
for (_instanceOfJs.isShadowRoot(currentNode) && (currentNode = currentNode.host); _instanceOfJs.isHTMLElement(currentNode) && [ "html", "body" ].indexOf(_getNodeNameJsDefault.default(currentNode)) < 0; ) {
var css = _getComputedStyleJsDefault.default(currentNode);
if ("none" !== css.transform || "none" !== css.perspective || "paint" === css.contain || -1 !== [ "transform", "perspective" ].indexOf(css.willChange) || isFirefox && "filter" === css.willChange || isFirefox && css.filter && "none" !== css.filter) return currentNode;
currentNode = currentNode.parentNode;
}
return null;
}(element) || window;
};
}, {
"./getWindow.js": "7pu1d",
"./getNodeName.js": "hivMZ",
"./getComputedStyle.js": "6qPVU",
"./instanceOf.js": "foGAa",
"./isTableElement.js": "1IrfP",
"./getParentNode.js": "3Yw5a",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"6qPVU": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getWindowJs = require("./getWindow.js"), _getWindowJsDefault = parcelHelpers.interopDefault(_getWindowJs);
exports.default = function(element) {
return _getWindowJsDefault.default(element).getComputedStyle(element);
};
}, {
"./getWindow.js": "7pu1d",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"1IrfP": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getNodeNameJs = require("./getNodeName.js"), _getNodeNameJsDefault = parcelHelpers.interopDefault(_getNodeNameJs);
exports.default = function(element) {
return [ "table", "td", "th" ].indexOf(_getNodeNameJsDefault.default(element)) >= 0;
};
}, {
"./getNodeName.js": "hivMZ",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"3Yw5a": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getNodeNameJs = require("./getNodeName.js"), _getNodeNameJsDefault = parcelHelpers.interopDefault(_getNodeNameJs), _getDocumentElementJs = require("./getDocumentElement.js"), _getDocumentElementJsDefault = parcelHelpers.interopDefault(_getDocumentElementJs), _instanceOfJs = require("./instanceOf.js");
exports.default = function(element) {
return "html" === _getNodeNameJsDefault.default(element) ? element : element.assignedSlot || element.parentNode || (_instanceOfJs.isShadowRoot(element) ? element.host : null) || _getDocumentElementJsDefault.default(element);
};
}, {
"./getNodeName.js": "hivMZ",
"./getDocumentElement.js": "kdL3w",
"./instanceOf.js": "foGAa",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
kdL3w: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports);
var _instanceOfJs = require("./instanceOf.js");
exports.default = function(element) {
return ((_instanceOfJs.isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement;
};
}, {
"./instanceOf.js": "foGAa",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"3Z8vY": [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(placement) {
return [ "top", "bottom" ].indexOf(placement) >= 0 ? "x" : "y";
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"4wtXl": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "within", (() => within)),
parcelHelpers.export(exports, "withinMaxClamp", (() => withinMaxClamp));
var _mathJs = require("./math.js");
function within(min, value, max) {
return _mathJs.max(min, _mathJs.min(value, max));
}
function withinMaxClamp(min, value, max) {
var v = within(min, value, max);
return v > max ? max : v;
}
}, {
"./math.js": "dcLBN",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"62DO2": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getFreshSideObjectJs = require("./getFreshSideObject.js"), _getFreshSideObjectJsDefault = parcelHelpers.interopDefault(_getFreshSideObjectJs);
exports.default = function(paddingObject) {
return Object.assign({}, _getFreshSideObjectJsDefault.default(), paddingObject);
};
}, {
"./getFreshSideObject.js": "hSiY5",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
hSiY5: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function() {
return {
top: 0,
right: 0,
bottom: 0,
left: 0
};
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
hOCRp: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(value, keys) {
return keys.reduce((function(hashMap, key) {
return hashMap[key] = value, hashMap;
}), {});
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"7Rnjv": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "mapToStyles", (() => mapToStyles));
var _enumsJs = require("../enums.js"), _getOffsetParentJs = require("../dom-utils/getOffsetParent.js"), _getOffsetParentJsDefault = parcelHelpers.interopDefault(_getOffsetParentJs), _getWindowJs = require("../dom-utils/getWindow.js"), _getWindowJsDefault = parcelHelpers.interopDefault(_getWindowJs), _getDocumentElementJs = require("../dom-utils/getDocumentElement.js"), _getDocumentElementJsDefault = parcelHelpers.interopDefault(_getDocumentElementJs), _getComputedStyleJs = require("../dom-utils/getComputedStyle.js"), _getComputedStyleJsDefault = parcelHelpers.interopDefault(_getComputedStyleJs), _getBasePlacementJs = require("../utils/getBasePlacement.js"), _getBasePlacementJsDefault = parcelHelpers.interopDefault(_getBasePlacementJs), _getVariationJs = require("../utils/getVariation.js"), _getVariationJsDefault = parcelHelpers.interopDefault(_getVariationJs), _mathJs = require("../utils/math.js"), unsetSides = {
top: "auto",
right: "auto",
bottom: "auto",
left: "auto"
};
function mapToStyles(_ref2) {
var _Object$assign2, popper = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed, _offsets$x = offsets.x, x = void 0 === _offsets$x ? 0 : _offsets$x, _offsets$y = offsets.y, y = void 0 === _offsets$y ? 0 : _offsets$y, _ref3 = "function" == typeof roundOffsets ? roundOffsets({
x: x,
y: y
}) : {
x: x,
y: y
};
x = _ref3.x, y = _ref3.y;
var hasX = offsets.hasOwnProperty("x"), hasY = offsets.hasOwnProperty("y"), sideX = _enumsJs.left, sideY = _enumsJs.top, win = window;
if (adaptive) {
var offsetParent = _getOffsetParentJsDefault.default(popper), heightProp = "clientHeight", widthProp = "clientWidth";
if (offsetParent === _getWindowJsDefault.default(popper) && (offsetParent = _getDocumentElementJsDefault.default(popper),
"static" !== _getComputedStyleJsDefault.default(offsetParent).position && "absolute" === position && (heightProp = "scrollHeight",
widthProp = "scrollWidth")), placement === _enumsJs.top || (placement === _enumsJs.left || placement === _enumsJs.right) && variation === _enumsJs.end) sideY = _enumsJs.bottom,
y -= (isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp]) - popperRect.height,
y *= gpuAcceleration ? 1 : -1;
if (placement === _enumsJs.left || (placement === _enumsJs.top || placement === _enumsJs.bottom) && variation === _enumsJs.end) sideX = _enumsJs.right,
x -= (isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp]) - popperRect.width,
x *= gpuAcceleration ? 1 : -1;
}
var _Object$assign, commonStyles = Object.assign({
position: position
}, adaptive && unsetSides), _ref4 = !0 === roundOffsets ? function(_ref) {
var x = _ref.x, y = _ref.y, dpr = window.devicePixelRatio || 1;
return {
x: _mathJs.round(x * dpr) / dpr || 0,
y: _mathJs.round(y * dpr) / dpr || 0
};
}({
x: x,
y: y
}) : {
x: x,
y: y
};
return x = _ref4.x, y = _ref4.y, gpuAcceleration ? Object.assign({}, commonStyles, ((_Object$assign = {})[sideY] = hasY ? "0" : "",
_Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)",
_Object$assign)) : Object.assign({}, commonStyles, ((_Object$assign2 = {})[sideY] = hasY ? y + "px" : "",
_Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2));
}
exports.default = {
name: "computeStyles",
enabled: !0,
phase: "beforeWrite",
fn: function(_ref5) {
var state = _ref5.state, options = _ref5.options, _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = void 0 === _options$gpuAccelerat || _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = void 0 === _options$adaptive || _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = void 0 === _options$roundOffsets || _options$roundOffsets, commonStyles = {
placement: _getBasePlacementJsDefault.default(state.placement),
variation: _getVariationJsDefault.default(state.placement),
popper: state.elements.popper,
popperRect: state.rects.popper,
gpuAcceleration: gpuAcceleration,
isFixed: "fixed" === state.options.strategy
};
null != state.modifiersData.popperOffsets && (state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
offsets: state.modifiersData.popperOffsets,
position: state.options.strategy,
adaptive: adaptive,
roundOffsets: roundOffsets
})))), null != state.modifiersData.arrow && (state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
offsets: state.modifiersData.arrow,
position: "absolute",
adaptive: !1,
roundOffsets: roundOffsets
})))), state.attributes.popper = Object.assign({}, state.attributes.popper, {
"data-popper-placement": state.placement
});
},
data: {}
};
}, {
"../enums.js": "kQLMu",
"../dom-utils/getOffsetParent.js": "9uhgd",
"../dom-utils/getWindow.js": "7pu1d",
"../dom-utils/getDocumentElement.js": "kdL3w",
"../dom-utils/getComputedStyle.js": "6qPVU",
"../utils/getBasePlacement.js": "5q6AZ",
"../utils/getVariation.js": "2wzDp",
"../utils/math.js": "dcLBN",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"2wzDp": [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(placement) {
return placement.split("-")[1];
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
jJJc4: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getWindowJs = require("../dom-utils/getWindow.js"), _getWindowJsDefault = parcelHelpers.interopDefault(_getWindowJs), passive = {
passive: !0
};
exports.default = {
name: "eventListeners",
enabled: !0,
phase: "write",
fn: function() {},
effect: function(_ref) {
var state = _ref.state, instance = _ref.instance, options = _ref.options, _options$scroll = options.scroll, scroll = void 0 === _options$scroll || _options$scroll, _options$resize = options.resize, resize = void 0 === _options$resize || _options$resize, window = _getWindowJsDefault.default(state.elements.popper), scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
return scroll && scrollParents.forEach((function(scrollParent) {
scrollParent.addEventListener("scroll", instance.update, passive);
})), resize && window.addEventListener("resize", instance.update, passive), function() {
scroll && scrollParents.forEach((function(scrollParent) {
scrollParent.removeEventListener("scroll", instance.update, passive);
})), resize && window.removeEventListener("resize", instance.update, passive);
};
},
data: {}
};
}, {
"../dom-utils/getWindow.js": "7pu1d",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"54GNY": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getOppositePlacementJs = require("../utils/getOppositePlacement.js"), _getOppositePlacementJsDefault = parcelHelpers.interopDefault(_getOppositePlacementJs), _getBasePlacementJs = require("../utils/getBasePlacement.js"), _getBasePlacementJsDefault = parcelHelpers.interopDefault(_getBasePlacementJs), _getOppositeVariationPlacementJs = require("../utils/getOppositeVariationPlacement.js"), _getOppositeVariationPlacementJsDefault = parcelHelpers.interopDefault(_getOppositeVariationPlacementJs), _detectOverflowJs = require("../utils/detectOverflow.js"), _detectOverflowJsDefault = parcelHelpers.interopDefault(_detectOverflowJs), _computeAutoPlacementJs = require("../utils/computeAutoPlacement.js"), _computeAutoPlacementJsDefault = parcelHelpers.interopDefault(_computeAutoPlacementJs), _enumsJs = require("../enums.js"), _getVariationJs = require("../utils/getVariation.js"), _getVariationJsDefault = parcelHelpers.interopDefault(_getVariationJs);
exports.default = {
name: "flip",
enabled: !0,
phase: "main",
fn: function(_ref) {
var state = _ref.state, options = _ref.options, name = _ref.name;
if (!state.modifiersData[name]._skip) {
for (var _options$mainAxis = options.mainAxis, checkMainAxis = void 0 === _options$mainAxis || _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = void 0 === _options$altAxis || _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = void 0 === _options$flipVariatio || _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements, preferredPlacement = state.options.placement, basePlacement = _getBasePlacementJsDefault.default(preferredPlacement), fallbackPlacements = specifiedFallbackPlacements || (basePlacement === preferredPlacement || !flipVariations ? [ _getOppositePlacementJsDefault.default(preferredPlacement) ] : function(placement) {
if (_getBasePlacementJsDefault.default(placement) === _enumsJs.auto) return [];
var oppositePlacement = _getOppositePlacementJsDefault.default(placement);
return [ _getOppositeVariationPlacementJsDefault.default(placement), oppositePlacement, _getOppositeVariationPlacementJsDefault.default(oppositePlacement) ];
}(preferredPlacement)), placements = [ preferredPlacement ].concat(fallbackPlacements).reduce((function(acc, placement) {
return acc.concat(_getBasePlacementJsDefault.default(placement) === _enumsJs.auto ? _computeAutoPlacementJsDefault.default(state, {
placement: placement,
boundary: boundary,
rootBoundary: rootBoundary,
padding: padding,
flipVariations: flipVariations,
allowedAutoPlacements: allowedAutoPlacements
}) : placement);
}), []), referenceRect = state.rects.reference, popperRect = state.rects.popper, checksMap = new Map, makeFallbackChecks = !0, firstFittingPlacement = placements[0], i = 0; i < placements.length; i++) {
var placement1 = placements[i], _basePlacement = _getBasePlacementJsDefault.default(placement1), isStartVariation = _getVariationJsDefault.default(placement1) === _enumsJs.start, isVertical = [ _enumsJs.top, _enumsJs.bottom ].indexOf(_basePlacement) >= 0, len = isVertical ? "width" : "height", overflow = _detectOverflowJsDefault.default(state, {
placement: placement1,
boundary: boundary,
rootBoundary: rootBoundary,
altBoundary: altBoundary,
padding: padding
}), mainVariationSide = isVertical ? isStartVariation ? _enumsJs.right : _enumsJs.left : isStartVariation ? _enumsJs.bottom : _enumsJs.top;
referenceRect[len] > popperRect[len] && (mainVariationSide = _getOppositePlacementJsDefault.default(mainVariationSide));
var altVariationSide = _getOppositePlacementJsDefault.default(mainVariationSide), checks = [];
if (checkMainAxis && checks.push(overflow[_basePlacement] <= 0), checkAltAxis && checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0),
checks.every((function(check) {
return check;
}))) {
firstFittingPlacement = placement1, makeFallbackChecks = !1;
break;
}
checksMap.set(placement1, checks);
}
if (makeFallbackChecks) for (var _loop = function(_i) {
var fittingPlacement = placements.find((function(placement) {
var checks = checksMap.get(placement);
if (checks) return checks.slice(0, _i).every((function(check) {
return check;
}));
}));
if (fittingPlacement) return firstFittingPlacement = fittingPlacement, "break";
}, _i1 = flipVariations ? 3 : 1; _i1 > 0; _i1--) {
if ("break" === _loop(_i1)) break;
}
state.placement !== firstFittingPlacement && (state.modifiersData[name]._skip = !0,
state.placement = firstFittingPlacement, state.reset = !0);
}
},
requiresIfExists: [ "offset" ],
data: {
_skip: !1
}
};
}, {
"../utils/getOppositePlacement.js": "ggSPT",
"../utils/getBasePlacement.js": "5q6AZ",
"../utils/getOppositeVariationPlacement.js": "5v3K8",
"../utils/detectOverflow.js": "ksoPo",
"../utils/computeAutoPlacement.js": "2LvQN",
"../enums.js": "kQLMu",
"../utils/getVariation.js": "2wzDp",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
ggSPT: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports);
var hash = {
left: "right",
right: "left",
bottom: "top",
top: "bottom"
};
exports.default = function(placement) {
return placement.replace(/left|right|bottom|top/g, (function(matched) {
return hash[matched];
}));
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"5v3K8": [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports);
var hash = {
start: "end",
end: "start"
};
exports.default = function(placement) {
return placement.replace(/start|end/g, (function(matched) {
return hash[matched];
}));
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
ksoPo: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getClippingRectJs = require("../dom-utils/getClippingRect.js"), _getClippingRectJsDefault = parcelHelpers.interopDefault(_getClippingRectJs), _getDocumentElementJs = require("../dom-utils/getDocumentElement.js"), _getDocumentElementJsDefault = parcelHelpers.interopDefault(_getDocumentElementJs), _getBoundingClientRectJs = require("../dom-utils/getBoundingClientRect.js"), _getBoundingClientRectJsDefault = parcelHelpers.interopDefault(_getBoundingClientRectJs), _computeOffsetsJs = require("./computeOffsets.js"), _computeOffsetsJsDefault = parcelHelpers.interopDefault(_computeOffsetsJs), _rectToClientRectJs = require("./rectToClientRect.js"), _rectToClientRectJsDefault = parcelHelpers.interopDefault(_rectToClientRectJs), _enumsJs = require("../enums.js"), _instanceOfJs = require("../dom-utils/instanceOf.js"), _mergePaddingObjectJs = require("./mergePaddingObject.js"), _mergePaddingObjectJsDefault = parcelHelpers.interopDefault(_mergePaddingObjectJs), _expandToHashMapJs = require("./expandToHashMap.js"), _expandToHashMapJsDefault = parcelHelpers.interopDefault(_expandToHashMapJs);
exports.default = function(state, options) {
void 0 === options && (options = {});
var _options = options, _options$placement = _options.placement, placement = void 0 === _options$placement ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = void 0 === _options$boundary ? _enumsJs.clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = void 0 === _options$rootBoundary ? _enumsJs.viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = void 0 === _options$elementConte ? _enumsJs.popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = void 0 !== _options$altBoundary && _options$altBoundary, _options$padding = _options.padding, padding = void 0 === _options$padding ? 0 : _options$padding, paddingObject = _mergePaddingObjectJsDefault.default("number" != typeof padding ? padding : _expandToHashMapJsDefault.default(padding, _enumsJs.basePlacements)), altContext = elementContext === _enumsJs.popper ? _enumsJs.reference : _enumsJs.popper, popperRect = state.rects.popper, element = state.elements[altBoundary ? altContext : elementContext], clippingClientRect = _getClippingRectJsDefault.default(_instanceOfJs.isElement(element) ? element : element.contextElement || _getDocumentElementJsDefault.default(state.elements.popper), boundary, rootBoundary), referenceClientRect = _getBoundingClientRectJsDefault.default(state.elements.reference), popperOffsets = _computeOffsetsJsDefault.default({
reference: referenceClientRect,
element: popperRect,
strategy: "absolute",
placement: placement
}), popperClientRect = _rectToClientRectJsDefault.default(Object.assign({}, popperRect, popperOffsets)), elementClientRect = elementContext === _enumsJs.popper ? popperClientRect : referenceClientRect, overflowOffsets = {
top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
right: elementClientRect.right - clippingClientRect.right + paddingObject.right
}, offsetData = state.modifiersData.offset;
if (elementContext === _enumsJs.popper && offsetData) {
var offset = offsetData[placement];
Object.keys(overflowOffsets).forEach((function(key) {
var multiply = [ _enumsJs.right, _enumsJs.bottom ].indexOf(key) >= 0 ? 1 : -1, axis = [ _enumsJs.top, _enumsJs.bottom ].indexOf(key) >= 0 ? "y" : "x";
overflowOffsets[key] += offset[axis] * multiply;
}));
}
return overflowOffsets;
};
}, {
"../dom-utils/getClippingRect.js": "eZssG",
"../dom-utils/getDocumentElement.js": "kdL3w",
"../dom-utils/getBoundingClientRect.js": "cOs5z",
"./computeOffsets.js": "gO2D4",
"./rectToClientRect.js": "aZuBi",
"../enums.js": "kQLMu",
"../dom-utils/instanceOf.js": "foGAa",
"./mergePaddingObject.js": "62DO2",
"./expandToHashMap.js": "hOCRp",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
eZssG: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _enumsJs = require("../enums.js"), _getViewportRectJs = require("./getViewportRect.js"), _getViewportRectJsDefault = parcelHelpers.interopDefault(_getViewportRectJs), _getDocumentRectJs = require("./getDocumentRect.js"), _getDocumentRectJsDefault = parcelHelpers.interopDefault(_getDocumentRectJs), _listScrollParentsJs = require("./listScrollParents.js"), _listScrollParentsJsDefault = parcelHelpers.interopDefault(_listScrollParentsJs), _getOffsetParentJs = require("./getOffsetParent.js"), _getOffsetParentJsDefault = parcelHelpers.interopDefault(_getOffsetParentJs), _getDocumentElementJs = require("./getDocumentElement.js"), _getDocumentElementJsDefault = parcelHelpers.interopDefault(_getDocumentElementJs), _getComputedStyleJs = require("./getComputedStyle.js"), _getComputedStyleJsDefault = parcelHelpers.interopDefault(_getComputedStyleJs), _instanceOfJs = require("./instanceOf.js"), _getBoundingClientRectJs = require("./getBoundingClientRect.js"), _getBoundingClientRectJsDefault = parcelHelpers.interopDefault(_getBoundingClientRectJs), _getParentNodeJs = require("./getParentNode.js"), _getParentNodeJsDefault = parcelHelpers.interopDefault(_getParentNodeJs), _containsJs = require("./contains.js"), _containsJsDefault = parcelHelpers.interopDefault(_containsJs), _getNodeNameJs = require("./getNodeName.js"), _getNodeNameJsDefault = parcelHelpers.interopDefault(_getNodeNameJs), _rectToClientRectJs = require("../utils/rectToClientRect.js"), _rectToClientRectJsDefault = parcelHelpers.interopDefault(_rectToClientRectJs), _mathJs = require("../utils/math.js");
function getClientRectFromMixedType(element, clippingParent) {
return clippingParent === _enumsJs.viewport ? _rectToClientRectJsDefault.default(_getViewportRectJsDefault.default(element)) : _instanceOfJs.isElement(clippingParent) ? function(element) {
var rect = _getBoundingClientRectJsDefault.default(element);
return rect.top = rect.top + element.clientTop, rect.left = rect.left + element.clientLeft,
rect.bottom = rect.top + element.clientHeight, rect.right = rect.left + element.clientWidth,
rect.width = element.clientWidth, rect.height = element.clientHeight, rect.x = rect.left,
rect.y = rect.top, rect;
}(clippingParent) : _rectToClientRectJsDefault.default(_getDocumentRectJsDefault.default(_getDocumentElementJsDefault.default(element)));
}
exports.default = function(element, boundary, rootBoundary) {
var mainClippingParents = "clippingParents" === boundary ? function(element) {
var clippingParents = _listScrollParentsJsDefault.default(_getParentNodeJsDefault.default(element)), clipperElement = [ "absolute", "fixed" ].indexOf(_getComputedStyleJsDefault.default(element).position) >= 0 && _instanceOfJs.isHTMLElement(element) ? _getOffsetParentJsDefault.default(element) : element;
return _instanceOfJs.isElement(clipperElement) ? clippingParents.filter((function(clippingParent) {
return _instanceOfJs.isElement(clippingParent) && _containsJsDefault.default(clippingParent, clipperElement) && "body" !== _getNodeNameJsDefault.default(clippingParent);
})) : [];
}(element) : [].concat(boundary), clippingParents = [].concat(mainClippingParents, [ rootBoundary ]), firstClippingParent = clippingParents[0], clippingRect = clippingParents.reduce((function(accRect, clippingParent) {
var rect = getClientRectFromMixedType(element, clippingParent);
return accRect.top = _mathJs.max(rect.top, accRect.top), accRect.right = _mathJs.min(rect.right, accRect.right),
accRect.bottom = _mathJs.min(rect.bottom, accRect.bottom), accRect.left = _mathJs.max(rect.left, accRect.left),
accRect;
}), getClientRectFromMixedType(element, firstClippingParent));
return clippingRect.width = clippingRect.right - clippingRect.left, clippingRect.height = clippingRect.bottom - clippingRect.top,
clippingRect.x = clippingRect.left, clippingRect.y = clippingRect.top, clippingRect;
};
}, {
"../enums.js": "kQLMu",
"./getViewportRect.js": "7qXw7",
"./getDocumentRect.js": "gZZev",
"./listScrollParents.js": "94WQj",
"./getOffsetParent.js": "9uhgd",
"./getDocumentElement.js": "kdL3w",
"./getComputedStyle.js": "6qPVU",
"./instanceOf.js": "foGAa",
"./getBoundingClientRect.js": "cOs5z",
"./getParentNode.js": "3Yw5a",
"./contains.js": "gYZ0J",
"./getNodeName.js": "hivMZ",
"../utils/rectToClientRect.js": "aZuBi",
"../utils/math.js": "dcLBN",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"7qXw7": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getWindowJs = require("./getWindow.js"), _getWindowJsDefault = parcelHelpers.interopDefault(_getWindowJs), _getDocumentElementJs = require("./getDocumentElement.js"), _getDocumentElementJsDefault = parcelHelpers.interopDefault(_getDocumentElementJs), _getWindowScrollBarXJs = require("./getWindowScrollBarX.js"), _getWindowScrollBarXJsDefault = parcelHelpers.interopDefault(_getWindowScrollBarXJs);
exports.default = function(element) {
var win = _getWindowJsDefault.default(element), html = _getDocumentElementJsDefault.default(element), visualViewport = win.visualViewport, width = html.clientWidth, height = html.clientHeight, x = 0, y = 0;
return visualViewport && (width = visualViewport.width, height = visualViewport.height,
/^((?!chrome|android).)*safari/i.test(navigator.userAgent) || (x = visualViewport.offsetLeft,
y = visualViewport.offsetTop)), {
width: width,
height: height,
x: x + _getWindowScrollBarXJsDefault.default(element),
y: y
};
};
}, {
"./getWindow.js": "7pu1d",
"./getDocumentElement.js": "kdL3w",
"./getWindowScrollBarX.js": "aSyWn",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
aSyWn: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getBoundingClientRectJs = require("./getBoundingClientRect.js"), _getBoundingClientRectJsDefault = parcelHelpers.interopDefault(_getBoundingClientRectJs), _getDocumentElementJs = require("./getDocumentElement.js"), _getDocumentElementJsDefault = parcelHelpers.interopDefault(_getDocumentElementJs), _getWindowScrollJs = require("./getWindowScroll.js"), _getWindowScrollJsDefault = parcelHelpers.interopDefault(_getWindowScrollJs);
exports.default = function(element) {
return _getBoundingClientRectJsDefault.default(_getDocumentElementJsDefault.default(element)).left + _getWindowScrollJsDefault.default(element).scrollLeft;
};
}, {
"./getBoundingClientRect.js": "cOs5z",
"./getDocumentElement.js": "kdL3w",
"./getWindowScroll.js": "9nNXj",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"9nNXj": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getWindowJs = require("./getWindow.js"), _getWindowJsDefault = parcelHelpers.interopDefault(_getWindowJs);
exports.default = function(node) {
var win = _getWindowJsDefault.default(node);
return {
scrollLeft: win.pageXOffset,
scrollTop: win.pageYOffset
};
};
}, {
"./getWindow.js": "7pu1d",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
gZZev: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getDocumentElementJs = require("./getDocumentElement.js"), _getDocumentElementJsDefault = parcelHelpers.interopDefault(_getDocumentElementJs), _getComputedStyleJs = require("./getComputedStyle.js"), _getComputedStyleJsDefault = parcelHelpers.interopDefault(_getComputedStyleJs), _getWindowScrollBarXJs = require("./getWindowScrollBarX.js"), _getWindowScrollBarXJsDefault = parcelHelpers.interopDefault(_getWindowScrollBarXJs), _getWindowScrollJs = require("./getWindowScroll.js"), _getWindowScrollJsDefault = parcelHelpers.interopDefault(_getWindowScrollJs), _mathJs = require("../utils/math.js");
exports.default = function(element) {
var _element$ownerDocumen, html = _getDocumentElementJsDefault.default(element), winScroll = _getWindowScrollJsDefault.default(element), body = null == (_element$ownerDocumen = element.ownerDocument) ? void 0 : _element$ownerDocumen.body, width = _mathJs.max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0), height = _mathJs.max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0), x = -winScroll.scrollLeft + _getWindowScrollBarXJsDefault.default(element), y = -winScroll.scrollTop;
return "rtl" === _getComputedStyleJsDefault.default(body || html).direction && (x += _mathJs.max(html.clientWidth, body ? body.clientWidth : 0) - width),
{
width: width,
height: height,
x: x,
y: y
};
};
}, {
"./getDocumentElement.js": "kdL3w",
"./getComputedStyle.js": "6qPVU",
"./getWindowScrollBarX.js": "aSyWn",
"./getWindowScroll.js": "9nNXj",
"../utils/math.js": "dcLBN",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"94WQj": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getScrollParentJs = require("./getScrollParent.js"), _getScrollParentJsDefault = parcelHelpers.interopDefault(_getScrollParentJs), _getParentNodeJs = require("./getParentNode.js"), _getParentNodeJsDefault = parcelHelpers.interopDefault(_getParentNodeJs), _getWindowJs = require("./getWindow.js"), _getWindowJsDefault = parcelHelpers.interopDefault(_getWindowJs), _isScrollParentJs = require("./isScrollParent.js"), _isScrollParentJsDefault = parcelHelpers.interopDefault(_isScrollParentJs);
exports.default = function listScrollParents(element, list) {
var _element$ownerDocumen;
void 0 === list && (list = []);
var scrollParent = _getScrollParentJsDefault.default(element), isBody = scrollParent === (null == (_element$ownerDocumen = element.ownerDocument) ? void 0 : _element$ownerDocumen.body), win = _getWindowJsDefault.default(scrollParent), target = isBody ? [ win ].concat(win.visualViewport || [], _isScrollParentJsDefault.default(scrollParent) ? scrollParent : []) : scrollParent, updatedList = list.concat(target);
return isBody ? updatedList : updatedList.concat(listScrollParents(_getParentNodeJsDefault.default(target)));
};
}, {
"./getScrollParent.js": "juVFk",
"./getParentNode.js": "3Yw5a",
"./getWindow.js": "7pu1d",
"./isScrollParent.js": "5muqk",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
juVFk: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getParentNodeJs = require("./getParentNode.js"), _getParentNodeJsDefault = parcelHelpers.interopDefault(_getParentNodeJs), _isScrollParentJs = require("./isScrollParent.js"), _isScrollParentJsDefault = parcelHelpers.interopDefault(_isScrollParentJs), _getNodeNameJs = require("./getNodeName.js"), _getNodeNameJsDefault = parcelHelpers.interopDefault(_getNodeNameJs), _instanceOfJs = require("./instanceOf.js");
exports.default = function getScrollParent(node) {
return [ "html", "body", "#document" ].indexOf(_getNodeNameJsDefault.default(node)) >= 0 ? node.ownerDocument.body : _instanceOfJs.isHTMLElement(node) && _isScrollParentJsDefault.default(node) ? node : getScrollParent(_getParentNodeJsDefault.default(node));
};
}, {
"./getParentNode.js": "3Yw5a",
"./isScrollParent.js": "5muqk",
"./getNodeName.js": "hivMZ",
"./instanceOf.js": "foGAa",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"5muqk": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getComputedStyleJs = require("./getComputedStyle.js"), _getComputedStyleJsDefault = parcelHelpers.interopDefault(_getComputedStyleJs);
exports.default = function(element) {
var _getComputedStyle = _getComputedStyleJsDefault.default(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY;
return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
};
}, {
"./getComputedStyle.js": "6qPVU",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
aZuBi: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(rect) {
return Object.assign({}, rect, {
left: rect.x,
top: rect.y,
right: rect.x + rect.width,
bottom: rect.y + rect.height
});
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
gO2D4: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getBasePlacementJs = require("./getBasePlacement.js"), _getBasePlacementJsDefault = parcelHelpers.interopDefault(_getBasePlacementJs), _getVariationJs = require("./getVariation.js"), _getVariationJsDefault = parcelHelpers.interopDefault(_getVariationJs), _getMainAxisFromPlacementJs = require("./getMainAxisFromPlacement.js"), _getMainAxisFromPlacementJsDefault = parcelHelpers.interopDefault(_getMainAxisFromPlacementJs), _enumsJs = require("../enums.js");
exports.default = function(_ref) {
var offsets, reference = _ref.reference, element = _ref.element, placement = _ref.placement, basePlacement = placement ? _getBasePlacementJsDefault.default(placement) : null, variation = placement ? _getVariationJsDefault.default(placement) : null, commonX = reference.x + reference.width / 2 - element.width / 2, commonY = reference.y + reference.height / 2 - element.height / 2;
switch (basePlacement) {
case _enumsJs.top:
offsets = {
x: commonX,
y: reference.y - element.height
};
break;
case _enumsJs.bottom:
offsets = {
x: commonX,
y: reference.y + reference.height
};
break;
case _enumsJs.right:
offsets = {
x: reference.x + reference.width,
y: commonY
};
break;
case _enumsJs.left:
offsets = {
x: reference.x - element.width,
y: commonY
};
break;
default:
offsets = {
x: reference.x,
y: reference.y
};
}
var mainAxis = basePlacement ? _getMainAxisFromPlacementJsDefault.default(basePlacement) : null;
if (null != mainAxis) {
var len = "y" === mainAxis ? "height" : "width";
switch (variation) {
case _enumsJs.start:
offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);
break;
case _enumsJs.end:
offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);
}
}
return offsets;
};
}, {
"./getBasePlacement.js": "5q6AZ",
"./getVariation.js": "2wzDp",
"./getMainAxisFromPlacement.js": "3Z8vY",
"../enums.js": "kQLMu",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"2LvQN": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getVariationJs = require("./getVariation.js"), _getVariationJsDefault = parcelHelpers.interopDefault(_getVariationJs), _enumsJs = require("../enums.js"), _detectOverflowJs = require("./detectOverflow.js"), _detectOverflowJsDefault = parcelHelpers.interopDefault(_detectOverflowJs), _getBasePlacementJs = require("./getBasePlacement.js"), _getBasePlacementJsDefault = parcelHelpers.interopDefault(_getBasePlacementJs);
exports.default = function(state, options) {
void 0 === options && (options = {});
var _options = options, placement1 = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = void 0 === _options$allowedAutoP ? _enumsJs.placements : _options$allowedAutoP, variation = _getVariationJsDefault.default(placement1), placements = variation ? flipVariations ? _enumsJs.variationPlacements : _enumsJs.variationPlacements.filter((function(placement) {
return _getVariationJsDefault.default(placement) === variation;
})) : _enumsJs.basePlacements, allowedPlacements = placements.filter((function(placement) {
return allowedAutoPlacements.indexOf(placement) >= 0;
}));
0 === allowedPlacements.length && (allowedPlacements = placements);
var overflows = allowedPlacements.reduce((function(acc, placement) {
return acc[placement] = _detectOverflowJsDefault.default(state, {
placement: placement,
boundary: boundary,
rootBoundary: rootBoundary,
padding: padding
})[_getBasePlacementJsDefault.default(placement)], acc;
}), {});
return Object.keys(overflows).sort((function(a, b) {
return overflows[a] - overflows[b];
}));
};
}, {
"./getVariation.js": "2wzDp",
"../enums.js": "kQLMu",
"./detectOverflow.js": "ksoPo",
"./getBasePlacement.js": "5q6AZ",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
jqmt6: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _enumsJs = require("../enums.js"), _detectOverflowJs = require("../utils/detectOverflow.js"), _detectOverflowJsDefault = parcelHelpers.interopDefault(_detectOverflowJs);
function getSideOffsets(overflow, rect, preventedOffsets) {
return void 0 === preventedOffsets && (preventedOffsets = {
x: 0,
y: 0
}), {
top: overflow.top - rect.height - preventedOffsets.y,
right: overflow.right - rect.width + preventedOffsets.x,
bottom: overflow.bottom - rect.height + preventedOffsets.y,
left: overflow.left - rect.width - preventedOffsets.x
};
}
function isAnySideFullyClipped(overflow) {
return [ _enumsJs.top, _enumsJs.right, _enumsJs.bottom, _enumsJs.left ].some((function(side) {
return overflow[side] >= 0;
}));
}
exports.default = {
name: "hide",
enabled: !0,
phase: "main",
requiresIfExists: [ "preventOverflow" ],
fn: function(_ref) {
var state = _ref.state, name = _ref.name, referenceRect = state.rects.reference, popperRect = state.rects.popper, preventedOffsets = state.modifiersData.preventOverflow, referenceOverflow = _detectOverflowJsDefault.default(state, {
elementContext: "reference"
}), popperAltOverflow = _detectOverflowJsDefault.default(state, {
altBoundary: !0
}), referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect), popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets), isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets), hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
state.modifiersData[name] = {
referenceClippingOffsets: referenceClippingOffsets,
popperEscapeOffsets: popperEscapeOffsets,
isReferenceHidden: isReferenceHidden,
hasPopperEscaped: hasPopperEscaped
}, state.attributes.popper = Object.assign({}, state.attributes.popper, {
"data-popper-reference-hidden": isReferenceHidden,
"data-popper-escaped": hasPopperEscaped
});
}
};
}, {
"../enums.js": "kQLMu",
"../utils/detectOverflow.js": "ksoPo",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
bnuzp: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "distanceAndSkiddingToXY", (() => distanceAndSkiddingToXY));
var _getBasePlacementJs = require("../utils/getBasePlacement.js"), _getBasePlacementJsDefault = parcelHelpers.interopDefault(_getBasePlacementJs), _enumsJs = require("../enums.js");
function distanceAndSkiddingToXY(placement, rects, offset1) {
var basePlacement = _getBasePlacementJsDefault.default(placement), invertDistance = [ _enumsJs.left, _enumsJs.top ].indexOf(basePlacement) >= 0 ? -1 : 1, _ref = "function" == typeof offset1 ? offset1(Object.assign({}, rects, {
placement: placement
})) : offset1, skidding = _ref[0], distance = _ref[1];
return skidding = skidding || 0, distance = (distance || 0) * invertDistance, [ _enumsJs.left, _enumsJs.right ].indexOf(basePlacement) >= 0 ? {
x: distance,
y: skidding
} : {
x: skidding,
y: distance
};
}
exports.default = {
name: "offset",
enabled: !0,
phase: "main",
requires: [ "popperOffsets" ],
fn: function(_ref2) {
var state = _ref2.state, options = _ref2.options, name = _ref2.name, _options$offset = options.offset, offset2 = void 0 === _options$offset ? [ 0, 0 ] : _options$offset, data = _enumsJs.placements.reduce((function(acc, placement) {
return acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2),
acc;
}), {}), _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y;
null != state.modifiersData.popperOffsets && (state.modifiersData.popperOffsets.x += x,
state.modifiersData.popperOffsets.y += y), state.modifiersData[name] = data;
}
};
}, {
"../utils/getBasePlacement.js": "5q6AZ",
"../enums.js": "kQLMu",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
hfVqm: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _computeOffsetsJs = require("../utils/computeOffsets.js"), _computeOffsetsJsDefault = parcelHelpers.interopDefault(_computeOffsetsJs);
exports.default = {
name: "popperOffsets",
enabled: !0,
phase: "read",
fn: function(_ref) {
var state = _ref.state, name = _ref.name;
state.modifiersData[name] = _computeOffsetsJsDefault.default({
reference: state.rects.reference,
element: state.rects.popper,
strategy: "absolute",
placement: state.placement
});
},
data: {}
};
}, {
"../utils/computeOffsets.js": "gO2D4",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
jRFnb: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _enumsJs = require("../enums.js"), _getBasePlacementJs = require("../utils/getBasePlacement.js"), _getBasePlacementJsDefault = parcelHelpers.interopDefault(_getBasePlacementJs), _getMainAxisFromPlacementJs = require("../utils/getMainAxisFromPlacement.js"), _getMainAxisFromPlacementJsDefault = parcelHelpers.interopDefault(_getMainAxisFromPlacementJs), _getAltAxisJs = require("../utils/getAltAxis.js"), _getAltAxisJsDefault = parcelHelpers.interopDefault(_getAltAxisJs), _withinJs = require("../utils/within.js"), _getLayoutRectJs = require("../dom-utils/getLayoutRect.js"), _getLayoutRectJsDefault = parcelHelpers.interopDefault(_getLayoutRectJs), _getOffsetParentJs = require("../dom-utils/getOffsetParent.js"), _getOffsetParentJsDefault = parcelHelpers.interopDefault(_getOffsetParentJs), _detectOverflowJs = require("../utils/detectOverflow.js"), _detectOverflowJsDefault = parcelHelpers.interopDefault(_detectOverflowJs), _getVariationJs = require("../utils/getVariation.js"), _getVariationJsDefault = parcelHelpers.interopDefault(_getVariationJs), _getFreshSideObjectJs = require("../utils/getFreshSideObject.js"), _getFreshSideObjectJsDefault = parcelHelpers.interopDefault(_getFreshSideObjectJs), _mathJs = require("../utils/math.js");
exports.default = {
name: "preventOverflow",
enabled: !0,
phase: "main",
fn: function(_ref) {
var state = _ref.state, options = _ref.options, name = _ref.name, _options$mainAxis = options.mainAxis, checkMainAxis = void 0 === _options$mainAxis || _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = void 0 !== _options$altAxis && _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = void 0 === _options$tether || _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = void 0 === _options$tetherOffset ? 0 : _options$tetherOffset, overflow = _detectOverflowJsDefault.default(state, {
boundary: boundary,
rootBoundary: rootBoundary,
padding: padding,
altBoundary: altBoundary
}), basePlacement = _getBasePlacementJsDefault.default(state.placement), variation = _getVariationJsDefault.default(state.placement), isBasePlacement = !variation, mainAxis = _getMainAxisFromPlacementJsDefault.default(basePlacement), altAxis = _getAltAxisJsDefault.default(mainAxis), popperOffsets = state.modifiersData.popperOffsets, referenceRect = state.rects.reference, popperRect = state.rects.popper, tetherOffsetValue = "function" == typeof tetherOffset ? tetherOffset(Object.assign({}, state.rects, {
placement: state.placement
})) : tetherOffset, normalizedTetherOffsetValue = "number" == typeof tetherOffsetValue ? {
mainAxis: tetherOffsetValue,
altAxis: tetherOffsetValue
} : Object.assign({
mainAxis: 0,
altAxis: 0
}, tetherOffsetValue), offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null, data = {
x: 0,
y: 0
};
if (popperOffsets) {
if (checkMainAxis) {
var _offsetModifierState$, mainSide = "y" === mainAxis ? _enumsJs.top : _enumsJs.left, altSide = "y" === mainAxis ? _enumsJs.bottom : _enumsJs.right, len = "y" === mainAxis ? "height" : "width", offset = popperOffsets[mainAxis], min = offset + overflow[mainSide], max = offset - overflow[altSide], additive = tether ? -popperRect[len] / 2 : 0, minLen = variation === _enumsJs.start ? referenceRect[len] : popperRect[len], maxLen = variation === _enumsJs.start ? -popperRect[len] : -referenceRect[len], arrowElement = state.elements.arrow, arrowRect = tether && arrowElement ? _getLayoutRectJsDefault.default(arrowElement) : {
width: 0,
height: 0
}, arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : _getFreshSideObjectJsDefault.default(), arrowPaddingMin = arrowPaddingObject[mainSide], arrowPaddingMax = arrowPaddingObject[altSide], arrowLen = _withinJs.within(0, referenceRect[len], arrowRect[len]), minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis, maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis, arrowOffsetParent = state.elements.arrow && _getOffsetParentJsDefault.default(state.elements.arrow), clientOffset = arrowOffsetParent ? "y" === mainAxis ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0, offsetModifierValue = null != (_offsetModifierState$ = null == offsetModifierState ? void 0 : offsetModifierState[mainAxis]) ? _offsetModifierState$ : 0, tetherMin = offset + minOffset - offsetModifierValue - clientOffset, tetherMax = offset + maxOffset - offsetModifierValue, preventedOffset = _withinJs.within(tether ? _mathJs.min(min, tetherMin) : min, offset, tether ? _mathJs.max(max, tetherMax) : max);
popperOffsets[mainAxis] = preventedOffset, data[mainAxis] = preventedOffset - offset;
}
if (checkAltAxis) {
var _offsetModifierState$2, _mainSide = "x" === mainAxis ? _enumsJs.top : _enumsJs.left, _altSide = "x" === mainAxis ? _enumsJs.bottom : _enumsJs.right, _offset = popperOffsets[altAxis], _len = "y" === altAxis ? "height" : "width", _min = _offset + overflow[_mainSide], _max = _offset - overflow[_altSide], isOriginSide = -1 !== [ _enumsJs.top, _enumsJs.left ].indexOf(basePlacement), _offsetModifierValue = null != (_offsetModifierState$2 = null == offsetModifierState ? void 0 : offsetModifierState[altAxis]) ? _offsetModifierState$2 : 0, _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis, _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max, _preventedOffset = tether && isOriginSide ? _withinJs.withinMaxClamp(_tetherMin, _offset, _tetherMax) : _withinJs.within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
popperOffsets[altAxis] = _preventedOffset, data[altAxis] = _preventedOffset - _offset;
}
state.modifiersData[name] = data;
}
},
requiresIfExists: [ "offset" ]
};
}, {
"../enums.js": "kQLMu",
"../utils/getBasePlacement.js": "5q6AZ",
"../utils/getMainAxisFromPlacement.js": "3Z8vY",
"../utils/getAltAxis.js": "723CC",
"../utils/within.js": "4wtXl",
"../dom-utils/getLayoutRect.js": "24cMZ",
"../dom-utils/getOffsetParent.js": "9uhgd",
"../utils/detectOverflow.js": "ksoPo",
"../utils/getVariation.js": "2wzDp",
"../utils/getFreshSideObject.js": "hSiY5",
"../utils/math.js": "dcLBN",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"723CC": [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(axis) {
return "x" === axis ? "y" : "x";
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
lQ4nN: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "popperGenerator", (() => popperGenerator)),
parcelHelpers.export(exports, "createPopper", (() => createPopper)), parcelHelpers.export(exports, "detectOverflow", (() => _detectOverflowJsDefault.default));
var _getCompositeRectJs = require("./dom-utils/getCompositeRect.js"), _getCompositeRectJsDefault = parcelHelpers.interopDefault(_getCompositeRectJs), _getLayoutRectJs = require("./dom-utils/getLayoutRect.js"), _getLayoutRectJsDefault = parcelHelpers.interopDefault(_getLayoutRectJs), _listScrollParentsJs = require("./dom-utils/listScrollParents.js"), _listScrollParentsJsDefault = parcelHelpers.interopDefault(_listScrollParentsJs), _getOffsetParentJs = require("./dom-utils/getOffsetParent.js"), _getOffsetParentJsDefault = parcelHelpers.interopDefault(_getOffsetParentJs), _getComputedStyleJs = require("./dom-utils/getComputedStyle.js"), _orderModifiersJs = (parcelHelpers.interopDefault(_getComputedStyleJs),
require("./utils/orderModifiers.js")), _orderModifiersJsDefault = parcelHelpers.interopDefault(_orderModifiersJs), _debounceJs = require("./utils/debounce.js"), _debounceJsDefault = parcelHelpers.interopDefault(_debounceJs), _validateModifiersJs = require("./utils/validateModifiers.js"), _uniqueByJs = (parcelHelpers.interopDefault(_validateModifiersJs),
require("./utils/uniqueBy.js")), _getBasePlacementJs = (parcelHelpers.interopDefault(_uniqueByJs),
require("./utils/getBasePlacement.js")), _mergeByNameJs = (parcelHelpers.interopDefault(_getBasePlacementJs),
require("./utils/mergeByName.js")), _mergeByNameJsDefault = parcelHelpers.interopDefault(_mergeByNameJs), _detectOverflowJs = require("./utils/detectOverflow.js"), _detectOverflowJsDefault = parcelHelpers.interopDefault(_detectOverflowJs), _instanceOfJs = require("./dom-utils/instanceOf.js"), DEFAULT_OPTIONS = (require("./enums.js"),
{
placement: "bottom",
modifiers: [],
strategy: "absolute"
});
function areValidElements() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key];
return !args.some((function(element) {
return !(element && "function" == typeof element.getBoundingClientRect);
}));
}
function popperGenerator(generatorOptions) {
void 0 === generatorOptions && (generatorOptions = {});
var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers = void 0 === _generatorOptions$def ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = void 0 === _generatorOptions$def2 ? DEFAULT_OPTIONS : _generatorOptions$def2;
return function(reference1, popper1, options1) {
void 0 === options1 && (options1 = defaultOptions);
var state1 = {
placement: "bottom",
orderedModifiers: [],
options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
modifiersData: {},
elements: {
reference: reference1,
popper: popper1
},
attributes: {},
styles: {}
}, effectCleanupFns = [], isDestroyed = !1, instance = {
state: state1,
setOptions: function(setOptionsAction) {
var options = "function" == typeof setOptionsAction ? setOptionsAction(state1.options) : setOptionsAction;
cleanupModifierEffects(), state1.options = Object.assign({}, defaultOptions, state1.options, options),
state1.scrollParents = {
reference: _instanceOfJs.isElement(reference1) ? _listScrollParentsJsDefault.default(reference1) : reference1.contextElement ? _listScrollParentsJsDefault.default(reference1.contextElement) : [],
popper: _listScrollParentsJsDefault.default(popper1)
};
var orderedModifiers = _orderModifiersJsDefault.default(_mergeByNameJsDefault.default([].concat(defaultModifiers, state1.options.modifiers)));
return state1.orderedModifiers = orderedModifiers.filter((function(m) {
return m.enabled;
})), state1.orderedModifiers.forEach((function(_ref3) {
var name = _ref3.name, _ref3$options = _ref3.options, options = void 0 === _ref3$options ? {} : _ref3$options, effect = _ref3.effect;
if ("function" == typeof effect) {
var cleanupFn = effect({
state: state1,
name: name,
instance: instance,
options: options
}), noopFn = function() {};
effectCleanupFns.push(cleanupFn || noopFn);
}
})), instance.update();
},
forceUpdate: function() {
if (!isDestroyed) {
var _state$elements = state1.elements, reference = _state$elements.reference, popper = _state$elements.popper;
if (areValidElements(reference, popper)) {
state1.rects = {
reference: _getCompositeRectJsDefault.default(reference, _getOffsetParentJsDefault.default(popper), "fixed" === state1.options.strategy),
popper: _getLayoutRectJsDefault.default(popper)
}, state1.reset = !1, state1.placement = state1.options.placement, state1.orderedModifiers.forEach((function(modifier) {
return state1.modifiersData[modifier.name] = Object.assign({}, modifier.data);
}));
for (var index = 0; index < state1.orderedModifiers.length; index++) if (!0 !== state1.reset) {
var _state$orderedModifie = state1.orderedModifiers[index], fn = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = void 0 === _state$orderedModifie2 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name;
"function" == typeof fn && (state1 = fn({
state: state1,
options: _options,
name: name,
instance: instance
}) || state1);
} else state1.reset = !1, index = -1;
}
}
},
update: _debounceJsDefault.default((function() {
return new Promise((function(resolve) {
instance.forceUpdate(), resolve(state1);
}));
})),
destroy: function() {
cleanupModifierEffects(), isDestroyed = !0;
}
};
if (!areValidElements(reference1, popper1)) return instance;
function cleanupModifierEffects() {
effectCleanupFns.forEach((function(fn) {
return fn();
})), effectCleanupFns = [];
}
return instance.setOptions(options1).then((function(state) {
!isDestroyed && options1.onFirstUpdate && options1.onFirstUpdate(state);
})), instance;
};
}
var createPopper = popperGenerator();
}, {
"./dom-utils/getCompositeRect.js": "jfnuZ",
"./dom-utils/getLayoutRect.js": "24cMZ",
"./dom-utils/listScrollParents.js": "94WQj",
"./dom-utils/getOffsetParent.js": "9uhgd",
"./dom-utils/getComputedStyle.js": "6qPVU",
"./utils/orderModifiers.js": "lGAWS",
"./utils/debounce.js": "5fqWe",
"./utils/validateModifiers.js": "fIu29",
"./utils/uniqueBy.js": "cvyJi",
"./utils/getBasePlacement.js": "5q6AZ",
"./utils/mergeByName.js": "3Ch77",
"./utils/detectOverflow.js": "ksoPo",
"./dom-utils/instanceOf.js": "foGAa",
"./enums.js": "kQLMu",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
jfnuZ: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getBoundingClientRectJs = require("./getBoundingClientRect.js"), _getBoundingClientRectJsDefault = parcelHelpers.interopDefault(_getBoundingClientRectJs), _getNodeScrollJs = require("./getNodeScroll.js"), _getNodeScrollJsDefault = parcelHelpers.interopDefault(_getNodeScrollJs), _getNodeNameJs = require("./getNodeName.js"), _getNodeNameJsDefault = parcelHelpers.interopDefault(_getNodeNameJs), _instanceOfJs = require("./instanceOf.js"), _getWindowScrollBarXJs = require("./getWindowScrollBarX.js"), _getWindowScrollBarXJsDefault = parcelHelpers.interopDefault(_getWindowScrollBarXJs), _getDocumentElementJs = require("./getDocumentElement.js"), _getDocumentElementJsDefault = parcelHelpers.interopDefault(_getDocumentElementJs), _isScrollParentJs = require("./isScrollParent.js"), _isScrollParentJsDefault = parcelHelpers.interopDefault(_isScrollParentJs), _mathJs = require("../utils/math.js");
exports.default = function(elementOrVirtualElement, offsetParent, isFixed) {
void 0 === isFixed && (isFixed = !1);
var isOffsetParentAnElement = _instanceOfJs.isHTMLElement(offsetParent), offsetParentIsScaled = _instanceOfJs.isHTMLElement(offsetParent) && function(element) {
var rect = element.getBoundingClientRect(), scaleX = _mathJs.round(rect.width) / element.offsetWidth || 1, scaleY = _mathJs.round(rect.height) / element.offsetHeight || 1;
return 1 !== scaleX || 1 !== scaleY;
}(offsetParent), documentElement = _getDocumentElementJsDefault.default(offsetParent), rect = _getBoundingClientRectJsDefault.default(elementOrVirtualElement, offsetParentIsScaled), scroll = {
scrollLeft: 0,
scrollTop: 0
}, offsets = {
x: 0,
y: 0
};
return (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) && (("body" !== _getNodeNameJsDefault.default(offsetParent) || _isScrollParentJsDefault.default(documentElement)) && (scroll = _getNodeScrollJsDefault.default(offsetParent)),
_instanceOfJs.isHTMLElement(offsetParent) ? ((offsets = _getBoundingClientRectJsDefault.default(offsetParent, !0)).x += offsetParent.clientLeft,
offsets.y += offsetParent.clientTop) : documentElement && (offsets.x = _getWindowScrollBarXJsDefault.default(documentElement))),
{
x: rect.left + scroll.scrollLeft - offsets.x,
y: rect.top + scroll.scrollTop - offsets.y,
width: rect.width,
height: rect.height
};
};
}, {
"./getBoundingClientRect.js": "cOs5z",
"./getNodeScroll.js": "kS2QX",
"./getNodeName.js": "hivMZ",
"./instanceOf.js": "foGAa",
"./getWindowScrollBarX.js": "aSyWn",
"./getDocumentElement.js": "kdL3w",
"./isScrollParent.js": "5muqk",
"../utils/math.js": "dcLBN",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
kS2QX: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _getWindowScrollJs = require("./getWindowScroll.js"), _getWindowScrollJsDefault = parcelHelpers.interopDefault(_getWindowScrollJs), _getWindowJs = require("./getWindow.js"), _getWindowJsDefault = parcelHelpers.interopDefault(_getWindowJs), _instanceOfJs = require("./instanceOf.js"), _getHTMLElementScrollJs = require("./getHTMLElementScroll.js"), _getHTMLElementScrollJsDefault = parcelHelpers.interopDefault(_getHTMLElementScrollJs);
exports.default = function(node) {
return node !== _getWindowJsDefault.default(node) && _instanceOfJs.isHTMLElement(node) ? _getHTMLElementScrollJsDefault.default(node) : _getWindowScrollJsDefault.default(node);
};
}, {
"./getWindowScroll.js": "9nNXj",
"./getWindow.js": "7pu1d",
"./instanceOf.js": "foGAa",
"./getHTMLElementScroll.js": "6k1GB",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"6k1GB": [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(element) {
return {
scrollLeft: element.scrollLeft,
scrollTop: element.scrollTop
};
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
lGAWS: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports);
var _enumsJs = require("../enums.js");
function order(modifiers) {
var map = new Map, visited = new Set, result = [];
function sort(modifier) {
visited.add(modifier.name), [].concat(modifier.requires || [], modifier.requiresIfExists || []).forEach((function(dep) {
if (!visited.has(dep)) {
var depModifier = map.get(dep);
depModifier && sort(depModifier);
}
})), result.push(modifier);
}
return modifiers.forEach((function(modifier) {
map.set(modifier.name, modifier);
})), modifiers.forEach((function(modifier) {
visited.has(modifier.name) || sort(modifier);
})), result;
}
exports.default = function(modifiers) {
var orderedModifiers = order(modifiers);
return _enumsJs.modifierPhases.reduce((function(acc, phase) {
return acc.concat(orderedModifiers.filter((function(modifier) {
return modifier.phase === phase;
})));
}), []);
};
}, {
"../enums.js": "kQLMu",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"5fqWe": [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(fn) {
var pending;
return function() {
return pending || (pending = new Promise((function(resolve) {
Promise.resolve().then((function() {
pending = void 0, resolve(fn());
}));
}))), pending;
};
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
fIu29: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
var _formatJs = require("./format.js"), _formatJsDefault = parcelHelpers.interopDefault(_formatJs), _enumsJs = require("../enums.js"), INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s', VALID_PROPERTIES = [ "name", "enabled", "phase", "fn", "effect", "requires", "options" ];
exports.default = function(modifiers) {
modifiers.forEach((function(modifier) {
[].concat(Object.keys(modifier), VALID_PROPERTIES).filter((function(value, index, self) {
return self.indexOf(value) === index;
})).forEach((function(key) {
switch (key) {
case "name":
"string" != typeof modifier.name && console.error(_formatJsDefault.default(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', '"' + String(modifier.name) + '"'));
break;
case "enabled":
"boolean" != typeof modifier.enabled && console.error(_formatJsDefault.default(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', '"' + String(modifier.enabled) + '"'));
break;
case "phase":
_enumsJs.modifierPhases.indexOf(modifier.phase) < 0 && console.error(_formatJsDefault.default(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + _enumsJs.modifierPhases.join(", "), '"' + String(modifier.phase) + '"'));
break;
case "fn":
"function" != typeof modifier.fn && console.error(_formatJsDefault.default(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', '"' + String(modifier.fn) + '"'));
break;
case "effect":
null != modifier.effect && "function" != typeof modifier.effect && console.error(_formatJsDefault.default(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', '"' + String(modifier.fn) + '"'));
break;
case "requires":
null == modifier.requires || Array.isArray(modifier.requires) || console.error(_formatJsDefault.default(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', '"' + String(modifier.requires) + '"'));
break;
case "requiresIfExists":
Array.isArray(modifier.requiresIfExists) || console.error(_formatJsDefault.default(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', '"' + String(modifier.requiresIfExists) + '"'));
break;
case "options":
case "data":
break;
default:
console.error('PopperJS: an invalid property has been provided to the "' + modifier.name + '" modifier, valid properties are ' + VALID_PROPERTIES.map((function(s) {
return '"' + s + '"';
})).join(", ") + '; but "' + key + '" was provided.');
}
modifier.requires && modifier.requires.forEach((function(requirement) {
null == modifiers.find((function(mod) {
return mod.name === requirement;
})) && console.error(_formatJsDefault.default('Popper: modifier "%s" requires "%s", but "%s" modifier is not available', String(modifier.name), requirement, requirement));
}));
}));
}));
};
}, {
"./format.js": "j6CKr",
"../enums.js": "kQLMu",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
j6CKr: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(str) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key];
return [].concat(args).reduce((function(p, c) {
return p.replace(/%s/, c);
}), str);
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
cvyJi: [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(arr, fn) {
var identifiers = new Set;
return arr.filter((function(item) {
var identifier = fn(item);
if (!identifiers.has(identifier)) return identifiers.add(identifier), !0;
}));
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"3Ch77": [ function(require, module, exports) {
require("@parcel/transformer-js/src/esmodule-helpers.js").defineInteropFlag(exports),
exports.default = function(modifiers) {
var merged1 = modifiers.reduce((function(merged, current) {
var existing = merged[current.name];
return merged[current.name] = existing ? Object.assign({}, existing, current, {
options: Object.assign({}, existing.options, current.options),
data: Object.assign({}, existing.data, current.data)
}) : current, merged;
}), {});
return Object.keys(merged1).map((function(key) {
return merged1[key];
}));
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"26CfC": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "createPopper", (() => createPopper)),
parcelHelpers.export(exports, "popperGenerator", (() => _createPopperJs.popperGenerator)),
parcelHelpers.export(exports, "defaultModifiers", (() => defaultModifiers)), parcelHelpers.export(exports, "detectOverflow", (() => _createPopperJs.detectOverflow)),
parcelHelpers.export(exports, "createPopperLite", (() => _popperLiteJs.createPopper));
var _createPopperJs = require("./createPopper.js"), _eventListenersJs = require("./modifiers/eventListeners.js"), _eventListenersJsDefault = parcelHelpers.interopDefault(_eventListenersJs), _popperOffsetsJs = require("./modifiers/popperOffsets.js"), _popperOffsetsJsDefault = parcelHelpers.interopDefault(_popperOffsetsJs), _computeStylesJs = require("./modifiers/computeStyles.js"), _computeStylesJsDefault = parcelHelpers.interopDefault(_computeStylesJs), _applyStylesJs = require("./modifiers/applyStyles.js"), _applyStylesJsDefault = parcelHelpers.interopDefault(_applyStylesJs), _offsetJs = require("./modifiers/offset.js"), _offsetJsDefault = parcelHelpers.interopDefault(_offsetJs), _flipJs = require("./modifiers/flip.js"), _flipJsDefault = parcelHelpers.interopDefault(_flipJs), _preventOverflowJs = require("./modifiers/preventOverflow.js"), _preventOverflowJsDefault = parcelHelpers.interopDefault(_preventOverflowJs), _arrowJs = require("./modifiers/arrow.js"), _arrowJsDefault = parcelHelpers.interopDefault(_arrowJs), _hideJs = require("./modifiers/hide.js"), _hideJsDefault = parcelHelpers.interopDefault(_hideJs), _popperLiteJs = require("./popper-lite.js"), _indexJs = require("./modifiers/index.js");
parcelHelpers.exportAll(_indexJs, exports);
var defaultModifiers = [ _eventListenersJsDefault.default, _popperOffsetsJsDefault.default, _computeStylesJsDefault.default, _applyStylesJsDefault.default, _offsetJsDefault.default, _flipJsDefault.default, _preventOverflowJsDefault.default, _arrowJsDefault.default, _hideJsDefault.default ], createPopper = _createPopperJs.popperGenerator({
defaultModifiers: defaultModifiers
});
}, {
"./createPopper.js": "lQ4nN",
"./modifiers/eventListeners.js": "jJJc4",
"./modifiers/popperOffsets.js": "hfVqm",
"./modifiers/computeStyles.js": "7Rnjv",
"./modifiers/applyStyles.js": "g9e3L",
"./modifiers/offset.js": "bnuzp",
"./modifiers/flip.js": "54GNY",
"./modifiers/preventOverflow.js": "jRFnb",
"./modifiers/arrow.js": "aUDNz",
"./modifiers/hide.js": "jqmt6",
"./popper-lite.js": !1,
"./modifiers/index.js": "ln0cD",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
f1zol: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "isKeyDown", (() => isKeyDown));
const isKeyDown = (() => {
const state = {};
return window.addEventListener("keyup", (e => {
state[e.key] = !1;
})), window.addEventListener("keydown", (e => {
state[e.key] = !0;
})), key => state.hasOwnProperty(key) && state[key] || !1;
})();
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"4ThBa": [ function(require, module, exports) {
module.exports = '.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{color:#fff;white-space:normal;background-color:#333;border-radius:4px;outline:0;font-size:14px;line-height:1.4;transition-property:transform,visibility,opacity;position:relative}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{border-width:8px 8px 0;border-top-color:initial;transform-origin:top;bottom:-7px;left:0}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{border-width:0 8px 8px;border-bottom-color:initial;transform-origin:bottom;top:-7px;left:0}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;transform-origin:0;right:-7px}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:100%;left:-7px}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";border-style:solid;border-color:#0000;position:absolute}.tippy-content{z-index:1;padding:5px 9px;position:relative}.tippy-box[data-theme~=light]{color:#26323d;background-color:#fff;box-shadow:0 0 20px 4px #9aa1b126,0 4px 80px -8px #24282f40,0 4px 4px -2px #5b5e6926}.tippy-box[data-theme~=light][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff}.tippy-box[data-theme~=light][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff}.tippy-box[data-theme~=light]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light]>.tippy-svg-arrow{fill:#fff}.iframe-preview,.wikipedia-preview{width:600px;height:500px;border:0;padding:.4em 2px 2px}.tippy-content{padding:0}.text-fragment-preview{padding:1px .5em}';
}, {} ],
iXBST: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "IntroShownCount", (() => IntroShownCount));
var _webextensionPolyfill = require("webextension-polyfill");
const IntroShownCount = {
limit: 5,
get: async () => (await _webextensionPolyfill.storage.local.get("onboardingIntroCount")).onboardingIntroCount || 0,
async increment() {
const count = await this.get();
await _webextensionPolyfill.storage.local.set({
onboardingIntroCount: count + 1
});
},
async isOverLimit() {
return await this.get() >= this.limit;
}
};
}, {
"webextension-polyfill": "1SqAv",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
lLqAJ: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "setupEventHandlers", (() => setupEventHandlers));
var _webextensionPolyfill = require("webextension-polyfill"), _styleExtractor = require("../style-extractor");
const docStyleNodes = require("../common/lazy").lazy((async () => (await _styleExtractor.getStyleNodes(document)).map((it => it.cloneNode(!0))))), workingDocument = document.implementation.createHTMLDocument();
let latestContextElement;
document.addEventListener("contextmenu", (event => {
latestContextElement = event.target;
}), !0);
const setupEventHandlers = () => {
_webextensionPolyfill.runtime.onMessage.addListener((async message => {
if ("copy-page-fragment" === message.type) return async function() {
const element = latestContextElement;
if (!element) return;
const container = workingDocument.createElement("div");
container.append(...await docStyleNodes(), function(element) {
const clone = element.cloneNode(!0);
clone.style || clone.setAttribute("style", "");
const dimensions = element.getBoundingClientRect();
return clone.style.width = dimensions.width.toString() + "px", clone.style.height = "100%",
clone.style.margin = "auto", clone;
}(element)), function(container) {
workingDocument.body.append(container), workingDocument.body.removeChild(container);
}(container), navigator.clipboard.writeText(container.outerHTML);
}().catch(console.error);
}));
};
}, {
"webextension-polyfill": "1SqAv",
"../style-extractor": "kxGFn",
"../common/lazy": "5LlGZ",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
kxGFn: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "getStyleNodes", (() => getStyleNodes));
var _fetch = require("./common/fetch"), _async = require("./common/async");
async function getStyleNodes(doc) {
return [ ...doc.querySelectorAll("style"), ...await getStyleNodesFromLinks(doc) ].map(adoptStyle);
}
const getStyleNodesFromLinks = async doc => _async.mapAsync(function(doc) {
return [ ...doc.querySelectorAll('link[rel="stylesheet"]') ].map((it => it.href)).filter(Boolean);
}(doc), (async link => function(doc, style) {
const styleNode = doc.createElement("style");
return styleNode.setAttribute("fetched-from-link", "true"), styleNode.textContent = style,
styleNode;
}(doc, await _fetch.fetchText(link))));
function adoptStyle(node) {
return node.textContent = node.textContent?.replace(/:root/g, ":host"), node;
}
}, {
"./common/fetch": "h8faj",
"./common/async": "ajAj2",
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
h8faj: [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
async function fetchText(url) {
return (await fetch(url)).text();
}
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "fetchText", (() => fetchText));
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ],
"5LlGZ": [ function(require, module, exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports), parcelHelpers.export(exports, "lazy", (() => lazy));
const lazy = fn => {
let result;
return () => (void 0 === result && (result = fn()), result);
};
}, {
"@parcel/transformer-js/src/esmodule-helpers.js": "6MiLf"
} ]
}, [ "ceFB6" ]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment