抖音小程序端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

16065 lines
1.3 MiB

(global["webpackJsonp"] = global["webpackJsonp"] || []).push([["common/vendor"],[
/* 0 */,
/* 1 */
/*!*************************************************************!*\
!*** ./node_modules/@dcloudio/uni-mp-toutiao/dist/index.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(global) {Object.defineProperty(exports, "__esModule", { value: true });exports.createApp = createApp;exports.createComponent = createComponent;exports.createPage = createPage;exports.createPlugin = createPlugin;exports.createSubpackageApp = createSubpackageApp;exports.default = void 0;var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 3));
var _uniI18n = __webpack_require__(/*! @dcloudio/uni-i18n */ 4);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function ownKeys(object, enumerableOnly) {var keys = Object.keys(object);if (Object.getOwnPropertySymbols) {var symbols = Object.getOwnPropertySymbols(object);if (enumerableOnly) symbols = symbols.filter(function (sym) {return Object.getOwnPropertyDescriptor(object, sym).enumerable;});keys.push.apply(keys, symbols);}return keys;}function _objectSpread(target) {for (var i = 1; i < arguments.length; i++) {var source = arguments[i] != null ? arguments[i] : {};if (i % 2) {ownKeys(Object(source), true).forEach(function (key) {_defineProperty(target, key, source[key]);});} else if (Object.getOwnPropertyDescriptors) {Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));} else {ownKeys(Object(source)).forEach(function (key) {Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));});}}return target;}function _slicedToArray(arr, i) {return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();}function _nonIterableRest() {throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}function _iterableToArrayLimit(arr, i) {if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"] != null) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}function _arrayWithHoles(arr) {if (Array.isArray(arr)) return arr;}function _defineProperty(obj, key, value) {if (key in obj) {Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true });} else {obj[key] = value;}return obj;}function _classCallCheck(instance, Constructor) {if (!(instance instanceof Constructor)) {throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);}}function _createClass(Constructor, protoProps, staticProps) {if (protoProps) _defineProperties(Constructor.prototype, protoProps);if (staticProps) _defineProperties(Constructor, staticProps);return Constructor;}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 _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 _iterableToArray(iter) {if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter);}function _arrayWithoutHoles(arr) {if (Array.isArray(arr)) return _arrayLikeToArray(arr);}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;}
var realAtob;
var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
var b64re = /^(?:[A-Za-z\d+/]{4})*?(?:[A-Za-z\d+/]{2}(?:==)?|[A-Za-z\d+/]{3}=?)?$/;
if (typeof atob !== 'function') {
realAtob = function realAtob(str) {
str = String(str).replace(/[\t\n\f\r ]+/g, '');
if (!b64re.test(str)) {throw new Error("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");}
// Adding the padding if missing, for semplicity
str += '=='.slice(2 - (str.length & 3));
var bitmap;var result = '';var r1;var r2;var i = 0;
for (; i < str.length;) {
bitmap = b64.indexOf(str.charAt(i++)) << 18 | b64.indexOf(str.charAt(i++)) << 12 |
(r1 = b64.indexOf(str.charAt(i++))) << 6 | (r2 = b64.indexOf(str.charAt(i++)));
result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255) :
r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255) :
String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
}
return result;
};
} else {
// 注意atob只能在全局对象上调用,例如:`const Base64 = {atob};Base64.atob('xxxx')`是错误的用法
realAtob = atob;
}
function b64DecodeUnicode(str) {
return decodeURIComponent(realAtob(str).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
}
function getCurrentUserInfo() {
var token = tt.getStorageSync('uni_id_token') || '';
var tokenArr = token.split('.');
if (!token || tokenArr.length !== 3) {
return {
uid: null,
role: [],
permission: [],
tokenExpired: 0 };
}
var userInfo;
try {
userInfo = JSON.parse(b64DecodeUnicode(tokenArr[1]));
} catch (error) {
throw new Error('获取当前用户信息出错,详细错误信息为:' + error.message);
}
userInfo.tokenExpired = userInfo.exp * 1000;
delete userInfo.exp;
delete userInfo.iat;
return userInfo;
}
function uniIdMixin(Vue) {
Vue.prototype.uniIDHasRole = function (roleId) {var _getCurrentUserInfo =
getCurrentUserInfo(),role = _getCurrentUserInfo.role;
return role.indexOf(roleId) > -1;
};
Vue.prototype.uniIDHasPermission = function (permissionId) {var _getCurrentUserInfo2 =
getCurrentUserInfo(),permission = _getCurrentUserInfo2.permission;
return this.uniIDHasRole('admin') || permission.indexOf(permissionId) > -1;
};
Vue.prototype.uniIDTokenValid = function () {var _getCurrentUserInfo3 =
getCurrentUserInfo(),tokenExpired = _getCurrentUserInfo3.tokenExpired;
return tokenExpired > Date.now();
};
}
var _toString = Object.prototype.toString;
var hasOwnProperty = Object.prototype.hasOwnProperty;
function isFn(fn) {
return typeof fn === 'function';
}
function isStr(str) {
return typeof str === 'string';
}
function isPlainObject(obj) {
return _toString.call(obj) === '[object Object]';
}
function hasOwn(obj, key) {
return hasOwnProperty.call(obj, key);
}
function noop() {}
/**
* Create a cached version of a pure function.
*/
function cached(fn) {
var cache = Object.create(null);
return function cachedFn(str) {
var hit = cache[str];
return hit || (cache[str] = fn(str));
};
}
/**
* Camelize a hyphen-delimited string.
*/
var camelizeRE = /-(\w)/g;
var camelize = cached(function (str) {
return str.replace(camelizeRE, function (_, c) {return c ? c.toUpperCase() : '';});
});
var HOOKS = [
'invoke',
'success',
'fail',
'complete',
'returnValue'];
var globalInterceptors = {};
var scopedInterceptors = {};
function mergeHook(parentVal, childVal) {
var res = childVal ?
parentVal ?
parentVal.concat(childVal) :
Array.isArray(childVal) ?
childVal : [childVal] :
parentVal;
return res ?
dedupeHooks(res) :
res;
}
function dedupeHooks(hooks) {
var res = [];
for (var i = 0; i < hooks.length; i++) {
if (res.indexOf(hooks[i]) === -1) {
res.push(hooks[i]);
}
}
return res;
}
function removeHook(hooks, hook) {
var index = hooks.indexOf(hook);
if (index !== -1) {
hooks.splice(index, 1);
}
}
function mergeInterceptorHook(interceptor, option) {
Object.keys(option).forEach(function (hook) {
if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
interceptor[hook] = mergeHook(interceptor[hook], option[hook]);
}
});
}
function removeInterceptorHook(interceptor, option) {
if (!interceptor || !option) {
return;
}
Object.keys(option).forEach(function (hook) {
if (HOOKS.indexOf(hook) !== -1 && isFn(option[hook])) {
removeHook(interceptor[hook], option[hook]);
}
});
}
function addInterceptor(method, option) {
if (typeof method === 'string' && isPlainObject(option)) {
mergeInterceptorHook(scopedInterceptors[method] || (scopedInterceptors[method] = {}), option);
} else if (isPlainObject(method)) {
mergeInterceptorHook(globalInterceptors, method);
}
}
function removeInterceptor(method, option) {
if (typeof method === 'string') {
if (isPlainObject(option)) {
removeInterceptorHook(scopedInterceptors[method], option);
} else {
delete scopedInterceptors[method];
}
} else if (isPlainObject(method)) {
removeInterceptorHook(globalInterceptors, method);
}
}
function wrapperHook(hook) {
return function (data) {
return hook(data) || data;
};
}
function isPromise(obj) {
return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';
}
function queue(hooks, data) {
var promise = false;
for (var i = 0; i < hooks.length; i++) {
var hook = hooks[i];
if (promise) {
promise = Promise.resolve(wrapperHook(hook));
} else {
var res = hook(data);
if (isPromise(res)) {
promise = Promise.resolve(res);
}
if (res === false) {
return {
then: function then() {} };
}
}
}
return promise || {
then: function then(callback) {
return callback(data);
} };
}
function wrapperOptions(interceptor) {var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
['success', 'fail', 'complete'].forEach(function (name) {
if (Array.isArray(interceptor[name])) {
var oldCallback = options[name];
options[name] = function callbackInterceptor(res) {
queue(interceptor[name], res).then(function (res) {
/* eslint-disable no-mixed-operators */
return isFn(oldCallback) && oldCallback(res) || res;
});
};
}
});
return options;
}
function wrapperReturnValue(method, returnValue) {
var returnValueHooks = [];
if (Array.isArray(globalInterceptors.returnValue)) {
returnValueHooks.push.apply(returnValueHooks, _toConsumableArray(globalInterceptors.returnValue));
}
var interceptor = scopedInterceptors[method];
if (interceptor && Array.isArray(interceptor.returnValue)) {
returnValueHooks.push.apply(returnValueHooks, _toConsumableArray(interceptor.returnValue));
}
returnValueHooks.forEach(function (hook) {
returnValue = hook(returnValue) || returnValue;
});
return returnValue;
}
function getApiInterceptorHooks(method) {
var interceptor = Object.create(null);
Object.keys(globalInterceptors).forEach(function (hook) {
if (hook !== 'returnValue') {
interceptor[hook] = globalInterceptors[hook].slice();
}
});
var scopedInterceptor = scopedInterceptors[method];
if (scopedInterceptor) {
Object.keys(scopedInterceptor).forEach(function (hook) {
if (hook !== 'returnValue') {
interceptor[hook] = (interceptor[hook] || []).concat(scopedInterceptor[hook]);
}
});
}
return interceptor;
}
function invokeApi(method, api, options) {for (var _len = arguments.length, params = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {params[_key - 3] = arguments[_key];}
var interceptor = getApiInterceptorHooks(method);
if (interceptor && Object.keys(interceptor).length) {
if (Array.isArray(interceptor.invoke)) {
var res = queue(interceptor.invoke, options);
return res.then(function (options) {
return api.apply(void 0, [wrapperOptions(interceptor, options)].concat(params));
});
} else {
return api.apply(void 0, [wrapperOptions(interceptor, options)].concat(params));
}
}
return api.apply(void 0, [options].concat(params));
}
var promiseInterceptor = {
returnValue: function returnValue(res) {
if (!isPromise(res)) {
return res;
}
return new Promise(function (resolve, reject) {
res.then(function (res) {
if (res[0]) {
reject(res[0]);
} else {
resolve(res[1]);
}
});
});
} };
var SYNC_API_RE =
/^\$|Window$|WindowStyle$|sendHostEvent|sendNativeEvent|restoreGlobal|requireGlobal|getCurrentSubNVue|getMenuButtonBoundingClientRect|^report|interceptors|Interceptor$|getSubNVueById|requireNativePlugin|upx2px|hideKeyboard|canIUse|^create|Sync$|Manager$|base64ToArrayBuffer|arrayBufferToBase64|getLocale|setLocale/;
var CONTEXT_API_RE = /^create|Manager$/;
// Context例外情况
var CONTEXT_API_RE_EXC = ['createBLEConnection'];
// 同步例外情况
var ASYNC_API = ['createBLEConnection'];
var CALLBACK_API_RE = /^on|^off/;
function isContextApi(name) {
return CONTEXT_API_RE.test(name) && CONTEXT_API_RE_EXC.indexOf(name) === -1;
}
function isSyncApi(name) {
return SYNC_API_RE.test(name) && ASYNC_API.indexOf(name) === -1;
}
function isCallbackApi(name) {
return CALLBACK_API_RE.test(name) && name !== 'onPush';
}
function handlePromise(promise) {
return promise.then(function (data) {
return [null, data];
}).
catch(function (err) {return [err];});
}
function shouldPromise(name) {
if (
isContextApi(name) ||
isSyncApi(name) ||
isCallbackApi(name))
{
return false;
}
return true;
}
/* eslint-disable no-extend-native */
if (!Promise.prototype.finally) {
Promise.prototype.finally = function (callback) {
var promise = this.constructor;
return this.then(
function (value) {return promise.resolve(callback()).then(function () {return value;});},
function (reason) {return promise.resolve(callback()).then(function () {
throw reason;
});});
};
}
function promisify(name, api) {
if (!shouldPromise(name)) {
return api;
}
return function promiseApi() {var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {params[_key2 - 1] = arguments[_key2];}
if (isFn(options.success) || isFn(options.fail) || isFn(options.complete)) {
return wrapperReturnValue(name, invokeApi.apply(void 0, [name, api, options].concat(params)));
}
return wrapperReturnValue(name, handlePromise(new Promise(function (resolve, reject) {
invokeApi.apply(void 0, [name, api, Object.assign({}, options, {
success: resolve,
fail: reject })].concat(
params));
})));
};
}
var EPS = 1e-4;
var BASE_DEVICE_WIDTH = 750;
var isIOS = false;
var deviceWidth = 0;
var deviceDPR = 0;
function checkDeviceWidth() {var _tt$getSystemInfoSync =
tt.getSystemInfoSync(),platform = _tt$getSystemInfoSync.platform,pixelRatio = _tt$getSystemInfoSync.pixelRatio,windowWidth = _tt$getSystemInfoSync.windowWidth; // uni=>tt runtime 编译目标是 uni 对象,内部不允许直接使用 uni
deviceWidth = windowWidth;
deviceDPR = pixelRatio;
isIOS = platform === 'ios';
}
function upx2px(number, newDeviceWidth) {
if (deviceWidth === 0) {
checkDeviceWidth();
}
number = Number(number);
if (number === 0) {
return 0;
}
var result = number / BASE_DEVICE_WIDTH * (newDeviceWidth || deviceWidth);
if (result < 0) {
result = -result;
}
result = Math.floor(result + EPS);
if (result === 0) {
if (deviceDPR === 1 || !isIOS) {
result = 1;
} else {
result = 0.5;
}
}
return number < 0 ? -result : result;
}
function getLocale() {
// 优先使用 $locale
var app = getApp({
allowDefault: true });
if (app && app.$vm) {
return app.$vm.$locale;
}
return tt.getSystemInfoSync().language || 'zh-Hans';
}
function setLocale(locale) {
var app = getApp();
if (!app) {
return false;
}
var oldLocale = app.$vm.$locale;
if (oldLocale !== locale) {
app.$vm.$locale = locale;
onLocaleChangeCallbacks.forEach(function (fn) {return fn({
locale: locale });});
return true;
}
return false;
}
var onLocaleChangeCallbacks = [];
function onLocaleChange(fn) {
if (onLocaleChangeCallbacks.indexOf(fn) === -1) {
onLocaleChangeCallbacks.push(fn);
}
}
if (typeof global !== 'undefined') {
global.getLocale = getLocale;
}
var interceptors = {
promiseInterceptor: promiseInterceptor };
var baseApi = /*#__PURE__*/Object.freeze({
__proto__: null,
upx2px: upx2px,
getLocale: getLocale,
setLocale: setLocale,
onLocaleChange: onLocaleChange,
addInterceptor: addInterceptor,
removeInterceptor: removeInterceptor,
interceptors: interceptors });var
EventChannel = /*#__PURE__*/function () {
function EventChannel(id, events) {var _this = this;_classCallCheck(this, EventChannel);
this.id = id;
this.listener = {};
this.emitCache = {};
if (events) {
Object.keys(events).forEach(function (name) {
_this.on(name, events[name]);
});
}
}_createClass(EventChannel, [{ key: "emit", value: function emit(
eventName) {for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {args[_key3 - 1] = arguments[_key3];}
var fns = this.listener[eventName];
if (!fns) {
return (this.emitCache[eventName] || (this.emitCache[eventName] = [])).push(args);
}
fns.forEach(function (opt) {
opt.fn.apply(opt.fn, args);
});
this.listener[eventName] = fns.filter(function (opt) {return opt.type !== 'once';});
} }, { key: "on", value: function on(
eventName, fn) {
this._addListener(eventName, 'on', fn);
this._clearCache(eventName);
} }, { key: "once", value: function once(
eventName, fn) {
this._addListener(eventName, 'once', fn);
this._clearCache(eventName);
} }, { key: "off", value: function off(
eventName, fn) {
var fns = this.listener[eventName];
if (!fns) {
return;
}
if (fn) {
for (var i = 0; i < fns.length;) {
if (fns[i].fn === fn) {
fns.splice(i, 1);
i--;
}
i++;
}
} else {
delete this.listener[eventName];
}
} }, { key: "_clearCache", value: function _clearCache(
eventName) {
var cacheArgs = this.emitCache[eventName];
if (cacheArgs) {
for (; cacheArgs.length > 0;) {
this.emit.apply(this, [eventName].concat(cacheArgs.shift()));
}
}
} }, { key: "_addListener", value: function _addListener(
eventName, type, fn) {
(this.listener[eventName] || (this.listener[eventName] = [])).push({
fn: fn,
type: type });
} }]);return EventChannel;}();
var eventChannels = {};
var eventChannelStack = [];
var id = 0;
function initEventChannel(events) {var cache = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
id++;
var eventChannel = new EventChannel(id, events);
if (cache) {
eventChannels[id] = eventChannel;
eventChannelStack.push(eventChannel);
}
return eventChannel;
}
function getEventChannel(id) {
if (id) {
var eventChannel = eventChannels[id];
delete eventChannels[id];
return eventChannel;
}
return eventChannelStack.shift();
}
var navigateTo = {
args: function args(fromArgs, toArgs) {
var id = initEventChannel(fromArgs.events).id;
if (fromArgs.url) {
fromArgs.url = fromArgs.url + (fromArgs.url.indexOf('?') === -1 ? '?' : '&') + '__id__=' + id;
}
},
returnValue: function returnValue(fromRes, toRes) {
fromRes.eventChannel = getEventChannel();
} };
function findExistsPageIndex(url) {
var pages = getCurrentPages();
var len = pages.length;
while (len--) {
var page = pages[len];
if (page.$page && page.$page.fullPath === url) {
return len;
}
}
return -1;
}
var redirectTo = {
name: function name(fromArgs) {
if (fromArgs.exists === 'back' && fromArgs.delta) {
return 'navigateBack';
}
return 'redirectTo';
},
args: function args(fromArgs) {
if (fromArgs.exists === 'back' && fromArgs.url) {
var existsPageIndex = findExistsPageIndex(fromArgs.url);
if (existsPageIndex !== -1) {
var delta = getCurrentPages().length - 1 - existsPageIndex;
if (delta > 0) {
fromArgs.delta = delta;
}
}
}
} };
var previewImage = {
args: function args(fromArgs) {
var currentIndex = parseInt(fromArgs.current);
if (isNaN(currentIndex)) {
return;
}
var urls = fromArgs.urls;
if (!Array.isArray(urls)) {
return;
}
var len = urls.length;
if (!len) {
return;
}
if (currentIndex < 0) {
currentIndex = 0;
} else if (currentIndex >= len) {
currentIndex = len - 1;
}
if (currentIndex > 0) {
fromArgs.current = urls[currentIndex];
fromArgs.urls = urls.filter(
function (item, index) {return index < currentIndex ? item !== urls[currentIndex] : true;});
} else {
fromArgs.current = urls[0];
}
return {
indicator: false,
loop: false };
} };
var UUID_KEY = '__DC_STAT_UUID';
var deviceId;
function addUuid(result) {
deviceId = deviceId || tt.getStorageSync(UUID_KEY);
if (!deviceId) {
deviceId = Date.now() + '' + Math.floor(Math.random() * 1e7);
tt.setStorage({
key: UUID_KEY,
data: deviceId });
}
result.deviceId = deviceId;
}
function addSafeAreaInsets(result) {
if (result.safeArea) {
var safeArea = result.safeArea;
result.safeAreaInsets = {
top: safeArea.top,
left: safeArea.left,
right: result.windowWidth - safeArea.right,
bottom: result.windowHeight - safeArea.bottom };
}
}
var getSystemInfo = {
returnValue: function returnValue(result) {
addUuid(result);
addSafeAreaInsets(result);
} };
var oName = 'getUserInfo';
var nName = 'getUserProfile';
var getUserProfile = {
name: tt.canIUse(nName) ? nName : oName };
// 不支持的 API 列表
var todos = [
'preloadPage',
'unPreloadPage',
'loadSubPackage'
// 'createCameraContext',
// 'createLivePlayerContext',
// 'getSavedFileInfo',
// 'createMapContext',
// 'onMemoryWarning',
// 'onGyroscopeChange',
// 'startGyroscope',
// 'stopGyroscope',
// 'setScreenBrightness',
// 'getScreenBrightness',
// 'addPhoneContact',
// 'openBluetoothAdapter',
// 'startBluetoothDevicesDiscovery',
// 'onBluetoothDeviceFound',
// 'stopBluetoothDevicesDiscovery',
// 'onBluetoothAdapterStateChange',
// 'getConnectedBluetoothDevices',
// 'getBluetoothDevices',
// 'getBluetoothAdapterState',
// 'closeBluetoothAdapter',
// 'writeBLECharacteristicValue',
// 'readBLECharacteristicValue',
// 'onBLEConnectionStateChange',
// 'onBLECharacteristicValueChange',
// 'notifyBLECharacteristicValueChange',
// 'getBLEDeviceServices',
// 'getBLEDeviceCharacteristics',
// 'createBLEConnection',
// 'closeBLEConnection',
// 'onBeaconServiceChange',
// 'onBeaconUpdate',
// 'getBeacons',
// 'startBeaconDiscovery',
// 'stopBeaconDiscovery',
// 'showNavigationBarLoading',
// 'hideNavigationBarLoading',
// 'setTabBarItem',
// 'setTabBarStyle',
// 'hideTabBar',
// 'showTabBar',
// 'setTabBarBadge',
// 'removeTabBarBadge',
// 'showTabBarRedDot',
// 'hideTabBarRedDot',
// 'setBackgroundColor',
// 'setBackgroundTextStyle',
// 'chooseInvoiceTitle',
// 'addTemplate',
// 'deleteTemplate',
// 'getTemplateLibraryById',
// 'getTemplateLibraryList',
// 'getTemplateList',
// 'sendTemplateMessage',
// 'setEnableDebug',
// 'onWindowResize',
// 'offWindowResize',
// 'createOffscreenCanvas',
// 'vibrate'
];
// 存在兼容性的 API 列表
// 头条小程序自1.35.0+支持canIUses
var canIUses = [
// 'createIntersectionObserver',
// 'getSavedFileList',
// 'removeSavedFile',
// 'hideKeyboard',
// 'getImageInfo',
// 'createVideoContext',
// 'onSocketOpen',
// 'onSocketError',
// 'sendSocketMessage',
// 'onSocketMessage',
// 'closeSocket',
// 'onSocketClose',
// 'getExtConfig',
// 'getExtConfigSync',
// 'navigateToMiniProgram',
// 'navigateBackMiniProgram',
// 'compressImage',
// 'chooseLocation',
// 'openDocument',
// 'onUserCaptureScreen',
// 'getBackgroundAudioManager',
// 'setNavigationBarColor',
];
// 需要做转换的 API 列表
var protocols = {
chooseImage: {
args: {
sizeType: false } },
navigateTo: navigateTo,
redirectTo: redirectTo,
previewImage: previewImage,
getSystemInfo: getSystemInfo,
getSystemInfoSync: getSystemInfo,
getUserProfile: getUserProfile,
connectSocket: {
args: {
method: false } },
chooseVideo: {
args: {
camera: false } },
scanCode: {
args: {
onlyFromCamera: false,
scanType: false } },
startAccelerometer: {
args: {
interval: false } },
showToast: {
args: {
image: false,
mask: false } },
showLoading: {
args: {
mask: false } },
showModal: {
args: {
cancelColor: false,
confirmColor: false } },
showActionSheet: {
args: {
itemColor: false } },
login: {
args: {
scopes: false,
timeout: false } },
getUserInfo: {
args: {
lang: false,
timeout: false } },
requestPayment: {
name: tt.pay ? 'pay' : 'requestPayment',
args: {
orderInfo: tt.pay ? 'orderInfo' : 'data' } },
getFileInfo: {
args: {
digestAlgorithm: false } } };
var CALLBACKS = ['success', 'fail', 'cancel', 'complete'];
function processCallback(methodName, method, returnValue) {
return function (res) {
return method(processReturnValue(methodName, res, returnValue));
};
}
function processArgs(methodName, fromArgs) {var argsOption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};var returnValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};var keepFromArgs = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
if (isPlainObject(fromArgs)) {// 一般 api 的参数解析
var toArgs = keepFromArgs === true ? fromArgs : {}; // returnValue 为 false 时,说明是格式化返回值,直接在返回值对象上修改赋值
if (isFn(argsOption)) {
argsOption = argsOption(fromArgs, toArgs) || {};
}
for (var key in fromArgs) {
if (hasOwn(argsOption, key)) {
var keyOption = argsOption[key];
if (isFn(keyOption)) {
keyOption = keyOption(fromArgs[key], fromArgs, toArgs);
}
if (!keyOption) {// 不支持的参数
console.warn("The '".concat(methodName, "' method of platform '\u5934\u6761\u5C0F\u7A0B\u5E8F' does not support option '").concat(key, "'"));
} else if (isStr(keyOption)) {// 重写参数 key
toArgs[keyOption] = fromArgs[key];
} else if (isPlainObject(keyOption)) {// {name:newName,value:value}可重新指定参数 key:value
toArgs[keyOption.name ? keyOption.name : key] = keyOption.value;
}
} else if (CALLBACKS.indexOf(key) !== -1) {
if (isFn(fromArgs[key])) {
toArgs[key] = processCallback(methodName, fromArgs[key], returnValue);
}
} else {
if (!keepFromArgs) {
toArgs[key] = fromArgs[key];
}
}
}
return toArgs;
} else if (isFn(fromArgs)) {
fromArgs = processCallback(methodName, fromArgs, returnValue);
}
return fromArgs;
}
function processReturnValue(methodName, res, returnValue) {var keepReturnValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
if (isFn(protocols.returnValue)) {// 处理通用 returnValue
res = protocols.returnValue(methodName, res);
}
return processArgs(methodName, res, returnValue, {}, keepReturnValue);
}
function wrapper(methodName, method) {
if (hasOwn(protocols, methodName)) {
var protocol = protocols[methodName];
if (!protocol) {// 暂不支持的 api
return function () {
console.error("Platform '\u5934\u6761\u5C0F\u7A0B\u5E8F' does not support '".concat(methodName, "'."));
};
}
return function (arg1, arg2) {// 目前 api 最多两个参数
var options = protocol;
if (isFn(protocol)) {
options = protocol(arg1);
}
arg1 = processArgs(methodName, arg1, options.args, options.returnValue);
var args = [arg1];
if (typeof arg2 !== 'undefined') {
args.push(arg2);
}
if (isFn(options.name)) {
methodName = options.name(arg1);
} else if (isStr(options.name)) {
methodName = options.name;
}
var returnValue = tt[methodName].apply(tt, args);
if (isSyncApi(methodName)) {// 同步 api
return processReturnValue(methodName, returnValue, options.returnValue, isContextApi(methodName));
}
return returnValue;
};
}
return method;
}
var todoApis = Object.create(null);
var TODOS = [
'onTabBarMidButtonTap',
'subscribePush',
'unsubscribePush',
'onPush',
'offPush',
'share'];
function createTodoApi(name) {
return function todoApi(_ref)
{var fail = _ref.fail,complete = _ref.complete;
var res = {
errMsg: "".concat(name, ":fail method '").concat(name, "' not supported") };
isFn(fail) && fail(res);
isFn(complete) && complete(res);
};
}
TODOS.forEach(function (name) {
todoApis[name] = createTodoApi(name);
});
var providers = {
oauth: ['toutiao'],
share: ['toutiao'],
payment: ['toutiao'],
push: ['toutiao'] };
function getProvider(_ref2)
{var service = _ref2.service,success = _ref2.success,fail = _ref2.fail,complete = _ref2.complete;
var res = false;
if (providers[service]) {
res = {
errMsg: 'getProvider:ok',
service: service,
provider: providers[service] };
isFn(success) && success(res);
} else {
res = {
errMsg: 'getProvider:fail service not found' };
isFn(fail) && fail(res);
}
isFn(complete) && complete(res);
}
var extraApi = /*#__PURE__*/Object.freeze({
__proto__: null,
getProvider: getProvider });
var getEmitter = function () {
var Emitter;
return function getUniEmitter() {
if (!Emitter) {
Emitter = new _vue.default();
}
return Emitter;
};
}();
function apply(ctx, method, args) {
return ctx[method].apply(ctx, args);
}
function $on() {
return apply(getEmitter(), '$on', Array.prototype.slice.call(arguments));
}
function $off() {
return apply(getEmitter(), '$off', Array.prototype.slice.call(arguments));
}
function $once() {
return apply(getEmitter(), '$once', Array.prototype.slice.call(arguments));
}
function $emit() {
return apply(getEmitter(), '$emit', Array.prototype.slice.call(arguments));
}
var eventApi = /*#__PURE__*/Object.freeze({
__proto__: null,
$on: $on,
$off: $off,
$once: $once,
$emit: $emit });
function createMediaQueryObserver() {
var mediaQueryObserver = {};var _tt$getSystemInfoSync2 =
tt.getSystemInfoSync(),windowWidth = _tt$getSystemInfoSync2.windowWidth,windowHeight = _tt$getSystemInfoSync2.windowHeight;
var orientation = windowWidth < windowHeight ? 'portrait' : 'landscape';
mediaQueryObserver.observe = function (options, callback) {
var matches = true;
for (var item in options) {
var itemValue = item === 'orientation' ? options[item] : Number(options[item]);
if (options[item] !== '') {
if (item === 'width') {
if (itemValue === windowWidth) {
matches = true;
} else {
matches = false;
callback(matches);
return matches;
}
}
if (item === 'minWidth') {
if (windowWidth >= itemValue) {
matches = true;
} else {
matches = false;
callback(matches);
return matches;
}
}
if (item === 'maxWidth') {
if (windowWidth <= itemValue) {
matches = true;
} else {
matches = false;
callback(matches);
return matches;
}
}
if (item === 'height') {
if (itemValue === windowHeight) {
matches = true;
} else {
matches = false;
callback(matches);
return matches;
}
}
if (item === 'minHeight') {
if (windowHeight >= itemValue) {
matches = true;
} else {
matches = false;
callback(matches);
return matches;
}
}
if (item === 'maxHeight') {
if (windowHeight <= itemValue) {
matches = true;
} else {
matches = false;
callback(matches);
return matches;
}
}
if (item === 'orientation') {
if (options[item] === orientation) {
matches = true;
} else {
matches = false;
callback(matches);
return matches;
}
}
}
}
callback(matches);
return matches;
};
mediaQueryObserver.disconnect = function () {
};
return mediaQueryObserver;
}
var api = /*#__PURE__*/Object.freeze({
__proto__: null,
createMediaQueryObserver: createMediaQueryObserver });
var MPPage = Page;
var MPComponent = Component;
var customizeRE = /:/g;
var customize = cached(function (str) {
return camelize(str.replace(customizeRE, '-'));
});
function initTriggerEvent(mpInstance) {
var oldTriggerEvent = mpInstance.triggerEvent;
var newTriggerEvent = function newTriggerEvent(event) {for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {args[_key4 - 1] = arguments[_key4];}
return oldTriggerEvent.apply(mpInstance, [customize(event)].concat(args));
};
try {
// 京东小程序 triggerEvent 为只读
mpInstance.triggerEvent = newTriggerEvent;
} catch (error) {
mpInstance._triggerEvent = newTriggerEvent;
}
}
function initHook(name, options, isComponent) {
{
// fix by Lxh 字节自定义组件Component构造器文档上写有created,但是实测只触发了lifetimes上的created
isComponent && options.lifetimes && options.lifetimes[name] && (options = options.lifetimes);
}
var oldHook = options[name];
if (!oldHook) {
options[name] = function () {
initTriggerEvent(this);
};
} else {
options[name] = function () {
initTriggerEvent(this);for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {args[_key5] = arguments[_key5];}
return oldHook.apply(this, args);
};
}
}
if (!MPPage.__$wrappered) {
MPPage.__$wrappered = true;
Page = function Page() {var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
initHook('onLoad', options);
return MPPage(options);
};
Page.after = MPPage.after;
Component = function Component() {var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
initHook('created', options, true);
return MPComponent(options);
};
}
var PAGE_EVENT_HOOKS = [
'onPullDownRefresh',
'onReachBottom',
'onAddToFavorites',
'onShareTimeline',
'onShareAppMessage',
'onPageScroll',
'onResize',
'onTabItemTap'];
function initMocks(vm, mocks) {
var mpInstance = vm.$mp[vm.mpType];
mocks.forEach(function (mock) {
if (hasOwn(mpInstance, mock)) {
vm[mock] = mpInstance[mock];
}
});
}
function hasHook(hook, vueOptions) {
if (!vueOptions) {
return true;
}
if (_vue.default.options && Array.isArray(_vue.default.options[hook])) {
return true;
}
vueOptions = vueOptions.default || vueOptions;
if (isFn(vueOptions)) {
if (isFn(vueOptions.extendOptions[hook])) {
return true;
}
if (vueOptions.super &&
vueOptions.super.options &&
Array.isArray(vueOptions.super.options[hook])) {
return true;
}
return false;
}
if (isFn(vueOptions[hook])) {
return true;
}
var mixins = vueOptions.mixins;
if (Array.isArray(mixins)) {
return !!mixins.find(function (mixin) {return hasHook(hook, mixin);});
}
}
function initHooks(mpOptions, hooks, vueOptions) {
hooks.forEach(function (hook) {
if (hasHook(hook, vueOptions)) {
mpOptions[hook] = function (args) {
return this.$vm && this.$vm.__call_hook(hook, args);
};
}
});
}
function initVueComponent(Vue, vueOptions) {
vueOptions = vueOptions.default || vueOptions;
var VueComponent;
if (isFn(vueOptions)) {
VueComponent = vueOptions;
} else {
VueComponent = Vue.extend(vueOptions);
}
vueOptions = VueComponent.options;
return [VueComponent, vueOptions];
}
function initSlots(vm, vueSlots) {
if (Array.isArray(vueSlots) && vueSlots.length) {
var $slots = Object.create(null);
vueSlots.forEach(function (slotName) {
$slots[slotName] = true;
});
vm.$scopedSlots = vm.$slots = $slots;
}
}
function initVueIds(vueIds, mpInstance) {
vueIds = (vueIds || '').split(',');
var len = vueIds.length;
if (len === 1) {
mpInstance._$vueId = vueIds[0];
} else if (len === 2) {
mpInstance._$vueId = vueIds[0];
mpInstance._$vuePid = vueIds[1];
}
}
function initData(vueOptions, context) {
var data = vueOptions.data || {};
var methods = vueOptions.methods || {};
if (typeof data === 'function') {
try {
data = data.call(context); // 支持 Vue.prototype 上挂的数据
} catch (e) {
if (Object({"VUE_APP_NAME":"app","VUE_APP_PLATFORM":"mp-toutiao","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG) {
console.warn('根据 Vue 的 data 函数初始化小程序 data 失败,请尽量确保 data 函数中不访问 vm 对象,否则可能影响首次数据渲染速度。', data);
}
}
} else {
try {
// 对 data 格式化
data = JSON.parse(JSON.stringify(data));
} catch (e) {}
}
if (!isPlainObject(data)) {
data = {};
}
Object.keys(methods).forEach(function (methodName) {
if (context.__lifecycle_hooks__.indexOf(methodName) === -1 && !hasOwn(data, methodName)) {
data[methodName] = methods[methodName];
}
});
return data;
}
var PROP_TYPES = [String, Number, Boolean, Object, Array, null];
function createObserver(name) {
return function observer(newVal, oldVal) {
if (this.$vm) {
this.$vm[name] = newVal; // 为了触发其他非 render watcher
}
};
}
function initBehaviors(vueOptions, initBehavior) {
var vueBehaviors = vueOptions.behaviors;
var vueExtends = vueOptions.extends;
var vueMixins = vueOptions.mixins;
var vueProps = vueOptions.props;
if (!vueProps) {
vueOptions.props = vueProps = [];
}
var behaviors = [];
if (Array.isArray(vueBehaviors)) {
vueBehaviors.forEach(function (behavior) {
behaviors.push(behavior.replace('uni://', "tt".concat("://")));
if (behavior === 'uni://form-field') {
if (Array.isArray(vueProps)) {
vueProps.push('name');
vueProps.push('value');
} else {
vueProps.name = {
type: String,
default: '' };
vueProps.value = {
type: [String, Number, Boolean, Array, Object, Date],
default: '' };
}
}
});
}
if (isPlainObject(vueExtends) && vueExtends.props) {
behaviors.push(
initBehavior({
properties: initProperties(vueExtends.props, true) }));
}
if (Array.isArray(vueMixins)) {
vueMixins.forEach(function (vueMixin) {
if (isPlainObject(vueMixin) && vueMixin.props) {
behaviors.push(
initBehavior({
properties: initProperties(vueMixin.props, true) }));
}
});
}
return behaviors;
}
function parsePropType(key, type, defaultValue, file) {
// [String]=>String
if (Array.isArray(type) && type.length === 1) {
return type[0];
}
return type;
}
function initProperties(props) {var isBehavior = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;var file = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
var properties = {};
if (!isBehavior) {
properties.vueId = {
type: String,
value: '' };
// 用于字节跳动小程序模拟抽象节点
properties.generic = {
type: Object,
value: null };
// scopedSlotsCompiler auto
properties.scopedSlotsCompiler = {
type: String,
value: '' };
properties.vueSlots = { // 小程序不能直接定义 $slots 的 props,所以通过 vueSlots 转换到 $slots
type: null,
value: [],
observer: function observer(newVal, oldVal) {
var $slots = Object.create(null);
newVal.forEach(function (slotName) {
$slots[slotName] = true;
});
this.setData({
$slots: $slots });
} };
}
if (Array.isArray(props)) {// ['title']
props.forEach(function (key) {
properties[key] = {
type: null,
observer: createObserver(key) };
});
} else if (isPlainObject(props)) {// {title:{type:String,default:''},content:String}
Object.keys(props).forEach(function (key) {
var opts = props[key];
if (isPlainObject(opts)) {// title:{type:String,default:''}
var value = opts.default;
if (isFn(value)) {
value = value();
}
opts.type = parsePropType(key, opts.type);
properties[key] = {
type: PROP_TYPES.indexOf(opts.type) !== -1 ? opts.type : null,
value: value,
observer: createObserver(key) };
} else {// content:String
var type = parsePropType(key, opts);
properties[key] = {
type: PROP_TYPES.indexOf(type) !== -1 ? type : null,
observer: createObserver(key) };
}
});
}
return properties;
}
function wrapper$1(event) {
// TODO 又得兼容 mpvue 的 mp 对象
try {
event.mp = JSON.parse(JSON.stringify(event));
} catch (e) {}
event.stopPropagation = noop;
event.preventDefault = noop;
event.target = event.target || {};
if (!hasOwn(event, 'detail')) {
event.detail = {};
}
if (hasOwn(event, 'markerId')) {
event.detail = typeof event.detail === 'object' ? event.detail : {};
event.detail.markerId = event.markerId;
}
if (isPlainObject(event.detail)) {
event.target = Object.assign({}, event.target, event.detail);
}
return event;
}
function getExtraValue(vm, dataPathsArray) {
var context = vm;
dataPathsArray.forEach(function (dataPathArray) {
var dataPath = dataPathArray[0];
var value = dataPathArray[2];
if (dataPath || typeof value !== 'undefined') {// ['','',index,'disable']
var propPath = dataPathArray[1];
var valuePath = dataPathArray[3];
var vFor;
if (Number.isInteger(dataPath)) {
vFor = dataPath;
} else if (!dataPath) {
vFor = context;
} else if (typeof dataPath === 'string' && dataPath) {
if (dataPath.indexOf('#s#') === 0) {
vFor = dataPath.substr(3);
} else {
vFor = vm.__get_value(dataPath, context);
}
}
if (Number.isInteger(vFor)) {
context = value;
} else if (!propPath) {
context = vFor[value];
} else {
if (Array.isArray(vFor)) {
context = vFor.find(function (vForItem) {
return vm.__get_value(propPath, vForItem) === value;
});
} else if (isPlainObject(vFor)) {
context = Object.keys(vFor).find(function (vForKey) {
return vm.__get_value(propPath, vFor[vForKey]) === value;
});
} else {
console.error('v-for 暂不支持循环数据:', vFor);
}
}
if (valuePath) {
context = vm.__get_value(valuePath, context);
}
}
});
return context;
}
function processEventExtra(vm, extra, event) {
var extraObj = {};
if (Array.isArray(extra) && extra.length) {
/**
*[
* ['data.items', 'data.id', item.data.id],
* ['metas', 'id', meta.id]
*],
*[
* ['data.items', 'data.id', item.data.id],
* ['metas', 'id', meta.id]
*],
*'test'
*/
extra.forEach(function (dataPath, index) {
if (typeof dataPath === 'string') {
if (!dataPath) {// model,prop.sync
extraObj['$' + index] = vm;
} else {
if (dataPath === '$event') {// $event
extraObj['$' + index] = event;
} else if (dataPath === 'arguments') {
if (event.detail && event.detail.__args__) {
extraObj['$' + index] = event.detail.__args__;
} else {
extraObj['$' + index] = [event];
}
} else if (dataPath.indexOf('$event.') === 0) {// $event.target.value
extraObj['$' + index] = vm.__get_value(dataPath.replace('$event.', ''), event);
} else {
extraObj['$' + index] = vm.__get_value(dataPath);
}
}
} else {
extraObj['$' + index] = getExtraValue(vm, dataPath);
}
});
}
return extraObj;
}
function getObjByArray(arr) {
var obj = {};
for (var i = 1; i < arr.length; i++) {
var element = arr[i];
obj[element[0]] = element[1];
}
return obj;
}
function processEventArgs(vm, event) {var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];var extra = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];var isCustom = arguments.length > 4 ? arguments[4] : undefined;var methodName = arguments.length > 5 ? arguments[5] : undefined;
var isCustomMPEvent = false; // wxcomponent 组件,传递原始 event 对象
if (isCustom) {// 自定义事件
isCustomMPEvent = event.currentTarget &&
event.currentTarget.dataset &&
event.currentTarget.dataset.comType === 'wx';
if (!args.length) {// 无参数,直接传入 event 或 detail 数组
if (isCustomMPEvent) {
return [event];
}
return event.detail.__args__ || event.detail;
}
}
var extraObj = processEventExtra(vm, extra, event);
var ret = [];
args.forEach(function (arg) {
if (arg === '$event') {
if (methodName === '__set_model' && !isCustom) {// input v-model value
ret.push(event.target.value);
} else {
if (isCustom && !isCustomMPEvent) {
ret.push(event.detail.__args__[0]);
} else {// wxcomponent 组件或内置组件
ret.push(event);
}
}
} else {
if (Array.isArray(arg) && arg[0] === 'o') {
ret.push(getObjByArray(arg));
} else if (typeof arg === 'string' && hasOwn(extraObj, arg)) {
ret.push(extraObj[arg]);
} else {
ret.push(arg);
}
}
});
return ret;
}
var ONCE = '~';
var CUSTOM = '^';
function isMatchEventType(eventType, optType) {
return eventType === optType ||
optType === 'regionchange' && (
eventType === 'begin' ||
eventType === 'end');
}
function getContextVm(vm) {
var $parent = vm.$parent;
// 父组件是 scoped slots 或者其他自定义组件时继续查找
while ($parent && $parent.$parent && ($parent.$options.generic || $parent.$parent.$options.generic || $parent.$scope._$vuePid)) {
$parent = $parent.$parent;
}
return $parent && $parent.$parent;
}
function handleEvent(event) {var _this2 = this;
event = wrapper$1(event);
// [['tap',[['handle',[1,2,a]],['handle1',[1,2,a]]]]]
var dataset = (event.currentTarget || event.target).dataset;
if (!dataset) {
return console.warn('事件信息不存在');
}
var eventOpts = dataset.eventOpts || dataset['event-opts']; // 支付宝 web-view 组件 dataset 非驼峰
if (!eventOpts) {
return console.warn('事件信息不存在');
}
// [['handle',[1,2,a]],['handle1',[1,2,a]]]
var eventType = event.type;
var ret = [];
eventOpts.forEach(function (eventOpt) {
var type = eventOpt[0];
var eventsArray = eventOpt[1];
var isCustom = type.charAt(0) === CUSTOM;
type = isCustom ? type.slice(1) : type;
var isOnce = type.charAt(0) === ONCE;
type = isOnce ? type.slice(1) : type;
if (eventsArray && isMatchEventType(eventType, type)) {
eventsArray.forEach(function (eventArray) {
var methodName = eventArray[0];
if (methodName) {
var handlerCtx = _this2.$vm;
if (handlerCtx.$options.generic) {// mp-weixin,mp-toutiao 抽象节点模拟 scoped slots
handlerCtx = getContextVm(handlerCtx) || handlerCtx;
}
if (methodName === '$emit') {
handlerCtx.$emit.apply(handlerCtx,
processEventArgs(
_this2.$vm,
event,
eventArray[1],
eventArray[2],
isCustom,
methodName));
return;
}
var handler = handlerCtx[methodName];
if (!isFn(handler)) {
throw new Error(" _vm.".concat(methodName, " is not a function"));
}
if (isOnce) {
if (handler.once) {
return;
}
handler.once = true;
}
var params = processEventArgs(
_this2.$vm,
event,
eventArray[1],
eventArray[2],
isCustom,
methodName);
params = Array.isArray(params) ? params : [];
// 参数尾部增加原始事件对象用于复杂表达式内获取额外数据
if (/=\s*\S+\.eventParams\s*\|\|\s*\S+\[['"]event-params['"]\]/.test(handler.toString())) {
// eslint-disable-next-line no-sparse-arrays
params = params.concat([,,,,,,,,,, event]);
}
ret.push(handler.apply(handlerCtx, params));
}
});
}
});
if (
eventType === 'input' &&
ret.length === 1 &&
typeof ret[0] !== 'undefined')
{
return ret[0];
}
}
var messages = {};
var locale;
{
locale = tt.getSystemInfoSync().language;
}
function initI18nMessages() {
if (!isEnableLocale()) {
return;
}
var localeKeys = Object.keys(__uniConfig.locales);
if (localeKeys.length) {
localeKeys.forEach(function (locale) {
var curMessages = messages[locale];
var userMessages = __uniConfig.locales[locale];
if (curMessages) {
Object.assign(curMessages, userMessages);
} else {
messages[locale] = userMessages;
}
});
}
}
initI18nMessages();
var i18n = (0, _uniI18n.initVueI18n)(
locale,
{});
var t = i18n.t;
var i18nMixin = i18n.mixin = {
beforeCreate: function beforeCreate() {var _this3 = this;
var unwatch = i18n.i18n.watchLocale(function () {
_this3.$forceUpdate();
});
this.$once('hook:beforeDestroy', function () {
unwatch();
});
},
methods: {
$$t: function $$t(key, values) {
return t(key, values);
} } };
var setLocale$1 = i18n.setLocale;
var getLocale$1 = i18n.getLocale;
function initAppLocale(Vue, appVm, locale) {
var state = Vue.observable({
locale: locale || i18n.getLocale() });
var localeWatchers = [];
appVm.$watchLocale = function (fn) {
localeWatchers.push(fn);
};
Object.defineProperty(appVm, '$locale', {
get: function get() {
return state.locale;
},
set: function set(v) {
state.locale = v;
localeWatchers.forEach(function (watch) {return watch(v);});
} });
}
function isEnableLocale() {
return typeof __uniConfig !== 'undefined' && __uniConfig.locales && !!Object.keys(__uniConfig.locales).length;
}
// export function initI18n() {
// const localeKeys = Object.keys(__uniConfig.locales || {})
// if (localeKeys.length) {
// localeKeys.forEach((locale) =>
// i18n.add(locale, __uniConfig.locales[locale])
// )
// }
// }
var hooks = [
'onShow',
'onHide',
'onError',
'onPageNotFound',
'onThemeChange',
'onUnhandledRejection'];
function initEventChannel$1() {
_vue.default.prototype.getOpenerEventChannel = function () {
if (!this.__eventChannel__) {
this.__eventChannel__ = new EventChannel();
}
return this.__eventChannel__;
};
var callHook = _vue.default.prototype.__call_hook;
_vue.default.prototype.__call_hook = function (hook, args) {
if (hook === 'onLoad' && args && args.__id__) {
this.__eventChannel__ = getEventChannel(args.__id__);
delete args.__id__;
}
return callHook.call(this, hook, args);
};
}
function initScopedSlotsParams() {
var center = {};
var parents = {};
_vue.default.prototype.$hasScopedSlotsParams = function (vueId) {
var has = center[vueId];
if (!has) {
parents[vueId] = this;
this.$on('hook:destroyed', function () {
delete parents[vueId];
});
}
return has;
};
_vue.default.prototype.$getScopedSlotsParams = function (vueId, name, key) {
var data = center[vueId];
if (data) {
var object = data[name] || {};
return key ? object[key] : object;
} else {
parents[vueId] = this;
this.$on('hook:destroyed', function () {
delete parents[vueId];
});
}
};
_vue.default.prototype.$setScopedSlotsParams = function (name, value) {
var vueIds = this.$options.propsData.vueId;
if (vueIds) {
var vueId = vueIds.split(',')[0];
var object = center[vueId] = center[vueId] || {};
object[name] = value;
if (parents[vueId]) {
parents[vueId].$forceUpdate();
}
}
};
_vue.default.mixin({
destroyed: function destroyed() {
var propsData = this.$options.propsData;
var vueId = propsData && propsData.vueId;
if (vueId) {
delete center[vueId];
delete parents[vueId];
}
} });
}
function parseBaseApp(vm, _ref3)
{var mocks = _ref3.mocks,initRefs = _ref3.initRefs;
initEventChannel$1();
{
initScopedSlotsParams();
}
if (vm.$options.store) {
_vue.default.prototype.$store = vm.$options.store;
}
uniIdMixin(_vue.default);
_vue.default.prototype.mpHost = "mp-toutiao";
_vue.default.mixin({
beforeCreate: function beforeCreate() {
if (!this.$options.mpType) {
return;
}
this.mpType = this.$options.mpType;
this.$mp = _defineProperty({
data: {} },
this.mpType, this.$options.mpInstance);
this.$scope = this.$options.mpInstance;
delete this.$options.mpType;
delete this.$options.mpInstance;
if (this.mpType === 'page' && typeof getApp === 'function') {// hack vue-i18n
var app = getApp();
if (app.$vm && app.$vm.$i18n) {
this._i18n = app.$vm.$i18n;
}
}
if (this.mpType !== 'app') {
initRefs(this);
initMocks(this, mocks);
}
} });
var appOptions = {
onLaunch: function onLaunch(args) {
if (this.$vm) {// 已经初始化过了,主要是为了百度,百度 onShow 在 onLaunch 之前
return;
}
this.$vm = vm;
this.$vm.$mp = {
app: this };
this.$vm.$scope = this;
// vm 上也挂载 globalData
this.$vm.globalData = this.globalData;
this.$vm._isMounted = true;
this.$vm.__call_hook('mounted', args);
this.$vm.__call_hook('onLaunch', args);
} };
// 兼容旧版本 globalData
appOptions.globalData = vm.$options.globalData || {};
// 将 methods 中的方法挂在 getApp() 中
var methods = vm.$options.methods;
if (methods) {
Object.keys(methods).forEach(function (name) {
appOptions[name] = methods[name];
});
}
initAppLocale(_vue.default, vm, tt.getSystemInfoSync().language || 'zh-Hans');
initHooks(appOptions, hooks);
return appOptions;
}
function findVmByVueId(vm, vuePid) {
var $children = vm.$children;
// 优先查找直属(反向查找:https://github.com/dcloudio/uni-app/issues/1200)
for (var i = $children.length - 1; i >= 0; i--) {
var childVm = $children[i];
if (childVm.$scope._$vueId === vuePid) {
return childVm;
}
}
// 反向递归查找
var parentVm;
for (var _i = $children.length - 1; _i >= 0; _i--) {
parentVm = findVmByVueId($children[_i], vuePid);
if (parentVm) {
return parentVm;
}
}
}
function initBehavior(options) {
return Behavior(options);
}
function handleLink(event) {var _ref4 =
event.detail || event.value,vuePid = _ref4.vuePid,vueOptions = _ref4.vueOptions; // detail 是微信,value 是百度(dipatch)
var parentVm;
if (vuePid) {
parentVm = findVmByVueId(this.$vm, vuePid);
}
if (!parentVm) {
parentVm = this.$vm;
}
vueOptions.parent = parentVm;
}
var mocks = ['__route__', '__webviewId__', '__nodeid__', '__nodeId__'];
function isPage() {
return this.__nodeid__ === 0 || this.__nodeId__ === 0;
}
function initRefs(vm) {
var mpInstance = vm.$scope;
/* eslint-disable no-undef */
var minorVersion = parseInt(tt.getSystemInfoSync().SDKVersion.split('.')[1]);
if (minorVersion > 16) {
Object.defineProperty(vm, '$refs', {
get: function get() {
var $refs = {};
var components = mpInstance.selectAllComponents('.vue-ref');
components.forEach(function (component) {
var ref = component.dataset.ref;
$refs[ref] = component.$vm || component;
});
var forComponents = mpInstance.selectAllComponents('.vue-ref-in-for');
forComponents.forEach(function (component) {
var ref = component.dataset.ref;
if (!$refs[ref]) {
$refs[ref] = [];
}
$refs[ref].push(component.$vm || component);
});
return $refs;
} });
} else {
mpInstance.selectAllComponents('.vue-ref', function (components) {
components.forEach(function (component) {
var ref = component.dataset.ref;
vm.$refs[ref] = component.$vm || component;
});
});
mpInstance.selectAllComponents('.vue-ref-in-for', function (forComponents) {
forComponents.forEach(function (component) {
var ref = component.dataset.ref;
if (!vm.$refs[ref]) {
vm.$refs[ref] = [];
}
vm.$refs[ref].push(component.$vm || component);
});
});
}
}
var instances = Object.create(null);
function initRelation(_ref5)
{var vuePid = _ref5.vuePid,mpInstance = _ref5.mpInstance;
// 头条 triggerEvent 后,接收事件时机特别晚,已经到了 ready 之后
var nodeId = (mpInstance.__nodeId__ || mpInstance.__nodeid__) + '';
var webviewId = mpInstance.__webviewId__ + '';
instances[webviewId + '_' + nodeId] = mpInstance.$vm;
this.triggerEvent('__l', {
vuePid: vuePid,
nodeId: nodeId,
webviewId: webviewId });
}
function handleLink$1(_ref6)
{var _ref6$detail = _ref6.detail,vuePid = _ref6$detail.vuePid,nodeId = _ref6$detail.nodeId,webviewId = _ref6$detail.webviewId;
var vm = instances[webviewId + '_' + nodeId];
if (!vm) {
return;
}
var parentVm;
if (vuePid) {
parentVm = findVmByVueId(this.$vm, vuePid);
}
if (!parentVm) {
parentVm = this.$vm;
}
vm.$parent = parentVm;
vm.$root = parentVm.$root;
parentVm.$children.push(vm);
vm.__call_hook('created');
vm.__call_hook('beforeMount');
vm._isMounted = true;
vm.__call_hook('mounted');
vm.__call_hook('onReady');
}
function parseApp(vm) {
_vue.default.prototype._$fallback = true; // 降级(调整原 vue 的部分生命周期,如 created,beforeMount,inject,provide)
_vue.default.mixin({
created: function created() {// 处理 injections,头条 triggerEvent 是异步,且触发时机很慢,故延迟 relation 设置
if (this.mpType !== 'app') {
if (
this.mpType === 'page' &&
!this.$scope.route &&
this.$scope.__route__)
{
this.$scope.route = this.$scope.__route__;
}
initRefs(this);
this.__init_injections(this);
this.__init_provide(this);
}
} });
return parseBaseApp(vm, {
mocks: mocks,
initRefs: function initRefs() {} // attached 时,可能查询不到
});
}
function createApp(vm) {
App(parseApp(vm));
return vm;
}
var encodeReserveRE = /[!'()*]/g;
var encodeReserveReplacer = function encodeReserveReplacer(c) {return '%' + c.charCodeAt(0).toString(16);};
var commaRE = /%2C/g;
// fixed encodeURIComponent which is more conformant to RFC3986:
// - escapes [!'()*]
// - preserve commas
var encode = function encode(str) {return encodeURIComponent(str).
replace(encodeReserveRE, encodeReserveReplacer).
replace(commaRE, ',');};
function stringifyQuery(obj) {var encodeStr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : encode;
var res = obj ? Object.keys(obj).map(function (key) {
var val = obj[key];
if (val === undefined) {
return '';
}
if (val === null) {
return encodeStr(key);
}
if (Array.isArray(val)) {
var result = [];
val.forEach(function (val2) {
if (val2 === undefined) {
return;
}
if (val2 === null) {
result.push(encodeStr(key));
} else {
result.push(encodeStr(key) + '=' + encodeStr(val2));
}
});
return result.join('&');
}
return encodeStr(key) + '=' + encodeStr(val);
}).filter(function (x) {return x.length > 0;}).join('&') : null;
return res ? "?".concat(res) : '';
}
function parseBaseComponent(vueComponentOptions)
{var _ref7 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},isPage = _ref7.isPage,initRelation = _ref7.initRelation;var _initVueComponent =
initVueComponent(_vue.default, vueComponentOptions),_initVueComponent2 = _slicedToArray(_initVueComponent, 2),VueComponent = _initVueComponent2[0],vueOptions = _initVueComponent2[1];
var options = _objectSpread({
multipleSlots: true,
addGlobalClass: true },
vueOptions.options || {});
var componentOptions = {
options: options,
data: initData(vueOptions, _vue.default.prototype),
behaviors: initBehaviors(vueOptions, initBehavior),
properties: initProperties(vueOptions.props, false, vueOptions.__file),
lifetimes: {
attached: function attached() {
var properties = this.properties;
var options = {
mpType: isPage.call(this) ? 'page' : 'component',
mpInstance: this,
propsData: properties };
initVueIds(properties.vueId, this);
// 处理父子关系
initRelation.call(this, {
vuePid: this._$vuePid,
vueOptions: options });
// 初始化 vue 实例
this.$vm = new VueComponent(options);
// 处理$slots,$scopedSlots(暂不支持动态变化$slots)
initSlots(this.$vm, properties.vueSlots);
// 触发首次 setData
this.$vm.$mount();
},
ready: function ready() {
// 当组件 props 默认值为 true,初始化时传入 false 会导致 created,ready 触发, 但 attached 不触发
// https://developers.weixin.qq.com/community/develop/doc/00066ae2844cc0f8eb883e2a557800
if (this.$vm) {
this.$vm._isMounted = true;
this.$vm.__call_hook('mounted');
this.$vm.__call_hook('onReady');
}
},
detached: function detached() {
this.$vm && this.$vm.$destroy();
} },
pageLifetimes: {
show: function show(args) {
this.$vm && this.$vm.__call_hook('onPageShow', args);
},
hide: function hide() {
this.$vm && this.$vm.__call_hook('onPageHide');
},
resize: function resize(size) {
this.$vm && this.$vm.__call_hook('onPageResize', size);
} },
methods: {
__l: handleLink,
__e: handleEvent } };
// externalClasses
if (vueOptions.externalClasses) {
componentOptions.externalClasses = vueOptions.externalClasses;
}
if (Array.isArray(vueOptions.wxsCallMethods)) {
vueOptions.wxsCallMethods.forEach(function (callMethod) {
componentOptions.methods[callMethod] = function (args) {
return this.$vm[callMethod](args);
};
});
}
if (isPage) {
return componentOptions;
}
return [componentOptions, VueComponent];
}
var components = [];
function parseComponent(vueOptions) {var _parseBaseComponent =
parseBaseComponent(vueOptions),_parseBaseComponent2 = _slicedToArray(_parseBaseComponent, 2),componentOptions = _parseBaseComponent2[0],VueComponent = _parseBaseComponent2[1];
// 基础库 2.0 以上 attached 顺序错乱,按照 created 顺序强制纠正
componentOptions.lifetimes.created = function created() {
components.push(this);
};
componentOptions.lifetimes.attached = function attached() {
this.__lifetimes_attached = function () {
var properties = this.properties;
var options = {
mpType: isPage.call(this) ? 'page' : 'component',
mpInstance: this,
propsData: properties };
initVueIds(properties.vueId, this);
// 初始化 vue 实例
this.$vm = new VueComponent(options);
// 处理$slots,$scopedSlots(暂不支持动态变化$slots)
initSlots(this.$vm, properties.vueSlots);
// 处理父子关系
initRelation.call(this, {
vuePid: this._$vuePid,
mpInstance: this });
// 触发首次 setData
this.$vm.$mount();
};
var component = this;
while (component && component.__lifetimes_attached && components[0] && component === components[0]) {
components.shift();
component.__lifetimes_attached();
delete component.__lifetimes_attached;
component = components[0];
}
};
// ready 比 handleLink 还早,初始化逻辑放到 handleLink 中
delete componentOptions.lifetimes.ready;
componentOptions.methods.__l = handleLink$1;
return componentOptions;
}
var hooks$1 = [
'onShow',
'onHide',
'onUnload'];
hooks$1.push.apply(hooks$1, PAGE_EVENT_HOOKS);
function parseBasePage(vuePageOptions, _ref8)
{var isPage = _ref8.isPage,initRelation = _ref8.initRelation;
var pageOptions = parseComponent(vuePageOptions);
initHooks(pageOptions.methods, hooks$1, vuePageOptions);
pageOptions.methods.onLoad = function (query) {
this.options = query;
var copyQuery = Object.assign({}, query);
delete copyQuery.__id__;
this.$page = {
fullPath: '/' + (this.route || this.is) + stringifyQuery(copyQuery) };
this.$vm.$mp.query = query; // 兼容 mpvue
this.$vm.__call_hook('onLoad', query);
};
return pageOptions;
}
function parsePage(vuePageOptions) {
var pageOptions = parseBasePage(vuePageOptions, {
isPage: isPage,
initRelation: initRelation });
// 页面需要在 ready 中触发,其他组件是在 handleLink 中触发
pageOptions.lifetimes.ready = function ready() {
if (this.$vm && this.$vm.mpType === 'page') {
this.$vm.__call_hook('created');
this.$vm.__call_hook('beforeMount');
this.$vm._isMounted = true;
this.$vm.__call_hook('mounted');
this.$vm.__call_hook('onReady');
} else {
this.is && console.warn(this.is + ' is not ready');
}
};
pageOptions.lifetimes.detached = function detached() {
this.$vm && this.$vm.$destroy();
// 清理
var webviewId = this.__webviewId__;
webviewId && Object.keys(instances).forEach(function (key) {
if (key.indexOf(webviewId + '_') === 0) {
delete instances[key];
}
});
};
return pageOptions;
}
function createPage(vuePageOptions) {
{
return Component(parsePage(vuePageOptions));
}
}
function createComponent(vueOptions) {
{
return Component(parseComponent(vueOptions));
}
}
function createSubpackageApp(vm) {
var appOptions = parseApp(vm);
var app = getApp({
allowDefault: true });
vm.$scope = app;
var globalData = app.globalData;
if (globalData) {
Object.keys(appOptions.globalData).forEach(function (name) {
if (!hasOwn(globalData, name)) {
globalData[name] = appOptions.globalData[name];
}
});
}
Object.keys(appOptions).forEach(function (name) {
if (!hasOwn(app, name)) {
app[name] = appOptions[name];
}
});
if (isFn(appOptions.onShow) && tt.onAppShow) {
tt.onAppShow(function () {for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {args[_key6] = arguments[_key6];}
vm.__call_hook('onShow', args);
});
}
if (isFn(appOptions.onHide) && tt.onAppHide) {
tt.onAppHide(function () {for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {args[_key7] = arguments[_key7];}
vm.__call_hook('onHide', args);
});
}
if (isFn(appOptions.onLaunch)) {
var args = tt.getLaunchOptionsSync && tt.getLaunchOptionsSync();
vm.__call_hook('onLaunch', args);
}
return vm;
}
function createPlugin(vm) {
var appOptions = parseApp(vm);
if (isFn(appOptions.onShow) && tt.onAppShow) {
tt.onAppShow(function () {for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {args[_key8] = arguments[_key8];}
vm.__call_hook('onShow', args);
});
}
if (isFn(appOptions.onHide) && tt.onAppHide) {
tt.onAppHide(function () {for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {args[_key9] = arguments[_key9];}
vm.__call_hook('onHide', args);
});
}
if (isFn(appOptions.onLaunch)) {
var args = tt.getLaunchOptionsSync && tt.getLaunchOptionsSync();
vm.__call_hook('onLaunch', args);
}
return vm;
}
todos.forEach(function (todoApi) {
protocols[todoApi] = false;
});
canIUses.forEach(function (canIUseApi) {
var apiName = protocols[canIUseApi] && protocols[canIUseApi].name ? protocols[canIUseApi].name :
canIUseApi;
if (!tt.canIUse(apiName)) {
protocols[canIUseApi] = false;
}
});
var uni = {};
if (typeof Proxy !== 'undefined' && "mp-toutiao" !== 'app-plus') {
uni = new Proxy({}, {
get: function get(target, name) {
if (hasOwn(target, name)) {
return target[name];
}
if (baseApi[name]) {
return baseApi[name];
}
if (api[name]) {
return promisify(name, api[name]);
}
{
if (extraApi[name]) {
return promisify(name, extraApi[name]);
}
if (todoApis[name]) {
return promisify(name, todoApis[name]);
}
}
if (eventApi[name]) {
return eventApi[name];
}
if (!hasOwn(tt, name) && !hasOwn(protocols, name)) {
return;
}
return promisify(name, wrapper(name, tt[name]));
},
set: function set(target, name, value) {
target[name] = value;
return true;
} });
} else {
Object.keys(baseApi).forEach(function (name) {
uni[name] = baseApi[name];
});
{
Object.keys(todoApis).forEach(function (name) {
uni[name] = promisify(name, todoApis[name]);
});
Object.keys(extraApi).forEach(function (name) {
uni[name] = promisify(name, todoApis[name]);
});
}
Object.keys(eventApi).forEach(function (name) {
uni[name] = eventApi[name];
});
Object.keys(api).forEach(function (name) {
uni[name] = promisify(name, api[name]);
});
Object.keys(tt).forEach(function (name) {
if (hasOwn(tt, name) || hasOwn(protocols, name)) {
uni[name] = promisify(name, wrapper(name, tt[name]));
}
});
}
tt.createApp = createApp;
tt.createPage = createPage;
tt.createComponent = createComponent;
tt.createSubpackageApp = createSubpackageApp;
tt.createPlugin = createPlugin;
var uni$1 = uni;var _default =
uni$1;exports.default = _default;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../webpack/buildin/global.js */ 2)))
/***/ }),
/* 2 */
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
var g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || new Function("return this")();
} catch (e) {
// This works if the window reference is available
if (typeof window === "object") g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/* 3 */
/*!******************************************************************************************!*\
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/mp-vue/dist/mp.runtime.esm.js ***!
\******************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/*!
* Vue.js v2.6.11
* (c) 2014-2022 Evan You
* Released under the MIT License.
*/
/* */
var emptyObject = Object.freeze({});
// These helpers produce better VM code in JS engines due to their
// explicitness and function inlining.
function isUndef (v) {
return v === undefined || v === null
}
function isDef (v) {
return v !== undefined && v !== null
}
function isTrue (v) {
return v === true
}
function isFalse (v) {
return v === false
}
/**
* Check if value is primitive.
*/
function isPrimitive (value) {
return (
typeof value === 'string' ||
typeof value === 'number' ||
// $flow-disable-line
typeof value === 'symbol' ||
typeof value === 'boolean'
)
}
/**
* Quick object check - this is primarily used to tell
* Objects from primitive values when we know the value
* is a JSON-compliant type.
*/
function isObject (obj) {
return obj !== null && typeof obj === 'object'
}
/**
* Get the raw type string of a value, e.g., [object Object].
*/
var _toString = Object.prototype.toString;
function toRawType (value) {
return _toString.call(value).slice(8, -1)
}
/**
* Strict object type check. Only returns true
* for plain JavaScript objects.
*/
function isPlainObject (obj) {
return _toString.call(obj) === '[object Object]'
}
function isRegExp (v) {
return _toString.call(v) === '[object RegExp]'
}
/**
* Check if val is a valid array index.
*/
function isValidArrayIndex (val) {
var n = parseFloat(String(val));
return n >= 0 && Math.floor(n) === n && isFinite(val)
}
function isPromise (val) {
return (
isDef(val) &&
typeof val.then === 'function' &&
typeof val.catch === 'function'
)
}
/**
* Convert a value to a string that is actually rendered.
*/
function toString (val) {
return val == null
? ''
: Array.isArray(val) || (isPlainObject(val) && val.toString === _toString)
? JSON.stringify(val, null, 2)
: String(val)
}
/**
* Convert an input value to a number for persistence.
* If the conversion fails, return original string.
*/
function toNumber (val) {
var n = parseFloat(val);
return isNaN(n) ? val : n
}
/**
* Make a map and return a function for checking if a key
* is in that map.
*/
function makeMap (
str,
expectsLowerCase
) {
var map = Object.create(null);
var list = str.split(',');
for (var i = 0; i < list.length; i++) {
map[list[i]] = true;
}
return expectsLowerCase
? function (val) { return map[val.toLowerCase()]; }
: function (val) { return map[val]; }
}
/**
* Check if a tag is a built-in tag.
*/
var isBuiltInTag = makeMap('slot,component', true);
/**
* Check if an attribute is a reserved attribute.
*/
var isReservedAttribute = makeMap('key,ref,slot,slot-scope,is');
/**
* Remove an item from an array.
*/
function remove (arr, item) {
if (arr.length) {
var index = arr.indexOf(item);
if (index > -1) {
return arr.splice(index, 1)
}
}
}
/**
* Check whether an object has the property.
*/
var hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwn (obj, key) {
return hasOwnProperty.call(obj, key)
}
/**
* Create a cached version of a pure function.
*/
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
})
}
/**
* Camelize a hyphen-delimited string.
*/
var camelizeRE = /-(\w)/g;
var camelize = cached(function (str) {
return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
});
/**
* Capitalize a string.
*/
var capitalize = cached(function (str) {
return str.charAt(0).toUpperCase() + str.slice(1)
});
/**
* Hyphenate a camelCase string.
*/
var hyphenateRE = /\B([A-Z])/g;
var hyphenate = cached(function (str) {
return str.replace(hyphenateRE, '-$1').toLowerCase()
});
/**
* Simple bind polyfill for environments that do not support it,
* e.g., PhantomJS 1.x. Technically, we don't need this anymore
* since native bind is now performant enough in most browsers.
* But removing it would mean breaking code that was able to run in
* PhantomJS 1.x, so this must be kept for backward compatibility.
*/
/* istanbul ignore next */
function polyfillBind (fn, ctx) {
function boundFn (a) {
var l = arguments.length;
return l
? l > 1
? fn.apply(ctx, arguments)
: fn.call(ctx, a)
: fn.call(ctx)
}
boundFn._length = fn.length;
return boundFn
}
function nativeBind (fn, ctx) {
return fn.bind(ctx)
}
var bind = Function.prototype.bind
? nativeBind
: polyfillBind;
/**
* Convert an Array-like object to a real Array.
*/
function toArray (list, start) {
start = start || 0;
var i = list.length - start;
var ret = new Array(i);
while (i--) {
ret[i] = list[i + start];
}
return ret
}
/**
* Mix properties into target object.
*/
function extend (to, _from) {
for (var key in _from) {
to[key] = _from[key];
}
return to
}
/**
* Merge an Array of Objects into a single Object.
*/
function toObject (arr) {
var res = {};
for (var i = 0; i < arr.length; i++) {
if (arr[i]) {
extend(res, arr[i]);
}
}
return res
}
/* eslint-disable no-unused-vars */
/**
* Perform no operation.
* Stubbing args to make Flow happy without leaving useless transpiled code
* with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/).
*/
function noop (a, b, c) {}
/**
* Always return false.
*/
var no = function (a, b, c) { return false; };
/* eslint-enable no-unused-vars */
/**
* Return the same value.
*/
var identity = function (_) { return _; };
/**
* Check if two values are loosely equal - that is,
* if they are plain objects, do they have the same shape?
*/
function looseEqual (a, b) {
if (a === b) { return true }
var isObjectA = isObject(a);
var isObjectB = isObject(b);
if (isObjectA && isObjectB) {
try {
var isArrayA = Array.isArray(a);
var isArrayB = Array.isArray(b);
if (isArrayA && isArrayB) {
return a.length === b.length && a.every(function (e, i) {
return looseEqual(e, b[i])
})
} else if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime()
} else if (!isArrayA && !isArrayB) {
var keysA = Object.keys(a);
var keysB = Object.keys(b);
return keysA.length === keysB.length && keysA.every(function (key) {
return looseEqual(a[key], b[key])
})
} else {
/* istanbul ignore next */
return false
}
} catch (e) {
/* istanbul ignore next */
return false
}
} else if (!isObjectA && !isObjectB) {
return String(a) === String(b)
} else {
return false
}
}
/**
* Return the first index at which a loosely equal value can be
* found in the array (if value is a plain object, the array must
* contain an object of the same shape), or -1 if it is not present.
*/
function looseIndexOf (arr, val) {
for (var i = 0; i < arr.length; i++) {
if (looseEqual(arr[i], val)) { return i }
}
return -1
}
/**
* Ensure a function is called only once.
*/
function once (fn) {
var called = false;
return function () {
if (!called) {
called = true;
fn.apply(this, arguments);
}
}
}
var ASSET_TYPES = [
'component',
'directive',
'filter'
];
var LIFECYCLE_HOOKS = [
'beforeCreate',
'created',
'beforeMount',
'mounted',
'beforeUpdate',
'updated',
'beforeDestroy',
'destroyed',
'activated',
'deactivated',
'errorCaptured',
'serverPrefetch'
];
/* */
var config = ({
/**
* Option merge strategies (used in core/util/options)
*/
// $flow-disable-line
optionMergeStrategies: Object.create(null),
/**
* Whether to suppress warnings.
*/
silent: false,
/**
* Show production mode tip message on boot?
*/
productionTip: "development" !== 'production',
/**
* Whether to enable devtools
*/
devtools: "development" !== 'production',
/**
* Whether to record perf
*/
performance: false,
/**
* Error handler for watcher errors
*/
errorHandler: null,
/**
* Warn handler for watcher warns
*/
warnHandler: null,
/**
* Ignore certain custom elements
*/
ignoredElements: [],
/**
* Custom user key aliases for v-on
*/
// $flow-disable-line
keyCodes: Object.create(null),
/**
* Check if a tag is reserved so that it cannot be registered as a
* component. This is platform-dependent and may be overwritten.
*/
isReservedTag: no,
/**
* Check if an attribute is reserved so that it cannot be used as a component
* prop. This is platform-dependent and may be overwritten.
*/
isReservedAttr: no,
/**
* Check if a tag is an unknown element.
* Platform-dependent.
*/
isUnknownElement: no,
/**
* Get the namespace of an element
*/
getTagNamespace: noop,
/**
* Parse the real tag name for the specific platform.
*/
parsePlatformTagName: identity,
/**
* Check if an attribute must be bound using property, e.g. value
* Platform-dependent.
*/
mustUseProp: no,
/**
* Perform updates asynchronously. Intended to be used by Vue Test Utils
* This will significantly reduce performance if set to false.
*/
async: true,
/**
* Exposed for legacy reasons
*/
_lifecycleHooks: LIFECYCLE_HOOKS
});
/* */
/**
* unicode letters used for parsing html tags, component names and property paths.
* using https://www.w3.org/TR/html53/semantics-scripting.html#potentialcustomelementname
* skipping \u10000-\uEFFFF due to it freezing up PhantomJS
*/
var unicodeRegExp = /a-zA-Z\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD/;
/**
* Check if a string starts with $ or _
*/
function isReserved (str) {
var c = (str + '').charCodeAt(0);
return c === 0x24 || c === 0x5F
}
/**
* Define a property.
*/
function def (obj, key, val, enumerable) {
Object.defineProperty(obj, key, {
value: val,
enumerable: !!enumerable,
writable: true,
configurable: true
});
}
/**
* Parse simple path.
*/
var bailRE = new RegExp(("[^" + (unicodeRegExp.source) + ".$_\\d]"));
function parsePath (path) {
if (bailRE.test(path)) {
return
}
var segments = path.split('.');
return function (obj) {
for (var i = 0; i < segments.length; i++) {
if (!obj) { return }
obj = obj[segments[i]];
}
return obj
}
}
/* */
// can we use __proto__?
var hasProto = '__proto__' in {};
// Browser environment sniffing
var inBrowser = typeof window !== 'undefined';
var inWeex = typeof WXEnvironment !== 'undefined' && !!WXEnvironment.platform;
var weexPlatform = inWeex && WXEnvironment.platform.toLowerCase();
var UA = inBrowser && window.navigator.userAgent.toLowerCase();
var isIE = UA && /msie|trident/.test(UA);
var isIE9 = UA && UA.indexOf('msie 9.0') > 0;
var isEdge = UA && UA.indexOf('edge/') > 0;
var isAndroid = (UA && UA.indexOf('android') > 0) || (weexPlatform === 'android');
var isIOS = (UA && /iphone|ipad|ipod|ios/.test(UA)) || (weexPlatform === 'ios');
var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
var isPhantomJS = UA && /phantomjs/.test(UA);
var isFF = UA && UA.match(/firefox\/(\d+)/);
// Firefox has a "watch" function on Object.prototype...
var nativeWatch = ({}).watch;
if (inBrowser) {
try {
var opts = {};
Object.defineProperty(opts, 'passive', ({
get: function get () {
}
})); // https://github.com/facebook/flow/issues/285
window.addEventListener('test-passive', null, opts);
} catch (e) {}
}
// this needs to be lazy-evaled because vue may be required before
// vue-server-renderer can set VUE_ENV
var _isServer;
var isServerRendering = function () {
if (_isServer === undefined) {
/* istanbul ignore if */
if (!inBrowser && !inWeex && typeof global !== 'undefined') {
// detect presence of vue-server-renderer and avoid
// Webpack shimming the process
_isServer = global['process'] && global['process'].env.VUE_ENV === 'server';
} else {
_isServer = false;
}
}
return _isServer
};
// detect devtools
var devtools = inBrowser && window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
/* istanbul ignore next */
function isNative (Ctor) {
return typeof Ctor === 'function' && /native code/.test(Ctor.toString())
}
var hasSymbol =
typeof Symbol !== 'undefined' && isNative(Symbol) &&
typeof Reflect !== 'undefined' && isNative(Reflect.ownKeys);
var _Set;
/* istanbul ignore if */ // $flow-disable-line
if (typeof Set !== 'undefined' && isNative(Set)) {
// use native Set when available.
_Set = Set;
} else {
// a non-standard Set polyfill that only works with primitive keys.
_Set = /*@__PURE__*/(function () {
function Set () {
this.set = Object.create(null);
}
Set.prototype.has = function has (key) {
return this.set[key] === true
};
Set.prototype.add = function add (key) {
this.set[key] = true;
};
Set.prototype.clear = function clear () {
this.set = Object.create(null);
};
return Set;
}());
}
/* */
var warn = noop;
var tip = noop;
var generateComponentTrace = (noop); // work around flow check
var formatComponentName = (noop);
if (true) {
var hasConsole = typeof console !== 'undefined';
var classifyRE = /(?:^|[-_])(\w)/g;
var classify = function (str) { return str
.replace(classifyRE, function (c) { return c.toUpperCase(); })
.replace(/[-_]/g, ''); };
warn = function (msg, vm) {
var trace = vm ? generateComponentTrace(vm) : '';
if (config.warnHandler) {
config.warnHandler.call(null, msg, vm, trace);
} else if (hasConsole && (!config.silent)) {
console.error(("[Vue warn]: " + msg + trace));
}
};
tip = function (msg, vm) {
if (hasConsole && (!config.silent)) {
console.warn("[Vue tip]: " + msg + (
vm ? generateComponentTrace(vm) : ''
));
}
};
formatComponentName = function (vm, includeFile) {
if (vm.$root === vm) {
if (vm.$options && vm.$options.__file) { // fixed by xxxxxx
return ('') + vm.$options.__file
}
return '<Root>'
}
var options = typeof vm === 'function' && vm.cid != null
? vm.options
: vm._isVue
? vm.$options || vm.constructor.options
: vm;
var name = options.name || options._componentTag;
var file = options.__file;
if (!name && file) {
var match = file.match(/([^/\\]+)\.vue$/);
name = match && match[1];
}
return (
(name ? ("<" + (classify(name)) + ">") : "<Anonymous>") +
(file && includeFile !== false ? (" at " + file) : '')
)
};
var repeat = function (str, n) {
var res = '';
while (n) {
if (n % 2 === 1) { res += str; }
if (n > 1) { str += str; }
n >>= 1;
}
return res
};
generateComponentTrace = function (vm) {
if (vm._isVue && vm.$parent) {
var tree = [];
var currentRecursiveSequence = 0;
while (vm && vm.$options.name !== 'PageBody') {
if (tree.length > 0) {
var last = tree[tree.length - 1];
if (last.constructor === vm.constructor) {
currentRecursiveSequence++;
vm = vm.$parent;
continue
} else if (currentRecursiveSequence > 0) {
tree[tree.length - 1] = [last, currentRecursiveSequence];
currentRecursiveSequence = 0;
}
}
!vm.$options.isReserved && tree.push(vm);
vm = vm.$parent;
}
return '\n\nfound in\n\n' + tree
.map(function (vm, i) { return ("" + (i === 0 ? '---> ' : repeat(' ', 5 + i * 2)) + (Array.isArray(vm)
? ((formatComponentName(vm[0])) + "... (" + (vm[1]) + " recursive calls)")
: formatComponentName(vm))); })
.join('\n')
} else {
return ("\n\n(found in " + (formatComponentName(vm)) + ")")
}
};
}
/* */
var uid = 0;
/**
* A dep is an observable that can have multiple
* directives subscribing to it.
*/
var Dep = function Dep () {
this.id = uid++;
this.subs = [];
};
Dep.prototype.addSub = function addSub (sub) {
this.subs.push(sub);
};
Dep.prototype.removeSub = function removeSub (sub) {
remove(this.subs, sub);
};
Dep.prototype.depend = function depend () {
if (Dep.SharedObject.target) {
Dep.SharedObject.target.addDep(this);
}
};
Dep.prototype.notify = function notify () {
// stabilize the subscriber list first
var subs = this.subs.slice();
if ( true && !config.async) {
// subs aren't sorted in scheduler if not running async
// we need to sort them now to make sure they fire in correct
// order
subs.sort(function (a, b) { return a.id - b.id; });
}
for (var i = 0, l = subs.length; i < l; i++) {
subs[i].update();
}
};
// The current target watcher being evaluated.
// This is globally unique because only one watcher
// can be evaluated at a time.
// fixed by xxxxxx (nvue shared vuex)
/* eslint-disable no-undef */
Dep.SharedObject = {};
Dep.SharedObject.target = null;
Dep.SharedObject.targetStack = [];
function pushTarget (target) {
Dep.SharedObject.targetStack.push(target);
Dep.SharedObject.target = target;
Dep.target = target;
}
function popTarget () {
Dep.SharedObject.targetStack.pop();
Dep.SharedObject.target = Dep.SharedObject.targetStack[Dep.SharedObject.targetStack.length - 1];
Dep.target = Dep.SharedObject.target;
}
/* */
var VNode = function VNode (
tag,
data,
children,
text,
elm,
context,
componentOptions,
asyncFactory
) {
this.tag = tag;
this.data = data;
this.children = children;
this.text = text;
this.elm = elm;
this.ns = undefined;
this.context = context;
this.fnContext = undefined;
this.fnOptions = undefined;
this.fnScopeId = undefined;
this.key = data && data.key;
this.componentOptions = componentOptions;
this.componentInstance = undefined;
this.parent = undefined;
this.raw = false;
this.isStatic = false;
this.isRootInsert = true;
this.isComment = false;
this.isCloned = false;
this.isOnce = false;
this.asyncFactory = asyncFactory;
this.asyncMeta = undefined;
this.isAsyncPlaceholder = false;
};
var prototypeAccessors = { child: { configurable: true } };
// DEPRECATED: alias for componentInstance for backwards compat.
/* istanbul ignore next */
prototypeAccessors.child.get = function () {
return this.componentInstance
};
Object.defineProperties( VNode.prototype, prototypeAccessors );
var createEmptyVNode = function (text) {
if ( text === void 0 ) text = '';
var node = new VNode();
node.text = text;
node.isComment = true;
return node
};
function createTextVNode (val) {
return new VNode(undefined, undefined, undefined, String(val))
}
// optimized shallow clone
// used for static nodes and slot nodes because they may be reused across
// multiple renders, cloning them avoids errors when DOM manipulations rely
// on their elm reference.
function cloneVNode (vnode) {
var cloned = new VNode(
vnode.tag,
vnode.data,
// #7975
// clone children array to avoid mutating original in case of cloning
// a child.
vnode.children && vnode.children.slice(),
vnode.text,
vnode.elm,
vnode.context,
vnode.componentOptions,
vnode.asyncFactory
);
cloned.ns = vnode.ns;
cloned.isStatic = vnode.isStatic;
cloned.key = vnode.key;
cloned.isComment = vnode.isComment;
cloned.fnContext = vnode.fnContext;
cloned.fnOptions = vnode.fnOptions;
cloned.fnScopeId = vnode.fnScopeId;
cloned.asyncMeta = vnode.asyncMeta;
cloned.isCloned = true;
return cloned
}
/*
* not type checking this file because flow doesn't play well with
* dynamically accessing methods on Array prototype
*/
var arrayProto = Array.prototype;
var arrayMethods = Object.create(arrayProto);
var methodsToPatch = [
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
];
/**
* Intercept mutating methods and emit events
*/
methodsToPatch.forEach(function (method) {
// cache original method
var original = arrayProto[method];
def(arrayMethods, method, function mutator () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var result = original.apply(this, args);
var ob = this.__ob__;
var inserted;
switch (method) {
case 'push':
case 'unshift':
inserted = args;
break
case 'splice':
inserted = args.slice(2);
break
}
if (inserted) { ob.observeArray(inserted); }
// notify change
ob.dep.notify();
return result
});
});
/* */
var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
/**
* In some cases we may want to disable observation inside a component's
* update computation.
*/
var shouldObserve = true;
function toggleObserving (value) {
shouldObserve = value;
}
/**
* Observer class that is attached to each observed
* object. Once attached, the observer converts the target
* object's property keys into getter/setters that
* collect dependencies and dispatch updates.
*/
var Observer = function Observer (value) {
this.value = value;
this.dep = new Dep();
this.vmCount = 0;
def(value, '__ob__', this);
if (Array.isArray(value)) {
if (hasProto) {
{// fixed by xxxxxx 微信小程序使用 plugins 之后,数组方法被直接挂载到了数组对象上,需要执行 copyAugment 逻辑
if(value.push !== value.__proto__.push){
copyAugment(value, arrayMethods, arrayKeys);
} else {
protoAugment(value, arrayMethods);
}
}
} else {
copyAugment(value, arrayMethods, arrayKeys);
}
this.observeArray(value);
} else {
this.walk(value);
}
};
/**
* Walk through all properties and convert them into
* getter/setters. This method should only be called when
* value type is Object.
*/
Observer.prototype.walk = function walk (obj) {
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
defineReactive$$1(obj, keys[i]);
}
};
/**
* Observe a list of Array items.
*/
Observer.prototype.observeArray = function observeArray (items) {
for (var i = 0, l = items.length; i < l; i++) {
observe(items[i]);
}
};
// helpers
/**
* Augment a target Object or Array by intercepting
* the prototype chain using __proto__
*/
function protoAugment (target, src) {
/* eslint-disable no-proto */
target.__proto__ = src;
/* eslint-enable no-proto */
}
/**
* Augment a target Object or Array by defining
* hidden properties.
*/
/* istanbul ignore next */
function copyAugment (target, src, keys) {
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i];
def(target, key, src[key]);
}
}
/**
* Attempt to create an observer instance for a value,
* returns the new observer if successfully observed,
* or the existing observer if the value already has one.
*/
function observe (value, asRootData) {
if (!isObject(value) || value instanceof VNode) {
return
}
var ob;
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
ob = value.__ob__;
} else if (
shouldObserve &&
!isServerRendering() &&
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue
) {
ob = new Observer(value);
}
if (asRootData && ob) {
ob.vmCount++;
}
return ob
}
/**
* Define a reactive property on an Object.
*/
function defineReactive$$1 (
obj,
key,
val,
customSetter,
shallow
) {
var dep = new Dep();
var property = Object.getOwnPropertyDescriptor(obj, key);
if (property && property.configurable === false) {
return
}
// cater for pre-defined getter/setters
var getter = property && property.get;
var setter = property && property.set;
if ((!getter || setter) && arguments.length === 2) {
val = obj[key];
}
var childOb = !shallow && observe(val);
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
if (Dep.SharedObject.target) { // fixed by xxxxxx
dep.depend();
if (childOb) {
childOb.dep.depend();
if (Array.isArray(value)) {
dependArray(value);
}
}
}
return value
},
set: function reactiveSetter (newVal) {
var value = getter ? getter.call(obj) : val;
/* eslint-disable no-self-compare */
if (newVal === value || (newVal !== newVal && value !== value)) {
return
}
/* eslint-enable no-self-compare */
if ( true && customSetter) {
customSetter();
}
// #7981: for accessor properties without setter
if (getter && !setter) { return }
if (setter) {
setter.call(obj, newVal);
} else {
val = newVal;
}
childOb = !shallow && observe(newVal);
dep.notify();
}
});
}
/**
* Set a property on an object. Adds the new property and
* triggers change notification if the property doesn't
* already exist.
*/
function set (target, key, val) {
if ( true &&
(isUndef(target) || isPrimitive(target))
) {
warn(("Cannot set reactive property on undefined, null, or primitive value: " + ((target))));
}
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.length = Math.max(target.length, key);
target.splice(key, 1, val);
return val
}
if (key in target && !(key in Object.prototype)) {
target[key] = val;
return val
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
true && warn(
'Avoid adding reactive properties to a Vue instance or its root $data ' +
'at runtime - declare it upfront in the data option.'
);
return val
}
if (!ob) {
target[key] = val;
return val
}
defineReactive$$1(ob.value, key, val);
ob.dep.notify();
return val
}
/**
* Delete a property and trigger change if necessary.
*/
function del (target, key) {
if ( true &&
(isUndef(target) || isPrimitive(target))
) {
warn(("Cannot delete reactive property on undefined, null, or primitive value: " + ((target))));
}
if (Array.isArray(target) && isValidArrayIndex(key)) {
target.splice(key, 1);
return
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
true && warn(
'Avoid deleting properties on a Vue instance or its root $data ' +
'- just set it to null.'
);
return
}
if (!hasOwn(target, key)) {
return
}
delete target[key];
if (!ob) {
return
}
ob.dep.notify();
}
/**
* Collect dependencies on array elements when the array is touched, since
* we cannot intercept array element access like property getters.
*/
function dependArray (value) {
for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
e = value[i];
e && e.__ob__ && e.__ob__.dep.depend();
if (Array.isArray(e)) {
dependArray(e);
}
}
}
/* */
/**
* Option overwriting strategies are functions that handle
* how to merge a parent option value and a child option
* value into the final value.
*/
var strats = config.optionMergeStrategies;
/**
* Options with restrictions
*/
if (true) {
strats.el = strats.propsData = function (parent, child, vm, key) {
if (!vm) {
warn(
"option \"" + key + "\" can only be used during instance " +
'creation with the `new` keyword.'
);
}
return defaultStrat(parent, child)
};
}
/**
* Helper that recursively merges two data objects together.
*/
function mergeData (to, from) {
if (!from) { return to }
var key, toVal, fromVal;
var keys = hasSymbol
? Reflect.ownKeys(from)
: Object.keys(from);
for (var i = 0; i < keys.length; i++) {
key = keys[i];
// in case the object is already observed...
if (key === '__ob__') { continue }
toVal = to[key];
fromVal = from[key];
if (!hasOwn(to, key)) {
set(to, key, fromVal);
} else if (
toVal !== fromVal &&
isPlainObject(toVal) &&
isPlainObject(fromVal)
) {
mergeData(toVal, fromVal);
}
}
return to
}
/**
* Data
*/
function mergeDataOrFn (
parentVal,
childVal,
vm
) {
if (!vm) {
// in a Vue.extend merge, both should be functions
if (!childVal) {
return parentVal
}
if (!parentVal) {
return childVal
}
// when parentVal & childVal are both present,
// we need to return a function that returns the
// merged result of both functions... no need to
// check if parentVal is a function here because
// it has to be a function to pass previous merges.
return function mergedDataFn () {
return mergeData(
typeof childVal === 'function' ? childVal.call(this, this) : childVal,
typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal
)
}
} else {
return function mergedInstanceDataFn () {
// instance merge
var instanceData = typeof childVal === 'function'
? childVal.call(vm, vm)
: childVal;
var defaultData = typeof parentVal === 'function'
? parentVal.call(vm, vm)
: parentVal;
if (instanceData) {
return mergeData(instanceData, defaultData)
} else {
return defaultData
}
}
}
}
strats.data = function (
parentVal,
childVal,
vm
) {
if (!vm) {
if (childVal && typeof childVal !== 'function') {
true && warn(
'The "data" option should be a function ' +
'that returns a per-instance value in component ' +
'definitions.',
vm
);
return parentVal
}
return mergeDataOrFn(parentVal, childVal)
}
return mergeDataOrFn(parentVal, childVal, vm)
};
/**
* Hooks and props are merged as arrays.
*/
function mergeHook (
parentVal,
childVal
) {
var res = childVal
? parentVal
? parentVal.concat(childVal)
: Array.isArray(childVal)
? childVal
: [childVal]
: parentVal;
return res
? dedupeHooks(res)
: res
}
function dedupeHooks (hooks) {
var res = [];
for (var i = 0; i < hooks.length; i++) {
if (res.indexOf(hooks[i]) === -1) {
res.push(hooks[i]);
}
}
return res
}
LIFECYCLE_HOOKS.forEach(function (hook) {
strats[hook] = mergeHook;
});
/**
* Assets
*
* When a vm is present (instance creation), we need to do
* a three-way merge between constructor options, instance
* options and parent options.
*/
function mergeAssets (
parentVal,
childVal,
vm,
key
) {
var res = Object.create(parentVal || null);
if (childVal) {
true && assertObjectType(key, childVal, vm);
return extend(res, childVal)
} else {
return res
}
}
ASSET_TYPES.forEach(function (type) {
strats[type + 's'] = mergeAssets;
});
/**
* Watchers.
*
* Watchers hashes should not overwrite one
* another, so we merge them as arrays.
*/
strats.watch = function (
parentVal,
childVal,
vm,
key
) {
// work around Firefox's Object.prototype.watch...
if (parentVal === nativeWatch) { parentVal = undefined; }
if (childVal === nativeWatch) { childVal = undefined; }
/* istanbul ignore if */
if (!childVal) { return Object.create(parentVal || null) }
if (true) {
assertObjectType(key, childVal, vm);
}
if (!parentVal) { return childVal }
var ret = {};
extend(ret, parentVal);
for (var key$1 in childVal) {
var parent = ret[key$1];
var child = childVal[key$1];
if (parent && !Array.isArray(parent)) {
parent = [parent];
}
ret[key$1] = parent
? parent.concat(child)
: Array.isArray(child) ? child : [child];
}
return ret
};
/**
* Other object hashes.
*/
strats.props =
strats.methods =
strats.inject =
strats.computed = function (
parentVal,
childVal,
vm,
key
) {
if (childVal && "development" !== 'production') {
assertObjectType(key, childVal, vm);
}
if (!parentVal) { return childVal }
var ret = Object.create(null);
extend(ret, parentVal);
if (childVal) { extend(ret, childVal); }
return ret
};
strats.provide = mergeDataOrFn;
/**
* Default strategy.
*/
var defaultStrat = function (parentVal, childVal) {
return childVal === undefined
? parentVal
: childVal
};
/**
* Validate component names
*/
function checkComponents (options) {
for (var key in options.components) {
validateComponentName(key);
}
}
function validateComponentName (name) {
if (!new RegExp(("^[a-zA-Z][\\-\\.0-9_" + (unicodeRegExp.source) + "]*$")).test(name)) {
warn(
'Invalid component name: "' + name + '". Component names ' +
'should conform to valid custom element name in html5 specification.'
);
}
if (isBuiltInTag(name) || config.isReservedTag(name)) {
warn(
'Do not use built-in or reserved HTML elements as component ' +
'id: ' + name
);
}
}
/**
* Ensure all props option syntax are normalized into the
* Object-based format.
*/
function normalizeProps (options, vm) {
var props = options.props;
if (!props) { return }
var res = {};
var i, val, name;
if (Array.isArray(props)) {
i = props.length;
while (i--) {
val = props[i];
if (typeof val === 'string') {
name = camelize(val);
res[name] = { type: null };
} else if (true) {
warn('props must be strings when using array syntax.');
}
}
} else if (isPlainObject(props)) {
for (var key in props) {
val = props[key];
name = camelize(key);
res[name] = isPlainObject(val)
? val
: { type: val };
}
} else if (true) {
warn(
"Invalid value for option \"props\": expected an Array or an Object, " +
"but got " + (toRawType(props)) + ".",
vm
);
}
options.props = res;
}
/**
* Normalize all injections into Object-based format
*/
function normalizeInject (options, vm) {
var inject = options.inject;
if (!inject) { return }
var normalized = options.inject = {};
if (Array.isArray(inject)) {
for (var i = 0; i < inject.length; i++) {
normalized[inject[i]] = { from: inject[i] };
}
} else if (isPlainObject(inject)) {
for (var key in inject) {
var val = inject[key];
normalized[key] = isPlainObject(val)
? extend({ from: key }, val)
: { from: val };
}
} else if (true) {
warn(
"Invalid value for option \"inject\": expected an Array or an Object, " +
"but got " + (toRawType(inject)) + ".",
vm
);
}
}
/**
* Normalize raw function directives into object format.
*/
function normalizeDirectives (options) {
var dirs = options.directives;
if (dirs) {
for (var key in dirs) {
var def$$1 = dirs[key];
if (typeof def$$1 === 'function') {
dirs[key] = { bind: def$$1, update: def$$1 };
}
}
}
}
function assertObjectType (name, value, vm) {
if (!isPlainObject(value)) {
warn(
"Invalid value for option \"" + name + "\": expected an Object, " +
"but got " + (toRawType(value)) + ".",
vm
);
}
}
/**
* Merge two option objects into a new one.
* Core utility used in both instantiation and inheritance.
*/
function mergeOptions (
parent,
child,
vm
) {
if (true) {
checkComponents(child);
}
if (typeof child === 'function') {
child = child.options;
}
normalizeProps(child, vm);
normalizeInject(child, vm);
normalizeDirectives(child);
// Apply extends and mixins on the child options,
// but only if it is a raw options object that isn't
// the result of another mergeOptions call.
// Only merged options has the _base property.
if (!child._base) {
if (child.extends) {
parent = mergeOptions(parent, child.extends, vm);
}
if (child.mixins) {
for (var i = 0, l = child.mixins.length; i < l; i++) {
parent = mergeOptions(parent, child.mixins[i], vm);
}
}
}
var options = {};
var key;
for (key in parent) {
mergeField(key);
}
for (key in child) {
if (!hasOwn(parent, key)) {
mergeField(key);
}
}
function mergeField (key) {
var strat = strats[key] || defaultStrat;
options[key] = strat(parent[key], child[key], vm, key);
}
return options
}
/**
* Resolve an asset.
* This function is used because child instances need access
* to assets defined in its ancestor chain.
*/
function resolveAsset (
options,
type,
id,
warnMissing
) {
/* istanbul ignore if */
if (typeof id !== 'string') {
return
}
var assets = options[type];
// check local registration variations first
if (hasOwn(assets, id)) { return assets[id] }
var camelizedId = camelize(id);
if (hasOwn(assets, camelizedId)) { return assets[camelizedId] }
var PascalCaseId = capitalize(camelizedId);
if (hasOwn(assets, PascalCaseId)) { return assets[PascalCaseId] }
// fallback to prototype chain
var res = assets[id] || assets[camelizedId] || assets[PascalCaseId];
if ( true && warnMissing && !res) {
warn(
'Failed to resolve ' + type.slice(0, -1) + ': ' + id,
options
);
}
return res
}
/* */
function validateProp (
key,
propOptions,
propsData,
vm
) {
var prop = propOptions[key];
var absent = !hasOwn(propsData, key);
var value = propsData[key];
// boolean casting
var booleanIndex = getTypeIndex(Boolean, prop.type);
if (booleanIndex > -1) {
if (absent && !hasOwn(prop, 'default')) {
value = false;
} else if (value === '' || value === hyphenate(key)) {
// only cast empty string / same name to boolean if
// boolean has higher priority
var stringIndex = getTypeIndex(String, prop.type);
if (stringIndex < 0 || booleanIndex < stringIndex) {
value = true;
}
}
}
// check default value
if (value === undefined) {
value = getPropDefaultValue(vm, prop, key);
// since the default value is a fresh copy,
// make sure to observe it.
var prevShouldObserve = shouldObserve;
toggleObserving(true);
observe(value);
toggleObserving(prevShouldObserve);
}
if (
true
) {
assertProp(prop, key, value, vm, absent);
}
return value
}
/**
* Get the default value of a prop.
*/
function getPropDefaultValue (vm, prop, key) {
// no default, return undefined
if (!hasOwn(prop, 'default')) {
return undefined
}
var def = prop.default;
// warn against non-factory defaults for Object & Array
if ( true && isObject(def)) {
warn(
'Invalid default value for prop "' + key + '": ' +
'Props with type Object/Array must use a factory function ' +
'to return the default value.',
vm
);
}
// the raw prop value was also undefined from previous render,
// return previous default value to avoid unnecessary watcher trigger
if (vm && vm.$options.propsData &&
vm.$options.propsData[key] === undefined &&
vm._props[key] !== undefined
) {
return vm._props[key]
}
// call factory function for non-Function types
// a value is Function if its prototype is function even across different execution context
return typeof def === 'function' && getType(prop.type) !== 'Function'
? def.call(vm)
: def
}
/**
* Assert whether a prop is valid.
*/
function assertProp (
prop,
name,
value,
vm,
absent
) {
if (prop.required && absent) {
warn(
'Missing required prop: "' + name + '"',
vm
);
return
}
if (value == null && !prop.required) {
return
}
var type = prop.type;
var valid = !type || type === true;
var expectedTypes = [];
if (type) {
if (!Array.isArray(type)) {
type = [type];
}
for (var i = 0; i < type.length && !valid; i++) {
var assertedType = assertType(value, type[i]);
expectedTypes.push(assertedType.expectedType || '');
valid = assertedType.valid;
}
}
if (!valid) {
warn(
getInvalidTypeMessage(name, value, expectedTypes),
vm
);
return
}
var validator = prop.validator;
if (validator) {
if (!validator(value)) {
warn(
'Invalid prop: custom validator check failed for prop "' + name + '".',
vm
);
}
}
}
var simpleCheckRE = /^(String|Number|Boolean|Function|Symbol)$/;
function assertType (value, type) {
var valid;
var expectedType = getType(type);
if (simpleCheckRE.test(expectedType)) {
var t = typeof value;
valid = t === expectedType.toLowerCase();
// for primitive wrapper objects
if (!valid && t === 'object') {
valid = value instanceof type;
}
} else if (expectedType === 'Object') {
valid = isPlainObject(value);
} else if (expectedType === 'Array') {
valid = Array.isArray(value);
} else {
valid = value instanceof type;
}
return {
valid: valid,
expectedType: expectedType
}
}
/**
* Use function string name to check built-in types,
* because a simple equality check will fail when running
* across different vms / iframes.
*/
function getType (fn) {
var match = fn && fn.toString().match(/^\s*function (\w+)/);
return match ? match[1] : ''
}
function isSameType (a, b) {
return getType(a) === getType(b)
}
function getTypeIndex (type, expectedTypes) {
if (!Array.isArray(expectedTypes)) {
return isSameType(expectedTypes, type) ? 0 : -1
}
for (var i = 0, len = expectedTypes.length; i < len; i++) {
if (isSameType(expectedTypes[i], type)) {
return i
}
}
return -1
}
function getInvalidTypeMessage (name, value, expectedTypes) {
var message = "Invalid prop: type check failed for prop \"" + name + "\"." +
" Expected " + (expectedTypes.map(capitalize).join(', '));
var expectedType = expectedTypes[0];
var receivedType = toRawType(value);
var expectedValue = styleValue(value, expectedType);
var receivedValue = styleValue(value, receivedType);
// check if we need to specify expected value
if (expectedTypes.length === 1 &&
isExplicable(expectedType) &&
!isBoolean(expectedType, receivedType)) {
message += " with value " + expectedValue;
}
message += ", got " + receivedType + " ";
// check if we need to specify received value
if (isExplicable(receivedType)) {
message += "with value " + receivedValue + ".";
}
return message
}
function styleValue (value, type) {
if (type === 'String') {
return ("\"" + value + "\"")
} else if (type === 'Number') {
return ("" + (Number(value)))
} else {
return ("" + value)
}
}
function isExplicable (value) {
var explicitTypes = ['string', 'number', 'boolean'];
return explicitTypes.some(function (elem) { return value.toLowerCase() === elem; })
}
function isBoolean () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return args.some(function (elem) { return elem.toLowerCase() === 'boolean'; })
}
/* */
function handleError (err, vm, info) {
// Deactivate deps tracking while processing error handler to avoid possible infinite rendering.
// See: https://github.com/vuejs/vuex/issues/1505
pushTarget();
try {
if (vm) {
var cur = vm;
while ((cur = cur.$parent)) {
var hooks = cur.$options.errorCaptured;
if (hooks) {
for (var i = 0; i < hooks.length; i++) {
try {
var capture = hooks[i].call(cur, err, vm, info) === false;
if (capture) { return }
} catch (e) {
globalHandleError(e, cur, 'errorCaptured hook');
}
}
}
}
}
globalHandleError(err, vm, info);
} finally {
popTarget();
}
}
function invokeWithErrorHandling (
handler,
context,
args,
vm,
info
) {
var res;
try {
res = args ? handler.apply(context, args) : handler.call(context);
if (res && !res._isVue && isPromise(res) && !res._handled) {
res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); });
// issue #9511
// avoid catch triggering multiple times when nested calls
res._handled = true;
}
} catch (e) {
handleError(e, vm, info);
}
return res
}
function globalHandleError (err, vm, info) {
if (config.errorHandler) {
try {
return config.errorHandler.call(null, err, vm, info)
} catch (e) {
// if the user intentionally throws the original error in the handler,
// do not log it twice
if (e !== err) {
logError(e, null, 'config.errorHandler');
}
}
}
logError(err, vm, info);
}
function logError (err, vm, info) {
if (true) {
warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
}
/* istanbul ignore else */
if ((inBrowser || inWeex) && typeof console !== 'undefined') {
console.error(err);
} else {
throw err
}
}
/* */
var callbacks = [];
var pending = false;
function flushCallbacks () {
pending = false;
var copies = callbacks.slice(0);
callbacks.length = 0;
for (var i = 0; i < copies.length; i++) {
copies[i]();
}
}
// Here we have async deferring wrappers using microtasks.
// In 2.5 we used (macro) tasks (in combination with microtasks).
// However, it has subtle problems when state is changed right before repaint
// (e.g. #6813, out-in transitions).
// Also, using (macro) tasks in event handler would cause some weird behaviors
// that cannot be circumvented (e.g. #7109, #7153, #7546, #7834, #8109).
// So we now use microtasks everywhere, again.
// A major drawback of this tradeoff is that there are some scenarios
// where microtasks have too high a priority and fire in between supposedly
// sequential events (e.g. #4521, #6690, which have workarounds)
// or even between bubbling of the same event (#6566).
var timerFunc;
// The nextTick behavior leverages the microtask queue, which can be accessed
// via either native Promise.then or MutationObserver.
// MutationObserver has wider support, however it is seriously bugged in
// UIWebView in iOS >= 9.3.3 when triggered in touch event handlers. It
// completely stops working after triggering a few times... so, if native
// Promise is available, we will use it:
/* istanbul ignore next, $flow-disable-line */
if (typeof Promise !== 'undefined' && isNative(Promise)) {
var p = Promise.resolve();
timerFunc = function () {
p.then(flushCallbacks);
// In problematic UIWebViews, Promise.then doesn't completely break, but
// it can get stuck in a weird state where callbacks are pushed into the
// microtask queue but the queue isn't being flushed, until the browser
// needs to do some other work, e.g. handle a timer. Therefore we can
// "force" the microtask queue to be flushed by adding an empty timer.
if (isIOS) { setTimeout(noop); }
};
} else if (!isIE && typeof MutationObserver !== 'undefined' && (
isNative(MutationObserver) ||
// PhantomJS and iOS 7.x
MutationObserver.toString() === '[object MutationObserverConstructor]'
)) {
// Use MutationObserver where native Promise is not available,
// e.g. PhantomJS, iOS7, Android 4.4
// (#6466 MutationObserver is unreliable in IE11)
var counter = 1;
var observer = new MutationObserver(flushCallbacks);
var textNode = document.createTextNode(String(counter));
observer.observe(textNode, {
characterData: true
});
timerFunc = function () {
counter = (counter + 1) % 2;
textNode.data = String(counter);
};
} else if (typeof setImmediate !== 'undefined' && isNative(setImmediate)) {
// Fallback to setImmediate.
// Technically it leverages the (macro) task queue,
// but it is still a better choice than setTimeout.
timerFunc = function () {
setImmediate(flushCallbacks);
};
} else {
// Fallback to setTimeout.
timerFunc = function () {
setTimeout(flushCallbacks, 0);
};
}
function nextTick (cb, ctx) {
var _resolve;
callbacks.push(function () {
if (cb) {
try {
cb.call(ctx);
} catch (e) {
handleError(e, ctx, 'nextTick');
}
} else if (_resolve) {
_resolve(ctx);
}
});
if (!pending) {
pending = true;
timerFunc();
}
// $flow-disable-line
if (!cb && typeof Promise !== 'undefined') {
return new Promise(function (resolve) {
_resolve = resolve;
})
}
}
/* */
/* not type checking this file because flow doesn't play well with Proxy */
var initProxy;
if (true) {
var allowedGlobals = makeMap(
'Infinity,undefined,NaN,isFinite,isNaN,' +
'parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,' +
'Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,' +
'require' // for Webpack/Browserify
);
var warnNonPresent = function (target, key) {
warn(
"Property or method \"" + key + "\" is not defined on the instance but " +
'referenced during render. Make sure that this property is reactive, ' +
'either in the data option, or for class-based components, by ' +
'initializing the property. ' +
'See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.',
target
);
};
var warnReservedPrefix = function (target, key) {
warn(
"Property \"" + key + "\" must be accessed with \"$data." + key + "\" because " +
'properties starting with "$" or "_" are not proxied in the Vue instance to ' +
'prevent conflicts with Vue internals. ' +
'See: https://vuejs.org/v2/api/#data',
target
);
};
var hasProxy =
typeof Proxy !== 'undefined' && isNative(Proxy);
if (hasProxy) {
var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta,exact');
config.keyCodes = new Proxy(config.keyCodes, {
set: function set (target, key, value) {
if (isBuiltInModifier(key)) {
warn(("Avoid overwriting built-in modifier in config.keyCodes: ." + key));
return false
} else {
target[key] = value;
return true
}
}
});
}
var hasHandler = {
has: function has (target, key) {
var has = key in target;
var isAllowed = allowedGlobals(key) ||
(typeof key === 'string' && key.charAt(0) === '_' && !(key in target.$data));
if (!has && !isAllowed) {
if (key in target.$data) { warnReservedPrefix(target, key); }
else { warnNonPresent(target, key); }
}
return has || !isAllowed
}
};
var getHandler = {
get: function get (target, key) {
if (typeof key === 'string' && !(key in target)) {
if (key in target.$data) { warnReservedPrefix(target, key); }
else { warnNonPresent(target, key); }
}
return target[key]
}
};
initProxy = function initProxy (vm) {
if (hasProxy) {
// determine which proxy handler to use
var options = vm.$options;
var handlers = options.render && options.render._withStripped
? getHandler
: hasHandler;
vm._renderProxy = new Proxy(vm, handlers);
} else {
vm._renderProxy = vm;
}
};
}
/* */
var seenObjects = new _Set();
/**
* Recursively traverse an object to evoke all converted
* getters, so that every nested property inside the object
* is collected as a "deep" dependency.
*/
function traverse (val) {
_traverse(val, seenObjects);
seenObjects.clear();
}
function _traverse (val, seen) {
var i, keys;
var isA = Array.isArray(val);
if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
return
}
if (val.__ob__) {
var depId = val.__ob__.dep.id;
if (seen.has(depId)) {
return
}
seen.add(depId);
}
if (isA) {
i = val.length;
while (i--) { _traverse(val[i], seen); }
} else {
keys = Object.keys(val);
i = keys.length;
while (i--) { _traverse(val[keys[i]], seen); }
}
}
var mark;
var measure;
if (true) {
var perf = inBrowser && window.performance;
/* istanbul ignore if */
if (
perf &&
perf.mark &&
perf.measure &&
perf.clearMarks &&
perf.clearMeasures
) {
mark = function (tag) { return perf.mark(tag); };
measure = function (name, startTag, endTag) {
perf.measure(name, startTag, endTag);
perf.clearMarks(startTag);
perf.clearMarks(endTag);
// perf.clearMeasures(name)
};
}
}
/* */
var normalizeEvent = cached(function (name) {
var passive = name.charAt(0) === '&';
name = passive ? name.slice(1) : name;
var once$$1 = name.charAt(0) === '~'; // Prefixed last, checked first
name = once$$1 ? name.slice(1) : name;
var capture = name.charAt(0) === '!';
name = capture ? name.slice(1) : name;
return {
name: name,
once: once$$1,
capture: capture,
passive: passive
}
});
function createFnInvoker (fns, vm) {
function invoker () {
var arguments$1 = arguments;
var fns = invoker.fns;
if (Array.isArray(fns)) {
var cloned = fns.slice();
for (var i = 0; i < cloned.length; i++) {
invokeWithErrorHandling(cloned[i], null, arguments$1, vm, "v-on handler");
}
} else {
// return handler return value for single handlers
return invokeWithErrorHandling(fns, null, arguments, vm, "v-on handler")
}
}
invoker.fns = fns;
return invoker
}
function updateListeners (
on,
oldOn,
add,
remove$$1,
createOnceHandler,
vm
) {
var name, def$$1, cur, old, event;
for (name in on) {
def$$1 = cur = on[name];
old = oldOn[name];
event = normalizeEvent(name);
if (isUndef(cur)) {
true && warn(
"Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
vm
);
} else if (isUndef(old)) {
if (isUndef(cur.fns)) {
cur = on[name] = createFnInvoker(cur, vm);
}
if (isTrue(event.once)) {
cur = on[name] = createOnceHandler(event.name, cur, event.capture);
}
add(event.name, cur, event.capture, event.passive, event.params);
} else if (cur !== old) {
old.fns = cur;
on[name] = old;
}
}
for (name in oldOn) {
if (isUndef(on[name])) {
event = normalizeEvent(name);
remove$$1(event.name, oldOn[name], event.capture);
}
}
}
/* */
/* */
// fixed by xxxxxx (mp properties)
function extractPropertiesFromVNodeData(data, Ctor, res, context) {
var propOptions = Ctor.options.mpOptions && Ctor.options.mpOptions.properties;
if (isUndef(propOptions)) {
return res
}
var externalClasses = Ctor.options.mpOptions.externalClasses || [];
var attrs = data.attrs;
var props = data.props;
if (isDef(attrs) || isDef(props)) {
for (var key in propOptions) {
var altKey = hyphenate(key);
var result = checkProp(res, props, key, altKey, true) ||
checkProp(res, attrs, key, altKey, false);
// externalClass
if (
result &&
res[key] &&
externalClasses.indexOf(altKey) !== -1 &&
context[camelize(res[key])]
) {
// 赋值 externalClass 真正的值(模板里 externalClass 的值可能是字符串)
res[key] = context[camelize(res[key])];
}
}
}
return res
}
function extractPropsFromVNodeData (
data,
Ctor,
tag,
context// fixed by xxxxxx
) {
// we are only extracting raw values here.
// validation and default values are handled in the child
// component itself.
var propOptions = Ctor.options.props;
if (isUndef(propOptions)) {
// fixed by xxxxxx
return extractPropertiesFromVNodeData(data, Ctor, {}, context)
}
var res = {};
var attrs = data.attrs;
var props = data.props;
if (isDef(attrs) || isDef(props)) {
for (var key in propOptions) {
var altKey = hyphenate(key);
if (true) {
var keyInLowerCase = key.toLowerCase();
if (
key !== keyInLowerCase &&
attrs && hasOwn(attrs, keyInLowerCase)
) {
tip(
"Prop \"" + keyInLowerCase + "\" is passed to component " +
(formatComponentName(tag || Ctor)) + ", but the declared prop name is" +
" \"" + key + "\". " +
"Note that HTML attributes are case-insensitive and camelCased " +
"props need to use their kebab-case equivalents when using in-DOM " +
"templates. You should probably use \"" + altKey + "\" instead of \"" + key + "\"."
);
}
}
checkProp(res, props, key, altKey, true) ||
checkProp(res, attrs, key, altKey, false);
}
}
// fixed by xxxxxx
return extractPropertiesFromVNodeData(data, Ctor, res, context)
}
function checkProp (
res,
hash,
key,
altKey,
preserve
) {
if (isDef(hash)) {
if (hasOwn(hash, key)) {
res[key] = hash[key];
if (!preserve) {
delete hash[key];
}
return true
} else if (hasOwn(hash, altKey)) {
res[key] = hash[altKey];
if (!preserve) {
delete hash[altKey];
}
return true
}
}
return false
}
/* */
// The template compiler attempts to minimize the need for normalization by
// statically analyzing the template at compile time.
//
// For plain HTML markup, normalization can be completely skipped because the
// generated render function is guaranteed to return Array<VNode>. There are
// two cases where extra normalization is needed:
// 1. When the children contains components - because a functional component
// may return an Array instead of a single root. In this case, just a simple
// normalization is needed - if any child is an Array, we flatten the whole
// thing with Array.prototype.concat. It is guaranteed to be only 1-level deep
// because functional components already normalize their own children.
function simpleNormalizeChildren (children) {
for (var i = 0; i < children.length; i++) {
if (Array.isArray(children[i])) {
return Array.prototype.concat.apply([], children)
}
}
return children
}
// 2. When the children contains constructs that always generated nested Arrays,
// e.g. <template>, <slot>, v-for, or when the children is provided by user
// with hand-written render functions / JSX. In such cases a full normalization
// is needed to cater to all possible types of children values.
function normalizeChildren (children) {
return isPrimitive(children)
? [createTextVNode(children)]
: Array.isArray(children)
? normalizeArrayChildren(children)
: undefined
}
function isTextNode (node) {
return isDef(node) && isDef(node.text) && isFalse(node.isComment)
}
function normalizeArrayChildren (children, nestedIndex) {
var res = [];
var i, c, lastIndex, last;
for (i = 0; i < children.length; i++) {
c = children[i];
if (isUndef(c) || typeof c === 'boolean') { continue }
lastIndex = res.length - 1;
last = res[lastIndex];
// nested
if (Array.isArray(c)) {
if (c.length > 0) {
c = normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i));
// merge adjacent text nodes
if (isTextNode(c[0]) && isTextNode(last)) {
res[lastIndex] = createTextVNode(last.text + (c[0]).text);
c.shift();
}
res.push.apply(res, c);
}
} else if (isPrimitive(c)) {
if (isTextNode(last)) {
// merge adjacent text nodes
// this is necessary for SSR hydration because text nodes are
// essentially merged when rendered to HTML strings
res[lastIndex] = createTextVNode(last.text + c);
} else if (c !== '') {
// convert primitive to vnode
res.push(createTextVNode(c));
}
} else {
if (isTextNode(c) && isTextNode(last)) {
// merge adjacent text nodes
res[lastIndex] = createTextVNode(last.text + c.text);
} else {
// default key for nested array children (likely generated by v-for)
if (isTrue(children._isVList) &&
isDef(c.tag) &&
isUndef(c.key) &&
isDef(nestedIndex)) {
c.key = "__vlist" + nestedIndex + "_" + i + "__";
}
res.push(c);
}
}
}
return res
}
/* */
function initProvide (vm) {
var provide = vm.$options.provide;
if (provide) {
vm._provided = typeof provide === 'function'
? provide.call(vm)
: provide;
}
}
function initInjections (vm) {
var result = resolveInject(vm.$options.inject, vm);
if (result) {
toggleObserving(false);
Object.keys(result).forEach(function (key) {
/* istanbul ignore else */
if (true) {
defineReactive$$1(vm, key, result[key], function () {
warn(
"Avoid mutating an injected value directly since the changes will be " +
"overwritten whenever the provided component re-renders. " +
"injection being mutated: \"" + key + "\"",
vm
);
});
} else {}
});
toggleObserving(true);
}
}
function resolveInject (inject, vm) {
if (inject) {
// inject is :any because flow is not smart enough to figure out cached
var result = Object.create(null);
var keys = hasSymbol
? Reflect.ownKeys(inject)
: Object.keys(inject);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
// #6574 in case the inject object is observed...
if (key === '__ob__') { continue }
var provideKey = inject[key].from;
var source = vm;
while (source) {
if (source._provided && hasOwn(source._provided, provideKey)) {
result[key] = source._provided[provideKey];
break
}
source = source.$parent;
}
if (!source) {
if ('default' in inject[key]) {
var provideDefault = inject[key].default;
result[key] = typeof provideDefault === 'function'
? provideDefault.call(vm)
: provideDefault;
} else if (true) {
warn(("Injection \"" + key + "\" not found"), vm);
}
}
}
return result
}
}
/* */
/**
* Runtime helper for resolving raw children VNodes into a slot object.
*/
function resolveSlots (
children,
context
) {
if (!children || !children.length) {
return {}
}
var slots = {};
for (var i = 0, l = children.length; i < l; i++) {
var child = children[i];
var data = child.data;
// remove slot attribute if the node is resolved as a Vue slot node
if (data && data.attrs && data.attrs.slot) {
delete data.attrs.slot;
}
// named slots should only be respected if the vnode was rendered in the
// same context.
if ((child.context === context || child.fnContext === context) &&
data && data.slot != null
) {
var name = data.slot;
var slot = (slots[name] || (slots[name] = []));
if (child.tag === 'template') {
slot.push.apply(slot, child.children || []);
} else {
slot.push(child);
}
} else {
// fixed by xxxxxx 临时 hack 掉 uni-app 中的异步 name slot page
if(child.asyncMeta && child.asyncMeta.data && child.asyncMeta.data.slot === 'page'){
(slots['page'] || (slots['page'] = [])).push(child);
}else{
(slots.default || (slots.default = [])).push(child);
}
}
}
// ignore slots that contains only whitespace
for (var name$1 in slots) {
if (slots[name$1].every(isWhitespace)) {
delete slots[name$1];
}
}
return slots
}
function isWhitespace (node) {
return (node.isComment && !node.asyncFactory) || node.text === ' '
}
/* */
function normalizeScopedSlots (
slots,
normalSlots,
prevSlots
) {
var res;
var hasNormalSlots = Object.keys(normalSlots).length > 0;
var isStable = slots ? !!slots.$stable : !hasNormalSlots;
var key = slots && slots.$key;
if (!slots) {
res = {};
} else if (slots._normalized) {
// fast path 1: child component re-render only, parent did not change
return slots._normalized
} else if (
isStable &&
prevSlots &&
prevSlots !== emptyObject &&
key === prevSlots.$key &&
!hasNormalSlots &&
!prevSlots.$hasNormal
) {
// fast path 2: stable scoped slots w/ no normal slots to proxy,
// only need to normalize once
return prevSlots
} else {
res = {};
for (var key$1 in slots) {
if (slots[key$1] && key$1[0] !== '$') {
res[key$1] = normalizeScopedSlot(normalSlots, key$1, slots[key$1]);
}
}
}
// expose normal slots on scopedSlots
for (var key$2 in normalSlots) {
if (!(key$2 in res)) {
res[key$2] = proxyNormalSlot(normalSlots, key$2);
}
}
// avoriaz seems to mock a non-extensible $scopedSlots object
// and when that is passed down this would cause an error
if (slots && Object.isExtensible(slots)) {
(slots)._normalized = res;
}
def(res, '$stable', isStable);
def(res, '$key', key);
def(res, '$hasNormal', hasNormalSlots);
return res
}
function normalizeScopedSlot(normalSlots, key, fn) {
var normalized = function () {
var res = arguments.length ? fn.apply(null, arguments) : fn({});
res = res && typeof res === 'object' && !Array.isArray(res)
? [res] // single vnode
: normalizeChildren(res);
return res && (
res.length === 0 ||
(res.length === 1 && res[0].isComment) // #9658
) ? undefined
: res
};
// this is a slot using the new v-slot syntax without scope. although it is
// compiled as a scoped slot, render fn users would expect it to be present
// on this.$slots because the usage is semantically a normal slot.
if (fn.proxy) {
Object.defineProperty(normalSlots, key, {
get: normalized,
enumerable: true,
configurable: true
});
}
return normalized
}
function proxyNormalSlot(slots, key) {
return function () { return slots[key]; }
}
/* */
/**
* Runtime helper for rendering v-for lists.
*/
function renderList (
val,
render
) {
var ret, i, l, keys, key;
if (Array.isArray(val) || typeof val === 'string') {
ret = new Array(val.length);
for (i = 0, l = val.length; i < l; i++) {
ret[i] = render(val[i], i, i, i); // fixed by xxxxxx
}
} else if (typeof val === 'number') {
ret = new Array(val);
for (i = 0; i < val; i++) {
ret[i] = render(i + 1, i, i, i); // fixed by xxxxxx
}
} else if (isObject(val)) {
if (hasSymbol && val[Symbol.iterator]) {
ret = [];
var iterator = val[Symbol.iterator]();
var result = iterator.next();
while (!result.done) {
ret.push(render(result.value, ret.length, i, i++)); // fixed by xxxxxx
result = iterator.next();
}
} else {
keys = Object.keys(val);
ret = new Array(keys.length);
for (i = 0, l = keys.length; i < l; i++) {
key = keys[i];
ret[i] = render(val[key], key, i, i); // fixed by xxxxxx
}
}
}
if (!isDef(ret)) {
ret = [];
}
(ret)._isVList = true;
return ret
}
/* */
/**
* Runtime helper for rendering <slot>
*/
function renderSlot (
name,
fallback,
props,
bindObject
) {
var scopedSlotFn = this.$scopedSlots[name];
var nodes;
if (scopedSlotFn) { // scoped slot
props = props || {};
if (bindObject) {
if ( true && !isObject(bindObject)) {
warn(
'slot v-bind without argument expects an Object',
this
);
}
props = extend(extend({}, bindObject), props);
}
// fixed by xxxxxx app-plus scopedSlot
nodes = scopedSlotFn(props, this, props._i) || fallback;
} else {
nodes = this.$slots[name] || fallback;
}
var target = props && props.slot;
if (target) {
return this.$createElement('template', { slot: target }, nodes)
} else {
return nodes
}
}
/* */
/**
* Runtime helper for resolving filters
*/
function resolveFilter (id) {
return resolveAsset(this.$options, 'filters', id, true) || identity
}
/* */
function isKeyNotMatch (expect, actual) {
if (Array.isArray(expect)) {
return expect.indexOf(actual) === -1
} else {
return expect !== actual
}
}
/**
* Runtime helper for checking keyCodes from config.
* exposed as Vue.prototype._k
* passing in eventKeyName as last argument separately for backwards compat
*/
function checkKeyCodes (
eventKeyCode,
key,
builtInKeyCode,
eventKeyName,
builtInKeyName
) {
var mappedKeyCode = config.keyCodes[key] || builtInKeyCode;
if (builtInKeyName && eventKeyName && !config.keyCodes[key]) {
return isKeyNotMatch(builtInKeyName, eventKeyName)
} else if (mappedKeyCode) {
return isKeyNotMatch(mappedKeyCode, eventKeyCode)
} else if (eventKeyName) {
return hyphenate(eventKeyName) !== key
}
}
/* */
/**
* Runtime helper for merging v-bind="object" into a VNode's data.
*/
function bindObjectProps (
data,
tag,
value,
asProp,
isSync
) {
if (value) {
if (!isObject(value)) {
true && warn(
'v-bind without argument expects an Object or Array value',
this
);
} else {
if (Array.isArray(value)) {
value = toObject(value);
}
var hash;
var loop = function ( key ) {
if (
key === 'class' ||
key === 'style' ||
isReservedAttribute(key)
) {
hash = data;
} else {
var type = data.attrs && data.attrs.type;
hash = asProp || config.mustUseProp(tag, type, key)
? data.domProps || (data.domProps = {})
: data.attrs || (data.attrs = {});
}
var camelizedKey = camelize(key);
var hyphenatedKey = hyphenate(key);
if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {
hash[key] = value[key];
if (isSync) {
var on = data.on || (data.on = {});
on[("update:" + key)] = function ($event) {
value[key] = $event;
};
}
}
};
for (var key in value) loop( key );
}
}
return data
}
/* */
/**
* Runtime helper for rendering static trees.
*/
function renderStatic (
index,
isInFor
) {
var cached = this._staticTrees || (this._staticTrees = []);
var tree = cached[index];
// if has already-rendered static tree and not inside v-for,
// we can reuse the same tree.
if (tree && !isInFor) {
return tree
}
// otherwise, render a fresh tree.
tree = cached[index] = this.$options.staticRenderFns[index].call(
this._renderProxy,
null,
this // for render fns generated for functional component templates
);
markStatic(tree, ("__static__" + index), false);
return tree
}
/**
* Runtime helper for v-once.
* Effectively it means marking the node as static with a unique key.
*/
function markOnce (
tree,
index,
key
) {
markStatic(tree, ("__once__" + index + (key ? ("_" + key) : "")), true);
return tree
}
function markStatic (
tree,
key,
isOnce
) {
if (Array.isArray(tree)) {
for (var i = 0; i < tree.length; i++) {
if (tree[i] && typeof tree[i] !== 'string') {
markStaticNode(tree[i], (key + "_" + i), isOnce);
}
}
} else {
markStaticNode(tree, key, isOnce);
}
}
function markStaticNode (node, key, isOnce) {
node.isStatic = true;
node.key = key;
node.isOnce = isOnce;
}
/* */
function bindObjectListeners (data, value) {
if (value) {
if (!isPlainObject(value)) {
true && warn(
'v-on without argument expects an Object value',
this
);
} else {
var on = data.on = data.on ? extend({}, data.on) : {};
for (var key in value) {
var existing = on[key];
var ours = value[key];
on[key] = existing ? [].concat(existing, ours) : ours;
}
}
}
return data
}
/* */
function resolveScopedSlots (
fns, // see flow/vnode
res,
// the following are added in 2.6
hasDynamicKeys,
contentHashKey
) {
res = res || { $stable: !hasDynamicKeys };
for (var i = 0; i < fns.length; i++) {
var slot = fns[i];
if (Array.isArray(slot)) {
resolveScopedSlots(slot, res, hasDynamicKeys);
} else if (slot) {
// marker for reverse proxying v-slot without scope on this.$slots
if (slot.proxy) {
slot.fn.proxy = true;
}
res[slot.key] = slot.fn;
}
}
if (contentHashKey) {
(res).$key = contentHashKey;
}
return res
}
/* */
function bindDynamicKeys (baseObj, values) {
for (var i = 0; i < values.length; i += 2) {
var key = values[i];
if (typeof key === 'string' && key) {
baseObj[values[i]] = values[i + 1];
} else if ( true && key !== '' && key !== null) {
// null is a special value for explicitly removing a binding
warn(
("Invalid value for dynamic directive argument (expected string or null): " + key),
this
);
}
}
return baseObj
}
// helper to dynamically append modifier runtime markers to event names.
// ensure only append when value is already string, otherwise it will be cast
// to string and cause the type check to miss.
function prependModifier (value, symbol) {
return typeof value === 'string' ? symbol + value : value
}
/* */
function installRenderHelpers (target) {
target._o = markOnce;
target._n = toNumber;
target._s = toString;
target._l = renderList;
target._t = renderSlot;
target._q = looseEqual;
target._i = looseIndexOf;
target._m = renderStatic;
target._f = resolveFilter;
target._k = checkKeyCodes;
target._b = bindObjectProps;
target._v = createTextVNode;
target._e = createEmptyVNode;
target._u = resolveScopedSlots;
target._g = bindObjectListeners;
target._d = bindDynamicKeys;
target._p = prependModifier;
}
/* */
function FunctionalRenderContext (
data,
props,
children,
parent,
Ctor
) {
var this$1 = this;
var options = Ctor.options;
// ensure the createElement function in functional components
// gets a unique context - this is necessary for correct named slot check
var contextVm;
if (hasOwn(parent, '_uid')) {
contextVm = Object.create(parent);
// $flow-disable-line
contextVm._original = parent;
} else {
// the context vm passed in is a functional context as well.
// in this case we want to make sure we are able to get a hold to the
// real context instance.
contextVm = parent;
// $flow-disable-line
parent = parent._original;
}
var isCompiled = isTrue(options._compiled);
var needNormalization = !isCompiled;
this.data = data;
this.props = props;
this.children = children;
this.parent = parent;
this.listeners = data.on || emptyObject;
this.injections = resolveInject(options.inject, parent);
this.slots = function () {
if (!this$1.$slots) {
normalizeScopedSlots(
data.scopedSlots,
this$1.$slots = resolveSlots(children, parent)
);
}
return this$1.$slots
};
Object.defineProperty(this, 'scopedSlots', ({
enumerable: true,
get: function get () {
return normalizeScopedSlots(data.scopedSlots, this.slots())
}
}));
// support for compiled functional template
if (isCompiled) {
// exposing $options for renderStatic()
this.$options = options;
// pre-resolve slots for renderSlot()
this.$slots = this.slots();
this.$scopedSlots = normalizeScopedSlots(data.scopedSlots, this.$slots);
}
if (options._scopeId) {
this._c = function (a, b, c, d) {
var vnode = createElement(contextVm, a, b, c, d, needNormalization);
if (vnode && !Array.isArray(vnode)) {
vnode.fnScopeId = options._scopeId;
vnode.fnContext = parent;
}
return vnode
};
} else {
this._c = function (a, b, c, d) { return createElement(contextVm, a, b, c, d, needNormalization); };
}
}
installRenderHelpers(FunctionalRenderContext.prototype);
function createFunctionalComponent (
Ctor,
propsData,
data,
contextVm,
children
) {
var options = Ctor.options;
var props = {};
var propOptions = options.props;
if (isDef(propOptions)) {
for (var key in propOptions) {
props[key] = validateProp(key, propOptions, propsData || emptyObject);
}
} else {
if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
if (isDef(data.props)) { mergeProps(props, data.props); }
}
var renderContext = new FunctionalRenderContext(
data,
props,
children,
contextVm,
Ctor
);
var vnode = options.render.call(null, renderContext._c, renderContext);
if (vnode instanceof VNode) {
return cloneAndMarkFunctionalResult(vnode, data, renderContext.parent, options, renderContext)
} else if (Array.isArray(vnode)) {
var vnodes = normalizeChildren(vnode) || [];
var res = new Array(vnodes.length);
for (var i = 0; i < vnodes.length; i++) {
res[i] = cloneAndMarkFunctionalResult(vnodes[i], data, renderContext.parent, options, renderContext);
}
return res
}
}
function cloneAndMarkFunctionalResult (vnode, data, contextVm, options, renderContext) {
// #7817 clone node before setting fnContext, otherwise if the node is reused
// (e.g. it was from a cached normal slot) the fnContext causes named slots
// that should not be matched to match.
var clone = cloneVNode(vnode);
clone.fnContext = contextVm;
clone.fnOptions = options;
if (true) {
(clone.devtoolsMeta = clone.devtoolsMeta || {}).renderContext = renderContext;
}
if (data.slot) {
(clone.data || (clone.data = {})).slot = data.slot;
}
return clone
}
function mergeProps (to, from) {
for (var key in from) {
to[camelize(key)] = from[key];
}
}
/* */
/* */
/* */
/* */
// inline hooks to be invoked on component VNodes during patch
var componentVNodeHooks = {
init: function init (vnode, hydrating) {
if (
vnode.componentInstance &&
!vnode.componentInstance._isDestroyed &&
vnode.data.keepAlive
) {
// kept-alive components, treat as a patch
var mountedNode = vnode; // work around flow
componentVNodeHooks.prepatch(mountedNode, mountedNode);
} else {
var child = vnode.componentInstance = createComponentInstanceForVnode(
vnode,
activeInstance
);
child.$mount(hydrating ? vnode.elm : undefined, hydrating);
}
},
prepatch: function prepatch (oldVnode, vnode) {
var options = vnode.componentOptions;
var child = vnode.componentInstance = oldVnode.componentInstance;
updateChildComponent(
child,
options.propsData, // updated props
options.listeners, // updated listeners
vnode, // new parent vnode
options.children // new children
);
},
insert: function insert (vnode) {
var context = vnode.context;
var componentInstance = vnode.componentInstance;
if (!componentInstance._isMounted) {
callHook(componentInstance, 'onServiceCreated');
callHook(componentInstance, 'onServiceAttached');
componentInstance._isMounted = true;
callHook(componentInstance, 'mounted');
}
if (vnode.data.keepAlive) {
if (context._isMounted) {
// vue-router#1212
// During updates, a kept-alive component's child components may
// change, so directly walking the tree here may call activated hooks
// on incorrect children. Instead we push them into a queue which will
// be processed after the whole patch process ended.
queueActivatedComponent(componentInstance);
} else {
activateChildComponent(componentInstance, true /* direct */);
}
}
},
destroy: function destroy (vnode) {
var componentInstance = vnode.componentInstance;
if (!componentInstance._isDestroyed) {
if (!vnode.data.keepAlive) {
componentInstance.$destroy();
} else {
deactivateChildComponent(componentInstance, true /* direct */);
}
}
}
};
var hooksToMerge = Object.keys(componentVNodeHooks);
function createComponent (
Ctor,
data,
context,
children,
tag
) {
if (isUndef(Ctor)) {
return
}
var baseCtor = context.$options._base;
// plain options object: turn it into a constructor
if (isObject(Ctor)) {
Ctor = baseCtor.extend(Ctor);
}
// if at this stage it's not a constructor or an async component factory,
// reject.
if (typeof Ctor !== 'function') {
if (true) {
warn(("Invalid Component definition: " + (String(Ctor))), context);
}
return
}
// async component
var asyncFactory;
if (isUndef(Ctor.cid)) {
asyncFactory = Ctor;
Ctor = resolveAsyncComponent(asyncFactory, baseCtor);
if (Ctor === undefined) {
// return a placeholder node for async component, which is rendered
// as a comment node but preserves all the raw information for the node.
// the information will be used for async server-rendering and hydration.
return createAsyncPlaceholder(
asyncFactory,
data,
context,
children,
tag
)
}
}
data = data || {};
// resolve constructor options in case global mixins are applied after
// component constructor creation
resolveConstructorOptions(Ctor);
// transform component v-model data into props & events
if (isDef(data.model)) {
transformModel(Ctor.options, data);
}
// extract props
var propsData = extractPropsFromVNodeData(data, Ctor, tag, context); // fixed by xxxxxx
// functional component
if (isTrue(Ctor.options.functional)) {
return createFunctionalComponent(Ctor, propsData, data, context, children)
}
// extract listeners, since these needs to be treated as
// child component listeners instead of DOM listeners
var listeners = data.on;
// replace with listeners with .native modifier
// so it gets processed during parent component patch.
data.on = data.nativeOn;
if (isTrue(Ctor.options.abstract)) {
// abstract components do not keep anything
// other than props & listeners & slot
// work around flow
var slot = data.slot;
data = {};
if (slot) {
data.slot = slot;
}
}
// install component management hooks onto the placeholder node
installComponentHooks(data);
// return a placeholder vnode
var name = Ctor.options.name || tag;
var vnode = new VNode(
("vue-component-" + (Ctor.cid) + (name ? ("-" + name) : '')),
data, undefined, undefined, undefined, context,
{ Ctor: Ctor, propsData: propsData, listeners: listeners, tag: tag, children: children },
asyncFactory
);
return vnode
}
function createComponentInstanceForVnode (
vnode, // we know it's MountedComponentVNode but flow doesn't
parent // activeInstance in lifecycle state
) {
var options = {
_isComponent: true,
_parentVnode: vnode,
parent: parent
};
// check inline-template render functions
var inlineTemplate = vnode.data.inlineTemplate;
if (isDef(inlineTemplate)) {
options.render = inlineTemplate.render;
options.staticRenderFns = inlineTemplate.staticRenderFns;
}
return new vnode.componentOptions.Ctor(options)
}
function installComponentHooks (data) {
var hooks = data.hook || (data.hook = {});
for (var i = 0; i < hooksToMerge.length; i++) {
var key = hooksToMerge[i];
var existing = hooks[key];
var toMerge = componentVNodeHooks[key];
if (existing !== toMerge && !(existing && existing._merged)) {
hooks[key] = existing ? mergeHook$1(toMerge, existing) : toMerge;
}
}
}
function mergeHook$1 (f1, f2) {
var merged = function (a, b) {
// flow complains about extra args which is why we use any
f1(a, b);
f2(a, b);
};
merged._merged = true;
return merged
}
// transform component v-model info (value and callback) into
// prop and event handler respectively.
function transformModel (options, data) {
var prop = (options.model && options.model.prop) || 'value';
var event = (options.model && options.model.event) || 'input'
;(data.attrs || (data.attrs = {}))[prop] = data.model.value;
var on = data.on || (data.on = {});
var existing = on[event];
var callback = data.model.callback;
if (isDef(existing)) {
if (
Array.isArray(existing)
? existing.indexOf(callback) === -1
: existing !== callback
) {
on[event] = [callback].concat(existing);
}
} else {
on[event] = callback;
}
}
/* */
var SIMPLE_NORMALIZE = 1;
var ALWAYS_NORMALIZE = 2;
// wrapper function for providing a more flexible interface
// without getting yelled at by flow
function createElement (
context,
tag,
data,
children,
normalizationType,
alwaysNormalize
) {
if (Array.isArray(data) || isPrimitive(data)) {
normalizationType = children;
children = data;
data = undefined;
}
if (isTrue(alwaysNormalize)) {
normalizationType = ALWAYS_NORMALIZE;
}
return _createElement(context, tag, data, children, normalizationType)
}
function _createElement (
context,
tag,
data,
children,
normalizationType
) {
if (isDef(data) && isDef((data).__ob__)) {
true && warn(
"Avoid using observed data object as vnode data: " + (JSON.stringify(data)) + "\n" +
'Always create fresh vnode data objects in each render!',
context
);
return createEmptyVNode()
}
// object syntax in v-bind
if (isDef(data) && isDef(data.is)) {
tag = data.is;
}
if (!tag) {
// in case of component :is set to falsy value
return createEmptyVNode()
}
// warn against non-primitive key
if ( true &&
isDef(data) && isDef(data.key) && !isPrimitive(data.key)
) {
{
warn(
'Avoid using non-primitive value as key, ' +
'use string/number value instead.',
context
);
}
}
// support single function children as default scoped slot
if (Array.isArray(children) &&
typeof children[0] === 'function'
) {
data = data || {};
data.scopedSlots = { default: children[0] };
children.length = 0;
}
if (normalizationType === ALWAYS_NORMALIZE) {
children = normalizeChildren(children);
} else if (normalizationType === SIMPLE_NORMALIZE) {
children = simpleNormalizeChildren(children);
}
var vnode, ns;
if (typeof tag === 'string') {
var Ctor;
ns = (context.$vnode && context.$vnode.ns) || config.getTagNamespace(tag);
if (config.isReservedTag(tag)) {
// platform built-in elements
if ( true && isDef(data) && isDef(data.nativeOn)) {
warn(
("The .native modifier for v-on is only valid on components but it was used on <" + tag + ">."),
context
);
}
vnode = new VNode(
config.parsePlatformTagName(tag), data, children,
undefined, undefined, context
);
} else if ((!data || !data.pre) && isDef(Ctor = resolveAsset(context.$options, 'components', tag))) {
// component
vnode = createComponent(Ctor, data, context, children, tag);
} else {
// unknown or unlisted namespaced elements
// check at runtime because it may get assigned a namespace when its
// parent normalizes children
vnode = new VNode(
tag, data, children,
undefined, undefined, context
);
}
} else {
// direct component options / constructor
vnode = createComponent(tag, data, context, children);
}
if (Array.isArray(vnode)) {
return vnode
} else if (isDef(vnode)) {
if (isDef(ns)) { applyNS(vnode, ns); }
if (isDef(data)) { registerDeepBindings(data); }
return vnode
} else {
return createEmptyVNode()
}
}
function applyNS (vnode, ns, force) {
vnode.ns = ns;
if (vnode.tag === 'foreignObject') {
// use default namespace inside foreignObject
ns = undefined;
force = true;
}
if (isDef(vnode.children)) {
for (var i = 0, l = vnode.children.length; i < l; i++) {
var child = vnode.children[i];
if (isDef(child.tag) && (
isUndef(child.ns) || (isTrue(force) && child.tag !== 'svg'))) {
applyNS(child, ns, force);
}
}
}
}
// ref #5318
// necessary to ensure parent re-render when deep bindings like :style and
// :class are used on slot nodes
function registerDeepBindings (data) {
if (isObject(data.style)) {
traverse(data.style);
}
if (isObject(data.class)) {
traverse(data.class);
}
}
/* */
function initRender (vm) {
vm._vnode = null; // the root of the child tree
vm._staticTrees = null; // v-once cached trees
var options = vm.$options;
var parentVnode = vm.$vnode = options._parentVnode; // the placeholder node in parent tree
var renderContext = parentVnode && parentVnode.context;
vm.$slots = resolveSlots(options._renderChildren, renderContext);
vm.$scopedSlots = emptyObject;
// bind the createElement fn to this instance
// so that we get proper render context inside it.
// args order: tag, data, children, normalizationType, alwaysNormalize
// internal version is used by render functions compiled from templates
vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); };
// normalization is always applied for the public version, used in
// user-written render functions.
vm.$createElement = function (a, b, c, d) { return createElement(vm, a, b, c, d, true); };
// $attrs & $listeners are exposed for easier HOC creation.
// they need to be reactive so that HOCs using them are always updated
var parentData = parentVnode && parentVnode.data;
/* istanbul ignore else */
if (true) {
defineReactive$$1(vm, '$attrs', parentData && parentData.attrs || emptyObject, function () {
!isUpdatingChildComponent && warn("$attrs is readonly.", vm);
}, true);
defineReactive$$1(vm, '$listeners', options._parentListeners || emptyObject, function () {
!isUpdatingChildComponent && warn("$listeners is readonly.", vm);
}, true);
} else {}
}
var currentRenderingInstance = null;
function renderMixin (Vue) {
// install runtime convenience helpers
installRenderHelpers(Vue.prototype);
Vue.prototype.$nextTick = function (fn) {
return nextTick(fn, this)
};
Vue.prototype._render = function () {
var vm = this;
var ref = vm.$options;
var render = ref.render;
var _parentVnode = ref._parentVnode;
if (_parentVnode) {
vm.$scopedSlots = normalizeScopedSlots(
_parentVnode.data.scopedSlots,
vm.$slots,
vm.$scopedSlots
);
}
// set parent vnode. this allows render functions to have access
// to the data on the placeholder node.
vm.$vnode = _parentVnode;
// render self
var vnode;
try {
// There's no need to maintain a stack because all render fns are called
// separately from one another. Nested component's render fns are called
// when parent component is patched.
currentRenderingInstance = vm;
vnode = render.call(vm._renderProxy, vm.$createElement);
} catch (e) {
handleError(e, vm, "render");
// return error render result,
// or previous vnode to prevent render error causing blank component
/* istanbul ignore else */
if ( true && vm.$options.renderError) {
try {
vnode = vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e);
} catch (e) {
handleError(e, vm, "renderError");
vnode = vm._vnode;
}
} else {
vnode = vm._vnode;
}
} finally {
currentRenderingInstance = null;
}
// if the returned array contains only a single node, allow it
if (Array.isArray(vnode) && vnode.length === 1) {
vnode = vnode[0];
}
// return empty vnode in case the render function errored out
if (!(vnode instanceof VNode)) {
if ( true && Array.isArray(vnode)) {
warn(
'Multiple root nodes returned from render function. Render function ' +
'should return a single root node.',
vm
);
}
vnode = createEmptyVNode();
}
// set parent
vnode.parent = _parentVnode;
return vnode
};
}
/* */
function ensureCtor (comp, base) {
if (
comp.__esModule ||
(hasSymbol && comp[Symbol.toStringTag] === 'Module')
) {
comp = comp.default;
}
return isObject(comp)
? base.extend(comp)
: comp
}
function createAsyncPlaceholder (
factory,
data,
context,
children,
tag
) {
var node = createEmptyVNode();
node.asyncFactory = factory;
node.asyncMeta = { data: data, context: context, children: children, tag: tag };
return node
}
function resolveAsyncComponent (
factory,
baseCtor
) {
if (isTrue(factory.error) && isDef(factory.errorComp)) {
return factory.errorComp
}
if (isDef(factory.resolved)) {
return factory.resolved
}
var owner = currentRenderingInstance;
if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) {
// already pending
factory.owners.push(owner);
}
if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
return factory.loadingComp
}
if (owner && !isDef(factory.owners)) {
var owners = factory.owners = [owner];
var sync = true;
var timerLoading = null;
var timerTimeout = null
;(owner).$on('hook:destroyed', function () { return remove(owners, owner); });
var forceRender = function (renderCompleted) {
for (var i = 0, l = owners.length; i < l; i++) {
(owners[i]).$forceUpdate();
}
if (renderCompleted) {
owners.length = 0;
if (timerLoading !== null) {
clearTimeout(timerLoading);
timerLoading = null;
}
if (timerTimeout !== null) {
clearTimeout(timerTimeout);
timerTimeout = null;
}
}
};
var resolve = once(function (res) {
// cache resolved
factory.resolved = ensureCtor(res, baseCtor);
// invoke callbacks only if this is not a synchronous resolve
// (async resolves are shimmed as synchronous during SSR)
if (!sync) {
forceRender(true);
} else {
owners.length = 0;
}
});
var reject = once(function (reason) {
true && warn(
"Failed to resolve async component: " + (String(factory)) +
(reason ? ("\nReason: " + reason) : '')
);
if (isDef(factory.errorComp)) {
factory.error = true;
forceRender(true);
}
});
var res = factory(resolve, reject);
if (isObject(res)) {
if (isPromise(res)) {
// () => Promise
if (isUndef(factory.resolved)) {
res.then(resolve, reject);
}
} else if (isPromise(res.component)) {
res.component.then(resolve, reject);
if (isDef(res.error)) {
factory.errorComp = ensureCtor(res.error, baseCtor);
}
if (isDef(res.loading)) {
factory.loadingComp = ensureCtor(res.loading, baseCtor);
if (res.delay === 0) {
factory.loading = true;
} else {
timerLoading = setTimeout(function () {
timerLoading = null;
if (isUndef(factory.resolved) && isUndef(factory.error)) {
factory.loading = true;
forceRender(false);
}
}, res.delay || 200);
}
}
if (isDef(res.timeout)) {
timerTimeout = setTimeout(function () {
timerTimeout = null;
if (isUndef(factory.resolved)) {
reject(
true
? ("timeout (" + (res.timeout) + "ms)")
: undefined
);
}
}, res.timeout);
}
}
}
sync = false;
// return in case resolved synchronously
return factory.loading
? factory.loadingComp
: factory.resolved
}
}
/* */
function isAsyncPlaceholder (node) {
return node.isComment && node.asyncFactory
}
/* */
function getFirstComponentChild (children) {
if (Array.isArray(children)) {
for (var i = 0; i < children.length; i++) {
var c = children[i];
if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
return c
}
}
}
}
/* */
/* */
function initEvents (vm) {
vm._events = Object.create(null);
vm._hasHookEvent = false;
// init parent attached events
var listeners = vm.$options._parentListeners;
if (listeners) {
updateComponentListeners(vm, listeners);
}
}
var target;
function add (event, fn) {
target.$on(event, fn);
}
function remove$1 (event, fn) {
target.$off(event, fn);
}
function createOnceHandler (event, fn) {
var _target = target;
return function onceHandler () {
var res = fn.apply(null, arguments);
if (res !== null) {
_target.$off(event, onceHandler);
}
}
}
function updateComponentListeners (
vm,
listeners,
oldListeners
) {
target = vm;
updateListeners(listeners, oldListeners || {}, add, remove$1, createOnceHandler, vm);
target = undefined;
}
function eventsMixin (Vue) {
var hookRE = /^hook:/;
Vue.prototype.$on = function (event, fn) {
var vm = this;
if (Array.isArray(event)) {
for (var i = 0, l = event.length; i < l; i++) {
vm.$on(event[i], fn);
}
} else {
(vm._events[event] || (vm._events[event] = [])).push(fn);
// optimize hook:event cost by using a boolean flag marked at registration
// instead of a hash lookup
if (hookRE.test(event)) {
vm._hasHookEvent = true;
}
}
return vm
};
Vue.prototype.$once = function (event, fn) {
var vm = this;
function on () {
vm.$off(event, on);
fn.apply(vm, arguments);
}
on.fn = fn;
vm.$on(event, on);
return vm
};
Vue.prototype.$off = function (event, fn) {
var vm = this;
// all
if (!arguments.length) {
vm._events = Object.create(null);
return vm
}
// array of events
if (Array.isArray(event)) {
for (var i$1 = 0, l = event.length; i$1 < l; i$1++) {
vm.$off(event[i$1], fn);
}
return vm
}
// specific event
var cbs = vm._events[event];
if (!cbs) {
return vm
}
if (!fn) {
vm._events[event] = null;
return vm
}
// specific handler
var cb;
var i = cbs.length;
while (i--) {
cb = cbs[i];
if (cb === fn || cb.fn === fn) {
cbs.splice(i, 1);
break
}
}
return vm
};
Vue.prototype.$emit = function (event) {
var vm = this;
if (true) {
var lowerCaseEvent = event.toLowerCase();
if (lowerCaseEvent !== event && vm._events[lowerCaseEvent]) {
tip(
"Event \"" + lowerCaseEvent + "\" is emitted in component " +
(formatComponentName(vm)) + " but the handler is registered for \"" + event + "\". " +
"Note that HTML attributes are case-insensitive and you cannot use " +
"v-on to listen to camelCase events when using in-DOM templates. " +
"You should probably use \"" + (hyphenate(event)) + "\" instead of \"" + event + "\"."
);
}
}
var cbs = vm._events[event];
if (cbs) {
cbs = cbs.length > 1 ? toArray(cbs) : cbs;
var args = toArray(arguments, 1);
var info = "event handler for \"" + event + "\"";
for (var i = 0, l = cbs.length; i < l; i++) {
invokeWithErrorHandling(cbs[i], vm, args, vm, info);
}
}
return vm
};
}
/* */
var activeInstance = null;
var isUpdatingChildComponent = false;
function setActiveInstance(vm) {
var prevActiveInstance = activeInstance;
activeInstance = vm;
return function () {
activeInstance = prevActiveInstance;
}
}
function initLifecycle (vm) {
var options = vm.$options;
// locate first non-abstract parent
var parent = options.parent;
if (parent && !options.abstract) {
while (parent.$options.abstract && parent.$parent) {
parent = parent.$parent;
}
parent.$children.push(vm);
}
vm.$parent = parent;
vm.$root = parent ? parent.$root : vm;
vm.$children = [];
vm.$refs = {};
vm._watcher = null;
vm._inactive = null;
vm._directInactive = false;
vm._isMounted = false;
vm._isDestroyed = false;
vm._isBeingDestroyed = false;
}
function lifecycleMixin (Vue) {
Vue.prototype._update = function (vnode, hydrating) {
var vm = this;
var prevEl = vm.$el;
var prevVnode = vm._vnode;
var restoreActiveInstance = setActiveInstance(vm);
vm._vnode = vnode;
// Vue.prototype.__patch__ is injected in entry points
// based on the rendering backend used.
if (!prevVnode) {
// initial render
vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);
} else {
// updates
vm.$el = vm.__patch__(prevVnode, vnode);
}
restoreActiveInstance();
// update __vue__ reference
if (prevEl) {
prevEl.__vue__ = null;
}
if (vm.$el) {
vm.$el.__vue__ = vm;
}
// if parent is an HOC, update its $el as well
if (vm.$vnode && vm.$parent && vm.$vnode === vm.$parent._vnode) {
vm.$parent.$el = vm.$el;
}
// updated hook is called by the scheduler to ensure that children are
// updated in a parent's updated hook.
};
Vue.prototype.$forceUpdate = function () {
var vm = this;
if (vm._watcher) {
vm._watcher.update();
}
};
Vue.prototype.$destroy = function () {
var vm = this;
if (vm._isBeingDestroyed) {
return
}
callHook(vm, 'beforeDestroy');
vm._isBeingDestroyed = true;
// remove self from parent
var parent = vm.$parent;
if (parent && !parent._isBeingDestroyed && !vm.$options.abstract) {
remove(parent.$children, vm);
}
// teardown watchers
if (vm._watcher) {
vm._watcher.teardown();
}
var i = vm._watchers.length;
while (i--) {
vm._watchers[i].teardown();
}
// remove reference from data ob
// frozen object may not have observer.
if (vm._data.__ob__) {
vm._data.__ob__.vmCount--;
}
// call the last hook...
vm._isDestroyed = true;
// invoke destroy hooks on current rendered tree
vm.__patch__(vm._vnode, null);
// fire destroyed hook
callHook(vm, 'destroyed');
// turn off all instance listeners.
vm.$off();
// remove __vue__ reference
if (vm.$el) {
vm.$el.__vue__ = null;
}
// release circular reference (#6759)
if (vm.$vnode) {
vm.$vnode.parent = null;
}
};
}
function updateChildComponent (
vm,
propsData,
listeners,
parentVnode,
renderChildren
) {
if (true) {
isUpdatingChildComponent = true;
}
// determine whether component has slot children
// we need to do this before overwriting $options._renderChildren.
// check if there are dynamic scopedSlots (hand-written or compiled but with
// dynamic slot names). Static scoped slots compiled from template has the
// "$stable" marker.
var newScopedSlots = parentVnode.data.scopedSlots;
var oldScopedSlots = vm.$scopedSlots;
var hasDynamicScopedSlot = !!(
(newScopedSlots && !newScopedSlots.$stable) ||
(oldScopedSlots !== emptyObject && !oldScopedSlots.$stable) ||
(newScopedSlots && vm.$scopedSlots.$key !== newScopedSlots.$key)
);
// Any static slot children from the parent may have changed during parent's
// update. Dynamic scoped slots may also have changed. In such cases, a forced
// update is necessary to ensure correctness.
var needsForceUpdate = !!(
renderChildren || // has new static slots
vm.$options._renderChildren || // has old static slots
hasDynamicScopedSlot
);
vm.$options._parentVnode = parentVnode;
vm.$vnode = parentVnode; // update vm's placeholder node without re-render
if (vm._vnode) { // update child tree's parent
vm._vnode.parent = parentVnode;
}
vm.$options._renderChildren = renderChildren;
// update $attrs and $listeners hash
// these are also reactive so they may trigger child update if the child
// used them during render
vm.$attrs = parentVnode.data.attrs || emptyObject;
vm.$listeners = listeners || emptyObject;
// update props
if (propsData && vm.$options.props) {
toggleObserving(false);
var props = vm._props;
var propKeys = vm.$options._propKeys || [];
for (var i = 0; i < propKeys.length; i++) {
var key = propKeys[i];
var propOptions = vm.$options.props; // wtf flow?
props[key] = validateProp(key, propOptions, propsData, vm);
}
toggleObserving(true);
// keep a copy of raw propsData
vm.$options.propsData = propsData;
}
// fixed by xxxxxx update properties(mp runtime)
vm._$updateProperties && vm._$updateProperties(vm);
// update listeners
listeners = listeners || emptyObject;
var oldListeners = vm.$options._parentListeners;
vm.$options._parentListeners = listeners;
updateComponentListeners(vm, listeners, oldListeners);
// resolve slots + force update if has children
if (needsForceUpdate) {
vm.$slots = resolveSlots(renderChildren, parentVnode.context);
vm.$forceUpdate();
}
if (true) {
isUpdatingChildComponent = false;
}
}
function isInInactiveTree (vm) {
while (vm && (vm = vm.$parent)) {
if (vm._inactive) { return true }
}
return false
}
function activateChildComponent (vm, direct) {
if (direct) {
vm._directInactive = false;
if (isInInactiveTree(vm)) {
return
}
} else if (vm._directInactive) {
return
}
if (vm._inactive || vm._inactive === null) {
vm._inactive = false;
for (var i = 0; i < vm.$children.length; i++) {
activateChildComponent(vm.$children[i]);
}
callHook(vm, 'activated');
}
}
function deactivateChildComponent (vm, direct) {
if (direct) {
vm._directInactive = true;
if (isInInactiveTree(vm)) {
return
}
}
if (!vm._inactive) {
vm._inactive = true;
for (var i = 0; i < vm.$children.length; i++) {
deactivateChildComponent(vm.$children[i]);
}
callHook(vm, 'deactivated');
}
}
function callHook (vm, hook) {
// #7573 disable dep collection when invoking lifecycle hooks
pushTarget();
var handlers = vm.$options[hook];
var info = hook + " hook";
if (handlers) {
for (var i = 0, j = handlers.length; i < j; i++) {
invokeWithErrorHandling(handlers[i], vm, null, vm, info);
}
}
if (vm._hasHookEvent) {
vm.$emit('hook:' + hook);
}
popTarget();
}
/* */
var MAX_UPDATE_COUNT = 100;
var queue = [];
var activatedChildren = [];
var has = {};
var circular = {};
var waiting = false;
var flushing = false;
var index = 0;
/**
* Reset the scheduler's state.
*/
function resetSchedulerState () {
index = queue.length = activatedChildren.length = 0;
has = {};
if (true) {
circular = {};
}
waiting = flushing = false;
}
// Async edge case #6566 requires saving the timestamp when event listeners are
// attached. However, calling performance.now() has a perf overhead especially
// if the page has thousands of event listeners. Instead, we take a timestamp
// every time the scheduler flushes and use that for all event listeners
// attached during that flush.
var currentFlushTimestamp = 0;
// Async edge case fix requires storing an event listener's attach timestamp.
var getNow = Date.now;
// Determine what event timestamp the browser is using. Annoyingly, the
// timestamp can either be hi-res (relative to page load) or low-res
// (relative to UNIX epoch), so in order to compare time we have to use the
// same timestamp type when saving the flush timestamp.
// All IE versions use low-res event timestamps, and have problematic clock
// implementations (#9632)
if (inBrowser && !isIE) {
var performance = window.performance;
if (
performance &&
typeof performance.now === 'function' &&
getNow() > document.createEvent('Event').timeStamp
) {
// if the event timestamp, although evaluated AFTER the Date.now(), is
// smaller than it, it means the event is using a hi-res timestamp,
// and we need to use the hi-res version for event listener timestamps as
// well.
getNow = function () { return performance.now(); };
}
}
/**
* Flush both queues and run the watchers.
*/
function flushSchedulerQueue () {
currentFlushTimestamp = getNow();
flushing = true;
var watcher, id;
// Sort queue before flush.
// This ensures that:
// 1. Components are updated from parent to child. (because parent is always
// created before the child)
// 2. A component's user watchers are run before its render watcher (because
// user watchers are created before the render watcher)
// 3. If a component is destroyed during a parent component's watcher run,
// its watchers can be skipped.
queue.sort(function (a, b) { return a.id - b.id; });
// do not cache length because more watchers might be pushed
// as we run existing watchers
for (index = 0; index < queue.length; index++) {
watcher = queue[index];
if (watcher.before) {
watcher.before();
}
id = watcher.id;
has[id] = null;
watcher.run();
// in dev build, check and stop circular updates.
if ( true && has[id] != null) {
circular[id] = (circular[id] || 0) + 1;
if (circular[id] > MAX_UPDATE_COUNT) {
warn(
'You may have an infinite update loop ' + (
watcher.user
? ("in watcher with expression \"" + (watcher.expression) + "\"")
: "in a component render function."
),
watcher.vm
);
break
}
}
}
// keep copies of post queues before resetting state
var activatedQueue = activatedChildren.slice();
var updatedQueue = queue.slice();
resetSchedulerState();
// call component updated and activated hooks
callActivatedHooks(activatedQueue);
callUpdatedHooks(updatedQueue);
// devtool hook
/* istanbul ignore if */
if (devtools && config.devtools) {
devtools.emit('flush');
}
}
function callUpdatedHooks (queue) {
var i = queue.length;
while (i--) {
var watcher = queue[i];
var vm = watcher.vm;
if (vm._watcher === watcher && vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'updated');
}
}
}
/**
* Queue a kept-alive component that was activated during patch.
* The queue will be processed after the entire tree has been patched.
*/
function queueActivatedComponent (vm) {
// setting _inactive to false here so that a render function can
// rely on checking whether it's in an inactive tree (e.g. router-view)
vm._inactive = false;
activatedChildren.push(vm);
}
function callActivatedHooks (queue) {
for (var i = 0; i < queue.length; i++) {
queue[i]._inactive = true;
activateChildComponent(queue[i], true /* true */);
}
}
/**
* Push a watcher into the watcher queue.
* Jobs with duplicate IDs will be skipped unless it's
* pushed when the queue is being flushed.
*/
function queueWatcher (watcher) {
var id = watcher.id;
if (has[id] == null) {
has[id] = true;
if (!flushing) {
queue.push(watcher);
} else {
// if already flushing, splice the watcher based on its id
// if already past its id, it will be run next immediately.
var i = queue.length - 1;
while (i > index && queue[i].id > watcher.id) {
i--;
}
queue.splice(i + 1, 0, watcher);
}
// queue the flush
if (!waiting) {
waiting = true;
if ( true && !config.async) {
flushSchedulerQueue();
return
}
nextTick(flushSchedulerQueue);
}
}
}
/* */
var uid$2 = 0;
/**
* A watcher parses an expression, collects dependencies,
* and fires callback when the expression value changes.
* This is used for both the $watch() api and directives.
*/
var Watcher = function Watcher (
vm,
expOrFn,
cb,
options,
isRenderWatcher
) {
this.vm = vm;
if (isRenderWatcher) {
vm._watcher = this;
}
vm._watchers.push(this);
// options
if (options) {
this.deep = !!options.deep;
this.user = !!options.user;
this.lazy = !!options.lazy;
this.sync = !!options.sync;
this.before = options.before;
} else {
this.deep = this.user = this.lazy = this.sync = false;
}
this.cb = cb;
this.id = ++uid$2; // uid for batching
this.active = true;
this.dirty = this.lazy; // for lazy watchers
this.deps = [];
this.newDeps = [];
this.depIds = new _Set();
this.newDepIds = new _Set();
this.expression = true
? expOrFn.toString()
: undefined;
// parse expression for getter
if (typeof expOrFn === 'function') {
this.getter = expOrFn;
} else {
this.getter = parsePath(expOrFn);
if (!this.getter) {
this.getter = noop;
true && warn(
"Failed watching path: \"" + expOrFn + "\" " +
'Watcher only accepts simple dot-delimited paths. ' +
'For full control, use a function instead.',
vm
);
}
}
this.value = this.lazy
? undefined
: this.get();
};
/**
* Evaluate the getter, and re-collect dependencies.
*/
Watcher.prototype.get = function get () {
pushTarget(this);
var value;
var vm = this.vm;
try {
value = this.getter.call(vm, vm);
} catch (e) {
if (this.user) {
handleError(e, vm, ("getter for watcher \"" + (this.expression) + "\""));
} else {
throw e
}
} finally {
// "touch" every property so they are all tracked as
// dependencies for deep watching
if (this.deep) {
traverse(value);
}
popTarget();
this.cleanupDeps();
}
return value
};
/**
* Add a dependency to this directive.
*/
Watcher.prototype.addDep = function addDep (dep) {
var id = dep.id;
if (!this.newDepIds.has(id)) {
this.newDepIds.add(id);
this.newDeps.push(dep);
if (!this.depIds.has(id)) {
dep.addSub(this);
}
}
};
/**
* Clean up for dependency collection.
*/
Watcher.prototype.cleanupDeps = function cleanupDeps () {
var i = this.deps.length;
while (i--) {
var dep = this.deps[i];
if (!this.newDepIds.has(dep.id)) {
dep.removeSub(this);
}
}
var tmp = this.depIds;
this.depIds = this.newDepIds;
this.newDepIds = tmp;
this.newDepIds.clear();
tmp = this.deps;
this.deps = this.newDeps;
this.newDeps = tmp;
this.newDeps.length = 0;
};
/**
* Subscriber interface.
* Will be called when a dependency changes.
*/
Watcher.prototype.update = function update () {
/* istanbul ignore else */
if (this.lazy) {
this.dirty = true;
} else if (this.sync) {
this.run();
} else {
queueWatcher(this);
}
};
/**
* Scheduler job interface.
* Will be called by the scheduler.
*/
Watcher.prototype.run = function run () {
if (this.active) {
var value = this.get();
if (
value !== this.value ||
// Deep watchers and watchers on Object/Arrays should fire even
// when the value is the same, because the value may
// have mutated.
isObject(value) ||
this.deep
) {
// set new value
var oldValue = this.value;
this.value = value;
if (this.user) {
try {
this.cb.call(this.vm, value, oldValue);
} catch (e) {
handleError(e, this.vm, ("callback for watcher \"" + (this.expression) + "\""));
}
} else {
this.cb.call(this.vm, value, oldValue);
}
}
}
};
/**
* Evaluate the value of the watcher.
* This only gets called for lazy watchers.
*/
Watcher.prototype.evaluate = function evaluate () {
this.value = this.get();
this.dirty = false;
};
/**
* Depend on all deps collected by this watcher.
*/
Watcher.prototype.depend = function depend () {
var i = this.deps.length;
while (i--) {
this.deps[i].depend();
}
};
/**
* Remove self from all dependencies' subscriber list.
*/
Watcher.prototype.teardown = function teardown () {
if (this.active) {
// remove self from vm's watcher list
// this is a somewhat expensive operation so we skip it
// if the vm is being destroyed.
if (!this.vm._isBeingDestroyed) {
remove(this.vm._watchers, this);
}
var i = this.deps.length;
while (i--) {
this.deps[i].removeSub(this);
}
this.active = false;
}
};
/* */
var sharedPropertyDefinition = {
enumerable: true,
configurable: true,
get: noop,
set: noop
};
function proxy (target, sourceKey, key) {
sharedPropertyDefinition.get = function proxyGetter () {
return this[sourceKey][key]
};
sharedPropertyDefinition.set = function proxySetter (val) {
this[sourceKey][key] = val;
};
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function initState (vm) {
vm._watchers = [];
var opts = vm.$options;
if (opts.props) { initProps(vm, opts.props); }
if (opts.methods) { initMethods(vm, opts.methods); }
if (opts.data) {
initData(vm);
} else {
observe(vm._data = {}, true /* asRootData */);
}
if (opts.computed) { initComputed(vm, opts.computed); }
if (opts.watch && opts.watch !== nativeWatch) {
initWatch(vm, opts.watch);
}
}
function initProps (vm, propsOptions) {
var propsData = vm.$options.propsData || {};
var props = vm._props = {};
// cache prop keys so that future props updates can iterate using Array
// instead of dynamic object key enumeration.
var keys = vm.$options._propKeys = [];
var isRoot = !vm.$parent;
// root instance props should be converted
if (!isRoot) {
toggleObserving(false);
}
var loop = function ( key ) {
keys.push(key);
var value = validateProp(key, propsOptions, propsData, vm);
/* istanbul ignore else */
if (true) {
var hyphenatedKey = hyphenate(key);
if (isReservedAttribute(hyphenatedKey) ||
config.isReservedAttr(hyphenatedKey)) {
warn(
("\"" + hyphenatedKey + "\" is a reserved attribute and cannot be used as component prop."),
vm
);
}
defineReactive$$1(props, key, value, function () {
if (!isRoot && !isUpdatingChildComponent) {
{
if(vm.mpHost === 'mp-baidu' || vm.mpHost === 'mp-kuaishou' || vm.mpHost === 'mp-xhs'){//百度、快手、小红书 observer 在 setData callback 之后触发,直接忽略该 warn
return
}
//fixed by xxxxxx __next_tick_pending,uni://form-field 时不告警
if(
key === 'value' &&
Array.isArray(vm.$options.behaviors) &&
vm.$options.behaviors.indexOf('uni://form-field') !== -1
){
return
}
if(vm._getFormData){
return
}
var $parent = vm.$parent;
while($parent){
if($parent.__next_tick_pending){
return
}
$parent = $parent.$parent;
}
}
warn(
"Avoid mutating a prop directly since the value will be " +
"overwritten whenever the parent component re-renders. " +
"Instead, use a data or computed property based on the prop's " +
"value. Prop being mutated: \"" + key + "\"",
vm
);
}
});
} else {}
// static props are already proxied on the component's prototype
// during Vue.extend(). We only need to proxy props defined at
// instantiation here.
if (!(key in vm)) {
proxy(vm, "_props", key);
}
};
for (var key in propsOptions) loop( key );
toggleObserving(true);
}
function initData (vm) {
var data = vm.$options.data;
data = vm._data = typeof data === 'function'
? getData(data, vm)
: data || {};
if (!isPlainObject(data)) {
data = {};
true && warn(
'data functions should return an object:\n' +
'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
vm
);
}
// proxy data on instance
var keys = Object.keys(data);
var props = vm.$options.props;
var methods = vm.$options.methods;
var i = keys.length;
while (i--) {
var key = keys[i];
if (true) {
if (methods && hasOwn(methods, key)) {
warn(
("Method \"" + key + "\" has already been defined as a data property."),
vm
);
}
}
if (props && hasOwn(props, key)) {
true && warn(
"The data property \"" + key + "\" is already declared as a prop. " +
"Use prop default value instead.",
vm
);
} else if (!isReserved(key)) {
proxy(vm, "_data", key);
}
}
// observe data
observe(data, true /* asRootData */);
}
function getData (data, vm) {
// #7573 disable dep collection when invoking data getters
pushTarget();
try {
return data.call(vm, vm)
} catch (e) {
handleError(e, vm, "data()");
return {}
} finally {
popTarget();
}
}
var computedWatcherOptions = { lazy: true };
function initComputed (vm, computed) {
// $flow-disable-line
var watchers = vm._computedWatchers = Object.create(null);
// computed properties are just getters during SSR
var isSSR = isServerRendering();
for (var key in computed) {
var userDef = computed[key];
var getter = typeof userDef === 'function' ? userDef : userDef.get;
if ( true && getter == null) {
warn(
("Getter is missing for computed property \"" + key + "\"."),
vm
);
}
if (!isSSR) {
// create internal watcher for the computed property.
watchers[key] = new Watcher(
vm,
getter || noop,
noop,
computedWatcherOptions
);
}
// component-defined computed properties are already defined on the
// component prototype. We only need to define computed properties defined
// at instantiation here.
if (!(key in vm)) {
defineComputed(vm, key, userDef);
} else if (true) {
if (key in vm.$data) {
warn(("The computed property \"" + key + "\" is already defined in data."), vm);
} else if (vm.$options.props && key in vm.$options.props) {
warn(("The computed property \"" + key + "\" is already defined as a prop."), vm);
}
}
}
}
function defineComputed (
target,
key,
userDef
) {
var shouldCache = !isServerRendering();
if (typeof userDef === 'function') {
sharedPropertyDefinition.get = shouldCache
? createComputedGetter(key)
: createGetterInvoker(userDef);
sharedPropertyDefinition.set = noop;
} else {
sharedPropertyDefinition.get = userDef.get
? shouldCache && userDef.cache !== false
? createComputedGetter(key)
: createGetterInvoker(userDef.get)
: noop;
sharedPropertyDefinition.set = userDef.set || noop;
}
if ( true &&
sharedPropertyDefinition.set === noop) {
sharedPropertyDefinition.set = function () {
warn(
("Computed property \"" + key + "\" was assigned to but it has no setter."),
this
);
};
}
Object.defineProperty(target, key, sharedPropertyDefinition);
}
function createComputedGetter (key) {
return function computedGetter () {
var watcher = this._computedWatchers && this._computedWatchers[key];
if (watcher) {
if (watcher.dirty) {
watcher.evaluate();
}
if (Dep.SharedObject.target) {// fixed by xxxxxx
watcher.depend();
}
return watcher.value
}
}
}
function createGetterInvoker(fn) {
return function computedGetter () {
return fn.call(this, this)
}
}
function initMethods (vm, methods) {
var props = vm.$options.props;
for (var key in methods) {
if (true) {
if (typeof methods[key] !== 'function') {
warn(
"Method \"" + key + "\" has type \"" + (typeof methods[key]) + "\" in the component definition. " +
"Did you reference the function correctly?",
vm
);
}
if (props && hasOwn(props, key)) {
warn(
("Method \"" + key + "\" has already been defined as a prop."),
vm
);
}
if ((key in vm) && isReserved(key)) {
warn(
"Method \"" + key + "\" conflicts with an existing Vue instance method. " +
"Avoid defining component methods that start with _ or $."
);
}
}
vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm);
}
}
function initWatch (vm, watch) {
for (var key in watch) {
var handler = watch[key];
if (Array.isArray(handler)) {
for (var i = 0; i < handler.length; i++) {
createWatcher(vm, key, handler[i]);
}
} else {
createWatcher(vm, key, handler);
}
}
}
function createWatcher (
vm,
expOrFn,
handler,
options
) {
if (isPlainObject(handler)) {
options = handler;
handler = handler.handler;
}
if (typeof handler === 'string') {
handler = vm[handler];
}
return vm.$watch(expOrFn, handler, options)
}
function stateMixin (Vue) {
// flow somehow has problems with directly declared definition object
// when using Object.defineProperty, so we have to procedurally build up
// the object here.
var dataDef = {};
dataDef.get = function () { return this._data };
var propsDef = {};
propsDef.get = function () { return this._props };
if (true) {
dataDef.set = function () {
warn(
'Avoid replacing instance root $data. ' +
'Use nested data properties instead.',
this
);
};
propsDef.set = function () {
warn("$props is readonly.", this);
};
}
Object.defineProperty(Vue.prototype, '$data', dataDef);
Object.defineProperty(Vue.prototype, '$props', propsDef);
Vue.prototype.$set = set;
Vue.prototype.$delete = del;
Vue.prototype.$watch = function (
expOrFn,
cb,
options
) {
var vm = this;
if (isPlainObject(cb)) {
return createWatcher(vm, expOrFn, cb, options)
}
options = options || {};
options.user = true;
var watcher = new Watcher(vm, expOrFn, cb, options);
if (options.immediate) {
try {
cb.call(vm, watcher.value);
} catch (error) {
handleError(error, vm, ("callback for immediate watcher \"" + (watcher.expression) + "\""));
}
}
return function unwatchFn () {
watcher.teardown();
}
};
}
/* */
var uid$3 = 0;
function initMixin (Vue) {
Vue.prototype._init = function (options) {
var vm = this;
// a uid
vm._uid = uid$3++;
var startTag, endTag;
/* istanbul ignore if */
if ( true && config.performance && mark) {
startTag = "vue-perf-start:" + (vm._uid);
endTag = "vue-perf-end:" + (vm._uid);
mark(startTag);
}
// a flag to avoid this being observed
vm._isVue = true;
// merge options
if (options && options._isComponent) {
// optimize internal component instantiation
// since dynamic options merging is pretty slow, and none of the
// internal component options needs special treatment.
initInternalComponent(vm, options);
} else {
vm.$options = mergeOptions(
resolveConstructorOptions(vm.constructor),
options || {},
vm
);
}
/* istanbul ignore else */
if (true) {
initProxy(vm);
} else {}
// expose real self
vm._self = vm;
initLifecycle(vm);
initEvents(vm);
initRender(vm);
callHook(vm, 'beforeCreate');
!vm._$fallback && initInjections(vm); // resolve injections before data/props
initState(vm);
!vm._$fallback && initProvide(vm); // resolve provide after data/props
!vm._$fallback && callHook(vm, 'created');
/* istanbul ignore if */
if ( true && config.performance && mark) {
vm._name = formatComponentName(vm, false);
mark(endTag);
measure(("vue " + (vm._name) + " init"), startTag, endTag);
}
if (vm.$options.el) {
vm.$mount(vm.$options.el);
}
};
}
function initInternalComponent (vm, options) {
var opts = vm.$options = Object.create(vm.constructor.options);
// doing this because it's faster than dynamic enumeration.
var parentVnode = options._parentVnode;
opts.parent = options.parent;
opts._parentVnode = parentVnode;
var vnodeComponentOptions = parentVnode.componentOptions;
opts.propsData = vnodeComponentOptions.propsData;
opts._parentListeners = vnodeComponentOptions.listeners;
opts._renderChildren = vnodeComponentOptions.children;
opts._componentTag = vnodeComponentOptions.tag;
if (options.render) {
opts.render = options.render;
opts.staticRenderFns = options.staticRenderFns;
}
}
function resolveConstructorOptions (Ctor) {
var options = Ctor.options;
if (Ctor.super) {
var superOptions = resolveConstructorOptions(Ctor.super);
var cachedSuperOptions = Ctor.superOptions;
if (superOptions !== cachedSuperOptions) {
// super option changed,
// need to resolve new options.
Ctor.superOptions = superOptions;
// check if there are any late-modified/attached options (#4976)
var modifiedOptions = resolveModifiedOptions(Ctor);
// update base extend options
if (modifiedOptions) {
extend(Ctor.extendOptions, modifiedOptions);
}
options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions);
if (options.name) {
options.components[options.name] = Ctor;
}
}
}
return options
}
function resolveModifiedOptions (Ctor) {
var modified;
var latest = Ctor.options;
var sealed = Ctor.sealedOptions;
for (var key in latest) {
if (latest[key] !== sealed[key]) {
if (!modified) { modified = {}; }
modified[key] = latest[key];
}
}
return modified
}
function Vue (options) {
if ( true &&
!(this instanceof Vue)
) {
warn('Vue is a constructor and should be called with the `new` keyword');
}
this._init(options);
}
initMixin(Vue);
stateMixin(Vue);
eventsMixin(Vue);
lifecycleMixin(Vue);
renderMixin(Vue);
/* */
function initUse (Vue) {
Vue.use = function (plugin) {
var installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
if (installedPlugins.indexOf(plugin) > -1) {
return this
}
// additional parameters
var args = toArray(arguments, 1);
args.unshift(this);
if (typeof plugin.install === 'function') {
plugin.install.apply(plugin, args);
} else if (typeof plugin === 'function') {
plugin.apply(null, args);
}
installedPlugins.push(plugin);
return this
};
}
/* */
function initMixin$1 (Vue) {
Vue.mixin = function (mixin) {
this.options = mergeOptions(this.options, mixin);
return this
};
}
/* */
function initExtend (Vue) {
/**
* Each instance constructor, including Vue, has a unique
* cid. This enables us to create wrapped "child
* constructors" for prototypal inheritance and cache them.
*/
Vue.cid = 0;
var cid = 1;
/**
* Class inheritance
*/
Vue.extend = function (extendOptions) {
extendOptions = extendOptions || {};
var Super = this;
var SuperId = Super.cid;
var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {});
if (cachedCtors[SuperId]) {
return cachedCtors[SuperId]
}
var name = extendOptions.name || Super.options.name;
if ( true && name) {
validateComponentName(name);
}
var Sub = function VueComponent (options) {
this._init(options);
};
Sub.prototype = Object.create(Super.prototype);
Sub.prototype.constructor = Sub;
Sub.cid = cid++;
Sub.options = mergeOptions(
Super.options,
extendOptions
);
Sub['super'] = Super;
// For props and computed properties, we define the proxy getters on
// the Vue instances at extension time, on the extended prototype. This
// avoids Object.defineProperty calls for each instance created.
if (Sub.options.props) {
initProps$1(Sub);
}
if (Sub.options.computed) {
initComputed$1(Sub);
}
// allow further extension/mixin/plugin usage
Sub.extend = Super.extend;
Sub.mixin = Super.mixin;
Sub.use = Super.use;
// create asset registers, so extended classes
// can have their private assets too.
ASSET_TYPES.forEach(function (type) {
Sub[type] = Super[type];
});
// enable recursive self-lookup
if (name) {
Sub.options.components[name] = Sub;
}
// keep a reference to the super options at extension time.
// later at instantiation we can check if Super's options have
// been updated.
Sub.superOptions = Super.options;
Sub.extendOptions = extendOptions;
Sub.sealedOptions = extend({}, Sub.options);
// cache constructor
cachedCtors[SuperId] = Sub;
return Sub
};
}
function initProps$1 (Comp) {
var props = Comp.options.props;
for (var key in props) {
proxy(Comp.prototype, "_props", key);
}
}
function initComputed$1 (Comp) {
var computed = Comp.options.computed;
for (var key in computed) {
defineComputed(Comp.prototype, key, computed[key]);
}
}
/* */
function initAssetRegisters (Vue) {
/**
* Create asset registration methods.
*/
ASSET_TYPES.forEach(function (type) {
Vue[type] = function (
id,
definition
) {
if (!definition) {
return this.options[type + 's'][id]
} else {
/* istanbul ignore if */
if ( true && type === 'component') {
validateComponentName(id);
}
if (type === 'component' && isPlainObject(definition)) {
definition.name = definition.name || id;
definition = this.options._base.extend(definition);
}
if (type === 'directive' && typeof definition === 'function') {
definition = { bind: definition, update: definition };
}
this.options[type + 's'][id] = definition;
return definition
}
};
});
}
/* */
function getComponentName (opts) {
return opts && (opts.Ctor.options.name || opts.tag)
}
function matches (pattern, name) {
if (Array.isArray(pattern)) {
return pattern.indexOf(name) > -1
} else if (typeof pattern === 'string') {
return pattern.split(',').indexOf(name) > -1
} else if (isRegExp(pattern)) {
return pattern.test(name)
}
/* istanbul ignore next */
return false
}
function pruneCache (keepAliveInstance, filter) {
var cache = keepAliveInstance.cache;
var keys = keepAliveInstance.keys;
var _vnode = keepAliveInstance._vnode;
for (var key in cache) {
var cachedNode = cache[key];
if (cachedNode) {
var name = getComponentName(cachedNode.componentOptions);
if (name && !filter(name)) {
pruneCacheEntry(cache, key, keys, _vnode);
}
}
}
}
function pruneCacheEntry (
cache,
key,
keys,
current
) {
var cached$$1 = cache[key];
if (cached$$1 && (!current || cached$$1.tag !== current.tag)) {
cached$$1.componentInstance.$destroy();
}
cache[key] = null;
remove(keys, key);
}
var patternTypes = [String, RegExp, Array];
var KeepAlive = {
name: 'keep-alive',
abstract: true,
props: {
include: patternTypes,
exclude: patternTypes,
max: [String, Number]
},
created: function created () {
this.cache = Object.create(null);
this.keys = [];
},
destroyed: function destroyed () {
for (var key in this.cache) {
pruneCacheEntry(this.cache, key, this.keys);
}
},
mounted: function mounted () {
var this$1 = this;
this.$watch('include', function (val) {
pruneCache(this$1, function (name) { return matches(val, name); });
});
this.$watch('exclude', function (val) {
pruneCache(this$1, function (name) { return !matches(val, name); });
});
},
render: function render () {
var slot = this.$slots.default;
var vnode = getFirstComponentChild(slot);
var componentOptions = vnode && vnode.componentOptions;
if (componentOptions) {
// check pattern
var name = getComponentName(componentOptions);
var ref = this;
var include = ref.include;
var exclude = ref.exclude;
if (
// not included
(include && (!name || !matches(include, name))) ||
// excluded
(exclude && name && matches(exclude, name))
) {
return vnode
}
var ref$1 = this;
var cache = ref$1.cache;
var keys = ref$1.keys;
var key = vnode.key == null
// same constructor may get registered as different local components
// so cid alone is not enough (#3269)
? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
: vnode.key;
if (cache[key]) {
vnode.componentInstance = cache[key].componentInstance;
// make current key freshest
remove(keys, key);
keys.push(key);
} else {
cache[key] = vnode;
keys.push(key);
// prune oldest entry
if (this.max && keys.length > parseInt(this.max)) {
pruneCacheEntry(cache, keys[0], keys, this._vnode);
}
}
vnode.data.keepAlive = true;
}
return vnode || (slot && slot[0])
}
};
var builtInComponents = {
KeepAlive: KeepAlive
};
/* */
function initGlobalAPI (Vue) {
// config
var configDef = {};
configDef.get = function () { return config; };
if (true) {
configDef.set = function () {
warn(
'Do not replace the Vue.config object, set individual fields instead.'
);
};
}
Object.defineProperty(Vue, 'config', configDef);
// exposed util methods.
// NOTE: these are not considered part of the public API - avoid relying on
// them unless you are aware of the risk.
Vue.util = {
warn: warn,
extend: extend,
mergeOptions: mergeOptions,
defineReactive: defineReactive$$1
};
Vue.set = set;
Vue.delete = del;
Vue.nextTick = nextTick;
// 2.6 explicit observable API
Vue.observable = function (obj) {
observe(obj);
return obj
};
Vue.options = Object.create(null);
ASSET_TYPES.forEach(function (type) {
Vue.options[type + 's'] = Object.create(null);
});
// this is used to identify the "base" constructor to extend all plain-object
// components with in Weex's multi-instance scenarios.
Vue.options._base = Vue;
extend(Vue.options.components, builtInComponents);
initUse(Vue);
initMixin$1(Vue);
initExtend(Vue);
initAssetRegisters(Vue);
}
initGlobalAPI(Vue);
Object.defineProperty(Vue.prototype, '$isServer', {
get: isServerRendering
});
Object.defineProperty(Vue.prototype, '$ssrContext', {
get: function get () {
/* istanbul ignore next */
return this.$vnode && this.$vnode.ssrContext
}
});
// expose FunctionalRenderContext for ssr runtime helper installation
Object.defineProperty(Vue, 'FunctionalRenderContext', {
value: FunctionalRenderContext
});
Vue.version = '2.6.11';
/**
* https://raw.githubusercontent.com/Tencent/westore/master/packages/westore/utils/diff.js
*/
var ARRAYTYPE = '[object Array]';
var OBJECTTYPE = '[object Object]';
// const FUNCTIONTYPE = '[object Function]'
function diff(current, pre) {
var result = {};
syncKeys(current, pre);
_diff(current, pre, '', result);
return result
}
function syncKeys(current, pre) {
if (current === pre) { return }
var rootCurrentType = type(current);
var rootPreType = type(pre);
if (rootCurrentType == OBJECTTYPE && rootPreType == OBJECTTYPE) {
if(Object.keys(current).length >= Object.keys(pre).length){
for (var key in pre) {
var currentValue = current[key];
if (currentValue === undefined) {
current[key] = null;
} else {
syncKeys(currentValue, pre[key]);
}
}
}
} else if (rootCurrentType == ARRAYTYPE && rootPreType == ARRAYTYPE) {
if (current.length >= pre.length) {
pre.forEach(function (item, index) {
syncKeys(current[index], item);
});
}
}
}
function _diff(current, pre, path, result) {
if (current === pre) { return }
var rootCurrentType = type(current);
var rootPreType = type(pre);
if (rootCurrentType == OBJECTTYPE) {
if (rootPreType != OBJECTTYPE || Object.keys(current).length < Object.keys(pre).length) {
setResult(result, path, current);
} else {
var loop = function ( key ) {
var currentValue = current[key];
var preValue = pre[key];
var currentType = type(currentValue);
var preType = type(preValue);
if (currentType != ARRAYTYPE && currentType != OBJECTTYPE) {
if (currentValue !== pre[key]) {
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
}
} else if (currentType == ARRAYTYPE) {
if (preType != ARRAYTYPE) {
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
} else {
if (currentValue.length < preValue.length) {
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
} else {
currentValue.forEach(function (item, index) {
_diff(item, preValue[index], (path == '' ? '' : path + ".") + key + '[' + index + ']', result);
});
}
}
} else if (currentType == OBJECTTYPE) {
if (preType != OBJECTTYPE || Object.keys(currentValue).length < Object.keys(preValue).length) {
setResult(result, (path == '' ? '' : path + ".") + key, currentValue);
} else {
for (var subKey in currentValue) {
_diff(currentValue[subKey], preValue[subKey], (path == '' ? '' : path + ".") + key + '.' + subKey, result);
}
}
}
};
for (var key in current) loop( key );
}
} else if (rootCurrentType == ARRAYTYPE) {
if (rootPreType != ARRAYTYPE) {
setResult(result, path, current);
} else {
if (current.length < pre.length) {
setResult(result, path, current);
} else {
current.forEach(function (item, index) {
_diff(item, pre[index], path + '[' + index + ']', result);
});
}
}
} else {
setResult(result, path, current);
}
}
function setResult(result, k, v) {
// if (type(v) != FUNCTIONTYPE) {
result[k] = v;
// }
}
function type(obj) {
return Object.prototype.toString.call(obj)
}
/* */
function flushCallbacks$1(vm) {
if (vm.__next_tick_callbacks && vm.__next_tick_callbacks.length) {
if (Object({"VUE_APP_NAME":"app","VUE_APP_PLATFORM":"mp-toutiao","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG) {
var mpInstance = vm.$scope;
console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +
']:flushCallbacks[' + vm.__next_tick_callbacks.length + ']');
}
var copies = vm.__next_tick_callbacks.slice(0);
vm.__next_tick_callbacks.length = 0;
for (var i = 0; i < copies.length; i++) {
copies[i]();
}
}
}
function hasRenderWatcher(vm) {
return queue.find(function (watcher) { return vm._watcher === watcher; })
}
function nextTick$1(vm, cb) {
//1.nextTick 之前 已 setData 且 setData 还未回调完成
//2.nextTick 之前存在 render watcher
if (!vm.__next_tick_pending && !hasRenderWatcher(vm)) {
if(Object({"VUE_APP_NAME":"app","VUE_APP_PLATFORM":"mp-toutiao","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG){
var mpInstance = vm.$scope;
console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + vm._uid +
']:nextVueTick');
}
return nextTick(cb, vm)
}else{
if(Object({"VUE_APP_NAME":"app","VUE_APP_PLATFORM":"mp-toutiao","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG){
var mpInstance$1 = vm.$scope;
console.log('[' + (+new Date) + '][' + (mpInstance$1.is || mpInstance$1.route) + '][' + vm._uid +
']:nextMPTick');
}
}
var _resolve;
if (!vm.__next_tick_callbacks) {
vm.__next_tick_callbacks = [];
}
vm.__next_tick_callbacks.push(function () {
if (cb) {
try {
cb.call(vm);
} catch (e) {
handleError(e, vm, 'nextTick');
}
} else if (_resolve) {
_resolve(vm);
}
});
// $flow-disable-line
if (!cb && typeof Promise !== 'undefined') {
return new Promise(function (resolve) {
_resolve = resolve;
})
}
}
/* */
function cloneWithData(vm) {
// 确保当前 vm 所有数据被同步
var ret = Object.create(null);
var dataKeys = [].concat(
Object.keys(vm._data || {}),
Object.keys(vm._computedWatchers || {}));
dataKeys.reduce(function(ret, key) {
ret[key] = vm[key];
return ret
}, ret);
// vue-composition-api
var compositionApiState = vm.__composition_api_state__ || vm.__secret_vfa_state__;
var rawBindings = compositionApiState && compositionApiState.rawBindings;
if (rawBindings) {
Object.keys(rawBindings).forEach(function (key) {
ret[key] = vm[key];
});
}
//TODO 需要把无用数据处理掉,比如 list=>l0 则 list 需要移除,否则多传输一份数据
Object.assign(ret, vm.$mp.data || {});
if (
Array.isArray(vm.$options.behaviors) &&
vm.$options.behaviors.indexOf('uni://form-field') !== -1
) { //form-field
ret['name'] = vm.name;
ret['value'] = vm.value;
}
return JSON.parse(JSON.stringify(ret))
}
var patch = function(oldVnode, vnode) {
var this$1 = this;
if (vnode === null) { //destroy
return
}
if (this.mpType === 'page' || this.mpType === 'component') {
var mpInstance = this.$scope;
var data = Object.create(null);
try {
data = cloneWithData(this);
} catch (err) {
console.error(err);
}
data.__webviewId__ = mpInstance.data.__webviewId__;
var mpData = Object.create(null);
Object.keys(data).forEach(function (key) { //仅同步 data 中有的数据
mpData[key] = mpInstance.data[key];
});
var diffData = this.$shouldDiffData === false ? data : diff(data, mpData);
if (Object.keys(diffData).length) {
if (Object({"VUE_APP_NAME":"app","VUE_APP_PLATFORM":"mp-toutiao","NODE_ENV":"development","BASE_URL":"/"}).VUE_APP_DEBUG) {
console.log('[' + (+new Date) + '][' + (mpInstance.is || mpInstance.route) + '][' + this._uid +
']差量更新',
JSON.stringify(diffData));
}
this.__next_tick_pending = true;
mpInstance.setData(diffData, function () {
this$1.__next_tick_pending = false;
flushCallbacks$1(this$1);
});
} else {
flushCallbacks$1(this);
}
}
};
/* */
function createEmptyRender() {
}
function mountComponent$1(
vm,
el,
hydrating
) {
if (!vm.mpType) {//main.js 中的 new Vue
return vm
}
if (vm.mpType === 'app') {
vm.$options.render = createEmptyRender;
}
if (!vm.$options.render) {
vm.$options.render = createEmptyRender;
if (true) {
/* istanbul ignore if */
if ((vm.$options.template && vm.$options.template.charAt(0) !== '#') ||
vm.$options.el || el) {
warn(
'You are using the runtime-only build of Vue where the template ' +
'compiler is not available. Either pre-compile the templates into ' +
'render functions, or use the compiler-included build.',
vm
);
} else {
warn(
'Failed to mount component: template or render function not defined.',
vm
);
}
}
}
!vm._$fallback && callHook(vm, 'beforeMount');
var updateComponent = function () {
vm._update(vm._render(), hydrating);
};
// we set this to vm._watcher inside the watcher's constructor
// since the watcher's initial patch may call $forceUpdate (e.g. inside child
// component's mounted hook), which relies on vm._watcher being already defined
new Watcher(vm, updateComponent, noop, {
before: function before() {
if (vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'beforeUpdate');
}
}
}, true /* isRenderWatcher */);
hydrating = false;
return vm
}
/* */
function renderClass (
staticClass,
dynamicClass
) {
if (isDef(staticClass) || isDef(dynamicClass)) {
return concat(staticClass, stringifyClass(dynamicClass))
}
/* istanbul ignore next */
return ''
}
function concat (a, b) {
return a ? b ? (a + ' ' + b) : a : (b || '')
}
function stringifyClass (value) {
if (Array.isArray(value)) {
return stringifyArray(value)
}
if (isObject(value)) {
return stringifyObject(value)
}
if (typeof value === 'string') {
return value
}
/* istanbul ignore next */
return ''
}
function stringifyArray (value) {
var res = '';
var stringified;
for (var i = 0, l = value.length; i < l; i++) {
if (isDef(stringified = stringifyClass(value[i])) && stringified !== '') {
if (res) { res += ' '; }
res += stringified;
}
}
return res
}
function stringifyObject (value) {
var res = '';
for (var key in value) {
if (value[key]) {
if (res) { res += ' '; }
res += key;
}
}
return res
}
/* */
var parseStyleText = cached(function (cssText) {
var res = {};
var listDelimiter = /;(?![^(]*\))/g;
var propertyDelimiter = /:(.+)/;
cssText.split(listDelimiter).forEach(function (item) {
if (item) {
var tmp = item.split(propertyDelimiter);
tmp.length > 1 && (res[tmp[0].trim()] = tmp[1].trim());
}
});
return res
});
// normalize possible array / string values into Object
function normalizeStyleBinding (bindingStyle) {
if (Array.isArray(bindingStyle)) {
return toObject(bindingStyle)
}
if (typeof bindingStyle === 'string') {
return parseStyleText(bindingStyle)
}
return bindingStyle
}
/* */
var MP_METHODS = ['createSelectorQuery', 'createIntersectionObserver', 'selectAllComponents', 'selectComponent'];
function getTarget(obj, path) {
var parts = path.split('.');
var key = parts[0];
if (key.indexOf('__$n') === 0) { //number index
key = parseInt(key.replace('__$n', ''));
}
if (parts.length === 1) {
return obj[key]
}
return getTarget(obj[key], parts.slice(1).join('.'))
}
function internalMixin(Vue) {
Vue.config.errorHandler = function(err, vm, info) {
Vue.util.warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
console.error(err);
/* eslint-disable no-undef */
var app = typeof getApp === 'function' && getApp();
if (app && app.onError) {
app.onError(err);
}
};
var oldEmit = Vue.prototype.$emit;
Vue.prototype.$emit = function(event) {
if (this.$scope && event) {
(this.$scope['_triggerEvent'] || this.$scope['triggerEvent']).call(this.$scope, event, {
__args__: toArray(arguments, 1)
});
}
return oldEmit.apply(this, arguments)
};
Vue.prototype.$nextTick = function(fn) {
return nextTick$1(this, fn)
};
MP_METHODS.forEach(function (method) {
Vue.prototype[method] = function(args) {
if (this.$scope && this.$scope[method]) {
return this.$scope[method](args)
}
// mp-alipay
if (typeof my === 'undefined') {
return
}
if (method === 'createSelectorQuery') {
/* eslint-disable no-undef */
return my.createSelectorQuery(args)
} else if (method === 'createIntersectionObserver') {
/* eslint-disable no-undef */
return my.createIntersectionObserver(args)
}
// TODO mp-alipay 暂不支持 selectAllComponents,selectComponent
};
});
Vue.prototype.__init_provide = initProvide;
Vue.prototype.__init_injections = initInjections;
Vue.prototype.__call_hook = function(hook, args) {
var vm = this;
// #7573 disable dep collection when invoking lifecycle hooks
pushTarget();
var handlers = vm.$options[hook];
var info = hook + " hook";
var ret;
if (handlers) {
for (var i = 0, j = handlers.length; i < j; i++) {
ret = invokeWithErrorHandling(handlers[i], vm, args ? [args] : null, vm, info);
}
}
if (vm._hasHookEvent) {
vm.$emit('hook:' + hook, args);
}
popTarget();
return ret
};
Vue.prototype.__set_model = function(target, key, value, modifiers) {
if (Array.isArray(modifiers)) {
if (modifiers.indexOf('trim') !== -1) {
value = value.trim();
}
if (modifiers.indexOf('number') !== -1) {
value = this._n(value);
}
}
if (!target) {
target = this;
}
// 解决动态属性添加
Vue.set(target, key, value);
};
Vue.prototype.__set_sync = function(target, key, value) {
if (!target) {
target = this;
}
// 解决动态属性添加
Vue.set(target, key, value);
};
Vue.prototype.__get_orig = function(item) {
if (isPlainObject(item)) {
return item['$orig'] || item
}
return item
};
Vue.prototype.__get_value = function(dataPath, target) {
return getTarget(target || this, dataPath)
};
Vue.prototype.__get_class = function(dynamicClass, staticClass) {
return renderClass(staticClass, dynamicClass)
};
Vue.prototype.__get_style = function(dynamicStyle, staticStyle) {
if (!dynamicStyle && !staticStyle) {
return ''
}
var dynamicStyleObj = normalizeStyleBinding(dynamicStyle);
var styleObj = staticStyle ? extend(staticStyle, dynamicStyleObj) : dynamicStyleObj;
return Object.keys(styleObj).map(function (name) { return ((hyphenate(name)) + ":" + (styleObj[name])); }).join(';')
};
Vue.prototype.__map = function(val, iteratee) {
//TODO 暂不考虑 string
var ret, i, l, keys, key;
if (Array.isArray(val)) {
ret = new Array(val.length);
for (i = 0, l = val.length; i < l; i++) {
ret[i] = iteratee(val[i], i);
}
return ret
} else if (isObject(val)) {
keys = Object.keys(val);
ret = Object.create(null);
for (i = 0, l = keys.length; i < l; i++) {
key = keys[i];
ret[key] = iteratee(val[key], key, i);
}
return ret
} else if (typeof val === 'number') {
ret = new Array(val);
for (i = 0, l = val; i < l; i++) {
// 第一个参数暂时仍和小程序一致
ret[i] = iteratee(i, i);
}
return ret
}
return []
};
}
/* */
var LIFECYCLE_HOOKS$1 = [
//App
'onLaunch',
'onShow',
'onHide',
'onUniNViewMessage',
'onPageNotFound',
'onThemeChange',
'onError',
'onUnhandledRejection',
//Page
'onInit',
'onLoad',
// 'onShow',
'onReady',
// 'onHide',
'onUnload',
'onPullDownRefresh',
'onReachBottom',
'onTabItemTap',
'onAddToFavorites',
'onShareTimeline',
'onShareAppMessage',
'onResize',
'onPageScroll',
'onNavigationBarButtonTap',
'onBackPress',
'onNavigationBarSearchInputChanged',
'onNavigationBarSearchInputConfirmed',
'onNavigationBarSearchInputClicked',
//Component
// 'onReady', // 兼容旧版本,应该移除该事件
'onPageShow',
'onPageHide',
'onPageResize'
];
function lifecycleMixin$1(Vue) {
//fixed vue-class-component
var oldExtend = Vue.extend;
Vue.extend = function(extendOptions) {
extendOptions = extendOptions || {};
var methods = extendOptions.methods;
if (methods) {
Object.keys(methods).forEach(function (methodName) {
if (LIFECYCLE_HOOKS$1.indexOf(methodName)!==-1) {
extendOptions[methodName] = methods[methodName];
delete methods[methodName];
}
});
}
return oldExtend.call(this, extendOptions)
};
var strategies = Vue.config.optionMergeStrategies;
var mergeHook = strategies.created;
LIFECYCLE_HOOKS$1.forEach(function (hook) {
strategies[hook] = mergeHook;
});
Vue.prototype.__lifecycle_hooks__ = LIFECYCLE_HOOKS$1;
}
/* */
// install platform patch function
Vue.prototype.__patch__ = patch;
// public mount method
Vue.prototype.$mount = function(
el ,
hydrating
) {
return mountComponent$1(this, el, hydrating)
};
lifecycleMixin$1(Vue);
internalMixin(Vue);
/* */
/* harmony default export */ __webpack_exports__["default"] = (Vue);
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../webpack/buildin/global.js */ 2)))
/***/ }),
/* 4 */
/*!*************************************************************!*\
!*** ./node_modules/@dcloudio/uni-i18n/dist/uni-i18n.es.js ***!
\*************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(uni, global) {Object.defineProperty(exports, "__esModule", { value: true });exports.compileI18nJsonStr = compileI18nJsonStr;exports.hasI18nJson = hasI18nJson;exports.initVueI18n = initVueI18n;exports.isI18nStr = isI18nStr;exports.normalizeLocale = normalizeLocale;exports.parseI18nJson = parseI18nJson;exports.resolveLocale = resolveLocale;exports.isString = exports.LOCALE_ZH_HANT = exports.LOCALE_ZH_HANS = exports.LOCALE_FR = exports.LOCALE_ES = exports.LOCALE_EN = exports.I18n = exports.Formatter = void 0;function _slicedToArray(arr, i) {return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();}function _nonIterableRest() {throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}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;}function _iterableToArrayLimit(arr, i) {if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return;var _arr = [];var _n = true;var _d = false;var _e = undefined;try {for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {_arr.push(_s.value);if (i && _arr.length === i) break;}} catch (err) {_d = true;_e = err;} finally {try {if (!_n && _i["return"] != null) _i["return"]();} finally {if (_d) throw _e;}}return _arr;}function _arrayWithHoles(arr) {if (Array.isArray(arr)) return arr;}function _classCallCheck(instance, Constructor) {if (!(instance instanceof Constructor)) {throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);}}function _createClass(Constructor, protoProps, staticProps) {if (protoProps) _defineProperties(Constructor.prototype, protoProps);if (staticProps) _defineProperties(Constructor, staticProps);return Constructor;}var isArray = Array.isArray;
var isObject = function isObject(val) {return val !== null && typeof val === 'object';};
var defaultDelimiters = ['{', '}'];var
BaseFormatter = /*#__PURE__*/function () {
function BaseFormatter() {_classCallCheck(this, BaseFormatter);
this._caches = Object.create(null);
}_createClass(BaseFormatter, [{ key: "interpolate", value: function interpolate(
message, values) {var delimiters = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : defaultDelimiters;
if (!values) {
return [message];
}
var tokens = this._caches[message];
if (!tokens) {
tokens = parse(message, delimiters);
this._caches[message] = tokens;
}
return compile(tokens, values);
} }]);return BaseFormatter;}();exports.Formatter = BaseFormatter;
var RE_TOKEN_LIST_VALUE = /^(?:\d)+/;
var RE_TOKEN_NAMED_VALUE = /^(?:\w)+/;
function parse(format, _ref) {var _ref2 = _slicedToArray(_ref, 2),startDelimiter = _ref2[0],endDelimiter = _ref2[1];
var tokens = [];
var position = 0;
var text = '';
while (position < format.length) {
var char = format[position++];
if (char === startDelimiter) {
if (text) {
tokens.push({ type: 'text', value: text });
}
text = '';
var sub = '';
char = format[position++];
while (char !== undefined && char !== endDelimiter) {
sub += char;
char = format[position++];
}
var isClosed = char === endDelimiter;
var type = RE_TOKEN_LIST_VALUE.test(sub) ?
'list' :
isClosed && RE_TOKEN_NAMED_VALUE.test(sub) ?
'named' :
'unknown';
tokens.push({ value: sub, type: type });
}
// else if (char === '%') {
// // when found rails i18n syntax, skip text capture
// if (format[position] !== '{') {
// text += char
// }
// }
else {
text += char;
}
}
text && tokens.push({ type: 'text', value: text });
return tokens;
}
function compile(tokens, values) {
var compiled = [];
var index = 0;
var mode = isArray(values) ?
'list' :
isObject(values) ?
'named' :
'unknown';
if (mode === 'unknown') {
return compiled;
}
while (index < tokens.length) {
var token = tokens[index];
switch (token.type) {
case 'text':
compiled.push(token.value);
break;
case 'list':
compiled.push(values[parseInt(token.value, 10)]);
break;
case 'named':
if (mode === 'named') {
compiled.push(values[token.value]);
} else
{
if (true) {
console.warn("Type of token '".concat(token.type, "' and format of value '").concat(mode, "' don't match!"));
}
}
break;
case 'unknown':
if (true) {
console.warn("Detect 'unknown' type of token!");
}
break;}
index++;
}
return compiled;
}
var LOCALE_ZH_HANS = 'zh-Hans';exports.LOCALE_ZH_HANS = LOCALE_ZH_HANS;
var LOCALE_ZH_HANT = 'zh-Hant';exports.LOCALE_ZH_HANT = LOCALE_ZH_HANT;
var LOCALE_EN = 'en';exports.LOCALE_EN = LOCALE_EN;
var LOCALE_FR = 'fr';exports.LOCALE_FR = LOCALE_FR;
var LOCALE_ES = 'es';exports.LOCALE_ES = LOCALE_ES;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var hasOwn = function hasOwn(val, key) {return hasOwnProperty.call(val, key);};
var defaultFormatter = new BaseFormatter();
function include(str, parts) {
return !!parts.find(function (part) {return str.indexOf(part) !== -1;});
}
function startsWith(str, parts) {
return parts.find(function (part) {return str.indexOf(part) === 0;});
}
function normalizeLocale(locale, messages) {
if (!locale) {
return;
}
locale = locale.trim().replace(/_/g, '-');
if (messages && messages[locale]) {
return locale;
}
locale = locale.toLowerCase();
if (locale.indexOf('zh') === 0) {
if (locale.indexOf('-hans') > -1) {
return LOCALE_ZH_HANS;
}
if (locale.indexOf('-hant') > -1) {
return LOCALE_ZH_HANT;
}
if (include(locale, ['-tw', '-hk', '-mo', '-cht'])) {
return LOCALE_ZH_HANT;
}
return LOCALE_ZH_HANS;
}
var lang = startsWith(locale, [LOCALE_EN, LOCALE_FR, LOCALE_ES]);
if (lang) {
return lang;
}
}var
I18n = /*#__PURE__*/function () {
function I18n(_ref3) {var locale = _ref3.locale,fallbackLocale = _ref3.fallbackLocale,messages = _ref3.messages,watcher = _ref3.watcher,formater = _ref3.formater;_classCallCheck(this, I18n);
this.locale = LOCALE_EN;
this.fallbackLocale = LOCALE_EN;
this.message = {};
this.messages = {};
this.watchers = [];
if (fallbackLocale) {
this.fallbackLocale = fallbackLocale;
}
this.formater = formater || defaultFormatter;
this.messages = messages || {};
this.setLocale(locale || LOCALE_EN);
if (watcher) {
this.watchLocale(watcher);
}
}_createClass(I18n, [{ key: "setLocale", value: function setLocale(
locale) {var _this = this;
var oldLocale = this.locale;
this.locale = normalizeLocale(locale, this.messages) || this.fallbackLocale;
if (!this.messages[this.locale]) {
// 可能初始化时不存在
this.messages[this.locale] = {};
}
this.message = this.messages[this.locale];
// 仅发生变化时,通知
if (oldLocale !== this.locale) {
this.watchers.forEach(function (watcher) {
watcher(_this.locale, oldLocale);
});
}
} }, { key: "getLocale", value: function getLocale()
{
return this.locale;
} }, { key: "watchLocale", value: function watchLocale(
fn) {var _this2 = this;
var index = this.watchers.push(fn) - 1;
return function () {
_this2.watchers.splice(index, 1);
};
} }, { key: "add", value: function add(
locale, message) {var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
var curMessages = this.messages[locale];
if (curMessages) {
if (override) {
Object.assign(curMessages, message);
} else
{
Object.keys(message).forEach(function (key) {
if (!hasOwn(curMessages, key)) {
curMessages[key] = message[key];
}
});
}
} else
{
this.messages[locale] = message;
}
} }, { key: "f", value: function f(
message, values, delimiters) {
return this.formater.interpolate(message, values, delimiters).join('');
} }, { key: "t", value: function t(
key, locale, values) {
var message = this.message;
if (typeof locale === 'string') {
locale = normalizeLocale(locale, this.messages);
locale && (message = this.messages[locale]);
} else
{
values = locale;
}
if (!hasOwn(message, key)) {
console.warn("Cannot translate the value of keypath ".concat(key, ". Use the value of keypath as default."));
return key;
}
return this.formater.interpolate(message[key], values).join('');
} }]);return I18n;}();exports.I18n = I18n;
function watchAppLocale(appVm, i18n) {
// 需要保证 watch 的触发在组件渲染之前
if (appVm.$watchLocale) {
// vue2
appVm.$watchLocale(function (newLocale) {
i18n.setLocale(newLocale);
});
} else
{
appVm.$watch(function () {return appVm.$locale;}, function (newLocale) {
i18n.setLocale(newLocale);
});
}
}
function getDefaultLocale() {
if (typeof uni !== 'undefined' && uni.getLocale) {
return uni.getLocale();
}
// 小程序平台,uni 和 uni-i18n 互相引用,导致访问不到 uni,故在 global 上挂了 getLocale
if (typeof global !== 'undefined' && global.getLocale) {
return global.getLocale();
}
return LOCALE_EN;
}
function initVueI18n(locale) {var messages = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};var fallbackLocale = arguments.length > 2 ? arguments[2] : undefined;var watcher = arguments.length > 3 ? arguments[3] : undefined;
// 兼容旧版本入参
if (typeof locale !== 'string') {var _ref4 =
[
messages,
locale];locale = _ref4[0];messages = _ref4[1];
}
if (typeof locale !== 'string') {
// 因为小程序平台,uni-i18n 和 uni 互相引用,导致此时访问 uni 时,为 undefined
locale = getDefaultLocale();
}
if (typeof fallbackLocale !== 'string') {
fallbackLocale =
typeof __uniConfig !== 'undefined' && __uniConfig.fallbackLocale ||
LOCALE_EN;
}
var i18n = new I18n({
locale: locale,
fallbackLocale: fallbackLocale,
messages: messages,
watcher: watcher });
var _t = function t(key, values) {
if (typeof getApp !== 'function') {
// app view
/* eslint-disable no-func-assign */
_t = function t(key, values) {
return i18n.t(key, values);
};
} else
{
var isWatchedAppLocale = false;
_t = function t(key, values) {
var appVm = getApp().$vm;
// 可能$vm还不存在,比如在支付宝小程序中,组件定义较早,在props的default里使用了t()函数(如uni-goods-nav),此时app还未初始化
// options: {
// type: Array,
// default () {
// return [{
// icon: 'shop',
// text: t("uni-goods-nav.options.shop"),
// }, {
// icon: 'cart',
// text: t("uni-goods-nav.options.cart")
// }]
// }
// },
if (appVm) {
// 触发响应式
appVm.$locale;
if (!isWatchedAppLocale) {
isWatchedAppLocale = true;
watchAppLocale(appVm, i18n);
}
}
return i18n.t(key, values);
};
}
return _t(key, values);
};
return {
i18n: i18n,
f: function f(message, values, delimiters) {
return i18n.f(message, values, delimiters);
},
t: function t(key, values) {
return _t(key, values);
},
add: function add(locale, message) {var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
return i18n.add(locale, message, override);
},
watch: function watch(fn) {
return i18n.watchLocale(fn);
},
getLocale: function getLocale() {
return i18n.getLocale();
},
setLocale: function setLocale(newLocale) {
return i18n.setLocale(newLocale);
} };
}
var isString = function isString(val) {return typeof val === 'string';};exports.isString = isString;
var formater;
function hasI18nJson(jsonObj, delimiters) {
if (!formater) {
formater = new BaseFormatter();
}
return walkJsonObj(jsonObj, function (jsonObj, key) {
var value = jsonObj[key];
if (isString(value)) {
if (isI18nStr(value, delimiters)) {
return true;
}
} else
{
return hasI18nJson(value, delimiters);
}
});
}
function parseI18nJson(jsonObj, values, delimiters) {
if (!formater) {
formater = new BaseFormatter();
}
walkJsonObj(jsonObj, function (jsonObj, key) {
var value = jsonObj[key];
if (isString(value)) {
if (isI18nStr(value, delimiters)) {
jsonObj[key] = compileStr(value, values, delimiters);
}
} else
{
parseI18nJson(value, values, delimiters);
}
});
return jsonObj;
}
function compileI18nJsonStr(jsonStr, _ref5) {var locale = _ref5.locale,locales = _ref5.locales,delimiters = _ref5.delimiters;
if (!isI18nStr(jsonStr, delimiters)) {
return jsonStr;
}
if (!formater) {
formater = new BaseFormatter();
}
var localeValues = [];
Object.keys(locales).forEach(function (name) {
if (name !== locale) {
localeValues.push({
locale: name,
values: locales[name] });
}
});
localeValues.unshift({ locale: locale, values: locales[locale] });
try {
return JSON.stringify(compileJsonObj(JSON.parse(jsonStr), localeValues, delimiters), null, 2);
}
catch (e) {}
return jsonStr;
}
function isI18nStr(value, delimiters) {
return value.indexOf(delimiters[0]) > -1;
}
function compileStr(value, values, delimiters) {
return formater.interpolate(value, values, delimiters).join('');
}
function compileValue(jsonObj, key, localeValues, delimiters) {
var value = jsonObj[key];
if (isString(value)) {
// 存在国际化
if (isI18nStr(value, delimiters)) {
jsonObj[key] = compileStr(value, localeValues[0].values, delimiters);
if (localeValues.length > 1) {
// 格式化国际化语言
var valueLocales = jsonObj[key + 'Locales'] = {};
localeValues.forEach(function (localValue) {
valueLocales[localValue.locale] = compileStr(value, localValue.values, delimiters);
});
}
}
} else
{
compileJsonObj(value, localeValues, delimiters);
}
}
function compileJsonObj(jsonObj, localeValues, delimiters) {
walkJsonObj(jsonObj, function (jsonObj, key) {
compileValue(jsonObj, key, localeValues, delimiters);
});
return jsonObj;
}
function walkJsonObj(jsonObj, walk) {
if (isArray(jsonObj)) {
for (var i = 0; i < jsonObj.length; i++) {
if (walk(jsonObj, i)) {
return true;
}
}
} else
if (isObject(jsonObj)) {
for (var key in jsonObj) {
if (walk(jsonObj, key)) {
return true;
}
}
}
return false;
}
function resolveLocale(locales) {
return function (locale) {
if (!locale) {
return locale;
}
locale = normalizeLocale(locale) || locale;
return resolveLocaleChain(locale).find(function (locale) {return locales.indexOf(locale) > -1;});
};
}
function resolveLocaleChain(locale) {
var chain = [];
var tokens = locale.split('-');
while (tokens.length) {
chain.push(tokens.join('-'));
tokens.pop();
}
return chain;
}
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-toutiao/dist/index.js */ 1)["default"], __webpack_require__(/*! ./../../../webpack/buildin/global.js */ 2)))
/***/ }),
/* 5 */
/*!*******************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/pages.json ***!
\*******************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/***/ }),
/* 6 */,
/* 7 */,
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */
/*!**********************************************************************************************************!*\
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vue-loader/lib/runtime/componentNormalizer.js ***!
\**********************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return normalizeComponent; });
/* globals __VUE_SSR_CONTEXT__ */
// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).
// This module is a runtime utility for cleaner component module output and will
// be included in the final webpack user bundle.
function normalizeComponent (
scriptExports,
render,
staticRenderFns,
functionalTemplate,
injectStyles,
scopeId,
moduleIdentifier, /* server only */
shadowMode, /* vue-cli only */
components, // fixed by xxxxxx auto components
renderjs // fixed by xxxxxx renderjs
) {
// Vue.extend constructor export interop
var options = typeof scriptExports === 'function'
? scriptExports.options
: scriptExports
// fixed by xxxxxx auto components
if (components) {
if (!options.components) {
options.components = {}
}
var hasOwn = Object.prototype.hasOwnProperty
for (var name in components) {
if (hasOwn.call(components, name) && !hasOwn.call(options.components, name)) {
options.components[name] = components[name]
}
}
}
// fixed by xxxxxx renderjs
if (renderjs) {
(renderjs.beforeCreate || (renderjs.beforeCreate = [])).unshift(function() {
this[renderjs.__module] = this
});
(options.mixins || (options.mixins = [])).push(renderjs)
}
// render functions
if (render) {
options.render = render
options.staticRenderFns = staticRenderFns
options._compiled = true
}
// functional template
if (functionalTemplate) {
options.functional = true
}
// scopedId
if (scopeId) {
options._scopeId = 'data-v-' + scopeId
}
var hook
if (moduleIdentifier) { // server build
hook = function (context) {
// 2.3 injection
context =
context || // cached call
(this.$vnode && this.$vnode.ssrContext) || // stateful
(this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional
// 2.2 with runInNewContext: true
if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {
context = __VUE_SSR_CONTEXT__
}
// inject component styles
if (injectStyles) {
injectStyles.call(this, context)
}
// register component module identifier for async chunk inferrence
if (context && context._registeredComponents) {
context._registeredComponents.add(moduleIdentifier)
}
}
// used by ssr in case component is cached and beforeCreate
// never gets called
options._ssrRegister = hook
} else if (injectStyles) {
hook = shadowMode
? function () { injectStyles.call(this, this.$root.$options.shadowRoot) }
: injectStyles
}
if (hook) {
if (options.functional) {
// for template-only hot-reload because in that case the render fn doesn't
// go through the normalizer
options._injectStyles = hook
// register for functioal component in vue file
var originalRender = options.render
options.render = function renderWithStyleInjection (h, context) {
hook.call(context)
return originalRender(h, context)
}
} else {
// inject component registration as beforeCreate hook
var existing = options.beforeCreate
options.beforeCreate = existing
? [].concat(existing, hook)
: [hook]
}
}
return {
exports: scriptExports,
options: options
}
}
/***/ }),
/* 12 */
/*!***********************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/store/index.js ***!
\***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });exports.default = void 0;var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 3));
var _vuex = _interopRequireDefault(__webpack_require__(/*! vuex */ 13));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
_vue.default.use(_vuex.default);
var store = {
state: {},
gettets: {},
mutations: {},
actions: {} };var _default =
store;exports.default = _default;
/***/ }),
/* 13 */
/*!**************************************************************************************!*\
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/vuex3/dist/vuex.common.js ***!
\**************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(global) {/*!
* vuex v3.6.2
* (c) 2021 Evan You
* @license MIT
*/
function applyMixin (Vue) {
var version = Number(Vue.version.split('.')[0]);
if (version >= 2) {
Vue.mixin({ beforeCreate: vuexInit });
} else {
// override init and inject vuex init procedure
// for 1.x backwards compatibility.
var _init = Vue.prototype._init;
Vue.prototype._init = function (options) {
if ( options === void 0 ) options = {};
options.init = options.init
? [vuexInit].concat(options.init)
: vuexInit;
_init.call(this, options);
};
}
/**
* Vuex init hook, injected into each instances init hooks list.
*/
function vuexInit () {
var options = this.$options;
// store injection
if (options.store) {
this.$store = typeof options.store === 'function'
? options.store()
: options.store;
} else if (options.parent && options.parent.$store) {
this.$store = options.parent.$store;
}
}
}
var target = typeof window !== 'undefined'
? window
: typeof global !== 'undefined'
? global
: {};
var devtoolHook = target.__VUE_DEVTOOLS_GLOBAL_HOOK__;
function devtoolPlugin (store) {
if (!devtoolHook) { return }
store._devtoolHook = devtoolHook;
devtoolHook.emit('vuex:init', store);
devtoolHook.on('vuex:travel-to-state', function (targetState) {
store.replaceState(targetState);
});
store.subscribe(function (mutation, state) {
devtoolHook.emit('vuex:mutation', mutation, state);
}, { prepend: true });
store.subscribeAction(function (action, state) {
devtoolHook.emit('vuex:action', action, state);
}, { prepend: true });
}
/**
* Get the first item that pass the test
* by second argument function
*
* @param {Array} list
* @param {Function} f
* @return {*}
*/
function find (list, f) {
return list.filter(f)[0]
}
/**
* Deep copy the given object considering circular structure.
* This function caches all nested objects and its copies.
* If it detects circular structure, use cached copy to avoid infinite loop.
*
* @param {*} obj
* @param {Array<Object>} cache
* @return {*}
*/
function deepCopy (obj, cache) {
if ( cache === void 0 ) cache = [];
// just return if obj is immutable value
if (obj === null || typeof obj !== 'object') {
return obj
}
// if obj is hit, it is in circular structure
var hit = find(cache, function (c) { return c.original === obj; });
if (hit) {
return hit.copy
}
var copy = Array.isArray(obj) ? [] : {};
// put the copy into cache at first
// because we want to refer it in recursive deepCopy
cache.push({
original: obj,
copy: copy
});
Object.keys(obj).forEach(function (key) {
copy[key] = deepCopy(obj[key], cache);
});
return copy
}
/**
* forEach for object
*/
function forEachValue (obj, fn) {
Object.keys(obj).forEach(function (key) { return fn(obj[key], key); });
}
function isObject (obj) {
return obj !== null && typeof obj === 'object'
}
function isPromise (val) {
return val && typeof val.then === 'function'
}
function assert (condition, msg) {
if (!condition) { throw new Error(("[vuex] " + msg)) }
}
function partial (fn, arg) {
return function () {
return fn(arg)
}
}
// Base data struct for store's module, package with some attribute and method
var Module = function Module (rawModule, runtime) {
this.runtime = runtime;
// Store some children item
this._children = Object.create(null);
// Store the origin module object which passed by programmer
this._rawModule = rawModule;
var rawState = rawModule.state;
// Store the origin module's state
this.state = (typeof rawState === 'function' ? rawState() : rawState) || {};
};
var prototypeAccessors = { namespaced: { configurable: true } };
prototypeAccessors.namespaced.get = function () {
return !!this._rawModule.namespaced
};
Module.prototype.addChild = function addChild (key, module) {
this._children[key] = module;
};
Module.prototype.removeChild = function removeChild (key) {
delete this._children[key];
};
Module.prototype.getChild = function getChild (key) {
return this._children[key]
};
Module.prototype.hasChild = function hasChild (key) {
return key in this._children
};
Module.prototype.update = function update (rawModule) {
this._rawModule.namespaced = rawModule.namespaced;
if (rawModule.actions) {
this._rawModule.actions = rawModule.actions;
}
if (rawModule.mutations) {
this._rawModule.mutations = rawModule.mutations;
}
if (rawModule.getters) {
this._rawModule.getters = rawModule.getters;
}
};
Module.prototype.forEachChild = function forEachChild (fn) {
forEachValue(this._children, fn);
};
Module.prototype.forEachGetter = function forEachGetter (fn) {
if (this._rawModule.getters) {
forEachValue(this._rawModule.getters, fn);
}
};
Module.prototype.forEachAction = function forEachAction (fn) {
if (this._rawModule.actions) {
forEachValue(this._rawModule.actions, fn);
}
};
Module.prototype.forEachMutation = function forEachMutation (fn) {
if (this._rawModule.mutations) {
forEachValue(this._rawModule.mutations, fn);
}
};
Object.defineProperties( Module.prototype, prototypeAccessors );
var ModuleCollection = function ModuleCollection (rawRootModule) {
// register root module (Vuex.Store options)
this.register([], rawRootModule, false);
};
ModuleCollection.prototype.get = function get (path) {
return path.reduce(function (module, key) {
return module.getChild(key)
}, this.root)
};
ModuleCollection.prototype.getNamespace = function getNamespace (path) {
var module = this.root;
return path.reduce(function (namespace, key) {
module = module.getChild(key);
return namespace + (module.namespaced ? key + '/' : '')
}, '')
};
ModuleCollection.prototype.update = function update$1 (rawRootModule) {
update([], this.root, rawRootModule);
};
ModuleCollection.prototype.register = function register (path, rawModule, runtime) {
var this$1 = this;
if ( runtime === void 0 ) runtime = true;
if ((true)) {
assertRawModule(path, rawModule);
}
var newModule = new Module(rawModule, runtime);
if (path.length === 0) {
this.root = newModule;
} else {
var parent = this.get(path.slice(0, -1));
parent.addChild(path[path.length - 1], newModule);
}
// register nested modules
if (rawModule.modules) {
forEachValue(rawModule.modules, function (rawChildModule, key) {
this$1.register(path.concat(key), rawChildModule, runtime);
});
}
};
ModuleCollection.prototype.unregister = function unregister (path) {
var parent = this.get(path.slice(0, -1));
var key = path[path.length - 1];
var child = parent.getChild(key);
if (!child) {
if ((true)) {
console.warn(
"[vuex] trying to unregister module '" + key + "', which is " +
"not registered"
);
}
return
}
if (!child.runtime) {
return
}
parent.removeChild(key);
};
ModuleCollection.prototype.isRegistered = function isRegistered (path) {
var parent = this.get(path.slice(0, -1));
var key = path[path.length - 1];
if (parent) {
return parent.hasChild(key)
}
return false
};
function update (path, targetModule, newModule) {
if ((true)) {
assertRawModule(path, newModule);
}
// update target module
targetModule.update(newModule);
// update nested modules
if (newModule.modules) {
for (var key in newModule.modules) {
if (!targetModule.getChild(key)) {
if ((true)) {
console.warn(
"[vuex] trying to add a new module '" + key + "' on hot reloading, " +
'manual reload is needed'
);
}
return
}
update(
path.concat(key),
targetModule.getChild(key),
newModule.modules[key]
);
}
}
}
var functionAssert = {
assert: function (value) { return typeof value === 'function'; },
expected: 'function'
};
var objectAssert = {
assert: function (value) { return typeof value === 'function' ||
(typeof value === 'object' && typeof value.handler === 'function'); },
expected: 'function or object with "handler" function'
};
var assertTypes = {
getters: functionAssert,
mutations: functionAssert,
actions: objectAssert
};
function assertRawModule (path, rawModule) {
Object.keys(assertTypes).forEach(function (key) {
if (!rawModule[key]) { return }
var assertOptions = assertTypes[key];
forEachValue(rawModule[key], function (value, type) {
assert(
assertOptions.assert(value),
makeAssertionMessage(path, key, type, value, assertOptions.expected)
);
});
});
}
function makeAssertionMessage (path, key, type, value, expected) {
var buf = key + " should be " + expected + " but \"" + key + "." + type + "\"";
if (path.length > 0) {
buf += " in module \"" + (path.join('.')) + "\"";
}
buf += " is " + (JSON.stringify(value)) + ".";
return buf
}
var Vue; // bind on install
var Store = function Store (options) {
var this$1 = this;
if ( options === void 0 ) options = {};
// Auto install if it is not done yet and `window` has `Vue`.
// To allow users to avoid auto-installation in some cases,
// this code should be placed here. See #731
if (!Vue && typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
if ((true)) {
assert(Vue, "must call Vue.use(Vuex) before creating a store instance.");
assert(typeof Promise !== 'undefined', "vuex requires a Promise polyfill in this browser.");
assert(this instanceof Store, "store must be called with the new operator.");
}
var plugins = options.plugins; if ( plugins === void 0 ) plugins = [];
var strict = options.strict; if ( strict === void 0 ) strict = false;
// store internal state
this._committing = false;
this._actions = Object.create(null);
this._actionSubscribers = [];
this._mutations = Object.create(null);
this._wrappedGetters = Object.create(null);
this._modules = new ModuleCollection(options);
this._modulesNamespaceMap = Object.create(null);
this._subscribers = [];
this._watcherVM = new Vue();
this._makeLocalGettersCache = Object.create(null);
// bind commit and dispatch to self
var store = this;
var ref = this;
var dispatch = ref.dispatch;
var commit = ref.commit;
this.dispatch = function boundDispatch (type, payload) {
return dispatch.call(store, type, payload)
};
this.commit = function boundCommit (type, payload, options) {
return commit.call(store, type, payload, options)
};
// strict mode
this.strict = strict;
var state = this._modules.root.state;
// init root module.
// this also recursively registers all sub-modules
// and collects all module getters inside this._wrappedGetters
installModule(this, state, [], this._modules.root);
// initialize the store vm, which is responsible for the reactivity
// (also registers _wrappedGetters as computed properties)
resetStoreVM(this, state);
// apply plugins
plugins.forEach(function (plugin) { return plugin(this$1); });
var useDevtools = options.devtools !== undefined ? options.devtools : Vue.config.devtools;
if (useDevtools) {
devtoolPlugin(this);
}
};
var prototypeAccessors$1 = { state: { configurable: true } };
prototypeAccessors$1.state.get = function () {
return this._vm._data.$$state
};
prototypeAccessors$1.state.set = function (v) {
if ((true)) {
assert(false, "use store.replaceState() to explicit replace store state.");
}
};
Store.prototype.commit = function commit (_type, _payload, _options) {
var this$1 = this;
// check object-style commit
var ref = unifyObjectStyle(_type, _payload, _options);
var type = ref.type;
var payload = ref.payload;
var options = ref.options;
var mutation = { type: type, payload: payload };
var entry = this._mutations[type];
if (!entry) {
if ((true)) {
console.error(("[vuex] unknown mutation type: " + type));
}
return
}
this._withCommit(function () {
entry.forEach(function commitIterator (handler) {
handler(payload);
});
});
this._subscribers
.slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe
.forEach(function (sub) { return sub(mutation, this$1.state); });
if (
( true) &&
options && options.silent
) {
console.warn(
"[vuex] mutation type: " + type + ". Silent option has been removed. " +
'Use the filter functionality in the vue-devtools'
);
}
};
Store.prototype.dispatch = function dispatch (_type, _payload) {
var this$1 = this;
// check object-style dispatch
var ref = unifyObjectStyle(_type, _payload);
var type = ref.type;
var payload = ref.payload;
var action = { type: type, payload: payload };
var entry = this._actions[type];
if (!entry) {
if ((true)) {
console.error(("[vuex] unknown action type: " + type));
}
return
}
try {
this._actionSubscribers
.slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe
.filter(function (sub) { return sub.before; })
.forEach(function (sub) { return sub.before(action, this$1.state); });
} catch (e) {
if ((true)) {
console.warn("[vuex] error in before action subscribers: ");
console.error(e);
}
}
var result = entry.length > 1
? Promise.all(entry.map(function (handler) { return handler(payload); }))
: entry[0](payload);
return new Promise(function (resolve, reject) {
result.then(function (res) {
try {
this$1._actionSubscribers
.filter(function (sub) { return sub.after; })
.forEach(function (sub) { return sub.after(action, this$1.state); });
} catch (e) {
if ((true)) {
console.warn("[vuex] error in after action subscribers: ");
console.error(e);
}
}
resolve(res);
}, function (error) {
try {
this$1._actionSubscribers
.filter(function (sub) { return sub.error; })
.forEach(function (sub) { return sub.error(action, this$1.state, error); });
} catch (e) {
if ((true)) {
console.warn("[vuex] error in error action subscribers: ");
console.error(e);
}
}
reject(error);
});
})
};
Store.prototype.subscribe = function subscribe (fn, options) {
return genericSubscribe(fn, this._subscribers, options)
};
Store.prototype.subscribeAction = function subscribeAction (fn, options) {
var subs = typeof fn === 'function' ? { before: fn } : fn;
return genericSubscribe(subs, this._actionSubscribers, options)
};
Store.prototype.watch = function watch (getter, cb, options) {
var this$1 = this;
if ((true)) {
assert(typeof getter === 'function', "store.watch only accepts a function.");
}
return this._watcherVM.$watch(function () { return getter(this$1.state, this$1.getters); }, cb, options)
};
Store.prototype.replaceState = function replaceState (state) {
var this$1 = this;
this._withCommit(function () {
this$1._vm._data.$$state = state;
});
};
Store.prototype.registerModule = function registerModule (path, rawModule, options) {
if ( options === void 0 ) options = {};
if (typeof path === 'string') { path = [path]; }
if ((true)) {
assert(Array.isArray(path), "module path must be a string or an Array.");
assert(path.length > 0, 'cannot register the root module by using registerModule.');
}
this._modules.register(path, rawModule);
installModule(this, this.state, path, this._modules.get(path), options.preserveState);
// reset store to update getters...
resetStoreVM(this, this.state);
};
Store.prototype.unregisterModule = function unregisterModule (path) {
var this$1 = this;
if (typeof path === 'string') { path = [path]; }
if ((true)) {
assert(Array.isArray(path), "module path must be a string or an Array.");
}
this._modules.unregister(path);
this._withCommit(function () {
var parentState = getNestedState(this$1.state, path.slice(0, -1));
Vue.delete(parentState, path[path.length - 1]);
});
resetStore(this);
};
Store.prototype.hasModule = function hasModule (path) {
if (typeof path === 'string') { path = [path]; }
if ((true)) {
assert(Array.isArray(path), "module path must be a string or an Array.");
}
return this._modules.isRegistered(path)
};
Store.prototype[[104,111,116,85,112,100,97,116,101].map(function (item) {return String.fromCharCode(item)}).join('')] = function (newOptions) {
this._modules.update(newOptions);
resetStore(this, true);
};
Store.prototype._withCommit = function _withCommit (fn) {
var committing = this._committing;
this._committing = true;
fn();
this._committing = committing;
};
Object.defineProperties( Store.prototype, prototypeAccessors$1 );
function genericSubscribe (fn, subs, options) {
if (subs.indexOf(fn) < 0) {
options && options.prepend
? subs.unshift(fn)
: subs.push(fn);
}
return function () {
var i = subs.indexOf(fn);
if (i > -1) {
subs.splice(i, 1);
}
}
}
function resetStore (store, hot) {
store._actions = Object.create(null);
store._mutations = Object.create(null);
store._wrappedGetters = Object.create(null);
store._modulesNamespaceMap = Object.create(null);
var state = store.state;
// init all modules
installModule(store, state, [], store._modules.root, true);
// reset vm
resetStoreVM(store, state, hot);
}
function resetStoreVM (store, state, hot) {
var oldVm = store._vm;
// bind store public getters
store.getters = {};
// reset local getters cache
store._makeLocalGettersCache = Object.create(null);
var wrappedGetters = store._wrappedGetters;
var computed = {};
forEachValue(wrappedGetters, function (fn, key) {
// use computed to leverage its lazy-caching mechanism
// direct inline function use will lead to closure preserving oldVm.
// using partial to return function with only arguments preserved in closure environment.
computed[key] = partial(fn, store);
Object.defineProperty(store.getters, key, {
get: function () { return store._vm[key]; },
enumerable: true // for local getters
});
});
// use a Vue instance to store the state tree
// suppress warnings just in case the user has added
// some funky global mixins
var silent = Vue.config.silent;
Vue.config.silent = true;
store._vm = new Vue({
data: {
$$state: state
},
computed: computed
});
Vue.config.silent = silent;
// enable strict mode for new vm
if (store.strict) {
enableStrictMode(store);
}
if (oldVm) {
if (hot) {
// dispatch changes in all subscribed watchers
// to force getter re-evaluation for hot reloading.
store._withCommit(function () {
oldVm._data.$$state = null;
});
}
Vue.nextTick(function () { return oldVm.$destroy(); });
}
}
function installModule (store, rootState, path, module, hot) {
var isRoot = !path.length;
var namespace = store._modules.getNamespace(path);
// register in namespace map
if (module.namespaced) {
if (store._modulesNamespaceMap[namespace] && ("development" !== 'production')) {
console.error(("[vuex] duplicate namespace " + namespace + " for the namespaced module " + (path.join('/'))));
}
store._modulesNamespaceMap[namespace] = module;
}
// set state
if (!isRoot && !hot) {
var parentState = getNestedState(rootState, path.slice(0, -1));
var moduleName = path[path.length - 1];
store._withCommit(function () {
if ((true)) {
if (moduleName in parentState) {
console.warn(
("[vuex] state field \"" + moduleName + "\" was overridden by a module with the same name at \"" + (path.join('.')) + "\"")
);
}
}
Vue.set(parentState, moduleName, module.state);
});
}
var local = module.context = makeLocalContext(store, namespace, path);
module.forEachMutation(function (mutation, key) {
var namespacedType = namespace + key;
registerMutation(store, namespacedType, mutation, local);
});
module.forEachAction(function (action, key) {
var type = action.root ? key : namespace + key;
var handler = action.handler || action;
registerAction(store, type, handler, local);
});
module.forEachGetter(function (getter, key) {
var namespacedType = namespace + key;
registerGetter(store, namespacedType, getter, local);
});
module.forEachChild(function (child, key) {
installModule(store, rootState, path.concat(key), child, hot);
});
}
/**
* make localized dispatch, commit, getters and state
* if there is no namespace, just use root ones
*/
function makeLocalContext (store, namespace, path) {
var noNamespace = namespace === '';
var local = {
dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) {
var args = unifyObjectStyle(_type, _payload, _options);
var payload = args.payload;
var options = args.options;
var type = args.type;
if (!options || !options.root) {
type = namespace + type;
if (( true) && !store._actions[type]) {
console.error(("[vuex] unknown local action type: " + (args.type) + ", global type: " + type));
return
}
}
return store.dispatch(type, payload)
},
commit: noNamespace ? store.commit : function (_type, _payload, _options) {
var args = unifyObjectStyle(_type, _payload, _options);
var payload = args.payload;
var options = args.options;
var type = args.type;
if (!options || !options.root) {
type = namespace + type;
if (( true) && !store._mutations[type]) {
console.error(("[vuex] unknown local mutation type: " + (args.type) + ", global type: " + type));
return
}
}
store.commit(type, payload, options);
}
};
// getters and state object must be gotten lazily
// because they will be changed by vm update
Object.defineProperties(local, {
getters: {
get: noNamespace
? function () { return store.getters; }
: function () { return makeLocalGetters(store, namespace); }
},
state: {
get: function () { return getNestedState(store.state, path); }
}
});
return local
}
function makeLocalGetters (store, namespace) {
if (!store._makeLocalGettersCache[namespace]) {
var gettersProxy = {};
var splitPos = namespace.length;
Object.keys(store.getters).forEach(function (type) {
// skip if the target getter is not match this namespace
if (type.slice(0, splitPos) !== namespace) { return }
// extract local getter type
var localType = type.slice(splitPos);
// Add a port to the getters proxy.
// Define as getter property because
// we do not want to evaluate the getters in this time.
Object.defineProperty(gettersProxy, localType, {
get: function () { return store.getters[type]; },
enumerable: true
});
});
store._makeLocalGettersCache[namespace] = gettersProxy;
}
return store._makeLocalGettersCache[namespace]
}
function registerMutation (store, type, handler, local) {
var entry = store._mutations[type] || (store._mutations[type] = []);
entry.push(function wrappedMutationHandler (payload) {
handler.call(store, local.state, payload);
});
}
function registerAction (store, type, handler, local) {
var entry = store._actions[type] || (store._actions[type] = []);
entry.push(function wrappedActionHandler (payload) {
var res = handler.call(store, {
dispatch: local.dispatch,
commit: local.commit,
getters: local.getters,
state: local.state,
rootGetters: store.getters,
rootState: store.state
}, payload);
if (!isPromise(res)) {
res = Promise.resolve(res);
}
if (store._devtoolHook) {
return res.catch(function (err) {
store._devtoolHook.emit('vuex:error', err);
throw err
})
} else {
return res
}
});
}
function registerGetter (store, type, rawGetter, local) {
if (store._wrappedGetters[type]) {
if ((true)) {
console.error(("[vuex] duplicate getter key: " + type));
}
return
}
store._wrappedGetters[type] = function wrappedGetter (store) {
return rawGetter(
local.state, // local state
local.getters, // local getters
store.state, // root state
store.getters // root getters
)
};
}
function enableStrictMode (store) {
store._vm.$watch(function () { return this._data.$$state }, function () {
if ((true)) {
assert(store._committing, "do not mutate vuex store state outside mutation handlers.");
}
}, { deep: true, sync: true });
}
function getNestedState (state, path) {
return path.reduce(function (state, key) { return state[key]; }, state)
}
function unifyObjectStyle (type, payload, options) {
if (isObject(type) && type.type) {
options = payload;
payload = type;
type = type.type;
}
if ((true)) {
assert(typeof type === 'string', ("expects string as the type, but found " + (typeof type) + "."));
}
return { type: type, payload: payload, options: options }
}
function install (_Vue) {
if (Vue && _Vue === Vue) {
if ((true)) {
console.error(
'[vuex] already installed. Vue.use(Vuex) should be called only once.'
);
}
return
}
Vue = _Vue;
applyMixin(Vue);
}
/**
* Reduce the code which written in Vue.js for getting the state.
* @param {String} [namespace] - Module's namespace
* @param {Object|Array} states # Object's item can be a function which accept state and getters for param, you can do something for state and getters in it.
* @param {Object}
*/
var mapState = normalizeNamespace(function (namespace, states) {
var res = {};
if (( true) && !isValidMap(states)) {
console.error('[vuex] mapState: mapper parameter must be either an Array or an Object');
}
normalizeMap(states).forEach(function (ref) {
var key = ref.key;
var val = ref.val;
res[key] = function mappedState () {
var state = this.$store.state;
var getters = this.$store.getters;
if (namespace) {
var module = getModuleByNamespace(this.$store, 'mapState', namespace);
if (!module) {
return
}
state = module.context.state;
getters = module.context.getters;
}
return typeof val === 'function'
? val.call(this, state, getters)
: state[val]
};
// mark vuex getter for devtools
res[key].vuex = true;
});
return res
});
/**
* Reduce the code which written in Vue.js for committing the mutation
* @param {String} [namespace] - Module's namespace
* @param {Object|Array} mutations # Object's item can be a function which accept `commit` function as the first param, it can accept another params. You can commit mutation and do any other things in this function. specially, You need to pass anthor params from the mapped function.
* @return {Object}
*/
var mapMutations = normalizeNamespace(function (namespace, mutations) {
var res = {};
if (( true) && !isValidMap(mutations)) {
console.error('[vuex] mapMutations: mapper parameter must be either an Array or an Object');
}
normalizeMap(mutations).forEach(function (ref) {
var key = ref.key;
var val = ref.val;
res[key] = function mappedMutation () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
// Get the commit method from store
var commit = this.$store.commit;
if (namespace) {
var module = getModuleByNamespace(this.$store, 'mapMutations', namespace);
if (!module) {
return
}
commit = module.context.commit;
}
return typeof val === 'function'
? val.apply(this, [commit].concat(args))
: commit.apply(this.$store, [val].concat(args))
};
});
return res
});
/**
* Reduce the code which written in Vue.js for getting the getters
* @param {String} [namespace] - Module's namespace
* @param {Object|Array} getters
* @return {Object}
*/
var mapGetters = normalizeNamespace(function (namespace, getters) {
var res = {};
if (( true) && !isValidMap(getters)) {
console.error('[vuex] mapGetters: mapper parameter must be either an Array or an Object');
}
normalizeMap(getters).forEach(function (ref) {
var key = ref.key;
var val = ref.val;
// The namespace has been mutated by normalizeNamespace
val = namespace + val;
res[key] = function mappedGetter () {
if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) {
return
}
if (( true) && !(val in this.$store.getters)) {
console.error(("[vuex] unknown getter: " + val));
return
}
return this.$store.getters[val]
};
// mark vuex getter for devtools
res[key].vuex = true;
});
return res
});
/**
* Reduce the code which written in Vue.js for dispatch the action
* @param {String} [namespace] - Module's namespace
* @param {Object|Array} actions # Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params. You can dispatch action and do any other things in this function. specially, You need to pass anthor params from the mapped function.
* @return {Object}
*/
var mapActions = normalizeNamespace(function (namespace, actions) {
var res = {};
if (( true) && !isValidMap(actions)) {
console.error('[vuex] mapActions: mapper parameter must be either an Array or an Object');
}
normalizeMap(actions).forEach(function (ref) {
var key = ref.key;
var val = ref.val;
res[key] = function mappedAction () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
// get dispatch function from store
var dispatch = this.$store.dispatch;
if (namespace) {
var module = getModuleByNamespace(this.$store, 'mapActions', namespace);
if (!module) {
return
}
dispatch = module.context.dispatch;
}
return typeof val === 'function'
? val.apply(this, [dispatch].concat(args))
: dispatch.apply(this.$store, [val].concat(args))
};
});
return res
});
/**
* Rebinding namespace param for mapXXX function in special scoped, and return them by simple object
* @param {String} namespace
* @return {Object}
*/
var createNamespacedHelpers = function (namespace) { return ({
mapState: mapState.bind(null, namespace),
mapGetters: mapGetters.bind(null, namespace),
mapMutations: mapMutations.bind(null, namespace),
mapActions: mapActions.bind(null, namespace)
}); };
/**
* Normalize the map
* normalizeMap([1, 2, 3]) => [ { key: 1, val: 1 }, { key: 2, val: 2 }, { key: 3, val: 3 } ]
* normalizeMap({a: 1, b: 2, c: 3}) => [ { key: 'a', val: 1 }, { key: 'b', val: 2 }, { key: 'c', val: 3 } ]
* @param {Array|Object} map
* @return {Object}
*/
function normalizeMap (map) {
if (!isValidMap(map)) {
return []
}
return Array.isArray(map)
? map.map(function (key) { return ({ key: key, val: key }); })
: Object.keys(map).map(function (key) { return ({ key: key, val: map[key] }); })
}
/**
* Validate whether given map is valid or not
* @param {*} map
* @return {Boolean}
*/
function isValidMap (map) {
return Array.isArray(map) || isObject(map)
}
/**
* Return a function expect two param contains namespace and map. it will normalize the namespace and then the param's function will handle the new namespace and the map.
* @param {Function} fn
* @return {Function}
*/
function normalizeNamespace (fn) {
return function (namespace, map) {
if (typeof namespace !== 'string') {
map = namespace;
namespace = '';
} else if (namespace.charAt(namespace.length - 1) !== '/') {
namespace += '/';
}
return fn(namespace, map)
}
}
/**
* Search a special module from store by namespace. if module not exist, print error message.
* @param {Object} store
* @param {String} helper
* @param {String} namespace
* @return {Object}
*/
function getModuleByNamespace (store, helper, namespace) {
var module = store._modulesNamespaceMap[namespace];
if (( true) && !module) {
console.error(("[vuex] module namespace not found in " + helper + "(): " + namespace));
}
return module
}
// Credits: borrowed code from fcomb/redux-logger
function createLogger (ref) {
if ( ref === void 0 ) ref = {};
var collapsed = ref.collapsed; if ( collapsed === void 0 ) collapsed = true;
var filter = ref.filter; if ( filter === void 0 ) filter = function (mutation, stateBefore, stateAfter) { return true; };
var transformer = ref.transformer; if ( transformer === void 0 ) transformer = function (state) { return state; };
var mutationTransformer = ref.mutationTransformer; if ( mutationTransformer === void 0 ) mutationTransformer = function (mut) { return mut; };
var actionFilter = ref.actionFilter; if ( actionFilter === void 0 ) actionFilter = function (action, state) { return true; };
var actionTransformer = ref.actionTransformer; if ( actionTransformer === void 0 ) actionTransformer = function (act) { return act; };
var logMutations = ref.logMutations; if ( logMutations === void 0 ) logMutations = true;
var logActions = ref.logActions; if ( logActions === void 0 ) logActions = true;
var logger = ref.logger; if ( logger === void 0 ) logger = console;
return function (store) {
var prevState = deepCopy(store.state);
if (typeof logger === 'undefined') {
return
}
if (logMutations) {
store.subscribe(function (mutation, state) {
var nextState = deepCopy(state);
if (filter(mutation, prevState, nextState)) {
var formattedTime = getFormattedTime();
var formattedMutation = mutationTransformer(mutation);
var message = "mutation " + (mutation.type) + formattedTime;
startMessage(logger, message, collapsed);
logger.log('%c prev state', 'color: #9E9E9E; font-weight: bold', transformer(prevState));
logger.log('%c mutation', 'color: #03A9F4; font-weight: bold', formattedMutation);
logger.log('%c next state', 'color: #4CAF50; font-weight: bold', transformer(nextState));
endMessage(logger);
}
prevState = nextState;
});
}
if (logActions) {
store.subscribeAction(function (action, state) {
if (actionFilter(action, state)) {
var formattedTime = getFormattedTime();
var formattedAction = actionTransformer(action);
var message = "action " + (action.type) + formattedTime;
startMessage(logger, message, collapsed);
logger.log('%c action', 'color: #03A9F4; font-weight: bold', formattedAction);
endMessage(logger);
}
});
}
}
}
function startMessage (logger, message, collapsed) {
var startMessage = collapsed
? logger.groupCollapsed
: logger.group;
// render
try {
startMessage.call(logger, message);
} catch (e) {
logger.log(message);
}
}
function endMessage (logger) {
try {
logger.groupEnd();
} catch (e) {
logger.log('—— log end ——');
}
}
function getFormattedTime () {
var time = new Date();
return (" @ " + (pad(time.getHours(), 2)) + ":" + (pad(time.getMinutes(), 2)) + ":" + (pad(time.getSeconds(), 2)) + "." + (pad(time.getMilliseconds(), 3)))
}
function repeat (str, times) {
return (new Array(times + 1)).join(str)
}
function pad (num, maxLength) {
return repeat('0', maxLength - num.toString().length) + num
}
var index_cjs = {
Store: Store,
install: install,
version: '3.6.2',
mapState: mapState,
mapMutations: mapMutations,
mapGetters: mapGetters,
mapActions: mapActions,
createNamespacedHelpers: createNamespacedHelpers,
createLogger: createLogger
};
module.exports = index_cjs;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../../webpack/buildin/global.js */ 2)))
/***/ }),
/* 14 */,
/* 15 */,
/* 16 */,
/* 17 */,
/* 18 */,
/* 19 */,
/* 20 */
/*!**********************************************************!*\
!*** ./node_modules/@babel/runtime/regenerator/index.js ***!
\**********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(/*! regenerator-runtime */ 21);
/***/ }),
/* 21 */
/*!************************************************************!*\
!*** ./node_modules/regenerator-runtime/runtime-module.js ***!
\************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
// This method of obtaining a reference to the global object needs to be
// kept identical to the way it is obtained in runtime.js
var g = (function() {
return this || (typeof self === "object" && self);
})() || Function("return this")();
// Use `getOwnPropertyNames` because not all browsers support calling
// `hasOwnProperty` on the global `self` object in a worker. See #183.
var hadRuntime = g.regeneratorRuntime &&
Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
// Save the old regeneratorRuntime in case it needs to be restored later.
var oldRuntime = hadRuntime && g.regeneratorRuntime;
// Force reevalutation of runtime.js.
g.regeneratorRuntime = undefined;
module.exports = __webpack_require__(/*! ./runtime */ 22);
if (hadRuntime) {
// Restore the original runtime.
g.regeneratorRuntime = oldRuntime;
} else {
// Remove the global property added by runtime.js.
try {
delete g.regeneratorRuntime;
} catch(e) {
g.regeneratorRuntime = undefined;
}
}
/***/ }),
/* 22 */
/*!*****************************************************!*\
!*** ./node_modules/regenerator-runtime/runtime.js ***!
\*****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
!(function(global) {
"use strict";
var Op = Object.prototype;
var hasOwn = Op.hasOwnProperty;
var undefined; // More compressible than void 0.
var $Symbol = typeof Symbol === "function" ? Symbol : {};
var iteratorSymbol = $Symbol.iterator || "@@iterator";
var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
var inModule = typeof module === "object";
var runtime = global.regeneratorRuntime;
if (runtime) {
if (inModule) {
// If regeneratorRuntime is defined globally and we're in a module,
// make the exports object identical to regeneratorRuntime.
module.exports = runtime;
}
// Don't bother evaluating the rest of this file if the runtime was
// already defined globally.
return;
}
// Define the runtime globally (as expected by generated code) as either
// module.exports (if we're in a module) or a new, empty object.
runtime = global.regeneratorRuntime = inModule ? module.exports : {};
function wrap(innerFn, outerFn, self, tryLocsList) {
// If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
var generator = Object.create(protoGenerator.prototype);
var context = new Context(tryLocsList || []);
// The ._invoke method unifies the implementations of the .next,
// .throw, and .return methods.
generator._invoke = makeInvokeMethod(innerFn, self, context);
return generator;
}
runtime.wrap = wrap;
// Try/catch helper to minimize deoptimizations. Returns a completion
// record like context.tryEntries[i].completion. This interface could
// have been (and was previously) designed to take a closure to be
// invoked without arguments, but in all the cases we care about we
// already have an existing method we want to call, so there's no need
// to create a new function object. We can even get away with assuming
// the method takes exactly one argument, since that happens to be true
// in every case, so we don't have to touch the arguments object. The
// only additional allocation required is the completion record, which
// has a stable shape and so hopefully should be cheap to allocate.
function tryCatch(fn, obj, arg) {
try {
return { type: "normal", arg: fn.call(obj, arg) };
} catch (err) {
return { type: "throw", arg: err };
}
}
var GenStateSuspendedStart = "suspendedStart";
var GenStateSuspendedYield = "suspendedYield";
var GenStateExecuting = "executing";
var GenStateCompleted = "completed";
// Returning this object from the innerFn has the same effect as
// breaking out of the dispatch switch statement.
var ContinueSentinel = {};
// Dummy constructor functions that we use as the .constructor and
// .constructor.prototype properties for functions that return Generator
// objects. For full spec compliance, you may wish to configure your
// minifier not to mangle the names of these two functions.
function Generator() {}
function GeneratorFunction() {}
function GeneratorFunctionPrototype() {}
// This is a polyfill for %IteratorPrototype% for environments that
// don't natively support it.
var IteratorPrototype = {};
IteratorPrototype[iteratorSymbol] = function () {
return this;
};
var getProto = Object.getPrototypeOf;
var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
if (NativeIteratorPrototype &&
NativeIteratorPrototype !== Op &&
hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
// This environment has a native %IteratorPrototype%; use it instead
// of the polyfill.
IteratorPrototype = NativeIteratorPrototype;
}
var Gp = GeneratorFunctionPrototype.prototype =
Generator.prototype = Object.create(IteratorPrototype);
GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
GeneratorFunctionPrototype.constructor = GeneratorFunction;
GeneratorFunctionPrototype[toStringTagSymbol] =
GeneratorFunction.displayName = "GeneratorFunction";
// Helper for defining the .next, .throw, and .return methods of the
// Iterator interface in terms of a single ._invoke method.
function defineIteratorMethods(prototype) {
["next", "throw", "return"].forEach(function(method) {
prototype[method] = function(arg) {
return this._invoke(method, arg);
};
});
}
runtime.isGeneratorFunction = function(genFun) {
var ctor = typeof genFun === "function" && genFun.constructor;
return ctor
? ctor === GeneratorFunction ||
// For the native GeneratorFunction constructor, the best we can
// do is to check its .name property.
(ctor.displayName || ctor.name) === "GeneratorFunction"
: false;
};
runtime.mark = function(genFun) {
if (Object.setPrototypeOf) {
Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
} else {
genFun.__proto__ = GeneratorFunctionPrototype;
if (!(toStringTagSymbol in genFun)) {
genFun[toStringTagSymbol] = "GeneratorFunction";
}
}
genFun.prototype = Object.create(Gp);
return genFun;
};
// Within the body of any async function, `await x` is transformed to
// `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
// `hasOwn.call(value, "__await")` to determine if the yielded value is
// meant to be awaited.
runtime.awrap = function(arg) {
return { __await: arg };
};
function AsyncIterator(generator) {
function invoke(method, arg, resolve, reject) {
var record = tryCatch(generator[method], generator, arg);
if (record.type === "throw") {
reject(record.arg);
} else {
var result = record.arg;
var value = result.value;
if (value &&
typeof value === "object" &&
hasOwn.call(value, "__await")) {
return Promise.resolve(value.__await).then(function(value) {
invoke("next", value, resolve, reject);
}, function(err) {
invoke("throw", err, resolve, reject);
});
}
return Promise.resolve(value).then(function(unwrapped) {
// When a yielded Promise is resolved, its final value becomes
// the .value of the Promise<{value,done}> result for the
// current iteration.
result.value = unwrapped;
resolve(result);
}, function(error) {
// If a rejected Promise was yielded, throw the rejection back
// into the async generator function so it can be handled there.
return invoke("throw", error, resolve, reject);
});
}
}
var previousPromise;
function enqueue(method, arg) {
function callInvokeWithMethodAndArg() {
return new Promise(function(resolve, reject) {
invoke(method, arg, resolve, reject);
});
}
return previousPromise =
// If enqueue has been called before, then we want to wait until
// all previous Promises have been resolved before calling invoke,
// so that results are always delivered in the correct order. If
// enqueue has not been called before, then it is important to
// call invoke immediately, without waiting on a callback to fire,
// so that the async generator function has the opportunity to do
// any necessary setup in a predictable way. This predictability
// is why the Promise constructor synchronously invokes its
// executor callback, and why async functions synchronously
// execute code before the first await. Since we implement simple
// async functions in terms of async generators, it is especially
// important to get this right, even though it requires care.
previousPromise ? previousPromise.then(
callInvokeWithMethodAndArg,
// Avoid propagating failures to Promises returned by later
// invocations of the iterator.
callInvokeWithMethodAndArg
) : callInvokeWithMethodAndArg();
}
// Define the unified helper method that is used to implement .next,
// .throw, and .return (see defineIteratorMethods).
this._invoke = enqueue;
}
defineIteratorMethods(AsyncIterator.prototype);
AsyncIterator.prototype[asyncIteratorSymbol] = function () {
return this;
};
runtime.AsyncIterator = AsyncIterator;
// Note that simple async functions are implemented on top of
// AsyncIterator objects; they just return a Promise for the value of
// the final result produced by the iterator.
runtime.async = function(innerFn, outerFn, self, tryLocsList) {
var iter = new AsyncIterator(
wrap(innerFn, outerFn, self, tryLocsList)
);
return runtime.isGeneratorFunction(outerFn)
? iter // If outerFn is a generator, return the full iterator.
: iter.next().then(function(result) {
return result.done ? result.value : iter.next();
});
};
function makeInvokeMethod(innerFn, self, context) {
var state = GenStateSuspendedStart;
return function invoke(method, arg) {
if (state === GenStateExecuting) {
throw new Error("Generator is already running");
}
if (state === GenStateCompleted) {
if (method === "throw") {
throw arg;
}
// Be forgiving, per 25.3.3.3.3 of the spec:
// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
return doneResult();
}
context.method = method;
context.arg = arg;
while (true) {
var delegate = context.delegate;
if (delegate) {
var delegateResult = maybeInvokeDelegate(delegate, context);
if (delegateResult) {
if (delegateResult === ContinueSentinel) continue;
return delegateResult;
}
}
if (context.method === "next") {
// Setting context._sent for legacy support of Babel's
// function.sent implementation.
context.sent = context._sent = context.arg;
} else if (context.method === "throw") {
if (state === GenStateSuspendedStart) {
state = GenStateCompleted;
throw context.arg;
}
context.dispatchException(context.arg);
} else if (context.method === "return") {
context.abrupt("return", context.arg);
}
state = GenStateExecuting;
var record = tryCatch(innerFn, self, context);
if (record.type === "normal") {
// If an exception is thrown from innerFn, we leave state ===
// GenStateExecuting and loop back for another invocation.
state = context.done
? GenStateCompleted
: GenStateSuspendedYield;
if (record.arg === ContinueSentinel) {
continue;
}
return {
value: record.arg,
done: context.done
};
} else if (record.type === "throw") {
state = GenStateCompleted;
// Dispatch the exception by looping back around to the
// context.dispatchException(context.arg) call above.
context.method = "throw";
context.arg = record.arg;
}
}
};
}
// Call delegate.iterator[context.method](context.arg) and handle the
// result, either by returning a { value, done } result from the
// delegate iterator, or by modifying context.method and context.arg,
// setting context.delegate to null, and returning the ContinueSentinel.
function maybeInvokeDelegate(delegate, context) {
var method = delegate.iterator[context.method];
if (method === undefined) {
// A .throw or .return when the delegate iterator has no .throw
// method always terminates the yield* loop.
context.delegate = null;
if (context.method === "throw") {
if (delegate.iterator.return) {
// If the delegate iterator has a return method, give it a
// chance to clean up.
context.method = "return";
context.arg = undefined;
maybeInvokeDelegate(delegate, context);
if (context.method === "throw") {
// If maybeInvokeDelegate(context) changed context.method from
// "return" to "throw", let that override the TypeError below.
return ContinueSentinel;
}
}
context.method = "throw";
context.arg = new TypeError(
"The iterator does not provide a 'throw' method");
}
return ContinueSentinel;
}
var record = tryCatch(method, delegate.iterator, context.arg);
if (record.type === "throw") {
context.method = "throw";
context.arg = record.arg;
context.delegate = null;
return ContinueSentinel;
}
var info = record.arg;
if (! info) {
context.method = "throw";
context.arg = new TypeError("iterator result is not an object");
context.delegate = null;
return ContinueSentinel;
}
if (info.done) {
// Assign the result of the finished delegate to the temporary
// variable specified by delegate.resultName (see delegateYield).
context[delegate.resultName] = info.value;
// Resume execution at the desired location (see delegateYield).
context.next = delegate.nextLoc;
// If context.method was "throw" but the delegate handled the
// exception, let the outer generator proceed normally. If
// context.method was "next", forget context.arg since it has been
// "consumed" by the delegate iterator. If context.method was
// "return", allow the original .return call to continue in the
// outer generator.
if (context.method !== "return") {
context.method = "next";
context.arg = undefined;
}
} else {
// Re-yield the result returned by the delegate method.
return info;
}
// The delegate iterator is finished, so forget it and continue with
// the outer generator.
context.delegate = null;
return ContinueSentinel;
}
// Define Generator.prototype.{next,throw,return} in terms of the
// unified ._invoke helper method.
defineIteratorMethods(Gp);
Gp[toStringTagSymbol] = "Generator";
// A Generator should always return itself as the iterator object when the
// @@iterator function is called on it. Some browsers' implementations of the
// iterator prototype chain incorrectly implement this, causing the Generator
// object to not be returned from this call. This ensures that doesn't happen.
// See https://github.com/facebook/regenerator/issues/274 for more details.
Gp[iteratorSymbol] = function() {
return this;
};
Gp.toString = function() {
return "[object Generator]";
};
function pushTryEntry(locs) {
var entry = { tryLoc: locs[0] };
if (1 in locs) {
entry.catchLoc = locs[1];
}
if (2 in locs) {
entry.finallyLoc = locs[2];
entry.afterLoc = locs[3];
}
this.tryEntries.push(entry);
}
function resetTryEntry(entry) {
var record = entry.completion || {};
record.type = "normal";
delete record.arg;
entry.completion = record;
}
function Context(tryLocsList) {
// The root entry object (effectively a try statement without a catch
// or a finally block) gives us a place to store values thrown from
// locations where there is no enclosing try statement.
this.tryEntries = [{ tryLoc: "root" }];
tryLocsList.forEach(pushTryEntry, this);
this.reset(true);
}
runtime.keys = function(object) {
var keys = [];
for (var key in object) {
keys.push(key);
}
keys.reverse();
// Rather than returning an object with a next method, we keep
// things simple and return the next function itself.
return function next() {
while (keys.length) {
var key = keys.pop();
if (key in object) {
next.value = key;
next.done = false;
return next;
}
}
// To avoid creating an additional object, we just hang the .value
// and .done properties off the next function object itself. This
// also ensures that the minifier will not anonymize the function.
next.done = true;
return next;
};
};
function values(iterable) {
if (iterable) {
var iteratorMethod = iterable[iteratorSymbol];
if (iteratorMethod) {
return iteratorMethod.call(iterable);
}
if (typeof iterable.next === "function") {
return iterable;
}
if (!isNaN(iterable.length)) {
var i = -1, next = function next() {
while (++i < iterable.length) {
if (hasOwn.call(iterable, i)) {
next.value = iterable[i];
next.done = false;
return next;
}
}
next.value = undefined;
next.done = true;
return next;
};
return next.next = next;
}
}
// Return an iterator with no values.
return { next: doneResult };
}
runtime.values = values;
function doneResult() {
return { value: undefined, done: true };
}
Context.prototype = {
constructor: Context,
reset: function(skipTempReset) {
this.prev = 0;
this.next = 0;
// Resetting context._sent for legacy support of Babel's
// function.sent implementation.
this.sent = this._sent = undefined;
this.done = false;
this.delegate = null;
this.method = "next";
this.arg = undefined;
this.tryEntries.forEach(resetTryEntry);
if (!skipTempReset) {
for (var name in this) {
// Not sure about the optimal order of these conditions:
if (name.charAt(0) === "t" &&
hasOwn.call(this, name) &&
!isNaN(+name.slice(1))) {
this[name] = undefined;
}
}
}
},
stop: function() {
this.done = true;
var rootEntry = this.tryEntries[0];
var rootRecord = rootEntry.completion;
if (rootRecord.type === "throw") {
throw rootRecord.arg;
}
return this.rval;
},
dispatchException: function(exception) {
if (this.done) {
throw exception;
}
var context = this;
function handle(loc, caught) {
record.type = "throw";
record.arg = exception;
context.next = loc;
if (caught) {
// If the dispatched exception was caught by a catch block,
// then let that catch block handle the exception normally.
context.method = "next";
context.arg = undefined;
}
return !! caught;
}
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
var record = entry.completion;
if (entry.tryLoc === "root") {
// Exception thrown outside of any try block that could handle
// it, so set the completion value of the entire function to
// throw the exception.
return handle("end");
}
if (entry.tryLoc <= this.prev) {
var hasCatch = hasOwn.call(entry, "catchLoc");
var hasFinally = hasOwn.call(entry, "finallyLoc");
if (hasCatch && hasFinally) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
} else if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else if (hasCatch) {
if (this.prev < entry.catchLoc) {
return handle(entry.catchLoc, true);
}
} else if (hasFinally) {
if (this.prev < entry.finallyLoc) {
return handle(entry.finallyLoc);
}
} else {
throw new Error("try statement without catch or finally");
}
}
}
},
abrupt: function(type, arg) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc <= this.prev &&
hasOwn.call(entry, "finallyLoc") &&
this.prev < entry.finallyLoc) {
var finallyEntry = entry;
break;
}
}
if (finallyEntry &&
(type === "break" ||
type === "continue") &&
finallyEntry.tryLoc <= arg &&
arg <= finallyEntry.finallyLoc) {
// Ignore the finally entry if control is not jumping to a
// location outside the try/catch block.
finallyEntry = null;
}
var record = finallyEntry ? finallyEntry.completion : {};
record.type = type;
record.arg = arg;
if (finallyEntry) {
this.method = "next";
this.next = finallyEntry.finallyLoc;
return ContinueSentinel;
}
return this.complete(record);
},
complete: function(record, afterLoc) {
if (record.type === "throw") {
throw record.arg;
}
if (record.type === "break" ||
record.type === "continue") {
this.next = record.arg;
} else if (record.type === "return") {
this.rval = this.arg = record.arg;
this.method = "return";
this.next = "end";
} else if (record.type === "normal" && afterLoc) {
this.next = afterLoc;
}
return ContinueSentinel;
},
finish: function(finallyLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.finallyLoc === finallyLoc) {
this.complete(entry.completion, entry.afterLoc);
resetTryEntry(entry);
return ContinueSentinel;
}
}
},
"catch": function(tryLoc) {
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
var entry = this.tryEntries[i];
if (entry.tryLoc === tryLoc) {
var record = entry.completion;
if (record.type === "throw") {
var thrown = record.arg;
resetTryEntry(entry);
}
return thrown;
}
}
// The context.catch method must only be called with a location
// argument that corresponds to a known catch block.
throw new Error("illegal catch attempt");
},
delegateYield: function(iterable, resultName, nextLoc) {
this.delegate = {
iterator: values(iterable),
resultName: resultName,
nextLoc: nextLoc
};
if (this.method === "next") {
// Deliberately forget the last sent value so that we don't
// accidentally pass it on to the delegate.
this.arg = undefined;
}
return ContinueSentinel;
}
};
})(
// In sloppy mode, unbound `this` refers to the global object, fallback to
// Function constructor if we're in global strict mode. That is sadly a form
// of indirect eval which violates Content Security Policy.
(function() {
return this || (typeof self === "object" && self);
})() || Function("return this")()
);
/***/ }),
/* 23 */
/*!*********************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/api/index.js ***!
\*********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });exports.tiktokUserImgs = tiktokUserImgs;exports.imgLists = imgLists;exports.tiktokUserDetails = tiktokUserDetails;exports.loginTiktok = loginTiktok;var _request = _interopRequireDefault(__webpack_require__(/*! @/utils/request */ 24));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
var serviceTitle = '/img';
//GET 传参需要用 params
//POST 传参需要用 data
//获取banner列表
function tiktokUserImgs() {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/tiktokUserImgs"),
method: 'get' });
}
// 近期精选图片列表
function imgLists(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/imgLists"),
method: 'post',
data: data });
}
//用户详情页-根据搜索码查询用户图片列表
function tiktokUserDetails(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/tiktokUserImgsDetails"),
method: 'post',
data: data });
}
// 用户授权登录
function loginTiktok(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/loginTiktok"),
method: 'post',
data: data });
}
/***/ }),
/* 24 */
/*!*************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/utils/request.js ***!
\*************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(uni) {Object.defineProperty(exports, "__esModule", { value: true });exports.default = void 0;var _axios = _interopRequireDefault(__webpack_require__(/*! axios */ 25));
var _qs = _interopRequireDefault(__webpack_require__(/*! qs */ 57));
var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 3));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
var service = _axios.default.create({
withCredentials: true,
crossDomain: true,
baseURL: _vue.default.prototype.baseURL, //这个baseURL是我在main.js下配置的请求url
timeout: 10000 });
// request拦截器,在请求之前做一些处理
service.interceptors.request.use(
function (config) {
// if (store.state.token) {
// // 给请求头添加user-token
// config.headers["user-token"] = store.state.token;
// }
config.headers['Content-Type'] = 'application/json';
// config.method === 'post' ?
// config.data = qs.stringify({ ...config.data
// }) :
// config.params = { ...config.params
// };
return config;
},
function (error) {
console.log(error); // for debug
return Promise.reject(error);
});
//配置成功后的拦截器
service.interceptors.response.use(function (res) {
return res;
// if (res.data.status == 200) {
// return res
// } else {
// return Promise.reject(res.data.msg);
// }
}, function (error) {
return Promise.reject(error);
});
_axios.default.defaults.adapter = function (config) {//自己定义个适配器,用来适配uniapp的语法
return new Promise(function (resolve, reject) {
// console.log(config)
var settle = __webpack_require__(/*! axios/lib/core/settle */ 41);
var buildURL = __webpack_require__(/*! axios/lib/helpers/buildURL */ 30);
uni.request({
method: config.method.toUpperCase(),
url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer),
header: config.headers,
data: config.data,
dataType: config.dataType,
responseType: config.responseType,
sslVerify: config.sslVerify,
complete: function complete(response) {
response = {
data: response.data,
status: response.statusCode,
errMsg: response.errMsg,
header: response.header,
config: config };
settle(resolve, reject, response);
} });
});
};var _default =
service;exports.default = _default;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-toutiao/dist/index.js */ 1)["default"]))
/***/ }),
/* 25 */
/*!************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/index.js ***!
\************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
module.exports = __webpack_require__(/*! ./lib/axios */ 26);
/***/ }),
/* 26 */
/*!****************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/axios.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./utils */ 27);
var bind = __webpack_require__(/*! ./helpers/bind */ 28);
var Axios = __webpack_require__(/*! ./core/Axios */ 29);
var mergeConfig = __webpack_require__(/*! ./core/mergeConfig */ 51);
var defaults = __webpack_require__(/*! ./defaults */ 34);
/**
* Create an instance of Axios
*
* @param {Object} defaultConfig The default config for the instance
* @return {Axios} A new instance of Axios
*/
function createInstance(defaultConfig) {
var context = new Axios(defaultConfig);
var instance = bind(Axios.prototype.request, context);
// Copy axios.prototype to instance
utils.extend(instance, Axios.prototype, context);
// Copy context to instance
utils.extend(instance, context);
// Factory for creating new instances
instance.create = function create(instanceConfig) {
return createInstance(mergeConfig(defaultConfig, instanceConfig));
};
return instance;
}
// Create the default instance to be exported
var axios = createInstance(defaults);
// Expose Axios class to allow class inheritance
axios.Axios = Axios;
// Expose Cancel & CancelToken
axios.Cancel = __webpack_require__(/*! ./cancel/Cancel */ 49);
axios.CancelToken = __webpack_require__(/*! ./cancel/CancelToken */ 54);
axios.isCancel = __webpack_require__(/*! ./cancel/isCancel */ 50);
axios.VERSION = __webpack_require__(/*! ./env/data */ 53).version;
// Expose all/spread
axios.all = function all(promises) {
return Promise.all(promises);
};
axios.spread = __webpack_require__(/*! ./helpers/spread */ 55);
// Expose isAxiosError
axios.isAxiosError = __webpack_require__(/*! ./helpers/isAxiosError */ 56);
module.exports = axios;
// Allow use of default import syntax in TypeScript
module.exports.default = axios;
/***/ }),
/* 27 */
/*!****************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/utils.js ***!
\****************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var bind = __webpack_require__(/*! ./helpers/bind */ 28);
// utils is a library of generic helper functions non-specific to axios
var toString = Object.prototype.toString;
/**
* Determine if a value is an Array
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an Array, otherwise false
*/
function isArray(val) {
return Array.isArray(val);
}
/**
* Determine if a value is undefined
*
* @param {Object} val The value to test
* @returns {boolean} True if the value is undefined, otherwise false
*/
function isUndefined(val) {
return typeof val === 'undefined';
}
/**
* Determine if a value is a Buffer
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Buffer, otherwise false
*/
function isBuffer(val) {
return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) &&
typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
}
/**
* Determine if a value is an ArrayBuffer
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an ArrayBuffer, otherwise false
*/
function isArrayBuffer(val) {
return toString.call(val) === '[object ArrayBuffer]';
}
/**
* Determine if a value is a FormData
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an FormData, otherwise false
*/
function isFormData(val) {
return toString.call(val) === '[object FormData]';
}
/**
* Determine if a value is a view on an ArrayBuffer
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
*/
function isArrayBufferView(val) {
var result;
if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
result = ArrayBuffer.isView(val);
} else {
result = val && val.buffer && isArrayBuffer(val.buffer);
}
return result;
}
/**
* Determine if a value is a String
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a String, otherwise false
*/
function isString(val) {
return typeof val === 'string';
}
/**
* Determine if a value is a Number
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Number, otherwise false
*/
function isNumber(val) {
return typeof val === 'number';
}
/**
* Determine if a value is an Object
*
* @param {Object} val The value to test
* @returns {boolean} True if value is an Object, otherwise false
*/
function isObject(val) {
return val !== null && typeof val === 'object';
}
/**
* Determine if a value is a plain Object
*
* @param {Object} val The value to test
* @return {boolean} True if value is a plain Object, otherwise false
*/
function isPlainObject(val) {
if (toString.call(val) !== '[object Object]') {
return false;
}
var prototype = Object.getPrototypeOf(val);
return prototype === null || prototype === Object.prototype;
}
/**
* Determine if a value is a Date
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Date, otherwise false
*/
function isDate(val) {
return toString.call(val) === '[object Date]';
}
/**
* Determine if a value is a File
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a File, otherwise false
*/
function isFile(val) {
return toString.call(val) === '[object File]';
}
/**
* Determine if a value is a Blob
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Blob, otherwise false
*/
function isBlob(val) {
return toString.call(val) === '[object Blob]';
}
/**
* Determine if a value is a Function
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Function, otherwise false
*/
function isFunction(val) {
return toString.call(val) === '[object Function]';
}
/**
* Determine if a value is a Stream
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a Stream, otherwise false
*/
function isStream(val) {
return isObject(val) && isFunction(val.pipe);
}
/**
* Determine if a value is a URLSearchParams object
*
* @param {Object} val The value to test
* @returns {boolean} True if value is a URLSearchParams object, otherwise false
*/
function isURLSearchParams(val) {
return toString.call(val) === '[object URLSearchParams]';
}
/**
* Trim excess whitespace off the beginning and end of a string
*
* @param {String} str The String to trim
* @returns {String} The String freed of excess whitespace
*/
function trim(str) {
return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, '');
}
/**
* Determine if we're running in a standard browser environment
*
* This allows axios to run in a web worker, and react-native.
* Both environments support XMLHttpRequest, but not fully standard globals.
*
* web workers:
* typeof window -> undefined
* typeof document -> undefined
*
* react-native:
* navigator.product -> 'ReactNative'
* nativescript
* navigator.product -> 'NativeScript' or 'NS'
*/
function isStandardBrowserEnv() {
if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||
navigator.product === 'NativeScript' ||
navigator.product === 'NS')) {
return false;
}
return (
typeof window !== 'undefined' &&
typeof document !== 'undefined');
}
/**
* Iterate over an Array or an Object invoking a function for each item.
*
* If `obj` is an Array callback will be called passing
* the value, index, and complete array for each item.
*
* If 'obj' is an Object callback will be called passing
* the value, key, and complete object for each property.
*
* @param {Object|Array} obj The object to iterate
* @param {Function} fn The callback to invoke for each item
*/
function forEach(obj, fn) {
// Don't bother if no value provided
if (obj === null || typeof obj === 'undefined') {
return;
}
// Force an array if not already something iterable
if (typeof obj !== 'object') {
/*eslint no-param-reassign:0*/
obj = [obj];
}
if (isArray(obj)) {
// Iterate over array values
for (var i = 0, l = obj.length; i < l; i++) {
fn.call(null, obj[i], i, obj);
}
} else {
// Iterate over object keys
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
fn.call(null, obj[key], key, obj);
}
}
}
}
/**
* Accepts varargs expecting each argument to be an object, then
* immutably merges the properties of each object and returns result.
*
* When multiple objects contain the same key the later object in
* the arguments list will take precedence.
*
* Example:
*
* ```js
* var result = merge({foo: 123}, {foo: 456});
* console.log(result.foo); // outputs 456
* ```
*
* @param {Object} obj1 Object to merge
* @returns {Object} Result of all merge properties
*/
function merge() /* obj1, obj2, obj3, ... */{
var result = {};
function assignValue(val, key) {
if (isPlainObject(result[key]) && isPlainObject(val)) {
result[key] = merge(result[key], val);
} else if (isPlainObject(val)) {
result[key] = merge({}, val);
} else if (isArray(val)) {
result[key] = val.slice();
} else {
result[key] = val;
}
}
for (var i = 0, l = arguments.length; i < l; i++) {
forEach(arguments[i], assignValue);
}
return result;
}
/**
* Extends object a by mutably adding to it the properties of object b.
*
* @param {Object} a The object to be extended
* @param {Object} b The object to copy properties from
* @param {Object} thisArg The object to bind function to
* @return {Object} The resulting value of object a
*/
function extend(a, b, thisArg) {
forEach(b, function assignValue(val, key) {
if (thisArg && typeof val === 'function') {
a[key] = bind(val, thisArg);
} else {
a[key] = val;
}
});
return a;
}
/**
* Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
*
* @param {string} content with BOM
* @return {string} content value without BOM
*/
function stripBOM(content) {
if (content.charCodeAt(0) === 0xFEFF) {
content = content.slice(1);
}
return content;
}
module.exports = {
isArray: isArray,
isArrayBuffer: isArrayBuffer,
isBuffer: isBuffer,
isFormData: isFormData,
isArrayBufferView: isArrayBufferView,
isString: isString,
isNumber: isNumber,
isObject: isObject,
isPlainObject: isPlainObject,
isUndefined: isUndefined,
isDate: isDate,
isFile: isFile,
isBlob: isBlob,
isFunction: isFunction,
isStream: isStream,
isURLSearchParams: isURLSearchParams,
isStandardBrowserEnv: isStandardBrowserEnv,
forEach: forEach,
merge: merge,
extend: extend,
trim: trim,
stripBOM: stripBOM };
/***/ }),
/* 28 */
/*!***********************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/bind.js ***!
\***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function bind(fn, thisArg) {
return function wrap() {
var args = new Array(arguments.length);
for (var i = 0; i < args.length; i++) {
args[i] = arguments[i];
}
return fn.apply(thisArg, args);
};
};
/***/ }),
/* 29 */
/*!*********************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/core/Axios.js ***!
\*********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
var buildURL = __webpack_require__(/*! ../helpers/buildURL */ 30);
var InterceptorManager = __webpack_require__(/*! ./InterceptorManager */ 31);
var dispatchRequest = __webpack_require__(/*! ./dispatchRequest */ 32);
var mergeConfig = __webpack_require__(/*! ./mergeConfig */ 51);
var validator = __webpack_require__(/*! ../helpers/validator */ 52);
var validators = validator.validators;
/**
* Create a new instance of Axios
*
* @param {Object} instanceConfig The default config for the instance
*/
function Axios(instanceConfig) {
this.defaults = instanceConfig;
this.interceptors = {
request: new InterceptorManager(),
response: new InterceptorManager() };
}
/**
* Dispatch a request
*
* @param {Object} config The config specific for this request (merged with this.defaults)
*/
Axios.prototype.request = function request(configOrUrl, config) {
/*eslint no-param-reassign:0*/
// Allow for axios('example/url'[, config]) a la fetch API
if (typeof configOrUrl === 'string') {
config = config || {};
config.url = configOrUrl;
} else {
config = configOrUrl || {};
}
config = mergeConfig(this.defaults, config);
// Set config.method
if (config.method) {
config.method = config.method.toLowerCase();
} else if (this.defaults.method) {
config.method = this.defaults.method.toLowerCase();
} else {
config.method = 'get';
}
var transitional = config.transitional;
if (transitional !== undefined) {
validator.assertOptions(transitional, {
silentJSONParsing: validators.transitional(validators.boolean),
forcedJSONParsing: validators.transitional(validators.boolean),
clarifyTimeoutError: validators.transitional(validators.boolean) },
false);
}
// filter out skipped interceptors
var requestInterceptorChain = [];
var synchronousRequestInterceptors = true;
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
return;
}
synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
});
var responseInterceptorChain = [];
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
});
var promise;
if (!synchronousRequestInterceptors) {
var chain = [dispatchRequest, undefined];
Array.prototype.unshift.apply(chain, requestInterceptorChain);
chain = chain.concat(responseInterceptorChain);
promise = Promise.resolve(config);
while (chain.length) {
promise = promise.then(chain.shift(), chain.shift());
}
return promise;
}
var newConfig = config;
while (requestInterceptorChain.length) {
var onFulfilled = requestInterceptorChain.shift();
var onRejected = requestInterceptorChain.shift();
try {
newConfig = onFulfilled(newConfig);
} catch (error) {
onRejected(error);
break;
}
}
try {
promise = dispatchRequest(newConfig);
} catch (error) {
return Promise.reject(error);
}
while (responseInterceptorChain.length) {
promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());
}
return promise;
};
Axios.prototype.getUri = function getUri(config) {
config = mergeConfig(this.defaults, config);
return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\?/, '');
};
// Provide aliases for supported request methods
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
/*eslint func-names:0*/
Axios.prototype[method] = function (url, config) {
return this.request(mergeConfig(config || {}, {
method: method,
url: url,
data: (config || {}).data }));
};
});
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
/*eslint func-names:0*/
Axios.prototype[method] = function (url, data, config) {
return this.request(mergeConfig(config || {}, {
method: method,
url: url,
data: data }));
};
});
module.exports = Axios;
/***/ }),
/* 30 */
/*!***************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/buildURL.js ***!
\***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
function encode(val) {
return encodeURIComponent(val).
replace(/%3A/gi, ':').
replace(/%24/g, '$').
replace(/%2C/gi, ',').
replace(/%20/g, '+').
replace(/%5B/gi, '[').
replace(/%5D/gi, ']');
}
/**
* Build a URL by appending params to the end
*
* @param {string} url The base of the url (e.g., http://www.google.com)
* @param {object} [params] The params to be appended
* @returns {string} The formatted url
*/
module.exports = function buildURL(url, params, paramsSerializer) {
/*eslint no-param-reassign:0*/
if (!params) {
return url;
}
var serializedParams;
if (paramsSerializer) {
serializedParams = paramsSerializer(params);
} else if (utils.isURLSearchParams(params)) {
serializedParams = params.toString();
} else {
var parts = [];
utils.forEach(params, function serialize(val, key) {
if (val === null || typeof val === 'undefined') {
return;
}
if (utils.isArray(val)) {
key = key + '[]';
} else {
val = [val];
}
utils.forEach(val, function parseValue(v) {
if (utils.isDate(v)) {
v = v.toISOString();
} else if (utils.isObject(v)) {
v = JSON.stringify(v);
}
parts.push(encode(key) + '=' + encode(v));
});
});
serializedParams = parts.join('&');
}
if (serializedParams) {
var hashmarkIndex = url.indexOf('#');
if (hashmarkIndex !== -1) {
url = url.slice(0, hashmarkIndex);
}
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
}
return url;
};
/***/ }),
/* 31 */
/*!**********************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/core/InterceptorManager.js ***!
\**********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
function InterceptorManager() {
this.handlers = [];
}
/**
* Add a new interceptor to the stack
*
* @param {Function} fulfilled The function to handle `then` for a `Promise`
* @param {Function} rejected The function to handle `reject` for a `Promise`
*
* @return {Number} An ID used to remove interceptor later
*/
InterceptorManager.prototype.use = function use(fulfilled, rejected, options) {
this.handlers.push({
fulfilled: fulfilled,
rejected: rejected,
synchronous: options ? options.synchronous : false,
runWhen: options ? options.runWhen : null });
return this.handlers.length - 1;
};
/**
* Remove an interceptor from the stack
*
* @param {Number} id The ID that was returned by `use`
*/
InterceptorManager.prototype.eject = function eject(id) {
if (this.handlers[id]) {
this.handlers[id] = null;
}
};
/**
* Iterate over all the registered interceptors
*
* This method is particularly useful for skipping over any
* interceptors that may have become `null` calling `eject`.
*
* @param {Function} fn The function to call for each interceptor
*/
InterceptorManager.prototype.forEach = function forEach(fn) {
utils.forEach(this.handlers, function forEachHandler(h) {
if (h !== null) {
fn(h);
}
});
};
module.exports = InterceptorManager;
/***/ }),
/* 32 */
/*!*******************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/core/dispatchRequest.js ***!
\*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
var transformData = __webpack_require__(/*! ./transformData */ 33);
var isCancel = __webpack_require__(/*! ../cancel/isCancel */ 50);
var defaults = __webpack_require__(/*! ../defaults */ 34);
var Cancel = __webpack_require__(/*! ../cancel/Cancel */ 49);
/**
* Throws a `Cancel` if cancellation has been requested.
*/
function throwIfCancellationRequested(config) {
if (config.cancelToken) {
config.cancelToken.throwIfRequested();
}
if (config.signal && config.signal.aborted) {
throw new Cancel('canceled');
}
}
/**
* Dispatch a request to the server using the configured adapter.
*
* @param {object} config The config that is to be used for the request
* @returns {Promise} The Promise to be fulfilled
*/
module.exports = function dispatchRequest(config) {
throwIfCancellationRequested(config);
// Ensure headers exist
config.headers = config.headers || {};
// Transform request data
config.data = transformData.call(
config,
config.data,
config.headers,
config.transformRequest);
// Flatten headers
config.headers = utils.merge(
config.headers.common || {},
config.headers[config.method] || {},
config.headers);
utils.forEach(
['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
function cleanHeaderConfig(method) {
delete config.headers[method];
});
var adapter = config.adapter || defaults.adapter;
return adapter(config).then(function onAdapterResolution(response) {
throwIfCancellationRequested(config);
// Transform response data
response.data = transformData.call(
config,
response.data,
response.headers,
config.transformResponse);
return response;
}, function onAdapterRejection(reason) {
if (!isCancel(reason)) {
throwIfCancellationRequested(config);
// Transform response data
if (reason && reason.response) {
reason.response.data = transformData.call(
config,
reason.response.data,
reason.response.headers,
config.transformResponse);
}
}
return Promise.reject(reason);
});
};
/***/ }),
/* 33 */
/*!*****************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/core/transformData.js ***!
\*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
var defaults = __webpack_require__(/*! ../defaults */ 34);
/**
* Transform the data for a request or a response
*
* @param {Object|String} data The data to be transformed
* @param {Array} headers The headers for the request or response
* @param {Array|Function} fns A single function or Array of functions
* @returns {*} The resulting transformed data
*/
module.exports = function transformData(data, headers, fns) {
var context = this || defaults;
/*eslint no-param-reassign:0*/
utils.forEach(fns, function transform(fn) {
data = fn.call(context, data, headers);
});
return data;
};
/***/ }),
/* 34 */
/*!*************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/defaults/index.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(process) {
var utils = __webpack_require__(/*! ../utils */ 27);
var normalizeHeaderName = __webpack_require__(/*! ../helpers/normalizeHeaderName */ 37);
var enhanceError = __webpack_require__(/*! ../core/enhanceError */ 38);
var transitionalDefaults = __webpack_require__(/*! ./transitional */ 39);
var DEFAULT_CONTENT_TYPE = {
'Content-Type': 'application/x-www-form-urlencoded' };
function setContentTypeIfUnset(headers, value) {
if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {
headers['Content-Type'] = value;
}
}
function getDefaultAdapter() {
var adapter;
if (typeof XMLHttpRequest !== 'undefined') {
// For browsers use XHR adapter
adapter = __webpack_require__(/*! ../adapters/xhr */ 40);
} else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
// For node use HTTP adapter
adapter = __webpack_require__(/*! ../adapters/http */ 40);
}
return adapter;
}
function stringifySafely(rawValue, parser, encoder) {
if (utils.isString(rawValue)) {
try {
(parser || JSON.parse)(rawValue);
return utils.trim(rawValue);
} catch (e) {
if (e.name !== 'SyntaxError') {
throw e;
}
}
}
return (encoder || JSON.stringify)(rawValue);
}
var defaults = {
transitional: transitionalDefaults,
adapter: getDefaultAdapter(),
transformRequest: [function transformRequest(data, headers) {
normalizeHeaderName(headers, 'Accept');
normalizeHeaderName(headers, 'Content-Type');
if (utils.isFormData(data) ||
utils.isArrayBuffer(data) ||
utils.isBuffer(data) ||
utils.isStream(data) ||
utils.isFile(data) ||
utils.isBlob(data))
{
return data;
}
if (utils.isArrayBufferView(data)) {
return data.buffer;
}
if (utils.isURLSearchParams(data)) {
setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');
return data.toString();
}
if (utils.isObject(data) || headers && headers['Content-Type'] === 'application/json') {
setContentTypeIfUnset(headers, 'application/json');
return stringifySafely(data);
}
return data;
}],
transformResponse: [function transformResponse(data) {
var transitional = this.transitional || defaults.transitional;
var silentJSONParsing = transitional && transitional.silentJSONParsing;
var forcedJSONParsing = transitional && transitional.forcedJSONParsing;
var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';
if (strictJSONParsing || forcedJSONParsing && utils.isString(data) && data.length) {
try {
return JSON.parse(data);
} catch (e) {
if (strictJSONParsing) {
if (e.name === 'SyntaxError') {
throw enhanceError(e, this, 'E_JSON_PARSE');
}
throw e;
}
}
}
return data;
}],
/**
* A timeout in milliseconds to abort a request. If set to 0 (default) a
* timeout is not created.
*/
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
maxBodyLength: -1,
validateStatus: function validateStatus(status) {
return status >= 200 && status < 300;
},
headers: {
common: {
'Accept': 'application/json, text/plain, */*' } } };
utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {
defaults.headers[method] = {};
});
utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
});
module.exports = defaults;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/node-libs-browser/mock/process.js */ 35)))
/***/ }),
/* 35 */
/*!********************************************************!*\
!*** ./node_modules/node-libs-browser/mock/process.js ***!
\********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
exports.nextTick = function nextTick(fn) {
var args = Array.prototype.slice.call(arguments);
args.shift();
setTimeout(function () {
fn.apply(null, args);
}, 0);
};
exports.platform = exports.arch =
exports.execPath = exports.title = 'browser';
exports.pid = 1;
exports.browser = true;
exports.env = {};
exports.argv = [];
exports.binding = function (name) {
throw new Error('No such module. (Possibly not yet loaded)')
};
(function () {
var cwd = '/';
var path;
exports.cwd = function () { return cwd };
exports.chdir = function (dir) {
if (!path) path = __webpack_require__(/*! path */ 36);
cwd = path.resolve(dir, cwd);
};
})();
exports.exit = exports.kill =
exports.umask = exports.dlopen =
exports.uptime = exports.memoryUsage =
exports.uvCounters = function() {};
exports.features = {};
/***/ }),
/* 36 */
/*!***********************************************!*\
!*** ./node_modules/path-browserify/index.js ***!
\***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
/* WEBPACK VAR INJECTION */(function(process) {// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
// backported and transplited with Babel, with backwards-compat fixes
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// resolves . and .. elements in a path array with directory names there
// must be no slashes, empty elements, or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizeArray(parts, allowAboveRoot) {
// if the path tries to go above the root, `up` ends up > 0
var up = 0;
for (var i = parts.length - 1; i >= 0; i--) {
var last = parts[i];
if (last === '.') {
parts.splice(i, 1);
} else if (last === '..') {
parts.splice(i, 1);
up++;
} else if (up) {
parts.splice(i, 1);
up--;
}
}
// if the path is allowed to go above the root, restore leading ..s
if (allowAboveRoot) {
for (; up--; up) {
parts.unshift('..');
}
}
return parts;
}
// path.resolve([from ...], to)
// posix version
exports.resolve = function() {
var resolvedPath = '',
resolvedAbsolute = false;
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
var path = (i >= 0) ? arguments[i] : process.cwd();
// Skip empty and invalid entries
if (typeof path !== 'string') {
throw new TypeError('Arguments to path.resolve must be strings');
} else if (!path) {
continue;
}
resolvedPath = path + '/' + resolvedPath;
resolvedAbsolute = path.charAt(0) === '/';
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
// Normalize the path
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
return !!p;
}), !resolvedAbsolute).join('/');
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
};
// path.normalize(path)
// posix version
exports.normalize = function(path) {
var isAbsolute = exports.isAbsolute(path),
trailingSlash = substr(path, -1) === '/';
// Normalize the path
path = normalizeArray(filter(path.split('/'), function(p) {
return !!p;
}), !isAbsolute).join('/');
if (!path && !isAbsolute) {
path = '.';
}
if (path && trailingSlash) {
path += '/';
}
return (isAbsolute ? '/' : '') + path;
};
// posix version
exports.isAbsolute = function(path) {
return path.charAt(0) === '/';
};
// posix version
exports.join = function() {
var paths = Array.prototype.slice.call(arguments, 0);
return exports.normalize(filter(paths, function(p, index) {
if (typeof p !== 'string') {
throw new TypeError('Arguments to path.join must be strings');
}
return p;
}).join('/'));
};
// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
from = exports.resolve(from).substr(1);
to = exports.resolve(to).substr(1);
function trim(arr) {
var start = 0;
for (; start < arr.length; start++) {
if (arr[start] !== '') break;
}
var end = arr.length - 1;
for (; end >= 0; end--) {
if (arr[end] !== '') break;
}
if (start > end) return [];
return arr.slice(start, end - start + 1);
}
var fromParts = trim(from.split('/'));
var toParts = trim(to.split('/'));
var length = Math.min(fromParts.length, toParts.length);
var samePartsLength = length;
for (var i = 0; i < length; i++) {
if (fromParts[i] !== toParts[i]) {
samePartsLength = i;
break;
}
}
var outputParts = [];
for (var i = samePartsLength; i < fromParts.length; i++) {
outputParts.push('..');
}
outputParts = outputParts.concat(toParts.slice(samePartsLength));
return outputParts.join('/');
};
exports.sep = '/';
exports.delimiter = ':';
exports.dirname = function (path) {
if (typeof path !== 'string') path = path + '';
if (path.length === 0) return '.';
var code = path.charCodeAt(0);
var hasRoot = code === 47 /*/*/;
var end = -1;
var matchedSlash = true;
for (var i = path.length - 1; i >= 1; --i) {
code = path.charCodeAt(i);
if (code === 47 /*/*/) {
if (!matchedSlash) {
end = i;
break;
}
} else {
// We saw the first non-path separator
matchedSlash = false;
}
}
if (end === -1) return hasRoot ? '/' : '.';
if (hasRoot && end === 1) {
// return '//';
// Backwards-compat fix:
return '/';
}
return path.slice(0, end);
};
function basename(path) {
if (typeof path !== 'string') path = path + '';
var start = 0;
var end = -1;
var matchedSlash = true;
var i;
for (i = path.length - 1; i >= 0; --i) {
if (path.charCodeAt(i) === 47 /*/*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
start = i + 1;
break;
}
} else if (end === -1) {
// We saw the first non-path separator, mark this as the end of our
// path component
matchedSlash = false;
end = i + 1;
}
}
if (end === -1) return '';
return path.slice(start, end);
}
// Uses a mixed approach for backwards-compatibility, as ext behavior changed
// in new Node.js versions, so only basename() above is backported here
exports.basename = function (path, ext) {
var f = basename(path);
if (ext && f.substr(-1 * ext.length) === ext) {
f = f.substr(0, f.length - ext.length);
}
return f;
};
exports.extname = function (path) {
if (typeof path !== 'string') path = path + '';
var startDot = -1;
var startPart = 0;
var end = -1;
var matchedSlash = true;
// Track the state of characters (if any) we see before our first dot and
// after any path separator we find
var preDotState = 0;
for (var i = path.length - 1; i >= 0; --i) {
var code = path.charCodeAt(i);
if (code === 47 /*/*/) {
// If we reached a path separator that was not part of a set of path
// separators at the end of the string, stop now
if (!matchedSlash) {
startPart = i + 1;
break;
}
continue;
}
if (end === -1) {
// We saw the first non-path separator, mark this as the end of our
// extension
matchedSlash = false;
end = i + 1;
}
if (code === 46 /*.*/) {
// If this is our first dot, mark it as the start of our extension
if (startDot === -1)
startDot = i;
else if (preDotState !== 1)
preDotState = 1;
} else if (startDot !== -1) {
// We saw a non-dot and non-path separator before our dot, so we should
// have a good chance at having a non-empty extension
preDotState = -1;
}
}
if (startDot === -1 || end === -1 ||
// We saw a non-dot character immediately before the dot
preDotState === 0 ||
// The (right-most) trimmed path component is exactly '..'
preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
return '';
}
return path.slice(startDot, end);
};
function filter (xs, f) {
if (xs.filter) return xs.filter(f);
var res = [];
for (var i = 0; i < xs.length; i++) {
if (f(xs[i], i, xs)) res.push(xs[i]);
}
return res;
}
// String.prototype.substr - negative index don't work in IE8
var substr = 'ab'.substr(-1) === 'b'
? function (str, start, len) { return str.substr(start, len) }
: function (str, start, len) {
if (start < 0) start = str.length + start;
return str.substr(start, len);
}
;
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node-libs-browser/mock/process.js */ 35)))
/***/ }),
/* 37 */
/*!**************************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/normalizeHeaderName.js ***!
\**************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ../utils */ 27);
module.exports = function normalizeHeaderName(headers, normalizedName) {
utils.forEach(headers, function processHeader(value, name) {
if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {
headers[normalizedName] = value;
delete headers[name];
}
});
};
/***/ }),
/* 38 */
/*!****************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/core/enhanceError.js ***!
\****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* Update an Error with the specified config, error code, and response.
*
* @param {Error} error The error to update.
* @param {Object} config The config.
* @param {string} [code] The error code (for example, 'ECONNABORTED').
* @param {Object} [request] The request.
* @param {Object} [response] The response.
* @returns {Error} The error.
*/
module.exports = function enhanceError(error, config, code, request, response) {
error.config = config;
if (code) {
error.code = code;
}
error.request = request;
error.response = response;
error.isAxiosError = true;
error.toJSON = function toJSON() {
return {
// Standard
message: this.message,
name: this.name,
// Microsoft
description: this.description,
number: this.number,
// Mozilla
fileName: this.fileName,
lineNumber: this.lineNumber,
columnNumber: this.columnNumber,
stack: this.stack,
// Axios
config: this.config,
code: this.code,
status: this.response && this.response.status ? this.response.status : null };
};
return error;
};
/***/ }),
/* 39 */
/*!********************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/defaults/transitional.js ***!
\********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = {
silentJSONParsing: true,
forcedJSONParsing: true,
clarifyTimeoutError: false };
/***/ }),
/* 40 */
/*!***********************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/adapters/xhr.js ***!
\***********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
var settle = __webpack_require__(/*! ./../core/settle */ 41);
var cookies = __webpack_require__(/*! ./../helpers/cookies */ 43);
var buildURL = __webpack_require__(/*! ./../helpers/buildURL */ 30);
var buildFullPath = __webpack_require__(/*! ../core/buildFullPath */ 44);
var parseHeaders = __webpack_require__(/*! ./../helpers/parseHeaders */ 47);
var isURLSameOrigin = __webpack_require__(/*! ./../helpers/isURLSameOrigin */ 48);
var createError = __webpack_require__(/*! ../core/createError */ 42);
var transitionalDefaults = __webpack_require__(/*! ../defaults/transitional */ 39);
var Cancel = __webpack_require__(/*! ../cancel/Cancel */ 49);
module.exports = function xhrAdapter(config) {
return new Promise(function dispatchXhrRequest(resolve, reject) {
var requestData = config.data;
var requestHeaders = config.headers;
var responseType = config.responseType;
var onCanceled;
function done() {
if (config.cancelToken) {
config.cancelToken.unsubscribe(onCanceled);
}
if (config.signal) {
config.signal.removeEventListener('abort', onCanceled);
}
}
if (utils.isFormData(requestData)) {
delete requestHeaders['Content-Type']; // Let the browser set it
}
var request = new XMLHttpRequest();
// HTTP basic authentication
if (config.auth) {
var username = config.auth.username || '';
var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';
requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);
}
var fullPath = buildFullPath(config.baseURL, config.url);
request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);
// Set the request timeout in MS
request.timeout = config.timeout;
function onloadend() {
if (!request) {
return;
}
// Prepare the response
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
var responseData = !responseType || responseType === 'text' || responseType === 'json' ?
request.responseText : request.response;
var response = {
data: responseData,
status: request.status,
statusText: request.statusText,
headers: responseHeaders,
config: config,
request: request };
settle(function _resolve(value) {
resolve(value);
done();
}, function _reject(err) {
reject(err);
done();
}, response);
// Clean up request
request = null;
}
if ('onloadend' in request) {
// Use onloadend if available
request.onloadend = onloadend;
} else {
// Listen for ready state to emulate onloadend
request.onreadystatechange = function handleLoad() {
if (!request || request.readyState !== 4) {
return;
}
// The request errored out and we didn't get a response, this will be
// handled by onerror instead
// With one exception: request that using file: protocol, most browsers
// will return status as 0 even though it's a successful request
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
return;
}
// readystate handler is calling before onerror or ontimeout handlers,
// so we should call onloadend on the next 'tick'
setTimeout(onloadend);
};
}
// Handle browser request cancellation (as opposed to a manual cancellation)
request.onabort = function handleAbort() {
if (!request) {
return;
}
reject(createError('Request aborted', config, 'ECONNABORTED', request));
// Clean up request
request = null;
};
// Handle low level network errors
request.onerror = function handleError() {
// Real errors are hidden from us by the browser
// onerror should only fire if it's a network error
reject(createError('Network Error', config, null, request));
// Clean up request
request = null;
};
// Handle timeout
request.ontimeout = function handleTimeout() {
var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
var transitional = config.transitional || transitionalDefaults;
if (config.timeoutErrorMessage) {
timeoutErrorMessage = config.timeoutErrorMessage;
}
reject(createError(
timeoutErrorMessage,
config,
transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',
request));
// Clean up request
request = null;
};
// Add xsrf header
// This is only done if running in a standard browser environment.
// Specifically not if we're in a web worker, or react-native.
if (utils.isStandardBrowserEnv()) {
// Add xsrf header
var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?
cookies.read(config.xsrfCookieName) :
undefined;
if (xsrfValue) {
requestHeaders[config.xsrfHeaderName] = xsrfValue;
}
}
// Add headers to the request
if ('setRequestHeader' in request) {
utils.forEach(requestHeaders, function setRequestHeader(val, key) {
if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {
// Remove Content-Type if data is undefined
delete requestHeaders[key];
} else {
// Otherwise add header to the request
request.setRequestHeader(key, val);
}
});
}
// Add withCredentials to request if needed
if (!utils.isUndefined(config.withCredentials)) {
request.withCredentials = !!config.withCredentials;
}
// Add responseType to request if needed
if (responseType && responseType !== 'json') {
request.responseType = config.responseType;
}
// Handle progress if needed
if (typeof config.onDownloadProgress === 'function') {
request.addEventListener('progress', config.onDownloadProgress);
}
// Not all browsers support upload events
if (typeof config.onUploadProgress === 'function' && request.upload) {
request.upload.addEventListener('progress', config.onUploadProgress);
}
if (config.cancelToken || config.signal) {
// Handle cancellation
// eslint-disable-next-line func-names
onCanceled = function onCanceled(cancel) {
if (!request) {
return;
}
reject(!cancel || cancel && cancel.type ? new Cancel('canceled') : cancel);
request.abort();
request = null;
};
config.cancelToken && config.cancelToken.subscribe(onCanceled);
if (config.signal) {
config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);
}
}
if (!requestData) {
requestData = null;
}
// Send the request
request.send(requestData);
});
};
/***/ }),
/* 41 */
/*!**********************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/core/settle.js ***!
\**********************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var createError = __webpack_require__(/*! ./createError */ 42);
/**
* Resolve or reject a Promise based on response status.
*
* @param {Function} resolve A function that resolves the promise.
* @param {Function} reject A function that rejects the promise.
* @param {object} response The response.
*/
module.exports = function settle(resolve, reject, response) {
var validateStatus = response.config.validateStatus;
if (!response.status || !validateStatus || validateStatus(response.status)) {
resolve(response);
} else {
reject(createError(
'Request failed with status code ' + response.status,
response.config,
null,
response.request,
response));
}
};
/***/ }),
/* 42 */
/*!***************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/core/createError.js ***!
\***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var enhanceError = __webpack_require__(/*! ./enhanceError */ 38);
/**
* Create an Error with the specified message, config, error code, request and response.
*
* @param {string} message The error message.
* @param {Object} config The config.
* @param {string} [code] The error code (for example, 'ECONNABORTED').
* @param {Object} [request] The request.
* @param {Object} [response] The response.
* @returns {Error} The created error.
*/
module.exports = function createError(message, config, code, request, response) {
var error = new Error(message);
return enhanceError(error, config, code, request, response);
};
/***/ }),
/* 43 */
/*!**************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/cookies.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
module.exports =
utils.isStandardBrowserEnv() ?
// Standard browser envs support document.cookie
function standardBrowserEnv() {
return {
write: function write(name, value, expires, path, domain, secure) {
var cookie = [];
cookie.push(name + '=' + encodeURIComponent(value));
if (utils.isNumber(expires)) {
cookie.push('expires=' + new Date(expires).toGMTString());
}
if (utils.isString(path)) {
cookie.push('path=' + path);
}
if (utils.isString(domain)) {
cookie.push('domain=' + domain);
}
if (secure === true) {
cookie.push('secure');
}
document.cookie = cookie.join('; ');
},
read: function read(name) {
var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
return match ? decodeURIComponent(match[3]) : null;
},
remove: function remove(name) {
this.write(name, '', Date.now() - 86400000);
} };
}() :
// Non standard browser env (web workers, react-native) lack needed support.
function nonStandardBrowserEnv() {
return {
write: function write() {},
read: function read() {return null;},
remove: function remove() {} };
}();
/***/ }),
/* 44 */
/*!*****************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/core/buildFullPath.js ***!
\*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var isAbsoluteURL = __webpack_require__(/*! ../helpers/isAbsoluteURL */ 45);
var combineURLs = __webpack_require__(/*! ../helpers/combineURLs */ 46);
/**
* Creates a new URL by combining the baseURL with the requestedURL,
* only when the requestedURL is not already an absolute URL.
* If the requestURL is absolute, this function returns the requestedURL untouched.
*
* @param {string} baseURL The base URL
* @param {string} requestedURL Absolute or relative URL to combine
* @returns {string} The combined full path
*/
module.exports = function buildFullPath(baseURL, requestedURL) {
if (baseURL && !isAbsoluteURL(requestedURL)) {
return combineURLs(baseURL, requestedURL);
}
return requestedURL;
};
/***/ }),
/* 45 */
/*!********************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/isAbsoluteURL.js ***!
\********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* Determines whether the specified URL is absolute
*
* @param {string} url The URL to test
* @returns {boolean} True if the specified URL is absolute, otherwise false
*/
module.exports = function isAbsoluteURL(url) {
// A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
// RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
// by any combination of letters, digits, plus, period, or hyphen.
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
};
/***/ }),
/* 46 */
/*!******************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/combineURLs.js ***!
\******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* Creates a new URL by combining the specified URLs
*
* @param {string} baseURL The base URL
* @param {string} relativeURL The relative URL
* @returns {string} The combined URL
*/
module.exports = function combineURLs(baseURL, relativeURL) {
return relativeURL ?
baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') :
baseURL;
};
/***/ }),
/* 47 */
/*!*******************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/parseHeaders.js ***!
\*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
// Headers whose duplicates are ignored by node
// c.f. https://nodejs.org/api/http.html#http_message_headers
var ignoreDuplicateOf = [
'age', 'authorization', 'content-length', 'content-type', 'etag',
'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
'last-modified', 'location', 'max-forwards', 'proxy-authorization',
'referer', 'retry-after', 'user-agent'];
/**
* Parse headers into an object
*
* ```
* Date: Wed, 27 Aug 2014 08:58:49 GMT
* Content-Type: application/json
* Connection: keep-alive
* Transfer-Encoding: chunked
* ```
*
* @param {String} headers Headers needing to be parsed
* @returns {Object} Headers parsed into an object
*/
module.exports = function parseHeaders(headers) {
var parsed = {};
var key;
var val;
var i;
if (!headers) {return parsed;}
utils.forEach(headers.split('\n'), function parser(line) {
i = line.indexOf(':');
key = utils.trim(line.substr(0, i)).toLowerCase();
val = utils.trim(line.substr(i + 1));
if (key) {
if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
return;
}
if (key === 'set-cookie') {
parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
} else {
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
}
}
});
return parsed;
};
/***/ }),
/* 48 */
/*!**********************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/isURLSameOrigin.js ***!
\**********************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
module.exports =
utils.isStandardBrowserEnv() ?
// Standard browser envs have full support of the APIs needed to test
// whether the request URL is of the same origin as current location.
function standardBrowserEnv() {
var msie = /(msie|trident)/i.test(navigator.userAgent);
var urlParsingNode = document.createElement('a');
var originURL;
/**
* Parse a URL to discover it's components
*
* @param {String} url The URL to be parsed
* @returns {Object}
*/
function resolveURL(url) {
var href = url;
if (msie) {
// IE needs attribute set twice to normalize properties
urlParsingNode.setAttribute('href', href);
href = urlParsingNode.href;
}
urlParsingNode.setAttribute('href', href);
// urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
return {
href: urlParsingNode.href,
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
host: urlParsingNode.host,
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
hostname: urlParsingNode.hostname,
port: urlParsingNode.port,
pathname: urlParsingNode.pathname.charAt(0) === '/' ?
urlParsingNode.pathname :
'/' + urlParsingNode.pathname };
}
originURL = resolveURL(window.location.href);
/**
* Determine if a URL shares the same origin as the current location
*
* @param {String} requestURL The URL to test
* @returns {boolean} True if URL shares the same origin, otherwise false
*/
return function isURLSameOrigin(requestURL) {
var parsed = utils.isString(requestURL) ? resolveURL(requestURL) : requestURL;
return parsed.protocol === originURL.protocol &&
parsed.host === originURL.host;
};
}() :
// Non standard browser envs (web workers, react-native) lack needed support.
function nonStandardBrowserEnv() {
return function isURLSameOrigin() {
return true;
};
}();
/***/ }),
/* 49 */
/*!************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/cancel/Cancel.js ***!
\************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* A `Cancel` is an object that is thrown when an operation is canceled.
*
* @class
* @param {string=} message The message.
*/
function Cancel(message) {
this.message = message;
}
Cancel.prototype.toString = function toString() {
return 'Cancel' + (this.message ? ': ' + this.message : '');
};
Cancel.prototype.__CANCEL__ = true;
module.exports = Cancel;
/***/ }),
/* 50 */
/*!**************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/cancel/isCancel.js ***!
\**************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function isCancel(value) {
return !!(value && value.__CANCEL__);
};
/***/ }),
/* 51 */
/*!***************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/core/mergeConfig.js ***!
\***************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ../utils */ 27);
/**
* Config-specific merge-function which creates a new config-object
* by merging two configuration objects together.
*
* @param {Object} config1
* @param {Object} config2
* @returns {Object} New object resulting from merging config2 to config1
*/
module.exports = function mergeConfig(config1, config2) {
// eslint-disable-next-line no-param-reassign
config2 = config2 || {};
var config = {};
function getMergedValue(target, source) {
if (utils.isPlainObject(target) && utils.isPlainObject(source)) {
return utils.merge(target, source);
} else if (utils.isPlainObject(source)) {
return utils.merge({}, source);
} else if (utils.isArray(source)) {
return source.slice();
}
return source;
}
// eslint-disable-next-line consistent-return
function mergeDeepProperties(prop) {
if (!utils.isUndefined(config2[prop])) {
return getMergedValue(config1[prop], config2[prop]);
} else if (!utils.isUndefined(config1[prop])) {
return getMergedValue(undefined, config1[prop]);
}
}
// eslint-disable-next-line consistent-return
function valueFromConfig2(prop) {
if (!utils.isUndefined(config2[prop])) {
return getMergedValue(undefined, config2[prop]);
}
}
// eslint-disable-next-line consistent-return
function defaultToConfig2(prop) {
if (!utils.isUndefined(config2[prop])) {
return getMergedValue(undefined, config2[prop]);
} else if (!utils.isUndefined(config1[prop])) {
return getMergedValue(undefined, config1[prop]);
}
}
// eslint-disable-next-line consistent-return
function mergeDirectKeys(prop) {
if (prop in config2) {
return getMergedValue(config1[prop], config2[prop]);
} else if (prop in config1) {
return getMergedValue(undefined, config1[prop]);
}
}
var mergeMap = {
'url': valueFromConfig2,
'method': valueFromConfig2,
'data': valueFromConfig2,
'baseURL': defaultToConfig2,
'transformRequest': defaultToConfig2,
'transformResponse': defaultToConfig2,
'paramsSerializer': defaultToConfig2,
'timeout': defaultToConfig2,
'timeoutMessage': defaultToConfig2,
'withCredentials': defaultToConfig2,
'adapter': defaultToConfig2,
'responseType': defaultToConfig2,
'xsrfCookieName': defaultToConfig2,
'xsrfHeaderName': defaultToConfig2,
'onUploadProgress': defaultToConfig2,
'onDownloadProgress': defaultToConfig2,
'decompress': defaultToConfig2,
'maxContentLength': defaultToConfig2,
'maxBodyLength': defaultToConfig2,
'transport': defaultToConfig2,
'httpAgent': defaultToConfig2,
'httpsAgent': defaultToConfig2,
'cancelToken': defaultToConfig2,
'socketPath': defaultToConfig2,
'responseEncoding': defaultToConfig2,
'validateStatus': mergeDirectKeys };
utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {
var merge = mergeMap[prop] || mergeDeepProperties;
var configValue = merge(prop);
utils.isUndefined(configValue) && merge !== mergeDirectKeys || (config[prop] = configValue);
});
return config;
};
/***/ }),
/* 52 */
/*!****************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/validator.js ***!
\****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var VERSION = __webpack_require__(/*! ../env/data */ 53).version;
var validators = {};
// eslint-disable-next-line func-names
['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function (type, i) {
validators[type] = function validator(thing) {
return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
};
});
var deprecatedWarnings = {};
/**
* Transitional option validator
* @param {function|boolean?} validator - set to false if the transitional option has been removed
* @param {string?} version - deprecated version / removed since version
* @param {string?} message - some message with additional info
* @returns {function}
*/
validators.transitional = function transitional(validator, version, message) {
function formatMessage(opt, desc) {
return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
}
// eslint-disable-next-line func-names
return function (value, opt, opts) {
if (validator === false) {
throw new Error(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')));
}
if (version && !deprecatedWarnings[opt]) {
deprecatedWarnings[opt] = true;
// eslint-disable-next-line no-console
console.warn(
formatMessage(
opt,
' has been deprecated since v' + version + ' and will be removed in the near future'));
}
return validator ? validator(value, opt, opts) : true;
};
};
/**
* Assert object's properties type
* @param {object} options
* @param {object} schema
* @param {boolean?} allowUnknown
*/
function assertOptions(options, schema, allowUnknown) {
if (typeof options !== 'object') {
throw new TypeError('options must be an object');
}
var keys = Object.keys(options);
var i = keys.length;
while (i-- > 0) {
var opt = keys[i];
var validator = schema[opt];
if (validator) {
var value = options[opt];
var result = value === undefined || validator(value, opt, options);
if (result !== true) {
throw new TypeError('option ' + opt + ' must be ' + result);
}
continue;
}
if (allowUnknown !== true) {
throw Error('Unknown option ' + opt);
}
}
}
module.exports = {
assertOptions: assertOptions,
validators: validators };
/***/ }),
/* 53 */
/*!*******************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/env/data.js ***!
\*******************************************************************/
/*! no static exports found */
/***/ (function(module, exports) {
module.exports = {
"version": "0.26.1" };
/***/ }),
/* 54 */
/*!*****************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/cancel/CancelToken.js ***!
\*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var Cancel = __webpack_require__(/*! ./Cancel */ 49);
/**
* A `CancelToken` is an object that can be used to request cancellation of an operation.
*
* @class
* @param {Function} executor The executor function.
*/
function CancelToken(executor) {
if (typeof executor !== 'function') {
throw new TypeError('executor must be a function.');
}
var resolvePromise;
this.promise = new Promise(function promiseExecutor(resolve) {
resolvePromise = resolve;
});
var token = this;
// eslint-disable-next-line func-names
this.promise.then(function (cancel) {
if (!token._listeners) return;
var i;
var l = token._listeners.length;
for (i = 0; i < l; i++) {
token._listeners[i](cancel);
}
token._listeners = null;
});
// eslint-disable-next-line func-names
this.promise.then = function (onfulfilled) {
var _resolve;
// eslint-disable-next-line func-names
var promise = new Promise(function (resolve) {
token.subscribe(resolve);
_resolve = resolve;
}).then(onfulfilled);
promise.cancel = function reject() {
token.unsubscribe(_resolve);
};
return promise;
};
executor(function cancel(message) {
if (token.reason) {
// Cancellation has already been requested
return;
}
token.reason = new Cancel(message);
resolvePromise(token.reason);
});
}
/**
* Throws a `Cancel` if cancellation has been requested.
*/
CancelToken.prototype.throwIfRequested = function throwIfRequested() {
if (this.reason) {
throw this.reason;
}
};
/**
* Subscribe to the cancel signal
*/
CancelToken.prototype.subscribe = function subscribe(listener) {
if (this.reason) {
listener(this.reason);
return;
}
if (this._listeners) {
this._listeners.push(listener);
} else {
this._listeners = [listener];
}
};
/**
* Unsubscribe from the cancel signal
*/
CancelToken.prototype.unsubscribe = function unsubscribe(listener) {
if (!this._listeners) {
return;
}
var index = this._listeners.indexOf(listener);
if (index !== -1) {
this._listeners.splice(index, 1);
}
};
/**
* Returns an object that contains a new `CancelToken` and a function that, when called,
* cancels the `CancelToken`.
*/
CancelToken.source = function source() {
var cancel;
var token = new CancelToken(function executor(c) {
cancel = c;
});
return {
token: token,
cancel: cancel };
};
module.exports = CancelToken;
/***/ }),
/* 55 */
/*!*************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/spread.js ***!
\*************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* Syntactic sugar for invoking a function and expanding an array for arguments.
*
* Common use case would be to use `Function.prototype.apply`.
*
* ```js
* function f(x, y, z) {}
* var args = [1, 2, 3];
* f.apply(null, args);
* ```
*
* With `spread` this example can be re-written.
*
* ```js
* spread(function(x, y, z) {})([1, 2, 3]);
* ```
*
* @param {Function} callback
* @returns {Function}
*/
module.exports = function spread(callback) {
return function wrap(arr) {
return callback.apply(null, arr);
};
};
/***/ }),
/* 56 */
/*!*******************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/node_modules/axios/lib/helpers/isAxiosError.js ***!
\*******************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./../utils */ 27);
/**
* Determines whether the payload is an error thrown by Axios
*
* @param {*} payload The value to test
* @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
*/
module.exports = function isAxiosError(payload) {
return utils.isObject(payload) && payload.isAxiosError === true;
};
/***/ }),
/* 57 */
/*!**************************************!*\
!*** ./node_modules/qs/lib/index.js ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var stringify = __webpack_require__(/*! ./stringify */ 58);
var parse = __webpack_require__(/*! ./parse */ 61);
var formats = __webpack_require__(/*! ./formats */ 60);
module.exports = {
formats: formats,
parse: parse,
stringify: stringify
};
/***/ }),
/* 58 */
/*!******************************************!*\
!*** ./node_modules/qs/lib/stringify.js ***!
\******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./utils */ 59);
var formats = __webpack_require__(/*! ./formats */ 60);
var arrayPrefixGenerators = {
brackets: function brackets(prefix) { // eslint-disable-line func-name-matching
return prefix + '[]';
},
indices: function indices(prefix, key) { // eslint-disable-line func-name-matching
return prefix + '[' + key + ']';
},
repeat: function repeat(prefix) { // eslint-disable-line func-name-matching
return prefix;
}
};
var toISO = Date.prototype.toISOString;
var defaults = {
delimiter: '&',
encode: true,
encoder: utils.encode,
encodeValuesOnly: false,
serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching
return toISO.call(date);
},
skipNulls: false,
strictNullHandling: false
};
var stringify = function stringify( // eslint-disable-line func-name-matching
object,
prefix,
generateArrayPrefix,
strictNullHandling,
skipNulls,
encoder,
filter,
sort,
allowDots,
serializeDate,
formatter,
encodeValuesOnly
) {
var obj = object;
if (typeof filter === 'function') {
obj = filter(prefix, obj);
} else if (obj instanceof Date) {
obj = serializeDate(obj);
} else if (obj === null) {
if (strictNullHandling) {
return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;
}
obj = '';
}
if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {
if (encoder) {
var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);
return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];
}
return [formatter(prefix) + '=' + formatter(String(obj))];
}
var values = [];
if (typeof obj === 'undefined') {
return values;
}
var objKeys;
if (Array.isArray(filter)) {
objKeys = filter;
} else {
var keys = Object.keys(obj);
objKeys = sort ? keys.sort(sort) : keys;
}
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
if (skipNulls && obj[key] === null) {
continue;
}
if (Array.isArray(obj)) {
values = values.concat(stringify(
obj[key],
generateArrayPrefix(prefix, key),
generateArrayPrefix,
strictNullHandling,
skipNulls,
encoder,
filter,
sort,
allowDots,
serializeDate,
formatter,
encodeValuesOnly
));
} else {
values = values.concat(stringify(
obj[key],
prefix + (allowDots ? '.' + key : '[' + key + ']'),
generateArrayPrefix,
strictNullHandling,
skipNulls,
encoder,
filter,
sort,
allowDots,
serializeDate,
formatter,
encodeValuesOnly
));
}
}
return values;
};
module.exports = function (object, opts) {
var obj = object;
var options = opts ? utils.assign({}, opts) : {};
if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
throw new TypeError('Encoder has to be a function.');
}
var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;
var sort = typeof options.sort === 'function' ? options.sort : null;
var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;
var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;
if (typeof options.format === 'undefined') {
options.format = formats['default'];
} else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {
throw new TypeError('Unknown format option provided.');
}
var formatter = formats.formatters[options.format];
var objKeys;
var filter;
if (typeof options.filter === 'function') {
filter = options.filter;
obj = filter('', obj);
} else if (Array.isArray(options.filter)) {
filter = options.filter;
objKeys = filter;
}
var keys = [];
if (typeof obj !== 'object' || obj === null) {
return '';
}
var arrayFormat;
if (options.arrayFormat in arrayPrefixGenerators) {
arrayFormat = options.arrayFormat;
} else if ('indices' in options) {
arrayFormat = options.indices ? 'indices' : 'repeat';
} else {
arrayFormat = 'indices';
}
var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
if (!objKeys) {
objKeys = Object.keys(obj);
}
if (sort) {
objKeys.sort(sort);
}
for (var i = 0; i < objKeys.length; ++i) {
var key = objKeys[i];
if (skipNulls && obj[key] === null) {
continue;
}
keys = keys.concat(stringify(
obj[key],
key,
generateArrayPrefix,
strictNullHandling,
skipNulls,
encode ? encoder : null,
filter,
sort,
allowDots,
serializeDate,
formatter,
encodeValuesOnly
));
}
var joined = keys.join(delimiter);
var prefix = options.addQueryPrefix === true ? '?' : '';
return joined.length > 0 ? prefix + joined : '';
};
/***/ }),
/* 59 */
/*!**************************************!*\
!*** ./node_modules/qs/lib/utils.js ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var has = Object.prototype.hasOwnProperty;
var hexTable = (function () {
var array = [];
for (var i = 0; i < 256; ++i) {
array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());
}
return array;
}());
var compactQueue = function compactQueue(queue) {
var obj;
while (queue.length) {
var item = queue.pop();
obj = item.obj[item.prop];
if (Array.isArray(obj)) {
var compacted = [];
for (var j = 0; j < obj.length; ++j) {
if (typeof obj[j] !== 'undefined') {
compacted.push(obj[j]);
}
}
item.obj[item.prop] = compacted;
}
}
return obj;
};
var arrayToObject = function arrayToObject(source, options) {
var obj = options && options.plainObjects ? Object.create(null) : {};
for (var i = 0; i < source.length; ++i) {
if (typeof source[i] !== 'undefined') {
obj[i] = source[i];
}
}
return obj;
};
var merge = function merge(target, source, options) {
if (!source) {
return target;
}
if (typeof source !== 'object') {
if (Array.isArray(target)) {
target.push(source);
} else if (typeof target === 'object') {
if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {
target[source] = true;
}
} else {
return [target, source];
}
return target;
}
if (typeof target !== 'object') {
return [target].concat(source);
}
var mergeTarget = target;
if (Array.isArray(target) && !Array.isArray(source)) {
mergeTarget = arrayToObject(target, options);
}
if (Array.isArray(target) && Array.isArray(source)) {
source.forEach(function (item, i) {
if (has.call(target, i)) {
if (target[i] && typeof target[i] === 'object') {
target[i] = merge(target[i], item, options);
} else {
target.push(item);
}
} else {
target[i] = item;
}
});
return target;
}
return Object.keys(source).reduce(function (acc, key) {
var value = source[key];
if (has.call(acc, key)) {
acc[key] = merge(acc[key], value, options);
} else {
acc[key] = value;
}
return acc;
}, mergeTarget);
};
var assign = function assignSingleSource(target, source) {
return Object.keys(source).reduce(function (acc, key) {
acc[key] = source[key];
return acc;
}, target);
};
var decode = function (str) {
try {
return decodeURIComponent(str.replace(/\+/g, ' '));
} catch (e) {
return str;
}
};
var encode = function encode(str) {
// This code was originally written by Brian White (mscdex) for the io.js core querystring library.
// It has been adapted here for stricter adherence to RFC 3986
if (str.length === 0) {
return str;
}
var string = typeof str === 'string' ? str : String(str);
var out = '';
for (var i = 0; i < string.length; ++i) {
var c = string.charCodeAt(i);
if (
c === 0x2D // -
|| c === 0x2E // .
|| c === 0x5F // _
|| c === 0x7E // ~
|| (c >= 0x30 && c <= 0x39) // 0-9
|| (c >= 0x41 && c <= 0x5A) // a-z
|| (c >= 0x61 && c <= 0x7A) // A-Z
) {
out += string.charAt(i);
continue;
}
if (c < 0x80) {
out = out + hexTable[c];
continue;
}
if (c < 0x800) {
out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
continue;
}
if (c < 0xD800 || c >= 0xE000) {
out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
continue;
}
i += 1;
c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
out += hexTable[0xF0 | (c >> 18)]
+ hexTable[0x80 | ((c >> 12) & 0x3F)]
+ hexTable[0x80 | ((c >> 6) & 0x3F)]
+ hexTable[0x80 | (c & 0x3F)];
}
return out;
};
var compact = function compact(value) {
var queue = [{ obj: { o: value }, prop: 'o' }];
var refs = [];
for (var i = 0; i < queue.length; ++i) {
var item = queue[i];
var obj = item.obj[item.prop];
var keys = Object.keys(obj);
for (var j = 0; j < keys.length; ++j) {
var key = keys[j];
var val = obj[key];
if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {
queue.push({ obj: obj, prop: key });
refs.push(val);
}
}
}
return compactQueue(queue);
};
var isRegExp = function isRegExp(obj) {
return Object.prototype.toString.call(obj) === '[object RegExp]';
};
var isBuffer = function isBuffer(obj) {
if (obj === null || typeof obj === 'undefined') {
return false;
}
return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
};
module.exports = {
arrayToObject: arrayToObject,
assign: assign,
compact: compact,
decode: decode,
encode: encode,
isBuffer: isBuffer,
isRegExp: isRegExp,
merge: merge
};
/***/ }),
/* 60 */
/*!****************************************!*\
!*** ./node_modules/qs/lib/formats.js ***!
\****************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var replace = String.prototype.replace;
var percentTwenties = /%20/g;
module.exports = {
'default': 'RFC3986',
formatters: {
RFC1738: function (value) {
return replace.call(value, percentTwenties, '+');
},
RFC3986: function (value) {
return value;
}
},
RFC1738: 'RFC1738',
RFC3986: 'RFC3986'
};
/***/ }),
/* 61 */
/*!**************************************!*\
!*** ./node_modules/qs/lib/parse.js ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var utils = __webpack_require__(/*! ./utils */ 59);
var has = Object.prototype.hasOwnProperty;
var defaults = {
allowDots: false,
allowPrototypes: false,
arrayLimit: 20,
decoder: utils.decode,
delimiter: '&',
depth: 5,
parameterLimit: 1000,
plainObjects: false,
strictNullHandling: false
};
var parseValues = function parseQueryStringValues(str, options) {
var obj = {};
var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str;
var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;
var parts = cleanStr.split(options.delimiter, limit);
for (var i = 0; i < parts.length; ++i) {
var part = parts[i];
var bracketEqualsPos = part.indexOf(']=');
var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;
var key, val;
if (pos === -1) {
key = options.decoder(part, defaults.decoder);
val = options.strictNullHandling ? null : '';
} else {
key = options.decoder(part.slice(0, pos), defaults.decoder);
val = options.decoder(part.slice(pos + 1), defaults.decoder);
}
if (has.call(obj, key)) {
obj[key] = [].concat(obj[key]).concat(val);
} else {
obj[key] = val;
}
}
return obj;
};
var parseObject = function (chain, val, options) {
var leaf = val;
for (var i = chain.length - 1; i >= 0; --i) {
var obj;
var root = chain[i];
if (root === '[]') {
obj = [];
obj = obj.concat(leaf);
} else {
obj = options.plainObjects ? Object.create(null) : {};
var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;
var index = parseInt(cleanRoot, 10);
if (
!isNaN(index)
&& root !== cleanRoot
&& String(index) === cleanRoot
&& index >= 0
&& (options.parseArrays && index <= options.arrayLimit)
) {
obj = [];
obj[index] = leaf;
} else {
obj[cleanRoot] = leaf;
}
}
leaf = obj;
}
return leaf;
};
var parseKeys = function parseQueryStringKeys(givenKey, val, options) {
if (!givenKey) {
return;
}
// Transform dot notation to bracket notation
var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;
// The regex chunks
var brackets = /(\[[^[\]]*])/;
var child = /(\[[^[\]]*])/g;
// Get the parent
var segment = brackets.exec(key);
var parent = segment ? key.slice(0, segment.index) : key;
// Stash the parent if it exists
var keys = [];
if (parent) {
// If we aren't using plain objects, optionally prefix keys
// that would overwrite object prototype properties
if (!options.plainObjects && has.call(Object.prototype, parent)) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(parent);
}
// Loop through children appending to the array until we hit depth
var i = 0;
while ((segment = child.exec(key)) !== null && i < options.depth) {
i += 1;
if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {
if (!options.allowPrototypes) {
return;
}
}
keys.push(segment[1]);
}
// If there's a remainder, just add whatever is left
if (segment) {
keys.push('[' + key.slice(segment.index) + ']');
}
return parseObject(keys, val, options);
};
module.exports = function (str, opts) {
var options = opts ? utils.assign({}, opts) : {};
if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {
throw new TypeError('Decoder has to be a function.');
}
options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;
options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;
options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;
options.parseArrays = options.parseArrays !== false;
options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;
options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;
options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;
options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;
options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;
options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
if (str === '' || str === null || typeof str === 'undefined') {
return options.plainObjects ? Object.create(null) : {};
}
var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
var obj = options.plainObjects ? Object.create(null) : {};
// Iterate over the keys and setup the new object
var keys = Object.keys(tempObj);
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
var newObj = parseKeys(key, tempObj[key], options);
obj = utils.merge(obj, newObj, options);
}
return utils.compact(obj);
};
/***/ }),
/* 62 */,
/* 63 */,
/* 64 */,
/* 65 */,
/* 66 */,
/* 67 */,
/* 68 */,
/* 69 */,
/* 70 */,
/* 71 */,
/* 72 */,
/* 73 */,
/* 74 */,
/* 75 */,
/* 76 */,
/* 77 */,
/* 78 */
/*!***********************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/api/creator.js ***!
\***********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });exports.getBannerList = getBannerList;exports.getUserImgList = getUserImgList;exports.detailsTiktokImg = detailsTiktokImg;exports.judgeTiktokLike = judgeTiktokLike;exports.judgeTiktokCollect = judgeTiktokCollect;exports.tiktokLike = tiktokLike;exports.tiktokUnLike = tiktokUnLike;exports.tiktokCollect = tiktokCollect;exports.tiktokUnCollect = tiktokUnCollect;var _request = _interopRequireDefault(__webpack_require__(/*! @/utils/request */ 24));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
var serviceTitle = '/img';
//GET 传参需要用 params
//POST 传参需要用 data
//获取banner列表
function getBannerList() {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/listBanner"),
method: 'get' });
}
//获取小程序用户图片列表
function getUserImgList() {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/tiktokUserImgs"),
method: 'get' });
}
// 获取图片详情
function detailsTiktokImg(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/detailsTiktokImg/").concat(data),
method: 'get' });
}
// 查询是否点赞过
function judgeTiktokLike(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/judgeTiktokLike"),
method: 'post',
data: data });
}
// 查询是否收藏过
function judgeTiktokCollect(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/judgeTiktokCollect"),
method: 'post',
data: data });
}
// 点赞
function tiktokLike(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/tiktokLike"),
method: 'post',
data: data });
}
// 取消点赞
function tiktokUnLike(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/tiktokUnLike"),
method: 'post',
data: data });
}
// 收藏
function tiktokCollect(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/tiktokCollect"),
method: 'post',
data: data });
}
// 取消收藏
function tiktokUnCollect(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/tiktokUnCollect"),
method: 'post',
data: data });
}
/***/ }),
/* 79 */,
/* 80 */,
/* 81 */,
/* 82 */,
/* 83 */,
/* 84 */,
/* 85 */,
/* 86 */,
/* 87 */,
/* 88 */,
/* 89 */,
/* 90 */,
/* 91 */,
/* 92 */,
/* 93 */,
/* 94 */,
/* 95 */,
/* 96 */,
/* 97 */,
/* 98 */,
/* 99 */,
/* 100 */,
/* 101 */,
/* 102 */,
/* 103 */,
/* 104 */,
/* 105 */,
/* 106 */,
/* 107 */,
/* 108 */,
/* 109 */
/*!****************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/api/myCollection.js ***!
\****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });exports.getCollectionList = getCollectionList;var _request = _interopRequireDefault(__webpack_require__(/*! @/utils/request */ 24));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
var serviceTitle = '/img';
//GET 传参需要用 params
//POST 传参需要用 data
//获取用户收藏列表
function getCollectionList(data) {
return (0, _request.default)({
url: "".concat(serviceTitle, "/img/mini/tiktok/listTiktokCollection"),
method: 'post',
data: data });
}
/***/ }),
/* 110 */,
/* 111 */,
/* 112 */,
/* 113 */,
/* 114 */,
/* 115 */,
/* 116 */,
/* 117 */,
/* 118 */,
/* 119 */,
/* 120 */,
/* 121 */,
/* 122 */,
/* 123 */,
/* 124 */,
/* 125 */,
/* 126 */,
/* 127 */,
/* 128 */,
/* 129 */,
/* 130 */,
/* 131 */,
/* 132 */,
/* 133 */
/*!***************************************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js ***!
\***************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });exports.default = void 0;var _en = _interopRequireDefault(__webpack_require__(/*! ./en.json */ 134));
var _zhHans = _interopRequireDefault(__webpack_require__(/*! ./zh-Hans.json */ 135));
var _zhHant = _interopRequireDefault(__webpack_require__(/*! ./zh-Hant.json */ 136));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}var _default =
{
en: _en.default,
'zh-Hans': _zhHans.default,
'zh-Hant': _zhHant.default };exports.default = _default;
/***/ }),
/* 134 */
/*!**************************************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json ***!
\**************************************************************************************************/
/*! exports provided: uni-search-bar.cancel, uni-search-bar.placeholder, default */
/***/ (function(module) {
module.exports = JSON.parse("{\"uni-search-bar.cancel\":\"cancel\",\"uni-search-bar.placeholder\":\"Search enter content\"}");
/***/ }),
/* 135 */
/*!*******************************************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json ***!
\*******************************************************************************************************/
/*! exports provided: uni-search-bar.cancel, uni-search-bar.placeholder, default */
/***/ (function(module) {
module.exports = JSON.parse("{\"uni-search-bar.cancel\":\"cancel\",\"uni-search-bar.placeholder\":\"请输入搜索内容\"}");
/***/ }),
/* 136 */
/*!*******************************************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json ***!
\*******************************************************************************************************/
/*! exports provided: uni-search-bar.cancel, uni-search-bar.placeholder, default */
/***/ (function(module) {
module.exports = JSON.parse("{\"uni-search-bar.cancel\":\"cancel\",\"uni-search-bar.placeholder\":\"請輸入搜索內容\"}");
/***/ }),
/* 137 */,
/* 138 */,
/* 139 */,
/* 140 */,
/* 141 */,
/* 142 */,
/* 143 */,
/* 144 */,
/* 145 */,
/* 146 */,
/* 147 */,
/* 148 */,
/* 149 */,
/* 150 */,
/* 151 */,
/* 152 */,
/* 153 */,
/* 154 */,
/* 155 */,
/* 156 */,
/* 157 */,
/* 158 */,
/* 159 */,
/* 160 */,
/* 161 */,
/* 162 */,
/* 163 */,
/* 164 */,
/* 165 */
/*!************************************************************************************!*\
!*** E:/开发/bnyer-cloud-tiktok/uni_modules/uni-icons/components/uni-icons/icons.js ***!
\************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });exports.default = void 0;var _default = {
"id": "2852637",
"name": "uniui图标库",
"font_family": "uniicons",
"css_prefix_text": "uniui-",
"description": "",
"glyphs": [
{
"icon_id": "25027049",
"name": "yanse",
"font_class": "color",
"unicode": "e6cf",
"unicode_decimal": 59087 },
{
"icon_id": "25027048",
"name": "wallet",
"font_class": "wallet",
"unicode": "e6b1",
"unicode_decimal": 59057 },
{
"icon_id": "25015720",
"name": "settings-filled",
"font_class": "settings-filled",
"unicode": "e6ce",
"unicode_decimal": 59086 },
{
"icon_id": "25015434",
"name": "shimingrenzheng-filled",
"font_class": "auth-filled",
"unicode": "e6cc",
"unicode_decimal": 59084 },
{
"icon_id": "24934246",
"name": "shop-filled",
"font_class": "shop-filled",
"unicode": "e6cd",
"unicode_decimal": 59085 },
{
"icon_id": "24934159",
"name": "staff-filled-01",
"font_class": "staff-filled",
"unicode": "e6cb",
"unicode_decimal": 59083 },
{
"icon_id": "24932461",
"name": "VIP-filled",
"font_class": "vip-filled",
"unicode": "e6c6",
"unicode_decimal": 59078 },
{
"icon_id": "24932462",
"name": "plus_circle_fill",
"font_class": "plus-filled",
"unicode": "e6c7",
"unicode_decimal": 59079 },
{
"icon_id": "24932463",
"name": "folder_add-filled",
"font_class": "folder-add-filled",
"unicode": "e6c8",
"unicode_decimal": 59080 },
{
"icon_id": "24932464",
"name": "yanse-filled",
"font_class": "color-filled",
"unicode": "e6c9",
"unicode_decimal": 59081 },
{
"icon_id": "24932465",
"name": "tune-filled",
"font_class": "tune-filled",
"unicode": "e6ca",
"unicode_decimal": 59082 },
{
"icon_id": "24932455",
"name": "a-rilidaka-filled",
"font_class": "calendar-filled",
"unicode": "e6c0",
"unicode_decimal": 59072 },
{
"icon_id": "24932456",
"name": "notification-filled",
"font_class": "notification-filled",
"unicode": "e6c1",
"unicode_decimal": 59073 },
{
"icon_id": "24932457",
"name": "wallet-filled",
"font_class": "wallet-filled",
"unicode": "e6c2",
"unicode_decimal": 59074 },
{
"icon_id": "24932458",
"name": "paihangbang-filled",
"font_class": "medal-filled",
"unicode": "e6c3",
"unicode_decimal": 59075 },
{
"icon_id": "24932459",
"name": "gift-filled",
"font_class": "gift-filled",
"unicode": "e6c4",
"unicode_decimal": 59076 },
{
"icon_id": "24932460",
"name": "fire-filled",
"font_class": "fire-filled",
"unicode": "e6c5",
"unicode_decimal": 59077 },
{
"icon_id": "24928001",
"name": "refreshempty",
"font_class": "refreshempty",
"unicode": "e6bf",
"unicode_decimal": 59071 },
{
"icon_id": "24926853",
"name": "location-ellipse",
"font_class": "location-filled",
"unicode": "e6af",
"unicode_decimal": 59055 },
{
"icon_id": "24926735",
"name": "person-filled",
"font_class": "person-filled",
"unicode": "e69d",
"unicode_decimal": 59037 },
{
"icon_id": "24926703",
"name": "personadd-filled",
"font_class": "personadd-filled",
"unicode": "e698",
"unicode_decimal": 59032 },
{
"icon_id": "24923351",
"name": "back",
"font_class": "back",
"unicode": "e6b9",
"unicode_decimal": 59065 },
{
"icon_id": "24923352",
"name": "forward",
"font_class": "forward",
"unicode": "e6ba",
"unicode_decimal": 59066 },
{
"icon_id": "24923353",
"name": "arrowthinright",
"font_class": "arrow-right",
"unicode": "e6bb",
"unicode_decimal": 59067 },
{
"icon_id": "24923353",
"name": "arrowthinright",
"font_class": "arrowthinright",
"unicode": "e6bb",
"unicode_decimal": 59067 },
{
"icon_id": "24923354",
"name": "arrowthinleft",
"font_class": "arrow-left",
"unicode": "e6bc",
"unicode_decimal": 59068 },
{
"icon_id": "24923354",
"name": "arrowthinleft",
"font_class": "arrowthinleft",
"unicode": "e6bc",
"unicode_decimal": 59068 },
{
"icon_id": "24923355",
"name": "arrowthinup",
"font_class": "arrow-up",
"unicode": "e6bd",
"unicode_decimal": 59069 },
{
"icon_id": "24923355",
"name": "arrowthinup",
"font_class": "arrowthinup",
"unicode": "e6bd",
"unicode_decimal": 59069 },
{
"icon_id": "24923356",
"name": "arrowthindown",
"font_class": "arrow-down",
"unicode": "e6be",
"unicode_decimal": 59070 },
{
"icon_id": "24923356",
"name": "arrowthindown",
"font_class": "arrowthindown",
"unicode": "e6be",
"unicode_decimal": 59070 },
{
"icon_id": "24923349",
"name": "arrowdown",
"font_class": "bottom",
"unicode": "e6b8",
"unicode_decimal": 59064 },
{
"icon_id": "24923349",
"name": "arrowdown",
"font_class": "arrowdown",
"unicode": "e6b8",
"unicode_decimal": 59064 },
{
"icon_id": "24923346",
"name": "arrowright",
"font_class": "right",
"unicode": "e6b5",
"unicode_decimal": 59061 },
{
"icon_id": "24923346",
"name": "arrowright",
"font_class": "arrowright",
"unicode": "e6b5",
"unicode_decimal": 59061 },
{
"icon_id": "24923347",
"name": "arrowup",
"font_class": "top",
"unicode": "e6b6",
"unicode_decimal": 59062 },
{
"icon_id": "24923347",
"name": "arrowup",
"font_class": "arrowup",
"unicode": "e6b6",
"unicode_decimal": 59062 },
{
"icon_id": "24923348",
"name": "arrowleft",
"font_class": "left",
"unicode": "e6b7",
"unicode_decimal": 59063 },
{
"icon_id": "24923348",
"name": "arrowleft",
"font_class": "arrowleft",
"unicode": "e6b7",
"unicode_decimal": 59063 },
{
"icon_id": "24923334",
"name": "eye",
"font_class": "eye",
"unicode": "e651",
"unicode_decimal": 58961 },
{
"icon_id": "24923335",
"name": "eye-filled",
"font_class": "eye-filled",
"unicode": "e66a",
"unicode_decimal": 58986 },
{
"icon_id": "24923336",
"name": "eye-slash",
"font_class": "eye-slash",
"unicode": "e6b3",
"unicode_decimal": 59059 },
{
"icon_id": "24923337",
"name": "eye-slash-filled",
"font_class": "eye-slash-filled",
"unicode": "e6b4",
"unicode_decimal": 59060 },
{
"icon_id": "24923305",
"name": "info-filled",
"font_class": "info-filled",
"unicode": "e649",
"unicode_decimal": 58953 },
{
"icon_id": "24923299",
"name": "reload-01",
"font_class": "reload",
"unicode": "e6b2",
"unicode_decimal": 59058 },
{
"icon_id": "24923195",
"name": "mic_slash_fill",
"font_class": "micoff-filled",
"unicode": "e6b0",
"unicode_decimal": 59056 },
{
"icon_id": "24923165",
"name": "map-pin-ellipse",
"font_class": "map-pin-ellipse",
"unicode": "e6ac",
"unicode_decimal": 59052 },
{
"icon_id": "24923166",
"name": "map-pin",
"font_class": "map-pin",
"unicode": "e6ad",
"unicode_decimal": 59053 },
{
"icon_id": "24923167",
"name": "location",
"font_class": "location",
"unicode": "e6ae",
"unicode_decimal": 59054 },
{
"icon_id": "24923064",
"name": "starhalf",
"font_class": "starhalf",
"unicode": "e683",
"unicode_decimal": 59011 },
{
"icon_id": "24923065",
"name": "star",
"font_class": "star",
"unicode": "e688",
"unicode_decimal": 59016 },
{
"icon_id": "24923066",
"name": "star-filled",
"font_class": "star-filled",
"unicode": "e68f",
"unicode_decimal": 59023 },
{
"icon_id": "24899646",
"name": "a-rilidaka",
"font_class": "calendar",
"unicode": "e6a0",
"unicode_decimal": 59040 },
{
"icon_id": "24899647",
"name": "fire",
"font_class": "fire",
"unicode": "e6a1",
"unicode_decimal": 59041 },
{
"icon_id": "24899648",
"name": "paihangbang",
"font_class": "medal",
"unicode": "e6a2",
"unicode_decimal": 59042 },
{
"icon_id": "24899649",
"name": "font",
"font_class": "font",
"unicode": "e6a3",
"unicode_decimal": 59043 },
{
"icon_id": "24899650",
"name": "gift",
"font_class": "gift",
"unicode": "e6a4",
"unicode_decimal": 59044 },
{
"icon_id": "24899651",
"name": "link",
"font_class": "link",
"unicode": "e6a5",
"unicode_decimal": 59045 },
{
"icon_id": "24899652",
"name": "notification",
"font_class": "notification",
"unicode": "e6a6",
"unicode_decimal": 59046 },
{
"icon_id": "24899653",
"name": "staff",
"font_class": "staff",
"unicode": "e6a7",
"unicode_decimal": 59047 },
{
"icon_id": "24899654",
"name": "VIP",
"font_class": "vip",
"unicode": "e6a8",
"unicode_decimal": 59048 },
{
"icon_id": "24899655",
"name": "folder_add",
"font_class": "folder-add",
"unicode": "e6a9",
"unicode_decimal": 59049 },
{
"icon_id": "24899656",
"name": "tune",
"font_class": "tune",
"unicode": "e6aa",
"unicode_decimal": 59050 },
{
"icon_id": "24899657",
"name": "shimingrenzheng",
"font_class": "auth",
"unicode": "e6ab",
"unicode_decimal": 59051 },
{
"icon_id": "24899565",
"name": "person",
"font_class": "person",
"unicode": "e699",
"unicode_decimal": 59033 },
{
"icon_id": "24899566",
"name": "email-filled",
"font_class": "email-filled",
"unicode": "e69a",
"unicode_decimal": 59034 },
{
"icon_id": "24899567",
"name": "phone-filled",
"font_class": "phone-filled",
"unicode": "e69b",
"unicode_decimal": 59035 },
{
"icon_id": "24899568",
"name": "phone",
"font_class": "phone",
"unicode": "e69c",
"unicode_decimal": 59036 },
{
"icon_id": "24899570",
"name": "email",
"font_class": "email",
"unicode": "e69e",
"unicode_decimal": 59038 },
{
"icon_id": "24899571",
"name": "personadd",
"font_class": "personadd",
"unicode": "e69f",
"unicode_decimal": 59039 },
{
"icon_id": "24899558",
"name": "chatboxes-filled",
"font_class": "chatboxes-filled",
"unicode": "e692",
"unicode_decimal": 59026 },
{
"icon_id": "24899559",
"name": "contact",
"font_class": "contact",
"unicode": "e693",
"unicode_decimal": 59027 },
{
"icon_id": "24899560",
"name": "chatbubble-filled",
"font_class": "chatbubble-filled",
"unicode": "e694",
"unicode_decimal": 59028 },
{
"icon_id": "24899561",
"name": "contact-filled",
"font_class": "contact-filled",
"unicode": "e695",
"unicode_decimal": 59029 },
{
"icon_id": "24899562",
"name": "chatboxes",
"font_class": "chatboxes",
"unicode": "e696",
"unicode_decimal": 59030 },
{
"icon_id": "24899563",
"name": "chatbubble",
"font_class": "chatbubble",
"unicode": "e697",
"unicode_decimal": 59031 },
{
"icon_id": "24881290",
"name": "upload-filled",
"font_class": "upload-filled",
"unicode": "e68e",
"unicode_decimal": 59022 },
{
"icon_id": "24881292",
"name": "upload",
"font_class": "upload",
"unicode": "e690",
"unicode_decimal": 59024 },
{
"icon_id": "24881293",
"name": "weixin",
"font_class": "weixin",
"unicode": "e691",
"unicode_decimal": 59025 },
{
"icon_id": "24881274",
"name": "compose",
"font_class": "compose",
"unicode": "e67f",
"unicode_decimal": 59007 },
{
"icon_id": "24881275",
"name": "qq",
"font_class": "qq",
"unicode": "e680",
"unicode_decimal": 59008 },
{
"icon_id": "24881276",
"name": "download-filled",
"font_class": "download-filled",
"unicode": "e681",
"unicode_decimal": 59009 },
{
"icon_id": "24881277",
"name": "pengyouquan",
"font_class": "pyq",
"unicode": "e682",
"unicode_decimal": 59010 },
{
"icon_id": "24881279",
"name": "sound",
"font_class": "sound",
"unicode": "e684",
"unicode_decimal": 59012 },
{
"icon_id": "24881280",
"name": "trash-filled",
"font_class": "trash-filled",
"unicode": "e685",
"unicode_decimal": 59013 },
{
"icon_id": "24881281",
"name": "sound-filled",
"font_class": "sound-filled",
"unicode": "e686",
"unicode_decimal": 59014 },
{
"icon_id": "24881282",
"name": "trash",
"font_class": "trash",
"unicode": "e687",
"unicode_decimal": 59015 },
{
"icon_id": "24881284",
"name": "videocam-filled",
"font_class": "videocam-filled",
"unicode": "e689",
"unicode_decimal": 59017 },
{
"icon_id": "24881285",
"name": "spinner-cycle",
"font_class": "spinner-cycle",
"unicode": "e68a",
"unicode_decimal": 59018 },
{
"icon_id": "24881286",
"name": "weibo",
"font_class": "weibo",
"unicode": "e68b",
"unicode_decimal": 59019 },
{
"icon_id": "24881288",
"name": "videocam",
"font_class": "videocam",
"unicode": "e68c",
"unicode_decimal": 59020 },
{
"icon_id": "24881289",
"name": "download",
"font_class": "download",
"unicode": "e68d",
"unicode_decimal": 59021 },
{
"icon_id": "24879601",
"name": "help",
"font_class": "help",
"unicode": "e679",
"unicode_decimal": 59001 },
{
"icon_id": "24879602",
"name": "navigate-filled",
"font_class": "navigate-filled",
"unicode": "e67a",
"unicode_decimal": 59002 },
{
"icon_id": "24879603",
"name": "plusempty",
"font_class": "plusempty",
"unicode": "e67b",
"unicode_decimal": 59003 },
{
"icon_id": "24879604",
"name": "smallcircle",
"font_class": "smallcircle",
"unicode": "e67c",
"unicode_decimal": 59004 },
{
"icon_id": "24879605",
"name": "minus-filled",
"font_class": "minus-filled",
"unicode": "e67d",
"unicode_decimal": 59005 },
{
"icon_id": "24879606",
"name": "micoff",
"font_class": "micoff",
"unicode": "e67e",
"unicode_decimal": 59006 },
{
"icon_id": "24879588",
"name": "closeempty",
"font_class": "closeempty",
"unicode": "e66c",
"unicode_decimal": 58988 },
{
"icon_id": "24879589",
"name": "clear",
"font_class": "clear",
"unicode": "e66d",
"unicode_decimal": 58989 },
{
"icon_id": "24879590",
"name": "navigate",
"font_class": "navigate",
"unicode": "e66e",
"unicode_decimal": 58990 },
{
"icon_id": "24879591",
"name": "minus",
"font_class": "minus",
"unicode": "e66f",
"unicode_decimal": 58991 },
{
"icon_id": "24879592",
"name": "image",
"font_class": "image",
"unicode": "e670",
"unicode_decimal": 58992 },
{
"icon_id": "24879593",
"name": "mic",
"font_class": "mic",
"unicode": "e671",
"unicode_decimal": 58993 },
{
"icon_id": "24879594",
"name": "paperplane",
"font_class": "paperplane",
"unicode": "e672",
"unicode_decimal": 58994 },
{
"icon_id": "24879595",
"name": "close",
"font_class": "close",
"unicode": "e673",
"unicode_decimal": 58995 },
{
"icon_id": "24879596",
"name": "help-filled",
"font_class": "help-filled",
"unicode": "e674",
"unicode_decimal": 58996 },
{
"icon_id": "24879597",
"name": "plus-filled",
"font_class": "paperplane-filled",
"unicode": "e675",
"unicode_decimal": 58997 },
{
"icon_id": "24879598",
"name": "plus",
"font_class": "plus",
"unicode": "e676",
"unicode_decimal": 58998 },
{
"icon_id": "24879599",
"name": "mic-filled",
"font_class": "mic-filled",
"unicode": "e677",
"unicode_decimal": 58999 },
{
"icon_id": "24879600",
"name": "image-filled",
"font_class": "image-filled",
"unicode": "e678",
"unicode_decimal": 59000 },
{
"icon_id": "24855900",
"name": "locked-filled",
"font_class": "locked-filled",
"unicode": "e668",
"unicode_decimal": 58984 },
{
"icon_id": "24855901",
"name": "info",
"font_class": "info",
"unicode": "e669",
"unicode_decimal": 58985 },
{
"icon_id": "24855903",
"name": "locked",
"font_class": "locked",
"unicode": "e66b",
"unicode_decimal": 58987 },
{
"icon_id": "24855884",
"name": "camera-filled",
"font_class": "camera-filled",
"unicode": "e658",
"unicode_decimal": 58968 },
{
"icon_id": "24855885",
"name": "chat-filled",
"font_class": "chat-filled",
"unicode": "e659",
"unicode_decimal": 58969 },
{
"icon_id": "24855886",
"name": "camera",
"font_class": "camera",
"unicode": "e65a",
"unicode_decimal": 58970 },
{
"icon_id": "24855887",
"name": "circle",
"font_class": "circle",
"unicode": "e65b",
"unicode_decimal": 58971 },
{
"icon_id": "24855888",
"name": "checkmarkempty",
"font_class": "checkmarkempty",
"unicode": "e65c",
"unicode_decimal": 58972 },
{
"icon_id": "24855889",
"name": "chat",
"font_class": "chat",
"unicode": "e65d",
"unicode_decimal": 58973 },
{
"icon_id": "24855890",
"name": "circle-filled",
"font_class": "circle-filled",
"unicode": "e65e",
"unicode_decimal": 58974 },
{
"icon_id": "24855891",
"name": "flag",
"font_class": "flag",
"unicode": "e65f",
"unicode_decimal": 58975 },
{
"icon_id": "24855892",
"name": "flag-filled",
"font_class": "flag-filled",
"unicode": "e660",
"unicode_decimal": 58976 },
{
"icon_id": "24855893",
"name": "gear-filled",
"font_class": "gear-filled",
"unicode": "e661",
"unicode_decimal": 58977 },
{
"icon_id": "24855894",
"name": "home",
"font_class": "home",
"unicode": "e662",
"unicode_decimal": 58978 },
{
"icon_id": "24855895",
"name": "home-filled",
"font_class": "home-filled",
"unicode": "e663",
"unicode_decimal": 58979 },
{
"icon_id": "24855896",
"name": "gear",
"font_class": "gear",
"unicode": "e664",
"unicode_decimal": 58980 },
{
"icon_id": "24855897",
"name": "smallcircle-filled",
"font_class": "smallcircle-filled",
"unicode": "e665",
"unicode_decimal": 58981 },
{
"icon_id": "24855898",
"name": "map-filled",
"font_class": "map-filled",
"unicode": "e666",
"unicode_decimal": 58982 },
{
"icon_id": "24855899",
"name": "map",
"font_class": "map",
"unicode": "e667",
"unicode_decimal": 58983 },
{
"icon_id": "24855825",
"name": "refresh-filled",
"font_class": "refresh-filled",
"unicode": "e656",
"unicode_decimal": 58966 },
{
"icon_id": "24855826",
"name": "refresh",
"font_class": "refresh",
"unicode": "e657",
"unicode_decimal": 58967 },
{
"icon_id": "24855808",
"name": "cloud-upload",
"font_class": "cloud-upload",
"unicode": "e645",
"unicode_decimal": 58949 },
{
"icon_id": "24855809",
"name": "cloud-download-filled",
"font_class": "cloud-download-filled",
"unicode": "e646",
"unicode_decimal": 58950 },
{
"icon_id": "24855810",
"name": "cloud-download",
"font_class": "cloud-download",
"unicode": "e647",
"unicode_decimal": 58951 },
{
"icon_id": "24855811",
"name": "cloud-upload-filled",
"font_class": "cloud-upload-filled",
"unicode": "e648",
"unicode_decimal": 58952 },
{
"icon_id": "24855813",
"name": "redo",
"font_class": "redo",
"unicode": "e64a",
"unicode_decimal": 58954 },
{
"icon_id": "24855814",
"name": "images-filled",
"font_class": "images-filled",
"unicode": "e64b",
"unicode_decimal": 58955 },
{
"icon_id": "24855815",
"name": "undo-filled",
"font_class": "undo-filled",
"unicode": "e64c",
"unicode_decimal": 58956 },
{
"icon_id": "24855816",
"name": "more",
"font_class": "more",
"unicode": "e64d",
"unicode_decimal": 58957 },
{
"icon_id": "24855817",
"name": "more-filled",
"font_class": "more-filled",
"unicode": "e64e",
"unicode_decimal": 58958 },
{
"icon_id": "24855818",
"name": "undo",
"font_class": "undo",
"unicode": "e64f",
"unicode_decimal": 58959 },
{
"icon_id": "24855819",
"name": "images",
"font_class": "images",
"unicode": "e650",
"unicode_decimal": 58960 },
{
"icon_id": "24855821",
"name": "paperclip",
"font_class": "paperclip",
"unicode": "e652",
"unicode_decimal": 58962 },
{
"icon_id": "24855822",
"name": "settings",
"font_class": "settings",
"unicode": "e653",
"unicode_decimal": 58963 },
{
"icon_id": "24855823",
"name": "search",
"font_class": "search",
"unicode": "e654",
"unicode_decimal": 58964 },
{
"icon_id": "24855824",
"name": "redo-filled",
"font_class": "redo-filled",
"unicode": "e655",
"unicode_decimal": 58965 },
{
"icon_id": "24841702",
"name": "list",
"font_class": "list",
"unicode": "e644",
"unicode_decimal": 58948 },
{
"icon_id": "24841489",
"name": "mail-open-filled",
"font_class": "mail-open-filled",
"unicode": "e63a",
"unicode_decimal": 58938 },
{
"icon_id": "24841491",
"name": "hand-thumbsdown-filled",
"font_class": "hand-down-filled",
"unicode": "e63c",
"unicode_decimal": 58940 },
{
"icon_id": "24841492",
"name": "hand-thumbsdown",
"font_class": "hand-down",
"unicode": "e63d",
"unicode_decimal": 58941 },
{
"icon_id": "24841493",
"name": "hand-thumbsup-filled",
"font_class": "hand-up-filled",
"unicode": "e63e",
"unicode_decimal": 58942 },
{
"icon_id": "24841494",
"name": "hand-thumbsup",
"font_class": "hand-up",
"unicode": "e63f",
"unicode_decimal": 58943 },
{
"icon_id": "24841496",
"name": "heart-filled",
"font_class": "heart-filled",
"unicode": "e641",
"unicode_decimal": 58945 },
{
"icon_id": "24841498",
"name": "mail-open",
"font_class": "mail-open",
"unicode": "e643",
"unicode_decimal": 58947 },
{
"icon_id": "24841488",
"name": "heart",
"font_class": "heart",
"unicode": "e639",
"unicode_decimal": 58937 },
{
"icon_id": "24839963",
"name": "loop",
"font_class": "loop",
"unicode": "e633",
"unicode_decimal": 58931 },
{
"icon_id": "24839866",
"name": "pulldown",
"font_class": "pulldown",
"unicode": "e632",
"unicode_decimal": 58930 },
{
"icon_id": "24813798",
"name": "scan",
"font_class": "scan",
"unicode": "e62a",
"unicode_decimal": 58922 },
{
"icon_id": "24813786",
"name": "bars",
"font_class": "bars",
"unicode": "e627",
"unicode_decimal": 58919 },
{
"icon_id": "24813788",
"name": "cart-filled",
"font_class": "cart-filled",
"unicode": "e629",
"unicode_decimal": 58921 },
{
"icon_id": "24813790",
"name": "checkbox",
"font_class": "checkbox",
"unicode": "e62b",
"unicode_decimal": 58923 },
{
"icon_id": "24813791",
"name": "checkbox-filled",
"font_class": "checkbox-filled",
"unicode": "e62c",
"unicode_decimal": 58924 },
{
"icon_id": "24813794",
"name": "shop",
"font_class": "shop",
"unicode": "e62f",
"unicode_decimal": 58927 },
{
"icon_id": "24813795",
"name": "headphones",
"font_class": "headphones",
"unicode": "e630",
"unicode_decimal": 58928 },
{
"icon_id": "24813796",
"name": "cart",
"font_class": "cart",
"unicode": "e631",
"unicode_decimal": 58929 }] };exports.default = _default;
/***/ })
]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVuaS1hcHA6Ly8vRDovSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGRjbG91ZGlvL3VuaS1tcC10b3V0aWFvL2Rpc3QvaW5kZXguanMiLCJ1bmktYXBwOi8vL0Q6L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9nbG9iYWwuanMiLCJ1bmktYXBwOi8vL0Q6L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby92dWUtY2xpLXBsdWdpbi11bmkvcGFja2FnZXMvbXAtdnVlL2Rpc3QvbXAucnVudGltZS5lc20uanMiLCJ1bmktYXBwOi8vL0Q6L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby91bmktaTE4bi9kaXN0L3VuaS1pMThuLmVzLmpzIiwidW5pLWFwcDovLy9EOi9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AZGNsb3VkaW8vdnVlLWNsaS1wbHVnaW4tdW5pL3BhY2thZ2VzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qcyIsInVuaS1hcHA6Ly8vc3RvcmUvaW5kZXguanMiLCJ1bmktYXBwOi8vL0Q6L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby92dWUtY2xpLXBsdWdpbi11bmkvcGFja2FnZXMvdnVleDMvZGlzdC92dWV4LmNvbW1vbi5qcyIsInVuaS1hcHA6Ly8vRDovSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJ1bmktYXBwOi8vL0Q6L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanMiLCJ1bmktYXBwOi8vL0Q6L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsInVuaS1hcHA6Ly8vYXBpL2luZGV4LmpzIiwidW5pLWFwcDovLy91dGlscy9yZXF1ZXN0LmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanMiLCJ1bmktYXBwOi8vL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMiLCJ1bmktYXBwOi8vL25vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanMiLCJ1bmktYXBwOi8vL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9iaW5kLmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvQXhpb3MuanMiLCJ1bmktYXBwOi8vL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9idWlsZFVSTC5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3RyYW5zZm9ybURhdGEuanMiLCJ1bmktYXBwOi8vL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMvaW5kZXguanMiLCJ1bmktYXBwOi8vL0Q6L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL25vZGUtbGlicy1icm93c2VyL21vY2svcHJvY2Vzcy5qcyIsInVuaS1hcHA6Ly8vRDovSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvcGF0aC1icm93c2VyaWZ5L2luZGV4LmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZS5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2VuaGFuY2VFcnJvci5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMiLCJ1bmktYXBwOi8vL25vZGVfbW9kdWxlcy9heGlvcy9saWIvYWRhcHRlcnMveGhyLmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvY3JlYXRlRXJyb3IuanMiLCJ1bmktYXBwOi8vL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanMiLCJ1bmktYXBwOi8vL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb21iaW5lVVJMcy5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvQ2FuY2VsLmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9pc0NhbmNlbC5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL21lcmdlQ29uZmlnLmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdmFsaWRhdG9yLmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2Vudi9kYXRhLmpzIiwidW5pLWFwcDovLy9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwcmVhZC5qcyIsInVuaS1hcHA6Ly8vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyIsInVuaS1hcHA6Ly8vRDovSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvcXMvbGliL2luZGV4LmpzIiwidW5pLWFwcDovLy9EOi9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwidW5pLWFwcDovLy9EOi9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9xcy9saWIvdXRpbHMuanMiLCJ1bmktYXBwOi8vL0Q6L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL3FzL2xpYi9mb3JtYXRzLmpzIiwidW5pLWFwcDovLy9EOi9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9xcy9saWIvcGFyc2UuanMiLCJ1bmktYXBwOi8vL2FwaS9jcmVhdG9yLmpzIiwidW5pLWFwcDovLy9hcGkvbXlDb2xsZWN0aW9uLmpzIiwidW5pLWFwcDovLy91bmlfbW9kdWxlcy91bmktc2VhcmNoLWJhci9jb21wb25lbnRzL3VuaS1zZWFyY2gtYmFyL2kxOG4vaW5kZXguanMiLCJ1bmktYXBwOi8vL3VuaV9tb2R1bGVzL3VuaS1pY29ucy9jb21wb25lbnRzL3VuaS1pY29ucy9pY29ucy5qcyJdLCJuYW1lcyI6WyJyZWFsQXRvYiIsImI2NCIsImI2NHJlIiwiYXRvYiIsInN0ciIsIlN0cmluZyIsInJlcGxhY2UiLCJ0ZXN0IiwiRXJyb3IiLCJzbGljZSIsImxlbmd0aCIsImJpdG1hcCIsInJlc3VsdCIsInIxIiwicjIiLCJpIiwiaW5kZXhPZiIsImNoYXJBdCIsImZyb21DaGFyQ29kZSIsImI2NERlY29kZVVuaWNvZGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzcGxpdCIsIm1hcCIsImMiLCJjaGFyQ29kZUF0IiwidG9TdHJpbmciLCJqb2luIiwiZ2V0Q3VycmVudFVzZXJJbmZvIiwidG9rZW4iLCJ0dCIsImdldFN0b3JhZ2VTeW5jIiwidG9rZW5BcnIiLCJ1aWQiLCJyb2xlIiwicGVybWlzc2lvbiIsInRva2VuRXhwaXJlZCIsInVzZXJJbmZvIiwiSlNPTiIsInBhcnNlIiwiZXJyb3IiLCJtZXNzYWdlIiwiZXhwIiwiaWF0IiwidW5pSWRNaXhpbiIsIlZ1ZSIsInByb3RvdHlwZSIsInVuaUlESGFzUm9sZSIsInJvbGVJZCIsInVuaUlESGFzUGVybWlzc2lvbiIsInBlcm1pc3Npb25JZCIsInVuaUlEVG9rZW5WYWxpZCIsIkRhdGUiLCJub3ciLCJfdG9TdHJpbmciLCJPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsImlzRm4iLCJmbiIsImlzU3RyIiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsImNhbGwiLCJoYXNPd24iLCJrZXkiLCJub29wIiwiY2FjaGVkIiwiY2FjaGUiLCJjcmVhdGUiLCJjYWNoZWRGbiIsImhpdCIsImNhbWVsaXplUkUiLCJjYW1lbGl6ZSIsIl8iLCJ0b1VwcGVyQ2FzZSIsIkhPT0tTIiwiZ2xvYmFsSW50ZXJjZXB0b3JzIiwic2NvcGVkSW50ZXJjZXB0b3JzIiwibWVyZ2VIb29rIiwicGFyZW50VmFsIiwiY2hpbGRWYWwiLCJyZXMiLCJjb25jYXQiLCJBcnJheSIsImlzQXJyYXkiLCJkZWR1cGVIb29rcyIsImhvb2tzIiwicHVzaCIsInJlbW92ZUhvb2siLCJob29rIiwiaW5kZXgiLCJzcGxpY2UiLCJtZXJnZUludGVyY2VwdG9ySG9vayIsImludGVyY2VwdG9yIiwib3B0aW9uIiwia2V5cyIsImZvckVhY2giLCJyZW1vdmVJbnRlcmNlcHRvckhvb2siLCJhZGRJbnRlcmNlcHRvciIsIm1ldGhvZCIsInJlbW92ZUludGVyY2VwdG9yIiwid3JhcHBlckhvb2siLCJkYXRhIiwiaXNQcm9taXNlIiwidGhlbiIsInF1ZXVlIiwicHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiY2FsbGJhY2siLCJ3cmFwcGVyT3B0aW9ucyIsIm9wdGlvbnMiLCJuYW1lIiwib2xkQ2FsbGJhY2siLCJjYWxsYmFja0ludGVyY2VwdG9yIiwid3JhcHBlclJldHVyblZhbHVlIiwicmV0dXJuVmFsdWUiLCJyZXR1cm5WYWx1ZUhvb2tzIiwiZ2V0QXBpSW50ZXJjZXB0b3JIb29rcyIsInNjb3BlZEludGVyY2VwdG9yIiwiaW52b2tlQXBpIiwiYXBpIiwicGFyYW1zIiwiaW52b2tlIiwicHJvbWlzZUludGVyY2VwdG9yIiwicmVqZWN0IiwiU1lOQ19BUElfUkUiLCJDT05URVhUX0FQSV9SRSIsIkNPTlRFWFRfQVBJX1JFX0VYQyIsIkFTWU5DX0FQSSIsIkNBTExCQUNLX0FQSV9SRSIsImlzQ29udGV4dEFwaSIsImlzU3luY0FwaSIsImlzQ2FsbGJhY2tBcGkiLCJoYW5kbGVQcm9taXNlIiwiY2F0Y2giLCJlcnIiLCJzaG91bGRQcm9taXNlIiwiZmluYWxseSIsImNvbnN0cnVjdG9yIiwidmFsdWUiLCJyZWFzb24iLCJwcm9taXNpZnkiLCJwcm9taXNlQXBpIiwic3VjY2VzcyIsImZhaWwiLCJjb21wbGV0ZSIsImFzc2lnbiIsIkVQUyIsIkJBU0VfREVWSUNFX1dJRFRIIiwiaXNJT1MiLCJkZXZpY2VXaWR0aCIsImRldmljZURQUiIsImNoZWNrRGV2aWNlV2lkdGgiLCJnZXRTeXN0ZW1JbmZvU3luYyIsInBsYXRmb3JtIiwicGl4ZWxSYXRpbyIsIndpbmRvd1dpZHRoIiwidXB4MnB4IiwibnVtYmVyIiwibmV3RGV2aWNlV2lkdGgiLCJOdW1iZXIiLCJNYXRoIiwiZmxvb3IiLCJnZXRMb2NhbGUiLCJhcHAiLCJnZXRBcHAiLCJhbGxvd0RlZmF1bHQiLCIkdm0iLCIkbG9jYWxlIiwibGFuZ3VhZ2UiLCJzZXRMb2NhbGUiLCJsb2NhbGUiLCJvbGRMb2NhbGUiLCJvbkxvY2FsZUNoYW5nZUNhbGxiYWNrcyIsIm9uTG9jYWxlQ2hhbmdlIiwiZ2xvYmFsIiwiaW50ZXJjZXB0b3JzIiwiYmFzZUFwaSIsImZyZWV6ZSIsIl9fcHJvdG9fXyIsIkV2ZW50Q2hhbm5lbCIsImlkIiwiZXZlbnRzIiwibGlzdGVuZXIiLCJlbWl0Q2FjaGUiLCJvbiIsImV2ZW50TmFtZSIsImFyZ3MiLCJmbnMiLCJvcHQiLCJhcHBseSIsImZpbHRlciIsInR5cGUiLCJfYWRkTGlzdGVuZXIiLCJfY2xlYXJDYWNoZSIsImNhY2hlQXJncyIsImVtaXQiLCJzaGlmdCIsImV2ZW50Q2hhbm5lbHMiLCJldmVudENoYW5uZWxTdGFjayIsImluaXRFdmVudENoYW5uZWwiLCJldmVudENoYW5uZWwiLCJnZXRFdmVudENoYW5uZWwiLCJuYXZpZ2F0ZVRvIiwiZnJvbUFyZ3MiLCJ0b0FyZ3MiLCJ1cmwiLCJmcm9tUmVzIiwidG9SZXMiLCJmaW5kRXhpc3RzUGFnZUluZGV4IiwicGFnZXMiLCJnZXRDdXJyZW50UGFnZXMiLCJsZW4iLCJwYWdlIiwiJHBhZ2UiLCJmdWxsUGF0aCIsInJlZGlyZWN0VG8iLCJleGlzdHMiLCJkZWx0YSIsImV4aXN0c1BhZ2VJbmRleCIsInByZXZpZXdJbWFnZSIsImN1cnJlbnRJbmRleCIsInBhcnNlSW50IiwiY3VycmVudCIsImlzTmFOIiwidXJscyIsIml0ZW0iLCJpbmRpY2F0b3IiLCJsb29wIiwiVVVJRF9LRVkiLCJkZXZpY2VJZCIsImFkZFV1aWQiLCJyYW5kb20iLCJzZXRTdG9yYWdlIiwiYWRkU2FmZUFyZWFJbnNldHMiLCJzYWZlQXJlYSIsInNhZmVBcmVhSW5zZXRzIiwidG9wIiwibGVmdCIsInJpZ2h0IiwiYm90dG9tIiwid2luZG93SGVpZ2h0IiwiZ2V0U3lzdGVtSW5mbyIsIm9OYW1lIiwibk5hbWUiLCJnZXRVc2VyUHJvZmlsZSIsImNhbklVc2UiLCJ0b2RvcyIsImNhbklVc2VzIiwicHJvdG9jb2xzIiwiY2hvb3NlSW1hZ2UiLCJzaXplVHlwZSIsImNvbm5lY3RTb2NrZXQiLCJjaG9vc2VWaWRlbyIsImNhbWVyYSIsInNjYW5Db2RlIiwib25seUZyb21DYW1lcmEiLCJzY2FuVHlwZSIsInN0YXJ0QWNjZWxlcm9tZXRlciIsImludGVydmFsIiwic2hvd1RvYXN0IiwiaW1hZ2UiLCJtYXNrIiwic2hvd0xvYWRpbmciLCJzaG93TW9kYWwiLCJjYW5jZWxDb2xvciIsImNvbmZpcm1Db2xvciIsInNob3dBY3Rpb25TaGVldCIsIml0ZW1Db2xvciIsImxvZ2luIiwic2NvcGVzIiwidGltZW91dCIsImdldFVzZXJJbmZvIiwibGFuZyIsInJlcXVlc3RQYXltZW50IiwicGF5Iiwib3JkZXJJbmZvIiwiZ2V0RmlsZUluZm8iLCJkaWdlc3RBbGdvcml0aG0iLCJDQUxMQkFDS1MiLCJwcm9jZXNzQ2FsbGJhY2siLCJtZXRob2ROYW1lIiwicHJvY2Vzc1JldHVyblZhbHVlIiwicHJvY2Vzc0FyZ3MiLCJhcmdzT3B0aW9uIiwia2VlcEZyb21BcmdzIiwia2V5T3B0aW9uIiwiY29uc29sZSIsIndhcm4iLCJrZWVwUmV0dXJuVmFsdWUiLCJ3cmFwcGVyIiwicHJvdG9jb2wiLCJhcmcxIiwiYXJnMiIsInRvZG9BcGlzIiwiVE9ET1MiLCJjcmVhdGVUb2RvQXBpIiwidG9kb0FwaSIsImVyck1zZyIsInByb3ZpZGVycyIsIm9hdXRoIiwic2hhcmUiLCJwYXltZW50IiwiZ2V0UHJvdmlkZXIiLCJzZXJ2aWNlIiwicHJvdmlkZXIiLCJleHRyYUFwaSIsImdldEVtaXR0ZXIiLCJFbWl0dGVyIiwiZ2V0VW5pRW1pdHRlciIsImN0eCIsIiRvbiIsImFyZ3VtZW50cyIsIiRvZmYiLCIkb25jZSIsIiRlbWl0IiwiZXZlbnRBcGkiLCJjcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXIiLCJtZWRpYVF1ZXJ5T2JzZXJ2ZXIiLCJvcmllbnRhdGlvbiIsIm9ic2VydmUiLCJtYXRjaGVzIiwiaXRlbVZhbHVlIiwiZGlzY29ubmVjdCIsIk1QUGFnZSIsIlBhZ2UiLCJNUENvbXBvbmVudCIsIkNvbXBvbmVudCIsImN1c3RvbWl6ZVJFIiwiY3VzdG9taXplIiwiaW5pdFRyaWdnZXJFdmVudCIsIm1wSW5zdGFuY2UiLCJvbGRUcmlnZ2VyRXZlbnQiLCJ0cmlnZ2VyRXZlbnQiLCJuZXdUcmlnZ2VyRXZlbnQiLCJldmVudCIsIl90cmlnZ2VyRXZlbnQiLCJpbml0SG9vayIsImlzQ29tcG9uZW50IiwibGlmZXRpbWVzIiwib2xkSG9vayIsIl9fJHdyYXBwZXJlZCIsImFmdGVyIiwiUEFHRV9FVkVOVF9IT09LUyIsImluaXRNb2NrcyIsInZtIiwibW9ja3MiLCIkbXAiLCJtcFR5cGUiLCJtb2NrIiwiaGFzSG9vayIsInZ1ZU9wdGlvbnMiLCJkZWZhdWx0IiwiZXh0ZW5kT3B0aW9ucyIsInN1cGVyIiwibWl4aW5zIiwiZmluZCIsIm1peGluIiwiaW5pdEhvb2tzIiwibXBPcHRpb25zIiwiX19jYWxsX2hvb2siLCJpbml0VnVlQ29tcG9uZW50IiwiVnVlQ29tcG9uZW50IiwiZXh0ZW5kIiwiaW5pdFNsb3RzIiwidnVlU2xvdHMiLCIkc2xvdHMiLCJzbG90TmFtZSIsIiRzY29wZWRTbG90cyIsImluaXRWdWVJZHMiLCJ2dWVJZHMiLCJfJHZ1ZUlkIiwiXyR2dWVQaWQiLCJpbml0RGF0YSIsImNvbnRleHQiLCJtZXRob2RzIiwiZSIsInByb2Nlc3MiLCJWVUVfQVBQX0RFQlVHIiwic3RyaW5naWZ5IiwiX19saWZlY3ljbGVfaG9va3NfXyIsIlBST1BfVFlQRVMiLCJCb29sZWFuIiwiY3JlYXRlT2JzZXJ2ZXIiLCJvYnNlcnZlciIsIm5ld1ZhbCIsIm9sZFZhbCIsImluaXRCZWhhdmlvcnMiLCJpbml0QmVoYXZpb3IiLCJ2dWVCZWhhdmlvcnMiLCJiZWhhdmlvcnMiLCJ2dWVFeHRlbmRzIiwiZXh0ZW5kcyIsInZ1ZU1peGlucyIsInZ1ZVByb3BzIiwicHJvcHMiLCJiZWhhdmlvciIsInByb3BlcnRpZXMiLCJpbml0UHJvcGVydGllcyIsInZ1ZU1peGluIiwicGFyc2VQcm9wVHlwZSIsImRlZmF1bHRWYWx1ZSIsImZpbGUiLCJpc0JlaGF2aW9yIiwidnVlSWQiLCJnZW5lcmljIiwic2NvcGVkU2xvdHNDb21waWxlciIsInNldERhdGEiLCJvcHRzIiwid3JhcHBlciQxIiwibXAiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsInRhcmdldCIsImRldGFpbCIsIm1hcmtlcklkIiwiZ2V0RXh0cmFWYWx1ZSIsImRhdGFQYXRoc0FycmF5IiwiZGF0YVBhdGhBcnJheSIsImRhdGFQYXRoIiwicHJvcFBhdGgiLCJ2YWx1ZVBhdGgiLCJ2Rm9yIiwiaXNJbnRlZ2VyIiwic3Vic3RyIiwiX19nZXRfdmFsdWUiLCJ2Rm9ySXRlbSIsInZGb3JLZXkiLCJwcm9jZXNzRXZlbnRFeHRyYSIsImV4dHJhIiwiZXh0cmFPYmoiLCJfX2FyZ3NfXyIsImdldE9iakJ5QXJyYXkiLCJhcnIiLCJlbGVtZW50IiwicHJvY2Vzc0V2ZW50QXJncyIsImlzQ3VzdG9tIiwiaXNDdXN0b21NUEV2ZW50IiwiY3VycmVudFRhcmdldCIsImRhdGFzZXQiLCJjb21UeXBlIiwicmV0IiwiYXJnIiwiT05DRSIsIkNVU1RPTSIsImlzTWF0Y2hFdmVudFR5cGUiLCJldmVudFR5cGUiLCJvcHRUeXBlIiwiZ2V0Q29udGV4dFZtIiwiJHBhcmVudCIsIiRvcHRpb25zIiwiJHNjb3BlIiwiaGFuZGxlRXZlbnQiLCJldmVudE9wdHMiLCJldmVudE9wdCIsImV2ZW50c0FycmF5IiwiaXNPbmNlIiwiZXZlbnRBcnJheSIsImhhbmRsZXJDdHgiLCJoYW5kbGVyIiwib25jZSIsIm1lc3NhZ2VzIiwiaW5pdEkxOG5NZXNzYWdlcyIsImlzRW5hYmxlTG9jYWxlIiwibG9jYWxlS2V5cyIsIl9fdW5pQ29uZmlnIiwibG9jYWxlcyIsImN1ck1lc3NhZ2VzIiwidXNlck1lc3NhZ2VzIiwiaTE4biIsInQiLCJpMThuTWl4aW4iLCJiZWZvcmVDcmVhdGUiLCJ1bndhdGNoIiwid2F0Y2hMb2NhbGUiLCIkZm9yY2VVcGRhdGUiLCIkJHQiLCJ2YWx1ZXMiLCJzZXRMb2NhbGUkMSIsImdldExvY2FsZSQxIiwiaW5pdEFwcExvY2FsZSIsImFwcFZtIiwic3RhdGUiLCJvYnNlcnZhYmxlIiwibG9jYWxlV2F0Y2hlcnMiLCIkd2F0Y2hMb2NhbGUiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsInNldCIsInYiLCJ3YXRjaCIsImluaXRFdmVudENoYW5uZWwkMSIsImdldE9wZW5lckV2ZW50Q2hhbm5lbCIsIl9fZXZlbnRDaGFubmVsX18iLCJjYWxsSG9vayIsIl9faWRfXyIsImluaXRTY29wZWRTbG90c1BhcmFtcyIsImNlbnRlciIsInBhcmVudHMiLCIkaGFzU2NvcGVkU2xvdHNQYXJhbXMiLCJoYXMiLCIkZ2V0U2NvcGVkU2xvdHNQYXJhbXMiLCJvYmplY3QiLCIkc2V0U2NvcGVkU2xvdHNQYXJhbXMiLCJwcm9wc0RhdGEiLCJkZXN0cm95ZWQiLCJwYXJzZUJhc2VBcHAiLCJpbml0UmVmcyIsInN0b3JlIiwiJHN0b3JlIiwibXBIb3N0IiwiJGkxOG4iLCJfaTE4biIsImFwcE9wdGlvbnMiLCJvbkxhdW5jaCIsImdsb2JhbERhdGEiLCJfaXNNb3VudGVkIiwiZmluZFZtQnlWdWVJZCIsInZ1ZVBpZCIsIiRjaGlsZHJlbiIsImNoaWxkVm0iLCJwYXJlbnRWbSIsIkJlaGF2aW9yIiwiaGFuZGxlTGluayIsInBhcmVudCIsImlzUGFnZSIsIl9fbm9kZWlkX18iLCJfX25vZGVJZF9fIiwibWlub3JWZXJzaW9uIiwiU0RLVmVyc2lvbiIsIiRyZWZzIiwiY29tcG9uZW50cyIsInNlbGVjdEFsbENvbXBvbmVudHMiLCJjb21wb25lbnQiLCJyZWYiLCJmb3JDb21wb25lbnRzIiwiaW5zdGFuY2VzIiwiaW5pdFJlbGF0aW9uIiwibm9kZUlkIiwid2Vidmlld0lkIiwiX193ZWJ2aWV3SWRfXyIsImhhbmRsZUxpbmskMSIsIiRyb290IiwicGFyc2VBcHAiLCJfJGZhbGxiYWNrIiwiY3JlYXRlZCIsInJvdXRlIiwiX19yb3V0ZV9fIiwiX19pbml0X2luamVjdGlvbnMiLCJfX2luaXRfcHJvdmlkZSIsImNyZWF0ZUFwcCIsIkFwcCIsImVuY29kZVJlc2VydmVSRSIsImVuY29kZVJlc2VydmVSZXBsYWNlciIsImNvbW1hUkUiLCJlbmNvZGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJzdHJpbmdpZnlRdWVyeSIsImVuY29kZVN0ciIsInZhbCIsInVuZGVmaW5lZCIsInZhbDIiLCJ4IiwicGFyc2VCYXNlQ29tcG9uZW50IiwidnVlQ29tcG9uZW50T3B0aW9ucyIsIm11bHRpcGxlU2xvdHMiLCJhZGRHbG9iYWxDbGFzcyIsImNvbXBvbmVudE9wdGlvbnMiLCJfX2ZpbGUiLCJhdHRhY2hlZCIsIiRtb3VudCIsInJlYWR5IiwiZGV0YWNoZWQiLCIkZGVzdHJveSIsInBhZ2VMaWZldGltZXMiLCJzaG93IiwiaGlkZSIsInJlc2l6ZSIsInNpemUiLCJfX2wiLCJfX2UiLCJleHRlcm5hbENsYXNzZXMiLCJ3eHNDYWxsTWV0aG9kcyIsImNhbGxNZXRob2QiLCJwYXJzZUNvbXBvbmVudCIsIl9fbGlmZXRpbWVzX2F0dGFjaGVkIiwiaG9va3MkMSIsInBhcnNlQmFzZVBhZ2UiLCJ2dWVQYWdlT3B0aW9ucyIsInBhZ2VPcHRpb25zIiwib25Mb2FkIiwicXVlcnkiLCJjb3B5UXVlcnkiLCJpcyIsInBhcnNlUGFnZSIsImNyZWF0ZVBhZ2UiLCJjcmVhdGVDb21wb25lbnQiLCJjcmVhdGVTdWJwYWNrYWdlQXBwIiwib25TaG93Iiwib25BcHBTaG93Iiwib25IaWRlIiwib25BcHBIaWRlIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJjcmVhdGVQbHVnaW4iLCJjYW5JVXNlQXBpIiwiYXBpTmFtZSIsInVuaSIsIlByb3h5IiwidW5pJDEiLCJpc09iamVjdCIsImRlZmF1bHREZWxpbWl0ZXJzIiwiQmFzZUZvcm1hdHRlciIsIl9jYWNoZXMiLCJkZWxpbWl0ZXJzIiwidG9rZW5zIiwiY29tcGlsZSIsIlJFX1RPS0VOX0xJU1RfVkFMVUUiLCJSRV9UT0tFTl9OQU1FRF9WQUxVRSIsImZvcm1hdCIsInN0YXJ0RGVsaW1pdGVyIiwiZW5kRGVsaW1pdGVyIiwicG9zaXRpb24iLCJ0ZXh0IiwiY2hhciIsInN1YiIsImlzQ2xvc2VkIiwiY29tcGlsZWQiLCJtb2RlIiwiTE9DQUxFX1pIX0hBTlMiLCJMT0NBTEVfWkhfSEFOVCIsIkxPQ0FMRV9FTiIsIkxPQ0FMRV9GUiIsIkxPQ0FMRV9FUyIsImRlZmF1bHRGb3JtYXR0ZXIiLCJpbmNsdWRlIiwicGFydHMiLCJwYXJ0Iiwic3RhcnRzV2l0aCIsIm5vcm1hbGl6ZUxvY2FsZSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsIkkxOG4iLCJmYWxsYmFja0xvY2FsZSIsIndhdGNoZXIiLCJmb3JtYXRlciIsIndhdGNoZXJzIiwib3ZlcnJpZGUiLCJpbnRlcnBvbGF0ZSIsIndhdGNoQXBwTG9jYWxlIiwibmV3TG9jYWxlIiwiJHdhdGNoIiwiZ2V0RGVmYXVsdExvY2FsZSIsImluaXRWdWVJMThuIiwiaXNXYXRjaGVkQXBwTG9jYWxlIiwiZiIsImFkZCIsImlzU3RyaW5nIiwiaGFzSTE4bkpzb24iLCJqc29uT2JqIiwid2Fsa0pzb25PYmoiLCJpc0kxOG5TdHIiLCJwYXJzZUkxOG5Kc29uIiwiY29tcGlsZVN0ciIsImNvbXBpbGVJMThuSnNvblN0ciIsImpzb25TdHIiLCJsb2NhbGVWYWx1ZXMiLCJ1bnNoaWZ0IiwiY29tcGlsZUpzb25PYmoiLCJjb21waWxlVmFsdWUiLCJ2YWx1ZUxvY2FsZXMiLCJsb2NhbFZhbHVlIiwid2FsayIsInJlc29sdmVMb2NhbGUiLCJyZXNvbHZlTG9jYWxlQ2hhaW4iLCJjaGFpbiIsInBvcCIsInVzZSIsIlZ1ZXgiLCJnZXR0ZXRzIiwibXV0YXRpb25zIiwiYWN0aW9ucyIsIm1vZHVsZSIsImV4cG9ydHMiLCJyZXF1aXJlIiwic2VydmljZVRpdGxlIiwidGlrdG9rVXNlckltZ3MiLCJpbWdMaXN0cyIsInRpa3Rva1VzZXJEZXRhaWxzIiwibG9naW5UaWt0b2siLCJheGlvcyIsIndpdGhDcmVkZW50aWFscyIsImNyb3NzRG9tYWluIiwiYmFzZVVSTCIsInJlcXVlc3QiLCJjb25maWciLCJoZWFkZXJzIiwibG9nIiwicmVzcG9uc2UiLCJkZWZhdWx0cyIsImFkYXB0ZXIiLCJzZXR0bGUiLCJidWlsZFVSTCIsInBhcmFtc1NlcmlhbGl6ZXIiLCJoZWFkZXIiLCJkYXRhVHlwZSIsInJlc3BvbnNlVHlwZSIsInNzbFZlcmlmeSIsInN0YXR1cyIsInN0YXR1c0NvZGUiLCJ1dGlscyIsImJpbmQiLCJBeGlvcyIsIm1lcmdlQ29uZmlnIiwiY3JlYXRlSW5zdGFuY2UiLCJkZWZhdWx0Q29uZmlnIiwiaW5zdGFuY2UiLCJpbnN0YW5jZUNvbmZpZyIsIkNhbmNlbCIsIkNhbmNlbFRva2VuIiwiaXNDYW5jZWwiLCJWRVJTSU9OIiwidmVyc2lvbiIsImFsbCIsInByb21pc2VzIiwic3ByZWFkIiwiaXNBeGlvc0Vycm9yIiwiaXNVbmRlZmluZWQiLCJpc0J1ZmZlciIsImlzQXJyYXlCdWZmZXIiLCJpc0Zvcm1EYXRhIiwiaXNBcnJheUJ1ZmZlclZpZXciLCJBcnJheUJ1ZmZlciIsImlzVmlldyIsImJ1ZmZlciIsImlzTnVtYmVyIiwiZ2V0UHJvdG90eXBlT2YiLCJpc0RhdGUiLCJpc0ZpbGUiLCJpc0Jsb2IiLCJpc0Z1bmN0aW9uIiwiaXNTdHJlYW0iLCJwaXBlIiwiaXNVUkxTZWFyY2hQYXJhbXMiLCJpc1N0YW5kYXJkQnJvd3NlckVudiIsIm5hdmlnYXRvciIsInByb2R1Y3QiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImwiLCJtZXJnZSIsImFzc2lnblZhbHVlIiwiYSIsImIiLCJ0aGlzQXJnIiwic3RyaXBCT00iLCJjb250ZW50Iiwid3JhcCIsIkludGVyY2VwdG9yTWFuYWdlciIsImRpc3BhdGNoUmVxdWVzdCIsInZhbGlkYXRvciIsInZhbGlkYXRvcnMiLCJjb25maWdPclVybCIsInRyYW5zaXRpb25hbCIsImFzc2VydE9wdGlvbnMiLCJzaWxlbnRKU09OUGFyc2luZyIsImJvb2xlYW4iLCJmb3JjZWRKU09OUGFyc2luZyIsImNsYXJpZnlUaW1lb3V0RXJyb3IiLCJyZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbiIsInN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyIsInVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzIiwicnVuV2hlbiIsInN5bmNocm9ub3VzIiwiZnVsZmlsbGVkIiwicmVqZWN0ZWQiLCJyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4iLCJwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMiLCJuZXdDb25maWciLCJvbkZ1bGZpbGxlZCIsIm9uUmVqZWN0ZWQiLCJnZXRVcmkiLCJmb3JFYWNoTWV0aG9kTm9EYXRhIiwiZm9yRWFjaE1ldGhvZFdpdGhEYXRhIiwic2VyaWFsaXplZFBhcmFtcyIsInNlcmlhbGl6ZSIsInBhcnNlVmFsdWUiLCJ0b0lTT1N0cmluZyIsImhhc2htYXJrSW5kZXgiLCJoYW5kbGVycyIsImVqZWN0IiwiZm9yRWFjaEhhbmRsZXIiLCJoIiwidHJhbnNmb3JtRGF0YSIsInRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQiLCJjYW5jZWxUb2tlbiIsInRocm93SWZSZXF1ZXN0ZWQiLCJzaWduYWwiLCJhYm9ydGVkIiwidHJhbnNmb3JtUmVxdWVzdCIsImNvbW1vbiIsImNsZWFuSGVhZGVyQ29uZmlnIiwib25BZGFwdGVyUmVzb2x1dGlvbiIsInRyYW5zZm9ybVJlc3BvbnNlIiwib25BZGFwdGVyUmVqZWN0aW9uIiwidHJhbnNmb3JtIiwibm9ybWFsaXplSGVhZGVyTmFtZSIsImVuaGFuY2VFcnJvciIsInRyYW5zaXRpb25hbERlZmF1bHRzIiwiREVGQVVMVF9DT05URU5UX1RZUEUiLCJzZXRDb250ZW50VHlwZUlmVW5zZXQiLCJnZXREZWZhdWx0QWRhcHRlciIsIlhNTEh0dHBSZXF1ZXN0Iiwic3RyaW5naWZ5U2FmZWx5IiwicmF3VmFsdWUiLCJwYXJzZXIiLCJlbmNvZGVyIiwic3RyaWN0SlNPTlBhcnNpbmciLCJ4c3JmQ29va2llTmFtZSIsInhzcmZIZWFkZXJOYW1lIiwibWF4Q29udGVudExlbmd0aCIsIm1heEJvZHlMZW5ndGgiLCJ2YWxpZGF0ZVN0YXR1cyIsIm5vcm1hbGl6ZWROYW1lIiwicHJvY2Vzc0hlYWRlciIsImNvZGUiLCJ0b0pTT04iLCJkZXNjcmlwdGlvbiIsImZpbGVOYW1lIiwibGluZU51bWJlciIsImNvbHVtbk51bWJlciIsInN0YWNrIiwiY29va2llcyIsImJ1aWxkRnVsbFBhdGgiLCJwYXJzZUhlYWRlcnMiLCJpc1VSTFNhbWVPcmlnaW4iLCJjcmVhdGVFcnJvciIsInhockFkYXB0ZXIiLCJkaXNwYXRjaFhoclJlcXVlc3QiLCJyZXF1ZXN0RGF0YSIsInJlcXVlc3RIZWFkZXJzIiwib25DYW5jZWxlZCIsImRvbmUiLCJ1bnN1YnNjcmliZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhdXRoIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsInVuZXNjYXBlIiwiQXV0aG9yaXphdGlvbiIsImJ0b2EiLCJvcGVuIiwib25sb2FkZW5kIiwicmVzcG9uc2VIZWFkZXJzIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwicmVzcG9uc2VEYXRhIiwicmVzcG9uc2VUZXh0Iiwic3RhdHVzVGV4dCIsIl9yZXNvbHZlIiwiX3JlamVjdCIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsImhhbmRsZUxvYWQiLCJyZWFkeVN0YXRlIiwicmVzcG9uc2VVUkwiLCJzZXRUaW1lb3V0Iiwib25hYm9ydCIsImhhbmRsZUFib3J0Iiwib25lcnJvciIsImhhbmRsZUVycm9yIiwib250aW1lb3V0IiwiaGFuZGxlVGltZW91dCIsInRpbWVvdXRFcnJvck1lc3NhZ2UiLCJ4c3JmVmFsdWUiLCJyZWFkIiwic2V0UmVxdWVzdEhlYWRlciIsIm9uRG93bmxvYWRQcm9ncmVzcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJvblVwbG9hZFByb2dyZXNzIiwidXBsb2FkIiwiY2FuY2VsIiwiYWJvcnQiLCJzdWJzY3JpYmUiLCJzZW5kIiwic3RhbmRhcmRCcm93c2VyRW52Iiwid3JpdGUiLCJleHBpcmVzIiwicGF0aCIsImRvbWFpbiIsInNlY3VyZSIsImNvb2tpZSIsInRvR01UU3RyaW5nIiwibWF0Y2giLCJSZWdFeHAiLCJyZW1vdmUiLCJub25TdGFuZGFyZEJyb3dzZXJFbnYiLCJpc0Fic29sdXRlVVJMIiwiY29tYmluZVVSTHMiLCJyZXF1ZXN0ZWRVUkwiLCJyZWxhdGl2ZVVSTCIsImlnbm9yZUR1cGxpY2F0ZU9mIiwicGFyc2VkIiwibGluZSIsIm1zaWUiLCJ1c2VyQWdlbnQiLCJ1cmxQYXJzaW5nTm9kZSIsImNyZWF0ZUVsZW1lbnQiLCJvcmlnaW5VUkwiLCJyZXNvbHZlVVJMIiwiaHJlZiIsInNldEF0dHJpYnV0ZSIsImhvc3QiLCJzZWFyY2giLCJoYXNoIiwiaG9zdG5hbWUiLCJwb3J0IiwicGF0aG5hbWUiLCJsb2NhdGlvbiIsInJlcXVlc3RVUkwiLCJfX0NBTkNFTF9fIiwiY29uZmlnMSIsImNvbmZpZzIiLCJnZXRNZXJnZWRWYWx1ZSIsInNvdXJjZSIsIm1lcmdlRGVlcFByb3BlcnRpZXMiLCJwcm9wIiwidmFsdWVGcm9tQ29uZmlnMiIsImRlZmF1bHRUb0NvbmZpZzIiLCJtZXJnZURpcmVjdEtleXMiLCJtZXJnZU1hcCIsImNvbXB1dGVDb25maWdWYWx1ZSIsImNvbmZpZ1ZhbHVlIiwidGhpbmciLCJkZXByZWNhdGVkV2FybmluZ3MiLCJmb3JtYXRNZXNzYWdlIiwiZGVzYyIsInNjaGVtYSIsImFsbG93VW5rbm93biIsIlR5cGVFcnJvciIsImV4ZWN1dG9yIiwicmVzb2x2ZVByb21pc2UiLCJwcm9taXNlRXhlY3V0b3IiLCJfbGlzdGVuZXJzIiwib25mdWxmaWxsZWQiLCJwYXlsb2FkIiwiZ2V0QmFubmVyTGlzdCIsImdldFVzZXJJbWdMaXN0IiwiZGV0YWlsc1Rpa3Rva0ltZyIsImp1ZGdlVGlrdG9rTGlrZSIsImp1ZGdlVGlrdG9rQ29sbGVjdCIsInRpa3Rva0xpa2UiLCJ0aWt0b2tVbkxpa2UiLCJ0aWt0b2tDb2xsZWN0IiwidGlrdG9rVW5Db2xsZWN0IiwiZ2V0Q29sbGVjdGlvbkxpc3QiLCJlbiIsInpoSGFucyIsInpoSGFudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OzttVUFBQTtBQUNBLGdFOztBQUVBLElBQUlBLFFBQUo7O0FBRUEsSUFBTUMsR0FBRyxHQUFHLG1FQUFaO0FBQ0EsSUFBTUMsS0FBSyxHQUFHLHNFQUFkOztBQUVBLElBQUksT0FBT0MsSUFBUCxLQUFnQixVQUFwQixFQUFnQztBQUM5QkgsVUFBUSxHQUFHLGtCQUFVSSxHQUFWLEVBQWU7QUFDeEJBLE9BQUcsR0FBR0MsTUFBTSxDQUFDRCxHQUFELENBQU4sQ0FBWUUsT0FBWixDQUFvQixlQUFwQixFQUFxQyxFQUFyQyxDQUFOO0FBQ0EsUUFBSSxDQUFDSixLQUFLLENBQUNLLElBQU4sQ0FBV0gsR0FBWCxDQUFMLEVBQXNCLENBQUUsTUFBTSxJQUFJSSxLQUFKLENBQVUsMEZBQVYsQ0FBTixDQUE2Rzs7QUFFckk7QUFDQUosT0FBRyxJQUFJLEtBQUtLLEtBQUwsQ0FBVyxLQUFLTCxHQUFHLENBQUNNLE1BQUosR0FBYSxDQUFsQixDQUFYLENBQVA7QUFDQSxRQUFJQyxNQUFKLENBQVksSUFBSUMsTUFBTSxHQUFHLEVBQWIsQ0FBaUIsSUFBSUMsRUFBSixDQUFRLElBQUlDLEVBQUosQ0FBUSxJQUFJQyxDQUFDLEdBQUcsQ0FBUjtBQUM3QyxXQUFPQSxDQUFDLEdBQUdYLEdBQUcsQ0FBQ00sTUFBZixHQUF3QjtBQUN0QkMsWUFBTSxHQUFHVixHQUFHLENBQUNlLE9BQUosQ0FBWVosR0FBRyxDQUFDYSxNQUFKLENBQVdGLENBQUMsRUFBWixDQUFaLEtBQWdDLEVBQWhDLEdBQXFDZCxHQUFHLENBQUNlLE9BQUosQ0FBWVosR0FBRyxDQUFDYSxNQUFKLENBQVdGLENBQUMsRUFBWixDQUFaLEtBQWdDLEVBQXJFO0FBQ0ssT0FBQ0YsRUFBRSxHQUFHWixHQUFHLENBQUNlLE9BQUosQ0FBWVosR0FBRyxDQUFDYSxNQUFKLENBQVdGLENBQUMsRUFBWixDQUFaLENBQU4sS0FBdUMsQ0FENUMsSUFDaURELEVBQUUsR0FBR2IsR0FBRyxDQUFDZSxPQUFKLENBQVlaLEdBQUcsQ0FBQ2EsTUFBSixDQUFXRixDQUFDLEVBQVosQ0FBWixDQUR0RCxDQUFUOztBQUdBSCxZQUFNLElBQUlDLEVBQUUsS0FBSyxFQUFQLEdBQVlSLE1BQU0sQ0FBQ2EsWUFBUCxDQUFvQlAsTUFBTSxJQUFJLEVBQVYsR0FBZSxHQUFuQyxDQUFaO0FBQ05HLFFBQUUsS0FBSyxFQUFQLEdBQVlULE1BQU0sQ0FBQ2EsWUFBUCxDQUFvQlAsTUFBTSxJQUFJLEVBQVYsR0FBZSxHQUFuQyxFQUF3Q0EsTUFBTSxJQUFJLENBQVYsR0FBYyxHQUF0RCxDQUFaO0FBQ0VOLFlBQU0sQ0FBQ2EsWUFBUCxDQUFvQlAsTUFBTSxJQUFJLEVBQVYsR0FBZSxHQUFuQyxFQUF3Q0EsTUFBTSxJQUFJLENBQVYsR0FBYyxHQUF0RCxFQUEyREEsTUFBTSxHQUFHLEdBQXBFLENBRk47QUFHRDtBQUNELFdBQU9DLE1BQVA7QUFDRCxHQWhCRDtBQWlCRCxDQWxCRCxNQWtCTztBQUNMO0FBQ0FaLFVBQVEsR0FBR0csSUFBWDtBQUNEOztBQUVELFNBQVNnQixnQkFBVCxDQUEyQmYsR0FBM0IsRUFBZ0M7QUFDOUIsU0FBT2dCLGtCQUFrQixDQUFDcEIsUUFBUSxDQUFDSSxHQUFELENBQVIsQ0FBY2lCLEtBQWQsQ0FBb0IsRUFBcEIsRUFBd0JDLEdBQXhCLENBQTRCLFVBQVVDLENBQVYsRUFBYTtBQUNqRSxXQUFPLE1BQU0sQ0FBQyxPQUFPQSxDQUFDLENBQUNDLFVBQUYsQ0FBYSxDQUFiLEVBQWdCQyxRQUFoQixDQUF5QixFQUF6QixDQUFSLEVBQXNDaEIsS0FBdEMsQ0FBNEMsQ0FBQyxDQUE3QyxDQUFiO0FBQ0QsR0FGeUIsRUFFdkJpQixJQUZ1QixDQUVsQixFQUZrQixDQUFELENBQXpCO0FBR0Q7O0FBRUQsU0FBU0Msa0JBQVQsR0FBK0I7QUFDN0IsTUFBTUMsS0FBSyxHQUFLQyxFQUFGLENBQU1DLGNBQU4sQ0FBcUIsY0FBckIsS0FBd0MsRUFBdEQ7QUFDQSxNQUFNQyxRQUFRLEdBQUdILEtBQUssQ0FBQ1AsS0FBTixDQUFZLEdBQVosQ0FBakI7QUFDQSxNQUFJLENBQUNPLEtBQUQsSUFBVUcsUUFBUSxDQUFDckIsTUFBVCxLQUFvQixDQUFsQyxFQUFxQztBQUNuQyxXQUFPO0FBQ0xzQixTQUFHLEVBQUUsSUFEQTtBQUVMQyxVQUFJLEVBQUUsRUFGRDtBQUdMQyxnQkFBVSxFQUFFLEVBSFA7QUFJTEMsa0JBQVksRUFBRSxDQUpULEVBQVA7O0FBTUQ7QUFDRCxNQUFJQyxRQUFKO0FBQ0EsTUFBSTtBQUNGQSxZQUFRLEdBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXbkIsZ0JBQWdCLENBQUNZLFFBQVEsQ0FBQyxDQUFELENBQVQsQ0FBM0IsQ0FBWDtBQUNELEdBRkQsQ0FFRSxPQUFPUSxLQUFQLEVBQWM7QUFDZCxVQUFNLElBQUkvQixLQUFKLENBQVUsd0JBQXdCK0IsS0FBSyxDQUFDQyxPQUF4QyxDQUFOO0FBQ0Q7QUFDREosVUFBUSxDQUFDRCxZQUFULEdBQXdCQyxRQUFRLENBQUNLLEdBQVQsR0FBZSxJQUF2QztBQUNBLFNBQU9MLFFBQVEsQ0FBQ0ssR0FBaEI7QUFDQSxTQUFPTCxRQUFRLENBQUNNLEdBQWhCO0FBQ0EsU0FBT04sUUFBUDtBQUNEOztBQUVELFNBQVNPLFVBQVQsQ0FBcUJDLEdBQXJCLEVBQTBCO0FBQ3hCQSxLQUFHLENBQUNDLFNBQUosQ0FBY0MsWUFBZCxHQUE2QixVQUFVQyxNQUFWLEVBQWtCOzs7QUFHekNwQixzQkFBa0IsRUFIdUIsQ0FFM0NNLElBRjJDLHVCQUUzQ0EsSUFGMkM7QUFJN0MsV0FBT0EsSUFBSSxDQUFDakIsT0FBTCxDQUFhK0IsTUFBYixJQUF1QixDQUFDLENBQS9CO0FBQ0QsR0FMRDtBQU1BSCxLQUFHLENBQUNDLFNBQUosQ0FBY0csa0JBQWQsR0FBbUMsVUFBVUMsWUFBVixFQUF3Qjs7O0FBR3JEdEIsc0JBQWtCLEVBSG1DLENBRXZETyxVQUZ1RCx3QkFFdkRBLFVBRnVEO0FBSXpELFdBQU8sS0FBS1ksWUFBTCxDQUFrQixPQUFsQixLQUE4QlosVUFBVSxDQUFDbEIsT0FBWCxDQUFtQmlDLFlBQW5CLElBQW1DLENBQUMsQ0FBekU7QUFDRCxHQUxEO0FBTUFMLEtBQUcsQ0FBQ0MsU0FBSixDQUFjSyxlQUFkLEdBQWdDLFlBQVk7OztBQUd0Q3ZCLHNCQUFrQixFQUhvQixDQUV4Q1EsWUFGd0Msd0JBRXhDQSxZQUZ3QztBQUkxQyxXQUFPQSxZQUFZLEdBQUdnQixJQUFJLENBQUNDLEdBQUwsRUFBdEI7QUFDRCxHQUxEO0FBTUQ7O0FBRUQsSUFBTUMsU0FBUyxHQUFHQyxNQUFNLENBQUNULFNBQVAsQ0FBaUJwQixRQUFuQztBQUNBLElBQU04QixjQUFjLEdBQUdELE1BQU0sQ0FBQ1QsU0FBUCxDQUFpQlUsY0FBeEM7O0FBRUEsU0FBU0MsSUFBVCxDQUFlQyxFQUFmLEVBQW1CO0FBQ2pCLFNBQU8sT0FBT0EsRUFBUCxLQUFjLFVBQXJCO0FBQ0Q7O0FBRUQsU0FBU0MsS0FBVCxDQUFnQnRELEdBQWhCLEVBQXFCO0FBQ25CLFNBQU8sT0FBT0EsR0FBUCxLQUFlLFFBQXRCO0FBQ0Q7O0FBRUQsU0FBU3VELGFBQVQsQ0FBd0JDLEdBQXhCLEVBQTZCO0FBQzNCLFNBQU9QLFNBQVMsQ0FBQ1EsSUFBVixDQUFlRCxHQUFmLE1BQXdCLGlCQUEvQjtBQUNEOztBQUVELFNBQVNFLE1BQVQsQ0FBaUJGLEdBQWpCLEVBQXNCRyxHQUF0QixFQUEyQjtBQUN6QixTQUFPUixjQUFjLENBQUNNLElBQWYsQ0FBb0JELEdBQXBCLEVBQXlCRyxHQUF6QixDQUFQO0FBQ0Q7O0FBRUQsU0FBU0MsSUFBVCxHQUFpQixDQUFFOztBQUVuQjs7O0FBR0EsU0FBU0MsTUFBVCxDQUFpQlIsRUFBakIsRUFBcUI7QUFDbkIsTUFBTVMsS0FBSyxHQUFHWixNQUFNLENBQUNhLE1BQVAsQ0FBYyxJQUFkLENBQWQ7QUFDQSxTQUFPLFNBQVNDLFFBQVQsQ0FBbUJoRSxHQUFuQixFQUF3QjtBQUM3QixRQUFNaUUsR0FBRyxHQUFHSCxLQUFLLENBQUM5RCxHQUFELENBQWpCO0FBQ0EsV0FBT2lFLEdBQUcsS0FBS0gsS0FBSyxDQUFDOUQsR0FBRCxDQUFMLEdBQWFxRCxFQUFFLENBQUNyRCxHQUFELENBQXBCLENBQVY7QUFDRCxHQUhEO0FBSUQ7O0FBRUQ7OztBQUdBLElBQU1rRSxVQUFVLEdBQUcsUUFBbkI7QUFDQSxJQUFNQyxRQUFRLEdBQUdOLE1BQU0sQ0FBQyxVQUFDN0QsR0FBRCxFQUFTO0FBQy9CLFNBQU9BLEdBQUcsQ0FBQ0UsT0FBSixDQUFZZ0UsVUFBWixFQUF3QixVQUFDRSxDQUFELEVBQUlqRCxDQUFKLFVBQVVBLENBQUMsR0FBR0EsQ0FBQyxDQUFDa0QsV0FBRixFQUFILEdBQXFCLEVBQWhDLEVBQXhCLENBQVA7QUFDRCxDQUZzQixDQUF2Qjs7QUFJQSxJQUFNQyxLQUFLLEdBQUc7QUFDWixRQURZO0FBRVosU0FGWTtBQUdaLE1BSFk7QUFJWixVQUpZO0FBS1osYUFMWSxDQUFkOzs7QUFRQSxJQUFNQyxrQkFBa0IsR0FBRyxFQUEzQjtBQUNBLElBQU1DLGtCQUFrQixHQUFHLEVBQTNCOztBQUVBLFNBQVNDLFNBQVQsQ0FBb0JDLFNBQXBCLEVBQStCQyxRQUEvQixFQUF5QztBQUN2QyxNQUFNQyxHQUFHLEdBQUdELFFBQVE7QUFDaEJELFdBQVM7QUFDUEEsV0FBUyxDQUFDRyxNQUFWLENBQWlCRixRQUFqQixDQURPO0FBRVBHLE9BQUssQ0FBQ0MsT0FBTixDQUFjSixRQUFkO0FBQ0VBLFVBREYsR0FDYSxDQUFDQSxRQUFELENBSkM7QUFLaEJELFdBTEo7QUFNQSxTQUFPRSxHQUFHO0FBQ05JLGFBQVcsQ0FBQ0osR0FBRCxDQURMO0FBRU5BLEtBRko7QUFHRDs7QUFFRCxTQUFTSSxXQUFULENBQXNCQyxLQUF0QixFQUE2QjtBQUMzQixNQUFNTCxHQUFHLEdBQUcsRUFBWjtBQUNBLE9BQUssSUFBSWpFLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdzRSxLQUFLLENBQUMzRSxNQUExQixFQUFrQ0ssQ0FBQyxFQUFuQyxFQUF1QztBQUNyQyxRQUFJaUUsR0FBRyxDQUFDaEUsT0FBSixDQUFZcUUsS0FBSyxDQUFDdEUsQ0FBRCxDQUFqQixNQUEwQixDQUFDLENBQS9CLEVBQWtDO0FBQ2hDaUUsU0FBRyxDQUFDTSxJQUFKLENBQVNELEtBQUssQ0FBQ3RFLENBQUQsQ0FBZDtBQUNEO0FBQ0Y7QUFDRCxTQUFPaUUsR0FBUDtBQUNEOztBQUVELFNBQVNPLFVBQVQsQ0FBcUJGLEtBQXJCLEVBQTRCRyxJQUE1QixFQUFrQztBQUNoQyxNQUFNQyxLQUFLLEdBQUdKLEtBQUssQ0FBQ3JFLE9BQU4sQ0FBY3dFLElBQWQsQ0FBZDtBQUNBLE1BQUlDLEtBQUssS0FBSyxDQUFDLENBQWYsRUFBa0I7QUFDaEJKLFNBQUssQ0FBQ0ssTUFBTixDQUFhRCxLQUFiLEVBQW9CLENBQXBCO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTRSxvQkFBVCxDQUErQkMsV0FBL0IsRUFBNENDLE1BQTVDLEVBQW9EO0FBQ2xEdkMsUUFBTSxDQUFDd0MsSUFBUCxDQUFZRCxNQUFaLEVBQW9CRSxPQUFwQixDQUE0QixVQUFBUCxJQUFJLEVBQUk7QUFDbEMsUUFBSWQsS0FBSyxDQUFDMUQsT0FBTixDQUFjd0UsSUFBZCxNQUF3QixDQUFDLENBQXpCLElBQThCaEMsSUFBSSxDQUFDcUMsTUFBTSxDQUFDTCxJQUFELENBQVAsQ0FBdEMsRUFBc0Q7QUFDcERJLGlCQUFXLENBQUNKLElBQUQsQ0FBWCxHQUFvQlgsU0FBUyxDQUFDZSxXQUFXLENBQUNKLElBQUQsQ0FBWixFQUFvQkssTUFBTSxDQUFDTCxJQUFELENBQTFCLENBQTdCO0FBQ0Q7QUFDRixHQUpEO0FBS0Q7O0FBRUQsU0FBU1EscUJBQVQsQ0FBZ0NKLFdBQWhDLEVBQTZDQyxNQUE3QyxFQUFxRDtBQUNuRCxNQUFJLENBQUNELFdBQUQsSUFBZ0IsQ0FBQ0MsTUFBckIsRUFBNkI7QUFDM0I7QUFDRDtBQUNEdkMsUUFBTSxDQUFDd0MsSUFBUCxDQUFZRCxNQUFaLEVBQW9CRSxPQUFwQixDQUE0QixVQUFBUCxJQUFJLEVBQUk7QUFDbEMsUUFBSWQsS0FBSyxDQUFDMUQsT0FBTixDQUFjd0UsSUFBZCxNQUF3QixDQUFDLENBQXpCLElBQThCaEMsSUFBSSxDQUFDcUMsTUFBTSxDQUFDTCxJQUFELENBQVAsQ0FBdEMsRUFBc0Q7QUFDcERELGdCQUFVLENBQUNLLFdBQVcsQ0FBQ0osSUFBRCxDQUFaLEVBQW9CSyxNQUFNLENBQUNMLElBQUQsQ0FBMUIsQ0FBVjtBQUNEO0FBQ0YsR0FKRDtBQUtEOztBQUVELFNBQVNTLGNBQVQsQ0FBeUJDLE1BQXpCLEVBQWlDTCxNQUFqQyxFQUF5QztBQUN2QyxNQUFJLE9BQU9LLE1BQVAsS0FBa0IsUUFBbEIsSUFBOEJ2QyxhQUFhLENBQUNrQyxNQUFELENBQS9DLEVBQXlEO0FBQ3ZERix3QkFBb0IsQ0FBQ2Ysa0JBQWtCLENBQUNzQixNQUFELENBQWxCLEtBQStCdEIsa0JBQWtCLENBQUNzQixNQUFELENBQWxCLEdBQTZCLEVBQTVELENBQUQsRUFBa0VMLE1BQWxFLENBQXBCO0FBQ0QsR0FGRCxNQUVPLElBQUlsQyxhQUFhLENBQUN1QyxNQUFELENBQWpCLEVBQTJCO0FBQ2hDUCx3QkFBb0IsQ0FBQ2hCLGtCQUFELEVBQXFCdUIsTUFBckIsQ0FBcEI7QUFDRDtBQUNGOztBQUVELFNBQVNDLGlCQUFULENBQTRCRCxNQUE1QixFQUFvQ0wsTUFBcEMsRUFBNEM7QUFDMUMsTUFBSSxPQUFPSyxNQUFQLEtBQWtCLFFBQXRCLEVBQWdDO0FBQzlCLFFBQUl2QyxhQUFhLENBQUNrQyxNQUFELENBQWpCLEVBQTJCO0FBQ3pCRywyQkFBcUIsQ0FBQ3BCLGtCQUFrQixDQUFDc0IsTUFBRCxDQUFuQixFQUE2QkwsTUFBN0IsQ0FBckI7QUFDRCxLQUZELE1BRU87QUFDTCxhQUFPakIsa0JBQWtCLENBQUNzQixNQUFELENBQXpCO0FBQ0Q7QUFDRixHQU5ELE1BTU8sSUFBSXZDLGFBQWEsQ0FBQ3VDLE1BQUQsQ0FBakIsRUFBMkI7QUFDaENGLHlCQUFxQixDQUFDckIsa0JBQUQsRUFBcUJ1QixNQUFyQixDQUFyQjtBQUNEO0FBQ0Y7O0FBRUQsU0FBU0UsV0FBVCxDQUFzQlosSUFBdEIsRUFBNEI7QUFDMUIsU0FBTyxVQUFVYSxJQUFWLEVBQWdCO0FBQ3JCLFdBQU9iLElBQUksQ0FBQ2EsSUFBRCxDQUFKLElBQWNBLElBQXJCO0FBQ0QsR0FGRDtBQUdEOztBQUVELFNBQVNDLFNBQVQsQ0FBb0IxQyxHQUFwQixFQUF5QjtBQUN2QixTQUFPLENBQUMsQ0FBQ0EsR0FBRixLQUFVLE9BQU9BLEdBQVAsS0FBZSxRQUFmLElBQTJCLE9BQU9BLEdBQVAsS0FBZSxVQUFwRCxLQUFtRSxPQUFPQSxHQUFHLENBQUMyQyxJQUFYLEtBQW9CLFVBQTlGO0FBQ0Q7O0FBRUQsU0FBU0MsS0FBVCxDQUFnQm5CLEtBQWhCLEVBQXVCZ0IsSUFBdkIsRUFBNkI7QUFDM0IsTUFBSUksT0FBTyxHQUFHLEtBQWQ7QUFDQSxPQUFLLElBQUkxRixDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHc0UsS0FBSyxDQUFDM0UsTUFBMUIsRUFBa0NLLENBQUMsRUFBbkMsRUFBdUM7QUFDckMsUUFBTXlFLElBQUksR0FBR0gsS0FBSyxDQUFDdEUsQ0FBRCxDQUFsQjtBQUNBLFFBQUkwRixPQUFKLEVBQWE7QUFDWEEsYUFBTyxHQUFHQyxPQUFPLENBQUNDLE9BQVIsQ0FBZ0JQLFdBQVcsQ0FBQ1osSUFBRCxDQUEzQixDQUFWO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsVUFBTVIsR0FBRyxHQUFHUSxJQUFJLENBQUNhLElBQUQsQ0FBaEI7QUFDQSxVQUFJQyxTQUFTLENBQUN0QixHQUFELENBQWIsRUFBb0I7QUFDbEJ5QixlQUFPLEdBQUdDLE9BQU8sQ0FBQ0MsT0FBUixDQUFnQjNCLEdBQWhCLENBQVY7QUFDRDtBQUNELFVBQUlBLEdBQUcsS0FBSyxLQUFaLEVBQW1CO0FBQ2pCLGVBQU87QUFDTHVCLGNBREssa0JBQ0csQ0FBRyxDQUROLEVBQVA7O0FBR0Q7QUFDRjtBQUNGO0FBQ0QsU0FBT0UsT0FBTyxJQUFJO0FBQ2hCRixRQURnQixnQkFDVkssUUFEVSxFQUNBO0FBQ2QsYUFBT0EsUUFBUSxDQUFDUCxJQUFELENBQWY7QUFDRCxLQUhlLEVBQWxCOztBQUtEOztBQUVELFNBQVNRLGNBQVQsQ0FBeUJqQixXQUF6QixFQUFvRCxLQUFka0IsT0FBYyx1RUFBSixFQUFJO0FBQ2xELEdBQUMsU0FBRCxFQUFZLE1BQVosRUFBb0IsVUFBcEIsRUFBZ0NmLE9BQWhDLENBQXdDLFVBQUFnQixJQUFJLEVBQUk7QUFDOUMsUUFBSTdCLEtBQUssQ0FBQ0MsT0FBTixDQUFjUyxXQUFXLENBQUNtQixJQUFELENBQXpCLENBQUosRUFBc0M7QUFDcEMsVUFBTUMsV0FBVyxHQUFHRixPQUFPLENBQUNDLElBQUQsQ0FBM0I7QUFDQUQsYUFBTyxDQUFDQyxJQUFELENBQVAsR0FBZ0IsU0FBU0UsbUJBQVQsQ0FBOEJqQyxHQUE5QixFQUFtQztBQUNqRHdCLGFBQUssQ0FBQ1osV0FBVyxDQUFDbUIsSUFBRCxDQUFaLEVBQW9CL0IsR0FBcEIsQ0FBTCxDQUE4QnVCLElBQTlCLENBQW1DLFVBQUN2QixHQUFELEVBQVM7QUFDMUM7QUFDQSxpQkFBT3hCLElBQUksQ0FBQ3dELFdBQUQsQ0FBSixJQUFxQkEsV0FBVyxDQUFDaEMsR0FBRCxDQUFoQyxJQUF5Q0EsR0FBaEQ7QUFDRCxTQUhEO0FBSUQsT0FMRDtBQU1EO0FBQ0YsR0FWRDtBQVdBLFNBQU84QixPQUFQO0FBQ0Q7O0FBRUQsU0FBU0ksa0JBQVQsQ0FBNkJoQixNQUE3QixFQUFxQ2lCLFdBQXJDLEVBQWtEO0FBQ2hELE1BQU1DLGdCQUFnQixHQUFHLEVBQXpCO0FBQ0EsTUFBSWxDLEtBQUssQ0FBQ0MsT0FBTixDQUFjUixrQkFBa0IsQ0FBQ3dDLFdBQWpDLENBQUosRUFBbUQ7QUFDakRDLG9CQUFnQixDQUFDOUIsSUFBakIsT0FBQThCLGdCQUFnQixxQkFBU3pDLGtCQUFrQixDQUFDd0MsV0FBNUIsRUFBaEI7QUFDRDtBQUNELE1BQU12QixXQUFXLEdBQUdoQixrQkFBa0IsQ0FBQ3NCLE1BQUQsQ0FBdEM7QUFDQSxNQUFJTixXQUFXLElBQUlWLEtBQUssQ0FBQ0MsT0FBTixDQUFjUyxXQUFXLENBQUN1QixXQUExQixDQUFuQixFQUEyRDtBQUN6REMsb0JBQWdCLENBQUM5QixJQUFqQixPQUFBOEIsZ0JBQWdCLHFCQUFTeEIsV0FBVyxDQUFDdUIsV0FBckIsRUFBaEI7QUFDRDtBQUNEQyxrQkFBZ0IsQ0FBQ3JCLE9BQWpCLENBQXlCLFVBQUFQLElBQUksRUFBSTtBQUMvQjJCLGVBQVcsR0FBRzNCLElBQUksQ0FBQzJCLFdBQUQsQ0FBSixJQUFxQkEsV0FBbkM7QUFDRCxHQUZEO0FBR0EsU0FBT0EsV0FBUDtBQUNEOztBQUVELFNBQVNFLHNCQUFULENBQWlDbkIsTUFBakMsRUFBeUM7QUFDdkMsTUFBTU4sV0FBVyxHQUFHdEMsTUFBTSxDQUFDYSxNQUFQLENBQWMsSUFBZCxDQUFwQjtBQUNBYixRQUFNLENBQUN3QyxJQUFQLENBQVluQixrQkFBWixFQUFnQ29CLE9BQWhDLENBQXdDLFVBQUFQLElBQUksRUFBSTtBQUM5QyxRQUFJQSxJQUFJLEtBQUssYUFBYixFQUE0QjtBQUMxQkksaUJBQVcsQ0FBQ0osSUFBRCxDQUFYLEdBQW9CYixrQkFBa0IsQ0FBQ2EsSUFBRCxDQUFsQixDQUF5Qi9FLEtBQXpCLEVBQXBCO0FBQ0Q7QUFDRixHQUpEO0FBS0EsTUFBTTZHLGlCQUFpQixHQUFHMUMsa0JBQWtCLENBQUNzQixNQUFELENBQTVDO0FBQ0EsTUFBSW9CLGlCQUFKLEVBQXVCO0FBQ3JCaEUsVUFBTSxDQUFDd0MsSUFBUCxDQUFZd0IsaUJBQVosRUFBK0J2QixPQUEvQixDQUF1QyxVQUFBUCxJQUFJLEVBQUk7QUFDN0MsVUFBSUEsSUFBSSxLQUFLLGFBQWIsRUFBNEI7QUFDMUJJLG1CQUFXLENBQUNKLElBQUQsQ0FBWCxHQUFvQixDQUFDSSxXQUFXLENBQUNKLElBQUQsQ0FBWCxJQUFxQixFQUF0QixFQUEwQlAsTUFBMUIsQ0FBaUNxQyxpQkFBaUIsQ0FBQzlCLElBQUQsQ0FBbEQsQ0FBcEI7QUFDRDtBQUNGLEtBSkQ7QUFLRDtBQUNELFNBQU9JLFdBQVA7QUFDRDs7QUFFRCxTQUFTMkIsU0FBVCxDQUFvQnJCLE1BQXBCLEVBQTRCc0IsR0FBNUIsRUFBaUNWLE9BQWpDLEVBQXFELG1DQUFSVyxNQUFRLHVFQUFSQSxNQUFRO0FBQ25ELE1BQU03QixXQUFXLEdBQUd5QixzQkFBc0IsQ0FBQ25CLE1BQUQsQ0FBMUM7QUFDQSxNQUFJTixXQUFXLElBQUl0QyxNQUFNLENBQUN3QyxJQUFQLENBQVlGLFdBQVosRUFBeUJsRixNQUE1QyxFQUFvRDtBQUNsRCxRQUFJd0UsS0FBSyxDQUFDQyxPQUFOLENBQWNTLFdBQVcsQ0FBQzhCLE1BQTFCLENBQUosRUFBdUM7QUFDckMsVUFBTTFDLEdBQUcsR0FBR3dCLEtBQUssQ0FBQ1osV0FBVyxDQUFDOEIsTUFBYixFQUFxQlosT0FBckIsQ0FBakI7QUFDQSxhQUFPOUIsR0FBRyxDQUFDdUIsSUFBSixDQUFTLFVBQUNPLE9BQUQsRUFBYTtBQUMzQixlQUFPVSxHQUFHLE1BQUgsVUFBSVgsY0FBYyxDQUFDakIsV0FBRCxFQUFja0IsT0FBZCxDQUFsQixTQUE2Q1csTUFBN0MsRUFBUDtBQUNELE9BRk0sQ0FBUDtBQUdELEtBTEQsTUFLTztBQUNMLGFBQU9ELEdBQUcsTUFBSCxVQUFJWCxjQUFjLENBQUNqQixXQUFELEVBQWNrQixPQUFkLENBQWxCLFNBQTZDVyxNQUE3QyxFQUFQO0FBQ0Q7QUFDRjtBQUNELFNBQU9ELEdBQUcsTUFBSCxVQUFJVixPQUFKLFNBQWdCVyxNQUFoQixFQUFQO0FBQ0Q7O0FBRUQsSUFBTUUsa0JBQWtCLEdBQUc7QUFDekJSLGFBRHlCLHVCQUNabkMsR0FEWSxFQUNQO0FBQ2hCLFFBQUksQ0FBQ3NCLFNBQVMsQ0FBQ3RCLEdBQUQsQ0FBZCxFQUFxQjtBQUNuQixhQUFPQSxHQUFQO0FBQ0Q7QUFDRCxXQUFPLElBQUkwQixPQUFKLENBQVksVUFBQ0MsT0FBRCxFQUFVaUIsTUFBVixFQUFxQjtBQUN0QzVDLFNBQUcsQ0FBQ3VCLElBQUosQ0FBUyxVQUFBdkIsR0FBRyxFQUFJO0FBQ2QsWUFBSUEsR0FBRyxDQUFDLENBQUQsQ0FBUCxFQUFZO0FBQ1Y0QyxnQkFBTSxDQUFDNUMsR0FBRyxDQUFDLENBQUQsQ0FBSixDQUFOO0FBQ0QsU0FGRCxNQUVPO0FBQ0wyQixpQkFBTyxDQUFDM0IsR0FBRyxDQUFDLENBQUQsQ0FBSixDQUFQO0FBQ0Q7QUFDRixPQU5EO0FBT0QsS0FSTSxDQUFQO0FBU0QsR0Fkd0IsRUFBM0I7OztBQWlCQSxJQUFNNkMsV0FBVztBQUNmLDBUQURGOztBQUdBLElBQU1DLGNBQWMsR0FBRyxrQkFBdkI7O0FBRUE7QUFDQSxJQUFNQyxrQkFBa0IsR0FBRyxDQUFDLHFCQUFELENBQTNCOztBQUVBO0FBQ0EsSUFBTUMsU0FBUyxHQUFHLENBQUMscUJBQUQsQ0FBbEI7O0FBRUEsSUFBTUMsZUFBZSxHQUFHLFVBQXhCOztBQUVBLFNBQVNDLFlBQVQsQ0FBdUJuQixJQUF2QixFQUE2QjtBQUMzQixTQUFPZSxjQUFjLENBQUN2SCxJQUFmLENBQW9Cd0csSUFBcEIsS0FBNkJnQixrQkFBa0IsQ0FBQy9HLE9BQW5CLENBQTJCK0YsSUFBM0IsTUFBcUMsQ0FBQyxDQUExRTtBQUNEO0FBQ0QsU0FBU29CLFNBQVQsQ0FBb0JwQixJQUFwQixFQUEwQjtBQUN4QixTQUFPYyxXQUFXLENBQUN0SCxJQUFaLENBQWlCd0csSUFBakIsS0FBMEJpQixTQUFTLENBQUNoSCxPQUFWLENBQWtCK0YsSUFBbEIsTUFBNEIsQ0FBQyxDQUE5RDtBQUNEOztBQUVELFNBQVNxQixhQUFULENBQXdCckIsSUFBeEIsRUFBOEI7QUFDNUIsU0FBT2tCLGVBQWUsQ0FBQzFILElBQWhCLENBQXFCd0csSUFBckIsS0FBOEJBLElBQUksS0FBSyxRQUE5QztBQUNEOztBQUVELFNBQVNzQixhQUFULENBQXdCNUIsT0FBeEIsRUFBaUM7QUFDL0IsU0FBT0EsT0FBTyxDQUFDRixJQUFSLENBQWEsVUFBQUYsSUFBSSxFQUFJO0FBQzFCLFdBQU8sQ0FBQyxJQUFELEVBQU9BLElBQVAsQ0FBUDtBQUNELEdBRk07QUFHSmlDLE9BSEksQ0FHRSxVQUFBQyxHQUFHLFVBQUksQ0FBQ0EsR0FBRCxDQUFKLEVBSEwsQ0FBUDtBQUlEOztBQUVELFNBQVNDLGFBQVQsQ0FBd0J6QixJQUF4QixFQUE4QjtBQUM1QjtBQUNFbUIsY0FBWSxDQUFDbkIsSUFBRCxDQUFaO0FBQ0FvQixXQUFTLENBQUNwQixJQUFELENBRFQ7QUFFQXFCLGVBQWEsQ0FBQ3JCLElBQUQsQ0FIZjtBQUlFO0FBQ0EsV0FBTyxLQUFQO0FBQ0Q7QUFDRCxTQUFPLElBQVA7QUFDRDs7QUFFRDtBQUNBLElBQUksQ0FBQ0wsT0FBTyxDQUFDN0QsU0FBUixDQUFrQjRGLE9BQXZCLEVBQWdDO0FBQzlCL0IsU0FBTyxDQUFDN0QsU0FBUixDQUFrQjRGLE9BQWxCLEdBQTRCLFVBQVU3QixRQUFWLEVBQW9CO0FBQzlDLFFBQU1ILE9BQU8sR0FBRyxLQUFLaUMsV0FBckI7QUFDQSxXQUFPLEtBQUtuQyxJQUFMO0FBQ0wsY0FBQW9DLEtBQUssVUFBSWxDLE9BQU8sQ0FBQ0UsT0FBUixDQUFnQkMsUUFBUSxFQUF4QixFQUE0QkwsSUFBNUIsQ0FBaUMsb0JBQU1vQyxLQUFOLEVBQWpDLENBQUosRUFEQTtBQUVMLGNBQUFDLE1BQU0sVUFBSW5DLE9BQU8sQ0FBQ0UsT0FBUixDQUFnQkMsUUFBUSxFQUF4QixFQUE0QkwsSUFBNUIsQ0FBaUMsWUFBTTtBQUMvQyxjQUFNcUMsTUFBTjtBQUNELE9BRlMsQ0FBSixFQUZELENBQVA7O0FBTUQsR0FSRDtBQVNEOztBQUVELFNBQVNDLFNBQVQsQ0FBb0I5QixJQUFwQixFQUEwQlMsR0FBMUIsRUFBK0I7QUFDN0IsTUFBSSxDQUFDZ0IsYUFBYSxDQUFDekIsSUFBRCxDQUFsQixFQUEwQjtBQUN4QixXQUFPUyxHQUFQO0FBQ0Q7QUFDRCxTQUFPLFNBQVNzQixVQUFULEdBQThDLEtBQXpCaEMsT0FBeUIsdUVBQWYsRUFBZSxvQ0FBUlcsTUFBUSw2RUFBUkEsTUFBUTtBQUNuRCxRQUFJakUsSUFBSSxDQUFDc0QsT0FBTyxDQUFDaUMsT0FBVCxDQUFKLElBQXlCdkYsSUFBSSxDQUFDc0QsT0FBTyxDQUFDa0MsSUFBVCxDQUE3QixJQUErQ3hGLElBQUksQ0FBQ3NELE9BQU8sQ0FBQ21DLFFBQVQsQ0FBdkQsRUFBMkU7QUFDekUsYUFBTy9CLGtCQUFrQixDQUFDSCxJQUFELEVBQU9RLFNBQVMsTUFBVCxVQUFVUixJQUFWLEVBQWdCUyxHQUFoQixFQUFxQlYsT0FBckIsU0FBaUNXLE1BQWpDLEVBQVAsQ0FBekI7QUFDRDtBQUNELFdBQU9QLGtCQUFrQixDQUFDSCxJQUFELEVBQU9zQixhQUFhLENBQUMsSUFBSTNCLE9BQUosQ0FBWSxVQUFDQyxPQUFELEVBQVVpQixNQUFWLEVBQXFCO0FBQzdFTCxlQUFTLE1BQVQsVUFBVVIsSUFBVixFQUFnQlMsR0FBaEIsRUFBcUJsRSxNQUFNLENBQUM0RixNQUFQLENBQWMsRUFBZCxFQUFrQnBDLE9BQWxCLEVBQTJCO0FBQzlDaUMsZUFBTyxFQUFFcEMsT0FEcUM7QUFFOUNxQyxZQUFJLEVBQUVwQixNQUZ3QyxFQUEzQixDQUFyQjtBQUdPSCxZQUhQO0FBSUQsS0FMNkMsQ0FBRCxDQUFwQixDQUF6QjtBQU1ELEdBVkQ7QUFXRDs7QUFFRCxJQUFNMEIsR0FBRyxHQUFHLElBQVo7QUFDQSxJQUFNQyxpQkFBaUIsR0FBRyxHQUExQjtBQUNBLElBQUlDLEtBQUssR0FBRyxLQUFaO0FBQ0EsSUFBSUMsV0FBVyxHQUFHLENBQWxCO0FBQ0EsSUFBSUMsU0FBUyxHQUFHLENBQWhCOztBQUVBLFNBQVNDLGdCQUFULEdBQTZCOzs7OztBQUt2QjNILElBQUUsQ0FBQzRILGlCQUFILEVBTHVCLENBRXpCQyxRQUZ5Qix5QkFFekJBLFFBRnlCLENBR3pCQyxVQUh5Qix5QkFHekJBLFVBSHlCLENBSXpCQyxXQUp5Qix5QkFJekJBLFdBSnlCLEVBS0M7O0FBRTVCTixhQUFXLEdBQUdNLFdBQWQ7QUFDQUwsV0FBUyxHQUFHSSxVQUFaO0FBQ0FOLE9BQUssR0FBR0ssUUFBUSxLQUFLLEtBQXJCO0FBQ0Q7O0FBRUQsU0FBU0csTUFBVCxDQUFpQkMsTUFBakIsRUFBeUJDLGNBQXpCLEVBQXlDO0FBQ3ZDLE1BQUlULFdBQVcsS0FBSyxDQUFwQixFQUF1QjtBQUNyQkUsb0JBQWdCO0FBQ2pCOztBQUVETSxRQUFNLEdBQUdFLE1BQU0sQ0FBQ0YsTUFBRCxDQUFmO0FBQ0EsTUFBSUEsTUFBTSxLQUFLLENBQWYsRUFBa0I7QUFDaEIsV0FBTyxDQUFQO0FBQ0Q7QUFDRCxNQUFJbEosTUFBTSxHQUFJa0osTUFBTSxHQUFHVixpQkFBVixJQUFnQ1csY0FBYyxJQUFJVCxXQUFsRCxDQUFiO0FBQ0EsTUFBSTFJLE1BQU0sR0FBRyxDQUFiLEVBQWdCO0FBQ2RBLFVBQU0sR0FBRyxDQUFDQSxNQUFWO0FBQ0Q7QUFDREEsUUFBTSxHQUFHcUosSUFBSSxDQUFDQyxLQUFMLENBQVd0SixNQUFNLEdBQUd1SSxHQUFwQixDQUFUO0FBQ0EsTUFBSXZJLE1BQU0sS0FBSyxDQUFmLEVBQWtCO0FBQ2hCLFFBQUkySSxTQUFTLEtBQUssQ0FBZCxJQUFtQixDQUFDRixLQUF4QixFQUErQjtBQUM3QnpJLFlBQU0sR0FBRyxDQUFUO0FBQ0QsS0FGRCxNQUVPO0FBQ0xBLFlBQU0sR0FBRyxHQUFUO0FBQ0Q7QUFDRjtBQUNELFNBQU9rSixNQUFNLEdBQUcsQ0FBVCxHQUFhLENBQUNsSixNQUFkLEdBQXVCQSxNQUE5QjtBQUNEOztBQUVELFNBQVN1SixTQUFULEdBQXNCO0FBQ3BCO0FBQ0EsTUFBTUMsR0FBRyxHQUFHQyxNQUFNLENBQUM7QUFDakJDLGdCQUFZLEVBQUUsSUFERyxFQUFELENBQWxCOztBQUdBLE1BQUlGLEdBQUcsSUFBSUEsR0FBRyxDQUFDRyxHQUFmLEVBQW9CO0FBQ2xCLFdBQU9ILEdBQUcsQ0FBQ0csR0FBSixDQUFRQyxPQUFmO0FBQ0Q7QUFDRCxTQUFPM0ksRUFBRSxDQUFDNEgsaUJBQUgsR0FBdUJnQixRQUF2QixJQUFtQyxTQUExQztBQUNEOztBQUVELFNBQVNDLFNBQVQsQ0FBb0JDLE1BQXBCLEVBQTRCO0FBQzFCLE1BQU1QLEdBQUcsR0FBR0MsTUFBTSxFQUFsQjtBQUNBLE1BQUksQ0FBQ0QsR0FBTCxFQUFVO0FBQ1IsV0FBTyxLQUFQO0FBQ0Q7QUFDRCxNQUFNUSxTQUFTLEdBQUdSLEdBQUcsQ0FBQ0csR0FBSixDQUFRQyxPQUExQjtBQUNBLE1BQUlJLFNBQVMsS0FBS0QsTUFBbEIsRUFBMEI7QUFDeEJQLE9BQUcsQ0FBQ0csR0FBSixDQUFRQyxPQUFSLEdBQWtCRyxNQUFsQjtBQUNBRSwyQkFBdUIsQ0FBQzlFLE9BQXhCLENBQWdDLFVBQUN0QyxFQUFELFVBQVFBLEVBQUUsQ0FBQztBQUN6Q2tILGNBQU0sRUFBTkEsTUFEeUMsRUFBRCxDQUFWLEVBQWhDOztBQUdBLFdBQU8sSUFBUDtBQUNEO0FBQ0QsU0FBTyxLQUFQO0FBQ0Q7O0FBRUQsSUFBTUUsdUJBQXVCLEdBQUcsRUFBaEM7QUFDQSxTQUFTQyxjQUFULENBQXlCckgsRUFBekIsRUFBNkI7QUFDM0IsTUFBSW9ILHVCQUF1QixDQUFDN0osT0FBeEIsQ0FBZ0N5QyxFQUFoQyxNQUF3QyxDQUFDLENBQTdDLEVBQWdEO0FBQzlDb0gsMkJBQXVCLENBQUN2RixJQUF4QixDQUE2QjdCLEVBQTdCO0FBQ0Q7QUFDRjs7QUFFRCxJQUFJLE9BQU9zSCxNQUFQLEtBQWtCLFdBQXRCLEVBQW1DO0FBQ2pDQSxRQUFNLENBQUNaLFNBQVAsR0FBbUJBLFNBQW5CO0FBQ0Q7O0FBRUQsSUFBTWEsWUFBWSxHQUFHO0FBQ25CckQsb0JBQWtCLEVBQWxCQSxrQkFEbUIsRUFBckI7OztBQUlBLElBQUlzRCxPQUFPLEdBQUcsYUFBYTNILE1BQU0sQ0FBQzRILE1BQVAsQ0FBYztBQUN2Q0MsV0FBUyxFQUFFLElBRDRCO0FBRXZDdEIsUUFBTSxFQUFFQSxNQUYrQjtBQUd2Q00sV0FBUyxFQUFFQSxTQUg0QjtBQUl2Q08sV0FBUyxFQUFFQSxTQUo0QjtBQUt2Q0ksZ0JBQWMsRUFBRUEsY0FMdUI7QUFNdkM3RSxnQkFBYyxFQUFFQSxjQU51QjtBQU92Q0UsbUJBQWlCLEVBQUVBLGlCQVBvQjtBQVF2QzZFLGNBQVksRUFBRUEsWUFSeUIsRUFBZCxDQUEzQixDOzs7QUFXTUksWTtBQUNKLHdCQUFhQyxFQUFiLEVBQWlCQyxNQUFqQixFQUF5QjtBQUN2QixTQUFLRCxFQUFMLEdBQVVBLEVBQVY7QUFDQSxTQUFLRSxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixFQUFqQjtBQUNBLFFBQUlGLE1BQUosRUFBWTtBQUNWaEksWUFBTSxDQUFDd0MsSUFBUCxDQUFZd0YsTUFBWixFQUFvQnZGLE9BQXBCLENBQTRCLFVBQUFnQixJQUFJLEVBQUk7QUFDbEMsYUFBSSxDQUFDMEUsRUFBTCxDQUFRMUUsSUFBUixFQUFjdUUsTUFBTSxDQUFDdkUsSUFBRCxDQUFwQjtBQUNELE9BRkQ7QUFHRDtBQUNGLEc7O0FBRUsyRSxhLEVBQW9CLG9DQUFOQyxJQUFNLDZFQUFOQSxJQUFNO0FBQ3hCLFVBQU1DLEdBQUcsR0FBRyxLQUFLTCxRQUFMLENBQWNHLFNBQWQsQ0FBWjtBQUNBLFVBQUksQ0FBQ0UsR0FBTCxFQUFVO0FBQ1IsZUFBTyxDQUFDLEtBQUtKLFNBQUwsQ0FBZUUsU0FBZixNQUE4QixLQUFLRixTQUFMLENBQWVFLFNBQWYsSUFBNEIsRUFBMUQsQ0FBRCxFQUFnRXBHLElBQWhFLENBQXFFcUcsSUFBckUsQ0FBUDtBQUNEO0FBQ0RDLFNBQUcsQ0FBQzdGLE9BQUosQ0FBWSxVQUFBOEYsR0FBRyxFQUFJO0FBQ2pCQSxXQUFHLENBQUNwSSxFQUFKLENBQU9xSSxLQUFQLENBQWFELEdBQUcsQ0FBQ3BJLEVBQWpCLEVBQXFCa0ksSUFBckI7QUFDRCxPQUZEO0FBR0EsV0FBS0osUUFBTCxDQUFjRyxTQUFkLElBQTJCRSxHQUFHLENBQUNHLE1BQUosQ0FBVyxVQUFBRixHQUFHLFVBQUlBLEdBQUcsQ0FBQ0csSUFBSixLQUFhLE1BQWpCLEVBQWQsQ0FBM0I7QUFDRCxLOztBQUVHTixhLEVBQVdqSSxFLEVBQUk7QUFDakIsV0FBS3dJLFlBQUwsQ0FBa0JQLFNBQWxCLEVBQTZCLElBQTdCLEVBQW1DakksRUFBbkM7QUFDQSxXQUFLeUksV0FBTCxDQUFpQlIsU0FBakI7QUFDRCxLOztBQUVLQSxhLEVBQVdqSSxFLEVBQUk7QUFDbkIsV0FBS3dJLFlBQUwsQ0FBa0JQLFNBQWxCLEVBQTZCLE1BQTdCLEVBQXFDakksRUFBckM7QUFDQSxXQUFLeUksV0FBTCxDQUFpQlIsU0FBakI7QUFDRCxLOztBQUVJQSxhLEVBQVdqSSxFLEVBQUk7QUFDbEIsVUFBTW1JLEdBQUcsR0FBRyxLQUFLTCxRQUFMLENBQWNHLFNBQWQsQ0FBWjtBQUNBLFVBQUksQ0FBQ0UsR0FBTCxFQUFVO0FBQ1I7QUFDRDtBQUNELFVBQUluSSxFQUFKLEVBQVE7QUFDTixhQUFLLElBQUkxQyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHNkssR0FBRyxDQUFDbEwsTUFBeEIsR0FBaUM7QUFDL0IsY0FBSWtMLEdBQUcsQ0FBQzdLLENBQUQsQ0FBSCxDQUFPMEMsRUFBUCxLQUFjQSxFQUFsQixFQUFzQjtBQUNwQm1JLGVBQUcsQ0FBQ2xHLE1BQUosQ0FBVzNFLENBQVgsRUFBYyxDQUFkO0FBQ0FBLGFBQUM7QUFDRjtBQUNEQSxXQUFDO0FBQ0Y7QUFDRixPQVJELE1BUU87QUFDTCxlQUFPLEtBQUt3SyxRQUFMLENBQWNHLFNBQWQsQ0FBUDtBQUNEO0FBQ0YsSzs7QUFFWUEsYSxFQUFXO0FBQ3RCLFVBQU1TLFNBQVMsR0FBRyxLQUFLWCxTQUFMLENBQWVFLFNBQWYsQ0FBbEI7QUFDQSxVQUFJUyxTQUFKLEVBQWU7QUFDYixlQUFPQSxTQUFTLENBQUN6TCxNQUFWLEdBQW1CLENBQTFCLEdBQThCO0FBQzVCLGVBQUswTCxJQUFMLENBQVVOLEtBQVYsQ0FBZ0IsSUFBaEIsRUFBc0IsQ0FBQ0osU0FBRCxFQUFZekcsTUFBWixDQUFtQmtILFNBQVMsQ0FBQ0UsS0FBVixFQUFuQixDQUF0QjtBQUNEO0FBQ0Y7QUFDRixLOztBQUVhWCxhLEVBQVdNLEksRUFBTXZJLEUsRUFBSTtBQUNqQyxPQUFDLEtBQUs4SCxRQUFMLENBQWNHLFNBQWQsTUFBNkIsS0FBS0gsUUFBTCxDQUFjRyxTQUFkLElBQTJCLEVBQXhELENBQUQsRUFBOERwRyxJQUE5RCxDQUFtRTtBQUNqRTdCLFVBQUUsRUFBRkEsRUFEaUU7QUFFakV1SSxZQUFJLEVBQUpBLElBRmlFLEVBQW5FOztBQUlELEs7OztBQUdILElBQU1NLGFBQWEsR0FBRyxFQUF0Qjs7QUFFQSxJQUFNQyxpQkFBaUIsR0FBRyxFQUExQjs7QUFFQSxJQUFJbEIsRUFBRSxHQUFHLENBQVQ7O0FBRUEsU0FBU21CLGdCQUFULENBQTJCbEIsTUFBM0IsRUFBaUQsS0FBZHBILEtBQWMsdUVBQU4sSUFBTTtBQUMvQ21ILElBQUU7QUFDRixNQUFNb0IsWUFBWSxHQUFHLElBQUlyQixZQUFKLENBQWlCQyxFQUFqQixFQUFxQkMsTUFBckIsQ0FBckI7QUFDQSxNQUFJcEgsS0FBSixFQUFXO0FBQ1RvSSxpQkFBYSxDQUFDakIsRUFBRCxDQUFiLEdBQW9Cb0IsWUFBcEI7QUFDQUYscUJBQWlCLENBQUNqSCxJQUFsQixDQUF1Qm1ILFlBQXZCO0FBQ0Q7QUFDRCxTQUFPQSxZQUFQO0FBQ0Q7O0FBRUQsU0FBU0MsZUFBVCxDQUEwQnJCLEVBQTFCLEVBQThCO0FBQzVCLE1BQUlBLEVBQUosRUFBUTtBQUNOLFFBQU1vQixZQUFZLEdBQUdILGFBQWEsQ0FBQ2pCLEVBQUQsQ0FBbEM7QUFDQSxXQUFPaUIsYUFBYSxDQUFDakIsRUFBRCxDQUFwQjtBQUNBLFdBQU9vQixZQUFQO0FBQ0Q7QUFDRCxTQUFPRixpQkFBaUIsQ0FBQ0YsS0FBbEIsRUFBUDtBQUNEOztBQUVELElBQUlNLFVBQVUsR0FBRztBQUNmaEIsTUFEZSxnQkFDVGlCLFFBRFMsRUFDQ0MsTUFERCxFQUNTO0FBQ3RCLFFBQU14QixFQUFFLEdBQUdtQixnQkFBZ0IsQ0FBQ0ksUUFBUSxDQUFDdEIsTUFBVixDQUFoQixDQUFrQ0QsRUFBN0M7QUFDQSxRQUFJdUIsUUFBUSxDQUFDRSxHQUFiLEVBQWtCO0FBQ2hCRixjQUFRLENBQUNFLEdBQVQsR0FBZUYsUUFBUSxDQUFDRSxHQUFULElBQWdCRixRQUFRLENBQUNFLEdBQVQsQ0FBYTlMLE9BQWIsQ0FBcUIsR0FBckIsTUFBOEIsQ0FBQyxDQUEvQixHQUFtQyxHQUFuQyxHQUF5QyxHQUF6RCxJQUFnRSxTQUFoRSxHQUE0RXFLLEVBQTNGO0FBQ0Q7QUFDRixHQU5jO0FBT2ZsRSxhQVBlLHVCQU9GNEYsT0FQRSxFQU9PQyxLQVBQLEVBT2M7QUFDM0JELFdBQU8sQ0FBQ04sWUFBUixHQUF1QkMsZUFBZSxFQUF0QztBQUNELEdBVGMsRUFBakI7OztBQVlBLFNBQVNPLG1CQUFULENBQThCSCxHQUE5QixFQUFtQztBQUNqQyxNQUFNSSxLQUFLLEdBQUdDLGVBQWUsRUFBN0I7QUFDQSxNQUFJQyxHQUFHLEdBQUdGLEtBQUssQ0FBQ3hNLE1BQWhCO0FBQ0EsU0FBTzBNLEdBQUcsRUFBVixFQUFjO0FBQ1osUUFBTUMsSUFBSSxHQUFHSCxLQUFLLENBQUNFLEdBQUQsQ0FBbEI7QUFDQSxRQUFJQyxJQUFJLENBQUNDLEtBQUwsSUFBY0QsSUFBSSxDQUFDQyxLQUFMLENBQVdDLFFBQVgsS0FBd0JULEdBQTFDLEVBQStDO0FBQzdDLGFBQU9NLEdBQVA7QUFDRDtBQUNGO0FBQ0QsU0FBTyxDQUFDLENBQVI7QUFDRDs7QUFFRCxJQUFJSSxVQUFVLEdBQUc7QUFDZnpHLE1BRGUsZ0JBQ1Q2RixRQURTLEVBQ0M7QUFDZCxRQUFJQSxRQUFRLENBQUNhLE1BQVQsS0FBb0IsTUFBcEIsSUFBOEJiLFFBQVEsQ0FBQ2MsS0FBM0MsRUFBa0Q7QUFDaEQsYUFBTyxjQUFQO0FBQ0Q7QUFDRCxXQUFPLFlBQVA7QUFDRCxHQU5jO0FBT2YvQixNQVBlLGdCQU9UaUIsUUFQUyxFQU9DO0FBQ2QsUUFBSUEsUUFBUSxDQUFDYSxNQUFULEtBQW9CLE1BQXBCLElBQThCYixRQUFRLENBQUNFLEdBQTNDLEVBQWdEO0FBQzlDLFVBQU1hLGVBQWUsR0FBR1YsbUJBQW1CLENBQUNMLFFBQVEsQ0FBQ0UsR0FBVixDQUEzQztBQUNBLFVBQUlhLGVBQWUsS0FBSyxDQUFDLENBQXpCLEVBQTRCO0FBQzFCLFlBQU1ELEtBQUssR0FBR1AsZUFBZSxHQUFHek0sTUFBbEIsR0FBMkIsQ0FBM0IsR0FBK0JpTixlQUE3QztBQUNBLFlBQUlELEtBQUssR0FBRyxDQUFaLEVBQWU7QUFDYmQsa0JBQVEsQ0FBQ2MsS0FBVCxHQUFpQkEsS0FBakI7QUFDRDtBQUNGO0FBQ0Y7QUFDRixHQWpCYyxFQUFqQjs7O0FBb0JBLElBQUlFLFlBQVksR0FBRztBQUNqQmpDLE1BRGlCLGdCQUNYaUIsUUFEVyxFQUNEO0FBQ2QsUUFBSWlCLFlBQVksR0FBR0MsUUFBUSxDQUFDbEIsUUFBUSxDQUFDbUIsT0FBVixDQUEzQjtBQUNBLFFBQUlDLEtBQUssQ0FBQ0gsWUFBRCxDQUFULEVBQXlCO0FBQ3ZCO0FBQ0Q7QUFDRCxRQUFNSSxJQUFJLEdBQUdyQixRQUFRLENBQUNxQixJQUF0QjtBQUNBLFFBQUksQ0FBQy9JLEtBQUssQ0FBQ0MsT0FBTixDQUFjOEksSUFBZCxDQUFMLEVBQTBCO0FBQ3hCO0FBQ0Q7QUFDRCxRQUFNYixHQUFHLEdBQUdhLElBQUksQ0FBQ3ZOLE1BQWpCO0FBQ0EsUUFBSSxDQUFDME0sR0FBTCxFQUFVO0FBQ1I7QUFDRDtBQUNELFFBQUlTLFlBQVksR0FBRyxDQUFuQixFQUFzQjtBQUNwQkEsa0JBQVksR0FBRyxDQUFmO0FBQ0QsS0FGRCxNQUVPLElBQUlBLFlBQVksSUFBSVQsR0FBcEIsRUFBeUI7QUFDOUJTLGtCQUFZLEdBQUdULEdBQUcsR0FBRyxDQUFyQjtBQUNEO0FBQ0QsUUFBSVMsWUFBWSxHQUFHLENBQW5CLEVBQXNCO0FBQ3BCakIsY0FBUSxDQUFDbUIsT0FBVCxHQUFtQkUsSUFBSSxDQUFDSixZQUFELENBQXZCO0FBQ0FqQixjQUFRLENBQUNxQixJQUFULEdBQWdCQSxJQUFJLENBQUNsQyxNQUFMO0FBQ2QsZ0JBQUNtQyxJQUFELEVBQU96SSxLQUFQLFVBQWlCQSxLQUFLLEdBQUdvSSxZQUFSLEdBQXVCSyxJQUFJLEtBQUtELElBQUksQ0FBQ0osWUFBRCxDQUFwQyxHQUFxRCxJQUF0RSxFQURjLENBQWhCOztBQUdELEtBTEQsTUFLTztBQUNMakIsY0FBUSxDQUFDbUIsT0FBVCxHQUFtQkUsSUFBSSxDQUFDLENBQUQsQ0FBdkI7QUFDRDtBQUNELFdBQU87QUFDTEUsZUFBUyxFQUFFLEtBRE47QUFFTEMsVUFBSSxFQUFFLEtBRkQsRUFBUDs7QUFJRCxHQS9CZ0IsRUFBbkI7OztBQWtDQSxJQUFNQyxRQUFRLEdBQUcsZ0JBQWpCO0FBQ0EsSUFBSUMsUUFBSjtBQUNBLFNBQVNDLE9BQVQsQ0FBa0IzTixNQUFsQixFQUEwQjtBQUN4QjBOLFVBQVEsR0FBR0EsUUFBUSxJQUFJek0sRUFBRSxDQUFDQyxjQUFILENBQWtCdU0sUUFBbEIsQ0FBdkI7QUFDQSxNQUFJLENBQUNDLFFBQUwsRUFBZTtBQUNiQSxZQUFRLEdBQUduTCxJQUFJLENBQUNDLEdBQUwsS0FBYSxFQUFiLEdBQWtCNkcsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ3VFLE1BQUwsS0FBZ0IsR0FBM0IsQ0FBN0I7QUFDQTNNLE1BQUUsQ0FBQzRNLFVBQUgsQ0FBYztBQUNaMUssU0FBRyxFQUFFc0ssUUFETztBQUVaaEksVUFBSSxFQUFFaUksUUFGTSxFQUFkOztBQUlEO0FBQ0QxTixRQUFNLENBQUMwTixRQUFQLEdBQWtCQSxRQUFsQjtBQUNEOztBQUVELFNBQVNJLGlCQUFULENBQTRCOU4sTUFBNUIsRUFBb0M7QUFDbEMsTUFBSUEsTUFBTSxDQUFDK04sUUFBWCxFQUFxQjtBQUNuQixRQUFNQSxRQUFRLEdBQUcvTixNQUFNLENBQUMrTixRQUF4QjtBQUNBL04sVUFBTSxDQUFDZ08sY0FBUCxHQUF3QjtBQUN0QkMsU0FBRyxFQUFFRixRQUFRLENBQUNFLEdBRFE7QUFFdEJDLFVBQUksRUFBRUgsUUFBUSxDQUFDRyxJQUZPO0FBR3RCQyxXQUFLLEVBQUVuTyxNQUFNLENBQUNnSixXQUFQLEdBQXFCK0UsUUFBUSxDQUFDSSxLQUhmO0FBSXRCQyxZQUFNLEVBQUVwTyxNQUFNLENBQUNxTyxZQUFQLEdBQXNCTixRQUFRLENBQUNLLE1BSmpCLEVBQXhCOztBQU1EO0FBQ0Y7O0FBRUQsSUFBSUUsYUFBYSxHQUFHO0FBQ2xCL0gsYUFBVyxFQUFFLHFCQUFVdkcsTUFBVixFQUFrQjtBQUM3QjJOLFdBQU8sQ0FBQzNOLE1BQUQsQ0FBUDtBQUNBOE4scUJBQWlCLENBQUM5TixNQUFELENBQWpCO0FBQ0QsR0FKaUIsRUFBcEI7OztBQU9BLElBQU11TyxLQUFLLEdBQUcsYUFBZDtBQUNBLElBQU1DLEtBQUssR0FBRyxnQkFBZDs7QUFFQSxJQUFJQyxjQUFjLEdBQUc7QUFDbkJ0SSxNQUFJLEVBQUVsRixFQUFFLENBQUN5TixPQUFILENBQVdGLEtBQVgsSUFBb0JBLEtBQXBCLEdBQTRCRCxLQURmLEVBQXJCOzs7QUFJQTtBQUNBLElBQU1JLEtBQUssR0FBRztBQUNaLGFBRFk7QUFFWixlQUZZO0FBR1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQTdEWSxDQUFkOztBQWdFQTtBQUNBO0FBQ0EsSUFBTUMsUUFBUSxHQUFHO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF0QmUsQ0FBakI7O0FBeUJBO0FBQ0EsSUFBTUMsU0FBUyxHQUFHO0FBQ2hCQyxhQUFXLEVBQUU7QUFDWC9ELFFBQUksRUFBRTtBQUNKZ0UsY0FBUSxFQUFFLEtBRE4sRUFESyxFQURHOzs7QUFNaEJoRCxZQUFVLEVBQVZBLFVBTmdCO0FBT2hCYSxZQUFVLEVBQVZBLFVBUGdCO0FBUWhCSSxjQUFZLEVBQVpBLFlBUmdCO0FBU2hCc0IsZUFBYSxFQUFiQSxhQVRnQjtBQVVoQnpGLG1CQUFpQixFQUFFeUYsYUFWSDtBQVdoQkcsZ0JBQWMsRUFBZEEsY0FYZ0I7QUFZaEJPLGVBQWEsRUFBRTtBQUNiakUsUUFBSSxFQUFFO0FBQ0p6RixZQUFNLEVBQUUsS0FESixFQURPLEVBWkM7OztBQWlCaEIySixhQUFXLEVBQUU7QUFDWGxFLFFBQUksRUFBRTtBQUNKbUUsWUFBTSxFQUFFLEtBREosRUFESyxFQWpCRzs7O0FBc0JoQkMsVUFBUSxFQUFFO0FBQ1JwRSxRQUFJLEVBQUU7QUFDSnFFLG9CQUFjLEVBQUUsS0FEWjtBQUVKQyxjQUFRLEVBQUUsS0FGTixFQURFLEVBdEJNOzs7QUE0QmhCQyxvQkFBa0IsRUFBRTtBQUNsQnZFLFFBQUksRUFBRTtBQUNKd0UsY0FBUSxFQUFFLEtBRE4sRUFEWSxFQTVCSjs7O0FBaUNoQkMsV0FBUyxFQUFFO0FBQ1R6RSxRQUFJLEVBQUU7QUFDSjBFLFdBQUssRUFBRSxLQURIO0FBRUpDLFVBQUksRUFBRSxLQUZGLEVBREcsRUFqQ0s7OztBQXVDaEJDLGFBQVcsRUFBRTtBQUNYNUUsUUFBSSxFQUFFO0FBQ0oyRSxVQUFJLEVBQUUsS0FERixFQURLLEVBdkNHOzs7QUE0Q2hCRSxXQUFTLEVBQUU7QUFDVDdFLFFBQUksRUFBRTtBQUNKOEUsaUJBQVcsRUFBRSxLQURUO0FBRUpDLGtCQUFZLEVBQUUsS0FGVixFQURHLEVBNUNLOzs7QUFrRGhCQyxpQkFBZSxFQUFFO0FBQ2ZoRixRQUFJLEVBQUU7QUFDSmlGLGVBQVMsRUFBRSxLQURQLEVBRFMsRUFsREQ7OztBQXVEaEJDLE9BQUssRUFBRTtBQUNMbEYsUUFBSSxFQUFFO0FBQ0ptRixZQUFNLEVBQUUsS0FESjtBQUVKQyxhQUFPLEVBQUUsS0FGTCxFQURELEVBdkRTOzs7QUE2RGhCQyxhQUFXLEVBQUU7QUFDWHJGLFFBQUksRUFBRTtBQUNKc0YsVUFBSSxFQUFFLEtBREY7QUFFSkYsYUFBTyxFQUFFLEtBRkwsRUFESyxFQTdERzs7O0FBbUVoQkcsZ0JBQWMsRUFBRTtBQUNkbkssUUFBSSxFQUFFbEYsRUFBRSxDQUFDc1AsR0FBSCxHQUFTLEtBQVQsR0FBaUIsZ0JBRFQ7QUFFZHhGLFFBQUksRUFBRTtBQUNKeUYsZUFBUyxFQUFFdlAsRUFBRSxDQUFDc1AsR0FBSCxHQUFTLFdBQVQsR0FBdUIsTUFEOUIsRUFGUSxFQW5FQTs7O0FBeUVoQkUsYUFBVyxFQUFFO0FBQ1gxRixRQUFJLEVBQUU7QUFDSjJGLHFCQUFlLEVBQUUsS0FEYixFQURLLEVBekVHLEVBQWxCOzs7OztBQWdGQSxJQUFNQyxTQUFTLEdBQUcsQ0FBQyxTQUFELEVBQVksTUFBWixFQUFvQixRQUFwQixFQUE4QixVQUE5QixDQUFsQjs7QUFFQSxTQUFTQyxlQUFULENBQTBCQyxVQUExQixFQUFzQ3ZMLE1BQXRDLEVBQThDaUIsV0FBOUMsRUFBMkQ7QUFDekQsU0FBTyxVQUFVbkMsR0FBVixFQUFlO0FBQ3BCLFdBQU9rQixNQUFNLENBQUN3TCxrQkFBa0IsQ0FBQ0QsVUFBRCxFQUFhek0sR0FBYixFQUFrQm1DLFdBQWxCLENBQW5CLENBQWI7QUFDRCxHQUZEO0FBR0Q7O0FBRUQsU0FBU3dLLFdBQVQsQ0FBc0JGLFVBQXRCLEVBQWtDN0UsUUFBbEMsRUFBcUcsS0FBekRnRixVQUF5RCx1RUFBNUMsRUFBNEMsS0FBeEN6SyxXQUF3Qyx1RUFBMUIsRUFBMEIsS0FBdEIwSyxZQUFzQix1RUFBUCxLQUFPO0FBQ25HLE1BQUlsTyxhQUFhLENBQUNpSixRQUFELENBQWpCLEVBQTZCLENBQUU7QUFDN0IsUUFBTUMsTUFBTSxHQUFHZ0YsWUFBWSxLQUFLLElBQWpCLEdBQXdCakYsUUFBeEIsR0FBbUMsRUFBbEQsQ0FEMkIsQ0FDMkI7QUFDdEQsUUFBSXBKLElBQUksQ0FBQ29PLFVBQUQsQ0FBUixFQUFzQjtBQUNwQkEsZ0JBQVUsR0FBR0EsVUFBVSxDQUFDaEYsUUFBRCxFQUFXQyxNQUFYLENBQVYsSUFBZ0MsRUFBN0M7QUFDRDtBQUNELFNBQUssSUFBTTlJLEdBQVgsSUFBa0I2SSxRQUFsQixFQUE0QjtBQUMxQixVQUFJOUksTUFBTSxDQUFDOE4sVUFBRCxFQUFhN04sR0FBYixDQUFWLEVBQTZCO0FBQzNCLFlBQUkrTixTQUFTLEdBQUdGLFVBQVUsQ0FBQzdOLEdBQUQsQ0FBMUI7QUFDQSxZQUFJUCxJQUFJLENBQUNzTyxTQUFELENBQVIsRUFBcUI7QUFDbkJBLG1CQUFTLEdBQUdBLFNBQVMsQ0FBQ2xGLFFBQVEsQ0FBQzdJLEdBQUQsQ0FBVCxFQUFnQjZJLFFBQWhCLEVBQTBCQyxNQUExQixDQUFyQjtBQUNEO0FBQ0QsWUFBSSxDQUFDaUYsU0FBTCxFQUFnQixDQUFFO0FBQ2hCQyxpQkFBTyxDQUFDQyxJQUFSLGdCQUFxQlAsVUFBckIsNEZBQXdGMU4sR0FBeEY7QUFDRCxTQUZELE1BRU8sSUFBSUwsS0FBSyxDQUFDb08sU0FBRCxDQUFULEVBQXNCLENBQUU7QUFDN0JqRixnQkFBTSxDQUFDaUYsU0FBRCxDQUFOLEdBQW9CbEYsUUFBUSxDQUFDN0ksR0FBRCxDQUE1QjtBQUNELFNBRk0sTUFFQSxJQUFJSixhQUFhLENBQUNtTyxTQUFELENBQWpCLEVBQThCLENBQUU7QUFDckNqRixnQkFBTSxDQUFDaUYsU0FBUyxDQUFDL0ssSUFBVixHQUFpQitLLFNBQVMsQ0FBQy9LLElBQTNCLEdBQWtDaEQsR0FBbkMsQ0FBTixHQUFnRCtOLFNBQVMsQ0FBQ25KLEtBQTFEO0FBQ0Q7QUFDRixPQVpELE1BWU8sSUFBSTRJLFNBQVMsQ0FBQ3ZRLE9BQVYsQ0FBa0IrQyxHQUFsQixNQUEyQixDQUFDLENBQWhDLEVBQW1DO0FBQ3hDLFlBQUlQLElBQUksQ0FBQ29KLFFBQVEsQ0FBQzdJLEdBQUQsQ0FBVCxDQUFSLEVBQXlCO0FBQ3ZCOEksZ0JBQU0sQ0FBQzlJLEdBQUQsQ0FBTixHQUFjeU4sZUFBZSxDQUFDQyxVQUFELEVBQWE3RSxRQUFRLENBQUM3SSxHQUFELENBQXJCLEVBQTRCb0QsV0FBNUIsQ0FBN0I7QUFDRDtBQUNGLE9BSk0sTUFJQTtBQUNMLFlBQUksQ0FBQzBLLFlBQUwsRUFBbUI7QUFDakJoRixnQkFBTSxDQUFDOUksR0FBRCxDQUFOLEdBQWM2SSxRQUFRLENBQUM3SSxHQUFELENBQXRCO0FBQ0Q7QUFDRjtBQUNGO0FBQ0QsV0FBTzhJLE1BQVA7QUFDRCxHQTdCRCxNQTZCTyxJQUFJckosSUFBSSxDQUFDb0osUUFBRCxDQUFSLEVBQW9CO0FBQ3pCQSxZQUFRLEdBQUc0RSxlQUFlLENBQUNDLFVBQUQsRUFBYTdFLFFBQWIsRUFBdUJ6RixXQUF2QixDQUExQjtBQUNEO0FBQ0QsU0FBT3lGLFFBQVA7QUFDRDs7QUFFRCxTQUFTOEUsa0JBQVQsQ0FBNkJELFVBQTdCLEVBQXlDek0sR0FBekMsRUFBOENtQyxXQUE5QyxFQUFvRixLQUF6QjhLLGVBQXlCLHVFQUFQLEtBQU87QUFDbEYsTUFBSXpPLElBQUksQ0FBQ2lNLFNBQVMsQ0FBQ3RJLFdBQVgsQ0FBUixFQUFpQyxDQUFFO0FBQ2pDbkMsT0FBRyxHQUFHeUssU0FBUyxDQUFDdEksV0FBVixDQUFzQnNLLFVBQXRCLEVBQWtDek0sR0FBbEMsQ0FBTjtBQUNEO0FBQ0QsU0FBTzJNLFdBQVcsQ0FBQ0YsVUFBRCxFQUFhek0sR0FBYixFQUFrQm1DLFdBQWxCLEVBQStCLEVBQS9CLEVBQW1DOEssZUFBbkMsQ0FBbEI7QUFDRDs7QUFFRCxTQUFTQyxPQUFULENBQWtCVCxVQUFsQixFQUE4QnZMLE1BQTlCLEVBQXNDO0FBQ3BDLE1BQUlwQyxNQUFNLENBQUMyTCxTQUFELEVBQVlnQyxVQUFaLENBQVYsRUFBbUM7QUFDakMsUUFBTVUsUUFBUSxHQUFHMUMsU0FBUyxDQUFDZ0MsVUFBRCxDQUExQjtBQUNBLFFBQUksQ0FBQ1UsUUFBTCxFQUFlLENBQUU7QUFDZixhQUFPLFlBQVk7QUFDakJKLGVBQU8sQ0FBQ3hQLEtBQVIsdUVBQW9Ea1AsVUFBcEQ7QUFDRCxPQUZEO0FBR0Q7QUFDRCxXQUFPLFVBQVVXLElBQVYsRUFBZ0JDLElBQWhCLEVBQXNCLENBQUU7QUFDN0IsVUFBSXZMLE9BQU8sR0FBR3FMLFFBQWQ7QUFDQSxVQUFJM08sSUFBSSxDQUFDMk8sUUFBRCxDQUFSLEVBQW9CO0FBQ2xCckwsZUFBTyxHQUFHcUwsUUFBUSxDQUFDQyxJQUFELENBQWxCO0FBQ0Q7O0FBRURBLFVBQUksR0FBR1QsV0FBVyxDQUFDRixVQUFELEVBQWFXLElBQWIsRUFBbUJ0TCxPQUFPLENBQUM2RSxJQUEzQixFQUFpQzdFLE9BQU8sQ0FBQ0ssV0FBekMsQ0FBbEI7O0FBRUEsVUFBTXdFLElBQUksR0FBRyxDQUFDeUcsSUFBRCxDQUFiO0FBQ0EsVUFBSSxPQUFPQyxJQUFQLEtBQWdCLFdBQXBCLEVBQWlDO0FBQy9CMUcsWUFBSSxDQUFDckcsSUFBTCxDQUFVK00sSUFBVjtBQUNEO0FBQ0QsVUFBSTdPLElBQUksQ0FBQ3NELE9BQU8sQ0FBQ0MsSUFBVCxDQUFSLEVBQXdCO0FBQ3RCMEssa0JBQVUsR0FBRzNLLE9BQU8sQ0FBQ0MsSUFBUixDQUFhcUwsSUFBYixDQUFiO0FBQ0QsT0FGRCxNQUVPLElBQUkxTyxLQUFLLENBQUNvRCxPQUFPLENBQUNDLElBQVQsQ0FBVCxFQUF5QjtBQUM5QjBLLGtCQUFVLEdBQUczSyxPQUFPLENBQUNDLElBQXJCO0FBQ0Q7QUFDRCxVQUFNSSxXQUFXLEdBQUd0RixFQUFFLENBQUM0UCxVQUFELENBQUYsQ0FBZTNGLEtBQWYsQ0FBcUJqSyxFQUFyQixFQUF5QjhKLElBQXpCLENBQXBCO0FBQ0EsVUFBSXhELFNBQVMsQ0FBQ3NKLFVBQUQsQ0FBYixFQUEyQixDQUFFO0FBQzNCLGVBQU9DLGtCQUFrQixDQUFDRCxVQUFELEVBQWF0SyxXQUFiLEVBQTBCTCxPQUFPLENBQUNLLFdBQWxDLEVBQStDZSxZQUFZLENBQUN1SixVQUFELENBQTNELENBQXpCO0FBQ0Q7QUFDRCxhQUFPdEssV0FBUDtBQUNELEtBdEJEO0FBdUJEO0FBQ0QsU0FBT2pCLE1BQVA7QUFDRDs7QUFFRCxJQUFNb00sUUFBUSxHQUFHaFAsTUFBTSxDQUFDYSxNQUFQLENBQWMsSUFBZCxDQUFqQjs7QUFFQSxJQUFNb08sS0FBSyxHQUFHO0FBQ1osc0JBRFk7QUFFWixlQUZZO0FBR1osaUJBSFk7QUFJWixRQUpZO0FBS1osU0FMWTtBQU1aLE9BTlksQ0FBZDs7O0FBU0EsU0FBU0MsYUFBVCxDQUF3QnpMLElBQXhCLEVBQThCO0FBQzVCLFNBQU8sU0FBUzBMLE9BQVQ7OztBQUdKLE9BRkR6SixJQUVDLFFBRkRBLElBRUMsQ0FEREMsUUFDQyxRQUREQSxRQUNDO0FBQ0QsUUFBTWpFLEdBQUcsR0FBRztBQUNWME4sWUFBTSxZQUFLM0wsSUFBTCwyQkFBMEJBLElBQTFCLG9CQURJLEVBQVo7O0FBR0F2RCxRQUFJLENBQUN3RixJQUFELENBQUosSUFBY0EsSUFBSSxDQUFDaEUsR0FBRCxDQUFsQjtBQUNBeEIsUUFBSSxDQUFDeUYsUUFBRCxDQUFKLElBQWtCQSxRQUFRLENBQUNqRSxHQUFELENBQTFCO0FBQ0QsR0FURDtBQVVEOztBQUVEdU4sS0FBSyxDQUFDeE0sT0FBTixDQUFjLFVBQVVnQixJQUFWLEVBQWdCO0FBQzVCdUwsVUFBUSxDQUFDdkwsSUFBRCxDQUFSLEdBQWlCeUwsYUFBYSxDQUFDekwsSUFBRCxDQUE5QjtBQUNELENBRkQ7O0FBSUEsSUFBSTRMLFNBQVMsR0FBRztBQUNkQyxPQUFLLEVBQUUsQ0FBQyxTQUFELENBRE87QUFFZEMsT0FBSyxFQUFFLENBQUMsU0FBRCxDQUZPO0FBR2RDLFNBQU8sRUFBRSxDQUFDLFNBQUQsQ0FISztBQUlkeE4sTUFBSSxFQUFFLENBQUMsU0FBRCxDQUpRLEVBQWhCOzs7QUFPQSxTQUFTeU4sV0FBVDs7Ozs7QUFLRyxLQUpEQyxPQUlDLFNBSkRBLE9BSUMsQ0FIRGpLLE9BR0MsU0FIREEsT0FHQyxDQUZEQyxJQUVDLFNBRkRBLElBRUMsQ0FEREMsUUFDQyxTQUREQSxRQUNDO0FBQ0QsTUFBSWpFLEdBQUcsR0FBRyxLQUFWO0FBQ0EsTUFBSTJOLFNBQVMsQ0FBQ0ssT0FBRCxDQUFiLEVBQXdCO0FBQ3RCaE8sT0FBRyxHQUFHO0FBQ0owTixZQUFNLEVBQUUsZ0JBREo7QUFFSk0sYUFBTyxFQUFQQSxPQUZJO0FBR0pDLGNBQVEsRUFBRU4sU0FBUyxDQUFDSyxPQUFELENBSGYsRUFBTjs7QUFLQXhQLFFBQUksQ0FBQ3VGLE9BQUQsQ0FBSixJQUFpQkEsT0FBTyxDQUFDL0QsR0FBRCxDQUF4QjtBQUNELEdBUEQsTUFPTztBQUNMQSxPQUFHLEdBQUc7QUFDSjBOLFlBQU0sRUFBRSxvQ0FESixFQUFOOztBQUdBbFAsUUFBSSxDQUFDd0YsSUFBRCxDQUFKLElBQWNBLElBQUksQ0FBQ2hFLEdBQUQsQ0FBbEI7QUFDRDtBQUNEeEIsTUFBSSxDQUFDeUYsUUFBRCxDQUFKLElBQWtCQSxRQUFRLENBQUNqRSxHQUFELENBQTFCO0FBQ0Q7O0FBRUQsSUFBSWtPLFFBQVEsR0FBRyxhQUFhNVAsTUFBTSxDQUFDNEgsTUFBUCxDQUFjO0FBQ3hDQyxXQUFTLEVBQUUsSUFENkI7QUFFeEM0SCxhQUFXLEVBQUVBLFdBRjJCLEVBQWQsQ0FBNUI7OztBQUtBLElBQU1JLFVBQVUsR0FBSSxZQUFZO0FBQzlCLE1BQUlDLE9BQUo7QUFDQSxTQUFPLFNBQVNDLGFBQVQsR0FBMEI7QUFDL0IsUUFBSSxDQUFDRCxPQUFMLEVBQWM7QUFDWkEsYUFBTyxHQUFHLElBQUl4USxZQUFKLEVBQVY7QUFDRDtBQUNELFdBQU93USxPQUFQO0FBQ0QsR0FMRDtBQU1ELENBUmtCLEVBQW5COztBQVVBLFNBQVN0SCxLQUFULENBQWdCd0gsR0FBaEIsRUFBcUJwTixNQUFyQixFQUE2QnlGLElBQTdCLEVBQW1DO0FBQ2pDLFNBQU8ySCxHQUFHLENBQUNwTixNQUFELENBQUgsQ0FBWTRGLEtBQVosQ0FBa0J3SCxHQUFsQixFQUF1QjNILElBQXZCLENBQVA7QUFDRDs7QUFFRCxTQUFTNEgsR0FBVCxHQUFnQjtBQUNkLFNBQU96SCxLQUFLLENBQUNxSCxVQUFVLEVBQVgsRUFBZSxLQUFmLDZCQUEwQkssU0FBMUIsRUFBWjtBQUNEO0FBQ0QsU0FBU0MsSUFBVCxHQUFpQjtBQUNmLFNBQU8zSCxLQUFLLENBQUNxSCxVQUFVLEVBQVgsRUFBZSxNQUFmLDZCQUEyQkssU0FBM0IsRUFBWjtBQUNEO0FBQ0QsU0FBU0UsS0FBVCxHQUFrQjtBQUNoQixTQUFPNUgsS0FBSyxDQUFDcUgsVUFBVSxFQUFYLEVBQWUsT0FBZiw2QkFBNEJLLFNBQTVCLEVBQVo7QUFDRDtBQUNELFNBQVNHLEtBQVQsR0FBa0I7QUFDaEIsU0FBTzdILEtBQUssQ0FBQ3FILFVBQVUsRUFBWCxFQUFlLE9BQWYsNkJBQTRCSyxTQUE1QixFQUFaO0FBQ0Q7O0FBRUQsSUFBSUksUUFBUSxHQUFHLGFBQWF0USxNQUFNLENBQUM0SCxNQUFQLENBQWM7QUFDeENDLFdBQVMsRUFBRSxJQUQ2QjtBQUV4Q29JLEtBQUcsRUFBRUEsR0FGbUM7QUFHeENFLE1BQUksRUFBRUEsSUFIa0M7QUFJeENDLE9BQUssRUFBRUEsS0FKaUM7QUFLeENDLE9BQUssRUFBRUEsS0FMaUMsRUFBZCxDQUE1Qjs7O0FBUUEsU0FBU0Usd0JBQVQsR0FBcUM7QUFDbkMsTUFBTUMsa0JBQWtCLEdBQUcsRUFBM0IsQ0FEbUM7Ozs7QUFLL0JqUyxJQUFFLENBQUM0SCxpQkFBSCxFQUwrQixDQUdqQ0csV0FIaUMsMEJBR2pDQSxXQUhpQyxDQUlqQ3FGLFlBSmlDLDBCQUlqQ0EsWUFKaUM7O0FBT25DLE1BQU04RSxXQUFXLEdBQUduSyxXQUFXLEdBQUdxRixZQUFkLEdBQTZCLFVBQTdCLEdBQTBDLFdBQTlEOztBQUVBNkUsb0JBQWtCLENBQUNFLE9BQW5CLEdBQTZCLFVBQUNsTixPQUFELEVBQVVGLFFBQVYsRUFBdUI7QUFDbEQsUUFBSXFOLE9BQU8sR0FBRyxJQUFkO0FBQ0EsU0FBSyxJQUFNL0YsSUFBWCxJQUFtQnBILE9BQW5CLEVBQTRCO0FBQzFCLFVBQU1vTixTQUFTLEdBQUdoRyxJQUFJLEtBQUssYUFBVCxHQUF5QnBILE9BQU8sQ0FBQ29ILElBQUQsQ0FBaEMsR0FBeUNsRSxNQUFNLENBQUNsRCxPQUFPLENBQUNvSCxJQUFELENBQVIsQ0FBakU7QUFDQSxVQUFJcEgsT0FBTyxDQUFDb0gsSUFBRCxDQUFQLEtBQWtCLEVBQXRCLEVBQTBCO0FBQ3hCLFlBQUlBLElBQUksS0FBSyxPQUFiLEVBQXNCO0FBQ3BCLGNBQUlnRyxTQUFTLEtBQUt0SyxXQUFsQixFQUErQjtBQUM3QnFLLG1CQUFPLEdBQUcsSUFBVjtBQUNELFdBRkQsTUFFTztBQUNMQSxtQkFBTyxHQUFHLEtBQVY7QUFDQXJOLG9CQUFRLENBQUNxTixPQUFELENBQVI7QUFDQSxtQkFBT0EsT0FBUDtBQUNEO0FBQ0Y7QUFDRCxZQUFJL0YsSUFBSSxLQUFLLFVBQWIsRUFBeUI7QUFDdkIsY0FBSXRFLFdBQVcsSUFBSXNLLFNBQW5CLEVBQThCO0FBQzVCRCxtQkFBTyxHQUFHLElBQVY7QUFDRCxXQUZELE1BRU87QUFDTEEsbUJBQU8sR0FBRyxLQUFWO0FBQ0FyTixvQkFBUSxDQUFDcU4sT0FBRCxDQUFSO0FBQ0EsbUJBQU9BLE9BQVA7QUFDRDtBQUNGO0FBQ0QsWUFBSS9GLElBQUksS0FBSyxVQUFiLEVBQXlCO0FBQ3ZCLGNBQUl0RSxXQUFXLElBQUlzSyxTQUFuQixFQUE4QjtBQUM1QkQsbUJBQU8sR0FBRyxJQUFWO0FBQ0QsV0FGRCxNQUVPO0FBQ0xBLG1CQUFPLEdBQUcsS0FBVjtBQUNBck4sb0JBQVEsQ0FBQ3FOLE9BQUQsQ0FBUjtBQUNBLG1CQUFPQSxPQUFQO0FBQ0Q7QUFDRjs7QUFFRCxZQUFJL0YsSUFBSSxLQUFLLFFBQWIsRUFBdUI7QUFDckIsY0FBSWdHLFNBQVMsS0FBS2pGLFlBQWxCLEVBQWdDO0FBQzlCZ0YsbUJBQU8sR0FBRyxJQUFWO0FBQ0QsV0FGRCxNQUVPO0FBQ0xBLG1CQUFPLEdBQUcsS0FBVjtBQUNBck4sb0JBQVEsQ0FBQ3FOLE9BQUQsQ0FBUjtBQUNBLG1CQUFPQSxPQUFQO0FBQ0Q7QUFDRjtBQUNELFlBQUkvRixJQUFJLEtBQUssV0FBYixFQUEwQjtBQUN4QixjQUFJZSxZQUFZLElBQUlpRixTQUFwQixFQUErQjtBQUM3QkQsbUJBQU8sR0FBRyxJQUFWO0FBQ0QsV0FGRCxNQUVPO0FBQ0xBLG1CQUFPLEdBQUcsS0FBVjtBQUNBck4sb0JBQVEsQ0FBQ3FOLE9BQUQsQ0FBUjtBQUNBLG1CQUFPQSxPQUFQO0FBQ0Q7QUFDRjtBQUNELFlBQUkvRixJQUFJLEtBQUssV0FBYixFQUEwQjtBQUN4QixjQUFJZSxZQUFZLElBQUlpRixTQUFwQixFQUErQjtBQUM3QkQsbUJBQU8sR0FBRyxJQUFWO0FBQ0QsV0FGRCxNQUVPO0FBQ0xBLG1CQUFPLEdBQUcsS0FBVjtBQUNBck4sb0JBQVEsQ0FBQ3FOLE9BQUQsQ0FBUjtBQUNBLG1CQUFPQSxPQUFQO0FBQ0Q7QUFDRjs7QUFFRCxZQUFJL0YsSUFBSSxLQUFLLGFBQWIsRUFBNEI7QUFDMUIsY0FBSXBILE9BQU8sQ0FBQ29ILElBQUQsQ0FBUCxLQUFrQjZGLFdBQXRCLEVBQW1DO0FBQ2pDRSxtQkFBTyxHQUFHLElBQVY7QUFDRCxXQUZELE1BRU87QUFDTEEsbUJBQU8sR0FBRyxLQUFWO0FBQ0FyTixvQkFBUSxDQUFDcU4sT0FBRCxDQUFSO0FBQ0EsbUJBQU9BLE9BQVA7QUFDRDtBQUNGO0FBQ0Y7QUFDRjtBQUNEck4sWUFBUSxDQUFDcU4sT0FBRCxDQUFSOztBQUVBLFdBQU9BLE9BQVA7QUFDRCxHQTNFRDs7QUE2RUFILG9CQUFrQixDQUFDSyxVQUFuQixHQUFnQyxZQUFNO0FBQ3JDLEdBREQ7O0FBR0EsU0FBT0wsa0JBQVA7QUFDRDs7QUFFRCxJQUFJdE0sR0FBRyxHQUFHLGFBQWFsRSxNQUFNLENBQUM0SCxNQUFQLENBQWM7QUFDbkNDLFdBQVMsRUFBRSxJQUR3QjtBQUVuQzBJLDBCQUF3QixFQUFFQSx3QkFGUyxFQUFkLENBQXZCOzs7QUFLQSxJQUFNTyxNQUFNLEdBQUdDLElBQWY7QUFDQSxJQUFNQyxXQUFXLEdBQUdDLFNBQXBCOztBQUVBLElBQU1DLFdBQVcsR0FBRyxJQUFwQjs7QUFFQSxJQUFNQyxTQUFTLEdBQUd4USxNQUFNLENBQUMsVUFBQzdELEdBQUQsRUFBUztBQUNoQyxTQUFPbUUsUUFBUSxDQUFDbkUsR0FBRyxDQUFDRSxPQUFKLENBQVlrVSxXQUFaLEVBQXlCLEdBQXpCLENBQUQsQ0FBZjtBQUNELENBRnVCLENBQXhCOztBQUlBLFNBQVNFLGdCQUFULENBQTJCQyxVQUEzQixFQUF1QztBQUNyQyxNQUFNQyxlQUFlLEdBQUdELFVBQVUsQ0FBQ0UsWUFBbkM7QUFDQSxNQUFNQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWtCLENBQVVDLEtBQVYsRUFBMEIsb0NBQU5wSixJQUFNLDZFQUFOQSxJQUFNO0FBQ2hELFdBQU9pSixlQUFlLENBQUM5SSxLQUFoQixDQUFzQjZJLFVBQXRCLEdBQW1DRixTQUFTLENBQUNNLEtBQUQsQ0FBNUMsU0FBd0RwSixJQUF4RCxFQUFQO0FBQ0QsR0FGRDtBQUdBLE1BQUk7QUFDRjtBQUNBZ0osY0FBVSxDQUFDRSxZQUFYLEdBQTBCQyxlQUExQjtBQUNELEdBSEQsQ0FHRSxPQUFPdlMsS0FBUCxFQUFjO0FBQ2RvUyxjQUFVLENBQUNLLGFBQVgsR0FBMkJGLGVBQTNCO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTRyxRQUFULENBQW1CbE8sSUFBbkIsRUFBeUJELE9BQXpCLEVBQWtDb08sV0FBbEMsRUFBK0M7QUFDN0M7QUFDRTtBQUNBQSxlQUFXLElBQUlwTyxPQUFPLENBQUNxTyxTQUF2QixJQUFvQ3JPLE9BQU8sQ0FBQ3FPLFNBQVIsQ0FBa0JwTyxJQUFsQixDQUFwQyxLQUFnRUQsT0FBTyxHQUFHQSxPQUFPLENBQUNxTyxTQUFsRjtBQUNEO0FBQ0QsTUFBTUMsT0FBTyxHQUFHdE8sT0FBTyxDQUFDQyxJQUFELENBQXZCO0FBQ0EsTUFBSSxDQUFDcU8sT0FBTCxFQUFjO0FBQ1p0TyxXQUFPLENBQUNDLElBQUQsQ0FBUCxHQUFnQixZQUFZO0FBQzFCMk4sc0JBQWdCLENBQUMsSUFBRCxDQUFoQjtBQUNELEtBRkQ7QUFHRCxHQUpELE1BSU87QUFDTDVOLFdBQU8sQ0FBQ0MsSUFBRCxDQUFQLEdBQWdCLFlBQW1CO0FBQ2pDMk4sc0JBQWdCLENBQUMsSUFBRCxDQUFoQixDQURpQyxtQ0FBTi9JLElBQU0seURBQU5BLElBQU07QUFFakMsYUFBT3lKLE9BQU8sQ0FBQ3RKLEtBQVIsQ0FBYyxJQUFkLEVBQW9CSCxJQUFwQixDQUFQO0FBQ0QsS0FIRDtBQUlEO0FBQ0Y7QUFDRCxJQUFJLENBQUN5SSxNQUFNLENBQUNpQixZQUFaLEVBQTBCO0FBQ3hCakIsUUFBTSxDQUFDaUIsWUFBUCxHQUFzQixJQUF0QjtBQUNBaEIsTUFBSSxHQUFHLGdCQUF3QixLQUFkdk4sT0FBYyx1RUFBSixFQUFJO0FBQzdCbU8sWUFBUSxDQUFDLFFBQUQsRUFBV25PLE9BQVgsQ0FBUjtBQUNBLFdBQU9zTixNQUFNLENBQUN0TixPQUFELENBQWI7QUFDRCxHQUhEO0FBSUF1TixNQUFJLENBQUNpQixLQUFMLEdBQWFsQixNQUFNLENBQUNrQixLQUFwQjs7QUFFQWYsV0FBUyxHQUFHLHFCQUF3QixLQUFkek4sT0FBYyx1RUFBSixFQUFJO0FBQ2xDbU8sWUFBUSxDQUFDLFNBQUQsRUFBWW5PLE9BQVosRUFBcUIsSUFBckIsQ0FBUjtBQUNBLFdBQU93TixXQUFXLENBQUN4TixPQUFELENBQWxCO0FBQ0QsR0FIRDtBQUlEOztBQUVELElBQU15TyxnQkFBZ0IsR0FBRztBQUN2QixtQkFEdUI7QUFFdkIsZUFGdUI7QUFHdkIsa0JBSHVCO0FBSXZCLGlCQUp1QjtBQUt2QixtQkFMdUI7QUFNdkIsY0FOdUI7QUFPdkIsVUFQdUI7QUFRdkIsY0FSdUIsQ0FBekI7OztBQVdBLFNBQVNDLFNBQVQsQ0FBb0JDLEVBQXBCLEVBQXdCQyxLQUF4QixFQUErQjtBQUM3QixNQUFNZixVQUFVLEdBQUdjLEVBQUUsQ0FBQ0UsR0FBSCxDQUFPRixFQUFFLENBQUNHLE1BQVYsQ0FBbkI7QUFDQUYsT0FBSyxDQUFDM1AsT0FBTixDQUFjLFVBQUE4UCxJQUFJLEVBQUk7QUFDcEIsUUFBSS9SLE1BQU0sQ0FBQzZRLFVBQUQsRUFBYWtCLElBQWIsQ0FBVixFQUE4QjtBQUM1QkosUUFBRSxDQUFDSSxJQUFELENBQUYsR0FBV2xCLFVBQVUsQ0FBQ2tCLElBQUQsQ0FBckI7QUFDRDtBQUNGLEdBSkQ7QUFLRDs7QUFFRCxTQUFTQyxPQUFULENBQWtCdFEsSUFBbEIsRUFBd0J1USxVQUF4QixFQUFvQztBQUNsQyxNQUFJLENBQUNBLFVBQUwsRUFBaUI7QUFDZixXQUFPLElBQVA7QUFDRDs7QUFFRCxNQUFJblQsYUFBSWtFLE9BQUosSUFBZTVCLEtBQUssQ0FBQ0MsT0FBTixDQUFjdkMsYUFBSWtFLE9BQUosQ0FBWXRCLElBQVosQ0FBZCxDQUFuQixFQUFxRDtBQUNuRCxXQUFPLElBQVA7QUFDRDs7QUFFRHVRLFlBQVUsR0FBR0EsVUFBVSxDQUFDQyxPQUFYLElBQXNCRCxVQUFuQzs7QUFFQSxNQUFJdlMsSUFBSSxDQUFDdVMsVUFBRCxDQUFSLEVBQXNCO0FBQ3BCLFFBQUl2UyxJQUFJLENBQUN1UyxVQUFVLENBQUNFLGFBQVgsQ0FBeUJ6USxJQUF6QixDQUFELENBQVIsRUFBMEM7QUFDeEMsYUFBTyxJQUFQO0FBQ0Q7QUFDRCxRQUFJdVEsVUFBVSxDQUFDRyxLQUFYO0FBQ0ZILGNBQVUsQ0FBQ0csS0FBWCxDQUFpQnBQLE9BRGY7QUFFRjVCLFNBQUssQ0FBQ0MsT0FBTixDQUFjNFEsVUFBVSxDQUFDRyxLQUFYLENBQWlCcFAsT0FBakIsQ0FBeUJ0QixJQUF6QixDQUFkLENBRkYsRUFFaUQ7QUFDL0MsYUFBTyxJQUFQO0FBQ0Q7QUFDRCxXQUFPLEtBQVA7QUFDRDs7QUFFRCxNQUFJaEMsSUFBSSxDQUFDdVMsVUFBVSxDQUFDdlEsSUFBRCxDQUFYLENBQVIsRUFBNEI7QUFDMUIsV0FBTyxJQUFQO0FBQ0Q7QUFDRCxNQUFNMlEsTUFBTSxHQUFHSixVQUFVLENBQUNJLE1BQTFCO0FBQ0EsTUFBSWpSLEtBQUssQ0FBQ0MsT0FBTixDQUFjZ1IsTUFBZCxDQUFKLEVBQTJCO0FBQ3pCLFdBQU8sQ0FBQyxDQUFDQSxNQUFNLENBQUNDLElBQVAsQ0FBWSxVQUFBQyxLQUFLLFVBQUlQLE9BQU8sQ0FBQ3RRLElBQUQsRUFBTzZRLEtBQVAsQ0FBWCxFQUFqQixDQUFUO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTQyxTQUFULENBQW9CQyxTQUFwQixFQUErQmxSLEtBQS9CLEVBQXNDMFEsVUFBdEMsRUFBa0Q7QUFDaEQxUSxPQUFLLENBQUNVLE9BQU4sQ0FBYyxVQUFBUCxJQUFJLEVBQUk7QUFDcEIsUUFBSXNRLE9BQU8sQ0FBQ3RRLElBQUQsRUFBT3VRLFVBQVAsQ0FBWCxFQUErQjtBQUM3QlEsZUFBUyxDQUFDL1EsSUFBRCxDQUFULEdBQWtCLFVBQVVtRyxJQUFWLEVBQWdCO0FBQ2hDLGVBQU8sS0FBS3BCLEdBQUwsSUFBWSxLQUFLQSxHQUFMLENBQVNpTSxXQUFULENBQXFCaFIsSUFBckIsRUFBMkJtRyxJQUEzQixDQUFuQjtBQUNELE9BRkQ7QUFHRDtBQUNGLEdBTkQ7QUFPRDs7QUFFRCxTQUFTOEssZ0JBQVQsQ0FBMkI3VCxHQUEzQixFQUFnQ21ULFVBQWhDLEVBQTRDO0FBQzFDQSxZQUFVLEdBQUdBLFVBQVUsQ0FBQ0MsT0FBWCxJQUFzQkQsVUFBbkM7QUFDQSxNQUFJVyxZQUFKO0FBQ0EsTUFBSWxULElBQUksQ0FBQ3VTLFVBQUQsQ0FBUixFQUFzQjtBQUNwQlcsZ0JBQVksR0FBR1gsVUFBZjtBQUNELEdBRkQsTUFFTztBQUNMVyxnQkFBWSxHQUFHOVQsR0FBRyxDQUFDK1QsTUFBSixDQUFXWixVQUFYLENBQWY7QUFDRDtBQUNEQSxZQUFVLEdBQUdXLFlBQVksQ0FBQzVQLE9BQTFCO0FBQ0EsU0FBTyxDQUFDNFAsWUFBRCxFQUFlWCxVQUFmLENBQVA7QUFDRDs7QUFFRCxTQUFTYSxTQUFULENBQW9CbkIsRUFBcEIsRUFBd0JvQixRQUF4QixFQUFrQztBQUNoQyxNQUFJM1IsS0FBSyxDQUFDQyxPQUFOLENBQWMwUixRQUFkLEtBQTJCQSxRQUFRLENBQUNuVyxNQUF4QyxFQUFnRDtBQUM5QyxRQUFNb1csTUFBTSxHQUFHeFQsTUFBTSxDQUFDYSxNQUFQLENBQWMsSUFBZCxDQUFmO0FBQ0EwUyxZQUFRLENBQUM5USxPQUFULENBQWlCLFVBQUFnUixRQUFRLEVBQUk7QUFDM0JELFlBQU0sQ0FBQ0MsUUFBRCxDQUFOLEdBQW1CLElBQW5CO0FBQ0QsS0FGRDtBQUdBdEIsTUFBRSxDQUFDdUIsWUFBSCxHQUFrQnZCLEVBQUUsQ0FBQ3FCLE1BQUgsR0FBWUEsTUFBOUI7QUFDRDtBQUNGOztBQUVELFNBQVNHLFVBQVQsQ0FBcUJDLE1BQXJCLEVBQTZCdkMsVUFBN0IsRUFBeUM7QUFDdkN1QyxRQUFNLEdBQUcsQ0FBQ0EsTUFBTSxJQUFJLEVBQVgsRUFBZTdWLEtBQWYsQ0FBcUIsR0FBckIsQ0FBVDtBQUNBLE1BQU0rTCxHQUFHLEdBQUc4SixNQUFNLENBQUN4VyxNQUFuQjs7QUFFQSxNQUFJME0sR0FBRyxLQUFLLENBQVosRUFBZTtBQUNidUgsY0FBVSxDQUFDd0MsT0FBWCxHQUFxQkQsTUFBTSxDQUFDLENBQUQsQ0FBM0I7QUFDRCxHQUZELE1BRU8sSUFBSTlKLEdBQUcsS0FBSyxDQUFaLEVBQWU7QUFDcEJ1SCxjQUFVLENBQUN3QyxPQUFYLEdBQXFCRCxNQUFNLENBQUMsQ0FBRCxDQUEzQjtBQUNBdkMsY0FBVSxDQUFDeUMsUUFBWCxHQUFzQkYsTUFBTSxDQUFDLENBQUQsQ0FBNUI7QUFDRDtBQUNGOztBQUVELFNBQVNHLFFBQVQsQ0FBbUJ0QixVQUFuQixFQUErQnVCLE9BQS9CLEVBQXdDO0FBQ3RDLE1BQUlqUixJQUFJLEdBQUcwUCxVQUFVLENBQUMxUCxJQUFYLElBQW1CLEVBQTlCO0FBQ0EsTUFBTWtSLE9BQU8sR0FBR3hCLFVBQVUsQ0FBQ3dCLE9BQVgsSUFBc0IsRUFBdEM7O0FBRUEsTUFBSSxPQUFPbFIsSUFBUCxLQUFnQixVQUFwQixFQUFnQztBQUM5QixRQUFJO0FBQ0ZBLFVBQUksR0FBR0EsSUFBSSxDQUFDeEMsSUFBTCxDQUFVeVQsT0FBVixDQUFQLENBREUsQ0FDeUI7QUFDNUIsS0FGRCxDQUVFLE9BQU9FLENBQVAsRUFBVTtBQUNWLFVBQUlDLHNHQUFBLENBQVlDLGFBQWhCLEVBQStCO0FBQzdCM0YsZUFBTyxDQUFDQyxJQUFSLENBQWEsd0VBQWIsRUFBdUYzTCxJQUF2RjtBQUNEO0FBQ0Y7QUFDRixHQVJELE1BUU87QUFDTCxRQUFJO0FBQ0Y7QUFDQUEsVUFBSSxHQUFHaEUsSUFBSSxDQUFDQyxLQUFMLENBQVdELElBQUksQ0FBQ3NWLFNBQUwsQ0FBZXRSLElBQWYsQ0FBWCxDQUFQO0FBQ0QsS0FIRCxDQUdFLE9BQU9tUixDQUFQLEVBQVUsQ0FBRTtBQUNmOztBQUVELE1BQUksQ0FBQzdULGFBQWEsQ0FBQzBDLElBQUQsQ0FBbEIsRUFBMEI7QUFDeEJBLFFBQUksR0FBRyxFQUFQO0FBQ0Q7O0FBRUQvQyxRQUFNLENBQUN3QyxJQUFQLENBQVl5UixPQUFaLEVBQXFCeFIsT0FBckIsQ0FBNkIsVUFBQTBMLFVBQVUsRUFBSTtBQUN6QyxRQUFJNkYsT0FBTyxDQUFDTSxtQkFBUixDQUE0QjVXLE9BQTVCLENBQW9DeVEsVUFBcEMsTUFBb0QsQ0FBQyxDQUFyRCxJQUEwRCxDQUFDM04sTUFBTSxDQUFDdUMsSUFBRCxFQUFPb0wsVUFBUCxDQUFyRSxFQUF5RjtBQUN2RnBMLFVBQUksQ0FBQ29MLFVBQUQsQ0FBSixHQUFtQjhGLE9BQU8sQ0FBQzlGLFVBQUQsQ0FBMUI7QUFDRDtBQUNGLEdBSkQ7O0FBTUEsU0FBT3BMLElBQVA7QUFDRDs7QUFFRCxJQUFNd1IsVUFBVSxHQUFHLENBQUN4WCxNQUFELEVBQVMySixNQUFULEVBQWlCOE4sT0FBakIsRUFBMEJ4VSxNQUExQixFQUFrQzRCLEtBQWxDLEVBQXlDLElBQXpDLENBQW5COztBQUVBLFNBQVM2UyxjQUFULENBQXlCaFIsSUFBekIsRUFBK0I7QUFDN0IsU0FBTyxTQUFTaVIsUUFBVCxDQUFtQkMsTUFBbkIsRUFBMkJDLE1BQTNCLEVBQW1DO0FBQ3hDLFFBQUksS0FBSzNOLEdBQVQsRUFBYztBQUNaLFdBQUtBLEdBQUwsQ0FBU3hELElBQVQsSUFBaUJrUixNQUFqQixDQURZLENBQ2E7QUFDMUI7QUFDRixHQUpEO0FBS0Q7O0FBRUQsU0FBU0UsYUFBVCxDQUF3QnBDLFVBQXhCLEVBQW9DcUMsWUFBcEMsRUFBa0Q7QUFDaEQsTUFBTUMsWUFBWSxHQUFHdEMsVUFBVSxDQUFDdUMsU0FBaEM7QUFDQSxNQUFNQyxVQUFVLEdBQUd4QyxVQUFVLENBQUN5QyxPQUE5QjtBQUNBLE1BQU1DLFNBQVMsR0FBRzFDLFVBQVUsQ0FBQ0ksTUFBN0I7O0FBRUEsTUFBSXVDLFFBQVEsR0FBRzNDLFVBQVUsQ0FBQzRDLEtBQTFCOztBQUVBLE1BQUksQ0FBQ0QsUUFBTCxFQUFlO0FBQ2IzQyxjQUFVLENBQUM0QyxLQUFYLEdBQW1CRCxRQUFRLEdBQUcsRUFBOUI7QUFDRDs7QUFFRCxNQUFNSixTQUFTLEdBQUcsRUFBbEI7QUFDQSxNQUFJcFQsS0FBSyxDQUFDQyxPQUFOLENBQWNrVCxZQUFkLENBQUosRUFBaUM7QUFDL0JBLGdCQUFZLENBQUN0UyxPQUFiLENBQXFCLFVBQUE2UyxRQUFRLEVBQUk7QUFDL0JOLGVBQVMsQ0FBQ2hULElBQVYsQ0FBZXNULFFBQVEsQ0FBQ3RZLE9BQVQsQ0FBaUIsUUFBakIsRUFBOEIsSUFBOUIsZUFBZjtBQUNBLFVBQUlzWSxRQUFRLEtBQUssa0JBQWpCLEVBQXFDO0FBQ25DLFlBQUkxVCxLQUFLLENBQUNDLE9BQU4sQ0FBY3VULFFBQWQsQ0FBSixFQUE2QjtBQUMzQkEsa0JBQVEsQ0FBQ3BULElBQVQsQ0FBYyxNQUFkO0FBQ0FvVCxrQkFBUSxDQUFDcFQsSUFBVCxDQUFjLE9BQWQ7QUFDRCxTQUhELE1BR087QUFDTG9ULGtCQUFRLENBQUMzUixJQUFULEdBQWdCO0FBQ2RpRixnQkFBSSxFQUFFM0wsTUFEUTtBQUVkMlYsbUJBQU8sRUFBRSxFQUZLLEVBQWhCOztBQUlBMEMsa0JBQVEsQ0FBQy9QLEtBQVQsR0FBaUI7QUFDZnFELGdCQUFJLEVBQUUsQ0FBQzNMLE1BQUQsRUFBUzJKLE1BQVQsRUFBaUI4TixPQUFqQixFQUEwQjVTLEtBQTFCLEVBQWlDNUIsTUFBakMsRUFBeUNILElBQXpDLENBRFM7QUFFZjZTLG1CQUFPLEVBQUUsRUFGTSxFQUFqQjs7QUFJRDtBQUNGO0FBQ0YsS0FqQkQ7QUFrQkQ7QUFDRCxNQUFJclMsYUFBYSxDQUFDNFUsVUFBRCxDQUFiLElBQTZCQSxVQUFVLENBQUNJLEtBQTVDLEVBQW1EO0FBQ2pETCxhQUFTLENBQUNoVCxJQUFWO0FBQ0U4UyxnQkFBWSxDQUFDO0FBQ1hTLGdCQUFVLEVBQUVDLGNBQWMsQ0FBQ1AsVUFBVSxDQUFDSSxLQUFaLEVBQW1CLElBQW5CLENBRGYsRUFBRCxDQURkOzs7QUFLRDtBQUNELE1BQUl6VCxLQUFLLENBQUNDLE9BQU4sQ0FBY3NULFNBQWQsQ0FBSixFQUE4QjtBQUM1QkEsYUFBUyxDQUFDMVMsT0FBVixDQUFrQixVQUFBZ1QsUUFBUSxFQUFJO0FBQzVCLFVBQUlwVixhQUFhLENBQUNvVixRQUFELENBQWIsSUFBMkJBLFFBQVEsQ0FBQ0osS0FBeEMsRUFBK0M7QUFDN0NMLGlCQUFTLENBQUNoVCxJQUFWO0FBQ0U4UyxvQkFBWSxDQUFDO0FBQ1hTLG9CQUFVLEVBQUVDLGNBQWMsQ0FBQ0MsUUFBUSxDQUFDSixLQUFWLEVBQWlCLElBQWpCLENBRGYsRUFBRCxDQURkOzs7QUFLRDtBQUNGLEtBUkQ7QUFTRDtBQUNELFNBQU9MLFNBQVA7QUFDRDs7QUFFRCxTQUFTVSxhQUFULENBQXdCalYsR0FBeEIsRUFBNkJpSSxJQUE3QixFQUFtQ2lOLFlBQW5DLEVBQWlEQyxJQUFqRCxFQUF1RDtBQUNyRDtBQUNBLE1BQUloVSxLQUFLLENBQUNDLE9BQU4sQ0FBYzZHLElBQWQsS0FBdUJBLElBQUksQ0FBQ3RMLE1BQUwsS0FBZ0IsQ0FBM0MsRUFBOEM7QUFDNUMsV0FBT3NMLElBQUksQ0FBQyxDQUFELENBQVg7QUFDRDtBQUNELFNBQU9BLElBQVA7QUFDRDs7QUFFRCxTQUFTOE0sY0FBVCxDQUF5QkgsS0FBekIsRUFBK0QsS0FBL0JRLFVBQStCLHVFQUFsQixLQUFrQixLQUFYRCxJQUFXLHVFQUFKLEVBQUk7QUFDN0QsTUFBTUwsVUFBVSxHQUFHLEVBQW5CO0FBQ0EsTUFBSSxDQUFDTSxVQUFMLEVBQWlCO0FBQ2ZOLGNBQVUsQ0FBQ08sS0FBWCxHQUFtQjtBQUNqQnBOLFVBQUksRUFBRTNMLE1BRFc7QUFFakJzSSxXQUFLLEVBQUUsRUFGVSxFQUFuQjs7QUFJQTtBQUNBa1EsY0FBVSxDQUFDUSxPQUFYLEdBQXFCO0FBQ25Cck4sVUFBSSxFQUFFMUksTUFEYTtBQUVuQnFGLFdBQUssRUFBRSxJQUZZLEVBQXJCOztBQUlBO0FBQ0FrUSxjQUFVLENBQUNTLG1CQUFYLEdBQWlDO0FBQy9CdE4sVUFBSSxFQUFFM0wsTUFEeUI7QUFFL0JzSSxXQUFLLEVBQUUsRUFGd0IsRUFBakM7O0FBSUFrUSxjQUFVLENBQUNoQyxRQUFYLEdBQXNCLEVBQUU7QUFDdEI3SyxVQUFJLEVBQUUsSUFEYztBQUVwQnJELFdBQUssRUFBRSxFQUZhO0FBR3BCcVAsY0FBUSxFQUFFLGtCQUFVQyxNQUFWLEVBQWtCQyxNQUFsQixFQUEwQjtBQUNsQyxZQUFNcEIsTUFBTSxHQUFHeFQsTUFBTSxDQUFDYSxNQUFQLENBQWMsSUFBZCxDQUFmO0FBQ0E4VCxjQUFNLENBQUNsUyxPQUFQLENBQWUsVUFBQWdSLFFBQVEsRUFBSTtBQUN6QkQsZ0JBQU0sQ0FBQ0MsUUFBRCxDQUFOLEdBQW1CLElBQW5CO0FBQ0QsU0FGRDtBQUdBLGFBQUt3QyxPQUFMLENBQWE7QUFDWHpDLGdCQUFNLEVBQU5BLE1BRFcsRUFBYjs7QUFHRCxPQVhtQixFQUF0Qjs7QUFhRDtBQUNELE1BQUk1UixLQUFLLENBQUNDLE9BQU4sQ0FBY3dULEtBQWQsQ0FBSixFQUEwQixDQUFFO0FBQzFCQSxTQUFLLENBQUM1UyxPQUFOLENBQWMsVUFBQWhDLEdBQUcsRUFBSTtBQUNuQjhVLGdCQUFVLENBQUM5VSxHQUFELENBQVYsR0FBa0I7QUFDaEJpSSxZQUFJLEVBQUUsSUFEVTtBQUVoQmdNLGdCQUFRLEVBQUVELGNBQWMsQ0FBQ2hVLEdBQUQsQ0FGUixFQUFsQjs7QUFJRCxLQUxEO0FBTUQsR0FQRCxNQU9PLElBQUlKLGFBQWEsQ0FBQ2dWLEtBQUQsQ0FBakIsRUFBMEIsQ0FBRTtBQUNqQ3JWLFVBQU0sQ0FBQ3dDLElBQVAsQ0FBWTZTLEtBQVosRUFBbUI1UyxPQUFuQixDQUEyQixVQUFBaEMsR0FBRyxFQUFJO0FBQ2hDLFVBQU15VixJQUFJLEdBQUdiLEtBQUssQ0FBQzVVLEdBQUQsQ0FBbEI7QUFDQSxVQUFJSixhQUFhLENBQUM2VixJQUFELENBQWpCLEVBQXlCLENBQUU7QUFDekIsWUFBSTdRLEtBQUssR0FBRzZRLElBQUksQ0FBQ3hELE9BQWpCO0FBQ0EsWUFBSXhTLElBQUksQ0FBQ21GLEtBQUQsQ0FBUixFQUFpQjtBQUNmQSxlQUFLLEdBQUdBLEtBQUssRUFBYjtBQUNEOztBQUVENlEsWUFBSSxDQUFDeE4sSUFBTCxHQUFZZ04sYUFBYSxDQUFDalYsR0FBRCxFQUFNeVYsSUFBSSxDQUFDeE4sSUFBWCxDQUF6Qjs7QUFFQTZNLGtCQUFVLENBQUM5VSxHQUFELENBQVYsR0FBa0I7QUFDaEJpSSxjQUFJLEVBQUU2TCxVQUFVLENBQUM3VyxPQUFYLENBQW1Cd1ksSUFBSSxDQUFDeE4sSUFBeEIsTUFBa0MsQ0FBQyxDQUFuQyxHQUF1Q3dOLElBQUksQ0FBQ3hOLElBQTVDLEdBQW1ELElBRHpDO0FBRWhCckQsZUFBSyxFQUFMQSxLQUZnQjtBQUdoQnFQLGtCQUFRLEVBQUVELGNBQWMsQ0FBQ2hVLEdBQUQsQ0FIUixFQUFsQjs7QUFLRCxPQWJELE1BYU8sQ0FBRTtBQUNQLFlBQU1pSSxJQUFJLEdBQUdnTixhQUFhLENBQUNqVixHQUFELEVBQU15VixJQUFOLENBQTFCO0FBQ0FYLGtCQUFVLENBQUM5VSxHQUFELENBQVYsR0FBa0I7QUFDaEJpSSxjQUFJLEVBQUU2TCxVQUFVLENBQUM3VyxPQUFYLENBQW1CZ0wsSUFBbkIsTUFBNkIsQ0FBQyxDQUE5QixHQUFrQ0EsSUFBbEMsR0FBeUMsSUFEL0I7QUFFaEJnTSxrQkFBUSxFQUFFRCxjQUFjLENBQUNoVSxHQUFELENBRlIsRUFBbEI7O0FBSUQ7QUFDRixLQXRCRDtBQXVCRDtBQUNELFNBQU84VSxVQUFQO0FBQ0Q7O0FBRUQsU0FBU1ksU0FBVCxDQUFvQjFFLEtBQXBCLEVBQTJCO0FBQ3pCO0FBQ0EsTUFBSTtBQUNGQSxTQUFLLENBQUMyRSxFQUFOLEdBQVdyWCxJQUFJLENBQUNDLEtBQUwsQ0FBV0QsSUFBSSxDQUFDc1YsU0FBTCxDQUFlNUMsS0FBZixDQUFYLENBQVg7QUFDRCxHQUZELENBRUUsT0FBT3lDLENBQVAsRUFBVSxDQUFFOztBQUVkekMsT0FBSyxDQUFDNEUsZUFBTixHQUF3QjNWLElBQXhCO0FBQ0ErUSxPQUFLLENBQUM2RSxjQUFOLEdBQXVCNVYsSUFBdkI7O0FBRUErUSxPQUFLLENBQUM4RSxNQUFOLEdBQWU5RSxLQUFLLENBQUM4RSxNQUFOLElBQWdCLEVBQS9COztBQUVBLE1BQUksQ0FBQy9WLE1BQU0sQ0FBQ2lSLEtBQUQsRUFBUSxRQUFSLENBQVgsRUFBOEI7QUFDNUJBLFNBQUssQ0FBQytFLE1BQU4sR0FBZSxFQUFmO0FBQ0Q7O0FBRUQsTUFBSWhXLE1BQU0sQ0FBQ2lSLEtBQUQsRUFBUSxVQUFSLENBQVYsRUFBK0I7QUFDN0JBLFNBQUssQ0FBQytFLE1BQU4sR0FBZSxPQUFPL0UsS0FBSyxDQUFDK0UsTUFBYixLQUF3QixRQUF4QixHQUFtQy9FLEtBQUssQ0FBQytFLE1BQXpDLEdBQWtELEVBQWpFO0FBQ0EvRSxTQUFLLENBQUMrRSxNQUFOLENBQWFDLFFBQWIsR0FBd0JoRixLQUFLLENBQUNnRixRQUE5QjtBQUNEOztBQUVELE1BQUlwVyxhQUFhLENBQUNvUixLQUFLLENBQUMrRSxNQUFQLENBQWpCLEVBQWlDO0FBQy9CL0UsU0FBSyxDQUFDOEUsTUFBTixHQUFldlcsTUFBTSxDQUFDNEYsTUFBUCxDQUFjLEVBQWQsRUFBa0I2TCxLQUFLLENBQUM4RSxNQUF4QixFQUFnQzlFLEtBQUssQ0FBQytFLE1BQXRDLENBQWY7QUFDRDs7QUFFRCxTQUFPL0UsS0FBUDtBQUNEOztBQUVELFNBQVNpRixhQUFULENBQXdCdkUsRUFBeEIsRUFBNEJ3RSxjQUE1QixFQUE0QztBQUMxQyxNQUFJM0MsT0FBTyxHQUFHN0IsRUFBZDtBQUNBd0UsZ0JBQWMsQ0FBQ2xVLE9BQWYsQ0FBdUIsVUFBQW1VLGFBQWEsRUFBSTtBQUN0QyxRQUFNQyxRQUFRLEdBQUdELGFBQWEsQ0FBQyxDQUFELENBQTlCO0FBQ0EsUUFBTXZSLEtBQUssR0FBR3VSLGFBQWEsQ0FBQyxDQUFELENBQTNCO0FBQ0EsUUFBSUMsUUFBUSxJQUFJLE9BQU94UixLQUFQLEtBQWlCLFdBQWpDLEVBQThDLENBQUU7QUFDOUMsVUFBTXlSLFFBQVEsR0FBR0YsYUFBYSxDQUFDLENBQUQsQ0FBOUI7QUFDQSxVQUFNRyxTQUFTLEdBQUdILGFBQWEsQ0FBQyxDQUFELENBQS9COztBQUVBLFVBQUlJLElBQUo7QUFDQSxVQUFJdFEsTUFBTSxDQUFDdVEsU0FBUCxDQUFpQkosUUFBakIsQ0FBSixFQUFnQztBQUM5QkcsWUFBSSxHQUFHSCxRQUFQO0FBQ0QsT0FGRCxNQUVPLElBQUksQ0FBQ0EsUUFBTCxFQUFlO0FBQ3BCRyxZQUFJLEdBQUdoRCxPQUFQO0FBQ0QsT0FGTSxNQUVBLElBQUksT0FBTzZDLFFBQVAsS0FBb0IsUUFBcEIsSUFBZ0NBLFFBQXBDLEVBQThDO0FBQ25ELFlBQUlBLFFBQVEsQ0FBQ25aLE9BQVQsQ0FBaUIsS0FBakIsTUFBNEIsQ0FBaEMsRUFBbUM7QUFDakNzWixjQUFJLEdBQUdILFFBQVEsQ0FBQ0ssTUFBVCxDQUFnQixDQUFoQixDQUFQO0FBQ0QsU0FGRCxNQUVPO0FBQ0xGLGNBQUksR0FBRzdFLEVBQUUsQ0FBQ2dGLFdBQUgsQ0FBZU4sUUFBZixFQUF5QjdDLE9BQXpCLENBQVA7QUFDRDtBQUNGOztBQUVELFVBQUl0TixNQUFNLENBQUN1USxTQUFQLENBQWlCRCxJQUFqQixDQUFKLEVBQTRCO0FBQzFCaEQsZUFBTyxHQUFHM08sS0FBVjtBQUNELE9BRkQsTUFFTyxJQUFJLENBQUN5UixRQUFMLEVBQWU7QUFDcEI5QyxlQUFPLEdBQUdnRCxJQUFJLENBQUMzUixLQUFELENBQWQ7QUFDRCxPQUZNLE1BRUE7QUFDTCxZQUFJekQsS0FBSyxDQUFDQyxPQUFOLENBQWNtVixJQUFkLENBQUosRUFBeUI7QUFDdkJoRCxpQkFBTyxHQUFHZ0QsSUFBSSxDQUFDbEUsSUFBTCxDQUFVLFVBQUFzRSxRQUFRLEVBQUk7QUFDOUIsbUJBQU9qRixFQUFFLENBQUNnRixXQUFILENBQWVMLFFBQWYsRUFBeUJNLFFBQXpCLE1BQXVDL1IsS0FBOUM7QUFDRCxXQUZTLENBQVY7QUFHRCxTQUpELE1BSU8sSUFBSWhGLGFBQWEsQ0FBQzJXLElBQUQsQ0FBakIsRUFBeUI7QUFDOUJoRCxpQkFBTyxHQUFHaFUsTUFBTSxDQUFDd0MsSUFBUCxDQUFZd1UsSUFBWixFQUFrQmxFLElBQWxCLENBQXVCLFVBQUF1RSxPQUFPLEVBQUk7QUFDMUMsbUJBQU9sRixFQUFFLENBQUNnRixXQUFILENBQWVMLFFBQWYsRUFBeUJFLElBQUksQ0FBQ0ssT0FBRCxDQUE3QixNQUE0Q2hTLEtBQW5EO0FBQ0QsV0FGUyxDQUFWO0FBR0QsU0FKTSxNQUlBO0FBQ0xvSixpQkFBTyxDQUFDeFAsS0FBUixDQUFjLGlCQUFkLEVBQWlDK1gsSUFBakM7QUFDRDtBQUNGOztBQUVELFVBQUlELFNBQUosRUFBZTtBQUNiL0MsZUFBTyxHQUFHN0IsRUFBRSxDQUFDZ0YsV0FBSCxDQUFlSixTQUFmLEVBQTBCL0MsT0FBMUIsQ0FBVjtBQUNEO0FBQ0Y7QUFDRixHQTFDRDtBQTJDQSxTQUFPQSxPQUFQO0FBQ0Q7O0FBRUQsU0FBU3NELGlCQUFULENBQTRCbkYsRUFBNUIsRUFBZ0NvRixLQUFoQyxFQUF1QzlGLEtBQXZDLEVBQThDO0FBQzVDLE1BQU0rRixRQUFRLEdBQUcsRUFBakI7O0FBRUEsTUFBSTVWLEtBQUssQ0FBQ0MsT0FBTixDQUFjMFYsS0FBZCxLQUF3QkEsS0FBSyxDQUFDbmEsTUFBbEMsRUFBMEM7QUFDeEM7Ozs7Ozs7Ozs7O0FBV0FtYSxTQUFLLENBQUM5VSxPQUFOLENBQWMsVUFBQ29VLFFBQUQsRUFBVzFVLEtBQVgsRUFBcUI7QUFDakMsVUFBSSxPQUFPMFUsUUFBUCxLQUFvQixRQUF4QixFQUFrQztBQUNoQyxZQUFJLENBQUNBLFFBQUwsRUFBZSxDQUFFO0FBQ2ZXLGtCQUFRLENBQUMsTUFBTXJWLEtBQVAsQ0FBUixHQUF3QmdRLEVBQXhCO0FBQ0QsU0FGRCxNQUVPO0FBQ0wsY0FBSTBFLFFBQVEsS0FBSyxRQUFqQixFQUEyQixDQUFFO0FBQzNCVyxvQkFBUSxDQUFDLE1BQU1yVixLQUFQLENBQVIsR0FBd0JzUCxLQUF4QjtBQUNELFdBRkQsTUFFTyxJQUFJb0YsUUFBUSxLQUFLLFdBQWpCLEVBQThCO0FBQ25DLGdCQUFJcEYsS0FBSyxDQUFDK0UsTUFBTixJQUFnQi9FLEtBQUssQ0FBQytFLE1BQU4sQ0FBYWlCLFFBQWpDLEVBQTJDO0FBQ3pDRCxzQkFBUSxDQUFDLE1BQU1yVixLQUFQLENBQVIsR0FBd0JzUCxLQUFLLENBQUMrRSxNQUFOLENBQWFpQixRQUFyQztBQUNELGFBRkQsTUFFTztBQUNMRCxzQkFBUSxDQUFDLE1BQU1yVixLQUFQLENBQVIsR0FBd0IsQ0FBQ3NQLEtBQUQsQ0FBeEI7QUFDRDtBQUNGLFdBTk0sTUFNQSxJQUFJb0YsUUFBUSxDQUFDblosT0FBVCxDQUFpQixTQUFqQixNQUFnQyxDQUFwQyxFQUF1QyxDQUFFO0FBQzlDOFosb0JBQVEsQ0FBQyxNQUFNclYsS0FBUCxDQUFSLEdBQXdCZ1EsRUFBRSxDQUFDZ0YsV0FBSCxDQUFlTixRQUFRLENBQUM3WixPQUFULENBQWlCLFNBQWpCLEVBQTRCLEVBQTVCLENBQWYsRUFBZ0R5VSxLQUFoRCxDQUF4QjtBQUNELFdBRk0sTUFFQTtBQUNMK0Ysb0JBQVEsQ0FBQyxNQUFNclYsS0FBUCxDQUFSLEdBQXdCZ1EsRUFBRSxDQUFDZ0YsV0FBSCxDQUFlTixRQUFmLENBQXhCO0FBQ0Q7QUFDRjtBQUNGLE9BbEJELE1Ba0JPO0FBQ0xXLGdCQUFRLENBQUMsTUFBTXJWLEtBQVAsQ0FBUixHQUF3QnVVLGFBQWEsQ0FBQ3ZFLEVBQUQsRUFBSzBFLFFBQUwsQ0FBckM7QUFDRDtBQUNGLEtBdEJEO0FBdUJEOztBQUVELFNBQU9XLFFBQVA7QUFDRDs7QUFFRCxTQUFTRSxhQUFULENBQXdCQyxHQUF4QixFQUE2QjtBQUMzQixNQUFNclgsR0FBRyxHQUFHLEVBQVo7QUFDQSxPQUFLLElBQUk3QyxDQUFDLEdBQUcsQ0FBYixFQUFnQkEsQ0FBQyxHQUFHa2EsR0FBRyxDQUFDdmEsTUFBeEIsRUFBZ0NLLENBQUMsRUFBakMsRUFBcUM7QUFDbkMsUUFBTW1hLE9BQU8sR0FBR0QsR0FBRyxDQUFDbGEsQ0FBRCxDQUFuQjtBQUNBNkMsT0FBRyxDQUFDc1gsT0FBTyxDQUFDLENBQUQsQ0FBUixDQUFILEdBQWtCQSxPQUFPLENBQUMsQ0FBRCxDQUF6QjtBQUNEO0FBQ0QsU0FBT3RYLEdBQVA7QUFDRDs7QUFFRCxTQUFTdVgsZ0JBQVQsQ0FBMkIxRixFQUEzQixFQUErQlYsS0FBL0IsRUFBbUYsS0FBN0NwSixJQUE2Qyx1RUFBdEMsRUFBc0MsS0FBbENrUCxLQUFrQyx1RUFBMUIsRUFBMEIsS0FBdEJPLFFBQXNCLHVEQUFaM0osVUFBWTtBQUNqRixNQUFJNEosZUFBZSxHQUFHLEtBQXRCLENBRGlGLENBQ3BEO0FBQzdCLE1BQUlELFFBQUosRUFBYyxDQUFFO0FBQ2RDLG1CQUFlLEdBQUd0RyxLQUFLLENBQUN1RyxhQUFOO0FBQ2hCdkcsU0FBSyxDQUFDdUcsYUFBTixDQUFvQkMsT0FESjtBQUVoQnhHLFNBQUssQ0FBQ3VHLGFBQU4sQ0FBb0JDLE9BQXBCLENBQTRCQyxPQUE1QixLQUF3QyxJQUYxQztBQUdBLFFBQUksQ0FBQzdQLElBQUksQ0FBQ2pMLE1BQVYsRUFBa0IsQ0FBRTtBQUNsQixVQUFJMmEsZUFBSixFQUFxQjtBQUNuQixlQUFPLENBQUN0RyxLQUFELENBQVA7QUFDRDtBQUNELGFBQU9BLEtBQUssQ0FBQytFLE1BQU4sQ0FBYWlCLFFBQWIsSUFBeUJoRyxLQUFLLENBQUMrRSxNQUF0QztBQUNEO0FBQ0Y7O0FBRUQsTUFBTWdCLFFBQVEsR0FBR0YsaUJBQWlCLENBQUNuRixFQUFELEVBQUtvRixLQUFMLEVBQVk5RixLQUFaLENBQWxDOztBQUVBLE1BQU0wRyxHQUFHLEdBQUcsRUFBWjtBQUNBOVAsTUFBSSxDQUFDNUYsT0FBTCxDQUFhLFVBQUEyVixHQUFHLEVBQUk7QUFDbEIsUUFBSUEsR0FBRyxLQUFLLFFBQVosRUFBc0I7QUFDcEIsVUFBSWpLLFVBQVUsS0FBSyxhQUFmLElBQWdDLENBQUMySixRQUFyQyxFQUErQyxDQUFFO0FBQy9DSyxXQUFHLENBQUNuVyxJQUFKLENBQVN5UCxLQUFLLENBQUM4RSxNQUFOLENBQWFsUixLQUF0QjtBQUNELE9BRkQsTUFFTztBQUNMLFlBQUl5UyxRQUFRLElBQUksQ0FBQ0MsZUFBakIsRUFBa0M7QUFDaENJLGFBQUcsQ0FBQ25XLElBQUosQ0FBU3lQLEtBQUssQ0FBQytFLE1BQU4sQ0FBYWlCLFFBQWIsQ0FBc0IsQ0FBdEIsQ0FBVDtBQUNELFNBRkQsTUFFTyxDQUFFO0FBQ1BVLGFBQUcsQ0FBQ25XLElBQUosQ0FBU3lQLEtBQVQ7QUFDRDtBQUNGO0FBQ0YsS0FWRCxNQVVPO0FBQ0wsVUFBSTdQLEtBQUssQ0FBQ0MsT0FBTixDQUFjdVcsR0FBZCxLQUFzQkEsR0FBRyxDQUFDLENBQUQsQ0FBSCxLQUFXLEdBQXJDLEVBQTBDO0FBQ3hDRCxXQUFHLENBQUNuVyxJQUFKLENBQVMwVixhQUFhLENBQUNVLEdBQUQsQ0FBdEI7QUFDRCxPQUZELE1BRU8sSUFBSSxPQUFPQSxHQUFQLEtBQWUsUUFBZixJQUEyQjVYLE1BQU0sQ0FBQ2dYLFFBQUQsRUFBV1ksR0FBWCxDQUFyQyxFQUFzRDtBQUMzREQsV0FBRyxDQUFDblcsSUFBSixDQUFTd1YsUUFBUSxDQUFDWSxHQUFELENBQWpCO0FBQ0QsT0FGTSxNQUVBO0FBQ0xELFdBQUcsQ0FBQ25XLElBQUosQ0FBU29XLEdBQVQ7QUFDRDtBQUNGO0FBQ0YsR0FwQkQ7O0FBc0JBLFNBQU9ELEdBQVA7QUFDRDs7QUFFRCxJQUFNRSxJQUFJLEdBQUcsR0FBYjtBQUNBLElBQU1DLE1BQU0sR0FBRyxHQUFmOztBQUVBLFNBQVNDLGdCQUFULENBQTJCQyxTQUEzQixFQUFzQ0MsT0FBdEMsRUFBK0M7QUFDN0MsU0FBUUQsU0FBUyxLQUFLQyxPQUFmOztBQUVIQSxTQUFPLEtBQUssY0FBWjs7QUFFRUQsV0FBUyxLQUFLLE9BQWQ7QUFDQUEsV0FBUyxLQUFLLEtBSGhCLENBRko7OztBQVFEOztBQUVELFNBQVNFLFlBQVQsQ0FBdUJ2RyxFQUF2QixFQUEyQjtBQUN6QixNQUFJd0csT0FBTyxHQUFHeEcsRUFBRSxDQUFDd0csT0FBakI7QUFDQTtBQUNBLFNBQU9BLE9BQU8sSUFBSUEsT0FBTyxDQUFDQSxPQUFuQixLQUErQkEsT0FBTyxDQUFDQyxRQUFSLENBQWlCN0MsT0FBakIsSUFBNEI0QyxPQUFPLENBQUNBLE9BQVIsQ0FBZ0JDLFFBQWhCLENBQXlCN0MsT0FBckQsSUFBZ0U0QyxPQUFPLENBQUNFLE1BQVIsQ0FBZS9FLFFBQTlHLENBQVAsRUFBZ0k7QUFDOUg2RSxXQUFPLEdBQUdBLE9BQU8sQ0FBQ0EsT0FBbEI7QUFDRDtBQUNELFNBQU9BLE9BQU8sSUFBSUEsT0FBTyxDQUFDQSxPQUExQjtBQUNEOztBQUVELFNBQVNHLFdBQVQsQ0FBc0JySCxLQUF0QixFQUE2QjtBQUMzQkEsT0FBSyxHQUFHMEUsU0FBUyxDQUFDMUUsS0FBRCxDQUFqQjs7QUFFQTtBQUNBLE1BQU13RyxPQUFPLEdBQUcsQ0FBQ3hHLEtBQUssQ0FBQ3VHLGFBQU4sSUFBdUJ2RyxLQUFLLENBQUM4RSxNQUE5QixFQUFzQzBCLE9BQXREO0FBQ0EsTUFBSSxDQUFDQSxPQUFMLEVBQWM7QUFDWixXQUFPeEosT0FBTyxDQUFDQyxJQUFSLENBQWEsU0FBYixDQUFQO0FBQ0Q7QUFDRCxNQUFNcUssU0FBUyxHQUFHZCxPQUFPLENBQUNjLFNBQVIsSUFBcUJkLE9BQU8sQ0FBQyxZQUFELENBQTlDLENBUjJCLENBUW1DO0FBQzlELE1BQUksQ0FBQ2MsU0FBTCxFQUFnQjtBQUNkLFdBQU90SyxPQUFPLENBQUNDLElBQVIsQ0FBYSxTQUFiLENBQVA7QUFDRDs7QUFFRDtBQUNBLE1BQU04SixTQUFTLEdBQUcvRyxLQUFLLENBQUMvSSxJQUF4Qjs7QUFFQSxNQUFNeVAsR0FBRyxHQUFHLEVBQVo7O0FBRUFZLFdBQVMsQ0FBQ3RXLE9BQVYsQ0FBa0IsVUFBQXVXLFFBQVEsRUFBSTtBQUM1QixRQUFJdFEsSUFBSSxHQUFHc1EsUUFBUSxDQUFDLENBQUQsQ0FBbkI7QUFDQSxRQUFNQyxXQUFXLEdBQUdELFFBQVEsQ0FBQyxDQUFELENBQTVCOztBQUVBLFFBQU1sQixRQUFRLEdBQUdwUCxJQUFJLENBQUMvSyxNQUFMLENBQVksQ0FBWixNQUFtQjJhLE1BQXBDO0FBQ0E1UCxRQUFJLEdBQUdvUCxRQUFRLEdBQUdwUCxJQUFJLENBQUN2TCxLQUFMLENBQVcsQ0FBWCxDQUFILEdBQW1CdUwsSUFBbEM7QUFDQSxRQUFNd1EsTUFBTSxHQUFHeFEsSUFBSSxDQUFDL0ssTUFBTCxDQUFZLENBQVosTUFBbUIwYSxJQUFsQztBQUNBM1AsUUFBSSxHQUFHd1EsTUFBTSxHQUFHeFEsSUFBSSxDQUFDdkwsS0FBTCxDQUFXLENBQVgsQ0FBSCxHQUFtQnVMLElBQWhDOztBQUVBLFFBQUl1USxXQUFXLElBQUlWLGdCQUFnQixDQUFDQyxTQUFELEVBQVk5UCxJQUFaLENBQW5DLEVBQXNEO0FBQ3BEdVEsaUJBQVcsQ0FBQ3hXLE9BQVosQ0FBb0IsVUFBQTBXLFVBQVUsRUFBSTtBQUNoQyxZQUFNaEwsVUFBVSxHQUFHZ0wsVUFBVSxDQUFDLENBQUQsQ0FBN0I7QUFDQSxZQUFJaEwsVUFBSixFQUFnQjtBQUNkLGNBQUlpTCxVQUFVLEdBQUcsTUFBSSxDQUFDblMsR0FBdEI7QUFDQSxjQUFJbVMsVUFBVSxDQUFDUixRQUFYLENBQW9CN0MsT0FBeEIsRUFBaUMsQ0FBRTtBQUNqQ3FELHNCQUFVLEdBQUdWLFlBQVksQ0FBQ1UsVUFBRCxDQUFaLElBQTRCQSxVQUF6QztBQUNEO0FBQ0QsY0FBSWpMLFVBQVUsS0FBSyxPQUFuQixFQUE0QjtBQUMxQmlMLHNCQUFVLENBQUMvSSxLQUFYLENBQWlCN0gsS0FBakIsQ0FBdUI0USxVQUF2QjtBQUNFdkIsNEJBQWdCO0FBQ2Qsa0JBQUksQ0FBQzVRLEdBRFM7QUFFZHdLLGlCQUZjO0FBR2QwSCxzQkFBVSxDQUFDLENBQUQsQ0FISTtBQUlkQSxzQkFBVSxDQUFDLENBQUQsQ0FKSTtBQUtkckIsb0JBTGM7QUFNZDNKLHNCQU5jLENBRGxCOztBQVNBO0FBQ0Q7QUFDRCxjQUFNa0wsT0FBTyxHQUFHRCxVQUFVLENBQUNqTCxVQUFELENBQTFCO0FBQ0EsY0FBSSxDQUFDak8sSUFBSSxDQUFDbVosT0FBRCxDQUFULEVBQW9CO0FBQ2xCLGtCQUFNLElBQUluYyxLQUFKLGdCQUFrQmlSLFVBQWxCLHdCQUFOO0FBQ0Q7QUFDRCxjQUFJK0ssTUFBSixFQUFZO0FBQ1YsZ0JBQUlHLE9BQU8sQ0FBQ0MsSUFBWixFQUFrQjtBQUNoQjtBQUNEO0FBQ0RELG1CQUFPLENBQUNDLElBQVIsR0FBZSxJQUFmO0FBQ0Q7QUFDRCxjQUFJblYsTUFBTSxHQUFHMFQsZ0JBQWdCO0FBQzNCLGdCQUFJLENBQUM1USxHQURzQjtBQUUzQndLLGVBRjJCO0FBRzNCMEgsb0JBQVUsQ0FBQyxDQUFELENBSGlCO0FBSTNCQSxvQkFBVSxDQUFDLENBQUQsQ0FKaUI7QUFLM0JyQixrQkFMMkI7QUFNM0IzSixvQkFOMkIsQ0FBN0I7O0FBUUFoSyxnQkFBTSxHQUFHdkMsS0FBSyxDQUFDQyxPQUFOLENBQWNzQyxNQUFkLElBQXdCQSxNQUF4QixHQUFpQyxFQUExQztBQUNBO0FBQ0EsY0FBSSw0REFBNERsSCxJQUE1RCxDQUFpRW9jLE9BQU8sQ0FBQ2xiLFFBQVIsRUFBakUsQ0FBSixFQUEwRjtBQUN4RjtBQUNBZ0csa0JBQU0sR0FBR0EsTUFBTSxDQUFDeEMsTUFBUCxDQUFjLFlBQXFCOFAsS0FBckIsQ0FBZCxDQUFUO0FBQ0Q7QUFDRDBHLGFBQUcsQ0FBQ25XLElBQUosQ0FBU3FYLE9BQU8sQ0FBQzdRLEtBQVIsQ0FBYzRRLFVBQWQsRUFBMEJqVixNQUExQixDQUFUO0FBQ0Q7QUFDRixPQTdDRDtBQThDRDtBQUNGLEdBekREOztBQTJEQTtBQUNFcVUsV0FBUyxLQUFLLE9BQWQ7QUFDQUwsS0FBRyxDQUFDL2EsTUFBSixLQUFlLENBRGY7QUFFQSxTQUFPK2EsR0FBRyxDQUFDLENBQUQsQ0FBVixLQUFrQixXQUhwQjtBQUlFO0FBQ0EsV0FBT0EsR0FBRyxDQUFDLENBQUQsQ0FBVjtBQUNEO0FBQ0Y7O0FBRUQsSUFBTW9CLFFBQVEsR0FBRyxFQUFqQjs7QUFFQSxJQUFJbFMsTUFBSjs7QUFFQTtBQUNFQSxRQUFNLEdBQUc5SSxFQUFFLENBQUM0SCxpQkFBSCxHQUF1QmdCLFFBQWhDO0FBQ0Q7O0FBRUQsU0FBU3FTLGdCQUFULEdBQTZCO0FBQzNCLE1BQUksQ0FBQ0MsY0FBYyxFQUFuQixFQUF1QjtBQUNyQjtBQUNEO0FBQ0QsTUFBTUMsVUFBVSxHQUFHMVosTUFBTSxDQUFDd0MsSUFBUCxDQUFZbVgsV0FBVyxDQUFDQyxPQUF4QixDQUFuQjtBQUNBLE1BQUlGLFVBQVUsQ0FBQ3RjLE1BQWYsRUFBdUI7QUFDckJzYyxjQUFVLENBQUNqWCxPQUFYLENBQW1CLFVBQUM0RSxNQUFELEVBQVk7QUFDN0IsVUFBTXdTLFdBQVcsR0FBR04sUUFBUSxDQUFDbFMsTUFBRCxDQUE1QjtBQUNBLFVBQU15UyxZQUFZLEdBQUdILFdBQVcsQ0FBQ0MsT0FBWixDQUFvQnZTLE1BQXBCLENBQXJCO0FBQ0EsVUFBSXdTLFdBQUosRUFBaUI7QUFDZjdaLGNBQU0sQ0FBQzRGLE1BQVAsQ0FBY2lVLFdBQWQsRUFBMkJDLFlBQTNCO0FBQ0QsT0FGRCxNQUVPO0FBQ0xQLGdCQUFRLENBQUNsUyxNQUFELENBQVIsR0FBbUJ5UyxZQUFuQjtBQUNEO0FBQ0YsS0FSRDtBQVNEO0FBQ0Y7O0FBRUROLGdCQUFnQjs7QUFFaEIsSUFBTU8sSUFBSSxHQUFHO0FBQ1gxUyxNQURXO0FBRVYsRUFGVSxDQUFiOztBQUlBLElBQU0yUyxDQUFDLEdBQUdELElBQUksQ0FBQ0MsQ0FBZjtBQUNBLElBQU1DLFNBQVMsR0FBSUYsSUFBSSxDQUFDaEgsS0FBTCxHQUFhO0FBQzlCbUgsY0FEOEIsMEJBQ2Q7QUFDZCxRQUFNQyxPQUFPLEdBQUdKLElBQUksQ0FBQ0EsSUFBTCxDQUFVSyxXQUFWLENBQXNCLFlBQU07QUFDMUMsWUFBSSxDQUFDQyxZQUFMO0FBQ0QsS0FGZSxDQUFoQjtBQUdBLFNBQUtqSyxLQUFMLENBQVcsb0JBQVgsRUFBaUMsWUFBWTtBQUMzQytKLGFBQU87QUFDUixLQUZEO0FBR0QsR0FSNkI7QUFTOUJsRyxTQUFPLEVBQUU7QUFDUHFHLE9BRE8sZUFDRjdaLEdBREUsRUFDRzhaLE1BREgsRUFDVztBQUNoQixhQUFPUCxDQUFDLENBQUN2WixHQUFELEVBQU04WixNQUFOLENBQVI7QUFDRCxLQUhNLEVBVHFCLEVBQWhDOzs7QUFlQSxJQUFNQyxXQUFXLEdBQUdULElBQUksQ0FBQzNTLFNBQXpCO0FBQ0EsSUFBTXFULFdBQVcsR0FBR1YsSUFBSSxDQUFDbFQsU0FBekI7O0FBRUEsU0FBUzZULGFBQVQsQ0FBd0JwYixHQUF4QixFQUE2QnFiLEtBQTdCLEVBQW9DdFQsTUFBcEMsRUFBNEM7QUFDMUMsTUFBTXVULEtBQUssR0FBR3RiLEdBQUcsQ0FBQ3ViLFVBQUosQ0FBZTtBQUMzQnhULFVBQU0sRUFBRUEsTUFBTSxJQUFJMFMsSUFBSSxDQUFDbFQsU0FBTCxFQURTLEVBQWYsQ0FBZDs7QUFHQSxNQUFNaVUsY0FBYyxHQUFHLEVBQXZCO0FBQ0FILE9BQUssQ0FBQ0ksWUFBTixHQUFxQixVQUFBNWEsRUFBRSxFQUFJO0FBQ3pCMmEsa0JBQWMsQ0FBQzlZLElBQWYsQ0FBb0I3QixFQUFwQjtBQUNELEdBRkQ7QUFHQUgsUUFBTSxDQUFDZ2IsY0FBUCxDQUFzQkwsS0FBdEIsRUFBNkIsU0FBN0IsRUFBd0M7QUFDdENNLE9BRHNDLGlCQUMvQjtBQUNMLGFBQU9MLEtBQUssQ0FBQ3ZULE1BQWI7QUFDRCxLQUhxQztBQUl0QzZULE9BSnNDLGVBSWpDQyxDQUppQyxFQUk5QjtBQUNOUCxXQUFLLENBQUN2VCxNQUFOLEdBQWU4VCxDQUFmO0FBQ0FMLG9CQUFjLENBQUNyWSxPQUFmLENBQXVCLFVBQUEyWSxLQUFLLFVBQUlBLEtBQUssQ0FBQ0QsQ0FBRCxDQUFULEVBQTVCO0FBQ0QsS0FQcUMsRUFBeEM7O0FBU0Q7O0FBRUQsU0FBUzFCLGNBQVQsR0FBMkI7QUFDekIsU0FBTyxPQUFPRSxXQUFQLEtBQXVCLFdBQXZCLElBQXNDQSxXQUFXLENBQUNDLE9BQWxELElBQTZELENBQUMsQ0FBQzVaLE1BQU0sQ0FBQ3dDLElBQVAsQ0FBWW1YLFdBQVcsQ0FBQ0MsT0FBeEIsRUFBaUN4YyxNQUF2RztBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTTJFLEtBQUssR0FBRztBQUNaLFFBRFk7QUFFWixRQUZZO0FBR1osU0FIWTtBQUlaLGdCQUpZO0FBS1osZUFMWTtBQU1aLHNCQU5ZLENBQWQ7OztBQVNBLFNBQVNzWixrQkFBVCxHQUErQjtBQUM3Qi9iLGVBQUlDLFNBQUosQ0FBYytiLHFCQUFkLEdBQXNDLFlBQVk7QUFDaEQsUUFBSSxDQUFDLEtBQUtDLGdCQUFWLEVBQTRCO0FBQzFCLFdBQUtBLGdCQUFMLEdBQXdCLElBQUl6VCxZQUFKLEVBQXhCO0FBQ0Q7QUFDRCxXQUFPLEtBQUt5VCxnQkFBWjtBQUNELEdBTEQ7QUFNQSxNQUFNQyxRQUFRLEdBQUdsYyxhQUFJQyxTQUFKLENBQWMyVCxXQUEvQjtBQUNBNVQsZUFBSUMsU0FBSixDQUFjMlQsV0FBZCxHQUE0QixVQUFVaFIsSUFBVixFQUFnQm1HLElBQWhCLEVBQXNCO0FBQ2hELFFBQUluRyxJQUFJLEtBQUssUUFBVCxJQUFxQm1HLElBQXJCLElBQTZCQSxJQUFJLENBQUNvVCxNQUF0QyxFQUE4QztBQUM1QyxXQUFLRixnQkFBTCxHQUF3Qm5TLGVBQWUsQ0FBQ2YsSUFBSSxDQUFDb1QsTUFBTixDQUF2QztBQUNBLGFBQU9wVCxJQUFJLENBQUNvVCxNQUFaO0FBQ0Q7QUFDRCxXQUFPRCxRQUFRLENBQUNqYixJQUFULENBQWMsSUFBZCxFQUFvQjJCLElBQXBCLEVBQTBCbUcsSUFBMUIsQ0FBUDtBQUNELEdBTkQ7QUFPRDs7QUFFRCxTQUFTcVQscUJBQVQsR0FBa0M7QUFDaEMsTUFBTUMsTUFBTSxHQUFHLEVBQWY7QUFDQSxNQUFNQyxPQUFPLEdBQUcsRUFBaEI7O0FBRUF0YyxlQUFJQyxTQUFKLENBQWNzYyxxQkFBZCxHQUFzQyxVQUFVL0YsS0FBVixFQUFpQjtBQUNyRCxRQUFNZ0csR0FBRyxHQUFHSCxNQUFNLENBQUM3RixLQUFELENBQWxCO0FBQ0EsUUFBSSxDQUFDZ0csR0FBTCxFQUFVO0FBQ1JGLGFBQU8sQ0FBQzlGLEtBQUQsQ0FBUCxHQUFpQixJQUFqQjtBQUNBLFdBQUs3RixHQUFMLENBQVMsZ0JBQVQsRUFBMkIsWUFBTTtBQUMvQixlQUFPMkwsT0FBTyxDQUFDOUYsS0FBRCxDQUFkO0FBQ0QsT0FGRDtBQUdEO0FBQ0QsV0FBT2dHLEdBQVA7QUFDRCxHQVREOztBQVdBeGMsZUFBSUMsU0FBSixDQUFjd2MscUJBQWQsR0FBc0MsVUFBVWpHLEtBQVYsRUFBaUJyUyxJQUFqQixFQUF1QmhELEdBQXZCLEVBQTRCO0FBQ2hFLFFBQU1zQyxJQUFJLEdBQUc0WSxNQUFNLENBQUM3RixLQUFELENBQW5CO0FBQ0EsUUFBSS9TLElBQUosRUFBVTtBQUNSLFVBQU1pWixNQUFNLEdBQUdqWixJQUFJLENBQUNVLElBQUQsQ0FBSixJQUFjLEVBQTdCO0FBQ0EsYUFBT2hELEdBQUcsR0FBR3ViLE1BQU0sQ0FBQ3ZiLEdBQUQsQ0FBVCxHQUFpQnViLE1BQTNCO0FBQ0QsS0FIRCxNQUdPO0FBQ0xKLGFBQU8sQ0FBQzlGLEtBQUQsQ0FBUCxHQUFpQixJQUFqQjtBQUNBLFdBQUs3RixHQUFMLENBQVMsZ0JBQVQsRUFBMkIsWUFBTTtBQUMvQixlQUFPMkwsT0FBTyxDQUFDOUYsS0FBRCxDQUFkO0FBQ0QsT0FGRDtBQUdEO0FBQ0YsR0FYRDs7QUFhQXhXLGVBQUlDLFNBQUosQ0FBYzBjLHFCQUFkLEdBQXNDLFVBQVV4WSxJQUFWLEVBQWdCNEIsS0FBaEIsRUFBdUI7QUFDM0QsUUFBTXVPLE1BQU0sR0FBRyxLQUFLZ0YsUUFBTCxDQUFjc0QsU0FBZCxDQUF3QnBHLEtBQXZDO0FBQ0EsUUFBSWxDLE1BQUosRUFBWTtBQUNWLFVBQU1rQyxLQUFLLEdBQUdsQyxNQUFNLENBQUM3VixLQUFQLENBQWEsR0FBYixFQUFrQixDQUFsQixDQUFkO0FBQ0EsVUFBTWllLE1BQU0sR0FBR0wsTUFBTSxDQUFDN0YsS0FBRCxDQUFOLEdBQWdCNkYsTUFBTSxDQUFDN0YsS0FBRCxDQUFOLElBQWlCLEVBQWhEO0FBQ0FrRyxZQUFNLENBQUN2WSxJQUFELENBQU4sR0FBZTRCLEtBQWY7QUFDQSxVQUFJdVcsT0FBTyxDQUFDOUYsS0FBRCxDQUFYLEVBQW9CO0FBQ2xCOEYsZUFBTyxDQUFDOUYsS0FBRCxDQUFQLENBQWV1RSxZQUFmO0FBQ0Q7QUFDRjtBQUNGLEdBVkQ7O0FBWUEvYSxlQUFJeVQsS0FBSixDQUFVO0FBQ1JvSixhQURRLHVCQUNLO0FBQ1gsVUFBTUQsU0FBUyxHQUFHLEtBQUt0RCxRQUFMLENBQWNzRCxTQUFoQztBQUNBLFVBQU1wRyxLQUFLLEdBQUdvRyxTQUFTLElBQUlBLFNBQVMsQ0FBQ3BHLEtBQXJDO0FBQ0EsVUFBSUEsS0FBSixFQUFXO0FBQ1QsZUFBTzZGLE1BQU0sQ0FBQzdGLEtBQUQsQ0FBYjtBQUNBLGVBQU84RixPQUFPLENBQUM5RixLQUFELENBQWQ7QUFDRDtBQUNGLEtBUk8sRUFBVjs7QUFVRDs7QUFFRCxTQUFTc0csWUFBVCxDQUF1QmpLLEVBQXZCOzs7QUFHRyxLQUZEQyxLQUVDLFNBRkRBLEtBRUMsQ0FERGlLLFFBQ0MsU0FEREEsUUFDQztBQUNEaEIsb0JBQWtCO0FBQ2xCO0FBQ0VLLHlCQUFxQjtBQUN0QjtBQUNELE1BQUl2SixFQUFFLENBQUN5RyxRQUFILENBQVkwRCxLQUFoQixFQUF1QjtBQUNyQmhkLGlCQUFJQyxTQUFKLENBQWNnZCxNQUFkLEdBQXVCcEssRUFBRSxDQUFDeUcsUUFBSCxDQUFZMEQsS0FBbkM7QUFDRDtBQUNEamQsWUFBVSxDQUFDQyxZQUFELENBQVY7O0FBRUFBLGVBQUlDLFNBQUosQ0FBY2lkLE1BQWQsR0FBdUIsWUFBdkI7O0FBRUFsZCxlQUFJeVQsS0FBSixDQUFVO0FBQ1JtSCxnQkFEUSwwQkFDUTtBQUNkLFVBQUksQ0FBQyxLQUFLdEIsUUFBTCxDQUFjdEcsTUFBbkIsRUFBMkI7QUFDekI7QUFDRDs7QUFFRCxXQUFLQSxNQUFMLEdBQWMsS0FBS3NHLFFBQUwsQ0FBY3RHLE1BQTVCOztBQUVBLFdBQUtELEdBQUw7QUFDRXRQLFlBQUksRUFBRSxFQURSO0FBRUcsV0FBS3VQLE1BRlIsRUFFaUIsS0FBS3NHLFFBQUwsQ0FBY3ZILFVBRi9COzs7QUFLQSxXQUFLd0gsTUFBTCxHQUFjLEtBQUtELFFBQUwsQ0FBY3ZILFVBQTVCOztBQUVBLGFBQU8sS0FBS3VILFFBQUwsQ0FBY3RHLE1BQXJCO0FBQ0EsYUFBTyxLQUFLc0csUUFBTCxDQUFjdkgsVUFBckI7QUFDQSxVQUFJLEtBQUtpQixNQUFMLEtBQWdCLE1BQWhCLElBQTBCLE9BQU92TCxNQUFQLEtBQWtCLFVBQWhELEVBQTRELENBQUU7QUFDNUQsWUFBTUQsR0FBRyxHQUFHQyxNQUFNLEVBQWxCO0FBQ0EsWUFBSUQsR0FBRyxDQUFDRyxHQUFKLElBQVdILEdBQUcsQ0FBQ0csR0FBSixDQUFRd1YsS0FBdkIsRUFBOEI7QUFDNUIsZUFBS0MsS0FBTCxHQUFhNVYsR0FBRyxDQUFDRyxHQUFKLENBQVF3VixLQUFyQjtBQUNEO0FBQ0Y7QUFDRCxVQUFJLEtBQUtuSyxNQUFMLEtBQWdCLEtBQXBCLEVBQTJCO0FBQ3pCK0osZ0JBQVEsQ0FBQyxJQUFELENBQVI7QUFDQW5LLGlCQUFTLENBQUMsSUFBRCxFQUFPRSxLQUFQLENBQVQ7QUFDRDtBQUNGLEtBM0JPLEVBQVY7OztBQThCQSxNQUFNdUssVUFBVSxHQUFHO0FBQ2pCQyxZQURpQixvQkFDUHZVLElBRE8sRUFDRDtBQUNkLFVBQUksS0FBS3BCLEdBQVQsRUFBYyxDQUFFO0FBQ2Q7QUFDRDs7QUFFRCxXQUFLQSxHQUFMLEdBQVdrTCxFQUFYOztBQUVBLFdBQUtsTCxHQUFMLENBQVNvTCxHQUFULEdBQWU7QUFDYnZMLFdBQUcsRUFBRSxJQURRLEVBQWY7OztBQUlBLFdBQUtHLEdBQUwsQ0FBUzRSLE1BQVQsR0FBa0IsSUFBbEI7QUFDQTtBQUNBLFdBQUs1UixHQUFMLENBQVM0VixVQUFULEdBQXNCLEtBQUtBLFVBQTNCOztBQUVBLFdBQUs1VixHQUFMLENBQVM2VixVQUFULEdBQXNCLElBQXRCO0FBQ0EsV0FBSzdWLEdBQUwsQ0FBU2lNLFdBQVQsQ0FBcUIsU0FBckIsRUFBZ0M3SyxJQUFoQzs7QUFFQSxXQUFLcEIsR0FBTCxDQUFTaU0sV0FBVCxDQUFxQixVQUFyQixFQUFpQzdLLElBQWpDO0FBQ0QsS0FwQmdCLEVBQW5COzs7QUF1QkE7QUFDQXNVLFlBQVUsQ0FBQ0UsVUFBWCxHQUF3QjFLLEVBQUUsQ0FBQ3lHLFFBQUgsQ0FBWWlFLFVBQVosSUFBMEIsRUFBbEQ7QUFDQTtBQUNBLE1BQU01SSxPQUFPLEdBQUc5QixFQUFFLENBQUN5RyxRQUFILENBQVkzRSxPQUE1QjtBQUNBLE1BQUlBLE9BQUosRUFBYTtBQUNYalUsVUFBTSxDQUFDd0MsSUFBUCxDQUFZeVIsT0FBWixFQUFxQnhSLE9BQXJCLENBQTZCLFVBQUFnQixJQUFJLEVBQUk7QUFDbkNrWixnQkFBVSxDQUFDbFosSUFBRCxDQUFWLEdBQW1Cd1EsT0FBTyxDQUFDeFEsSUFBRCxDQUExQjtBQUNELEtBRkQ7QUFHRDs7QUFFRGlYLGVBQWEsQ0FBQ3BiLFlBQUQsRUFBTTZTLEVBQU4sRUFBVTVULEVBQUUsQ0FBQzRILGlCQUFILEdBQXVCZ0IsUUFBdkIsSUFBbUMsU0FBN0MsQ0FBYjs7QUFFQTZMLFdBQVMsQ0FBQzJKLFVBQUQsRUFBYTVhLEtBQWIsQ0FBVDs7QUFFQSxTQUFPNGEsVUFBUDtBQUNEOztBQUVELFNBQVNJLGFBQVQsQ0FBd0I1SyxFQUF4QixFQUE0QjZLLE1BQTVCLEVBQW9DO0FBQ2xDLE1BQU1DLFNBQVMsR0FBRzlLLEVBQUUsQ0FBQzhLLFNBQXJCO0FBQ0E7QUFDQSxPQUFLLElBQUl4ZixDQUFDLEdBQUd3ZixTQUFTLENBQUM3ZixNQUFWLEdBQW1CLENBQWhDLEVBQW1DSyxDQUFDLElBQUksQ0FBeEMsRUFBMkNBLENBQUMsRUFBNUMsRUFBZ0Q7QUFDOUMsUUFBTXlmLE9BQU8sR0FBR0QsU0FBUyxDQUFDeGYsQ0FBRCxDQUF6QjtBQUNBLFFBQUl5ZixPQUFPLENBQUNyRSxNQUFSLENBQWVoRixPQUFmLEtBQTJCbUosTUFBL0IsRUFBdUM7QUFDckMsYUFBT0UsT0FBUDtBQUNEO0FBQ0Y7QUFDRDtBQUNBLE1BQUlDLFFBQUo7QUFDQSxPQUFLLElBQUkxZixFQUFDLEdBQUd3ZixTQUFTLENBQUM3ZixNQUFWLEdBQW1CLENBQWhDLEVBQW1DSyxFQUFDLElBQUksQ0FBeEMsRUFBMkNBLEVBQUMsRUFBNUMsRUFBZ0Q7QUFDOUMwZixZQUFRLEdBQUdKLGFBQWEsQ0FBQ0UsU0FBUyxDQUFDeGYsRUFBRCxDQUFWLEVBQWV1ZixNQUFmLENBQXhCO0FBQ0EsUUFBSUcsUUFBSixFQUFjO0FBQ1osYUFBT0EsUUFBUDtBQUNEO0FBQ0Y7QUFDRjs7QUFFRCxTQUFTckksWUFBVCxDQUF1QnRSLE9BQXZCLEVBQWdDO0FBQzlCLFNBQU80WixRQUFRLENBQUM1WixPQUFELENBQWY7QUFDRDs7QUFFRCxTQUFTNlosVUFBVCxDQUFxQjVMLEtBQXJCLEVBQTRCOzs7O0FBSXRCQSxPQUFLLENBQUMrRSxNQUFOLElBQWdCL0UsS0FBSyxDQUFDcE0sS0FKQSxDQUV4QjJYLE1BRndCLFNBRXhCQSxNQUZ3QixDQUd4QnZLLFVBSHdCLFNBR3hCQSxVQUh3QixFQUlPOztBQUVqQyxNQUFJMEssUUFBSjs7QUFFQSxNQUFJSCxNQUFKLEVBQVk7QUFDVkcsWUFBUSxHQUFHSixhQUFhLENBQUMsS0FBSzlWLEdBQU4sRUFBVytWLE1BQVgsQ0FBeEI7QUFDRDs7QUFFRCxNQUFJLENBQUNHLFFBQUwsRUFBZTtBQUNiQSxZQUFRLEdBQUcsS0FBS2xXLEdBQWhCO0FBQ0Q7O0FBRUR3TCxZQUFVLENBQUM2SyxNQUFYLEdBQW9CSCxRQUFwQjtBQUNEOztBQUVELElBQU0vSyxLQUFLLEdBQUcsQ0FBQyxXQUFELEVBQWMsZUFBZCxFQUErQixZQUEvQixFQUE2QyxZQUE3QyxDQUFkOztBQUVBLFNBQVNtTCxNQUFULEdBQW1CO0FBQ2pCLFNBQU8sS0FBS0MsVUFBTCxLQUFvQixDQUFwQixJQUF5QixLQUFLQyxVQUFMLEtBQW9CLENBQXBEO0FBQ0Q7O0FBRUQsU0FBU3BCLFFBQVQsQ0FBbUJsSyxFQUFuQixFQUF1QjtBQUNyQixNQUFNZCxVQUFVLEdBQUdjLEVBQUUsQ0FBQzBHLE1BQXRCO0FBQ0E7QUFDQSxNQUFNNkUsWUFBWSxHQUFHbFQsUUFBUSxDQUFDak0sRUFBRSxDQUFDNEgsaUJBQUgsR0FBdUJ3WCxVQUF2QixDQUFrQzVmLEtBQWxDLENBQXdDLEdBQXhDLEVBQTZDLENBQTdDLENBQUQsQ0FBN0I7QUFDQSxNQUFJMmYsWUFBWSxHQUFHLEVBQW5CLEVBQXVCO0FBQ3JCMWQsVUFBTSxDQUFDZ2IsY0FBUCxDQUFzQjdJLEVBQXRCLEVBQTBCLE9BQTFCLEVBQW1DO0FBQ2pDOEksU0FEaUMsaUJBQzFCO0FBQ0wsWUFBTTJDLEtBQUssR0FBRyxFQUFkO0FBQ0EsWUFBTUMsVUFBVSxHQUFHeE0sVUFBVSxDQUFDeU0sbUJBQVgsQ0FBK0IsVUFBL0IsQ0FBbkI7QUFDQUQsa0JBQVUsQ0FBQ3BiLE9BQVgsQ0FBbUIsVUFBQXNiLFNBQVMsRUFBSTtBQUM5QixjQUFNQyxHQUFHLEdBQUdELFNBQVMsQ0FBQzlGLE9BQVYsQ0FBa0IrRixHQUE5QjtBQUNBSixlQUFLLENBQUNJLEdBQUQsQ0FBTCxHQUFhRCxTQUFTLENBQUM5VyxHQUFWLElBQWlCOFcsU0FBOUI7QUFDRCxTQUhEO0FBSUEsWUFBTUUsYUFBYSxHQUFHNU0sVUFBVSxDQUFDeU0sbUJBQVgsQ0FBK0IsaUJBQS9CLENBQXRCO0FBQ0FHLHFCQUFhLENBQUN4YixPQUFkLENBQXNCLFVBQUFzYixTQUFTLEVBQUk7QUFDakMsY0FBTUMsR0FBRyxHQUFHRCxTQUFTLENBQUM5RixPQUFWLENBQWtCK0YsR0FBOUI7QUFDQSxjQUFJLENBQUNKLEtBQUssQ0FBQ0ksR0FBRCxDQUFWLEVBQWlCO0FBQ2ZKLGlCQUFLLENBQUNJLEdBQUQsQ0FBTCxHQUFhLEVBQWI7QUFDRDtBQUNESixlQUFLLENBQUNJLEdBQUQsQ0FBTCxDQUFXaGMsSUFBWCxDQUFnQitiLFNBQVMsQ0FBQzlXLEdBQVYsSUFBaUI4VyxTQUFqQztBQUNELFNBTkQ7QUFPQSxlQUFPSCxLQUFQO0FBQ0QsT0FqQmdDLEVBQW5DOztBQW1CRCxHQXBCRCxNQW9CTztBQUNMdk0sY0FBVSxDQUFDeU0sbUJBQVgsQ0FBK0IsVUFBL0IsRUFBMkMsVUFBQ0QsVUFBRCxFQUFnQjtBQUN6REEsZ0JBQVUsQ0FBQ3BiLE9BQVgsQ0FBbUIsVUFBQXNiLFNBQVMsRUFBSTtBQUM5QixZQUFNQyxHQUFHLEdBQUdELFNBQVMsQ0FBQzlGLE9BQVYsQ0FBa0IrRixHQUE5QjtBQUNBN0wsVUFBRSxDQUFDeUwsS0FBSCxDQUFTSSxHQUFULElBQWdCRCxTQUFTLENBQUM5VyxHQUFWLElBQWlCOFcsU0FBakM7QUFDRCxPQUhEO0FBSUQsS0FMRDtBQU1BMU0sY0FBVSxDQUFDeU0sbUJBQVgsQ0FBK0IsaUJBQS9CLEVBQWtELFVBQUNHLGFBQUQsRUFBbUI7QUFDbkVBLG1CQUFhLENBQUN4YixPQUFkLENBQXNCLFVBQUFzYixTQUFTLEVBQUk7QUFDakMsWUFBTUMsR0FBRyxHQUFHRCxTQUFTLENBQUM5RixPQUFWLENBQWtCK0YsR0FBOUI7QUFDQSxZQUFJLENBQUM3TCxFQUFFLENBQUN5TCxLQUFILENBQVNJLEdBQVQsQ0FBTCxFQUFvQjtBQUNsQjdMLFlBQUUsQ0FBQ3lMLEtBQUgsQ0FBU0ksR0FBVCxJQUFnQixFQUFoQjtBQUNEO0FBQ0Q3TCxVQUFFLENBQUN5TCxLQUFILENBQVNJLEdBQVQsRUFBY2hjLElBQWQsQ0FBbUIrYixTQUFTLENBQUM5VyxHQUFWLElBQWlCOFcsU0FBcEM7QUFDRCxPQU5EO0FBT0QsS0FSRDtBQVNEO0FBQ0Y7O0FBRUQsSUFBTUcsU0FBUyxHQUFHbGUsTUFBTSxDQUFDYSxNQUFQLENBQWMsSUFBZCxDQUFsQjs7QUFFQSxTQUFTc2QsWUFBVDs7O0FBR0csS0FGRG5CLE1BRUMsU0FGREEsTUFFQyxDQUREM0wsVUFDQyxTQUREQSxVQUNDO0FBQ0Q7QUFDQSxNQUFNK00sTUFBTSxHQUFHLENBQUMvTSxVQUFVLENBQUNvTSxVQUFYLElBQXlCcE0sVUFBVSxDQUFDbU0sVUFBckMsSUFBbUQsRUFBbEU7QUFDQSxNQUFNYSxTQUFTLEdBQUdoTixVQUFVLENBQUNpTixhQUFYLEdBQTJCLEVBQTdDOztBQUVBSixXQUFTLENBQUNHLFNBQVMsR0FBRyxHQUFaLEdBQWtCRCxNQUFuQixDQUFULEdBQXNDL00sVUFBVSxDQUFDcEssR0FBakQ7O0FBRUEsT0FBS3NLLFlBQUwsQ0FBa0IsS0FBbEIsRUFBeUI7QUFDdkJ5TCxVQUFNLEVBQU5BLE1BRHVCO0FBRXZCb0IsVUFBTSxFQUFOQSxNQUZ1QjtBQUd2QkMsYUFBUyxFQUFUQSxTQUh1QixFQUF6Qjs7QUFLRDs7QUFFRCxTQUFTRSxZQUFUOzs7Ozs7QUFNRywwQkFMRC9ILE1BS0MsQ0FKQ3dHLE1BSUQsZ0JBSkNBLE1BSUQsQ0FIQ29CLE1BR0QsZ0JBSENBLE1BR0QsQ0FGQ0MsU0FFRCxnQkFGQ0EsU0FFRDtBQUNELE1BQU1sTSxFQUFFLEdBQUcrTCxTQUFTLENBQUNHLFNBQVMsR0FBRyxHQUFaLEdBQWtCRCxNQUFuQixDQUFwQjtBQUNBLE1BQUksQ0FBQ2pNLEVBQUwsRUFBUztBQUNQO0FBQ0Q7O0FBRUQsTUFBSWdMLFFBQUo7O0FBRUEsTUFBSUgsTUFBSixFQUFZO0FBQ1ZHLFlBQVEsR0FBR0osYUFBYSxDQUFDLEtBQUs5VixHQUFOLEVBQVcrVixNQUFYLENBQXhCO0FBQ0Q7O0FBRUQsTUFBSSxDQUFDRyxRQUFMLEVBQWU7QUFDYkEsWUFBUSxHQUFHLEtBQUtsVyxHQUFoQjtBQUNEOztBQUVEa0wsSUFBRSxDQUFDd0csT0FBSCxHQUFhd0UsUUFBYjtBQUNBaEwsSUFBRSxDQUFDcU0sS0FBSCxHQUFXckIsUUFBUSxDQUFDcUIsS0FBcEI7QUFDQXJCLFVBQVEsQ0FBQ0YsU0FBVCxDQUFtQmpiLElBQW5CLENBQXdCbVEsRUFBeEI7O0FBRUFBLElBQUUsQ0FBQ2UsV0FBSCxDQUFlLFNBQWY7QUFDQWYsSUFBRSxDQUFDZSxXQUFILENBQWUsYUFBZjtBQUNBZixJQUFFLENBQUMySyxVQUFILEdBQWdCLElBQWhCO0FBQ0EzSyxJQUFFLENBQUNlLFdBQUgsQ0FBZSxTQUFmO0FBQ0FmLElBQUUsQ0FBQ2UsV0FBSCxDQUFlLFNBQWY7QUFDRDs7QUFFRCxTQUFTdUwsUUFBVCxDQUFtQnRNLEVBQW5CLEVBQXVCO0FBQ3JCN1MsZUFBSUMsU0FBSixDQUFjbWYsVUFBZCxHQUEyQixJQUEzQixDQURxQixDQUNZOztBQUVqQ3BmLGVBQUl5VCxLQUFKLENBQVU7QUFDUjRMLFdBRFEscUJBQ0csQ0FBRTtBQUNYLFVBQUksS0FBS3JNLE1BQUwsS0FBZ0IsS0FBcEIsRUFBMkI7QUFDekI7QUFDRSxhQUFLQSxNQUFMLEtBQWdCLE1BQWhCO0FBQ1UsU0FBQyxLQUFLdUcsTUFBTCxDQUFZK0YsS0FEdkI7QUFFVSxhQUFLL0YsTUFBTCxDQUFZZ0csU0FIeEI7QUFJRTtBQUNBLGVBQUtoRyxNQUFMLENBQVkrRixLQUFaLEdBQW9CLEtBQUsvRixNQUFMLENBQVlnRyxTQUFoQztBQUNEOztBQUVEeEMsZ0JBQVEsQ0FBQyxJQUFELENBQVI7O0FBRUEsYUFBS3lDLGlCQUFMLENBQXVCLElBQXZCO0FBQ0EsYUFBS0MsY0FBTCxDQUFvQixJQUFwQjtBQUNEO0FBQ0YsS0FoQk8sRUFBVjs7O0FBbUJBLFNBQU8zQyxZQUFZLENBQUNqSyxFQUFELEVBQUs7QUFDdEJDLFNBQUssRUFBTEEsS0FEc0I7QUFFdEJpSyxZQUFRLEVBQUUsb0JBQVksQ0FBRSxDQUZGLENBRUc7QUFGSCxHQUFMLENBQW5CO0FBSUQ7O0FBRUQsU0FBUzJDLFNBQVQsQ0FBb0I3TSxFQUFwQixFQUF3QjtBQUN0QjhNLEtBQUcsQ0FBQ1IsUUFBUSxDQUFDdE0sRUFBRCxDQUFULENBQUg7QUFDQSxTQUFPQSxFQUFQO0FBQ0Q7O0FBRUQsSUFBTStNLGVBQWUsR0FBRyxVQUF4QjtBQUNBLElBQU1DLHFCQUFxQixHQUFHLFNBQXhCQSxxQkFBd0IsQ0FBQWxoQixDQUFDLFVBQUksTUFBTUEsQ0FBQyxDQUFDQyxVQUFGLENBQWEsQ0FBYixFQUFnQkMsUUFBaEIsQ0FBeUIsRUFBekIsQ0FBVixFQUEvQjtBQUNBLElBQU1paEIsT0FBTyxHQUFHLE1BQWhCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQU1DLE1BQU0sR0FBRyxTQUFUQSxNQUFTLENBQUF2aUIsR0FBRyxVQUFJd2lCLGtCQUFrQixDQUFDeGlCLEdBQUQsQ0FBbEI7QUFDbkJFLFNBRG1CLENBQ1hraUIsZUFEVyxFQUNNQyxxQkFETjtBQUVuQm5pQixTQUZtQixDQUVYb2lCLE9BRlcsRUFFRixHQUZFLENBQUosRUFBbEI7O0FBSUEsU0FBU0csY0FBVCxDQUF5QmpmLEdBQXpCLEVBQWtELEtBQXBCa2YsU0FBb0IsdUVBQVJILE1BQVE7QUFDaEQsTUFBTTNkLEdBQUcsR0FBR3BCLEdBQUcsR0FBR04sTUFBTSxDQUFDd0MsSUFBUCxDQUFZbEMsR0FBWixFQUFpQnRDLEdBQWpCLENBQXFCLFVBQUF5QyxHQUFHLEVBQUk7QUFDNUMsUUFBTWdmLEdBQUcsR0FBR25mLEdBQUcsQ0FBQ0csR0FBRCxDQUFmOztBQUVBLFFBQUlnZixHQUFHLEtBQUtDLFNBQVosRUFBdUI7QUFDckIsYUFBTyxFQUFQO0FBQ0Q7O0FBRUQsUUFBSUQsR0FBRyxLQUFLLElBQVosRUFBa0I7QUFDaEIsYUFBT0QsU0FBUyxDQUFDL2UsR0FBRCxDQUFoQjtBQUNEOztBQUVELFFBQUltQixLQUFLLENBQUNDLE9BQU4sQ0FBYzRkLEdBQWQsQ0FBSixFQUF3QjtBQUN0QixVQUFNbmlCLE1BQU0sR0FBRyxFQUFmO0FBQ0FtaUIsU0FBRyxDQUFDaGQsT0FBSixDQUFZLFVBQUFrZCxJQUFJLEVBQUk7QUFDbEIsWUFBSUEsSUFBSSxLQUFLRCxTQUFiLEVBQXdCO0FBQ3RCO0FBQ0Q7QUFDRCxZQUFJQyxJQUFJLEtBQUssSUFBYixFQUFtQjtBQUNqQnJpQixnQkFBTSxDQUFDMEUsSUFBUCxDQUFZd2QsU0FBUyxDQUFDL2UsR0FBRCxDQUFyQjtBQUNELFNBRkQsTUFFTztBQUNMbkQsZ0JBQU0sQ0FBQzBFLElBQVAsQ0FBWXdkLFNBQVMsQ0FBQy9lLEdBQUQsQ0FBVCxHQUFpQixHQUFqQixHQUF1QitlLFNBQVMsQ0FBQ0csSUFBRCxDQUE1QztBQUNEO0FBQ0YsT0FURDtBQVVBLGFBQU9yaUIsTUFBTSxDQUFDYyxJQUFQLENBQVksR0FBWixDQUFQO0FBQ0Q7O0FBRUQsV0FBT29oQixTQUFTLENBQUMvZSxHQUFELENBQVQsR0FBaUIsR0FBakIsR0FBdUIrZSxTQUFTLENBQUNDLEdBQUQsQ0FBdkM7QUFDRCxHQTNCaUIsRUEyQmZoWCxNQTNCZSxDQTJCUixVQUFBbVgsQ0FBQyxVQUFJQSxDQUFDLENBQUN4aUIsTUFBRixHQUFXLENBQWYsRUEzQk8sRUEyQldnQixJQTNCWCxDQTJCZ0IsR0EzQmhCLENBQUgsR0EyQjBCLElBM0J6QztBQTRCQSxTQUFPc0QsR0FBRyxjQUFPQSxHQUFQLElBQWUsRUFBekI7QUFDRDs7QUFFRCxTQUFTbWUsa0JBQVQsQ0FBNkJDLG1CQUE3Qjs7O0FBR1EsaUZBQUosRUFBSSxDQUZOdkMsTUFFTSxTQUZOQSxNQUVNLENBRE5ZLFlBQ00sU0FETkEsWUFDTTtBQUM2QmhMLGtCQUFnQixDQUFDN1QsWUFBRCxFQUFNd2dCLG1CQUFOLENBRDdDLDJEQUNDMU0sWUFERCx5QkFDZVgsVUFEZjs7QUFHTixNQUFNalAsT0FBTztBQUNYdWMsaUJBQWEsRUFBRSxJQURKO0FBRVhDLGtCQUFjLEVBQUUsSUFGTDtBQUdQdk4sWUFBVSxDQUFDalAsT0FBWCxJQUFzQixFQUhmLENBQWI7OztBQU1BLE1BQU15YyxnQkFBZ0IsR0FBRztBQUN2QnpjLFdBQU8sRUFBUEEsT0FEdUI7QUFFdkJULFFBQUksRUFBRWdSLFFBQVEsQ0FBQ3RCLFVBQUQsRUFBYW5ULGFBQUlDLFNBQWpCLENBRlM7QUFHdkJ5VixhQUFTLEVBQUVILGFBQWEsQ0FBQ3BDLFVBQUQsRUFBYXFDLFlBQWIsQ0FIRDtBQUl2QlMsY0FBVSxFQUFFQyxjQUFjLENBQUMvQyxVQUFVLENBQUM0QyxLQUFaLEVBQW1CLEtBQW5CLEVBQTBCNUMsVUFBVSxDQUFDeU4sTUFBckMsQ0FKSDtBQUt2QnJPLGFBQVMsRUFBRTtBQUNUc08sY0FEUyxzQkFDRztBQUNWLFlBQU01SyxVQUFVLEdBQUcsS0FBS0EsVUFBeEI7O0FBRUEsWUFBTS9SLE9BQU8sR0FBRztBQUNkOE8sZ0JBQU0sRUFBRWlMLE1BQU0sQ0FBQ2hkLElBQVAsQ0FBWSxJQUFaLElBQW9CLE1BQXBCLEdBQTZCLFdBRHZCO0FBRWQ4USxvQkFBVSxFQUFFLElBRkU7QUFHZDZLLG1CQUFTLEVBQUUzRyxVQUhHLEVBQWhCOzs7QUFNQTVCLGtCQUFVLENBQUM0QixVQUFVLENBQUNPLEtBQVosRUFBbUIsSUFBbkIsQ0FBVjs7QUFFQTtBQUNBcUksb0JBQVksQ0FBQzVkLElBQWIsQ0FBa0IsSUFBbEIsRUFBd0I7QUFDdEJ5YyxnQkFBTSxFQUFFLEtBQUtsSixRQURTO0FBRXRCckIsb0JBQVUsRUFBRWpQLE9BRlUsRUFBeEI7OztBQUtBO0FBQ0EsYUFBS3lELEdBQUwsR0FBVyxJQUFJbU0sWUFBSixDQUFpQjVQLE9BQWpCLENBQVg7O0FBRUE7QUFDQThQLGlCQUFTLENBQUMsS0FBS3JNLEdBQU4sRUFBV3NPLFVBQVUsQ0FBQ2hDLFFBQXRCLENBQVQ7O0FBRUE7QUFDQSxhQUFLdE0sR0FBTCxDQUFTbVosTUFBVDtBQUNELE9BMUJRO0FBMkJUQyxXQTNCUyxtQkEyQkE7QUFDUDtBQUNBO0FBQ0EsWUFBSSxLQUFLcFosR0FBVCxFQUFjO0FBQ1osZUFBS0EsR0FBTCxDQUFTNlYsVUFBVCxHQUFzQixJQUF0QjtBQUNBLGVBQUs3VixHQUFMLENBQVNpTSxXQUFULENBQXFCLFNBQXJCO0FBQ0EsZUFBS2pNLEdBQUwsQ0FBU2lNLFdBQVQsQ0FBcUIsU0FBckI7QUFDRDtBQUNGLE9BbkNRO0FBb0NUb04sY0FwQ1Msc0JBb0NHO0FBQ1YsYUFBS3JaLEdBQUwsSUFBWSxLQUFLQSxHQUFMLENBQVNzWixRQUFULEVBQVo7QUFDRCxPQXRDUSxFQUxZOztBQTZDdkJDLGlCQUFhLEVBQUU7QUFDYkMsVUFEYSxnQkFDUHBZLElBRE8sRUFDRDtBQUNWLGFBQUtwQixHQUFMLElBQVksS0FBS0EsR0FBTCxDQUFTaU0sV0FBVCxDQUFxQixZQUFyQixFQUFtQzdLLElBQW5DLENBQVo7QUFDRCxPQUhZO0FBSWJxWSxVQUphLGtCQUlMO0FBQ04sYUFBS3paLEdBQUwsSUFBWSxLQUFLQSxHQUFMLENBQVNpTSxXQUFULENBQXFCLFlBQXJCLENBQVo7QUFDRCxPQU5ZO0FBT2J5TixZQVBhLGtCQU9MQyxJQVBLLEVBT0M7QUFDWixhQUFLM1osR0FBTCxJQUFZLEtBQUtBLEdBQUwsQ0FBU2lNLFdBQVQsQ0FBcUIsY0FBckIsRUFBcUMwTixJQUFyQyxDQUFaO0FBQ0QsT0FUWSxFQTdDUTs7QUF3RHZCM00sV0FBTyxFQUFFO0FBQ1A0TSxTQUFHLEVBQUV4RCxVQURFO0FBRVB5RCxTQUFHLEVBQUVoSSxXQUZFLEVBeERjLEVBQXpCOzs7QUE2REE7QUFDQSxNQUFJckcsVUFBVSxDQUFDc08sZUFBZixFQUFnQztBQUM5QmQsb0JBQWdCLENBQUNjLGVBQWpCLEdBQW1DdE8sVUFBVSxDQUFDc08sZUFBOUM7QUFDRDs7QUFFRCxNQUFJbmYsS0FBSyxDQUFDQyxPQUFOLENBQWM0USxVQUFVLENBQUN1TyxjQUF6QixDQUFKLEVBQThDO0FBQzVDdk8sY0FBVSxDQUFDdU8sY0FBWCxDQUEwQnZlLE9BQTFCLENBQWtDLFVBQUF3ZSxVQUFVLEVBQUk7QUFDOUNoQixzQkFBZ0IsQ0FBQ2hNLE9BQWpCLENBQXlCZ04sVUFBekIsSUFBdUMsVUFBVTVZLElBQVYsRUFBZ0I7QUFDckQsZUFBTyxLQUFLcEIsR0FBTCxDQUFTZ2EsVUFBVCxFQUFxQjVZLElBQXJCLENBQVA7QUFDRCxPQUZEO0FBR0QsS0FKRDtBQUtEOztBQUVELE1BQUlrVixNQUFKLEVBQVk7QUFDVixXQUFPMEMsZ0JBQVA7QUFDRDtBQUNELFNBQU8sQ0FBQ0EsZ0JBQUQsRUFBbUI3TSxZQUFuQixDQUFQO0FBQ0Q7O0FBRUQsSUFBTXlLLFVBQVUsR0FBRyxFQUFuQjs7QUFFQSxTQUFTcUQsY0FBVCxDQUF5QnpPLFVBQXpCLEVBQXFDO0FBQ01vTixvQkFBa0IsQ0FBQ3BOLFVBQUQsQ0FEeEIsK0RBQzVCd04sZ0JBRDRCLDJCQUNWN00sWUFEVTs7QUFHbkM7QUFDQTZNLGtCQUFnQixDQUFDcE8sU0FBakIsQ0FBMkI4TSxPQUEzQixHQUFxQyxTQUFTQSxPQUFULEdBQW9CO0FBQ3ZEZCxjQUFVLENBQUM3YixJQUFYLENBQWdCLElBQWhCO0FBQ0QsR0FGRDs7QUFJQWllLGtCQUFnQixDQUFDcE8sU0FBakIsQ0FBMkJzTyxRQUEzQixHQUFzQyxTQUFTQSxRQUFULEdBQXFCO0FBQ3pELFNBQUtnQixvQkFBTCxHQUE0QixZQUFZO0FBQ3RDLFVBQU01TCxVQUFVLEdBQUcsS0FBS0EsVUFBeEI7O0FBRUEsVUFBTS9SLE9BQU8sR0FBRztBQUNkOE8sY0FBTSxFQUFFaUwsTUFBTSxDQUFDaGQsSUFBUCxDQUFZLElBQVosSUFBb0IsTUFBcEIsR0FBNkIsV0FEdkI7QUFFZDhRLGtCQUFVLEVBQUUsSUFGRTtBQUdkNkssaUJBQVMsRUFBRTNHLFVBSEcsRUFBaEI7OztBQU1BNUIsZ0JBQVUsQ0FBQzRCLFVBQVUsQ0FBQ08sS0FBWixFQUFtQixJQUFuQixDQUFWOztBQUVBO0FBQ0EsV0FBSzdPLEdBQUwsR0FBVyxJQUFJbU0sWUFBSixDQUFpQjVQLE9BQWpCLENBQVg7O0FBRUE7QUFDQThQLGVBQVMsQ0FBQyxLQUFLck0sR0FBTixFQUFXc08sVUFBVSxDQUFDaEMsUUFBdEIsQ0FBVDs7QUFFQTtBQUNBNEssa0JBQVksQ0FBQzVkLElBQWIsQ0FBa0IsSUFBbEIsRUFBd0I7QUFDdEJ5YyxjQUFNLEVBQUUsS0FBS2xKLFFBRFM7QUFFdEJ6QyxrQkFBVSxFQUFFLElBRlUsRUFBeEI7OztBQUtBO0FBQ0EsV0FBS3BLLEdBQUwsQ0FBU21aLE1BQVQ7QUFDRCxLQXpCRDtBQTBCQSxRQUFJckMsU0FBUyxHQUFHLElBQWhCO0FBQ0EsV0FBT0EsU0FBUyxJQUFJQSxTQUFTLENBQUNvRCxvQkFBdkIsSUFBK0N0RCxVQUFVLENBQUMsQ0FBRCxDQUF6RCxJQUFnRUUsU0FBUyxLQUFLRixVQUFVLENBQUMsQ0FBRCxDQUEvRixFQUFvRztBQUNsR0EsZ0JBQVUsQ0FBQzlVLEtBQVg7QUFDQWdWLGVBQVMsQ0FBQ29ELG9CQUFWO0FBQ0EsYUFBT3BELFNBQVMsQ0FBQ29ELG9CQUFqQjtBQUNBcEQsZUFBUyxHQUFHRixVQUFVLENBQUMsQ0FBRCxDQUF0QjtBQUNEO0FBQ0YsR0FsQ0Q7O0FBb0NBO0FBQ0EsU0FBT29DLGdCQUFnQixDQUFDcE8sU0FBakIsQ0FBMkJ3TyxLQUFsQzs7QUFFQUosa0JBQWdCLENBQUNoTSxPQUFqQixDQUF5QjRNLEdBQXpCLEdBQStCdEMsWUFBL0I7O0FBRUEsU0FBTzBCLGdCQUFQO0FBQ0Q7O0FBRUQsSUFBTW1CLE9BQU8sR0FBRztBQUNkLFFBRGM7QUFFZCxRQUZjO0FBR2QsVUFIYyxDQUFoQjs7O0FBTUFBLE9BQU8sQ0FBQ3BmLElBQVIsT0FBQW9mLE9BQU8sRUFBU25QLGdCQUFULENBQVA7O0FBRUEsU0FBU29QLGFBQVQsQ0FBd0JDLGNBQXhCOzs7QUFHRyxLQUZEL0QsTUFFQyxTQUZEQSxNQUVDLENBRERZLFlBQ0MsU0FEREEsWUFDQztBQUNELE1BQU1vRCxXQUFXLEdBQUdMLGNBQWMsQ0FBQ0ksY0FBRCxDQUFsQzs7QUFFQXRPLFdBQVMsQ0FBQ3VPLFdBQVcsQ0FBQ3ROLE9BQWIsRUFBc0JtTixPQUF0QixFQUErQkUsY0FBL0IsQ0FBVDs7QUFFQUMsYUFBVyxDQUFDdE4sT0FBWixDQUFvQnVOLE1BQXBCLEdBQTZCLFVBQVVDLEtBQVYsRUFBaUI7QUFDNUMsU0FBS2plLE9BQUwsR0FBZWllLEtBQWY7QUFDQSxRQUFNQyxTQUFTLEdBQUcxaEIsTUFBTSxDQUFDNEYsTUFBUCxDQUFjLEVBQWQsRUFBa0I2YixLQUFsQixDQUFsQjtBQUNBLFdBQU9DLFNBQVMsQ0FBQ2pHLE1BQWpCO0FBQ0EsU0FBS3pSLEtBQUwsR0FBYTtBQUNYQyxjQUFRLEVBQUUsT0FBTyxLQUFLMlUsS0FBTCxJQUFjLEtBQUsrQyxFQUExQixJQUFnQ3BDLGNBQWMsQ0FBQ21DLFNBQUQsQ0FEN0MsRUFBYjs7QUFHQSxTQUFLemEsR0FBTCxDQUFTb0wsR0FBVCxDQUFhb1AsS0FBYixHQUFxQkEsS0FBckIsQ0FQNEMsQ0FPaEI7QUFDNUIsU0FBS3hhLEdBQUwsQ0FBU2lNLFdBQVQsQ0FBcUIsUUFBckIsRUFBK0J1TyxLQUEvQjtBQUNELEdBVEQ7O0FBV0EsU0FBT0YsV0FBUDtBQUNEOztBQUVELFNBQVNLLFNBQVQsQ0FBb0JOLGNBQXBCLEVBQW9DO0FBQ2xDLE1BQU1DLFdBQVcsR0FBR0YsYUFBYSxDQUFDQyxjQUFELEVBQWlCO0FBQ2hEL0QsVUFBTSxFQUFOQSxNQURnRDtBQUVoRFksZ0JBQVksRUFBWkEsWUFGZ0QsRUFBakIsQ0FBakM7O0FBSUE7QUFDQW9ELGFBQVcsQ0FBQzFQLFNBQVosQ0FBc0J3TyxLQUF0QixHQUE4QixTQUFTQSxLQUFULEdBQWtCO0FBQzlDLFFBQUksS0FBS3BaLEdBQUwsSUFBWSxLQUFLQSxHQUFMLENBQVNxTCxNQUFULEtBQW9CLE1BQXBDLEVBQTRDO0FBQzFDLFdBQUtyTCxHQUFMLENBQVNpTSxXQUFULENBQXFCLFNBQXJCO0FBQ0EsV0FBS2pNLEdBQUwsQ0FBU2lNLFdBQVQsQ0FBcUIsYUFBckI7QUFDQSxXQUFLak0sR0FBTCxDQUFTNlYsVUFBVCxHQUFzQixJQUF0QjtBQUNBLFdBQUs3VixHQUFMLENBQVNpTSxXQUFULENBQXFCLFNBQXJCO0FBQ0EsV0FBS2pNLEdBQUwsQ0FBU2lNLFdBQVQsQ0FBcUIsU0FBckI7QUFDRCxLQU5ELE1BTU87QUFDTCxXQUFLeU8sRUFBTCxJQUFXbFQsT0FBTyxDQUFDQyxJQUFSLENBQWEsS0FBS2lULEVBQUwsR0FBVSxlQUF2QixDQUFYO0FBQ0Q7QUFDRixHQVZEOztBQVlBSixhQUFXLENBQUMxUCxTQUFaLENBQXNCeU8sUUFBdEIsR0FBaUMsU0FBU0EsUUFBVCxHQUFxQjtBQUNwRCxTQUFLclosR0FBTCxJQUFZLEtBQUtBLEdBQUwsQ0FBU3NaLFFBQVQsRUFBWjtBQUNBO0FBQ0EsUUFBTWxDLFNBQVMsR0FBRyxLQUFLQyxhQUF2QjtBQUNBRCxhQUFTLElBQUlyZSxNQUFNLENBQUN3QyxJQUFQLENBQVkwYixTQUFaLEVBQXVCemIsT0FBdkIsQ0FBK0IsVUFBQWhDLEdBQUcsRUFBSTtBQUNqRCxVQUFJQSxHQUFHLENBQUMvQyxPQUFKLENBQVkyZ0IsU0FBUyxHQUFHLEdBQXhCLE1BQWlDLENBQXJDLEVBQXdDO0FBQ3RDLGVBQU9ILFNBQVMsQ0FBQ3pkLEdBQUQsQ0FBaEI7QUFDRDtBQUNGLEtBSlksQ0FBYjtBQUtELEdBVEQ7O0FBV0EsU0FBTzhnQixXQUFQO0FBQ0Q7O0FBRUQsU0FBU00sVUFBVCxDQUFxQlAsY0FBckIsRUFBcUM7QUFDbkM7QUFDRSxXQUFPclEsU0FBUyxDQUFDMlEsU0FBUyxDQUFDTixjQUFELENBQVYsQ0FBaEI7QUFDRDtBQUNGOztBQUVELFNBQVNRLGVBQVQsQ0FBMEJyUCxVQUExQixFQUFzQztBQUNwQztBQUNFLFdBQU94QixTQUFTLENBQUNpUSxjQUFjLENBQUN6TyxVQUFELENBQWYsQ0FBaEI7QUFDRDtBQUNGOztBQUVELFNBQVNzUCxtQkFBVCxDQUE4QjVQLEVBQTlCLEVBQWtDO0FBQ2hDLE1BQU13SyxVQUFVLEdBQUc4QixRQUFRLENBQUN0TSxFQUFELENBQTNCO0FBQ0EsTUFBTXJMLEdBQUcsR0FBR0MsTUFBTSxDQUFDO0FBQ2pCQyxnQkFBWSxFQUFFLElBREcsRUFBRCxDQUFsQjs7QUFHQW1MLElBQUUsQ0FBQzBHLE1BQUgsR0FBWS9SLEdBQVo7QUFDQSxNQUFNK1YsVUFBVSxHQUFHL1YsR0FBRyxDQUFDK1YsVUFBdkI7QUFDQSxNQUFJQSxVQUFKLEVBQWdCO0FBQ2Q3YyxVQUFNLENBQUN3QyxJQUFQLENBQVltYSxVQUFVLENBQUNFLFVBQXZCLEVBQW1DcGEsT0FBbkMsQ0FBMkMsVUFBQWdCLElBQUksRUFBSTtBQUNqRCxVQUFJLENBQUNqRCxNQUFNLENBQUNxYyxVQUFELEVBQWFwWixJQUFiLENBQVgsRUFBK0I7QUFDN0JvWixrQkFBVSxDQUFDcFosSUFBRCxDQUFWLEdBQW1Ca1osVUFBVSxDQUFDRSxVQUFYLENBQXNCcFosSUFBdEIsQ0FBbkI7QUFDRDtBQUNGLEtBSkQ7QUFLRDtBQUNEekQsUUFBTSxDQUFDd0MsSUFBUCxDQUFZbWEsVUFBWixFQUF3QmxhLE9BQXhCLENBQWdDLFVBQUFnQixJQUFJLEVBQUk7QUFDdEMsUUFBSSxDQUFDakQsTUFBTSxDQUFDc0csR0FBRCxFQUFNckQsSUFBTixDQUFYLEVBQXdCO0FBQ3RCcUQsU0FBRyxDQUFDckQsSUFBRCxDQUFILEdBQVlrWixVQUFVLENBQUNsWixJQUFELENBQXRCO0FBQ0Q7QUFDRixHQUpEO0FBS0EsTUFBSXZELElBQUksQ0FBQ3ljLFVBQVUsQ0FBQ3FGLE1BQVosQ0FBSixJQUEyQnpqQixFQUFFLENBQUMwakIsU0FBbEMsRUFBNkM7QUFDM0MxakIsTUFBRSxDQUFDMGpCLFNBQUgsQ0FBYSxZQUFhLG9DQUFUNVosSUFBUyx5REFBVEEsSUFBUztBQUN4QjhKLFFBQUUsQ0FBQ2UsV0FBSCxDQUFlLFFBQWYsRUFBeUI3SyxJQUF6QjtBQUNELEtBRkQ7QUFHRDtBQUNELE1BQUluSSxJQUFJLENBQUN5YyxVQUFVLENBQUN1RixNQUFaLENBQUosSUFBMkIzakIsRUFBRSxDQUFDNGpCLFNBQWxDLEVBQTZDO0FBQzNDNWpCLE1BQUUsQ0FBQzRqQixTQUFILENBQWEsWUFBYSxvQ0FBVDlaLElBQVMseURBQVRBLElBQVM7QUFDeEI4SixRQUFFLENBQUNlLFdBQUgsQ0FBZSxRQUFmLEVBQXlCN0ssSUFBekI7QUFDRCxLQUZEO0FBR0Q7QUFDRCxNQUFJbkksSUFBSSxDQUFDeWMsVUFBVSxDQUFDQyxRQUFaLENBQVIsRUFBK0I7QUFDN0IsUUFBTXZVLElBQUksR0FBRzlKLEVBQUUsQ0FBQzZqQixvQkFBSCxJQUEyQjdqQixFQUFFLENBQUM2akIsb0JBQUgsRUFBeEM7QUFDQWpRLE1BQUUsQ0FBQ2UsV0FBSCxDQUFlLFVBQWYsRUFBMkI3SyxJQUEzQjtBQUNEO0FBQ0QsU0FBTzhKLEVBQVA7QUFDRDs7QUFFRCxTQUFTa1EsWUFBVCxDQUF1QmxRLEVBQXZCLEVBQTJCO0FBQ3pCLE1BQU13SyxVQUFVLEdBQUc4QixRQUFRLENBQUN0TSxFQUFELENBQTNCO0FBQ0EsTUFBSWpTLElBQUksQ0FBQ3ljLFVBQVUsQ0FBQ3FGLE1BQVosQ0FBSixJQUEyQnpqQixFQUFFLENBQUMwakIsU0FBbEMsRUFBNkM7QUFDM0MxakIsTUFBRSxDQUFDMGpCLFNBQUgsQ0FBYSxZQUFhLG9DQUFUNVosSUFBUyx5REFBVEEsSUFBUztBQUN4QjhKLFFBQUUsQ0FBQ2UsV0FBSCxDQUFlLFFBQWYsRUFBeUI3SyxJQUF6QjtBQUNELEtBRkQ7QUFHRDtBQUNELE1BQUluSSxJQUFJLENBQUN5YyxVQUFVLENBQUN1RixNQUFaLENBQUosSUFBMkIzakIsRUFBRSxDQUFDNGpCLFNBQWxDLEVBQTZDO0FBQzNDNWpCLE1BQUUsQ0FBQzRqQixTQUFILENBQWEsWUFBYSxvQ0FBVDlaLElBQVMseURBQVRBLElBQVM7QUFDeEI4SixRQUFFLENBQUNlLFdBQUgsQ0FBZSxRQUFmLEVBQXlCN0ssSUFBekI7QUFDRCxLQUZEO0FBR0Q7QUFDRCxNQUFJbkksSUFBSSxDQUFDeWMsVUFBVSxDQUFDQyxRQUFaLENBQVIsRUFBK0I7QUFDN0IsUUFBTXZVLElBQUksR0FBRzlKLEVBQUUsQ0FBQzZqQixvQkFBSCxJQUEyQjdqQixFQUFFLENBQUM2akIsb0JBQUgsRUFBeEM7QUFDQWpRLE1BQUUsQ0FBQ2UsV0FBSCxDQUFlLFVBQWYsRUFBMkI3SyxJQUEzQjtBQUNEO0FBQ0QsU0FBTzhKLEVBQVA7QUFDRDs7QUFFRGxHLEtBQUssQ0FBQ3hKLE9BQU4sQ0FBYyxVQUFBME0sT0FBTyxFQUFJO0FBQ3ZCaEQsV0FBUyxDQUFDZ0QsT0FBRCxDQUFULEdBQXFCLEtBQXJCO0FBQ0QsQ0FGRDs7QUFJQWpELFFBQVEsQ0FBQ3pKLE9BQVQsQ0FBaUIsVUFBQTZmLFVBQVUsRUFBSTtBQUM3QixNQUFNQyxPQUFPLEdBQUdwVyxTQUFTLENBQUNtVyxVQUFELENBQVQsSUFBeUJuVyxTQUFTLENBQUNtVyxVQUFELENBQVQsQ0FBc0I3ZSxJQUEvQyxHQUFzRDBJLFNBQVMsQ0FBQ21XLFVBQUQsQ0FBVCxDQUFzQjdlLElBQTVFO0FBQ1o2ZSxZQURKO0FBRUEsTUFBSSxDQUFDL2pCLEVBQUUsQ0FBQ3lOLE9BQUgsQ0FBV3VXLE9BQVgsQ0FBTCxFQUEwQjtBQUN4QnBXLGFBQVMsQ0FBQ21XLFVBQUQsQ0FBVCxHQUF3QixLQUF4QjtBQUNEO0FBQ0YsQ0FORDs7QUFRQSxJQUFJRSxHQUFHLEdBQUcsRUFBVjs7QUFFQSxJQUFJLE9BQU9DLEtBQVAsS0FBaUIsV0FBakIsSUFBZ0MsaUJBQWlCLFVBQXJELEVBQWlFO0FBQy9ERCxLQUFHLEdBQUcsSUFBSUMsS0FBSixDQUFVLEVBQVYsRUFBYztBQUNsQnhILE9BRGtCLGVBQ2IxRSxNQURhLEVBQ0w5UyxJQURLLEVBQ0M7QUFDakIsVUFBSWpELE1BQU0sQ0FBQytWLE1BQUQsRUFBUzlTLElBQVQsQ0FBVixFQUEwQjtBQUN4QixlQUFPOFMsTUFBTSxDQUFDOVMsSUFBRCxDQUFiO0FBQ0Q7QUFDRCxVQUFJa0UsT0FBTyxDQUFDbEUsSUFBRCxDQUFYLEVBQW1CO0FBQ2pCLGVBQU9rRSxPQUFPLENBQUNsRSxJQUFELENBQWQ7QUFDRDtBQUNELFVBQUlTLEdBQUcsQ0FBQ1QsSUFBRCxDQUFQLEVBQWU7QUFDYixlQUFPOEIsU0FBUyxDQUFDOUIsSUFBRCxFQUFPUyxHQUFHLENBQUNULElBQUQsQ0FBVixDQUFoQjtBQUNEO0FBQ0Q7QUFDRSxZQUFJbU0sUUFBUSxDQUFDbk0sSUFBRCxDQUFaLEVBQW9CO0FBQ2xCLGlCQUFPOEIsU0FBUyxDQUFDOUIsSUFBRCxFQUFPbU0sUUFBUSxDQUFDbk0sSUFBRCxDQUFmLENBQWhCO0FBQ0Q7QUFDRCxZQUFJdUwsUUFBUSxDQUFDdkwsSUFBRCxDQUFaLEVBQW9CO0FBQ2xCLGlCQUFPOEIsU0FBUyxDQUFDOUIsSUFBRCxFQUFPdUwsUUFBUSxDQUFDdkwsSUFBRCxDQUFmLENBQWhCO0FBQ0Q7QUFDRjtBQUNELFVBQUk2TSxRQUFRLENBQUM3TSxJQUFELENBQVosRUFBb0I7QUFDbEIsZUFBTzZNLFFBQVEsQ0FBQzdNLElBQUQsQ0FBZjtBQUNEO0FBQ0QsVUFBSSxDQUFDakQsTUFBTSxDQUFDakMsRUFBRCxFQUFLa0YsSUFBTCxDQUFQLElBQXFCLENBQUNqRCxNQUFNLENBQUMyTCxTQUFELEVBQVkxSSxJQUFaLENBQWhDLEVBQW1EO0FBQ2pEO0FBQ0Q7QUFDRCxhQUFPOEIsU0FBUyxDQUFDOUIsSUFBRCxFQUFPbUwsT0FBTyxDQUFDbkwsSUFBRCxFQUFPbEYsRUFBRSxDQUFDa0YsSUFBRCxDQUFULENBQWQsQ0FBaEI7QUFDRCxLQTFCaUI7QUEyQmxCeVgsT0EzQmtCLGVBMkJiM0UsTUEzQmEsRUEyQkw5UyxJQTNCSyxFQTJCQzRCLEtBM0JELEVBMkJRO0FBQ3hCa1IsWUFBTSxDQUFDOVMsSUFBRCxDQUFOLEdBQWU0QixLQUFmO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0E5QmlCLEVBQWQsQ0FBTjs7QUFnQ0QsQ0FqQ0QsTUFpQ087QUFDTHJGLFFBQU0sQ0FBQ3dDLElBQVAsQ0FBWW1GLE9BQVosRUFBcUJsRixPQUFyQixDQUE2QixVQUFBZ0IsSUFBSSxFQUFJO0FBQ25DK2UsT0FBRyxDQUFDL2UsSUFBRCxDQUFILEdBQVlrRSxPQUFPLENBQUNsRSxJQUFELENBQW5CO0FBQ0QsR0FGRDs7QUFJQTtBQUNFekQsVUFBTSxDQUFDd0MsSUFBUCxDQUFZd00sUUFBWixFQUFzQnZNLE9BQXRCLENBQThCLFVBQUFnQixJQUFJLEVBQUk7QUFDcEMrZSxTQUFHLENBQUMvZSxJQUFELENBQUgsR0FBWThCLFNBQVMsQ0FBQzlCLElBQUQsRUFBT3VMLFFBQVEsQ0FBQ3ZMLElBQUQsQ0FBZixDQUFyQjtBQUNELEtBRkQ7QUFHQXpELFVBQU0sQ0FBQ3dDLElBQVAsQ0FBWW9OLFFBQVosRUFBc0JuTixPQUF0QixDQUE4QixVQUFBZ0IsSUFBSSxFQUFJO0FBQ3BDK2UsU0FBRyxDQUFDL2UsSUFBRCxDQUFILEdBQVk4QixTQUFTLENBQUM5QixJQUFELEVBQU91TCxRQUFRLENBQUN2TCxJQUFELENBQWYsQ0FBckI7QUFDRCxLQUZEO0FBR0Q7O0FBRUR6RCxRQUFNLENBQUN3QyxJQUFQLENBQVk4TixRQUFaLEVBQXNCN04sT0FBdEIsQ0FBOEIsVUFBQWdCLElBQUksRUFBSTtBQUNwQytlLE9BQUcsQ0FBQy9lLElBQUQsQ0FBSCxHQUFZNk0sUUFBUSxDQUFDN00sSUFBRCxDQUFwQjtBQUNELEdBRkQ7O0FBSUF6RCxRQUFNLENBQUN3QyxJQUFQLENBQVkwQixHQUFaLEVBQWlCekIsT0FBakIsQ0FBeUIsVUFBQWdCLElBQUksRUFBSTtBQUMvQitlLE9BQUcsQ0FBQy9lLElBQUQsQ0FBSCxHQUFZOEIsU0FBUyxDQUFDOUIsSUFBRCxFQUFPUyxHQUFHLENBQUNULElBQUQsQ0FBVixDQUFyQjtBQUNELEdBRkQ7O0FBSUF6RCxRQUFNLENBQUN3QyxJQUFQLENBQVlqRSxFQUFaLEVBQWdCa0UsT0FBaEIsQ0FBd0IsVUFBQWdCLElBQUksRUFBSTtBQUM5QixRQUFJakQsTUFBTSxDQUFDakMsRUFBRCxFQUFLa0YsSUFBTCxDQUFOLElBQW9CakQsTUFBTSxDQUFDMkwsU0FBRCxFQUFZMUksSUFBWixDQUE5QixFQUFpRDtBQUMvQytlLFNBQUcsQ0FBQy9lLElBQUQsQ0FBSCxHQUFZOEIsU0FBUyxDQUFDOUIsSUFBRCxFQUFPbUwsT0FBTyxDQUFDbkwsSUFBRCxFQUFPbEYsRUFBRSxDQUFDa0YsSUFBRCxDQUFULENBQWQsQ0FBckI7QUFDRDtBQUNGLEdBSkQ7QUFLRDs7QUFFRGxGLEVBQUUsQ0FBQ3lnQixTQUFILEdBQWVBLFNBQWY7QUFDQXpnQixFQUFFLENBQUNzakIsVUFBSCxHQUFnQkEsVUFBaEI7QUFDQXRqQixFQUFFLENBQUN1akIsZUFBSCxHQUFxQkEsZUFBckI7QUFDQXZqQixFQUFFLENBQUN3akIsbUJBQUgsR0FBeUJBLG1CQUF6QjtBQUNBeGpCLEVBQUUsQ0FBQzhqQixZQUFILEdBQWtCQSxZQUFsQjs7QUFFQSxJQUFJSyxLQUFLLEdBQUdGLEdBQVosQzs7QUFFZUUsSzs7Ozs7Ozs7Ozs7QUN2Z0ZmOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDOztBQUU1Qzs7Ozs7Ozs7Ozs7O0FDbkJBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQzs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsaUJBQWlCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwrQkFBK0I7QUFDckQsc0JBQXNCLGlCQUFpQjtBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxpQ0FBaUMsRUFBRTtBQUNyRixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGdCQUFnQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixjQUFjOztBQUUzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsVUFBVTs7QUFFdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsYUFBb0I7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBLFlBQVksYUFBb0I7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssR0FBRztBQUNSO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7O0FBRUEsSUFBSSxJQUFxQztBQUN6QztBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLHVDQUF1Qyx3QkFBd0IsRUFBRTtBQUNqRSwwQkFBMEI7O0FBRTFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsWUFBWTtBQUNwQyxrQkFBa0IsWUFBWTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQSx3Q0FBd0MsRUFBRTtBQUMxQztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixvQkFBb0IsRUFBRTtBQUNyRDtBQUNBLGtDQUFrQyxPQUFPO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEIsU0FBUyxxQkFBcUI7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsT0FBTztBQUNyRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFFUTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQXFDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIscUJBQXFCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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RUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0VBQXNFOztBQUV0RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssdUZBQXVGO0FBQzVGO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDO0FBQzFDLGlCQUFpQix5QkFBeUI7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsK0JBQStCO0FBQ2xDLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQXFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsT0FBTztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFxQztBQUMzQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjs7QUFFMUIsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIscUJBQXFCO0FBQ3hDO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIseUJBQXlCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHlCQUF5QjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxPQUFPO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDBCQUEwQjtBQUNwRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsb0JBQW9CLEVBQUU7O0FBRXBEO0FBQ0E7QUFDQSxpQkFBaUIsc0JBQXNCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEtBQXFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLEtBQXFDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixLQUFxQztBQUN6RDtBQUNBLE1BQU0sU0FBRTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVEsS0FBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBLEtBQUssTUFBTSxFQUVOO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0Esc0NBQXNDO0FBQ3RDLDhDOztBQUVBO0FBQ0EsUUFBUSxLQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZUFBZTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxLQUFxQztBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7O0FBRWpDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsWUFBWSxLQUFxQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLDJCQUEyQixFQUFFO0FBQ3ZFLEtBQUs7QUFDTDtBQUNBLDBDQUEwQyw0QkFBNEIsRUFBRTtBQUN4RSxLQUFLO0FBQ0wsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGVBQWU7QUFDOUMsTUFBTSxJQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWSxzR0FBVztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsbUJBQW1CO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLGdDQUFnQyxFQUFFO0FBQzVFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxzR0FBVztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLFdBQVcsc0dBQVc7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsMENBQTBDOztBQUUxQztBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFVBQVUsc0dBQVc7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsT0FBTztBQUMxQztBQUNBLGdCQUFnQixZQUFZO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsWUFBWTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsT0FBTztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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RSxlQUFXLE1BSmI7QUFLRSx1QkFBbUIsS0FMckIsRUF4bENROztBQStsQ1I7QUFDRSxlQUFXLFVBRGI7QUFFRSxZQUFRLGFBRlY7QUFHRSxrQkFBYyxhQUhoQjtBQUlFLGVBQVcsTUFKYjtBQUtFLHVCQUFtQixLQUxyQixFQS9sQ1E7O0FBc21DUjtBQUNFLGVBQVcsVUFEYjtBQUVFLFlBQVEsVUFGVjtBQUdFLGtCQUFjLFVBSGhCO0FBSUUsZUFBVyxNQUpiO0FBS0UsdUJBQW1CLEtBTHJCLEVBdG1DUTs7QUE2bUNSO0FBQ0UsZUFBVyxVQURiO0FBRUUsWUFBUSxpQkFGVjtBQUdFLGtCQUFjLGlCQUhoQjtBQUlFLGVBQVcsTUFKYjtBQUtFLHVCQUFtQixLQUxyQixFQTdtQ1E7O0FBb25DUjtBQUNFLGVBQVcsVUFEYjtBQUVFLFlBQVEsTUFGVjtBQUdFLGtCQUFjLE1BSGhCO0FBSUUsZUFBVyxNQUpiO0FBS0UsdUJBQW1CLEtBTHJCLEVBcG5DUTs7QUEybkNSO0FBQ0UsZUFBVyxVQURiO0FBRUUsWUFBUSxZQUZWO0FBR0Usa0JBQWMsWUFIaEI7QUFJRSxlQUFXLE1BSmI7QUFLRSx1QkFBbUIsS0FMckIsRUEzbkNROztBQWtvQ1I7QUFDRSxlQUFXLFVBRGI7QUFFRSxZQUFRLE1BRlY7QUFHRSxrQkFBYyxNQUhoQjtBQUlFLGVBQVcsTUFKYjtBQUtFLHVCQUFtQixLQUxyQixFQWxvQ1EsQ0FORyxFIiwiZmlsZSI6ImNvbW1vbi92ZW5kb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVnVlIGZyb20gJ3Z1ZSc7XHJcbmltcG9ydCB7IGluaXRWdWVJMThuIH0gZnJvbSAnQGRjbG91ZGlvL3VuaS1pMThuJztcclxuXHJcbmxldCByZWFsQXRvYjtcclxuXHJcbmNvbnN0IGI2NCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XHJcbmNvbnN0IGI2NHJlID0gL14oPzpbQS1aYS16XFxkKy9dezR9KSo/KD86W0EtWmEtelxcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxcZCsvXXszfT0/KT8kLztcclxuXHJcbmlmICh0eXBlb2YgYXRvYiAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gIHJlYWxBdG9iID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgc3RyID0gU3RyaW5nKHN0cikucmVwbGFjZSgvW1xcdFxcblxcZlxcciBdKy9nLCAnJyk7XHJcbiAgICBpZiAoIWI2NHJlLnRlc3Qoc3RyKSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXRvYicgb24gJ1dpbmRvdyc6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuXCIpIH1cclxuXHJcbiAgICAvLyBBZGRpbmcgdGhlIHBhZGRpbmcgaWYgbWlzc2luZywgZm9yIHNlbXBsaWNpdHlcclxuICAgIHN0ciArPSAnPT0nLnNsaWNlKDIgLSAoc3RyLmxlbmd0aCAmIDMpKTtcclxuICAgIHZhciBiaXRtYXA7IHZhciByZXN1bHQgPSAnJzsgdmFyIHIxOyB2YXIgcjI7IHZhciBpID0gMDtcclxuICAgIGZvciAoOyBpIDwgc3RyLmxlbmd0aDspIHtcclxuICAgICAgYml0bWFwID0gYjY0LmluZGV4T2Yoc3RyLmNoYXJBdChpKyspKSA8PCAxOCB8IGI2NC5pbmRleE9mKHN0ci5jaGFyQXQoaSsrKSkgPDwgMTIgfFxyXG4gICAgICAgICAgICAgICAgICAgIChyMSA9IGI2NC5pbmRleE9mKHN0ci5jaGFyQXQoaSsrKSkpIDw8IDYgfCAocjIgPSBiNjQuaW5kZXhPZihzdHIuY2hhckF0KGkrKykpKTtcclxuXHJcbiAgICAgIHJlc3VsdCArPSByMSA9PT0gNjQgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJpdG1hcCA+PiAxNiAmIDI1NSlcclxuICAgICAgICA6IHIyID09PSA2NCA/IFN0cmluZy5mcm9tQ2hhckNvZGUoYml0bWFwID4+IDE2ICYgMjU1LCBiaXRtYXAgPj4gOCAmIDI1NSlcclxuICAgICAgICAgIDogU3RyaW5nLmZyb21DaGFyQ29kZShiaXRtYXAgPj4gMTYgJiAyNTUsIGJpdG1hcCA+PiA4ICYgMjU1LCBiaXRtYXAgJiAyNTUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG4gIH07XHJcbn0gZWxzZSB7XHJcbiAgLy8g5rOo5oSPYXRvYuWPquiDveWcqOWFqOWxgOWvueixoeS4iuiwg+eUqO+8jOS+i+Wmgu+8mmBjb25zdCBCYXNlNjQgPSB7YXRvYn07QmFzZTY0LmF0b2IoJ3h4eHgnKWDmmK/plJnor6/nmoTnlKjms5VcclxuICByZWFsQXRvYiA9IGF0b2I7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUgKHN0cikge1xyXG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVhbEF0b2Ioc3RyKS5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjKSB7XHJcbiAgICByZXR1cm4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMilcclxuICB9KS5qb2luKCcnKSlcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJJbmZvICgpIHtcclxuICBjb25zdCB0b2tlbiA9ICggdHQpLmdldFN0b3JhZ2VTeW5jKCd1bmlfaWRfdG9rZW4nKSB8fCAnJztcclxuICBjb25zdCB0b2tlbkFyciA9IHRva2VuLnNwbGl0KCcuJyk7XHJcbiAgaWYgKCF0b2tlbiB8fCB0b2tlbkFyci5sZW5ndGggIT09IDMpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpZDogbnVsbCxcclxuICAgICAgcm9sZTogW10sXHJcbiAgICAgIHBlcm1pc3Npb246IFtdLFxyXG4gICAgICB0b2tlbkV4cGlyZWQ6IDBcclxuICAgIH1cclxuICB9XHJcbiAgbGV0IHVzZXJJbmZvO1xyXG4gIHRyeSB7XHJcbiAgICB1c2VySW5mbyA9IEpTT04ucGFyc2UoYjY0RGVjb2RlVW5pY29kZSh0b2tlbkFyclsxXSkpO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ+iOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8micgKyBlcnJvci5tZXNzYWdlKVxyXG4gIH1cclxuICB1c2VySW5mby50b2tlbkV4cGlyZWQgPSB1c2VySW5mby5leHAgKiAxMDAwO1xyXG4gIGRlbGV0ZSB1c2VySW5mby5leHA7XHJcbiAgZGVsZXRlIHVzZXJJbmZvLmlhdDtcclxuICByZXR1cm4gdXNlckluZm9cclxufVxyXG5cclxuZnVuY3Rpb24gdW5pSWRNaXhpbiAoVnVlKSB7XHJcbiAgVnVlLnByb3RvdHlwZS51bmlJREhhc1JvbGUgPSBmdW5jdGlvbiAocm9sZUlkKSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHJvbGVcclxuICAgIH0gPSBnZXRDdXJyZW50VXNlckluZm8oKTtcclxuICAgIHJldHVybiByb2xlLmluZGV4T2Yocm9sZUlkKSA+IC0xXHJcbiAgfTtcclxuICBWdWUucHJvdG90eXBlLnVuaUlESGFzUGVybWlzc2lvbiA9IGZ1bmN0aW9uIChwZXJtaXNzaW9uSWQpIHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgcGVybWlzc2lvblxyXG4gICAgfSA9IGdldEN1cnJlbnRVc2VySW5mbygpO1xyXG4gICAgcmV0dXJuIHRoaXMudW5pSURIYXNSb2xlKCdhZG1pbicpIHx8IHBlcm1pc3Npb24uaW5kZXhPZihwZXJtaXNzaW9uSWQpID4gLTFcclxuICB9O1xyXG4gIFZ1ZS5wcm90b3R5cGUudW5pSURUb2tlblZhbGlkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICB0b2tlbkV4cGlyZWRcclxuICAgIH0gPSBnZXRDdXJyZW50VXNlckluZm8oKTtcclxuICAgIHJldHVybiB0b2tlbkV4cGlyZWQgPiBEYXRlLm5vdygpXHJcbiAgfTtcclxufVxyXG5cclxuY29uc3QgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcclxuY29uc3QgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xyXG5cclxuZnVuY3Rpb24gaXNGbiAoZm4pIHtcclxuICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU3RyIChzdHIpIHtcclxuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZydcclxufVxyXG5cclxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCAob2JqKSB7XHJcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHtcclxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcclxufVxyXG5cclxuZnVuY3Rpb24gbm9vcCAoKSB7fVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi5cclxuICovXHJcbmZ1bmN0aW9uIGNhY2hlZCAoZm4pIHtcclxuICBjb25zdCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcclxuICAgIGNvbnN0IGhpdCA9IGNhY2hlW3N0cl07XHJcbiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxpbWl0ZWQgc3RyaW5nLlxyXG4gKi9cclxuY29uc3QgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcclxuY29uc3QgY2FtZWxpemUgPSBjYWNoZWQoKHN0cikgPT4ge1xyXG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCAoXywgYykgPT4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnKVxyXG59KTtcclxuXHJcbmNvbnN0IEhPT0tTID0gW1xyXG4gICdpbnZva2UnLFxyXG4gICdzdWNjZXNzJyxcclxuICAnZmFpbCcsXHJcbiAgJ2NvbXBsZXRlJyxcclxuICAncmV0dXJuVmFsdWUnXHJcbl07XHJcblxyXG5jb25zdCBnbG9iYWxJbnRlcmNlcHRvcnMgPSB7fTtcclxuY29uc3Qgc2NvcGVkSW50ZXJjZXB0b3JzID0ge307XHJcblxyXG5mdW5jdGlvbiBtZXJnZUhvb2sgKHBhcmVudFZhbCwgY2hpbGRWYWwpIHtcclxuICBjb25zdCByZXMgPSBjaGlsZFZhbFxyXG4gICAgPyBwYXJlbnRWYWxcclxuICAgICAgPyBwYXJlbnRWYWwuY29uY2F0KGNoaWxkVmFsKVxyXG4gICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpXHJcbiAgICAgICAgPyBjaGlsZFZhbCA6IFtjaGlsZFZhbF1cclxuICAgIDogcGFyZW50VmFsO1xyXG4gIHJldHVybiByZXNcclxuICAgID8gZGVkdXBlSG9va3MocmVzKVxyXG4gICAgOiByZXNcclxufVxyXG5cclxuZnVuY3Rpb24gZGVkdXBlSG9va3MgKGhvb2tzKSB7XHJcbiAgY29uc3QgcmVzID0gW107XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKykge1xyXG4gICAgaWYgKHJlcy5pbmRleE9mKGhvb2tzW2ldKSA9PT0gLTEpIHtcclxuICAgICAgcmVzLnB1c2goaG9va3NbaV0pO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcmVzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZUhvb2sgKGhvb2tzLCBob29rKSB7XHJcbiAgY29uc3QgaW5kZXggPSBob29rcy5pbmRleE9mKGhvb2spO1xyXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgIGhvb2tzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBtZXJnZUludGVyY2VwdG9ySG9vayAoaW50ZXJjZXB0b3IsIG9wdGlvbikge1xyXG4gIE9iamVjdC5rZXlzKG9wdGlvbikuZm9yRWFjaChob29rID0+IHtcclxuICAgIGlmIChIT09LUy5pbmRleE9mKGhvb2spICE9PSAtMSAmJiBpc0ZuKG9wdGlvbltob29rXSkpIHtcclxuICAgICAgaW50ZXJjZXB0b3JbaG9va10gPSBtZXJnZUhvb2soaW50ZXJjZXB0b3JbaG9va10sIG9wdGlvbltob29rXSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZUludGVyY2VwdG9ySG9vayAoaW50ZXJjZXB0b3IsIG9wdGlvbikge1xyXG4gIGlmICghaW50ZXJjZXB0b3IgfHwgIW9wdGlvbikge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG4gIE9iamVjdC5rZXlzKG9wdGlvbikuZm9yRWFjaChob29rID0+IHtcclxuICAgIGlmIChIT09LUy5pbmRleE9mKGhvb2spICE9PSAtMSAmJiBpc0ZuKG9wdGlvbltob29rXSkpIHtcclxuICAgICAgcmVtb3ZlSG9vayhpbnRlcmNlcHRvcltob29rXSwgb3B0aW9uW2hvb2tdKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkSW50ZXJjZXB0b3IgKG1ldGhvZCwgb3B0aW9uKSB7XHJcbiAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnICYmIGlzUGxhaW5PYmplY3Qob3B0aW9uKSkge1xyXG4gICAgbWVyZ2VJbnRlcmNlcHRvckhvb2soc2NvcGVkSW50ZXJjZXB0b3JzW21ldGhvZF0gfHwgKHNjb3BlZEludGVyY2VwdG9yc1ttZXRob2RdID0ge30pLCBvcHRpb24pO1xyXG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChtZXRob2QpKSB7XHJcbiAgICBtZXJnZUludGVyY2VwdG9ySG9vayhnbG9iYWxJbnRlcmNlcHRvcnMsIG1ldGhvZCk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVJbnRlcmNlcHRvciAobWV0aG9kLCBvcHRpb24pIHtcclxuICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHtcclxuICAgIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbikpIHtcclxuICAgICAgcmVtb3ZlSW50ZXJjZXB0b3JIb29rKHNjb3BlZEludGVyY2VwdG9yc1ttZXRob2RdLCBvcHRpb24pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGVsZXRlIHNjb3BlZEludGVyY2VwdG9yc1ttZXRob2RdO1xyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChtZXRob2QpKSB7XHJcbiAgICByZW1vdmVJbnRlcmNlcHRvckhvb2soZ2xvYmFsSW50ZXJjZXB0b3JzLCBtZXRob2QpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gd3JhcHBlckhvb2sgKGhvb2spIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgIHJldHVybiBob29rKGRhdGEpIHx8IGRhdGFcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUHJvbWlzZSAob2JqKSB7XHJcbiAgcmV0dXJuICEhb2JqICYmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSAmJiB0eXBlb2Ygb2JqLnRoZW4gPT09ICdmdW5jdGlvbidcclxufVxyXG5cclxuZnVuY3Rpb24gcXVldWUgKGhvb2tzLCBkYXRhKSB7XHJcbiAgbGV0IHByb21pc2UgPSBmYWxzZTtcclxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBjb25zdCBob29rID0gaG9va3NbaV07XHJcbiAgICBpZiAocHJvbWlzZSkge1xyXG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHdyYXBwZXJIb29rKGhvb2spKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IGhvb2soZGF0YSk7XHJcbiAgICAgIGlmIChpc1Byb21pc2UocmVzKSkge1xyXG4gICAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUocmVzKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmVzID09PSBmYWxzZSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICB0aGVuICgpIHsgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcHJvbWlzZSB8fCB7XHJcbiAgICB0aGVuIChjYWxsYmFjaykge1xyXG4gICAgICByZXR1cm4gY2FsbGJhY2soZGF0YSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyYXBwZXJPcHRpb25zIChpbnRlcmNlcHRvciwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgWydzdWNjZXNzJywgJ2ZhaWwnLCAnY29tcGxldGUnXS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW50ZXJjZXB0b3JbbmFtZV0pKSB7XHJcbiAgICAgIGNvbnN0IG9sZENhbGxiYWNrID0gb3B0aW9uc1tuYW1lXTtcclxuICAgICAgb3B0aW9uc1tuYW1lXSA9IGZ1bmN0aW9uIGNhbGxiYWNrSW50ZXJjZXB0b3IgKHJlcykge1xyXG4gICAgICAgIHF1ZXVlKGludGVyY2VwdG9yW25hbWVdLCByZXMpLnRoZW4oKHJlcykgPT4ge1xyXG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tbWl4ZWQtb3BlcmF0b3JzICovXHJcbiAgICAgICAgICByZXR1cm4gaXNGbihvbGRDYWxsYmFjaykgJiYgb2xkQ2FsbGJhY2socmVzKSB8fCByZXNcclxuICAgICAgICB9KTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gb3B0aW9uc1xyXG59XHJcblxyXG5mdW5jdGlvbiB3cmFwcGVyUmV0dXJuVmFsdWUgKG1ldGhvZCwgcmV0dXJuVmFsdWUpIHtcclxuICBjb25zdCByZXR1cm5WYWx1ZUhvb2tzID0gW107XHJcbiAgaWYgKEFycmF5LmlzQXJyYXkoZ2xvYmFsSW50ZXJjZXB0b3JzLnJldHVyblZhbHVlKSkge1xyXG4gICAgcmV0dXJuVmFsdWVIb29rcy5wdXNoKC4uLmdsb2JhbEludGVyY2VwdG9ycy5yZXR1cm5WYWx1ZSk7XHJcbiAgfVxyXG4gIGNvbnN0IGludGVyY2VwdG9yID0gc2NvcGVkSW50ZXJjZXB0b3JzW21ldGhvZF07XHJcbiAgaWYgKGludGVyY2VwdG9yICYmIEFycmF5LmlzQXJyYXkoaW50ZXJjZXB0b3IucmV0dXJuVmFsdWUpKSB7XHJcbiAgICByZXR1cm5WYWx1ZUhvb2tzLnB1c2goLi4uaW50ZXJjZXB0b3IucmV0dXJuVmFsdWUpO1xyXG4gIH1cclxuICByZXR1cm5WYWx1ZUhvb2tzLmZvckVhY2goaG9vayA9PiB7XHJcbiAgICByZXR1cm5WYWx1ZSA9IGhvb2socmV0dXJuVmFsdWUpIHx8IHJldHVyblZhbHVlO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXR1cm5WYWx1ZVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBcGlJbnRlcmNlcHRvckhvb2tzIChtZXRob2QpIHtcclxuICBjb25zdCBpbnRlcmNlcHRvciA9IE9iamVjdC5jcmVhdGUobnVsbCk7XHJcbiAgT2JqZWN0LmtleXMoZ2xvYmFsSW50ZXJjZXB0b3JzKS5mb3JFYWNoKGhvb2sgPT4ge1xyXG4gICAgaWYgKGhvb2sgIT09ICdyZXR1cm5WYWx1ZScpIHtcclxuICAgICAgaW50ZXJjZXB0b3JbaG9va10gPSBnbG9iYWxJbnRlcmNlcHRvcnNbaG9va10uc2xpY2UoKTtcclxuICAgIH1cclxuICB9KTtcclxuICBjb25zdCBzY29wZWRJbnRlcmNlcHRvciA9IHNjb3BlZEludGVyY2VwdG9yc1ttZXRob2RdO1xyXG4gIGlmIChzY29wZWRJbnRlcmNlcHRvcikge1xyXG4gICAgT2JqZWN0LmtleXMoc2NvcGVkSW50ZXJjZXB0b3IpLmZvckVhY2goaG9vayA9PiB7XHJcbiAgICAgIGlmIChob29rICE9PSAncmV0dXJuVmFsdWUnKSB7XHJcbiAgICAgICAgaW50ZXJjZXB0b3JbaG9va10gPSAoaW50ZXJjZXB0b3JbaG9va10gfHwgW10pLmNvbmNhdChzY29wZWRJbnRlcmNlcHRvcltob29rXSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICByZXR1cm4gaW50ZXJjZXB0b3JcclxufVxyXG5cclxuZnVuY3Rpb24gaW52b2tlQXBpIChtZXRob2QsIGFwaSwgb3B0aW9ucywgLi4ucGFyYW1zKSB7XHJcbiAgY29uc3QgaW50ZXJjZXB0b3IgPSBnZXRBcGlJbnRlcmNlcHRvckhvb2tzKG1ldGhvZCk7XHJcbiAgaWYgKGludGVyY2VwdG9yICYmIE9iamVjdC5rZXlzKGludGVyY2VwdG9yKS5sZW5ndGgpIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGludGVyY2VwdG9yLmludm9rZSkpIHtcclxuICAgICAgY29uc3QgcmVzID0gcXVldWUoaW50ZXJjZXB0b3IuaW52b2tlLCBvcHRpb25zKTtcclxuICAgICAgcmV0dXJuIHJlcy50aGVuKChvcHRpb25zKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGFwaSh3cmFwcGVyT3B0aW9ucyhpbnRlcmNlcHRvciwgb3B0aW9ucyksIC4uLnBhcmFtcylcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBhcGkod3JhcHBlck9wdGlvbnMoaW50ZXJjZXB0b3IsIG9wdGlvbnMpLCAuLi5wYXJhbXMpXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBhcGkob3B0aW9ucywgLi4ucGFyYW1zKVxyXG59XHJcblxyXG5jb25zdCBwcm9taXNlSW50ZXJjZXB0b3IgPSB7XHJcbiAgcmV0dXJuVmFsdWUgKHJlcykge1xyXG4gICAgaWYgKCFpc1Byb21pc2UocmVzKSkge1xyXG4gICAgICByZXR1cm4gcmVzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICByZXMudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIGlmIChyZXNbMF0pIHtcclxuICAgICAgICAgIHJlamVjdChyZXNbMF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlc1sxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pXHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgU1lOQ19BUElfUkUgPVxyXG4gIC9eXFwkfFdpbmRvdyR8V2luZG93U3R5bGUkfHNlbmRIb3N0RXZlbnR8c2VuZE5hdGl2ZUV2ZW50fHJlc3RvcmVHbG9iYWx8cmVxdWlyZUdsb2JhbHxnZXRDdXJyZW50U3ViTlZ1ZXxnZXRNZW51QnV0dG9uQm91bmRpbmdDbGllbnRSZWN0fF5yZXBvcnR8aW50ZXJjZXB0b3JzfEludGVyY2VwdG9yJHxnZXRTdWJOVnVlQnlJZHxyZXF1aXJlTmF0aXZlUGx1Z2lufHVweDJweHxoaWRlS2V5Ym9hcmR8Y2FuSVVzZXxeY3JlYXRlfFN5bmMkfE1hbmFnZXIkfGJhc2U2NFRvQXJyYXlCdWZmZXJ8YXJyYXlCdWZmZXJUb0Jhc2U2NHxnZXRMb2NhbGV8c2V0TG9jYWxlLztcclxuXHJcbmNvbnN0IENPTlRFWFRfQVBJX1JFID0gL15jcmVhdGV8TWFuYWdlciQvO1xyXG5cclxuLy8gQ29udGV4dOS+i+WkluaDheWGtVxyXG5jb25zdCBDT05URVhUX0FQSV9SRV9FWEMgPSBbJ2NyZWF0ZUJMRUNvbm5lY3Rpb24nXTtcclxuXHJcbi8vIOWQjOatpeS+i+WkluaDheWGtVxyXG5jb25zdCBBU1lOQ19BUEkgPSBbJ2NyZWF0ZUJMRUNvbm5lY3Rpb24nXTtcclxuXHJcbmNvbnN0IENBTExCQUNLX0FQSV9SRSA9IC9eb258Xm9mZi87XHJcblxyXG5mdW5jdGlvbiBpc0NvbnRleHRBcGkgKG5hbWUpIHtcclxuICByZXR1cm4gQ09OVEVYVF9BUElfUkUudGVzdChuYW1lKSAmJiBDT05URVhUX0FQSV9SRV9FWEMuaW5kZXhPZihuYW1lKSA9PT0gLTFcclxufVxyXG5mdW5jdGlvbiBpc1N5bmNBcGkgKG5hbWUpIHtcclxuICByZXR1cm4gU1lOQ19BUElfUkUudGVzdChuYW1lKSAmJiBBU1lOQ19BUEkuaW5kZXhPZihuYW1lKSA9PT0gLTFcclxufVxyXG5cclxuZnVuY3Rpb24gaXNDYWxsYmFja0FwaSAobmFtZSkge1xyXG4gIHJldHVybiBDQUxMQkFDS19BUElfUkUudGVzdChuYW1lKSAmJiBuYW1lICE9PSAnb25QdXNoJ1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVQcm9taXNlIChwcm9taXNlKSB7XHJcbiAgcmV0dXJuIHByb21pc2UudGhlbihkYXRhID0+IHtcclxuICAgIHJldHVybiBbbnVsbCwgZGF0YV1cclxuICB9KVxyXG4gICAgLmNhdGNoKGVyciA9PiBbZXJyXSlcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvdWxkUHJvbWlzZSAobmFtZSkge1xyXG4gIGlmIChcclxuICAgIGlzQ29udGV4dEFwaShuYW1lKSB8fFxyXG4gICAgaXNTeW5jQXBpKG5hbWUpIHx8XHJcbiAgICBpc0NhbGxiYWNrQXBpKG5hbWUpXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgcmV0dXJuIHRydWVcclxufVxyXG5cclxuLyogZXNsaW50LWRpc2FibGUgbm8tZXh0ZW5kLW5hdGl2ZSAqL1xyXG5pZiAoIVByb21pc2UucHJvdG90eXBlLmZpbmFsbHkpIHtcclxuICBQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICBjb25zdCBwcm9taXNlID0gdGhpcy5jb25zdHJ1Y3RvcjtcclxuICAgIHJldHVybiB0aGlzLnRoZW4oXHJcbiAgICAgIHZhbHVlID0+IHByb21pc2UucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKCgpID0+IHZhbHVlKSxcclxuICAgICAgcmVhc29uID0+IHByb21pc2UucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKCgpID0+IHtcclxuICAgICAgICB0aHJvdyByZWFzb25cclxuICAgICAgfSlcclxuICAgIClcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9taXNpZnkgKG5hbWUsIGFwaSkge1xyXG4gIGlmICghc2hvdWxkUHJvbWlzZShuYW1lKSkge1xyXG4gICAgcmV0dXJuIGFwaVxyXG4gIH1cclxuICByZXR1cm4gZnVuY3Rpb24gcHJvbWlzZUFwaSAob3B0aW9ucyA9IHt9LCAuLi5wYXJhbXMpIHtcclxuICAgIGlmIChpc0ZuKG9wdGlvbnMuc3VjY2VzcykgfHwgaXNGbihvcHRpb25zLmZhaWwpIHx8IGlzRm4ob3B0aW9ucy5jb21wbGV0ZSkpIHtcclxuICAgICAgcmV0dXJuIHdyYXBwZXJSZXR1cm5WYWx1ZShuYW1lLCBpbnZva2VBcGkobmFtZSwgYXBpLCBvcHRpb25zLCAuLi5wYXJhbXMpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHdyYXBwZXJSZXR1cm5WYWx1ZShuYW1lLCBoYW5kbGVQcm9taXNlKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaW52b2tlQXBpKG5hbWUsIGFwaSwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xyXG4gICAgICAgIHN1Y2Nlc3M6IHJlc29sdmUsXHJcbiAgICAgICAgZmFpbDogcmVqZWN0XHJcbiAgICAgIH0pLCAuLi5wYXJhbXMpO1xyXG4gICAgfSkpKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgRVBTID0gMWUtNDtcclxuY29uc3QgQkFTRV9ERVZJQ0VfV0lEVEggPSA3NTA7XHJcbmxldCBpc0lPUyA9IGZhbHNlO1xyXG5sZXQgZGV2aWNlV2lkdGggPSAwO1xyXG5sZXQgZGV2aWNlRFBSID0gMDtcclxuXHJcbmZ1bmN0aW9uIGNoZWNrRGV2aWNlV2lkdGggKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHBsYXRmb3JtLFxyXG4gICAgcGl4ZWxSYXRpbyxcclxuICAgIHdpbmRvd1dpZHRoXHJcbiAgfSA9IHR0LmdldFN5c3RlbUluZm9TeW5jKCk7IC8vIHVuaT0+dHQgcnVudGltZSDnvJbor5Hnm67moIfmmK8gdW5pIOWvueixoe+8jOWGhemDqOS4jeWFgeiuuOebtOaOpeS9v+eUqCB1bmlcclxuXHJcbiAgZGV2aWNlV2lkdGggPSB3aW5kb3dXaWR0aDtcclxuICBkZXZpY2VEUFIgPSBwaXhlbFJhdGlvO1xyXG4gIGlzSU9TID0gcGxhdGZvcm0gPT09ICdpb3MnO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cHgycHggKG51bWJlciwgbmV3RGV2aWNlV2lkdGgpIHtcclxuICBpZiAoZGV2aWNlV2lkdGggPT09IDApIHtcclxuICAgIGNoZWNrRGV2aWNlV2lkdGgoKTtcclxuICB9XHJcblxyXG4gIG51bWJlciA9IE51bWJlcihudW1iZXIpO1xyXG4gIGlmIChudW1iZXIgPT09IDApIHtcclxuICAgIHJldHVybiAwXHJcbiAgfVxyXG4gIGxldCByZXN1bHQgPSAobnVtYmVyIC8gQkFTRV9ERVZJQ0VfV0lEVEgpICogKG5ld0RldmljZVdpZHRoIHx8IGRldmljZVdpZHRoKTtcclxuICBpZiAocmVzdWx0IDwgMCkge1xyXG4gICAgcmVzdWx0ID0gLXJlc3VsdDtcclxuICB9XHJcbiAgcmVzdWx0ID0gTWF0aC5mbG9vcihyZXN1bHQgKyBFUFMpO1xyXG4gIGlmIChyZXN1bHQgPT09IDApIHtcclxuICAgIGlmIChkZXZpY2VEUFIgPT09IDEgfHwgIWlzSU9TKSB7XHJcbiAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSAwLjU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBudW1iZXIgPCAwID8gLXJlc3VsdCA6IHJlc3VsdFxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRMb2NhbGUgKCkge1xyXG4gIC8vIOS8mOWFiOS9v+eUqCAkbG9jYWxlXHJcbiAgY29uc3QgYXBwID0gZ2V0QXBwKHtcclxuICAgIGFsbG93RGVmYXVsdDogdHJ1ZVxyXG4gIH0pO1xyXG4gIGlmIChhcHAgJiYgYXBwLiR2bSkge1xyXG4gICAgcmV0dXJuIGFwcC4kdm0uJGxvY2FsZVxyXG4gIH1cclxuICByZXR1cm4gdHQuZ2V0U3lzdGVtSW5mb1N5bmMoKS5sYW5ndWFnZSB8fCAnemgtSGFucydcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0TG9jYWxlIChsb2NhbGUpIHtcclxuICBjb25zdCBhcHAgPSBnZXRBcHAoKTtcclxuICBpZiAoIWFwcCkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIGNvbnN0IG9sZExvY2FsZSA9IGFwcC4kdm0uJGxvY2FsZTtcclxuICBpZiAob2xkTG9jYWxlICE9PSBsb2NhbGUpIHtcclxuICAgIGFwcC4kdm0uJGxvY2FsZSA9IGxvY2FsZTtcclxuICAgIG9uTG9jYWxlQ2hhbmdlQ2FsbGJhY2tzLmZvckVhY2goKGZuKSA9PiBmbih7XHJcbiAgICAgIGxvY2FsZVxyXG4gICAgfSkpO1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlXHJcbn1cclxuXHJcbmNvbnN0IG9uTG9jYWxlQ2hhbmdlQ2FsbGJhY2tzID0gW107XHJcbmZ1bmN0aW9uIG9uTG9jYWxlQ2hhbmdlIChmbikge1xyXG4gIGlmIChvbkxvY2FsZUNoYW5nZUNhbGxiYWNrcy5pbmRleE9mKGZuKSA9PT0gLTEpIHtcclxuICAgIG9uTG9jYWxlQ2hhbmdlQ2FsbGJhY2tzLnB1c2goZm4pO1xyXG4gIH1cclxufVxyXG5cclxuaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgZ2xvYmFsLmdldExvY2FsZSA9IGdldExvY2FsZTtcclxufVxyXG5cclxuY29uc3QgaW50ZXJjZXB0b3JzID0ge1xyXG4gIHByb21pc2VJbnRlcmNlcHRvclxyXG59O1xyXG5cclxudmFyIGJhc2VBcGkgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XHJcbiAgX19wcm90b19fOiBudWxsLFxyXG4gIHVweDJweDogdXB4MnB4LFxyXG4gIGdldExvY2FsZTogZ2V0TG9jYWxlLFxyXG4gIHNldExvY2FsZTogc2V0TG9jYWxlLFxyXG4gIG9uTG9jYWxlQ2hhbmdlOiBvbkxvY2FsZUNoYW5nZSxcclxuICBhZGRJbnRlcmNlcHRvcjogYWRkSW50ZXJjZXB0b3IsXHJcbiAgcmVtb3ZlSW50ZXJjZXB0b3I6IHJlbW92ZUludGVyY2VwdG9yLFxyXG4gIGludGVyY2VwdG9yczogaW50ZXJjZXB0b3JzXHJcbn0pO1xyXG5cclxuY2xhc3MgRXZlbnRDaGFubmVsIHtcclxuICBjb25zdHJ1Y3RvciAoaWQsIGV2ZW50cykge1xyXG4gICAgdGhpcy5pZCA9IGlkO1xyXG4gICAgdGhpcy5saXN0ZW5lciA9IHt9O1xyXG4gICAgdGhpcy5lbWl0Q2FjaGUgPSB7fTtcclxuICAgIGlmIChldmVudHMpIHtcclxuICAgICAgT2JqZWN0LmtleXMoZXZlbnRzKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICAgIHRoaXMub24obmFtZSwgZXZlbnRzW25hbWVdKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBlbWl0IChldmVudE5hbWUsIC4uLmFyZ3MpIHtcclxuICAgIGNvbnN0IGZucyA9IHRoaXMubGlzdGVuZXJbZXZlbnROYW1lXTtcclxuICAgIGlmICghZm5zKSB7XHJcbiAgICAgIHJldHVybiAodGhpcy5lbWl0Q2FjaGVbZXZlbnROYW1lXSB8fCAodGhpcy5lbWl0Q2FjaGVbZXZlbnROYW1lXSA9IFtdKSkucHVzaChhcmdzKVxyXG4gICAgfVxyXG4gICAgZm5zLmZvckVhY2gob3B0ID0+IHtcclxuICAgICAgb3B0LmZuLmFwcGx5KG9wdC5mbiwgYXJncyk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMubGlzdGVuZXJbZXZlbnROYW1lXSA9IGZucy5maWx0ZXIob3B0ID0+IG9wdC50eXBlICE9PSAnb25jZScpO1xyXG4gIH1cclxuXHJcbiAgb24gKGV2ZW50TmFtZSwgZm4pIHtcclxuICAgIHRoaXMuX2FkZExpc3RlbmVyKGV2ZW50TmFtZSwgJ29uJywgZm4pO1xyXG4gICAgdGhpcy5fY2xlYXJDYWNoZShldmVudE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgb25jZSAoZXZlbnROYW1lLCBmbikge1xyXG4gICAgdGhpcy5fYWRkTGlzdGVuZXIoZXZlbnROYW1lLCAnb25jZScsIGZuKTtcclxuICAgIHRoaXMuX2NsZWFyQ2FjaGUoZXZlbnROYW1lKTtcclxuICB9XHJcblxyXG4gIG9mZiAoZXZlbnROYW1lLCBmbikge1xyXG4gICAgY29uc3QgZm5zID0gdGhpcy5saXN0ZW5lcltldmVudE5hbWVdO1xyXG4gICAgaWYgKCFmbnMpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBpZiAoZm4pIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmbnMubGVuZ3RoOykge1xyXG4gICAgICAgIGlmIChmbnNbaV0uZm4gPT09IGZuKSB7XHJcbiAgICAgICAgICBmbnMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgaS0tO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpKys7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyW2V2ZW50TmFtZV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfY2xlYXJDYWNoZSAoZXZlbnROYW1lKSB7XHJcbiAgICBjb25zdCBjYWNoZUFyZ3MgPSB0aGlzLmVtaXRDYWNoZVtldmVudE5hbWVdO1xyXG4gICAgaWYgKGNhY2hlQXJncykge1xyXG4gICAgICBmb3IgKDsgY2FjaGVBcmdzLmxlbmd0aCA+IDA7KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0LmFwcGx5KHRoaXMsIFtldmVudE5hbWVdLmNvbmNhdChjYWNoZUFyZ3Muc2hpZnQoKSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfYWRkTGlzdGVuZXIgKGV2ZW50TmFtZSwgdHlwZSwgZm4pIHtcclxuICAgICh0aGlzLmxpc3RlbmVyW2V2ZW50TmFtZV0gfHwgKHRoaXMubGlzdGVuZXJbZXZlbnROYW1lXSA9IFtdKSkucHVzaCh7XHJcbiAgICAgIGZuLFxyXG4gICAgICB0eXBlXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGV2ZW50Q2hhbm5lbHMgPSB7fTtcclxuXHJcbmNvbnN0IGV2ZW50Q2hhbm5lbFN0YWNrID0gW107XHJcblxyXG5sZXQgaWQgPSAwO1xyXG5cclxuZnVuY3Rpb24gaW5pdEV2ZW50Q2hhbm5lbCAoZXZlbnRzLCBjYWNoZSA9IHRydWUpIHtcclxuICBpZCsrO1xyXG4gIGNvbnN0IGV2ZW50Q2hhbm5lbCA9IG5ldyBFdmVudENoYW5uZWwoaWQsIGV2ZW50cyk7XHJcbiAgaWYgKGNhY2hlKSB7XHJcbiAgICBldmVudENoYW5uZWxzW2lkXSA9IGV2ZW50Q2hhbm5lbDtcclxuICAgIGV2ZW50Q2hhbm5lbFN0YWNrLnB1c2goZXZlbnRDaGFubmVsKTtcclxuICB9XHJcbiAgcmV0dXJuIGV2ZW50Q2hhbm5lbFxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRFdmVudENoYW5uZWwgKGlkKSB7XHJcbiAgaWYgKGlkKSB7XHJcbiAgICBjb25zdCBldmVudENoYW5uZWwgPSBldmVudENoYW5uZWxzW2lkXTtcclxuICAgIGRlbGV0ZSBldmVudENoYW5uZWxzW2lkXTtcclxuICAgIHJldHVybiBldmVudENoYW5uZWxcclxuICB9XHJcbiAgcmV0dXJuIGV2ZW50Q2hhbm5lbFN0YWNrLnNoaWZ0KClcclxufVxyXG5cclxudmFyIG5hdmlnYXRlVG8gPSB7XHJcbiAgYXJncyAoZnJvbUFyZ3MsIHRvQXJncykge1xyXG4gICAgY29uc3QgaWQgPSBpbml0RXZlbnRDaGFubmVsKGZyb21BcmdzLmV2ZW50cykuaWQ7XHJcbiAgICBpZiAoZnJvbUFyZ3MudXJsKSB7XHJcbiAgICAgIGZyb21BcmdzLnVybCA9IGZyb21BcmdzLnVybCArIChmcm9tQXJncy51cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyAnX19pZF9fPScgKyBpZDtcclxuICAgIH1cclxuICB9LFxyXG4gIHJldHVyblZhbHVlIChmcm9tUmVzLCB0b1Jlcykge1xyXG4gICAgZnJvbVJlcy5ldmVudENoYW5uZWwgPSBnZXRFdmVudENoYW5uZWwoKTtcclxuICB9XHJcbn07XHJcblxyXG5mdW5jdGlvbiBmaW5kRXhpc3RzUGFnZUluZGV4ICh1cmwpIHtcclxuICBjb25zdCBwYWdlcyA9IGdldEN1cnJlbnRQYWdlcygpO1xyXG4gIGxldCBsZW4gPSBwYWdlcy5sZW5ndGg7XHJcbiAgd2hpbGUgKGxlbi0tKSB7XHJcbiAgICBjb25zdCBwYWdlID0gcGFnZXNbbGVuXTtcclxuICAgIGlmIChwYWdlLiRwYWdlICYmIHBhZ2UuJHBhZ2UuZnVsbFBhdGggPT09IHVybCkge1xyXG4gICAgICByZXR1cm4gbGVuXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiAtMVxyXG59XHJcblxyXG52YXIgcmVkaXJlY3RUbyA9IHtcclxuICBuYW1lIChmcm9tQXJncykge1xyXG4gICAgaWYgKGZyb21BcmdzLmV4aXN0cyA9PT0gJ2JhY2snICYmIGZyb21BcmdzLmRlbHRhKSB7XHJcbiAgICAgIHJldHVybiAnbmF2aWdhdGVCYWNrJ1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICdyZWRpcmVjdFRvJ1xyXG4gIH0sXHJcbiAgYXJncyAoZnJvbUFyZ3MpIHtcclxuICAgIGlmIChmcm9tQXJncy5leGlzdHMgPT09ICdiYWNrJyAmJiBmcm9tQXJncy51cmwpIHtcclxuICAgICAgY29uc3QgZXhpc3RzUGFnZUluZGV4ID0gZmluZEV4aXN0c1BhZ2VJbmRleChmcm9tQXJncy51cmwpO1xyXG4gICAgICBpZiAoZXhpc3RzUGFnZUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIGNvbnN0IGRlbHRhID0gZ2V0Q3VycmVudFBhZ2VzKCkubGVuZ3RoIC0gMSAtIGV4aXN0c1BhZ2VJbmRleDtcclxuICAgICAgICBpZiAoZGVsdGEgPiAwKSB7XHJcbiAgICAgICAgICBmcm9tQXJncy5kZWx0YSA9IGRlbHRhO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbnZhciBwcmV2aWV3SW1hZ2UgPSB7XHJcbiAgYXJncyAoZnJvbUFyZ3MpIHtcclxuICAgIGxldCBjdXJyZW50SW5kZXggPSBwYXJzZUludChmcm9tQXJncy5jdXJyZW50KTtcclxuICAgIGlmIChpc05hTihjdXJyZW50SW5kZXgpKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgY29uc3QgdXJscyA9IGZyb21BcmdzLnVybHM7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJscykpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBjb25zdCBsZW4gPSB1cmxzLmxlbmd0aDtcclxuICAgIGlmICghbGVuKSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHtcclxuICAgICAgY3VycmVudEluZGV4ID0gMDtcclxuICAgIH0gZWxzZSBpZiAoY3VycmVudEluZGV4ID49IGxlbikge1xyXG4gICAgICBjdXJyZW50SW5kZXggPSBsZW4gLSAxO1xyXG4gICAgfVxyXG4gICAgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcclxuICAgICAgZnJvbUFyZ3MuY3VycmVudCA9IHVybHNbY3VycmVudEluZGV4XTtcclxuICAgICAgZnJvbUFyZ3MudXJscyA9IHVybHMuZmlsdGVyKFxyXG4gICAgICAgIChpdGVtLCBpbmRleCkgPT4gaW5kZXggPCBjdXJyZW50SW5kZXggPyBpdGVtICE9PSB1cmxzW2N1cnJlbnRJbmRleF0gOiB0cnVlXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmcm9tQXJncy5jdXJyZW50ID0gdXJsc1swXTtcclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGluZGljYXRvcjogZmFsc2UsXHJcbiAgICAgIGxvb3A6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxuY29uc3QgVVVJRF9LRVkgPSAnX19EQ19TVEFUX1VVSUQnO1xyXG5sZXQgZGV2aWNlSWQ7XHJcbmZ1bmN0aW9uIGFkZFV1aWQgKHJlc3VsdCkge1xyXG4gIGRldmljZUlkID0gZGV2aWNlSWQgfHwgdHQuZ2V0U3RvcmFnZVN5bmMoVVVJRF9LRVkpO1xyXG4gIGlmICghZGV2aWNlSWQpIHtcclxuICAgIGRldmljZUlkID0gRGF0ZS5ub3coKSArICcnICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMWU3KTtcclxuICAgIHR0LnNldFN0b3JhZ2Uoe1xyXG4gICAgICBrZXk6IFVVSURfS0VZLFxyXG4gICAgICBkYXRhOiBkZXZpY2VJZFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJlc3VsdC5kZXZpY2VJZCA9IGRldmljZUlkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRTYWZlQXJlYUluc2V0cyAocmVzdWx0KSB7XHJcbiAgaWYgKHJlc3VsdC5zYWZlQXJlYSkge1xyXG4gICAgY29uc3Qgc2FmZUFyZWEgPSByZXN1bHQuc2FmZUFyZWE7XHJcbiAgICByZXN1bHQuc2FmZUFyZWFJbnNldHMgPSB7XHJcbiAgICAgIHRvcDogc2FmZUFyZWEudG9wLFxyXG4gICAgICBsZWZ0OiBzYWZlQXJlYS5sZWZ0LFxyXG4gICAgICByaWdodDogcmVzdWx0LndpbmRvd1dpZHRoIC0gc2FmZUFyZWEucmlnaHQsXHJcbiAgICAgIGJvdHRvbTogcmVzdWx0LndpbmRvd0hlaWdodCAtIHNhZmVBcmVhLmJvdHRvbVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbnZhciBnZXRTeXN0ZW1JbmZvID0ge1xyXG4gIHJldHVyblZhbHVlOiBmdW5jdGlvbiAocmVzdWx0KSB7XHJcbiAgICBhZGRVdWlkKHJlc3VsdCk7XHJcbiAgICBhZGRTYWZlQXJlYUluc2V0cyhyZXN1bHQpO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IG9OYW1lID0gJ2dldFVzZXJJbmZvJztcclxuY29uc3Qgbk5hbWUgPSAnZ2V0VXNlclByb2ZpbGUnO1xyXG5cclxudmFyIGdldFVzZXJQcm9maWxlID0ge1xyXG4gIG5hbWU6IHR0LmNhbklVc2Uobk5hbWUpID8gbk5hbWUgOiBvTmFtZVxyXG59O1xyXG5cclxuLy8g5LiN5pSv5oyB55qEIEFQSSDliJfooahcclxuY29uc3QgdG9kb3MgPSBbXHJcbiAgJ3ByZWxvYWRQYWdlJyxcclxuICAndW5QcmVsb2FkUGFnZScsXHJcbiAgJ2xvYWRTdWJQYWNrYWdlJ1xyXG4gIC8vICdjcmVhdGVDYW1lcmFDb250ZXh0JyxcclxuICAvLyAnY3JlYXRlTGl2ZVBsYXllckNvbnRleHQnLFxyXG4gIC8vICdnZXRTYXZlZEZpbGVJbmZvJyxcclxuICAvLyAnY3JlYXRlTWFwQ29udGV4dCcsXHJcbiAgLy8gJ29uTWVtb3J5V2FybmluZycsXHJcbiAgLy8gJ29uR3lyb3Njb3BlQ2hhbmdlJyxcclxuICAvLyAnc3RhcnRHeXJvc2NvcGUnLFxyXG4gIC8vICdzdG9wR3lyb3Njb3BlJyxcclxuICAvLyAnc2V0U2NyZWVuQnJpZ2h0bmVzcycsXHJcbiAgLy8gJ2dldFNjcmVlbkJyaWdodG5lc3MnLFxyXG4gIC8vICdhZGRQaG9uZUNvbnRhY3QnLFxyXG4gIC8vICdvcGVuQmx1ZXRvb3RoQWRhcHRlcicsXHJcbiAgLy8gJ3N0YXJ0Qmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeScsXHJcbiAgLy8gJ29uQmx1ZXRvb3RoRGV2aWNlRm91bmQnLFxyXG4gIC8vICdzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeScsXHJcbiAgLy8gJ29uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlJyxcclxuICAvLyAnZ2V0Q29ubmVjdGVkQmx1ZXRvb3RoRGV2aWNlcycsXHJcbiAgLy8gJ2dldEJsdWV0b290aERldmljZXMnLFxyXG4gIC8vICdnZXRCbHVldG9vdGhBZGFwdGVyU3RhdGUnLFxyXG4gIC8vICdjbG9zZUJsdWV0b290aEFkYXB0ZXInLFxyXG4gIC8vICd3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUnLFxyXG4gIC8vICdyZWFkQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZScsXHJcbiAgLy8gJ29uQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlJyxcclxuICAvLyAnb25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlJyxcclxuICAvLyAnbm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZScsXHJcbiAgLy8gJ2dldEJMRURldmljZVNlcnZpY2VzJyxcclxuICAvLyAnZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzJyxcclxuICAvLyAnY3JlYXRlQkxFQ29ubmVjdGlvbicsXHJcbiAgLy8gJ2Nsb3NlQkxFQ29ubmVjdGlvbicsXHJcbiAgLy8gJ29uQmVhY29uU2VydmljZUNoYW5nZScsXHJcbiAgLy8gJ29uQmVhY29uVXBkYXRlJyxcclxuICAvLyAnZ2V0QmVhY29ucycsXHJcbiAgLy8gJ3N0YXJ0QmVhY29uRGlzY292ZXJ5JyxcclxuICAvLyAnc3RvcEJlYWNvbkRpc2NvdmVyeScsXHJcbiAgLy8gJ3Nob3dOYXZpZ2F0aW9uQmFyTG9hZGluZycsXHJcbiAgLy8gJ2hpZGVOYXZpZ2F0aW9uQmFyTG9hZGluZycsXHJcbiAgLy8gJ3NldFRhYkJhckl0ZW0nLFxyXG4gIC8vICdzZXRUYWJCYXJTdHlsZScsXHJcbiAgLy8gJ2hpZGVUYWJCYXInLFxyXG4gIC8vICdzaG93VGFiQmFyJyxcclxuICAvLyAnc2V0VGFiQmFyQmFkZ2UnLFxyXG4gIC8vICdyZW1vdmVUYWJCYXJCYWRnZScsXHJcbiAgLy8gJ3Nob3dUYWJCYXJSZWREb3QnLFxyXG4gIC8vICdoaWRlVGFiQmFyUmVkRG90JyxcclxuICAvLyAnc2V0QmFja2dyb3VuZENvbG9yJyxcclxuICAvLyAnc2V0QmFja2dyb3VuZFRleHRTdHlsZScsXHJcbiAgLy8gJ2Nob29zZUludm9pY2VUaXRsZScsXHJcbiAgLy8gJ2FkZFRlbXBsYXRlJyxcclxuICAvLyAnZGVsZXRlVGVtcGxhdGUnLFxyXG4gIC8vICdnZXRUZW1wbGF0ZUxpYnJhcnlCeUlkJyxcclxuICAvLyAnZ2V0VGVtcGxhdGVMaWJyYXJ5TGlzdCcsXHJcbiAgLy8gJ2dldFRlbXBsYXRlTGlzdCcsXHJcbiAgLy8gJ3NlbmRUZW1wbGF0ZU1lc3NhZ2UnLFxyXG4gIC8vICdzZXRFbmFibGVEZWJ1ZycsXHJcbiAgLy8gJ29uV2luZG93UmVzaXplJyxcclxuICAvLyAnb2ZmV2luZG93UmVzaXplJyxcclxuICAvLyAnY3JlYXRlT2Zmc2NyZWVuQ2FudmFzJyxcclxuICAvLyAndmlicmF0ZSdcclxuXTtcclxuXHJcbi8vIOWtmOWcqOWFvOWuueaAp+eahCBBUEkg5YiX6KGoXHJcbi8vIOWktOadoeWwj+eoi+W6j+iHqjEuMzUuMCvmlK/mjIFjYW5JVXNlc1xyXG5jb25zdCBjYW5JVXNlcyA9IFtcclxuICAvLyAnY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXInLFxyXG4gIC8vICdnZXRTYXZlZEZpbGVMaXN0JyxcclxuICAvLyAncmVtb3ZlU2F2ZWRGaWxlJyxcclxuICAvLyAnaGlkZUtleWJvYXJkJyxcclxuICAvLyAnZ2V0SW1hZ2VJbmZvJyxcclxuICAvLyAnY3JlYXRlVmlkZW9Db250ZXh0JyxcclxuICAvLyAnb25Tb2NrZXRPcGVuJyxcclxuICAvLyAnb25Tb2NrZXRFcnJvcicsXHJcbiAgLy8gJ3NlbmRTb2NrZXRNZXNzYWdlJyxcclxuICAvLyAnb25Tb2NrZXRNZXNzYWdlJyxcclxuICAvLyAnY2xvc2VTb2NrZXQnLFxyXG4gIC8vICdvblNvY2tldENsb3NlJyxcclxuICAvLyAnZ2V0RXh0Q29uZmlnJyxcclxuICAvLyAnZ2V0RXh0Q29uZmlnU3luYycsXHJcbiAgLy8gJ25hdmlnYXRlVG9NaW5pUHJvZ3JhbScsXHJcbiAgLy8gJ25hdmlnYXRlQmFja01pbmlQcm9ncmFtJyxcclxuICAvLyAnY29tcHJlc3NJbWFnZScsXHJcbiAgLy8gJ2Nob29zZUxvY2F0aW9uJyxcclxuICAvLyAnb3BlbkRvY3VtZW50JyxcclxuICAvLyAnb25Vc2VyQ2FwdHVyZVNjcmVlbicsXHJcbiAgLy8gJ2dldEJhY2tncm91bmRBdWRpb01hbmFnZXInLFxyXG4gIC8vICdzZXROYXZpZ2F0aW9uQmFyQ29sb3InLFxyXG5dO1xyXG5cclxuLy8g6ZyA6KaB5YGa6L2s5o2i55qEIEFQSSDliJfooahcclxuY29uc3QgcHJvdG9jb2xzID0ge1xyXG4gIGNob29zZUltYWdlOiB7XHJcbiAgICBhcmdzOiB7XHJcbiAgICAgIHNpemVUeXBlOiBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgbmF2aWdhdGVUbyxcclxuICByZWRpcmVjdFRvLFxyXG4gIHByZXZpZXdJbWFnZSxcclxuICBnZXRTeXN0ZW1JbmZvLFxyXG4gIGdldFN5c3RlbUluZm9TeW5jOiBnZXRTeXN0ZW1JbmZvLFxyXG4gIGdldFVzZXJQcm9maWxlLFxyXG4gIGNvbm5lY3RTb2NrZXQ6IHtcclxuICAgIGFyZ3M6IHtcclxuICAgICAgbWV0aG9kOiBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgY2hvb3NlVmlkZW86IHtcclxuICAgIGFyZ3M6IHtcclxuICAgICAgY2FtZXJhOiBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgc2NhbkNvZGU6IHtcclxuICAgIGFyZ3M6IHtcclxuICAgICAgb25seUZyb21DYW1lcmE6IGZhbHNlLFxyXG4gICAgICBzY2FuVHlwZTogZmFsc2VcclxuICAgIH1cclxuICB9LFxyXG4gIHN0YXJ0QWNjZWxlcm9tZXRlcjoge1xyXG4gICAgYXJnczoge1xyXG4gICAgICBpbnRlcnZhbDogZmFsc2VcclxuICAgIH1cclxuICB9LFxyXG4gIHNob3dUb2FzdDoge1xyXG4gICAgYXJnczoge1xyXG4gICAgICBpbWFnZTogZmFsc2UsXHJcbiAgICAgIG1hc2s6IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICBzaG93TG9hZGluZzoge1xyXG4gICAgYXJnczoge1xyXG4gICAgICBtYXNrOiBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgc2hvd01vZGFsOiB7XHJcbiAgICBhcmdzOiB7XHJcbiAgICAgIGNhbmNlbENvbG9yOiBmYWxzZSxcclxuICAgICAgY29uZmlybUNvbG9yOiBmYWxzZVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgc2hvd0FjdGlvblNoZWV0OiB7XHJcbiAgICBhcmdzOiB7XHJcbiAgICAgIGl0ZW1Db2xvcjogZmFsc2VcclxuICAgIH1cclxuICB9LFxyXG4gIGxvZ2luOiB7XHJcbiAgICBhcmdzOiB7XHJcbiAgICAgIHNjb3BlczogZmFsc2UsXHJcbiAgICAgIHRpbWVvdXQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgfSxcclxuICBnZXRVc2VySW5mbzoge1xyXG4gICAgYXJnczoge1xyXG4gICAgICBsYW5nOiBmYWxzZSxcclxuICAgICAgdGltZW91dDogZmFsc2VcclxuICAgIH1cclxuICB9LFxyXG4gIHJlcXVlc3RQYXltZW50OiB7XHJcbiAgICBuYW1lOiB0dC5wYXkgPyAncGF5JyA6ICdyZXF1ZXN0UGF5bWVudCcsXHJcbiAgICBhcmdzOiB7XHJcbiAgICAgIG9yZGVySW5mbzogdHQucGF5ID8gJ29yZGVySW5mbycgOiAnZGF0YSdcclxuICAgIH1cclxuICB9LFxyXG4gIGdldEZpbGVJbmZvOiB7XHJcbiAgICBhcmdzOiB7XHJcbiAgICAgIGRpZ2VzdEFsZ29yaXRobTogZmFsc2VcclxuICAgIH1cclxuICB9XHJcbn07XHJcblxyXG5jb25zdCBDQUxMQkFDS1MgPSBbJ3N1Y2Nlc3MnLCAnZmFpbCcsICdjYW5jZWwnLCAnY29tcGxldGUnXTtcclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NDYWxsYmFjayAobWV0aG9kTmFtZSwgbWV0aG9kLCByZXR1cm5WYWx1ZSkge1xyXG4gIHJldHVybiBmdW5jdGlvbiAocmVzKSB7XHJcbiAgICByZXR1cm4gbWV0aG9kKHByb2Nlc3NSZXR1cm5WYWx1ZShtZXRob2ROYW1lLCByZXMsIHJldHVyblZhbHVlKSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NBcmdzIChtZXRob2ROYW1lLCBmcm9tQXJncywgYXJnc09wdGlvbiA9IHt9LCByZXR1cm5WYWx1ZSA9IHt9LCBrZWVwRnJvbUFyZ3MgPSBmYWxzZSkge1xyXG4gIGlmIChpc1BsYWluT2JqZWN0KGZyb21BcmdzKSkgeyAvLyDkuIDoiKwgYXBpIOeahOWPguaVsOino+aekFxyXG4gICAgY29uc3QgdG9BcmdzID0ga2VlcEZyb21BcmdzID09PSB0cnVlID8gZnJvbUFyZ3MgOiB7fTsgLy8gcmV0dXJuVmFsdWUg5Li6IGZhbHNlIOaXtu+8jOivtOaYjuaYr+agvOW8j+WMlui/lOWbnuWAvO+8jOebtOaOpeWcqOi/lOWbnuWAvOWvueixoeS4iuS/ruaUuei1i+WAvFxyXG4gICAgaWYgKGlzRm4oYXJnc09wdGlvbikpIHtcclxuICAgICAgYXJnc09wdGlvbiA9IGFyZ3NPcHRpb24oZnJvbUFyZ3MsIHRvQXJncykgfHwge307XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmcm9tQXJncykge1xyXG4gICAgICBpZiAoaGFzT3duKGFyZ3NPcHRpb24sIGtleSkpIHtcclxuICAgICAgICBsZXQga2V5T3B0aW9uID0gYXJnc09wdGlvbltrZXldO1xyXG4gICAgICAgIGlmIChpc0ZuKGtleU9wdGlvbikpIHtcclxuICAgICAgICAgIGtleU9wdGlvbiA9IGtleU9wdGlvbihmcm9tQXJnc1trZXldLCBmcm9tQXJncywgdG9BcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFrZXlPcHRpb24pIHsgLy8g5LiN5pSv5oyB55qE5Y+C5pWwXHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFRoZSAnJHttZXRob2ROYW1lfScgbWV0aG9kIG9mIHBsYXRmb3JtICflpLTmnaHlsI/nqIvluo8nIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9uICcke2tleX0nYCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc1N0cihrZXlPcHRpb24pKSB7IC8vIOmHjeWGmeWPguaVsCBrZXlcclxuICAgICAgICAgIHRvQXJnc1trZXlPcHRpb25dID0gZnJvbUFyZ3Nba2V5XTtcclxuICAgICAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoa2V5T3B0aW9uKSkgeyAvLyB7bmFtZTpuZXdOYW1lLHZhbHVlOnZhbHVlfeWPr+mHjeaWsOaMh+WumuWPguaVsCBrZXk6dmFsdWVcclxuICAgICAgICAgIHRvQXJnc1trZXlPcHRpb24ubmFtZSA/IGtleU9wdGlvbi5uYW1lIDoga2V5XSA9IGtleU9wdGlvbi52YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoQ0FMTEJBQ0tTLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcclxuICAgICAgICBpZiAoaXNGbihmcm9tQXJnc1trZXldKSkge1xyXG4gICAgICAgICAgdG9BcmdzW2tleV0gPSBwcm9jZXNzQ2FsbGJhY2sobWV0aG9kTmFtZSwgZnJvbUFyZ3Nba2V5XSwgcmV0dXJuVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoIWtlZXBGcm9tQXJncykge1xyXG4gICAgICAgICAgdG9BcmdzW2tleV0gPSBmcm9tQXJnc1trZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvQXJnc1xyXG4gIH0gZWxzZSBpZiAoaXNGbihmcm9tQXJncykpIHtcclxuICAgIGZyb21BcmdzID0gcHJvY2Vzc0NhbGxiYWNrKG1ldGhvZE5hbWUsIGZyb21BcmdzLCByZXR1cm5WYWx1ZSk7XHJcbiAgfVxyXG4gIHJldHVybiBmcm9tQXJnc1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzUmV0dXJuVmFsdWUgKG1ldGhvZE5hbWUsIHJlcywgcmV0dXJuVmFsdWUsIGtlZXBSZXR1cm5WYWx1ZSA9IGZhbHNlKSB7XHJcbiAgaWYgKGlzRm4ocHJvdG9jb2xzLnJldHVyblZhbHVlKSkgeyAvLyDlpITnkIbpgJrnlKggcmV0dXJuVmFsdWVcclxuICAgIHJlcyA9IHByb3RvY29scy5yZXR1cm5WYWx1ZShtZXRob2ROYW1lLCByZXMpO1xyXG4gIH1cclxuICByZXR1cm4gcHJvY2Vzc0FyZ3MobWV0aG9kTmFtZSwgcmVzLCByZXR1cm5WYWx1ZSwge30sIGtlZXBSZXR1cm5WYWx1ZSlcclxufVxyXG5cclxuZnVuY3Rpb24gd3JhcHBlciAobWV0aG9kTmFtZSwgbWV0aG9kKSB7XHJcbiAgaWYgKGhhc093bihwcm90b2NvbHMsIG1ldGhvZE5hbWUpKSB7XHJcbiAgICBjb25zdCBwcm90b2NvbCA9IHByb3RvY29sc1ttZXRob2ROYW1lXTtcclxuICAgIGlmICghcHJvdG9jb2wpIHsgLy8g5pqC5LiN5pSv5oyB55qEIGFwaVxyXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFBsYXRmb3JtICflpLTmnaHlsI/nqIvluo8nIGRvZXMgbm90IHN1cHBvcnQgJyR7bWV0aG9kTmFtZX0nLmApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZzEsIGFyZzIpIHsgLy8g55uu5YmNIGFwaSDmnIDlpJrkuKTkuKrlj4LmlbBcclxuICAgICAgbGV0IG9wdGlvbnMgPSBwcm90b2NvbDtcclxuICAgICAgaWYgKGlzRm4ocHJvdG9jb2wpKSB7XHJcbiAgICAgICAgb3B0aW9ucyA9IHByb3RvY29sKGFyZzEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhcmcxID0gcHJvY2Vzc0FyZ3MobWV0aG9kTmFtZSwgYXJnMSwgb3B0aW9ucy5hcmdzLCBvcHRpb25zLnJldHVyblZhbHVlKTtcclxuXHJcbiAgICAgIGNvbnN0IGFyZ3MgPSBbYXJnMV07XHJcbiAgICAgIGlmICh0eXBlb2YgYXJnMiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBhcmdzLnB1c2goYXJnMik7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGlzRm4ob3B0aW9ucy5uYW1lKSkge1xyXG4gICAgICAgIG1ldGhvZE5hbWUgPSBvcHRpb25zLm5hbWUoYXJnMSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNTdHIob3B0aW9ucy5uYW1lKSkge1xyXG4gICAgICAgIG1ldGhvZE5hbWUgPSBvcHRpb25zLm5hbWU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB0dFttZXRob2ROYW1lXS5hcHBseSh0dCwgYXJncyk7XHJcbiAgICAgIGlmIChpc1N5bmNBcGkobWV0aG9kTmFtZSkpIHsgLy8g5ZCM5q2lIGFwaVxyXG4gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuVmFsdWUobWV0aG9kTmFtZSwgcmV0dXJuVmFsdWUsIG9wdGlvbnMucmV0dXJuVmFsdWUsIGlzQ29udGV4dEFwaShtZXRob2ROYW1lKSlcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWVcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG1ldGhvZFxyXG59XHJcblxyXG5jb25zdCB0b2RvQXBpcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XHJcblxyXG5jb25zdCBUT0RPUyA9IFtcclxuICAnb25UYWJCYXJNaWRCdXR0b25UYXAnLFxyXG4gICdzdWJzY3JpYmVQdXNoJyxcclxuICAndW5zdWJzY3JpYmVQdXNoJyxcclxuICAnb25QdXNoJyxcclxuICAnb2ZmUHVzaCcsXHJcbiAgJ3NoYXJlJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlVG9kb0FwaSAobmFtZSkge1xyXG4gIHJldHVybiBmdW5jdGlvbiB0b2RvQXBpICh7XHJcbiAgICBmYWlsLFxyXG4gICAgY29tcGxldGVcclxuICB9KSB7XHJcbiAgICBjb25zdCByZXMgPSB7XHJcbiAgICAgIGVyck1zZzogYCR7bmFtZX06ZmFpbCBtZXRob2QgJyR7bmFtZX0nIG5vdCBzdXBwb3J0ZWRgXHJcbiAgICB9O1xyXG4gICAgaXNGbihmYWlsKSAmJiBmYWlsKHJlcyk7XHJcbiAgICBpc0ZuKGNvbXBsZXRlKSAmJiBjb21wbGV0ZShyZXMpO1xyXG4gIH1cclxufVxyXG5cclxuVE9ET1MuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xyXG4gIHRvZG9BcGlzW25hbWVdID0gY3JlYXRlVG9kb0FwaShuYW1lKTtcclxufSk7XHJcblxyXG52YXIgcHJvdmlkZXJzID0ge1xyXG4gIG9hdXRoOiBbJ3RvdXRpYW8nXSxcclxuICBzaGFyZTogWyd0b3V0aWFvJ10sXHJcbiAgcGF5bWVudDogWyd0b3V0aWFvJ10sXHJcbiAgcHVzaDogWyd0b3V0aWFvJ11cclxufTtcclxuXHJcbmZ1bmN0aW9uIGdldFByb3ZpZGVyICh7XHJcbiAgc2VydmljZSxcclxuICBzdWNjZXNzLFxyXG4gIGZhaWwsXHJcbiAgY29tcGxldGVcclxufSkge1xyXG4gIGxldCByZXMgPSBmYWxzZTtcclxuICBpZiAocHJvdmlkZXJzW3NlcnZpY2VdKSB7XHJcbiAgICByZXMgPSB7XHJcbiAgICAgIGVyck1zZzogJ2dldFByb3ZpZGVyOm9rJyxcclxuICAgICAgc2VydmljZSxcclxuICAgICAgcHJvdmlkZXI6IHByb3ZpZGVyc1tzZXJ2aWNlXVxyXG4gICAgfTtcclxuICAgIGlzRm4oc3VjY2VzcykgJiYgc3VjY2VzcyhyZXMpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXMgPSB7XHJcbiAgICAgIGVyck1zZzogJ2dldFByb3ZpZGVyOmZhaWwgc2VydmljZSBub3QgZm91bmQnXHJcbiAgICB9O1xyXG4gICAgaXNGbihmYWlsKSAmJiBmYWlsKHJlcyk7XHJcbiAgfVxyXG4gIGlzRm4oY29tcGxldGUpICYmIGNvbXBsZXRlKHJlcyk7XHJcbn1cclxuXHJcbnZhciBleHRyYUFwaSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcclxuICBfX3Byb3RvX186IG51bGwsXHJcbiAgZ2V0UHJvdmlkZXI6IGdldFByb3ZpZGVyXHJcbn0pO1xyXG5cclxuY29uc3QgZ2V0RW1pdHRlciA9IChmdW5jdGlvbiAoKSB7XHJcbiAgbGV0IEVtaXR0ZXI7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFVuaUVtaXR0ZXIgKCkge1xyXG4gICAgaWYgKCFFbWl0dGVyKSB7XHJcbiAgICAgIEVtaXR0ZXIgPSBuZXcgVnVlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gRW1pdHRlclxyXG4gIH1cclxufSkoKTtcclxuXHJcbmZ1bmN0aW9uIGFwcGx5IChjdHgsIG1ldGhvZCwgYXJncykge1xyXG4gIHJldHVybiBjdHhbbWV0aG9kXS5hcHBseShjdHgsIGFyZ3MpXHJcbn1cclxuXHJcbmZ1bmN0aW9uICRvbiAoKSB7XHJcbiAgcmV0dXJuIGFwcGx5KGdldEVtaXR0ZXIoKSwgJyRvbicsIFsuLi5hcmd1bWVudHNdKVxyXG59XHJcbmZ1bmN0aW9uICRvZmYgKCkge1xyXG4gIHJldHVybiBhcHBseShnZXRFbWl0dGVyKCksICckb2ZmJywgWy4uLmFyZ3VtZW50c10pXHJcbn1cclxuZnVuY3Rpb24gJG9uY2UgKCkge1xyXG4gIHJldHVybiBhcHBseShnZXRFbWl0dGVyKCksICckb25jZScsIFsuLi5hcmd1bWVudHNdKVxyXG59XHJcbmZ1bmN0aW9uICRlbWl0ICgpIHtcclxuICByZXR1cm4gYXBwbHkoZ2V0RW1pdHRlcigpLCAnJGVtaXQnLCBbLi4uYXJndW1lbnRzXSlcclxufVxyXG5cclxudmFyIGV2ZW50QXBpID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xyXG4gIF9fcHJvdG9fXzogbnVsbCxcclxuICAkb246ICRvbixcclxuICAkb2ZmOiAkb2ZmLFxyXG4gICRvbmNlOiAkb25jZSxcclxuICAkZW1pdDogJGVtaXRcclxufSk7XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVNZWRpYVF1ZXJ5T2JzZXJ2ZXIgKCkge1xyXG4gIGNvbnN0IG1lZGlhUXVlcnlPYnNlcnZlciA9IHt9O1xyXG4gIGNvbnN0IHtcclxuICAgIHdpbmRvd1dpZHRoLFxyXG4gICAgd2luZG93SGVpZ2h0XHJcbiAgfSA9IHR0LmdldFN5c3RlbUluZm9TeW5jKCk7XHJcblxyXG4gIGNvbnN0IG9yaWVudGF0aW9uID0gd2luZG93V2lkdGggPCB3aW5kb3dIZWlnaHQgPyAncG9ydHJhaXQnIDogJ2xhbmRzY2FwZSc7XHJcblxyXG4gIG1lZGlhUXVlcnlPYnNlcnZlci5vYnNlcnZlID0gKG9wdGlvbnMsIGNhbGxiYWNrKSA9PiB7XHJcbiAgICBsZXQgbWF0Y2hlcyA9IHRydWU7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gaW4gb3B0aW9ucykge1xyXG4gICAgICBjb25zdCBpdGVtVmFsdWUgPSBpdGVtID09PSAnb3JpZW50YXRpb24nID8gb3B0aW9uc1tpdGVtXSA6IE51bWJlcihvcHRpb25zW2l0ZW1dKTtcclxuICAgICAgaWYgKG9wdGlvbnNbaXRlbV0gIT09ICcnKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0gPT09ICd3aWR0aCcpIHtcclxuICAgICAgICAgIGlmIChpdGVtVmFsdWUgPT09IHdpbmRvd1dpZHRoKSB7XHJcbiAgICAgICAgICAgIG1hdGNoZXMgPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWF0Y2hlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhtYXRjaGVzKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0gPT09ICdtaW5XaWR0aCcpIHtcclxuICAgICAgICAgIGlmICh3aW5kb3dXaWR0aCA+PSBpdGVtVmFsdWUpIHtcclxuICAgICAgICAgICAgbWF0Y2hlcyA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXRjaGVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG1hdGNoZXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbSA9PT0gJ21heFdpZHRoJykge1xyXG4gICAgICAgICAgaWYgKHdpbmRvd1dpZHRoIDw9IGl0ZW1WYWx1ZSkge1xyXG4gICAgICAgICAgICBtYXRjaGVzID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1hdGNoZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgY2FsbGJhY2sobWF0Y2hlcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXRlbSA9PT0gJ2hlaWdodCcpIHtcclxuICAgICAgICAgIGlmIChpdGVtVmFsdWUgPT09IHdpbmRvd0hlaWdodCkge1xyXG4gICAgICAgICAgICBtYXRjaGVzID0gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1hdGNoZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgY2FsbGJhY2sobWF0Y2hlcyk7XHJcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtID09PSAnbWluSGVpZ2h0Jykge1xyXG4gICAgICAgICAgaWYgKHdpbmRvd0hlaWdodCA+PSBpdGVtVmFsdWUpIHtcclxuICAgICAgICAgICAgbWF0Y2hlcyA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXRjaGVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG1hdGNoZXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbSA9PT0gJ21heEhlaWdodCcpIHtcclxuICAgICAgICAgIGlmICh3aW5kb3dIZWlnaHQgPD0gaXRlbVZhbHVlKSB7XHJcbiAgICAgICAgICAgIG1hdGNoZXMgPSB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWF0Y2hlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhtYXRjaGVzKTtcclxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpdGVtID09PSAnb3JpZW50YXRpb24nKSB7XHJcbiAgICAgICAgICBpZiAob3B0aW9uc1tpdGVtXSA9PT0gb3JpZW50YXRpb24pIHtcclxuICAgICAgICAgICAgbWF0Y2hlcyA9IHRydWU7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtYXRjaGVzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKG1hdGNoZXMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2FsbGJhY2sobWF0Y2hlcyk7XHJcblxyXG4gICAgcmV0dXJuIG1hdGNoZXNcclxuICB9O1xyXG5cclxuICBtZWRpYVF1ZXJ5T2JzZXJ2ZXIuZGlzY29ubmVjdCA9ICgpID0+IHtcclxuICB9O1xyXG5cclxuICByZXR1cm4gbWVkaWFRdWVyeU9ic2VydmVyXHJcbn1cclxuXHJcbnZhciBhcGkgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XHJcbiAgX19wcm90b19fOiBudWxsLFxyXG4gIGNyZWF0ZU1lZGlhUXVlcnlPYnNlcnZlcjogY3JlYXRlTWVkaWFRdWVyeU9ic2VydmVyXHJcbn0pO1xyXG5cclxuY29uc3QgTVBQYWdlID0gUGFnZTtcclxuY29uc3QgTVBDb21wb25lbnQgPSBDb21wb25lbnQ7XHJcblxyXG5jb25zdCBjdXN0b21pemVSRSA9IC86L2c7XHJcblxyXG5jb25zdCBjdXN0b21pemUgPSBjYWNoZWQoKHN0cikgPT4ge1xyXG4gIHJldHVybiBjYW1lbGl6ZShzdHIucmVwbGFjZShjdXN0b21pemVSRSwgJy0nKSlcclxufSk7XHJcblxyXG5mdW5jdGlvbiBpbml0VHJpZ2dlckV2ZW50IChtcEluc3RhbmNlKSB7XHJcbiAgY29uc3Qgb2xkVHJpZ2dlckV2ZW50ID0gbXBJbnN0YW5jZS50cmlnZ2VyRXZlbnQ7XHJcbiAgY29uc3QgbmV3VHJpZ2dlckV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCAuLi5hcmdzKSB7XHJcbiAgICByZXR1cm4gb2xkVHJpZ2dlckV2ZW50LmFwcGx5KG1wSW5zdGFuY2UsIFtjdXN0b21pemUoZXZlbnQpLCAuLi5hcmdzXSlcclxuICB9O1xyXG4gIHRyeSB7XHJcbiAgICAvLyDkuqzkuJzlsI/nqIvluo8gdHJpZ2dlckV2ZW50IOS4uuWPquivu1xyXG4gICAgbXBJbnN0YW5jZS50cmlnZ2VyRXZlbnQgPSBuZXdUcmlnZ2VyRXZlbnQ7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIG1wSW5zdGFuY2UuX3RyaWdnZXJFdmVudCA9IG5ld1RyaWdnZXJFdmVudDtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRIb29rIChuYW1lLCBvcHRpb25zLCBpc0NvbXBvbmVudCkge1xyXG4gIHtcclxuICAgIC8vIGZpeCBieSBMeGgg5a2X6IqC6Ieq5a6a5LmJ57uE5Lu2Q29tcG9uZW505p6E6YCg5Zmo5paH5qGj5LiK5YaZ5pyJY3JlYXRlZO+8jOS9huaYr+Wunua1i+WPquinpuWPkeS6hmxpZmV0aW1lc+S4iueahGNyZWF0ZWRcclxuICAgIGlzQ29tcG9uZW50ICYmIG9wdGlvbnMubGlmZXRpbWVzICYmIG9wdGlvbnMubGlmZXRpbWVzW25hbWVdICYmIChvcHRpb25zID0gb3B0aW9ucy5saWZldGltZXMpO1xyXG4gIH1cclxuICBjb25zdCBvbGRIb29rID0gb3B0aW9uc1tuYW1lXTtcclxuICBpZiAoIW9sZEhvb2spIHtcclxuICAgIG9wdGlvbnNbbmFtZV0gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGluaXRUcmlnZ2VyRXZlbnQodGhpcyk7XHJcbiAgICB9O1xyXG4gIH0gZWxzZSB7XHJcbiAgICBvcHRpb25zW25hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcclxuICAgICAgaW5pdFRyaWdnZXJFdmVudCh0aGlzKTtcclxuICAgICAgcmV0dXJuIG9sZEhvb2suYXBwbHkodGhpcywgYXJncylcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbmlmICghTVBQYWdlLl9fJHdyYXBwZXJlZCkge1xyXG4gIE1QUGFnZS5fXyR3cmFwcGVyZWQgPSB0cnVlO1xyXG4gIFBhZ2UgPSBmdW5jdGlvbiAob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpbml0SG9vaygnb25Mb2FkJywgb3B0aW9ucyk7XHJcbiAgICByZXR1cm4gTVBQYWdlKG9wdGlvbnMpXHJcbiAgfTtcclxuICBQYWdlLmFmdGVyID0gTVBQYWdlLmFmdGVyO1xyXG5cclxuICBDb21wb25lbnQgPSBmdW5jdGlvbiAob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpbml0SG9vaygnY3JlYXRlZCcsIG9wdGlvbnMsIHRydWUpO1xyXG4gICAgcmV0dXJuIE1QQ29tcG9uZW50KG9wdGlvbnMpXHJcbiAgfTtcclxufVxyXG5cclxuY29uc3QgUEFHRV9FVkVOVF9IT09LUyA9IFtcclxuICAnb25QdWxsRG93blJlZnJlc2gnLFxyXG4gICdvblJlYWNoQm90dG9tJyxcclxuICAnb25BZGRUb0Zhdm9yaXRlcycsXHJcbiAgJ29uU2hhcmVUaW1lbGluZScsXHJcbiAgJ29uU2hhcmVBcHBNZXNzYWdlJyxcclxuICAnb25QYWdlU2Nyb2xsJyxcclxuICAnb25SZXNpemUnLFxyXG4gICdvblRhYkl0ZW1UYXAnXHJcbl07XHJcblxyXG5mdW5jdGlvbiBpbml0TW9ja3MgKHZtLCBtb2Nrcykge1xyXG4gIGNvbnN0IG1wSW5zdGFuY2UgPSB2bS4kbXBbdm0ubXBUeXBlXTtcclxuICBtb2Nrcy5mb3JFYWNoKG1vY2sgPT4ge1xyXG4gICAgaWYgKGhhc093bihtcEluc3RhbmNlLCBtb2NrKSkge1xyXG4gICAgICB2bVttb2NrXSA9IG1wSW5zdGFuY2VbbW9ja107XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc0hvb2sgKGhvb2ssIHZ1ZU9wdGlvbnMpIHtcclxuICBpZiAoIXZ1ZU9wdGlvbnMpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBpZiAoVnVlLm9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShWdWUub3B0aW9uc1tob29rXSkpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICB2dWVPcHRpb25zID0gdnVlT3B0aW9ucy5kZWZhdWx0IHx8IHZ1ZU9wdGlvbnM7XHJcblxyXG4gIGlmIChpc0ZuKHZ1ZU9wdGlvbnMpKSB7XHJcbiAgICBpZiAoaXNGbih2dWVPcHRpb25zLmV4dGVuZE9wdGlvbnNbaG9va10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICBpZiAodnVlT3B0aW9ucy5zdXBlciAmJlxyXG4gICAgICB2dWVPcHRpb25zLnN1cGVyLm9wdGlvbnMgJiZcclxuICAgICAgQXJyYXkuaXNBcnJheSh2dWVPcHRpb25zLnN1cGVyLm9wdGlvbnNbaG9va10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGlmIChpc0ZuKHZ1ZU9wdGlvbnNbaG9va10pKSB7XHJcbiAgICByZXR1cm4gdHJ1ZVxyXG4gIH1cclxuICBjb25zdCBtaXhpbnMgPSB2dWVPcHRpb25zLm1peGlucztcclxuICBpZiAoQXJyYXkuaXNBcnJheShtaXhpbnMpKSB7XHJcbiAgICByZXR1cm4gISFtaXhpbnMuZmluZChtaXhpbiA9PiBoYXNIb29rKGhvb2ssIG1peGluKSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRIb29rcyAobXBPcHRpb25zLCBob29rcywgdnVlT3B0aW9ucykge1xyXG4gIGhvb2tzLmZvckVhY2goaG9vayA9PiB7XHJcbiAgICBpZiAoaGFzSG9vayhob29rLCB2dWVPcHRpb25zKSkge1xyXG4gICAgICBtcE9wdGlvbnNbaG9va10gPSBmdW5jdGlvbiAoYXJncykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLiR2bSAmJiB0aGlzLiR2bS5fX2NhbGxfaG9vayhob29rLCBhcmdzKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0VnVlQ29tcG9uZW50IChWdWUsIHZ1ZU9wdGlvbnMpIHtcclxuICB2dWVPcHRpb25zID0gdnVlT3B0aW9ucy5kZWZhdWx0IHx8IHZ1ZU9wdGlvbnM7XHJcbiAgbGV0IFZ1ZUNvbXBvbmVudDtcclxuICBpZiAoaXNGbih2dWVPcHRpb25zKSkge1xyXG4gICAgVnVlQ29tcG9uZW50ID0gdnVlT3B0aW9ucztcclxuICB9IGVsc2Uge1xyXG4gICAgVnVlQ29tcG9uZW50ID0gVnVlLmV4dGVuZCh2dWVPcHRpb25zKTtcclxuICB9XHJcbiAgdnVlT3B0aW9ucyA9IFZ1ZUNvbXBvbmVudC5vcHRpb25zO1xyXG4gIHJldHVybiBbVnVlQ29tcG9uZW50LCB2dWVPcHRpb25zXVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0U2xvdHMgKHZtLCB2dWVTbG90cykge1xyXG4gIGlmIChBcnJheS5pc0FycmF5KHZ1ZVNsb3RzKSAmJiB2dWVTbG90cy5sZW5ndGgpIHtcclxuICAgIGNvbnN0ICRzbG90cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XHJcbiAgICB2dWVTbG90cy5mb3JFYWNoKHNsb3ROYW1lID0+IHtcclxuICAgICAgJHNsb3RzW3Nsb3ROYW1lXSA9IHRydWU7XHJcbiAgICB9KTtcclxuICAgIHZtLiRzY29wZWRTbG90cyA9IHZtLiRzbG90cyA9ICRzbG90cztcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRWdWVJZHMgKHZ1ZUlkcywgbXBJbnN0YW5jZSkge1xyXG4gIHZ1ZUlkcyA9ICh2dWVJZHMgfHwgJycpLnNwbGl0KCcsJyk7XHJcbiAgY29uc3QgbGVuID0gdnVlSWRzLmxlbmd0aDtcclxuXHJcbiAgaWYgKGxlbiA9PT0gMSkge1xyXG4gICAgbXBJbnN0YW5jZS5fJHZ1ZUlkID0gdnVlSWRzWzBdO1xyXG4gIH0gZWxzZSBpZiAobGVuID09PSAyKSB7XHJcbiAgICBtcEluc3RhbmNlLl8kdnVlSWQgPSB2dWVJZHNbMF07XHJcbiAgICBtcEluc3RhbmNlLl8kdnVlUGlkID0gdnVlSWRzWzFdO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdERhdGEgKHZ1ZU9wdGlvbnMsIGNvbnRleHQpIHtcclxuICBsZXQgZGF0YSA9IHZ1ZU9wdGlvbnMuZGF0YSB8fCB7fTtcclxuICBjb25zdCBtZXRob2RzID0gdnVlT3B0aW9ucy5tZXRob2RzIHx8IHt9O1xyXG5cclxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdmdW5jdGlvbicpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGRhdGEgPSBkYXRhLmNhbGwoY29udGV4dCk7IC8vIOaUr+aMgSBWdWUucHJvdG90eXBlIOS4iuaMgueahOaVsOaNrlxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuVlVFX0FQUF9ERUJVRykge1xyXG4gICAgICAgIGNvbnNvbGUud2Fybign5qC55o2uIFZ1ZSDnmoQgZGF0YSDlh73mlbDliJ3lp4vljJblsI/nqIvluo8gZGF0YSDlpLHotKXvvIzor7flsL3ph4/noa7kv50gZGF0YSDlh73mlbDkuK3kuI3orr/pl64gdm0g5a+56LGh77yM5ZCm5YiZ5Y+v6IO95b2x5ZON6aaW5qyh5pWw5o2u5riy5p+T6YCf5bqm44CCJywgZGF0YSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8g5a+5IGRhdGEg5qC85byP5YyWXHJcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgfVxyXG5cclxuICBpZiAoIWlzUGxhaW5PYmplY3QoZGF0YSkpIHtcclxuICAgIGRhdGEgPSB7fTtcclxuICB9XHJcblxyXG4gIE9iamVjdC5rZXlzKG1ldGhvZHMpLmZvckVhY2gobWV0aG9kTmFtZSA9PiB7XHJcbiAgICBpZiAoY29udGV4dC5fX2xpZmVjeWNsZV9ob29rc19fLmluZGV4T2YobWV0aG9kTmFtZSkgPT09IC0xICYmICFoYXNPd24oZGF0YSwgbWV0aG9kTmFtZSkpIHtcclxuICAgICAgZGF0YVttZXRob2ROYW1lXSA9IG1ldGhvZHNbbWV0aG9kTmFtZV07XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBkYXRhXHJcbn1cclxuXHJcbmNvbnN0IFBST1BfVFlQRVMgPSBbU3RyaW5nLCBOdW1iZXIsIEJvb2xlYW4sIE9iamVjdCwgQXJyYXksIG51bGxdO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlT2JzZXJ2ZXIgKG5hbWUpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gb2JzZXJ2ZXIgKG5ld1ZhbCwgb2xkVmFsKSB7XHJcbiAgICBpZiAodGhpcy4kdm0pIHtcclxuICAgICAgdGhpcy4kdm1bbmFtZV0gPSBuZXdWYWw7IC8vIOS4uuS6huinpuWPkeWFtuS7lumdniByZW5kZXIgd2F0Y2hlclxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEJlaGF2aW9ycyAodnVlT3B0aW9ucywgaW5pdEJlaGF2aW9yKSB7XHJcbiAgY29uc3QgdnVlQmVoYXZpb3JzID0gdnVlT3B0aW9ucy5iZWhhdmlvcnM7XHJcbiAgY29uc3QgdnVlRXh0ZW5kcyA9IHZ1ZU9wdGlvbnMuZXh0ZW5kcztcclxuICBjb25zdCB2dWVNaXhpbnMgPSB2dWVPcHRpb25zLm1peGlucztcclxuXHJcbiAgbGV0IHZ1ZVByb3BzID0gdnVlT3B0aW9ucy5wcm9wcztcclxuXHJcbiAgaWYgKCF2dWVQcm9wcykge1xyXG4gICAgdnVlT3B0aW9ucy5wcm9wcyA9IHZ1ZVByb3BzID0gW107XHJcbiAgfVxyXG5cclxuICBjb25zdCBiZWhhdmlvcnMgPSBbXTtcclxuICBpZiAoQXJyYXkuaXNBcnJheSh2dWVCZWhhdmlvcnMpKSB7XHJcbiAgICB2dWVCZWhhdmlvcnMuZm9yRWFjaChiZWhhdmlvciA9PiB7XHJcbiAgICAgIGJlaGF2aW9ycy5wdXNoKGJlaGF2aW9yLnJlcGxhY2UoJ3VuaTovLycsIGAke1widHRcIn06Ly9gKSk7XHJcbiAgICAgIGlmIChiZWhhdmlvciA9PT0gJ3VuaTovL2Zvcm0tZmllbGQnKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodnVlUHJvcHMpKSB7XHJcbiAgICAgICAgICB2dWVQcm9wcy5wdXNoKCduYW1lJyk7XHJcbiAgICAgICAgICB2dWVQcm9wcy5wdXNoKCd2YWx1ZScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2dWVQcm9wcy5uYW1lID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICcnXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdnVlUHJvcHMudmFsdWUgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFtTdHJpbmcsIE51bWJlciwgQm9vbGVhbiwgQXJyYXksIE9iamVjdCwgRGF0ZV0sXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICcnXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGlmIChpc1BsYWluT2JqZWN0KHZ1ZUV4dGVuZHMpICYmIHZ1ZUV4dGVuZHMucHJvcHMpIHtcclxuICAgIGJlaGF2aW9ycy5wdXNoKFxyXG4gICAgICBpbml0QmVoYXZpb3Ioe1xyXG4gICAgICAgIHByb3BlcnRpZXM6IGluaXRQcm9wZXJ0aWVzKHZ1ZUV4dGVuZHMucHJvcHMsIHRydWUpXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICBpZiAoQXJyYXkuaXNBcnJheSh2dWVNaXhpbnMpKSB7XHJcbiAgICB2dWVNaXhpbnMuZm9yRWFjaCh2dWVNaXhpbiA9PiB7XHJcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KHZ1ZU1peGluKSAmJiB2dWVNaXhpbi5wcm9wcykge1xyXG4gICAgICAgIGJlaGF2aW9ycy5wdXNoKFxyXG4gICAgICAgICAgaW5pdEJlaGF2aW9yKHtcclxuICAgICAgICAgICAgcHJvcGVydGllczogaW5pdFByb3BlcnRpZXModnVlTWl4aW4ucHJvcHMsIHRydWUpXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICByZXR1cm4gYmVoYXZpb3JzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlUHJvcFR5cGUgKGtleSwgdHlwZSwgZGVmYXVsdFZhbHVlLCBmaWxlKSB7XHJcbiAgLy8gW1N0cmluZ109PlN0cmluZ1xyXG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpICYmIHR5cGUubGVuZ3RoID09PSAxKSB7XHJcbiAgICByZXR1cm4gdHlwZVswXVxyXG4gIH1cclxuICByZXR1cm4gdHlwZVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0UHJvcGVydGllcyAocHJvcHMsIGlzQmVoYXZpb3IgPSBmYWxzZSwgZmlsZSA9ICcnKSB7XHJcbiAgY29uc3QgcHJvcGVydGllcyA9IHt9O1xyXG4gIGlmICghaXNCZWhhdmlvcikge1xyXG4gICAgcHJvcGVydGllcy52dWVJZCA9IHtcclxuICAgICAgdHlwZTogU3RyaW5nLFxyXG4gICAgICB2YWx1ZTogJydcclxuICAgIH07XHJcbiAgICAvLyDnlKjkuo7lrZfoioLot7PliqjlsI/nqIvluo/mqKHmi5/mir3osaHoioLngrlcclxuICAgIHByb3BlcnRpZXMuZ2VuZXJpYyA9IHtcclxuICAgICAgdHlwZTogT2JqZWN0LFxyXG4gICAgICB2YWx1ZTogbnVsbFxyXG4gICAgfTtcclxuICAgIC8vIHNjb3BlZFNsb3RzQ29tcGlsZXIgYXV0b1xyXG4gICAgcHJvcGVydGllcy5zY29wZWRTbG90c0NvbXBpbGVyID0ge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIHZhbHVlOiAnJ1xyXG4gICAgfTtcclxuICAgIHByb3BlcnRpZXMudnVlU2xvdHMgPSB7IC8vIOWwj+eoi+W6j+S4jeiDveebtOaOpeWumuS5iSAkc2xvdHMg55qEIHByb3Bz77yM5omA5Lul6YCa6L+HIHZ1ZVNsb3RzIOi9rOaNouWIsCAkc2xvdHNcclxuICAgICAgdHlwZTogbnVsbCxcclxuICAgICAgdmFsdWU6IFtdLFxyXG4gICAgICBvYnNlcnZlcjogZnVuY3Rpb24gKG5ld1ZhbCwgb2xkVmFsKSB7XHJcbiAgICAgICAgY29uc3QgJHNsb3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICAgICAgICBuZXdWYWwuZm9yRWFjaChzbG90TmFtZSA9PiB7XHJcbiAgICAgICAgICAkc2xvdHNbc2xvdE5hbWVdID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICAgICAgJHNsb3RzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG4gIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgeyAvLyBbJ3RpdGxlJ11cclxuICAgIHByb3BzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgcHJvcGVydGllc1trZXldID0ge1xyXG4gICAgICAgIHR5cGU6IG51bGwsXHJcbiAgICAgICAgb2JzZXJ2ZXI6IGNyZWF0ZU9ic2VydmVyKGtleSlcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsgLy8ge3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OicnfSxjb250ZW50OlN0cmluZ31cclxuICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdHMgPSBwcm9wc1trZXldO1xyXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChvcHRzKSkgeyAvLyB0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ31cclxuICAgICAgICBsZXQgdmFsdWUgPSBvcHRzLmRlZmF1bHQ7XHJcbiAgICAgICAgaWYgKGlzRm4odmFsdWUpKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvcHRzLnR5cGUgPSBwYXJzZVByb3BUeXBlKGtleSwgb3B0cy50eXBlKTtcclxuXHJcbiAgICAgICAgcHJvcGVydGllc1trZXldID0ge1xyXG4gICAgICAgICAgdHlwZTogUFJPUF9UWVBFUy5pbmRleE9mKG9wdHMudHlwZSkgIT09IC0xID8gb3B0cy50eXBlIDogbnVsbCxcclxuICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgb2JzZXJ2ZXI6IGNyZWF0ZU9ic2VydmVyKGtleSlcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2UgeyAvLyBjb250ZW50OlN0cmluZ1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBwYXJzZVByb3BUeXBlKGtleSwgb3B0cyk7XHJcbiAgICAgICAgcHJvcGVydGllc1trZXldID0ge1xyXG4gICAgICAgICAgdHlwZTogUFJPUF9UWVBFUy5pbmRleE9mKHR5cGUpICE9PSAtMSA/IHR5cGUgOiBudWxsLFxyXG4gICAgICAgICAgb2JzZXJ2ZXI6IGNyZWF0ZU9ic2VydmVyKGtleSlcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmV0dXJuIHByb3BlcnRpZXNcclxufVxyXG5cclxuZnVuY3Rpb24gd3JhcHBlciQxIChldmVudCkge1xyXG4gIC8vIFRPRE8g5Y+I5b6X5YW85a65IG1wdnVlIOeahCBtcCDlr7nosaFcclxuICB0cnkge1xyXG4gICAgZXZlbnQubXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XHJcbiAgfSBjYXRjaCAoZSkge31cclxuXHJcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gbm9vcDtcclxuICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IG5vb3A7XHJcblxyXG4gIGV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldCB8fCB7fTtcclxuXHJcbiAgaWYgKCFoYXNPd24oZXZlbnQsICdkZXRhaWwnKSkge1xyXG4gICAgZXZlbnQuZGV0YWlsID0ge307XHJcbiAgfVxyXG5cclxuICBpZiAoaGFzT3duKGV2ZW50LCAnbWFya2VySWQnKSkge1xyXG4gICAgZXZlbnQuZGV0YWlsID0gdHlwZW9mIGV2ZW50LmRldGFpbCA9PT0gJ29iamVjdCcgPyBldmVudC5kZXRhaWwgOiB7fTtcclxuICAgIGV2ZW50LmRldGFpbC5tYXJrZXJJZCA9IGV2ZW50Lm1hcmtlcklkO1xyXG4gIH1cclxuXHJcbiAgaWYgKGlzUGxhaW5PYmplY3QoZXZlbnQuZGV0YWlsKSkge1xyXG4gICAgZXZlbnQudGFyZ2V0ID0gT2JqZWN0LmFzc2lnbih7fSwgZXZlbnQudGFyZ2V0LCBldmVudC5kZXRhaWwpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGV2ZW50XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEV4dHJhVmFsdWUgKHZtLCBkYXRhUGF0aHNBcnJheSkge1xyXG4gIGxldCBjb250ZXh0ID0gdm07XHJcbiAgZGF0YVBhdGhzQXJyYXkuZm9yRWFjaChkYXRhUGF0aEFycmF5ID0+IHtcclxuICAgIGNvbnN0IGRhdGFQYXRoID0gZGF0YVBhdGhBcnJheVswXTtcclxuICAgIGNvbnN0IHZhbHVlID0gZGF0YVBhdGhBcnJheVsyXTtcclxuICAgIGlmIChkYXRhUGF0aCB8fCB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7IC8vIFsnJywnJyxpbmRleCwnZGlzYWJsZSddXHJcbiAgICAgIGNvbnN0IHByb3BQYXRoID0gZGF0YVBhdGhBcnJheVsxXTtcclxuICAgICAgY29uc3QgdmFsdWVQYXRoID0gZGF0YVBhdGhBcnJheVszXTtcclxuXHJcbiAgICAgIGxldCB2Rm9yO1xyXG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihkYXRhUGF0aCkpIHtcclxuICAgICAgICB2Rm9yID0gZGF0YVBhdGg7XHJcbiAgICAgIH0gZWxzZSBpZiAoIWRhdGFQYXRoKSB7XHJcbiAgICAgICAgdkZvciA9IGNvbnRleHQ7XHJcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGFQYXRoID09PSAnc3RyaW5nJyAmJiBkYXRhUGF0aCkge1xyXG4gICAgICAgIGlmIChkYXRhUGF0aC5pbmRleE9mKCcjcyMnKSA9PT0gMCkge1xyXG4gICAgICAgICAgdkZvciA9IGRhdGFQYXRoLnN1YnN0cigzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdkZvciA9IHZtLl9fZ2V0X3ZhbHVlKGRhdGFQYXRoLCBjb250ZXh0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHZGb3IpKSB7XHJcbiAgICAgICAgY29udGV4dCA9IHZhbHVlO1xyXG4gICAgICB9IGVsc2UgaWYgKCFwcm9wUGF0aCkge1xyXG4gICAgICAgIGNvbnRleHQgPSB2Rm9yW3ZhbHVlXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2Rm9yKSkge1xyXG4gICAgICAgICAgY29udGV4dCA9IHZGb3IuZmluZCh2Rm9ySXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5fX2dldF92YWx1ZShwcm9wUGF0aCwgdkZvckl0ZW0pID09PSB2YWx1ZVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZGb3IpKSB7XHJcbiAgICAgICAgICBjb250ZXh0ID0gT2JqZWN0LmtleXModkZvcikuZmluZCh2Rm9yS2V5ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHZtLl9fZ2V0X3ZhbHVlKHByb3BQYXRoLCB2Rm9yW3ZGb3JLZXldKSA9PT0gdmFsdWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCd2LWZvciDmmoLkuI3mlK/mjIHlvqrnjq/mlbDmja7vvJonLCB2Rm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh2YWx1ZVBhdGgpIHtcclxuICAgICAgICBjb250ZXh0ID0gdm0uX19nZXRfdmFsdWUodmFsdWVQYXRoLCBjb250ZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiBjb250ZXh0XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NFdmVudEV4dHJhICh2bSwgZXh0cmEsIGV2ZW50KSB7XHJcbiAgY29uc3QgZXh0cmFPYmogPSB7fTtcclxuXHJcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXh0cmEpICYmIGV4dHJhLmxlbmd0aCkge1xyXG4gICAgLyoqXHJcbiAgICAgKltcclxuICAgICAqICAgIFsnZGF0YS5pdGVtcycsICdkYXRhLmlkJywgaXRlbS5kYXRhLmlkXSxcclxuICAgICAqICAgIFsnbWV0YXMnLCAnaWQnLCBtZXRhLmlkXVxyXG4gICAgICpdLFxyXG4gICAgICpbXHJcbiAgICAgKiAgICBbJ2RhdGEuaXRlbXMnLCAnZGF0YS5pZCcsIGl0ZW0uZGF0YS5pZF0sXHJcbiAgICAgKiAgICBbJ21ldGFzJywgJ2lkJywgbWV0YS5pZF1cclxuICAgICAqXSxcclxuICAgICAqJ3Rlc3QnXHJcbiAgICAgKi9cclxuICAgIGV4dHJhLmZvckVhY2goKGRhdGFQYXRoLCBpbmRleCkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIGRhdGFQYXRoID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGlmICghZGF0YVBhdGgpIHsgLy8gbW9kZWwscHJvcC5zeW5jXHJcbiAgICAgICAgICBleHRyYU9ialsnJCcgKyBpbmRleF0gPSB2bTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGRhdGFQYXRoID09PSAnJGV2ZW50JykgeyAvLyAkZXZlbnRcclxuICAgICAgICAgICAgZXh0cmFPYmpbJyQnICsgaW5kZXhdID0gZXZlbnQ7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFQYXRoID09PSAnYXJndW1lbnRzJykge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsICYmIGV2ZW50LmRldGFpbC5fX2FyZ3NfXykge1xyXG4gICAgICAgICAgICAgIGV4dHJhT2JqWyckJyArIGluZGV4XSA9IGV2ZW50LmRldGFpbC5fX2FyZ3NfXztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBleHRyYU9ialsnJCcgKyBpbmRleF0gPSBbZXZlbnRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFQYXRoLmluZGV4T2YoJyRldmVudC4nKSA9PT0gMCkgeyAvLyAkZXZlbnQudGFyZ2V0LnZhbHVlXHJcbiAgICAgICAgICAgIGV4dHJhT2JqWyckJyArIGluZGV4XSA9IHZtLl9fZ2V0X3ZhbHVlKGRhdGFQYXRoLnJlcGxhY2UoJyRldmVudC4nLCAnJyksIGV2ZW50KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4dHJhT2JqWyckJyArIGluZGV4XSA9IHZtLl9fZ2V0X3ZhbHVlKGRhdGFQYXRoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZXh0cmFPYmpbJyQnICsgaW5kZXhdID0gZ2V0RXh0cmFWYWx1ZSh2bSwgZGF0YVBhdGgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHJldHVybiBleHRyYU9ialxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRPYmpCeUFycmF5IChhcnIpIHtcclxuICBjb25zdCBvYmogPSB7fTtcclxuICBmb3IgKGxldCBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGFycltpXTtcclxuICAgIG9ialtlbGVtZW50WzBdXSA9IGVsZW1lbnRbMV07XHJcbiAgfVxyXG4gIHJldHVybiBvYmpcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyAodm0sIGV2ZW50LCBhcmdzID0gW10sIGV4dHJhID0gW10sIGlzQ3VzdG9tLCBtZXRob2ROYW1lKSB7XHJcbiAgbGV0IGlzQ3VzdG9tTVBFdmVudCA9IGZhbHNlOyAvLyB3eGNvbXBvbmVudCDnu4Tku7bvvIzkvKDpgJLljp/lp4sgZXZlbnQg5a+56LGhXHJcbiAgaWYgKGlzQ3VzdG9tKSB7IC8vIOiHquWumuS5ieS6i+S7tlxyXG4gICAgaXNDdXN0b21NUEV2ZW50ID0gZXZlbnQuY3VycmVudFRhcmdldCAmJlxyXG4gICAgICBldmVudC5jdXJyZW50VGFyZ2V0LmRhdGFzZXQgJiZcclxuICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0LmNvbVR5cGUgPT09ICd3eCc7XHJcbiAgICBpZiAoIWFyZ3MubGVuZ3RoKSB7IC8vIOaXoOWPguaVsO+8jOebtOaOpeS8oOWFpSBldmVudCDmiJYgZGV0YWlsIOaVsOe7hFxyXG4gICAgICBpZiAoaXNDdXN0b21NUEV2ZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIFtldmVudF1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXZlbnQuZGV0YWlsLl9fYXJnc19fIHx8IGV2ZW50LmRldGFpbFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZXh0cmFPYmogPSBwcm9jZXNzRXZlbnRFeHRyYSh2bSwgZXh0cmEsIGV2ZW50KTtcclxuXHJcbiAgY29uc3QgcmV0ID0gW107XHJcbiAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XHJcbiAgICBpZiAoYXJnID09PSAnJGV2ZW50Jykge1xyXG4gICAgICBpZiAobWV0aG9kTmFtZSA9PT0gJ19fc2V0X21vZGVsJyAmJiAhaXNDdXN0b20pIHsgLy8gaW5wdXQgdi1tb2RlbCB2YWx1ZVxyXG4gICAgICAgIHJldC5wdXNoKGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGlzQ3VzdG9tICYmICFpc0N1c3RvbU1QRXZlbnQpIHtcclxuICAgICAgICAgIHJldC5wdXNoKGV2ZW50LmRldGFpbC5fX2FyZ3NfX1swXSk7XHJcbiAgICAgICAgfSBlbHNlIHsgLy8gd3hjb21wb25lbnQg57uE5Lu25oiW5YaF572u57uE5Lu2XHJcbiAgICAgICAgICByZXQucHVzaChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpICYmIGFyZ1swXSA9PT0gJ28nKSB7XHJcbiAgICAgICAgcmV0LnB1c2goZ2V0T2JqQnlBcnJheShhcmcpKTtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJyAmJiBoYXNPd24oZXh0cmFPYmosIGFyZykpIHtcclxuICAgICAgICByZXQucHVzaChleHRyYU9ialthcmddKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXQucHVzaChhcmcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiByZXRcclxufVxyXG5cclxuY29uc3QgT05DRSA9ICd+JztcclxuY29uc3QgQ1VTVE9NID0gJ14nO1xyXG5cclxuZnVuY3Rpb24gaXNNYXRjaEV2ZW50VHlwZSAoZXZlbnRUeXBlLCBvcHRUeXBlKSB7XHJcbiAgcmV0dXJuIChldmVudFR5cGUgPT09IG9wdFR5cGUpIHx8XHJcbiAgICAoXHJcbiAgICAgIG9wdFR5cGUgPT09ICdyZWdpb25jaGFuZ2UnICYmXHJcbiAgICAgIChcclxuICAgICAgICBldmVudFR5cGUgPT09ICdiZWdpbicgfHxcclxuICAgICAgICBldmVudFR5cGUgPT09ICdlbmQnXHJcbiAgICAgIClcclxuICAgIClcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q29udGV4dFZtICh2bSkge1xyXG4gIGxldCAkcGFyZW50ID0gdm0uJHBhcmVudDtcclxuICAvLyDniLbnu4Tku7bmmK8gc2NvcGVkIHNsb3RzIOaIluiAheWFtuS7luiHquWumuS5iee7hOS7tuaXtue7p+e7reafpeaJvlxyXG4gIHdoaWxlICgkcGFyZW50ICYmICRwYXJlbnQuJHBhcmVudCAmJiAoJHBhcmVudC4kb3B0aW9ucy5nZW5lcmljIHx8ICRwYXJlbnQuJHBhcmVudC4kb3B0aW9ucy5nZW5lcmljIHx8ICRwYXJlbnQuJHNjb3BlLl8kdnVlUGlkKSkge1xyXG4gICAgJHBhcmVudCA9ICRwYXJlbnQuJHBhcmVudDtcclxuICB9XHJcbiAgcmV0dXJuICRwYXJlbnQgJiYgJHBhcmVudC4kcGFyZW50XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUV2ZW50IChldmVudCkge1xyXG4gIGV2ZW50ID0gd3JhcHBlciQxKGV2ZW50KTtcclxuXHJcbiAgLy8gW1sndGFwJyxbWydoYW5kbGUnLFsxLDIsYV1dLFsnaGFuZGxlMScsWzEsMixhXV1dXV1cclxuICBjb25zdCBkYXRhc2V0ID0gKGV2ZW50LmN1cnJlbnRUYXJnZXQgfHwgZXZlbnQudGFyZ2V0KS5kYXRhc2V0O1xyXG4gIGlmICghZGF0YXNldCkge1xyXG4gICAgcmV0dXJuIGNvbnNvbGUud2Fybign5LqL5Lu25L+h5oGv5LiN5a2Y5ZyoJylcclxuICB9XHJcbiAgY29uc3QgZXZlbnRPcHRzID0gZGF0YXNldC5ldmVudE9wdHMgfHwgZGF0YXNldFsnZXZlbnQtb3B0cyddOyAvLyDmlK/ku5jlrp0gd2ViLXZpZXcg57uE5Lu2IGRhdGFzZXQg6Z2e6am85bOwXHJcbiAgaWYgKCFldmVudE9wdHMpIHtcclxuICAgIHJldHVybiBjb25zb2xlLndhcm4oJ+S6i+S7tuS/oeaBr+S4jeWtmOWcqCcpXHJcbiAgfVxyXG5cclxuICAvLyBbWydoYW5kbGUnLFsxLDIsYV1dLFsnaGFuZGxlMScsWzEsMixhXV1dXHJcbiAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnQudHlwZTtcclxuXHJcbiAgY29uc3QgcmV0ID0gW107XHJcblxyXG4gIGV2ZW50T3B0cy5mb3JFYWNoKGV2ZW50T3B0ID0+IHtcclxuICAgIGxldCB0eXBlID0gZXZlbnRPcHRbMF07XHJcbiAgICBjb25zdCBldmVudHNBcnJheSA9IGV2ZW50T3B0WzFdO1xyXG5cclxuICAgIGNvbnN0IGlzQ3VzdG9tID0gdHlwZS5jaGFyQXQoMCkgPT09IENVU1RPTTtcclxuICAgIHR5cGUgPSBpc0N1c3RvbSA/IHR5cGUuc2xpY2UoMSkgOiB0eXBlO1xyXG4gICAgY29uc3QgaXNPbmNlID0gdHlwZS5jaGFyQXQoMCkgPT09IE9OQ0U7XHJcbiAgICB0eXBlID0gaXNPbmNlID8gdHlwZS5zbGljZSgxKSA6IHR5cGU7XHJcblxyXG4gICAgaWYgKGV2ZW50c0FycmF5ICYmIGlzTWF0Y2hFdmVudFR5cGUoZXZlbnRUeXBlLCB0eXBlKSkge1xyXG4gICAgICBldmVudHNBcnJheS5mb3JFYWNoKGV2ZW50QXJyYXkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBldmVudEFycmF5WzBdO1xyXG4gICAgICAgIGlmIChtZXRob2ROYW1lKSB7XHJcbiAgICAgICAgICBsZXQgaGFuZGxlckN0eCA9IHRoaXMuJHZtO1xyXG4gICAgICAgICAgaWYgKGhhbmRsZXJDdHguJG9wdGlvbnMuZ2VuZXJpYykgeyAvLyBtcC13ZWl4aW4sbXAtdG91dGlhbyDmir3osaHoioLngrnmqKHmi58gc2NvcGVkIHNsb3RzXHJcbiAgICAgICAgICAgIGhhbmRsZXJDdHggPSBnZXRDb250ZXh0Vm0oaGFuZGxlckN0eCkgfHwgaGFuZGxlckN0eDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnJGVtaXQnKSB7XHJcbiAgICAgICAgICAgIGhhbmRsZXJDdHguJGVtaXQuYXBwbHkoaGFuZGxlckN0eCxcclxuICAgICAgICAgICAgICBwcm9jZXNzRXZlbnRBcmdzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy4kdm0sXHJcbiAgICAgICAgICAgICAgICBldmVudCxcclxuICAgICAgICAgICAgICAgIGV2ZW50QXJyYXlbMV0sXHJcbiAgICAgICAgICAgICAgICBldmVudEFycmF5WzJdLFxyXG4gICAgICAgICAgICAgICAgaXNDdXN0b20sXHJcbiAgICAgICAgICAgICAgICBtZXRob2ROYW1lXHJcbiAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJDdHhbbWV0aG9kTmFtZV07XHJcbiAgICAgICAgICBpZiAoIWlzRm4oaGFuZGxlcikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAgX3ZtLiR7bWV0aG9kTmFtZX0gaXMgbm90IGEgZnVuY3Rpb25gKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGlzT25jZSkge1xyXG4gICAgICAgICAgICBpZiAoaGFuZGxlci5vbmNlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaGFuZGxlci5vbmNlID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBwYXJhbXMgPSBwcm9jZXNzRXZlbnRBcmdzKFxyXG4gICAgICAgICAgICB0aGlzLiR2bSxcclxuICAgICAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgICAgIGV2ZW50QXJyYXlbMV0sXHJcbiAgICAgICAgICAgIGV2ZW50QXJyYXlbMl0sXHJcbiAgICAgICAgICAgIGlzQ3VzdG9tLFxyXG4gICAgICAgICAgICBtZXRob2ROYW1lXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcGFyYW1zID0gQXJyYXkuaXNBcnJheShwYXJhbXMpID8gcGFyYW1zIDogW107XHJcbiAgICAgICAgICAvLyDlj4LmlbDlsL7pg6jlop7liqDljp/lp4vkuovku7blr7nosaHnlKjkuo7lpI3mnYLooajovr7lvI/lhoXojrflj5bpop3lpJbmlbDmja5cclxuICAgICAgICAgIGlmICgvPVxccypcXFMrXFwuZXZlbnRQYXJhbXNcXHMqXFx8XFx8XFxzKlxcUytcXFtbJ1wiXWV2ZW50LXBhcmFtc1snXCJdXFxdLy50ZXN0KGhhbmRsZXIudG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNwYXJzZS1hcnJheXNcclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChbLCAsICwgLCAsICwgLCAsICwgLCBldmVudF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0LnB1c2goaGFuZGxlci5hcHBseShoYW5kbGVyQ3R4LCBwYXJhbXMpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBpZiAoXHJcbiAgICBldmVudFR5cGUgPT09ICdpbnB1dCcgJiZcclxuICAgIHJldC5sZW5ndGggPT09IDEgJiZcclxuICAgIHR5cGVvZiByZXRbMF0gIT09ICd1bmRlZmluZWQnXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gcmV0WzBdXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBtZXNzYWdlcyA9IHt9O1xyXG5cclxubGV0IGxvY2FsZTtcclxuXHJcbntcclxuICBsb2NhbGUgPSB0dC5nZXRTeXN0ZW1JbmZvU3luYygpLmxhbmd1YWdlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0STE4bk1lc3NhZ2VzICgpIHtcclxuICBpZiAoIWlzRW5hYmxlTG9jYWxlKCkpIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBjb25zdCBsb2NhbGVLZXlzID0gT2JqZWN0LmtleXMoX191bmlDb25maWcubG9jYWxlcyk7XHJcbiAgaWYgKGxvY2FsZUtleXMubGVuZ3RoKSB7XHJcbiAgICBsb2NhbGVLZXlzLmZvckVhY2goKGxvY2FsZSkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJNZXNzYWdlcyA9IG1lc3NhZ2VzW2xvY2FsZV07XHJcbiAgICAgIGNvbnN0IHVzZXJNZXNzYWdlcyA9IF9fdW5pQ29uZmlnLmxvY2FsZXNbbG9jYWxlXTtcclxuICAgICAgaWYgKGN1ck1lc3NhZ2VzKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjdXJNZXNzYWdlcywgdXNlck1lc3NhZ2VzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtZXNzYWdlc1tsb2NhbGVdID0gdXNlck1lc3NhZ2VzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmluaXRJMThuTWVzc2FnZXMoKTtcclxuXHJcbmNvbnN0IGkxOG4gPSBpbml0VnVlSTE4bihcclxuICBsb2NhbGUsXHJcbiAgIHt9XHJcbik7XHJcbmNvbnN0IHQgPSBpMThuLnQ7XHJcbmNvbnN0IGkxOG5NaXhpbiA9IChpMThuLm1peGluID0ge1xyXG4gIGJlZm9yZUNyZWF0ZSAoKSB7XHJcbiAgICBjb25zdCB1bndhdGNoID0gaTE4bi5pMThuLndhdGNoTG9jYWxlKCgpID0+IHtcclxuICAgICAgdGhpcy4kZm9yY2VVcGRhdGUoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy4kb25jZSgnaG9vazpiZWZvcmVEZXN0cm95JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICB1bndhdGNoKCk7XHJcbiAgICB9KTtcclxuICB9LFxyXG4gIG1ldGhvZHM6IHtcclxuICAgICQkdCAoa2V5LCB2YWx1ZXMpIHtcclxuICAgICAgcmV0dXJuIHQoa2V5LCB2YWx1ZXMpXHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuY29uc3Qgc2V0TG9jYWxlJDEgPSBpMThuLnNldExvY2FsZTtcclxuY29uc3QgZ2V0TG9jYWxlJDEgPSBpMThuLmdldExvY2FsZTtcclxuXHJcbmZ1bmN0aW9uIGluaXRBcHBMb2NhbGUgKFZ1ZSwgYXBwVm0sIGxvY2FsZSkge1xyXG4gIGNvbnN0IHN0YXRlID0gVnVlLm9ic2VydmFibGUoe1xyXG4gICAgbG9jYWxlOiBsb2NhbGUgfHwgaTE4bi5nZXRMb2NhbGUoKVxyXG4gIH0pO1xyXG4gIGNvbnN0IGxvY2FsZVdhdGNoZXJzID0gW107XHJcbiAgYXBwVm0uJHdhdGNoTG9jYWxlID0gZm4gPT4ge1xyXG4gICAgbG9jYWxlV2F0Y2hlcnMucHVzaChmbik7XHJcbiAgfTtcclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYXBwVm0sICckbG9jYWxlJywge1xyXG4gICAgZ2V0ICgpIHtcclxuICAgICAgcmV0dXJuIHN0YXRlLmxvY2FsZVxyXG4gICAgfSxcclxuICAgIHNldCAodikge1xyXG4gICAgICBzdGF0ZS5sb2NhbGUgPSB2O1xyXG4gICAgICBsb2NhbGVXYXRjaGVycy5mb3JFYWNoKHdhdGNoID0+IHdhdGNoKHYpKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNFbmFibGVMb2NhbGUgKCkge1xyXG4gIHJldHVybiB0eXBlb2YgX191bmlDb25maWcgIT09ICd1bmRlZmluZWQnICYmIF9fdW5pQ29uZmlnLmxvY2FsZXMgJiYgISFPYmplY3Qua2V5cyhfX3VuaUNvbmZpZy5sb2NhbGVzKS5sZW5ndGhcclxufVxyXG5cclxuLy8gZXhwb3J0IGZ1bmN0aW9uIGluaXRJMThuKCkge1xyXG4vLyAgIGNvbnN0IGxvY2FsZUtleXMgPSBPYmplY3Qua2V5cyhfX3VuaUNvbmZpZy5sb2NhbGVzIHx8IHt9KVxyXG4vLyAgIGlmIChsb2NhbGVLZXlzLmxlbmd0aCkge1xyXG4vLyAgICAgbG9jYWxlS2V5cy5mb3JFYWNoKChsb2NhbGUpID0+XHJcbi8vICAgICAgIGkxOG4uYWRkKGxvY2FsZSwgX191bmlDb25maWcubG9jYWxlc1tsb2NhbGVdKVxyXG4vLyAgICAgKVxyXG4vLyAgIH1cclxuLy8gfVxyXG5cclxuY29uc3QgaG9va3MgPSBbXHJcbiAgJ29uU2hvdycsXHJcbiAgJ29uSGlkZScsXHJcbiAgJ29uRXJyb3InLFxyXG4gICdvblBhZ2VOb3RGb3VuZCcsXHJcbiAgJ29uVGhlbWVDaGFuZ2UnLFxyXG4gICdvblVuaGFuZGxlZFJlamVjdGlvbidcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGluaXRFdmVudENoYW5uZWwkMSAoKSB7XHJcbiAgVnVlLnByb3RvdHlwZS5nZXRPcGVuZXJFdmVudENoYW5uZWwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAoIXRoaXMuX19ldmVudENoYW5uZWxfXykge1xyXG4gICAgICB0aGlzLl9fZXZlbnRDaGFubmVsX18gPSBuZXcgRXZlbnRDaGFubmVsKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fX2V2ZW50Q2hhbm5lbF9fXHJcbiAgfTtcclxuICBjb25zdCBjYWxsSG9vayA9IFZ1ZS5wcm90b3R5cGUuX19jYWxsX2hvb2s7XHJcbiAgVnVlLnByb3RvdHlwZS5fX2NhbGxfaG9vayA9IGZ1bmN0aW9uIChob29rLCBhcmdzKSB7XHJcbiAgICBpZiAoaG9vayA9PT0gJ29uTG9hZCcgJiYgYXJncyAmJiBhcmdzLl9faWRfXykge1xyXG4gICAgICB0aGlzLl9fZXZlbnRDaGFubmVsX18gPSBnZXRFdmVudENoYW5uZWwoYXJncy5fX2lkX18pO1xyXG4gICAgICBkZWxldGUgYXJncy5fX2lkX187XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2FsbEhvb2suY2FsbCh0aGlzLCBob29rLCBhcmdzKVxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRTY29wZWRTbG90c1BhcmFtcyAoKSB7XHJcbiAgY29uc3QgY2VudGVyID0ge307XHJcbiAgY29uc3QgcGFyZW50cyA9IHt9O1xyXG5cclxuICBWdWUucHJvdG90eXBlLiRoYXNTY29wZWRTbG90c1BhcmFtcyA9IGZ1bmN0aW9uICh2dWVJZCkge1xyXG4gICAgY29uc3QgaGFzID0gY2VudGVyW3Z1ZUlkXTtcclxuICAgIGlmICghaGFzKSB7XHJcbiAgICAgIHBhcmVudHNbdnVlSWRdID0gdGhpcztcclxuICAgICAgdGhpcy4kb24oJ2hvb2s6ZGVzdHJveWVkJywgKCkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZSBwYXJlbnRzW3Z1ZUlkXTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGFzXHJcbiAgfTtcclxuXHJcbiAgVnVlLnByb3RvdHlwZS4kZ2V0U2NvcGVkU2xvdHNQYXJhbXMgPSBmdW5jdGlvbiAodnVlSWQsIG5hbWUsIGtleSkge1xyXG4gICAgY29uc3QgZGF0YSA9IGNlbnRlclt2dWVJZF07XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICBjb25zdCBvYmplY3QgPSBkYXRhW25hbWVdIHx8IHt9O1xyXG4gICAgICByZXR1cm4ga2V5ID8gb2JqZWN0W2tleV0gOiBvYmplY3RcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmVudHNbdnVlSWRdID0gdGhpcztcclxuICAgICAgdGhpcy4kb24oJ2hvb2s6ZGVzdHJveWVkJywgKCkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZSBwYXJlbnRzW3Z1ZUlkXTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgVnVlLnByb3RvdHlwZS4kc2V0U2NvcGVkU2xvdHNQYXJhbXMgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcclxuICAgIGNvbnN0IHZ1ZUlkcyA9IHRoaXMuJG9wdGlvbnMucHJvcHNEYXRhLnZ1ZUlkO1xyXG4gICAgaWYgKHZ1ZUlkcykge1xyXG4gICAgICBjb25zdCB2dWVJZCA9IHZ1ZUlkcy5zcGxpdCgnLCcpWzBdO1xyXG4gICAgICBjb25zdCBvYmplY3QgPSBjZW50ZXJbdnVlSWRdID0gY2VudGVyW3Z1ZUlkXSB8fCB7fTtcclxuICAgICAgb2JqZWN0W25hbWVdID0gdmFsdWU7XHJcbiAgICAgIGlmIChwYXJlbnRzW3Z1ZUlkXSkge1xyXG4gICAgICAgIHBhcmVudHNbdnVlSWRdLiRmb3JjZVVwZGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgVnVlLm1peGluKHtcclxuICAgIGRlc3Ryb3llZCAoKSB7XHJcbiAgICAgIGNvbnN0IHByb3BzRGF0YSA9IHRoaXMuJG9wdGlvbnMucHJvcHNEYXRhO1xyXG4gICAgICBjb25zdCB2dWVJZCA9IHByb3BzRGF0YSAmJiBwcm9wc0RhdGEudnVlSWQ7XHJcbiAgICAgIGlmICh2dWVJZCkge1xyXG4gICAgICAgIGRlbGV0ZSBjZW50ZXJbdnVlSWRdO1xyXG4gICAgICAgIGRlbGV0ZSBwYXJlbnRzW3Z1ZUlkXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUJhc2VBcHAgKHZtLCB7XHJcbiAgbW9ja3MsXHJcbiAgaW5pdFJlZnNcclxufSkge1xyXG4gIGluaXRFdmVudENoYW5uZWwkMSgpO1xyXG4gIHtcclxuICAgIGluaXRTY29wZWRTbG90c1BhcmFtcygpO1xyXG4gIH1cclxuICBpZiAodm0uJG9wdGlvbnMuc3RvcmUpIHtcclxuICAgIFZ1ZS5wcm90b3R5cGUuJHN0b3JlID0gdm0uJG9wdGlvbnMuc3RvcmU7XHJcbiAgfVxyXG4gIHVuaUlkTWl4aW4oVnVlKTtcclxuXHJcbiAgVnVlLnByb3RvdHlwZS5tcEhvc3QgPSBcIm1wLXRvdXRpYW9cIjtcclxuXHJcbiAgVnVlLm1peGluKHtcclxuICAgIGJlZm9yZUNyZWF0ZSAoKSB7XHJcbiAgICAgIGlmICghdGhpcy4kb3B0aW9ucy5tcFR5cGUpIHtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5tcFR5cGUgPSB0aGlzLiRvcHRpb25zLm1wVHlwZTtcclxuXHJcbiAgICAgIHRoaXMuJG1wID0ge1xyXG4gICAgICAgIGRhdGE6IHt9LFxyXG4gICAgICAgIFt0aGlzLm1wVHlwZV06IHRoaXMuJG9wdGlvbnMubXBJbnN0YW5jZVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy4kc2NvcGUgPSB0aGlzLiRvcHRpb25zLm1wSW5zdGFuY2U7XHJcblxyXG4gICAgICBkZWxldGUgdGhpcy4kb3B0aW9ucy5tcFR5cGU7XHJcbiAgICAgIGRlbGV0ZSB0aGlzLiRvcHRpb25zLm1wSW5zdGFuY2U7XHJcbiAgICAgIGlmICh0aGlzLm1wVHlwZSA9PT0gJ3BhZ2UnICYmIHR5cGVvZiBnZXRBcHAgPT09ICdmdW5jdGlvbicpIHsgLy8gaGFjayB2dWUtaTE4blxyXG4gICAgICAgIGNvbnN0IGFwcCA9IGdldEFwcCgpO1xyXG4gICAgICAgIGlmIChhcHAuJHZtICYmIGFwcC4kdm0uJGkxOG4pIHtcclxuICAgICAgICAgIHRoaXMuX2kxOG4gPSBhcHAuJHZtLiRpMThuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5tcFR5cGUgIT09ICdhcHAnKSB7XHJcbiAgICAgICAgaW5pdFJlZnModGhpcyk7XHJcbiAgICAgICAgaW5pdE1vY2tzKHRoaXMsIG1vY2tzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBjb25zdCBhcHBPcHRpb25zID0ge1xyXG4gICAgb25MYXVuY2ggKGFyZ3MpIHtcclxuICAgICAgaWYgKHRoaXMuJHZtKSB7IC8vIOW3sue7j+WIneWni+WMlui/h+S6hu+8jOS4u+imgeaYr+S4uuS6hueZvuW6pu+8jOeZvuW6piBvblNob3cg5ZyoIG9uTGF1bmNoIOS5i+WJjVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLiR2bSA9IHZtO1xyXG5cclxuICAgICAgdGhpcy4kdm0uJG1wID0ge1xyXG4gICAgICAgIGFwcDogdGhpc1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy4kdm0uJHNjb3BlID0gdGhpcztcclxuICAgICAgLy8gdm0g5LiK5Lmf5oyC6L29IGdsb2JhbERhdGFcclxuICAgICAgdGhpcy4kdm0uZ2xvYmFsRGF0YSA9IHRoaXMuZ2xvYmFsRGF0YTtcclxuXHJcbiAgICAgIHRoaXMuJHZtLl9pc01vdW50ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLiR2bS5fX2NhbGxfaG9vaygnbW91bnRlZCcsIGFyZ3MpO1xyXG5cclxuICAgICAgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uTGF1bmNoJywgYXJncyk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgLy8g5YW85a655pen54mI5pysIGdsb2JhbERhdGFcclxuICBhcHBPcHRpb25zLmdsb2JhbERhdGEgPSB2bS4kb3B0aW9ucy5nbG9iYWxEYXRhIHx8IHt9O1xyXG4gIC8vIOWwhiBtZXRob2RzIOS4reeahOaWueazleaMguWcqCBnZXRBcHAoKSDkuK1cclxuICBjb25zdCBtZXRob2RzID0gdm0uJG9wdGlvbnMubWV0aG9kcztcclxuICBpZiAobWV0aG9kcykge1xyXG4gICAgT2JqZWN0LmtleXMobWV0aG9kcykuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgYXBwT3B0aW9uc1tuYW1lXSA9IG1ldGhvZHNbbmFtZV07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXRBcHBMb2NhbGUoVnVlLCB2bSwgdHQuZ2V0U3lzdGVtSW5mb1N5bmMoKS5sYW5ndWFnZSB8fCAnemgtSGFucycpO1xyXG5cclxuICBpbml0SG9va3MoYXBwT3B0aW9ucywgaG9va3MpO1xyXG5cclxuICByZXR1cm4gYXBwT3B0aW9uc1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kVm1CeVZ1ZUlkICh2bSwgdnVlUGlkKSB7XHJcbiAgY29uc3QgJGNoaWxkcmVuID0gdm0uJGNoaWxkcmVuO1xyXG4gIC8vIOS8mOWFiOafpeaJvuebtOWxnijlj43lkJHmn6Xmib46aHR0cHM6Ly9naXRodWIuY29tL2RjbG91ZGlvL3VuaS1hcHAvaXNzdWVzLzEyMDApXHJcbiAgZm9yIChsZXQgaSA9ICRjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgY29uc3QgY2hpbGRWbSA9ICRjaGlsZHJlbltpXTtcclxuICAgIGlmIChjaGlsZFZtLiRzY29wZS5fJHZ1ZUlkID09PSB2dWVQaWQpIHtcclxuICAgICAgcmV0dXJuIGNoaWxkVm1cclxuICAgIH1cclxuICB9XHJcbiAgLy8g5Y+N5ZCR6YCS5b2S5p+l5om+XHJcbiAgbGV0IHBhcmVudFZtO1xyXG4gIGZvciAobGV0IGkgPSAkY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgIHBhcmVudFZtID0gZmluZFZtQnlWdWVJZCgkY2hpbGRyZW5baV0sIHZ1ZVBpZCk7XHJcbiAgICBpZiAocGFyZW50Vm0pIHtcclxuICAgICAgcmV0dXJuIHBhcmVudFZtXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0QmVoYXZpb3IgKG9wdGlvbnMpIHtcclxuICByZXR1cm4gQmVoYXZpb3Iob3B0aW9ucylcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlTGluayAoZXZlbnQpIHtcclxuICBjb25zdCB7XHJcbiAgICB2dWVQaWQsXHJcbiAgICB2dWVPcHRpb25zXHJcbiAgfSA9IGV2ZW50LmRldGFpbCB8fCBldmVudC52YWx1ZTsgLy8gZGV0YWlsIOaYr+W+ruS/oSx2YWx1ZSDmmK/nmb7luqYoZGlwYXRjaClcclxuXHJcbiAgbGV0IHBhcmVudFZtO1xyXG5cclxuICBpZiAodnVlUGlkKSB7XHJcbiAgICBwYXJlbnRWbSA9IGZpbmRWbUJ5VnVlSWQodGhpcy4kdm0sIHZ1ZVBpZCk7XHJcbiAgfVxyXG5cclxuICBpZiAoIXBhcmVudFZtKSB7XHJcbiAgICBwYXJlbnRWbSA9IHRoaXMuJHZtO1xyXG4gIH1cclxuXHJcbiAgdnVlT3B0aW9ucy5wYXJlbnQgPSBwYXJlbnRWbTtcclxufVxyXG5cclxuY29uc3QgbW9ja3MgPSBbJ19fcm91dGVfXycsICdfX3dlYnZpZXdJZF9fJywgJ19fbm9kZWlkX18nLCAnX19ub2RlSWRfXyddO1xyXG5cclxuZnVuY3Rpb24gaXNQYWdlICgpIHtcclxuICByZXR1cm4gdGhpcy5fX25vZGVpZF9fID09PSAwIHx8IHRoaXMuX19ub2RlSWRfXyA9PT0gMFxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0UmVmcyAodm0pIHtcclxuICBjb25zdCBtcEluc3RhbmNlID0gdm0uJHNjb3BlO1xyXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXHJcbiAgY29uc3QgbWlub3JWZXJzaW9uID0gcGFyc2VJbnQodHQuZ2V0U3lzdGVtSW5mb1N5bmMoKS5TREtWZXJzaW9uLnNwbGl0KCcuJylbMV0pO1xyXG4gIGlmIChtaW5vclZlcnNpb24gPiAxNikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZtLCAnJHJlZnMnLCB7XHJcbiAgICAgIGdldCAoKSB7XHJcbiAgICAgICAgY29uc3QgJHJlZnMgPSB7fTtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRzID0gbXBJbnN0YW5jZS5zZWxlY3RBbGxDb21wb25lbnRzKCcudnVlLXJlZicpO1xyXG4gICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcmVmID0gY29tcG9uZW50LmRhdGFzZXQucmVmO1xyXG4gICAgICAgICAgJHJlZnNbcmVmXSA9IGNvbXBvbmVudC4kdm0gfHwgY29tcG9uZW50O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGZvckNvbXBvbmVudHMgPSBtcEluc3RhbmNlLnNlbGVjdEFsbENvbXBvbmVudHMoJy52dWUtcmVmLWluLWZvcicpO1xyXG4gICAgICAgIGZvckNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcmVmID0gY29tcG9uZW50LmRhdGFzZXQucmVmO1xyXG4gICAgICAgICAgaWYgKCEkcmVmc1tyZWZdKSB7XHJcbiAgICAgICAgICAgICRyZWZzW3JlZl0gPSBbXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgICRyZWZzW3JlZl0ucHVzaChjb21wb25lbnQuJHZtIHx8IGNvbXBvbmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuICRyZWZzXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBtcEluc3RhbmNlLnNlbGVjdEFsbENvbXBvbmVudHMoJy52dWUtcmVmJywgKGNvbXBvbmVudHMpID0+IHtcclxuICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gY29tcG9uZW50LmRhdGFzZXQucmVmO1xyXG4gICAgICAgIHZtLiRyZWZzW3JlZl0gPSBjb21wb25lbnQuJHZtIHx8IGNvbXBvbmVudDtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIG1wSW5zdGFuY2Uuc2VsZWN0QWxsQ29tcG9uZW50cygnLnZ1ZS1yZWYtaW4tZm9yJywgKGZvckNvbXBvbmVudHMpID0+IHtcclxuICAgICAgZm9yQ29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVmID0gY29tcG9uZW50LmRhdGFzZXQucmVmO1xyXG4gICAgICAgIGlmICghdm0uJHJlZnNbcmVmXSkge1xyXG4gICAgICAgICAgdm0uJHJlZnNbcmVmXSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2bS4kcmVmc1tyZWZdLnB1c2goY29tcG9uZW50LiR2bSB8fCBjb21wb25lbnQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgaW5zdGFuY2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuXHJcbmZ1bmN0aW9uIGluaXRSZWxhdGlvbiAoe1xyXG4gIHZ1ZVBpZCxcclxuICBtcEluc3RhbmNlXHJcbn0pIHtcclxuICAvLyDlpLTmnaEgdHJpZ2dlckV2ZW50IOWQju+8jOaOpeaUtuS6i+S7tuaXtuacuueJueWIq+aZmu+8jOW3sue7j+WIsOS6hiByZWFkeSDkuYvlkI5cclxuICBjb25zdCBub2RlSWQgPSAobXBJbnN0YW5jZS5fX25vZGVJZF9fIHx8IG1wSW5zdGFuY2UuX19ub2RlaWRfXykgKyAnJztcclxuICBjb25zdCB3ZWJ2aWV3SWQgPSBtcEluc3RhbmNlLl9fd2Vidmlld0lkX18gKyAnJztcclxuXHJcbiAgaW5zdGFuY2VzW3dlYnZpZXdJZCArICdfJyArIG5vZGVJZF0gPSBtcEluc3RhbmNlLiR2bTtcclxuXHJcbiAgdGhpcy50cmlnZ2VyRXZlbnQoJ19fbCcsIHtcclxuICAgIHZ1ZVBpZCxcclxuICAgIG5vZGVJZCxcclxuICAgIHdlYnZpZXdJZFxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVMaW5rJDEgKHtcclxuICBkZXRhaWw6IHtcclxuICAgIHZ1ZVBpZCxcclxuICAgIG5vZGVJZCxcclxuICAgIHdlYnZpZXdJZFxyXG4gIH1cclxufSkge1xyXG4gIGNvbnN0IHZtID0gaW5zdGFuY2VzW3dlYnZpZXdJZCArICdfJyArIG5vZGVJZF07XHJcbiAgaWYgKCF2bSkge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBsZXQgcGFyZW50Vm07XHJcblxyXG4gIGlmICh2dWVQaWQpIHtcclxuICAgIHBhcmVudFZtID0gZmluZFZtQnlWdWVJZCh0aGlzLiR2bSwgdnVlUGlkKTtcclxuICB9XHJcblxyXG4gIGlmICghcGFyZW50Vm0pIHtcclxuICAgIHBhcmVudFZtID0gdGhpcy4kdm07XHJcbiAgfVxyXG5cclxuICB2bS4kcGFyZW50ID0gcGFyZW50Vm07XHJcbiAgdm0uJHJvb3QgPSBwYXJlbnRWbS4kcm9vdDtcclxuICBwYXJlbnRWbS4kY2hpbGRyZW4ucHVzaCh2bSk7XHJcblxyXG4gIHZtLl9fY2FsbF9ob29rKCdjcmVhdGVkJyk7XHJcbiAgdm0uX19jYWxsX2hvb2soJ2JlZm9yZU1vdW50Jyk7XHJcbiAgdm0uX2lzTW91bnRlZCA9IHRydWU7XHJcbiAgdm0uX19jYWxsX2hvb2soJ21vdW50ZWQnKTtcclxuICB2bS5fX2NhbGxfaG9vaygnb25SZWFkeScpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUFwcCAodm0pIHtcclxuICBWdWUucHJvdG90eXBlLl8kZmFsbGJhY2sgPSB0cnVlOyAvLyDpmY3nuqfvvIjosIPmlbTljp8gdnVlIOeahOmDqOWIhueUn+WRveWRqOacn++8jOWmgiBjcmVhdGVk77yMYmVmb3JlTW91bnQsaW5qZWN0LHByb3ZpZGXvvIlcclxuXHJcbiAgVnVlLm1peGluKHtcclxuICAgIGNyZWF0ZWQgKCkgeyAvLyDlpITnkIYgaW5qZWN0aW9ucyzlpLTmnaEgdHJpZ2dlckV2ZW50IOaYr+W8guatpe+8jOS4lOinpuWPkeaXtuacuuW+iOaFou+8jOaVheW7tui/nyByZWxhdGlvbiDorr7nva5cclxuICAgICAgaWYgKHRoaXMubXBUeXBlICE9PSAnYXBwJykge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMubXBUeXBlID09PSAncGFnZScgJiZcclxuICAgICAgICAgICAgICAgICAgICAhdGhpcy4kc2NvcGUucm91dGUgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiRzY29wZS5fX3JvdXRlX19cclxuICAgICAgICApIHtcclxuICAgICAgICAgIHRoaXMuJHNjb3BlLnJvdXRlID0gdGhpcy4kc2NvcGUuX19yb3V0ZV9fO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW5pdFJlZnModGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuX19pbml0X2luamVjdGlvbnModGhpcyk7XHJcbiAgICAgICAgdGhpcy5fX2luaXRfcHJvdmlkZSh0aGlzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gcGFyc2VCYXNlQXBwKHZtLCB7XHJcbiAgICBtb2NrcyxcclxuICAgIGluaXRSZWZzOiBmdW5jdGlvbiAoKSB7fSAvLyBhdHRhY2hlZCDml7bvvIzlj6/og73mn6Xor6LkuI3liLBcclxuICB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVBcHAgKHZtKSB7XHJcbiAgQXBwKHBhcnNlQXBwKHZtKSk7XHJcbiAgcmV0dXJuIHZtXHJcbn1cclxuXHJcbmNvbnN0IGVuY29kZVJlc2VydmVSRSA9IC9bIScoKSpdL2c7XHJcbmNvbnN0IGVuY29kZVJlc2VydmVSZXBsYWNlciA9IGMgPT4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTtcclxuY29uc3QgY29tbWFSRSA9IC8lMkMvZztcclxuXHJcbi8vIGZpeGVkIGVuY29kZVVSSUNvbXBvbmVudCB3aGljaCBpcyBtb3JlIGNvbmZvcm1hbnQgdG8gUkZDMzk4NjpcclxuLy8gLSBlc2NhcGVzIFshJygpKl1cclxuLy8gLSBwcmVzZXJ2ZSBjb21tYXNcclxuY29uc3QgZW5jb2RlID0gc3RyID0+IGVuY29kZVVSSUNvbXBvbmVudChzdHIpXHJcbiAgLnJlcGxhY2UoZW5jb2RlUmVzZXJ2ZVJFLCBlbmNvZGVSZXNlcnZlUmVwbGFjZXIpXHJcbiAgLnJlcGxhY2UoY29tbWFSRSwgJywnKTtcclxuXHJcbmZ1bmN0aW9uIHN0cmluZ2lmeVF1ZXJ5IChvYmosIGVuY29kZVN0ciA9IGVuY29kZSkge1xyXG4gIGNvbnN0IHJlcyA9IG9iaiA/IE9iamVjdC5rZXlzKG9iaikubWFwKGtleSA9PiB7XHJcbiAgICBjb25zdCB2YWwgPSBvYmpba2V5XTtcclxuXHJcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuICcnXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbCA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gZW5jb2RlU3RyKGtleSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgICB2YWwuZm9yRWFjaCh2YWwyID0+IHtcclxuICAgICAgICBpZiAodmFsMiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbDIgPT09IG51bGwpIHtcclxuICAgICAgICAgIHJlc3VsdC5wdXNoKGVuY29kZVN0cihrZXkpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlU3RyKGtleSkgKyAnPScgKyBlbmNvZGVTdHIodmFsMikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQuam9pbignJicpXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGVuY29kZVN0cihrZXkpICsgJz0nICsgZW5jb2RlU3RyKHZhbClcclxuICB9KS5maWx0ZXIoeCA9PiB4Lmxlbmd0aCA+IDApLmpvaW4oJyYnKSA6IG51bGw7XHJcbiAgcmV0dXJuIHJlcyA/IGA/JHtyZXN9YCA6ICcnXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlQmFzZUNvbXBvbmVudCAodnVlQ29tcG9uZW50T3B0aW9ucywge1xyXG4gIGlzUGFnZSxcclxuICBpbml0UmVsYXRpb25cclxufSA9IHt9KSB7XHJcbiAgY29uc3QgW1Z1ZUNvbXBvbmVudCwgdnVlT3B0aW9uc10gPSBpbml0VnVlQ29tcG9uZW50KFZ1ZSwgdnVlQ29tcG9uZW50T3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICBtdWx0aXBsZVNsb3RzOiB0cnVlLFxyXG4gICAgYWRkR2xvYmFsQ2xhc3M6IHRydWUsXHJcbiAgICAuLi4odnVlT3B0aW9ucy5vcHRpb25zIHx8IHt9KVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGNvbXBvbmVudE9wdGlvbnMgPSB7XHJcbiAgICBvcHRpb25zLFxyXG4gICAgZGF0YTogaW5pdERhdGEodnVlT3B0aW9ucywgVnVlLnByb3RvdHlwZSksXHJcbiAgICBiZWhhdmlvcnM6IGluaXRCZWhhdmlvcnModnVlT3B0aW9ucywgaW5pdEJlaGF2aW9yKSxcclxuICAgIHByb3BlcnRpZXM6IGluaXRQcm9wZXJ0aWVzKHZ1ZU9wdGlvbnMucHJvcHMsIGZhbHNlLCB2dWVPcHRpb25zLl9fZmlsZSksXHJcbiAgICBsaWZldGltZXM6IHtcclxuICAgICAgYXR0YWNoZWQgKCkge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBtcFR5cGU6IGlzUGFnZS5jYWxsKHRoaXMpID8gJ3BhZ2UnIDogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICBtcEluc3RhbmNlOiB0aGlzLFxyXG4gICAgICAgICAgcHJvcHNEYXRhOiBwcm9wZXJ0aWVzXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaW5pdFZ1ZUlkcyhwcm9wZXJ0aWVzLnZ1ZUlkLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLy8g5aSE55CG54i25a2Q5YWz57O7XHJcbiAgICAgICAgaW5pdFJlbGF0aW9uLmNhbGwodGhpcywge1xyXG4gICAgICAgICAgdnVlUGlkOiB0aGlzLl8kdnVlUGlkLFxyXG4gICAgICAgICAgdnVlT3B0aW9uczogb3B0aW9uc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJYgdnVlIOWunuS+i1xyXG4gICAgICAgIHRoaXMuJHZtID0gbmV3IFZ1ZUNvbXBvbmVudChvcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8g5aSE55CGJHNsb3RzLCRzY29wZWRTbG90c++8iOaaguS4jeaUr+aMgeWKqOaAgeWPmOWMliRzbG90c++8iVxyXG4gICAgICAgIGluaXRTbG90cyh0aGlzLiR2bSwgcHJvcGVydGllcy52dWVTbG90cyk7XHJcblxyXG4gICAgICAgIC8vIOinpuWPkemmluasoSBzZXREYXRhXHJcbiAgICAgICAgdGhpcy4kdm0uJG1vdW50KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHJlYWR5ICgpIHtcclxuICAgICAgICAvLyDlvZPnu4Tku7YgcHJvcHMg6buY6K6k5YC85Li6IHRydWXvvIzliJ3lp4vljJbml7bkvKDlhaUgZmFsc2Ug5Lya5a+86Ie0IGNyZWF0ZWQscmVhZHkg6Kem5Y+RLCDkvYYgYXR0YWNoZWQg5LiN6Kem5Y+RXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLndlaXhpbi5xcS5jb20vY29tbXVuaXR5L2RldmVsb3AvZG9jLzAwMDY2YWUyODQ0Y2MwZjhlYjg4M2UyYTU1NzgwMFxyXG4gICAgICAgIGlmICh0aGlzLiR2bSkge1xyXG4gICAgICAgICAgdGhpcy4kdm0uX2lzTW91bnRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLiR2bS5fX2NhbGxfaG9vaygnbW91bnRlZCcpO1xyXG4gICAgICAgICAgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUmVhZHknKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGRldGFjaGVkICgpIHtcclxuICAgICAgICB0aGlzLiR2bSAmJiB0aGlzLiR2bS4kZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgcGFnZUxpZmV0aW1lczoge1xyXG4gICAgICBzaG93IChhcmdzKSB7XHJcbiAgICAgICAgdGhpcy4kdm0gJiYgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUGFnZVNob3cnLCBhcmdzKTtcclxuICAgICAgfSxcclxuICAgICAgaGlkZSAoKSB7XHJcbiAgICAgICAgdGhpcy4kdm0gJiYgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUGFnZUhpZGUnKTtcclxuICAgICAgfSxcclxuICAgICAgcmVzaXplIChzaXplKSB7XHJcbiAgICAgICAgdGhpcy4kdm0gJiYgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUGFnZVJlc2l6ZScsIHNpemUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgbWV0aG9kczoge1xyXG4gICAgICBfX2w6IGhhbmRsZUxpbmssXHJcbiAgICAgIF9fZTogaGFuZGxlRXZlbnRcclxuICAgIH1cclxuICB9O1xyXG4gIC8vIGV4dGVybmFsQ2xhc3Nlc1xyXG4gIGlmICh2dWVPcHRpb25zLmV4dGVybmFsQ2xhc3Nlcykge1xyXG4gICAgY29tcG9uZW50T3B0aW9ucy5leHRlcm5hbENsYXNzZXMgPSB2dWVPcHRpb25zLmV4dGVybmFsQ2xhc3NlcztcclxuICB9XHJcblxyXG4gIGlmIChBcnJheS5pc0FycmF5KHZ1ZU9wdGlvbnMud3hzQ2FsbE1ldGhvZHMpKSB7XHJcbiAgICB2dWVPcHRpb25zLnd4c0NhbGxNZXRob2RzLmZvckVhY2goY2FsbE1ldGhvZCA9PiB7XHJcbiAgICAgIGNvbXBvbmVudE9wdGlvbnMubWV0aG9kc1tjYWxsTWV0aG9kXSA9IGZ1bmN0aW9uIChhcmdzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJHZtW2NhbGxNZXRob2RdKGFyZ3MpXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlmIChpc1BhZ2UpIHtcclxuICAgIHJldHVybiBjb21wb25lbnRPcHRpb25zXHJcbiAgfVxyXG4gIHJldHVybiBbY29tcG9uZW50T3B0aW9ucywgVnVlQ29tcG9uZW50XVxyXG59XHJcblxyXG5jb25zdCBjb21wb25lbnRzID0gW107XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNvbXBvbmVudCAodnVlT3B0aW9ucykge1xyXG4gIGNvbnN0IFtjb21wb25lbnRPcHRpb25zLCBWdWVDb21wb25lbnRdID0gcGFyc2VCYXNlQ29tcG9uZW50KHZ1ZU9wdGlvbnMpO1xyXG5cclxuICAvLyDln7rnoYDlupMgMi4wIOS7peS4iiBhdHRhY2hlZCDpobrluo/plJnkubHvvIzmjInnhacgY3JlYXRlZCDpobrluo/lvLrliLbnuqDmraNcclxuICBjb21wb25lbnRPcHRpb25zLmxpZmV0aW1lcy5jcmVhdGVkID0gZnVuY3Rpb24gY3JlYXRlZCAoKSB7XHJcbiAgICBjb21wb25lbnRzLnB1c2godGhpcyk7XHJcbiAgfTtcclxuXHJcbiAgY29tcG9uZW50T3B0aW9ucy5saWZldGltZXMuYXR0YWNoZWQgPSBmdW5jdGlvbiBhdHRhY2hlZCAoKSB7XHJcbiAgICB0aGlzLl9fbGlmZXRpbWVzX2F0dGFjaGVkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzO1xyXG5cclxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICBtcFR5cGU6IGlzUGFnZS5jYWxsKHRoaXMpID8gJ3BhZ2UnIDogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgbXBJbnN0YW5jZTogdGhpcyxcclxuICAgICAgICBwcm9wc0RhdGE6IHByb3BlcnRpZXNcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGluaXRWdWVJZHMocHJvcGVydGllcy52dWVJZCwgdGhpcyk7XHJcblxyXG4gICAgICAvLyDliJ3lp4vljJYgdnVlIOWunuS+i1xyXG4gICAgICB0aGlzLiR2bSA9IG5ldyBWdWVDb21wb25lbnQob3B0aW9ucyk7XHJcblxyXG4gICAgICAvLyDlpITnkIYkc2xvdHMsJHNjb3BlZFNsb3Rz77yI5pqC5LiN5pSv5oyB5Yqo5oCB5Y+Y5YyWJHNsb3Rz77yJXHJcbiAgICAgIGluaXRTbG90cyh0aGlzLiR2bSwgcHJvcGVydGllcy52dWVTbG90cyk7XHJcblxyXG4gICAgICAvLyDlpITnkIbniLblrZDlhbPns7tcclxuICAgICAgaW5pdFJlbGF0aW9uLmNhbGwodGhpcywge1xyXG4gICAgICAgIHZ1ZVBpZDogdGhpcy5fJHZ1ZVBpZCxcclxuICAgICAgICBtcEluc3RhbmNlOiB0aGlzXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8g6Kem5Y+R6aaW5qyhIHNldERhdGFcclxuICAgICAgdGhpcy4kdm0uJG1vdW50KCk7XHJcbiAgICB9O1xyXG4gICAgbGV0IGNvbXBvbmVudCA9IHRoaXM7XHJcbiAgICB3aGlsZSAoY29tcG9uZW50ICYmIGNvbXBvbmVudC5fX2xpZmV0aW1lc19hdHRhY2hlZCAmJiBjb21wb25lbnRzWzBdICYmIGNvbXBvbmVudCA9PT0gY29tcG9uZW50c1swXSkge1xyXG4gICAgICBjb21wb25lbnRzLnNoaWZ0KCk7XHJcbiAgICAgIGNvbXBvbmVudC5fX2xpZmV0aW1lc19hdHRhY2hlZCgpO1xyXG4gICAgICBkZWxldGUgY29tcG9uZW50Ll9fbGlmZXRpbWVzX2F0dGFjaGVkO1xyXG4gICAgICBjb21wb25lbnQgPSBjb21wb25lbnRzWzBdO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vIHJlYWR5IOavlCBoYW5kbGVMaW5rIOi/mOaXqe+8jOWIneWni+WMlumAu+i+keaUvuWIsCBoYW5kbGVMaW5rIOS4rVxyXG4gIGRlbGV0ZSBjb21wb25lbnRPcHRpb25zLmxpZmV0aW1lcy5yZWFkeTtcclxuXHJcbiAgY29tcG9uZW50T3B0aW9ucy5tZXRob2RzLl9fbCA9IGhhbmRsZUxpbmskMTtcclxuXHJcbiAgcmV0dXJuIGNvbXBvbmVudE9wdGlvbnNcclxufVxyXG5cclxuY29uc3QgaG9va3MkMSA9IFtcclxuICAnb25TaG93JyxcclxuICAnb25IaWRlJyxcclxuICAnb25VbmxvYWQnXHJcbl07XHJcblxyXG5ob29rcyQxLnB1c2goLi4uUEFHRV9FVkVOVF9IT09LUyk7XHJcblxyXG5mdW5jdGlvbiBwYXJzZUJhc2VQYWdlICh2dWVQYWdlT3B0aW9ucywge1xyXG4gIGlzUGFnZSxcclxuICBpbml0UmVsYXRpb25cclxufSkge1xyXG4gIGNvbnN0IHBhZ2VPcHRpb25zID0gcGFyc2VDb21wb25lbnQodnVlUGFnZU9wdGlvbnMpO1xyXG5cclxuICBpbml0SG9va3MocGFnZU9wdGlvbnMubWV0aG9kcywgaG9va3MkMSwgdnVlUGFnZU9wdGlvbnMpO1xyXG5cclxuICBwYWdlT3B0aW9ucy5tZXRob2RzLm9uTG9hZCA9IGZ1bmN0aW9uIChxdWVyeSkge1xyXG4gICAgdGhpcy5vcHRpb25zID0gcXVlcnk7XHJcbiAgICBjb25zdCBjb3B5UXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCBxdWVyeSk7XHJcbiAgICBkZWxldGUgY29weVF1ZXJ5Ll9faWRfXztcclxuICAgIHRoaXMuJHBhZ2UgPSB7XHJcbiAgICAgIGZ1bGxQYXRoOiAnLycgKyAodGhpcy5yb3V0ZSB8fCB0aGlzLmlzKSArIHN0cmluZ2lmeVF1ZXJ5KGNvcHlRdWVyeSlcclxuICAgIH07XHJcbiAgICB0aGlzLiR2bS4kbXAucXVlcnkgPSBxdWVyeTsgLy8g5YW85a65IG1wdnVlXHJcbiAgICB0aGlzLiR2bS5fX2NhbGxfaG9vaygnb25Mb2FkJywgcXVlcnkpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiBwYWdlT3B0aW9uc1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVBhZ2UgKHZ1ZVBhZ2VPcHRpb25zKSB7XHJcbiAgY29uc3QgcGFnZU9wdGlvbnMgPSBwYXJzZUJhc2VQYWdlKHZ1ZVBhZ2VPcHRpb25zLCB7XHJcbiAgICBpc1BhZ2UsXHJcbiAgICBpbml0UmVsYXRpb25cclxuICB9KTtcclxuICAvLyDpobXpnaLpnIDopoHlnKggcmVhZHkg5Lit6Kem5Y+R77yM5YW25LuW57uE5Lu25piv5ZyoIGhhbmRsZUxpbmsg5Lit6Kem5Y+RXHJcbiAgcGFnZU9wdGlvbnMubGlmZXRpbWVzLnJlYWR5ID0gZnVuY3Rpb24gcmVhZHkgKCkge1xyXG4gICAgaWYgKHRoaXMuJHZtICYmIHRoaXMuJHZtLm1wVHlwZSA9PT0gJ3BhZ2UnKSB7XHJcbiAgICAgIHRoaXMuJHZtLl9fY2FsbF9ob29rKCdjcmVhdGVkJyk7XHJcbiAgICAgIHRoaXMuJHZtLl9fY2FsbF9ob29rKCdiZWZvcmVNb3VudCcpO1xyXG4gICAgICB0aGlzLiR2bS5faXNNb3VudGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy4kdm0uX19jYWxsX2hvb2soJ21vdW50ZWQnKTtcclxuICAgICAgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUmVhZHknKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXMgJiYgY29uc29sZS53YXJuKHRoaXMuaXMgKyAnIGlzIG5vdCByZWFkeScpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHBhZ2VPcHRpb25zLmxpZmV0aW1lcy5kZXRhY2hlZCA9IGZ1bmN0aW9uIGRldGFjaGVkICgpIHtcclxuICAgIHRoaXMuJHZtICYmIHRoaXMuJHZtLiRkZXN0cm95KCk7XHJcbiAgICAvLyDmuIXnkIZcclxuICAgIGNvbnN0IHdlYnZpZXdJZCA9IHRoaXMuX193ZWJ2aWV3SWRfXztcclxuICAgIHdlYnZpZXdJZCAmJiBPYmplY3Qua2V5cyhpbnN0YW5jZXMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgaWYgKGtleS5pbmRleE9mKHdlYnZpZXdJZCArICdfJykgPT09IDApIHtcclxuICAgICAgICBkZWxldGUgaW5zdGFuY2VzW2tleV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiBwYWdlT3B0aW9uc1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVQYWdlICh2dWVQYWdlT3B0aW9ucykge1xyXG4gIHtcclxuICAgIHJldHVybiBDb21wb25lbnQocGFyc2VQYWdlKHZ1ZVBhZ2VPcHRpb25zKSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAodnVlT3B0aW9ucykge1xyXG4gIHtcclxuICAgIHJldHVybiBDb21wb25lbnQocGFyc2VDb21wb25lbnQodnVlT3B0aW9ucykpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVTdWJwYWNrYWdlQXBwICh2bSkge1xyXG4gIGNvbnN0IGFwcE9wdGlvbnMgPSBwYXJzZUFwcCh2bSk7XHJcbiAgY29uc3QgYXBwID0gZ2V0QXBwKHtcclxuICAgIGFsbG93RGVmYXVsdDogdHJ1ZVxyXG4gIH0pO1xyXG4gIHZtLiRzY29wZSA9IGFwcDtcclxuICBjb25zdCBnbG9iYWxEYXRhID0gYXBwLmdsb2JhbERhdGE7XHJcbiAgaWYgKGdsb2JhbERhdGEpIHtcclxuICAgIE9iamVjdC5rZXlzKGFwcE9wdGlvbnMuZ2xvYmFsRGF0YSkuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgaWYgKCFoYXNPd24oZ2xvYmFsRGF0YSwgbmFtZSkpIHtcclxuICAgICAgICBnbG9iYWxEYXRhW25hbWVdID0gYXBwT3B0aW9ucy5nbG9iYWxEYXRhW25hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgT2JqZWN0LmtleXMoYXBwT3B0aW9ucykuZm9yRWFjaChuYW1lID0+IHtcclxuICAgIGlmICghaGFzT3duKGFwcCwgbmFtZSkpIHtcclxuICAgICAgYXBwW25hbWVdID0gYXBwT3B0aW9uc1tuYW1lXTtcclxuICAgIH1cclxuICB9KTtcclxuICBpZiAoaXNGbihhcHBPcHRpb25zLm9uU2hvdykgJiYgdHQub25BcHBTaG93KSB7XHJcbiAgICB0dC5vbkFwcFNob3coKC4uLmFyZ3MpID0+IHtcclxuICAgICAgdm0uX19jYWxsX2hvb2soJ29uU2hvdycsIGFyZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGlmIChpc0ZuKGFwcE9wdGlvbnMub25IaWRlKSAmJiB0dC5vbkFwcEhpZGUpIHtcclxuICAgIHR0Lm9uQXBwSGlkZSgoLi4uYXJncykgPT4ge1xyXG4gICAgICB2bS5fX2NhbGxfaG9vaygnb25IaWRlJywgYXJncyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgaWYgKGlzRm4oYXBwT3B0aW9ucy5vbkxhdW5jaCkpIHtcclxuICAgIGNvbnN0IGFyZ3MgPSB0dC5nZXRMYXVuY2hPcHRpb25zU3luYyAmJiB0dC5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gICAgdm0uX19jYWxsX2hvb2soJ29uTGF1bmNoJywgYXJncyk7XHJcbiAgfVxyXG4gIHJldHVybiB2bVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVQbHVnaW4gKHZtKSB7XHJcbiAgY29uc3QgYXBwT3B0aW9ucyA9IHBhcnNlQXBwKHZtKTtcclxuICBpZiAoaXNGbihhcHBPcHRpb25zLm9uU2hvdykgJiYgdHQub25BcHBTaG93KSB7XHJcbiAgICB0dC5vbkFwcFNob3coKC4uLmFyZ3MpID0+IHtcclxuICAgICAgdm0uX19jYWxsX2hvb2soJ29uU2hvdycsIGFyZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGlmIChpc0ZuKGFwcE9wdGlvbnMub25IaWRlKSAmJiB0dC5vbkFwcEhpZGUpIHtcclxuICAgIHR0Lm9uQXBwSGlkZSgoLi4uYXJncykgPT4ge1xyXG4gICAgICB2bS5fX2NhbGxfaG9vaygnb25IaWRlJywgYXJncyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgaWYgKGlzRm4oYXBwT3B0aW9ucy5vbkxhdW5jaCkpIHtcclxuICAgIGNvbnN0IGFyZ3MgPSB0dC5nZXRMYXVuY2hPcHRpb25zU3luYyAmJiB0dC5nZXRMYXVuY2hPcHRpb25zU3luYygpO1xyXG4gICAgdm0uX19jYWxsX2hvb2soJ29uTGF1bmNoJywgYXJncyk7XHJcbiAgfVxyXG4gIHJldHVybiB2bVxyXG59XHJcblxyXG50b2Rvcy5mb3JFYWNoKHRvZG9BcGkgPT4ge1xyXG4gIHByb3RvY29sc1t0b2RvQXBpXSA9IGZhbHNlO1xyXG59KTtcclxuXHJcbmNhbklVc2VzLmZvckVhY2goY2FuSVVzZUFwaSA9PiB7XHJcbiAgY29uc3QgYXBpTmFtZSA9IHByb3RvY29sc1tjYW5JVXNlQXBpXSAmJiBwcm90b2NvbHNbY2FuSVVzZUFwaV0ubmFtZSA/IHByb3RvY29sc1tjYW5JVXNlQXBpXS5uYW1lXHJcbiAgICA6IGNhbklVc2VBcGk7XHJcbiAgaWYgKCF0dC5jYW5JVXNlKGFwaU5hbWUpKSB7XHJcbiAgICBwcm90b2NvbHNbY2FuSVVzZUFwaV0gPSBmYWxzZTtcclxuICB9XHJcbn0pO1xyXG5cclxubGV0IHVuaSA9IHt9O1xyXG5cclxuaWYgKHR5cGVvZiBQcm94eSAhPT0gJ3VuZGVmaW5lZCcgJiYgXCJtcC10b3V0aWFvXCIgIT09ICdhcHAtcGx1cycpIHtcclxuICB1bmkgPSBuZXcgUHJveHkoe30sIHtcclxuICAgIGdldCAodGFyZ2V0LCBuYW1lKSB7XHJcbiAgICAgIGlmIChoYXNPd24odGFyZ2V0LCBuYW1lKSkge1xyXG4gICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cclxuICAgICAgfVxyXG4gICAgICBpZiAoYmFzZUFwaVtuYW1lXSkge1xyXG4gICAgICAgIHJldHVybiBiYXNlQXBpW25hbWVdXHJcbiAgICAgIH1cclxuICAgICAgaWYgKGFwaVtuYW1lXSkge1xyXG4gICAgICAgIHJldHVybiBwcm9taXNpZnkobmFtZSwgYXBpW25hbWVdKVxyXG4gICAgICB9XHJcbiAgICAgIHtcclxuICAgICAgICBpZiAoZXh0cmFBcGlbbmFtZV0pIHtcclxuICAgICAgICAgIHJldHVybiBwcm9taXNpZnkobmFtZSwgZXh0cmFBcGlbbmFtZV0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0b2RvQXBpc1tuYW1lXSkge1xyXG4gICAgICAgICAgcmV0dXJuIHByb21pc2lmeShuYW1lLCB0b2RvQXBpc1tuYW1lXSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV2ZW50QXBpW25hbWVdKSB7XHJcbiAgICAgICAgcmV0dXJuIGV2ZW50QXBpW25hbWVdXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFoYXNPd24odHQsIG5hbWUpICYmICFoYXNPd24ocHJvdG9jb2xzLCBuYW1lKSkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwcm9taXNpZnkobmFtZSwgd3JhcHBlcihuYW1lLCB0dFtuYW1lXSkpXHJcbiAgICB9LFxyXG4gICAgc2V0ICh0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XHJcbiAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xyXG4gICAgICByZXR1cm4gdHJ1ZVxyXG4gICAgfVxyXG4gIH0pO1xyXG59IGVsc2Uge1xyXG4gIE9iamVjdC5rZXlzKGJhc2VBcGkpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICB1bmlbbmFtZV0gPSBiYXNlQXBpW25hbWVdO1xyXG4gIH0pO1xyXG5cclxuICB7XHJcbiAgICBPYmplY3Qua2V5cyh0b2RvQXBpcykuZm9yRWFjaChuYW1lID0+IHtcclxuICAgICAgdW5pW25hbWVdID0gcHJvbWlzaWZ5KG5hbWUsIHRvZG9BcGlzW25hbWVdKTtcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmtleXMoZXh0cmFBcGkpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgIHVuaVtuYW1lXSA9IHByb21pc2lmeShuYW1lLCB0b2RvQXBpc1tuYW1lXSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIE9iamVjdC5rZXlzKGV2ZW50QXBpKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgdW5pW25hbWVdID0gZXZlbnRBcGlbbmFtZV07XHJcbiAgfSk7XHJcblxyXG4gIE9iamVjdC5rZXlzKGFwaSkuZm9yRWFjaChuYW1lID0+IHtcclxuICAgIHVuaVtuYW1lXSA9IHByb21pc2lmeShuYW1lLCBhcGlbbmFtZV0pO1xyXG4gIH0pO1xyXG5cclxuICBPYmplY3Qua2V5cyh0dCkuZm9yRWFjaChuYW1lID0+IHtcclxuICAgIGlmIChoYXNPd24odHQsIG5hbWUpIHx8IGhhc093bihwcm90b2NvbHMsIG5hbWUpKSB7XHJcbiAgICAgIHVuaVtuYW1lXSA9IHByb21pc2lmeShuYW1lLCB3cmFwcGVyKG5hbWUsIHR0W25hbWVdKSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbnR0LmNyZWF0ZUFwcCA9IGNyZWF0ZUFwcDtcclxudHQuY3JlYXRlUGFnZSA9IGNyZWF0ZVBhZ2U7XHJcbnR0LmNyZWF0ZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudDtcclxudHQuY3JlYXRlU3VicGFja2FnZUFwcCA9IGNyZWF0ZVN1YnBhY2thZ2VBcHA7XHJcbnR0LmNyZWF0ZVBsdWdpbiA9IGNyZWF0ZVBsdWdpbjtcclxuXHJcbnZhciB1bmkkMSA9IHVuaTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHVuaSQxO1xyXG5leHBvcnQgeyBjcmVhdGVBcHAsIGNyZWF0ZUNvbXBvbmVudCwgY3JlYXRlUGFnZSwgY3JlYXRlUGx1Z2luLCBjcmVhdGVTdWJwYWNrYWdlQXBwIH07XHJcbiIsInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiIsIi8qIVxuICogVnVlLmpzIHYyLjYuMTFcbiAqIChjKSAyMDE0LTIwMjIgRXZhbiBZb3VcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuLyogICovXG5cbnZhciBlbXB0eU9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG4vLyBUaGVzZSBoZWxwZXJzIHByb2R1Y2UgYmV0dGVyIFZNIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXJcbi8vIGV4cGxpY2l0bmVzcyBhbmQgZnVuY3Rpb24gaW5saW5pbmcuXG5mdW5jdGlvbiBpc1VuZGVmICh2KSB7XG4gIHJldHVybiB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0RlZiAodikge1xuICByZXR1cm4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNUcnVlICh2KSB7XG4gIHJldHVybiB2ID09PSB0cnVlXG59XG5cbmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHtcbiAgcmV0dXJuIHYgPT09IGZhbHNlXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdmFsdWUgaXMgcHJpbWl0aXZlLlxuICovXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJ1xuICApXG59XG5cbi8qKlxuICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsXG4gKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlXG4gKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0J1xufVxuXG4vKipcbiAqIEdldCB0aGUgcmF3IHR5cGUgc3RyaW5nIG9mIGEgdmFsdWUsIGUuZy4sIFtvYmplY3QgT2JqZWN0XS5cbiAqL1xudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHRvUmF3VHlwZSAodmFsdWUpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSlcbn1cblxuLyoqXG4gKiBTdHJpY3Qgb2JqZWN0IHR5cGUgY2hlY2suIE9ubHkgcmV0dXJucyB0cnVlXG4gKiBmb3IgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nXG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwICh2KSB7XG4gIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWwgaXMgYSB2YWxpZCBhcnJheSBpbmRleC5cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkge1xuICB2YXIgbiA9IHBhcnNlRmxvYXQoU3RyaW5nKHZhbCkpO1xuICByZXR1cm4gbiA+PSAwICYmIE1hdGguZmxvb3IobikgPT09IG4gJiYgaXNGaW5pdGUodmFsKVxufVxuXG5mdW5jdGlvbiBpc1Byb21pc2UgKHZhbCkge1xuICByZXR1cm4gKFxuICAgIGlzRGVmKHZhbCkgJiZcbiAgICB0eXBlb2YgdmFsLnRoZW4gPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgdG8gYSBzdHJpbmcgdGhhdCBpcyBhY3R1YWxseSByZW5kZXJlZC5cbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkge1xuICByZXR1cm4gdmFsID09IG51bGxcbiAgICA/ICcnXG4gICAgOiBBcnJheS5pc0FycmF5KHZhbCkgfHwgKGlzUGxhaW5PYmplY3QodmFsKSAmJiB2YWwudG9TdHJpbmcgPT09IF90b1N0cmluZylcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsLCBudWxsLCAyKVxuICAgICAgOiBTdHJpbmcodmFsKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gaW5wdXQgdmFsdWUgdG8gYSBudW1iZXIgZm9yIHBlcnNpc3RlbmNlLlxuICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyICh2YWwpIHtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG5cbn1cblxuLyoqXG4gKiBNYWtlIGEgbWFwIGFuZCByZXR1cm4gYSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYSBrZXlcbiAqIGlzIGluIHRoYXQgbWFwLlxuICovXG5mdW5jdGlvbiBtYWtlTWFwIChcbiAgc3RyLFxuICBleHBlY3RzTG93ZXJDYXNlXG4pIHtcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBsaXN0ID0gc3RyLnNwbGl0KCcsJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2VcbiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH1cbiAgICA6IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWxdOyB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB0YWcgaXMgYSBidWlsdC1pbiB0YWcuXG4gKi9cbnZhciBpc0J1aWx0SW5UYWcgPSBtYWtlTWFwKCdzbG90LGNvbXBvbmVudCcsIHRydWUpO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZS5cbiAqL1xudmFyIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUgPSBtYWtlTWFwKCdrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcycpO1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZSAoYXJyLCBpdGVtKSB7XG4gIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJldHVybiBhcnIuc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkuXG4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBoYXNPd24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICB2YXIgaGl0ID0gY2FjaGVbc3RyXTtcbiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxpbWl0ZWQgc3RyaW5nLlxuICovXG52YXIgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykgeyByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnOyB9KVxufSk7XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBhIHN0cmluZy5cbiAqL1xudmFyIGNhcGl0YWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpXG59KTtcblxuLyoqXG4gKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLlxuICovXG52YXIgaHlwaGVuYXRlUkUgPSAvXFxCKFtBLVpdKS9nO1xudmFyIGh5cGhlbmF0ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShoeXBoZW5hdGVSRSwgJy0kMScpLnRvTG93ZXJDYXNlKClcbn0pO1xuXG4vKipcbiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdCxcbiAqIGUuZy4sIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5LCB3ZSBkb24ndCBuZWVkIHRoaXMgYW55bW9yZVxuICogc2luY2UgbmF0aXZlIGJpbmQgaXMgbm93IHBlcmZvcm1hbnQgZW5vdWdoIGluIG1vc3QgYnJvd3NlcnMuXG4gKiBCdXQgcmVtb3ZpbmcgaXQgd291bGQgbWVhbiBicmVha2luZyBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluXG4gKiBQaGFudG9tSlMgMS54LCBzbyB0aGlzIG11c3QgYmUga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gcG9seWZpbGxCaW5kIChmbiwgY3R4KSB7XG4gIGZ1bmN0aW9uIGJvdW5kRm4gKGEpIHtcbiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cblxuICBib3VuZEZuLl9sZW5ndGggPSBmbi5sZW5ndGg7XG4gIHJldHVybiBib3VuZEZuXG59XG5cbmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY3R4KVxufVxuXG52YXIgYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gID8gbmF0aXZlQmluZFxuICA6IHBvbHlmaWxsQmluZDtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS5cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSAobGlzdCwgc3RhcnQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICB2YXIgaSA9IGxpc3QubGVuZ3RoIC0gc3RhcnQ7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0pIHtcbiAgICByZXRbaV0gPSBsaXN0W2kgKyBzdGFydF07XG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG4vKipcbiAqIE1peCBwcm9wZXJ0aWVzIGludG8gdGFyZ2V0IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIF9mcm9tKSB7XG4gICAgdG9ba2V5XSA9IF9mcm9tW2tleV07XG4gIH1cbiAgcmV0dXJuIHRvXG59XG5cbi8qKlxuICogTWVyZ2UgYW4gQXJyYXkgb2YgT2JqZWN0cyBpbnRvIGEgc2luZ2xlIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gdG9PYmplY3QgKGFycikge1xuICB2YXIgcmVzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFycltpXSkge1xuICAgICAgZXh0ZW5kKHJlcywgYXJyW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4vKipcbiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLlxuICogU3R1YmJpbmcgYXJncyB0byBtYWtlIEZsb3cgaGFwcHkgd2l0aG91dCBsZWF2aW5nIHVzZWxlc3MgdHJhbnNwaWxlZCBjb2RlXG4gKiB3aXRoIC4uLnJlc3QgKGh0dHBzOi8vZmxvdy5vcmcvYmxvZy8yMDE3LzA1LzA3L1N0cmljdC1GdW5jdGlvbi1DYWxsLUFyaXR5LykuXG4gKi9cbmZ1bmN0aW9uIG5vb3AgKGEsIGIsIGMpIHt9XG5cbi8qKlxuICogQWx3YXlzIHJldHVybiBmYWxzZS5cbiAqL1xudmFyIG5vID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsgcmV0dXJuIGZhbHNlOyB9O1xuXG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbi8qKlxuICogUmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiAoXykgeyByZXR1cm4gXzsgfTtcblxuLyoqXG4gKiBDaGVjayBpZiB0d28gdmFsdWVzIGFyZSBsb29zZWx5IGVxdWFsIC0gdGhhdCBpcyxcbiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT9cbiAqL1xuZnVuY3Rpb24gbG9vc2VFcXVhbCAoYSwgYikge1xuICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9XG4gIHZhciBpc09iamVjdEEgPSBpc09iamVjdChhKTtcbiAgdmFyIGlzT2JqZWN0QiA9IGlzT2JqZWN0KGIpO1xuICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0Qikge1xuICAgIHRyeSB7XG4gICAgICB2YXIgaXNBcnJheUEgPSBBcnJheS5pc0FycmF5KGEpO1xuICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTtcbiAgICAgIGlmIChpc0FycmF5QSAmJiBpc0FycmF5Qikge1xuICAgICAgICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpXG4gICAgICB9IGVsc2UgaWYgKCFpc0FycmF5QSAmJiAhaXNBcnJheUIpIHtcbiAgICAgICAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga2V5c0EubGVuZ3RoID09PSBrZXlzQi5sZW5ndGggJiYga2V5c0EuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBsb29zZWx5IGVxdWFsIHZhbHVlIGNhbiBiZVxuICogZm91bmQgaW4gdGhlIGFycmF5IChpZiB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdCwgdGhlIGFycmF5IG11c3RcbiAqIGNvbnRhaW4gYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHNoYXBlKSwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobG9vc2VFcXVhbChhcnJbaV0sIHZhbCkpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIEVuc3VyZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UuXG4gKi9cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBBU1NFVF9UWVBFUyA9IFtcbiAgJ2NvbXBvbmVudCcsXG4gICdkaXJlY3RpdmUnLFxuICAnZmlsdGVyJ1xuXTtcblxudmFyIExJRkVDWUNMRV9IT09LUyA9IFtcbiAgJ2JlZm9yZUNyZWF0ZScsXG4gICdjcmVhdGVkJyxcbiAgJ2JlZm9yZU1vdW50JyxcbiAgJ21vdW50ZWQnLFxuICAnYmVmb3JlVXBkYXRlJyxcbiAgJ3VwZGF0ZWQnLFxuICAnYmVmb3JlRGVzdHJveScsXG4gICdkZXN0cm95ZWQnLFxuICAnYWN0aXZhdGVkJyxcbiAgJ2RlYWN0aXZhdGVkJyxcbiAgJ2Vycm9yQ2FwdHVyZWQnLFxuICAnc2VydmVyUHJlZmV0Y2gnXG5dO1xuXG4vKiAgKi9cblxuXG5cbnZhciBjb25maWcgPSAoe1xuICAvKipcbiAgICogT3B0aW9uIG1lcmdlIHN0cmF0ZWdpZXMgKHVzZWQgaW4gY29yZS91dGlsL29wdGlvbnMpXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN1cHByZXNzIHdhcm5pbmdzLlxuICAgKi9cbiAgc2lsZW50OiBmYWxzZSxcblxuICAvKipcbiAgICogU2hvdyBwcm9kdWN0aW9uIG1vZGUgdGlwIG1lc3NhZ2Ugb24gYm9vdD9cbiAgICovXG4gIHByb2R1Y3Rpb25UaXA6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGRldnRvb2xzXG4gICAqL1xuICBkZXZ0b29sczogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byByZWNvcmQgcGVyZlxuICAgKi9cbiAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9yc1xuICAgKi9cbiAgZXJyb3JIYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBXYXJuIGhhbmRsZXIgZm9yIHdhdGNoZXIgd2FybnNcbiAgICovXG4gIHdhcm5IYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBJZ25vcmUgY2VydGFpbiBjdXN0b20gZWxlbWVudHNcbiAgICovXG4gIGlnbm9yZWRFbGVtZW50czogW10sXG5cbiAgLyoqXG4gICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYVxuICAgKiBjb21wb25lbnQuIFRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50IGFuZCBtYXkgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBpc1Jlc2VydmVkVGFnOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnRcbiAgICogcHJvcC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIGlzUmVzZXJ2ZWRBdHRyOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LlxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBpc1Vua25vd25FbGVtZW50OiBubyxcblxuICAvKipcbiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudFxuICAgKi9cbiAgZ2V0VGFnTmFtZXNwYWNlOiBub29wLFxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgcmVhbCB0YWcgbmFtZSBmb3IgdGhlIHNwZWNpZmljIHBsYXRmb3JtLlxuICAgKi9cbiAgcGFyc2VQbGF0Zm9ybVRhZ05hbWU6IGlkZW50aXR5LFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbXVzdCBiZSBib3VuZCB1c2luZyBwcm9wZXJ0eSwgZS5nLiB2YWx1ZVxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBtdXN0VXNlUHJvcDogbm8sXG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdXBkYXRlcyBhc3luY2hyb25vdXNseS4gSW50ZW5kZWQgdG8gYmUgdXNlZCBieSBWdWUgVGVzdCBVdGlsc1xuICAgKiBUaGlzIHdpbGwgc2lnbmlmaWNhbnRseSByZWR1Y2UgcGVyZm9ybWFuY2UgaWYgc2V0IHRvIGZhbHNlLlxuICAgKi9cbiAgYXN5bmM6IHRydWUsXG5cbiAgLyoqXG4gICAqIEV4cG9zZWQgZm9yIGxlZ2FjeSByZWFzb25zXG4gICAqL1xuICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LU1xufSk7XG5cbi8qICAqL1xuXG4vKipcbiAqIHVuaWNvZGUgbGV0dGVycyB1c2VkIGZvciBwYXJzaW5nIGh0bWwgdGFncywgY29tcG9uZW50IG5hbWVzIGFuZCBwcm9wZXJ0eSBwYXRocy5cbiAqIHVzaW5nIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTMvc2VtYW50aWNzLXNjcmlwdGluZy5odG1sI3BvdGVudGlhbGN1c3RvbWVsZW1lbnRuYW1lXG4gKiBza2lwcGluZyBcXHUxMDAwMC1cXHVFRkZGRiBkdWUgdG8gaXQgZnJlZXppbmcgdXAgUGhhbnRvbUpTXG4gKi9cbnZhciB1bmljb2RlUmVnRXhwID0gL2EtekEtWlxcdTAwQjdcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDNGLVxcdTIwNDBcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQvO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICQgb3IgX1xuICovXG5mdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHtcbiAgdmFyIGMgPSAoc3RyICsgJycpLmNoYXJDb2RlQXQoMCk7XG4gIHJldHVybiBjID09PSAweDI0IHx8IGMgPT09IDB4NUZcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZGVmIChvYmosIGtleSwgdmFsLCBlbnVtZXJhYmxlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIHZhbHVlOiB2YWwsXG4gICAgZW51bWVyYWJsZTogISFlbnVtZXJhYmxlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBzaW1wbGUgcGF0aC5cbiAqL1xudmFyIGJhaWxSRSA9IG5ldyBSZWdFeHAoKFwiW15cIiArICh1bmljb2RlUmVnRXhwLnNvdXJjZSkgKyBcIi4kX1xcXFxkXVwiKSk7XG5mdW5jdGlvbiBwYXJzZVBhdGggKHBhdGgpIHtcbiAgaWYgKGJhaWxSRS50ZXN0KHBhdGgpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghb2JqKSB7IHJldHVybiB9XG4gICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cbn1cblxuLyogICovXG5cbi8vIGNhbiB3ZSB1c2UgX19wcm90b19fP1xudmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307XG5cbi8vIEJyb3dzZXIgZW52aXJvbm1lbnQgc25pZmZpbmdcbnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbnZhciBpbldlZXggPSB0eXBlb2YgV1hFbnZpcm9ubWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgISFXWEVudmlyb25tZW50LnBsYXRmb3JtO1xudmFyIHdlZXhQbGF0Zm9ybSA9IGluV2VleCAmJiBXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7XG52YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbnZhciBpc0lFID0gVUEgJiYgL21zaWV8dHJpZGVudC8udGVzdChVQSk7XG52YXIgaXNJRTkgPSBVQSAmJiBVQS5pbmRleE9mKCdtc2llIDkuMCcpID4gMDtcbnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDtcbnZhciBpc0FuZHJvaWQgPSAoVUEgJiYgVUEuaW5kZXhPZignYW5kcm9pZCcpID4gMCkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKTtcbnZhciBpc0lPUyA9IChVQSAmJiAvaXBob25lfGlwYWR8aXBvZHxpb3MvLnRlc3QoVUEpKSB8fCAod2VleFBsYXRmb3JtID09PSAnaW9zJyk7XG52YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXFwvXFxkKy8udGVzdChVQSkgJiYgIWlzRWRnZTtcbnZhciBpc1BoYW50b21KUyA9IFVBICYmIC9waGFudG9tanMvLnRlc3QoVUEpO1xudmFyIGlzRkYgPSBVQSAmJiBVQS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pO1xuXG4vLyBGaXJlZm94IGhhcyBhIFwid2F0Y2hcIiBmdW5jdGlvbiBvbiBPYmplY3QucHJvdG90eXBlLi4uXG52YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoO1xuaWYgKGluQnJvd3Nlcikge1xuICB0cnkge1xuICAgIHZhciBvcHRzID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdHMsICdwYXNzaXZlJywgKHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAgIH1cbiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODVcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdC1wYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbi8vIHRoaXMgbmVlZHMgdG8gYmUgbGF6eS1ldmFsZWQgYmVjYXVzZSB2dWUgbWF5IGJlIHJlcXVpcmVkIGJlZm9yZVxuLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlZcbnZhciBfaXNTZXJ2ZXI7XG52YXIgaXNTZXJ2ZXJSZW5kZXJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghaW5Ccm93c2VyICYmICFpbldlZXggJiYgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZFxuICAgICAgLy8gV2VicGFjayBzaGltbWluZyB0aGUgcHJvY2Vzc1xuICAgICAgX2lzU2VydmVyID0gZ2xvYmFsWydwcm9jZXNzJ10gJiYgZ2xvYmFsWydwcm9jZXNzJ10uZW52LlZVRV9FTlYgPT09ICdzZXJ2ZXInO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaXNTZXJ2ZXIgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9pc1NlcnZlclxufTtcblxuLy8gZGV0ZWN0IGRldnRvb2xzXG52YXIgZGV2dG9vbHMgPSBpbkJyb3dzZXIgJiYgd2luZG93Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX187XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBpc05hdGl2ZSAoQ3Rvcikge1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSlcbn1cblxudmFyIGhhc1N5bWJvbCA9XG4gIHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFN5bWJvbCkgJiZcbiAgdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFJlZmxlY3Qub3duS2V5cyk7XG5cbnZhciBfU2V0O1xuLyogaXN0YW5idWwgaWdub3JlIGlmICovIC8vICRmbG93LWRpc2FibGUtbGluZVxuaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHtcbiAgLy8gdXNlIG5hdGl2ZSBTZXQgd2hlbiBhdmFpbGFibGUuXG4gIF9TZXQgPSBTZXQ7XG59IGVsc2Uge1xuICAvLyBhIG5vbi1zdGFuZGFyZCBTZXQgcG9seWZpbGwgdGhhdCBvbmx5IHdvcmtzIHdpdGggcHJpbWl0aXZlIGtleXMuXG4gIF9TZXQgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXQgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRba2V5XSA9PT0gdHJ1ZVxuICAgIH07XG4gICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGtleSkge1xuICAgICAgdGhpcy5zZXRba2V5XSA9IHRydWU7XG4gICAgfTtcbiAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2V0O1xuICB9KCkpO1xufVxuXG4vKiAgKi9cblxudmFyIHdhcm4gPSBub29wO1xudmFyIHRpcCA9IG5vb3A7XG52YXIgZ2VuZXJhdGVDb21wb25lbnRUcmFjZSA9IChub29wKTsgLy8gd29yayBhcm91bmQgZmxvdyBjaGVja1xudmFyIGZvcm1hdENvbXBvbmVudE5hbWUgPSAobm9vcCk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnO1xuICB2YXIgY2xhc3NpZnlSRSA9IC8oPzpefFstX10pKFxcdykvZztcbiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyXG4gICAgLnJlcGxhY2UoY2xhc3NpZnlSRSwgZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMudG9VcHBlckNhc2UoKTsgfSlcbiAgICAucmVwbGFjZSgvWy1fXS9nLCAnJyk7IH07XG5cbiAgd2FybiA9IGZ1bmN0aW9uIChtc2csIHZtKSB7XG4gICAgdmFyIHRyYWNlID0gdm0gPyBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlKHZtKSA6ICcnO1xuXG4gICAgaWYgKGNvbmZpZy53YXJuSGFuZGxlcikge1xuICAgICAgY29uZmlnLndhcm5IYW5kbGVyLmNhbGwobnVsbCwgbXNnLCB2bSwgdHJhY2UpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIltWdWUgd2Fybl06IFwiICsgbXNnICsgdHJhY2UpKTtcbiAgICB9XG4gIH07XG5cbiAgdGlwID0gZnVuY3Rpb24gKG1zZywgdm0pIHtcbiAgICBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbVnVlIHRpcF06IFwiICsgbXNnICsgKFxuICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJydcbiAgICAgICkpO1xuICAgIH1cbiAgfTtcblxuICBmb3JtYXRDb21wb25lbnROYW1lID0gZnVuY3Rpb24gKHZtLCBpbmNsdWRlRmlsZSkge1xuICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHtcbiAgICAgIGlmICh2bS4kb3B0aW9ucyAmJiB2bS4kb3B0aW9ucy5fX2ZpbGUpIHsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICAgIHJldHVybiAoJycpICsgdm0uJG9wdGlvbnMuX19maWxlXG4gICAgICB9XG4gICAgICByZXR1cm4gJzxSb290PidcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygdm0gPT09ICdmdW5jdGlvbicgJiYgdm0uY2lkICE9IG51bGxcbiAgICAgID8gdm0ub3B0aW9uc1xuICAgICAgOiB2bS5faXNWdWVcbiAgICAgICAgPyB2bS4kb3B0aW9ucyB8fCB2bS5jb25zdHJ1Y3Rvci5vcHRpb25zXG4gICAgICAgIDogdm07XG4gICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnO1xuICAgIHZhciBmaWxlID0gb3B0aW9ucy5fX2ZpbGU7XG4gICAgaWYgKCFuYW1lICYmIGZpbGUpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwudnVlJC8pO1xuICAgICAgbmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAobmFtZSA/IChcIjxcIiArIChjbGFzc2lmeShuYW1lKSkgKyBcIj5cIikgOiBcIjxBbm9ueW1vdXM+XCIpICtcbiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/IChcIiBhdCBcIiArIGZpbGUpIDogJycpXG4gICAgKVxuICB9O1xuXG4gIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHdoaWxlIChuKSB7XG4gICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfVxuICAgICAgaWYgKG4gPiAxKSB7IHN0ciArPSBzdHI7IH1cbiAgICAgIG4gPj49IDE7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfTtcblxuICBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gZnVuY3Rpb24gKHZtKSB7XG4gICAgaWYgKHZtLl9pc1Z1ZSAmJiB2bS4kcGFyZW50KSB7XG4gICAgICB2YXIgdHJlZSA9IFtdO1xuICAgICAgdmFyIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA9IDA7XG4gICAgICB3aGlsZSAodm0gJiYgdm0uJG9wdGlvbnMubmFtZSAhPT0gJ1BhZ2VCb2R5Jykge1xuICAgICAgICBpZiAodHJlZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKGxhc3QuY29uc3RydWN0b3IgPT09IHZtLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UrKztcbiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPiAwKSB7XG4gICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTtcbiAgICAgICAgICAgIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICF2bS4kb3B0aW9ucy5pc1Jlc2VydmVkICYmIHRyZWUucHVzaCh2bSk7XG4gICAgICAgIHZtID0gdm0uJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAnXFxuXFxuZm91bmQgaW5cXG5cXG4nICsgdHJlZVxuICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKFwiXCIgKyAoaSA9PT0gMCA/ICctLS0+ICcgOiByZXBlYXQoJyAnLCA1ICsgaSAqIDIpKSArIChBcnJheS5pc0FycmF5KHZtKVxuICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArIFwiLi4uIChcIiArICh2bVsxXSkgKyBcIiByZWN1cnNpdmUgY2FsbHMpXCIpXG4gICAgICAgICAgICA6IGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSk7IH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFwiXFxuXFxuKGZvdW5kIGluIFwiICsgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArIFwiKVwiKVxuICAgIH1cbiAgfTtcbn1cblxuLyogICovXG5cbnZhciB1aWQgPSAwO1xuXG4vKipcbiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICogZGlyZWN0aXZlcyBzdWJzY3JpYmluZyB0byBpdC5cbiAqL1xudmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7XG4gIHRoaXMuaWQgPSB1aWQrKztcbiAgdGhpcy5zdWJzID0gW107XG59O1xuXG5EZXAucHJvdG90eXBlLmFkZFN1YiA9IGZ1bmN0aW9uIGFkZFN1YiAoc3ViKSB7XG4gIHRoaXMuc3Vicy5wdXNoKHN1Yik7XG59O1xuXG5EZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7XG4gIHJlbW92ZSh0aGlzLnN1YnMsIHN1Yik7XG59O1xuXG5EZXAucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7XG4gIGlmIChEZXAuU2hhcmVkT2JqZWN0LnRhcmdldCkge1xuICAgIERlcC5TaGFyZWRPYmplY3QudGFyZ2V0LmFkZERlcCh0aGlzKTtcbiAgfVxufTtcblxuRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkge1xuICAvLyBzdGFiaWxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICB2YXIgc3VicyA9IHRoaXMuc3Vicy5zbGljZSgpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhY29uZmlnLmFzeW5jKSB7XG4gICAgLy8gc3VicyBhcmVuJ3Qgc29ydGVkIGluIHNjaGVkdWxlciBpZiBub3QgcnVubmluZyBhc3luY1xuICAgIC8vIHdlIG5lZWQgdG8gc29ydCB0aGVtIG5vdyB0byBtYWtlIHN1cmUgdGhleSBmaXJlIGluIGNvcnJlY3RcbiAgICAvLyBvcmRlclxuICAgIHN1YnMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5pZCAtIGIuaWQ7IH0pO1xuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsID0gc3Vicy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBzdWJzW2ldLnVwZGF0ZSgpO1xuICB9XG59O1xuXG4vLyBUaGUgY3VycmVudCB0YXJnZXQgd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQuXG4vLyBUaGlzIGlzIGdsb2JhbGx5IHVuaXF1ZSBiZWNhdXNlIG9ubHkgb25lIHdhdGNoZXJcbi8vIGNhbiBiZSBldmFsdWF0ZWQgYXQgYSB0aW1lLlxuLy8gZml4ZWQgYnkgeHh4eHh4IChudnVlIHNoYXJlZCB2dWV4KVxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbkRlcC5TaGFyZWRPYmplY3QgPSB7fTtcbkRlcC5TaGFyZWRPYmplY3QudGFyZ2V0ID0gbnVsbDtcbkRlcC5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sgPSBbXTtcblxuZnVuY3Rpb24gcHVzaFRhcmdldCAodGFyZ2V0KSB7XG4gIERlcC5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucHVzaCh0YXJnZXQpO1xuICBEZXAuU2hhcmVkT2JqZWN0LnRhcmdldCA9IHRhcmdldDtcbiAgRGVwLnRhcmdldCA9IHRhcmdldDtcbn1cblxuZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHtcbiAgRGVwLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wb3AoKTtcbiAgRGVwLlNoYXJlZE9iamVjdC50YXJnZXQgPSBEZXAuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrW0RlcC5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2subGVuZ3RoIC0gMV07XG4gIERlcC50YXJnZXQgPSBEZXAuU2hhcmVkT2JqZWN0LnRhcmdldDtcbn1cblxuLyogICovXG5cbnZhciBWTm9kZSA9IGZ1bmN0aW9uIFZOb2RlIChcbiAgdGFnLFxuICBkYXRhLFxuICBjaGlsZHJlbixcbiAgdGV4dCxcbiAgZWxtLFxuICBjb250ZXh0LFxuICBjb21wb25lbnRPcHRpb25zLFxuICBhc3luY0ZhY3Rvcnlcbikge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB0aGlzLnRleHQgPSB0ZXh0O1xuICB0aGlzLmVsbSA9IGVsbTtcbiAgdGhpcy5ucyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7XG4gIHRoaXMuZm5PcHRpb25zID0gdW5kZWZpbmVkO1xuICB0aGlzLmZuU2NvcGVJZCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5O1xuICB0aGlzLmNvbXBvbmVudE9wdGlvbnMgPSBjb21wb25lbnRPcHRpb25zO1xuICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5yYXcgPSBmYWxzZTtcbiAgdGhpcy5pc1N0YXRpYyA9IGZhbHNlO1xuICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7XG4gIHRoaXMuaXNDb21tZW50ID0gZmFsc2U7XG4gIHRoaXMuaXNDbG9uZWQgPSBmYWxzZTtcbiAgdGhpcy5pc09uY2UgPSBmYWxzZTtcbiAgdGhpcy5hc3luY0ZhY3RvcnkgPSBhc3luY0ZhY3Rvcnk7XG4gIHRoaXMuYXN5bmNNZXRhID0gdW5kZWZpbmVkO1xuICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlO1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLy8gREVQUkVDQVRFRDogYWxpYXMgZm9yIGNvbXBvbmVudEluc3RhbmNlIGZvciBiYWNrd2FyZHMgY29tcGF0LlxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5jaGlsZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlXG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVk5vZGUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxudmFyIGNyZWF0ZUVtcHR5Vk5vZGUgPSBmdW5jdGlvbiAodGV4dCkge1xuICBpZiAoIHRleHQgPT09IHZvaWQgMCApIHRleHQgPSAnJztcblxuICB2YXIgbm9kZSA9IG5ldyBWTm9kZSgpO1xuICBub2RlLnRleHQgPSB0ZXh0O1xuICBub2RlLmlzQ29tbWVudCA9IHRydWU7XG4gIHJldHVybiBub2RlXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUZXh0Vk5vZGUgKHZhbCkge1xuICByZXR1cm4gbmV3IFZOb2RlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFN0cmluZyh2YWwpKVxufVxuXG4vLyBvcHRpbWl6ZWQgc2hhbGxvdyBjbG9uZVxuLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zc1xuLy8gbXVsdGlwbGUgcmVuZGVycywgY2xvbmluZyB0aGVtIGF2b2lkcyBlcnJvcnMgd2hlbiBET00gbWFuaXB1bGF0aW9ucyByZWx5XG4vLyBvbiB0aGVpciBlbG0gcmVmZXJlbmNlLlxuZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHtcbiAgdmFyIGNsb25lZCA9IG5ldyBWTm9kZShcbiAgICB2bm9kZS50YWcsXG4gICAgdm5vZGUuZGF0YSxcbiAgICAvLyAjNzk3NVxuICAgIC8vIGNsb25lIGNoaWxkcmVuIGFycmF5IHRvIGF2b2lkIG11dGF0aW5nIG9yaWdpbmFsIGluIGNhc2Ugb2YgY2xvbmluZ1xuICAgIC8vIGEgY2hpbGQuXG4gICAgdm5vZGUuY2hpbGRyZW4gJiYgdm5vZGUuY2hpbGRyZW4uc2xpY2UoKSxcbiAgICB2bm9kZS50ZXh0LFxuICAgIHZub2RlLmVsbSxcbiAgICB2bm9kZS5jb250ZXh0LFxuICAgIHZub2RlLmNvbXBvbmVudE9wdGlvbnMsXG4gICAgdm5vZGUuYXN5bmNGYWN0b3J5XG4gICk7XG4gIGNsb25lZC5ucyA9IHZub2RlLm5zO1xuICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYztcbiAgY2xvbmVkLmtleSA9IHZub2RlLmtleTtcbiAgY2xvbmVkLmlzQ29tbWVudCA9IHZub2RlLmlzQ29tbWVudDtcbiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDtcbiAgY2xvbmVkLmZuT3B0aW9ucyA9IHZub2RlLmZuT3B0aW9ucztcbiAgY2xvbmVkLmZuU2NvcGVJZCA9IHZub2RlLmZuU2NvcGVJZDtcbiAgY2xvbmVkLmFzeW5jTWV0YSA9IHZub2RlLmFzeW5jTWV0YTtcbiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTtcbiAgcmV0dXJuIGNsb25lZFxufVxuXG4vKlxuICogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoXG4gKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGVcbiAqL1xuXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcbnZhciBhcnJheU1ldGhvZHMgPSBPYmplY3QuY3JlYXRlKGFycmF5UHJvdG8pO1xuXG52YXIgbWV0aG9kc1RvUGF0Y2ggPSBbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnXG5dO1xuXG4vKipcbiAqIEludGVyY2VwdCBtdXRhdGluZyBtZXRob2RzIGFuZCBlbWl0IGV2ZW50c1xuICovXG5tZXRob2RzVG9QYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgLy8gY2FjaGUgb3JpZ2luYWwgbWV0aG9kXG4gIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTtcbiAgZGVmKGFycmF5TWV0aG9kcywgbWV0aG9kLCBmdW5jdGlvbiBtdXRhdG9yICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICB2YXIgcmVzdWx0ID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgdmFyIG9iID0gdGhpcy5fX29iX187XG4gICAgdmFyIGluc2VydGVkO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdwdXNoJzpcbiAgICAgIGNhc2UgJ3Vuc2hpZnQnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3M7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdzcGxpY2UnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3Muc2xpY2UoMik7XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIGlmIChpbnNlcnRlZCkgeyBvYi5vYnNlcnZlQXJyYXkoaW5zZXJ0ZWQpOyB9XG4gICAgLy8gbm90aWZ5IGNoYW5nZVxuICAgIG9iLmRlcC5ub3RpZnkoKTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pO1xufSk7XG5cbi8qICAqL1xuXG52YXIgYXJyYXlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJyYXlNZXRob2RzKTtcblxuLyoqXG4gKiBJbiBzb21lIGNhc2VzIHdlIG1heSB3YW50IHRvIGRpc2FibGUgb2JzZXJ2YXRpb24gaW5zaWRlIGEgY29tcG9uZW50J3NcbiAqIHVwZGF0ZSBjb21wdXRhdGlvbi5cbiAqL1xudmFyIHNob3VsZE9ic2VydmUgPSB0cnVlO1xuXG5mdW5jdGlvbiB0b2dnbGVPYnNlcnZpbmcgKHZhbHVlKSB7XG4gIHNob3VsZE9ic2VydmUgPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRoZSB0YXJnZXRcbiAqIG9iamVjdCdzIHByb3BlcnR5IGtleXMgaW50byBnZXR0ZXIvc2V0dGVycyB0aGF0XG4gKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy5cbiAqL1xudmFyIE9ic2VydmVyID0gZnVuY3Rpb24gT2JzZXJ2ZXIgKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgdGhpcy5kZXAgPSBuZXcgRGVwKCk7XG4gIHRoaXMudm1Db3VudCA9IDA7XG4gIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAoaGFzUHJvdG8pIHtcbiAgICAgIHsvLyBmaXhlZCBieSB4eHh4eHgg5b6u5L+h5bCP56iL5bqP5L2/55SoIHBsdWdpbnMg5LmL5ZCO77yM5pWw57uE5pa55rOV6KKr55u05o6l5oyC6L295Yiw5LqG5pWw57uE5a+56LGh5LiK77yM6ZyA6KaB5omn6KGMIGNvcHlBdWdtZW50IOmAu+i+kVxuICAgICAgICBpZih2YWx1ZS5wdXNoICE9PSB2YWx1ZS5fX3Byb3RvX18ucHVzaCl7XG4gICAgICAgICAgY29weUF1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcywgYXJyYXlLZXlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm90b0F1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29weUF1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcywgYXJyYXlLZXlzKTtcbiAgICB9XG4gICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMud2Fsayh2YWx1ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FsayB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGFuZCBjb252ZXJ0IHRoZW0gaW50b1xuICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuXG4gKiB2YWx1ZSB0eXBlIGlzIE9iamVjdC5cbiAqL1xuT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMShvYmosIGtleXNbaV0pO1xuICB9XG59O1xuXG4vKipcbiAqIE9ic2VydmUgYSBsaXN0IG9mIEFycmF5IGl0ZW1zLlxuICovXG5PYnNlcnZlci5wcm90b3R5cGUub2JzZXJ2ZUFycmF5ID0gZnVuY3Rpb24gb2JzZXJ2ZUFycmF5IChpdGVtcykge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG9ic2VydmUoaXRlbXNbaV0pO1xuICB9XG59O1xuXG4vLyBoZWxwZXJzXG5cbi8qKlxuICogQXVnbWVudCBhIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nXG4gKiB0aGUgcHJvdG90eXBlIGNoYWluIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG4gIHRhcmdldC5fX3Byb3RvX18gPSBzcmM7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGEgdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZ1xuICogaGlkZGVuIHByb3BlcnRpZXMuXG4gKi9cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBjb3B5QXVnbWVudCAodGFyZ2V0LCBzcmMsIGtleXMpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGRlZih0YXJnZXQsIGtleSwgc3JjW2tleV0pO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgaWYgc3VjY2Vzc2Z1bGx5IG9ic2VydmVkLFxuICogb3IgdGhlIGV4aXN0aW5nIG9ic2VydmVyIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGhhcyBvbmUuXG4gKi9cbmZ1bmN0aW9uIG9ic2VydmUgKHZhbHVlLCBhc1Jvb3REYXRhKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgb2I7XG4gIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikge1xuICAgIG9iID0gdmFsdWUuX19vYl9fO1xuICB9IGVsc2UgaWYgKFxuICAgIHNob3VsZE9ic2VydmUgJiZcbiAgICAhaXNTZXJ2ZXJSZW5kZXJpbmcoKSAmJlxuICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSkgJiZcbiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJlxuICAgICF2YWx1ZS5faXNWdWVcbiAgKSB7XG4gICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpO1xuICB9XG4gIGlmIChhc1Jvb3REYXRhICYmIG9iKSB7XG4gICAgb2Iudm1Db3VudCsrO1xuICB9XG4gIHJldHVybiBvYlxufVxuXG4vKipcbiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUkJDEgKFxuICBvYmosXG4gIGtleSxcbiAgdmFsLFxuICBjdXN0b21TZXR0ZXIsXG4gIHNoYWxsb3dcbikge1xuICB2YXIgZGVwID0gbmV3IERlcCgpO1xuXG4gIHZhciBwcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpO1xuICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzXG4gIHZhciBnZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5nZXQ7XG4gIHZhciBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXQ7XG4gIGlmICgoIWdldHRlciB8fCBzZXR0ZXIpICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICB2YWwgPSBvYmpba2V5XTtcbiAgfVxuXG4gIHZhciBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZSh2YWwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7XG4gICAgICBpZiAoRGVwLlNoYXJlZE9iamVjdC50YXJnZXQpIHsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICAgIGRlcC5kZXBlbmQoKTtcbiAgICAgICAgaWYgKGNoaWxkT2IpIHtcbiAgICAgICAgICBjaGlsZE9iLmRlcC5kZXBlbmQoKTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGRlcGVuZEFycmF5KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiByZWFjdGl2ZVNldHRlciAobmV3VmFsKSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXR0ZXIgPyBnZXR0ZXIuY2FsbChvYmopIDogdmFsO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAobmV3VmFsID09PSB2YWx1ZSB8fCAobmV3VmFsICE9PSBuZXdWYWwgJiYgdmFsdWUgIT09IHZhbHVlKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjdXN0b21TZXR0ZXIpIHtcbiAgICAgICAgY3VzdG9tU2V0dGVyKCk7XG4gICAgICB9XG4gICAgICAvLyAjNzk4MTogZm9yIGFjY2Vzc29yIHByb3BlcnRpZXMgd2l0aG91dCBzZXR0ZXJcbiAgICAgIGlmIChnZXR0ZXIgJiYgIXNldHRlcikgeyByZXR1cm4gfVxuICAgICAgaWYgKHNldHRlcikge1xuICAgICAgICBzZXR0ZXIuY2FsbChvYmosIG5ld1ZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBuZXdWYWw7XG4gICAgICB9XG4gICAgICBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZShuZXdWYWwpO1xuICAgICAgZGVwLm5vdGlmeSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kXG4gKiB0cmlnZ2VycyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0XG4gKiBhbHJlYWR5IGV4aXN0LlxuICovXG5mdW5jdGlvbiBzZXQgKHRhcmdldCwga2V5LCB2YWwpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAoaXNVbmRlZih0YXJnZXQpIHx8IGlzUHJpbWl0aXZlKHRhcmdldCkpXG4gICkge1xuICAgIHdhcm4oKFwiQ2Fubm90IHNldCByZWFjdGl2ZSBwcm9wZXJ0eSBvbiB1bmRlZmluZWQsIG51bGwsIG9yIHByaW1pdGl2ZSB2YWx1ZTogXCIgKyAoKHRhcmdldCkpKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0Lmxlbmd0aCA9IE1hdGgubWF4KHRhcmdldC5sZW5ndGgsIGtleSk7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGlmIChrZXkgaW4gdGFyZ2V0ICYmICEoa2V5IGluIE9iamVjdC5wcm90b3R5cGUpKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGFkZGluZyByZWFjdGl2ZSBwcm9wZXJ0aWVzIHRvIGEgVnVlIGluc3RhbmNlIG9yIGl0cyByb290ICRkYXRhICcgK1xuICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLidcbiAgICApO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICBpZiAoIW9iKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGRlZmluZVJlYWN0aXZlJCQxKG9iLnZhbHVlLCBrZXksIHZhbCk7XG4gIG9iLmRlcC5ub3RpZnkoKTtcbiAgcmV0dXJuIHZhbFxufVxuXG4vKipcbiAqIERlbGV0ZSBhIHByb3BlcnR5IGFuZCB0cmlnZ2VyIGNoYW5nZSBpZiBuZWNlc3NhcnkuXG4gKi9cbmZ1bmN0aW9uIGRlbCAodGFyZ2V0LCBrZXkpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAoaXNVbmRlZih0YXJnZXQpIHx8IGlzUHJpbWl0aXZlKHRhcmdldCkpXG4gICkge1xuICAgIHdhcm4oKFwiQ2Fubm90IGRlbGV0ZSByZWFjdGl2ZSBwcm9wZXJ0eSBvbiB1bmRlZmluZWQsIG51bGwsIG9yIHByaW1pdGl2ZSB2YWx1ZTogXCIgKyAoKHRhcmdldCkpKSk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEpO1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArXG4gICAgICAnLSBqdXN0IHNldCBpdCB0byBudWxsLidcbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIGlmICghaGFzT3duKHRhcmdldCwga2V5KSkge1xuICAgIHJldHVyblxuICB9XG4gIGRlbGV0ZSB0YXJnZXRba2V5XTtcbiAgaWYgKCFvYikge1xuICAgIHJldHVyblxuICB9XG4gIG9iLmRlcC5ub3RpZnkoKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGRlcGVuZGVuY2llcyBvbiBhcnJheSBlbGVtZW50cyB3aGVuIHRoZSBhcnJheSBpcyB0b3VjaGVkLCBzaW5jZVxuICogd2UgY2Fubm90IGludGVyY2VwdCBhcnJheSBlbGVtZW50IGFjY2VzcyBsaWtlIHByb3BlcnR5IGdldHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGRlcGVuZEFycmF5ICh2YWx1ZSkge1xuICBmb3IgKHZhciBlID0gKHZvaWQgMCksIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZSA9IHZhbHVlW2ldO1xuICAgIGUgJiYgZS5fX29iX18gJiYgZS5fX29iX18uZGVwLmRlcGVuZCgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBkZXBlbmRBcnJheShlKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogT3B0aW9uIG92ZXJ3cml0aW5nIHN0cmF0ZWdpZXMgYXJlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZVxuICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb25cbiAqIHZhbHVlIGludG8gdGhlIGZpbmFsIHZhbHVlLlxuICovXG52YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztcblxuLyoqXG4gKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zXG4gKi9cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHN0cmF0cy5lbCA9IHN0cmF0cy5wcm9wc0RhdGEgPSBmdW5jdGlvbiAocGFyZW50LCBjaGlsZCwgdm0sIGtleSkge1xuICAgIGlmICghdm0pIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwib3B0aW9uIFxcXCJcIiArIGtleSArIFwiXFxcIiBjYW4gb25seSBiZSB1c2VkIGR1cmluZyBpbnN0YW5jZSBcIiArXG4gICAgICAgICdjcmVhdGlvbiB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0U3RyYXQocGFyZW50LCBjaGlsZClcbiAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhICh0bywgZnJvbSkge1xuICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH1cbiAgdmFyIGtleSwgdG9WYWwsIGZyb21WYWw7XG5cbiAgdmFyIGtleXMgPSBoYXNTeW1ib2xcbiAgICA/IFJlZmxlY3Qub3duS2V5cyhmcm9tKVxuICAgIDogT2JqZWN0LmtleXMoZnJvbSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0ga2V5c1tpXTtcbiAgICAvLyBpbiBjYXNlIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBvYnNlcnZlZC4uLlxuICAgIGlmIChrZXkgPT09ICdfX29iX18nKSB7IGNvbnRpbnVlIH1cbiAgICB0b1ZhbCA9IHRvW2tleV07XG4gICAgZnJvbVZhbCA9IGZyb21ba2V5XTtcbiAgICBpZiAoIWhhc093bih0bywga2V5KSkge1xuICAgICAgc2V0KHRvLCBrZXksIGZyb21WYWwpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0b1ZhbCAhPT0gZnJvbVZhbCAmJlxuICAgICAgaXNQbGFpbk9iamVjdCh0b1ZhbCkgJiZcbiAgICAgIGlzUGxhaW5PYmplY3QoZnJvbVZhbClcbiAgICApIHtcbiAgICAgIG1lcmdlRGF0YSh0b1ZhbCwgZnJvbVZhbCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0b1xufVxuXG4vKipcbiAqIERhdGFcbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhT3JGbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtXG4pIHtcbiAgaWYgKCF2bSkge1xuICAgIC8vIGluIGEgVnVlLmV4dGVuZCBtZXJnZSwgYm90aCBzaG91bGQgYmUgZnVuY3Rpb25zXG4gICAgaWYgKCFjaGlsZFZhbCkge1xuICAgICAgcmV0dXJuIHBhcmVudFZhbFxuICAgIH1cbiAgICBpZiAoIXBhcmVudFZhbCkge1xuICAgICAgcmV0dXJuIGNoaWxkVmFsXG4gICAgfVxuICAgIC8vIHdoZW4gcGFyZW50VmFsICYgY2hpbGRWYWwgYXJlIGJvdGggcHJlc2VudCxcbiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcbiAgICAvLyBtZXJnZWQgcmVzdWx0IG9mIGJvdGggZnVuY3Rpb25zLi4uIG5vIG5lZWQgdG9cbiAgICAvLyBjaGVjayBpZiBwYXJlbnRWYWwgaXMgYSBmdW5jdGlvbiBoZXJlIGJlY2F1c2VcbiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkRGF0YUZuICgpIHtcbiAgICAgIHJldHVybiBtZXJnZURhdGEoXG4gICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcywgdGhpcykgOiBjaGlsZFZhbCxcbiAgICAgICAgdHlwZW9mIHBhcmVudFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcmVudFZhbC5jYWxsKHRoaXMsIHRoaXMpIDogcGFyZW50VmFsXG4gICAgICApXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWRJbnN0YW5jZURhdGFGbiAoKSB7XG4gICAgICAvLyBpbnN0YW5jZSBtZXJnZVxuICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGNoaWxkVmFsLmNhbGwodm0sIHZtKVxuICAgICAgICA6IGNoaWxkVmFsO1xuICAgICAgdmFyIGRlZmF1bHREYXRhID0gdHlwZW9mIHBhcmVudFZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHBhcmVudFZhbC5jYWxsKHZtLCB2bSlcbiAgICAgICAgOiBwYXJlbnRWYWw7XG4gICAgICBpZiAoaW5zdGFuY2VEYXRhKSB7XG4gICAgICAgIHJldHVybiBtZXJnZURhdGEoaW5zdGFuY2VEYXRhLCBkZWZhdWx0RGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0RGF0YVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5zdHJhdHMuZGF0YSA9IGZ1bmN0aW9uIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm1cbikge1xuICBpZiAoIXZtKSB7XG4gICAgaWYgKGNoaWxkVmFsICYmIHR5cGVvZiBjaGlsZFZhbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAnVGhlIFwiZGF0YVwiIG9wdGlvbiBzaG91bGQgYmUgYSBmdW5jdGlvbiAnICtcbiAgICAgICAgJ3RoYXQgcmV0dXJucyBhIHBlci1pbnN0YW5jZSB2YWx1ZSBpbiBjb21wb25lbnQgJyArXG4gICAgICAgICdkZWZpbml0aW9ucy4nLFxuICAgICAgICB2bVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHBhcmVudFZhbFxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VEYXRhT3JGbihwYXJlbnRWYWwsIGNoaWxkVmFsKVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCwgdm0pXG59O1xuXG4vKipcbiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VIb29rIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbFxuKSB7XG4gIHZhciByZXMgPSBjaGlsZFZhbFxuICAgID8gcGFyZW50VmFsXG4gICAgICA/IHBhcmVudFZhbC5jb25jYXQoY2hpbGRWYWwpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpXG4gICAgICAgID8gY2hpbGRWYWxcbiAgICAgICAgOiBbY2hpbGRWYWxdXG4gICAgOiBwYXJlbnRWYWw7XG4gIHJldHVybiByZXNcbiAgICA/IGRlZHVwZUhvb2tzKHJlcylcbiAgICA6IHJlc1xufVxuXG5mdW5jdGlvbiBkZWR1cGVIb29rcyAoaG9va3MpIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlcy5pbmRleE9mKGhvb2tzW2ldKSA9PT0gLTEpIHtcbiAgICAgIHJlcy5wdXNoKGhvb2tzW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5MSUZFQ1lDTEVfSE9PS1MuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICBzdHJhdHNbaG9va10gPSBtZXJnZUhvb2s7XG59KTtcblxuLyoqXG4gKiBBc3NldHNcbiAqXG4gKiBXaGVuIGEgdm0gaXMgcHJlc2VudCAoaW5zdGFuY2UgY3JlYXRpb24pLCB3ZSBuZWVkIHRvIGRvXG4gKiBhIHRocmVlLXdheSBtZXJnZSBiZXR3ZWVuIGNvbnN0cnVjdG9yIG9wdGlvbnMsIGluc3RhbmNlXG4gKiBvcHRpb25zIGFuZCBwYXJlbnQgb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VBc3NldHMgKFxuICBwYXJlbnRWYWwsXG4gIGNoaWxkVmFsLFxuICB2bSxcbiAga2V5XG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUocGFyZW50VmFsIHx8IG51bGwpO1xuICBpZiAoY2hpbGRWYWwpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICAgIHJldHVybiBleHRlbmQocmVzLCBjaGlsZFZhbClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cbn1cblxuQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICBzdHJhdHNbdHlwZSArICdzJ10gPSBtZXJnZUFzc2V0cztcbn0pO1xuXG4vKipcbiAqIFdhdGNoZXJzLlxuICpcbiAqIFdhdGNoZXJzIGhhc2hlcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBvbmVcbiAqIGFub3RoZXIsIHNvIHdlIG1lcmdlIHRoZW0gYXMgYXJyYXlzLlxuICovXG5zdHJhdHMud2F0Y2ggPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtLFxuICBrZXlcbikge1xuICAvLyB3b3JrIGFyb3VuZCBGaXJlZm94J3MgT2JqZWN0LnByb3RvdHlwZS53YXRjaC4uLlxuICBpZiAocGFyZW50VmFsID09PSBuYXRpdmVXYXRjaCkgeyBwYXJlbnRWYWwgPSB1bmRlZmluZWQ7IH1cbiAgaWYgKGNoaWxkVmFsID09PSBuYXRpdmVXYXRjaCkgeyBjaGlsZFZhbCA9IHVuZGVmaW5lZDsgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKCFjaGlsZFZhbCkgeyByZXR1cm4gT2JqZWN0LmNyZWF0ZShwYXJlbnRWYWwgfHwgbnVsbCkgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGFzc2VydE9iamVjdFR5cGUoa2V5LCBjaGlsZFZhbCwgdm0pO1xuICB9XG4gIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9XG4gIHZhciByZXQgPSB7fTtcbiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTtcbiAgZm9yICh2YXIga2V5JDEgaW4gY2hpbGRWYWwpIHtcbiAgICB2YXIgcGFyZW50ID0gcmV0W2tleSQxXTtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZFZhbFtrZXkkMV07XG4gICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnQgPSBbcGFyZW50XTtcbiAgICB9XG4gICAgcmV0W2tleSQxXSA9IHBhcmVudFxuICAgICAgPyBwYXJlbnQuY29uY2F0KGNoaWxkKVxuICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkKSA/IGNoaWxkIDogW2NoaWxkXTtcbiAgfVxuICByZXR1cm4gcmV0XG59O1xuXG4vKipcbiAqIE90aGVyIG9iamVjdCBoYXNoZXMuXG4gKi9cbnN0cmF0cy5wcm9wcyA9XG5zdHJhdHMubWV0aG9kcyA9XG5zdHJhdHMuaW5qZWN0ID1cbnN0cmF0cy5jb21wdXRlZCA9IGZ1bmN0aW9uIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbCxcbiAgdm0sXG4gIGtleVxuKSB7XG4gIGlmIChjaGlsZFZhbCAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYXNzZXJ0T2JqZWN0VHlwZShrZXksIGNoaWxkVmFsLCB2bSk7XG4gIH1cbiAgaWYgKCFwYXJlbnRWYWwpIHsgcmV0dXJuIGNoaWxkVmFsIH1cbiAgdmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGV4dGVuZChyZXQsIHBhcmVudFZhbCk7XG4gIGlmIChjaGlsZFZhbCkgeyBleHRlbmQocmV0LCBjaGlsZFZhbCk7IH1cbiAgcmV0dXJuIHJldFxufTtcbnN0cmF0cy5wcm92aWRlID0gbWVyZ2VEYXRhT3JGbjtcblxuLyoqXG4gKiBEZWZhdWx0IHN0cmF0ZWd5LlxuICovXG52YXIgZGVmYXVsdFN0cmF0ID0gZnVuY3Rpb24gKHBhcmVudFZhbCwgY2hpbGRWYWwpIHtcbiAgcmV0dXJuIGNoaWxkVmFsID09PSB1bmRlZmluZWRcbiAgICA/IHBhcmVudFZhbFxuICAgIDogY2hpbGRWYWxcbn07XG5cbi8qKlxuICogVmFsaWRhdGUgY29tcG9uZW50IG5hbWVzXG4gKi9cbmZ1bmN0aW9uIGNoZWNrQ29tcG9uZW50cyAob3B0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucy5jb21wb25lbnRzKSB7XG4gICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVDb21wb25lbnROYW1lIChuYW1lKSB7XG4gIGlmICghbmV3IFJlZ0V4cCgoXCJeW2EtekEtWl1bXFxcXC1cXFxcLjAtOV9cIiArICh1bmljb2RlUmVnRXhwLnNvdXJjZSkgKyBcIl0qJFwiKSkudGVzdChuYW1lKSkge1xuICAgIHdhcm4oXG4gICAgICAnSW52YWxpZCBjb21wb25lbnQgbmFtZTogXCInICsgbmFtZSArICdcIi4gQ29tcG9uZW50IG5hbWVzICcgK1xuICAgICAgJ3Nob3VsZCBjb25mb3JtIHRvIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUgaW4gaHRtbDUgc3BlY2lmaWNhdGlvbi4nXG4gICAgKTtcbiAgfVxuICBpZiAoaXNCdWlsdEluVGFnKG5hbWUpIHx8IGNvbmZpZy5pc1Jlc2VydmVkVGFnKG5hbWUpKSB7XG4gICAgd2FybihcbiAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgK1xuICAgICAgJ2lkOiAnICsgbmFtZVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBFbnN1cmUgYWxsIHByb3BzIG9wdGlvbiBzeW50YXggYXJlIG5vcm1hbGl6ZWQgaW50byB0aGVcbiAqIE9iamVjdC1iYXNlZCBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BzIChvcHRpb25zLCB2bSkge1xuICB2YXIgcHJvcHMgPSBvcHRpb25zLnByb3BzO1xuICBpZiAoIXByb3BzKSB7IHJldHVybiB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGksIHZhbCwgbmFtZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YWwgPSBwcm9wc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYW1lID0gY2FtZWxpemUodmFsKTtcbiAgICAgICAgcmVzW25hbWVdID0geyB0eXBlOiBudWxsIH07XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybigncHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LicpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFsID0gcHJvcHNba2V5XTtcbiAgICAgIG5hbWUgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpXG4gICAgICAgID8gdmFsXG4gICAgICAgIDogeyB0eXBlOiB2YWwgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwicHJvcHNcXFwiOiBleHBlY3RlZCBhbiBBcnJheSBvciBhbiBPYmplY3QsIFwiICtcbiAgICAgIFwiYnV0IGdvdCBcIiArICh0b1Jhd1R5cGUocHJvcHMpKSArIFwiLlwiLFxuICAgICAgdm1cbiAgICApO1xuICB9XG4gIG9wdGlvbnMucHJvcHMgPSByZXM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFsbCBpbmplY3Rpb25zIGludG8gT2JqZWN0LWJhc2VkIGZvcm1hdFxuICovXG5mdW5jdGlvbiBub3JtYWxpemVJbmplY3QgKG9wdGlvbnMsIHZtKSB7XG4gIHZhciBpbmplY3QgPSBvcHRpb25zLmluamVjdDtcbiAgaWYgKCFpbmplY3QpIHsgcmV0dXJuIH1cbiAgdmFyIG5vcm1hbGl6ZWQgPSBvcHRpb25zLmluamVjdCA9IHt9O1xuICBpZiAoQXJyYXkuaXNBcnJheShpbmplY3QpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vcm1hbGl6ZWRbaW5qZWN0W2ldXSA9IHsgZnJvbTogaW5qZWN0W2ldIH07XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QoaW5qZWN0KSkge1xuICAgIGZvciAodmFyIGtleSBpbiBpbmplY3QpIHtcbiAgICAgIHZhciB2YWwgPSBpbmplY3Rba2V5XTtcbiAgICAgIG5vcm1hbGl6ZWRba2V5XSA9IGlzUGxhaW5PYmplY3QodmFsKVxuICAgICAgICA/IGV4dGVuZCh7IGZyb206IGtleSB9LCB2YWwpXG4gICAgICAgIDogeyBmcm9tOiB2YWwgfTtcbiAgICB9XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHdhcm4oXG4gICAgICBcIkludmFsaWQgdmFsdWUgZm9yIG9wdGlvbiBcXFwiaW5qZWN0XFxcIjogZXhwZWN0ZWQgYW4gQXJyYXkgb3IgYW4gT2JqZWN0LCBcIiArXG4gICAgICBcImJ1dCBnb3QgXCIgKyAodG9SYXdUeXBlKGluamVjdCkpICsgXCIuXCIsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGZ1bmN0aW9uIGRpcmVjdGl2ZXMgaW50byBvYmplY3QgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7XG4gIHZhciBkaXJzID0gb3B0aW9ucy5kaXJlY3RpdmVzO1xuICBpZiAoZGlycykge1xuICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7XG4gICAgICB2YXIgZGVmJCQxID0gZGlyc1trZXldO1xuICAgICAgaWYgKHR5cGVvZiBkZWYkJDEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYkJDEsIHVwZGF0ZTogZGVmJCQxIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydE9iamVjdFR5cGUgKG5hbWUsIHZhbHVlLCB2bSkge1xuICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgd2FybihcbiAgICAgIFwiSW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uIFxcXCJcIiArIG5hbWUgKyBcIlxcXCI6IGV4cGVjdGVkIGFuIE9iamVjdCwgXCIgK1xuICAgICAgXCJidXQgZ290IFwiICsgKHRvUmF3VHlwZSh2YWx1ZSkpICsgXCIuXCIsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBNZXJnZSB0d28gb3B0aW9uIG9iamVjdHMgaW50byBhIG5ldyBvbmUuXG4gKiBDb3JlIHV0aWxpdHkgdXNlZCBpbiBib3RoIGluc3RhbnRpYXRpb24gYW5kIGluaGVyaXRhbmNlLlxuICovXG5mdW5jdGlvbiBtZXJnZU9wdGlvbnMgKFxuICBwYXJlbnQsXG4gIGNoaWxkLFxuICB2bVxuKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgY2hlY2tDb21wb25lbnRzKGNoaWxkKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjaGlsZCA9IGNoaWxkLm9wdGlvbnM7XG4gIH1cblxuICBub3JtYWxpemVQcm9wcyhjaGlsZCwgdm0pO1xuICBub3JtYWxpemVJbmplY3QoY2hpbGQsIHZtKTtcbiAgbm9ybWFsaXplRGlyZWN0aXZlcyhjaGlsZCk7XG5cbiAgLy8gQXBwbHkgZXh0ZW5kcyBhbmQgbWl4aW5zIG9uIHRoZSBjaGlsZCBvcHRpb25zLFxuICAvLyBidXQgb25seSBpZiBpdCBpcyBhIHJhdyBvcHRpb25zIG9iamVjdCB0aGF0IGlzbid0XG4gIC8vIHRoZSByZXN1bHQgb2YgYW5vdGhlciBtZXJnZU9wdGlvbnMgY2FsbC5cbiAgLy8gT25seSBtZXJnZWQgb3B0aW9ucyBoYXMgdGhlIF9iYXNlIHByb3BlcnR5LlxuICBpZiAoIWNoaWxkLl9iYXNlKSB7XG4gICAgaWYgKGNoaWxkLmV4dGVuZHMpIHtcbiAgICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGNoaWxkLmV4dGVuZHMsIHZtKTtcbiAgICB9XG4gICAgaWYgKGNoaWxkLm1peGlucykge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZC5taXhpbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHBhcmVudCA9IG1lcmdlT3B0aW9ucyhwYXJlbnQsIGNoaWxkLm1peGluc1tpXSwgdm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBvcHRpb25zID0ge307XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIHBhcmVudCkge1xuICAgIG1lcmdlRmllbGQoa2V5KTtcbiAgfVxuICBmb3IgKGtleSBpbiBjaGlsZCkge1xuICAgIGlmICghaGFzT3duKHBhcmVudCwga2V5KSkge1xuICAgICAgbWVyZ2VGaWVsZChrZXkpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtZXJnZUZpZWxkIChrZXkpIHtcbiAgICB2YXIgc3RyYXQgPSBzdHJhdHNba2V5XSB8fCBkZWZhdWx0U3RyYXQ7XG4gICAgb3B0aW9uc1trZXldID0gc3RyYXQocGFyZW50W2tleV0sIGNoaWxkW2tleV0sIHZtLCBrZXkpO1xuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbi8qKlxuICogUmVzb2x2ZSBhbiBhc3NldC5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBiZWNhdXNlIGNoaWxkIGluc3RhbmNlcyBuZWVkIGFjY2Vzc1xuICogdG8gYXNzZXRzIGRlZmluZWQgaW4gaXRzIGFuY2VzdG9yIGNoYWluLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQXNzZXQgKFxuICBvcHRpb25zLFxuICB0eXBlLFxuICBpZCxcbiAgd2Fybk1pc3Npbmdcbikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgYXNzZXRzID0gb3B0aW9uc1t0eXBlXTtcbiAgLy8gY2hlY2sgbG9jYWwgcmVnaXN0cmF0aW9uIHZhcmlhdGlvbnMgZmlyc3RcbiAgaWYgKGhhc093bihhc3NldHMsIGlkKSkgeyByZXR1cm4gYXNzZXRzW2lkXSB9XG4gIHZhciBjYW1lbGl6ZWRJZCA9IGNhbWVsaXplKGlkKTtcbiAgaWYgKGhhc093bihhc3NldHMsIGNhbWVsaXplZElkKSkgeyByZXR1cm4gYXNzZXRzW2NhbWVsaXplZElkXSB9XG4gIHZhciBQYXNjYWxDYXNlSWQgPSBjYXBpdGFsaXplKGNhbWVsaXplZElkKTtcbiAgaWYgKGhhc093bihhc3NldHMsIFBhc2NhbENhc2VJZCkpIHsgcmV0dXJuIGFzc2V0c1tQYXNjYWxDYXNlSWRdIH1cbiAgLy8gZmFsbGJhY2sgdG8gcHJvdG90eXBlIGNoYWluXG4gIHZhciByZXMgPSBhc3NldHNbaWRdIHx8IGFzc2V0c1tjYW1lbGl6ZWRJZF0gfHwgYXNzZXRzW1Bhc2NhbENhc2VJZF07XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm5NaXNzaW5nICYmICFyZXMpIHtcbiAgICB3YXJuKFxuICAgICAgJ0ZhaWxlZCB0byByZXNvbHZlICcgKyB0eXBlLnNsaWNlKDAsIC0xKSArICc6ICcgKyBpZCxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3AgKFxuICBrZXksXG4gIHByb3BPcHRpb25zLFxuICBwcm9wc0RhdGEsXG4gIHZtXG4pIHtcbiAgdmFyIHByb3AgPSBwcm9wT3B0aW9uc1trZXldO1xuICB2YXIgYWJzZW50ID0gIWhhc093bihwcm9wc0RhdGEsIGtleSk7XG4gIHZhciB2YWx1ZSA9IHByb3BzRGF0YVtrZXldO1xuICAvLyBib29sZWFuIGNhc3RpbmdcbiAgdmFyIGJvb2xlYW5JbmRleCA9IGdldFR5cGVJbmRleChCb29sZWFuLCBwcm9wLnR5cGUpO1xuICBpZiAoYm9vbGVhbkluZGV4ID4gLTEpIHtcbiAgICBpZiAoYWJzZW50ICYmICFoYXNPd24ocHJvcCwgJ2RlZmF1bHQnKSkge1xuICAgICAgdmFsdWUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gaHlwaGVuYXRlKGtleSkpIHtcbiAgICAgIC8vIG9ubHkgY2FzdCBlbXB0eSBzdHJpbmcgLyBzYW1lIG5hbWUgdG8gYm9vbGVhbiBpZlxuICAgICAgLy8gYm9vbGVhbiBoYXMgaGlnaGVyIHByaW9yaXR5XG4gICAgICB2YXIgc3RyaW5nSW5kZXggPSBnZXRUeXBlSW5kZXgoU3RyaW5nLCBwcm9wLnR5cGUpO1xuICAgICAgaWYgKHN0cmluZ0luZGV4IDwgMCB8fCBib29sZWFuSW5kZXggPCBzdHJpbmdJbmRleCkge1xuICAgICAgICB2YWx1ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIGNoZWNrIGRlZmF1bHQgdmFsdWVcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICB2YWx1ZSA9IGdldFByb3BEZWZhdWx0VmFsdWUodm0sIHByb3AsIGtleSk7XG4gICAgLy8gc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBmcmVzaCBjb3B5LFxuICAgIC8vIG1ha2Ugc3VyZSB0byBvYnNlcnZlIGl0LlxuICAgIHZhciBwcmV2U2hvdWxkT2JzZXJ2ZSA9IHNob3VsZE9ic2VydmU7XG4gICAgdG9nZ2xlT2JzZXJ2aW5nKHRydWUpO1xuICAgIG9ic2VydmUodmFsdWUpO1xuICAgIHRvZ2dsZU9ic2VydmluZyhwcmV2U2hvdWxkT2JzZXJ2ZSk7XG4gIH1cbiAgaWYgKFxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAvLyBza2lwIHZhbGlkYXRpb24gZm9yIHdlZXggcmVjeWNsZS1saXN0IGNoaWxkIGNvbXBvbmVudCBwcm9wc1xuICAgICEoZmFsc2UpXG4gICkge1xuICAgIGFzc2VydFByb3AocHJvcCwga2V5LCB2YWx1ZSwgdm0sIGFic2VudCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgcHJvcC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvcERlZmF1bHRWYWx1ZSAodm0sIHByb3AsIGtleSkge1xuICAvLyBubyBkZWZhdWx0LCByZXR1cm4gdW5kZWZpbmVkXG4gIGlmICghaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbiAgdmFyIGRlZiA9IHByb3AuZGVmYXVsdDtcbiAgLy8gd2FybiBhZ2FpbnN0IG5vbi1mYWN0b3J5IGRlZmF1bHRzIGZvciBPYmplY3QgJiBBcnJheVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBpc09iamVjdChkZWYpKSB7XG4gICAgd2FybihcbiAgICAgICdJbnZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHByb3AgXCInICsga2V5ICsgJ1wiOiAnICtcbiAgICAgICdQcm9wcyB3aXRoIHR5cGUgT2JqZWN0L0FycmF5IG11c3QgdXNlIGEgZmFjdG9yeSBmdW5jdGlvbiAnICtcbiAgICAgICd0byByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICAvLyB0aGUgcmF3IHByb3AgdmFsdWUgd2FzIGFsc28gdW5kZWZpbmVkIGZyb20gcHJldmlvdXMgcmVuZGVyLFxuICAvLyByZXR1cm4gcHJldmlvdXMgZGVmYXVsdCB2YWx1ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSB3YXRjaGVyIHRyaWdnZXJcbiAgaWYgKHZtICYmIHZtLiRvcHRpb25zLnByb3BzRGF0YSAmJlxuICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YVtrZXldID09PSB1bmRlZmluZWQgJiZcbiAgICB2bS5fcHJvcHNba2V5XSAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiB2bS5fcHJvcHNba2V5XVxuICB9XG4gIC8vIGNhbGwgZmFjdG9yeSBmdW5jdGlvbiBmb3Igbm9uLUZ1bmN0aW9uIHR5cGVzXG4gIC8vIGEgdmFsdWUgaXMgRnVuY3Rpb24gaWYgaXRzIHByb3RvdHlwZSBpcyBmdW5jdGlvbiBldmVuIGFjcm9zcyBkaWZmZXJlbnQgZXhlY3V0aW9uIGNvbnRleHRcbiAgcmV0dXJuIHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicgJiYgZ2V0VHlwZShwcm9wLnR5cGUpICE9PSAnRnVuY3Rpb24nXG4gICAgPyBkZWYuY2FsbCh2bSlcbiAgICA6IGRlZlxufVxuXG4vKipcbiAqIEFzc2VydCB3aGV0aGVyIGEgcHJvcCBpcyB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0UHJvcCAoXG4gIHByb3AsXG4gIG5hbWUsXG4gIHZhbHVlLFxuICB2bSxcbiAgYWJzZW50XG4pIHtcbiAgaWYgKHByb3AucmVxdWlyZWQgJiYgYWJzZW50KSB7XG4gICAgd2FybihcbiAgICAgICdNaXNzaW5nIHJlcXVpcmVkIHByb3A6IFwiJyArIG5hbWUgKyAnXCInLFxuICAgICAgdm1cbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsICYmICFwcm9wLnJlcXVpcmVkKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHR5cGUgPSBwcm9wLnR5cGU7XG4gIHZhciB2YWxpZCA9ICF0eXBlIHx8IHR5cGUgPT09IHRydWU7XG4gIHZhciBleHBlY3RlZFR5cGVzID0gW107XG4gIGlmICh0eXBlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICB0eXBlID0gW3R5cGVdO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGUubGVuZ3RoICYmICF2YWxpZDsgaSsrKSB7XG4gICAgICB2YXIgYXNzZXJ0ZWRUeXBlID0gYXNzZXJ0VHlwZSh2YWx1ZSwgdHlwZVtpXSk7XG4gICAgICBleHBlY3RlZFR5cGVzLnB1c2goYXNzZXJ0ZWRUeXBlLmV4cGVjdGVkVHlwZSB8fCAnJyk7XG4gICAgICB2YWxpZCA9IGFzc2VydGVkVHlwZS52YWxpZDtcbiAgICB9XG4gIH1cblxuICBpZiAoIXZhbGlkKSB7XG4gICAgd2FybihcbiAgICAgIGdldEludmFsaWRUeXBlTWVzc2FnZShuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcyksXG4gICAgICB2bVxuICAgICk7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHZhbGlkYXRvciA9IHByb3AudmFsaWRhdG9yO1xuICBpZiAodmFsaWRhdG9yKSB7XG4gICAgaWYgKCF2YWxpZGF0b3IodmFsdWUpKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAnSW52YWxpZCBwcm9wOiBjdXN0b20gdmFsaWRhdG9yIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcIicgKyBuYW1lICsgJ1wiLicsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG52YXIgc2ltcGxlQ2hlY2tSRSA9IC9eKFN0cmluZ3xOdW1iZXJ8Qm9vbGVhbnxGdW5jdGlvbnxTeW1ib2wpJC87XG5cbmZ1bmN0aW9uIGFzc2VydFR5cGUgKHZhbHVlLCB0eXBlKSB7XG4gIHZhciB2YWxpZDtcbiAgdmFyIGV4cGVjdGVkVHlwZSA9IGdldFR5cGUodHlwZSk7XG4gIGlmIChzaW1wbGVDaGVja1JFLnRlc3QoZXhwZWN0ZWRUeXBlKSkge1xuICAgIHZhciB0ID0gdHlwZW9mIHZhbHVlO1xuICAgIHZhbGlkID0gdCA9PT0gZXhwZWN0ZWRUeXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gZm9yIHByaW1pdGl2ZSB3cmFwcGVyIG9iamVjdHNcbiAgICBpZiAoIXZhbGlkICYmIHQgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnT2JqZWN0Jykge1xuICAgIHZhbGlkID0gaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gIH0gZWxzZSBpZiAoZXhwZWN0ZWRUeXBlID09PSAnQXJyYXknKSB7XG4gICAgdmFsaWQgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgdHlwZTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHZhbGlkOiB2YWxpZCxcbiAgICBleHBlY3RlZFR5cGU6IGV4cGVjdGVkVHlwZVxuICB9XG59XG5cbi8qKlxuICogVXNlIGZ1bmN0aW9uIHN0cmluZyBuYW1lIHRvIGNoZWNrIGJ1aWx0LWluIHR5cGVzLFxuICogYmVjYXVzZSBhIHNpbXBsZSBlcXVhbGl0eSBjaGVjayB3aWxsIGZhaWwgd2hlbiBydW5uaW5nXG4gKiBhY3Jvc3MgZGlmZmVyZW50IHZtcyAvIGlmcmFtZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFR5cGUgKGZuKSB7XG4gIHZhciBtYXRjaCA9IGZuICYmIGZuLnRvU3RyaW5nKCkubWF0Y2goL15cXHMqZnVuY3Rpb24gKFxcdyspLyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzFdIDogJydcbn1cblxuZnVuY3Rpb24gaXNTYW1lVHlwZSAoYSwgYikge1xuICByZXR1cm4gZ2V0VHlwZShhKSA9PT0gZ2V0VHlwZShiKVxufVxuXG5mdW5jdGlvbiBnZXRUeXBlSW5kZXggKHR5cGUsIGV4cGVjdGVkVHlwZXMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVHlwZXMpKSB7XG4gICAgcmV0dXJuIGlzU2FtZVR5cGUoZXhwZWN0ZWRUeXBlcywgdHlwZSkgPyAwIDogLTFcbiAgfVxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXhwZWN0ZWRUeXBlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChpc1NhbWVUeXBlKGV4cGVjdGVkVHlwZXNbaV0sIHR5cGUpKSB7XG4gICAgICByZXR1cm4gaVxuICAgIH1cbiAgfVxuICByZXR1cm4gLTFcbn1cblxuZnVuY3Rpb24gZ2V0SW52YWxpZFR5cGVNZXNzYWdlIChuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRUeXBlcykge1xuICB2YXIgbWVzc2FnZSA9IFwiSW52YWxpZCBwcm9wOiB0eXBlIGNoZWNrIGZhaWxlZCBmb3IgcHJvcCBcXFwiXCIgKyBuYW1lICsgXCJcXFwiLlwiICtcbiAgICBcIiBFeHBlY3RlZCBcIiArIChleHBlY3RlZFR5cGVzLm1hcChjYXBpdGFsaXplKS5qb2luKCcsICcpKTtcbiAgdmFyIGV4cGVjdGVkVHlwZSA9IGV4cGVjdGVkVHlwZXNbMF07XG4gIHZhciByZWNlaXZlZFR5cGUgPSB0b1Jhd1R5cGUodmFsdWUpO1xuICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IHN0eWxlVmFsdWUodmFsdWUsIGV4cGVjdGVkVHlwZSk7XG4gIHZhciByZWNlaXZlZFZhbHVlID0gc3R5bGVWYWx1ZSh2YWx1ZSwgcmVjZWl2ZWRUeXBlKTtcbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBzcGVjaWZ5IGV4cGVjdGVkIHZhbHVlXG4gIGlmIChleHBlY3RlZFR5cGVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgaXNFeHBsaWNhYmxlKGV4cGVjdGVkVHlwZSkgJiZcbiAgICAgICFpc0Jvb2xlYW4oZXhwZWN0ZWRUeXBlLCByZWNlaXZlZFR5cGUpKSB7XG4gICAgbWVzc2FnZSArPSBcIiB3aXRoIHZhbHVlIFwiICsgZXhwZWN0ZWRWYWx1ZTtcbiAgfVxuICBtZXNzYWdlICs9IFwiLCBnb3QgXCIgKyByZWNlaXZlZFR5cGUgKyBcIiBcIjtcbiAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBzcGVjaWZ5IHJlY2VpdmVkIHZhbHVlXG4gIGlmIChpc0V4cGxpY2FibGUocmVjZWl2ZWRUeXBlKSkge1xuICAgIG1lc3NhZ2UgKz0gXCJ3aXRoIHZhbHVlIFwiICsgcmVjZWl2ZWRWYWx1ZSArIFwiLlwiO1xuICB9XG4gIHJldHVybiBtZXNzYWdlXG59XG5cbmZ1bmN0aW9uIHN0eWxlVmFsdWUgKHZhbHVlLCB0eXBlKSB7XG4gIGlmICh0eXBlID09PSAnU3RyaW5nJykge1xuICAgIHJldHVybiAoXCJcXFwiXCIgKyB2YWx1ZSArIFwiXFxcIlwiKVxuICB9IGVsc2UgaWYgKHR5cGUgPT09ICdOdW1iZXInKSB7XG4gICAgcmV0dXJuIChcIlwiICsgKE51bWJlcih2YWx1ZSkpKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiAoXCJcIiArIHZhbHVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRXhwbGljYWJsZSAodmFsdWUpIHtcbiAgdmFyIGV4cGxpY2l0VHlwZXMgPSBbJ3N0cmluZycsICdudW1iZXInLCAnYm9vbGVhbiddO1xuICByZXR1cm4gZXhwbGljaXRUeXBlcy5zb21lKGZ1bmN0aW9uIChlbGVtKSB7IHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBlbGVtOyB9KVxufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW4gKCkge1xuICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gIHJldHVybiBhcmdzLnNvbWUoZnVuY3Rpb24gKGVsZW0pIHsgcmV0dXJuIGVsZW0udG9Mb3dlckNhc2UoKSA9PT0gJ2Jvb2xlYW4nOyB9KVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgLy8gRGVhY3RpdmF0ZSBkZXBzIHRyYWNraW5nIHdoaWxlIHByb2Nlc3NpbmcgZXJyb3IgaGFuZGxlciB0byBhdm9pZCBwb3NzaWJsZSBpbmZpbml0ZSByZW5kZXJpbmcuXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZXgvaXNzdWVzLzE1MDVcbiAgcHVzaFRhcmdldCgpO1xuICB0cnkge1xuICAgIGlmICh2bSkge1xuICAgICAgdmFyIGN1ciA9IHZtO1xuICAgICAgd2hpbGUgKChjdXIgPSBjdXIuJHBhcmVudCkpIHtcbiAgICAgICAgdmFyIGhvb2tzID0gY3VyLiRvcHRpb25zLmVycm9yQ2FwdHVyZWQ7XG4gICAgICAgIGlmIChob29rcykge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciBjYXB0dXJlID0gaG9va3NbaV0uY2FsbChjdXIsIGVyciwgdm0sIGluZm8pID09PSBmYWxzZTtcbiAgICAgICAgICAgICAgaWYgKGNhcHR1cmUpIHsgcmV0dXJuIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgZ2xvYmFsSGFuZGxlRXJyb3IoZSwgY3VyLCAnZXJyb3JDYXB0dXJlZCBob29rJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdsb2JhbEhhbmRsZUVycm9yKGVyciwgdm0sIGluZm8pO1xuICB9IGZpbmFsbHkge1xuICAgIHBvcFRhcmdldCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludm9rZVdpdGhFcnJvckhhbmRsaW5nIChcbiAgaGFuZGxlcixcbiAgY29udGV4dCxcbiAgYXJncyxcbiAgdm0sXG4gIGluZm9cbikge1xuICB2YXIgcmVzO1xuICB0cnkge1xuICAgIHJlcyA9IGFyZ3MgPyBoYW5kbGVyLmFwcGx5KGNvbnRleHQsIGFyZ3MpIDogaGFuZGxlci5jYWxsKGNvbnRleHQpO1xuICAgIGlmIChyZXMgJiYgIXJlcy5faXNWdWUgJiYgaXNQcm9taXNlKHJlcykgJiYgIXJlcy5faGFuZGxlZCkge1xuICAgICAgcmVzLmNhdGNoKGZ1bmN0aW9uIChlKSB7IHJldHVybiBoYW5kbGVFcnJvcihlLCB2bSwgaW5mbyArIFwiIChQcm9taXNlL2FzeW5jKVwiKTsgfSk7XG4gICAgICAvLyBpc3N1ZSAjOTUxMVxuICAgICAgLy8gYXZvaWQgY2F0Y2ggdHJpZ2dlcmluZyBtdWx0aXBsZSB0aW1lcyB3aGVuIG5lc3RlZCBjYWxsc1xuICAgICAgcmVzLl9oYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYW5kbGVFcnJvcihlLCB2bSwgaW5mbyk7XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBnbG9iYWxIYW5kbGVFcnJvciAoZXJyLCB2bSwgaW5mbykge1xuICBpZiAoY29uZmlnLmVycm9ySGFuZGxlcikge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY29uZmlnLmVycm9ySGFuZGxlci5jYWxsKG51bGwsIGVyciwgdm0sIGluZm8pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWYgdGhlIHVzZXIgaW50ZW50aW9uYWxseSB0aHJvd3MgdGhlIG9yaWdpbmFsIGVycm9yIGluIHRoZSBoYW5kbGVyLFxuICAgICAgLy8gZG8gbm90IGxvZyBpdCB0d2ljZVxuICAgICAgaWYgKGUgIT09IGVycikge1xuICAgICAgICBsb2dFcnJvcihlLCBudWxsLCAnY29uZmlnLmVycm9ySGFuZGxlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBsb2dFcnJvcihlcnIsIHZtLCBpbmZvKTtcbn1cblxuZnVuY3Rpb24gbG9nRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB3YXJuKChcIkVycm9yIGluIFwiICsgaW5mbyArIFwiOiBcXFwiXCIgKyAoZXJyLnRvU3RyaW5nKCkpICsgXCJcXFwiXCIpLCB2bSk7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKChpbkJyb3dzZXIgfHwgaW5XZWV4KSAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgZXJyXG4gIH1cbn1cblxuLyogICovXG5cbnZhciBjYWxsYmFja3MgPSBbXTtcbnZhciBwZW5kaW5nID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsdXNoQ2FsbGJhY2tzICgpIHtcbiAgcGVuZGluZyA9IGZhbHNlO1xuICB2YXIgY29waWVzID0gY2FsbGJhY2tzLnNsaWNlKDApO1xuICBjYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb3BpZXNbaV0oKTtcbiAgfVxufVxuXG4vLyBIZXJlIHdlIGhhdmUgYXN5bmMgZGVmZXJyaW5nIHdyYXBwZXJzIHVzaW5nIG1pY3JvdGFza3MuXG4vLyBJbiAyLjUgd2UgdXNlZCAobWFjcm8pIHRhc2tzIChpbiBjb21iaW5hdGlvbiB3aXRoIG1pY3JvdGFza3MpLlxuLy8gSG93ZXZlciwgaXQgaGFzIHN1YnRsZSBwcm9ibGVtcyB3aGVuIHN0YXRlIGlzIGNoYW5nZWQgcmlnaHQgYmVmb3JlIHJlcGFpbnRcbi8vIChlLmcuICM2ODEzLCBvdXQtaW4gdHJhbnNpdGlvbnMpLlxuLy8gQWxzbywgdXNpbmcgKG1hY3JvKSB0YXNrcyBpbiBldmVudCBoYW5kbGVyIHdvdWxkIGNhdXNlIHNvbWUgd2VpcmQgYmVoYXZpb3JzXG4vLyB0aGF0IGNhbm5vdCBiZSBjaXJjdW12ZW50ZWQgKGUuZy4gIzcxMDksICM3MTUzLCAjNzU0NiwgIzc4MzQsICM4MTA5KS5cbi8vIFNvIHdlIG5vdyB1c2UgbWljcm90YXNrcyBldmVyeXdoZXJlLCBhZ2Fpbi5cbi8vIEEgbWFqb3IgZHJhd2JhY2sgb2YgdGhpcyB0cmFkZW9mZiBpcyB0aGF0IHRoZXJlIGFyZSBzb21lIHNjZW5hcmlvc1xuLy8gd2hlcmUgbWljcm90YXNrcyBoYXZlIHRvbyBoaWdoIGEgcHJpb3JpdHkgYW5kIGZpcmUgaW4gYmV0d2VlbiBzdXBwb3NlZGx5XG4vLyBzZXF1ZW50aWFsIGV2ZW50cyAoZS5nLiAjNDUyMSwgIzY2OTAsIHdoaWNoIGhhdmUgd29ya2Fyb3VuZHMpXG4vLyBvciBldmVuIGJldHdlZW4gYnViYmxpbmcgb2YgdGhlIHNhbWUgZXZlbnQgKCM2NTY2KS5cbnZhciB0aW1lckZ1bmM7XG5cbi8vIFRoZSBuZXh0VGljayBiZWhhdmlvciBsZXZlcmFnZXMgdGhlIG1pY3JvdGFzayBxdWV1ZSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkXG4vLyB2aWEgZWl0aGVyIG5hdGl2ZSBQcm9taXNlLnRoZW4gb3IgTXV0YXRpb25PYnNlcnZlci5cbi8vIE11dGF0aW9uT2JzZXJ2ZXIgaGFzIHdpZGVyIHN1cHBvcnQsIGhvd2V2ZXIgaXQgaXMgc2VyaW91c2x5IGJ1Z2dlZCBpblxuLy8gVUlXZWJWaWV3IGluIGlPUyA+PSA5LjMuMyB3aGVuIHRyaWdnZXJlZCBpbiB0b3VjaCBldmVudCBoYW5kbGVycy4gSXRcbi8vIGNvbXBsZXRlbHkgc3RvcHMgd29ya2luZyBhZnRlciB0cmlnZ2VyaW5nIGEgZmV3IHRpbWVzLi4uIHNvLCBpZiBuYXRpdmVcbi8vIFByb21pc2UgaXMgYXZhaWxhYmxlLCB3ZSB3aWxsIHVzZSBpdDpcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0LCAkZmxvdy1kaXNhYmxlLWxpbmUgKi9cbmlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHtcbiAgdmFyIHAgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHAudGhlbihmbHVzaENhbGxiYWNrcyk7XG4gICAgLy8gSW4gcHJvYmxlbWF0aWMgVUlXZWJWaWV3cywgUHJvbWlzZS50aGVuIGRvZXNuJ3QgY29tcGxldGVseSBicmVhaywgYnV0XG4gICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlXG4gICAgLy8gbWljcm90YXNrIHF1ZXVlIGJ1dCB0aGUgcXVldWUgaXNuJ3QgYmVpbmcgZmx1c2hlZCwgdW50aWwgdGhlIGJyb3dzZXJcbiAgICAvLyBuZWVkcyB0byBkbyBzb21lIG90aGVyIHdvcmssIGUuZy4gaGFuZGxlIGEgdGltZXIuIFRoZXJlZm9yZSB3ZSBjYW5cbiAgICAvLyBcImZvcmNlXCIgdGhlIG1pY3JvdGFzayBxdWV1ZSB0byBiZSBmbHVzaGVkIGJ5IGFkZGluZyBhbiBlbXB0eSB0aW1lci5cbiAgICBpZiAoaXNJT1MpIHsgc2V0VGltZW91dChub29wKTsgfVxuICB9O1xufSBlbHNlIGlmICghaXNJRSAmJiB0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgKFxuICBpc05hdGl2ZShNdXRhdGlvbk9ic2VydmVyKSB8fFxuICAvLyBQaGFudG9tSlMgYW5kIGlPUyA3LnhcbiAgTXV0YXRpb25PYnNlcnZlci50b1N0cmluZygpID09PSAnW29iamVjdCBNdXRhdGlvbk9ic2VydmVyQ29uc3RydWN0b3JdJ1xuKSkge1xuICAvLyBVc2UgTXV0YXRpb25PYnNlcnZlciB3aGVyZSBuYXRpdmUgUHJvbWlzZSBpcyBub3QgYXZhaWxhYmxlLFxuICAvLyBlLmcuIFBoYW50b21KUywgaU9TNywgQW5kcm9pZCA0LjRcbiAgLy8gKCM2NDY2IE11dGF0aW9uT2JzZXJ2ZXIgaXMgdW5yZWxpYWJsZSBpbiBJRTExKVxuICB2YXIgY291bnRlciA9IDE7XG4gIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZsdXNoQ2FsbGJhY2tzKTtcbiAgdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGNvdW50ZXIpKTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZSh0ZXh0Tm9kZSwge1xuICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgfSk7XG4gIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIDI7XG4gICAgdGV4dE5vZGUuZGF0YSA9IFN0cmluZyhjb3VudGVyKTtcbiAgfTtcbn0gZWxzZSBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoc2V0SW1tZWRpYXRlKSkge1xuICAvLyBGYWxsYmFjayB0byBzZXRJbW1lZGlhdGUuXG4gIC8vIFRlY2huaWNhbGx5IGl0IGxldmVyYWdlcyB0aGUgKG1hY3JvKSB0YXNrIHF1ZXVlLFxuICAvLyBidXQgaXQgaXMgc3RpbGwgYSBiZXR0ZXIgY2hvaWNlIHRoYW4gc2V0VGltZW91dC5cbiAgdGltZXJGdW5jID0gZnVuY3Rpb24gKCkge1xuICAgIHNldEltbWVkaWF0ZShmbHVzaENhbGxiYWNrcyk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBGYWxsYmFjayB0byBzZXRUaW1lb3V0LlxuICB0aW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dChmbHVzaENhbGxiYWNrcywgMCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG5leHRUaWNrIChjYiwgY3R4KSB7XG4gIHZhciBfcmVzb2x2ZTtcbiAgY2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2IuY2FsbChjdHgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBoYW5kbGVFcnJvcihlLCBjdHgsICduZXh0VGljaycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoX3Jlc29sdmUpIHtcbiAgICAgIF9yZXNvbHZlKGN0eCk7XG4gICAgfVxuICB9KTtcbiAgaWYgKCFwZW5kaW5nKSB7XG4gICAgcGVuZGluZyA9IHRydWU7XG4gICAgdGltZXJGdW5jKCk7XG4gIH1cbiAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSlcbiAgfVxufVxuXG4vKiAgKi9cblxuLyogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoIFByb3h5ICovXG5cbnZhciBpbml0UHJveHk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBhbGxvd2VkR2xvYmFscyA9IG1ha2VNYXAoXG4gICAgJ0luZmluaXR5LHVuZGVmaW5lZCxOYU4saXNGaW5pdGUsaXNOYU4sJyArXG4gICAgJ3BhcnNlRmxvYXQscGFyc2VJbnQsZGVjb2RlVVJJLGRlY29kZVVSSUNvbXBvbmVudCxlbmNvZGVVUkksZW5jb2RlVVJJQ29tcG9uZW50LCcgK1xuICAgICdNYXRoLE51bWJlcixEYXRlLEFycmF5LE9iamVjdCxCb29sZWFuLFN0cmluZyxSZWdFeHAsTWFwLFNldCxKU09OLEludGwsJyArXG4gICAgJ3JlcXVpcmUnIC8vIGZvciBXZWJwYWNrL0Jyb3dzZXJpZnlcbiAgKTtcblxuICB2YXIgd2Fybk5vblByZXNlbnQgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICB3YXJuKFxuICAgICAgXCJQcm9wZXJ0eSBvciBtZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIG5vdCBkZWZpbmVkIG9uIHRoZSBpbnN0YW5jZSBidXQgXCIgK1xuICAgICAgJ3JlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBwcm9wZXJ0eSBpcyByZWFjdGl2ZSwgJyArXG4gICAgICAnZWl0aGVyIGluIHRoZSBkYXRhIG9wdGlvbiwgb3IgZm9yIGNsYXNzLWJhc2VkIGNvbXBvbmVudHMsIGJ5ICcgK1xuICAgICAgJ2luaXRpYWxpemluZyB0aGUgcHJvcGVydHkuICcgK1xuICAgICAgJ1NlZTogaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eS5odG1sI0RlY2xhcmluZy1SZWFjdGl2ZS1Qcm9wZXJ0aWVzLicsXG4gICAgICB0YXJnZXRcbiAgICApO1xuICB9O1xuXG4gIHZhciB3YXJuUmVzZXJ2ZWRQcmVmaXggPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHtcbiAgICB3YXJuKFxuICAgICAgXCJQcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgbXVzdCBiZSBhY2Nlc3NlZCB3aXRoIFxcXCIkZGF0YS5cIiArIGtleSArIFwiXFxcIiBiZWNhdXNlIFwiICtcbiAgICAgICdwcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggXCIkXCIgb3IgXCJfXCIgYXJlIG5vdCBwcm94aWVkIGluIHRoZSBWdWUgaW5zdGFuY2UgdG8gJyArXG4gICAgICAncHJldmVudCBjb25mbGljdHMgd2l0aCBWdWUgaW50ZXJuYWxzLiAnICtcbiAgICAgICdTZWU6IGh0dHBzOi8vdnVlanMub3JnL3YyL2FwaS8jZGF0YScsXG4gICAgICB0YXJnZXRcbiAgICApO1xuICB9O1xuXG4gIHZhciBoYXNQcm94eSA9XG4gICAgdHlwZW9mIFByb3h5ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShQcm94eSk7XG5cbiAgaWYgKGhhc1Byb3h5KSB7XG4gICAgdmFyIGlzQnVpbHRJbk1vZGlmaWVyID0gbWFrZU1hcCgnc3RvcCxwcmV2ZW50LHNlbGYsY3RybCxzaGlmdCxhbHQsbWV0YSxleGFjdCcpO1xuICAgIGNvbmZpZy5rZXlDb2RlcyA9IG5ldyBQcm94eShjb25maWcua2V5Q29kZXMsIHtcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0ICh0YXJnZXQsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzQnVpbHRJbk1vZGlmaWVyKGtleSkpIHtcbiAgICAgICAgICB3YXJuKChcIkF2b2lkIG92ZXJ3cml0aW5nIGJ1aWx0LWluIG1vZGlmaWVyIGluIGNvbmZpZy5rZXlDb2RlczogLlwiICsga2V5KSk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB2YXIgaGFzSGFuZGxlciA9IHtcbiAgICBoYXM6IGZ1bmN0aW9uIGhhcyAodGFyZ2V0LCBrZXkpIHtcbiAgICAgIHZhciBoYXMgPSBrZXkgaW4gdGFyZ2V0O1xuICAgICAgdmFyIGlzQWxsb3dlZCA9IGFsbG93ZWRHbG9iYWxzKGtleSkgfHxcbiAgICAgICAgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleS5jaGFyQXQoMCkgPT09ICdfJyAmJiAhKGtleSBpbiB0YXJnZXQuJGRhdGEpKTtcbiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHtcbiAgICAgICAgaWYgKGtleSBpbiB0YXJnZXQuJGRhdGEpIHsgd2FyblJlc2VydmVkUHJlZml4KHRhcmdldCwga2V5KTsgfVxuICAgICAgICBlbHNlIHsgd2Fybk5vblByZXNlbnQodGFyZ2V0LCBrZXkpOyB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFzIHx8ICFpc0FsbG93ZWRcbiAgICB9XG4gIH07XG5cbiAgdmFyIGdldEhhbmRsZXIgPSB7XG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQgKHRhcmdldCwga2V5KSB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYgIShrZXkgaW4gdGFyZ2V0KSkge1xuICAgICAgICBpZiAoa2V5IGluIHRhcmdldC4kZGF0YSkgeyB3YXJuUmVzZXJ2ZWRQcmVmaXgodGFyZ2V0LCBrZXkpOyB9XG4gICAgICAgIGVsc2UgeyB3YXJuTm9uUHJlc2VudCh0YXJnZXQsIGtleSk7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgIH1cbiAgfTtcblxuICBpbml0UHJveHkgPSBmdW5jdGlvbiBpbml0UHJveHkgKHZtKSB7XG4gICAgaWYgKGhhc1Byb3h5KSB7XG4gICAgICAvLyBkZXRlcm1pbmUgd2hpY2ggcHJveHkgaGFuZGxlciB0byB1c2VcbiAgICAgIHZhciBvcHRpb25zID0gdm0uJG9wdGlvbnM7XG4gICAgICB2YXIgaGFuZGxlcnMgPSBvcHRpb25zLnJlbmRlciAmJiBvcHRpb25zLnJlbmRlci5fd2l0aFN0cmlwcGVkXG4gICAgICAgID8gZ2V0SGFuZGxlclxuICAgICAgICA6IGhhc0hhbmRsZXI7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSBuZXcgUHJveHkodm0sIGhhbmRsZXJzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uX3JlbmRlclByb3h5ID0gdm07XG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZFxuICogZ2V0dGVycywgc28gdGhhdCBldmVyeSBuZXN0ZWQgcHJvcGVydHkgaW5zaWRlIHRoZSBvYmplY3RcbiAqIGlzIGNvbGxlY3RlZCBhcyBhIFwiZGVlcFwiIGRlcGVuZGVuY3kuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHtcbiAgX3RyYXZlcnNlKHZhbCwgc2Vlbk9iamVjdHMpO1xuICBzZWVuT2JqZWN0cy5jbGVhcigpO1xufVxuXG5mdW5jdGlvbiBfdHJhdmVyc2UgKHZhbCwgc2Vlbikge1xuICB2YXIgaSwga2V5cztcbiAgdmFyIGlzQSA9IEFycmF5LmlzQXJyYXkodmFsKTtcbiAgaWYgKCghaXNBICYmICFpc09iamVjdCh2YWwpKSB8fCBPYmplY3QuaXNGcm96ZW4odmFsKSB8fCB2YWwgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICh2YWwuX19vYl9fKSB7XG4gICAgdmFyIGRlcElkID0gdmFsLl9fb2JfXy5kZXAuaWQ7XG4gICAgaWYgKHNlZW4uaGFzKGRlcElkKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNlZW4uYWRkKGRlcElkKTtcbiAgfVxuICBpZiAoaXNBKSB7XG4gICAgaSA9IHZhbC5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkgeyBfdHJhdmVyc2UodmFsW2ldLCBzZWVuKTsgfVxuICB9IGVsc2Uge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgIGkgPSBrZXlzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxba2V5c1tpXV0sIHNlZW4pOyB9XG4gIH1cbn1cblxudmFyIG1hcms7XG52YXIgbWVhc3VyZTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHBlcmYgPSBpbkJyb3dzZXIgJiYgd2luZG93LnBlcmZvcm1hbmNlO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKFxuICAgIHBlcmYgJiZcbiAgICBwZXJmLm1hcmsgJiZcbiAgICBwZXJmLm1lYXN1cmUgJiZcbiAgICBwZXJmLmNsZWFyTWFya3MgJiZcbiAgICBwZXJmLmNsZWFyTWVhc3VyZXNcbiAgKSB7XG4gICAgbWFyayA9IGZ1bmN0aW9uICh0YWcpIHsgcmV0dXJuIHBlcmYubWFyayh0YWcpOyB9O1xuICAgIG1lYXN1cmUgPSBmdW5jdGlvbiAobmFtZSwgc3RhcnRUYWcsIGVuZFRhZykge1xuICAgICAgcGVyZi5tZWFzdXJlKG5hbWUsIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgICAgcGVyZi5jbGVhck1hcmtzKHN0YXJ0VGFnKTtcbiAgICAgIHBlcmYuY2xlYXJNYXJrcyhlbmRUYWcpO1xuICAgICAgLy8gcGVyZi5jbGVhck1lYXN1cmVzKG5hbWUpXG4gICAgfTtcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIG5vcm1hbGl6ZUV2ZW50ID0gY2FjaGVkKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciBwYXNzaXZlID0gbmFtZS5jaGFyQXQoMCkgPT09ICcmJztcbiAgbmFtZSA9IHBhc3NpdmUgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgdmFyIG9uY2UkJDEgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJ34nOyAvLyBQcmVmaXhlZCBsYXN0LCBjaGVja2VkIGZpcnN0XG4gIG5hbWUgPSBvbmNlJCQxID8gbmFtZS5zbGljZSgxKSA6IG5hbWU7XG4gIHZhciBjYXB0dXJlID0gbmFtZS5jaGFyQXQoMCkgPT09ICchJztcbiAgbmFtZSA9IGNhcHR1cmUgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lLFxuICAgIG9uY2U6IG9uY2UkJDEsXG4gICAgY2FwdHVyZTogY2FwdHVyZSxcbiAgICBwYXNzaXZlOiBwYXNzaXZlXG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVGbkludm9rZXIgKGZucywgdm0pIHtcbiAgZnVuY3Rpb24gaW52b2tlciAoKSB7XG4gICAgdmFyIGFyZ3VtZW50cyQxID0gYXJndW1lbnRzO1xuXG4gICAgdmFyIGZucyA9IGludm9rZXIuZm5zO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZucykpIHtcbiAgICAgIHZhciBjbG9uZWQgPSBmbnMuc2xpY2UoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2xvbmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGNsb25lZFtpXSwgbnVsbCwgYXJndW1lbnRzJDEsIHZtLCBcInYtb24gaGFuZGxlclwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmV0dXJuIGhhbmRsZXIgcmV0dXJuIHZhbHVlIGZvciBzaW5nbGUgaGFuZGxlcnNcbiAgICAgIHJldHVybiBpbnZva2VXaXRoRXJyb3JIYW5kbGluZyhmbnMsIG51bGwsIGFyZ3VtZW50cywgdm0sIFwidi1vbiBoYW5kbGVyXCIpXG4gICAgfVxuICB9XG4gIGludm9rZXIuZm5zID0gZm5zO1xuICByZXR1cm4gaW52b2tlclxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaXN0ZW5lcnMgKFxuICBvbixcbiAgb2xkT24sXG4gIGFkZCxcbiAgcmVtb3ZlJCQxLFxuICBjcmVhdGVPbmNlSGFuZGxlcixcbiAgdm1cbikge1xuICB2YXIgbmFtZSwgZGVmJCQxLCBjdXIsIG9sZCwgZXZlbnQ7XG4gIGZvciAobmFtZSBpbiBvbikge1xuICAgIGRlZiQkMSA9IGN1ciA9IG9uW25hbWVdO1xuICAgIG9sZCA9IG9sZE9uW25hbWVdO1xuICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQobmFtZSk7XG4gICAgaWYgKGlzVW5kZWYoY3VyKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkludmFsaWQgaGFuZGxlciBmb3IgZXZlbnQgXFxcIlwiICsgKGV2ZW50Lm5hbWUpICsgXCJcXFwiOiBnb3QgXCIgKyBTdHJpbmcoY3VyKSxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHtcbiAgICAgIGlmIChpc1VuZGVmKGN1ci5mbnMpKSB7XG4gICAgICAgIGN1ciA9IG9uW25hbWVdID0gY3JlYXRlRm5JbnZva2VyKGN1ciwgdm0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzVHJ1ZShldmVudC5vbmNlKSkge1xuICAgICAgICBjdXIgPSBvbltuYW1lXSA9IGNyZWF0ZU9uY2VIYW5kbGVyKGV2ZW50Lm5hbWUsIGN1ciwgZXZlbnQuY2FwdHVyZSk7XG4gICAgICB9XG4gICAgICBhZGQoZXZlbnQubmFtZSwgY3VyLCBldmVudC5jYXB0dXJlLCBldmVudC5wYXNzaXZlLCBldmVudC5wYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAoY3VyICE9PSBvbGQpIHtcbiAgICAgIG9sZC5mbnMgPSBjdXI7XG4gICAgICBvbltuYW1lXSA9IG9sZDtcbiAgICB9XG4gIH1cbiAgZm9yIChuYW1lIGluIG9sZE9uKSB7XG4gICAgaWYgKGlzVW5kZWYob25bbmFtZV0pKSB7XG4gICAgICBldmVudCA9IG5vcm1hbGl6ZUV2ZW50KG5hbWUpO1xuICAgICAgcmVtb3ZlJCQxKGV2ZW50Lm5hbWUsIG9sZE9uW25hbWVdLCBldmVudC5jYXB0dXJlKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbi8qICAqL1xuXG4vLyBmaXhlZCBieSB4eHh4eHggKG1wIHByb3BlcnRpZXMpXG5mdW5jdGlvbiBleHRyYWN0UHJvcGVydGllc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgcmVzLCBjb250ZXh0KSB7XG4gIHZhciBwcm9wT3B0aW9ucyA9IEN0b3Iub3B0aW9ucy5tcE9wdGlvbnMgJiYgQ3Rvci5vcHRpb25zLm1wT3B0aW9ucy5wcm9wZXJ0aWVzO1xuICBpZiAoaXNVbmRlZihwcm9wT3B0aW9ucykpIHtcbiAgICByZXR1cm4gcmVzXG4gIH1cbiAgdmFyIGV4dGVybmFsQ2xhc3NlcyA9IEN0b3Iub3B0aW9ucy5tcE9wdGlvbnMuZXh0ZXJuYWxDbGFzc2VzIHx8IFtdO1xuICB2YXIgYXR0cnMgPSBkYXRhLmF0dHJzO1xuICB2YXIgcHJvcHMgPSBkYXRhLnByb3BzO1xuICBpZiAoaXNEZWYoYXR0cnMpIHx8IGlzRGVmKHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykge1xuICAgICAgdmFyIGFsdEtleSA9IGh5cGhlbmF0ZShrZXkpO1xuICAgICAgdmFyIHJlc3VsdCA9IGNoZWNrUHJvcChyZXMsIHByb3BzLCBrZXksIGFsdEtleSwgdHJ1ZSkgfHxcbiAgICAgICAgICBjaGVja1Byb3AocmVzLCBhdHRycywga2V5LCBhbHRLZXksIGZhbHNlKTtcbiAgICAgIC8vIGV4dGVybmFsQ2xhc3NcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgIHJlc1trZXldICYmXG4gICAgICAgIGV4dGVybmFsQ2xhc3Nlcy5pbmRleE9mKGFsdEtleSkgIT09IC0xICYmXG4gICAgICAgIGNvbnRleHRbY2FtZWxpemUocmVzW2tleV0pXVxuICAgICAgKSB7XG4gICAgICAgIC8vIOi1i+WAvCBleHRlcm5hbENsYXNzIOecn+ato+eahOWAvCjmqKHmnb/ph4wgZXh0ZXJuYWxDbGFzcyDnmoTlgLzlj6/og73mmK/lrZfnrKbkuLIpXG4gICAgICAgIHJlc1trZXldID0gY29udGV4dFtjYW1lbGl6ZShyZXNba2V5XSldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEgKFxuICBkYXRhLFxuICBDdG9yLFxuICB0YWcsXG4gIGNvbnRleHQvLyBmaXhlZCBieSB4eHh4eHhcbikge1xuICAvLyB3ZSBhcmUgb25seSBleHRyYWN0aW5nIHJhdyB2YWx1ZXMgaGVyZS5cbiAgLy8gdmFsaWRhdGlvbiBhbmQgZGVmYXVsdCB2YWx1ZXMgYXJlIGhhbmRsZWQgaW4gdGhlIGNoaWxkXG4gIC8vIGNvbXBvbmVudCBpdHNlbGYuXG4gIHZhciBwcm9wT3B0aW9ucyA9IEN0b3Iub3B0aW9ucy5wcm9wcztcbiAgaWYgKGlzVW5kZWYocHJvcE9wdGlvbnMpKSB7XG4gICAgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgcmV0dXJuIGV4dHJhY3RQcm9wZXJ0aWVzRnJvbVZOb2RlRGF0YShkYXRhLCBDdG9yLCB7fSwgY29udGV4dClcbiAgfVxuICB2YXIgcmVzID0ge307XG4gIHZhciBhdHRycyA9IGRhdGEuYXR0cnM7XG4gIHZhciBwcm9wcyA9IGRhdGEucHJvcHM7XG4gIGlmIChpc0RlZihhdHRycykgfHwgaXNEZWYocHJvcHMpKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHByb3BPcHRpb25zKSB7XG4gICAgICB2YXIgYWx0S2V5ID0gaHlwaGVuYXRlKGtleSk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB2YXIga2V5SW5Mb3dlckNhc2UgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleSAhPT0ga2V5SW5Mb3dlckNhc2UgJiZcbiAgICAgICAgICBhdHRycyAmJiBoYXNPd24oYXR0cnMsIGtleUluTG93ZXJDYXNlKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aXAoXG4gICAgICAgICAgICBcIlByb3AgXFxcIlwiICsga2V5SW5Mb3dlckNhc2UgKyBcIlxcXCIgaXMgcGFzc2VkIHRvIGNvbXBvbmVudCBcIiArXG4gICAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh0YWcgfHwgQ3RvcikpICsgXCIsIGJ1dCB0aGUgZGVjbGFyZWQgcHJvcCBuYW1lIGlzXCIgK1xuICAgICAgICAgICAgXCIgXFxcIlwiICsga2V5ICsgXCJcXFwiLiBcIiArXG4gICAgICAgICAgICBcIk5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIGNhbWVsQ2FzZWQgXCIgK1xuICAgICAgICAgICAgXCJwcm9wcyBuZWVkIHRvIHVzZSB0aGVpciBrZWJhYi1jYXNlIGVxdWl2YWxlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIFwiICtcbiAgICAgICAgICAgIFwidGVtcGxhdGVzLiBZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcXFwiXCIgKyBhbHRLZXkgKyBcIlxcXCIgaW5zdGVhZCBvZiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjaGVja1Byb3AocmVzLCBwcm9wcywga2V5LCBhbHRLZXksIHRydWUpIHx8XG4gICAgICBjaGVja1Byb3AocmVzLCBhdHRycywga2V5LCBhbHRLZXksIGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4ZWQgYnkgeHh4eHh4XG4gIHJldHVybiBleHRyYWN0UHJvcGVydGllc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgcmVzLCBjb250ZXh0KVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3AgKFxuICByZXMsXG4gIGhhc2gsXG4gIGtleSxcbiAgYWx0S2V5LFxuICBwcmVzZXJ2ZVxuKSB7XG4gIGlmIChpc0RlZihoYXNoKSkge1xuICAgIGlmIChoYXNPd24oaGFzaCwga2V5KSkge1xuICAgICAgcmVzW2tleV0gPSBoYXNoW2tleV07XG4gICAgICBpZiAoIXByZXNlcnZlKSB7XG4gICAgICAgIGRlbGV0ZSBoYXNoW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSBpZiAoaGFzT3duKGhhc2gsIGFsdEtleSkpIHtcbiAgICAgIHJlc1trZXldID0gaGFzaFthbHRLZXldO1xuICAgICAgaWYgKCFwcmVzZXJ2ZSkge1xuICAgICAgICBkZWxldGUgaGFzaFthbHRLZXldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qICAqL1xuXG4vLyBUaGUgdGVtcGxhdGUgY29tcGlsZXIgYXR0ZW1wdHMgdG8gbWluaW1pemUgdGhlIG5lZWQgZm9yIG5vcm1hbGl6YXRpb24gYnlcbi8vIHN0YXRpY2FsbHkgYW5hbHl6aW5nIHRoZSB0ZW1wbGF0ZSBhdCBjb21waWxlIHRpbWUuXG4vL1xuLy8gRm9yIHBsYWluIEhUTUwgbWFya3VwLCBub3JtYWxpemF0aW9uIGNhbiBiZSBjb21wbGV0ZWx5IHNraXBwZWQgYmVjYXVzZSB0aGVcbi8vIGdlbmVyYXRlZCByZW5kZXIgZnVuY3Rpb24gaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gQXJyYXk8Vk5vZGU+LiBUaGVyZSBhcmVcbi8vIHR3byBjYXNlcyB3aGVyZSBleHRyYSBub3JtYWxpemF0aW9uIGlzIG5lZWRlZDpcblxuLy8gMS4gV2hlbiB0aGUgY2hpbGRyZW4gY29udGFpbnMgY29tcG9uZW50cyAtIGJlY2F1c2UgYSBmdW5jdGlvbmFsIGNvbXBvbmVudFxuLy8gbWF5IHJldHVybiBhbiBBcnJheSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHJvb3QuIEluIHRoaXMgY2FzZSwganVzdCBhIHNpbXBsZVxuLy8gbm9ybWFsaXphdGlvbiBpcyBuZWVkZWQgLSBpZiBhbnkgY2hpbGQgaXMgYW4gQXJyYXksIHdlIGZsYXR0ZW4gdGhlIHdob2xlXG4vLyB0aGluZyB3aXRoIEFycmF5LnByb3RvdHlwZS5jb25jYXQuIEl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb25seSAxLWxldmVsIGRlZXBcbi8vIGJlY2F1c2UgZnVuY3Rpb25hbCBjb21wb25lbnRzIGFscmVhZHkgbm9ybWFsaXplIHRoZWlyIG93biBjaGlsZHJlbi5cbmZ1bmN0aW9uIHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuIChjaGlsZHJlbikge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW5baV0pKSB7XG4gICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgY2hpbGRyZW4pXG4gICAgfVxuICB9XG4gIHJldHVybiBjaGlsZHJlblxufVxuXG4vLyAyLiBXaGVuIHRoZSBjaGlsZHJlbiBjb250YWlucyBjb25zdHJ1Y3RzIHRoYXQgYWx3YXlzIGdlbmVyYXRlZCBuZXN0ZWQgQXJyYXlzLFxuLy8gZS5nLiA8dGVtcGxhdGU+LCA8c2xvdD4sIHYtZm9yLCBvciB3aGVuIHRoZSBjaGlsZHJlbiBpcyBwcm92aWRlZCBieSB1c2VyXG4vLyB3aXRoIGhhbmQtd3JpdHRlbiByZW5kZXIgZnVuY3Rpb25zIC8gSlNYLiBJbiBzdWNoIGNhc2VzIGEgZnVsbCBub3JtYWxpemF0aW9uXG4vLyBpcyBuZWVkZWQgdG8gY2F0ZXIgdG8gYWxsIHBvc3NpYmxlIHR5cGVzIG9mIGNoaWxkcmVuIHZhbHVlcy5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNoaWxkcmVuIChjaGlsZHJlbikge1xuICByZXR1cm4gaXNQcmltaXRpdmUoY2hpbGRyZW4pXG4gICAgPyBbY3JlYXRlVGV4dFZOb2RlKGNoaWxkcmVuKV1cbiAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pXG4gICAgICA/IG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4oY2hpbGRyZW4pXG4gICAgICA6IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlIChub2RlKSB7XG4gIHJldHVybiBpc0RlZihub2RlKSAmJiBpc0RlZihub2RlLnRleHQpICYmIGlzRmFsc2Uobm9kZS5pc0NvbW1lbnQpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5Q2hpbGRyZW4gKGNoaWxkcmVuLCBuZXN0ZWRJbmRleCkge1xuICB2YXIgcmVzID0gW107XG4gIHZhciBpLCBjLCBsYXN0SW5kZXgsIGxhc3Q7XG4gIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGMgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoaXNVbmRlZihjKSB8fCB0eXBlb2YgYyA9PT0gJ2Jvb2xlYW4nKSB7IGNvbnRpbnVlIH1cbiAgICBsYXN0SW5kZXggPSByZXMubGVuZ3RoIC0gMTtcbiAgICBsYXN0ID0gcmVzW2xhc3RJbmRleF07XG4gICAgLy8gIG5lc3RlZFxuICAgIGlmIChBcnJheS5pc0FycmF5KGMpKSB7XG4gICAgICBpZiAoYy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGMgPSBub3JtYWxpemVBcnJheUNoaWxkcmVuKGMsICgobmVzdGVkSW5kZXggfHwgJycpICsgXCJfXCIgKyBpKSk7XG4gICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgaWYgKGlzVGV4dE5vZGUoY1swXSkgJiYgaXNUZXh0Tm9kZShsYXN0KSkge1xuICAgICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIChjWzBdKS50ZXh0KTtcbiAgICAgICAgICBjLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2guYXBwbHkocmVzLCBjKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKGMpKSB7XG4gICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkge1xuICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICAgIC8vIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBTU1IgaHlkcmF0aW9uIGJlY2F1c2UgdGV4dCBub2RlcyBhcmVcbiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzXG4gICAgICAgIHJlc1tsYXN0SW5kZXhdID0gY3JlYXRlVGV4dFZOb2RlKGxhc3QudGV4dCArIGMpO1xuICAgICAgfSBlbHNlIGlmIChjICE9PSAnJykge1xuICAgICAgICAvLyBjb252ZXJ0IHByaW1pdGl2ZSB0byB2bm9kZVxuICAgICAgICByZXMucHVzaChjcmVhdGVUZXh0Vk5vZGUoYykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNUZXh0Tm9kZShjKSAmJiBpc1RleHROb2RlKGxhc3QpKSB7XG4gICAgICAgIC8vIG1lcmdlIGFkamFjZW50IHRleHQgbm9kZXNcbiAgICAgICAgcmVzW2xhc3RJbmRleF0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlZmF1bHQga2V5IGZvciBuZXN0ZWQgYXJyYXkgY2hpbGRyZW4gKGxpa2VseSBnZW5lcmF0ZWQgYnkgdi1mb3IpXG4gICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmXG4gICAgICAgICAgaXNEZWYoYy50YWcpICYmXG4gICAgICAgICAgaXNVbmRlZihjLmtleSkgJiZcbiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHtcbiAgICAgICAgICBjLmtleSA9IFwiX192bGlzdFwiICsgbmVzdGVkSW5kZXggKyBcIl9cIiArIGkgKyBcIl9fXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRQcm92aWRlICh2bSkge1xuICB2YXIgcHJvdmlkZSA9IHZtLiRvcHRpb25zLnByb3ZpZGU7XG4gIGlmIChwcm92aWRlKSB7XG4gICAgdm0uX3Byb3ZpZGVkID0gdHlwZW9mIHByb3ZpZGUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcHJvdmlkZS5jYWxsKHZtKVxuICAgICAgOiBwcm92aWRlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRJbmplY3Rpb25zICh2bSkge1xuICB2YXIgcmVzdWx0ID0gcmVzb2x2ZUluamVjdCh2bS4kb3B0aW9ucy5pbmplY3QsIHZtKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7XG4gICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBkZWZpbmVSZWFjdGl2ZSQkMSh2bSwga2V5LCByZXN1bHRba2V5XSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBcIkF2b2lkIG11dGF0aW5nIGFuIGluamVjdGVkIHZhbHVlIGRpcmVjdGx5IHNpbmNlIHRoZSBjaGFuZ2VzIHdpbGwgYmUgXCIgK1xuICAgICAgICAgICAgXCJvdmVyd3JpdHRlbiB3aGVuZXZlciB0aGUgcHJvdmlkZWQgY29tcG9uZW50IHJlLXJlbmRlcnMuIFwiICtcbiAgICAgICAgICAgIFwiaW5qZWN0aW9uIGJlaW5nIG11dGF0ZWQ6IFxcXCJcIiArIGtleSArIFwiXFxcIlwiLFxuICAgICAgICAgICAgdm1cbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCBrZXksIHJlc3VsdFtrZXldKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0b2dnbGVPYnNlcnZpbmcodHJ1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkge1xuICBpZiAoaW5qZWN0KSB7XG4gICAgLy8gaW5qZWN0IGlzIDphbnkgYmVjYXVzZSBmbG93IGlzIG5vdCBzbWFydCBlbm91Z2ggdG8gZmlndXJlIG91dCBjYWNoZWRcbiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIga2V5cyA9IGhhc1N5bWJvbFxuICAgICAgPyBSZWZsZWN0Lm93bktleXMoaW5qZWN0KVxuICAgICAgOiBPYmplY3Qua2V5cyhpbmplY3QpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIC8vICM2NTc0IGluIGNhc2UgdGhlIGluamVjdCBvYmplY3QgaXMgb2JzZXJ2ZWQuLi5cbiAgICAgIGlmIChrZXkgPT09ICdfX29iX18nKSB7IGNvbnRpbnVlIH1cbiAgICAgIHZhciBwcm92aWRlS2V5ID0gaW5qZWN0W2tleV0uZnJvbTtcbiAgICAgIHZhciBzb3VyY2UgPSB2bTtcbiAgICAgIHdoaWxlIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZS5fcHJvdmlkZWQgJiYgaGFzT3duKHNvdXJjZS5fcHJvdmlkZWQsIHByb3ZpZGVLZXkpKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBzb3VyY2UuX3Byb3ZpZGVkW3Byb3ZpZGVLZXldO1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgc291cmNlID0gc291cmNlLiRwYXJlbnQ7XG4gICAgICB9XG4gICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICBpZiAoJ2RlZmF1bHQnIGluIGluamVjdFtrZXldKSB7XG4gICAgICAgICAgdmFyIHByb3ZpZGVEZWZhdWx0ID0gaW5qZWN0W2tleV0uZGVmYXVsdDtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHR5cGVvZiBwcm92aWRlRGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBwcm92aWRlRGVmYXVsdC5jYWxsKHZtKVxuICAgICAgICAgICAgOiBwcm92aWRlRGVmYXVsdDtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgd2FybigoXCJJbmplY3Rpb24gXFxcIlwiICsga2V5ICsgXCJcXFwiIG5vdCBmb3VuZFwiKSwgdm0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxufVxuXG4vKiAgKi9cblxuXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNsb3RzIChcbiAgY2hpbGRyZW4sXG4gIGNvbnRleHRcbikge1xuICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuICB2YXIgc2xvdHMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICB2YXIgZGF0YSA9IGNoaWxkLmRhdGE7XG4gICAgLy8gcmVtb3ZlIHNsb3QgYXR0cmlidXRlIGlmIHRoZSBub2RlIGlzIHJlc29sdmVkIGFzIGEgVnVlIHNsb3Qgbm9kZVxuICAgIGlmIChkYXRhICYmIGRhdGEuYXR0cnMgJiYgZGF0YS5hdHRycy5zbG90KSB7XG4gICAgICBkZWxldGUgZGF0YS5hdHRycy5zbG90O1xuICAgIH1cbiAgICAvLyBuYW1lZCBzbG90cyBzaG91bGQgb25seSBiZSByZXNwZWN0ZWQgaWYgdGhlIHZub2RlIHdhcyByZW5kZXJlZCBpbiB0aGVcbiAgICAvLyBzYW1lIGNvbnRleHQuXG4gICAgaWYgKChjaGlsZC5jb250ZXh0ID09PSBjb250ZXh0IHx8IGNoaWxkLmZuQ29udGV4dCA9PT0gY29udGV4dCkgJiZcbiAgICAgIGRhdGEgJiYgZGF0YS5zbG90ICE9IG51bGxcbiAgICApIHtcbiAgICAgIHZhciBuYW1lID0gZGF0YS5zbG90O1xuICAgICAgdmFyIHNsb3QgPSAoc2xvdHNbbmFtZV0gfHwgKHNsb3RzW25hbWVdID0gW10pKTtcbiAgICAgIGlmIChjaGlsZC50YWcgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgc2xvdC5wdXNoLmFwcGx5KHNsb3QsIGNoaWxkLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNsb3QucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGZpeGVkIGJ5IHh4eHh4eCDkuLTml7YgaGFjayDmjokgdW5pLWFwcCDkuK3nmoTlvILmraUgbmFtZSBzbG90IHBhZ2VcbiAgICAgIGlmKGNoaWxkLmFzeW5jTWV0YSAmJiBjaGlsZC5hc3luY01ldGEuZGF0YSAmJiBjaGlsZC5hc3luY01ldGEuZGF0YS5zbG90ID09PSAncGFnZScpe1xuICAgICAgICAoc2xvdHNbJ3BhZ2UnXSB8fCAoc2xvdHNbJ3BhZ2UnXSA9IFtdKSkucHVzaChjaGlsZCk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgKHNsb3RzLmRlZmF1bHQgfHwgKHNsb3RzLmRlZmF1bHQgPSBbXSkpLnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBpZ25vcmUgc2xvdHMgdGhhdCBjb250YWlucyBvbmx5IHdoaXRlc3BhY2VcbiAgZm9yICh2YXIgbmFtZSQxIGluIHNsb3RzKSB7XG4gICAgaWYgKHNsb3RzW25hbWUkMV0uZXZlcnkoaXNXaGl0ZXNwYWNlKSkge1xuICAgICAgZGVsZXRlIHNsb3RzW25hbWUkMV07XG4gICAgfVxuICB9XG4gIHJldHVybiBzbG90c1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UgKG5vZGUpIHtcbiAgcmV0dXJuIChub2RlLmlzQ29tbWVudCAmJiAhbm9kZS5hc3luY0ZhY3RvcnkpIHx8IG5vZGUudGV4dCA9PT0gJyAnXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVTY29wZWRTbG90cyAoXG4gIHNsb3RzLFxuICBub3JtYWxTbG90cyxcbiAgcHJldlNsb3RzXG4pIHtcbiAgdmFyIHJlcztcbiAgdmFyIGhhc05vcm1hbFNsb3RzID0gT2JqZWN0LmtleXMobm9ybWFsU2xvdHMpLmxlbmd0aCA+IDA7XG4gIHZhciBpc1N0YWJsZSA9IHNsb3RzID8gISFzbG90cy4kc3RhYmxlIDogIWhhc05vcm1hbFNsb3RzO1xuICB2YXIga2V5ID0gc2xvdHMgJiYgc2xvdHMuJGtleTtcbiAgaWYgKCFzbG90cykge1xuICAgIHJlcyA9IHt9O1xuICB9IGVsc2UgaWYgKHNsb3RzLl9ub3JtYWxpemVkKSB7XG4gICAgLy8gZmFzdCBwYXRoIDE6IGNoaWxkIGNvbXBvbmVudCByZS1yZW5kZXIgb25seSwgcGFyZW50IGRpZCBub3QgY2hhbmdlXG4gICAgcmV0dXJuIHNsb3RzLl9ub3JtYWxpemVkXG4gIH0gZWxzZSBpZiAoXG4gICAgaXNTdGFibGUgJiZcbiAgICBwcmV2U2xvdHMgJiZcbiAgICBwcmV2U2xvdHMgIT09IGVtcHR5T2JqZWN0ICYmXG4gICAga2V5ID09PSBwcmV2U2xvdHMuJGtleSAmJlxuICAgICFoYXNOb3JtYWxTbG90cyAmJlxuICAgICFwcmV2U2xvdHMuJGhhc05vcm1hbFxuICApIHtcbiAgICAvLyBmYXN0IHBhdGggMjogc3RhYmxlIHNjb3BlZCBzbG90cyB3LyBubyBub3JtYWwgc2xvdHMgdG8gcHJveHksXG4gICAgLy8gb25seSBuZWVkIHRvIG5vcm1hbGl6ZSBvbmNlXG4gICAgcmV0dXJuIHByZXZTbG90c1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IHt9O1xuICAgIGZvciAodmFyIGtleSQxIGluIHNsb3RzKSB7XG4gICAgICBpZiAoc2xvdHNba2V5JDFdICYmIGtleSQxWzBdICE9PSAnJCcpIHtcbiAgICAgICAgcmVzW2tleSQxXSA9IG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSQxLCBzbG90c1trZXkkMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBleHBvc2Ugbm9ybWFsIHNsb3RzIG9uIHNjb3BlZFNsb3RzXG4gIGZvciAodmFyIGtleSQyIGluIG5vcm1hbFNsb3RzKSB7XG4gICAgaWYgKCEoa2V5JDIgaW4gcmVzKSkge1xuICAgICAgcmVzW2tleSQyXSA9IHByb3h5Tm9ybWFsU2xvdChub3JtYWxTbG90cywga2V5JDIpO1xuICAgIH1cbiAgfVxuICAvLyBhdm9yaWF6IHNlZW1zIHRvIG1vY2sgYSBub24tZXh0ZW5zaWJsZSAkc2NvcGVkU2xvdHMgb2JqZWN0XG4gIC8vIGFuZCB3aGVuIHRoYXQgaXMgcGFzc2VkIGRvd24gdGhpcyB3b3VsZCBjYXVzZSBhbiBlcnJvclxuICBpZiAoc2xvdHMgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShzbG90cykpIHtcbiAgICAoc2xvdHMpLl9ub3JtYWxpemVkID0gcmVzO1xuICB9XG4gIGRlZihyZXMsICckc3RhYmxlJywgaXNTdGFibGUpO1xuICBkZWYocmVzLCAnJGtleScsIGtleSk7XG4gIGRlZihyZXMsICckaGFzTm9ybWFsJywgaGFzTm9ybWFsU2xvdHMpO1xuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNjb3BlZFNsb3Qobm9ybWFsU2xvdHMsIGtleSwgZm4pIHtcbiAgdmFyIG5vcm1hbGl6ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlcyA9IGFyZ3VtZW50cy5sZW5ndGggPyBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpIDogZm4oe30pO1xuICAgIHJlcyA9IHJlcyAmJiB0eXBlb2YgcmVzID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXMpXG4gICAgICA/IFtyZXNdIC8vIHNpbmdsZSB2bm9kZVxuICAgICAgOiBub3JtYWxpemVDaGlsZHJlbihyZXMpO1xuICAgIHJldHVybiByZXMgJiYgKFxuICAgICAgcmVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKHJlcy5sZW5ndGggPT09IDEgJiYgcmVzWzBdLmlzQ29tbWVudCkgLy8gIzk2NThcbiAgICApID8gdW5kZWZpbmVkXG4gICAgICA6IHJlc1xuICB9O1xuICAvLyB0aGlzIGlzIGEgc2xvdCB1c2luZyB0aGUgbmV3IHYtc2xvdCBzeW50YXggd2l0aG91dCBzY29wZS4gYWx0aG91Z2ggaXQgaXNcbiAgLy8gY29tcGlsZWQgYXMgYSBzY29wZWQgc2xvdCwgcmVuZGVyIGZuIHVzZXJzIHdvdWxkIGV4cGVjdCBpdCB0byBiZSBwcmVzZW50XG4gIC8vIG9uIHRoaXMuJHNsb3RzIGJlY2F1c2UgdGhlIHVzYWdlIGlzIHNlbWFudGljYWxseSBhIG5vcm1hbCBzbG90LlxuICBpZiAoZm4ucHJveHkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobm9ybWFsU2xvdHMsIGtleSwge1xuICAgICAgZ2V0OiBub3JtYWxpemVkLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkXG59XG5cbmZ1bmN0aW9uIHByb3h5Tm9ybWFsU2xvdChzbG90cywga2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7IHJldHVybiBzbG90c1trZXldOyB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgdi1mb3IgbGlzdHMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlckxpc3QgKFxuICB2YWwsXG4gIHJlbmRlclxuKSB7XG4gIHZhciByZXQsIGksIGwsIGtleXMsIGtleTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwubGVuZ3RoKTtcbiAgICBmb3IgKGkgPSAwLCBsID0gdmFsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtpXSwgaSwgaSwgaSk7IC8vIGZpeGVkIGJ5IHh4eHh4eFxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwpO1xuICAgIGZvciAoaSA9IDA7IGkgPCB2YWw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpLCBpLCBpKTsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICBpZiAoaGFzU3ltYm9sICYmIHZhbFtTeW1ib2wuaXRlcmF0b3JdKSB7XG4gICAgICByZXQgPSBbXTtcbiAgICAgIHZhciBpdGVyYXRvciA9IHZhbFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICByZXQucHVzaChyZW5kZXIocmVzdWx0LnZhbHVlLCByZXQubGVuZ3RoLCBpLCBpKyspKTsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICByZXQgPSBuZXcgQXJyYXkoa2V5cy5sZW5ndGgpO1xuICAgICAgZm9yIChpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHJldFtpXSA9IHJlbmRlcih2YWxba2V5XSwga2V5LCBpLCBpKTsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghaXNEZWYocmV0KSkge1xuICAgIHJldCA9IFtdO1xuICB9XG4gIChyZXQpLl9pc1ZMaXN0ID0gdHJ1ZTtcbiAgcmV0dXJuIHJldFxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIDxzbG90PlxuICovXG5mdW5jdGlvbiByZW5kZXJTbG90IChcbiAgbmFtZSxcbiAgZmFsbGJhY2ssXG4gIHByb3BzLFxuICBiaW5kT2JqZWN0XG4pIHtcbiAgdmFyIHNjb3BlZFNsb3RGbiA9IHRoaXMuJHNjb3BlZFNsb3RzW25hbWVdO1xuICB2YXIgbm9kZXM7XG4gIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3RcbiAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChiaW5kT2JqZWN0KSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhaXNPYmplY3QoYmluZE9iamVjdCkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnc2xvdCB2LWJpbmQgd2l0aG91dCBhcmd1bWVudCBleHBlY3RzIGFuIE9iamVjdCcsXG4gICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcHJvcHMgPSBleHRlbmQoZXh0ZW5kKHt9LCBiaW5kT2JqZWN0KSwgcHJvcHMpO1xuICAgIH1cbiAgICAvLyBmaXhlZCBieSB4eHh4eHggYXBwLXBsdXMgc2NvcGVkU2xvdFxuICAgIG5vZGVzID0gc2NvcGVkU2xvdEZuKHByb3BzLCB0aGlzLCBwcm9wcy5faSkgfHwgZmFsbGJhY2s7XG4gIH0gZWxzZSB7XG4gICAgbm9kZXMgPSB0aGlzLiRzbG90c1tuYW1lXSB8fCBmYWxsYmFjaztcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSBwcm9wcyAmJiBwcm9wcy5zbG90O1xuICBpZiAodGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuJGNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJywgeyBzbG90OiB0YXJnZXQgfSwgbm9kZXMpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5vZGVzXG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWx0ZXIgKGlkKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzS2V5Tm90TWF0Y2ggKGV4cGVjdCwgYWN0dWFsKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGV4cGVjdCkpIHtcbiAgICByZXR1cm4gZXhwZWN0LmluZGV4T2YoYWN0dWFsKSA9PT0gLTFcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZXhwZWN0ICE9PSBhY3R1YWxcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBjaGVja2luZyBrZXlDb2RlcyBmcm9tIGNvbmZpZy5cbiAqIGV4cG9zZWQgYXMgVnVlLnByb3RvdHlwZS5fa1xuICogcGFzc2luZyBpbiBldmVudEtleU5hbWUgYXMgbGFzdCBhcmd1bWVudCBzZXBhcmF0ZWx5IGZvciBiYWNrd2FyZHMgY29tcGF0XG4gKi9cbmZ1bmN0aW9uIGNoZWNrS2V5Q29kZXMgKFxuICBldmVudEtleUNvZGUsXG4gIGtleSxcbiAgYnVpbHRJbktleUNvZGUsXG4gIGV2ZW50S2V5TmFtZSxcbiAgYnVpbHRJbktleU5hbWVcbikge1xuICB2YXIgbWFwcGVkS2V5Q29kZSA9IGNvbmZpZy5rZXlDb2Rlc1trZXldIHx8IGJ1aWx0SW5LZXlDb2RlO1xuICBpZiAoYnVpbHRJbktleU5hbWUgJiYgZXZlbnRLZXlOYW1lICYmICFjb25maWcua2V5Q29kZXNba2V5XSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKGJ1aWx0SW5LZXlOYW1lLCBldmVudEtleU5hbWUpXG4gIH0gZWxzZSBpZiAobWFwcGVkS2V5Q29kZSkge1xuICAgIHJldHVybiBpc0tleU5vdE1hdGNoKG1hcHBlZEtleUNvZGUsIGV2ZW50S2V5Q29kZSlcbiAgfSBlbHNlIGlmIChldmVudEtleU5hbWUpIHtcbiAgICByZXR1cm4gaHlwaGVuYXRlKGV2ZW50S2V5TmFtZSkgIT09IGtleVxuICB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBtZXJnaW5nIHYtYmluZD1cIm9iamVjdFwiIGludG8gYSBWTm9kZSdzIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoXG4gIGRhdGEsXG4gIHRhZyxcbiAgdmFsdWUsXG4gIGFzUHJvcCxcbiAgaXNTeW5jXG4pIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ3YtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IG9yIEFycmF5IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdG9PYmplY3QodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIGhhc2g7XG4gICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8XG4gICAgICAgICAga2V5ID09PSAnc3R5bGUnIHx8XG4gICAgICAgICAgaXNSZXNlcnZlZEF0dHJpYnV0ZShrZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGhhc2ggPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7XG4gICAgICAgICAgaGFzaCA9IGFzUHJvcCB8fCBjb25maWcubXVzdFVzZVByb3AodGFnLCB0eXBlLCBrZXkpXG4gICAgICAgICAgICA/IGRhdGEuZG9tUHJvcHMgfHwgKGRhdGEuZG9tUHJvcHMgPSB7fSlcbiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FtZWxpemVkS2V5ID0gY2FtZWxpemUoa2V5KTtcbiAgICAgICAgdmFyIGh5cGhlbmF0ZWRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgICAgaWYgKCEoY2FtZWxpemVkS2V5IGluIGhhc2gpICYmICEoaHlwaGVuYXRlZEtleSBpbiBoYXNoKSkge1xuICAgICAgICAgIGhhc2hba2V5XSA9IHZhbHVlW2tleV07XG5cbiAgICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgICB2YXIgb24gPSBkYXRhLm9uIHx8IChkYXRhLm9uID0ge30pO1xuICAgICAgICAgICAgb25bKFwidXBkYXRlOlwiICsga2V5KV0gPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgICAgICAgIHZhbHVlW2tleV0gPSAkZXZlbnQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHZhbHVlKSBsb29wKCBrZXkgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlbmRlcmluZyBzdGF0aWMgdHJlZXMuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclN0YXRpYyAoXG4gIGluZGV4LFxuICBpc0luRm9yXG4pIHtcbiAgdmFyIGNhY2hlZCA9IHRoaXMuX3N0YXRpY1RyZWVzIHx8ICh0aGlzLl9zdGF0aWNUcmVlcyA9IFtdKTtcbiAgdmFyIHRyZWUgPSBjYWNoZWRbaW5kZXhdO1xuICAvLyBpZiBoYXMgYWxyZWFkeS1yZW5kZXJlZCBzdGF0aWMgdHJlZSBhbmQgbm90IGluc2lkZSB2LWZvcixcbiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUuXG4gIGlmICh0cmVlICYmICFpc0luRm9yKSB7XG4gICAgcmV0dXJuIHRyZWVcbiAgfVxuICAvLyBvdGhlcndpc2UsIHJlbmRlciBhIGZyZXNoIHRyZWUuXG4gIHRyZWUgPSBjYWNoZWRbaW5kZXhdID0gdGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbaW5kZXhdLmNhbGwoXG4gICAgdGhpcy5fcmVuZGVyUHJveHksXG4gICAgbnVsbCxcbiAgICB0aGlzIC8vIGZvciByZW5kZXIgZm5zIGdlbmVyYXRlZCBmb3IgZnVuY3Rpb25hbCBjb21wb25lbnQgdGVtcGxhdGVzXG4gICk7XG4gIG1hcmtTdGF0aWModHJlZSwgKFwiX19zdGF0aWNfX1wiICsgaW5kZXgpLCBmYWxzZSk7XG4gIHJldHVybiB0cmVlXG59XG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHYtb25jZS5cbiAqIEVmZmVjdGl2ZWx5IGl0IG1lYW5zIG1hcmtpbmcgdGhlIG5vZGUgYXMgc3RhdGljIHdpdGggYSB1bmlxdWUga2V5LlxuICovXG5mdW5jdGlvbiBtYXJrT25jZSAoXG4gIHRyZWUsXG4gIGluZGV4LFxuICBrZXlcbikge1xuICBtYXJrU3RhdGljKHRyZWUsIChcIl9fb25jZV9fXCIgKyBpbmRleCArIChrZXkgPyAoXCJfXCIgKyBrZXkpIDogXCJcIikpLCB0cnVlKTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuZnVuY3Rpb24gbWFya1N0YXRpYyAoXG4gIHRyZWUsXG4gIGtleSxcbiAgaXNPbmNlXG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHJlZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyZWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmVlW2ldICYmIHR5cGVvZiB0cmVlW2ldICE9PSAnc3RyaW5nJykge1xuICAgICAgICBtYXJrU3RhdGljTm9kZSh0cmVlW2ldLCAoa2V5ICsgXCJfXCIgKyBpKSwgaXNPbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWFya1N0YXRpY05vZGUodHJlZSwga2V5LCBpc09uY2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtTdGF0aWNOb2RlIChub2RlLCBrZXksIGlzT25jZSkge1xuICBub2RlLmlzU3RhdGljID0gdHJ1ZTtcbiAgbm9kZS5rZXkgPSBrZXk7XG4gIG5vZGUuaXNPbmNlID0gaXNPbmNlO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gYmluZE9iamVjdExpc3RlbmVycyAoZGF0YSwgdmFsdWUpIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICAndi1vbiB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9uID0gZGF0YS5vbiA9IGRhdGEub24gPyBleHRlbmQoe30sIGRhdGEub24pIDoge307XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gb25ba2V5XTtcbiAgICAgICAgdmFyIG91cnMgPSB2YWx1ZVtrZXldO1xuICAgICAgICBvbltrZXldID0gZXhpc3RpbmcgPyBbXS5jb25jYXQoZXhpc3RpbmcsIG91cnMpIDogb3VycztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRTbG90cyAoXG4gIGZucywgLy8gc2VlIGZsb3cvdm5vZGVcbiAgcmVzLFxuICAvLyB0aGUgZm9sbG93aW5nIGFyZSBhZGRlZCBpbiAyLjZcbiAgaGFzRHluYW1pY0tleXMsXG4gIGNvbnRlbnRIYXNoS2V5XG4pIHtcbiAgcmVzID0gcmVzIHx8IHsgJHN0YWJsZTogIWhhc0R5bmFtaWNLZXlzIH07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZm5zLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNsb3QgPSBmbnNbaV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2xvdCkpIHtcbiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhzbG90LCByZXMsIGhhc0R5bmFtaWNLZXlzKTtcbiAgICB9IGVsc2UgaWYgKHNsb3QpIHtcbiAgICAgIC8vIG1hcmtlciBmb3IgcmV2ZXJzZSBwcm94eWluZyB2LXNsb3Qgd2l0aG91dCBzY29wZSBvbiB0aGlzLiRzbG90c1xuICAgICAgaWYgKHNsb3QucHJveHkpIHtcbiAgICAgICAgc2xvdC5mbi5wcm94eSA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXNbc2xvdC5rZXldID0gc2xvdC5mbjtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbnRlbnRIYXNoS2V5KSB7XG4gICAgKHJlcykuJGtleSA9IGNvbnRlbnRIYXNoS2V5O1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGJpbmREeW5hbWljS2V5cyAoYmFzZU9iaiwgdmFsdWVzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGtleSA9IHZhbHVlc1tpXTtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgJiYga2V5KSB7XG4gICAgICBiYXNlT2JqW3ZhbHVlc1tpXV0gPSB2YWx1ZXNbaSArIDFdO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBrZXkgIT09ICcnICYmIGtleSAhPT0gbnVsbCkge1xuICAgICAgLy8gbnVsbCBpcyBhIHNwZWNpYWwgdmFsdWUgZm9yIGV4cGxpY2l0bHkgcmVtb3ZpbmcgYSBiaW5kaW5nXG4gICAgICB3YXJuKFxuICAgICAgICAoXCJJbnZhbGlkIHZhbHVlIGZvciBkeW5hbWljIGRpcmVjdGl2ZSBhcmd1bWVudCAoZXhwZWN0ZWQgc3RyaW5nIG9yIG51bGwpOiBcIiArIGtleSksXG4gICAgICAgIHRoaXNcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBiYXNlT2JqXG59XG5cbi8vIGhlbHBlciB0byBkeW5hbWljYWxseSBhcHBlbmQgbW9kaWZpZXIgcnVudGltZSBtYXJrZXJzIHRvIGV2ZW50IG5hbWVzLlxuLy8gZW5zdXJlIG9ubHkgYXBwZW5kIHdoZW4gdmFsdWUgaXMgYWxyZWFkeSBzdHJpbmcsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGNhc3Rcbi8vIHRvIHN0cmluZyBhbmQgY2F1c2UgdGhlIHR5cGUgY2hlY2sgdG8gbWlzcy5cbmZ1bmN0aW9uIHByZXBlbmRNb2RpZmllciAodmFsdWUsIHN5bWJvbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHN5bWJvbCArIHZhbHVlIDogdmFsdWVcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluc3RhbGxSZW5kZXJIZWxwZXJzICh0YXJnZXQpIHtcbiAgdGFyZ2V0Ll9vID0gbWFya09uY2U7XG4gIHRhcmdldC5fbiA9IHRvTnVtYmVyO1xuICB0YXJnZXQuX3MgPSB0b1N0cmluZztcbiAgdGFyZ2V0Ll9sID0gcmVuZGVyTGlzdDtcbiAgdGFyZ2V0Ll90ID0gcmVuZGVyU2xvdDtcbiAgdGFyZ2V0Ll9xID0gbG9vc2VFcXVhbDtcbiAgdGFyZ2V0Ll9pID0gbG9vc2VJbmRleE9mO1xuICB0YXJnZXQuX20gPSByZW5kZXJTdGF0aWM7XG4gIHRhcmdldC5fZiA9IHJlc29sdmVGaWx0ZXI7XG4gIHRhcmdldC5fayA9IGNoZWNrS2V5Q29kZXM7XG4gIHRhcmdldC5fYiA9IGJpbmRPYmplY3RQcm9wcztcbiAgdGFyZ2V0Ll92ID0gY3JlYXRlVGV4dFZOb2RlO1xuICB0YXJnZXQuX2UgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICB0YXJnZXQuX3UgPSByZXNvbHZlU2NvcGVkU2xvdHM7XG4gIHRhcmdldC5fZyA9IGJpbmRPYmplY3RMaXN0ZW5lcnM7XG4gIHRhcmdldC5fZCA9IGJpbmREeW5hbWljS2V5cztcbiAgdGFyZ2V0Ll9wID0gcHJlcGVuZE1vZGlmaWVyO1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gRnVuY3Rpb25hbFJlbmRlckNvbnRleHQgKFxuICBkYXRhLFxuICBwcm9wcyxcbiAgY2hpbGRyZW4sXG4gIHBhcmVudCxcbiAgQ3RvclxuKSB7XG4gIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHZhciBvcHRpb25zID0gQ3Rvci5vcHRpb25zO1xuICAvLyBlbnN1cmUgdGhlIGNyZWF0ZUVsZW1lbnQgZnVuY3Rpb24gaW4gZnVuY3Rpb25hbCBjb21wb25lbnRzXG4gIC8vIGdldHMgYSB1bmlxdWUgY29udGV4dCAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0IG5hbWVkIHNsb3QgY2hlY2tcbiAgdmFyIGNvbnRleHRWbTtcbiAgaWYgKGhhc093bihwYXJlbnQsICdfdWlkJykpIHtcbiAgICBjb250ZXh0Vm0gPSBPYmplY3QuY3JlYXRlKHBhcmVudCk7XG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgY29udGV4dFZtLl9vcmlnaW5hbCA9IHBhcmVudDtcbiAgfSBlbHNlIHtcbiAgICAvLyB0aGUgY29udGV4dCB2bSBwYXNzZWQgaW4gaXMgYSBmdW5jdGlvbmFsIGNvbnRleHQgYXMgd2VsbC5cbiAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgYXJlIGFibGUgdG8gZ2V0IGEgaG9sZCB0byB0aGVcbiAgICAvLyByZWFsIGNvbnRleHQgaW5zdGFuY2UuXG4gICAgY29udGV4dFZtID0gcGFyZW50O1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHBhcmVudCA9IHBhcmVudC5fb3JpZ2luYWw7XG4gIH1cbiAgdmFyIGlzQ29tcGlsZWQgPSBpc1RydWUob3B0aW9ucy5fY29tcGlsZWQpO1xuICB2YXIgbmVlZE5vcm1hbGl6YXRpb24gPSAhaXNDb21waWxlZDtcblxuICB0aGlzLmRhdGEgPSBkYXRhO1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMubGlzdGVuZXJzID0gZGF0YS5vbiB8fCBlbXB0eU9iamVjdDtcbiAgdGhpcy5pbmplY3Rpb25zID0gcmVzb2x2ZUluamVjdChvcHRpb25zLmluamVjdCwgcGFyZW50KTtcbiAgdGhpcy5zbG90cyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMkMS4kc2xvdHMpIHtcbiAgICAgIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBkYXRhLnNjb3BlZFNsb3RzLFxuICAgICAgICB0aGlzJDEuJHNsb3RzID0gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBwYXJlbnQpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcyQxLiRzbG90c1xuICB9O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2NvcGVkU2xvdHMnLCAoe1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVNjb3BlZFNsb3RzKGRhdGEuc2NvcGVkU2xvdHMsIHRoaXMuc2xvdHMoKSlcbiAgICB9XG4gIH0pKTtcblxuICAvLyBzdXBwb3J0IGZvciBjb21waWxlZCBmdW5jdGlvbmFsIHRlbXBsYXRlXG4gIGlmIChpc0NvbXBpbGVkKSB7XG4gICAgLy8gZXhwb3NpbmcgJG9wdGlvbnMgZm9yIHJlbmRlclN0YXRpYygpXG4gICAgdGhpcy4kb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgLy8gcHJlLXJlc29sdmUgc2xvdHMgZm9yIHJlbmRlclNsb3QoKVxuICAgIHRoaXMuJHNsb3RzID0gdGhpcy5zbG90cygpO1xuICAgIHRoaXMuJHNjb3BlZFNsb3RzID0gbm9ybWFsaXplU2NvcGVkU2xvdHMoZGF0YS5zY29wZWRTbG90cywgdGhpcy4kc2xvdHMpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuX3Njb3BlSWQpIHtcbiAgICB0aGlzLl9jID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHtcbiAgICAgIHZhciB2bm9kZSA9IGNyZWF0ZUVsZW1lbnQoY29udGV4dFZtLCBhLCBiLCBjLCBkLCBuZWVkTm9ybWFsaXphdGlvbik7XG4gICAgICBpZiAodm5vZGUgJiYgIUFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHZub2RlLmZuU2NvcGVJZCA9IG9wdGlvbnMuX3Njb3BlSWQ7XG4gICAgICAgIHZub2RlLmZuQ29udGV4dCA9IHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2bm9kZVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fYyA9IGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7IHJldHVybiBjcmVhdGVFbGVtZW50KGNvbnRleHRWbSwgYSwgYiwgYywgZCwgbmVlZE5vcm1hbGl6YXRpb24pOyB9O1xuICB9XG59XG5cbmluc3RhbGxSZW5kZXJIZWxwZXJzKEZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0LnByb3RvdHlwZSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKFxuICBDdG9yLFxuICBwcm9wc0RhdGEsXG4gIGRhdGEsXG4gIGNvbnRleHRWbSxcbiAgY2hpbGRyZW5cbikge1xuICB2YXIgb3B0aW9ucyA9IEN0b3Iub3B0aW9ucztcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wT3B0aW9ucyA9IG9wdGlvbnMucHJvcHM7XG4gIGlmIChpc0RlZihwcm9wT3B0aW9ucykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHByb3BzW2tleV0gPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wT3B0aW9ucywgcHJvcHNEYXRhIHx8IGVtcHR5T2JqZWN0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVmKGRhdGEuYXR0cnMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEuYXR0cnMpOyB9XG4gICAgaWYgKGlzRGVmKGRhdGEucHJvcHMpKSB7IG1lcmdlUHJvcHMocHJvcHMsIGRhdGEucHJvcHMpOyB9XG4gIH1cblxuICB2YXIgcmVuZGVyQ29udGV4dCA9IG5ldyBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dChcbiAgICBkYXRhLFxuICAgIHByb3BzLFxuICAgIGNoaWxkcmVuLFxuICAgIGNvbnRleHRWbSxcbiAgICBDdG9yXG4gICk7XG5cbiAgdmFyIHZub2RlID0gb3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCByZW5kZXJDb250ZXh0Ll9jLCByZW5kZXJDb250ZXh0KTtcblxuICBpZiAodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkge1xuICAgIHJldHVybiBjbG9uZUFuZE1hcmtGdW5jdGlvbmFsUmVzdWx0KHZub2RlLCBkYXRhLCByZW5kZXJDb250ZXh0LnBhcmVudCwgb3B0aW9ucywgcmVuZGVyQ29udGV4dClcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZub2RlKSkge1xuICAgIHZhciB2bm9kZXMgPSBub3JtYWxpemVDaGlsZHJlbih2bm9kZSkgfHwgW107XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheSh2bm9kZXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW2ldID0gY2xvbmVBbmRNYXJrRnVuY3Rpb25hbFJlc3VsdCh2bm9kZXNbaV0sIGRhdGEsIHJlbmRlckNvbnRleHQucGFyZW50LCBvcHRpb25zLCByZW5kZXJDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsb25lQW5kTWFya0Z1bmN0aW9uYWxSZXN1bHQgKHZub2RlLCBkYXRhLCBjb250ZXh0Vm0sIG9wdGlvbnMsIHJlbmRlckNvbnRleHQpIHtcbiAgLy8gIzc4MTcgY2xvbmUgbm9kZSBiZWZvcmUgc2V0dGluZyBmbkNvbnRleHQsIG90aGVyd2lzZSBpZiB0aGUgbm9kZSBpcyByZXVzZWRcbiAgLy8gKGUuZy4gaXQgd2FzIGZyb20gYSBjYWNoZWQgbm9ybWFsIHNsb3QpIHRoZSBmbkNvbnRleHQgY2F1c2VzIG5hbWVkIHNsb3RzXG4gIC8vIHRoYXQgc2hvdWxkIG5vdCBiZSBtYXRjaGVkIHRvIG1hdGNoLlxuICB2YXIgY2xvbmUgPSBjbG9uZVZOb2RlKHZub2RlKTtcbiAgY2xvbmUuZm5Db250ZXh0ID0gY29udGV4dFZtO1xuICBjbG9uZS5mbk9wdGlvbnMgPSBvcHRpb25zO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIChjbG9uZS5kZXZ0b29sc01ldGEgPSBjbG9uZS5kZXZ0b29sc01ldGEgfHwge30pLnJlbmRlckNvbnRleHQgPSByZW5kZXJDb250ZXh0O1xuICB9XG4gIGlmIChkYXRhLnNsb3QpIHtcbiAgICAoY2xvbmUuZGF0YSB8fCAoY2xvbmUuZGF0YSA9IHt9KSkuc2xvdCA9IGRhdGEuc2xvdDtcbiAgfVxuICByZXR1cm4gY2xvbmVcbn1cblxuZnVuY3Rpb24gbWVyZ2VQcm9wcyAodG8sIGZyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIGZyb20pIHtcbiAgICB0b1tjYW1lbGl6ZShrZXkpXSA9IGZyb21ba2V5XTtcbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbi8qICAqL1xuXG4vKiAgKi9cblxuLy8gaW5saW5lIGhvb2tzIHRvIGJlIGludm9rZWQgb24gY29tcG9uZW50IFZOb2RlcyBkdXJpbmcgcGF0Y2hcbnZhciBjb21wb25lbnRWTm9kZUhvb2tzID0ge1xuICBpbml0OiBmdW5jdGlvbiBpbml0ICh2bm9kZSwgaHlkcmF0aW5nKSB7XG4gICAgaWYgKFxuICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgJiZcbiAgICAgICF2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQgJiZcbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlXG4gICAgKSB7XG4gICAgICAvLyBrZXB0LWFsaXZlIGNvbXBvbmVudHMsIHRyZWF0IGFzIGEgcGF0Y2hcbiAgICAgIHZhciBtb3VudGVkTm9kZSA9IHZub2RlOyAvLyB3b3JrIGFyb3VuZCBmbG93XG4gICAgICBjb21wb25lbnRWTm9kZUhvb2tzLnByZXBhdGNoKG1vdW50ZWROb2RlLCBtb3VudGVkTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGb3JWbm9kZShcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGFjdGl2ZUluc3RhbmNlXG4gICAgICApO1xuICAgICAgY2hpbGQuJG1vdW50KGh5ZHJhdGluZyA/IHZub2RlLmVsbSA6IHVuZGVmaW5lZCwgaHlkcmF0aW5nKTtcbiAgICB9XG4gIH0sXG5cbiAgcHJlcGF0Y2g6IGZ1bmN0aW9uIHByZXBhdGNoIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gICAgdmFyIGNoaWxkID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICB1cGRhdGVDaGlsZENvbXBvbmVudChcbiAgICAgIGNoaWxkLFxuICAgICAgb3B0aW9ucy5wcm9wc0RhdGEsIC8vIHVwZGF0ZWQgcHJvcHNcbiAgICAgIG9wdGlvbnMubGlzdGVuZXJzLCAvLyB1cGRhdGVkIGxpc3RlbmVyc1xuICAgICAgdm5vZGUsIC8vIG5ldyBwYXJlbnQgdm5vZGVcbiAgICAgIG9wdGlvbnMuY2hpbGRyZW4gLy8gbmV3IGNoaWxkcmVuXG4gICAgKTtcbiAgfSxcblxuICBpbnNlcnQ6IGZ1bmN0aW9uIGluc2VydCAodm5vZGUpIHtcbiAgICB2YXIgY29udGV4dCA9IHZub2RlLmNvbnRleHQ7XG4gICAgdmFyIGNvbXBvbmVudEluc3RhbmNlID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgaWYgKCFjb21wb25lbnRJbnN0YW5jZS5faXNNb3VudGVkKSB7XG4gICAgICBjYWxsSG9vayhjb21wb25lbnRJbnN0YW5jZSwgJ29uU2VydmljZUNyZWF0ZWQnKTtcbiAgICAgIGNhbGxIb29rKGNvbXBvbmVudEluc3RhbmNlLCAnb25TZXJ2aWNlQXR0YWNoZWQnKTtcbiAgICAgIGNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgY2FsbEhvb2soY29tcG9uZW50SW5zdGFuY2UsICdtb3VudGVkJyk7XG4gICAgfVxuICAgIGlmICh2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgaWYgKGNvbnRleHQuX2lzTW91bnRlZCkge1xuICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTJcbiAgICAgICAgLy8gRHVyaW5nIHVwZGF0ZXMsIGEga2VwdC1hbGl2ZSBjb21wb25lbnQncyBjaGlsZCBjb21wb25lbnRzIG1heVxuICAgICAgICAvLyBjaGFuZ2UsIHNvIGRpcmVjdGx5IHdhbGtpbmcgdGhlIHRyZWUgaGVyZSBtYXkgY2FsbCBhY3RpdmF0ZWQgaG9va3NcbiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbFxuICAgICAgICAvLyBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIHdob2xlIHBhdGNoIHByb2Nlc3MgZW5kZWQuXG4gICAgICAgIHF1ZXVlQWN0aXZhdGVkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UsIHRydWUgLyogZGlyZWN0ICovKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAoXG4gIEN0b3IsXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICB0YWdcbikge1xuICBpZiAoaXNVbmRlZihDdG9yKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGJhc2VDdG9yID0gY29udGV4dC4kb3B0aW9ucy5fYmFzZTtcblxuICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3JcbiAgaWYgKGlzT2JqZWN0KEN0b3IpKSB7XG4gICAgQ3RvciA9IGJhc2VDdG9yLmV4dGVuZChDdG9yKTtcbiAgfVxuXG4gIC8vIGlmIGF0IHRoaXMgc3RhZ2UgaXQncyBub3QgYSBjb25zdHJ1Y3RvciBvciBhbiBhc3luYyBjb21wb25lbnQgZmFjdG9yeSxcbiAgLy8gcmVqZWN0LlxuICBpZiAodHlwZW9mIEN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgd2FybigoXCJJbnZhbGlkIENvbXBvbmVudCBkZWZpbml0aW9uOiBcIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gYXN5bmMgY29tcG9uZW50XG4gIHZhciBhc3luY0ZhY3Rvcnk7XG4gIGlmIChpc1VuZGVmKEN0b3IuY2lkKSkge1xuICAgIGFzeW5jRmFjdG9yeSA9IEN0b3I7XG4gICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yKTtcbiAgICBpZiAoQ3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciBub2RlIGZvciBhc3luYyBjb21wb25lbnQsIHdoaWNoIGlzIHJlbmRlcmVkXG4gICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS5cbiAgICAgIC8vIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGFzeW5jIHNlcnZlci1yZW5kZXJpbmcgYW5kIGh5ZHJhdGlvbi5cbiAgICAgIHJldHVybiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyKFxuICAgICAgICBhc3luY0ZhY3RvcnksXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB0YWdcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBkYXRhID0gZGF0YSB8fCB7fTtcblxuICAvLyByZXNvbHZlIGNvbnN0cnVjdG9yIG9wdGlvbnMgaW4gY2FzZSBnbG9iYWwgbWl4aW5zIGFyZSBhcHBsaWVkIGFmdGVyXG4gIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvblxuICByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKEN0b3IpO1xuXG4gIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHNcbiAgaWYgKGlzRGVmKGRhdGEubW9kZWwpKSB7XG4gICAgdHJhbnNmb3JtTW9kZWwoQ3Rvci5vcHRpb25zLCBkYXRhKTtcbiAgfVxuXG4gIC8vIGV4dHJhY3QgcHJvcHNcbiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnLCBjb250ZXh0KTsgLy8gZml4ZWQgYnkgeHh4eHh4XG5cbiAgLy8gZnVuY3Rpb25hbCBjb21wb25lbnRcbiAgaWYgKGlzVHJ1ZShDdG9yLm9wdGlvbnMuZnVuY3Rpb25hbCkpIHtcbiAgICByZXR1cm4gY3JlYXRlRnVuY3Rpb25hbENvbXBvbmVudChDdG9yLCBwcm9wc0RhdGEsIGRhdGEsIGNvbnRleHQsIGNoaWxkcmVuKVxuICB9XG5cbiAgLy8gZXh0cmFjdCBsaXN0ZW5lcnMsIHNpbmNlIHRoZXNlIG5lZWRzIHRvIGJlIHRyZWF0ZWQgYXNcbiAgLy8gY2hpbGQgY29tcG9uZW50IGxpc3RlbmVycyBpbnN0ZWFkIG9mIERPTSBsaXN0ZW5lcnNcbiAgdmFyIGxpc3RlbmVycyA9IGRhdGEub247XG4gIC8vIHJlcGxhY2Ugd2l0aCBsaXN0ZW5lcnMgd2l0aCAubmF0aXZlIG1vZGlmaWVyXG4gIC8vIHNvIGl0IGdldHMgcHJvY2Vzc2VkIGR1cmluZyBwYXJlbnQgY29tcG9uZW50IHBhdGNoLlxuICBkYXRhLm9uID0gZGF0YS5uYXRpdmVPbjtcblxuICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5hYnN0cmFjdCkpIHtcbiAgICAvLyBhYnN0cmFjdCBjb21wb25lbnRzIGRvIG5vdCBrZWVwIGFueXRoaW5nXG4gICAgLy8gb3RoZXIgdGhhbiBwcm9wcyAmIGxpc3RlbmVycyAmIHNsb3RcblxuICAgIC8vIHdvcmsgYXJvdW5kIGZsb3dcbiAgICB2YXIgc2xvdCA9IGRhdGEuc2xvdDtcbiAgICBkYXRhID0ge307XG4gICAgaWYgKHNsb3QpIHtcbiAgICAgIGRhdGEuc2xvdCA9IHNsb3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gaW5zdGFsbCBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlXG4gIGluc3RhbGxDb21wb25lbnRIb29rcyhkYXRhKTtcblxuICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciB2bm9kZVxuICB2YXIgbmFtZSA9IEN0b3Iub3B0aW9ucy5uYW1lIHx8IHRhZztcbiAgdmFyIHZub2RlID0gbmV3IFZOb2RlKFxuICAgIChcInZ1ZS1jb21wb25lbnQtXCIgKyAoQ3Rvci5jaWQpICsgKG5hbWUgPyAoXCItXCIgKyBuYW1lKSA6ICcnKSksXG4gICAgZGF0YSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29udGV4dCxcbiAgICB7IEN0b3I6IEN0b3IsIHByb3BzRGF0YTogcHJvcHNEYXRhLCBsaXN0ZW5lcnM6IGxpc3RlbmVycywgdGFnOiB0YWcsIGNoaWxkcmVuOiBjaGlsZHJlbiB9LFxuICAgIGFzeW5jRmFjdG9yeVxuICApO1xuXG4gIHJldHVybiB2bm9kZVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRJbnN0YW5jZUZvclZub2RlIChcbiAgdm5vZGUsIC8vIHdlIGtub3cgaXQncyBNb3VudGVkQ29tcG9uZW50Vk5vZGUgYnV0IGZsb3cgZG9lc24ndFxuICBwYXJlbnQgLy8gYWN0aXZlSW5zdGFuY2UgaW4gbGlmZWN5Y2xlIHN0YXRlXG4pIHtcbiAgdmFyIG9wdGlvbnMgPSB7XG4gICAgX2lzQ29tcG9uZW50OiB0cnVlLFxuICAgIF9wYXJlbnRWbm9kZTogdm5vZGUsXG4gICAgcGFyZW50OiBwYXJlbnRcbiAgfTtcbiAgLy8gY2hlY2sgaW5saW5lLXRlbXBsYXRlIHJlbmRlciBmdW5jdGlvbnNcbiAgdmFyIGlubGluZVRlbXBsYXRlID0gdm5vZGUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtcbiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkge1xuICAgIG9wdGlvbnMucmVuZGVyID0gaW5saW5lVGVtcGxhdGUucmVuZGVyO1xuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gaW5saW5lVGVtcGxhdGUuc3RhdGljUmVuZGVyRm5zO1xuICB9XG4gIHJldHVybiBuZXcgdm5vZGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIGluc3RhbGxDb21wb25lbnRIb29rcyAoZGF0YSkge1xuICB2YXIgaG9va3MgPSBkYXRhLmhvb2sgfHwgKGRhdGEuaG9vayA9IHt9KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rc1RvTWVyZ2UubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gaG9va3NUb01lcmdlW2ldO1xuICAgIHZhciBleGlzdGluZyA9IGhvb2tzW2tleV07XG4gICAgdmFyIHRvTWVyZ2UgPSBjb21wb25lbnRWTm9kZUhvb2tzW2tleV07XG4gICAgaWYgKGV4aXN0aW5nICE9PSB0b01lcmdlICYmICEoZXhpc3RpbmcgJiYgZXhpc3RpbmcuX21lcmdlZCkpIHtcbiAgICAgIGhvb2tzW2tleV0gPSBleGlzdGluZyA/IG1lcmdlSG9vayQxKHRvTWVyZ2UsIGV4aXN0aW5nKSA6IHRvTWVyZ2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlSG9vayQxIChmMSwgZjIpIHtcbiAgdmFyIG1lcmdlZCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgLy8gZmxvdyBjb21wbGFpbnMgYWJvdXQgZXh0cmEgYXJncyB3aGljaCBpcyB3aHkgd2UgdXNlIGFueVxuICAgIGYxKGEsIGIpO1xuICAgIGYyKGEsIGIpO1xuICB9O1xuICBtZXJnZWQuX21lcmdlZCA9IHRydWU7XG4gIHJldHVybiBtZXJnZWRcbn1cblxuLy8gdHJhbnNmb3JtIGNvbXBvbmVudCB2LW1vZGVsIGluZm8gKHZhbHVlIGFuZCBjYWxsYmFjaykgaW50b1xuLy8gcHJvcCBhbmQgZXZlbnQgaGFuZGxlciByZXNwZWN0aXZlbHkuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Nb2RlbCAob3B0aW9ucywgZGF0YSkge1xuICB2YXIgcHJvcCA9IChvcHRpb25zLm1vZGVsICYmIG9wdGlvbnMubW9kZWwucHJvcCkgfHwgJ3ZhbHVlJztcbiAgdmFyIGV2ZW50ID0gKG9wdGlvbnMubW9kZWwgJiYgb3B0aW9ucy5tb2RlbC5ldmVudCkgfHwgJ2lucHV0J1xuICA7KGRhdGEuYXR0cnMgfHwgKGRhdGEuYXR0cnMgPSB7fSkpW3Byb3BdID0gZGF0YS5tb2RlbC52YWx1ZTtcbiAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTtcbiAgdmFyIGV4aXN0aW5nID0gb25bZXZlbnRdO1xuICB2YXIgY2FsbGJhY2sgPSBkYXRhLm1vZGVsLmNhbGxiYWNrO1xuICBpZiAoaXNEZWYoZXhpc3RpbmcpKSB7XG4gICAgaWYgKFxuICAgICAgQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyBleGlzdGluZy5pbmRleE9mKGNhbGxiYWNrKSA9PT0gLTFcbiAgICAgICAgOiBleGlzdGluZyAhPT0gY2FsbGJhY2tcbiAgICApIHtcbiAgICAgIG9uW2V2ZW50XSA9IFtjYWxsYmFja10uY29uY2F0KGV4aXN0aW5nKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb25bZXZlbnRdID0gY2FsbGJhY2s7XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBTSU1QTEVfTk9STUFMSVpFID0gMTtcbnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjtcblxuLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgcHJvdmlkaW5nIGEgbW9yZSBmbGV4aWJsZSBpbnRlcmZhY2Vcbi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvd1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCAoXG4gIGNvbnRleHQsXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIG5vcm1hbGl6YXRpb25UeXBlLFxuICBhbHdheXNOb3JtYWxpemVcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIG5vcm1hbGl6YXRpb25UeXBlID0gY2hpbGRyZW47XG4gICAgY2hpbGRyZW4gPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGlzVHJ1ZShhbHdheXNOb3JtYWxpemUpKSB7XG4gICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFO1xuICB9XG4gIHJldHVybiBfY3JlYXRlRWxlbWVudChjb250ZXh0LCB0YWcsIGRhdGEsIGNoaWxkcmVuLCBub3JtYWxpemF0aW9uVHlwZSlcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnQgKFxuICBjb250ZXh0LFxuICB0YWcsXG4gIGRhdGEsXG4gIGNoaWxkcmVuLFxuICBub3JtYWxpemF0aW9uVHlwZVxuKSB7XG4gIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiQXZvaWQgdXNpbmcgb2JzZXJ2ZWQgZGF0YSBvYmplY3QgYXMgdm5vZGUgZGF0YTogXCIgKyAoSlNPTi5zdHJpbmdpZnkoZGF0YSkpICsgXCJcXG5cIiArXG4gICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyBvYmplY3Qgc3ludGF4IGluIHYtYmluZFxuICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHtcbiAgICB0YWcgPSBkYXRhLmlzO1xuICB9XG4gIGlmICghdGFnKSB7XG4gICAgLy8gaW4gY2FzZSBvZiBjb21wb25lbnQgOmlzIHNldCB0byBmYWxzeSB2YWx1ZVxuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyB3YXJuIGFnYWluc3Qgbm9uLXByaW1pdGl2ZSBrZXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICBpc0RlZihkYXRhKSAmJiBpc0RlZihkYXRhLmtleSkgJiYgIWlzUHJpbWl0aXZlKGRhdGEua2V5KVxuICApIHtcbiAgICB7XG4gICAgICB3YXJuKFxuICAgICAgICAnQXZvaWQgdXNpbmcgbm9uLXByaW1pdGl2ZSB2YWx1ZSBhcyBrZXksICcgK1xuICAgICAgICAndXNlIHN0cmluZy9udW1iZXIgdmFsdWUgaW5zdGVhZC4nLFxuICAgICAgICBjb250ZXh0XG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvLyBzdXBwb3J0IHNpbmdsZSBmdW5jdGlvbiBjaGlsZHJlbiBhcyBkZWZhdWx0IHNjb3BlZCBzbG90XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJlxuICAgIHR5cGVvZiBjaGlsZHJlblswXSA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnNjb3BlZFNsb3RzID0geyBkZWZhdWx0OiBjaGlsZHJlblswXSB9O1xuICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6YXRpb25UeXBlID09PSBBTFdBWVNfTk9STUFMSVpFKSB7XG4gICAgY2hpbGRyZW4gPSBub3JtYWxpemVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHtcbiAgICBjaGlsZHJlbiA9IHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfVxuICB2YXIgdm5vZGUsIG5zO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgQ3RvcjtcbiAgICBucyA9IChjb250ZXh0LiR2bm9kZSAmJiBjb250ZXh0LiR2bm9kZS5ucykgfHwgY29uZmlnLmdldFRhZ05hbWVzcGFjZSh0YWcpO1xuICAgIGlmIChjb25maWcuaXNSZXNlcnZlZFRhZyh0YWcpKSB7XG4gICAgICAvLyBwbGF0Zm9ybSBidWlsdC1pbiBlbGVtZW50c1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5uYXRpdmVPbikpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJUaGUgLm5hdGl2ZSBtb2RpZmllciBmb3Igdi1vbiBpcyBvbmx5IHZhbGlkIG9uIGNvbXBvbmVudHMgYnV0IGl0IHdhcyB1c2VkIG9uIDxcIiArIHRhZyArIFwiPi5cIiksXG4gICAgICAgICAgY29udGV4dFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoXG4gICAgICAgIGNvbmZpZy5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0YWcpLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICgoIWRhdGEgfHwgIWRhdGEucHJlKSAmJiBpc0RlZihDdG9yID0gcmVzb2x2ZUFzc2V0KGNvbnRleHQuJG9wdGlvbnMsICdjb21wb25lbnRzJywgdGFnKSkpIHtcbiAgICAgIC8vIGNvbXBvbmVudFxuICAgICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQoQ3RvciwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4sIHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVua25vd24gb3IgdW5saXN0ZWQgbmFtZXNwYWNlZCBlbGVtZW50c1xuICAgICAgLy8gY2hlY2sgYXQgcnVudGltZSBiZWNhdXNlIGl0IG1heSBnZXQgYXNzaWduZWQgYSBuYW1lc3BhY2Ugd2hlbiBpdHNcbiAgICAgIC8vIHBhcmVudCBub3JtYWxpemVzIGNoaWxkcmVuXG4gICAgICB2bm9kZSA9IG5ldyBWTm9kZShcbiAgICAgICAgdGFnLCBkYXRhLCBjaGlsZHJlbixcbiAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHRcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIGRpcmVjdCBjb21wb25lbnQgb3B0aW9ucyAvIGNvbnN0cnVjdG9yXG4gICAgdm5vZGUgPSBjcmVhdGVDb21wb25lbnQodGFnLCBkYXRhLCBjb250ZXh0LCBjaGlsZHJlbik7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgcmV0dXJuIHZub2RlXG4gIH0gZWxzZSBpZiAoaXNEZWYodm5vZGUpKSB7XG4gICAgaWYgKGlzRGVmKG5zKSkgeyBhcHBseU5TKHZub2RlLCBucyk7IH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHsgcmVnaXN0ZXJEZWVwQmluZGluZ3MoZGF0YSk7IH1cbiAgICByZXR1cm4gdm5vZGVcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlRW1wdHlWTm9kZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gYXBwbHlOUyAodm5vZGUsIG5zLCBmb3JjZSkge1xuICB2bm9kZS5ucyA9IG5zO1xuICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyB1c2UgZGVmYXVsdCBuYW1lc3BhY2UgaW5zaWRlIGZvcmVpZ25PYmplY3RcbiAgICBucyA9IHVuZGVmaW5lZDtcbiAgICBmb3JjZSA9IHRydWU7XG4gIH1cbiAgaWYgKGlzRGVmKHZub2RlLmNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gdm5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSB2bm9kZS5jaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc0RlZihjaGlsZC50YWcpICYmIChcbiAgICAgICAgaXNVbmRlZihjaGlsZC5ucykgfHwgKGlzVHJ1ZShmb3JjZSkgJiYgY2hpbGQudGFnICE9PSAnc3ZnJykpKSB7XG4gICAgICAgIGFwcGx5TlMoY2hpbGQsIG5zLCBmb3JjZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIHJlZiAjNTMxOFxuLy8gbmVjZXNzYXJ5IHRvIGVuc3VyZSBwYXJlbnQgcmUtcmVuZGVyIHdoZW4gZGVlcCBiaW5kaW5ncyBsaWtlIDpzdHlsZSBhbmRcbi8vIDpjbGFzcyBhcmUgdXNlZCBvbiBzbG90IG5vZGVzXG5mdW5jdGlvbiByZWdpc3RlckRlZXBCaW5kaW5ncyAoZGF0YSkge1xuICBpZiAoaXNPYmplY3QoZGF0YS5zdHlsZSkpIHtcbiAgICB0cmF2ZXJzZShkYXRhLnN0eWxlKTtcbiAgfVxuICBpZiAoaXNPYmplY3QoZGF0YS5jbGFzcykpIHtcbiAgICB0cmF2ZXJzZShkYXRhLmNsYXNzKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHtcbiAgdm0uX3Zub2RlID0gbnVsbDsgLy8gdGhlIHJvb3Qgb2YgdGhlIGNoaWxkIHRyZWVcbiAgdm0uX3N0YXRpY1RyZWVzID0gbnVsbDsgLy8gdi1vbmNlIGNhY2hlZCB0cmVlc1xuICB2YXIgb3B0aW9ucyA9IHZtLiRvcHRpb25zO1xuICB2YXIgcGFyZW50Vm5vZGUgPSB2bS4kdm5vZGUgPSBvcHRpb25zLl9wYXJlbnRWbm9kZTsgLy8gdGhlIHBsYWNlaG9sZGVyIG5vZGUgaW4gcGFyZW50IHRyZWVcbiAgdmFyIHJlbmRlckNvbnRleHQgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5jb250ZXh0O1xuICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMob3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpO1xuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdDtcbiAgLy8gYmluZCB0aGUgY3JlYXRlRWxlbWVudCBmbiB0byB0aGlzIGluc3RhbmNlXG4gIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuXG4gIC8vIGFyZ3Mgb3JkZXI6IHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8gaW50ZXJuYWwgdmVyc2lvbiBpcyB1c2VkIGJ5IHJlbmRlciBmdW5jdGlvbnMgY29tcGlsZWQgZnJvbSB0ZW1wbGF0ZXNcbiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9O1xuICAvLyBub3JtYWxpemF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGZvciB0aGUgcHVibGljIHZlcnNpb24sIHVzZWQgaW5cbiAgLy8gdXNlci13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMuXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9O1xuXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMgYXJlIGV4cG9zZWQgZm9yIGVhc2llciBIT0MgY3JlYXRpb24uXG4gIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWRcbiAgdmFyIHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5kYXRhO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMgfHwgZW1wdHlPYmplY3QsIGZ1bmN0aW9uICgpIHtcbiAgICAgICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgJiYgd2FybihcIiRhdHRycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGxpc3RlbmVycycsIG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyB8fCBlbXB0eU9iamVjdCwgZnVuY3Rpb24gKCkge1xuICAgICAgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCAmJiB3YXJuKFwiJGxpc3RlbmVycyBpcyByZWFkb25seS5cIiwgdm0pO1xuICAgIH0sIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLmF0dHJzIHx8IGVtcHR5T2JqZWN0LCBudWxsLCB0cnVlKTtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMSh2bSwgJyRsaXN0ZW5lcnMnLCBvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3QsIG51bGwsIHRydWUpO1xuICB9XG59XG5cbnZhciBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2UgPSBudWxsO1xuXG5mdW5jdGlvbiByZW5kZXJNaXhpbiAoVnVlKSB7XG4gIC8vIGluc3RhbGwgcnVudGltZSBjb252ZW5pZW5jZSBoZWxwZXJzXG4gIGluc3RhbGxSZW5kZXJIZWxwZXJzKFZ1ZS5wcm90b3R5cGUpO1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24gKGZuKSB7XG4gICAgcmV0dXJuIG5leHRUaWNrKGZuLCB0aGlzKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX3JlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIHZhciByZWYgPSB2bS4kb3B0aW9ucztcbiAgICB2YXIgcmVuZGVyID0gcmVmLnJlbmRlcjtcbiAgICB2YXIgX3BhcmVudFZub2RlID0gcmVmLl9wYXJlbnRWbm9kZTtcblxuICAgIGlmIChfcGFyZW50Vm5vZGUpIHtcbiAgICAgIHZtLiRzY29wZWRTbG90cyA9IG5vcm1hbGl6ZVNjb3BlZFNsb3RzKFxuICAgICAgICBfcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyxcbiAgICAgICAgdm0uJHNsb3RzLFxuICAgICAgICB2bS4kc2NvcGVkU2xvdHNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gc2V0IHBhcmVudCB2bm9kZS4gdGhpcyBhbGxvd3MgcmVuZGVyIGZ1bmN0aW9ucyB0byBoYXZlIGFjY2Vzc1xuICAgIC8vIHRvIHRoZSBkYXRhIG9uIHRoZSBwbGFjZWhvbGRlciBub2RlLlxuICAgIHZtLiR2bm9kZSA9IF9wYXJlbnRWbm9kZTtcbiAgICAvLyByZW5kZXIgc2VsZlxuICAgIHZhciB2bm9kZTtcbiAgICB0cnkge1xuICAgICAgLy8gVGhlcmUncyBubyBuZWVkIHRvIG1haW50YWluIGEgc3RhY2sgYmVjYXVzZSBhbGwgcmVuZGVyIGZucyBhcmUgY2FsbGVkXG4gICAgICAvLyBzZXBhcmF0ZWx5IGZyb20gb25lIGFub3RoZXIuIE5lc3RlZCBjb21wb25lbnQncyByZW5kZXIgZm5zIGFyZSBjYWxsZWRcbiAgICAgIC8vIHdoZW4gcGFyZW50IGNvbXBvbmVudCBpcyBwYXRjaGVkLlxuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gdm07XG4gICAgICB2bm9kZSA9IHJlbmRlci5jYWxsKHZtLl9yZW5kZXJQcm94eSwgdm0uJGNyZWF0ZUVsZW1lbnQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlclwiKTtcbiAgICAgIC8vIHJldHVybiBlcnJvciByZW5kZXIgcmVzdWx0LFxuICAgICAgLy8gb3IgcHJldmlvdXMgdm5vZGUgdG8gcHJldmVudCByZW5kZXIgZXJyb3IgY2F1c2luZyBibGFuayBjb21wb25lbnRcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB2bS4kb3B0aW9ucy5yZW5kZXJFcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3IuY2FsbCh2bS5fcmVuZGVyUHJveHksIHZtLiRjcmVhdGVFbGVtZW50LCBlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcInJlbmRlckVycm9yXCIpO1xuICAgICAgICAgIHZub2RlID0gdm0uX3Zub2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bm9kZSA9IHZtLl92bm9kZTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFJlbmRlcmluZ0luc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gICAgLy8gaWYgdGhlIHJldHVybmVkIGFycmF5IGNvbnRhaW5zIG9ubHkgYSBzaW5nbGUgbm9kZSwgYWxsb3cgaXRcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2bm9kZSkgJiYgdm5vZGUubGVuZ3RoID09PSAxKSB7XG4gICAgICB2bm9kZSA9IHZub2RlWzBdO1xuICAgIH1cbiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0XG4gICAgaWYgKCEodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ011bHRpcGxlIHJvb3Qgbm9kZXMgcmV0dXJuZWQgZnJvbSByZW5kZXIgZnVuY3Rpb24uIFJlbmRlciBmdW5jdGlvbiAnICtcbiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBjcmVhdGVFbXB0eVZOb2RlKCk7XG4gICAgfVxuICAgIC8vIHNldCBwYXJlbnRcbiAgICB2bm9kZS5wYXJlbnQgPSBfcGFyZW50Vm5vZGU7XG4gICAgcmV0dXJuIHZub2RlXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBlbnN1cmVDdG9yIChjb21wLCBiYXNlKSB7XG4gIGlmIChcbiAgICBjb21wLl9fZXNNb2R1bGUgfHxcbiAgICAoaGFzU3ltYm9sICYmIGNvbXBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9PT0gJ01vZHVsZScpXG4gICkge1xuICAgIGNvbXAgPSBjb21wLmRlZmF1bHQ7XG4gIH1cbiAgcmV0dXJuIGlzT2JqZWN0KGNvbXApXG4gICAgPyBiYXNlLmV4dGVuZChjb21wKVxuICAgIDogY29tcFxufVxuXG5mdW5jdGlvbiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyIChcbiAgZmFjdG9yeSxcbiAgZGF0YSxcbiAgY29udGV4dCxcbiAgY2hpbGRyZW4sXG4gIHRhZ1xuKSB7XG4gIHZhciBub2RlID0gY3JlYXRlRW1wdHlWTm9kZSgpO1xuICBub2RlLmFzeW5jRmFjdG9yeSA9IGZhY3Rvcnk7XG4gIG5vZGUuYXN5bmNNZXRhID0geyBkYXRhOiBkYXRhLCBjb250ZXh0OiBjb250ZXh0LCBjaGlsZHJlbjogY2hpbGRyZW4sIHRhZzogdGFnIH07XG4gIHJldHVybiBub2RlXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBc3luY0NvbXBvbmVudCAoXG4gIGZhY3RvcnksXG4gIGJhc2VDdG9yXG4pIHtcbiAgaWYgKGlzVHJ1ZShmYWN0b3J5LmVycm9yKSAmJiBpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5lcnJvckNvbXBcbiAgfVxuXG4gIGlmIChpc0RlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgIHJldHVybiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cblxuICB2YXIgb3duZXIgPSBjdXJyZW50UmVuZGVyaW5nSW5zdGFuY2U7XG4gIGlmIChvd25lciAmJiBpc0RlZihmYWN0b3J5Lm93bmVycykgJiYgZmFjdG9yeS5vd25lcnMuaW5kZXhPZihvd25lcikgPT09IC0xKSB7XG4gICAgLy8gYWxyZWFkeSBwZW5kaW5nXG4gICAgZmFjdG9yeS5vd25lcnMucHVzaChvd25lcik7XG4gIH1cblxuICBpZiAoaXNUcnVlKGZhY3RvcnkubG9hZGluZykgJiYgaXNEZWYoZmFjdG9yeS5sb2FkaW5nQ29tcCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICB9XG5cbiAgaWYgKG93bmVyICYmICFpc0RlZihmYWN0b3J5Lm93bmVycykpIHtcbiAgICB2YXIgb3duZXJzID0gZmFjdG9yeS5vd25lcnMgPSBbb3duZXJdO1xuICAgIHZhciBzeW5jID0gdHJ1ZTtcbiAgICB2YXIgdGltZXJMb2FkaW5nID0gbnVsbDtcbiAgICB2YXIgdGltZXJUaW1lb3V0ID0gbnVsbFxuXG4gICAgOyhvd25lcikuJG9uKCdob29rOmRlc3Ryb3llZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlbW92ZShvd25lcnMsIG93bmVyKTsgfSk7XG5cbiAgICB2YXIgZm9yY2VSZW5kZXIgPSBmdW5jdGlvbiAocmVuZGVyQ29tcGxldGVkKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG93bmVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgKG93bmVyc1tpXSkuJGZvcmNlVXBkYXRlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZW5kZXJDb21wbGV0ZWQpIHtcbiAgICAgICAgb3duZXJzLmxlbmd0aCA9IDA7XG4gICAgICAgIGlmICh0aW1lckxvYWRpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJMb2FkaW5nKTtcbiAgICAgICAgICB0aW1lckxvYWRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lclRpbWVvdXQgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXJUaW1lb3V0KTtcbiAgICAgICAgICB0aW1lclRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciByZXNvbHZlID0gb25jZShmdW5jdGlvbiAocmVzKSB7XG4gICAgICAvLyBjYWNoZSByZXNvbHZlZFxuICAgICAgZmFjdG9yeS5yZXNvbHZlZCA9IGVuc3VyZUN0b3IocmVzLCBiYXNlQ3Rvcik7XG4gICAgICAvLyBpbnZva2UgY2FsbGJhY2tzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBzeW5jaHJvbm91cyByZXNvbHZlXG4gICAgICAvLyAoYXN5bmMgcmVzb2x2ZXMgYXJlIHNoaW1tZWQgYXMgc3luY2hyb25vdXMgZHVyaW5nIFNTUilcbiAgICAgIGlmICghc3luYykge1xuICAgICAgICBmb3JjZVJlbmRlcih0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG93bmVycy5sZW5ndGggPSAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlamVjdCA9IG9uY2UoZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB0byByZXNvbHZlIGFzeW5jIGNvbXBvbmVudDogXCIgKyAoU3RyaW5nKGZhY3RvcnkpKSArXG4gICAgICAgIChyZWFzb24gPyAoXCJcXG5SZWFzb246IFwiICsgcmVhc29uKSA6ICcnKVxuICAgICAgKTtcbiAgICAgIGlmIChpc0RlZihmYWN0b3J5LmVycm9yQ29tcCkpIHtcbiAgICAgICAgZmFjdG9yeS5lcnJvciA9IHRydWU7XG4gICAgICAgIGZvcmNlUmVuZGVyKHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgIGlmIChpc09iamVjdChyZXMpKSB7XG4gICAgICBpZiAoaXNQcm9taXNlKHJlcykpIHtcbiAgICAgICAgLy8gKCkgPT4gUHJvbWlzZVxuICAgICAgICBpZiAoaXNVbmRlZihmYWN0b3J5LnJlc29sdmVkKSkge1xuICAgICAgICAgIHJlcy50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNQcm9taXNlKHJlcy5jb21wb25lbnQpKSB7XG4gICAgICAgIHJlcy5jb21wb25lbnQudGhlbihyZXNvbHZlLCByZWplY3QpO1xuXG4gICAgICAgIGlmIChpc0RlZihyZXMuZXJyb3IpKSB7XG4gICAgICAgICAgZmFjdG9yeS5lcnJvckNvbXAgPSBlbnN1cmVDdG9yKHJlcy5lcnJvciwgYmFzZUN0b3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy5sb2FkaW5nKSkge1xuICAgICAgICAgIGZhY3RvcnkubG9hZGluZ0NvbXAgPSBlbnN1cmVDdG9yKHJlcy5sb2FkaW5nLCBiYXNlQ3Rvcik7XG4gICAgICAgICAgaWYgKHJlcy5kZWxheSA9PT0gMCkge1xuICAgICAgICAgICAgZmFjdG9yeS5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGltZXJMb2FkaW5nID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHRpbWVyTG9hZGluZyA9IG51bGw7XG4gICAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpICYmIGlzVW5kZWYoZmFjdG9yeS5lcnJvcikpIHtcbiAgICAgICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGZvcmNlUmVuZGVyKGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVzLmRlbGF5IHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy50aW1lb3V0KSkge1xuICAgICAgICAgIHRpbWVyVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGltZXJUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmKGZhY3RvcnkucmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nXG4gICAgICAgICAgICAgICAgICA/IChcInRpbWVvdXQgKFwiICsgKHJlcy50aW1lb3V0KSArIFwibXMpXCIpXG4gICAgICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCByZXMudGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzeW5jID0gZmFsc2U7XG4gICAgLy8gcmV0dXJuIGluIGNhc2UgcmVzb2x2ZWQgc3luY2hyb25vdXNseVxuICAgIHJldHVybiBmYWN0b3J5LmxvYWRpbmdcbiAgICAgID8gZmFjdG9yeS5sb2FkaW5nQ29tcFxuICAgICAgOiBmYWN0b3J5LnJlc29sdmVkXG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGlzQXN5bmNQbGFjZWhvbGRlciAobm9kZSkge1xuICByZXR1cm4gbm9kZS5pc0NvbW1lbnQgJiYgbm9kZS5hc3luY0ZhY3Rvcnlcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGdldEZpcnN0Q29tcG9uZW50Q2hpbGQgKGNoaWxkcmVuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoaXNEZWYoYykgJiYgKGlzRGVmKGMuY29tcG9uZW50T3B0aW9ucykgfHwgaXNBc3luY1BsYWNlaG9sZGVyKGMpKSkge1xuICAgICAgICByZXR1cm4gY1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRFdmVudHMgKHZtKSB7XG4gIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2bS5faGFzSG9va0V2ZW50ID0gZmFsc2U7XG4gIC8vIGluaXQgcGFyZW50IGF0dGFjaGVkIGV2ZW50c1xuICB2YXIgbGlzdGVuZXJzID0gdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztcbiAgaWYgKGxpc3RlbmVycykge1xuICAgIHVwZGF0ZUNvbXBvbmVudExpc3RlbmVycyh2bSwgbGlzdGVuZXJzKTtcbiAgfVxufVxuXG52YXIgdGFyZ2V0O1xuXG5mdW5jdGlvbiBhZGQgKGV2ZW50LCBmbikge1xuICB0YXJnZXQuJG9uKGV2ZW50LCBmbik7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHtcbiAgdGFyZ2V0LiRvZmYoZXZlbnQsIGZuKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlT25jZUhhbmRsZXIgKGV2ZW50LCBmbikge1xuICB2YXIgX3RhcmdldCA9IHRhcmdldDtcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uY2VIYW5kbGVyICgpIHtcbiAgICB2YXIgcmVzID0gZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICBfdGFyZ2V0LiRvZmYoZXZlbnQsIG9uY2VIYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzIChcbiAgdm0sXG4gIGxpc3RlbmVycyxcbiAgb2xkTGlzdGVuZXJzXG4pIHtcbiAgdGFyZ2V0ID0gdm07XG4gIHVwZGF0ZUxpc3RlbmVycyhsaXN0ZW5lcnMsIG9sZExpc3RlbmVycyB8fCB7fSwgYWRkLCByZW1vdmUkMSwgY3JlYXRlT25jZUhhbmRsZXIsIHZtKTtcbiAgdGFyZ2V0ID0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7XG4gIHZhciBob29rUkUgPSAvXmhvb2s6LztcbiAgVnVlLnByb3RvdHlwZS4kb24gPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShldmVudCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZtLiRvbihldmVudFtpXSwgZm4pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAodm0uX2V2ZW50c1tldmVudF0gfHwgKHZtLl9ldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGZuKTtcbiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBpbnN0ZWFkIG9mIGEgaGFzaCBsb29rdXBcbiAgICAgIGlmIChob29rUkUudGVzdChldmVudCkpIHtcbiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2bVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBmdW5jdGlvbiBvbiAoKSB7XG4gICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7XG4gICAgICBmbi5hcHBseSh2bSwgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgb24uZm4gPSBmbjtcbiAgICB2bS4kb24oZXZlbnQsIG9uKTtcbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRvZmYgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhbGxcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHZtLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgcmV0dXJuIHZtXG4gICAgfVxuICAgIC8vIGFycmF5IG9mIGV2ZW50c1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuICAgICAgZm9yICh2YXIgaSQxID0gMCwgbCA9IGV2ZW50Lmxlbmd0aDsgaSQxIDwgbDsgaSQxKyspIHtcbiAgICAgICAgdm0uJG9mZihldmVudFtpJDFdLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFjYnMpIHtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICBpZiAoIWZuKSB7XG4gICAgICB2bS5fZXZlbnRzW2V2ZW50XSA9IG51bGw7XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgaGFuZGxlclxuICAgIHZhciBjYjtcbiAgICB2YXIgaSA9IGNicy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY2IgPSBjYnNbaV07XG4gICAgICBpZiAoY2IgPT09IGZuIHx8IGNiLmZuID09PSBmbikge1xuICAgICAgICBjYnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRlbWl0ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGxvd2VyQ2FzZUV2ZW50ID0gZXZlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChsb3dlckNhc2VFdmVudCAhPT0gZXZlbnQgJiYgdm0uX2V2ZW50c1tsb3dlckNhc2VFdmVudF0pIHtcbiAgICAgICAgdGlwKFxuICAgICAgICAgIFwiRXZlbnQgXFxcIlwiICsgbG93ZXJDYXNlRXZlbnQgKyBcIlxcXCIgaXMgZW1pdHRlZCBpbiBjb21wb25lbnQgXCIgK1xuICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHZtKSkgKyBcIiBidXQgdGhlIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBmb3IgXFxcIlwiICsgZXZlbnQgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICBcIk5vdGUgdGhhdCBIVE1MIGF0dHJpYnV0ZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgYW5kIHlvdSBjYW5ub3QgdXNlIFwiICtcbiAgICAgICAgICBcInYtb24gdG8gbGlzdGVuIHRvIGNhbWVsQ2FzZSBldmVudHMgd2hlbiB1c2luZyBpbi1ET00gdGVtcGxhdGVzLiBcIiArXG4gICAgICAgICAgXCJZb3Ugc2hvdWxkIHByb2JhYmx5IHVzZSBcXFwiXCIgKyAoaHlwaGVuYXRlKGV2ZW50KSkgKyBcIlxcXCIgaW5zdGVhZCBvZiBcXFwiXCIgKyBldmVudCArIFwiXFxcIi5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKGNicykge1xuICAgICAgY2JzID0gY2JzLmxlbmd0aCA+IDEgPyB0b0FycmF5KGNicykgOiBjYnM7XG4gICAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICAgIHZhciBpbmZvID0gXCJldmVudCBoYW5kbGVyIGZvciBcXFwiXCIgKyBldmVudCArIFwiXFxcIlwiO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGNic1tpXSwgdm0sIGFyZ3MsIHZtLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG59XG5cbi8qICAqL1xuXG52YXIgYWN0aXZlSW5zdGFuY2UgPSBudWxsO1xudmFyIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBzZXRBY3RpdmVJbnN0YW5jZSh2bSkge1xuICB2YXIgcHJldkFjdGl2ZUluc3RhbmNlID0gYWN0aXZlSW5zdGFuY2U7XG4gIGFjdGl2ZUluc3RhbmNlID0gdm07XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgYWN0aXZlSW5zdGFuY2UgPSBwcmV2QWN0aXZlSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdExpZmVjeWNsZSAodm0pIHtcbiAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcblxuICAvLyBsb2NhdGUgZmlyc3Qgbm9uLWFic3RyYWN0IHBhcmVudFxuICB2YXIgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICB3aGlsZSAocGFyZW50LiRvcHRpb25zLmFic3RyYWN0ICYmIHBhcmVudC4kcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50LiRjaGlsZHJlbi5wdXNoKHZtKTtcbiAgfVxuXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnQ7XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm07XG5cbiAgdm0uJGNoaWxkcmVuID0gW107XG4gIHZtLiRyZWZzID0ge307XG5cbiAgdm0uX3dhdGNoZXIgPSBudWxsO1xuICB2bS5faW5hY3RpdmUgPSBudWxsO1xuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgdm0uX2lzTW91bnRlZCA9IGZhbHNlO1xuICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAodm5vZGUsIGh5ZHJhdGluZykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgdmFyIHByZXZFbCA9IHZtLiRlbDtcbiAgICB2YXIgcHJldlZub2RlID0gdm0uX3Zub2RlO1xuICAgIHZhciByZXN0b3JlQWN0aXZlSW5zdGFuY2UgPSBzZXRBY3RpdmVJbnN0YW5jZSh2bSk7XG4gICAgdm0uX3Zub2RlID0gdm5vZGU7XG4gICAgLy8gVnVlLnByb3RvdHlwZS5fX3BhdGNoX18gaXMgaW5qZWN0ZWQgaW4gZW50cnkgcG9pbnRzXG4gICAgLy8gYmFzZWQgb24gdGhlIHJlbmRlcmluZyBiYWNrZW5kIHVzZWQuXG4gICAgaWYgKCFwcmV2Vm5vZGUpIHtcbiAgICAgIC8vIGluaXRpYWwgcmVuZGVyXG4gICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18odm0uJGVsLCB2bm9kZSwgaHlkcmF0aW5nLCBmYWxzZSAvKiByZW1vdmVPbmx5ICovKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdXBkYXRlc1xuICAgICAgdm0uJGVsID0gdm0uX19wYXRjaF9fKHByZXZWbm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICByZXN0b3JlQWN0aXZlSW5zdGFuY2UoKTtcbiAgICAvLyB1cGRhdGUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAocHJldkVsKSB7XG4gICAgICBwcmV2RWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIGlmICh2bS4kZWwpIHtcbiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gdm07XG4gICAgfVxuICAgIC8vIGlmIHBhcmVudCBpcyBhbiBIT0MsIHVwZGF0ZSBpdHMgJGVsIGFzIHdlbGxcbiAgICBpZiAodm0uJHZub2RlICYmIHZtLiRwYXJlbnQgJiYgdm0uJHZub2RlID09PSB2bS4kcGFyZW50Ll92bm9kZSkge1xuICAgICAgdm0uJHBhcmVudC4kZWwgPSB2bS4kZWw7XG4gICAgfVxuICAgIC8vIHVwZGF0ZWQgaG9vayBpcyBjYWxsZWQgYnkgdGhlIHNjaGVkdWxlciB0byBlbnN1cmUgdGhhdCBjaGlsZHJlbiBhcmVcbiAgICAvLyB1cGRhdGVkIGluIGEgcGFyZW50J3MgdXBkYXRlZCBob29rLlxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJGZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci51cGRhdGUoKTtcbiAgICB9XG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmICh2bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlRGVzdHJveScpO1xuICAgIHZtLl9pc0JlaW5nRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyByZW1vdmUgc2VsZiBmcm9tIHBhcmVudFxuICAgIHZhciBwYXJlbnQgPSB2bS4kcGFyZW50O1xuICAgIGlmIChwYXJlbnQgJiYgIXBhcmVudC5faXNCZWluZ0Rlc3Ryb3llZCAmJiAhdm0uJG9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICAgIHJlbW92ZShwYXJlbnQuJGNoaWxkcmVuLCB2bSk7XG4gICAgfVxuICAgIC8vIHRlYXJkb3duIHdhdGNoZXJzXG4gICAgaWYgKHZtLl93YXRjaGVyKSB7XG4gICAgICB2bS5fd2F0Y2hlci50ZWFyZG93bigpO1xuICAgIH1cbiAgICB2YXIgaSA9IHZtLl93YXRjaGVycy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgdm0uX3dhdGNoZXJzW2ldLnRlYXJkb3duKCk7XG4gICAgfVxuICAgIC8vIHJlbW92ZSByZWZlcmVuY2UgZnJvbSBkYXRhIG9iXG4gICAgLy8gZnJvemVuIG9iamVjdCBtYXkgbm90IGhhdmUgb2JzZXJ2ZXIuXG4gICAgaWYgKHZtLl9kYXRhLl9fb2JfXykge1xuICAgICAgdm0uX2RhdGEuX19vYl9fLnZtQ291bnQtLTtcbiAgICB9XG4gICAgLy8gY2FsbCB0aGUgbGFzdCBob29rLi4uXG4gICAgdm0uX2lzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyBpbnZva2UgZGVzdHJveSBob29rcyBvbiBjdXJyZW50IHJlbmRlcmVkIHRyZWVcbiAgICB2bS5fX3BhdGNoX18odm0uX3Zub2RlLCBudWxsKTtcbiAgICAvLyBmaXJlIGRlc3Ryb3llZCBob29rXG4gICAgY2FsbEhvb2sodm0sICdkZXN0cm95ZWQnKTtcbiAgICAvLyB0dXJuIG9mZiBhbGwgaW5zdGFuY2UgbGlzdGVuZXJzLlxuICAgIHZtLiRvZmYoKTtcbiAgICAvLyByZW1vdmUgX192dWVfXyByZWZlcmVuY2VcbiAgICBpZiAodm0uJGVsKSB7XG4gICAgICB2bS4kZWwuX192dWVfXyA9IG51bGw7XG4gICAgfVxuICAgIC8vIHJlbGVhc2UgY2lyY3VsYXIgcmVmZXJlbmNlICgjNjc1OSlcbiAgICBpZiAodm0uJHZub2RlKSB7XG4gICAgICB2bS4kdm5vZGUucGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNoaWxkQ29tcG9uZW50IChcbiAgdm0sXG4gIHByb3BzRGF0YSxcbiAgbGlzdGVuZXJzLFxuICBwYXJlbnRWbm9kZSxcbiAgcmVuZGVyQ2hpbGRyZW5cbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IHRydWU7XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgd2hldGhlciBjb21wb25lbnQgaGFzIHNsb3QgY2hpbGRyZW5cbiAgLy8gd2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSBvdmVyd3JpdGluZyAkb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4uXG5cbiAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGR5bmFtaWMgc2NvcGVkU2xvdHMgKGhhbmQtd3JpdHRlbiBvciBjb21waWxlZCBidXQgd2l0aFxuICAvLyBkeW5hbWljIHNsb3QgbmFtZXMpLiBTdGF0aWMgc2NvcGVkIHNsb3RzIGNvbXBpbGVkIGZyb20gdGVtcGxhdGUgaGFzIHRoZVxuICAvLyBcIiRzdGFibGVcIiBtYXJrZXIuXG4gIHZhciBuZXdTY29wZWRTbG90cyA9IHBhcmVudFZub2RlLmRhdGEuc2NvcGVkU2xvdHM7XG4gIHZhciBvbGRTY29wZWRTbG90cyA9IHZtLiRzY29wZWRTbG90cztcbiAgdmFyIGhhc0R5bmFtaWNTY29wZWRTbG90ID0gISEoXG4gICAgKG5ld1Njb3BlZFNsb3RzICYmICFuZXdTY29wZWRTbG90cy4kc3RhYmxlKSB8fFxuICAgIChvbGRTY29wZWRTbG90cyAhPT0gZW1wdHlPYmplY3QgJiYgIW9sZFNjb3BlZFNsb3RzLiRzdGFibGUpIHx8XG4gICAgKG5ld1Njb3BlZFNsb3RzICYmIHZtLiRzY29wZWRTbG90cy4ka2V5ICE9PSBuZXdTY29wZWRTbG90cy4ka2V5KVxuICApO1xuXG4gIC8vIEFueSBzdGF0aWMgc2xvdCBjaGlsZHJlbiBmcm9tIHRoZSBwYXJlbnQgbWF5IGhhdmUgY2hhbmdlZCBkdXJpbmcgcGFyZW50J3NcbiAgLy8gdXBkYXRlLiBEeW5hbWljIHNjb3BlZCBzbG90cyBtYXkgYWxzbyBoYXZlIGNoYW5nZWQuIEluIHN1Y2ggY2FzZXMsIGEgZm9yY2VkXG4gIC8vIHVwZGF0ZSBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIGNvcnJlY3RuZXNzLlxuICB2YXIgbmVlZHNGb3JjZVVwZGF0ZSA9ICEhKFxuICAgIHJlbmRlckNoaWxkcmVuIHx8ICAgICAgICAgICAgICAgLy8gaGFzIG5ldyBzdGF0aWMgc2xvdHNcbiAgICB2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4gfHwgIC8vIGhhcyBvbGQgc3RhdGljIHNsb3RzXG4gICAgaGFzRHluYW1pY1Njb3BlZFNsb3RcbiAgKTtcblxuICB2bS4kb3B0aW9ucy5fcGFyZW50Vm5vZGUgPSBwYXJlbnRWbm9kZTtcbiAgdm0uJHZub2RlID0gcGFyZW50Vm5vZGU7IC8vIHVwZGF0ZSB2bSdzIHBsYWNlaG9sZGVyIG5vZGUgd2l0aG91dCByZS1yZW5kZXJcblxuICBpZiAodm0uX3Zub2RlKSB7IC8vIHVwZGF0ZSBjaGlsZCB0cmVlJ3MgcGFyZW50XG4gICAgdm0uX3Zub2RlLnBhcmVudCA9IHBhcmVudFZub2RlO1xuICB9XG4gIHZtLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbiA9IHJlbmRlckNoaWxkcmVuO1xuXG4gIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5lcnMgaGFzaFxuICAvLyB0aGVzZSBhcmUgYWxzbyByZWFjdGl2ZSBzbyB0aGV5IG1heSB0cmlnZ2VyIGNoaWxkIHVwZGF0ZSBpZiB0aGUgY2hpbGRcbiAgLy8gdXNlZCB0aGVtIGR1cmluZyByZW5kZXJcbiAgdm0uJGF0dHJzID0gcGFyZW50Vm5vZGUuZGF0YS5hdHRycyB8fCBlbXB0eU9iamVjdDtcbiAgdm0uJGxpc3RlbmVycyA9IGxpc3RlbmVycyB8fCBlbXB0eU9iamVjdDtcblxuICAvLyB1cGRhdGUgcHJvcHNcbiAgaWYgKHByb3BzRGF0YSAmJiB2bS4kb3B0aW9ucy5wcm9wcykge1xuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7XG4gICAgdmFyIHByb3BzID0gdm0uX3Byb3BzO1xuICAgIHZhciBwcm9wS2V5cyA9IHZtLiRvcHRpb25zLl9wcm9wS2V5cyB8fCBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gcHJvcEtleXNbaV07XG4gICAgICB2YXIgcHJvcE9wdGlvbnMgPSB2bS4kb3B0aW9ucy5wcm9wczsgLy8gd3RmIGZsb3c/XG4gICAgICBwcm9wc1trZXldID0gdmFsaWRhdGVQcm9wKGtleSwgcHJvcE9wdGlvbnMsIHByb3BzRGF0YSwgdm0pO1xuICAgIH1cbiAgICB0b2dnbGVPYnNlcnZpbmcodHJ1ZSk7XG4gICAgLy8ga2VlcCBhIGNvcHkgb2YgcmF3IHByb3BzRGF0YVxuICAgIHZtLiRvcHRpb25zLnByb3BzRGF0YSA9IHByb3BzRGF0YTtcbiAgfVxuICBcbiAgLy8gZml4ZWQgYnkgeHh4eHh4IHVwZGF0ZSBwcm9wZXJ0aWVzKG1wIHJ1bnRpbWUpXG4gIHZtLl8kdXBkYXRlUHJvcGVydGllcyAmJiB2bS5fJHVwZGF0ZVByb3BlcnRpZXModm0pO1xuICBcbiAgLy8gdXBkYXRlIGxpc3RlbmVyc1xuICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMgfHwgZW1wdHlPYmplY3Q7XG4gIHZhciBvbGRMaXN0ZW5lcnMgPSB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzO1xuICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTtcblxuICAvLyByZXNvbHZlIHNsb3RzICsgZm9yY2UgdXBkYXRlIGlmIGhhcyBjaGlsZHJlblxuICBpZiAobmVlZHNGb3JjZVVwZGF0ZSkge1xuICAgIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyhyZW5kZXJDaGlsZHJlbiwgcGFyZW50Vm5vZGUuY29udGV4dCk7XG4gICAgdm0uJGZvcmNlVXBkYXRlKCk7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSW5JbmFjdGl2ZVRyZWUgKHZtKSB7XG4gIHdoaWxlICh2bSAmJiAodm0gPSB2bS4kcGFyZW50KSkge1xuICAgIGlmICh2bS5faW5hY3RpdmUpIHsgcmV0dXJuIHRydWUgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50ICh2bSwgZGlyZWN0KSB7XG4gIGlmIChkaXJlY3QpIHtcbiAgICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfSBlbHNlIGlmICh2bS5fZGlyZWN0SW5hY3RpdmUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodm0uX2luYWN0aXZlIHx8IHZtLl9pbmFjdGl2ZSA9PT0gbnVsbCkge1xuICAgIHZtLl9pbmFjdGl2ZSA9IGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdm0uJGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnYWN0aXZhdGVkJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50ICh2bSwgZGlyZWN0KSB7XG4gIGlmIChkaXJlY3QpIHtcbiAgICB2bS5fZGlyZWN0SW5hY3RpdmUgPSB0cnVlO1xuICAgIGlmIChpc0luSW5hY3RpdmVUcmVlKHZtKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG4gIGlmICghdm0uX2luYWN0aXZlKSB7XG4gICAgdm0uX2luYWN0aXZlID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZtLiRjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHZtLiRjaGlsZHJlbltpXSk7XG4gICAgfVxuICAgIGNhbGxIb29rKHZtLCAnZGVhY3RpdmF0ZWQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsSG9vayAodm0sIGhvb2spIHtcbiAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGxpZmVjeWNsZSBob29rc1xuICBwdXNoVGFyZ2V0KCk7XG4gIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdO1xuICB2YXIgaW5mbyA9IGhvb2sgKyBcIiBob29rXCI7XG4gIGlmIChoYW5kbGVycykge1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICBpbnZva2VXaXRoRXJyb3JIYW5kbGluZyhoYW5kbGVyc1tpXSwgdm0sIG51bGwsIHZtLCBpbmZvKTtcbiAgICB9XG4gIH1cbiAgaWYgKHZtLl9oYXNIb29rRXZlbnQpIHtcbiAgICB2bS4kZW1pdCgnaG9vazonICsgaG9vayk7XG4gIH1cbiAgcG9wVGFyZ2V0KCk7XG59XG5cbi8qICAqL1xuXG52YXIgTUFYX1VQREFURV9DT1VOVCA9IDEwMDtcblxudmFyIHF1ZXVlID0gW107XG52YXIgYWN0aXZhdGVkQ2hpbGRyZW4gPSBbXTtcbnZhciBoYXMgPSB7fTtcbnZhciBjaXJjdWxhciA9IHt9O1xudmFyIHdhaXRpbmcgPSBmYWxzZTtcbnZhciBmbHVzaGluZyA9IGZhbHNlO1xudmFyIGluZGV4ID0gMDtcblxuLyoqXG4gKiBSZXNldCB0aGUgc2NoZWR1bGVyJ3Mgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkge1xuICBpbmRleCA9IHF1ZXVlLmxlbmd0aCA9IGFjdGl2YXRlZENoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIGhhcyA9IHt9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNpcmN1bGFyID0ge307XG4gIH1cbiAgd2FpdGluZyA9IGZsdXNoaW5nID0gZmFsc2U7XG59XG5cbi8vIEFzeW5jIGVkZ2UgY2FzZSAjNjU2NiByZXF1aXJlcyBzYXZpbmcgdGhlIHRpbWVzdGFtcCB3aGVuIGV2ZW50IGxpc3RlbmVycyBhcmVcbi8vIGF0dGFjaGVkLiBIb3dldmVyLCBjYWxsaW5nIHBlcmZvcm1hbmNlLm5vdygpIGhhcyBhIHBlcmYgb3ZlcmhlYWQgZXNwZWNpYWxseVxuLy8gaWYgdGhlIHBhZ2UgaGFzIHRob3VzYW5kcyBvZiBldmVudCBsaXN0ZW5lcnMuIEluc3RlYWQsIHdlIHRha2UgYSB0aW1lc3RhbXBcbi8vIGV2ZXJ5IHRpbWUgdGhlIHNjaGVkdWxlciBmbHVzaGVzIGFuZCB1c2UgdGhhdCBmb3IgYWxsIGV2ZW50IGxpc3RlbmVyc1xuLy8gYXR0YWNoZWQgZHVyaW5nIHRoYXQgZmx1c2guXG52YXIgY3VycmVudEZsdXNoVGltZXN0YW1wID0gMDtcblxuLy8gQXN5bmMgZWRnZSBjYXNlIGZpeCByZXF1aXJlcyBzdG9yaW5nIGFuIGV2ZW50IGxpc3RlbmVyJ3MgYXR0YWNoIHRpbWVzdGFtcC5cbnZhciBnZXROb3cgPSBEYXRlLm5vdztcblxuLy8gRGV0ZXJtaW5lIHdoYXQgZXZlbnQgdGltZXN0YW1wIHRoZSBicm93c2VyIGlzIHVzaW5nLiBBbm5veWluZ2x5LCB0aGVcbi8vIHRpbWVzdGFtcCBjYW4gZWl0aGVyIGJlIGhpLXJlcyAocmVsYXRpdmUgdG8gcGFnZSBsb2FkKSBvciBsb3ctcmVzXG4vLyAocmVsYXRpdmUgdG8gVU5JWCBlcG9jaCksIHNvIGluIG9yZGVyIHRvIGNvbXBhcmUgdGltZSB3ZSBoYXZlIHRvIHVzZSB0aGVcbi8vIHNhbWUgdGltZXN0YW1wIHR5cGUgd2hlbiBzYXZpbmcgdGhlIGZsdXNoIHRpbWVzdGFtcC5cbi8vIEFsbCBJRSB2ZXJzaW9ucyB1c2UgbG93LXJlcyBldmVudCB0aW1lc3RhbXBzLCBhbmQgaGF2ZSBwcm9ibGVtYXRpYyBjbG9ja1xuLy8gaW1wbGVtZW50YXRpb25zICgjOTYzMilcbmlmIChpbkJyb3dzZXIgJiYgIWlzSUUpIHtcbiAgdmFyIHBlcmZvcm1hbmNlID0gd2luZG93LnBlcmZvcm1hbmNlO1xuICBpZiAoXG4gICAgcGVyZm9ybWFuY2UgJiZcbiAgICB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nICYmXG4gICAgZ2V0Tm93KCkgPiBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKS50aW1lU3RhbXBcbiAgKSB7XG4gICAgLy8gaWYgdGhlIGV2ZW50IHRpbWVzdGFtcCwgYWx0aG91Z2ggZXZhbHVhdGVkIEFGVEVSIHRoZSBEYXRlLm5vdygpLCBpc1xuICAgIC8vIHNtYWxsZXIgdGhhbiBpdCwgaXQgbWVhbnMgdGhlIGV2ZW50IGlzIHVzaW5nIGEgaGktcmVzIHRpbWVzdGFtcCxcbiAgICAvLyBhbmQgd2UgbmVlZCB0byB1c2UgdGhlIGhpLXJlcyB2ZXJzaW9uIGZvciBldmVudCBsaXN0ZW5lciB0aW1lc3RhbXBzIGFzXG4gICAgLy8gd2VsbC5cbiAgICBnZXROb3cgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTsgfTtcbiAgfVxufVxuXG4vKipcbiAqIEZsdXNoIGJvdGggcXVldWVzIGFuZCBydW4gdGhlIHdhdGNoZXJzLlxuICovXG5mdW5jdGlvbiBmbHVzaFNjaGVkdWxlclF1ZXVlICgpIHtcbiAgY3VycmVudEZsdXNoVGltZXN0YW1wID0gZ2V0Tm93KCk7XG4gIGZsdXNoaW5nID0gdHJ1ZTtcbiAgdmFyIHdhdGNoZXIsIGlkO1xuXG4gIC8vIFNvcnQgcXVldWUgYmVmb3JlIGZsdXNoLlxuICAvLyBUaGlzIGVuc3VyZXMgdGhhdDpcbiAgLy8gMS4gQ29tcG9uZW50cyBhcmUgdXBkYXRlZCBmcm9tIHBhcmVudCB0byBjaGlsZC4gKGJlY2F1c2UgcGFyZW50IGlzIGFsd2F5c1xuICAvLyAgICBjcmVhdGVkIGJlZm9yZSB0aGUgY2hpbGQpXG4gIC8vIDIuIEEgY29tcG9uZW50J3MgdXNlciB3YXRjaGVycyBhcmUgcnVuIGJlZm9yZSBpdHMgcmVuZGVyIHdhdGNoZXIgKGJlY2F1c2VcbiAgLy8gICAgdXNlciB3YXRjaGVycyBhcmUgY3JlYXRlZCBiZWZvcmUgdGhlIHJlbmRlciB3YXRjaGVyKVxuICAvLyAzLiBJZiBhIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQgZHVyaW5nIGEgcGFyZW50IGNvbXBvbmVudCdzIHdhdGNoZXIgcnVuLFxuICAvLyAgICBpdHMgd2F0Y2hlcnMgY2FuIGJlIHNraXBwZWQuXG4gIHF1ZXVlLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuaWQgLSBiLmlkOyB9KTtcblxuICAvLyBkbyBub3QgY2FjaGUgbGVuZ3RoIGJlY2F1c2UgbW9yZSB3YXRjaGVycyBtaWdodCBiZSBwdXNoZWRcbiAgLy8gYXMgd2UgcnVuIGV4aXN0aW5nIHdhdGNoZXJzXG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHF1ZXVlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHdhdGNoZXIgPSBxdWV1ZVtpbmRleF07XG4gICAgaWYgKHdhdGNoZXIuYmVmb3JlKSB7XG4gICAgICB3YXRjaGVyLmJlZm9yZSgpO1xuICAgIH1cbiAgICBpZCA9IHdhdGNoZXIuaWQ7XG4gICAgaGFzW2lkXSA9IG51bGw7XG4gICAgd2F0Y2hlci5ydW4oKTtcbiAgICAvLyBpbiBkZXYgYnVpbGQsIGNoZWNrIGFuZCBzdG9wIGNpcmN1bGFyIHVwZGF0ZXMuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaGFzW2lkXSAhPSBudWxsKSB7XG4gICAgICBjaXJjdWxhcltpZF0gPSAoY2lyY3VsYXJbaWRdIHx8IDApICsgMTtcbiAgICAgIGlmIChjaXJjdWxhcltpZF0gPiBNQVhfVVBEQVRFX0NPVU5UKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ1lvdSBtYXkgaGF2ZSBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcCAnICsgKFxuICAgICAgICAgICAgd2F0Y2hlci51c2VyXG4gICAgICAgICAgICAgID8gKFwiaW4gd2F0Y2hlciB3aXRoIGV4cHJlc3Npb24gXFxcIlwiICsgKHdhdGNoZXIuZXhwcmVzc2lvbikgKyBcIlxcXCJcIilcbiAgICAgICAgICAgICAgOiBcImluIGEgY29tcG9uZW50IHJlbmRlciBmdW5jdGlvbi5cIlxuICAgICAgICAgICksXG4gICAgICAgICAgd2F0Y2hlci52bVxuICAgICAgICApO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGtlZXAgY29waWVzIG9mIHBvc3QgcXVldWVzIGJlZm9yZSByZXNldHRpbmcgc3RhdGVcbiAgdmFyIGFjdGl2YXRlZFF1ZXVlID0gYWN0aXZhdGVkQ2hpbGRyZW4uc2xpY2UoKTtcbiAgdmFyIHVwZGF0ZWRRdWV1ZSA9IHF1ZXVlLnNsaWNlKCk7XG5cbiAgcmVzZXRTY2hlZHVsZXJTdGF0ZSgpO1xuXG4gIC8vIGNhbGwgY29tcG9uZW50IHVwZGF0ZWQgYW5kIGFjdGl2YXRlZCBob29rc1xuICBjYWxsQWN0aXZhdGVkSG9va3MoYWN0aXZhdGVkUXVldWUpO1xuICBjYWxsVXBkYXRlZEhvb2tzKHVwZGF0ZWRRdWV1ZSk7XG5cbiAgLy8gZGV2dG9vbCBob29rXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoZGV2dG9vbHMgJiYgY29uZmlnLmRldnRvb2xzKSB7XG4gICAgZGV2dG9vbHMuZW1pdCgnZmx1c2gnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsVXBkYXRlZEhvb2tzIChxdWV1ZSkge1xuICB2YXIgaSA9IHF1ZXVlLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciB3YXRjaGVyID0gcXVldWVbaV07XG4gICAgdmFyIHZtID0gd2F0Y2hlci52bTtcbiAgICBpZiAodm0uX3dhdGNoZXIgPT09IHdhdGNoZXIgJiYgdm0uX2lzTW91bnRlZCAmJiAhdm0uX2lzRGVzdHJveWVkKSB7XG4gICAgICBjYWxsSG9vayh2bSwgJ3VwZGF0ZWQnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBRdWV1ZSBhIGtlcHQtYWxpdmUgY29tcG9uZW50IHRoYXQgd2FzIGFjdGl2YXRlZCBkdXJpbmcgcGF0Y2guXG4gKiBUaGUgcXVldWUgd2lsbCBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIGVudGlyZSB0cmVlIGhhcyBiZWVuIHBhdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXVlQWN0aXZhdGVkQ29tcG9uZW50ICh2bSkge1xuICAvLyBzZXR0aW5nIF9pbmFjdGl2ZSB0byBmYWxzZSBoZXJlIHNvIHRoYXQgYSByZW5kZXIgZnVuY3Rpb24gY2FuXG4gIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpXG4gIHZtLl9pbmFjdGl2ZSA9IGZhbHNlO1xuICBhY3RpdmF0ZWRDaGlsZHJlbi5wdXNoKHZtKTtcbn1cblxuZnVuY3Rpb24gY2FsbEFjdGl2YXRlZEhvb2tzIChxdWV1ZSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgcXVldWVbaV0uX2luYWN0aXZlID0gdHJ1ZTtcbiAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHF1ZXVlW2ldLCB0cnVlIC8qIHRydWUgKi8pO1xuICB9XG59XG5cbi8qKlxuICogUHVzaCBhIHdhdGNoZXIgaW50byB0aGUgd2F0Y2hlciBxdWV1ZS5cbiAqIEpvYnMgd2l0aCBkdXBsaWNhdGUgSURzIHdpbGwgYmUgc2tpcHBlZCB1bmxlc3MgaXQnc1xuICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXVlV2F0Y2hlciAod2F0Y2hlcikge1xuICB2YXIgaWQgPSB3YXRjaGVyLmlkO1xuICBpZiAoaGFzW2lkXSA9PSBudWxsKSB7XG4gICAgaGFzW2lkXSA9IHRydWU7XG4gICAgaWYgKCFmbHVzaGluZykge1xuICAgICAgcXVldWUucHVzaCh3YXRjaGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZFxuICAgICAgLy8gaWYgYWxyZWFkeSBwYXN0IGl0cyBpZCwgaXQgd2lsbCBiZSBydW4gbmV4dCBpbW1lZGlhdGVseS5cbiAgICAgIHZhciBpID0gcXVldWUubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7XG4gICAgfVxuICAgIC8vIHF1ZXVlIHRoZSBmbHVzaFxuICAgIGlmICghd2FpdGluZykge1xuICAgICAgd2FpdGluZyA9IHRydWU7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFjb25maWcuYXN5bmMpIHtcbiAgICAgICAgZmx1c2hTY2hlZHVsZXJRdWV1ZSgpO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIG5leHRUaWNrKGZsdXNoU2NoZWR1bGVyUXVldWUpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuXG5cbnZhciB1aWQkMiA9IDA7XG5cbi8qKlxuICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsXG4gKiBhbmQgZmlyZXMgY2FsbGJhY2sgd2hlbiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBjaGFuZ2VzLlxuICogVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAkd2F0Y2goKSBhcGkgYW5kIGRpcmVjdGl2ZXMuXG4gKi9cbnZhciBXYXRjaGVyID0gZnVuY3Rpb24gV2F0Y2hlciAoXG4gIHZtLFxuICBleHBPckZuLFxuICBjYixcbiAgb3B0aW9ucyxcbiAgaXNSZW5kZXJXYXRjaGVyXG4pIHtcbiAgdGhpcy52bSA9IHZtO1xuICBpZiAoaXNSZW5kZXJXYXRjaGVyKSB7XG4gICAgdm0uX3dhdGNoZXIgPSB0aGlzO1xuICB9XG4gIHZtLl93YXRjaGVycy5wdXNoKHRoaXMpO1xuICAvLyBvcHRpb25zXG4gIGlmIChvcHRpb25zKSB7XG4gICAgdGhpcy5kZWVwID0gISFvcHRpb25zLmRlZXA7XG4gICAgdGhpcy51c2VyID0gISFvcHRpb25zLnVzZXI7XG4gICAgdGhpcy5sYXp5ID0gISFvcHRpb25zLmxhenk7XG4gICAgdGhpcy5zeW5jID0gISFvcHRpb25zLnN5bmM7XG4gICAgdGhpcy5iZWZvcmUgPSBvcHRpb25zLmJlZm9yZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRlZXAgPSB0aGlzLnVzZXIgPSB0aGlzLmxhenkgPSB0aGlzLnN5bmMgPSBmYWxzZTtcbiAgfVxuICB0aGlzLmNiID0gY2I7XG4gIHRoaXMuaWQgPSArK3VpZCQyOyAvLyB1aWQgZm9yIGJhdGNoaW5nXG4gIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnNcbiAgdGhpcy5kZXBzID0gW107XG4gIHRoaXMubmV3RGVwcyA9IFtdO1xuICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7XG4gIHRoaXMubmV3RGVwSWRzID0gbmV3IF9TZXQoKTtcbiAgdGhpcy5leHByZXNzaW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgID8gZXhwT3JGbi50b1N0cmluZygpXG4gICAgOiAnJztcbiAgLy8gcGFyc2UgZXhwcmVzc2lvbiBmb3IgZ2V0dGVyXG4gIGlmICh0eXBlb2YgZXhwT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmdldHRlciA9IHBhcnNlUGF0aChleHBPckZuKTtcbiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7XG4gICAgICB0aGlzLmdldHRlciA9IG5vb3A7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgIFwiRmFpbGVkIHdhdGNoaW5nIHBhdGg6IFxcXCJcIiArIGV4cE9yRm4gKyBcIlxcXCIgXCIgK1xuICAgICAgICAnV2F0Y2hlciBvbmx5IGFjY2VwdHMgc2ltcGxlIGRvdC1kZWxpbWl0ZWQgcGF0aHMuICcgK1xuICAgICAgICAnRm9yIGZ1bGwgY29udHJvbCwgdXNlIGEgZnVuY3Rpb24gaW5zdGVhZC4nLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgdGhpcy52YWx1ZSA9IHRoaXMubGF6eVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiB0aGlzLmdldCgpO1xufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAoKSB7XG4gIHB1c2hUYXJnZXQodGhpcyk7XG4gIHZhciB2YWx1ZTtcbiAgdmFyIHZtID0gdGhpcy52bTtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IHRoaXMuZ2V0dGVyLmNhbGwodm0sIHZtKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICh0aGlzLnVzZXIpIHtcbiAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoXCJnZXR0ZXIgZm9yIHdhdGNoZXIgXFxcIlwiICsgKHRoaXMuZXhwcmVzc2lvbikgKyBcIlxcXCJcIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIC8vIFwidG91Y2hcIiBldmVyeSBwcm9wZXJ0eSBzbyB0aGV5IGFyZSBhbGwgdHJhY2tlZCBhc1xuICAgIC8vIGRlcGVuZGVuY2llcyBmb3IgZGVlcCB3YXRjaGluZ1xuICAgIGlmICh0aGlzLmRlZXApIHtcbiAgICAgIHRyYXZlcnNlKHZhbHVlKTtcbiAgICB9XG4gICAgcG9wVGFyZ2V0KCk7XG4gICAgdGhpcy5jbGVhbnVwRGVwcygpO1xuICB9XG4gIHJldHVybiB2YWx1ZVxufTtcblxuLyoqXG4gKiBBZGQgYSBkZXBlbmRlbmN5IHRvIHRoaXMgZGlyZWN0aXZlLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5hZGREZXAgPSBmdW5jdGlvbiBhZGREZXAgKGRlcCkge1xuICB2YXIgaWQgPSBkZXAuaWQ7XG4gIGlmICghdGhpcy5uZXdEZXBJZHMuaGFzKGlkKSkge1xuICAgIHRoaXMubmV3RGVwSWRzLmFkZChpZCk7XG4gICAgdGhpcy5uZXdEZXBzLnB1c2goZGVwKTtcbiAgICBpZiAoIXRoaXMuZGVwSWRzLmhhcyhpZCkpIHtcbiAgICAgIGRlcC5hZGRTdWIodGhpcyk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmNsZWFudXBEZXBzID0gZnVuY3Rpb24gY2xlYW51cERlcHMgKCkge1xuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIgZGVwID0gdGhpcy5kZXBzW2ldO1xuICAgIGlmICghdGhpcy5uZXdEZXBJZHMuaGFzKGRlcC5pZCkpIHtcbiAgICAgIGRlcC5yZW1vdmVTdWIodGhpcyk7XG4gICAgfVxuICB9XG4gIHZhciB0bXAgPSB0aGlzLmRlcElkcztcbiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkcztcbiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwSWRzLmNsZWFyKCk7XG4gIHRtcCA9IHRoaXMuZGVwcztcbiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzO1xuICB0aGlzLm5ld0RlcHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwO1xufTtcblxuLyoqXG4gKiBTdWJzY3JpYmVyIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkZXBlbmRlbmN5IGNoYW5nZXMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0aGlzLmxhenkpIHtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0aGlzLnN5bmMpIHtcbiAgICB0aGlzLnJ1bigpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlV2F0Y2hlcih0aGlzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7XG4gIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgIT09IHRoaXMudmFsdWUgfHxcbiAgICAgIC8vIERlZXAgd2F0Y2hlcnMgYW5kIHdhdGNoZXJzIG9uIE9iamVjdC9BcnJheXMgc2hvdWxkIGZpcmUgZXZlblxuICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heVxuICAgICAgLy8gaGF2ZSBtdXRhdGVkLlxuICAgICAgaXNPYmplY3QodmFsdWUpIHx8XG4gICAgICB0aGlzLmRlZXBcbiAgICApIHtcbiAgICAgIC8vIHNldCBuZXcgdmFsdWVcbiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMudm0sIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoXCJjYWxsYmFjayBmb3Igd2F0Y2hlciBcXFwiXCIgKyAodGhpcy5leHByZXNzaW9uKSArIFwiXFxcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuXG4gKiBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgZm9yIGxhenkgd2F0Y2hlcnMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkge1xuICB0aGlzLnZhbHVlID0gdGhpcy5nZXQoKTtcbiAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgdGhpcy5kZXBzW2ldLmRlcGVuZCgpO1xuICB9XG59O1xuXG4vKipcbiAqIFJlbW92ZSBzZWxmIGZyb20gYWxsIGRlcGVuZGVuY2llcycgc3Vic2NyaWJlciBsaXN0LlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS50ZWFyZG93biA9IGZ1bmN0aW9uIHRlYXJkb3duICgpIHtcbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdFxuICAgIC8vIHRoaXMgaXMgYSBzb21ld2hhdCBleHBlbnNpdmUgb3BlcmF0aW9uIHNvIHdlIHNraXAgaXRcbiAgICAvLyBpZiB0aGUgdm0gaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmVtb3ZlKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKTtcbiAgICB9XG4gICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMuZGVwc1tpXS5yZW1vdmVTdWIodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gIH1cbn07XG5cbi8qICAqL1xuXG52YXIgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uID0ge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogbm9vcCxcbiAgc2V0OiBub29wXG59O1xuXG5mdW5jdGlvbiBwcm94eSAodGFyZ2V0LCBzb3VyY2VLZXksIGtleSkge1xuICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gZnVuY3Rpb24gcHJveHlHZXR0ZXIgKCkge1xuICAgIHJldHVybiB0aGlzW3NvdXJjZUtleV1ba2V5XVxuICB9O1xuICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gZnVuY3Rpb24gcHJveHlTZXR0ZXIgKHZhbCkge1xuICAgIHRoaXNbc291cmNlS2V5XVtrZXldID0gdmFsO1xuICB9O1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbik7XG59XG5cbmZ1bmN0aW9uIGluaXRTdGF0ZSAodm0pIHtcbiAgdm0uX3dhdGNoZXJzID0gW107XG4gIHZhciBvcHRzID0gdm0uJG9wdGlvbnM7XG4gIGlmIChvcHRzLnByb3BzKSB7IGluaXRQcm9wcyh2bSwgb3B0cy5wcm9wcyk7IH1cbiAgaWYgKG9wdHMubWV0aG9kcykgeyBpbml0TWV0aG9kcyh2bSwgb3B0cy5tZXRob2RzKTsgfVxuICBpZiAob3B0cy5kYXRhKSB7XG4gICAgaW5pdERhdGEodm0pO1xuICB9IGVsc2Uge1xuICAgIG9ic2VydmUodm0uX2RhdGEgPSB7fSwgdHJ1ZSAvKiBhc1Jvb3REYXRhICovKTtcbiAgfVxuICBpZiAob3B0cy5jb21wdXRlZCkgeyBpbml0Q29tcHV0ZWQodm0sIG9wdHMuY29tcHV0ZWQpOyB9XG4gIGlmIChvcHRzLndhdGNoICYmIG9wdHMud2F0Y2ggIT09IG5hdGl2ZVdhdGNoKSB7XG4gICAgaW5pdFdhdGNoKHZtLCBvcHRzLndhdGNoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHtcbiAgdmFyIHByb3BzRGF0YSA9IHZtLiRvcHRpb25zLnByb3BzRGF0YSB8fCB7fTtcbiAgdmFyIHByb3BzID0gdm0uX3Byb3BzID0ge307XG4gIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5XG4gIC8vIGluc3RlYWQgb2YgZHluYW1pYyBvYmplY3Qga2V5IGVudW1lcmF0aW9uLlxuICB2YXIga2V5cyA9IHZtLiRvcHRpb25zLl9wcm9wS2V5cyA9IFtdO1xuICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7XG4gIC8vIHJvb3QgaW5zdGFuY2UgcHJvcHMgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICBpZiAoIWlzUm9vdCkge1xuICAgIHRvZ2dsZU9ic2VydmluZyhmYWxzZSk7XG4gIH1cbiAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIGtleSApIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB2YXIgdmFsdWUgPSB2YWxpZGF0ZVByb3Aoa2V5LCBwcm9wc09wdGlvbnMsIHByb3BzRGF0YSwgdm0pO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBoeXBoZW5hdGVkS2V5ID0gaHlwaGVuYXRlKGtleSk7XG4gICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShoeXBoZW5hdGVkS2V5KSB8fFxuICAgICAgICAgIGNvbmZpZy5pc1Jlc2VydmVkQXR0cihoeXBoZW5hdGVkS2V5KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIChcIlxcXCJcIiArIGh5cGhlbmF0ZWRLZXkgKyBcIlxcXCIgaXMgYSByZXNlcnZlZCBhdHRyaWJ1dGUgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGNvbXBvbmVudCBwcm9wLlwiKSxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZGVmaW5lUmVhY3RpdmUkJDEocHJvcHMsIGtleSwgdmFsdWUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFpc1Jvb3QgJiYgIWlzVXBkYXRpbmdDaGlsZENvbXBvbmVudCkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmKHZtLm1wSG9zdCA9PT0gJ21wLWJhaWR1JyB8fCB2bS5tcEhvc3QgPT09ICdtcC1rdWFpc2hvdScgfHwgdm0ubXBIb3N0ID09PSAnbXAteGhzJyl7Ly/nmb7luqbjgIHlv6vmiYvjgIHlsI/nuqLkuaYgb2JzZXJ2ZXIg5ZyoIHNldERhdGEgY2FsbGJhY2sg5LmL5ZCO6Kem5Y+R77yM55u05o6l5b+955Wl6K+lIHdhcm5cbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vZml4ZWQgYnkgeHh4eHh4IF9fbmV4dF90aWNrX3BlbmRpbmcsdW5pOi8vZm9ybS1maWVsZCDml7bkuI3lkYroraZcbiAgICAgICAgICAgIGlmKFxuICAgICAgICAgICAgICAgIGtleSA9PT0gJ3ZhbHVlJyAmJiBcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHZtLiRvcHRpb25zLmJlaGF2aW9ycykgJiZcbiAgICAgICAgICAgICAgICB2bS4kb3B0aW9ucy5iZWhhdmlvcnMuaW5kZXhPZigndW5pOi8vZm9ybS1maWVsZCcpICE9PSAtMVxuICAgICAgICAgICAgICApe1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHZtLl9nZXRGb3JtRGF0YSl7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyICRwYXJlbnQgPSB2bS4kcGFyZW50O1xuICAgICAgICAgICAgd2hpbGUoJHBhcmVudCl7XG4gICAgICAgICAgICAgIGlmKCRwYXJlbnQuX19uZXh0X3RpY2tfcGVuZGluZyl7XG4gICAgICAgICAgICAgICAgcmV0dXJuICBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAkcGFyZW50ID0gJHBhcmVudC4kcGFyZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJBdm9pZCBtdXRhdGluZyBhIHByb3AgZGlyZWN0bHkgc2luY2UgdGhlIHZhbHVlIHdpbGwgYmUgXCIgK1xuICAgICAgICAgICAgXCJvdmVyd3JpdHRlbiB3aGVuZXZlciB0aGUgcGFyZW50IGNvbXBvbmVudCByZS1yZW5kZXJzLiBcIiArXG4gICAgICAgICAgICBcIkluc3RlYWQsIHVzZSBhIGRhdGEgb3IgY29tcHV0ZWQgcHJvcGVydHkgYmFzZWQgb24gdGhlIHByb3AncyBcIiArXG4gICAgICAgICAgICBcInZhbHVlLiBQcm9wIGJlaW5nIG11dGF0ZWQ6IFxcXCJcIiArIGtleSArIFwiXFxcIlwiLFxuICAgICAgICAgICAgdm1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVmaW5lUmVhY3RpdmUkJDEocHJvcHMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvLyBzdGF0aWMgcHJvcHMgYXJlIGFscmVhZHkgcHJveGllZCBvbiB0aGUgY29tcG9uZW50J3MgcHJvdG90eXBlXG4gICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXRcbiAgICAvLyBpbnN0YW50aWF0aW9uIGhlcmUuXG4gICAgaWYgKCEoa2V5IGluIHZtKSkge1xuICAgICAgcHJveHkodm0sIFwiX3Byb3BzXCIsIGtleSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApO1xuICB0b2dnbGVPYnNlcnZpbmcodHJ1ZSk7XG59XG5cbmZ1bmN0aW9uIGluaXREYXRhICh2bSkge1xuICB2YXIgZGF0YSA9IHZtLiRvcHRpb25zLmRhdGE7XG4gIGRhdGEgPSB2bS5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nXG4gICAgPyBnZXREYXRhKGRhdGEsIHZtKVxuICAgIDogZGF0YSB8fCB7fTtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgZGF0YSA9IHt9O1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICdkYXRhIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIGFuIG9iamVjdDpcXG4nICtcbiAgICAgICdodHRwczovL3Z1ZWpzLm9yZy92Mi9ndWlkZS9jb21wb25lbnRzLmh0bWwjZGF0YS1NdXN0LUJlLWEtRnVuY3Rpb24nLFxuICAgICAgdm1cbiAgICApO1xuICB9XG4gIC8vIHByb3h5IGRhdGEgb24gaW5zdGFuY2VcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7XG4gIHZhciBtZXRob2RzID0gdm0uJG9wdGlvbnMubWV0aG9kcztcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAobWV0aG9kcyAmJiBoYXNPd24obWV0aG9kcywga2V5KSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIChcIk1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkIGFzIGEgZGF0YSBwcm9wZXJ0eS5cIiksXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzICYmIGhhc093bihwcm9wcywga2V5KSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIlRoZSBkYXRhIHByb3BlcnR5IFxcXCJcIiArIGtleSArIFwiXFxcIiBpcyBhbHJlYWR5IGRlY2xhcmVkIGFzIGEgcHJvcC4gXCIgK1xuICAgICAgICBcIlVzZSBwcm9wIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC5cIixcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghaXNSZXNlcnZlZChrZXkpKSB7XG4gICAgICBwcm94eSh2bSwgXCJfZGF0YVwiLCBrZXkpO1xuICAgIH1cbiAgfVxuICAvLyBvYnNlcnZlIGRhdGFcbiAgb2JzZXJ2ZShkYXRhLCB0cnVlIC8qIGFzUm9vdERhdGEgKi8pO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhIChkYXRhLCB2bSkge1xuICAvLyAjNzU3MyBkaXNhYmxlIGRlcCBjb2xsZWN0aW9uIHdoZW4gaW52b2tpbmcgZGF0YSBnZXR0ZXJzXG4gIHB1c2hUYXJnZXQoKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGF0YS5jYWxsKHZtLCB2bSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhbmRsZUVycm9yKGUsIHZtLCBcImRhdGEoKVwiKTtcbiAgICByZXR1cm4ge31cbiAgfSBmaW5hbGx5IHtcbiAgICBwb3BUYXJnZXQoKTtcbiAgfVxufVxuXG52YXIgY29tcHV0ZWRXYXRjaGVyT3B0aW9ucyA9IHsgbGF6eTogdHJ1ZSB9O1xuXG5mdW5jdGlvbiBpbml0Q29tcHV0ZWQgKHZtLCBjb21wdXRlZCkge1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgdmFyIHdhdGNoZXJzID0gdm0uX2NvbXB1dGVkV2F0Y2hlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBqdXN0IGdldHRlcnMgZHVyaW5nIFNTUlxuICB2YXIgaXNTU1IgPSBpc1NlcnZlclJlbmRlcmluZygpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkge1xuICAgIHZhciB1c2VyRGVmID0gY29tcHV0ZWRba2V5XTtcbiAgICB2YXIgZ2V0dGVyID0gdHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicgPyB1c2VyRGVmIDogdXNlckRlZi5nZXQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZ2V0dGVyID09IG51bGwpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIChcIkdldHRlciBpcyBtaXNzaW5nIGZvciBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuXCIpLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzU1NSKSB7XG4gICAgICAvLyBjcmVhdGUgaW50ZXJuYWwgd2F0Y2hlciBmb3IgdGhlIGNvbXB1dGVkIHByb3BlcnR5LlxuICAgICAgd2F0Y2hlcnNba2V5XSA9IG5ldyBXYXRjaGVyKFxuICAgICAgICB2bSxcbiAgICAgICAgZ2V0dGVyIHx8IG5vb3AsXG4gICAgICAgIG5vb3AsXG4gICAgICAgIGNvbXB1dGVkV2F0Y2hlck9wdGlvbnNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gY29tcG9uZW50LWRlZmluZWQgY29tcHV0ZWQgcHJvcGVydGllcyBhcmUgYWxyZWFkeSBkZWZpbmVkIG9uIHRoZVxuICAgIC8vIGNvbXBvbmVudCBwcm90b3R5cGUuIFdlIG9ubHkgbmVlZCB0byBkZWZpbmUgY29tcHV0ZWQgcHJvcGVydGllcyBkZWZpbmVkXG4gICAgLy8gYXQgaW5zdGFudGlhdGlvbiBoZXJlLlxuICAgIGlmICghKGtleSBpbiB2bSkpIHtcbiAgICAgIGRlZmluZUNvbXB1dGVkKHZtLCBrZXksIHVzZXJEZWYpO1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGtleSBpbiB2bS4kZGF0YSkge1xuICAgICAgICB3YXJuKChcIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGRhdGEuXCIpLCB2bSk7XG4gICAgICB9IGVsc2UgaWYgKHZtLiRvcHRpb25zLnByb3BzICYmIGtleSBpbiB2bS4kb3B0aW9ucy5wcm9wcykge1xuICAgICAgICB3YXJuKChcIlRoZSBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIGEgcHJvcC5cIiksIHZtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lQ29tcHV0ZWQgKFxuICB0YXJnZXQsXG4gIGtleSxcbiAgdXNlckRlZlxuKSB7XG4gIHZhciBzaG91bGRDYWNoZSA9ICFpc1NlcnZlclJlbmRlcmluZygpO1xuICBpZiAodHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gc2hvdWxkQ2FjaGVcbiAgICAgID8gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KVxuICAgICAgOiBjcmVhdGVHZXR0ZXJJbnZva2VyKHVzZXJEZWYpO1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBub29wO1xuICB9IGVsc2Uge1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5nZXQgPSB1c2VyRGVmLmdldFxuICAgICAgPyBzaG91bGRDYWNoZSAmJiB1c2VyRGVmLmNhY2hlICE9PSBmYWxzZVxuICAgICAgICA/IGNyZWF0ZUNvbXB1dGVkR2V0dGVyKGtleSlcbiAgICAgICAgOiBjcmVhdGVHZXR0ZXJJbnZva2VyKHVzZXJEZWYuZ2V0KVxuICAgICAgOiBub29wO1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSB1c2VyRGVmLnNldCB8fCBub29wO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID09PSBub29wKSB7XG4gICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIChcIkNvbXB1dGVkIHByb3BlcnR5IFxcXCJcIiArIGtleSArIFwiXFxcIiB3YXMgYXNzaWduZWQgdG8gYnV0IGl0IGhhcyBubyBzZXR0ZXIuXCIpLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21wdXRlZEdldHRlciAoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb21wdXRlZEdldHRlciAoKSB7XG4gICAgdmFyIHdhdGNoZXIgPSB0aGlzLl9jb21wdXRlZFdhdGNoZXJzICYmIHRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNba2V5XTtcbiAgICBpZiAod2F0Y2hlcikge1xuICAgICAgaWYgKHdhdGNoZXIuZGlydHkpIHtcbiAgICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpO1xuICAgICAgfVxuICAgICAgaWYgKERlcC5TaGFyZWRPYmplY3QudGFyZ2V0KSB7Ly8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICAgIHdhdGNoZXIuZGVwZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVHZXR0ZXJJbnZva2VyKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb21wdXRlZEdldHRlciAoKSB7XG4gICAgcmV0dXJuIGZuLmNhbGwodGhpcywgdGhpcylcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0TWV0aG9kcyAodm0sIG1ldGhvZHMpIHtcbiAgdmFyIHByb3BzID0gdm0uJG9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBtZXRob2RzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0aG9kc1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyB0eXBlIFxcXCJcIiArICh0eXBlb2YgbWV0aG9kc1trZXldKSArIFwiXFxcIiBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIFwiICtcbiAgICAgICAgICBcIkRpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/XCIsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoKGtleSBpbiB2bSkgJiYgaXNSZXNlcnZlZChrZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgXCJNZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIFZ1ZSBpbnN0YW5jZSBtZXRob2QuIFwiICtcbiAgICAgICAgICBcIkF2b2lkIGRlZmluaW5nIGNvbXBvbmVudCBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBfIG9yICQuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdm1ba2V5XSA9IHR5cGVvZiBtZXRob2RzW2tleV0gIT09ICdmdW5jdGlvbicgPyBub29wIDogYmluZChtZXRob2RzW2tleV0sIHZtKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0V2F0Y2ggKHZtLCB3YXRjaCkge1xuICBmb3IgKHZhciBrZXkgaW4gd2F0Y2gpIHtcbiAgICB2YXIgaGFuZGxlciA9IHdhdGNoW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykge1xuICAgICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXJbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmVhdGVXYXRjaGVyKHZtLCBrZXksIGhhbmRsZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVXYXRjaGVyIChcbiAgdm0sXG4gIGV4cE9yRm4sXG4gIGhhbmRsZXIsXG4gIG9wdGlvbnNcbikge1xuICBpZiAoaXNQbGFpbk9iamVjdChoYW5kbGVyKSkge1xuICAgIG9wdGlvbnMgPSBoYW5kbGVyO1xuICAgIGhhbmRsZXIgPSBoYW5kbGVyLmhhbmRsZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJykge1xuICAgIGhhbmRsZXIgPSB2bVtoYW5kbGVyXTtcbiAgfVxuICByZXR1cm4gdm0uJHdhdGNoKGV4cE9yRm4sIGhhbmRsZXIsIG9wdGlvbnMpXG59XG5cbmZ1bmN0aW9uIHN0YXRlTWl4aW4gKFZ1ZSkge1xuICAvLyBmbG93IHNvbWVob3cgaGFzIHByb2JsZW1zIHdpdGggZGlyZWN0bHkgZGVjbGFyZWQgZGVmaW5pdGlvbiBvYmplY3RcbiAgLy8gd2hlbiB1c2luZyBPYmplY3QuZGVmaW5lUHJvcGVydHksIHNvIHdlIGhhdmUgdG8gcHJvY2VkdXJhbGx5IGJ1aWxkIHVwXG4gIC8vIHRoZSBvYmplY3QgaGVyZS5cbiAgdmFyIGRhdGFEZWYgPSB7fTtcbiAgZGF0YURlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kYXRhIH07XG4gIHZhciBwcm9wc0RlZiA9IHt9O1xuICBwcm9wc0RlZi5nZXQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wcm9wcyB9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRhdGFEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0F2b2lkIHJlcGxhY2luZyBpbnN0YW5jZSByb290ICRkYXRhLiAnICtcbiAgICAgICAgJ1VzZSBuZXN0ZWQgZGF0YSBwcm9wZXJ0aWVzIGluc3RlYWQuJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICAgIHByb3BzRGVmLnNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm4oXCIkcHJvcHMgaXMgcmVhZG9ubHkuXCIsIHRoaXMpO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckZGF0YScsIGRhdGFEZWYpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRwcm9wcycsIHByb3BzRGVmKTtcblxuICBWdWUucHJvdG90eXBlLiRzZXQgPSBzZXQ7XG4gIFZ1ZS5wcm90b3R5cGUuJGRlbGV0ZSA9IGRlbDtcblxuICBWdWUucHJvdG90eXBlLiR3YXRjaCA9IGZ1bmN0aW9uIChcbiAgICBleHBPckZuLFxuICAgIGNiLFxuICAgIG9wdGlvbnNcbiAgKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAoaXNQbGFpbk9iamVjdChjYikpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucylcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy51c2VyID0gdHJ1ZTtcbiAgICB2YXIgd2F0Y2hlciA9IG5ldyBXYXRjaGVyKHZtLCBleHBPckZuLCBjYiwgb3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbnMuaW1tZWRpYXRlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjYi5jYWxsKHZtLCB3YXRjaGVyLnZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCB2bSwgKFwiY2FsbGJhY2sgZm9yIGltbWVkaWF0ZSB3YXRjaGVyIFxcXCJcIiArICh3YXRjaGVyLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHVud2F0Y2hGbiAoKSB7XG4gICAgICB3YXRjaGVyLnRlYXJkb3duKCk7XG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxudmFyIHVpZCQzID0gMDtcblxuZnVuY3Rpb24gaW5pdE1peGluIChWdWUpIHtcbiAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICAvLyBhIHVpZFxuICAgIHZtLl91aWQgPSB1aWQkMysrO1xuXG4gICAgdmFyIHN0YXJ0VGFnLCBlbmRUYWc7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHN0YXJ0VGFnID0gXCJ2dWUtcGVyZi1zdGFydDpcIiArICh2bS5fdWlkKTtcbiAgICAgIGVuZFRhZyA9IFwidnVlLXBlcmYtZW5kOlwiICsgKHZtLl91aWQpO1xuICAgICAgbWFyayhzdGFydFRhZyk7XG4gICAgfVxuXG4gICAgLy8gYSBmbGFnIHRvIGF2b2lkIHRoaXMgYmVpbmcgb2JzZXJ2ZWRcbiAgICB2bS5faXNWdWUgPSB0cnVlO1xuICAgIC8vIG1lcmdlIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLl9pc0NvbXBvbmVudCkge1xuICAgICAgLy8gb3B0aW1pemUgaW50ZXJuYWwgY29tcG9uZW50IGluc3RhbnRpYXRpb25cbiAgICAgIC8vIHNpbmNlIGR5bmFtaWMgb3B0aW9ucyBtZXJnaW5nIGlzIHByZXR0eSBzbG93LCBhbmQgbm9uZSBvZiB0aGVcbiAgICAgIC8vIGludGVybmFsIGNvbXBvbmVudCBvcHRpb25zIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50LlxuICAgICAgaW5pdEludGVybmFsQ29tcG9uZW50KHZtLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uJG9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoXG4gICAgICAgIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnModm0uY29uc3RydWN0b3IpLFxuICAgICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaW5pdFByb3h5KHZtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm0uX3JlbmRlclByb3h5ID0gdm07XG4gICAgfVxuICAgIC8vIGV4cG9zZSByZWFsIHNlbGZcbiAgICB2bS5fc2VsZiA9IHZtO1xuICAgIGluaXRMaWZlY3ljbGUodm0pO1xuICAgIGluaXRFdmVudHModm0pO1xuICAgIGluaXRSZW5kZXIodm0pO1xuICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlQ3JlYXRlJyk7XG4gICAgIXZtLl8kZmFsbGJhY2sgJiYgaW5pdEluamVjdGlvbnModm0pOyAvLyByZXNvbHZlIGluamVjdGlvbnMgYmVmb3JlIGRhdGEvcHJvcHMgIFxuICAgIGluaXRTdGF0ZSh2bSk7XG4gICAgIXZtLl8kZmFsbGJhY2sgJiYgaW5pdFByb3ZpZGUodm0pOyAvLyByZXNvbHZlIHByb3ZpZGUgYWZ0ZXIgZGF0YS9wcm9wc1xuICAgICF2bS5fJGZhbGxiYWNrICYmIGNhbGxIb29rKHZtLCAnY3JlYXRlZCcpOyAgICAgIFxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHZtLl9uYW1lID0gZm9ybWF0Q29tcG9uZW50TmFtZSh2bSwgZmFsc2UpO1xuICAgICAgbWFyayhlbmRUYWcpO1xuICAgICAgbWVhc3VyZSgoXCJ2dWUgXCIgKyAodm0uX25hbWUpICsgXCIgaW5pdFwiKSwgc3RhcnRUYWcsIGVuZFRhZyk7XG4gICAgfVxuXG4gICAgaWYgKHZtLiRvcHRpb25zLmVsKSB7XG4gICAgICB2bS4kbW91bnQodm0uJG9wdGlvbnMuZWwpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5pdEludGVybmFsQ29tcG9uZW50ICh2bSwgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IHZtLiRvcHRpb25zID0gT2JqZWN0LmNyZWF0ZSh2bS5jb25zdHJ1Y3Rvci5vcHRpb25zKTtcbiAgLy8gZG9pbmcgdGhpcyBiZWNhdXNlIGl0J3MgZmFzdGVyIHRoYW4gZHluYW1pYyBlbnVtZXJhdGlvbi5cbiAgdmFyIHBhcmVudFZub2RlID0gb3B0aW9ucy5fcGFyZW50Vm5vZGU7XG4gIG9wdHMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIG9wdHMuX3BhcmVudFZub2RlID0gcGFyZW50Vm5vZGU7XG5cbiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHBhcmVudFZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIG9wdHMucHJvcHNEYXRhID0gdm5vZGVDb21wb25lbnRPcHRpb25zLnByb3BzRGF0YTtcbiAgb3B0cy5fcGFyZW50TGlzdGVuZXJzID0gdm5vZGVDb21wb25lbnRPcHRpb25zLmxpc3RlbmVycztcbiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW47XG4gIG9wdHMuX2NvbXBvbmVudFRhZyA9IHZub2RlQ29tcG9uZW50T3B0aW9ucy50YWc7XG5cbiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7XG4gICAgb3B0cy5yZW5kZXIgPSBvcHRpb25zLnJlbmRlcjtcbiAgICBvcHRzLnN0YXRpY1JlbmRlckZucyA9IG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnM7XG4gIGlmIChDdG9yLnN1cGVyKSB7XG4gICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7XG4gICAgdmFyIGNhY2hlZFN1cGVyT3B0aW9ucyA9IEN0b3Iuc3VwZXJPcHRpb25zO1xuICAgIGlmIChzdXBlck9wdGlvbnMgIT09IGNhY2hlZFN1cGVyT3B0aW9ucykge1xuICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsXG4gICAgICAvLyBuZWVkIHRvIHJlc29sdmUgbmV3IG9wdGlvbnMuXG4gICAgICBDdG9yLnN1cGVyT3B0aW9ucyA9IHN1cGVyT3B0aW9ucztcbiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NilcbiAgICAgIHZhciBtb2RpZmllZE9wdGlvbnMgPSByZXNvbHZlTW9kaWZpZWRPcHRpb25zKEN0b3IpO1xuICAgICAgLy8gdXBkYXRlIGJhc2UgZXh0ZW5kIG9wdGlvbnNcbiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHtcbiAgICAgICAgZXh0ZW5kKEN0b3IuZXh0ZW5kT3B0aW9ucywgbW9kaWZpZWRPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMubmFtZSkge1xuICAgICAgICBvcHRpb25zLmNvbXBvbmVudHNbb3B0aW9ucy5uYW1lXSA9IEN0b3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG1vZGlmaWVkO1xuICB2YXIgbGF0ZXN0ID0gQ3Rvci5vcHRpb25zO1xuICB2YXIgc2VhbGVkID0gQ3Rvci5zZWFsZWRPcHRpb25zO1xuICBmb3IgKHZhciBrZXkgaW4gbGF0ZXN0KSB7XG4gICAgaWYgKGxhdGVzdFtrZXldICE9PSBzZWFsZWRba2V5XSkge1xuICAgICAgaWYgKCFtb2RpZmllZCkgeyBtb2RpZmllZCA9IHt9OyB9XG4gICAgICBtb2RpZmllZFtrZXldID0gbGF0ZXN0W2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBtb2RpZmllZFxufVxuXG5mdW5jdGlvbiBWdWUgKG9wdGlvbnMpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAhKHRoaXMgaW5zdGFuY2VvZiBWdWUpXG4gICkge1xuICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTtcbiAgfVxuICB0aGlzLl9pbml0KG9wdGlvbnMpO1xufVxuXG5pbml0TWl4aW4oVnVlKTtcbnN0YXRlTWl4aW4oVnVlKTtcbmV2ZW50c01peGluKFZ1ZSk7XG5saWZlY3ljbGVNaXhpbihWdWUpO1xucmVuZGVyTWl4aW4oVnVlKTtcblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRVc2UgKFZ1ZSkge1xuICBWdWUudXNlID0gZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIHZhciBpbnN0YWxsZWRQbHVnaW5zID0gKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgfHwgKHRoaXMuX2luc3RhbGxlZFBsdWdpbnMgPSBbXSkpO1xuICAgIGlmIChpbnN0YWxsZWRQbHVnaW5zLmluZGV4T2YocGx1Z2luKSA+IC0xKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8vIGFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuICAgIHZhciBhcmdzID0gdG9BcnJheShhcmd1bWVudHMsIDEpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICBpZiAodHlwZW9mIHBsdWdpbi5pbnN0YWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwbHVnaW4uaW5zdGFsbC5hcHBseShwbHVnaW4sIGFyZ3MpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBsdWdpbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGx1Z2luLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH1cbiAgICBpbnN0YWxsZWRQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICByZXR1cm4gdGhpc1xuICB9O1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdE1peGluJDEgKFZ1ZSkge1xuICBWdWUubWl4aW4gPSBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLCBtaXhpbik7XG4gICAgcmV0dXJuIHRoaXNcbiAgfTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRFeHRlbmQgKFZ1ZSkge1xuICAvKipcbiAgICogRWFjaCBpbnN0YW5jZSBjb25zdHJ1Y3RvciwgaW5jbHVkaW5nIFZ1ZSwgaGFzIGEgdW5pcXVlXG4gICAqIGNpZC4gVGhpcyBlbmFibGVzIHVzIHRvIGNyZWF0ZSB3cmFwcGVkIFwiY2hpbGRcbiAgICogY29uc3RydWN0b3JzXCIgZm9yIHByb3RvdHlwYWwgaW5oZXJpdGFuY2UgYW5kIGNhY2hlIHRoZW0uXG4gICAqL1xuICBWdWUuY2lkID0gMDtcbiAgdmFyIGNpZCA9IDE7XG5cbiAgLyoqXG4gICAqIENsYXNzIGluaGVyaXRhbmNlXG4gICAqL1xuICBWdWUuZXh0ZW5kID0gZnVuY3Rpb24gKGV4dGVuZE9wdGlvbnMpIHtcbiAgICBleHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgU3VwZXIgPSB0aGlzO1xuICAgIHZhciBTdXBlcklkID0gU3VwZXIuY2lkO1xuICAgIHZhciBjYWNoZWRDdG9ycyA9IGV4dGVuZE9wdGlvbnMuX0N0b3IgfHwgKGV4dGVuZE9wdGlvbnMuX0N0b3IgPSB7fSk7XG4gICAgaWYgKGNhY2hlZEN0b3JzW1N1cGVySWRdKSB7XG4gICAgICByZXR1cm4gY2FjaGVkQ3RvcnNbU3VwZXJJZF1cbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IGV4dGVuZE9wdGlvbnMubmFtZSB8fCBTdXBlci5vcHRpb25zLm5hbWU7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgbmFtZSkge1xuICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIH1cblxuICAgIHZhciBTdWIgPSBmdW5jdGlvbiBWdWVDb21wb25lbnQgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2luaXQob3B0aW9ucyk7XG4gICAgfTtcbiAgICBTdWIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTdXBlci5wcm90b3R5cGUpO1xuICAgIFN1Yi5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTdWI7XG4gICAgU3ViLmNpZCA9IGNpZCsrO1xuICAgIFN1Yi5vcHRpb25zID0gbWVyZ2VPcHRpb25zKFxuICAgICAgU3VwZXIub3B0aW9ucyxcbiAgICAgIGV4dGVuZE9wdGlvbnNcbiAgICApO1xuICAgIFN1Ylsnc3VwZXInXSA9IFN1cGVyO1xuXG4gICAgLy8gRm9yIHByb3BzIGFuZCBjb21wdXRlZCBwcm9wZXJ0aWVzLCB3ZSBkZWZpbmUgdGhlIHByb3h5IGdldHRlcnMgb25cbiAgICAvLyB0aGUgVnVlIGluc3RhbmNlcyBhdCBleHRlbnNpb24gdGltZSwgb24gdGhlIGV4dGVuZGVkIHByb3RvdHlwZS4gVGhpc1xuICAgIC8vIGF2b2lkcyBPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbHMgZm9yIGVhY2ggaW5zdGFuY2UgY3JlYXRlZC5cbiAgICBpZiAoU3ViLm9wdGlvbnMucHJvcHMpIHtcbiAgICAgIGluaXRQcm9wcyQxKFN1Yik7XG4gICAgfVxuICAgIGlmIChTdWIub3B0aW9ucy5jb21wdXRlZCkge1xuICAgICAgaW5pdENvbXB1dGVkJDEoU3ViKTtcbiAgICB9XG5cbiAgICAvLyBhbGxvdyBmdXJ0aGVyIGV4dGVuc2lvbi9taXhpbi9wbHVnaW4gdXNhZ2VcbiAgICBTdWIuZXh0ZW5kID0gU3VwZXIuZXh0ZW5kO1xuICAgIFN1Yi5taXhpbiA9IFN1cGVyLm1peGluO1xuICAgIFN1Yi51c2UgPSBTdXBlci51c2U7XG5cbiAgICAvLyBjcmVhdGUgYXNzZXQgcmVnaXN0ZXJzLCBzbyBleHRlbmRlZCBjbGFzc2VzXG4gICAgLy8gY2FuIGhhdmUgdGhlaXIgcHJpdmF0ZSBhc3NldHMgdG9vLlxuICAgIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgIFN1Ylt0eXBlXSA9IFN1cGVyW3R5cGVdO1xuICAgIH0pO1xuICAgIC8vIGVuYWJsZSByZWN1cnNpdmUgc2VsZi1sb29rdXBcbiAgICBpZiAobmFtZSkge1xuICAgICAgU3ViLm9wdGlvbnMuY29tcG9uZW50c1tuYW1lXSA9IFN1YjtcbiAgICB9XG5cbiAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBzdXBlciBvcHRpb25zIGF0IGV4dGVuc2lvbiB0aW1lLlxuICAgIC8vIGxhdGVyIGF0IGluc3RhbnRpYXRpb24gd2UgY2FuIGNoZWNrIGlmIFN1cGVyJ3Mgb3B0aW9ucyBoYXZlXG4gICAgLy8gYmVlbiB1cGRhdGVkLlxuICAgIFN1Yi5zdXBlck9wdGlvbnMgPSBTdXBlci5vcHRpb25zO1xuICAgIFN1Yi5leHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9ucztcbiAgICBTdWIuc2VhbGVkT3B0aW9ucyA9IGV4dGVuZCh7fSwgU3ViLm9wdGlvbnMpO1xuXG4gICAgLy8gY2FjaGUgY29uc3RydWN0b3JcbiAgICBjYWNoZWRDdG9yc1tTdXBlcklkXSA9IFN1YjtcbiAgICByZXR1cm4gU3ViXG4gIH07XG59XG5cbmZ1bmN0aW9uIGluaXRQcm9wcyQxIChDb21wKSB7XG4gIHZhciBwcm9wcyA9IENvbXAub3B0aW9ucy5wcm9wcztcbiAgZm9yICh2YXIga2V5IGluIHByb3BzKSB7XG4gICAgcHJveHkoQ29tcC5wcm90b3R5cGUsIFwiX3Byb3BzXCIsIGtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdENvbXB1dGVkJDEgKENvbXApIHtcbiAgdmFyIGNvbXB1dGVkID0gQ29tcC5vcHRpb25zLmNvbXB1dGVkO1xuICBmb3IgKHZhciBrZXkgaW4gY29tcHV0ZWQpIHtcbiAgICBkZWZpbmVDb21wdXRlZChDb21wLnByb3RvdHlwZSwga2V5LCBjb21wdXRlZFtrZXldKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEFzc2V0UmVnaXN0ZXJzIChWdWUpIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhc3NldCByZWdpc3RyYXRpb24gbWV0aG9kcy5cbiAgICovXG4gIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBWdWVbdHlwZV0gPSBmdW5jdGlvbiAoXG4gICAgICBpZCxcbiAgICAgIGRlZmluaXRpb25cbiAgICApIHtcbiAgICAgIGlmICghZGVmaW5pdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW3R5cGUgKyAncyddW2lkXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGUgPT09ICdjb21wb25lbnQnKSB7XG4gICAgICAgICAgdmFsaWRhdGVDb21wb25lbnROYW1lKGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gJ2NvbXBvbmVudCcgJiYgaXNQbGFpbk9iamVjdChkZWZpbml0aW9uKSkge1xuICAgICAgICAgIGRlZmluaXRpb24ubmFtZSA9IGRlZmluaXRpb24ubmFtZSB8fCBpZDtcbiAgICAgICAgICBkZWZpbml0aW9uID0gdGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZChkZWZpbml0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gJ2RpcmVjdGl2ZScgJiYgdHlwZW9mIGRlZmluaXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBkZWZpbml0aW9uID0geyBiaW5kOiBkZWZpbml0aW9uLCB1cGRhdGU6IGRlZmluaXRpb24gfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnNbdHlwZSArICdzJ11baWRdID0gZGVmaW5pdGlvbjtcbiAgICAgICAgcmV0dXJuIGRlZmluaXRpb25cbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuLyogICovXG5cblxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lIChvcHRzKSB7XG4gIHJldHVybiBvcHRzICYmIChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnKVxufVxuXG5mdW5jdGlvbiBtYXRjaGVzIChwYXR0ZXJuLCBuYW1lKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uaW5kZXhPZihuYW1lKSA+IC0xXG4gIH0gZWxzZSBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4uc3BsaXQoJywnKS5pbmRleE9mKG5hbWUpID4gLTFcbiAgfSBlbHNlIGlmIChpc1JlZ0V4cChwYXR0ZXJuKSkge1xuICAgIHJldHVybiBwYXR0ZXJuLnRlc3QobmFtZSlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gcHJ1bmVDYWNoZSAoa2VlcEFsaXZlSW5zdGFuY2UsIGZpbHRlcikge1xuICB2YXIgY2FjaGUgPSBrZWVwQWxpdmVJbnN0YW5jZS5jYWNoZTtcbiAgdmFyIGtleXMgPSBrZWVwQWxpdmVJbnN0YW5jZS5rZXlzO1xuICB2YXIgX3Zub2RlID0ga2VlcEFsaXZlSW5zdGFuY2UuX3Zub2RlO1xuICBmb3IgKHZhciBrZXkgaW4gY2FjaGUpIHtcbiAgICB2YXIgY2FjaGVkTm9kZSA9IGNhY2hlW2tleV07XG4gICAgaWYgKGNhY2hlZE5vZGUpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjYWNoZWROb2RlLmNvbXBvbmVudE9wdGlvbnMpO1xuICAgICAgaWYgKG5hbWUgJiYgIWZpbHRlcihuYW1lKSkge1xuICAgICAgICBwcnVuZUNhY2hlRW50cnkoY2FjaGUsIGtleSwga2V5cywgX3Zub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJ1bmVDYWNoZUVudHJ5IChcbiAgY2FjaGUsXG4gIGtleSxcbiAga2V5cyxcbiAgY3VycmVudFxuKSB7XG4gIHZhciBjYWNoZWQkJDEgPSBjYWNoZVtrZXldO1xuICBpZiAoY2FjaGVkJCQxICYmICghY3VycmVudCB8fCBjYWNoZWQkJDEudGFnICE9PSBjdXJyZW50LnRhZykpIHtcbiAgICBjYWNoZWQkJDEuY29tcG9uZW50SW5zdGFuY2UuJGRlc3Ryb3koKTtcbiAgfVxuICBjYWNoZVtrZXldID0gbnVsbDtcbiAgcmVtb3ZlKGtleXMsIGtleSk7XG59XG5cbnZhciBwYXR0ZXJuVHlwZXMgPSBbU3RyaW5nLCBSZWdFeHAsIEFycmF5XTtcblxudmFyIEtlZXBBbGl2ZSA9IHtcbiAgbmFtZTogJ2tlZXAtYWxpdmUnLFxuICBhYnN0cmFjdDogdHJ1ZSxcblxuICBwcm9wczoge1xuICAgIGluY2x1ZGU6IHBhdHRlcm5UeXBlcyxcbiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXMsXG4gICAgbWF4OiBbU3RyaW5nLCBOdW1iZXJdXG4gIH0sXG5cbiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCAoKSB7XG4gICAgdGhpcy5jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5rZXlzID0gW107XG4gIH0sXG5cbiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQgKCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmNhY2hlKSB7XG4gICAgICBwcnVuZUNhY2hlRW50cnkodGhpcy5jYWNoZSwga2V5LCB0aGlzLmtleXMpO1xuICAgIH1cbiAgfSxcblxuICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAgIHRoaXMuJHdhdGNoKCdpbmNsdWRlJywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcHJ1bmVDYWNoZSh0aGlzJDEsIGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBtYXRjaGVzKHZhbCwgbmFtZSk7IH0pO1xuICAgIH0pO1xuICAgIHRoaXMuJHdhdGNoKCdleGNsdWRlJywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcHJ1bmVDYWNoZSh0aGlzJDEsIGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiAhbWF0Y2hlcyh2YWwsIG5hbWUpOyB9KTtcbiAgICB9KTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoKSB7XG4gICAgdmFyIHNsb3QgPSB0aGlzLiRzbG90cy5kZWZhdWx0O1xuICAgIHZhciB2bm9kZSA9IGdldEZpcnN0Q29tcG9uZW50Q2hpbGQoc2xvdCk7XG4gICAgdmFyIGNvbXBvbmVudE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7XG4gICAgICAvLyBjaGVjayBwYXR0ZXJuXG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY29tcG9uZW50T3B0aW9ucyk7XG4gICAgICB2YXIgcmVmID0gdGhpcztcbiAgICAgIHZhciBpbmNsdWRlID0gcmVmLmluY2x1ZGU7XG4gICAgICB2YXIgZXhjbHVkZSA9IHJlZi5leGNsdWRlO1xuICAgICAgaWYgKFxuICAgICAgICAvLyBub3QgaW5jbHVkZWRcbiAgICAgICAgKGluY2x1ZGUgJiYgKCFuYW1lIHx8ICFtYXRjaGVzKGluY2x1ZGUsIG5hbWUpKSkgfHxcbiAgICAgICAgLy8gZXhjbHVkZWRcbiAgICAgICAgKGV4Y2x1ZGUgJiYgbmFtZSAmJiBtYXRjaGVzKGV4Y2x1ZGUsIG5hbWUpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB2bm9kZVxuICAgICAgfVxuXG4gICAgICB2YXIgcmVmJDEgPSB0aGlzO1xuICAgICAgdmFyIGNhY2hlID0gcmVmJDEuY2FjaGU7XG4gICAgICB2YXIga2V5cyA9IHJlZiQxLmtleXM7XG4gICAgICB2YXIga2V5ID0gdm5vZGUua2V5ID09IG51bGxcbiAgICAgICAgLy8gc2FtZSBjb25zdHJ1Y3RvciBtYXkgZ2V0IHJlZ2lzdGVyZWQgYXMgZGlmZmVyZW50IGxvY2FsIGNvbXBvbmVudHNcbiAgICAgICAgLy8gc28gY2lkIGFsb25lIGlzIG5vdCBlbm91Z2ggKCMzMjY5KVxuICAgICAgICA/IGNvbXBvbmVudE9wdGlvbnMuQ3Rvci5jaWQgKyAoY29tcG9uZW50T3B0aW9ucy50YWcgPyAoXCI6OlwiICsgKGNvbXBvbmVudE9wdGlvbnMudGFnKSkgOiAnJylcbiAgICAgICAgOiB2bm9kZS5rZXk7XG4gICAgICBpZiAoY2FjaGVba2V5XSkge1xuICAgICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IGNhY2hlW2tleV0uY29tcG9uZW50SW5zdGFuY2U7XG4gICAgICAgIC8vIG1ha2UgY3VycmVudCBrZXkgZnJlc2hlc3RcbiAgICAgICAgcmVtb3ZlKGtleXMsIGtleSk7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FjaGVba2V5XSA9IHZub2RlO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgLy8gcHJ1bmUgb2xkZXN0IGVudHJ5XG4gICAgICAgIGlmICh0aGlzLm1heCAmJiBrZXlzLmxlbmd0aCA+IHBhcnNlSW50KHRoaXMubWF4KSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShjYWNoZSwga2V5c1swXSwga2V5cywgdGhpcy5fdm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlIHx8IChzbG90ICYmIHNsb3RbMF0pXG4gIH1cbn07XG5cbnZhciBidWlsdEluQ29tcG9uZW50cyA9IHtcbiAgS2VlcEFsaXZlOiBLZWVwQWxpdmVcbn07XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0R2xvYmFsQVBJIChWdWUpIHtcbiAgLy8gY29uZmlnXG4gIHZhciBjb25maWdEZWYgPSB7fTtcbiAgY29uZmlnRGVmLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbmZpZzsgfTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25maWdEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0RvIG5vdCByZXBsYWNlIHRoZSBWdWUuY29uZmlnIG9iamVjdCwgc2V0IGluZGl2aWR1YWwgZmllbGRzIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUsICdjb25maWcnLCBjb25maWdEZWYpO1xuXG4gIC8vIGV4cG9zZWQgdXRpbCBtZXRob2RzLlxuICAvLyBOT1RFOiB0aGVzZSBhcmUgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHVibGljIEFQSSAtIGF2b2lkIHJlbHlpbmcgb25cbiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay5cbiAgVnVlLnV0aWwgPSB7XG4gICAgd2Fybjogd2FybixcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBtZXJnZU9wdGlvbnM6IG1lcmdlT3B0aW9ucyxcbiAgICBkZWZpbmVSZWFjdGl2ZTogZGVmaW5lUmVhY3RpdmUkJDFcbiAgfTtcblxuICBWdWUuc2V0ID0gc2V0O1xuICBWdWUuZGVsZXRlID0gZGVsO1xuICBWdWUubmV4dFRpY2sgPSBuZXh0VGljaztcblxuICAvLyAyLjYgZXhwbGljaXQgb2JzZXJ2YWJsZSBBUElcbiAgVnVlLm9ic2VydmFibGUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgb2JzZXJ2ZShvYmopO1xuICAgIHJldHVybiBvYmpcbiAgfTtcblxuICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBWdWUub3B0aW9uc1t0eXBlICsgJ3MnXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH0pO1xuXG4gIC8vIHRoaXMgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgXCJiYXNlXCIgY29uc3RydWN0b3IgdG8gZXh0ZW5kIGFsbCBwbGFpbi1vYmplY3RcbiAgLy8gY29tcG9uZW50cyB3aXRoIGluIFdlZXgncyBtdWx0aS1pbnN0YW5jZSBzY2VuYXJpb3MuXG4gIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlO1xuXG4gIGV4dGVuZChWdWUub3B0aW9ucy5jb21wb25lbnRzLCBidWlsdEluQ29tcG9uZW50cyk7XG5cbiAgaW5pdFVzZShWdWUpO1xuICBpbml0TWl4aW4kMShWdWUpO1xuICBpbml0RXh0ZW5kKFZ1ZSk7XG4gIGluaXRBc3NldFJlZ2lzdGVycyhWdWUpO1xufVxuXG5pbml0R2xvYmFsQVBJKFZ1ZSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywge1xuICBnZXQ6IGlzU2VydmVyUmVuZGVyaW5nXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckc3NyQ29udGV4dCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHRcbiAgfVxufSk7XG5cbi8vIGV4cG9zZSBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCBmb3Igc3NyIHJ1bnRpbWUgaGVscGVyIGluc3RhbGxhdGlvblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0Jywge1xuICB2YWx1ZTogRnVuY3Rpb25hbFJlbmRlckNvbnRleHRcbn0pO1xuXG5WdWUudmVyc2lvbiA9ICcyLjYuMTEnO1xuXG4vKipcbiAqIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9UZW5jZW50L3dlc3RvcmUvbWFzdGVyL3BhY2thZ2VzL3dlc3RvcmUvdXRpbHMvZGlmZi5qc1xuICovXG52YXIgQVJSQVlUWVBFID0gJ1tvYmplY3QgQXJyYXldJztcbnZhciBPQkpFQ1RUWVBFID0gJ1tvYmplY3QgT2JqZWN0XSc7XG4vLyBjb25zdCBGVU5DVElPTlRZUEUgPSAnW29iamVjdCBGdW5jdGlvbl0nXG5cbmZ1bmN0aW9uIGRpZmYoY3VycmVudCwgcHJlKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHN5bmNLZXlzKGN1cnJlbnQsIHByZSk7XG4gICAgX2RpZmYoY3VycmVudCwgcHJlLCAnJywgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHN5bmNLZXlzKGN1cnJlbnQsIHByZSkge1xuICAgIGlmIChjdXJyZW50ID09PSBwcmUpIHsgcmV0dXJuIH1cbiAgICB2YXIgcm9vdEN1cnJlbnRUeXBlID0gdHlwZShjdXJyZW50KTtcbiAgICB2YXIgcm9vdFByZVR5cGUgPSB0eXBlKHByZSk7XG4gICAgaWYgKHJvb3RDdXJyZW50VHlwZSA9PSBPQkpFQ1RUWVBFICYmIHJvb3RQcmVUeXBlID09IE9CSkVDVFRZUEUpIHtcbiAgICAgICAgaWYoT2JqZWN0LmtleXMoY3VycmVudCkubGVuZ3RoID49IE9iamVjdC5rZXlzKHByZSkubGVuZ3RoKXtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwcmUpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gY3VycmVudFtrZXldO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50W2tleV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN5bmNLZXlzKGN1cnJlbnRWYWx1ZSwgcHJlW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAocm9vdEN1cnJlbnRUeXBlID09IEFSUkFZVFlQRSAmJiByb290UHJlVHlwZSA9PSBBUlJBWVRZUEUpIHtcbiAgICAgICAgaWYgKGN1cnJlbnQubGVuZ3RoID49IHByZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHByZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHN5bmNLZXlzKGN1cnJlbnRbaW5kZXhdLCBpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfZGlmZihjdXJyZW50LCBwcmUsIHBhdGgsIHJlc3VsdCkge1xuICAgIGlmIChjdXJyZW50ID09PSBwcmUpIHsgcmV0dXJuIH1cbiAgICB2YXIgcm9vdEN1cnJlbnRUeXBlID0gdHlwZShjdXJyZW50KTtcbiAgICB2YXIgcm9vdFByZVR5cGUgPSB0eXBlKHByZSk7XG4gICAgaWYgKHJvb3RDdXJyZW50VHlwZSA9PSBPQkpFQ1RUWVBFKSB7XG4gICAgICAgIGlmIChyb290UHJlVHlwZSAhPSBPQkpFQ1RUWVBFIHx8IE9iamVjdC5rZXlzKGN1cnJlbnQpLmxlbmd0aCA8IE9iamVjdC5rZXlzKHByZSkubGVuZ3RoKSB7XG4gICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCBwYXRoLCBjdXJyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRba2V5XTtcbiAgICAgICAgICAgICAgICB2YXIgcHJlVmFsdWUgPSBwcmVba2V5XTtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFR5cGUgPSB0eXBlKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdmFyIHByZVR5cGUgPSB0eXBlKHByZVZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFR5cGUgIT0gQVJSQVlUWVBFICYmIGN1cnJlbnRUeXBlICE9IE9CSkVDVFRZUEUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gcHJlW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQsIChwYXRoID09ICcnID8gJycgOiBwYXRoICsgXCIuXCIpICsga2V5LCBjdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VHlwZSA9PSBBUlJBWVRZUEUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZVR5cGUgIT0gQVJSQVlUWVBFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCAocGF0aCA9PSAnJyA/ICcnIDogcGF0aCArIFwiLlwiKSArIGtleSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUubGVuZ3RoIDwgcHJlVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwgKHBhdGggPT0gJycgPyAnJyA6IHBhdGggKyBcIi5cIikgKyBrZXksIGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGlmZihpdGVtLCBwcmVWYWx1ZVtpbmRleF0sIChwYXRoID09ICcnID8gJycgOiBwYXRoICsgXCIuXCIpICsga2V5ICsgJ1snICsgaW5kZXggKyAnXScsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUeXBlID09IE9CSkVDVFRZUEUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZVR5cGUgIT0gT0JKRUNUVFlQRSB8fCBPYmplY3Qua2V5cyhjdXJyZW50VmFsdWUpLmxlbmd0aCA8IE9iamVjdC5rZXlzKHByZVZhbHVlKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQsIChwYXRoID09ICcnID8gJycgOiBwYXRoICsgXCIuXCIpICsga2V5LCBjdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgc3ViS2V5IGluIGN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kaWZmKGN1cnJlbnRWYWx1ZVtzdWJLZXldLCBwcmVWYWx1ZVtzdWJLZXldLCAocGF0aCA9PSAnJyA/ICcnIDogcGF0aCArIFwiLlwiKSArIGtleSArICcuJyArIHN1YktleSwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBjdXJyZW50KSBsb29wKCBrZXkgKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAocm9vdEN1cnJlbnRUeXBlID09IEFSUkFZVFlQRSkge1xuICAgICAgICBpZiAocm9vdFByZVR5cGUgIT0gQVJSQVlUWVBFKSB7XG4gICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCBwYXRoLCBjdXJyZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCA8IHByZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCBwYXRoLCBjdXJyZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBfZGlmZihpdGVtLCBwcmVbaW5kZXhdLCBwYXRoICsgJ1snICsgaW5kZXggKyAnXScsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCBwYXRoLCBjdXJyZW50KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc3VsdChyZXN1bHQsIGssIHYpIHtcbiAgICAvLyBpZiAodHlwZSh2KSAhPSBGVU5DVElPTlRZUEUpIHtcbiAgICAgICAgcmVzdWx0W2tdID0gdjtcbiAgICAvLyB9XG59XG5cbmZ1bmN0aW9uIHR5cGUob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBmbHVzaENhbGxiYWNrcyQxKHZtKSB7XG4gICAgaWYgKHZtLl9fbmV4dF90aWNrX2NhbGxiYWNrcyAmJiB2bS5fX25leHRfdGlja19jYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5WVUVfQVBQX0RFQlVHKSB7XG4gICAgICAgICAgICB2YXIgbXBJbnN0YW5jZSA9IHZtLiRzY29wZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbJyArICgrbmV3IERhdGUpICsgJ11bJyArIChtcEluc3RhbmNlLmlzIHx8IG1wSW5zdGFuY2Uucm91dGUpICsgJ11bJyArIHZtLl91aWQgK1xuICAgICAgICAgICAgICAgICddOmZsdXNoQ2FsbGJhY2tzWycgKyB2bS5fX25leHRfdGlja19jYWxsYmFja3MubGVuZ3RoICsgJ10nKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY29waWVzID0gdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzLnNsaWNlKDApO1xuICAgICAgICB2bS5fX25leHRfdGlja19jYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3BpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvcGllc1tpXSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBoYXNSZW5kZXJXYXRjaGVyKHZtKSB7XG4gICAgcmV0dXJuIHF1ZXVlLmZpbmQoZnVuY3Rpb24gKHdhdGNoZXIpIHsgcmV0dXJuIHZtLl93YXRjaGVyID09PSB3YXRjaGVyOyB9KVxufVxuXG5mdW5jdGlvbiBuZXh0VGljayQxKHZtLCBjYikge1xuICAgIC8vMS5uZXh0VGljayDkuYvliY0g5beyIHNldERhdGEg5LiUIHNldERhdGEg6L+Y5pyq5Zue6LCD5a6M5oiQXG4gICAgLy8yLm5leHRUaWNrIOS5i+WJjeWtmOWcqCByZW5kZXIgd2F0Y2hlclxuICAgIGlmICghdm0uX19uZXh0X3RpY2tfcGVuZGluZyAmJiAhaGFzUmVuZGVyV2F0Y2hlcih2bSkpIHtcbiAgICAgICAgaWYocHJvY2Vzcy5lbnYuVlVFX0FQUF9ERUJVRyl7XG4gICAgICAgICAgICB2YXIgbXBJbnN0YW5jZSA9IHZtLiRzY29wZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbJyArICgrbmV3IERhdGUpICsgJ11bJyArIChtcEluc3RhbmNlLmlzIHx8IG1wSW5zdGFuY2Uucm91dGUpICsgJ11bJyArIHZtLl91aWQgK1xuICAgICAgICAgICAgICAgICddOm5leHRWdWVUaWNrJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHRUaWNrKGNiLCB2bSlcbiAgICB9ZWxzZXtcbiAgICAgICAgaWYocHJvY2Vzcy5lbnYuVlVFX0FQUF9ERUJVRyl7XG4gICAgICAgICAgICB2YXIgbXBJbnN0YW5jZSQxID0gdm0uJHNjb3BlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1snICsgKCtuZXcgRGF0ZSkgKyAnXVsnICsgKG1wSW5zdGFuY2UkMS5pcyB8fCBtcEluc3RhbmNlJDEucm91dGUpICsgJ11bJyArIHZtLl91aWQgK1xuICAgICAgICAgICAgICAgICddOm5leHRNUFRpY2snKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgX3Jlc29sdmU7XG4gICAgaWYgKCF2bS5fX25leHRfdGlja19jYWxsYmFja3MpIHtcbiAgICAgICAgdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzID0gW107XG4gICAgfVxuICAgIHZtLl9fbmV4dF90aWNrX2NhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNiKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNiLmNhbGwodm0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAnbmV4dFRpY2snKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChfcmVzb2x2ZSkge1xuICAgICAgICAgICAgX3Jlc29sdmUodm0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgaWYgKCFjYiAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIH0pXG4gICAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gY2xvbmVXaXRoRGF0YSh2bSkge1xuICAvLyDnoa7kv53lvZPliY0gdm0g5omA5pyJ5pWw5o2u6KKr5ZCM5q2lXG4gIHZhciByZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2YXIgZGF0YUtleXMgPSBbXS5jb25jYXQoXG4gICAgT2JqZWN0LmtleXModm0uX2RhdGEgfHwge30pLFxuICAgIE9iamVjdC5rZXlzKHZtLl9jb21wdXRlZFdhdGNoZXJzIHx8IHt9KSk7XG5cbiAgZGF0YUtleXMucmVkdWNlKGZ1bmN0aW9uKHJldCwga2V5KSB7XG4gICAgcmV0W2tleV0gPSB2bVtrZXldO1xuICAgIHJldHVybiByZXRcbiAgfSwgcmV0KTtcblxuICAvLyB2dWUtY29tcG9zaXRpb24tYXBpXG4gIHZhciBjb21wb3NpdGlvbkFwaVN0YXRlID0gdm0uX19jb21wb3NpdGlvbl9hcGlfc3RhdGVfXyB8fCB2bS5fX3NlY3JldF92ZmFfc3RhdGVfXztcbiAgdmFyIHJhd0JpbmRpbmdzID0gY29tcG9zaXRpb25BcGlTdGF0ZSAmJiBjb21wb3NpdGlvbkFwaVN0YXRlLnJhd0JpbmRpbmdzO1xuICBpZiAocmF3QmluZGluZ3MpIHtcbiAgICBPYmplY3Qua2V5cyhyYXdCaW5kaW5ncykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICByZXRba2V5XSA9IHZtW2tleV07XG4gICAgfSk7XG4gIH1cblxuICAvL1RPRE8g6ZyA6KaB5oqK5peg55So5pWw5o2u5aSE55CG5o6J77yM5q+U5aaCIGxpc3Q9PmwwIOWImSBsaXN0IOmcgOimgeenu+mZpO+8jOWQpuWImeWkmuS8oOi+k+S4gOS7veaVsOaNrlxuICBPYmplY3QuYXNzaWduKHJldCwgdm0uJG1wLmRhdGEgfHwge30pO1xuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheSh2bS4kb3B0aW9ucy5iZWhhdmlvcnMpICYmXG4gICAgdm0uJG9wdGlvbnMuYmVoYXZpb3JzLmluZGV4T2YoJ3VuaTovL2Zvcm0tZmllbGQnKSAhPT0gLTFcbiAgKSB7IC8vZm9ybS1maWVsZFxuICAgIHJldFsnbmFtZSddID0gdm0ubmFtZTtcbiAgICByZXRbJ3ZhbHVlJ10gPSB2bS52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJldCkpXG59XG5cbnZhciBwYXRjaCA9IGZ1bmN0aW9uKG9sZFZub2RlLCB2bm9kZSkge1xuICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAodm5vZGUgPT09IG51bGwpIHsgLy9kZXN0cm95XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHRoaXMubXBUeXBlID09PSAncGFnZScgfHwgdGhpcy5tcFR5cGUgPT09ICdjb21wb25lbnQnKSB7XG4gICAgdmFyIG1wSW5zdGFuY2UgPSB0aGlzLiRzY29wZTtcbiAgICB2YXIgZGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPSBjbG9uZVdpdGhEYXRhKHRoaXMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH1cbiAgICBkYXRhLl9fd2Vidmlld0lkX18gPSBtcEluc3RhbmNlLmRhdGEuX193ZWJ2aWV3SWRfXztcbiAgICB2YXIgbXBEYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgLy/ku4XlkIzmraUgZGF0YSDkuK3mnInnmoTmlbDmja5cbiAgICAgIG1wRGF0YVtrZXldID0gbXBJbnN0YW5jZS5kYXRhW2tleV07XG4gICAgfSk7XG4gICAgdmFyIGRpZmZEYXRhID0gdGhpcy4kc2hvdWxkRGlmZkRhdGEgPT09IGZhbHNlID8gZGF0YSA6IGRpZmYoZGF0YSwgbXBEYXRhKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoZGlmZkRhdGEpLmxlbmd0aCkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52LlZVRV9BUFBfREVCVUcpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1snICsgKCtuZXcgRGF0ZSkgKyAnXVsnICsgKG1wSW5zdGFuY2UuaXMgfHwgbXBJbnN0YW5jZS5yb3V0ZSkgKyAnXVsnICsgdGhpcy5fdWlkICtcbiAgICAgICAgICAnXeW3rumHj+abtOaWsCcsXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZGlmZkRhdGEpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX19uZXh0X3RpY2tfcGVuZGluZyA9IHRydWU7XG4gICAgICBtcEluc3RhbmNlLnNldERhdGEoZGlmZkRhdGEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcyQxLl9fbmV4dF90aWNrX3BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgZmx1c2hDYWxsYmFja3MkMSh0aGlzJDEpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZsdXNoQ2FsbGJhY2tzJDEodGhpcyk7XG4gICAgfVxuICB9XG59O1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gY3JlYXRlRW1wdHlSZW5kZXIoKSB7XG5cbn1cblxuZnVuY3Rpb24gbW91bnRDb21wb25lbnQkMShcbiAgdm0sXG4gIGVsLFxuICBoeWRyYXRpbmdcbikge1xuICBpZiAoIXZtLm1wVHlwZSkgey8vbWFpbi5qcyDkuK3nmoQgbmV3IFZ1ZVxuICAgIHJldHVybiB2bVxuICB9XG4gIGlmICh2bS5tcFR5cGUgPT09ICdhcHAnKSB7XG4gICAgdm0uJG9wdGlvbnMucmVuZGVyID0gY3JlYXRlRW1wdHlSZW5kZXI7XG4gIH1cbiAgaWYgKCF2bS4kb3B0aW9ucy5yZW5kZXIpIHtcbiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVJlbmRlcjtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICBpZiAoKHZtLiRvcHRpb25zLnRlbXBsYXRlICYmIHZtLiRvcHRpb25zLnRlbXBsYXRlLmNoYXJBdCgwKSAhPT0gJyMnKSB8fFxuICAgICAgICB2bS4kb3B0aW9ucy5lbCB8fCBlbCkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgICdZb3UgYXJlIHVzaW5nIHRoZSBydW50aW1lLW9ubHkgYnVpbGQgb2YgVnVlIHdoZXJlIHRoZSB0ZW1wbGF0ZSAnICtcbiAgICAgICAgICAnY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIHByZS1jb21waWxlIHRoZSB0ZW1wbGF0ZXMgaW50byAnICtcbiAgICAgICAgICAncmVuZGVyIGZ1bmN0aW9ucywgb3IgdXNlIHRoZSBjb21waWxlci1pbmNsdWRlZCBidWlsZC4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgICdGYWlsZWQgdG8gbW91bnQgY29tcG9uZW50OiB0ZW1wbGF0ZSBvciByZW5kZXIgZnVuY3Rpb24gbm90IGRlZmluZWQuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgIXZtLl8kZmFsbGJhY2sgJiYgY2FsbEhvb2sodm0sICdiZWZvcmVNb3VudCcpO1xuXG4gIHZhciB1cGRhdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdm0uX3VwZGF0ZSh2bS5fcmVuZGVyKCksIGh5ZHJhdGluZyk7XG4gIH07XG5cbiAgLy8gd2Ugc2V0IHRoaXMgdG8gdm0uX3dhdGNoZXIgaW5zaWRlIHRoZSB3YXRjaGVyJ3MgY29uc3RydWN0b3JcbiAgLy8gc2luY2UgdGhlIHdhdGNoZXIncyBpbml0aWFsIHBhdGNoIG1heSBjYWxsICRmb3JjZVVwZGF0ZSAoZS5nLiBpbnNpZGUgY2hpbGRcbiAgLy8gY29tcG9uZW50J3MgbW91bnRlZCBob29rKSwgd2hpY2ggcmVsaWVzIG9uIHZtLl93YXRjaGVyIGJlaW5nIGFscmVhZHkgZGVmaW5lZFxuICBuZXcgV2F0Y2hlcih2bSwgdXBkYXRlQ29tcG9uZW50LCBub29wLCB7XG4gICAgYmVmb3JlOiBmdW5jdGlvbiBiZWZvcmUoKSB7XG4gICAgICBpZiAodm0uX2lzTW91bnRlZCAmJiAhdm0uX2lzRGVzdHJveWVkKSB7XG4gICAgICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlVXBkYXRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB0cnVlIC8qIGlzUmVuZGVyV2F0Y2hlciAqLyk7XG4gIGh5ZHJhdGluZyA9IGZhbHNlO1xuICByZXR1cm4gdm1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIHJlbmRlckNsYXNzIChcbiAgc3RhdGljQ2xhc3MsXG4gIGR5bmFtaWNDbGFzc1xuKSB7XG4gIGlmIChpc0RlZihzdGF0aWNDbGFzcykgfHwgaXNEZWYoZHluYW1pY0NsYXNzKSkge1xuICAgIHJldHVybiBjb25jYXQoc3RhdGljQ2xhc3MsIHN0cmluZ2lmeUNsYXNzKGR5bmFtaWNDbGFzcykpXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuICcnXG59XG5cbmZ1bmN0aW9uIGNvbmNhdCAoYSwgYikge1xuICByZXR1cm4gYSA/IGIgPyAoYSArICcgJyArIGIpIDogYSA6IChiIHx8ICcnKVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlDbGFzcyAodmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeUFycmF5KHZhbHVlKVxuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5T2JqZWN0KHZhbHVlKVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuICcnXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUFycmF5ICh2YWx1ZSkge1xuICB2YXIgcmVzID0gJyc7XG4gIHZhciBzdHJpbmdpZmllZDtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoaXNEZWYoc3RyaW5naWZpZWQgPSBzdHJpbmdpZnlDbGFzcyh2YWx1ZVtpXSkpICYmIHN0cmluZ2lmaWVkICE9PSAnJykge1xuICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9XG4gICAgICByZXMgKz0gc3RyaW5naWZpZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5T2JqZWN0ICh2YWx1ZSkge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZVtrZXldKSB7XG4gICAgICBpZiAocmVzKSB7IHJlcyArPSAnICc7IH1cbiAgICAgIHJlcyArPSBrZXk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbnZhciBwYXJzZVN0eWxlVGV4dCA9IGNhY2hlZChmdW5jdGlvbiAoY3NzVGV4dCkge1xuICB2YXIgcmVzID0ge307XG4gIHZhciBsaXN0RGVsaW1pdGVyID0gLzsoPyFbXihdKlxcKSkvZztcbiAgdmFyIHByb3BlcnR5RGVsaW1pdGVyID0gLzooLispLztcbiAgY3NzVGV4dC5zcGxpdChsaXN0RGVsaW1pdGVyKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIHZhciB0bXAgPSBpdGVtLnNwbGl0KHByb3BlcnR5RGVsaW1pdGVyKTtcbiAgICAgIHRtcC5sZW5ndGggPiAxICYmIChyZXNbdG1wWzBdLnRyaW0oKV0gPSB0bXBbMV0udHJpbSgpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzXG59KTtcblxuLy8gbm9ybWFsaXplIHBvc3NpYmxlIGFycmF5IC8gc3RyaW5nIHZhbHVlcyBpbnRvIE9iamVjdFxuZnVuY3Rpb24gbm9ybWFsaXplU3R5bGVCaW5kaW5nIChiaW5kaW5nU3R5bGUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYmluZGluZ1N0eWxlKSkge1xuICAgIHJldHVybiB0b09iamVjdChiaW5kaW5nU3R5bGUpXG4gIH1cbiAgaWYgKHR5cGVvZiBiaW5kaW5nU3R5bGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHBhcnNlU3R5bGVUZXh0KGJpbmRpbmdTdHlsZSlcbiAgfVxuICByZXR1cm4gYmluZGluZ1N0eWxlXG59XG5cbi8qICAqL1xuXG52YXIgTVBfTUVUSE9EUyA9IFsnY3JlYXRlU2VsZWN0b3JRdWVyeScsICdjcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcicsICdzZWxlY3RBbGxDb21wb25lbnRzJywgJ3NlbGVjdENvbXBvbmVudCddO1xuXG5mdW5jdGlvbiBnZXRUYXJnZXQob2JqLCBwYXRoKSB7XG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIGtleSA9IHBhcnRzWzBdO1xuICBpZiAoa2V5LmluZGV4T2YoJ19fJG4nKSA9PT0gMCkgeyAvL251bWJlciBpbmRleFxuICAgIGtleSA9IHBhcnNlSW50KGtleS5yZXBsYWNlKCdfXyRuJywgJycpKTtcbiAgfVxuICBpZiAocGFydHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG9ialtrZXldXG4gIH1cbiAgcmV0dXJuIGdldFRhcmdldChvYmpba2V5XSwgcGFydHMuc2xpY2UoMSkuam9pbignLicpKVxufVxuXG5mdW5jdGlvbiBpbnRlcm5hbE1peGluKFZ1ZSkge1xuXG4gIFZ1ZS5jb25maWcuZXJyb3JIYW5kbGVyID0gZnVuY3Rpb24oZXJyLCB2bSwgaW5mbykge1xuICAgIFZ1ZS51dGlsLndhcm4oKFwiRXJyb3IgaW4gXCIgKyBpbmZvICsgXCI6IFxcXCJcIiArIChlcnIudG9TdHJpbmcoKSkgKyBcIlxcXCJcIiksIHZtKTtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbiAgICB2YXIgYXBwID0gdHlwZW9mIGdldEFwcCA9PT0gJ2Z1bmN0aW9uJyAmJiBnZXRBcHAoKTtcbiAgICBpZiAoYXBwICYmIGFwcC5vbkVycm9yKSB7XG4gICAgICBhcHAub25FcnJvcihlcnIpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgb2xkRW1pdCA9IFZ1ZS5wcm90b3R5cGUuJGVtaXQ7XG5cbiAgVnVlLnByb3RvdHlwZS4kZW1pdCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuJHNjb3BlICYmIGV2ZW50KSB7XG4gICAgICAodGhpcy4kc2NvcGVbJ190cmlnZ2VyRXZlbnQnXSB8fCB0aGlzLiRzY29wZVsndHJpZ2dlckV2ZW50J10pLmNhbGwodGhpcy4kc2NvcGUsIGV2ZW50LCB7XG4gICAgICAgIF9fYXJnc19fOiB0b0FycmF5KGFyZ3VtZW50cywgMSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb2xkRW1pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kbmV4dFRpY2sgPSBmdW5jdGlvbihmbikge1xuICAgIHJldHVybiBuZXh0VGljayQxKHRoaXMsIGZuKVxuICB9O1xuXG4gIE1QX01FVEhPRFMuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgVnVlLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJncykge1xuICAgICAgaWYgKHRoaXMuJHNjb3BlICYmIHRoaXMuJHNjb3BlW21ldGhvZF0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHNjb3BlW21ldGhvZF0oYXJncylcbiAgICAgIH1cbiAgICAgIC8vIG1wLWFsaXBheVxuICAgICAgaWYgKHR5cGVvZiBteSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSAnY3JlYXRlU2VsZWN0b3JRdWVyeScpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbiAgICAgICAgcmV0dXJuIG15LmNyZWF0ZVNlbGVjdG9yUXVlcnkoYXJncylcbiAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXInKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgIHJldHVybiBteS5jcmVhdGVJbnRlcnNlY3Rpb25PYnNlcnZlcihhcmdzKVxuICAgICAgfVxuICAgICAgLy8gVE9ETyBtcC1hbGlwYXkg5pqC5LiN5pSv5oyBIHNlbGVjdEFsbENvbXBvbmVudHMsc2VsZWN0Q29tcG9uZW50XG4gICAgfTtcbiAgfSk7XG5cbiAgVnVlLnByb3RvdHlwZS5fX2luaXRfcHJvdmlkZSA9IGluaXRQcm92aWRlO1xuXG4gIFZ1ZS5wcm90b3R5cGUuX19pbml0X2luamVjdGlvbnMgPSBpbml0SW5qZWN0aW9ucztcblxuICBWdWUucHJvdG90eXBlLl9fY2FsbF9ob29rID0gZnVuY3Rpb24oaG9vaywgYXJncykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgLy8gIzc1NzMgZGlzYWJsZSBkZXAgY29sbGVjdGlvbiB3aGVuIGludm9raW5nIGxpZmVjeWNsZSBob29rc1xuICAgIHB1c2hUYXJnZXQoKTtcbiAgICB2YXIgaGFuZGxlcnMgPSB2bS4kb3B0aW9uc1tob29rXTtcbiAgICB2YXIgaW5mbyA9IGhvb2sgKyBcIiBob29rXCI7XG4gICAgdmFyIHJldDtcbiAgICBpZiAoaGFuZGxlcnMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgIHJldCA9IGludm9rZVdpdGhFcnJvckhhbmRsaW5nKGhhbmRsZXJzW2ldLCB2bSwgYXJncyA/IFthcmdzXSA6IG51bGwsIHZtLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZtLl9oYXNIb29rRXZlbnQpIHtcbiAgICAgIHZtLiRlbWl0KCdob29rOicgKyBob29rLCBhcmdzKTtcbiAgICB9XG4gICAgcG9wVGFyZ2V0KCk7XG4gICAgcmV0dXJuIHJldFxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX19zZXRfbW9kZWwgPSBmdW5jdGlvbih0YXJnZXQsIGtleSwgdmFsdWUsIG1vZGlmaWVycykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGlmaWVycykpIHtcbiAgICAgIGlmIChtb2RpZmllcnMuaW5kZXhPZigndHJpbScpICE9PSAtMSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RpZmllcnMuaW5kZXhPZignbnVtYmVyJykgIT09IC0xKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5fbih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0YXJnZXQgPSB0aGlzO1xuICAgIH1cbiAgICAvLyDop6PlhrPliqjmgIHlsZ7mgKfmt7vliqBcbiAgICBWdWUuc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fX3NldF9zeW5jID0gZnVuY3Rpb24odGFyZ2V0LCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRhcmdldCA9IHRoaXM7XG4gICAgfVxuICAgIC8vIOino+WGs+WKqOaAgeWxnuaAp+a3u+WKoFxuICAgIFZ1ZS5zZXQodGFyZ2V0LCBrZXksIHZhbHVlKTtcbiAgfTtcblxuICBWdWUucHJvdG90eXBlLl9fZ2V0X29yaWcgPSBmdW5jdGlvbihpdGVtKSB7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QoaXRlbSkpIHtcbiAgICAgIHJldHVybiBpdGVtWyckb3JpZyddIHx8IGl0ZW1cbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLl9fZ2V0X3ZhbHVlID0gZnVuY3Rpb24oZGF0YVBhdGgsIHRhcmdldCkge1xuICAgIHJldHVybiBnZXRUYXJnZXQodGFyZ2V0IHx8IHRoaXMsIGRhdGFQYXRoKVxuICB9O1xuXG5cbiAgVnVlLnByb3RvdHlwZS5fX2dldF9jbGFzcyA9IGZ1bmN0aW9uKGR5bmFtaWNDbGFzcywgc3RhdGljQ2xhc3MpIHtcbiAgICByZXR1cm4gcmVuZGVyQ2xhc3Moc3RhdGljQ2xhc3MsIGR5bmFtaWNDbGFzcylcbiAgfTtcblxuICBWdWUucHJvdG90eXBlLl9fZ2V0X3N0eWxlID0gZnVuY3Rpb24oZHluYW1pY1N0eWxlLCBzdGF0aWNTdHlsZSkge1xuICAgIGlmICghZHluYW1pY1N0eWxlICYmICFzdGF0aWNTdHlsZSkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICAgIHZhciBkeW5hbWljU3R5bGVPYmogPSBub3JtYWxpemVTdHlsZUJpbmRpbmcoZHluYW1pY1N0eWxlKTtcbiAgICB2YXIgc3R5bGVPYmogPSBzdGF0aWNTdHlsZSA/IGV4dGVuZChzdGF0aWNTdHlsZSwgZHluYW1pY1N0eWxlT2JqKSA6IGR5bmFtaWNTdHlsZU9iajtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc3R5bGVPYmopLm1hcChmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gKChoeXBoZW5hdGUobmFtZSkpICsgXCI6XCIgKyAoc3R5bGVPYmpbbmFtZV0pKTsgfSkuam9pbignOycpXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fX21hcCA9IGZ1bmN0aW9uKHZhbCwgaXRlcmF0ZWUpIHtcbiAgICAvL1RPRE8g5pqC5LiN6ICD6JmRIHN0cmluZ1xuICAgIHZhciByZXQsIGksIGwsIGtleXMsIGtleTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICByZXQgPSBuZXcgQXJyYXkodmFsLmxlbmd0aCk7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdmFsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZXRbaV0gPSBpdGVyYXRlZSh2YWxbaV0sIGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldFxuICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICByZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgZm9yIChpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICAgIHJldFtrZXldID0gaXRlcmF0ZWUodmFsW2tleV0sIGtleSwgaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0ID0gbmV3IEFycmF5KHZhbCk7XG4gICAgICBmb3IgKGkgPSAwLCBsID0gdmFsOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIC8vIOesrOS4gOS4quWPguaVsOaaguaXtuS7jeWSjOWwj+eoi+W6j+S4gOiHtFxuICAgICAgICByZXRbaV0gPSBpdGVyYXRlZShpLCBpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9XG4gICAgcmV0dXJuIFtdXG4gIH07XG5cbn1cblxuLyogICovXG5cbnZhciBMSUZFQ1lDTEVfSE9PS1MkMSA9IFtcbiAgICAvL0FwcFxuICAgICdvbkxhdW5jaCcsXG4gICAgJ29uU2hvdycsXG4gICAgJ29uSGlkZScsXG4gICAgJ29uVW5pTlZpZXdNZXNzYWdlJyxcbiAgICAnb25QYWdlTm90Rm91bmQnLFxuICAgICdvblRoZW1lQ2hhbmdlJyxcbiAgICAnb25FcnJvcicsXG4gICAgJ29uVW5oYW5kbGVkUmVqZWN0aW9uJyxcbiAgICAvL1BhZ2VcbiAgICAnb25Jbml0JyxcbiAgICAnb25Mb2FkJyxcbiAgICAvLyAnb25TaG93JyxcbiAgICAnb25SZWFkeScsXG4gICAgLy8gJ29uSGlkZScsXG4gICAgJ29uVW5sb2FkJyxcbiAgICAnb25QdWxsRG93blJlZnJlc2gnLFxuICAgICdvblJlYWNoQm90dG9tJyxcbiAgICAnb25UYWJJdGVtVGFwJyxcbiAgICAnb25BZGRUb0Zhdm9yaXRlcycsXG4gICAgJ29uU2hhcmVUaW1lbGluZScsXG4gICAgJ29uU2hhcmVBcHBNZXNzYWdlJyxcbiAgICAnb25SZXNpemUnLFxuICAgICdvblBhZ2VTY3JvbGwnLFxuICAgICdvbk5hdmlnYXRpb25CYXJCdXR0b25UYXAnLFxuICAgICdvbkJhY2tQcmVzcycsXG4gICAgJ29uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2hhbmdlZCcsXG4gICAgJ29uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q29uZmlybWVkJyxcbiAgICAnb25OYXZpZ2F0aW9uQmFyU2VhcmNoSW5wdXRDbGlja2VkJyxcbiAgICAvL0NvbXBvbmVudFxuICAgIC8vICdvblJlYWR5JywgLy8g5YW85a655pen54mI5pys77yM5bqU6K+l56e76Zmk6K+l5LqL5Lu2XG4gICAgJ29uUGFnZVNob3cnLFxuICAgICdvblBhZ2VIaWRlJyxcbiAgICAnb25QYWdlUmVzaXplJ1xuXTtcbmZ1bmN0aW9uIGxpZmVjeWNsZU1peGluJDEoVnVlKSB7XG5cbiAgICAvL2ZpeGVkIHZ1ZS1jbGFzcy1jb21wb25lbnRcbiAgICB2YXIgb2xkRXh0ZW5kID0gVnVlLmV4dGVuZDtcbiAgICBWdWUuZXh0ZW5kID0gZnVuY3Rpb24oZXh0ZW5kT3B0aW9ucykge1xuICAgICAgICBleHRlbmRPcHRpb25zID0gZXh0ZW5kT3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB2YXIgbWV0aG9kcyA9IGV4dGVuZE9wdGlvbnMubWV0aG9kcztcbiAgICAgICAgaWYgKG1ldGhvZHMpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG1ldGhvZHMpLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoTElGRUNZQ0xFX0hPT0tTJDEuaW5kZXhPZihtZXRob2ROYW1lKSE9PS0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZE9wdGlvbnNbbWV0aG9kTmFtZV0gPSBtZXRob2RzW21ldGhvZE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWV0aG9kc1ttZXRob2ROYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvbGRFeHRlbmQuY2FsbCh0aGlzLCBleHRlbmRPcHRpb25zKVxuICAgIH07XG5cbiAgICB2YXIgc3RyYXRlZ2llcyA9IFZ1ZS5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO1xuICAgIHZhciBtZXJnZUhvb2sgPSBzdHJhdGVnaWVzLmNyZWF0ZWQ7XG4gICAgTElGRUNZQ0xFX0hPT0tTJDEuZm9yRWFjaChmdW5jdGlvbiAoaG9vaykge1xuICAgICAgICBzdHJhdGVnaWVzW2hvb2tdID0gbWVyZ2VIb29rO1xuICAgIH0pO1xuXG4gICAgVnVlLnByb3RvdHlwZS5fX2xpZmVjeWNsZV9ob29rc19fID0gTElGRUNZQ0xFX0hPT0tTJDE7XG59XG5cbi8qICAqL1xuXG4vLyBpbnN0YWxsIHBsYXRmb3JtIHBhdGNoIGZ1bmN0aW9uXG5WdWUucHJvdG90eXBlLl9fcGF0Y2hfXyA9IHBhdGNoO1xuXG4vLyBwdWJsaWMgbW91bnQgbWV0aG9kXG5WdWUucHJvdG90eXBlLiRtb3VudCA9IGZ1bmN0aW9uKFxuICAgIGVsICxcbiAgICBoeWRyYXRpbmcgXG4pIHtcbiAgICByZXR1cm4gbW91bnRDb21wb25lbnQkMSh0aGlzLCBlbCwgaHlkcmF0aW5nKVxufTtcblxubGlmZWN5Y2xlTWl4aW4kMShWdWUpO1xuaW50ZXJuYWxNaXhpbihWdWUpO1xuXG4vKiAgKi9cblxuZXhwb3J0IGRlZmF1bHQgVnVlO1xuIiwiY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XHJcbmNvbnN0IGlzT2JqZWN0ID0gKHZhbCkgPT4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnO1xyXG5jb25zdCBkZWZhdWx0RGVsaW1pdGVycyA9IFsneycsICd9J107XHJcbmNsYXNzIEJhc2VGb3JtYXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fY2FjaGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICAgIH1cclxuICAgIGludGVycG9sYXRlKG1lc3NhZ2UsIHZhbHVlcywgZGVsaW1pdGVycyA9IGRlZmF1bHREZWxpbWl0ZXJzKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFttZXNzYWdlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHRva2VucyA9IHRoaXMuX2NhY2hlc1ttZXNzYWdlXTtcclxuICAgICAgICBpZiAoIXRva2Vucykge1xyXG4gICAgICAgICAgICB0b2tlbnMgPSBwYXJzZShtZXNzYWdlLCBkZWxpbWl0ZXJzKTtcclxuICAgICAgICAgICAgdGhpcy5fY2FjaGVzW21lc3NhZ2VdID0gdG9rZW5zO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY29tcGlsZSh0b2tlbnMsIHZhbHVlcyk7XHJcbiAgICB9XHJcbn1cclxuY29uc3QgUkVfVE9LRU5fTElTVF9WQUxVRSA9IC9eKD86XFxkKSsvO1xyXG5jb25zdCBSRV9UT0tFTl9OQU1FRF9WQUxVRSA9IC9eKD86XFx3KSsvO1xyXG5mdW5jdGlvbiBwYXJzZShmb3JtYXQsIFtzdGFydERlbGltaXRlciwgZW5kRGVsaW1pdGVyXSkge1xyXG4gICAgY29uc3QgdG9rZW5zID0gW107XHJcbiAgICBsZXQgcG9zaXRpb24gPSAwO1xyXG4gICAgbGV0IHRleHQgPSAnJztcclxuICAgIHdoaWxlIChwb3NpdGlvbiA8IGZvcm1hdC5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgY2hhciA9IGZvcm1hdFtwb3NpdGlvbisrXTtcclxuICAgICAgICBpZiAoY2hhciA9PT0gc3RhcnREZWxpbWl0ZXIpIHtcclxuICAgICAgICAgICAgaWYgKHRleHQpIHtcclxuICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogdGV4dCB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0ZXh0ID0gJyc7XHJcbiAgICAgICAgICAgIGxldCBzdWIgPSAnJztcclxuICAgICAgICAgICAgY2hhciA9IGZvcm1hdFtwb3NpdGlvbisrXTtcclxuICAgICAgICAgICAgd2hpbGUgKGNoYXIgIT09IHVuZGVmaW5lZCAmJiBjaGFyICE9PSBlbmREZWxpbWl0ZXIpIHtcclxuICAgICAgICAgICAgICAgIHN1YiArPSBjaGFyO1xyXG4gICAgICAgICAgICAgICAgY2hhciA9IGZvcm1hdFtwb3NpdGlvbisrXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBpc0Nsb3NlZCA9IGNoYXIgPT09IGVuZERlbGltaXRlcjtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IFJFX1RPS0VOX0xJU1RfVkFMVUUudGVzdChzdWIpXHJcbiAgICAgICAgICAgICAgICA/ICdsaXN0J1xyXG4gICAgICAgICAgICAgICAgOiBpc0Nsb3NlZCAmJiBSRV9UT0tFTl9OQU1FRF9WQUxVRS50ZXN0KHN1YilcclxuICAgICAgICAgICAgICAgICAgICA/ICduYW1lZCdcclxuICAgICAgICAgICAgICAgICAgICA6ICd1bmtub3duJztcclxuICAgICAgICAgICAgdG9rZW5zLnB1c2goeyB2YWx1ZTogc3ViLCB0eXBlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyAgZWxzZSBpZiAoY2hhciA9PT0gJyUnKSB7XHJcbiAgICAgICAgLy8gICAvLyB3aGVuIGZvdW5kIHJhaWxzIGkxOG4gc3ludGF4LCBza2lwIHRleHQgY2FwdHVyZVxyXG4gICAgICAgIC8vICAgaWYgKGZvcm1hdFtwb3NpdGlvbl0gIT09ICd7Jykge1xyXG4gICAgICAgIC8vICAgICB0ZXh0ICs9IGNoYXJcclxuICAgICAgICAvLyAgIH1cclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRleHQgKz0gY2hhcjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0ZXh0ICYmIHRva2Vucy5wdXNoKHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogdGV4dCB9KTtcclxuICAgIHJldHVybiB0b2tlbnM7XHJcbn1cclxuZnVuY3Rpb24gY29tcGlsZSh0b2tlbnMsIHZhbHVlcykge1xyXG4gICAgY29uc3QgY29tcGlsZWQgPSBbXTtcclxuICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICBjb25zdCBtb2RlID0gaXNBcnJheSh2YWx1ZXMpXHJcbiAgICAgICAgPyAnbGlzdCdcclxuICAgICAgICA6IGlzT2JqZWN0KHZhbHVlcylcclxuICAgICAgICAgICAgPyAnbmFtZWQnXHJcbiAgICAgICAgICAgIDogJ3Vua25vd24nO1xyXG4gICAgaWYgKG1vZGUgPT09ICd1bmtub3duJykge1xyXG4gICAgICAgIHJldHVybiBjb21waWxlZDtcclxuICAgIH1cclxuICAgIHdoaWxlIChpbmRleCA8IHRva2Vucy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpbmRleF07XHJcbiAgICAgICAgc3dpdGNoICh0b2tlbi50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RleHQnOlxyXG4gICAgICAgICAgICAgICAgY29tcGlsZWQucHVzaCh0b2tlbi52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbGlzdCc6XHJcbiAgICAgICAgICAgICAgICBjb21waWxlZC5wdXNoKHZhbHVlc1twYXJzZUludCh0b2tlbi52YWx1ZSwgMTApXSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbmFtZWQnOlxyXG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICduYW1lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb21waWxlZC5wdXNoKHZhbHVlc1t0b2tlbi52YWx1ZV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBUeXBlIG9mIHRva2VuICcke3Rva2VuLnR5cGV9JyBhbmQgZm9ybWF0IG9mIHZhbHVlICcke21vZGV9JyBkb24ndCBtYXRjaCFgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAndW5rbm93bic6XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRGV0ZWN0ICd1bmtub3duJyB0eXBlIG9mIHRva2VuIWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGluZGV4Kys7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29tcGlsZWQ7XHJcbn1cclxuXHJcbmNvbnN0IExPQ0FMRV9aSF9IQU5TID0gJ3poLUhhbnMnO1xyXG5jb25zdCBMT0NBTEVfWkhfSEFOVCA9ICd6aC1IYW50JztcclxuY29uc3QgTE9DQUxFX0VOID0gJ2VuJztcclxuY29uc3QgTE9DQUxFX0ZSID0gJ2ZyJztcclxuY29uc3QgTE9DQUxFX0VTID0gJ2VzJztcclxuY29uc3QgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xyXG5jb25zdCBoYXNPd24gPSAodmFsLCBrZXkpID0+IGhhc093blByb3BlcnR5LmNhbGwodmFsLCBrZXkpO1xyXG5jb25zdCBkZWZhdWx0Rm9ybWF0dGVyID0gbmV3IEJhc2VGb3JtYXR0ZXIoKTtcclxuZnVuY3Rpb24gaW5jbHVkZShzdHIsIHBhcnRzKSB7XHJcbiAgICByZXR1cm4gISFwYXJ0cy5maW5kKChwYXJ0KSA9PiBzdHIuaW5kZXhPZihwYXJ0KSAhPT0gLTEpO1xyXG59XHJcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwYXJ0cykge1xyXG4gICAgcmV0dXJuIHBhcnRzLmZpbmQoKHBhcnQpID0+IHN0ci5pbmRleE9mKHBhcnQpID09PSAwKTtcclxufVxyXG5mdW5jdGlvbiBub3JtYWxpemVMb2NhbGUobG9jYWxlLCBtZXNzYWdlcykge1xyXG4gICAgaWYgKCFsb2NhbGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsb2NhbGUgPSBsb2NhbGUudHJpbSgpLnJlcGxhY2UoL18vZywgJy0nKTtcclxuICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlc1tsb2NhbGVdKSB7XHJcbiAgICAgICAgcmV0dXJuIGxvY2FsZTtcclxuICAgIH1cclxuICAgIGxvY2FsZSA9IGxvY2FsZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGxvY2FsZS5pbmRleE9mKCd6aCcpID09PSAwKSB7XHJcbiAgICAgICAgaWYgKGxvY2FsZS5pbmRleE9mKCctaGFucycpID4gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIExPQ0FMRV9aSF9IQU5TO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobG9jYWxlLmluZGV4T2YoJy1oYW50JykgPiAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpbmNsdWRlKGxvY2FsZSwgWyctdHcnLCAnLWhrJywgJy1tbycsICctY2h0J10pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBMT0NBTEVfWkhfSEFOVDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIExPQ0FMRV9aSF9IQU5TO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGFuZyA9IHN0YXJ0c1dpdGgobG9jYWxlLCBbTE9DQUxFX0VOLCBMT0NBTEVfRlIsIExPQ0FMRV9FU10pO1xyXG4gICAgaWYgKGxhbmcpIHtcclxuICAgICAgICByZXR1cm4gbGFuZztcclxuICAgIH1cclxufVxyXG5jbGFzcyBJMThuIHtcclxuICAgIGNvbnN0cnVjdG9yKHsgbG9jYWxlLCBmYWxsYmFja0xvY2FsZSwgbWVzc2FnZXMsIHdhdGNoZXIsIGZvcm1hdGVyLCB9KSB7XHJcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBMT0NBTEVfRU47XHJcbiAgICAgICAgdGhpcy5mYWxsYmFja0xvY2FsZSA9IExPQ0FMRV9FTjtcclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSB7fTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VzID0ge307XHJcbiAgICAgICAgdGhpcy53YXRjaGVycyA9IFtdO1xyXG4gICAgICAgIGlmIChmYWxsYmFja0xvY2FsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmZhbGxiYWNrTG9jYWxlID0gZmFsbGJhY2tMb2NhbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9ybWF0ZXIgPSBmb3JtYXRlciB8fCBkZWZhdWx0Rm9ybWF0dGVyO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlcyB8fCB7fTtcclxuICAgICAgICB0aGlzLnNldExvY2FsZShsb2NhbGUgfHwgTE9DQUxFX0VOKTtcclxuICAgICAgICBpZiAod2F0Y2hlcikge1xyXG4gICAgICAgICAgICB0aGlzLndhdGNoTG9jYWxlKHdhdGNoZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHNldExvY2FsZShsb2NhbGUpIHtcclxuICAgICAgICBjb25zdCBvbGRMb2NhbGUgPSB0aGlzLmxvY2FsZTtcclxuICAgICAgICB0aGlzLmxvY2FsZSA9IG5vcm1hbGl6ZUxvY2FsZShsb2NhbGUsIHRoaXMubWVzc2FnZXMpIHx8IHRoaXMuZmFsbGJhY2tMb2NhbGU7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXSkge1xyXG4gICAgICAgICAgICAvLyDlj6/og73liJ3lp4vljJbml7bkuI3lrZjlnKhcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV0gPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gdGhpcy5tZXNzYWdlc1t0aGlzLmxvY2FsZV07XHJcbiAgICAgICAgLy8g5LuF5Y+R55Sf5Y+Y5YyW5pe277yM6YCa55+lXHJcbiAgICAgICAgaWYgKG9sZExvY2FsZSAhPT0gdGhpcy5sb2NhbGUpIHtcclxuICAgICAgICAgICAgdGhpcy53YXRjaGVycy5mb3JFYWNoKCh3YXRjaGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB3YXRjaGVyKHRoaXMubG9jYWxlLCBvbGRMb2NhbGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRMb2NhbGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlO1xyXG4gICAgfVxyXG4gICAgd2F0Y2hMb2NhbGUoZm4pIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMud2F0Y2hlcnMucHVzaChmbikgLSAxO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMud2F0Y2hlcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgYWRkKGxvY2FsZSwgbWVzc2FnZSwgb3ZlcnJpZGUgPSB0cnVlKSB7XHJcbiAgICAgICAgY29uc3QgY3VyTWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzW2xvY2FsZV07XHJcbiAgICAgICAgaWYgKGN1ck1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgIGlmIChvdmVycmlkZSkge1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjdXJNZXNzYWdlcywgbWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhtZXNzYWdlKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc093bihjdXJNZXNzYWdlcywga2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJNZXNzYWdlc1trZXldID0gbWVzc2FnZVtrZXldO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzW2xvY2FsZV0gPSBtZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGYobWVzc2FnZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUobWVzc2FnZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKS5qb2luKCcnKTtcclxuICAgIH1cclxuICAgIHQoa2V5LCBsb2NhbGUsIHZhbHVlcykge1xyXG4gICAgICAgIGxldCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgbG9jYWxlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBsb2NhbGUgPSBub3JtYWxpemVMb2NhbGUobG9jYWxlLCB0aGlzLm1lc3NhZ2VzKTtcclxuICAgICAgICAgICAgbG9jYWxlICYmIChtZXNzYWdlID0gdGhpcy5tZXNzYWdlc1tsb2NhbGVdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVlcyA9IGxvY2FsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFoYXNPd24obWVzc2FnZSwga2V5KSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYENhbm5vdCB0cmFuc2xhdGUgdGhlIHZhbHVlIG9mIGtleXBhdGggJHtrZXl9LiBVc2UgdGhlIHZhbHVlIG9mIGtleXBhdGggYXMgZGVmYXVsdC5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0ZXIuaW50ZXJwb2xhdGUobWVzc2FnZVtrZXldLCB2YWx1ZXMpLmpvaW4oJycpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB3YXRjaEFwcExvY2FsZShhcHBWbSwgaTE4bikge1xyXG4gICAgLy8g6ZyA6KaB5L+d6K+BIHdhdGNoIOeahOinpuWPkeWcqOe7hOS7tua4suafk+S5i+WJjVxyXG4gICAgaWYgKGFwcFZtLiR3YXRjaExvY2FsZSkge1xyXG4gICAgICAgIC8vIHZ1ZTJcclxuICAgICAgICBhcHBWbS4kd2F0Y2hMb2NhbGUoKG5ld0xvY2FsZSkgPT4ge1xyXG4gICAgICAgICAgICBpMThuLnNldExvY2FsZShuZXdMb2NhbGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgYXBwVm0uJHdhdGNoKCgpID0+IGFwcFZtLiRsb2NhbGUsIChuZXdMb2NhbGUpID0+IHtcclxuICAgICAgICAgICAgaTE4bi5zZXRMb2NhbGUobmV3TG9jYWxlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5mdW5jdGlvbiBnZXREZWZhdWx0TG9jYWxlKCkge1xyXG4gICAgaWYgKHR5cGVvZiB1bmkgIT09ICd1bmRlZmluZWQnICYmIHVuaS5nZXRMb2NhbGUpIHtcclxuICAgICAgICByZXR1cm4gdW5pLmdldExvY2FsZSgpO1xyXG4gICAgfVxyXG4gICAgLy8g5bCP56iL5bqP5bmz5Y+w77yMdW5pIOWSjCB1bmktaTE4biDkupLnm7jlvJXnlKjvvIzlr7zoh7Torr/pl67kuI3liLAgdW5p77yM5pWF5ZyoIGdsb2JhbCDkuIrmjILkuoYgZ2V0TG9jYWxlXHJcbiAgICBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsLmdldExvY2FsZSkge1xyXG4gICAgICAgIHJldHVybiBnbG9iYWwuZ2V0TG9jYWxlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTE9DQUxFX0VOO1xyXG59XHJcbmZ1bmN0aW9uIGluaXRWdWVJMThuKGxvY2FsZSwgbWVzc2FnZXMgPSB7fSwgZmFsbGJhY2tMb2NhbGUsIHdhdGNoZXIpIHtcclxuICAgIC8vIOWFvOWuueaXp+eJiOacrOWFpeWPglxyXG4gICAgaWYgKHR5cGVvZiBsb2NhbGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgW2xvY2FsZSwgbWVzc2FnZXNdID0gW1xyXG4gICAgICAgICAgICBtZXNzYWdlcyxcclxuICAgICAgICAgICAgbG9jYWxlLFxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGxvY2FsZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAvLyDlm6DkuLrlsI/nqIvluo/lubPlj7DvvIx1bmktaTE4biDlkowgdW5pIOS6kuebuOW8leeUqO+8jOWvvOiHtOatpOaXtuiuv+mXriB1bmkg5pe277yM5Li6IHVuZGVmaW5lZFxyXG4gICAgICAgIGxvY2FsZSA9IGdldERlZmF1bHRMb2NhbGUoKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgZmFsbGJhY2tMb2NhbGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgZmFsbGJhY2tMb2NhbGUgPVxyXG4gICAgICAgICAgICAodHlwZW9mIF9fdW5pQ29uZmlnICE9PSAndW5kZWZpbmVkJyAmJiBfX3VuaUNvbmZpZy5mYWxsYmFja0xvY2FsZSkgfHxcclxuICAgICAgICAgICAgICAgIExPQ0FMRV9FTjtcclxuICAgIH1cclxuICAgIGNvbnN0IGkxOG4gPSBuZXcgSTE4bih7XHJcbiAgICAgICAgbG9jYWxlLFxyXG4gICAgICAgIGZhbGxiYWNrTG9jYWxlLFxyXG4gICAgICAgIG1lc3NhZ2VzLFxyXG4gICAgICAgIHdhdGNoZXIsXHJcbiAgICB9KTtcclxuICAgIGxldCB0ID0gKGtleSwgdmFsdWVzKSA9PiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBnZXRBcHAgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgLy8gYXBwIHZpZXdcclxuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tZnVuYy1hc3NpZ24gKi9cclxuICAgICAgICAgICAgdCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkxOG4udChrZXksIHZhbHVlcyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgaXNXYXRjaGVkQXBwTG9jYWxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFwcFZtID0gZ2V0QXBwKCkuJHZtO1xyXG4gICAgICAgICAgICAgICAgLy8g5Y+v6IO9JHZt6L+Y5LiN5a2Y5Zyo77yM5q+U5aaC5Zyo5pSv5LuY5a6d5bCP56iL5bqP5Lit77yM57uE5Lu25a6a5LmJ6L6D5pep77yM5ZyocHJvcHPnmoRkZWZhdWx06YeM5L2/55So5LqGdCgp5Ye95pWw77yI5aaCdW5pLWdvb2RzLW5hdu+8ie+8jOatpOaXtmFwcOi/mOacquWIneWni+WMllxyXG4gICAgICAgICAgICAgICAgLy8gb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgLy8gXHR0eXBlOiBBcnJheSxcclxuICAgICAgICAgICAgICAgIC8vIFx0ZGVmYXVsdCAoKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0cmV0dXJuIFt7XHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0XHRpY29uOiAnc2hvcCcsXHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0XHR0ZXh0OiB0KFwidW5pLWdvb2RzLW5hdi5vcHRpb25zLnNob3BcIiksXHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0fSwge1xyXG4gICAgICAgICAgICAgICAgLy8gXHRcdFx0aWNvbjogJ2NhcnQnLFxyXG4gICAgICAgICAgICAgICAgLy8gXHRcdFx0dGV4dDogdChcInVuaS1nb29kcy1uYXYub3B0aW9ucy5jYXJ0XCIpXHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0fV1cclxuICAgICAgICAgICAgICAgIC8vIFx0fVxyXG4gICAgICAgICAgICAgICAgLy8gfSxcclxuICAgICAgICAgICAgICAgIGlmIChhcHBWbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOinpuWPkeWTjeW6lOW8j1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcFZtLiRsb2NhbGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1dhdGNoZWRBcHBMb2NhbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXRjaGVkQXBwTG9jYWxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hBcHBMb2NhbGUoYXBwVm0sIGkxOG4pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBpMThuLnQoa2V5LCB2YWx1ZXMpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdChrZXksIHZhbHVlcyk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBpMThuLFxyXG4gICAgICAgIGYobWVzc2FnZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpMThuLmYobWVzc2FnZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHQoa2V5LCB2YWx1ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHQoa2V5LCB2YWx1ZXMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWRkKGxvY2FsZSwgbWVzc2FnZSwgb3ZlcnJpZGUgPSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpMThuLmFkZChsb2NhbGUsIG1lc3NhZ2UsIG92ZXJyaWRlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHdhdGNoKGZuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpMThuLndhdGNoTG9jYWxlKGZuKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGdldExvY2FsZSgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkxOG4uZ2V0TG9jYWxlKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZXRMb2NhbGUobmV3TG9jYWxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpMThuLnNldExvY2FsZShuZXdMb2NhbGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG59XHJcblxyXG5jb25zdCBpc1N0cmluZyA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xyXG5sZXQgZm9ybWF0ZXI7XHJcbmZ1bmN0aW9uIGhhc0kxOG5Kc29uKGpzb25PYmosIGRlbGltaXRlcnMpIHtcclxuICAgIGlmICghZm9ybWF0ZXIpIHtcclxuICAgICAgICBmb3JtYXRlciA9IG5ldyBCYXNlRm9ybWF0dGVyKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gd2Fsa0pzb25PYmooanNvbk9iaiwgKGpzb25PYmosIGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0ganNvbk9ialtrZXldO1xyXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgaWYgKGlzSTE4blN0cih2YWx1ZSwgZGVsaW1pdGVycykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gaGFzSTE4bkpzb24odmFsdWUsIGRlbGltaXRlcnMpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG59XHJcbmZ1bmN0aW9uIHBhcnNlSTE4bkpzb24oanNvbk9iaiwgdmFsdWVzLCBkZWxpbWl0ZXJzKSB7XHJcbiAgICBpZiAoIWZvcm1hdGVyKSB7XHJcbiAgICAgICAgZm9ybWF0ZXIgPSBuZXcgQmFzZUZvcm1hdHRlcigpO1xyXG4gICAgfVxyXG4gICAgd2Fsa0pzb25PYmooanNvbk9iaiwgKGpzb25PYmosIGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlID0ganNvbk9ialtrZXldO1xyXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgaWYgKGlzSTE4blN0cih2YWx1ZSwgZGVsaW1pdGVycykpIHtcclxuICAgICAgICAgICAgICAgIGpzb25PYmpba2V5XSA9IGNvbXBpbGVTdHIodmFsdWUsIHZhbHVlcywgZGVsaW1pdGVycyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHBhcnNlSTE4bkpzb24odmFsdWUsIHZhbHVlcywgZGVsaW1pdGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ganNvbk9iajtcclxufVxyXG5mdW5jdGlvbiBjb21waWxlSTE4bkpzb25TdHIoanNvblN0ciwgeyBsb2NhbGUsIGxvY2FsZXMsIGRlbGltaXRlcnMsIH0pIHtcclxuICAgIGlmICghaXNJMThuU3RyKGpzb25TdHIsIGRlbGltaXRlcnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIGpzb25TdHI7XHJcbiAgICB9XHJcbiAgICBpZiAoIWZvcm1hdGVyKSB7XHJcbiAgICAgICAgZm9ybWF0ZXIgPSBuZXcgQmFzZUZvcm1hdHRlcigpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbG9jYWxlVmFsdWVzID0gW107XHJcbiAgICBPYmplY3Qua2V5cyhsb2NhbGVzKS5mb3JFYWNoKChuYW1lKSA9PiB7XHJcbiAgICAgICAgaWYgKG5hbWUgIT09IGxvY2FsZSkge1xyXG4gICAgICAgICAgICBsb2NhbGVWYWx1ZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBsb2NhbGU6IG5hbWUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGxvY2FsZXNbbmFtZV0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgbG9jYWxlVmFsdWVzLnVuc2hpZnQoeyBsb2NhbGUsIHZhbHVlczogbG9jYWxlc1tsb2NhbGVdIH0pO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY29tcGlsZUpzb25PYmooSlNPTi5wYXJzZShqc29uU3RyKSwgbG9jYWxlVmFsdWVzLCBkZWxpbWl0ZXJzKSwgbnVsbCwgMik7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkgeyB9XHJcbiAgICByZXR1cm4ganNvblN0cjtcclxufVxyXG5mdW5jdGlvbiBpc0kxOG5TdHIodmFsdWUsIGRlbGltaXRlcnMpIHtcclxuICAgIHJldHVybiB2YWx1ZS5pbmRleE9mKGRlbGltaXRlcnNbMF0pID4gLTE7XHJcbn1cclxuZnVuY3Rpb24gY29tcGlsZVN0cih2YWx1ZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKSB7XHJcbiAgICByZXR1cm4gZm9ybWF0ZXIuaW50ZXJwb2xhdGUodmFsdWUsIHZhbHVlcywgZGVsaW1pdGVycykuam9pbignJyk7XHJcbn1cclxuZnVuY3Rpb24gY29tcGlsZVZhbHVlKGpzb25PYmosIGtleSwgbG9jYWxlVmFsdWVzLCBkZWxpbWl0ZXJzKSB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IGpzb25PYmpba2V5XTtcclxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcclxuICAgICAgICAvLyDlrZjlnKjlm73pmYXljJZcclxuICAgICAgICBpZiAoaXNJMThuU3RyKHZhbHVlLCBkZWxpbWl0ZXJzKSkge1xyXG4gICAgICAgICAgICBqc29uT2JqW2tleV0gPSBjb21waWxlU3RyKHZhbHVlLCBsb2NhbGVWYWx1ZXNbMF0udmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgICAgICAgICAgaWYgKGxvY2FsZVZhbHVlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyDmoLzlvI/ljJblm73pmYXljJbor63oqIBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlTG9jYWxlcyA9IChqc29uT2JqW2tleSArICdMb2NhbGVzJ10gPSB7fSk7XHJcbiAgICAgICAgICAgICAgICBsb2NhbGVWYWx1ZXMuZm9yRWFjaCgobG9jYWxWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlTG9jYWxlc1tsb2NhbFZhbHVlLmxvY2FsZV0gPSBjb21waWxlU3RyKHZhbHVlLCBsb2NhbFZhbHVlLnZhbHVlcywgZGVsaW1pdGVycyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbXBpbGVKc29uT2JqKHZhbHVlLCBsb2NhbGVWYWx1ZXMsIGRlbGltaXRlcnMpO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGNvbXBpbGVKc29uT2JqKGpzb25PYmosIGxvY2FsZVZhbHVlcywgZGVsaW1pdGVycykge1xyXG4gICAgd2Fsa0pzb25PYmooanNvbk9iaiwgKGpzb25PYmosIGtleSkgPT4ge1xyXG4gICAgICAgIGNvbXBpbGVWYWx1ZShqc29uT2JqLCBrZXksIGxvY2FsZVZhbHVlcywgZGVsaW1pdGVycyk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBqc29uT2JqO1xyXG59XHJcbmZ1bmN0aW9uIHdhbGtKc29uT2JqKGpzb25PYmosIHdhbGspIHtcclxuICAgIGlmIChpc0FycmF5KGpzb25PYmopKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqc29uT2JqLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh3YWxrKGpzb25PYmosIGkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KGpzb25PYmopKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4ganNvbk9iaikge1xyXG4gICAgICAgICAgICBpZiAod2Fsayhqc29uT2JqLCBrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzb2x2ZUxvY2FsZShsb2NhbGVzKSB7XHJcbiAgICByZXR1cm4gKGxvY2FsZSkgPT4ge1xyXG4gICAgICAgIGlmICghbG9jYWxlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxvY2FsZSA9IG5vcm1hbGl6ZUxvY2FsZShsb2NhbGUpIHx8IGxvY2FsZTtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZUxvY2FsZUNoYWluKGxvY2FsZSkuZmluZCgobG9jYWxlKSA9PiBsb2NhbGVzLmluZGV4T2YobG9jYWxlKSA+IC0xKTtcclxuICAgIH07XHJcbn1cclxuZnVuY3Rpb24gcmVzb2x2ZUxvY2FsZUNoYWluKGxvY2FsZSkge1xyXG4gICAgY29uc3QgY2hhaW4gPSBbXTtcclxuICAgIGNvbnN0IHRva2VucyA9IGxvY2FsZS5zcGxpdCgnLScpO1xyXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGgpIHtcclxuICAgICAgICBjaGFpbi5wdXNoKHRva2Vucy5qb2luKCctJykpO1xyXG4gICAgICAgIHRva2Vucy5wb3AoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjaGFpbjtcclxufVxyXG5cclxuZXhwb3J0IHsgQmFzZUZvcm1hdHRlciBhcyBGb3JtYXR0ZXIsIEkxOG4sIExPQ0FMRV9FTiwgTE9DQUxFX0VTLCBMT0NBTEVfRlIsIExPQ0FMRV9aSF9IQU5TLCBMT0NBTEVfWkhfSEFOVCwgY29tcGlsZUkxOG5Kc29uU3RyLCBoYXNJMThuSnNvbiwgaW5pdFZ1ZUkxOG4sIGlzSTE4blN0ciwgaXNTdHJpbmcsIG5vcm1hbGl6ZUxvY2FsZSwgcGFyc2VJMThuSnNvbiwgcmVzb2x2ZUxvY2FsZSB9O1xyXG4iLCIvKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHNjcmlwdEV4cG9ydHMsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmdW5jdGlvbmFsVGVtcGxhdGUsXG4gIGluamVjdFN0eWxlcyxcbiAgc2NvcGVJZCxcbiAgbW9kdWxlSWRlbnRpZmllciwgLyogc2VydmVyIG9ubHkgKi9cbiAgc2hhZG93TW9kZSwgLyogdnVlLWNsaSBvbmx5ICovXG4gIGNvbXBvbmVudHMsIC8vIGZpeGVkIGJ5IHh4eHh4eCBhdXRvIGNvbXBvbmVudHNcbiAgcmVuZGVyanMgLy8gZml4ZWQgYnkgeHh4eHh4IHJlbmRlcmpzXG4pIHtcbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyBmaXhlZCBieSB4eHh4eHggYXV0byBjb21wb25lbnRzXG4gIGlmIChjb21wb25lbnRzKSB7XG4gICAgaWYgKCFvcHRpb25zLmNvbXBvbmVudHMpIHtcbiAgICAgIG9wdGlvbnMuY29tcG9uZW50cyA9IHt9XG4gICAgfVxuICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICAgZm9yICh2YXIgbmFtZSBpbiBjb21wb25lbnRzKSB7XG4gICAgICBpZiAoaGFzT3duLmNhbGwoY29tcG9uZW50cywgbmFtZSkgJiYgIWhhc093bi5jYWxsKG9wdGlvbnMuY29tcG9uZW50cywgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW25hbWVdID0gY29tcG9uZW50c1tuYW1lXVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBmaXhlZCBieSB4eHh4eHggcmVuZGVyanNcbiAgaWYgKHJlbmRlcmpzKSB7XG4gICAgKHJlbmRlcmpzLmJlZm9yZUNyZWF0ZSB8fCAocmVuZGVyanMuYmVmb3JlQ3JlYXRlID0gW10pKS51bnNoaWZ0KGZ1bmN0aW9uKCkge1xuICAgICAgdGhpc1tyZW5kZXJqcy5fX21vZHVsZV0gPSB0aGlzXG4gICAgfSk7XG4gICAgKG9wdGlvbnMubWl4aW5zIHx8IChvcHRpb25zLm1peGlucyA9IFtdKSkucHVzaChyZW5kZXJqcylcbiAgfVxuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7IC8vIHNlcnZlciBidWlsZFxuICAgIGhvb2sgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgLy8gMi4zIGluamVjdGlvblxuICAgICAgY29udGV4dCA9XG4gICAgICAgIGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGxcbiAgICAgICAgKHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHQpIHx8IC8vIHN0YXRlZnVsXG4gICAgICAgICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpIC8vIGZ1bmN0aW9uYWxcbiAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZVxuICAgICAgaWYgKCFjb250ZXh0ICYmIHR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250ZXh0ID0gX19WVUVfU1NSX0NPTlRFWFRfX1xuICAgICAgfVxuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXNcbiAgICAgIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZVxuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMpIHtcbiAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgc3NyIGluIGNhc2UgY29tcG9uZW50IGlzIGNhY2hlZCBhbmQgYmVmb3JlQ3JlYXRlXG4gICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWRcbiAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2tcbiAgfSBlbHNlIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICBob29rID0gc2hhZG93TW9kZVxuICAgICAgPyBmdW5jdGlvbiAoKSB7IGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCkgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24gKGgsIGNvbnRleHQpIHtcbiAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbmRlcihoLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9va1xuICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ3JlYXRlID0gZXhpc3RpbmdcbiAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGhvb2spXG4gICAgICAgIDogW2hvb2tdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzOiBzY3JpcHRFeHBvcnRzLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfVxufVxuIiwiaW1wb3J0IFZ1ZSBmcm9tIFwidnVlXCJcclxuaW1wb3J0IFZ1ZXggZnJvbSBcInZ1ZXhcIlxyXG5cclxuVnVlLnVzZShWdWV4KVxyXG5cclxuY29uc3Qgc3RvcmUgPXtcclxuXHRzdGF0ZTp7fSxcclxuXHRnZXR0ZXRzOnt9LFxyXG5cdG11dGF0aW9uczp7fSxcclxuXHRhY3Rpb25zOnt9LFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBzdG9yZSIsIi8qIVxuICogdnVleCB2My42LjJcbiAqIChjKSAyMDIxIEV2YW4gWW91XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBhcHBseU1peGluIChWdWUpIHtcbiAgdmFyIHZlcnNpb24gPSBOdW1iZXIoVnVlLnZlcnNpb24uc3BsaXQoJy4nKVswXSk7XG5cbiAgaWYgKHZlcnNpb24gPj0gMikge1xuICAgIFZ1ZS5taXhpbih7IGJlZm9yZUNyZWF0ZTogdnVleEluaXQgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gb3ZlcnJpZGUgaW5pdCBhbmQgaW5qZWN0IHZ1ZXggaW5pdCBwcm9jZWR1cmVcbiAgICAvLyBmb3IgMS54IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIHZhciBfaW5pdCA9IFZ1ZS5wcm90b3R5cGUuX2luaXQ7XG4gICAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICAgICAgb3B0aW9ucy5pbml0ID0gb3B0aW9ucy5pbml0XG4gICAgICAgID8gW3Z1ZXhJbml0XS5jb25jYXQob3B0aW9ucy5pbml0KVxuICAgICAgICA6IHZ1ZXhJbml0O1xuICAgICAgX2luaXQuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZ1ZXggaW5pdCBob29rLCBpbmplY3RlZCBpbnRvIGVhY2ggaW5zdGFuY2VzIGluaXQgaG9va3MgbGlzdC5cbiAgICovXG5cbiAgZnVuY3Rpb24gdnVleEluaXQgKCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy4kb3B0aW9ucztcbiAgICAvLyBzdG9yZSBpbmplY3Rpb25cbiAgICBpZiAob3B0aW9ucy5zdG9yZSkge1xuICAgICAgdGhpcy4kc3RvcmUgPSB0eXBlb2Ygb3B0aW9ucy5zdG9yZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG9wdGlvbnMuc3RvcmUoKVxuICAgICAgICA6IG9wdGlvbnMuc3RvcmU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLnBhcmVudCAmJiBvcHRpb25zLnBhcmVudC4kc3RvcmUpIHtcbiAgICAgIHRoaXMuJHN0b3JlID0gb3B0aW9ucy5wYXJlbnQuJHN0b3JlO1xuICAgIH1cbiAgfVxufVxuXG52YXIgdGFyZ2V0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgPyB3aW5kb3dcbiAgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJ1xuICAgID8gZ2xvYmFsXG4gICAgOiB7fTtcbnZhciBkZXZ0b29sSG9vayA9IHRhcmdldC5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG5mdW5jdGlvbiBkZXZ0b29sUGx1Z2luIChzdG9yZSkge1xuICBpZiAoIWRldnRvb2xIb29rKSB7IHJldHVybiB9XG5cbiAgc3RvcmUuX2RldnRvb2xIb29rID0gZGV2dG9vbEhvb2s7XG5cbiAgZGV2dG9vbEhvb2suZW1pdCgndnVleDppbml0Jywgc3RvcmUpO1xuXG4gIGRldnRvb2xIb29rLm9uKCd2dWV4OnRyYXZlbC10by1zdGF0ZScsIGZ1bmN0aW9uICh0YXJnZXRTdGF0ZSkge1xuICAgIHN0b3JlLnJlcGxhY2VTdGF0ZSh0YXJnZXRTdGF0ZSk7XG4gIH0pO1xuXG4gIHN0b3JlLnN1YnNjcmliZShmdW5jdGlvbiAobXV0YXRpb24sIHN0YXRlKSB7XG4gICAgZGV2dG9vbEhvb2suZW1pdCgndnVleDptdXRhdGlvbicsIG11dGF0aW9uLCBzdGF0ZSk7XG4gIH0sIHsgcHJlcGVuZDogdHJ1ZSB9KTtcblxuICBzdG9yZS5zdWJzY3JpYmVBY3Rpb24oZnVuY3Rpb24gKGFjdGlvbiwgc3RhdGUpIHtcbiAgICBkZXZ0b29sSG9vay5lbWl0KCd2dWV4OmFjdGlvbicsIGFjdGlvbiwgc3RhdGUpO1xuICB9LCB7IHByZXBlbmQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBmaXJzdCBpdGVtIHRoYXQgcGFzcyB0aGUgdGVzdFxuICogYnkgc2Vjb25kIGFyZ3VtZW50IGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gbGlzdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZlxuICogQHJldHVybiB7Kn1cbiAqL1xuZnVuY3Rpb24gZmluZCAobGlzdCwgZikge1xuICByZXR1cm4gbGlzdC5maWx0ZXIoZilbMF1cbn1cblxuLyoqXG4gKiBEZWVwIGNvcHkgdGhlIGdpdmVuIG9iamVjdCBjb25zaWRlcmluZyBjaXJjdWxhciBzdHJ1Y3R1cmUuXG4gKiBUaGlzIGZ1bmN0aW9uIGNhY2hlcyBhbGwgbmVzdGVkIG9iamVjdHMgYW5kIGl0cyBjb3BpZXMuXG4gKiBJZiBpdCBkZXRlY3RzIGNpcmN1bGFyIHN0cnVjdHVyZSwgdXNlIGNhY2hlZCBjb3B5IHRvIGF2b2lkIGluZmluaXRlIGxvb3AuXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gY2FjaGVcbiAqIEByZXR1cm4geyp9XG4gKi9cbmZ1bmN0aW9uIGRlZXBDb3B5IChvYmosIGNhY2hlKSB7XG4gIGlmICggY2FjaGUgPT09IHZvaWQgMCApIGNhY2hlID0gW107XG5cbiAgLy8ganVzdCByZXR1cm4gaWYgb2JqIGlzIGltbXV0YWJsZSB2YWx1ZVxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgLy8gaWYgb2JqIGlzIGhpdCwgaXQgaXMgaW4gY2lyY3VsYXIgc3RydWN0dXJlXG4gIHZhciBoaXQgPSBmaW5kKGNhY2hlLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5vcmlnaW5hbCA9PT0gb2JqOyB9KTtcbiAgaWYgKGhpdCkge1xuICAgIHJldHVybiBoaXQuY29weVxuICB9XG5cbiAgdmFyIGNvcHkgPSBBcnJheS5pc0FycmF5KG9iaikgPyBbXSA6IHt9O1xuICAvLyBwdXQgdGhlIGNvcHkgaW50byBjYWNoZSBhdCBmaXJzdFxuICAvLyBiZWNhdXNlIHdlIHdhbnQgdG8gcmVmZXIgaXQgaW4gcmVjdXJzaXZlIGRlZXBDb3B5XG4gIGNhY2hlLnB1c2goe1xuICAgIG9yaWdpbmFsOiBvYmosXG4gICAgY29weTogY29weVxuICB9KTtcblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGNvcHlba2V5XSA9IGRlZXBDb3B5KG9ialtrZXldLCBjYWNoZSk7XG4gIH0pO1xuXG4gIHJldHVybiBjb3B5XG59XG5cbi8qKlxuICogZm9yRWFjaCBmb3Igb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hWYWx1ZSAob2JqLCBmbikge1xuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gZm4ob2JqW2tleV0sIGtleSk7IH0pO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdCAob2JqKSB7XG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAmJiB0eXBlb2YgdmFsLnRoZW4gPT09ICdmdW5jdGlvbidcbn1cblxuZnVuY3Rpb24gYXNzZXJ0IChjb25kaXRpb24sIG1zZykge1xuICBpZiAoIWNvbmRpdGlvbikgeyB0aHJvdyBuZXcgRXJyb3IoKFwiW3Z1ZXhdIFwiICsgbXNnKSkgfVxufVxuXG5mdW5jdGlvbiBwYXJ0aWFsIChmbiwgYXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZuKGFyZylcbiAgfVxufVxuXG4vLyBCYXNlIGRhdGEgc3RydWN0IGZvciBzdG9yZSdzIG1vZHVsZSwgcGFja2FnZSB3aXRoIHNvbWUgYXR0cmlidXRlIGFuZCBtZXRob2RcbnZhciBNb2R1bGUgPSBmdW5jdGlvbiBNb2R1bGUgKHJhd01vZHVsZSwgcnVudGltZSkge1xuICB0aGlzLnJ1bnRpbWUgPSBydW50aW1lO1xuICAvLyBTdG9yZSBzb21lIGNoaWxkcmVuIGl0ZW1cbiAgdGhpcy5fY2hpbGRyZW4gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAvLyBTdG9yZSB0aGUgb3JpZ2luIG1vZHVsZSBvYmplY3Qgd2hpY2ggcGFzc2VkIGJ5IHByb2dyYW1tZXJcbiAgdGhpcy5fcmF3TW9kdWxlID0gcmF3TW9kdWxlO1xuICB2YXIgcmF3U3RhdGUgPSByYXdNb2R1bGUuc3RhdGU7XG5cbiAgLy8gU3RvcmUgdGhlIG9yaWdpbiBtb2R1bGUncyBzdGF0ZVxuICB0aGlzLnN0YXRlID0gKHR5cGVvZiByYXdTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyA/IHJhd1N0YXRlKCkgOiByYXdTdGF0ZSkgfHwge307XG59O1xuXG52YXIgcHJvdG90eXBlQWNjZXNzb3JzID0geyBuYW1lc3BhY2VkOiB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH07XG5cbnByb3RvdHlwZUFjY2Vzc29ycy5uYW1lc3BhY2VkLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICEhdGhpcy5fcmF3TW9kdWxlLm5hbWVzcGFjZWRcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuYWRkQ2hpbGQgPSBmdW5jdGlvbiBhZGRDaGlsZCAoa2V5LCBtb2R1bGUpIHtcbiAgdGhpcy5fY2hpbGRyZW5ba2V5XSA9IG1vZHVsZTtcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUucmVtb3ZlQ2hpbGQgPSBmdW5jdGlvbiByZW1vdmVDaGlsZCAoa2V5KSB7XG4gIGRlbGV0ZSB0aGlzLl9jaGlsZHJlbltrZXldO1xufTtcblxuTW9kdWxlLnByb3RvdHlwZS5nZXRDaGlsZCA9IGZ1bmN0aW9uIGdldENoaWxkIChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuW2tleV1cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuaGFzQ2hpbGQgPSBmdW5jdGlvbiBoYXNDaGlsZCAoa2V5KSB7XG4gIHJldHVybiBrZXkgaW4gdGhpcy5fY2hpbGRyZW5cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlIChyYXdNb2R1bGUpIHtcbiAgdGhpcy5fcmF3TW9kdWxlLm5hbWVzcGFjZWQgPSByYXdNb2R1bGUubmFtZXNwYWNlZDtcbiAgaWYgKHJhd01vZHVsZS5hY3Rpb25zKSB7XG4gICAgdGhpcy5fcmF3TW9kdWxlLmFjdGlvbnMgPSByYXdNb2R1bGUuYWN0aW9ucztcbiAgfVxuICBpZiAocmF3TW9kdWxlLm11dGF0aW9ucykge1xuICAgIHRoaXMuX3Jhd01vZHVsZS5tdXRhdGlvbnMgPSByYXdNb2R1bGUubXV0YXRpb25zO1xuICB9XG4gIGlmIChyYXdNb2R1bGUuZ2V0dGVycykge1xuICAgIHRoaXMuX3Jhd01vZHVsZS5nZXR0ZXJzID0gcmF3TW9kdWxlLmdldHRlcnM7XG4gIH1cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZm9yRWFjaENoaWxkID0gZnVuY3Rpb24gZm9yRWFjaENoaWxkIChmbikge1xuICBmb3JFYWNoVmFsdWUodGhpcy5fY2hpbGRyZW4sIGZuKTtcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZm9yRWFjaEdldHRlciA9IGZ1bmN0aW9uIGZvckVhY2hHZXR0ZXIgKGZuKSB7XG4gIGlmICh0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycykge1xuICAgIGZvckVhY2hWYWx1ZSh0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycywgZm4pO1xuICB9XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmZvckVhY2hBY3Rpb24gPSBmdW5jdGlvbiBmb3JFYWNoQWN0aW9uIChmbikge1xuICBpZiAodGhpcy5fcmF3TW9kdWxlLmFjdGlvbnMpIHtcbiAgICBmb3JFYWNoVmFsdWUodGhpcy5fcmF3TW9kdWxlLmFjdGlvbnMsIGZuKTtcbiAgfVxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5mb3JFYWNoTXV0YXRpb24gPSBmdW5jdGlvbiBmb3JFYWNoTXV0YXRpb24gKGZuKSB7XG4gIGlmICh0aGlzLl9yYXdNb2R1bGUubXV0YXRpb25zKSB7XG4gICAgZm9yRWFjaFZhbHVlKHRoaXMuX3Jhd01vZHVsZS5tdXRhdGlvbnMsIGZuKTtcbiAgfVxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1vZHVsZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG52YXIgTW9kdWxlQ29sbGVjdGlvbiA9IGZ1bmN0aW9uIE1vZHVsZUNvbGxlY3Rpb24gKHJhd1Jvb3RNb2R1bGUpIHtcbiAgLy8gcmVnaXN0ZXIgcm9vdCBtb2R1bGUgKFZ1ZXguU3RvcmUgb3B0aW9ucylcbiAgdGhpcy5yZWdpc3RlcihbXSwgcmF3Um9vdE1vZHVsZSwgZmFsc2UpO1xufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gZ2V0IChwYXRoKSB7XG4gIHJldHVybiBwYXRoLnJlZHVjZShmdW5jdGlvbiAobW9kdWxlLCBrZXkpIHtcbiAgICByZXR1cm4gbW9kdWxlLmdldENoaWxkKGtleSlcbiAgfSwgdGhpcy5yb290KVxufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUuZ2V0TmFtZXNwYWNlID0gZnVuY3Rpb24gZ2V0TmFtZXNwYWNlIChwYXRoKSB7XG4gIHZhciBtb2R1bGUgPSB0aGlzLnJvb3Q7XG4gIHJldHVybiBwYXRoLnJlZHVjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBrZXkpIHtcbiAgICBtb2R1bGUgPSBtb2R1bGUuZ2V0Q2hpbGQoa2V5KTtcbiAgICByZXR1cm4gbmFtZXNwYWNlICsgKG1vZHVsZS5uYW1lc3BhY2VkID8ga2V5ICsgJy8nIDogJycpXG4gIH0sICcnKVxufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlJDEgKHJhd1Jvb3RNb2R1bGUpIHtcbiAgdXBkYXRlKFtdLCB0aGlzLnJvb3QsIHJhd1Jvb3RNb2R1bGUpO1xufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlciAocGF0aCwgcmF3TW9kdWxlLCBydW50aW1lKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG4gICAgaWYgKCBydW50aW1lID09PSB2b2lkIDAgKSBydW50aW1lID0gdHJ1ZTtcblxuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0UmF3TW9kdWxlKHBhdGgsIHJhd01vZHVsZSk7XG4gIH1cblxuICB2YXIgbmV3TW9kdWxlID0gbmV3IE1vZHVsZShyYXdNb2R1bGUsIHJ1bnRpbWUpO1xuICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICB0aGlzLnJvb3QgPSBuZXdNb2R1bGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0KHBhdGguc2xpY2UoMCwgLTEpKTtcbiAgICBwYXJlbnQuYWRkQ2hpbGQocGF0aFtwYXRoLmxlbmd0aCAtIDFdLCBuZXdNb2R1bGUpO1xuICB9XG5cbiAgLy8gcmVnaXN0ZXIgbmVzdGVkIG1vZHVsZXNcbiAgaWYgKHJhd01vZHVsZS5tb2R1bGVzKSB7XG4gICAgZm9yRWFjaFZhbHVlKHJhd01vZHVsZS5tb2R1bGVzLCBmdW5jdGlvbiAocmF3Q2hpbGRNb2R1bGUsIGtleSkge1xuICAgICAgdGhpcyQxLnJlZ2lzdGVyKHBhdGguY29uY2F0KGtleSksIHJhd0NoaWxkTW9kdWxlLCBydW50aW1lKTtcbiAgICB9KTtcbiAgfVxufTtcblxuTW9kdWxlQ29sbGVjdGlvbi5wcm90b3R5cGUudW5yZWdpc3RlciA9IGZ1bmN0aW9uIHVucmVnaXN0ZXIgKHBhdGgpIHtcbiAgdmFyIHBhcmVudCA9IHRoaXMuZ2V0KHBhdGguc2xpY2UoMCwgLTEpKTtcbiAgdmFyIGtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgdmFyIGNoaWxkID0gcGFyZW50LmdldENoaWxkKGtleSk7XG5cbiAgaWYgKCFjaGlsZCkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbdnVleF0gdHJ5aW5nIHRvIHVucmVnaXN0ZXIgbW9kdWxlICdcIiArIGtleSArIFwiJywgd2hpY2ggaXMgXCIgK1xuICAgICAgICBcIm5vdCByZWdpc3RlcmVkXCJcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKCFjaGlsZC5ydW50aW1lKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBwYXJlbnQucmVtb3ZlQ2hpbGQoa2V5KTtcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLmlzUmVnaXN0ZXJlZCA9IGZ1bmN0aW9uIGlzUmVnaXN0ZXJlZCAocGF0aCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5nZXQocGF0aC5zbGljZSgwLCAtMSkpO1xuICB2YXIga2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuXG4gIGlmIChwYXJlbnQpIHtcbiAgICByZXR1cm4gcGFyZW50Lmhhc0NoaWxkKGtleSlcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufTtcblxuZnVuY3Rpb24gdXBkYXRlIChwYXRoLCB0YXJnZXRNb2R1bGUsIG5ld01vZHVsZSkge1xuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0UmF3TW9kdWxlKHBhdGgsIG5ld01vZHVsZSk7XG4gIH1cblxuICAvLyB1cGRhdGUgdGFyZ2V0IG1vZHVsZVxuICB0YXJnZXRNb2R1bGUudXBkYXRlKG5ld01vZHVsZSk7XG5cbiAgLy8gdXBkYXRlIG5lc3RlZCBtb2R1bGVzXG4gIGlmIChuZXdNb2R1bGUubW9kdWxlcykge1xuICAgIGZvciAodmFyIGtleSBpbiBuZXdNb2R1bGUubW9kdWxlcykge1xuICAgICAgaWYgKCF0YXJnZXRNb2R1bGUuZ2V0Q2hpbGQoa2V5KSkge1xuICAgICAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgXCJbdnVleF0gdHJ5aW5nIHRvIGFkZCBhIG5ldyBtb2R1bGUgJ1wiICsga2V5ICsgXCInIG9uIGhvdCByZWxvYWRpbmcsIFwiICtcbiAgICAgICAgICAgICdtYW51YWwgcmVsb2FkIGlzIG5lZWRlZCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgdXBkYXRlKFxuICAgICAgICBwYXRoLmNvbmNhdChrZXkpLFxuICAgICAgICB0YXJnZXRNb2R1bGUuZ2V0Q2hpbGQoa2V5KSxcbiAgICAgICAgbmV3TW9kdWxlLm1vZHVsZXNba2V5XVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGZ1bmN0aW9uQXNzZXJ0ID0ge1xuICBhc3NlcnQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nOyB9LFxuICBleHBlY3RlZDogJ2Z1bmN0aW9uJ1xufTtcblxudmFyIG9iamVjdEFzc2VydCA9IHtcbiAgYXNzZXJ0OiBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS5oYW5kbGVyID09PSAnZnVuY3Rpb24nKTsgfSxcbiAgZXhwZWN0ZWQ6ICdmdW5jdGlvbiBvciBvYmplY3Qgd2l0aCBcImhhbmRsZXJcIiBmdW5jdGlvbidcbn07XG5cbnZhciBhc3NlcnRUeXBlcyA9IHtcbiAgZ2V0dGVyczogZnVuY3Rpb25Bc3NlcnQsXG4gIG11dGF0aW9uczogZnVuY3Rpb25Bc3NlcnQsXG4gIGFjdGlvbnM6IG9iamVjdEFzc2VydFxufTtcblxuZnVuY3Rpb24gYXNzZXJ0UmF3TW9kdWxlIChwYXRoLCByYXdNb2R1bGUpIHtcbiAgT2JqZWN0LmtleXMoYXNzZXJ0VHlwZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmICghcmF3TW9kdWxlW2tleV0pIHsgcmV0dXJuIH1cblxuICAgIHZhciBhc3NlcnRPcHRpb25zID0gYXNzZXJ0VHlwZXNba2V5XTtcblxuICAgIGZvckVhY2hWYWx1ZShyYXdNb2R1bGVba2V5XSwgZnVuY3Rpb24gKHZhbHVlLCB0eXBlKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFzc2VydE9wdGlvbnMuYXNzZXJ0KHZhbHVlKSxcbiAgICAgICAgbWFrZUFzc2VydGlvbk1lc3NhZ2UocGF0aCwga2V5LCB0eXBlLCB2YWx1ZSwgYXNzZXJ0T3B0aW9ucy5leHBlY3RlZClcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYWtlQXNzZXJ0aW9uTWVzc2FnZSAocGF0aCwga2V5LCB0eXBlLCB2YWx1ZSwgZXhwZWN0ZWQpIHtcbiAgdmFyIGJ1ZiA9IGtleSArIFwiIHNob3VsZCBiZSBcIiArIGV4cGVjdGVkICsgXCIgYnV0IFxcXCJcIiArIGtleSArIFwiLlwiICsgdHlwZSArIFwiXFxcIlwiO1xuICBpZiAocGF0aC5sZW5ndGggPiAwKSB7XG4gICAgYnVmICs9IFwiIGluIG1vZHVsZSBcXFwiXCIgKyAocGF0aC5qb2luKCcuJykpICsgXCJcXFwiXCI7XG4gIH1cbiAgYnVmICs9IFwiIGlzIFwiICsgKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgKyBcIi5cIjtcbiAgcmV0dXJuIGJ1ZlxufVxuXG52YXIgVnVlOyAvLyBiaW5kIG9uIGluc3RhbGxcblxudmFyIFN0b3JlID0gZnVuY3Rpb24gU3RvcmUgKG9wdGlvbnMpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG4gIGlmICggb3B0aW9ucyA9PT0gdm9pZCAwICkgb3B0aW9ucyA9IHt9O1xuXG4gIC8vIEF1dG8gaW5zdGFsbCBpZiBpdCBpcyBub3QgZG9uZSB5ZXQgYW5kIGB3aW5kb3dgIGhhcyBgVnVlYC5cbiAgLy8gVG8gYWxsb3cgdXNlcnMgdG8gYXZvaWQgYXV0by1pbnN0YWxsYXRpb24gaW4gc29tZSBjYXNlcyxcbiAgLy8gdGhpcyBjb2RlIHNob3VsZCBiZSBwbGFjZWQgaGVyZS4gU2VlICM3MzFcbiAgaWYgKCFWdWUgJiYgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlZ1ZSkge1xuICAgIGluc3RhbGwod2luZG93LlZ1ZSk7XG4gIH1cblxuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0KFZ1ZSwgXCJtdXN0IGNhbGwgVnVlLnVzZShWdWV4KSBiZWZvcmUgY3JlYXRpbmcgYSBzdG9yZSBpbnN0YW5jZS5cIik7XG4gICAgYXNzZXJ0KHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJywgXCJ2dWV4IHJlcXVpcmVzIGEgUHJvbWlzZSBwb2x5ZmlsbCBpbiB0aGlzIGJyb3dzZXIuXCIpO1xuICAgIGFzc2VydCh0aGlzIGluc3RhbmNlb2YgU3RvcmUsIFwic3RvcmUgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yLlwiKTtcbiAgfVxuXG4gIHZhciBwbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zOyBpZiAoIHBsdWdpbnMgPT09IHZvaWQgMCApIHBsdWdpbnMgPSBbXTtcbiAgdmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0OyBpZiAoIHN0cmljdCA9PT0gdm9pZCAwICkgc3RyaWN0ID0gZmFsc2U7XG5cbiAgLy8gc3RvcmUgaW50ZXJuYWwgc3RhdGVcbiAgdGhpcy5fY29tbWl0dGluZyA9IGZhbHNlO1xuICB0aGlzLl9hY3Rpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMgPSBbXTtcbiAgdGhpcy5fbXV0YXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fd3JhcHBlZEdldHRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aGlzLl9tb2R1bGVzID0gbmV3IE1vZHVsZUNvbGxlY3Rpb24ob3B0aW9ucyk7XG4gIHRoaXMuX21vZHVsZXNOYW1lc3BhY2VNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdO1xuICB0aGlzLl93YXRjaGVyVk0gPSBuZXcgVnVlKCk7XG4gIHRoaXMuX21ha2VMb2NhbEdldHRlcnNDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gYmluZCBjb21taXQgYW5kIGRpc3BhdGNoIHRvIHNlbGZcbiAgdmFyIHN0b3JlID0gdGhpcztcbiAgdmFyIHJlZiA9IHRoaXM7XG4gIHZhciBkaXNwYXRjaCA9IHJlZi5kaXNwYXRjaDtcbiAgdmFyIGNvbW1pdCA9IHJlZi5jb21taXQ7XG4gIHRoaXMuZGlzcGF0Y2ggPSBmdW5jdGlvbiBib3VuZERpc3BhdGNoICh0eXBlLCBwYXlsb2FkKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoLmNhbGwoc3RvcmUsIHR5cGUsIHBheWxvYWQpXG4gIH07XG4gIHRoaXMuY29tbWl0ID0gZnVuY3Rpb24gYm91bmRDb21taXQgKHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gY29tbWl0LmNhbGwoc3RvcmUsIHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpXG4gIH07XG5cbiAgLy8gc3RyaWN0IG1vZGVcbiAgdGhpcy5zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgdmFyIHN0YXRlID0gdGhpcy5fbW9kdWxlcy5yb290LnN0YXRlO1xuXG4gIC8vIGluaXQgcm9vdCBtb2R1bGUuXG4gIC8vIHRoaXMgYWxzbyByZWN1cnNpdmVseSByZWdpc3RlcnMgYWxsIHN1Yi1tb2R1bGVzXG4gIC8vIGFuZCBjb2xsZWN0cyBhbGwgbW9kdWxlIGdldHRlcnMgaW5zaWRlIHRoaXMuX3dyYXBwZWRHZXR0ZXJzXG4gIGluc3RhbGxNb2R1bGUodGhpcywgc3RhdGUsIFtdLCB0aGlzLl9tb2R1bGVzLnJvb3QpO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHN0b3JlIHZtLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHJlYWN0aXZpdHlcbiAgLy8gKGFsc28gcmVnaXN0ZXJzIF93cmFwcGVkR2V0dGVycyBhcyBjb21wdXRlZCBwcm9wZXJ0aWVzKVxuICByZXNldFN0b3JlVk0odGhpcywgc3RhdGUpO1xuXG4gIC8vIGFwcGx5IHBsdWdpbnNcbiAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHsgcmV0dXJuIHBsdWdpbih0aGlzJDEpOyB9KTtcblxuICB2YXIgdXNlRGV2dG9vbHMgPSBvcHRpb25zLmRldnRvb2xzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRldnRvb2xzIDogVnVlLmNvbmZpZy5kZXZ0b29scztcbiAgaWYgKHVzZURldnRvb2xzKSB7XG4gICAgZGV2dG9vbFBsdWdpbih0aGlzKTtcbiAgfVxufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyQxID0geyBzdGF0ZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5zdGF0ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl92bS5fZGF0YS4kJHN0YXRlXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5zdGF0ZS5zZXQgPSBmdW5jdGlvbiAodikge1xuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0KGZhbHNlLCBcInVzZSBzdG9yZS5yZXBsYWNlU3RhdGUoKSB0byBleHBsaWNpdCByZXBsYWNlIHN0b3JlIHN0YXRlLlwiKTtcbiAgfVxufTtcblxuU3RvcmUucHJvdG90eXBlLmNvbW1pdCA9IGZ1bmN0aW9uIGNvbW1pdCAoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucykge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIC8vIGNoZWNrIG9iamVjdC1zdHlsZSBjb21taXRcbiAgdmFyIHJlZiA9IHVuaWZ5T2JqZWN0U3R5bGUoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucyk7XG4gICAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgICB2YXIgcGF5bG9hZCA9IHJlZi5wYXlsb2FkO1xuICAgIHZhciBvcHRpb25zID0gcmVmLm9wdGlvbnM7XG5cbiAgdmFyIG11dGF0aW9uID0geyB0eXBlOiB0eXBlLCBwYXlsb2FkOiBwYXlsb2FkIH07XG4gIHZhciBlbnRyeSA9IHRoaXMuX211dGF0aW9uc1t0eXBlXTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIHVua25vd24gbXV0YXRpb24gdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIHRoaXMuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgIGVudHJ5LmZvckVhY2goZnVuY3Rpb24gY29tbWl0SXRlcmF0b3IgKGhhbmRsZXIpIHtcbiAgICAgIGhhbmRsZXIocGF5bG9hZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMuX3N1YnNjcmliZXJzXG4gICAgLnNsaWNlKCkgLy8gc2hhbGxvdyBjb3B5IHRvIHByZXZlbnQgaXRlcmF0b3IgaW52YWxpZGF0aW9uIGlmIHN1YnNjcmliZXIgc3luY2hyb25vdXNseSBjYWxscyB1bnN1YnNjcmliZVxuICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1YihtdXRhdGlvbiwgdGhpcyQxLnN0YXRlKTsgfSk7XG5cbiAgaWYgKFxuICAgIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5zaWxlbnRcbiAgKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbdnVleF0gbXV0YXRpb24gdHlwZTogXCIgKyB0eXBlICsgXCIuIFNpbGVudCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4gXCIgK1xuICAgICAgJ1VzZSB0aGUgZmlsdGVyIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIHZ1ZS1kZXZ0b29scydcbiAgICApO1xuICB9XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaCAoX3R5cGUsIF9wYXlsb2FkKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgLy8gY2hlY2sgb2JqZWN0LXN0eWxlIGRpc3BhdGNoXG4gIHZhciByZWYgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCk7XG4gICAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgICB2YXIgcGF5bG9hZCA9IHJlZi5wYXlsb2FkO1xuXG4gIHZhciBhY3Rpb24gPSB7IHR5cGU6IHR5cGUsIHBheWxvYWQ6IHBheWxvYWQgfTtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fYWN0aW9uc1t0eXBlXTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIHVua25vd24gYWN0aW9uIHR5cGU6IFwiICsgdHlwZSkpO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnNcbiAgICAgIC5zbGljZSgpIC8vIHNoYWxsb3cgY29weSB0byBwcmV2ZW50IGl0ZXJhdG9yIGludmFsaWRhdGlvbiBpZiBzdWJzY3JpYmVyIHN5bmNocm9ub3VzbHkgY2FsbHMgdW5zdWJzY3JpYmVcbiAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViLmJlZm9yZTsgfSlcbiAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5iZWZvcmUoYWN0aW9uLCB0aGlzJDEuc3RhdGUpOyB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlt2dWV4XSBlcnJvciBpbiBiZWZvcmUgYWN0aW9uIHN1YnNjcmliZXJzOiBcIik7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSBlbnRyeS5sZW5ndGggPiAxXG4gICAgPyBQcm9taXNlLmFsbChlbnRyeS5tYXAoZnVuY3Rpb24gKGhhbmRsZXIpIHsgcmV0dXJuIGhhbmRsZXIocGF5bG9hZCk7IH0pKVxuICAgIDogZW50cnlbMF0ocGF5bG9hZCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXN1bHQudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzJDEuX2FjdGlvblN1YnNjcmliZXJzXG4gICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYWZ0ZXI7IH0pXG4gICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViLmFmdGVyKGFjdGlvbiwgdGhpcyQxLnN0YXRlKTsgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJbdnVleF0gZXJyb3IgaW4gYWZ0ZXIgYWN0aW9uIHN1YnNjcmliZXJzOiBcIik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzb2x2ZShyZXMpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcyQxLl9hY3Rpb25TdWJzY3JpYmVyc1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViLmVycm9yOyB9KVxuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5lcnJvcihhY3Rpb24sIHRoaXMkMS5zdGF0ZSwgZXJyb3IpOyB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIlt2dWV4XSBlcnJvciBpbiBlcnJvciBhY3Rpb24gc3Vic2NyaWJlcnM6IFwiKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH0pO1xuICB9KVxufTtcblxuU3RvcmUucHJvdG90eXBlLnN1YnNjcmliZSA9IGZ1bmN0aW9uIHN1YnNjcmliZSAoZm4sIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGdlbmVyaWNTdWJzY3JpYmUoZm4sIHRoaXMuX3N1YnNjcmliZXJzLCBvcHRpb25zKVxufTtcblxuU3RvcmUucHJvdG90eXBlLnN1YnNjcmliZUFjdGlvbiA9IGZ1bmN0aW9uIHN1YnNjcmliZUFjdGlvbiAoZm4sIG9wdGlvbnMpIHtcbiAgdmFyIHN1YnMgPSB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgPyB7IGJlZm9yZTogZm4gfSA6IGZuO1xuICByZXR1cm4gZ2VuZXJpY1N1YnNjcmliZShzdWJzLCB0aGlzLl9hY3Rpb25TdWJzY3JpYmVycywgb3B0aW9ucylcbn07XG5cblN0b3JlLnByb3RvdHlwZS53YXRjaCA9IGZ1bmN0aW9uIHdhdGNoIChnZXR0ZXIsIGNiLCBvcHRpb25zKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydCh0eXBlb2YgZ2V0dGVyID09PSAnZnVuY3Rpb24nLCBcInN0b3JlLndhdGNoIG9ubHkgYWNjZXB0cyBhIGZ1bmN0aW9uLlwiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5fd2F0Y2hlclZNLiR3YXRjaChmdW5jdGlvbiAoKSB7IHJldHVybiBnZXR0ZXIodGhpcyQxLnN0YXRlLCB0aGlzJDEuZ2V0dGVycyk7IH0sIGNiLCBvcHRpb25zKVxufTtcblxuU3RvcmUucHJvdG90eXBlLnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIHJlcGxhY2VTdGF0ZSAoc3RhdGUpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB0aGlzLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzJDEuX3ZtLl9kYXRhLiQkc3RhdGUgPSBzdGF0ZTtcbiAgfSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUucmVnaXN0ZXJNb2R1bGUgPSBmdW5jdGlvbiByZWdpc3Rlck1vZHVsZSAocGF0aCwgcmF3TW9kdWxlLCBvcHRpb25zKSB7XG4gICAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgeyBwYXRoID0gW3BhdGhdOyB9XG5cbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHBhdGgpLCBcIm1vZHVsZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gQXJyYXkuXCIpO1xuICAgIGFzc2VydChwYXRoLmxlbmd0aCA+IDAsICdjYW5ub3QgcmVnaXN0ZXIgdGhlIHJvb3QgbW9kdWxlIGJ5IHVzaW5nIHJlZ2lzdGVyTW9kdWxlLicpO1xuICB9XG5cbiAgdGhpcy5fbW9kdWxlcy5yZWdpc3RlcihwYXRoLCByYXdNb2R1bGUpO1xuICBpbnN0YWxsTW9kdWxlKHRoaXMsIHRoaXMuc3RhdGUsIHBhdGgsIHRoaXMuX21vZHVsZXMuZ2V0KHBhdGgpLCBvcHRpb25zLnByZXNlcnZlU3RhdGUpO1xuICAvLyByZXNldCBzdG9yZSB0byB1cGRhdGUgZ2V0dGVycy4uLlxuICByZXNldFN0b3JlVk0odGhpcywgdGhpcy5zdGF0ZSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUudW5yZWdpc3Rlck1vZHVsZSA9IGZ1bmN0aW9uIHVucmVnaXN0ZXJNb2R1bGUgKHBhdGgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkocGF0aCksIFwibW9kdWxlIHBhdGggbXVzdCBiZSBhIHN0cmluZyBvciBhbiBBcnJheS5cIik7XG4gIH1cblxuICB0aGlzLl9tb2R1bGVzLnVucmVnaXN0ZXIocGF0aCk7XG4gIHRoaXMuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnRTdGF0ZSA9IGdldE5lc3RlZFN0YXRlKHRoaXMkMS5zdGF0ZSwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIFZ1ZS5kZWxldGUocGFyZW50U3RhdGUsIHBhdGhbcGF0aC5sZW5ndGggLSAxXSk7XG4gIH0pO1xuICByZXNldFN0b3JlKHRoaXMpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLmhhc01vZHVsZSA9IGZ1bmN0aW9uIGhhc01vZHVsZSAocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkocGF0aCksIFwibW9kdWxlIHBhdGggbXVzdCBiZSBhIHN0cmluZyBvciBhbiBBcnJheS5cIik7XG4gIH1cblxuICByZXR1cm4gdGhpcy5fbW9kdWxlcy5pc1JlZ2lzdGVyZWQocGF0aClcbn07XG5cblN0b3JlLnByb3RvdHlwZVtbMTA0LDExMSwxMTYsODUsMTEyLDEwMCw5NywxMTYsMTAxXS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShpdGVtKX0pLmpvaW4oJycpXSA9IGZ1bmN0aW9uIChuZXdPcHRpb25zKSB7XG4gIHRoaXMuX21vZHVsZXMudXBkYXRlKG5ld09wdGlvbnMpO1xuICByZXNldFN0b3JlKHRoaXMsIHRydWUpO1xufTtcblxuU3RvcmUucHJvdG90eXBlLl93aXRoQ29tbWl0ID0gZnVuY3Rpb24gX3dpdGhDb21taXQgKGZuKSB7XG4gIHZhciBjb21taXR0aW5nID0gdGhpcy5fY29tbWl0dGluZztcbiAgdGhpcy5fY29tbWl0dGluZyA9IHRydWU7XG4gIGZuKCk7XG4gIHRoaXMuX2NvbW1pdHRpbmcgPSBjb21taXR0aW5nO1xufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFN0b3JlLnByb3RvdHlwZSwgcHJvdG90eXBlQWNjZXNzb3JzJDEgKTtcblxuZnVuY3Rpb24gZ2VuZXJpY1N1YnNjcmliZSAoZm4sIHN1YnMsIG9wdGlvbnMpIHtcbiAgaWYgKHN1YnMuaW5kZXhPZihmbikgPCAwKSB7XG4gICAgb3B0aW9ucyAmJiBvcHRpb25zLnByZXBlbmRcbiAgICAgID8gc3Vicy51bnNoaWZ0KGZuKVxuICAgICAgOiBzdWJzLnB1c2goZm4pO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGkgPSBzdWJzLmluZGV4T2YoZm4pO1xuICAgIGlmIChpID4gLTEpIHtcbiAgICAgIHN1YnMuc3BsaWNlKGksIDEpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldFN0b3JlIChzdG9yZSwgaG90KSB7XG4gIHN0b3JlLl9hY3Rpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgc3RvcmUuX211dGF0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHN0b3JlLl93cmFwcGVkR2V0dGVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIHN0YXRlID0gc3RvcmUuc3RhdGU7XG4gIC8vIGluaXQgYWxsIG1vZHVsZXNcbiAgaW5zdGFsbE1vZHVsZShzdG9yZSwgc3RhdGUsIFtdLCBzdG9yZS5fbW9kdWxlcy5yb290LCB0cnVlKTtcbiAgLy8gcmVzZXQgdm1cbiAgcmVzZXRTdG9yZVZNKHN0b3JlLCBzdGF0ZSwgaG90KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRTdG9yZVZNIChzdG9yZSwgc3RhdGUsIGhvdCkge1xuICB2YXIgb2xkVm0gPSBzdG9yZS5fdm07XG5cbiAgLy8gYmluZCBzdG9yZSBwdWJsaWMgZ2V0dGVyc1xuICBzdG9yZS5nZXR0ZXJzID0ge307XG4gIC8vIHJlc2V0IGxvY2FsIGdldHRlcnMgY2FjaGVcbiAgc3RvcmUuX21ha2VMb2NhbEdldHRlcnNDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciB3cmFwcGVkR2V0dGVycyA9IHN0b3JlLl93cmFwcGVkR2V0dGVycztcbiAgdmFyIGNvbXB1dGVkID0ge307XG4gIGZvckVhY2hWYWx1ZSh3cmFwcGVkR2V0dGVycywgZnVuY3Rpb24gKGZuLCBrZXkpIHtcbiAgICAvLyB1c2UgY29tcHV0ZWQgdG8gbGV2ZXJhZ2UgaXRzIGxhenktY2FjaGluZyBtZWNoYW5pc21cbiAgICAvLyBkaXJlY3QgaW5saW5lIGZ1bmN0aW9uIHVzZSB3aWxsIGxlYWQgdG8gY2xvc3VyZSBwcmVzZXJ2aW5nIG9sZFZtLlxuICAgIC8vIHVzaW5nIHBhcnRpYWwgdG8gcmV0dXJuIGZ1bmN0aW9uIHdpdGggb25seSBhcmd1bWVudHMgcHJlc2VydmVkIGluIGNsb3N1cmUgZW52aXJvbm1lbnQuXG4gICAgY29tcHV0ZWRba2V5XSA9IHBhcnRpYWwoZm4sIHN0b3JlKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc3RvcmUuZ2V0dGVycywga2V5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0b3JlLl92bVtrZXldOyB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSAvLyBmb3IgbG9jYWwgZ2V0dGVyc1xuICAgIH0pO1xuICB9KTtcblxuICAvLyB1c2UgYSBWdWUgaW5zdGFuY2UgdG8gc3RvcmUgdGhlIHN0YXRlIHRyZWVcbiAgLy8gc3VwcHJlc3Mgd2FybmluZ3MganVzdCBpbiBjYXNlIHRoZSB1c2VyIGhhcyBhZGRlZFxuICAvLyBzb21lIGZ1bmt5IGdsb2JhbCBtaXhpbnNcbiAgdmFyIHNpbGVudCA9IFZ1ZS5jb25maWcuc2lsZW50O1xuICBWdWUuY29uZmlnLnNpbGVudCA9IHRydWU7XG4gIHN0b3JlLl92bSA9IG5ldyBWdWUoe1xuICAgIGRhdGE6IHtcbiAgICAgICQkc3RhdGU6IHN0YXRlXG4gICAgfSxcbiAgICBjb21wdXRlZDogY29tcHV0ZWRcbiAgfSk7XG4gIFZ1ZS5jb25maWcuc2lsZW50ID0gc2lsZW50O1xuXG4gIC8vIGVuYWJsZSBzdHJpY3QgbW9kZSBmb3IgbmV3IHZtXG4gIGlmIChzdG9yZS5zdHJpY3QpIHtcbiAgICBlbmFibGVTdHJpY3RNb2RlKHN0b3JlKTtcbiAgfVxuXG4gIGlmIChvbGRWbSkge1xuICAgIGlmIChob3QpIHtcbiAgICAgIC8vIGRpc3BhdGNoIGNoYW5nZXMgaW4gYWxsIHN1YnNjcmliZWQgd2F0Y2hlcnNcbiAgICAgIC8vIHRvIGZvcmNlIGdldHRlciByZS1ldmFsdWF0aW9uIGZvciBob3QgcmVsb2FkaW5nLlxuICAgICAgc3RvcmUuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBvbGRWbS5fZGF0YS4kJHN0YXRlID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBWdWUubmV4dFRpY2soZnVuY3Rpb24gKCkgeyByZXR1cm4gb2xkVm0uJGRlc3Ryb3koKTsgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbE1vZHVsZSAoc3RvcmUsIHJvb3RTdGF0ZSwgcGF0aCwgbW9kdWxlLCBob3QpIHtcbiAgdmFyIGlzUm9vdCA9ICFwYXRoLmxlbmd0aDtcbiAgdmFyIG5hbWVzcGFjZSA9IHN0b3JlLl9tb2R1bGVzLmdldE5hbWVzcGFjZShwYXRoKTtcblxuICAvLyByZWdpc3RlciBpbiBuYW1lc3BhY2UgbWFwXG4gIGlmIChtb2R1bGUubmFtZXNwYWNlZCkge1xuICAgIGlmIChzdG9yZS5fbW9kdWxlc05hbWVzcGFjZU1hcFtuYW1lc3BhY2VdICYmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gZHVwbGljYXRlIG5hbWVzcGFjZSBcIiArIG5hbWVzcGFjZSArIFwiIGZvciB0aGUgbmFtZXNwYWNlZCBtb2R1bGUgXCIgKyAocGF0aC5qb2luKCcvJykpKSk7XG4gICAgfVxuICAgIHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwW25hbWVzcGFjZV0gPSBtb2R1bGU7XG4gIH1cblxuICAvLyBzZXQgc3RhdGVcbiAgaWYgKCFpc1Jvb3QgJiYgIWhvdCkge1xuICAgIHZhciBwYXJlbnRTdGF0ZSA9IGdldE5lc3RlZFN0YXRlKHJvb3RTdGF0ZSwgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIHZhciBtb2R1bGVOYW1lID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIHN0b3JlLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgaWYgKG1vZHVsZU5hbWUgaW4gcGFyZW50U3RhdGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAoXCJbdnVleF0gc3RhdGUgZmllbGQgXFxcIlwiICsgbW9kdWxlTmFtZSArIFwiXFxcIiB3YXMgb3ZlcnJpZGRlbiBieSBhIG1vZHVsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXQgXFxcIlwiICsgKHBhdGguam9pbignLicpKSArIFwiXFxcIlwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFZ1ZS5zZXQocGFyZW50U3RhdGUsIG1vZHVsZU5hbWUsIG1vZHVsZS5zdGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgbG9jYWwgPSBtb2R1bGUuY29udGV4dCA9IG1ha2VMb2NhbENvbnRleHQoc3RvcmUsIG5hbWVzcGFjZSwgcGF0aCk7XG5cbiAgbW9kdWxlLmZvckVhY2hNdXRhdGlvbihmdW5jdGlvbiAobXV0YXRpb24sIGtleSkge1xuICAgIHZhciBuYW1lc3BhY2VkVHlwZSA9IG5hbWVzcGFjZSArIGtleTtcbiAgICByZWdpc3Rlck11dGF0aW9uKHN0b3JlLCBuYW1lc3BhY2VkVHlwZSwgbXV0YXRpb24sIGxvY2FsKTtcbiAgfSk7XG5cbiAgbW9kdWxlLmZvckVhY2hBY3Rpb24oZnVuY3Rpb24gKGFjdGlvbiwga2V5KSB7XG4gICAgdmFyIHR5cGUgPSBhY3Rpb24ucm9vdCA/IGtleSA6IG5hbWVzcGFjZSArIGtleTtcbiAgICB2YXIgaGFuZGxlciA9IGFjdGlvbi5oYW5kbGVyIHx8IGFjdGlvbjtcbiAgICByZWdpc3RlckFjdGlvbihzdG9yZSwgdHlwZSwgaGFuZGxlciwgbG9jYWwpO1xuICB9KTtcblxuICBtb2R1bGUuZm9yRWFjaEdldHRlcihmdW5jdGlvbiAoZ2V0dGVyLCBrZXkpIHtcbiAgICB2YXIgbmFtZXNwYWNlZFR5cGUgPSBuYW1lc3BhY2UgKyBrZXk7XG4gICAgcmVnaXN0ZXJHZXR0ZXIoc3RvcmUsIG5hbWVzcGFjZWRUeXBlLCBnZXR0ZXIsIGxvY2FsKTtcbiAgfSk7XG5cbiAgbW9kdWxlLmZvckVhY2hDaGlsZChmdW5jdGlvbiAoY2hpbGQsIGtleSkge1xuICAgIGluc3RhbGxNb2R1bGUoc3RvcmUsIHJvb3RTdGF0ZSwgcGF0aC5jb25jYXQoa2V5KSwgY2hpbGQsIGhvdCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIG1ha2UgbG9jYWxpemVkIGRpc3BhdGNoLCBjb21taXQsIGdldHRlcnMgYW5kIHN0YXRlXG4gKiBpZiB0aGVyZSBpcyBubyBuYW1lc3BhY2UsIGp1c3QgdXNlIHJvb3Qgb25lc1xuICovXG5mdW5jdGlvbiBtYWtlTG9jYWxDb250ZXh0IChzdG9yZSwgbmFtZXNwYWNlLCBwYXRoKSB7XG4gIHZhciBub05hbWVzcGFjZSA9IG5hbWVzcGFjZSA9PT0gJyc7XG5cbiAgdmFyIGxvY2FsID0ge1xuICAgIGRpc3BhdGNoOiBub05hbWVzcGFjZSA/IHN0b3JlLmRpc3BhdGNoIDogZnVuY3Rpb24gKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpIHtcbiAgICAgIHZhciBhcmdzID0gdW5pZnlPYmplY3RTdHlsZShfdHlwZSwgX3BheWxvYWQsIF9vcHRpb25zKTtcbiAgICAgIHZhciBwYXlsb2FkID0gYXJncy5wYXlsb2FkO1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmdzLm9wdGlvbnM7XG4gICAgICB2YXIgdHlwZSA9IGFyZ3MudHlwZTtcblxuICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLnJvb3QpIHtcbiAgICAgICAgdHlwZSA9IG5hbWVzcGFjZSArIHR5cGU7XG4gICAgICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIXN0b3JlLl9hY3Rpb25zW3R5cGVdKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBsb2NhbCBhY3Rpb24gdHlwZTogXCIgKyAoYXJncy50eXBlKSArIFwiLCBnbG9iYWwgdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0b3JlLmRpc3BhdGNoKHR5cGUsIHBheWxvYWQpXG4gICAgfSxcblxuICAgIGNvbW1pdDogbm9OYW1lc3BhY2UgPyBzdG9yZS5jb21taXQgOiBmdW5jdGlvbiAoX3R5cGUsIF9wYXlsb2FkLCBfb3B0aW9ucykge1xuICAgICAgdmFyIGFyZ3MgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpO1xuICAgICAgdmFyIHBheWxvYWQgPSBhcmdzLnBheWxvYWQ7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3Mub3B0aW9ucztcbiAgICAgIHZhciB0eXBlID0gYXJncy50eXBlO1xuXG4gICAgICBpZiAoIW9wdGlvbnMgfHwgIW9wdGlvbnMucm9vdCkge1xuICAgICAgICB0eXBlID0gbmFtZXNwYWNlICsgdHlwZTtcbiAgICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhc3RvcmUuX211dGF0aW9uc1t0eXBlXSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIHVua25vd24gbG9jYWwgbXV0YXRpb24gdHlwZTogXCIgKyAoYXJncy50eXBlKSArIFwiLCBnbG9iYWwgdHlwZTogXCIgKyB0eXBlKSk7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3RvcmUuY29tbWl0KHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcblxuICAvLyBnZXR0ZXJzIGFuZCBzdGF0ZSBvYmplY3QgbXVzdCBiZSBnb3R0ZW4gbGF6aWx5XG4gIC8vIGJlY2F1c2UgdGhleSB3aWxsIGJlIGNoYW5nZWQgYnkgdm0gdXBkYXRlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxvY2FsLCB7XG4gICAgZ2V0dGVyczoge1xuICAgICAgZ2V0OiBub05hbWVzcGFjZVxuICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0b3JlLmdldHRlcnM7IH1cbiAgICAgICAgOiBmdW5jdGlvbiAoKSB7IHJldHVybiBtYWtlTG9jYWxHZXR0ZXJzKHN0b3JlLCBuYW1lc3BhY2UpOyB9XG4gICAgfSxcbiAgICBzdGF0ZToge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBnZXROZXN0ZWRTdGF0ZShzdG9yZS5zdGF0ZSwgcGF0aCk7IH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBsb2NhbFxufVxuXG5mdW5jdGlvbiBtYWtlTG9jYWxHZXR0ZXJzIChzdG9yZSwgbmFtZXNwYWNlKSB7XG4gIGlmICghc3RvcmUuX21ha2VMb2NhbEdldHRlcnNDYWNoZVtuYW1lc3BhY2VdKSB7XG4gICAgdmFyIGdldHRlcnNQcm94eSA9IHt9O1xuICAgIHZhciBzcGxpdFBvcyA9IG5hbWVzcGFjZS5sZW5ndGg7XG4gICAgT2JqZWN0LmtleXMoc3RvcmUuZ2V0dGVycykuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgICAgLy8gc2tpcCBpZiB0aGUgdGFyZ2V0IGdldHRlciBpcyBub3QgbWF0Y2ggdGhpcyBuYW1lc3BhY2VcbiAgICAgIGlmICh0eXBlLnNsaWNlKDAsIHNwbGl0UG9zKSAhPT0gbmFtZXNwYWNlKSB7IHJldHVybiB9XG5cbiAgICAgIC8vIGV4dHJhY3QgbG9jYWwgZ2V0dGVyIHR5cGVcbiAgICAgIHZhciBsb2NhbFR5cGUgPSB0eXBlLnNsaWNlKHNwbGl0UG9zKTtcblxuICAgICAgLy8gQWRkIGEgcG9ydCB0byB0aGUgZ2V0dGVycyBwcm94eS5cbiAgICAgIC8vIERlZmluZSBhcyBnZXR0ZXIgcHJvcGVydHkgYmVjYXVzZVxuICAgICAgLy8gd2UgZG8gbm90IHdhbnQgdG8gZXZhbHVhdGUgdGhlIGdldHRlcnMgaW4gdGhpcyB0aW1lLlxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdldHRlcnNQcm94eSwgbG9jYWxUeXBlLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RvcmUuZ2V0dGVyc1t0eXBlXTsgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgc3RvcmUuX21ha2VMb2NhbEdldHRlcnNDYWNoZVtuYW1lc3BhY2VdID0gZ2V0dGVyc1Byb3h5O1xuICB9XG5cbiAgcmV0dXJuIHN0b3JlLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGVbbmFtZXNwYWNlXVxufVxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGF0aW9uIChzdG9yZSwgdHlwZSwgaGFuZGxlciwgbG9jYWwpIHtcbiAgdmFyIGVudHJ5ID0gc3RvcmUuX211dGF0aW9uc1t0eXBlXSB8fCAoc3RvcmUuX211dGF0aW9uc1t0eXBlXSA9IFtdKTtcbiAgZW50cnkucHVzaChmdW5jdGlvbiB3cmFwcGVkTXV0YXRpb25IYW5kbGVyIChwYXlsb2FkKSB7XG4gICAgaGFuZGxlci5jYWxsKHN0b3JlLCBsb2NhbC5zdGF0ZSwgcGF5bG9hZCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckFjdGlvbiAoc3RvcmUsIHR5cGUsIGhhbmRsZXIsIGxvY2FsKSB7XG4gIHZhciBlbnRyeSA9IHN0b3JlLl9hY3Rpb25zW3R5cGVdIHx8IChzdG9yZS5fYWN0aW9uc1t0eXBlXSA9IFtdKTtcbiAgZW50cnkucHVzaChmdW5jdGlvbiB3cmFwcGVkQWN0aW9uSGFuZGxlciAocGF5bG9hZCkge1xuICAgIHZhciByZXMgPSBoYW5kbGVyLmNhbGwoc3RvcmUsIHtcbiAgICAgIGRpc3BhdGNoOiBsb2NhbC5kaXNwYXRjaCxcbiAgICAgIGNvbW1pdDogbG9jYWwuY29tbWl0LFxuICAgICAgZ2V0dGVyczogbG9jYWwuZ2V0dGVycyxcbiAgICAgIHN0YXRlOiBsb2NhbC5zdGF0ZSxcbiAgICAgIHJvb3RHZXR0ZXJzOiBzdG9yZS5nZXR0ZXJzLFxuICAgICAgcm9vdFN0YXRlOiBzdG9yZS5zdGF0ZVxuICAgIH0sIHBheWxvYWQpO1xuICAgIGlmICghaXNQcm9taXNlKHJlcykpIHtcbiAgICAgIHJlcyA9IFByb21pc2UucmVzb2x2ZShyZXMpO1xuICAgIH1cbiAgICBpZiAoc3RvcmUuX2RldnRvb2xIb29rKSB7XG4gICAgICByZXR1cm4gcmVzLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgc3RvcmUuX2RldnRvb2xIb29rLmVtaXQoJ3Z1ZXg6ZXJyb3InLCBlcnIpO1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlckdldHRlciAoc3RvcmUsIHR5cGUsIHJhd0dldHRlciwgbG9jYWwpIHtcbiAgaWYgKHN0b3JlLl93cmFwcGVkR2V0dGVyc1t0eXBlXSkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIGR1cGxpY2F0ZSBnZXR0ZXIga2V5OiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgc3RvcmUuX3dyYXBwZWRHZXR0ZXJzW3R5cGVdID0gZnVuY3Rpb24gd3JhcHBlZEdldHRlciAoc3RvcmUpIHtcbiAgICByZXR1cm4gcmF3R2V0dGVyKFxuICAgICAgbG9jYWwuc3RhdGUsIC8vIGxvY2FsIHN0YXRlXG4gICAgICBsb2NhbC5nZXR0ZXJzLCAvLyBsb2NhbCBnZXR0ZXJzXG4gICAgICBzdG9yZS5zdGF0ZSwgLy8gcm9vdCBzdGF0ZVxuICAgICAgc3RvcmUuZ2V0dGVycyAvLyByb290IGdldHRlcnNcbiAgICApXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuYWJsZVN0cmljdE1vZGUgKHN0b3JlKSB7XG4gIHN0b3JlLl92bS4kd2F0Y2goZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGF0YS4kJHN0YXRlIH0sIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICBhc3NlcnQoc3RvcmUuX2NvbW1pdHRpbmcsIFwiZG8gbm90IG11dGF0ZSB2dWV4IHN0b3JlIHN0YXRlIG91dHNpZGUgbXV0YXRpb24gaGFuZGxlcnMuXCIpO1xuICAgIH1cbiAgfSwgeyBkZWVwOiB0cnVlLCBzeW5jOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiBnZXROZXN0ZWRTdGF0ZSAoc3RhdGUsIHBhdGgpIHtcbiAgcmV0dXJuIHBhdGgucmVkdWNlKGZ1bmN0aW9uIChzdGF0ZSwga2V5KSB7IHJldHVybiBzdGF0ZVtrZXldOyB9LCBzdGF0ZSlcbn1cblxuZnVuY3Rpb24gdW5pZnlPYmplY3RTdHlsZSAodHlwZSwgcGF5bG9hZCwgb3B0aW9ucykge1xuICBpZiAoaXNPYmplY3QodHlwZSkgJiYgdHlwZS50eXBlKSB7XG4gICAgb3B0aW9ucyA9IHBheWxvYWQ7XG4gICAgcGF5bG9hZCA9IHR5cGU7XG4gICAgdHlwZSA9IHR5cGUudHlwZTtcbiAgfVxuXG4gIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnQodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnLCAoXCJleHBlY3RzIHN0cmluZyBhcyB0aGUgdHlwZSwgYnV0IGZvdW5kIFwiICsgKHR5cGVvZiB0eXBlKSArIFwiLlwiKSk7XG4gIH1cblxuICByZXR1cm4geyB0eXBlOiB0eXBlLCBwYXlsb2FkOiBwYXlsb2FkLCBvcHRpb25zOiBvcHRpb25zIH1cbn1cblxuZnVuY3Rpb24gaW5zdGFsbCAoX1Z1ZSkge1xuICBpZiAoVnVlICYmIF9WdWUgPT09IFZ1ZSkge1xuICAgIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdbdnVleF0gYWxyZWFkeSBpbnN0YWxsZWQuIFZ1ZS51c2UoVnVleCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgVnVlID0gX1Z1ZTtcbiAgYXBwbHlNaXhpbihWdWUpO1xufVxuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZ2V0dGluZyB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge1N0cmluZ30gW25hbWVzcGFjZV0gLSBNb2R1bGUncyBuYW1lc3BhY2VcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBzdGF0ZXMgIyBPYmplY3QncyBpdGVtIGNhbiBiZSBhIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdCBzdGF0ZSBhbmQgZ2V0dGVycyBmb3IgcGFyYW0sIHlvdSBjYW4gZG8gc29tZXRoaW5nIGZvciBzdGF0ZSBhbmQgZ2V0dGVycyBpbiBpdC5cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICovXG52YXIgbWFwU3RhdGUgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgc3RhdGVzKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhaXNWYWxpZE1hcChzdGF0ZXMpKSB7XG4gICAgY29uc29sZS5lcnJvcignW3Z1ZXhdIG1hcFN0YXRlOiBtYXBwZXIgcGFyYW1ldGVyIG11c3QgYmUgZWl0aGVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCcpO1xuICB9XG4gIG5vcm1hbGl6ZU1hcChzdGF0ZXMpLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgIHZhciBrZXkgPSByZWYua2V5O1xuICAgIHZhciB2YWwgPSByZWYudmFsO1xuXG4gICAgcmVzW2tleV0gPSBmdW5jdGlvbiBtYXBwZWRTdGF0ZSAoKSB7XG4gICAgICB2YXIgc3RhdGUgPSB0aGlzLiRzdG9yZS5zdGF0ZTtcbiAgICAgIHZhciBnZXR0ZXJzID0gdGhpcy4kc3RvcmUuZ2V0dGVycztcbiAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgdmFyIG1vZHVsZSA9IGdldE1vZHVsZUJ5TmFtZXNwYWNlKHRoaXMuJHN0b3JlLCAnbWFwU3RhdGUnLCBuYW1lc3BhY2UpO1xuICAgICAgICBpZiAoIW1vZHVsZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gbW9kdWxlLmNvbnRleHQuc3RhdGU7XG4gICAgICAgIGdldHRlcnMgPSBtb2R1bGUuY29udGV4dC5nZXR0ZXJzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB2YWwuY2FsbCh0aGlzLCBzdGF0ZSwgZ2V0dGVycylcbiAgICAgICAgOiBzdGF0ZVt2YWxdXG4gICAgfTtcbiAgICAvLyBtYXJrIHZ1ZXggZ2V0dGVyIGZvciBkZXZ0b29sc1xuICAgIHJlc1trZXldLnZ1ZXggPSB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc1xufSk7XG5cbi8qKlxuICogUmVkdWNlIHRoZSBjb2RlIHdoaWNoIHdyaXR0ZW4gaW4gVnVlLmpzIGZvciBjb21taXR0aW5nIHRoZSBtdXRhdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gbXV0YXRpb25zICMgT2JqZWN0J3MgaXRlbSBjYW4gYmUgYSBmdW5jdGlvbiB3aGljaCBhY2NlcHQgYGNvbW1pdGAgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IHBhcmFtLCBpdCBjYW4gYWNjZXB0IGFub3RoZXIgcGFyYW1zLiBZb3UgY2FuIGNvbW1pdCBtdXRhdGlvbiBhbmQgZG8gYW55IG90aGVyIHRoaW5ncyBpbiB0aGlzIGZ1bmN0aW9uLiBzcGVjaWFsbHksIFlvdSBuZWVkIHRvIHBhc3MgYW50aG9yIHBhcmFtcyBmcm9tIHRoZSBtYXBwZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBtYXBNdXRhdGlvbnMgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgbXV0YXRpb25zKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhaXNWYWxpZE1hcChtdXRhdGlvbnMpKSB7XG4gICAgY29uc29sZS5lcnJvcignW3Z1ZXhdIG1hcE11dGF0aW9uczogbWFwcGVyIHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBhbiBBcnJheSBvciBhbiBPYmplY3QnKTtcbiAgfVxuICBub3JtYWxpemVNYXAobXV0YXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICB2YXIga2V5ID0gcmVmLmtleTtcbiAgICB2YXIgdmFsID0gcmVmLnZhbDtcblxuICAgIHJlc1trZXldID0gZnVuY3Rpb24gbWFwcGVkTXV0YXRpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICAgIC8vIEdldCB0aGUgY29tbWl0IG1ldGhvZCBmcm9tIHN0b3JlXG4gICAgICB2YXIgY29tbWl0ID0gdGhpcy4kc3RvcmUuY29tbWl0O1xuICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICB2YXIgbW9kdWxlID0gZ2V0TW9kdWxlQnlOYW1lc3BhY2UodGhpcy4kc3RvcmUsICdtYXBNdXRhdGlvbnMnLCBuYW1lc3BhY2UpO1xuICAgICAgICBpZiAoIW1vZHVsZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbW1pdCA9IG1vZHVsZS5jb250ZXh0LmNvbW1pdDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdmFsLmFwcGx5KHRoaXMsIFtjb21taXRdLmNvbmNhdChhcmdzKSlcbiAgICAgICAgOiBjb21taXQuYXBwbHkodGhpcy4kc3RvcmUsIFt2YWxdLmNvbmNhdChhcmdzKSlcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHJlc1xufSk7XG5cbi8qKlxuICogUmVkdWNlIHRoZSBjb2RlIHdoaWNoIHdyaXR0ZW4gaW4gVnVlLmpzIGZvciBnZXR0aW5nIHRoZSBnZXR0ZXJzXG4gKiBAcGFyYW0ge1N0cmluZ30gW25hbWVzcGFjZV0gLSBNb2R1bGUncyBuYW1lc3BhY2VcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBnZXR0ZXJzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBtYXBHZXR0ZXJzID0gbm9ybWFsaXplTmFtZXNwYWNlKGZ1bmN0aW9uIChuYW1lc3BhY2UsIGdldHRlcnMpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICBpZiAoKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpICYmICFpc1ZhbGlkTWFwKGdldHRlcnMpKSB7XG4gICAgY29uc29sZS5lcnJvcignW3Z1ZXhdIG1hcEdldHRlcnM6IG1hcHBlciBwYXJhbWV0ZXIgbXVzdCBiZSBlaXRoZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0Jyk7XG4gIH1cbiAgbm9ybWFsaXplTWFwKGdldHRlcnMpLmZvckVhY2goZnVuY3Rpb24gKHJlZikge1xuICAgIHZhciBrZXkgPSByZWYua2V5O1xuICAgIHZhciB2YWwgPSByZWYudmFsO1xuXG4gICAgLy8gVGhlIG5hbWVzcGFjZSBoYXMgYmVlbiBtdXRhdGVkIGJ5IG5vcm1hbGl6ZU5hbWVzcGFjZVxuICAgIHZhbCA9IG5hbWVzcGFjZSArIHZhbDtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZEdldHRlciAoKSB7XG4gICAgICBpZiAobmFtZXNwYWNlICYmICFnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcEdldHRlcnMnLCBuYW1lc3BhY2UpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhKHZhbCBpbiB0aGlzLiRzdG9yZS5nZXR0ZXJzKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGdldHRlcjogXCIgKyB2YWwpKTtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVyc1t2YWxdXG4gICAgfTtcbiAgICAvLyBtYXJrIHZ1ZXggZ2V0dGVyIGZvciBkZXZ0b29sc1xuICAgIHJlc1trZXldLnZ1ZXggPSB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc1xufSk7XG5cbi8qKlxuICogUmVkdWNlIHRoZSBjb2RlIHdoaWNoIHdyaXR0ZW4gaW4gVnVlLmpzIGZvciBkaXNwYXRjaCB0aGUgYWN0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gW25hbWVzcGFjZV0gLSBNb2R1bGUncyBuYW1lc3BhY2VcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBhY3Rpb25zICMgT2JqZWN0J3MgaXRlbSBjYW4gYmUgYSBmdW5jdGlvbiB3aGljaCBhY2NlcHQgYGRpc3BhdGNoYCBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgcGFyYW0sIGl0IGNhbiBhY2NlcHQgYW50aG9yIHBhcmFtcy4gWW91IGNhbiBkaXNwYXRjaCBhY3Rpb24gYW5kIGRvIGFueSBvdGhlciB0aGluZ3MgaW4gdGhpcyBmdW5jdGlvbi4gc3BlY2lhbGx5LCBZb3UgbmVlZCB0byBwYXNzIGFudGhvciBwYXJhbXMgZnJvbSB0aGUgbWFwcGVkIGZ1bmN0aW9uLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgbWFwQWN0aW9ucyA9IG5vcm1hbGl6ZU5hbWVzcGFjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBhY3Rpb25zKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgaWYgKChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhaXNWYWxpZE1hcChhY3Rpb25zKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1t2dWV4XSBtYXBBY3Rpb25zOiBtYXBwZXIgcGFyYW1ldGVyIG11c3QgYmUgZWl0aGVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCcpO1xuICB9XG4gIG5vcm1hbGl6ZU1hcChhY3Rpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICB2YXIga2V5ID0gcmVmLmtleTtcbiAgICB2YXIgdmFsID0gcmVmLnZhbDtcblxuICAgIHJlc1trZXldID0gZnVuY3Rpb24gbWFwcGVkQWN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICAvLyBnZXQgZGlzcGF0Y2ggZnVuY3Rpb24gZnJvbSBzdG9yZVxuICAgICAgdmFyIGRpc3BhdGNoID0gdGhpcy4kc3RvcmUuZGlzcGF0Y2g7XG4gICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcEFjdGlvbnMnLCBuYW1lc3BhY2UpO1xuICAgICAgICBpZiAoIW1vZHVsZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoID0gbW9kdWxlLmNvbnRleHQuZGlzcGF0Y2g7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHZhbC5hcHBseSh0aGlzLCBbZGlzcGF0Y2hdLmNvbmNhdChhcmdzKSlcbiAgICAgICAgOiBkaXNwYXRjaC5hcHBseSh0aGlzLiRzdG9yZSwgW3ZhbF0uY29uY2F0KGFyZ3MpKVxuICAgIH07XG4gIH0pO1xuICByZXR1cm4gcmVzXG59KTtcblxuLyoqXG4gKiBSZWJpbmRpbmcgbmFtZXNwYWNlIHBhcmFtIGZvciBtYXBYWFggZnVuY3Rpb24gaW4gc3BlY2lhbCBzY29wZWQsIGFuZCByZXR1cm4gdGhlbSBieSBzaW1wbGUgb2JqZWN0XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBjcmVhdGVOYW1lc3BhY2VkSGVscGVycyA9IGZ1bmN0aW9uIChuYW1lc3BhY2UpIHsgcmV0dXJuICh7XG4gIG1hcFN0YXRlOiBtYXBTdGF0ZS5iaW5kKG51bGwsIG5hbWVzcGFjZSksXG4gIG1hcEdldHRlcnM6IG1hcEdldHRlcnMuYmluZChudWxsLCBuYW1lc3BhY2UpLFxuICBtYXBNdXRhdGlvbnM6IG1hcE11dGF0aW9ucy5iaW5kKG51bGwsIG5hbWVzcGFjZSksXG4gIG1hcEFjdGlvbnM6IG1hcEFjdGlvbnMuYmluZChudWxsLCBuYW1lc3BhY2UpXG59KTsgfTtcblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIG1hcFxuICogbm9ybWFsaXplTWFwKFsxLCAyLCAzXSkgPT4gWyB7IGtleTogMSwgdmFsOiAxIH0sIHsga2V5OiAyLCB2YWw6IDIgfSwgeyBrZXk6IDMsIHZhbDogMyB9IF1cbiAqIG5vcm1hbGl6ZU1hcCh7YTogMSwgYjogMiwgYzogM30pID0+IFsgeyBrZXk6ICdhJywgdmFsOiAxIH0sIHsga2V5OiAnYicsIHZhbDogMiB9LCB7IGtleTogJ2MnLCB2YWw6IDMgfSBdXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gbWFwXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1hcCAobWFwKSB7XG4gIGlmICghaXNWYWxpZE1hcChtYXApKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWFwKVxuICAgID8gbWFwLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAoeyBrZXk6IGtleSwgdmFsOiBrZXkgfSk7IH0pXG4gICAgOiBPYmplY3Qua2V5cyhtYXApLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAoeyBrZXk6IGtleSwgdmFsOiBtYXBba2V5XSB9KTsgfSlcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB3aGV0aGVyIGdpdmVuIG1hcCBpcyB2YWxpZCBvciBub3RcbiAqIEBwYXJhbSB7Kn0gbWFwXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc1ZhbGlkTWFwIChtYXApIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkobWFwKSB8fCBpc09iamVjdChtYXApXG59XG5cbi8qKlxuICogUmV0dXJuIGEgZnVuY3Rpb24gZXhwZWN0IHR3byBwYXJhbSBjb250YWlucyBuYW1lc3BhY2UgYW5kIG1hcC4gaXQgd2lsbCBub3JtYWxpemUgdGhlIG5hbWVzcGFjZSBhbmQgdGhlbiB0aGUgcGFyYW0ncyBmdW5jdGlvbiB3aWxsIGhhbmRsZSB0aGUgbmV3IG5hbWVzcGFjZSBhbmQgdGhlIG1hcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplTmFtZXNwYWNlIChmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKG5hbWVzcGFjZSwgbWFwKSB7XG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICBtYXAgPSBuYW1lc3BhY2U7XG4gICAgICBuYW1lc3BhY2UgPSAnJztcbiAgICB9IGVsc2UgaWYgKG5hbWVzcGFjZS5jaGFyQXQobmFtZXNwYWNlLmxlbmd0aCAtIDEpICE9PSAnLycpIHtcbiAgICAgIG5hbWVzcGFjZSArPSAnLyc7XG4gICAgfVxuICAgIHJldHVybiBmbihuYW1lc3BhY2UsIG1hcClcbiAgfVxufVxuXG4vKipcbiAqIFNlYXJjaCBhIHNwZWNpYWwgbW9kdWxlIGZyb20gc3RvcmUgYnkgbmFtZXNwYWNlLiBpZiBtb2R1bGUgbm90IGV4aXN0LCBwcmludCBlcnJvciBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3R9IHN0b3JlXG4gKiBAcGFyYW0ge1N0cmluZ30gaGVscGVyXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldE1vZHVsZUJ5TmFtZXNwYWNlIChzdG9yZSwgaGVscGVyLCBuYW1lc3BhY2UpIHtcbiAgdmFyIG1vZHVsZSA9IHN0b3JlLl9tb2R1bGVzTmFtZXNwYWNlTWFwW25hbWVzcGFjZV07XG4gIGlmICgocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykgJiYgIW1vZHVsZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIG1vZHVsZSBuYW1lc3BhY2Ugbm90IGZvdW5kIGluIFwiICsgaGVscGVyICsgXCIoKTogXCIgKyBuYW1lc3BhY2UpKTtcbiAgfVxuICByZXR1cm4gbW9kdWxlXG59XG5cbi8vIENyZWRpdHM6IGJvcnJvd2VkIGNvZGUgZnJvbSBmY29tYi9yZWR1eC1sb2dnZXJcblxuZnVuY3Rpb24gY3JlYXRlTG9nZ2VyIChyZWYpIHtcbiAgaWYgKCByZWYgPT09IHZvaWQgMCApIHJlZiA9IHt9O1xuICB2YXIgY29sbGFwc2VkID0gcmVmLmNvbGxhcHNlZDsgaWYgKCBjb2xsYXBzZWQgPT09IHZvaWQgMCApIGNvbGxhcHNlZCA9IHRydWU7XG4gIHZhciBmaWx0ZXIgPSByZWYuZmlsdGVyOyBpZiAoIGZpbHRlciA9PT0gdm9pZCAwICkgZmlsdGVyID0gZnVuY3Rpb24gKG11dGF0aW9uLCBzdGF0ZUJlZm9yZSwgc3RhdGVBZnRlcikgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgdmFyIHRyYW5zZm9ybWVyID0gcmVmLnRyYW5zZm9ybWVyOyBpZiAoIHRyYW5zZm9ybWVyID09PSB2b2lkIDAgKSB0cmFuc2Zvcm1lciA9IGZ1bmN0aW9uIChzdGF0ZSkgeyByZXR1cm4gc3RhdGU7IH07XG4gIHZhciBtdXRhdGlvblRyYW5zZm9ybWVyID0gcmVmLm11dGF0aW9uVHJhbnNmb3JtZXI7IGlmICggbXV0YXRpb25UcmFuc2Zvcm1lciA9PT0gdm9pZCAwICkgbXV0YXRpb25UcmFuc2Zvcm1lciA9IGZ1bmN0aW9uIChtdXQpIHsgcmV0dXJuIG11dDsgfTtcbiAgdmFyIGFjdGlvbkZpbHRlciA9IHJlZi5hY3Rpb25GaWx0ZXI7IGlmICggYWN0aW9uRmlsdGVyID09PSB2b2lkIDAgKSBhY3Rpb25GaWx0ZXIgPSBmdW5jdGlvbiAoYWN0aW9uLCBzdGF0ZSkgeyByZXR1cm4gdHJ1ZTsgfTtcbiAgdmFyIGFjdGlvblRyYW5zZm9ybWVyID0gcmVmLmFjdGlvblRyYW5zZm9ybWVyOyBpZiAoIGFjdGlvblRyYW5zZm9ybWVyID09PSB2b2lkIDAgKSBhY3Rpb25UcmFuc2Zvcm1lciA9IGZ1bmN0aW9uIChhY3QpIHsgcmV0dXJuIGFjdDsgfTtcbiAgdmFyIGxvZ011dGF0aW9ucyA9IHJlZi5sb2dNdXRhdGlvbnM7IGlmICggbG9nTXV0YXRpb25zID09PSB2b2lkIDAgKSBsb2dNdXRhdGlvbnMgPSB0cnVlO1xuICB2YXIgbG9nQWN0aW9ucyA9IHJlZi5sb2dBY3Rpb25zOyBpZiAoIGxvZ0FjdGlvbnMgPT09IHZvaWQgMCApIGxvZ0FjdGlvbnMgPSB0cnVlO1xuICB2YXIgbG9nZ2VyID0gcmVmLmxvZ2dlcjsgaWYgKCBsb2dnZXIgPT09IHZvaWQgMCApIGxvZ2dlciA9IGNvbnNvbGU7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChzdG9yZSkge1xuICAgIHZhciBwcmV2U3RhdGUgPSBkZWVwQ29weShzdG9yZS5zdGF0ZSk7XG5cbiAgICBpZiAodHlwZW9mIGxvZ2dlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChsb2dNdXRhdGlvbnMpIHtcbiAgICAgIHN0b3JlLnN1YnNjcmliZShmdW5jdGlvbiAobXV0YXRpb24sIHN0YXRlKSB7XG4gICAgICAgIHZhciBuZXh0U3RhdGUgPSBkZWVwQ29weShzdGF0ZSk7XG5cbiAgICAgICAgaWYgKGZpbHRlcihtdXRhdGlvbiwgcHJldlN0YXRlLCBuZXh0U3RhdGUpKSB7XG4gICAgICAgICAgdmFyIGZvcm1hdHRlZFRpbWUgPSBnZXRGb3JtYXR0ZWRUaW1lKCk7XG4gICAgICAgICAgdmFyIGZvcm1hdHRlZE11dGF0aW9uID0gbXV0YXRpb25UcmFuc2Zvcm1lcihtdXRhdGlvbik7XG4gICAgICAgICAgdmFyIG1lc3NhZ2UgPSBcIm11dGF0aW9uIFwiICsgKG11dGF0aW9uLnR5cGUpICsgZm9ybWF0dGVkVGltZTtcblxuICAgICAgICAgIHN0YXJ0TWVzc2FnZShsb2dnZXIsIG1lc3NhZ2UsIGNvbGxhcHNlZCk7XG4gICAgICAgICAgbG9nZ2VyLmxvZygnJWMgcHJldiBzdGF0ZScsICdjb2xvcjogIzlFOUU5RTsgZm9udC13ZWlnaHQ6IGJvbGQnLCB0cmFuc2Zvcm1lcihwcmV2U3RhdGUpKTtcbiAgICAgICAgICBsb2dnZXIubG9nKCclYyBtdXRhdGlvbicsICdjb2xvcjogIzAzQTlGNDsgZm9udC13ZWlnaHQ6IGJvbGQnLCBmb3JtYXR0ZWRNdXRhdGlvbik7XG4gICAgICAgICAgbG9nZ2VyLmxvZygnJWMgbmV4dCBzdGF0ZScsICdjb2xvcjogIzRDQUY1MDsgZm9udC13ZWlnaHQ6IGJvbGQnLCB0cmFuc2Zvcm1lcihuZXh0U3RhdGUpKTtcbiAgICAgICAgICBlbmRNZXNzYWdlKGxvZ2dlcik7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2U3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAobG9nQWN0aW9ucykge1xuICAgICAgc3RvcmUuc3Vic2NyaWJlQWN0aW9uKGZ1bmN0aW9uIChhY3Rpb24sIHN0YXRlKSB7XG4gICAgICAgIGlmIChhY3Rpb25GaWx0ZXIoYWN0aW9uLCBzdGF0ZSkpIHtcbiAgICAgICAgICB2YXIgZm9ybWF0dGVkVGltZSA9IGdldEZvcm1hdHRlZFRpbWUoKTtcbiAgICAgICAgICB2YXIgZm9ybWF0dGVkQWN0aW9uID0gYWN0aW9uVHJhbnNmb3JtZXIoYWN0aW9uKTtcbiAgICAgICAgICB2YXIgbWVzc2FnZSA9IFwiYWN0aW9uIFwiICsgKGFjdGlvbi50eXBlKSArIGZvcm1hdHRlZFRpbWU7XG5cbiAgICAgICAgICBzdGFydE1lc3NhZ2UobG9nZ2VyLCBtZXNzYWdlLCBjb2xsYXBzZWQpO1xuICAgICAgICAgIGxvZ2dlci5sb2coJyVjIGFjdGlvbicsICdjb2xvcjogIzAzQTlGNDsgZm9udC13ZWlnaHQ6IGJvbGQnLCBmb3JtYXR0ZWRBY3Rpb24pO1xuICAgICAgICAgIGVuZE1lc3NhZ2UobG9nZ2VyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHN0YXJ0TWVzc2FnZSAobG9nZ2VyLCBtZXNzYWdlLCBjb2xsYXBzZWQpIHtcbiAgdmFyIHN0YXJ0TWVzc2FnZSA9IGNvbGxhcHNlZFxuICAgID8gbG9nZ2VyLmdyb3VwQ29sbGFwc2VkXG4gICAgOiBsb2dnZXIuZ3JvdXA7XG5cbiAgLy8gcmVuZGVyXG4gIHRyeSB7XG4gICAgc3RhcnRNZXNzYWdlLmNhbGwobG9nZ2VyLCBtZXNzYWdlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5sb2cobWVzc2FnZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5kTWVzc2FnZSAobG9nZ2VyKSB7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmdyb3VwRW5kKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIubG9nKCfigJTigJQgbG9nIGVuZCDigJTigJQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRGb3JtYXR0ZWRUaW1lICgpIHtcbiAgdmFyIHRpbWUgPSBuZXcgRGF0ZSgpO1xuICByZXR1cm4gKFwiIEAgXCIgKyAocGFkKHRpbWUuZ2V0SG91cnMoKSwgMikpICsgXCI6XCIgKyAocGFkKHRpbWUuZ2V0TWludXRlcygpLCAyKSkgKyBcIjpcIiArIChwYWQodGltZS5nZXRTZWNvbmRzKCksIDIpKSArIFwiLlwiICsgKHBhZCh0aW1lLmdldE1pbGxpc2Vjb25kcygpLCAzKSkpXG59XG5cbmZ1bmN0aW9uIHJlcGVhdCAoc3RyLCB0aW1lcykge1xuICByZXR1cm4gKG5ldyBBcnJheSh0aW1lcyArIDEpKS5qb2luKHN0cilcbn1cblxuZnVuY3Rpb24gcGFkIChudW0sIG1heExlbmd0aCkge1xuICByZXR1cm4gcmVwZWF0KCcwJywgbWF4TGVuZ3RoIC0gbnVtLnRvU3RyaW5nKCkubGVuZ3RoKSArIG51bVxufVxuXG52YXIgaW5kZXhfY2pzID0ge1xuICBTdG9yZTogU3RvcmUsXG4gIGluc3RhbGw6IGluc3RhbGwsXG4gIHZlcnNpb246ICczLjYuMicsXG4gIG1hcFN0YXRlOiBtYXBTdGF0ZSxcbiAgbWFwTXV0YXRpb25zOiBtYXBNdXRhdGlvbnMsXG4gIG1hcEdldHRlcnM6IG1hcEdldHRlcnMsXG4gIG1hcEFjdGlvbnM6IG1hcEFjdGlvbnMsXG4gIGNyZWF0ZU5hbWVzcGFjZWRIZWxwZXJzOiBjcmVhdGVOYW1lc3BhY2VkSGVscGVycyxcbiAgY3JlYXRlTG9nZ2VyOiBjcmVhdGVMb2dnZXJcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW5kZXhfY2pzO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcyB8fCAodHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgJiYgc2VsZik7XG59KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzIHx8ICh0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiAmJiBzZWxmKTtcbiAgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKClcbik7XG4iLCJpbXBvcnQgcmVxdWVzdCBmcm9tICdAL3V0aWxzL3JlcXVlc3QnXHJcbmNvbnN0IHNlcnZpY2VUaXRsZSA9ICcvaW1nJ1xyXG4vL0dFVCDkvKDlj4LpnIDopoHnlKggcGFyYW1zXHJcbi8vUE9TVCDkvKDlj4LpnIDopoHnlKggZGF0YVxyXG5cclxuLy/ojrflj5ZiYW5uZXLliJfooahcclxuZXhwb3J0IGZ1bmN0aW9uIHRpa3Rva1VzZXJJbWdzKCkge1xyXG5cdHJldHVybiByZXF1ZXN0KHtcclxuXHRcdHVybDogYCR7c2VydmljZVRpdGxlfS9pbWcvbWluaS90aWt0b2svdGlrdG9rVXNlckltZ3NgLFxyXG5cdFx0bWV0aG9kOiAnZ2V0J1xyXG5cdH0pXHJcbn1cclxuLy8g6L+R5pyf57K+6YCJ5Zu+54mH5YiX6KGoXHJcbmV4cG9ydCBmdW5jdGlvbiBpbWdMaXN0cyhkYXRhKSB7XHJcblx0cmV0dXJuIHJlcXVlc3Qoe1xyXG5cdFx0dXJsOiBgJHtzZXJ2aWNlVGl0bGV9L2ltZy9taW5pL3Rpa3Rvay9pbWdMaXN0c2AsXHJcblx0XHRtZXRob2Q6ICdwb3N0JyxcclxuXHRcdGRhdGFcclxuXHR9KVxyXG59XHJcbi8v55So5oi36K+m5oOF6aG1LeagueaNruaQnOe0oueggeafpeivoueUqOaIt+WbvueJh+WIl+ihqFxyXG5leHBvcnQgZnVuY3Rpb24gdGlrdG9rVXNlckRldGFpbHMoZGF0YSkge1xyXG5cdHJldHVybiByZXF1ZXN0KHtcclxuXHRcdHVybDogYCR7c2VydmljZVRpdGxlfS9pbWcvbWluaS90aWt0b2svdGlrdG9rVXNlckltZ3NEZXRhaWxzYCxcclxuXHRcdG1ldGhvZDogJ3Bvc3QnLFxyXG5cdFx0ZGF0YVxyXG5cdH0pXHJcbn1cclxuXHJcbi8vIOeUqOaIt+aOiOadg+eZu+W9lVxyXG5leHBvcnQgZnVuY3Rpb24gbG9naW5UaWt0b2soZGF0YSkge1xyXG5cdHJldHVybiByZXF1ZXN0KHtcclxuXHRcdHVybDogYCR7c2VydmljZVRpdGxlfS9pbWcvbWluaS90aWt0b2svbG9naW5UaWt0b2tgLFxyXG5cdFx0bWV0aG9kOiAncG9zdCcsXHJcblx0XHRkYXRhXHJcblx0fSlcclxufVxyXG5cclxuIiwiaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiXHJcbmltcG9ydCBxcyBmcm9tIFwicXNcIlxyXG5pbXBvcnQgVnVlIGZyb20gXCJ2dWVcIlxyXG5cclxuY29uc3Qgc2VydmljZSA9IGF4aW9zLmNyZWF0ZSh7XHJcblx0d2l0aENyZWRlbnRpYWxzOiB0cnVlLFxyXG5cdGNyb3NzRG9tYWluOiB0cnVlLFxyXG5cdGJhc2VVUkw6IFZ1ZS5wcm90b3R5cGUuYmFzZVVSTCwgLy/ov5nkuKpiYXNlVVJM5piv5oiR5ZyobWFpbi5qc+S4i+mFjee9rueahOivt+axgnVybFxyXG5cdHRpbWVvdXQ6IDEwMDAwXHJcbn0pXHJcblxyXG5cclxuLy8gcmVxdWVzdOaLpuaIquWZqCzlnKjor7fmsYLkuYvliY3lgZrkuIDkupvlpITnkIZcclxuc2VydmljZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoXHJcblx0Y29uZmlnID0+IHtcclxuXHRcdC8vIGlmIChzdG9yZS5zdGF0ZS50b2tlbikge1xyXG5cdFx0Ly8gICAgIC8vIOe7meivt+axguWktOa3u+WKoHVzZXItdG9rZW5cclxuXHRcdC8vICAgICBjb25maWcuaGVhZGVyc1tcInVzZXItdG9rZW5cIl0gPSBzdG9yZS5zdGF0ZS50b2tlbjtcclxuXHRcdC8vIH1cclxuXHRcdGNvbmZpZy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJ1xyXG5cdFx0Ly8gY29uZmlnLm1ldGhvZCA9PT0gJ3Bvc3QnID9cclxuXHRcdC8vIFx0Y29uZmlnLmRhdGEgPSBxcy5zdHJpbmdpZnkoeyAuLi5jb25maWcuZGF0YVxyXG5cdFx0Ly8gXHR9KSA6XHJcblx0XHQvLyBcdGNvbmZpZy5wYXJhbXMgPSB7IC4uLmNvbmZpZy5wYXJhbXNcclxuXHRcdC8vIFx0fTtcclxuXHRcdHJldHVybiBjb25maWc7XHJcblx0fSxcclxuXHRlcnJvciA9PiB7XHJcblx0XHRjb25zb2xlLmxvZyhlcnJvcik7IC8vIGZvciBkZWJ1Z1xyXG5cdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcclxuXHR9XHJcbik7XHJcblxyXG4vL+mFjee9ruaIkOWKn+WQjueahOaLpuaIquWZqFxyXG5zZXJ2aWNlLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UocmVzID0+IHtcclxuXHRyZXR1cm4gcmVzXHJcblx0Ly8gaWYgKHJlcy5kYXRhLnN0YXR1cyA9PSAyMDApIHtcclxuXHQvLyBcdHJldHVybiByZXNcclxuXHQvLyB9IGVsc2Uge1xyXG5cdC8vIFx0cmV0dXJuIFByb21pc2UucmVqZWN0KHJlcy5kYXRhLm1zZyk7XHJcblx0Ly8gfVxyXG59LCBlcnJvciA9PiB7XHJcblx0cmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKVxyXG59KVxyXG5cclxuYXhpb3MuZGVmYXVsdHMuYWRhcHRlciA9IGZ1bmN0aW9uKGNvbmZpZykgeyAvL+iHquW3seWumuS5ieS4qumAgumFjeWZqO+8jOeUqOadpemAgumFjXVuaWFwcOeahOivreazlVxyXG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblx0XHQvLyBjb25zb2xlLmxvZyhjb25maWcpXHJcblx0XHR2YXIgc2V0dGxlID0gcmVxdWlyZSgnYXhpb3MvbGliL2NvcmUvc2V0dGxlJyk7XHJcblx0XHR2YXIgYnVpbGRVUkwgPSByZXF1aXJlKCdheGlvcy9saWIvaGVscGVycy9idWlsZFVSTCcpO1xyXG5cdFx0dW5pLnJlcXVlc3Qoe1xyXG5cdFx0XHRtZXRob2Q6IGNvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSxcclxuXHRcdFx0dXJsOiBjb25maWcuYmFzZVVSTCArIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKSxcclxuXHRcdFx0aGVhZGVyOiBjb25maWcuaGVhZGVycyxcclxuXHRcdFx0ZGF0YTogY29uZmlnLmRhdGEsXHJcblx0XHRcdGRhdGFUeXBlOiBjb25maWcuZGF0YVR5cGUsXHJcblx0XHRcdHJlc3BvbnNlVHlwZTogY29uZmlnLnJlc3BvbnNlVHlwZSxcclxuXHRcdFx0c3NsVmVyaWZ5OiBjb25maWcuc3NsVmVyaWZ5LFxyXG5cdFx0XHRjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUocmVzcG9uc2UpIHtcclxuXHRcdFx0XHRyZXNwb25zZSA9IHtcclxuXHRcdFx0XHRcdGRhdGE6IHJlc3BvbnNlLmRhdGEsXHJcblx0XHRcdFx0XHRzdGF0dXM6IHJlc3BvbnNlLnN0YXR1c0NvZGUsXHJcblx0XHRcdFx0XHRlcnJNc2c6IHJlc3BvbnNlLmVyck1zZyxcclxuXHRcdFx0XHRcdGhlYWRlcjogcmVzcG9uc2UuaGVhZGVyLFxyXG5cdFx0XHRcdFx0Y29uZmlnOiBjb25maWdcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKTtcclxuXHRcdFx0fVxyXG5cdFx0fSlcclxuXHR9KVxyXG59XHJcbmV4cG9ydCBkZWZhdWx0IHNlcnZpY2UiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2F4aW9zJyk7IiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xyXG52YXIgYmluZCA9IHJlcXVpcmUoJy4vaGVscGVycy9iaW5kJyk7XHJcbnZhciBBeGlvcyA9IHJlcXVpcmUoJy4vY29yZS9BeGlvcycpO1xyXG52YXIgbWVyZ2VDb25maWcgPSByZXF1aXJlKCcuL2NvcmUvbWVyZ2VDb25maWcnKTtcclxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi9kZWZhdWx0cycpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBBeGlvc1xyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxyXG4gKiBAcmV0dXJuIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcclxuICovXHJcbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcclxuICB2YXIgY29udGV4dCA9IG5ldyBBeGlvcyhkZWZhdWx0Q29uZmlnKTtcclxuICB2YXIgaW5zdGFuY2UgPSBiaW5kKEF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0LCBjb250ZXh0KTtcclxuXHJcbiAgLy8gQ29weSBheGlvcy5wcm90b3R5cGUgdG8gaW5zdGFuY2VcclxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIEF4aW9zLnByb3RvdHlwZSwgY29udGV4dCk7XHJcblxyXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxyXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCk7XHJcblxyXG4gIC8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcclxuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcclxuICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZShtZXJnZUNvbmZpZyhkZWZhdWx0Q29uZmlnLCBpbnN0YW5jZUNvbmZpZykpO1xyXG4gIH07XHJcblxyXG4gIHJldHVybiBpbnN0YW5jZTtcclxufVxyXG5cclxuLy8gQ3JlYXRlIHRoZSBkZWZhdWx0IGluc3RhbmNlIHRvIGJlIGV4cG9ydGVkXHJcbnZhciBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzKTtcclxuXHJcbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxyXG5heGlvcy5BeGlvcyA9IEF4aW9zO1xyXG5cclxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXHJcbmF4aW9zLkNhbmNlbCA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbCcpO1xyXG5heGlvcy5DYW5jZWxUb2tlbiA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbFRva2VuJyk7XHJcbmF4aW9zLmlzQ2FuY2VsID0gcmVxdWlyZSgnLi9jYW5jZWwvaXNDYW5jZWwnKTtcclxuYXhpb3MuVkVSU0lPTiA9IHJlcXVpcmUoJy4vZW52L2RhdGEnKS52ZXJzaW9uO1xyXG5cclxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcclxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XHJcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcclxufTtcclxuYXhpb3Muc3ByZWFkID0gcmVxdWlyZSgnLi9oZWxwZXJzL3NwcmVhZCcpO1xyXG5cclxuLy8gRXhwb3NlIGlzQXhpb3NFcnJvclxyXG5heGlvcy5pc0F4aW9zRXJyb3IgPSByZXF1aXJlKCcuL2hlbHBlcnMvaXNBeGlvc0Vycm9yJyk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGF4aW9zO1xyXG5cclxuLy8gQWxsb3cgdXNlIG9mIGRlZmF1bHQgaW1wb3J0IHN5bnRheCBpbiBUeXBlU2NyaXB0XHJcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBheGlvcztcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIGJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvYmluZCcpO1xyXG5cclxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcclxuXHJcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0FycmF5KHZhbCkge1xyXG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkLCBvdGhlcndpc2UgZmFsc2VcclxuICovXHJcbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbCkge1xyXG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJztcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcclxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxyXG4gKi9cclxuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XHJcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsKSAmJiB2YWwuY29uc3RydWN0b3IgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbC5jb25zdHJ1Y3RvcilcclxuICAgICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcclxuICovXHJcbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsKSB7XHJcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJztcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRm9ybURhdGFcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBGb3JtRGF0YSwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbCkge1xyXG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZvcm1EYXRhXSc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXJcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxyXG4gKi9cclxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XHJcbiAgdmFyIHJlc3VsdDtcclxuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XHJcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmIChpc0FycmF5QnVmZmVyKHZhbC5idWZmZXIpKTtcclxuICB9XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyaW5nXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcclxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxyXG4gKi9cclxuZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7XHJcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnO1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAqL1xyXG5mdW5jdGlvbiBpc051bWJlcih2YWwpIHtcclxuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBPYmplY3RcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxyXG4gKi9cclxuZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XHJcbiAgcmV0dXJuIHZhbCAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JztcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0XHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcclxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbCkge1xyXG4gIGlmICh0b1N0cmluZy5jYWxsKHZhbCkgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCk7XHJcbiAgcmV0dXJuIHByb3RvdHlwZSA9PT0gbnVsbCB8fCBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIERhdGVcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIERhdGUsIG90aGVyd2lzZSBmYWxzZVxyXG4gKi9cclxuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xyXG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IERhdGVdJztcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0ZpbGUodmFsKSB7XHJcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsKSA9PT0gJ1tvYmplY3QgRmlsZV0nO1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcclxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcclxuICovXHJcbmZ1bmN0aW9uIGlzQmxvYih2YWwpIHtcclxuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBCbG9iXSc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcclxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbCkge1xyXG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyZWFtLCBvdGhlcndpc2UgZmFsc2VcclxuICovXHJcbmZ1bmN0aW9uIGlzU3RyZWFtKHZhbCkge1xyXG4gIHJldHVybiBpc09iamVjdCh2YWwpICYmIGlzRnVuY3Rpb24odmFsLnBpcGUpO1xyXG59XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcclxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcclxuICovXHJcbmZ1bmN0aW9uIGlzVVJMU2VhcmNoUGFyYW1zKHZhbCkge1xyXG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10nO1xyXG59XHJcblxyXG4vKipcclxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgVGhlIFN0cmluZyB0byB0cmltXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcclxuICovXHJcbmZ1bmN0aW9uIHRyaW0oc3RyKSB7XHJcbiAgcmV0dXJuIHN0ci50cmltID8gc3RyLnRyaW0oKSA6IHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcclxuICpcclxuICogVGhpcyBhbGxvd3MgYXhpb3MgdG8gcnVuIGluIGEgd2ViIHdvcmtlciwgYW5kIHJlYWN0LW5hdGl2ZS5cclxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxyXG4gKlxyXG4gKiB3ZWIgd29ya2VyczpcclxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXHJcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXHJcbiAqXHJcbiAqIHJlYWN0LW5hdGl2ZTpcclxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcclxuICogbmF0aXZlc2NyaXB0XHJcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1N0YW5kYXJkQnJvd3NlckVudigpIHtcclxuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgKG5hdmlnYXRvci5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IucHJvZHVjdCA9PT0gJ05hdGl2ZVNjcmlwdCcgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5wcm9kdWN0ID09PSAnTlMnKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICByZXR1cm4gKFxyXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcclxuICAgIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogSXRlcmF0ZSBvdmVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCBpbnZva2luZyBhIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0uXHJcbiAqXHJcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcclxuICogdGhlIHZhbHVlLCBpbmRleCwgYW5kIGNvbXBsZXRlIGFycmF5IGZvciBlYWNoIGl0ZW0uXHJcbiAqXHJcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXHJcbiAqIHRoZSB2YWx1ZSwga2V5LCBhbmQgY29tcGxldGUgb2JqZWN0IGZvciBlYWNoIHByb3BlcnR5LlxyXG4gKlxyXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGZvciBlYWNoIGl0ZW1cclxuICovXHJcbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbikge1xyXG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxyXG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxyXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xyXG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXHJcbiAgICBvYmogPSBbb2JqXTtcclxuICB9XHJcblxyXG4gIGlmIChpc0FycmF5KG9iaikpIHtcclxuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcclxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXHJcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XHJcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XHJcbiAgICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxyXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cclxuICpcclxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cclxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxyXG4gKlxyXG4gKiBFeGFtcGxlOlxyXG4gKlxyXG4gKiBgYGBqc1xyXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XHJcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xyXG4gKi9cclxuZnVuY3Rpb24gbWVyZ2UoLyogb2JqMSwgb2JqMiwgb2JqMywgLi4uICovKSB7XHJcbiAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XHJcbiAgICBpZiAoaXNQbGFpbk9iamVjdChyZXN1bHRba2V5XSkgJiYgaXNQbGFpbk9iamVjdCh2YWwpKSB7XHJcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2UocmVzdWx0W2tleV0sIHZhbCk7XHJcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xyXG4gICAgICByZXN1bHRba2V5XSA9IG1lcmdlKHt9LCB2YWwpO1xyXG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcclxuICAgICAgcmVzdWx0W2tleV0gPSB2YWwuc2xpY2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG4vKipcclxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxyXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xyXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcclxuICovXHJcbmZ1bmN0aW9uIGV4dGVuZChhLCBiLCB0aGlzQXJnKSB7XHJcbiAgZm9yRWFjaChiLCBmdW5jdGlvbiBhc3NpZ25WYWx1ZSh2YWwsIGtleSkge1xyXG4gICAgaWYgKHRoaXNBcmcgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhW2tleV0gPSB2YWw7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIGE7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgYnl0ZSBvcmRlciBtYXJrZXIuIFRoaXMgY2F0Y2hlcyBFRiBCQiBCRiAodGhlIFVURi04IEJPTSlcclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgd2l0aCBCT01cclxuICogQHJldHVybiB7c3RyaW5nfSBjb250ZW50IHZhbHVlIHdpdGhvdXQgQk9NXHJcbiAqL1xyXG5mdW5jdGlvbiBzdHJpcEJPTShjb250ZW50KSB7XHJcbiAgaWYgKGNvbnRlbnQuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XHJcbiAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcclxuICB9XHJcbiAgcmV0dXJuIGNvbnRlbnQ7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIGlzQXJyYXk6IGlzQXJyYXksXHJcbiAgaXNBcnJheUJ1ZmZlcjogaXNBcnJheUJ1ZmZlcixcclxuICBpc0J1ZmZlcjogaXNCdWZmZXIsXHJcbiAgaXNGb3JtRGF0YTogaXNGb3JtRGF0YSxcclxuICBpc0FycmF5QnVmZmVyVmlldzogaXNBcnJheUJ1ZmZlclZpZXcsXHJcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxyXG4gIGlzTnVtYmVyOiBpc051bWJlcixcclxuICBpc09iamVjdDogaXNPYmplY3QsXHJcbiAgaXNQbGFpbk9iamVjdDogaXNQbGFpbk9iamVjdCxcclxuICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXHJcbiAgaXNEYXRlOiBpc0RhdGUsXHJcbiAgaXNGaWxlOiBpc0ZpbGUsXHJcbiAgaXNCbG9iOiBpc0Jsb2IsXHJcbiAgaXNGdW5jdGlvbjogaXNGdW5jdGlvbixcclxuICBpc1N0cmVhbTogaXNTdHJlYW0sXHJcbiAgaXNVUkxTZWFyY2hQYXJhbXM6IGlzVVJMU2VhcmNoUGFyYW1zLFxyXG4gIGlzU3RhbmRhcmRCcm93c2VyRW52OiBpc1N0YW5kYXJkQnJvd3NlckVudixcclxuICBmb3JFYWNoOiBmb3JFYWNoLFxyXG4gIG1lcmdlOiBtZXJnZSxcclxuICBleHRlbmQ6IGV4dGVuZCxcclxuICB0cmltOiB0cmltLFxyXG4gIHN0cmlwQk9NOiBzdHJpcEJPTVxyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcclxuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XHJcbiAgfTtcclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xyXG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2J1aWxkVVJMJyk7XHJcbnZhciBJbnRlcmNlcHRvck1hbmFnZXIgPSByZXF1aXJlKCcuL0ludGVyY2VwdG9yTWFuYWdlcicpO1xyXG52YXIgZGlzcGF0Y2hSZXF1ZXN0ID0gcmVxdWlyZSgnLi9kaXNwYXRjaFJlcXVlc3QnKTtcclxudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9tZXJnZUNvbmZpZycpO1xyXG52YXIgdmFsaWRhdG9yID0gcmVxdWlyZSgnLi4vaGVscGVycy92YWxpZGF0b3InKTtcclxuXHJcbnZhciB2YWxpZGF0b3JzID0gdmFsaWRhdG9yLnZhbGlkYXRvcnM7XHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXHJcbiAqL1xyXG5mdW5jdGlvbiBBeGlvcyhpbnN0YW5jZUNvbmZpZykge1xyXG4gIHRoaXMuZGVmYXVsdHMgPSBpbnN0YW5jZUNvbmZpZztcclxuICB0aGlzLmludGVyY2VwdG9ycyA9IHtcclxuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcclxuICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyKClcclxuICB9O1xyXG59XHJcblxyXG4vKipcclxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxyXG4gKi9cclxuQXhpb3MucHJvdG90eXBlLnJlcXVlc3QgPSBmdW5jdGlvbiByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcclxuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cclxuICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXHJcbiAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcclxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcclxuICAgIGNvbmZpZy51cmwgPSBjb25maWdPclVybDtcclxuICB9IGVsc2Uge1xyXG4gICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XHJcbiAgfVxyXG5cclxuICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xyXG5cclxuICAvLyBTZXQgY29uZmlnLm1ldGhvZFxyXG4gIGlmIChjb25maWcubWV0aG9kKSB7XHJcbiAgICBjb25maWcubWV0aG9kID0gY29uZmlnLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xyXG4gIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5tZXRob2QpIHtcclxuICAgIGNvbmZpZy5tZXRob2QgPSB0aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25maWcubWV0aG9kID0gJ2dldCc7XHJcbiAgfVxyXG5cclxuICB2YXIgdHJhbnNpdGlvbmFsID0gY29uZmlnLnRyYW5zaXRpb25hbDtcclxuXHJcbiAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcclxuICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXHJcbiAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxyXG4gICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXHJcbiAgICB9LCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXHJcbiAgdmFyIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluID0gW107XHJcbiAgdmFyIHN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycyA9IHRydWU7XHJcbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XHJcbiAgICBpZiAodHlwZW9mIGludGVyY2VwdG9yLnJ1bldoZW4gPT09ICdmdW5jdGlvbicgJiYgaW50ZXJjZXB0b3IucnVuV2hlbihjb25maWcpID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9yLnN5bmNocm9ub3VzO1xyXG5cclxuICAgIHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLnVuc2hpZnQoaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XHJcbiAgfSk7XHJcblxyXG4gIHZhciByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4gPSBbXTtcclxuICB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIHB1c2hSZXNwb25zZUludGVyY2VwdG9ycyhpbnRlcmNlcHRvcikge1xyXG4gICAgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnB1c2goaW50ZXJjZXB0b3IuZnVsZmlsbGVkLCBpbnRlcmNlcHRvci5yZWplY3RlZCk7XHJcbiAgfSk7XHJcblxyXG4gIHZhciBwcm9taXNlO1xyXG5cclxuICBpZiAoIXN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycykge1xyXG4gICAgdmFyIGNoYWluID0gW2Rpc3BhdGNoUmVxdWVzdCwgdW5kZWZpbmVkXTtcclxuXHJcbiAgICBBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShjaGFpbiwgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4pO1xyXG4gICAgY2hhaW4gPSBjaGFpbi5jb25jYXQocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluKTtcclxuXHJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XHJcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XHJcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW4uc2hpZnQoKSwgY2hhaW4uc2hpZnQoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgdmFyIG5ld0NvbmZpZyA9IGNvbmZpZztcclxuICB3aGlsZSAocmVxdWVzdEludGVyY2VwdG9yQ2hhaW4ubGVuZ3RoKSB7XHJcbiAgICB2YXIgb25GdWxmaWxsZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5zaGlmdCgpO1xyXG4gICAgdmFyIG9uUmVqZWN0ZWQgPSByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi5zaGlmdCgpO1xyXG4gICAgdHJ5IHtcclxuICAgICAgbmV3Q29uZmlnID0gb25GdWxmaWxsZWQobmV3Q29uZmlnKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIG9uUmVqZWN0ZWQoZXJyb3IpO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRyeSB7XHJcbiAgICBwcm9taXNlID0gZGlzcGF0Y2hSZXF1ZXN0KG5ld0NvbmZpZyk7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XHJcbiAgfVxyXG5cclxuICB3aGlsZSAocmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aCkge1xyXG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihyZXNwb25zZUludGVyY2VwdG9yQ2hhaW4uc2hpZnQoKSwgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLnNoaWZ0KCkpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHByb21pc2U7XHJcbn07XHJcblxyXG5BeGlvcy5wcm90b3R5cGUuZ2V0VXJpID0gZnVuY3Rpb24gZ2V0VXJpKGNvbmZpZykge1xyXG4gIGNvbmZpZyA9IG1lcmdlQ29uZmlnKHRoaXMuZGVmYXVsdHMsIGNvbmZpZyk7XHJcbiAgcmV0dXJuIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXFw/LywgJycpO1xyXG59O1xyXG5cclxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXHJcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xyXG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXHJcbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcclxuICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgIHVybDogdXJsLFxyXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXHJcbiAgICB9KSk7XHJcbiAgfTtcclxufSk7XHJcblxyXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xyXG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXHJcbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGRhdGEsIGNvbmZpZykge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcclxuICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgIHVybDogdXJsLFxyXG4gICAgICBkYXRhOiBkYXRhXHJcbiAgICB9KSk7XHJcbiAgfTtcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEF4aW9zO1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XHJcblxyXG5mdW5jdGlvbiBlbmNvZGUodmFsKSB7XHJcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxyXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxyXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXHJcbiAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuXHJcbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cclxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cclxuICAgIHJlcGxhY2UoLyU1RC9naSwgJ10nKTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxyXG4gKlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcclxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcclxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIHBhcmFtc1NlcmlhbGl6ZXIpIHtcclxuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cclxuICBpZiAoIXBhcmFtcykge1xyXG4gICAgcmV0dXJuIHVybDtcclxuICB9XHJcblxyXG4gIHZhciBzZXJpYWxpemVkUGFyYW1zO1xyXG4gIGlmIChwYXJhbXNTZXJpYWxpemVyKSB7XHJcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFyYW1zU2VyaWFsaXplcihwYXJhbXMpO1xyXG4gIH0gZWxzZSBpZiAodXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSkge1xyXG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtcy50b1N0cmluZygpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB2YXIgcGFydHMgPSBbXTtcclxuXHJcbiAgICB1dGlscy5mb3JFYWNoKHBhcmFtcywgZnVuY3Rpb24gc2VyaWFsaXplKHZhbCwga2V5KSB7XHJcbiAgICAgIGlmICh2YWwgPT09IG51bGwgfHwgdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh1dGlscy5pc0FycmF5KHZhbCkpIHtcclxuICAgICAgICBrZXkgPSBrZXkgKyAnW10nO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhbCA9IFt2YWxdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB1dGlscy5mb3JFYWNoKHZhbCwgZnVuY3Rpb24gcGFyc2VWYWx1ZSh2KSB7XHJcbiAgICAgICAgaWYgKHV0aWxzLmlzRGF0ZSh2KSkge1xyXG4gICAgICAgICAgdiA9IHYudG9JU09TdHJpbmcoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzT2JqZWN0KHYpKSB7XHJcbiAgICAgICAgICB2ID0gSlNPTi5zdHJpbmdpZnkodik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlKGtleSkgKyAnPScgKyBlbmNvZGUodikpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHNlcmlhbGl6ZWRQYXJhbXMgPSBwYXJ0cy5qb2luKCcmJyk7XHJcbiAgfVxyXG5cclxuICBpZiAoc2VyaWFsaXplZFBhcmFtcykge1xyXG4gICAgdmFyIGhhc2htYXJrSW5kZXggPSB1cmwuaW5kZXhPZignIycpO1xyXG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XHJcbiAgICAgIHVybCA9IHVybC5zbGljZSgwLCBoYXNobWFya0luZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdXJsO1xyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XHJcblxyXG5mdW5jdGlvbiBJbnRlcmNlcHRvck1hbmFnZXIoKSB7XHJcbiAgdGhpcy5oYW5kbGVycyA9IFtdO1xyXG59XHJcblxyXG4vKipcclxuICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXHJcbiAqXHJcbiAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcclxuICovXHJcbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIG9wdGlvbnMpIHtcclxuICB0aGlzLmhhbmRsZXJzLnB1c2goe1xyXG4gICAgZnVsZmlsbGVkOiBmdWxmaWxsZWQsXHJcbiAgICByZWplY3RlZDogcmVqZWN0ZWQsXHJcbiAgICBzeW5jaHJvbm91czogb3B0aW9ucyA/IG9wdGlvbnMuc3luY2hyb25vdXMgOiBmYWxzZSxcclxuICAgIHJ1bldoZW46IG9wdGlvbnMgPyBvcHRpb25zLnJ1bldoZW4gOiBudWxsXHJcbiAgfSk7XHJcbiAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcclxuICpcclxuICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxyXG4gKi9cclxuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5lamVjdCA9IGZ1bmN0aW9uIGVqZWN0KGlkKSB7XHJcbiAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XHJcbiAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzXHJcbiAqXHJcbiAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XHJcbiAqIGludGVyY2VwdG9ycyB0aGF0IG1heSBoYXZlIGJlY29tZSBgbnVsbGAgY2FsbGluZyBgZWplY3RgLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxyXG4gKi9cclxuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gZm9yRWFjaChmbikge1xyXG4gIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xyXG4gICAgaWYgKGggIT09IG51bGwpIHtcclxuICAgICAgZm4oaCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn07XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEludGVyY2VwdG9yTWFuYWdlcjtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xyXG52YXIgdHJhbnNmb3JtRGF0YSA9IHJlcXVpcmUoJy4vdHJhbnNmb3JtRGF0YScpO1xyXG52YXIgaXNDYW5jZWwgPSByZXF1aXJlKCcuLi9jYW5jZWwvaXNDYW5jZWwnKTtcclxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi4vZGVmYXVsdHMnKTtcclxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4uL2NhbmNlbC9DYW5jZWwnKTtcclxuXHJcbi8qKlxyXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxyXG4gKi9cclxuZnVuY3Rpb24gdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpIHtcclxuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XHJcbiAgICBjb25maWcuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpO1xyXG4gIH1cclxuXHJcbiAgaWYgKGNvbmZpZy5zaWduYWwgJiYgY29uZmlnLnNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICB0aHJvdyBuZXcgQ2FuY2VsKCdjYW5jZWxlZCcpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XHJcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xyXG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcclxuXHJcbiAgLy8gRW5zdXJlIGhlYWRlcnMgZXhpc3RcclxuICBjb25maWcuaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzIHx8IHt9O1xyXG5cclxuICAvLyBUcmFuc2Zvcm0gcmVxdWVzdCBkYXRhXHJcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXHJcbiAgICBjb25maWcsXHJcbiAgICBjb25maWcuZGF0YSxcclxuICAgIGNvbmZpZy5oZWFkZXJzLFxyXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcclxuICApO1xyXG5cclxuICAvLyBGbGF0dGVuIGhlYWRlcnNcclxuICBjb25maWcuaGVhZGVycyA9IHV0aWxzLm1lcmdlKFxyXG4gICAgY29uZmlnLmhlYWRlcnMuY29tbW9uIHx8IHt9LFxyXG4gICAgY29uZmlnLmhlYWRlcnNbY29uZmlnLm1ldGhvZF0gfHwge30sXHJcbiAgICBjb25maWcuaGVhZGVyc1xyXG4gICk7XHJcblxyXG4gIHV0aWxzLmZvckVhY2goXHJcbiAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcclxuICAgIGZ1bmN0aW9uIGNsZWFuSGVhZGVyQ29uZmlnKG1ldGhvZCkge1xyXG4gICAgICBkZWxldGUgY29uZmlnLmhlYWRlcnNbbWV0aG9kXTtcclxuICAgIH1cclxuICApO1xyXG5cclxuICB2YXIgYWRhcHRlciA9IGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXI7XHJcblxyXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XHJcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XHJcblxyXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcclxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXHJcbiAgICAgIGNvbmZpZyxcclxuICAgICAgcmVzcG9uc2UuZGF0YSxcclxuICAgICAgcmVzcG9uc2UuaGVhZGVycyxcclxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XHJcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcclxuICAgICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xyXG5cclxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcclxuICAgICAgaWYgKHJlYXNvbiAmJiByZWFzb24ucmVzcG9uc2UpIHtcclxuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcclxuICAgICAgICAgIGNvbmZpZyxcclxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhLFxyXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXHJcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XHJcbiAgfSk7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcclxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi4vZGVmYXVsdHMnKTtcclxuXHJcbi8qKlxyXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fFN0cmluZ30gZGF0YSBUaGUgZGF0YSB0byBiZSB0cmFuc2Zvcm1lZFxyXG4gKiBAcGFyYW0ge0FycmF5fSBoZWFkZXJzIFRoZSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCBvciByZXNwb25zZVxyXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXHJcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIGRhdGFcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShkYXRhLCBoZWFkZXJzLCBmbnMpIHtcclxuICB2YXIgY29udGV4dCA9IHRoaXMgfHwgZGVmYXVsdHM7XHJcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXHJcbiAgdXRpbHMuZm9yRWFjaChmbnMsIGZ1bmN0aW9uIHRyYW5zZm9ybShmbikge1xyXG4gICAgZGF0YSA9IGZuLmNhbGwoY29udGV4dCwgZGF0YSwgaGVhZGVycyk7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBkYXRhO1xyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xyXG52YXIgbm9ybWFsaXplSGVhZGVyTmFtZSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZScpO1xyXG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi4vY29yZS9lbmhhbmNlRXJyb3InKTtcclxudmFyIHRyYW5zaXRpb25hbERlZmF1bHRzID0gcmVxdWlyZSgnLi90cmFuc2l0aW9uYWwnKTtcclxuXHJcbnZhciBERUZBVUxUX0NPTlRFTlRfVFlQRSA9IHtcclxuICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcclxufTtcclxuXHJcbmZ1bmN0aW9uIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCB2YWx1ZSkge1xyXG4gIGlmICghdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVycykgJiYgdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVyc1snQ29udGVudC1UeXBlJ10pKSB7XHJcbiAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9IHZhbHVlO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGVmYXVsdEFkYXB0ZXIoKSB7XHJcbiAgdmFyIGFkYXB0ZXI7XHJcbiAgaWYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgIC8vIEZvciBicm93c2VycyB1c2UgWEhSIGFkYXB0ZXJcclxuICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuLi9hZGFwdGVycy94aHInKTtcclxuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJykge1xyXG4gICAgLy8gRm9yIG5vZGUgdXNlIEhUVFAgYWRhcHRlclxyXG4gICAgYWRhcHRlciA9IHJlcXVpcmUoJy4uL2FkYXB0ZXJzL2h0dHAnKTtcclxuICB9XHJcbiAgcmV0dXJuIGFkYXB0ZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XHJcbiAgaWYgKHV0aWxzLmlzU3RyaW5nKHJhd1ZhbHVlKSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XHJcbiAgICAgIHJldHVybiB1dGlscy50cmltKHJhd1ZhbHVlKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGUubmFtZSAhPT0gJ1N5bnRheEVycm9yJykge1xyXG4gICAgICAgIHRocm93IGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiAoZW5jb2RlciB8fCBKU09OLnN0cmluZ2lmeSkocmF3VmFsdWUpO1xyXG59XHJcblxyXG52YXIgZGVmYXVsdHMgPSB7XHJcblxyXG4gIHRyYW5zaXRpb25hbDogdHJhbnNpdGlvbmFsRGVmYXVsdHMsXHJcblxyXG4gIGFkYXB0ZXI6IGdldERlZmF1bHRBZGFwdGVyKCksXHJcblxyXG4gIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiB0cmFuc2Zvcm1SZXF1ZXN0KGRhdGEsIGhlYWRlcnMpIHtcclxuICAgIG5vcm1hbGl6ZUhlYWRlck5hbWUoaGVhZGVycywgJ0FjY2VwdCcpO1xyXG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQ29udGVudC1UeXBlJyk7XHJcblxyXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkgfHxcclxuICAgICAgdXRpbHMuaXNBcnJheUJ1ZmZlcihkYXRhKSB8fFxyXG4gICAgICB1dGlscy5pc0J1ZmZlcihkYXRhKSB8fFxyXG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxyXG4gICAgICB1dGlscy5pc0ZpbGUoZGF0YSkgfHxcclxuICAgICAgdXRpbHMuaXNCbG9iKGRhdGEpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9XHJcbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuIGRhdGEuYnVmZmVyO1xyXG4gICAgfVxyXG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XHJcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKTtcclxuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICAgIGlmICh1dGlscy5pc09iamVjdChkYXRhKSB8fCAoaGVhZGVycyAmJiBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xyXG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgcmV0dXJuIHN0cmluZ2lmeVNhZmVseShkYXRhKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1dLFxyXG5cclxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcclxuICAgIHZhciB0cmFuc2l0aW9uYWwgPSB0aGlzLnRyYW5zaXRpb25hbCB8fCBkZWZhdWx0cy50cmFuc2l0aW9uYWw7XHJcbiAgICB2YXIgc2lsZW50SlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLnNpbGVudEpTT05QYXJzaW5nO1xyXG4gICAgdmFyIGZvcmNlZEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5mb3JjZWRKU09OUGFyc2luZztcclxuICAgIHZhciBzdHJpY3RKU09OUGFyc2luZyA9ICFzaWxlbnRKU09OUGFyc2luZyAmJiB0aGlzLnJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nO1xyXG5cclxuICAgIGlmIChzdHJpY3RKU09OUGFyc2luZyB8fCAoZm9yY2VkSlNPTlBhcnNpbmcgJiYgdXRpbHMuaXNTdHJpbmcoZGF0YSkgJiYgZGF0YS5sZW5ndGgpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSk7XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcpIHtcclxuICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdTeW50YXhFcnJvcicpIHtcclxuICAgICAgICAgICAgdGhyb3cgZW5oYW5jZUVycm9yKGUsIHRoaXMsICdFX0pTT05fUEFSU0UnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRocm93IGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfV0sXHJcblxyXG4gIC8qKlxyXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxyXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXHJcbiAgICovXHJcbiAgdGltZW91dDogMCxcclxuXHJcbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcclxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXHJcblxyXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxyXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxyXG5cclxuICB2YWxpZGF0ZVN0YXR1czogZnVuY3Rpb24gdmFsaWRhdGVTdGF0dXMoc3RhdHVzKSB7XHJcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XHJcbiAgfSxcclxuXHJcbiAgaGVhZGVyczoge1xyXG4gICAgY29tbW9uOiB7XHJcbiAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xyXG4gICAgfVxyXG4gIH1cclxufTtcclxuXHJcbnV0aWxzLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcclxuICBkZWZhdWx0cy5oZWFkZXJzW21ldGhvZF0gPSB7fTtcclxufSk7XHJcblxyXG51dGlscy5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xyXG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKTtcclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xyXG4iLCJleHBvcnRzLm5leHRUaWNrID0gZnVuY3Rpb24gbmV4dFRpY2soZm4pIHtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgYXJncy5zaGlmdCgpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9LCAwKTtcbn07XG5cbmV4cG9ydHMucGxhdGZvcm0gPSBleHBvcnRzLmFyY2ggPSBcbmV4cG9ydHMuZXhlY1BhdGggPSBleHBvcnRzLnRpdGxlID0gJ2Jyb3dzZXInO1xuZXhwb3J0cy5waWQgPSAxO1xuZXhwb3J0cy5icm93c2VyID0gdHJ1ZTtcbmV4cG9ydHMuZW52ID0ge307XG5leHBvcnRzLmFyZ3YgPSBbXTtcblxuZXhwb3J0cy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcblx0dGhyb3cgbmV3IEVycm9yKCdObyBzdWNoIG1vZHVsZS4gKFBvc3NpYmx5IG5vdCB5ZXQgbG9hZGVkKScpXG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICAgIHZhciBjd2QgPSAnLyc7XG4gICAgdmFyIHBhdGg7XG4gICAgZXhwb3J0cy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjd2QgfTtcbiAgICBleHBvcnRzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgICAgICBpZiAoIXBhdGgpIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG4gICAgICAgIGN3ZCA9IHBhdGgucmVzb2x2ZShkaXIsIGN3ZCk7XG4gICAgfTtcbn0pKCk7XG5cbmV4cG9ydHMuZXhpdCA9IGV4cG9ydHMua2lsbCA9IFxuZXhwb3J0cy51bWFzayA9IGV4cG9ydHMuZGxvcGVuID0gXG5leHBvcnRzLnVwdGltZSA9IGV4cG9ydHMubWVtb3J5VXNhZ2UgPSBcbmV4cG9ydHMudXZDb3VudGVycyA9IGZ1bmN0aW9uKCkge307XG5leHBvcnRzLmZlYXR1cmVzID0ge307XG4iLCIvLyAuZGlybmFtZSwgLmJhc2VuYW1lLCBhbmQgLmV4dG5hbWUgbWV0aG9kcyBhcmUgZXh0cmFjdGVkIGZyb20gTm9kZS5qcyB2OC4xMS4xLFxuLy8gYmFja3BvcnRlZCBhbmQgdHJhbnNwbGl0ZWQgd2l0aCBCYWJlbCwgd2l0aCBiYWNrd2FyZHMtY29tcGF0IGZpeGVzXG5cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHBhdGggPSBwYXRoICsgJyc7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcuJztcbiAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gIHZhciBoYXNSb290ID0gY29kZSA9PT0gNDcgLyovKi87XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gIGZvciAodmFyIGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMTsgLS1pKSB7XG4gICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICBlbmQgPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3JcbiAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSByZXR1cm4gaGFzUm9vdCA/ICcvJyA6ICcuJztcbiAgaWYgKGhhc1Jvb3QgJiYgZW5kID09PSAxKSB7XG4gICAgLy8gcmV0dXJuICcvLyc7XG4gICAgLy8gQmFja3dhcmRzLWNvbXBhdCBmaXg6XG4gICAgcmV0dXJuICcvJztcbiAgfVxuICByZXR1cm4gcGF0aC5zbGljZSgwLCBlbmQpO1xufTtcblxuZnVuY3Rpb24gYmFzZW5hbWUocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSBwYXRoID0gcGF0aCArICcnO1xuXG4gIHZhciBzdGFydCA9IDA7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gIHZhciBpO1xuXG4gIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICBpZiAocGF0aC5jaGFyQ29kZUF0KGkpID09PSA0NyAvKi8qLykge1xuICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3dcbiAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICBzdGFydCA9IGkgKyAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgIC8vIHBhdGggY29tcG9uZW50XG4gICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTtcbiAgICAgIGVuZCA9IGkgKyAxO1xuICAgIH1cbiAgfVxuXG4gIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJyc7XG4gIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0LCBlbmQpO1xufVxuXG4vLyBVc2VzIGEgbWl4ZWQgYXBwcm9hY2ggZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCBhcyBleHQgYmVoYXZpb3IgY2hhbmdlZFxuLy8gaW4gbmV3IE5vZGUuanMgdmVyc2lvbnMsIHNvIG9ubHkgYmFzZW5hbWUoKSBhYm92ZSBpcyBiYWNrcG9ydGVkIGhlcmVcbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbiAocGF0aCwgZXh0KSB7XG4gIHZhciBmID0gYmFzZW5hbWUocGF0aCk7XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbiAocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSBwYXRoID0gcGF0aCArICcnO1xuICB2YXIgc3RhcnREb3QgPSAtMTtcbiAgdmFyIHN0YXJ0UGFydCA9IDA7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmRcbiAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmRcbiAgdmFyIHByZURvdFN0YXRlID0gMDtcbiAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICB2YXIgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgLy8gc2VwYXJhdG9ycyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHN0b3Agbm93XG4gICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgc3RhcnRQYXJ0ID0gaSArIDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgIC8vIGV4dGVuc2lvblxuICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICBlbmQgPSBpICsgMTtcbiAgICB9XG4gICAgaWYgKGNvZGUgPT09IDQ2IC8qLiovKSB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IGRvdCwgbWFyayBpdCBhcyB0aGUgc3RhcnQgb2Ygb3VyIGV4dGVuc2lvblxuICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKVxuICAgICAgICAgIHN0YXJ0RG90ID0gaTtcbiAgICAgICAgZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpXG4gICAgICAgICAgcHJlRG90U3RhdGUgPSAxO1xuICAgIH0gZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7XG4gICAgICAvLyBXZSBzYXcgYSBub24tZG90IGFuZCBub24tcGF0aCBzZXBhcmF0b3IgYmVmb3JlIG91ciBkb3QsIHNvIHdlIHNob3VsZFxuICAgICAgLy8gaGF2ZSBhIGdvb2QgY2hhbmNlIGF0IGhhdmluZyBhIG5vbi1lbXB0eSBleHRlbnNpb25cbiAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fCBlbmQgPT09IC0xIHx8XG4gICAgICAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdFxuICAgICAgcHJlRG90U3RhdGUgPT09IDAgfHxcbiAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLidcbiAgICAgIHByZURvdFN0YXRlID09PSAxICYmIHN0YXJ0RG90ID09PSBlbmQgLSAxICYmIHN0YXJ0RG90ID09PSBzdGFydFBhcnQgKyAxKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0RG90LCBlbmQpO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCBub3JtYWxpemVkTmFtZSkge1xyXG4gIHV0aWxzLmZvckVhY2goaGVhZGVycywgZnVuY3Rpb24gcHJvY2Vzc0hlYWRlcih2YWx1ZSwgbmFtZSkge1xyXG4gICAgaWYgKG5hbWUgIT09IG5vcm1hbGl6ZWROYW1lICYmIG5hbWUudG9VcHBlckNhc2UoKSA9PT0gbm9ybWFsaXplZE5hbWUudG9VcHBlckNhc2UoKSkge1xyXG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWROYW1lXSA9IHZhbHVlO1xyXG4gICAgICBkZWxldGUgaGVhZGVyc1tuYW1lXTtcclxuICAgIH1cclxuICB9KTtcclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIFVwZGF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZmlnLCBlcnJvciBjb2RlLCBhbmQgcmVzcG9uc2UuXHJcbiAqXHJcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byB1cGRhdGUuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZy5cclxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2RlXSBUaGUgZXJyb3IgY29kZSAoZm9yIGV4YW1wbGUsICdFQ09OTkFCT1JURUQnKS5cclxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cclxuICogQHBhcmFtIHtPYmplY3R9IFtyZXNwb25zZV0gVGhlIHJlc3BvbnNlLlxyXG4gKiBAcmV0dXJucyB7RXJyb3J9IFRoZSBlcnJvci5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZW5oYW5jZUVycm9yKGVycm9yLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XHJcbiAgZXJyb3IuY29uZmlnID0gY29uZmlnO1xyXG4gIGlmIChjb2RlKSB7XHJcbiAgICBlcnJvci5jb2RlID0gY29kZTtcclxuICB9XHJcblxyXG4gIGVycm9yLnJlcXVlc3QgPSByZXF1ZXN0O1xyXG4gIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XHJcbiAgZXJyb3IuaXNBeGlvc0Vycm9yID0gdHJ1ZTtcclxuXHJcbiAgZXJyb3IudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLy8gU3RhbmRhcmRcclxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxyXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXHJcbiAgICAgIC8vIE1pY3Jvc29mdFxyXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcclxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcclxuICAgICAgLy8gTW96aWxsYVxyXG4gICAgICBmaWxlTmFtZTogdGhpcy5maWxlTmFtZSxcclxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxyXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxyXG4gICAgICBzdGFjazogdGhpcy5zdGFjayxcclxuICAgICAgLy8gQXhpb3NcclxuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcclxuICAgICAgY29kZTogdGhpcy5jb2RlLFxyXG4gICAgICBzdGF0dXM6IHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5zdGF0dXMgPyB0aGlzLnJlc3BvbnNlLnN0YXR1cyA6IG51bGxcclxuICAgIH07XHJcbiAgfTtcclxuICByZXR1cm4gZXJyb3I7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIHNpbGVudEpTT05QYXJzaW5nOiB0cnVlLFxyXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxyXG4gIGNsYXJpZnlUaW1lb3V0RXJyb3I6IGZhbHNlXHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcclxudmFyIHNldHRsZSA9IHJlcXVpcmUoJy4vLi4vY29yZS9zZXR0bGUnKTtcclxudmFyIGNvb2tpZXMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvY29va2llcycpO1xyXG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnVpbGRVUkwnKTtcclxudmFyIGJ1aWxkRnVsbFBhdGggPSByZXF1aXJlKCcuLi9jb3JlL2J1aWxkRnVsbFBhdGgnKTtcclxudmFyIHBhcnNlSGVhZGVycyA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9wYXJzZUhlYWRlcnMnKTtcclxudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc1VSTFNhbWVPcmlnaW4nKTtcclxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnLi4vY29yZS9jcmVhdGVFcnJvcicpO1xyXG52YXIgdHJhbnNpdGlvbmFsRGVmYXVsdHMgPSByZXF1aXJlKCcuLi9kZWZhdWx0cy90cmFuc2l0aW9uYWwnKTtcclxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4uL2NhbmNlbC9DYW5jZWwnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24geGhyQWRhcHRlcihjb25maWcpIHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgdmFyIHJlcXVlc3REYXRhID0gY29uZmlnLmRhdGE7XHJcbiAgICB2YXIgcmVxdWVzdEhlYWRlcnMgPSBjb25maWcuaGVhZGVycztcclxuICAgIHZhciByZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xyXG4gICAgdmFyIG9uQ2FuY2VsZWQ7XHJcbiAgICBmdW5jdGlvbiBkb25lKCkge1xyXG4gICAgICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XHJcbiAgICAgICAgY29uZmlnLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xyXG4gICAgICAgIGNvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh1dGlscy5pc0Zvcm1EYXRhKHJlcXVlc3REYXRhKSkge1xyXG4gICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuXHJcbiAgICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXHJcbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcclxuICAgICAgdmFyIHVzZXJuYW1lID0gY29uZmlnLmF1dGgudXNlcm5hbWUgfHwgJyc7XHJcbiAgICAgIHZhciBwYXNzd29yZCA9IGNvbmZpZy5hdXRoLnBhc3N3b3JkID8gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5hdXRoLnBhc3N3b3JkKSkgOiAnJztcclxuICAgICAgcmVxdWVzdEhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICdCYXNpYyAnICsgYnRvYSh1c2VybmFtZSArICc6JyArIHBhc3N3b3JkKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgZnVsbFBhdGggPSBidWlsZEZ1bGxQYXRoKGNvbmZpZy5iYXNlVVJMLCBjb25maWcudXJsKTtcclxuICAgIHJlcXVlc3Qub3Blbihjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplciksIHRydWUpO1xyXG5cclxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXHJcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcclxuXHJcbiAgICBmdW5jdGlvbiBvbmxvYWRlbmQoKSB7XHJcbiAgICAgIGlmICghcmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAvLyBQcmVwYXJlIHRoZSByZXNwb25zZVxyXG4gICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCA/IHBhcnNlSGVhZGVycyhyZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSA6IG51bGw7XHJcbiAgICAgIHZhciByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8ICByZXNwb25zZVR5cGUgPT09ICdqc29uJyA/XHJcbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xyXG4gICAgICB2YXIgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLFxyXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXHJcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxyXG4gICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlSGVhZGVycyxcclxuICAgICAgICBjb25maWc6IGNvbmZpZyxcclxuICAgICAgICByZXF1ZXN0OiByZXF1ZXN0XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBzZXR0bGUoZnVuY3Rpb24gX3Jlc29sdmUodmFsdWUpIHtcclxuICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICBkb25lKCk7XHJcbiAgICAgIH0sIGZ1bmN0aW9uIF9yZWplY3QoZXJyKSB7XHJcbiAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgZG9uZSgpO1xyXG4gICAgICB9LCByZXNwb25zZSk7XHJcblxyXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XHJcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICgnb25sb2FkZW5kJyBpbiByZXF1ZXN0KSB7XHJcbiAgICAgIC8vIFVzZSBvbmxvYWRlbmQgaWYgYXZhaWxhYmxlXHJcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gTGlzdGVuIGZvciByZWFkeSBzdGF0ZSB0byBlbXVsYXRlIG9ubG9hZGVuZFxyXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XHJcbiAgICAgICAgaWYgKCFyZXF1ZXN0IHx8IHJlcXVlc3QucmVhZHlTdGF0ZSAhPT0gNCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXHJcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcclxuICAgICAgICAvLyBXaXRoIG9uZSBleGNlcHRpb246IHJlcXVlc3QgdGhhdCB1c2luZyBmaWxlOiBwcm90b2NvbCwgbW9zdCBicm93c2Vyc1xyXG4gICAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcclxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxyXG4gICAgICAgIC8vIHNvIHdlIHNob3VsZCBjYWxsIG9ubG9hZGVuZCBvbiB0aGUgbmV4dCAndGljaydcclxuICAgICAgICBzZXRUaW1lb3V0KG9ubG9hZGVuZCk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxyXG4gICAgcmVxdWVzdC5vbmFib3J0ID0gZnVuY3Rpb24gaGFuZGxlQWJvcnQoKSB7XHJcbiAgICAgIGlmICghcmVxdWVzdCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBjb25maWcsICdFQ09OTkFCT1JURUQnLCByZXF1ZXN0KSk7XHJcblxyXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XHJcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXHJcbiAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcigpIHtcclxuICAgICAgLy8gUmVhbCBlcnJvcnMgYXJlIGhpZGRlbiBmcm9tIHVzIGJ5IHRoZSBicm93c2VyXHJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxyXG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBjb25maWcsIG51bGwsIHJlcXVlc3QpKTtcclxuXHJcbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcclxuICAgICAgcmVxdWVzdCA9IG51bGw7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEhhbmRsZSB0aW1lb3V0XHJcbiAgICByZXF1ZXN0Lm9udGltZW91dCA9IGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoKSB7XHJcbiAgICAgIHZhciB0aW1lb3V0RXJyb3JNZXNzYWdlID0gY29uZmlnLnRpbWVvdXQgPyAndGltZW91dCBvZiAnICsgY29uZmlnLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnIDogJ3RpbWVvdXQgZXhjZWVkZWQnO1xyXG4gICAgICB2YXIgdHJhbnNpdGlvbmFsID0gY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcclxuICAgICAgaWYgKGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IGNvbmZpZy50aW1lb3V0RXJyb3JNZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICAgIHJlamVjdChjcmVhdGVFcnJvcihcclxuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlLFxyXG4gICAgICAgIGNvbmZpZyxcclxuICAgICAgICB0cmFuc2l0aW9uYWwuY2xhcmlmeVRpbWVvdXRFcnJvciA/ICdFVElNRURPVVQnIDogJ0VDT05OQUJPUlRFRCcsXHJcbiAgICAgICAgcmVxdWVzdCkpO1xyXG5cclxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxyXG4gICAgICByZXF1ZXN0ID0gbnVsbDtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQWRkIHhzcmYgaGVhZGVyXHJcbiAgICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cclxuICAgIC8vIFNwZWNpZmljYWxseSBub3QgaWYgd2UncmUgaW4gYSB3ZWIgd29ya2VyLCBvciByZWFjdC1uYXRpdmUuXHJcbiAgICBpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xyXG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcclxuICAgICAgdmFyIHhzcmZWYWx1ZSA9IChjb25maWcud2l0aENyZWRlbnRpYWxzIHx8IGlzVVJMU2FtZU9yaWdpbihmdWxsUGF0aCkpICYmIGNvbmZpZy54c3JmQ29va2llTmFtZSA/XHJcbiAgICAgICAgY29va2llcy5yZWFkKGNvbmZpZy54c3JmQ29va2llTmFtZSkgOlxyXG4gICAgICAgIHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcclxuICAgICAgICByZXF1ZXN0SGVhZGVyc1tjb25maWcueHNyZkhlYWRlck5hbWVdID0geHNyZlZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcclxuICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gcmVxdWVzdCkge1xyXG4gICAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0RGF0YSA9PT0gJ3VuZGVmaW5lZCcgJiYga2V5LnRvTG93ZXJDYXNlKCkgPT09ICdjb250ZW50LXR5cGUnKSB7XHJcbiAgICAgICAgICAvLyBSZW1vdmUgQ29udGVudC1UeXBlIGlmIGRhdGEgaXMgdW5kZWZpbmVkXHJcbiAgICAgICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNba2V5XTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gT3RoZXJ3aXNlIGFkZCBoZWFkZXIgdG8gdGhlIHJlcXVlc3RcclxuICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgd2l0aENyZWRlbnRpYWxzIHRvIHJlcXVlc3QgaWYgbmVlZGVkXHJcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpKSB7XHJcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFjb25maWcud2l0aENyZWRlbnRpYWxzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcclxuICAgIGlmIChyZXNwb25zZVR5cGUgJiYgcmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHtcclxuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcclxuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uRG93bmxvYWRQcm9ncmVzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcclxuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicgJiYgcmVxdWVzdC51cGxvYWQpIHtcclxuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25VcGxvYWRQcm9ncmVzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbiB8fCBjb25maWcuc2lnbmFsKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcclxuICAgICAgb25DYW5jZWxlZCA9IGZ1bmN0aW9uKGNhbmNlbCkge1xyXG4gICAgICAgIGlmICghcmVxdWVzdCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZWplY3QoIWNhbmNlbCB8fCAoY2FuY2VsICYmIGNhbmNlbC50eXBlKSA/IG5ldyBDYW5jZWwoJ2NhbmNlbGVkJykgOiBjYW5jZWwpO1xyXG4gICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcclxuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbiAmJiBjb25maWcuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xyXG4gICAgICBpZiAoY29uZmlnLnNpZ25hbCkge1xyXG4gICAgICAgIGNvbmZpZy5zaWduYWwuYWJvcnRlZCA/IG9uQ2FuY2VsZWQoKSA6IGNvbmZpZy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghcmVxdWVzdERhdGEpIHtcclxuICAgICAgcmVxdWVzdERhdGEgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcclxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XHJcbiAgfSk7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4vY3JlYXRlRXJyb3InKTtcclxuXHJcbi8qKlxyXG4gKiBSZXNvbHZlIG9yIHJlamVjdCBhIFByb21pc2UgYmFzZWQgb24gcmVzcG9uc2Ugc3RhdHVzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlIEEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyB0aGUgcHJvbWlzZS5cclxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0IEEgZnVuY3Rpb24gdGhhdCByZWplY3RzIHRoZSBwcm9taXNlLlxyXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xyXG4gIHZhciB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcclxuICBpZiAoIXJlc3BvbnNlLnN0YXR1cyB8fCAhdmFsaWRhdGVTdGF0dXMgfHwgdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKSkge1xyXG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJlamVjdChjcmVhdGVFcnJvcihcclxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcclxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxyXG4gICAgICBudWxsLFxyXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxyXG4gICAgICByZXNwb25zZVxyXG4gICAgKSk7XHJcbiAgfVxyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi9lbmhhbmNlRXJyb3InKTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cclxuICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRXJyb3IobWVzc2FnZSwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xyXG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICByZXR1cm4gZW5oYW5jZUVycm9yKGVycm9yLCBjb25maWcsIGNvZGUsIHJlcXVlc3QsIHJlc3BvbnNlKTtcclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSAoXHJcbiAgdXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/XHJcblxyXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxyXG4gICAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XHJcbiAgICAgICAgICB2YXIgY29va2llID0gW107XHJcbiAgICAgICAgICBjb29raWUucHVzaChuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XHJcblxyXG4gICAgICAgICAgaWYgKHV0aWxzLmlzTnVtYmVyKGV4cGlyZXMpKSB7XHJcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdleHBpcmVzPScgKyBuZXcgRGF0ZShleHBpcmVzKS50b0dNVFN0cmluZygpKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodXRpbHMuaXNTdHJpbmcocGF0aCkpIHtcclxuICAgICAgICAgICAgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhkb21haW4pKSB7XHJcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHNlY3VyZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBjb29raWUucHVzaCgnc2VjdXJlJyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZG9jdW1lbnQuY29va2llID0gY29va2llLmpvaW4oJzsgJyk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZChuYW1lKSB7XHJcbiAgICAgICAgICB2YXIgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xyXG4gICAgICAgICAgcmV0dXJuIChtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFszXSkgOiBudWxsKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShuYW1lKSB7XHJcbiAgICAgICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuICAgIH0pKCkgOlxyXG5cclxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXHJcbiAgICAoZnVuY3Rpb24gbm9uU3RhbmRhcmRCcm93c2VyRW52KCkge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHdyaXRlOiBmdW5jdGlvbiB3cml0ZSgpIHt9LFxyXG4gICAgICAgIHJlYWQ6IGZ1bmN0aW9uIHJlYWQoKSB7IHJldHVybiBudWxsOyB9LFxyXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cclxuICAgICAgfTtcclxuICAgIH0pKClcclxuKTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIGlzQWJzb2x1dGVVUkwgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwnKTtcclxudmFyIGNvbWJpbmVVUkxzID0gcmVxdWlyZSgnLi4vaGVscGVycy9jb21iaW5lVVJMcycpO1xyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBuZXcgVVJMIGJ5IGNvbWJpbmluZyB0aGUgYmFzZVVSTCB3aXRoIHRoZSByZXF1ZXN0ZWRVUkwsXHJcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cclxuICogSWYgdGhlIHJlcXVlc3RVUkwgaXMgYWJzb2x1dGUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVxdWVzdGVkVVJMIHVudG91Y2hlZC5cclxuICpcclxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0ZWRVUkwgQWJzb2x1dGUgb3IgcmVsYXRpdmUgVVJMIHRvIGNvbWJpbmVcclxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCkge1xyXG4gIGlmIChiYXNlVVJMICYmICFpc0Fic29sdXRlVVJMKHJlcXVlc3RlZFVSTCkpIHtcclxuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xyXG4gIH1cclxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0ZXN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlLCBvdGhlcndpc2UgZmFsc2VcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNBYnNvbHV0ZVVSTCh1cmwpIHtcclxuICAvLyBBIFVSTCBpcyBjb25zaWRlcmVkIGFic29sdXRlIGlmIGl0IGJlZ2lucyB3aXRoIFwiPHNjaGVtZT46Ly9cIiBvciBcIi8vXCIgKHByb3RvY29sLXJlbGF0aXZlIFVSTCkuXHJcbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXHJcbiAgLy8gYnkgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMsIGRpZ2l0cywgcGx1cywgcGVyaW9kLCBvciBoeXBoZW4uXHJcbiAgcmV0dXJuIC9eKFthLXpdW2EtelxcZCtcXC0uXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXHJcbiAqXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgVVJMXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNvbWJpbmVVUkxzKGJhc2VVUkwsIHJlbGF0aXZlVVJMKSB7XHJcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXHJcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxyXG4gICAgOiBiYXNlVVJMO1xyXG59O1xyXG4iLCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XHJcblxyXG4vLyBIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxyXG4vLyBjLmYuIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXHJcbnZhciBpZ25vcmVEdXBsaWNhdGVPZiA9IFtcclxuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxyXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcclxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXHJcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcclxuXTtcclxuXHJcbi8qKlxyXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XHJcbiAqXHJcbiAqIGBgYFxyXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxyXG4gKiBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cclxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxyXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG4gKiBgYGBcclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBwYXJzZUhlYWRlcnMoaGVhZGVycykge1xyXG4gIHZhciBwYXJzZWQgPSB7fTtcclxuICB2YXIga2V5O1xyXG4gIHZhciB2YWw7XHJcbiAgdmFyIGk7XHJcblxyXG4gIGlmICghaGVhZGVycykgeyByZXR1cm4gcGFyc2VkOyB9XHJcblxyXG4gIHV0aWxzLmZvckVhY2goaGVhZGVycy5zcGxpdCgnXFxuJyksIGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XHJcbiAgICBpID0gbGluZS5pbmRleE9mKCc6Jyk7XHJcbiAgICBrZXkgPSB1dGlscy50cmltKGxpbmUuc3Vic3RyKDAsIGkpKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgdmFsID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cihpICsgMSkpO1xyXG5cclxuICAgIGlmIChrZXkpIHtcclxuICAgICAgaWYgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mLmluZGV4T2Yoa2V5KSA+PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xyXG4gICAgICAgIHBhcnNlZFtrZXldID0gKHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gOiBbXSkuY29uY2F0KFt2YWxdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBwYXJzZWQ7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gKFxyXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xyXG5cclxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3RcclxuICAvLyB3aGV0aGVyIHRoZSByZXF1ZXN0IFVSTCBpcyBvZiB0aGUgc2FtZSBvcmlnaW4gYXMgY3VycmVudCBsb2NhdGlvbi5cclxuICAgIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XHJcbiAgICAgIHZhciBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcclxuICAgICAgdmFyIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICB2YXIgb3JpZ2luVVJMO1xyXG5cclxuICAgICAgLyoqXHJcbiAgICAqIFBhcnNlIGEgVVJMIHRvIGRpc2NvdmVyIGl0J3MgY29tcG9uZW50c1xyXG4gICAgKlxyXG4gICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gYmUgcGFyc2VkXHJcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9XHJcbiAgICAqL1xyXG4gICAgICBmdW5jdGlvbiByZXNvbHZlVVJMKHVybCkge1xyXG4gICAgICAgIHZhciBocmVmID0gdXJsO1xyXG5cclxuICAgICAgICBpZiAobXNpZSkge1xyXG4gICAgICAgIC8vIElFIG5lZWRzIGF0dHJpYnV0ZSBzZXQgdHdpY2UgdG8gbm9ybWFsaXplIHByb3BlcnRpZXNcclxuICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xyXG4gICAgICAgICAgaHJlZiA9IHVybFBhcnNpbmdOb2RlLmhyZWY7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB1cmxQYXJzaW5nTm9kZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBocmVmKTtcclxuXHJcbiAgICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBocmVmOiB1cmxQYXJzaW5nTm9kZS5ocmVmLFxyXG4gICAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcclxuICAgICAgICAgIGhvc3Q6IHVybFBhcnNpbmdOb2RlLmhvc3QsXHJcbiAgICAgICAgICBzZWFyY2g6IHVybFBhcnNpbmdOb2RlLnNlYXJjaCA/IHVybFBhcnNpbmdOb2RlLnNlYXJjaC5yZXBsYWNlKC9eXFw/LywgJycpIDogJycsXHJcbiAgICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxyXG4gICAgICAgICAgaG9zdG5hbWU6IHVybFBhcnNpbmdOb2RlLmhvc3RuYW1lLFxyXG4gICAgICAgICAgcG9ydDogdXJsUGFyc2luZ05vZGUucG9ydCxcclxuICAgICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cclxuICAgICAgICAgICAgdXJsUGFyc2luZ05vZGUucGF0aG5hbWUgOlxyXG4gICAgICAgICAgICAnLycgKyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG5cclxuICAgICAgLyoqXHJcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXHJcbiAgICAqXHJcbiAgICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0VVJMIFRoZSBVUkwgdG8gdGVzdFxyXG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXHJcbiAgICAqL1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKHJlcXVlc3RVUkwpIHtcclxuICAgICAgICB2YXIgcGFyc2VkID0gKHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xyXG4gICAgICAgIHJldHVybiAocGFyc2VkLnByb3RvY29sID09PSBvcmlnaW5VUkwucHJvdG9jb2wgJiZcclxuICAgICAgICAgICAgcGFyc2VkLmhvc3QgPT09IG9yaWdpblVSTC5ob3N0KTtcclxuICAgICAgfTtcclxuICAgIH0pKCkgOlxyXG5cclxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnZzICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxyXG4gICAgKGZ1bmN0aW9uIG5vblN0YW5kYXJkQnJvd3NlckVudigpIHtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzVVJMU2FtZU9yaWdpbigpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfTtcclxuICAgIH0pKClcclxuKTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIEEgYENhbmNlbGAgaXMgYW4gb2JqZWN0IHRoYXQgaXMgdGhyb3duIHdoZW4gYW4gb3BlcmF0aW9uIGlzIGNhbmNlbGVkLlxyXG4gKlxyXG4gKiBAY2xhc3NcclxuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxyXG4gKi9cclxuZnVuY3Rpb24gQ2FuY2VsKG1lc3NhZ2UpIHtcclxuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG59XHJcblxyXG5DYW5jZWwucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XHJcbiAgcmV0dXJuICdDYW5jZWwnICsgKHRoaXMubWVzc2FnZSA/ICc6ICcgKyB0aGlzLm1lc3NhZ2UgOiAnJyk7XHJcbn07XHJcblxyXG5DYW5jZWwucHJvdG90eXBlLl9fQ0FOQ0VMX18gPSB0cnVlO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWw7XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcclxuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XHJcblxyXG4vKipcclxuICogQ29uZmlnLXNwZWNpZmljIG1lcmdlLWZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29uZmlnLW9iamVjdFxyXG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcxXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXHJcbiAqIEByZXR1cm5zIHtPYmplY3R9IE5ldyBvYmplY3QgcmVzdWx0aW5nIGZyb20gbWVyZ2luZyBjb25maWcyIHRvIGNvbmZpZzFcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gbWVyZ2VDb25maWcoY29uZmlnMSwgY29uZmlnMikge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxyXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xyXG4gIHZhciBjb25maWcgPSB7fTtcclxuXHJcbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UpIHtcclxuICAgIGlmICh1dGlscy5pc1BsYWluT2JqZWN0KHRhcmdldCkgJiYgdXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XHJcbiAgICAgIHJldHVybiB1dGlscy5tZXJnZSh0YXJnZXQsIHNvdXJjZSk7XHJcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xyXG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2Uoe30sIHNvdXJjZSk7XHJcbiAgICB9IGVsc2UgaWYgKHV0aWxzLmlzQXJyYXkoc291cmNlKSkge1xyXG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc291cmNlO1xyXG4gIH1cclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXHJcbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhwcm9wKSB7XHJcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XHJcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdKTtcclxuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzFbcHJvcF0pKSB7XHJcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzFbcHJvcF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXHJcbiAgZnVuY3Rpb24gdmFsdWVGcm9tQ29uZmlnMihwcm9wKSB7XHJcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XHJcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzJbcHJvcF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXHJcbiAgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihwcm9wKSB7XHJcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZzJbcHJvcF0pKSB7XHJcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGNvbmZpZzJbcHJvcF0pO1xyXG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoY29uZmlnMVtwcm9wXSkpIHtcclxuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgY29uZmlnMVtwcm9wXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cclxuICBmdW5jdGlvbiBtZXJnZURpcmVjdEtleXMocHJvcCkge1xyXG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xyXG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUoY29uZmlnMVtwcm9wXSwgY29uZmlnMltwcm9wXSk7XHJcbiAgICB9IGVsc2UgaWYgKHByb3AgaW4gY29uZmlnMSkge1xyXG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBjb25maWcxW3Byb3BdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhciBtZXJnZU1hcCA9IHtcclxuICAgICd1cmwnOiB2YWx1ZUZyb21Db25maWcyLFxyXG4gICAgJ21ldGhvZCc6IHZhbHVlRnJvbUNvbmZpZzIsXHJcbiAgICAnZGF0YSc6IHZhbHVlRnJvbUNvbmZpZzIsXHJcbiAgICAnYmFzZVVSTCc6IGRlZmF1bHRUb0NvbmZpZzIsXHJcbiAgICAndHJhbnNmb3JtUmVxdWVzdCc6IGRlZmF1bHRUb0NvbmZpZzIsXHJcbiAgICAndHJhbnNmb3JtUmVzcG9uc2UnOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ3BhcmFtc1NlcmlhbGl6ZXInOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ3RpbWVvdXQnOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ3RpbWVvdXRNZXNzYWdlJzogZGVmYXVsdFRvQ29uZmlnMixcclxuICAgICd3aXRoQ3JlZGVudGlhbHMnOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ2FkYXB0ZXInOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ3Jlc3BvbnNlVHlwZSc6IGRlZmF1bHRUb0NvbmZpZzIsXHJcbiAgICAneHNyZkNvb2tpZU5hbWUnOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ3hzcmZIZWFkZXJOYW1lJzogZGVmYXVsdFRvQ29uZmlnMixcclxuICAgICdvblVwbG9hZFByb2dyZXNzJzogZGVmYXVsdFRvQ29uZmlnMixcclxuICAgICdvbkRvd25sb2FkUHJvZ3Jlc3MnOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ2RlY29tcHJlc3MnOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ21heENvbnRlbnRMZW5ndGgnOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ21heEJvZHlMZW5ndGgnOiBkZWZhdWx0VG9Db25maWcyLFxyXG4gICAgJ3RyYW5zcG9ydCc6IGRlZmF1bHRUb0NvbmZpZzIsXHJcbiAgICAnaHR0cEFnZW50JzogZGVmYXVsdFRvQ29uZmlnMixcclxuICAgICdodHRwc0FnZW50JzogZGVmYXVsdFRvQ29uZmlnMixcclxuICAgICdjYW5jZWxUb2tlbic6IGRlZmF1bHRUb0NvbmZpZzIsXHJcbiAgICAnc29ja2V0UGF0aCc6IGRlZmF1bHRUb0NvbmZpZzIsXHJcbiAgICAncmVzcG9uc2VFbmNvZGluZyc6IGRlZmF1bHRUb0NvbmZpZzIsXHJcbiAgICAndmFsaWRhdGVTdGF0dXMnOiBtZXJnZURpcmVjdEtleXNcclxuICB9O1xyXG5cclxuICB1dGlscy5mb3JFYWNoKE9iamVjdC5rZXlzKGNvbmZpZzEpLmNvbmNhdChPYmplY3Qua2V5cyhjb25maWcyKSksIGZ1bmN0aW9uIGNvbXB1dGVDb25maWdWYWx1ZShwcm9wKSB7XHJcbiAgICB2YXIgbWVyZ2UgPSBtZXJnZU1hcFtwcm9wXSB8fCBtZXJnZURlZXBQcm9wZXJ0aWVzO1xyXG4gICAgdmFyIGNvbmZpZ1ZhbHVlID0gbWVyZ2UocHJvcCk7XHJcbiAgICAodXRpbHMuaXNVbmRlZmluZWQoY29uZmlnVmFsdWUpICYmIG1lcmdlICE9PSBtZXJnZURpcmVjdEtleXMpIHx8IChjb25maWdbcHJvcF0gPSBjb25maWdWYWx1ZSk7XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBjb25maWc7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBWRVJTSU9OID0gcmVxdWlyZSgnLi4vZW52L2RhdGEnKS52ZXJzaW9uO1xyXG5cclxudmFyIHZhbGlkYXRvcnMgPSB7fTtcclxuXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXHJcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUsIGkpIHtcclxuICB2YWxpZGF0b3JzW3R5cGVdID0gZnVuY3Rpb24gdmFsaWRhdG9yKHRoaW5nKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHRoaW5nID09PSB0eXBlIHx8ICdhJyArIChpIDwgMSA/ICduICcgOiAnICcpICsgdHlwZTtcclxuICB9O1xyXG59KTtcclxuXHJcbnZhciBkZXByZWNhdGVkV2FybmluZ3MgPSB7fTtcclxuXHJcbi8qKlxyXG4gKiBUcmFuc2l0aW9uYWwgb3B0aW9uIHZhbGlkYXRvclxyXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufGJvb2xlYW4/fSB2YWxpZGF0b3IgLSBzZXQgdG8gZmFsc2UgaWYgdGhlIHRyYW5zaXRpb25hbCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZFxyXG4gKiBAcGFyYW0ge3N0cmluZz99IHZlcnNpb24gLSBkZXByZWNhdGVkIHZlcnNpb24gLyByZW1vdmVkIHNpbmNlIHZlcnNpb25cclxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXHJcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn1cclxuICovXHJcbnZhbGlkYXRvcnMudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xyXG4gIGZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2Uob3B0LCBkZXNjKSB7XHJcbiAgICByZXR1cm4gJ1tBeGlvcyB2JyArIFZFUlNJT04gKyAnXSBUcmFuc2l0aW9uYWwgb3B0aW9uIFxcJycgKyBvcHQgKyAnXFwnJyArIGRlc2MgKyAobWVzc2FnZSA/ICcuICcgKyBtZXNzYWdlIDogJycpO1xyXG4gIH1cclxuXHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcclxuICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG9wdCwgb3B0cykge1xyXG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQnICsgKHZlcnNpb24gPyAnIGluICcgKyB2ZXJzaW9uIDogJycpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZlcnNpb24gJiYgIWRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdKSB7XHJcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXHJcbiAgICAgICAgICBvcHQsXHJcbiAgICAgICAgICAnIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdicgKyB2ZXJzaW9uICsgJyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSdcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZhbGlkYXRvciA/IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRzKSA6IHRydWU7XHJcbiAgfTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcclxuICogQHBhcmFtIHtib29sZWFuP30gYWxsb3dVbmtub3duXHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xyXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcclxuICB9XHJcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvcHRpb25zKTtcclxuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xyXG4gIHdoaWxlIChpLS0gPiAwKSB7XHJcbiAgICB2YXIgb3B0ID0ga2V5c1tpXTtcclxuICAgIHZhciB2YWxpZGF0b3IgPSBzY2hlbWFbb3B0XTtcclxuICAgIGlmICh2YWxpZGF0b3IpIHtcclxuICAgICAgdmFyIHZhbHVlID0gb3B0aW9uc1tvcHRdO1xyXG4gICAgICB2YXIgcmVzdWx0ID0gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0aW9ucyk7XHJcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gJyArIG9wdCArICcgbXVzdCBiZSAnICsgcmVzdWx0KTtcclxuICAgICAgfVxyXG4gICAgICBjb250aW51ZTtcclxuICAgIH1cclxuICAgIGlmIChhbGxvd1Vua25vd24gIT09IHRydWUpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgYXNzZXJ0T3B0aW9uczogYXNzZXJ0T3B0aW9ucyxcclxuICB2YWxpZGF0b3JzOiB2YWxpZGF0b3JzXHJcbn07XHJcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIFwidmVyc2lvblwiOiBcIjAuMjYuMVwiXHJcbn07IiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIENhbmNlbCA9IHJlcXVpcmUoJy4vQ2FuY2VsJyk7XHJcblxyXG4vKipcclxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cclxuICpcclxuICogQGNsYXNzXHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGV4ZWN1dG9yIFRoZSBleGVjdXRvciBmdW5jdGlvbi5cclxuICovXHJcbmZ1bmN0aW9uIENhbmNlbFRva2VuKGV4ZWN1dG9yKSB7XHJcbiAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xyXG4gIH1cclxuXHJcbiAgdmFyIHJlc29sdmVQcm9taXNlO1xyXG5cclxuICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xyXG4gICAgcmVzb2x2ZVByb21pc2UgPSByZXNvbHZlO1xyXG4gIH0pO1xyXG5cclxuICB2YXIgdG9rZW4gPSB0aGlzO1xyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xyXG4gIHRoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKGNhbmNlbCkge1xyXG4gICAgaWYgKCF0b2tlbi5fbGlzdGVuZXJzKSByZXR1cm47XHJcblxyXG4gICAgdmFyIGk7XHJcbiAgICB2YXIgbCA9IHRva2VuLl9saXN0ZW5lcnMubGVuZ3RoO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcclxuICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xyXG4gICAgfVxyXG4gICAgdG9rZW4uX2xpc3RlbmVycyA9IG51bGw7XHJcbiAgfSk7XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXHJcbiAgdGhpcy5wcm9taXNlLnRoZW4gPSBmdW5jdGlvbihvbmZ1bGZpbGxlZCkge1xyXG4gICAgdmFyIF9yZXNvbHZlO1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcclxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xyXG4gICAgICB0b2tlbi5zdWJzY3JpYmUocmVzb2x2ZSk7XHJcbiAgICAgIF9yZXNvbHZlID0gcmVzb2x2ZTtcclxuICAgIH0pLnRoZW4ob25mdWxmaWxsZWQpO1xyXG5cclxuICAgIHByb21pc2UuY2FuY2VsID0gZnVuY3Rpb24gcmVqZWN0KCkge1xyXG4gICAgICB0b2tlbi51bnN1YnNjcmliZShfcmVzb2x2ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBwcm9taXNlO1xyXG4gIH07XHJcblxyXG4gIGV4ZWN1dG9yKGZ1bmN0aW9uIGNhbmNlbChtZXNzYWdlKSB7XHJcbiAgICBpZiAodG9rZW4ucmVhc29uKSB7XHJcbiAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdG9rZW4ucmVhc29uID0gbmV3IENhbmNlbChtZXNzYWdlKTtcclxuICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XHJcbiAgfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxyXG4gKi9cclxuQ2FuY2VsVG9rZW4ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQgPSBmdW5jdGlvbiB0aHJvd0lmUmVxdWVzdGVkKCkge1xyXG4gIGlmICh0aGlzLnJlYXNvbikge1xyXG4gICAgdGhyb3cgdGhpcy5yZWFzb247XHJcbiAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFN1YnNjcmliZSB0byB0aGUgY2FuY2VsIHNpZ25hbFxyXG4gKi9cclxuXHJcbkNhbmNlbFRva2VuLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcclxuICBpZiAodGhpcy5yZWFzb24pIHtcclxuICAgIGxpc3RlbmVyKHRoaXMucmVhc29uKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGlmICh0aGlzLl9saXN0ZW5lcnMpIHtcclxuICAgIHRoaXMuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcclxuICB9IGVsc2Uge1xyXG4gICAgdGhpcy5fbGlzdGVuZXJzID0gW2xpc3RlbmVyXTtcclxuICB9XHJcbn07XHJcblxyXG4vKipcclxuICogVW5zdWJzY3JpYmUgZnJvbSB0aGUgY2FuY2VsIHNpZ25hbFxyXG4gKi9cclxuXHJcbkNhbmNlbFRva2VuLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XHJcbiAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcclxuICAgIHJldHVybjtcclxuICB9XHJcbiAgdmFyIGluZGV4ID0gdGhpcy5fbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xyXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgIHRoaXMuX2xpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbmV3IGBDYW5jZWxUb2tlbmAgYW5kIGEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsXHJcbiAqIGNhbmNlbHMgdGhlIGBDYW5jZWxUb2tlbmAuXHJcbiAqL1xyXG5DYW5jZWxUb2tlbi5zb3VyY2UgPSBmdW5jdGlvbiBzb3VyY2UoKSB7XHJcbiAgdmFyIGNhbmNlbDtcclxuICB2YXIgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xyXG4gICAgY2FuY2VsID0gYztcclxuICB9KTtcclxuICByZXR1cm4ge1xyXG4gICAgdG9rZW46IHRva2VuLFxyXG4gICAgY2FuY2VsOiBjYW5jZWxcclxuICB9O1xyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWxUb2tlbjtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxuLyoqXHJcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXHJcbiAqXHJcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXHJcbiAqXHJcbiAqICBgYGBqc1xyXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxyXG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XHJcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xyXG4gKiAgYGBgXHJcbiAqXHJcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxyXG4gKlxyXG4gKiAgYGBganNcclxuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcclxuICogIGBgYFxyXG4gKlxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xyXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xyXG4gIHJldHVybiBmdW5jdGlvbiB3cmFwKGFycikge1xyXG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XHJcbiAgfTtcclxufTtcclxuIiwiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xyXG5cclxuLyoqXHJcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGF5bG9hZCBpcyBhbiBlcnJvciB0aHJvd24gYnkgQXhpb3NcclxuICpcclxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XHJcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBwYXlsb2FkIGlzIGFuIGVycm9yIHRocm93biBieSBBeGlvcywgb3RoZXJ3aXNlIGZhbHNlXHJcbiAqL1xyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXhpb3NFcnJvcihwYXlsb2FkKSB7XHJcbiAgcmV0dXJuIHV0aWxzLmlzT2JqZWN0KHBheWxvYWQpICYmIChwYXlsb2FkLmlzQXhpb3NFcnJvciA9PT0gdHJ1ZSk7XHJcbn07XHJcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vc3RyaW5naWZ5Jyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJyk7XG52YXIgZm9ybWF0cyA9IHJlcXVpcmUoJy4vZm9ybWF0cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBmb3JtYXRzOiBmb3JtYXRzLFxuICAgIHBhcnNlOiBwYXJzZSxcbiAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGZvcm1hdHMgPSByZXF1aXJlKCcuL2Zvcm1hdHMnKTtcblxudmFyIGFycmF5UHJlZml4R2VuZXJhdG9ycyA9IHtcbiAgICBicmFja2V0czogZnVuY3Rpb24gYnJhY2tldHMocHJlZml4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnW10nO1xuICAgIH0sXG4gICAgaW5kaWNlczogZnVuY3Rpb24gaW5kaWNlcyhwcmVmaXgsIGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1snICsga2V5ICsgJ10nO1xuICAgIH0sXG4gICAgcmVwZWF0OiBmdW5jdGlvbiByZXBlYXQocHJlZml4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxufTtcblxudmFyIHRvSVNPID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBlbmNvZGU6IHRydWUsXG4gICAgZW5jb2RlcjogdXRpbHMuZW5jb2RlLFxuICAgIGVuY29kZVZhbHVlc09ubHk6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIHN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeSggLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICBvYmplY3QsXG4gICAgcHJlZml4LFxuICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgIHNraXBOdWxscyxcbiAgICBlbmNvZGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0LFxuICAgIGFsbG93RG90cyxcbiAgICBzZXJpYWxpemVEYXRlLFxuICAgIGZvcm1hdHRlcixcbiAgICBlbmNvZGVWYWx1ZXNPbmx5XG4pIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9iaiA9IGZpbHRlcihwcmVmaXgsIG9iaik7XG4gICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG9iaiA9IHNlcmlhbGl6ZURhdGUob2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoc3RyaWN0TnVsbEhhbmRsaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gZW5jb2RlciAmJiAhZW5jb2RlVmFsdWVzT25seSA/IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyKSA6IHByZWZpeDtcbiAgICAgICAgfVxuXG4gICAgICAgIG9iaiA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb2JqID09PSAnbnVtYmVyJyB8fCB0eXBlb2Ygb2JqID09PSAnYm9vbGVhbicgfHwgdXRpbHMuaXNCdWZmZXIob2JqKSkge1xuICAgICAgICBpZiAoZW5jb2Rlcikge1xuICAgICAgICAgICAgdmFyIGtleVZhbHVlID0gZW5jb2RlVmFsdWVzT25seSA/IHByZWZpeCA6IGVuY29kZXIocHJlZml4LCBkZWZhdWx0cy5lbmNvZGVyKTtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybWF0dGVyKGtleVZhbHVlKSArICc9JyArIGZvcm1hdHRlcihlbmNvZGVyKG9iaiwgZGVmYXVsdHMuZW5jb2RlcikpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2Zvcm1hdHRlcihwcmVmaXgpICsgJz0nICsgZm9ybWF0dGVyKFN0cmluZyhvYmopKV07XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfVxuXG4gICAgdmFyIG9iaktleXM7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICBvYmpLZXlzID0gZmlsdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgb2JqS2V5cyA9IHNvcnQgPyBrZXlzLnNvcnQoc29ydCkgOiBrZXlzO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgocHJlZml4LCBrZXkpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5jb25jYXQoc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIHByZWZpeCArIChhbGxvd0RvdHMgPyAnLicgKyBrZXkgOiAnWycgKyBrZXkgKyAnXScpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG9wdHMpIHtcbiAgICB2YXIgb2JqID0gb2JqZWN0O1xuICAgIHZhciBvcHRpb25zID0gb3B0cyA/IHV0aWxzLmFzc2lnbih7fSwgb3B0cykgOiB7fTtcblxuICAgIGlmIChvcHRpb25zLmVuY29kZXIgIT09IG51bGwgJiYgb3B0aW9ucy5lbmNvZGVyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuZW5jb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBkZWxpbWl0ZXIgPSB0eXBlb2Ygb3B0aW9ucy5kZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdHMuZGVsaW1pdGVyIDogb3B0aW9ucy5kZWxpbWl0ZXI7XG4gICAgdmFyIHN0cmljdE51bGxIYW5kbGluZyA9IHR5cGVvZiBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmc7XG4gICAgdmFyIHNraXBOdWxscyA9IHR5cGVvZiBvcHRpb25zLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHM7XG4gICAgdmFyIGVuY29kZSA9IHR5cGVvZiBvcHRpb25zLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGU7XG4gICAgdmFyIGVuY29kZXIgPSB0eXBlb2Ygb3B0aW9ucy5lbmNvZGVyID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5lbmNvZGVyIDogZGVmYXVsdHMuZW5jb2RlcjtcbiAgICB2YXIgc29ydCA9IHR5cGVvZiBvcHRpb25zLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnNvcnQgOiBudWxsO1xuICAgIHZhciBhbGxvd0RvdHMgPSB0eXBlb2Ygb3B0aW9ucy5hbGxvd0RvdHMgPT09ICd1bmRlZmluZWQnID8gZmFsc2UgOiBvcHRpb25zLmFsbG93RG90cztcbiAgICB2YXIgc2VyaWFsaXplRGF0ZSA9IHR5cGVvZiBvcHRpb25zLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlO1xuICAgIHZhciBlbmNvZGVWYWx1ZXNPbmx5ID0gdHlwZW9mIG9wdGlvbnMuZW5jb2RlVmFsdWVzT25seSA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5lbmNvZGVWYWx1ZXNPbmx5IDogZGVmYXVsdHMuZW5jb2RlVmFsdWVzT25seTtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuZm9ybWF0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zLmZvcm1hdCA9IGZvcm1hdHNbJ2RlZmF1bHQnXTtcbiAgICB9IGVsc2UgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRpb25zLmZvcm1hdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBmb3JtYXQgb3B0aW9uIHByb3ZpZGVkLicpO1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gZm9ybWF0cy5mb3JtYXR0ZXJzW29wdGlvbnMuZm9ybWF0XTtcbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0aW9ucy5hcnJheUZvcm1hdCBpbiBhcnJheVByZWZpeEdlbmVyYXRvcnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmFycmF5Rm9ybWF0O1xuICAgIH0gZWxzZSBpZiAoJ2luZGljZXMnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSBvcHRpb25zLmluZGljZXMgPyAnaW5kaWNlcycgOiAncmVwZWF0JztcbiAgICB9IGVsc2Uge1xuICAgICAgICBhcnJheUZvcm1hdCA9ICdpbmRpY2VzJztcbiAgICB9XG5cbiAgICB2YXIgZ2VuZXJhdGVBcnJheVByZWZpeCA9IGFycmF5UHJlZml4R2VuZXJhdG9yc1thcnJheUZvcm1hdF07XG5cbiAgICBpZiAoIW9iaktleXMpIHtcbiAgICAgICAgb2JqS2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuXG4gICAgaWYgKHNvcnQpIHtcbiAgICAgICAgb2JqS2V5cy5zb3J0KHNvcnQpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqS2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIga2V5ID0gb2JqS2V5c1tpXTtcblxuICAgICAgICBpZiAoc2tpcE51bGxzICYmIG9ialtrZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGtleXMgPSBrZXlzLmNvbmNhdChzdHJpbmdpZnkoXG4gICAgICAgICAgICBvYmpba2V5XSxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICBlbmNvZGUgPyBlbmNvZGVyIDogbnVsbCxcbiAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgIHNvcnQsXG4gICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgZm9ybWF0dGVyLFxuICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKGRlbGltaXRlcik7XG4gICAgdmFyIHByZWZpeCA9IG9wdGlvbnMuYWRkUXVlcnlQcmVmaXggPT09IHRydWUgPyAnPycgOiAnJztcblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB2YXIgb2JqO1xuXG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgICAgIHZhciBjb21wYWN0ZWQgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBvYmoubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9ialtqXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFjdGVkLnB1c2gob2JqW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGl0ZW0ub2JqW2l0ZW0ucHJvcF0gPSBjb21wYWN0ZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhaW5PYmplY3RzIHx8IG9wdGlvbnMuYWxsb3dQcm90b3R5cGVzIHx8ICFoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0W3NvdXJjZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFt0YXJnZXQsIHNvdXJjZV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkgJiYgIUFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpICYmIEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0W2ldICYmIHR5cGVvZiB0YXJnZXRbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFtpXSA9IG1lcmdlKHRhcmdldFtpXSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0cikge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyLnJlcGxhY2UoL1xcKy9nLCAnICcpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxufTtcblxudmFyIGVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgICAvLyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBCcmlhbiBXaGl0ZSAobXNjZGV4KSBmb3IgdGhlIGlvLmpzIGNvcmUgcXVlcnlzdHJpbmcgbGlicmFyeS5cbiAgICAvLyBJdCBoYXMgYmVlbiBhZGFwdGVkIGhlcmUgZm9yIHN0cmljdGVyIGFkaGVyZW5jZSB0byBSRkMgMzk4NlxuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgdmFyIHN0cmluZyA9IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnID8gc3RyIDogU3RyaW5nKHN0cik7XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjID09PSAweDJEIC8vIC1cbiAgICAgICAgICAgIHx8IGMgPT09IDB4MkUgLy8gLlxuICAgICAgICAgICAgfHwgYyA9PT0gMHg1RiAvLyBfXG4gICAgICAgICAgICB8fCBjID09PSAweDdFIC8vIH5cbiAgICAgICAgICAgIHx8IChjID49IDB4MzAgJiYgYyA8PSAweDM5KSAvLyAwLTlcbiAgICAgICAgICAgIHx8IChjID49IDB4NDEgJiYgYyA8PSAweDVBKSAvLyBhLXpcbiAgICAgICAgICAgIHx8IChjID49IDB4NjEgJiYgYyA8PSAweDdBKSAvLyBBLVpcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBvdXQgKz0gc3RyaW5nLmNoYXJBdChpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyBoZXhUYWJsZVtjXTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4QzAgfCAoYyA+PiA2KV0gKyBoZXhUYWJsZVsweDgwIHwgKGMgJiAweDNGKV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID49IDB4RTAwMCkge1xuICAgICAgICAgICAgb3V0ID0gb3V0ICsgKGhleFRhYmxlWzB4RTAgfCAoYyA+PiAxMildICsgaGV4VGFibGVbMHg4MCB8ICgoYyA+PiA2KSAmIDB4M0YpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgYyA9IDB4MTAwMDAgKyAoKChjICYgMHgzRkYpIDw8IDEwKSB8IChzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4M0ZGKSk7XG4gICAgICAgIG91dCArPSBoZXhUYWJsZVsweEYwIHwgKGMgPj4gMTgpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDEyKSAmIDB4M0YpXVxuICAgICAgICAgICAgKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxudmFyIGNvbXBhY3QgPSBmdW5jdGlvbiBjb21wYWN0KHZhbHVlKSB7XG4gICAgdmFyIHF1ZXVlID0gW3sgb2JqOiB7IG86IHZhbHVlIH0sIHByb3A6ICdvJyB9XTtcbiAgICB2YXIgcmVmcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlW2ldO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwga2V5cy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICAgICAgICB2YXIgdmFsID0gb2JqW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmIHJlZnMuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goeyBvYmo6IG9iaiwgcHJvcDoga2V5IH0pO1xuICAgICAgICAgICAgICAgIHJlZnMucHVzaCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBhY3RRdWV1ZShxdWV1ZSk7XG59O1xuXG52YXIgaXNSZWdFeHAgPSBmdW5jdGlvbiBpc1JlZ0V4cChvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufTtcblxudmFyIGlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIob2JqKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICEhKG9iai5jb25zdHJ1Y3RvciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iaikpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgYXJyYXlUb09iamVjdDogYXJyYXlUb09iamVjdCxcbiAgICBhc3NpZ246IGFzc2lnbixcbiAgICBjb21wYWN0OiBjb21wYWN0LFxuICAgIGRlY29kZTogZGVjb2RlLFxuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGlzQnVmZmVyOiBpc0J1ZmZlcixcbiAgICBpc1JlZ0V4cDogaXNSZWdFeHAsXG4gICAgbWVyZ2U6IG1lcmdlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdkZWZhdWx0JzogJ1JGQzM5ODYnLFxuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgUkZDMTczODogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZS5jYWxsKHZhbHVlLCBwZXJjZW50VHdlbnRpZXMsICcrJyk7XG4gICAgICAgIH0sXG4gICAgICAgIFJGQzM5ODY6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiAnUkZDMTczOCcsXG4gICAgUkZDMzk4NjogJ1JGQzM5ODYnXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFycmF5TGltaXQ6IDIwLFxuICAgIGRlY29kZXI6IHV0aWxzLmRlY29kZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBkZXB0aDogNSxcbiAgICBwYXJhbWV0ZXJMaW1pdDogMTAwMCxcbiAgICBwbGFpbk9iamVjdHM6IGZhbHNlLFxuICAgIHN0cmljdE51bGxIYW5kbGluZzogZmFsc2Vcbn07XG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIHZhciBjbGVhblN0ciA9IG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPyBzdHIucmVwbGFjZSgvXlxcPy8sICcnKSA6IHN0cjtcbiAgICB2YXIgbGltaXQgPSBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSBJbmZpbml0eSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucGFyYW1ldGVyTGltaXQ7XG4gICAgdmFyIHBhcnRzID0gY2xlYW5TdHIuc3BsaXQob3B0aW9ucy5kZWxpbWl0ZXIsIGxpbWl0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcblxuICAgICAgICB2YXIgYnJhY2tldEVxdWFsc1BvcyA9IHBhcnQuaW5kZXhPZignXT0nKTtcbiAgICAgICAgdmFyIHBvcyA9IGJyYWNrZXRFcXVhbHNQb3MgPT09IC0xID8gcGFydC5pbmRleE9mKCc9JykgOiBicmFja2V0RXF1YWxzUG9zICsgMTtcblxuICAgICAgICB2YXIga2V5LCB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2Rlcik7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA/IG51bGwgOiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAsIHBvcyksIGRlZmF1bHRzLmRlY29kZXIpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UocG9zICsgMSksIGRlZmF1bHRzLmRlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXMuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gW10uY29uY2F0KG9ialtrZXldKS5jb25jYXQodmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ialtrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBwYXJzZU9iamVjdCA9IGZ1bmN0aW9uIChjaGFpbiwgdmFsLCBvcHRpb25zKSB7XG4gICAgdmFyIGxlYWYgPSB2YWw7XG5cbiAgICBmb3IgKHZhciBpID0gY2hhaW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIG9iajtcbiAgICAgICAgdmFyIHJvb3QgPSBjaGFpbltpXTtcblxuICAgICAgICBpZiAocm9vdCA9PT0gJ1tdJykge1xuICAgICAgICAgICAgb2JqID0gW107XG4gICAgICAgICAgICBvYmogPSBvYmouY29uY2F0KGxlYWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgICAgICAgICB2YXIgY2xlYW5Sb290ID0gcm9vdC5jaGFyQXQoMCkgPT09ICdbJyAmJiByb290LmNoYXJBdChyb290Lmxlbmd0aCAtIDEpID09PSAnXScgPyByb290LnNsaWNlKDEsIC0xKSA6IHJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChjbGVhblJvb3QsIDEwKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhaXNOYU4oaW5kZXgpXG4gICAgICAgICAgICAgICAgJiYgcm9vdCAhPT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgU3RyaW5nKGluZGV4KSA9PT0gY2xlYW5Sb290XG4gICAgICAgICAgICAgICAgJiYgaW5kZXggPj0gMFxuICAgICAgICAgICAgICAgICYmIChvcHRpb25zLnBhcnNlQXJyYXlzICYmIGluZGV4IDw9IG9wdGlvbnMuYXJyYXlMaW1pdClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG9iaiA9IFtdO1xuICAgICAgICAgICAgICAgIG9ialtpbmRleF0gPSBsZWFmO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvYmpbY2xlYW5Sb290XSA9IGxlYWY7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZWFmID0gb2JqO1xuICAgIH1cblxuICAgIHJldHVybiBsZWFmO1xufTtcblxudmFyIHBhcnNlS2V5cyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdLZXlzKGdpdmVuS2V5LCB2YWwsIG9wdGlvbnMpIHtcbiAgICBpZiAoIWdpdmVuS2V5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFuc2Zvcm0gZG90IG5vdGF0aW9uIHRvIGJyYWNrZXQgbm90YXRpb25cbiAgICB2YXIga2V5ID0gb3B0aW9ucy5hbGxvd0RvdHMgPyBnaXZlbktleS5yZXBsYWNlKC9cXC4oW14uW10rKS9nLCAnWyQxXScpIDogZ2l2ZW5LZXk7XG5cbiAgICAvLyBUaGUgcmVnZXggY2h1bmtzXG5cbiAgICB2YXIgYnJhY2tldHMgPSAvKFxcW1teW1xcXV0qXSkvO1xuICAgIHZhciBjaGlsZCA9IC8oXFxbW15bXFxdXSpdKS9nO1xuXG4gICAgLy8gR2V0IHRoZSBwYXJlbnRcblxuICAgIHZhciBzZWdtZW50ID0gYnJhY2tldHMuZXhlYyhrZXkpO1xuICAgIHZhciBwYXJlbnQgPSBzZWdtZW50ID8ga2V5LnNsaWNlKDAsIHNlZ21lbnQuaW5kZXgpIDoga2V5O1xuXG4gICAgLy8gU3Rhc2ggdGhlIHBhcmVudCBpZiBpdCBleGlzdHNcblxuICAgIHZhciBrZXlzID0gW107XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICAvLyBJZiB3ZSBhcmVuJ3QgdXNpbmcgcGxhaW4gb2JqZWN0cywgb3B0aW9uYWxseSBwcmVmaXgga2V5c1xuICAgICAgICAvLyB0aGF0IHdvdWxkIG92ZXJ3cml0ZSBvYmplY3QgcHJvdG90eXBlIHByb3BlcnRpZXNcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBwYXJlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAga2V5cy5wdXNoKHBhcmVudCk7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGNoaWxkcmVuIGFwcGVuZGluZyB0byB0aGUgYXJyYXkgdW50aWwgd2UgaGl0IGRlcHRoXG5cbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKChzZWdtZW50ID0gY2hpbGQuZXhlYyhrZXkpKSAhPT0gbnVsbCAmJiBpIDwgb3B0aW9ucy5kZXB0aCkge1xuICAgICAgICBpICs9IDE7XG4gICAgICAgIGlmICghb3B0aW9ucy5wbGFpbk9iamVjdHMgJiYgaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc2VnbWVudFsxXS5zbGljZSgxLCAtMSkpKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuYWxsb3dQcm90b3R5cGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleXMucHVzaChzZWdtZW50WzFdKTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSdzIGEgcmVtYWluZGVyLCBqdXN0IGFkZCB3aGF0ZXZlciBpcyBsZWZ0XG5cbiAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICBrZXlzLnB1c2goJ1snICsga2V5LnNsaWNlKHNlZ21lbnQuaW5kZXgpICsgJ10nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VPYmplY3Qoa2V5cywgdmFsLCBvcHRpb25zKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuICAgIHZhciBvcHRpb25zID0gb3B0cyA/IHV0aWxzLmFzc2lnbih7fSwgb3B0cykgOiB7fTtcblxuICAgIGlmIChvcHRpb25zLmRlY29kZXIgIT09IG51bGwgJiYgb3B0aW9ucy5kZWNvZGVyICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuZGVjb2RlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdEZWNvZGVyIGhhcyB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPSBvcHRpb25zLmlnbm9yZVF1ZXJ5UHJlZml4ID09PSB0cnVlO1xuICAgIG9wdGlvbnMuZGVsaW1pdGVyID0gdHlwZW9mIG9wdGlvbnMuZGVsaW1pdGVyID09PSAnc3RyaW5nJyB8fCB1dGlscy5pc1JlZ0V4cChvcHRpb25zLmRlbGltaXRlcikgPyBvcHRpb25zLmRlbGltaXRlciA6IGRlZmF1bHRzLmRlbGltaXRlcjtcbiAgICBvcHRpb25zLmRlcHRoID0gdHlwZW9mIG9wdGlvbnMuZGVwdGggPT09ICdudW1iZXInID8gb3B0aW9ucy5kZXB0aCA6IGRlZmF1bHRzLmRlcHRoO1xuICAgIG9wdGlvbnMuYXJyYXlMaW1pdCA9IHR5cGVvZiBvcHRpb25zLmFycmF5TGltaXQgPT09ICdudW1iZXInID8gb3B0aW9ucy5hcnJheUxpbWl0IDogZGVmYXVsdHMuYXJyYXlMaW1pdDtcbiAgICBvcHRpb25zLnBhcnNlQXJyYXlzID0gb3B0aW9ucy5wYXJzZUFycmF5cyAhPT0gZmFsc2U7XG4gICAgb3B0aW9ucy5kZWNvZGVyID0gdHlwZW9mIG9wdGlvbnMuZGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMuZGVjb2RlciA6IGRlZmF1bHRzLmRlY29kZXI7XG4gICAgb3B0aW9ucy5hbGxvd0RvdHMgPSB0eXBlb2Ygb3B0aW9ucy5hbGxvd0RvdHMgPT09ICdib29sZWFuJyA/IG9wdGlvbnMuYWxsb3dEb3RzIDogZGVmYXVsdHMuYWxsb3dEb3RzO1xuICAgIG9wdGlvbnMucGxhaW5PYmplY3RzID0gdHlwZW9mIG9wdGlvbnMucGxhaW5PYmplY3RzID09PSAnYm9vbGVhbicgPyBvcHRpb25zLnBsYWluT2JqZWN0cyA6IGRlZmF1bHRzLnBsYWluT2JqZWN0cztcbiAgICBvcHRpb25zLmFsbG93UHJvdG90eXBlcyA9IHR5cGVvZiBvcHRpb25zLmFsbG93UHJvdG90eXBlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMgOiBkZWZhdWx0cy5hbGxvd1Byb3RvdHlwZXM7XG4gICAgb3B0aW9ucy5wYXJhbWV0ZXJMaW1pdCA9IHR5cGVvZiBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdGlvbnMucGFyYW1ldGVyTGltaXQgOiBkZWZhdWx0cy5wYXJhbWV0ZXJMaW1pdDtcbiAgICBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA9IHR5cGVvZiBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmc7XG5cbiAgICBpZiAoc3RyID09PSAnJyB8fCBzdHIgPT09IG51bGwgfHwgdHlwZW9mIHN0ciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIH1cblxuICAgIHZhciB0ZW1wT2JqID0gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgPyBwYXJzZVZhbHVlcyhzdHIsIG9wdGlvbnMpIDogc3RyO1xuICAgIHZhciBvYmogPSBvcHRpb25zLnBsYWluT2JqZWN0cyA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiB7fTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUga2V5cyBhbmQgc2V0dXAgdGhlIG5ldyBvYmplY3RcblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGVtcE9iaik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgICAgICB2YXIgbmV3T2JqID0gcGFyc2VLZXlzKGtleSwgdGVtcE9ialtrZXldLCBvcHRpb25zKTtcbiAgICAgICAgb2JqID0gdXRpbHMubWVyZ2Uob2JqLCBuZXdPYmosIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1dGlscy5jb21wYWN0KG9iaik7XG59O1xuIiwiaW1wb3J0IHJlcXVlc3QgZnJvbSAnQC91dGlscy9yZXF1ZXN0J1xyXG5jb25zdCBzZXJ2aWNlVGl0bGUgPSAnL2ltZydcclxuLy9HRVQg5Lyg5Y+C6ZyA6KaB55SoIHBhcmFtc1xyXG4vL1BPU1Qg5Lyg5Y+C6ZyA6KaB55SoIGRhdGFcclxuXHJcbi8v6I635Y+WYmFubmVy5YiX6KGoXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRCYW5uZXJMaXN0KCkge1xyXG5cdHJldHVybiByZXF1ZXN0KHtcclxuXHRcdHVybDogYCR7c2VydmljZVRpdGxlfS9pbWcvbWluaS90aWt0b2svbGlzdEJhbm5lcmAsXHJcblx0XHRtZXRob2Q6ICdnZXQnXHJcblx0fSlcclxufVxyXG4vL+iOt+WPluWwj+eoi+W6j+eUqOaIt+WbvueJh+WIl+ihqFxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlckltZ0xpc3QoKSB7XHJcblx0cmV0dXJuIHJlcXVlc3Qoe1xyXG5cdFx0dXJsOiBgJHtzZXJ2aWNlVGl0bGV9L2ltZy9taW5pL3Rpa3Rvay90aWt0b2tVc2VySW1nc2AsXHJcblx0XHRtZXRob2Q6ICdnZXQnXHJcblx0fSlcclxufVxyXG4vLyDojrflj5blm77niYfor6bmg4VcclxuZXhwb3J0IGZ1bmN0aW9uIGRldGFpbHNUaWt0b2tJbWcoZGF0YSkge1xyXG5cdHJldHVybiByZXF1ZXN0KHtcclxuXHRcdHVybDogYCR7c2VydmljZVRpdGxlfS9pbWcvbWluaS90aWt0b2svZGV0YWlsc1Rpa3Rva0ltZy8ke2RhdGF9YCxcclxuXHRcdG1ldGhvZDogJ2dldCdcclxuXHR9KVxyXG59XHJcbi8vIOafpeivouaYr+WQpueCuei1nui/h1xyXG5leHBvcnQgZnVuY3Rpb24ganVkZ2VUaWt0b2tMaWtlKGRhdGEpIHtcclxuXHRyZXR1cm4gcmVxdWVzdCh7XHJcblx0XHR1cmw6IGAke3NlcnZpY2VUaXRsZX0vaW1nL21pbmkvdGlrdG9rL2p1ZGdlVGlrdG9rTGlrZWAsXHJcblx0XHRtZXRob2Q6ICdwb3N0JyxcclxuXHRcdGRhdGFcclxuXHR9KVxyXG59XHJcbi8vIOafpeivouaYr+WQpuaUtuiXj+i/h1xyXG5leHBvcnQgZnVuY3Rpb24ganVkZ2VUaWt0b2tDb2xsZWN0KGRhdGEpIHtcclxuXHRyZXR1cm4gcmVxdWVzdCh7XHJcblx0XHR1cmw6IGAke3NlcnZpY2VUaXRsZX0vaW1nL21pbmkvdGlrdG9rL2p1ZGdlVGlrdG9rQ29sbGVjdGAsXHJcblx0XHRtZXRob2Q6ICdwb3N0JyxcclxuXHRcdGRhdGFcclxuXHR9KVxyXG59XHJcbi8vIOeCuei1nlxyXG5leHBvcnQgZnVuY3Rpb24gdGlrdG9rTGlrZShkYXRhKSB7XHJcblx0cmV0dXJuIHJlcXVlc3Qoe1xyXG5cdFx0dXJsOiBgJHtzZXJ2aWNlVGl0bGV9L2ltZy9taW5pL3Rpa3Rvay90aWt0b2tMaWtlYCxcclxuXHRcdG1ldGhvZDogJ3Bvc3QnLFxyXG5cdFx0ZGF0YVxyXG5cdH0pXHJcbn1cclxuLy8g5Y+W5raI54K56LWeXHJcbmV4cG9ydCBmdW5jdGlvbiB0aWt0b2tVbkxpa2UoZGF0YSkge1xyXG5cdHJldHVybiByZXF1ZXN0KHtcclxuXHRcdHVybDogYCR7c2VydmljZVRpdGxlfS9pbWcvbWluaS90aWt0b2svdGlrdG9rVW5MaWtlYCxcclxuXHRcdG1ldGhvZDogJ3Bvc3QnLFxyXG5cdFx0ZGF0YVxyXG5cdH0pXHJcbn1cclxuLy8g5pS26JePXHJcbmV4cG9ydCBmdW5jdGlvbiB0aWt0b2tDb2xsZWN0KGRhdGEpIHtcclxuXHRyZXR1cm4gcmVxdWVzdCh7XHJcblx0XHR1cmw6IGAke3NlcnZpY2VUaXRsZX0vaW1nL21pbmkvdGlrdG9rL3Rpa3Rva0NvbGxlY3RgLFxyXG5cdFx0bWV0aG9kOiAncG9zdCcsXHJcblx0XHRkYXRhXHJcblx0fSlcclxufVxyXG4vLyDlj5bmtojmlLbol49cclxuZXhwb3J0IGZ1bmN0aW9uIHRpa3Rva1VuQ29sbGVjdChkYXRhKSB7XHJcblx0cmV0dXJuIHJlcXVlc3Qoe1xyXG5cdFx0dXJsOiBgJHtzZXJ2aWNlVGl0bGV9L2ltZy9taW5pL3Rpa3Rvay90aWt0b2tVbkNvbGxlY3RgLFxyXG5cdFx0bWV0aG9kOiAncG9zdCcsXHJcblx0XHRkYXRhXHJcblx0fSlcclxufSIsImltcG9ydCByZXF1ZXN0IGZyb20gJ0AvdXRpbHMvcmVxdWVzdCdcclxuY29uc3Qgc2VydmljZVRpdGxlID0gJy9pbWcnXHJcbi8vR0VUIOS8oOWPgumcgOimgeeUqCBwYXJhbXNcclxuLy9QT1NUIOS8oOWPgumcgOimgeeUqCBkYXRhXHJcblxyXG4vL+iOt+WPlueUqOaIt+aUtuiXj+WIl+ihqFxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sbGVjdGlvbkxpc3QoZGF0YSkge1xyXG5cdHJldHVybiByZXF1ZXN0KHtcclxuXHRcdHVybDogYCR7c2VydmljZVRpdGxlfS9pbWcvbWluaS90aWt0b2svbGlzdFRpa3Rva0NvbGxlY3Rpb25gLFxyXG5cdFx0bWV0aG9kOiAncG9zdCcsXHJcblx0XHRkYXRhOiBkYXRhXHJcblx0fSlcclxufVxyXG4iLCJpbXBvcnQgZW4gZnJvbSAnLi9lbi5qc29uJ1xyXG5pbXBvcnQgemhIYW5zIGZyb20gJy4vemgtSGFucy5qc29uJ1xyXG5pbXBvcnQgemhIYW50IGZyb20gJy4vemgtSGFudC5qc29uJ1xyXG5leHBvcnQgZGVmYXVsdCB7XHJcblx0ZW4sXHJcblx0J3poLUhhbnMnOiB6aEhhbnMsXHJcblx0J3poLUhhbnQnOiB6aEhhbnRcclxufVxyXG4iLCJleHBvcnQgZGVmYXVsdCB7XHJcbiAgXCJpZFwiOiBcIjI4NTI2MzdcIixcclxuICBcIm5hbWVcIjogXCJ1bml1aeWbvuagh+W6k1wiLFxyXG4gIFwiZm9udF9mYW1pbHlcIjogXCJ1bmlpY29uc1wiLFxyXG4gIFwiY3NzX3ByZWZpeF90ZXh0XCI6IFwidW5pdWktXCIsXHJcbiAgXCJkZXNjcmlwdGlvblwiOiBcIlwiLFxyXG4gIFwiZ2x5cGhzXCI6IFtcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjUwMjcwNDlcIixcclxuICAgICAgXCJuYW1lXCI6IFwieWFuc2VcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiY29sb3JcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZjZlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA4N1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjUwMjcwNDhcIixcclxuICAgICAgXCJuYW1lXCI6IFwid2FsbGV0XCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcIndhbGxldFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmIxXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDU3XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNTAxNTcyMFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJzZXR0aW5ncy1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwic2V0dGluZ3MtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2Y2VcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwODZcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI1MDE1NDM0XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInNoaW1pbmdyZW56aGVuZy1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiYXV0aC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZjY1wiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA4NFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MzQyNDZcIixcclxuICAgICAgXCJuYW1lXCI6IFwic2hvcC1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwic2hvcC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZjZFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA4NVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MzQxNTlcIixcclxuICAgICAgXCJuYW1lXCI6IFwic3RhZmYtZmlsbGVkLTAxXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInN0YWZmLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmNiXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDgzXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkzMjQ2MVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJWSVAtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInZpcC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZjNlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA3OFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MzI0NjJcIixcclxuICAgICAgXCJuYW1lXCI6IFwicGx1c19jaXJjbGVfZmlsbFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJwbHVzLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmM3XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDc5XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkzMjQ2M1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJmb2xkZXJfYWRkLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJmb2xkZXItYWRkLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmM4XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDgwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkzMjQ2NFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJ5YW5zZS1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiY29sb3ItZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YzlcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwODFcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTMyNDY1XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInR1bmUtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInR1bmUtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2Y2FcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwODJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTMyNDU1XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImEtcmlsaWRha2EtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNhbGVuZGFyLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmMwXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDcyXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkzMjQ1NlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJub3RpZmljYXRpb24tZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcIm5vdGlmaWNhdGlvbi1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZjMVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA3M1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MzI0NTdcIixcclxuICAgICAgXCJuYW1lXCI6IFwid2FsbGV0LWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJ3YWxsZXQtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YzJcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNzRcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTMyNDU4XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInBhaWhhbmdiYW5nLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJtZWRhbC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZjM1wiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA3NVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MzI0NTlcIixcclxuICAgICAgXCJuYW1lXCI6IFwiZ2lmdC1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiZ2lmdC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZjNFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA3NlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MzI0NjBcIixcclxuICAgICAgXCJuYW1lXCI6IFwiZmlyZS1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiZmlyZS1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZjNVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA3N1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MjgwMDFcIixcclxuICAgICAgXCJuYW1lXCI6IFwicmVmcmVzaGVtcHR5XCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInJlZnJlc2hlbXB0eVwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmJmXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDcxXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyNjg1M1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJsb2NhdGlvbi1lbGxpcHNlXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImxvY2F0aW9uLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmFmXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDU1XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyNjczNVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJwZXJzb24tZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInBlcnNvbi1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY5ZFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAzN1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MjY3MDNcIixcclxuICAgICAgXCJuYW1lXCI6IFwicGVyc29uYWRkLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJwZXJzb25hZGQtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2OThcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMzJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMzUxXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImJhY2tcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiYmFja1wiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmI5XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDY1XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzM1MlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJmb3J3YXJkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImZvcndhcmRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZiYVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA2NlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MjMzNTNcIixcclxuICAgICAgXCJuYW1lXCI6IFwiYXJyb3d0aGlucmlnaHRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiYXJyb3ctcmlnaHRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZiYlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA2N1xyXG4gICAgfSxcclxuXHRcdHtcclxuXHRcdCAgXCJpY29uX2lkXCI6IFwiMjQ5MjMzNTNcIixcclxuXHRcdCAgXCJuYW1lXCI6IFwiYXJyb3d0aGlucmlnaHRcIixcclxuXHRcdCAgXCJmb250X2NsYXNzXCI6IFwiYXJyb3d0aGlucmlnaHRcIixcclxuXHRcdCAgXCJ1bmljb2RlXCI6IFwiZTZiYlwiLFxyXG5cdFx0ICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA2N1xyXG5cdFx0fSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MjMzNTRcIixcclxuICAgICAgXCJuYW1lXCI6IFwiYXJyb3d0aGlubGVmdFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJhcnJvdy1sZWZ0XCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YmNcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNjhcclxuICAgIH0sXHJcblx0XHR7XHJcblx0XHQgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMzU0XCIsXHJcblx0XHQgIFwibmFtZVwiOiBcImFycm93dGhpbmxlZnRcIixcclxuXHRcdCAgXCJmb250X2NsYXNzXCI6IFwiYXJyb3d0aGlubGVmdFwiLFxyXG5cdFx0ICBcInVuaWNvZGVcIjogXCJlNmJjXCIsXHJcblx0XHQgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDY4XHJcblx0XHR9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzM1NVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJhcnJvd3RoaW51cFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJhcnJvdy11cFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmJkXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDY5XHJcbiAgICB9LFxyXG5cdFx0e1xyXG5cdFx0ICBcImljb25faWRcIjogXCIyNDkyMzM1NVwiLFxyXG5cdFx0ICBcIm5hbWVcIjogXCJhcnJvd3RoaW51cFwiLFxyXG5cdFx0ICBcImZvbnRfY2xhc3NcIjogXCJhcnJvd3RoaW51cFwiLFxyXG5cdFx0ICBcInVuaWNvZGVcIjogXCJlNmJkXCIsXHJcblx0XHQgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDY5XHJcblx0XHR9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzM1NlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJhcnJvd3RoaW5kb3duXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImFycm93LWRvd25cIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZiZVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA3MFxyXG4gICAgfSx7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMzU2XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImFycm93dGhpbmRvd25cIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiYXJyb3d0aGluZG93blwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmJlXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDcwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzM0OVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJhcnJvd2Rvd25cIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiYm90dG9tXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YjhcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNjRcclxuICAgIH0se1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzM0OVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJhcnJvd2Rvd25cIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiYXJyb3dkb3duXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YjhcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNjRcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMzQ2XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImFycm93cmlnaHRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwicmlnaHRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZiNVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA2MVxyXG4gICAgfSxcclxuXHRcdHtcclxuXHRcdCAgXCJpY29uX2lkXCI6IFwiMjQ5MjMzNDZcIixcclxuXHRcdCAgXCJuYW1lXCI6IFwiYXJyb3dyaWdodFwiLFxyXG5cdFx0ICBcImZvbnRfY2xhc3NcIjogXCJhcnJvd3JpZ2h0XCIsXHJcblx0XHQgIFwidW5pY29kZVwiOiBcImU2YjVcIixcclxuXHRcdCAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNjFcclxuXHRcdH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMzQ3XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImFycm93dXBcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwidG9wXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YjZcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNjJcclxuICAgIH0sXHJcblx0XHR7XHJcblx0XHQgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMzQ3XCIsXHJcblx0XHQgIFwibmFtZVwiOiBcImFycm93dXBcIixcclxuXHRcdCAgXCJmb250X2NsYXNzXCI6IFwiYXJyb3d1cFwiLFxyXG5cdFx0ICBcInVuaWNvZGVcIjogXCJlNmI2XCIsXHJcblx0XHQgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDYyXHJcblx0XHR9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzM0OFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJhcnJvd2xlZnRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibGVmdFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmI3XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDYzXHJcbiAgICB9LFxyXG5cdFx0e1xyXG5cdFx0ICBcImljb25faWRcIjogXCIyNDkyMzM0OFwiLFxyXG5cdFx0ICBcIm5hbWVcIjogXCJhcnJvd2xlZnRcIixcclxuXHRcdCAgXCJmb250X2NsYXNzXCI6IFwiYXJyb3dsZWZ0XCIsXHJcblx0XHQgIFwidW5pY29kZVwiOiBcImU2YjdcIixcclxuXHRcdCAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNjNcclxuXHRcdH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMzM0XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImV5ZVwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJleWVcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY1MVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk2MVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MjMzMzVcIixcclxuICAgICAgXCJuYW1lXCI6IFwiZXllLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJleWUtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NmFcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5ODZcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMzM2XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImV5ZS1zbGFzaFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJleWUtc2xhc2hcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZiM1wiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA1OVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MjMzMzdcIixcclxuICAgICAgXCJuYW1lXCI6IFwiZXllLXNsYXNoLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJleWUtc2xhc2gtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YjRcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNjBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMzA1XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImluZm8tZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImluZm8tZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NDlcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NTNcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMjk5XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInJlbG9hZC0wMVwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJyZWxvYWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZiMlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA1OFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MjMxOTVcIixcclxuICAgICAgXCJuYW1lXCI6IFwibWljX3NsYXNoX2ZpbGxcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibWljb2ZmLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmIwXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDU2XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzE2NVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJtYXAtcGluLWVsbGlwc2VcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibWFwLXBpbi1lbGxpcHNlXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YWNcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNTJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0OTIzMTY2XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcIm1hcC1waW5cIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibWFwLXBpblwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmFkXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDUzXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzE2N1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJsb2NhdGlvblwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJsb2NhdGlvblwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmFlXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDU0XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzA2NFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJzdGFyaGFsZlwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJzdGFyaGFsZlwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjgzXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDExXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDkyMzA2NVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJzdGFyXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInN0YXJcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY4OFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAxNlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ5MjMwNjZcIixcclxuICAgICAgXCJuYW1lXCI6IFwic3Rhci1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwic3Rhci1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY4ZlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAyM1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk2NDZcIixcclxuICAgICAgXCJuYW1lXCI6IFwiYS1yaWxpZGFrYVwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJjYWxlbmRhclwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmEwXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDQwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg5OTY0N1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJmaXJlXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImZpcmVcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZhMVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA0MVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk2NDhcIixcclxuICAgICAgXCJuYW1lXCI6IFwicGFpaGFuZ2JhbmdcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibWVkYWxcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZhMlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA0MlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk2NDlcIixcclxuICAgICAgXCJuYW1lXCI6IFwiZm9udFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJmb250XCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YTNcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNDNcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODk5NjUwXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImdpZnRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiZ2lmdFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmE0XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDQ0XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg5OTY1MVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJsaW5rXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImxpbmtcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZhNVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA0NVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk2NTJcIixcclxuICAgICAgXCJuYW1lXCI6IFwibm90aWZpY2F0aW9uXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcIm5vdGlmaWNhdGlvblwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmE2XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDQ2XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg5OTY1M1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJzdGFmZlwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJzdGFmZlwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmE3XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDQ3XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg5OTY1NFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJWSVBcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwidmlwXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2YThcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwNDhcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODk5NjU1XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImZvbGRlcl9hZGRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiZm9sZGVyLWFkZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNmE5XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDQ5XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg5OTY1NlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJ0dW5lXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInR1bmVcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZhYVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA1MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk2NTdcIixcclxuICAgICAgXCJuYW1lXCI6IFwic2hpbWluZ3JlbnpoZW5nXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImF1dGhcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTZhYlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTA1MVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk1NjVcIixcclxuICAgICAgXCJuYW1lXCI6IFwicGVyc29uXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInBlcnNvblwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjk5XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDMzXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg5OTU2NlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJlbWFpbC1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiZW1haWwtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2OWFcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMzRcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODk5NTY3XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInBob25lLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJwaG9uZS1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY5YlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAzNVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk1NjhcIixcclxuICAgICAgXCJuYW1lXCI6IFwicGhvbmVcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwicGhvbmVcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY5Y1wiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAzNlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk1NzBcIixcclxuICAgICAgXCJuYW1lXCI6IFwiZW1haWxcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiZW1haWxcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY5ZVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAzOFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk1NzFcIixcclxuICAgICAgXCJuYW1lXCI6IFwicGVyc29uYWRkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInBlcnNvbmFkZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjlmXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDM5XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg5OTU1OFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJjaGF0Ym94ZXMtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNoYXRib3hlcy1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY5MlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAyNlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk1NTlcIixcclxuICAgICAgXCJuYW1lXCI6IFwiY29udGFjdFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJjb250YWN0XCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2OTNcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMjdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODk5NTYwXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNoYXRidWJibGUtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNoYXRidWJibGUtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2OTRcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMjhcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODk5NTYxXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNvbnRhY3QtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNvbnRhY3QtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2OTVcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMjlcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODk5NTYyXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNoYXRib3hlc1wiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJjaGF0Ym94ZXNcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY5NlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAzMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4OTk1NjNcIixcclxuICAgICAgXCJuYW1lXCI6IFwiY2hhdGJ1YmJsZVwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJjaGF0YnViYmxlXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2OTdcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMzFcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODgxMjkwXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInVwbG9hZC1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwidXBsb2FkLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjhlXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDIyXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg4MTI5MlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJ1cGxvYWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwidXBsb2FkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2OTBcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMjRcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODgxMjkzXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcIndlaXhpblwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJ3ZWl4aW5cIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY5MVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAyNVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4ODEyNzRcIixcclxuICAgICAgXCJuYW1lXCI6IFwiY29tcG9zZVwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJjb21wb3NlXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2N2ZcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMDdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODgxMjc1XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInFxXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInFxXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2ODBcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMDhcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODgxMjc2XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImRvd25sb2FkLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJkb3dubG9hZC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY4MVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAwOVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4ODEyNzdcIixcclxuICAgICAgXCJuYW1lXCI6IFwicGVuZ3lvdXF1YW5cIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwicHlxXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2ODJcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMTBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODgxMjc5XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInNvdW5kXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInNvdW5kXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2ODRcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMTJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODgxMjgwXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInRyYXNoLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJ0cmFzaC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY4NVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAxM1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4ODEyODFcIixcclxuICAgICAgXCJuYW1lXCI6IFwic291bmQtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInNvdW5kLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjg2XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDE0XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg4MTI4MlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJ0cmFzaFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJ0cmFzaFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjg3XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDE1XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg4MTI4NFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJ2aWRlb2NhbS1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwidmlkZW9jYW0tZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2ODlcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMTdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODgxMjg1XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInNwaW5uZXItY3ljbGVcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwic3Bpbm5lci1jeWNsZVwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjhhXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDE4XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg4MTI4NlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJ3ZWlib1wiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJ3ZWlib1wiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjhiXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDE5XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg4MTI4OFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJ2aWRlb2NhbVwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJ2aWRlb2NhbVwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjhjXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDIwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg4MTI4OVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJkb3dubG9hZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJkb3dubG9hZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjhkXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDIxXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg3OTYwMVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJoZWxwXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImhlbHBcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY3OVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAwMVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk2MDJcIixcclxuICAgICAgXCJuYW1lXCI6IFwibmF2aWdhdGUtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcIm5hdmlnYXRlLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjdhXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDAyXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg3OTYwM1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJwbHVzZW1wdHlcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwicGx1c2VtcHR5XCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2N2JcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMDNcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODc5NjA0XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInNtYWxsY2lyY2xlXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInNtYWxsY2lyY2xlXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2N2NcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMDRcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODc5NjA1XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcIm1pbnVzLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJtaW51cy1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY3ZFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1OTAwNVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk2MDZcIixcclxuICAgICAgXCJuYW1lXCI6IFwibWljb2ZmXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcIm1pY29mZlwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjdlXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU5MDA2XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg3OTU4OFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJjbG9zZWVtcHR5XCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNsb3NlZW1wdHlcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY2Y1wiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk4OFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk1ODlcIixcclxuICAgICAgXCJuYW1lXCI6IFwiY2xlYXJcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiY2xlYXJcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY2ZFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk4OVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk1OTBcIixcclxuICAgICAgXCJuYW1lXCI6IFwibmF2aWdhdGVcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibmF2aWdhdGVcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY2ZVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk5MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk1OTFcIixcclxuICAgICAgXCJuYW1lXCI6IFwibWludXNcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibWludXNcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY2ZlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk5MVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk1OTJcIixcclxuICAgICAgXCJuYW1lXCI6IFwiaW1hZ2VcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiaW1hZ2VcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY3MFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk5MlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk1OTNcIixcclxuICAgICAgXCJuYW1lXCI6IFwibWljXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcIm1pY1wiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjcxXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTkzXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg3OTU5NFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJwYXBlcnBsYW5lXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInBhcGVycGxhbmVcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY3MlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk5NFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk1OTVcIixcclxuICAgICAgXCJuYW1lXCI6IFwiY2xvc2VcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiY2xvc2VcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY3M1wiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk5NVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk1OTZcIixcclxuICAgICAgXCJuYW1lXCI6IFwiaGVscC1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiaGVscC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY3NFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk5NlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk1OTdcIixcclxuICAgICAgXCJuYW1lXCI6IFwicGx1cy1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwicGFwZXJwbGFuZS1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY3NVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk5N1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4Nzk1OThcIixcclxuICAgICAgXCJuYW1lXCI6IFwicGx1c1wiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJwbHVzXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NzZcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5OThcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODc5NTk5XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcIm1pYy1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibWljLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjc3XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTk5XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg3OTYwMFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJpbWFnZS1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiaW1hZ2UtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NzhcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTkwMDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1OTAwXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImxvY2tlZC1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibG9ja2VkLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjY4XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTg0XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTkwMVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJpbmZvXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImluZm9cIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY2OVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk4NVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU5MDNcIixcclxuICAgICAgXCJuYW1lXCI6IFwibG9ja2VkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImxvY2tlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjZiXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTg3XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTg4NFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJjYW1lcmEtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNhbWVyYS1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY1OFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk2OFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU4ODVcIixcclxuICAgICAgXCJuYW1lXCI6IFwiY2hhdC1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiY2hhdC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY1OVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk2OVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU4ODZcIixcclxuICAgICAgXCJuYW1lXCI6IFwiY2FtZXJhXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNhbWVyYVwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjVhXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTcwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTg4N1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJjaXJjbGVcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiY2lyY2xlXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NWJcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NzFcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODg4XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNoZWNrbWFya2VtcHR5XCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNoZWNrbWFya2VtcHR5XCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NWNcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NzJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODg5XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNoYXRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiY2hhdFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjVkXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTczXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTg5MFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJjaXJjbGUtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNpcmNsZS1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY1ZVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk3NFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU4OTFcIixcclxuICAgICAgXCJuYW1lXCI6IFwiZmxhZ1wiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJmbGFnXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NWZcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NzVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODkyXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImZsYWctZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImZsYWctZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NjBcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NzZcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODkzXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImdlYXItZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImdlYXItZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NjFcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NzdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODk0XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImhvbWVcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiaG9tZVwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjYyXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTc4XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTg5NVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJob21lLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJob21lLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjYzXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTc5XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTg5NlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJnZWFyXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImdlYXJcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY2NFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk4MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU4OTdcIixcclxuICAgICAgXCJuYW1lXCI6IFwic21hbGxjaXJjbGUtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInNtYWxsY2lyY2xlLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjY1XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTgxXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTg5OFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJtYXAtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcIm1hcC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY2NlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk4MlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU4OTlcIixcclxuICAgICAgXCJuYW1lXCI6IFwibWFwXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcIm1hcFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjY3XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTgzXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTgyNVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJyZWZyZXNoLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJyZWZyZXNoLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjU2XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTY2XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTgyNlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJyZWZyZXNoXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInJlZnJlc2hcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY1N1wiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk2N1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU4MDhcIixcclxuICAgICAgXCJuYW1lXCI6IFwiY2xvdWQtdXBsb2FkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNsb3VkLXVwbG9hZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjQ1XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTQ5XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTgwOVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJjbG91ZC1kb3dubG9hZC1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiY2xvdWQtZG93bmxvYWQtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NDZcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NTBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODEwXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNsb3VkLWRvd25sb2FkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNsb3VkLWRvd25sb2FkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NDdcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NTFcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODExXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNsb3VkLXVwbG9hZC1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiY2xvdWQtdXBsb2FkLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjQ4XCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTUyXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTgxM1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJyZWRvXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInJlZG9cIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY0YVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk1NFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU4MTRcIixcclxuICAgICAgXCJuYW1lXCI6IFwiaW1hZ2VzLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJpbWFnZXMtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NGJcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NTVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODE1XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInVuZG8tZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInVuZG8tZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NGNcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NTZcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODE2XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcIm1vcmVcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibW9yZVwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjRkXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTU3XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTgxN1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJtb3JlLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJtb3JlLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjRlXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTU4XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTgxOFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJ1bmRvXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInVuZG9cIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY0ZlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk1OVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU4MTlcIixcclxuICAgICAgXCJuYW1lXCI6IFwiaW1hZ2VzXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImltYWdlc1wiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjUwXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTYwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg1NTgyMVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJwYXBlcmNsaXBcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwicGFwZXJjbGlwXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NTJcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NjJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODIyXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInNldHRpbmdzXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInNldHRpbmdzXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NTNcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NjNcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODU1ODIzXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcInNlYXJjaFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJzZWFyY2hcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY1NFwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk2NFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NTU4MjRcIixcclxuICAgICAgXCJuYW1lXCI6IFwicmVkby1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwicmVkby1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTY1NVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk2NVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NDE3MDJcIixcclxuICAgICAgXCJuYW1lXCI6IFwibGlzdFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJsaXN0XCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NDRcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NDhcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODQxNDg5XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcIm1haWwtb3Blbi1maWxsZWRcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibWFpbC1vcGVuLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjNhXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTM4XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg0MTQ5MVwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJoYW5kLXRodW1ic2Rvd24tZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImhhbmQtZG93bi1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTYzY1wiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk0MFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NDE0OTJcIixcclxuICAgICAgXCJuYW1lXCI6IFwiaGFuZC10aHVtYnNkb3duXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImhhbmQtZG93blwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjNkXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTQxXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg0MTQ5M1wiLFxyXG4gICAgICBcIm5hbWVcIjogXCJoYW5kLXRodW1ic3VwLWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJoYW5kLXVwLWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjNlXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTQyXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg0MTQ5NFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJoYW5kLXRodW1ic3VwXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImhhbmQtdXBcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTYzZlwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODk0M1xyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4NDE0OTZcIixcclxuICAgICAgXCJuYW1lXCI6IFwiaGVhcnQtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImhlYXJ0LWZpbGxlZFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjQxXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTQ1XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDg0MTQ5OFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJtYWlsLW9wZW5cIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibWFpbC1vcGVuXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2NDNcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5NDdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODQxNDg4XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImhlYXJ0XCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImhlYXJ0XCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2MzlcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5MzdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODM5OTYzXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImxvb3BcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwibG9vcFwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjMzXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTMxXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDgzOTg2NlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJwdWxsZG93blwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJwdWxsZG93blwiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjMyXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTMwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDgxMzc5OFwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJzY2FuXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcInNjYW5cIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTYyYVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODkyMlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4MTM3ODZcIixcclxuICAgICAgXCJuYW1lXCI6IFwiYmFyc1wiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJiYXJzXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2MjdcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5MTlcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODEzNzg4XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNhcnQtZmlsbGVkXCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNhcnQtZmlsbGVkXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2MjlcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5MjFcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODEzNzkwXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNoZWNrYm94XCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNoZWNrYm94XCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2MmJcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5MjNcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODEzNzkxXCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImNoZWNrYm94LWZpbGxlZFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJjaGVja2JveC1maWxsZWRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTYyY1wiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODkyNFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgXCJpY29uX2lkXCI6IFwiMjQ4MTM3OTRcIixcclxuICAgICAgXCJuYW1lXCI6IFwic2hvcFwiLFxyXG4gICAgICBcImZvbnRfY2xhc3NcIjogXCJzaG9wXCIsXHJcbiAgICAgIFwidW5pY29kZVwiOiBcImU2MmZcIixcclxuICAgICAgXCJ1bmljb2RlX2RlY2ltYWxcIjogNTg5MjdcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIFwiaWNvbl9pZFwiOiBcIjI0ODEzNzk1XCIsXHJcbiAgICAgIFwibmFtZVwiOiBcImhlYWRwaG9uZXNcIixcclxuICAgICAgXCJmb250X2NsYXNzXCI6IFwiaGVhZHBob25lc1wiLFxyXG4gICAgICBcInVuaWNvZGVcIjogXCJlNjMwXCIsXHJcbiAgICAgIFwidW5pY29kZV9kZWNpbWFsXCI6IDU4OTI4XHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBcImljb25faWRcIjogXCIyNDgxMzc5NlwiLFxyXG4gICAgICBcIm5hbWVcIjogXCJjYXJ0XCIsXHJcbiAgICAgIFwiZm9udF9jbGFzc1wiOiBcImNhcnRcIixcclxuICAgICAgXCJ1bmljb2RlXCI6IFwiZTYzMVwiLFxyXG4gICAgICBcInVuaWNvZGVfZGVjaW1hbFwiOiA1ODkyOVxyXG4gICAgfVxyXG4gIF1cclxufVxyXG4iXSwic291cmNlUm9vdCI6IiJ9