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.
10604 lines
930 KiB
10604 lines
930 KiB
(global["webpackJsonp"] = global["webpackJsonp"] || []).push([["common/vendor"],[
|
|
/* 0 */,
|
|
/* 1 */
|
|
/*!********************************************************!*\
|
|
!*** ./node_modules/@dcloudio/uni-mp-jd/dist/index.js ***!
|
|
\********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
"use strict";
|
|
/* WEBPACK VAR INJECTION */(function(global) {
|
|
|
|
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 3);
|
|
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 _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ 4));
|
|
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ 10));
|
|
var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ 11));
|
|
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ 15));
|
|
var _construct2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/construct */ 16));
|
|
var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ 19));
|
|
var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ 13));
|
|
var _uniI18n = __webpack_require__(/*! @dcloudio/uni-i18n */ 23);
|
|
var _vue = _interopRequireDefault(__webpack_require__(/*! vue */ 24));
|
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
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 = jd.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 isObject(obj) {
|
|
return obj !== null && (0, _typeof2.default)(obj) === 'object';
|
|
}
|
|
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 && ((0, _typeof2.default)(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, (0, _toConsumableArray2.default)(globalInterceptors.returnValue));
|
|
}
|
|
var interceptor = scopedInterceptors[method];
|
|
if (interceptor && Array.isArray(interceptor.returnValue)) {
|
|
returnValueHooks.push.apply(returnValueHooks, (0, _toConsumableArray2.default)(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|invokePushCallback|getWindowInfo|getDeviceInfo|getAppBaseInfo|getSystemSetting|getAppAuthorizeSetting/;
|
|
var CONTEXT_API_RE = /^create|Manager$/;
|
|
|
|
// Context例外情况
|
|
var CONTEXT_API_RE_EXC = ['createBLEConnection'];
|
|
|
|
// 同步例外情况
|
|
var ASYNC_API = ['createBLEConnection', 'createPushMessage'];
|
|
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) || !isFn(api)) {
|
|
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 _jd$getSystemInfoSync = jd.getSystemInfoSync(),
|
|
platform = _jd$getSystemInfoSync.platform,
|
|
pixelRatio = _jd$getSystemInfoSync.pixelRatio,
|
|
windowWidth = _jd$getSystemInfoSync.windowWidth; // uni=>jd 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;
|
|
}
|
|
var LOCALE_ZH_HANS = 'zh-Hans';
|
|
var LOCALE_ZH_HANT = 'zh-Hant';
|
|
var LOCALE_EN = 'en';
|
|
var LOCALE_FR = 'fr';
|
|
var LOCALE_ES = 'es';
|
|
var messages = {};
|
|
var locale;
|
|
{
|
|
locale = normalizeLocale(jd.getSystemInfoSync().language) || LOCALE_EN;
|
|
}
|
|
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 _this = this;
|
|
var unwatch = i18n.i18n.watchLocale(function () {
|
|
_this.$forceUpdate();
|
|
});
|
|
this.$once('hook:beforeDestroy', function () {
|
|
unwatch();
|
|
});
|
|
},
|
|
methods: {
|
|
$$t: function $$t(key, values) {
|
|
return t(key, values);
|
|
}
|
|
}
|
|
};
|
|
var setLocale = i18n.setLocale;
|
|
var getLocale = 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;
|
|
}
|
|
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 === 'chinese') {
|
|
// 支付宝
|
|
return LOCALE_ZH_HANS;
|
|
}
|
|
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;
|
|
}
|
|
}
|
|
// export function initI18n() {
|
|
// const localeKeys = Object.keys(__uniConfig.locales || {})
|
|
// if (localeKeys.length) {
|
|
// localeKeys.forEach((locale) =>
|
|
// i18n.add(locale, __uniConfig.locales[locale])
|
|
// )
|
|
// }
|
|
// }
|
|
|
|
function getLocale$1() {
|
|
// 优先使用 $locale
|
|
if (isFn(getApp)) {
|
|
var app = getApp({
|
|
allowDefault: true
|
|
});
|
|
if (app && app.$vm) {
|
|
return app.$vm.$locale;
|
|
}
|
|
}
|
|
return normalizeLocale(jd.getSystemInfoSync().language) || LOCALE_EN;
|
|
}
|
|
function setLocale$1(locale) {
|
|
var app = isFn(getApp) ? getApp() : false;
|
|
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$1;
|
|
}
|
|
var interceptors = {
|
|
promiseInterceptor: promiseInterceptor
|
|
};
|
|
var baseApi = /*#__PURE__*/Object.freeze({
|
|
__proto__: null,
|
|
upx2px: upx2px,
|
|
getLocale: getLocale$1,
|
|
setLocale: setLocale$1,
|
|
onLocaleChange: onLocaleChange,
|
|
addInterceptor: addInterceptor,
|
|
removeInterceptor: removeInterceptor,
|
|
interceptors: interceptors
|
|
});
|
|
var UUID_KEY = '__DC_STAT_UUID';
|
|
var deviceId;
|
|
function useDeviceId(result) {
|
|
deviceId = deviceId || jd.getStorageSync(UUID_KEY);
|
|
if (!deviceId) {
|
|
deviceId = Date.now() + '' + Math.floor(Math.random() * 1e7);
|
|
jd.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.screenHeight - safeArea.bottom
|
|
};
|
|
}
|
|
}
|
|
function populateParameters(result) {
|
|
var _result$brand = result.brand,
|
|
brand = _result$brand === void 0 ? '' : _result$brand,
|
|
_result$model = result.model,
|
|
model = _result$model === void 0 ? '' : _result$model,
|
|
_result$system = result.system,
|
|
system = _result$system === void 0 ? '' : _result$system,
|
|
_result$language = result.language,
|
|
language = _result$language === void 0 ? '' : _result$language,
|
|
theme = result.theme,
|
|
version = result.version,
|
|
platform = result.platform,
|
|
fontSizeSetting = result.fontSizeSetting,
|
|
SDKVersion = result.SDKVersion,
|
|
pixelRatio = result.pixelRatio,
|
|
deviceOrientation = result.deviceOrientation;
|
|
// const isQuickApp = "mp-jd".indexOf('quickapp-webview') !== -1
|
|
|
|
// osName osVersion
|
|
var osName = '';
|
|
var osVersion = '';
|
|
{
|
|
osName = system.split(' ')[0] || '';
|
|
osVersion = system.split(' ')[1] || '';
|
|
}
|
|
var hostVersion = version;
|
|
{
|
|
hostVersion = result.hostVersionName;
|
|
}
|
|
|
|
// deviceType
|
|
var deviceType = getGetDeviceType(result, model);
|
|
|
|
// deviceModel
|
|
var deviceBrand = getDeviceBrand(brand);
|
|
|
|
// hostName
|
|
var _hostName = getHostName(result);
|
|
|
|
// deviceOrientation
|
|
var _deviceOrientation = deviceOrientation; // 仅 微信 百度 支持
|
|
|
|
// devicePixelRatio
|
|
var _devicePixelRatio = pixelRatio;
|
|
|
|
// SDKVersion
|
|
var _SDKVersion = SDKVersion;
|
|
|
|
// hostLanguage
|
|
var hostLanguage = language.replace(/_/g, '-');
|
|
|
|
// wx.getAccountInfoSync
|
|
|
|
var parameters = {
|
|
appId: "__UNI__A3B5DFA",
|
|
appName: "易加蓝牙助手",
|
|
appVersion: "1.0.0",
|
|
appVersionCode: "100",
|
|
appLanguage: getAppLanguage(hostLanguage),
|
|
uniCompileVersion: "3.6.18",
|
|
uniRuntimeVersion: "3.6.18",
|
|
uniPlatform: undefined || "mp-jd",
|
|
deviceBrand: deviceBrand,
|
|
deviceModel: model,
|
|
deviceType: deviceType,
|
|
devicePixelRatio: _devicePixelRatio,
|
|
deviceOrientation: _deviceOrientation,
|
|
osName: osName.toLocaleLowerCase(),
|
|
osVersion: osVersion,
|
|
hostTheme: theme,
|
|
hostVersion: hostVersion,
|
|
hostLanguage: hostLanguage,
|
|
hostName: _hostName,
|
|
hostSDKVersion: _SDKVersion,
|
|
hostFontSizeSetting: fontSizeSetting,
|
|
windowTop: 0,
|
|
windowBottom: 0,
|
|
// TODO
|
|
osLanguage: undefined,
|
|
osTheme: undefined,
|
|
ua: undefined,
|
|
hostPackageName: undefined,
|
|
browserName: undefined,
|
|
browserVersion: undefined
|
|
};
|
|
Object.assign(result, parameters);
|
|
}
|
|
function getGetDeviceType(result, model) {
|
|
var deviceType = result.deviceType || 'phone';
|
|
{
|
|
var deviceTypeMaps = {
|
|
ipad: 'pad',
|
|
windows: 'pc',
|
|
mac: 'pc'
|
|
};
|
|
var deviceTypeMapsKeys = Object.keys(deviceTypeMaps);
|
|
var _model = model.toLocaleLowerCase();
|
|
for (var index = 0; index < deviceTypeMapsKeys.length; index++) {
|
|
var _m = deviceTypeMapsKeys[index];
|
|
if (_model.indexOf(_m) !== -1) {
|
|
deviceType = deviceTypeMaps[_m];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return deviceType;
|
|
}
|
|
function getDeviceBrand(brand) {
|
|
var deviceBrand = brand;
|
|
if (deviceBrand) {
|
|
deviceBrand = brand.toLocaleLowerCase();
|
|
}
|
|
return deviceBrand;
|
|
}
|
|
function getAppLanguage(defaultLanguage) {
|
|
return getLocale$1 ? getLocale$1() : defaultLanguage;
|
|
}
|
|
function getHostName(result) {
|
|
var _platform = "mp-jd".split('-')[1];
|
|
var _hostName = result.hostName || _platform; // mp-jd
|
|
|
|
return _hostName;
|
|
}
|
|
var getSystemInfo = {
|
|
returnValue: function returnValue(result) {
|
|
useDeviceId(result);
|
|
addSafeAreaInsets(result);
|
|
populateParameters(result);
|
|
}
|
|
};
|
|
|
|
// import navigateTo from 'uni-helpers/navigate-to'
|
|
// import getUserProfile from '../../../mp-weixin/helpers/get-user-profile'
|
|
|
|
// 需要做转换的 API 列表
|
|
var protocols = {
|
|
// navigateTo,
|
|
// redirectTo,
|
|
// previewImage,
|
|
getSystemInfo: getSystemInfo,
|
|
getSystemInfoSync: getSystemInfo
|
|
// getUserProfile
|
|
};
|
|
|
|
// 不支持的 API 列表
|
|
var todos = ['getSelectedTextRange'];
|
|
|
|
// 存在兼容性的 API 列表
|
|
var canIUses = [];
|
|
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 '\u4EAC\u4E1C\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 '\u4EAC\u4E1C\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 = jd[methodName].apply(jd, 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: ['jd'],
|
|
share: ['jd'],
|
|
payment: ['jd'],
|
|
push: ['jd']
|
|
};
|
|
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
|
|
});
|
|
|
|
/**
|
|
* 框架内 try-catch
|
|
*/
|
|
/**
|
|
* 开发者 try-catch
|
|
*/
|
|
function tryCatch(fn) {
|
|
return function () {
|
|
try {
|
|
return fn.apply(fn, arguments);
|
|
} catch (e) {
|
|
// TODO
|
|
console.error(e);
|
|
}
|
|
};
|
|
}
|
|
function getApiCallbacks(params) {
|
|
var apiCallbacks = {};
|
|
for (var name in params) {
|
|
var param = params[name];
|
|
if (isFn(param)) {
|
|
apiCallbacks[name] = tryCatch(param);
|
|
delete params[name];
|
|
}
|
|
}
|
|
return apiCallbacks;
|
|
}
|
|
var cid;
|
|
var cidErrMsg;
|
|
var enabled;
|
|
function normalizePushMessage(message) {
|
|
try {
|
|
return JSON.parse(message);
|
|
} catch (e) {}
|
|
return message;
|
|
}
|
|
function invokePushCallback(args) {
|
|
if (args.type === 'enabled') {
|
|
enabled = true;
|
|
} else if (args.type === 'clientId') {
|
|
cid = args.cid;
|
|
cidErrMsg = args.errMsg;
|
|
invokeGetPushCidCallbacks(cid, args.errMsg);
|
|
} else if (args.type === 'pushMsg') {
|
|
var message = {
|
|
type: 'receive',
|
|
data: normalizePushMessage(args.message)
|
|
};
|
|
for (var i = 0; i < onPushMessageCallbacks.length; i++) {
|
|
var callback = onPushMessageCallbacks[i];
|
|
callback(message);
|
|
// 该消息已被阻止
|
|
if (message.stopped) {
|
|
break;
|
|
}
|
|
}
|
|
} else if (args.type === 'click') {
|
|
onPushMessageCallbacks.forEach(function (callback) {
|
|
callback({
|
|
type: 'click',
|
|
data: normalizePushMessage(args.message)
|
|
});
|
|
});
|
|
}
|
|
}
|
|
var getPushCidCallbacks = [];
|
|
function invokeGetPushCidCallbacks(cid, errMsg) {
|
|
getPushCidCallbacks.forEach(function (callback) {
|
|
callback(cid, errMsg);
|
|
});
|
|
getPushCidCallbacks.length = 0;
|
|
}
|
|
function getPushClientId(args) {
|
|
if (!isPlainObject(args)) {
|
|
args = {};
|
|
}
|
|
var _getApiCallbacks = getApiCallbacks(args),
|
|
success = _getApiCallbacks.success,
|
|
fail = _getApiCallbacks.fail,
|
|
complete = _getApiCallbacks.complete;
|
|
var hasSuccess = isFn(success);
|
|
var hasFail = isFn(fail);
|
|
var hasComplete = isFn(complete);
|
|
Promise.resolve().then(function () {
|
|
if (typeof enabled === 'undefined') {
|
|
enabled = false;
|
|
cid = '';
|
|
cidErrMsg = 'uniPush is not enabled';
|
|
}
|
|
getPushCidCallbacks.push(function (cid, errMsg) {
|
|
var res;
|
|
if (cid) {
|
|
res = {
|
|
errMsg: 'getPushClientId:ok',
|
|
cid: cid
|
|
};
|
|
hasSuccess && success(res);
|
|
} else {
|
|
res = {
|
|
errMsg: 'getPushClientId:fail' + (errMsg ? ' ' + errMsg : '')
|
|
};
|
|
hasFail && fail(res);
|
|
}
|
|
hasComplete && complete(res);
|
|
});
|
|
if (typeof cid !== 'undefined') {
|
|
invokeGetPushCidCallbacks(cid, cidErrMsg);
|
|
}
|
|
});
|
|
}
|
|
var onPushMessageCallbacks = [];
|
|
// 不使用 defineOnApi 实现,是因为 defineOnApi 依赖 UniServiceJSBridge ,该对象目前在小程序上未提供,故简单实现
|
|
var onPushMessage = function onPushMessage(fn) {
|
|
if (onPushMessageCallbacks.indexOf(fn) === -1) {
|
|
onPushMessageCallbacks.push(fn);
|
|
}
|
|
};
|
|
var offPushMessage = function offPushMessage(fn) {
|
|
if (!fn) {
|
|
onPushMessageCallbacks.length = 0;
|
|
} else {
|
|
var index = onPushMessageCallbacks.indexOf(fn);
|
|
if (index > -1) {
|
|
onPushMessageCallbacks.splice(index, 1);
|
|
}
|
|
}
|
|
};
|
|
var api = /*#__PURE__*/Object.freeze({
|
|
__proto__: null,
|
|
getPushClientId: getPushClientId,
|
|
onPushMessage: onPushMessage,
|
|
offPushMessage: offPushMessage,
|
|
invokePushCallback: invokePushCallback
|
|
});
|
|
var mocks = ['__route__', '__wxExparserNodeId__', '__wxWebviewId__'];
|
|
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 isPage() {
|
|
return !!this.route;
|
|
}
|
|
function initRelation(detail) {
|
|
this.triggerEvent('__l', detail);
|
|
}
|
|
function selectAllComponents(mpInstance, selector, $refs) {
|
|
var components = mpInstance.selectAllComponents(selector) || [];
|
|
components.forEach(function (component) {
|
|
var ref = component.dataset.ref;
|
|
$refs[ref] = component.$vm || toSkip(component);
|
|
});
|
|
}
|
|
function syncRefs(refs, newRefs) {
|
|
var oldKeys = (0, _construct2.default)(Set, (0, _toConsumableArray2.default)(Object.keys(refs)));
|
|
var newKeys = Object.keys(newRefs);
|
|
newKeys.forEach(function (key) {
|
|
var oldValue = refs[key];
|
|
var newValue = newRefs[key];
|
|
if (Array.isArray(oldValue) && Array.isArray(newValue) && oldValue.length === newValue.length && newValue.every(function (value) {
|
|
return oldValue.includes(value);
|
|
})) {
|
|
return;
|
|
}
|
|
refs[key] = newValue;
|
|
oldKeys.delete(key);
|
|
});
|
|
oldKeys.forEach(function (key) {
|
|
delete refs[key];
|
|
});
|
|
return refs;
|
|
}
|
|
function initRefs(vm) {
|
|
var mpInstance = vm.$scope;
|
|
var refs = {};
|
|
Object.defineProperty(vm, '$refs', {
|
|
get: function get() {
|
|
var $refs = {};
|
|
selectAllComponents(mpInstance, '.vue-ref', $refs);
|
|
// TODO 暂不考虑 for 中的 scoped
|
|
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 || toSkip(component));
|
|
});
|
|
return syncRefs(refs, $refs);
|
|
}
|
|
});
|
|
}
|
|
function handleLink(event) {
|
|
var _ref3 = event.detail || event.value,
|
|
vuePid = _ref3.vuePid,
|
|
vueOptions = _ref3.vueOptions; // detail 是微信,value 是百度(dipatch)
|
|
|
|
var parentVm;
|
|
if (vuePid) {
|
|
parentVm = findVmByVueId(this.$vm, vuePid);
|
|
}
|
|
if (!parentVm) {
|
|
parentVm = this.$vm;
|
|
}
|
|
vueOptions.parent = parentVm;
|
|
}
|
|
function markMPComponent(component) {
|
|
// 在 Vue 中标记为小程序组件
|
|
var IS_MP = '__v_isMPComponent';
|
|
Object.defineProperty(component, IS_MP, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
value: true
|
|
});
|
|
return component;
|
|
}
|
|
function toSkip(obj) {
|
|
var OB = '__ob__';
|
|
var SKIP = '__v_skip';
|
|
if (isObject(obj) && Object.isExtensible(obj)) {
|
|
// 避免被 @vue/composition-api 观测
|
|
Object.defineProperty(obj, OB, {
|
|
configurable: true,
|
|
enumerable: false,
|
|
value: (0, _defineProperty2.default)({}, SKIP, true)
|
|
});
|
|
}
|
|
return obj;
|
|
}
|
|
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) {
|
|
// 事件名统一转驼峰格式,仅处理:当前组件为 vue 组件、当前组件为 vue 组件子组件
|
|
if (this.$vm || this.dataset && this.dataset.comType) {
|
|
event = customize(event);
|
|
}
|
|
for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
|
args[_key3 - 1] = arguments[_key3];
|
|
}
|
|
return oldTriggerEvent.apply(this, [event].concat(args));
|
|
};
|
|
try {
|
|
// 京东小程序 triggerEvent 为只读
|
|
mpInstance.triggerEvent = newTriggerEvent;
|
|
} catch (error) {
|
|
mpInstance._triggerEvent = newTriggerEvent;
|
|
}
|
|
}
|
|
function initHook(name, options, isComponent) {
|
|
var oldHook = options[name];
|
|
options[name] = function () {
|
|
markMPComponent(this);
|
|
initTriggerEvent(this);
|
|
if (oldHook) {
|
|
for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
|
|
args[_key4] = arguments[_key4];
|
|
}
|
|
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);
|
|
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]) || Array.isArray(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 initUnknownHooks(mpOptions, vueOptions) {
|
|
var excludes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
findHooks(vueOptions).forEach(function (hook) {
|
|
return initHook$1(mpOptions, hook, excludes);
|
|
});
|
|
}
|
|
function findHooks(vueOptions) {
|
|
var hooks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
if (vueOptions) {
|
|
Object.keys(vueOptions).forEach(function (name) {
|
|
if (name.indexOf('on') === 0 && isFn(vueOptions[name])) {
|
|
hooks.push(name);
|
|
}
|
|
});
|
|
}
|
|
return hooks;
|
|
}
|
|
function initHook$1(mpOptions, hook, excludes) {
|
|
if (excludes.indexOf(hook) === -1 && !hasOwn(mpOptions, hook)) {
|
|
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({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","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://', "jd".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 options = arguments.length > 3 ? arguments[3] : undefined;
|
|
var properties = {};
|
|
if (!isBehavior) {
|
|
properties.vueId = {
|
|
type: String,
|
|
value: ''
|
|
};
|
|
// 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 = (0, _typeof2.default)(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, __args__) {
|
|
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') {
|
|
extraObj['$' + index] = event.detail ? event.detail.__args__ || __args__ : __args__;
|
|
} 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 对象
|
|
|
|
// fixed 用户直接触发 mpInstance.triggerEvent
|
|
var __args__ = isPlainObject(event.detail) ? event.detail.__args__ || [event.detail] : [event.detail];
|
|
if (isCustom) {
|
|
// 自定义事件
|
|
isCustomMPEvent = event.currentTarget && event.currentTarget.dataset && event.currentTarget.dataset.comType === 'wx';
|
|
if (!args.length) {
|
|
// 无参数,直接传入 event 或 detail 数组
|
|
if (isCustomMPEvent) {
|
|
return [event];
|
|
}
|
|
return __args__;
|
|
}
|
|
}
|
|
var extraObj = processEventExtra(vm, extra, event, __args__);
|
|
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(__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)) {
|
|
var _type = _this2.$vm.mpType === 'page' ? 'Page' : 'Component';
|
|
var path = _this2.route || _this2.is;
|
|
throw new Error("".concat(_type, " \"").concat(path, "\" does not have a method \"").concat(methodName, "\""));
|
|
}
|
|
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 EventChannel = /*#__PURE__*/function () {
|
|
function EventChannel(id, events) {
|
|
var _this3 = this;
|
|
(0, _classCallCheck2.default)(this, EventChannel);
|
|
this.id = id;
|
|
this.listener = {};
|
|
this.emitCache = {};
|
|
if (events) {
|
|
Object.keys(events).forEach(function (name) {
|
|
_this3.on(name, events[name]);
|
|
});
|
|
}
|
|
}
|
|
(0, _createClass2.default)(EventChannel, [{
|
|
key: "emit",
|
|
value: function emit(eventName) {
|
|
for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) {
|
|
args[_key5 - 1] = arguments[_key5];
|
|
}
|
|
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 = [];
|
|
function getEventChannel(id) {
|
|
if (id) {
|
|
var eventChannel = eventChannels[id];
|
|
delete eventChannels[id];
|
|
return eventChannel;
|
|
}
|
|
return eventChannelStack.shift();
|
|
}
|
|
var hooks = ['onShow', 'onHide', 'onError', 'onPageNotFound', 'onThemeChange', 'onUnhandledRejection'];
|
|
function initEventChannel() {
|
|
_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, _ref4) {
|
|
var mocks = _ref4.mocks,
|
|
initRefs = _ref4.initRefs;
|
|
initEventChannel();
|
|
{
|
|
initScopedSlotsParams();
|
|
}
|
|
if (vm.$options.store) {
|
|
_vue.default.prototype.$store = vm.$options.store;
|
|
}
|
|
uniIdMixin(_vue.default);
|
|
_vue.default.prototype.mpHost = "mp-jd";
|
|
_vue.default.mixin({
|
|
beforeCreate: function beforeCreate() {
|
|
if (!this.$options.mpType) {
|
|
return;
|
|
}
|
|
this.mpType = this.$options.mpType;
|
|
this.$mp = (0, _defineProperty2.default)({
|
|
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, normalizeLocale(jd.getSystemInfoSync().language) || LOCALE_EN);
|
|
initHooks(appOptions, hooks);
|
|
initUnknownHooks(appOptions, vm.$options);
|
|
return appOptions;
|
|
}
|
|
function parseApp(vm) {
|
|
return parseBaseApp(vm, {
|
|
mocks: mocks,
|
|
initRefs: initRefs
|
|
});
|
|
}
|
|
function parseApp$1(vm) {
|
|
return parseApp(vm);
|
|
}
|
|
function createApp(vm) {
|
|
App(parseApp$1(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 _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
isPage = _ref5.isPage,
|
|
initRelation = _ref5.initRelation;
|
|
var needVueOptions = arguments.length > 2 ? arguments[2] : undefined;
|
|
var _initVueComponent = initVueComponent(_vue.default, vueComponentOptions),
|
|
_initVueComponent2 = (0, _slicedToArray2.default)(_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 (needVueOptions) {
|
|
return [componentOptions, vueOptions, VueComponent];
|
|
}
|
|
if (isPage) {
|
|
return componentOptions;
|
|
}
|
|
return [componentOptions, VueComponent];
|
|
}
|
|
function parseComponent(vueComponentOptions, needVueOptions) {
|
|
return parseBaseComponent(vueComponentOptions, {
|
|
isPage: isPage,
|
|
initRelation: initRelation
|
|
}, needVueOptions);
|
|
}
|
|
function parseComponent$1(vueComponentOptions, needVueOptions) {
|
|
var _parseComponent = parseComponent(vueComponentOptions, true),
|
|
_parseComponent2 = (0, _slicedToArray2.default)(_parseComponent, 2),
|
|
componentOptions = _parseComponent2[0],
|
|
vueOptions = _parseComponent2[1];
|
|
// 京东小程序 lifetimes 存在兼容问题
|
|
var lifetimes = componentOptions.lifetimes;
|
|
Object.keys(lifetimes).forEach(function (key) {
|
|
componentOptions[key] = lifetimes[key];
|
|
});
|
|
return needVueOptions ? [componentOptions, vueOptions] : componentOptions;
|
|
}
|
|
var hooks$1 = ['onShow', 'onHide', 'onUnload'];
|
|
hooks$1.push.apply(hooks$1, PAGE_EVENT_HOOKS);
|
|
function parseBasePage(vuePageOptions) {
|
|
var _parseComponent$ = parseComponent$1(vuePageOptions, true),
|
|
_parseComponent$2 = (0, _slicedToArray2.default)(_parseComponent$, 2),
|
|
pageOptions = _parseComponent$2[0],
|
|
vueOptions = _parseComponent$2[1];
|
|
initHooks(pageOptions.methods, hooks$1, vueOptions);
|
|
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);
|
|
};
|
|
{
|
|
initUnknownHooks(pageOptions.methods, vuePageOptions, ['onReady']);
|
|
}
|
|
return pageOptions;
|
|
}
|
|
function parsePage(vuePageOptions) {
|
|
return parseBasePage(vuePageOptions);
|
|
}
|
|
function parsePage$1(vuePageOptions) {
|
|
return parsePage(vuePageOptions);
|
|
}
|
|
function createPage(vuePageOptions) {
|
|
{
|
|
return Component(parsePage$1(vuePageOptions));
|
|
}
|
|
}
|
|
function createComponent(vueOptions) {
|
|
{
|
|
return Component(parseComponent$1(vueOptions));
|
|
}
|
|
}
|
|
function createSubpackageApp(vm) {
|
|
var appOptions = parseApp$1(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) && jd.onAppShow) {
|
|
jd.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) && jd.onAppHide) {
|
|
jd.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 = jd.getLaunchOptionsSync && jd.getLaunchOptionsSync();
|
|
vm.__call_hook('onLaunch', args);
|
|
}
|
|
return vm;
|
|
}
|
|
function createPlugin(vm) {
|
|
var appOptions = parseApp$1(vm);
|
|
if (isFn(appOptions.onShow) && jd.onAppShow) {
|
|
jd.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) && jd.onAppHide) {
|
|
jd.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 = jd.getLaunchOptionsSync && jd.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 (!jd.canIUse(apiName)) {
|
|
protocols[canIUseApi] = false;
|
|
}
|
|
});
|
|
var uni = {};
|
|
if (typeof Proxy !== 'undefined' && "mp-jd" !== '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];
|
|
}
|
|
return promisify(name, wrapper(name, jd[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(jd).forEach(function (name) {
|
|
if (hasOwn(jd, name) || hasOwn(protocols, name)) {
|
|
uni[name] = promisify(name, wrapper(name, jd[name]));
|
|
}
|
|
});
|
|
}
|
|
jd.createApp = createApp;
|
|
jd.createPage = createPage;
|
|
jd.createComponent = createComponent;
|
|
jd.createSubpackageApp = createSubpackageApp;
|
|
jd.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/@babel/runtime/helpers/interopRequireDefault.js ***!
|
|
\**********************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _interopRequireDefault(obj) {
|
|
return obj && obj.__esModule ? obj : {
|
|
"default": obj
|
|
};
|
|
}
|
|
module.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 4 */
|
|
/*!**************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/slicedToArray.js ***!
|
|
\**************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var arrayWithHoles = __webpack_require__(/*! ./arrayWithHoles.js */ 5);
|
|
var iterableToArrayLimit = __webpack_require__(/*! ./iterableToArrayLimit.js */ 6);
|
|
var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray.js */ 7);
|
|
var nonIterableRest = __webpack_require__(/*! ./nonIterableRest.js */ 9);
|
|
function _slicedToArray(arr, i) {
|
|
return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();
|
|
}
|
|
module.exports = _slicedToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 5 */
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/arrayWithHoles.js ***!
|
|
\***************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _arrayWithHoles(arr) {
|
|
if (Array.isArray(arr)) return arr;
|
|
}
|
|
module.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 6 */
|
|
/*!*********************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js ***!
|
|
\*********************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _iterableToArrayLimit(arr, i) {
|
|
var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
|
|
if (null != _i) {
|
|
var _s,
|
|
_e,
|
|
_x,
|
|
_r,
|
|
_arr = [],
|
|
_n = !0,
|
|
_d = !1;
|
|
try {
|
|
if (_x = (_i = _i.call(arr)).next, 0 === i) {
|
|
if (Object(_i) !== _i) return;
|
|
_n = !1;
|
|
} else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) {
|
|
;
|
|
}
|
|
} catch (err) {
|
|
_d = !0, _e = err;
|
|
} finally {
|
|
try {
|
|
if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return;
|
|
} finally {
|
|
if (_d) throw _e;
|
|
}
|
|
}
|
|
return _arr;
|
|
}
|
|
}
|
|
module.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 7 */
|
|
/*!***************************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js ***!
|
|
\***************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray.js */ 8);
|
|
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);
|
|
}
|
|
module.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 8 */
|
|
/*!*****************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/arrayLikeToArray.js ***!
|
|
\*****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
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;
|
|
}
|
|
module.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 9 */
|
|
/*!****************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/nonIterableRest.js ***!
|
|
\****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
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.");
|
|
}
|
|
module.exports = _nonIterableRest, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 10 */
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***!
|
|
\***************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _classCallCheck(instance, Constructor) {
|
|
if (!(instance instanceof Constructor)) {
|
|
throw new TypeError("Cannot call a class as a function");
|
|
}
|
|
}
|
|
module.exports = _classCallCheck, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 11 */
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/createClass.js ***!
|
|
\************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var toPropertyKey = __webpack_require__(/*! ./toPropertyKey.js */ 12);
|
|
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, toPropertyKey(descriptor.key), descriptor);
|
|
}
|
|
}
|
|
function _createClass(Constructor, protoProps, staticProps) {
|
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
Object.defineProperty(Constructor, "prototype", {
|
|
writable: false
|
|
});
|
|
return Constructor;
|
|
}
|
|
module.exports = _createClass, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 12 */
|
|
/*!**************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/toPropertyKey.js ***!
|
|
\**************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var _typeof = __webpack_require__(/*! ./typeof.js */ 13)["default"];
|
|
var toPrimitive = __webpack_require__(/*! ./toPrimitive.js */ 14);
|
|
function _toPropertyKey(arg) {
|
|
var key = toPrimitive(arg, "string");
|
|
return _typeof(key) === "symbol" ? key : String(key);
|
|
}
|
|
module.exports = _toPropertyKey, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 13 */
|
|
/*!*******************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/typeof.js ***!
|
|
\*******************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _typeof(obj) {
|
|
"@babel/helpers - typeof";
|
|
|
|
return (module.exports = _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
|
|
return typeof obj;
|
|
} : function (obj) {
|
|
return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
}, module.exports.__esModule = true, module.exports["default"] = module.exports), _typeof(obj);
|
|
}
|
|
module.exports = _typeof, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 14 */
|
|
/*!************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/toPrimitive.js ***!
|
|
\************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var _typeof = __webpack_require__(/*! ./typeof.js */ 13)["default"];
|
|
function _toPrimitive(input, hint) {
|
|
if (_typeof(input) !== "object" || input === null) return input;
|
|
var prim = input[Symbol.toPrimitive];
|
|
if (prim !== undefined) {
|
|
var res = prim.call(input, hint || "default");
|
|
if (_typeof(res) !== "object") return res;
|
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
}
|
|
return (hint === "string" ? String : Number)(input);
|
|
}
|
|
module.exports = _toPrimitive, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 15 */
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/defineProperty.js ***!
|
|
\***************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var toPropertyKey = __webpack_require__(/*! ./toPropertyKey.js */ 12);
|
|
function _defineProperty(obj, key, value) {
|
|
key = toPropertyKey(key);
|
|
if (key in obj) {
|
|
Object.defineProperty(obj, key, {
|
|
value: value,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
} else {
|
|
obj[key] = value;
|
|
}
|
|
return obj;
|
|
}
|
|
module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 16 */
|
|
/*!**********************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/construct.js ***!
|
|
\**********************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf.js */ 17);
|
|
var isNativeReflectConstruct = __webpack_require__(/*! ./isNativeReflectConstruct.js */ 18);
|
|
function _construct(Parent, args, Class) {
|
|
if (isNativeReflectConstruct()) {
|
|
module.exports = _construct = Reflect.construct.bind(), module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
} else {
|
|
module.exports = _construct = function _construct(Parent, args, Class) {
|
|
var a = [null];
|
|
a.push.apply(a, args);
|
|
var Constructor = Function.bind.apply(Parent, a);
|
|
var instance = new Constructor();
|
|
if (Class) setPrototypeOf(instance, Class.prototype);
|
|
return instance;
|
|
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
}
|
|
return _construct.apply(null, arguments);
|
|
}
|
|
module.exports = _construct, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 17 */
|
|
/*!***************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/setPrototypeOf.js ***!
|
|
\***************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _setPrototypeOf(o, p) {
|
|
module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
|
|
o.__proto__ = p;
|
|
return o;
|
|
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
return _setPrototypeOf(o, p);
|
|
}
|
|
module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 18 */
|
|
/*!*************************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js ***!
|
|
\*************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _isNativeReflectConstruct() {
|
|
if (typeof Reflect === "undefined" || !Reflect.construct) return false;
|
|
if (Reflect.construct.sham) return false;
|
|
if (typeof Proxy === "function") return true;
|
|
try {
|
|
Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
module.exports = _isNativeReflectConstruct, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 19 */
|
|
/*!******************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/toConsumableArray.js ***!
|
|
\******************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles.js */ 20);
|
|
var iterableToArray = __webpack_require__(/*! ./iterableToArray.js */ 21);
|
|
var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray.js */ 7);
|
|
var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread.js */ 22);
|
|
function _toConsumableArray(arr) {
|
|
return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();
|
|
}
|
|
module.exports = _toConsumableArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 20 */
|
|
/*!******************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***!
|
|
\******************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray.js */ 8);
|
|
function _arrayWithoutHoles(arr) {
|
|
if (Array.isArray(arr)) return arrayLikeToArray(arr);
|
|
}
|
|
module.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 21 */
|
|
/*!****************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/iterableToArray.js ***!
|
|
\****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function _iterableToArray(iter) {
|
|
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
}
|
|
module.exports = _iterableToArray, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 22 */
|
|
/*!******************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/nonIterableSpread.js ***!
|
|
\******************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
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.");
|
|
}
|
|
module.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 23 */
|
|
/*!*************************************************************!*\
|
|
!*** ./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) {
|
|
|
|
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ 3);
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.LOCALE_ZH_HANT = exports.LOCALE_ZH_HANS = exports.LOCALE_FR = exports.LOCALE_ES = exports.LOCALE_EN = exports.I18n = exports.Formatter = void 0;
|
|
exports.compileI18nJsonStr = compileI18nJsonStr;
|
|
exports.hasI18nJson = hasI18nJson;
|
|
exports.initVueI18n = initVueI18n;
|
|
exports.isI18nStr = isI18nStr;
|
|
exports.isString = void 0;
|
|
exports.normalizeLocale = normalizeLocale;
|
|
exports.parseI18nJson = parseI18nJson;
|
|
exports.resolveLocale = resolveLocale;
|
|
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ 4));
|
|
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ 10));
|
|
var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ 11));
|
|
var _typeof2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/typeof */ 13));
|
|
var isArray = Array.isArray;
|
|
var isObject = function isObject(val) {
|
|
return val !== null && (0, _typeof2.default)(val) === 'object';
|
|
};
|
|
var defaultDelimiters = ['{', '}'];
|
|
var BaseFormatter = /*#__PURE__*/function () {
|
|
function BaseFormatter() {
|
|
(0, _classCallCheck2.default)(this, BaseFormatter);
|
|
this._caches = Object.create(null);
|
|
}
|
|
(0, _createClass2.default)(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 = (0, _slicedToArray2.default)(_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;
|
|
(0, _classCallCheck2.default)(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);
|
|
}
|
|
}
|
|
(0, _createClass2.default)(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-jd/dist/index.js */ 1)["default"], __webpack_require__(/*! ./../../../webpack/buildin/global.js */ 2)))
|
|
|
|
/***/ }),
|
|
/* 24 */
|
|
/*!******************************************************************************************!*\
|
|
!*** ./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 &&
|
|
!value.__v_isMPComponent
|
|
) {
|
|
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]';
|
|
var NULLTYPE = '[object Null]';
|
|
var UNDEFINEDTYPE = '[object Undefined]';
|
|
// 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 nullOrUndefined(currentType, preType) {
|
|
if(
|
|
(currentType === NULLTYPE || currentType === UNDEFINEDTYPE) &&
|
|
(preType === NULLTYPE || preType === UNDEFINEDTYPE)
|
|
) {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
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] && nullOrUndefined(currentType, preType)) {
|
|
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({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","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({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","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({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","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 clearInstance(key, value) {
|
|
// 简易去除 Vue 和小程序组件实例
|
|
if (value) {
|
|
if (value._isVue || value.__v_isMPComponent) {
|
|
return {}
|
|
}
|
|
}
|
|
return value
|
|
}
|
|
|
|
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, clearInstance))
|
|
}
|
|
|
|
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({"NODE_ENV":"development","VUE_APP_DARK_MODE":"false","VUE_APP_NAME":"易加蓝牙助手","VUE_APP_PLATFORM":"mp-jd","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) {
|
|
var triggerEvent = this.$scope['_triggerEvent'] || this.$scope['triggerEvent'];
|
|
if (triggerEvent) {
|
|
try {
|
|
triggerEvent.call(this.$scope, event, {
|
|
__args__: toArray(arguments, 1)
|
|
});
|
|
} catch (error) {
|
|
|
|
}
|
|
}
|
|
}
|
|
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',
|
|
'onUploadDouyinVideo'
|
|
];
|
|
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)))
|
|
|
|
/***/ }),
|
|
/* 25 */
|
|
/*!**************************************************************************!*\
|
|
!*** C:/Users/mofan/Desktop/eciot-bletool for uni-app/易加蓝牙助手/pages.json ***!
|
|
\**************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
|
|
/***/ }),
|
|
/* 26 */,
|
|
/* 27 */,
|
|
/* 28 */,
|
|
/* 29 */,
|
|
/* 30 */,
|
|
/* 31 */
|
|
/*!**********************************************************************************************************!*\
|
|
!*** ./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
|
|
}
|
|
}
|
|
|
|
|
|
/***/ }),
|
|
/* 32 */,
|
|
/* 33 */,
|
|
/* 34 */,
|
|
/* 35 */,
|
|
/* 36 */,
|
|
/* 37 */,
|
|
/* 38 */
|
|
/*!*****************************************************************************!*\
|
|
!*** C:/Users/mofan/Desktop/eciot-bletool for uni-app/易加蓝牙助手/utils/ecUI.js ***!
|
|
\*****************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
/* WEBPACK VAR INJECTION */(function(uni) {var showModal = function showModal(title, content, cb) {
|
|
uni.showModal({
|
|
title: title,
|
|
content: content,
|
|
showCancel: false,
|
|
complete: function complete() {
|
|
if (cb) cb();
|
|
}
|
|
});
|
|
};
|
|
var showLoading = function showLoading(title) {
|
|
uni.showLoading({
|
|
title: title,
|
|
mask: true
|
|
});
|
|
};
|
|
var hideLoading = function hideLoading() {
|
|
uni.hideLoading();
|
|
};
|
|
module.exports = {
|
|
showModal: showModal,
|
|
showLoading: showLoading,
|
|
hideLoading: hideLoading
|
|
};
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./node_modules/@dcloudio/uni-mp-jd/dist/index.js */ 1)["default"]))
|
|
|
|
/***/ }),
|
|
/* 39 */
|
|
/*!************************************************************************************!*\
|
|
!*** C:/Users/mofan/Desktop/eciot-bletool for uni-app/易加蓝牙助手/utils/ecBLE/ecBLE.js ***!
|
|
\************************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
module.exports = __webpack_require__(/*! ./ecBLEJD.js */ 40);
|
|
|
|
/***/ }),
|
|
/* 40 */
|
|
/*!**************************************************************************************!*\
|
|
!*** C:/Users/mofan/Desktop/eciot-bletool for uni-app/易加蓝牙助手/utils/ecBLE/ecBLEJD.js ***!
|
|
\**************************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var _regeneratorRuntime = __webpack_require__(/*! @babel/runtime/regenerator */ 41);
|
|
var _asyncToGenerator = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ 43);
|
|
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
var logEnable = false;
|
|
var isAndroid = false;
|
|
var ecBluetoothAdapterStateChangeCallback = function ecBluetoothAdapterStateChangeCallback() {};
|
|
var ecBLEConnectionStateChangeCallback = function ecBLEConnectionStateChangeCallback() {};
|
|
var ecDeviceId = '';
|
|
var ecGattServerUUID = '';
|
|
var ecGattServerUUIDOption1 = '0000FFF0-0000-1000-8000-00805F9B34FB';
|
|
var ecGattServerUUIDOption2 = 'FFF0';
|
|
var ecGattCharacteristicWriteUUID = '';
|
|
var ecGattCharacteristicWriteUUIDOption1 = '0000FFF2-0000-1000-8000-00805F9B34FB';
|
|
var ecGattCharacteristicWriteUUIDOption2 = 'FFF2';
|
|
var log = function log(data) {
|
|
if (logEnable) {
|
|
console.log('[eciot]:' + JSON.stringify(data));
|
|
}
|
|
};
|
|
var onBluetoothAdapterStateChange = function onBluetoothAdapterStateChange(cb) {
|
|
ecBluetoothAdapterStateChangeCallback = cb;
|
|
};
|
|
// const getSetting = () => {
|
|
// return new Promise(function (resolve, reject) {
|
|
// jd.getSetting({
|
|
// success(res) {
|
|
// log(res);
|
|
// if (res.authSetting && res.authSetting['scope.bluetooth']) {
|
|
// resolve({
|
|
// ok: true,
|
|
// errCode: 0,
|
|
// errMsg: ''
|
|
// });
|
|
// } else {
|
|
// resolve({
|
|
// ok: false,
|
|
// errCode: 30001,
|
|
// errMsg: 'getSetting fail'
|
|
// });
|
|
// }
|
|
// },
|
|
// fail(res) {
|
|
// log(res);
|
|
// resolve({
|
|
// ok: false,
|
|
// errCode: res.errCode ? res.errCode : 30000,
|
|
// errMsg: res.errMsg ? res.errMsg : 'getSetting fail'
|
|
// });
|
|
// }
|
|
// });
|
|
// });
|
|
// };
|
|
// const authorize = () => {
|
|
// return new Promise(function (resolve, reject) {
|
|
// jd.authorize({
|
|
// scope: 'scope.bluetooth',
|
|
// success(res) {
|
|
// log(res);
|
|
// resolve({
|
|
// ok: true,
|
|
// errCode: 0,
|
|
// errMsg: ''
|
|
// });
|
|
// },
|
|
// fail(res) {
|
|
// log(res);
|
|
// // {"errMsg":"authorize:fail:auth deny"}
|
|
// resolve({
|
|
// ok: false,
|
|
// errCode: 30000,
|
|
// errMsg: res.errMsg
|
|
// });
|
|
// }
|
|
// });
|
|
// });
|
|
// };
|
|
var _openBluetoothAdapter = function _openBluetoothAdapter() {
|
|
return new Promise(function (resolve, reject) {
|
|
jd.openBluetoothAdapter({
|
|
success: function success(res) {
|
|
log(res);
|
|
// {errno: 0, errMsg: "openBluetoothAdapter:ok"}
|
|
resolve({
|
|
ok: true,
|
|
errCode: 0,
|
|
errMsg: ''
|
|
});
|
|
},
|
|
fail: function fail(res) {
|
|
log(res);
|
|
resolve({
|
|
ok: false,
|
|
errCode: res.errCode ? res.errCode : 30000,
|
|
errMsg: res.errMsg
|
|
});
|
|
}
|
|
});
|
|
});
|
|
};
|
|
var openBluetoothAdapter = /*#__PURE__*/function () {
|
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
var systemInfo, openRes;
|
|
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
while (1) {
|
|
switch (_context.prev = _context.next) {
|
|
case 0:
|
|
// await _openBluetoothAdapter()
|
|
systemInfo = jd.getSystemInfoSync();
|
|
log(systemInfo);
|
|
if (systemInfo.platform.toLowerCase() === 'android') {
|
|
isAndroid = true;
|
|
}
|
|
// if (!systemInfo.bluetoothEnabled) {
|
|
// ecBluetoothAdapterStateChangeCallback({
|
|
// ok: false,
|
|
// errCode: 30001,
|
|
// errMsg: '请打开系统蓝牙开关'
|
|
// });
|
|
// return;
|
|
// }
|
|
// if (isAndroid && !systemInfo.locationEnabled) {
|
|
// ecBluetoothAdapterStateChangeCallback({
|
|
// ok: false,
|
|
// errCode: 30002,
|
|
// errMsg: '请打开系统定位开关'
|
|
// });
|
|
// return;
|
|
// }
|
|
// if (isAndroid && !systemInfo.locationAuthorized) {
|
|
// ecBluetoothAdapterStateChangeCallback({
|
|
// ok: false,
|
|
// errCode: 30003,
|
|
// errMsg: '请打开微信定位权限,允许微信使用您的位置信息'
|
|
// });
|
|
// return;
|
|
// }
|
|
// const setting = await getSetting(); //小程序蓝牙权限
|
|
// if (!setting.ok) {
|
|
// const authRes = await authorize();
|
|
// if (!authRes.ok) {
|
|
// ecBluetoothAdapterStateChangeCallback({
|
|
// ok: false,
|
|
// errCode: 30004,
|
|
// errMsg: '请打开小程序蓝牙开关,点击右上角三个点,然后点击设置'
|
|
// });
|
|
// return;
|
|
// }
|
|
// }
|
|
jd.offBluetoothAdapterStateChange();
|
|
jd.onBluetoothAdapterStateChange(function (res) {
|
|
log(res); // {available: true, discovering: true}
|
|
if (!res.available) {
|
|
ecBluetoothAdapterStateChangeCallback({
|
|
ok: false,
|
|
errCode: 30005,
|
|
errMsg: '蓝牙适配器不可用'
|
|
});
|
|
}
|
|
});
|
|
_context.next = 7;
|
|
return _openBluetoothAdapter();
|
|
case 7:
|
|
openRes = _context.sent;
|
|
ecBluetoothAdapterStateChangeCallback(openRes);
|
|
case 9:
|
|
case "end":
|
|
return _context.stop();
|
|
}
|
|
}
|
|
}, _callee);
|
|
}));
|
|
return function openBluetoothAdapter() {
|
|
return _ref.apply(this, arguments);
|
|
};
|
|
}();
|
|
var onBluetoothDeviceFound = function onBluetoothDeviceFound(cb) {
|
|
jd.offBluetoothDeviceFound();
|
|
jd.onBluetoothDeviceFound(function (res) {
|
|
// log(res);
|
|
var device = res.devices[0];
|
|
var name = device.name ? device.name : device.localName;
|
|
if (!name) {
|
|
return;
|
|
}
|
|
var id = device.deviceId;
|
|
var rssi = device.RSSI;
|
|
cb({
|
|
id: id,
|
|
name: name,
|
|
rssi: rssi
|
|
});
|
|
});
|
|
};
|
|
var startBluetoothDevicesDiscovery = function startBluetoothDevicesDiscovery() {
|
|
jd.startBluetoothDevicesDiscovery({
|
|
//services: [ecServerId],
|
|
allowDuplicatesKey: true,
|
|
powerLevel: 'high',
|
|
complete: function complete(res) {
|
|
log(res);
|
|
}
|
|
});
|
|
};
|
|
var stopBluetoothDevicesDiscovery = function stopBluetoothDevicesDiscovery() {
|
|
jd.stopBluetoothDevicesDiscovery({
|
|
complete: function complete(res) {
|
|
// {errno: 0, errMsg: "stopBluetoothDevicesDiscovery:ok", isDiscovering: false}
|
|
log(res);
|
|
}
|
|
});
|
|
};
|
|
var onBLEConnectionStateChange = function onBLEConnectionStateChange(cb) {
|
|
ecBLEConnectionStateChangeCallback = cb;
|
|
};
|
|
var _createBLEConnection = function _createBLEConnection() {
|
|
return new Promise(function (resolve, reject) {
|
|
jd.createBLEConnection({
|
|
deviceId: ecDeviceId,
|
|
success: function success(res) {
|
|
log(res);
|
|
// {"errno":0,"errCode":0,"errMsg":"createBLEConnection:ok"}
|
|
resolve({
|
|
ok: true,
|
|
errCode: 0,
|
|
errMsg: ''
|
|
});
|
|
},
|
|
fail: function fail(res) {
|
|
log(res);
|
|
// {"errno":1001,"errMsg":"createBLEConnection:fail parameter error: parameter.deviceId should be String instead of Undefined;"}
|
|
resolve({
|
|
ok: false,
|
|
errCode: res.errCode ? res.errCode : res.errno,
|
|
errMsg: res.errMsg
|
|
});
|
|
}
|
|
});
|
|
if (!isAndroid) {
|
|
setTimeout(function () {
|
|
jd.createBLEConnection({
|
|
deviceId: ecDeviceId,
|
|
success: function success(res) {
|
|
log(res);
|
|
// {"errno":0,"errCode":0,"errMsg":"createBLEConnection:ok"}
|
|
resolve({
|
|
ok: true,
|
|
errCode: 0,
|
|
errMsg: ''
|
|
});
|
|
},
|
|
fail: function fail(res) {
|
|
log(res);
|
|
// {"errno":1001,"errMsg":"createBLEConnection:fail parameter error: parameter.deviceId should be String instead of Undefined;"}
|
|
resolve({
|
|
ok: false,
|
|
errCode: res.errCode ? res.errCode : res.errno,
|
|
errMsg: res.errMsg
|
|
});
|
|
}
|
|
});
|
|
}, 1000);
|
|
}
|
|
});
|
|
};
|
|
var getBLEDeviceServices = function getBLEDeviceServices() {
|
|
return new Promise(function (resolve, reject) {
|
|
jd.getBLEDeviceServices({
|
|
deviceId: ecDeviceId,
|
|
success: function success(res) {
|
|
log(res);
|
|
//{"services":[{"uuid":"0000FFF0-0000-1000-8000-00805F9B34FB","isPrimary":true}],"errCode":0,"errno":0,"errMsg":"getBLEDeviceServices:ok"}
|
|
// {"errno":0,"deviceId":"7C7E20F2-CB75-6DA8-F8DF-FFF702B0D63F","services":[{"isPrimary":true,"uuid":"0000FFF0-0000-1000-8000-00805F9B34FB"}],"errMsg":"getBLEDeviceServices:ok","errCode":0}
|
|
resolve({
|
|
ok: true,
|
|
errCode: 0,
|
|
errMsg: '',
|
|
services: res.services
|
|
});
|
|
},
|
|
fail: function fail(res) {
|
|
log(res);
|
|
resolve({
|
|
ok: false,
|
|
errCode: res.errCode,
|
|
errMsg: res.errMsg
|
|
});
|
|
}
|
|
});
|
|
});
|
|
};
|
|
var getBLEDeviceCharacteristics = function getBLEDeviceCharacteristics(serviceId) {
|
|
return new Promise(function (resolve, reject) {
|
|
jd.getBLEDeviceCharacteristics({
|
|
deviceId: ecDeviceId,
|
|
serviceId: serviceId,
|
|
success: function success(res) {
|
|
log(res);
|
|
// {"characteristics":[{"uuid":"0000FFF2-0000-1000-8000-00805F9B34FB","handle":3,"properties":{"read":false,"write":true,"notify":false,"indicate":false,"writeNoResponse":true,"writeDefault":true}},{"uuid":"0000FFF1-0000-1000-8000-00805F9B34FB","handle":5,"properties":{"read":true,"write":true,"notify":true,"indicate":false,"writeNoResponse":true,"writeDefault":true}}],"errCode":0,"errno":0,"errMsg":"getBLEDeviceCharacteristics:ok"}
|
|
// {"characteristics":[{"properties":{"writeDefault":true,"notify":false,"write":true,"indicate":false,"read":false,"writeNoResponse":true},"uuid":"0000FFF2-0000-1000-8000-00805F9B34FB"},{"properties":{"writeDefault":true,"notify":true,"write":true,"indicate":false,"read":true,"writeNoResponse":true},"uuid":"0000FFF1-0000-1000-8000-00805F9B34FB"}],"deviceId":"7C7E20F2-CB75-6DA8-F8DF-FFF702B0D63F","serviceId":"0000FFF0-0000-1000-8000-00805F9B34FB","errno":0,"errMsg":"getBLEDeviceCharacteristics:ok","errCode":0}
|
|
resolve({
|
|
ok: true,
|
|
errCode: 0,
|
|
errMsg: '',
|
|
characteristics: res.characteristics
|
|
});
|
|
},
|
|
fail: function fail(res) {
|
|
log(res);
|
|
resolve({
|
|
ok: false,
|
|
errCode: res.errCode,
|
|
errMsg: res.errMsg
|
|
});
|
|
}
|
|
});
|
|
});
|
|
};
|
|
var notifyBLECharacteristicValueChange = function notifyBLECharacteristicValueChange(serviceId, characteristicId) {
|
|
return new Promise(function (resolve, reject) {
|
|
jd.notifyBLECharacteristicValueChange({
|
|
state: true,
|
|
deviceId: ecDeviceId,
|
|
serviceId: serviceId,
|
|
characteristicId: characteristicId,
|
|
success: function success(res) {
|
|
log(res);
|
|
// {"errCode":0,"errno":0,"errMsg":"notifyBLECharacteristicValueChange:ok"}
|
|
resolve({
|
|
ok: true,
|
|
errCode: 0,
|
|
errMsg: ''
|
|
});
|
|
},
|
|
fail: function fail(res) {
|
|
log(res);
|
|
resolve({
|
|
ok: false,
|
|
errCode: res.errCode,
|
|
errMsg: res.errMsg
|
|
});
|
|
}
|
|
});
|
|
});
|
|
};
|
|
var setBLEMTU = function setBLEMTU(mtu) {
|
|
return new Promise(function (resolve, reject) {
|
|
jd.setBLEMTU({
|
|
deviceId: ecDeviceId,
|
|
mtu: mtu,
|
|
success: function success(res) {
|
|
log(res);
|
|
// {"errMsg":"setBLEMTU:ok","errno":0,"errCode":0,"mtu":50}
|
|
resolve({
|
|
ok: true,
|
|
errCode: 0,
|
|
errMsg: ''
|
|
});
|
|
},
|
|
fail: function fail(res) {
|
|
log(res);
|
|
// {"errCode":-1,"errno":1500104,"errMsg":"setBLEMTU:fail:internal error"}
|
|
resolve({
|
|
ok: false,
|
|
errCode: res.errCode,
|
|
errMsg: res.errMsg
|
|
});
|
|
}
|
|
});
|
|
});
|
|
};
|
|
//和设备建立连接
|
|
var createBLEConnection = /*#__PURE__*/function () {
|
|
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(id) {
|
|
var res;
|
|
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
while (1) {
|
|
switch (_context3.prev = _context3.next) {
|
|
case 0:
|
|
ecDeviceId = id;
|
|
jd.offBLEConnectionStateChange();
|
|
jd.onBLEConnectionStateChange( /*#__PURE__*/function () {
|
|
var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(res) {
|
|
var servicesResult, _iterator, _step, service, characteristicsResult, _iterator2, _step2, characteristic, notifyResult;
|
|
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
while (1) {
|
|
switch (_context2.prev = _context2.next) {
|
|
case 0:
|
|
log(res);
|
|
// {"deviceId":"EC:22:05:13:78:49","connected":true}
|
|
if (!res.connected) {
|
|
_context2.next = 62;
|
|
break;
|
|
}
|
|
_context2.next = 4;
|
|
return getBLEDeviceServices();
|
|
case 4:
|
|
servicesResult = _context2.sent;
|
|
if (servicesResult.ok) {
|
|
_context2.next = 9;
|
|
break;
|
|
}
|
|
ecBLEConnectionStateChangeCallback(servicesResult);
|
|
closeBLEConnection();
|
|
return _context2.abrupt("return");
|
|
case 9:
|
|
_iterator = _createForOfIteratorHelper(servicesResult.services);
|
|
_context2.prev = 10;
|
|
_iterator.s();
|
|
case 12:
|
|
if ((_step = _iterator.n()).done) {
|
|
_context2.next = 48;
|
|
break;
|
|
}
|
|
service = _step.value;
|
|
if (service.uuid.toUpperCase() === ecGattServerUUIDOption1 || service.uuid.toUpperCase() === ecGattServerUUIDOption2) {
|
|
ecGattServerUUID = service.uuid;
|
|
}
|
|
_context2.next = 17;
|
|
return getBLEDeviceCharacteristics(service.uuid);
|
|
case 17:
|
|
characteristicsResult = _context2.sent;
|
|
if (characteristicsResult.ok) {
|
|
_context2.next = 22;
|
|
break;
|
|
}
|
|
ecBLEConnectionStateChangeCallback(characteristicsResult);
|
|
closeBLEConnection();
|
|
return _context2.abrupt("return");
|
|
case 22:
|
|
_iterator2 = _createForOfIteratorHelper(characteristicsResult.characteristics);
|
|
_context2.prev = 23;
|
|
_iterator2.s();
|
|
case 25:
|
|
if ((_step2 = _iterator2.n()).done) {
|
|
_context2.next = 38;
|
|
break;
|
|
}
|
|
characteristic = _step2.value;
|
|
if (!(characteristic.properties && characteristic.properties.notify)) {
|
|
_context2.next = 35;
|
|
break;
|
|
}
|
|
_context2.next = 30;
|
|
return notifyBLECharacteristicValueChange(service.uuid, characteristic.uuid);
|
|
case 30:
|
|
notifyResult = _context2.sent;
|
|
if (notifyResult.ok) {
|
|
_context2.next = 35;
|
|
break;
|
|
}
|
|
ecBLEConnectionStateChangeCallback({
|
|
ok: false,
|
|
errCode: 30000,
|
|
errMsg: 'notify error'
|
|
});
|
|
closeBLEConnection();
|
|
return _context2.abrupt("return");
|
|
case 35:
|
|
if (characteristic.uuid.toUpperCase() === ecGattCharacteristicWriteUUIDOption1 || characteristic.uuid.toUpperCase() === ecGattCharacteristicWriteUUIDOption2) {
|
|
ecGattCharacteristicWriteUUID = characteristic.uuid;
|
|
}
|
|
case 36:
|
|
_context2.next = 25;
|
|
break;
|
|
case 38:
|
|
_context2.next = 43;
|
|
break;
|
|
case 40:
|
|
_context2.prev = 40;
|
|
_context2.t0 = _context2["catch"](23);
|
|
_iterator2.e(_context2.t0);
|
|
case 43:
|
|
_context2.prev = 43;
|
|
_iterator2.f();
|
|
return _context2.finish(43);
|
|
case 46:
|
|
_context2.next = 12;
|
|
break;
|
|
case 48:
|
|
_context2.next = 53;
|
|
break;
|
|
case 50:
|
|
_context2.prev = 50;
|
|
_context2.t1 = _context2["catch"](10);
|
|
_iterator.e(_context2.t1);
|
|
case 53:
|
|
_context2.prev = 53;
|
|
_iterator.f();
|
|
return _context2.finish(53);
|
|
case 56:
|
|
if (!isAndroid) {
|
|
_context2.next = 59;
|
|
break;
|
|
}
|
|
_context2.next = 59;
|
|
return setBLEMTU(247);
|
|
case 59:
|
|
ecBLEConnectionStateChangeCallback({
|
|
ok: true,
|
|
errCode: 0,
|
|
errMsg: ''
|
|
});
|
|
_context2.next = 63;
|
|
break;
|
|
case 62:
|
|
ecBLEConnectionStateChangeCallback({
|
|
ok: false,
|
|
errCode: 0,
|
|
errMsg: 'disconnect'
|
|
});
|
|
case 63:
|
|
case "end":
|
|
return _context2.stop();
|
|
}
|
|
}
|
|
}, _callee2, null, [[10, 50, 53, 56], [23, 40, 43, 46]]);
|
|
}));
|
|
return function (_x2) {
|
|
return _ref3.apply(this, arguments);
|
|
};
|
|
}());
|
|
_context3.next = 5;
|
|
return _createBLEConnection();
|
|
case 5:
|
|
res = _context3.sent;
|
|
if (!res.ok) {
|
|
ecBLEConnectionStateChangeCallback(res);
|
|
}
|
|
case 7:
|
|
case "end":
|
|
return _context3.stop();
|
|
}
|
|
}
|
|
}, _callee3);
|
|
}));
|
|
return function createBLEConnection(_x) {
|
|
return _ref2.apply(this, arguments);
|
|
};
|
|
}();
|
|
//关闭当前连接
|
|
var closeBLEConnection = function closeBLEConnection() {
|
|
jd.closeBLEConnection({
|
|
deviceId: ecDeviceId,
|
|
complete: function complete(res) {
|
|
log(res);
|
|
}
|
|
});
|
|
};
|
|
var onBLECharacteristicValueChange = function onBLECharacteristicValueChange(cb) {
|
|
jd.offBLECharacteristicValueChange();
|
|
jd.onBLECharacteristicValueChange(function (res) {
|
|
log(res);
|
|
var x = new Uint8Array(res.value);
|
|
log(x);
|
|
var str = utf8BytesToStr(x);
|
|
var strHex = '';
|
|
for (var i = 0; i < x.length; i++) {
|
|
strHex = strHex + x[i].toString(16).padStart(2, '0').toUpperCase();
|
|
}
|
|
log(str);
|
|
log(strHex);
|
|
cb(str, strHex);
|
|
});
|
|
};
|
|
var _writeBLECharacteristicValue = function _writeBLECharacteristicValue(buffer) {
|
|
return new Promise(function (resolve, reject) {
|
|
jd.writeBLECharacteristicValue({
|
|
deviceId: ecDeviceId,
|
|
serviceId: ecGattServerUUID,
|
|
characteristicId: ecGattCharacteristicWriteUUID,
|
|
value: buffer,
|
|
writeType: 'writeNoResponse',
|
|
success: function success(res) {
|
|
log(res);
|
|
// {"errno":0,"errCode":0,"errMsg":"writeBLECharacteristicValue:ok"}
|
|
resolve({
|
|
ok: true,
|
|
errCode: 0,
|
|
errMsg: ''
|
|
});
|
|
},
|
|
fail: function fail(res) {
|
|
log(res);
|
|
resolve({
|
|
ok: false,
|
|
errCode: res.errCode,
|
|
errMsg: res.errMsg
|
|
});
|
|
}
|
|
});
|
|
});
|
|
};
|
|
var writeBLECharacteristicValue = /*#__PURE__*/function () {
|
|
var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(str, isHex) {
|
|
var buffer, x, i;
|
|
return _regeneratorRuntime.wrap(function _callee4$(_context4) {
|
|
while (1) {
|
|
switch (_context4.prev = _context4.next) {
|
|
case 0:
|
|
if (!(str.length === 0)) {
|
|
_context4.next = 2;
|
|
break;
|
|
}
|
|
return _context4.abrupt("return", {
|
|
ok: false,
|
|
errCode: 30000,
|
|
errMsg: 'data is null'
|
|
});
|
|
case 2:
|
|
if (isHex) {
|
|
buffer = new ArrayBuffer(str.length / 2);
|
|
x = new Uint8Array(buffer);
|
|
for (i = 0; i < x.length; i++) {
|
|
x[i] = parseInt(str.substr(2 * i, 2), 16);
|
|
}
|
|
} else {
|
|
buffer = new Uint8Array(strToUtf8Bytes(str)).buffer;
|
|
}
|
|
_context4.next = 5;
|
|
return _writeBLECharacteristicValue(buffer);
|
|
case 5:
|
|
return _context4.abrupt("return", _context4.sent);
|
|
case 6:
|
|
case "end":
|
|
return _context4.stop();
|
|
}
|
|
}
|
|
}, _callee4);
|
|
}));
|
|
return function writeBLECharacteristicValue(_x3, _x4) {
|
|
return _ref4.apply(this, arguments);
|
|
};
|
|
}();
|
|
var utf8BytesToStr = function utf8BytesToStr(utf8Bytes) {
|
|
var unicodeStr = '';
|
|
for (var pos = 0; pos < utf8Bytes.length;) {
|
|
var flag = utf8Bytes[pos];
|
|
var unicode = 0;
|
|
if (flag >>> 7 === 0) {
|
|
unicodeStr += String.fromCharCode(utf8Bytes[pos]);
|
|
pos += 1;
|
|
}
|
|
// else if ((flag & 0xFC) === 0xFC) {
|
|
// unicode = (utf8Bytes[pos] & 0x3) << 30
|
|
// unicode |= (utf8Bytes[pos + 1] & 0x3F) << 24
|
|
// unicode |= (utf8Bytes[pos + 2] & 0x3F) << 18
|
|
// unicode |= (utf8Bytes[pos + 3] & 0x3F) << 12
|
|
// unicode |= (utf8Bytes[pos + 4] & 0x3F) << 6
|
|
// unicode |= (utf8Bytes[pos + 5] & 0x3F)
|
|
// unicodeStr += String.fromCharCode(unicode)
|
|
// pos += 6
|
|
// }
|
|
// else if ((flag & 0xF8) === 0xF8) {
|
|
// unicode = (utf8Bytes[pos] & 0x7) << 24
|
|
// unicode |= (utf8Bytes[pos + 1] & 0x3F) << 18
|
|
// unicode |= (utf8Bytes[pos + 2] & 0x3F) << 12
|
|
// unicode |= (utf8Bytes[pos + 3] & 0x3F) << 6
|
|
// unicode |= (utf8Bytes[pos + 4] & 0x3F)
|
|
// unicodeStr += String.fromCharCode(unicode)
|
|
// pos += 5
|
|
// }
|
|
else if ((flag & 0xf0) === 0xf0) {
|
|
unicode = (utf8Bytes[pos] & 0xf) << 18;
|
|
unicode |= (utf8Bytes[pos + 1] & 0x3f) << 12;
|
|
unicode |= (utf8Bytes[pos + 2] & 0x3f) << 6;
|
|
unicode |= utf8Bytes[pos + 3] & 0x3f;
|
|
unicodeStr += String.fromCharCode(unicode);
|
|
pos += 4;
|
|
} else if ((flag & 0xe0) === 0xe0) {
|
|
unicode = (utf8Bytes[pos] & 0x1f) << 12;
|
|
unicode |= (utf8Bytes[pos + 1] & 0x3f) << 6;
|
|
unicode |= utf8Bytes[pos + 2] & 0x3f;
|
|
unicodeStr += String.fromCharCode(unicode);
|
|
pos += 3;
|
|
} else if ((flag & 0xc0) === 0xc0) {
|
|
//110
|
|
unicode = (utf8Bytes[pos] & 0x3f) << 6;
|
|
unicode |= utf8Bytes[pos + 1] & 0x3f;
|
|
unicodeStr += String.fromCharCode(unicode);
|
|
pos += 2;
|
|
} else {
|
|
unicodeStr += String.fromCharCode(utf8Bytes[pos]);
|
|
pos += 1;
|
|
}
|
|
}
|
|
return unicodeStr;
|
|
};
|
|
var strToUtf8Bytes = function strToUtf8Bytes(str) {
|
|
var bytes = [];
|
|
for (var i = 0; i < str.length; ++i) {
|
|
var code = str.charCodeAt(i);
|
|
if (code >= 0x10000 && code <= 0x10ffff) {
|
|
bytes.push(code >> 18 | 0xf0); // 第一个字节
|
|
bytes.push(code >> 12 & 0x3f | 0x80);
|
|
bytes.push(code >> 6 & 0x3f | 0x80);
|
|
bytes.push(code & 0x3f | 0x80);
|
|
} else if (code >= 0x800 && code <= 0xffff) {
|
|
bytes.push(code >> 12 | 0xe0);
|
|
bytes.push(code >> 6 & 0x3f | 0x80);
|
|
bytes.push(code & 0x3f | 0x80);
|
|
} else if (code >= 0x80 && code <= 0x7ff) {
|
|
bytes.push(code >> 6 | 0xc0);
|
|
bytes.push(code & 0x3f | 0x80);
|
|
} else {
|
|
bytes.push(code);
|
|
}
|
|
}
|
|
return bytes;
|
|
};
|
|
module.exports = {
|
|
onBluetoothAdapterStateChange: onBluetoothAdapterStateChange,
|
|
openBluetoothAdapter: openBluetoothAdapter,
|
|
onBluetoothDeviceFound: onBluetoothDeviceFound,
|
|
startBluetoothDevicesDiscovery: startBluetoothDevicesDiscovery,
|
|
stopBluetoothDevicesDiscovery: stopBluetoothDevicesDiscovery,
|
|
onBLEConnectionStateChange: onBLEConnectionStateChange,
|
|
createBLEConnection: createBLEConnection,
|
|
closeBLEConnection: closeBLEConnection,
|
|
onBLECharacteristicValueChange: onBLECharacteristicValueChange,
|
|
writeBLECharacteristicValue: writeBLECharacteristicValue
|
|
};
|
|
|
|
/***/ }),
|
|
/* 41 */
|
|
/*!************************************************************************************************!*\
|
|
!*** ./node_modules/@dcloudio/vue-cli-plugin-uni/packages/@babel/runtime/regenerator/index.js ***!
|
|
\************************************************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
// TODO(Babel 8): Remove this file.
|
|
|
|
var runtime = __webpack_require__(/*! @babel/runtime/helpers/regeneratorRuntime */ 42)();
|
|
module.exports = runtime;
|
|
|
|
/***/ }),
|
|
/* 42 */
|
|
/*!*******************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/regeneratorRuntime.js ***!
|
|
\*******************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
var _typeof = __webpack_require__(/*! ./typeof.js */ 13)["default"];
|
|
function _regeneratorRuntime() {
|
|
"use strict";
|
|
|
|
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
|
module.exports = _regeneratorRuntime = function _regeneratorRuntime() {
|
|
return exports;
|
|
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
var exports = {},
|
|
Op = Object.prototype,
|
|
hasOwn = Op.hasOwnProperty,
|
|
defineProperty = Object.defineProperty || function (obj, key, desc) {
|
|
obj[key] = desc.value;
|
|
},
|
|
$Symbol = "function" == typeof Symbol ? Symbol : {},
|
|
iteratorSymbol = $Symbol.iterator || "@@iterator",
|
|
asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator",
|
|
toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
|
|
function define(obj, key, value) {
|
|
return Object.defineProperty(obj, key, {
|
|
value: value,
|
|
enumerable: !0,
|
|
configurable: !0,
|
|
writable: !0
|
|
}), obj[key];
|
|
}
|
|
try {
|
|
define({}, "");
|
|
} catch (err) {
|
|
define = function define(obj, key, value) {
|
|
return obj[key] = value;
|
|
};
|
|
}
|
|
function wrap(innerFn, outerFn, self, tryLocsList) {
|
|
var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,
|
|
generator = Object.create(protoGenerator.prototype),
|
|
context = new Context(tryLocsList || []);
|
|
return defineProperty(generator, "_invoke", {
|
|
value: makeInvokeMethod(innerFn, self, context)
|
|
}), generator;
|
|
}
|
|
function tryCatch(fn, obj, arg) {
|
|
try {
|
|
return {
|
|
type: "normal",
|
|
arg: fn.call(obj, arg)
|
|
};
|
|
} catch (err) {
|
|
return {
|
|
type: "throw",
|
|
arg: err
|
|
};
|
|
}
|
|
}
|
|
exports.wrap = wrap;
|
|
var ContinueSentinel = {};
|
|
function Generator() {}
|
|
function GeneratorFunction() {}
|
|
function GeneratorFunctionPrototype() {}
|
|
var IteratorPrototype = {};
|
|
define(IteratorPrototype, iteratorSymbol, function () {
|
|
return this;
|
|
});
|
|
var getProto = Object.getPrototypeOf,
|
|
NativeIteratorPrototype = getProto && getProto(getProto(values([])));
|
|
NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);
|
|
var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);
|
|
function defineIteratorMethods(prototype) {
|
|
["next", "throw", "return"].forEach(function (method) {
|
|
define(prototype, method, function (arg) {
|
|
return this._invoke(method, arg);
|
|
});
|
|
});
|
|
}
|
|
function AsyncIterator(generator, PromiseImpl) {
|
|
function invoke(method, arg, resolve, reject) {
|
|
var record = tryCatch(generator[method], generator, arg);
|
|
if ("throw" !== record.type) {
|
|
var result = record.arg,
|
|
value = result.value;
|
|
return value && "object" == _typeof(value) && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) {
|
|
invoke("next", value, resolve, reject);
|
|
}, function (err) {
|
|
invoke("throw", err, resolve, reject);
|
|
}) : PromiseImpl.resolve(value).then(function (unwrapped) {
|
|
result.value = unwrapped, resolve(result);
|
|
}, function (error) {
|
|
return invoke("throw", error, resolve, reject);
|
|
});
|
|
}
|
|
reject(record.arg);
|
|
}
|
|
var previousPromise;
|
|
defineProperty(this, "_invoke", {
|
|
value: function value(method, arg) {
|
|
function callInvokeWithMethodAndArg() {
|
|
return new PromiseImpl(function (resolve, reject) {
|
|
invoke(method, arg, resolve, reject);
|
|
});
|
|
}
|
|
return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();
|
|
}
|
|
});
|
|
}
|
|
function makeInvokeMethod(innerFn, self, context) {
|
|
var state = "suspendedStart";
|
|
return function (method, arg) {
|
|
if ("executing" === state) throw new Error("Generator is already running");
|
|
if ("completed" === state) {
|
|
if ("throw" === method) throw arg;
|
|
return doneResult();
|
|
}
|
|
for (context.method = method, context.arg = arg;;) {
|
|
var delegate = context.delegate;
|
|
if (delegate) {
|
|
var delegateResult = maybeInvokeDelegate(delegate, context);
|
|
if (delegateResult) {
|
|
if (delegateResult === ContinueSentinel) continue;
|
|
return delegateResult;
|
|
}
|
|
}
|
|
if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) {
|
|
if ("suspendedStart" === state) throw state = "completed", context.arg;
|
|
context.dispatchException(context.arg);
|
|
} else "return" === context.method && context.abrupt("return", context.arg);
|
|
state = "executing";
|
|
var record = tryCatch(innerFn, self, context);
|
|
if ("normal" === record.type) {
|
|
if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue;
|
|
return {
|
|
value: record.arg,
|
|
done: context.done
|
|
};
|
|
}
|
|
"throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg);
|
|
}
|
|
};
|
|
}
|
|
function maybeInvokeDelegate(delegate, context) {
|
|
var methodName = context.method,
|
|
method = delegate.iterator[methodName];
|
|
if (undefined === method) return context.delegate = null, "throw" === methodName && delegate.iterator["return"] && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method) || "return" !== methodName && (context.method = "throw", context.arg = new TypeError("The iterator does not provide a '" + methodName + "' method")), ContinueSentinel;
|
|
var record = tryCatch(method, delegate.iterator, context.arg);
|
|
if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel;
|
|
var info = record.arg;
|
|
return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel);
|
|
}
|
|
function pushTryEntry(locs) {
|
|
var entry = {
|
|
tryLoc: locs[0]
|
|
};
|
|
1 in locs && (entry.catchLoc = locs[1]), 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) {
|
|
this.tryEntries = [{
|
|
tryLoc: "root"
|
|
}], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);
|
|
}
|
|
function values(iterable) {
|
|
if (iterable) {
|
|
var iteratorMethod = iterable[iteratorSymbol];
|
|
if (iteratorMethod) return iteratorMethod.call(iterable);
|
|
if ("function" == typeof iterable.next) return iterable;
|
|
if (!isNaN(iterable.length)) {
|
|
var i = -1,
|
|
next = function next() {
|
|
for (; ++i < iterable.length;) {
|
|
if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;
|
|
}
|
|
return next.value = undefined, next.done = !0, next;
|
|
};
|
|
return next.next = next;
|
|
}
|
|
}
|
|
return {
|
|
next: doneResult
|
|
};
|
|
}
|
|
function doneResult() {
|
|
return {
|
|
value: undefined,
|
|
done: !0
|
|
};
|
|
}
|
|
return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, "constructor", {
|
|
value: GeneratorFunctionPrototype,
|
|
configurable: !0
|
|
}), defineProperty(GeneratorFunctionPrototype, "constructor", {
|
|
value: GeneratorFunction,
|
|
configurable: !0
|
|
}), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) {
|
|
var ctor = "function" == typeof genFun && genFun.constructor;
|
|
return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name));
|
|
}, exports.mark = function (genFun) {
|
|
return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun;
|
|
}, exports.awrap = function (arg) {
|
|
return {
|
|
__await: arg
|
|
};
|
|
}, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {
|
|
return this;
|
|
}), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {
|
|
void 0 === PromiseImpl && (PromiseImpl = Promise);
|
|
var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);
|
|
return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {
|
|
return result.done ? result.value : iter.next();
|
|
});
|
|
}, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () {
|
|
return this;
|
|
}), define(Gp, "toString", function () {
|
|
return "[object Generator]";
|
|
}), exports.keys = function (val) {
|
|
var object = Object(val),
|
|
keys = [];
|
|
for (var key in object) {
|
|
keys.push(key);
|
|
}
|
|
return keys.reverse(), function next() {
|
|
for (; keys.length;) {
|
|
var key = keys.pop();
|
|
if (key in object) return next.value = key, next.done = !1, next;
|
|
}
|
|
return next.done = !0, next;
|
|
};
|
|
}, exports.values = values, Context.prototype = {
|
|
constructor: Context,
|
|
reset: function reset(skipTempReset) {
|
|
if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) {
|
|
"t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);
|
|
}
|
|
},
|
|
stop: function stop() {
|
|
this.done = !0;
|
|
var rootRecord = this.tryEntries[0].completion;
|
|
if ("throw" === rootRecord.type) throw rootRecord.arg;
|
|
return this.rval;
|
|
},
|
|
dispatchException: function dispatchException(exception) {
|
|
if (this.done) throw exception;
|
|
var context = this;
|
|
function handle(loc, caught) {
|
|
return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught;
|
|
}
|
|
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
|
|
var entry = this.tryEntries[i],
|
|
record = entry.completion;
|
|
if ("root" === entry.tryLoc) return handle("end");
|
|
if (entry.tryLoc <= this.prev) {
|
|
var hasCatch = hasOwn.call(entry, "catchLoc"),
|
|
hasFinally = hasOwn.call(entry, "finallyLoc");
|
|
if (hasCatch && hasFinally) {
|
|
if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
|
|
if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
|
|
} else if (hasCatch) {
|
|
if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);
|
|
} else {
|
|
if (!hasFinally) throw new Error("try statement without catch or finally");
|
|
if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
abrupt: function abrupt(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;
|
|
}
|
|
}
|
|
finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);
|
|
var record = finallyEntry ? finallyEntry.completion : {};
|
|
return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);
|
|
},
|
|
complete: function complete(record, afterLoc) {
|
|
if ("throw" === record.type) throw record.arg;
|
|
return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;
|
|
},
|
|
finish: function finish(finallyLoc) {
|
|
for (var i = this.tryEntries.length - 1; i >= 0; --i) {
|
|
var entry = this.tryEntries[i];
|
|
if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;
|
|
}
|
|
},
|
|
"catch": function _catch(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 ("throw" === record.type) {
|
|
var thrown = record.arg;
|
|
resetTryEntry(entry);
|
|
}
|
|
return thrown;
|
|
}
|
|
}
|
|
throw new Error("illegal catch attempt");
|
|
},
|
|
delegateYield: function delegateYield(iterable, resultName, nextLoc) {
|
|
return this.delegate = {
|
|
iterator: values(iterable),
|
|
resultName: resultName,
|
|
nextLoc: nextLoc
|
|
}, "next" === this.method && (this.arg = undefined), ContinueSentinel;
|
|
}
|
|
}, exports;
|
|
}
|
|
module.exports = _regeneratorRuntime, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ }),
|
|
/* 43 */
|
|
/*!*****************************************************************!*\
|
|
!*** ./node_modules/@babel/runtime/helpers/asyncToGenerator.js ***!
|
|
\*****************************************************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
try {
|
|
var info = gen[key](arg);
|
|
var value = info.value;
|
|
} catch (error) {
|
|
reject(error);
|
|
return;
|
|
}
|
|
if (info.done) {
|
|
resolve(value);
|
|
} else {
|
|
Promise.resolve(value).then(_next, _throw);
|
|
}
|
|
}
|
|
function _asyncToGenerator(fn) {
|
|
return function () {
|
|
var self = this,
|
|
args = arguments;
|
|
return new Promise(function (resolve, reject) {
|
|
var gen = fn.apply(self, args);
|
|
function _next(value) {
|
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
}
|
|
function _throw(err) {
|
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
}
|
|
_next(undefined);
|
|
});
|
|
};
|
|
}
|
|
module.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports["default"] = module.exports;
|
|
|
|
/***/ })
|
|
]]);
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby91bmktbXAtamQvZGlzdC9pbmRleC5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL3dlYnBhY2svYnVpbGRpbi9nbG9iYWwuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlMaWtlVG9BcnJheS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvbm9uSXRlcmFibGVSZXN0LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY3JlYXRlQ2xhc3MuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvUHJvcGVydHlLZXkuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9QcmltaXRpdmUuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jb25zdHJ1Y3QuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheVdpdGhvdXRIb2xlcy5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5LmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVNwcmVhZC5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby91bmktaTE4bi9kaXN0L3VuaS1pMThuLmVzLmpzIiwidW5pLWFwcDovLy9EOi9Qcm9ncmFtIEZpbGVzL0hCdWlsZGVyWC4zLjYuMTguMjAyMzAxMTcvSEJ1aWxkZXJYL3BsdWdpbnMvdW5pYXBwLWNsaS9ub2RlX21vZHVsZXMvQGRjbG91ZGlvL3Z1ZS1jbGktcGx1Z2luLXVuaS9wYWNrYWdlcy9tcC12dWUvZGlzdC9tcC5ydW50aW1lLmVzbS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby92dWUtY2xpLXBsdWdpbi11bmkvcGFja2FnZXMvdnVlLWxvYWRlci9saWIvcnVudGltZS9jb21wb25lbnROb3JtYWxpemVyLmpzIiwidW5pLWFwcDovLy91dGlscy9lY1VJLmpzIiwidW5pLWFwcDovLy91dGlscy9lY0JMRS9lY0JMRS5qcyIsInVuaS1hcHA6Ly8vdXRpbHMvZWNCTEUvZWNCTEVKRC5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BkY2xvdWRpby92dWUtY2xpLXBsdWdpbi11bmkvcGFja2FnZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJ1bmktYXBwOi8vL0Q6L1Byb2dyYW0gRmlsZXMvSEJ1aWxkZXJYLjMuNi4xOC4yMDIzMDExNy9IQnVpbGRlclgvcGx1Z2lucy91bmlhcHAtY2xpL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yUnVudGltZS5qcyIsInVuaS1hcHA6Ly8vRDovUHJvZ3JhbSBGaWxlcy9IQnVpbGRlclguMy42LjE4LjIwMjMwMTE3L0hCdWlsZGVyWC9wbHVnaW5zL3VuaWFwcC1jbGkvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyJdLCJuYW1lcyI6WyJyZWFsQXRvYiIsImI2NCIsImI2NHJlIiwiYXRvYiIsInN0ciIsIlN0cmluZyIsInJlcGxhY2UiLCJ0ZXN0IiwiRXJyb3IiLCJzbGljZSIsImxlbmd0aCIsImJpdG1hcCIsInJlc3VsdCIsInIxIiwicjIiLCJpIiwiaW5kZXhPZiIsImNoYXJBdCIsImZyb21DaGFyQ29kZSIsImI2NERlY29kZVVuaWNvZGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzcGxpdCIsIm1hcCIsImMiLCJjaGFyQ29kZUF0IiwidG9TdHJpbmciLCJqb2luIiwiZ2V0Q3VycmVudFVzZXJJbmZvIiwidG9rZW4iLCJqZCIsImdldFN0b3JhZ2VTeW5jIiwidG9rZW5BcnIiLCJ1aWQiLCJyb2xlIiwicGVybWlzc2lvbiIsInRva2VuRXhwaXJlZCIsInVzZXJJbmZvIiwiSlNPTiIsInBhcnNlIiwiZXJyb3IiLCJtZXNzYWdlIiwiZXhwIiwiaWF0IiwidW5pSWRNaXhpbiIsIlZ1ZSIsInByb3RvdHlwZSIsInVuaUlESGFzUm9sZSIsInJvbGVJZCIsInVuaUlESGFzUGVybWlzc2lvbiIsInBlcm1pc3Npb25JZCIsInVuaUlEVG9rZW5WYWxpZCIsIkRhdGUiLCJub3ciLCJfdG9TdHJpbmciLCJPYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsImlzRm4iLCJmbiIsImlzU3RyIiwiaXNPYmplY3QiLCJvYmoiLCJpc1BsYWluT2JqZWN0IiwiY2FsbCIsImhhc093biIsImtleSIsIm5vb3AiLCJjYWNoZWQiLCJjYWNoZSIsImNyZWF0ZSIsImNhY2hlZEZuIiwiaGl0IiwiY2FtZWxpemVSRSIsImNhbWVsaXplIiwiXyIsInRvVXBwZXJDYXNlIiwiSE9PS1MiLCJnbG9iYWxJbnRlcmNlcHRvcnMiLCJzY29wZWRJbnRlcmNlcHRvcnMiLCJtZXJnZUhvb2siLCJwYXJlbnRWYWwiLCJjaGlsZFZhbCIsInJlcyIsImNvbmNhdCIsIkFycmF5IiwiaXNBcnJheSIsImRlZHVwZUhvb2tzIiwiaG9va3MiLCJwdXNoIiwicmVtb3ZlSG9vayIsImhvb2siLCJpbmRleCIsInNwbGljZSIsIm1lcmdlSW50ZXJjZXB0b3JIb29rIiwiaW50ZXJjZXB0b3IiLCJvcHRpb24iLCJrZXlzIiwiZm9yRWFjaCIsInJlbW92ZUludGVyY2VwdG9ySG9vayIsImFkZEludGVyY2VwdG9yIiwibWV0aG9kIiwicmVtb3ZlSW50ZXJjZXB0b3IiLCJ3cmFwcGVySG9vayIsImRhdGEiLCJpc1Byb21pc2UiLCJ0aGVuIiwicXVldWUiLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjYWxsYmFjayIsIndyYXBwZXJPcHRpb25zIiwib3B0aW9ucyIsIm5hbWUiLCJvbGRDYWxsYmFjayIsImNhbGxiYWNrSW50ZXJjZXB0b3IiLCJ3cmFwcGVyUmV0dXJuVmFsdWUiLCJyZXR1cm5WYWx1ZSIsInJldHVyblZhbHVlSG9va3MiLCJnZXRBcGlJbnRlcmNlcHRvckhvb2tzIiwic2NvcGVkSW50ZXJjZXB0b3IiLCJpbnZva2VBcGkiLCJhcGkiLCJwYXJhbXMiLCJpbnZva2UiLCJwcm9taXNlSW50ZXJjZXB0b3IiLCJyZWplY3QiLCJTWU5DX0FQSV9SRSIsIkNPTlRFWFRfQVBJX1JFIiwiQ09OVEVYVF9BUElfUkVfRVhDIiwiQVNZTkNfQVBJIiwiQ0FMTEJBQ0tfQVBJX1JFIiwiaXNDb250ZXh0QXBpIiwiaXNTeW5jQXBpIiwiaXNDYWxsYmFja0FwaSIsImhhbmRsZVByb21pc2UiLCJjYXRjaCIsImVyciIsInNob3VsZFByb21pc2UiLCJmaW5hbGx5IiwiY29uc3RydWN0b3IiLCJ2YWx1ZSIsInJlYXNvbiIsInByb21pc2lmeSIsInByb21pc2VBcGkiLCJzdWNjZXNzIiwiZmFpbCIsImNvbXBsZXRlIiwiYXNzaWduIiwiRVBTIiwiQkFTRV9ERVZJQ0VfV0lEVEgiLCJpc0lPUyIsImRldmljZVdpZHRoIiwiZGV2aWNlRFBSIiwiY2hlY2tEZXZpY2VXaWR0aCIsImdldFN5c3RlbUluZm9TeW5jIiwicGxhdGZvcm0iLCJwaXhlbFJhdGlvIiwid2luZG93V2lkdGgiLCJ1cHgycHgiLCJudW1iZXIiLCJuZXdEZXZpY2VXaWR0aCIsIk51bWJlciIsIk1hdGgiLCJmbG9vciIsIkxPQ0FMRV9aSF9IQU5TIiwiTE9DQUxFX1pIX0hBTlQiLCJMT0NBTEVfRU4iLCJMT0NBTEVfRlIiLCJMT0NBTEVfRVMiLCJtZXNzYWdlcyIsImxvY2FsZSIsIm5vcm1hbGl6ZUxvY2FsZSIsImxhbmd1YWdlIiwiaW5pdEkxOG5NZXNzYWdlcyIsImlzRW5hYmxlTG9jYWxlIiwibG9jYWxlS2V5cyIsIl9fdW5pQ29uZmlnIiwibG9jYWxlcyIsImN1ck1lc3NhZ2VzIiwidXNlck1lc3NhZ2VzIiwiaTE4biIsImluaXRWdWVJMThuIiwidCIsImkxOG5NaXhpbiIsIm1peGluIiwiYmVmb3JlQ3JlYXRlIiwidW53YXRjaCIsIndhdGNoTG9jYWxlIiwiJGZvcmNlVXBkYXRlIiwiJG9uY2UiLCJtZXRob2RzIiwiJCR0IiwidmFsdWVzIiwic2V0TG9jYWxlIiwiZ2V0TG9jYWxlIiwiaW5pdEFwcExvY2FsZSIsImFwcFZtIiwic3RhdGUiLCJvYnNlcnZhYmxlIiwibG9jYWxlV2F0Y2hlcnMiLCIkd2F0Y2hMb2NhbGUiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsInNldCIsInYiLCJ3YXRjaCIsImluY2x1ZGUiLCJwYXJ0cyIsImZpbmQiLCJwYXJ0Iiwic3RhcnRzV2l0aCIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImxhbmciLCJnZXRMb2NhbGUkMSIsImdldEFwcCIsImFwcCIsImFsbG93RGVmYXVsdCIsIiR2bSIsIiRsb2NhbGUiLCJzZXRMb2NhbGUkMSIsIm9sZExvY2FsZSIsIm9uTG9jYWxlQ2hhbmdlQ2FsbGJhY2tzIiwib25Mb2NhbGVDaGFuZ2UiLCJnbG9iYWwiLCJpbnRlcmNlcHRvcnMiLCJiYXNlQXBpIiwiZnJlZXplIiwiX19wcm90b19fIiwiVVVJRF9LRVkiLCJkZXZpY2VJZCIsInVzZURldmljZUlkIiwicmFuZG9tIiwic2V0U3RvcmFnZSIsImFkZFNhZmVBcmVhSW5zZXRzIiwic2FmZUFyZWEiLCJzYWZlQXJlYUluc2V0cyIsInRvcCIsImxlZnQiLCJyaWdodCIsImJvdHRvbSIsInNjcmVlbkhlaWdodCIsInBvcHVsYXRlUGFyYW1ldGVycyIsImJyYW5kIiwibW9kZWwiLCJzeXN0ZW0iLCJ0aGVtZSIsInZlcnNpb24iLCJmb250U2l6ZVNldHRpbmciLCJTREtWZXJzaW9uIiwiZGV2aWNlT3JpZW50YXRpb24iLCJvc05hbWUiLCJvc1ZlcnNpb24iLCJob3N0VmVyc2lvbiIsImhvc3RWZXJzaW9uTmFtZSIsImRldmljZVR5cGUiLCJnZXRHZXREZXZpY2VUeXBlIiwiZGV2aWNlQnJhbmQiLCJnZXREZXZpY2VCcmFuZCIsIl9ob3N0TmFtZSIsImdldEhvc3ROYW1lIiwiX2RldmljZU9yaWVudGF0aW9uIiwiX2RldmljZVBpeGVsUmF0aW8iLCJfU0RLVmVyc2lvbiIsImhvc3RMYW5ndWFnZSIsInBhcmFtZXRlcnMiLCJhcHBJZCIsInByb2Nlc3MiLCJhcHBOYW1lIiwiYXBwVmVyc2lvbiIsImFwcFZlcnNpb25Db2RlIiwiYXBwTGFuZ3VhZ2UiLCJnZXRBcHBMYW5ndWFnZSIsInVuaUNvbXBpbGVWZXJzaW9uIiwidW5pUnVudGltZVZlcnNpb24iLCJ1bmlQbGF0Zm9ybSIsImRldmljZU1vZGVsIiwiZGV2aWNlUGl4ZWxSYXRpbyIsInRvTG9jYWxlTG93ZXJDYXNlIiwiaG9zdFRoZW1lIiwiaG9zdE5hbWUiLCJob3N0U0RLVmVyc2lvbiIsImhvc3RGb250U2l6ZVNldHRpbmciLCJ3aW5kb3dUb3AiLCJ3aW5kb3dCb3R0b20iLCJvc0xhbmd1YWdlIiwidW5kZWZpbmVkIiwib3NUaGVtZSIsInVhIiwiaG9zdFBhY2thZ2VOYW1lIiwiYnJvd3Nlck5hbWUiLCJicm93c2VyVmVyc2lvbiIsImRldmljZVR5cGVNYXBzIiwiaXBhZCIsIndpbmRvd3MiLCJtYWMiLCJkZXZpY2VUeXBlTWFwc0tleXMiLCJfbW9kZWwiLCJfbSIsImRlZmF1bHRMYW5ndWFnZSIsIl9wbGF0Zm9ybSIsImdldFN5c3RlbUluZm8iLCJwcm90b2NvbHMiLCJ0b2RvcyIsImNhbklVc2VzIiwiQ0FMTEJBQ0tTIiwicHJvY2Vzc0NhbGxiYWNrIiwibWV0aG9kTmFtZSIsInByb2Nlc3NSZXR1cm5WYWx1ZSIsInByb2Nlc3NBcmdzIiwiZnJvbUFyZ3MiLCJhcmdzT3B0aW9uIiwia2VlcEZyb21BcmdzIiwidG9BcmdzIiwia2V5T3B0aW9uIiwiY29uc29sZSIsIndhcm4iLCJrZWVwUmV0dXJuVmFsdWUiLCJ3cmFwcGVyIiwicHJvdG9jb2wiLCJhcmcxIiwiYXJnMiIsImFyZ3MiLCJhcHBseSIsInRvZG9BcGlzIiwiVE9ET1MiLCJjcmVhdGVUb2RvQXBpIiwidG9kb0FwaSIsImVyck1zZyIsInByb3ZpZGVycyIsIm9hdXRoIiwic2hhcmUiLCJwYXltZW50IiwiZ2V0UHJvdmlkZXIiLCJzZXJ2aWNlIiwicHJvdmlkZXIiLCJleHRyYUFwaSIsImdldEVtaXR0ZXIiLCJFbWl0dGVyIiwiZ2V0VW5pRW1pdHRlciIsImN0eCIsIiRvbiIsImFyZ3VtZW50cyIsIiRvZmYiLCIkZW1pdCIsImV2ZW50QXBpIiwidHJ5Q2F0Y2giLCJlIiwiZ2V0QXBpQ2FsbGJhY2tzIiwiYXBpQ2FsbGJhY2tzIiwicGFyYW0iLCJjaWQiLCJjaWRFcnJNc2ciLCJlbmFibGVkIiwibm9ybWFsaXplUHVzaE1lc3NhZ2UiLCJpbnZva2VQdXNoQ2FsbGJhY2siLCJ0eXBlIiwiaW52b2tlR2V0UHVzaENpZENhbGxiYWNrcyIsIm9uUHVzaE1lc3NhZ2VDYWxsYmFja3MiLCJzdG9wcGVkIiwiZ2V0UHVzaENpZENhbGxiYWNrcyIsImdldFB1c2hDbGllbnRJZCIsImhhc1N1Y2Nlc3MiLCJoYXNGYWlsIiwiaGFzQ29tcGxldGUiLCJvblB1c2hNZXNzYWdlIiwib2ZmUHVzaE1lc3NhZ2UiLCJtb2NrcyIsImZpbmRWbUJ5VnVlSWQiLCJ2bSIsInZ1ZVBpZCIsIiRjaGlsZHJlbiIsImNoaWxkVm0iLCIkc2NvcGUiLCJfJHZ1ZUlkIiwicGFyZW50Vm0iLCJpbml0QmVoYXZpb3IiLCJCZWhhdmlvciIsImlzUGFnZSIsInJvdXRlIiwiaW5pdFJlbGF0aW9uIiwiZGV0YWlsIiwidHJpZ2dlckV2ZW50Iiwic2VsZWN0QWxsQ29tcG9uZW50cyIsIm1wSW5zdGFuY2UiLCJzZWxlY3RvciIsIiRyZWZzIiwiY29tcG9uZW50cyIsImNvbXBvbmVudCIsInJlZiIsImRhdGFzZXQiLCJ0b1NraXAiLCJzeW5jUmVmcyIsInJlZnMiLCJuZXdSZWZzIiwib2xkS2V5cyIsIlNldCIsIm5ld0tleXMiLCJvbGRWYWx1ZSIsIm5ld1ZhbHVlIiwiZXZlcnkiLCJpbmNsdWRlcyIsImRlbGV0ZSIsImluaXRSZWZzIiwiZm9yQ29tcG9uZW50cyIsImhhbmRsZUxpbmsiLCJldmVudCIsInZ1ZU9wdGlvbnMiLCJwYXJlbnQiLCJtYXJrTVBDb21wb25lbnQiLCJJU19NUCIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJPQiIsIlNLSVAiLCJpc0V4dGVuc2libGUiLCJNUFBhZ2UiLCJQYWdlIiwiTVBDb21wb25lbnQiLCJDb21wb25lbnQiLCJjdXN0b21pemVSRSIsImN1c3RvbWl6ZSIsImluaXRUcmlnZ2VyRXZlbnQiLCJvbGRUcmlnZ2VyRXZlbnQiLCJuZXdUcmlnZ2VyRXZlbnQiLCJjb21UeXBlIiwiX3RyaWdnZXJFdmVudCIsImluaXRIb29rIiwiaXNDb21wb25lbnQiLCJvbGRIb29rIiwiX18kd3JhcHBlcmVkIiwiYWZ0ZXIiLCJQQUdFX0VWRU5UX0hPT0tTIiwiaW5pdE1vY2tzIiwiJG1wIiwibXBUeXBlIiwibW9jayIsImhhc0hvb2siLCJkZWZhdWx0IiwiZXh0ZW5kT3B0aW9ucyIsInN1cGVyIiwibWl4aW5zIiwiaW5pdEhvb2tzIiwibXBPcHRpb25zIiwiX19jYWxsX2hvb2siLCJpbml0VW5rbm93bkhvb2tzIiwiZXhjbHVkZXMiLCJmaW5kSG9va3MiLCJpbml0SG9vayQxIiwiaW5pdFZ1ZUNvbXBvbmVudCIsIlZ1ZUNvbXBvbmVudCIsImV4dGVuZCIsImluaXRTbG90cyIsInZ1ZVNsb3RzIiwiJHNsb3RzIiwic2xvdE5hbWUiLCIkc2NvcGVkU2xvdHMiLCJpbml0VnVlSWRzIiwidnVlSWRzIiwibGVuIiwiXyR2dWVQaWQiLCJpbml0RGF0YSIsImNvbnRleHQiLCJWVUVfQVBQX0RFQlVHIiwic3RyaW5naWZ5IiwiX19saWZlY3ljbGVfaG9va3NfXyIsIlBST1BfVFlQRVMiLCJCb29sZWFuIiwiY3JlYXRlT2JzZXJ2ZXIiLCJvYnNlcnZlciIsIm5ld1ZhbCIsIm9sZFZhbCIsImluaXRCZWhhdmlvcnMiLCJ2dWVCZWhhdmlvcnMiLCJiZWhhdmlvcnMiLCJ2dWVFeHRlbmRzIiwiZXh0ZW5kcyIsInZ1ZU1peGlucyIsInZ1ZVByb3BzIiwicHJvcHMiLCJiZWhhdmlvciIsInByb3BlcnRpZXMiLCJpbml0UHJvcGVydGllcyIsInZ1ZU1peGluIiwicGFyc2VQcm9wVHlwZSIsImRlZmF1bHRWYWx1ZSIsImZpbGUiLCJpc0JlaGF2aW9yIiwidnVlSWQiLCJzY29wZWRTbG90c0NvbXBpbGVyIiwic2V0RGF0YSIsIm9wdHMiLCJ3cmFwcGVyJDEiLCJtcCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwidGFyZ2V0IiwibWFya2VySWQiLCJnZXRFeHRyYVZhbHVlIiwiZGF0YVBhdGhzQXJyYXkiLCJkYXRhUGF0aEFycmF5IiwiZGF0YVBhdGgiLCJwcm9wUGF0aCIsInZhbHVlUGF0aCIsInZGb3IiLCJpc0ludGVnZXIiLCJzdWJzdHIiLCJfX2dldF92YWx1ZSIsInZGb3JJdGVtIiwidkZvcktleSIsInByb2Nlc3NFdmVudEV4dHJhIiwiZXh0cmEiLCJfX2FyZ3NfXyIsImV4dHJhT2JqIiwiZ2V0T2JqQnlBcnJheSIsImFyciIsImVsZW1lbnQiLCJwcm9jZXNzRXZlbnRBcmdzIiwiaXNDdXN0b20iLCJpc0N1c3RvbU1QRXZlbnQiLCJjdXJyZW50VGFyZ2V0IiwicmV0IiwiYXJnIiwiT05DRSIsIkNVU1RPTSIsImlzTWF0Y2hFdmVudFR5cGUiLCJldmVudFR5cGUiLCJvcHRUeXBlIiwiZ2V0Q29udGV4dFZtIiwiJHBhcmVudCIsIiRvcHRpb25zIiwiZ2VuZXJpYyIsImhhbmRsZUV2ZW50IiwiZXZlbnRPcHRzIiwiZXZlbnRPcHQiLCJldmVudHNBcnJheSIsImlzT25jZSIsImV2ZW50QXJyYXkiLCJoYW5kbGVyQ3R4IiwiaGFuZGxlciIsInBhdGgiLCJpcyIsIm9uY2UiLCJFdmVudENoYW5uZWwiLCJpZCIsImV2ZW50cyIsImxpc3RlbmVyIiwiZW1pdENhY2hlIiwib24iLCJldmVudE5hbWUiLCJmbnMiLCJvcHQiLCJmaWx0ZXIiLCJfYWRkTGlzdGVuZXIiLCJfY2xlYXJDYWNoZSIsImNhY2hlQXJncyIsImVtaXQiLCJzaGlmdCIsImV2ZW50Q2hhbm5lbHMiLCJldmVudENoYW5uZWxTdGFjayIsImdldEV2ZW50Q2hhbm5lbCIsImV2ZW50Q2hhbm5lbCIsImluaXRFdmVudENoYW5uZWwiLCJnZXRPcGVuZXJFdmVudENoYW5uZWwiLCJfX2V2ZW50Q2hhbm5lbF9fIiwiY2FsbEhvb2siLCJfX2lkX18iLCJpbml0U2NvcGVkU2xvdHNQYXJhbXMiLCJjZW50ZXIiLCJwYXJlbnRzIiwiJGhhc1Njb3BlZFNsb3RzUGFyYW1zIiwiaGFzIiwiJGdldFNjb3BlZFNsb3RzUGFyYW1zIiwib2JqZWN0IiwiJHNldFNjb3BlZFNsb3RzUGFyYW1zIiwicHJvcHNEYXRhIiwiZGVzdHJveWVkIiwicGFyc2VCYXNlQXBwIiwic3RvcmUiLCIkc3RvcmUiLCJtcEhvc3QiLCIkaTE4biIsIl9pMThuIiwiYXBwT3B0aW9ucyIsIm9uTGF1bmNoIiwiZ2xvYmFsRGF0YSIsIl9pc01vdW50ZWQiLCJwYXJzZUFwcCIsInBhcnNlQXBwJDEiLCJjcmVhdGVBcHAiLCJBcHAiLCJlbmNvZGVSZXNlcnZlUkUiLCJlbmNvZGVSZXNlcnZlUmVwbGFjZXIiLCJjb21tYVJFIiwiZW5jb2RlIiwiZW5jb2RlVVJJQ29tcG9uZW50Iiwic3RyaW5naWZ5UXVlcnkiLCJlbmNvZGVTdHIiLCJ2YWwiLCJ2YWwyIiwieCIsInBhcnNlQmFzZUNvbXBvbmVudCIsInZ1ZUNvbXBvbmVudE9wdGlvbnMiLCJuZWVkVnVlT3B0aW9ucyIsIm11bHRpcGxlU2xvdHMiLCJhZGRHbG9iYWxDbGFzcyIsImNvbXBvbmVudE9wdGlvbnMiLCJfX2ZpbGUiLCJsaWZldGltZXMiLCJhdHRhY2hlZCIsIiRtb3VudCIsInJlYWR5IiwiZGV0YWNoZWQiLCIkZGVzdHJveSIsInBhZ2VMaWZldGltZXMiLCJzaG93IiwiaGlkZSIsInJlc2l6ZSIsInNpemUiLCJfX2wiLCJfX2UiLCJleHRlcm5hbENsYXNzZXMiLCJ3eHNDYWxsTWV0aG9kcyIsImNhbGxNZXRob2QiLCJwYXJzZUNvbXBvbmVudCIsInBhcnNlQ29tcG9uZW50JDEiLCJob29rcyQxIiwicGFyc2VCYXNlUGFnZSIsInZ1ZVBhZ2VPcHRpb25zIiwicGFnZU9wdGlvbnMiLCJvbkxvYWQiLCJxdWVyeSIsImNvcHlRdWVyeSIsIiRwYWdlIiwiZnVsbFBhdGgiLCJwYXJzZVBhZ2UiLCJwYXJzZVBhZ2UkMSIsImNyZWF0ZVBhZ2UiLCJjcmVhdGVDb21wb25lbnQiLCJjcmVhdGVTdWJwYWNrYWdlQXBwIiwib25TaG93Iiwib25BcHBTaG93Iiwib25IaWRlIiwib25BcHBIaWRlIiwiZ2V0TGF1bmNoT3B0aW9uc1N5bmMiLCJjcmVhdGVQbHVnaW4iLCJjYW5JVXNlQXBpIiwiYXBpTmFtZSIsImNhbklVc2UiLCJ1bmkiLCJQcm94eSIsInVuaSQxIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9fZXNNb2R1bGUiLCJtb2R1bGUiLCJleHBvcnRzIiwiYXJyYXlXaXRoSG9sZXMiLCJyZXF1aXJlIiwiaXRlcmFibGVUb0FycmF5TGltaXQiLCJ1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIm5vbkl0ZXJhYmxlUmVzdCIsIl9zbGljZWRUb0FycmF5IiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX2kiLCJTeW1ib2wiLCJpdGVyYXRvciIsIl9zIiwiX2UiLCJfeCIsIl9yIiwiX2FyciIsIl9uIiwiX2QiLCJuZXh0IiwiZG9uZSIsImFycmF5TGlrZVRvQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJvIiwibWluTGVuIiwibiIsImZyb20iLCJfYXJyYXlMaWtlVG9BcnJheSIsImFycjIiLCJfbm9uSXRlcmFibGVSZXN0IiwiVHlwZUVycm9yIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsInRvUHJvcGVydHlLZXkiLCJfZGVmaW5lUHJvcGVydGllcyIsImRlc2NyaXB0b3IiLCJ3cml0YWJsZSIsIl9jcmVhdGVDbGFzcyIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsIl90eXBlb2YiLCJ0b1ByaW1pdGl2ZSIsIl90b1Byb3BlcnR5S2V5IiwiX3RvUHJpbWl0aXZlIiwiaW5wdXQiLCJoaW50IiwicHJpbSIsIl9kZWZpbmVQcm9wZXJ0eSIsInNldFByb3RvdHlwZU9mIiwiaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiX2NvbnN0cnVjdCIsIlBhcmVudCIsIkNsYXNzIiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImJpbmQiLCJhIiwiRnVuY3Rpb24iLCJfc2V0UHJvdG90eXBlT2YiLCJwIiwiX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCIsInNoYW0iLCJ2YWx1ZU9mIiwiYXJyYXlXaXRob3V0SG9sZXMiLCJpdGVyYWJsZVRvQXJyYXkiLCJub25JdGVyYWJsZVNwcmVhZCIsIl90b0NvbnN1bWFibGVBcnJheSIsIl9hcnJheVdpdGhvdXRIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXkiLCJpdGVyIiwiX25vbkl0ZXJhYmxlU3ByZWFkIiwiZGVmYXVsdERlbGltaXRlcnMiLCJCYXNlRm9ybWF0dGVyIiwiX2NhY2hlcyIsImRlbGltaXRlcnMiLCJ0b2tlbnMiLCJjb21waWxlIiwiUkVfVE9LRU5fTElTVF9WQUxVRSIsIlJFX1RPS0VOX05BTUVEX1ZBTFVFIiwiZm9ybWF0Iiwic3RhcnREZWxpbWl0ZXIiLCJlbmREZWxpbWl0ZXIiLCJwb3NpdGlvbiIsInRleHQiLCJjaGFyIiwic3ViIiwiaXNDbG9zZWQiLCJjb21waWxlZCIsIm1vZGUiLCJwYXJzZUludCIsImRlZmF1bHRGb3JtYXR0ZXIiLCJJMThuIiwiZmFsbGJhY2tMb2NhbGUiLCJ3YXRjaGVyIiwiZm9ybWF0ZXIiLCJ3YXRjaGVycyIsIm92ZXJyaWRlIiwiaW50ZXJwb2xhdGUiLCJ3YXRjaEFwcExvY2FsZSIsIm5ld0xvY2FsZSIsIiR3YXRjaCIsImdldERlZmF1bHRMb2NhbGUiLCJpc1dhdGNoZWRBcHBMb2NhbGUiLCJmIiwiYWRkIiwiaXNTdHJpbmciLCJoYXNJMThuSnNvbiIsImpzb25PYmoiLCJ3YWxrSnNvbk9iaiIsImlzSTE4blN0ciIsInBhcnNlSTE4bkpzb24iLCJjb21waWxlU3RyIiwiY29tcGlsZUkxOG5Kc29uU3RyIiwianNvblN0ciIsImxvY2FsZVZhbHVlcyIsInVuc2hpZnQiLCJjb21waWxlSnNvbk9iaiIsImNvbXBpbGVWYWx1ZSIsInZhbHVlTG9jYWxlcyIsImxvY2FsVmFsdWUiLCJ3YWxrIiwicmVzb2x2ZUxvY2FsZSIsInJlc29sdmVMb2NhbGVDaGFpbiIsImNoYWluIiwicG9wIiwic2hvd01vZGFsIiwidGl0bGUiLCJjb250ZW50IiwiY2IiLCJzaG93Q2FuY2VsIiwic2hvd0xvYWRpbmciLCJtYXNrIiwiaGlkZUxvYWRpbmciLCJsb2dFbmFibGUiLCJpc0FuZHJvaWQiLCJlY0JsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZUNhbGxiYWNrIiwiZWNCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2VDYWxsYmFjayIsImVjRGV2aWNlSWQiLCJlY0dhdHRTZXJ2ZXJVVUlEIiwiZWNHYXR0U2VydmVyVVVJRE9wdGlvbjEiLCJlY0dhdHRTZXJ2ZXJVVUlET3B0aW9uMiIsImVjR2F0dENoYXJhY3RlcmlzdGljV3JpdGVVVUlEIiwiZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSURPcHRpb24xIiwiZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSURPcHRpb24yIiwibG9nIiwib25CbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiLCJfb3BlbkJsdWV0b290aEFkYXB0ZXIiLCJvcGVuQmx1ZXRvb3RoQWRhcHRlciIsIm9rIiwiZXJyQ29kZSIsInN5c3RlbUluZm8iLCJvZmZCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UiLCJhdmFpbGFibGUiLCJvcGVuUmVzIiwib25CbHVldG9vdGhEZXZpY2VGb3VuZCIsIm9mZkJsdWV0b290aERldmljZUZvdW5kIiwiZGV2aWNlIiwiZGV2aWNlcyIsImxvY2FsTmFtZSIsInJzc2kiLCJSU1NJIiwic3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5IiwiYWxsb3dEdXBsaWNhdGVzS2V5IiwicG93ZXJMZXZlbCIsInN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5Iiwib25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UiLCJfY3JlYXRlQkxFQ29ubmVjdGlvbiIsImNyZWF0ZUJMRUNvbm5lY3Rpb24iLCJlcnJubyIsInNldFRpbWVvdXQiLCJnZXRCTEVEZXZpY2VTZXJ2aWNlcyIsInNlcnZpY2VzIiwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzIiwic2VydmljZUlkIiwiY2hhcmFjdGVyaXN0aWNzIiwibm90aWZ5QkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsImNoYXJhY3RlcmlzdGljSWQiLCJzZXRCTEVNVFUiLCJtdHUiLCJvZmZCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UiLCJjb25uZWN0ZWQiLCJzZXJ2aWNlc1Jlc3VsdCIsImNsb3NlQkxFQ29ubmVjdGlvbiIsInV1aWQiLCJjaGFyYWN0ZXJpc3RpY3NSZXN1bHQiLCJjaGFyYWN0ZXJpc3RpYyIsIm5vdGlmeSIsIm5vdGlmeVJlc3VsdCIsIm9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSIsIm9mZkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UiLCJVaW50OEFycmF5IiwidXRmOEJ5dGVzVG9TdHIiLCJzdHJIZXgiLCJwYWRTdGFydCIsIl93cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJidWZmZXIiLCJ3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUiLCJ3cml0ZVR5cGUiLCJpc0hleCIsIkFycmF5QnVmZmVyIiwic3RyVG9VdGY4Qnl0ZXMiLCJ1dGY4Qnl0ZXMiLCJ1bmljb2RlU3RyIiwicG9zIiwiZmxhZyIsInVuaWNvZGUiLCJieXRlcyIsImNvZGUiLCJydW50aW1lIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIk9wIiwiZGVzYyIsIiRTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJDb250aW51ZVNlbnRpbmVsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwicmVjb3JkIiwiX19hd2FpdCIsInVud3JhcHBlZCIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsIm1hcmsiLCJhd3JhcCIsImFzeW5jIiwicmV2ZXJzZSIsInNraXBUZW1wUmVzZXQiLCJwcmV2Iiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiZmluaXNoIiwiX2NhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIs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Q0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakMsa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixhQUFvQjs7QUFFckM7QUFDQTtBQUNBO0FBQ0EsWUFBWSxhQUFvQjs7QUFFaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpQkFBaUIsaUJBQWlCO0FBQ2xDO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQXFDO0FBQ3pDO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyx1QkFBdUI7QUFDekQsaUNBQWlDLHNCQUFzQjtBQUN2RDtBQUNBLGtCQUFrQjtBQUNsQixNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsYUFBb0I7QUFDdEM7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0EsaUJBQWlCLHVCQUF1QjtBQUN4QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsT0FBTyxVQUFVLElBQXFDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsR0FBRyxVQUFVLElBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFtQjtBQUN0QywrQkFBK0I7QUFDL0I7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUIsV0FBVztBQUNYO0FBQ0EsR0FBRyxVQUFVLElBQXFDO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUFxQztBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLE9BQU87QUFDckQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLG9DQUFvQztBQUNwQztBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBRVE7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxTQUFTO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QyxxQ0FBcUMsRUFBRTtBQUNwRjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DLHlDQUF5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QUF1QjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLHFCQUFxQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxxQkFBcUI7QUFDbEM7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxJQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPLE1BQU0sRUFFTjtBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLGlCQUFpQjtBQUNwQztBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsVUFBVSxJQUFxQztBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsT0FBTztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0VBQWtFO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLG1CQUFtQjtBQUN6Qzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixPQUFPO0FBQ3RDLHVDQUF1QztBQUN2QztBQUNBLEdBQUc7QUFDSDtBQUNBLGVBQWUsU0FBUztBQUN4QixzQ0FBc0M7QUFDdEM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJEQUEyRDtBQUMzRDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsVUFBVSxLQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEMsZUFBZTtBQUMzRCxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xELDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxpQkFBaUIsbUJBQW1CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLEtBQUssVUFBVSxLQUFxQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILHFDQUFxQyxnRUFBZ0U7QUFDckc7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILDRCQUE0QiwrQkFBK0I7QUFDM0QsNEJBQTRCLCtCQUErQjtBQUMzRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxtQkFBbUIsbUJBQW1CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXFDO0FBQzNDLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNFQUFzRTs7QUFFdEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLHVGQUF1RjtBQUM1RjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQztBQUMxQyxpQkFBaUIseUJBQXlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLCtCQUErQjtBQUNsQyxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxLQUFxQztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSxLQUFxQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsb0JBQW9CLG9CQUFvQjtBQUN4QyxzQkFBc0IsNEJBQTRCO0FBQ2xEO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLE9BQU87QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsbUJBQW1CO0FBQ25CLHlCQUF5QjtBQUN6QjtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw2Q0FBNkM7QUFDOUU7QUFDQTtBQUNBLDZDQUE2Qyw0Q0FBNEM7O0FBRXpGO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUcsTUFBTSxFQUdOO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLEtBQXFDO0FBQy9DO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsS0FBcUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLLDJDQUEyQyw4QkFBOEIsRUFBRTs7QUFFaEY7QUFDQSx3Q0FBd0MsT0FBTztBQUMvQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixLQUFxQztBQUNyRDtBQUNBLG9CQUFvQixTQUFJO0FBQ3hCO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsbUJBQW1CLHFCQUFxQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxPQUFPO0FBQzlDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxTQUFTO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRLElBQXFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLE9BQU87QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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OztBQUlBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsS0FBcUM7QUFDekQ7QUFDQSxNQUFNLFNBQUU7QUFDUjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsTUFBTSxLQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUMscUJBQXFCLCtCQUErQjtBQUNwRDtBQUNBO0FBQ0EsR0FBRztBQUNILHlCQUF5QjtBQUN6QjtBQUNBLHNCQUFzQixpQ0FBaUM7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0dBQWtHO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSyxNQUFNLEVBRU47QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQXFDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCOztBQUU5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsS0FBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssVUFBVSxJQUFxQztBQUNwRDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG9CQUFvQjtBQUN6QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0EsOEJBQThCO0FBQzlCLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRLEtBQXFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBcUM7QUFDN0M7QUFDQSxLQUFLLE1BQU0sRUFFTjtBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBLHNDQUFzQztBQUN0Qyw4Qzs7QUFFQTtBQUNBLFFBQVEsS0FBcUM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGVBQWU7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE1BQU0sS0FBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsS0FBcUM7QUFDN0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLFlBQVksS0FBcUM7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTs7OztBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQywyQkFBMkIsRUFBRTtBQUN2RSxLQUFLO0FBQ0w7QUFDQSwwQ0FBMEMsNEJBQTRCLEVBQUU7QUFDeEUsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixlQUFlO0FBQzlDLE1BQU0sSUFBcUM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QU8sRUFBRWlCLE1BQU0sRUFBRTtNQUM1QyxJQUFJMnpCLEdBQUcsR0FBRy8zQixFQUFFLENBQUMwUSxLQUFLLENBQUMyaUIsSUFBSSxFQUFFNWlCLElBQUksQ0FBQztNQUM5QixTQUFTdW5CLEtBQUssQ0FBQzd5QixLQUFLLEVBQUU7UUFDcEIyeUIsa0JBQWtCLENBQUNDLEdBQUcsRUFBRTUwQixPQUFPLEVBQUVpQixNQUFNLEVBQUU0ekIsS0FBSyxFQUFFQyxNQUFNLEVBQUUsTUFBTSxFQUFFOXlCLEtBQUssQ0FBQztNQUN4RTtNQUNBLFNBQVM4eUIsTUFBTSxDQUFDbHpCLEdBQUcsRUFBRTtRQUNuQit5QixrQkFBa0IsQ0FBQ0MsR0FBRyxFQUFFNTBCLE9BQU8sRUFBRWlCLE1BQU0sRUFBRTR6QixLQUFLLEVBQUVDLE1BQU0sRUFBRSxPQUFPLEVBQUVsekIsR0FBRyxDQUFDO01BQ3ZFO01BQ0FpekIsS0FBSyxDQUFDM3BCLFNBQVMsQ0FBQztJQUNsQixDQUFDLENBQUM7RUFDSixDQUFDO0FBQ0g7QUFDQWdYLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHNFMsaUJBQWlCLEVBQUU3UyxNQUFNLENBQUNDLE9BQU8sQ0FBQ0YsVUFBVSxHQUFHLElBQUksRUFBRUMsTUFBTSxDQUFDQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUdELE1BQU0sQ0FBQ0MsT0FBTyxDIiwiZmlsZSI6ImNvbW1vbi92ZW5kb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbml0VnVlSTE4biB9IGZyb20gJ0BkY2xvdWRpby91bmktaTE4bic7XHJcbmltcG9ydCBWdWUgZnJvbSAndnVlJztcclxuXHJcbmxldCByZWFsQXRvYjtcclxuXHJcbmNvbnN0IGI2NCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSc7XHJcbmNvbnN0IGI2NHJlID0gL14oPzpbQS1aYS16XFxkKy9dezR9KSo/KD86W0EtWmEtelxcZCsvXXsyfSg/Oj09KT98W0EtWmEtelxcZCsvXXszfT0/KT8kLztcclxuXHJcbmlmICh0eXBlb2YgYXRvYiAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gIHJlYWxBdG9iID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgc3RyID0gU3RyaW5nKHN0cikucmVwbGFjZSgvW1xcdFxcblxcZlxcciBdKy9nLCAnJyk7XHJcbiAgICBpZiAoIWI2NHJlLnRlc3Qoc3RyKSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXRvYicgb24gJ1dpbmRvdyc6IFRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuXCIpIH1cclxuXHJcbiAgICAvLyBBZGRpbmcgdGhlIHBhZGRpbmcgaWYgbWlzc2luZywgZm9yIHNlbXBsaWNpdHlcclxuICAgIHN0ciArPSAnPT0nLnNsaWNlKDIgLSAoc3RyLmxlbmd0aCAmIDMpKTtcclxuICAgIHZhciBiaXRtYXA7IHZhciByZXN1bHQgPSAnJzsgdmFyIHIxOyB2YXIgcjI7IHZhciBpID0gMDtcclxuICAgIGZvciAoOyBpIDwgc3RyLmxlbmd0aDspIHtcclxuICAgICAgYml0bWFwID0gYjY0LmluZGV4T2Yoc3RyLmNoYXJBdChpKyspKSA8PCAxOCB8IGI2NC5pbmRleE9mKHN0ci5jaGFyQXQoaSsrKSkgPDwgMTIgfFxyXG4gICAgICAgICAgICAgICAgICAgIChyMSA9IGI2NC5pbmRleE9mKHN0ci5jaGFyQXQoaSsrKSkpIDw8IDYgfCAocjIgPSBiNjQuaW5kZXhPZihzdHIuY2hhckF0KGkrKykpKTtcclxuXHJcbiAgICAgIHJlc3VsdCArPSByMSA9PT0gNjQgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJpdG1hcCA+PiAxNiAmIDI1NSlcclxuICAgICAgICA6IHIyID09PSA2NCA/IFN0cmluZy5mcm9tQ2hhckNvZGUoYml0bWFwID4+IDE2ICYgMjU1LCBiaXRtYXAgPj4gOCAmIDI1NSlcclxuICAgICAgICAgIDogU3RyaW5nLmZyb21DaGFyQ29kZShiaXRtYXAgPj4gMTYgJiAyNTUsIGJpdG1hcCA+PiA4ICYgMjU1LCBiaXRtYXAgJiAyNTUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdFxyXG4gIH07XHJcbn0gZWxzZSB7XHJcbiAgLy8g5rOo5oSPYXRvYuWPquiDveWcqOWFqOWxgOWvueixoeS4iuiwg+eUqO+8jOS+i+Wmgu+8mmBjb25zdCBCYXNlNjQgPSB7YXRvYn07QmFzZTY0LmF0b2IoJ3h4eHgnKWDmmK/plJnor6/nmoTnlKjms5VcclxuICByZWFsQXRvYiA9IGF0b2I7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGI2NERlY29kZVVuaWNvZGUgKHN0cikge1xyXG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocmVhbEF0b2Ioc3RyKS5zcGxpdCgnJykubWFwKGZ1bmN0aW9uIChjKSB7XHJcbiAgICByZXR1cm4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMilcclxuICB9KS5qb2luKCcnKSlcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJJbmZvICgpIHtcclxuICBjb25zdCB0b2tlbiA9ICggamQpLmdldFN0b3JhZ2VTeW5jKCd1bmlfaWRfdG9rZW4nKSB8fCAnJztcclxuICBjb25zdCB0b2tlbkFyciA9IHRva2VuLnNwbGl0KCcuJyk7XHJcbiAgaWYgKCF0b2tlbiB8fCB0b2tlbkFyci5sZW5ndGggIT09IDMpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpZDogbnVsbCxcclxuICAgICAgcm9sZTogW10sXHJcbiAgICAgIHBlcm1pc3Npb246IFtdLFxyXG4gICAgICB0b2tlbkV4cGlyZWQ6IDBcclxuICAgIH1cclxuICB9XHJcbiAgbGV0IHVzZXJJbmZvO1xyXG4gIHRyeSB7XHJcbiAgICB1c2VySW5mbyA9IEpTT04ucGFyc2UoYjY0RGVjb2RlVW5pY29kZSh0b2tlbkFyclsxXSkpO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ+iOt+WPluW9k+WJjeeUqOaIt+S/oeaBr+WHuumUme+8jOivpue7humUmeivr+S/oeaBr+S4uu+8micgKyBlcnJvci5tZXNzYWdlKVxyXG4gIH1cclxuICB1c2VySW5mby50b2tlbkV4cGlyZWQgPSB1c2VySW5mby5leHAgKiAxMDAwO1xyXG4gIGRlbGV0ZSB1c2VySW5mby5leHA7XHJcbiAgZGVsZXRlIHVzZXJJbmZvLmlhdDtcclxuICByZXR1cm4gdXNlckluZm9cclxufVxyXG5cclxuZnVuY3Rpb24gdW5pSWRNaXhpbiAoVnVlKSB7XHJcbiAgVnVlLnByb3RvdHlwZS51bmlJREhhc1JvbGUgPSBmdW5jdGlvbiAocm9sZUlkKSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIHJvbGVcclxuICAgIH0gPSBnZXRDdXJyZW50VXNlckluZm8oKTtcclxuICAgIHJldHVybiByb2xlLmluZGV4T2Yocm9sZUlkKSA+IC0xXHJcbiAgfTtcclxuICBWdWUucHJvdG90eXBlLnVuaUlESGFzUGVybWlzc2lvbiA9IGZ1bmN0aW9uIChwZXJtaXNzaW9uSWQpIHtcclxuICAgIGNvbnN0IHtcclxuICAgICAgcGVybWlzc2lvblxyXG4gICAgfSA9IGdldEN1cnJlbnRVc2VySW5mbygpO1xyXG4gICAgcmV0dXJuIHRoaXMudW5pSURIYXNSb2xlKCdhZG1pbicpIHx8IHBlcm1pc3Npb24uaW5kZXhPZihwZXJtaXNzaW9uSWQpID4gLTFcclxuICB9O1xyXG4gIFZ1ZS5wcm90b3R5cGUudW5pSURUb2tlblZhbGlkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qge1xyXG4gICAgICB0b2tlbkV4cGlyZWRcclxuICAgIH0gPSBnZXRDdXJyZW50VXNlckluZm8oKTtcclxuICAgIHJldHVybiB0b2tlbkV4cGlyZWQgPiBEYXRlLm5vdygpXHJcbiAgfTtcclxufVxyXG5cclxuY29uc3QgX3RvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcclxuY29uc3QgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xyXG5cclxuZnVuY3Rpb24gaXNGbiAoZm4pIHtcclxuICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU3RyIChzdHIpIHtcclxuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZydcclxufVxyXG5cclxuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xyXG4gIHJldHVybiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcclxufVxyXG5cclxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCAob2JqKSB7XHJcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHtcclxuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSlcclxufVxyXG5cclxuZnVuY3Rpb24gbm9vcCAoKSB7IH1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBjYWNoZWQgdmVyc2lvbiBvZiBhIHB1cmUgZnVuY3Rpb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBjYWNoZWQgKGZuKSB7XHJcbiAgY29uc3QgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gIHJldHVybiBmdW5jdGlvbiBjYWNoZWRGbiAoc3RyKSB7XHJcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdO1xyXG4gICAgcmV0dXJuIGhpdCB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogQ2FtZWxpemUgYSBoeXBoZW4tZGVsaW1pdGVkIHN0cmluZy5cclxuICovXHJcbmNvbnN0IGNhbWVsaXplUkUgPSAvLShcXHcpL2c7XHJcbmNvbnN0IGNhbWVsaXplID0gY2FjaGVkKChzdHIpID0+IHtcclxuICByZXR1cm4gc3RyLnJlcGxhY2UoY2FtZWxpemVSRSwgKF8sIGMpID0+IGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJylcclxufSk7XHJcblxyXG5jb25zdCBIT09LUyA9IFtcclxuICAnaW52b2tlJyxcclxuICAnc3VjY2VzcycsXHJcbiAgJ2ZhaWwnLFxyXG4gICdjb21wbGV0ZScsXHJcbiAgJ3JldHVyblZhbHVlJ1xyXG5dO1xyXG5cclxuY29uc3QgZ2xvYmFsSW50ZXJjZXB0b3JzID0ge307XHJcbmNvbnN0IHNjb3BlZEludGVyY2VwdG9ycyA9IHt9O1xyXG5cclxuZnVuY3Rpb24gbWVyZ2VIb29rIChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XHJcbiAgY29uc3QgcmVzID0gY2hpbGRWYWxcclxuICAgID8gcGFyZW50VmFsXHJcbiAgICAgID8gcGFyZW50VmFsLmNvbmNhdChjaGlsZFZhbClcclxuICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkVmFsKVxyXG4gICAgICAgID8gY2hpbGRWYWwgOiBbY2hpbGRWYWxdXHJcbiAgICA6IHBhcmVudFZhbDtcclxuICByZXR1cm4gcmVzXHJcbiAgICA/IGRlZHVwZUhvb2tzKHJlcylcclxuICAgIDogcmVzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRlZHVwZUhvb2tzIChob29rcykge1xyXG4gIGNvbnN0IHJlcyA9IFtdO1xyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcclxuICAgIGlmIChyZXMuaW5kZXhPZihob29rc1tpXSkgPT09IC0xKSB7XHJcbiAgICAgIHJlcy5wdXNoKGhvb2tzW2ldKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHJlc1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVIb29rIChob29rcywgaG9vaykge1xyXG4gIGNvbnN0IGluZGV4ID0gaG9va3MuaW5kZXhPZihob29rKTtcclxuICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICBob29rcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbWVyZ2VJbnRlcmNlcHRvckhvb2sgKGludGVyY2VwdG9yLCBvcHRpb24pIHtcclxuICBPYmplY3Qua2V5cyhvcHRpb24pLmZvckVhY2goaG9vayA9PiB7XHJcbiAgICBpZiAoSE9PS1MuaW5kZXhPZihob29rKSAhPT0gLTEgJiYgaXNGbihvcHRpb25baG9va10pKSB7XHJcbiAgICAgIGludGVyY2VwdG9yW2hvb2tdID0gbWVyZ2VIb29rKGludGVyY2VwdG9yW2hvb2tdLCBvcHRpb25baG9va10pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVJbnRlcmNlcHRvckhvb2sgKGludGVyY2VwdG9yLCBvcHRpb24pIHtcclxuICBpZiAoIWludGVyY2VwdG9yIHx8ICFvcHRpb24pIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBPYmplY3Qua2V5cyhvcHRpb24pLmZvckVhY2goaG9vayA9PiB7XHJcbiAgICBpZiAoSE9PS1MuaW5kZXhPZihob29rKSAhPT0gLTEgJiYgaXNGbihvcHRpb25baG9va10pKSB7XHJcbiAgICAgIHJlbW92ZUhvb2soaW50ZXJjZXB0b3JbaG9va10sIG9wdGlvbltob29rXSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZEludGVyY2VwdG9yIChtZXRob2QsIG9wdGlvbikge1xyXG4gIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJyAmJiBpc1BsYWluT2JqZWN0KG9wdGlvbikpIHtcclxuICAgIG1lcmdlSW50ZXJjZXB0b3JIb29rKHNjb3BlZEludGVyY2VwdG9yc1ttZXRob2RdIHx8IChzY29wZWRJbnRlcmNlcHRvcnNbbWV0aG9kXSA9IHt9KSwgb3B0aW9uKTtcclxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QobWV0aG9kKSkge1xyXG4gICAgbWVyZ2VJbnRlcmNlcHRvckhvb2soZ2xvYmFsSW50ZXJjZXB0b3JzLCBtZXRob2QpO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVtb3ZlSW50ZXJjZXB0b3IgKG1ldGhvZCwgb3B0aW9uKSB7XHJcbiAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XHJcbiAgICBpZiAoaXNQbGFpbk9iamVjdChvcHRpb24pKSB7XHJcbiAgICAgIHJlbW92ZUludGVyY2VwdG9ySG9vayhzY29wZWRJbnRlcmNlcHRvcnNbbWV0aG9kXSwgb3B0aW9uKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRlbGV0ZSBzY29wZWRJbnRlcmNlcHRvcnNbbWV0aG9kXTtcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QobWV0aG9kKSkge1xyXG4gICAgcmVtb3ZlSW50ZXJjZXB0b3JIb29rKGdsb2JhbEludGVyY2VwdG9ycywgbWV0aG9kKTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyYXBwZXJIb29rIChob29rKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIChkYXRhKSB7XHJcbiAgICByZXR1cm4gaG9vayhkYXRhKSB8fCBkYXRhXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc1Byb21pc2UgKG9iaikge1xyXG4gIHJldHVybiAhIW9iaiAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykgJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHF1ZXVlIChob29rcywgZGF0YSkge1xyXG4gIGxldCBwcm9taXNlID0gZmFsc2U7XHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgaG9vayA9IGhvb2tzW2ldO1xyXG4gICAgaWYgKHByb21pc2UpIHtcclxuICAgICAgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSh3cmFwcGVySG9vayhob29rKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByZXMgPSBob29rKGRhdGEpO1xyXG4gICAgICBpZiAoaXNQcm9taXNlKHJlcykpIHtcclxuICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdGhlbiAoKSB7IH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHByb21pc2UgfHwge1xyXG4gICAgdGhlbiAoY2FsbGJhY2spIHtcclxuICAgICAgcmV0dXJuIGNhbGxiYWNrKGRhdGEpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB3cmFwcGVyT3B0aW9ucyAoaW50ZXJjZXB0b3IsIG9wdGlvbnMgPSB7fSkge1xyXG4gIFsnc3VjY2VzcycsICdmYWlsJywgJ2NvbXBsZXRlJ10uZm9yRWFjaChuYW1lID0+IHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGludGVyY2VwdG9yW25hbWVdKSkge1xyXG4gICAgICBjb25zdCBvbGRDYWxsYmFjayA9IG9wdGlvbnNbbmFtZV07XHJcbiAgICAgIG9wdGlvbnNbbmFtZV0gPSBmdW5jdGlvbiBjYWxsYmFja0ludGVyY2VwdG9yIChyZXMpIHtcclxuICAgICAgICBxdWV1ZShpbnRlcmNlcHRvcltuYW1lXSwgcmVzKS50aGVuKChyZXMpID0+IHtcclxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW1peGVkLW9wZXJhdG9ycyAqL1xyXG4gICAgICAgICAgcmV0dXJuIGlzRm4ob2xkQ2FsbGJhY2spICYmIG9sZENhbGxiYWNrKHJlcykgfHwgcmVzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgcmV0dXJuIG9wdGlvbnNcclxufVxyXG5cclxuZnVuY3Rpb24gd3JhcHBlclJldHVyblZhbHVlIChtZXRob2QsIHJldHVyblZhbHVlKSB7XHJcbiAgY29uc3QgcmV0dXJuVmFsdWVIb29rcyA9IFtdO1xyXG4gIGlmIChBcnJheS5pc0FycmF5KGdsb2JhbEludGVyY2VwdG9ycy5yZXR1cm5WYWx1ZSkpIHtcclxuICAgIHJldHVyblZhbHVlSG9va3MucHVzaCguLi5nbG9iYWxJbnRlcmNlcHRvcnMucmV0dXJuVmFsdWUpO1xyXG4gIH1cclxuICBjb25zdCBpbnRlcmNlcHRvciA9IHNjb3BlZEludGVyY2VwdG9yc1ttZXRob2RdO1xyXG4gIGlmIChpbnRlcmNlcHRvciAmJiBBcnJheS5pc0FycmF5KGludGVyY2VwdG9yLnJldHVyblZhbHVlKSkge1xyXG4gICAgcmV0dXJuVmFsdWVIb29rcy5wdXNoKC4uLmludGVyY2VwdG9yLnJldHVyblZhbHVlKTtcclxuICB9XHJcbiAgcmV0dXJuVmFsdWVIb29rcy5mb3JFYWNoKGhvb2sgPT4ge1xyXG4gICAgcmV0dXJuVmFsdWUgPSBob29rKHJldHVyblZhbHVlKSB8fCByZXR1cm5WYWx1ZTtcclxuICB9KTtcclxuICByZXR1cm4gcmV0dXJuVmFsdWVcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0QXBpSW50ZXJjZXB0b3JIb29rcyAobWV0aG9kKSB7XHJcbiAgY29uc3QgaW50ZXJjZXB0b3IgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gIE9iamVjdC5rZXlzKGdsb2JhbEludGVyY2VwdG9ycykuZm9yRWFjaChob29rID0+IHtcclxuICAgIGlmIChob29rICE9PSAncmV0dXJuVmFsdWUnKSB7XHJcbiAgICAgIGludGVyY2VwdG9yW2hvb2tdID0gZ2xvYmFsSW50ZXJjZXB0b3JzW2hvb2tdLnNsaWNlKCk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgY29uc3Qgc2NvcGVkSW50ZXJjZXB0b3IgPSBzY29wZWRJbnRlcmNlcHRvcnNbbWV0aG9kXTtcclxuICBpZiAoc2NvcGVkSW50ZXJjZXB0b3IpIHtcclxuICAgIE9iamVjdC5rZXlzKHNjb3BlZEludGVyY2VwdG9yKS5mb3JFYWNoKGhvb2sgPT4ge1xyXG4gICAgICBpZiAoaG9vayAhPT0gJ3JldHVyblZhbHVlJykge1xyXG4gICAgICAgIGludGVyY2VwdG9yW2hvb2tdID0gKGludGVyY2VwdG9yW2hvb2tdIHx8IFtdKS5jb25jYXQoc2NvcGVkSW50ZXJjZXB0b3JbaG9va10pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmV0dXJuIGludGVyY2VwdG9yXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGludm9rZUFwaSAobWV0aG9kLCBhcGksIG9wdGlvbnMsIC4uLnBhcmFtcykge1xyXG4gIGNvbnN0IGludGVyY2VwdG9yID0gZ2V0QXBpSW50ZXJjZXB0b3JIb29rcyhtZXRob2QpO1xyXG4gIGlmIChpbnRlcmNlcHRvciAmJiBPYmplY3Qua2V5cyhpbnRlcmNlcHRvcikubGVuZ3RoKSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnRlcmNlcHRvci5pbnZva2UpKSB7XHJcbiAgICAgIGNvbnN0IHJlcyA9IHF1ZXVlKGludGVyY2VwdG9yLmludm9rZSwgb3B0aW9ucyk7XHJcbiAgICAgIHJldHVybiByZXMudGhlbigob3B0aW9ucykgPT4ge1xyXG4gICAgICAgIHJldHVybiBhcGkod3JhcHBlck9wdGlvbnMoaW50ZXJjZXB0b3IsIG9wdGlvbnMpLCAuLi5wYXJhbXMpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gYXBpKHdyYXBwZXJPcHRpb25zKGludGVyY2VwdG9yLCBvcHRpb25zKSwgLi4ucGFyYW1zKVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gYXBpKG9wdGlvbnMsIC4uLnBhcmFtcylcclxufVxyXG5cclxuY29uc3QgcHJvbWlzZUludGVyY2VwdG9yID0ge1xyXG4gIHJldHVyblZhbHVlIChyZXMpIHtcclxuICAgIGlmICghaXNQcm9taXNlKHJlcykpIHtcclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgcmVzLnRoZW4ocmVzID0+IHtcclxuICAgICAgICBpZiAocmVzWzBdKSB7XHJcbiAgICAgICAgICByZWplY3QocmVzWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXNbMV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KVxyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IFNZTkNfQVBJX1JFID1cclxuICAvXlxcJHxXaW5kb3ckfFdpbmRvd1N0eWxlJHxzZW5kSG9zdEV2ZW50fHNlbmROYXRpdmVFdmVudHxyZXN0b3JlR2xvYmFsfHJlcXVpcmVHbG9iYWx8Z2V0Q3VycmVudFN1Yk5WdWV8Z2V0TWVudUJ1dHRvbkJvdW5kaW5nQ2xpZW50UmVjdHxecmVwb3J0fGludGVyY2VwdG9yc3xJbnRlcmNlcHRvciR8Z2V0U3ViTlZ1ZUJ5SWR8cmVxdWlyZU5hdGl2ZVBsdWdpbnx1cHgycHh8aGlkZUtleWJvYXJkfGNhbklVc2V8XmNyZWF0ZXxTeW5jJHxNYW5hZ2VyJHxiYXNlNjRUb0FycmF5QnVmZmVyfGFycmF5QnVmZmVyVG9CYXNlNjR8Z2V0TG9jYWxlfHNldExvY2FsZXxpbnZva2VQdXNoQ2FsbGJhY2t8Z2V0V2luZG93SW5mb3xnZXREZXZpY2VJbmZvfGdldEFwcEJhc2VJbmZvfGdldFN5c3RlbVNldHRpbmd8Z2V0QXBwQXV0aG9yaXplU2V0dGluZy87XHJcblxyXG5jb25zdCBDT05URVhUX0FQSV9SRSA9IC9eY3JlYXRlfE1hbmFnZXIkLztcclxuXHJcbi8vIENvbnRleHTkvovlpJbmg4XlhrVcclxuY29uc3QgQ09OVEVYVF9BUElfUkVfRVhDID0gWydjcmVhdGVCTEVDb25uZWN0aW9uJ107XHJcblxyXG4vLyDlkIzmraXkvovlpJbmg4XlhrVcclxuY29uc3QgQVNZTkNfQVBJID0gWydjcmVhdGVCTEVDb25uZWN0aW9uJywgJ2NyZWF0ZVB1c2hNZXNzYWdlJ107XHJcblxyXG5jb25zdCBDQUxMQkFDS19BUElfUkUgPSAvXm9ufF5vZmYvO1xyXG5cclxuZnVuY3Rpb24gaXNDb250ZXh0QXBpIChuYW1lKSB7XHJcbiAgcmV0dXJuIENPTlRFWFRfQVBJX1JFLnRlc3QobmFtZSkgJiYgQ09OVEVYVF9BUElfUkVfRVhDLmluZGV4T2YobmFtZSkgPT09IC0xXHJcbn1cclxuZnVuY3Rpb24gaXNTeW5jQXBpIChuYW1lKSB7XHJcbiAgcmV0dXJuIFNZTkNfQVBJX1JFLnRlc3QobmFtZSkgJiYgQVNZTkNfQVBJLmluZGV4T2YobmFtZSkgPT09IC0xXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzQ2FsbGJhY2tBcGkgKG5hbWUpIHtcclxuICByZXR1cm4gQ0FMTEJBQ0tfQVBJX1JFLnRlc3QobmFtZSkgJiYgbmFtZSAhPT0gJ29uUHVzaCdcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlUHJvbWlzZSAocHJvbWlzZSkge1xyXG4gIHJldHVybiBwcm9taXNlLnRoZW4oZGF0YSA9PiB7XHJcbiAgICByZXR1cm4gW251bGwsIGRhdGFdXHJcbiAgfSlcclxuICAgIC5jYXRjaChlcnIgPT4gW2Vycl0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3VsZFByb21pc2UgKG5hbWUpIHtcclxuICBpZiAoXHJcbiAgICBpc0NvbnRleHRBcGkobmFtZSkgfHxcclxuICAgIGlzU3luY0FwaShuYW1lKSB8fFxyXG4gICAgaXNDYWxsYmFja0FwaShuYW1lKVxyXG4gICkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIHJldHVybiB0cnVlXHJcbn1cclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG5vLWV4dGVuZC1uYXRpdmUgKi9cclxuaWYgKCFQcm9taXNlLnByb3RvdHlwZS5maW5hbGx5KSB7XHJcbiAgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xyXG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuY29uc3RydWN0b3I7XHJcbiAgICByZXR1cm4gdGhpcy50aGVuKFxyXG4gICAgICB2YWx1ZSA9PiBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbigoKSA9PiB2YWx1ZSksXHJcbiAgICAgIHJlYXNvbiA9PiBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhyb3cgcmVhc29uXHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvbWlzaWZ5IChuYW1lLCBhcGkpIHtcclxuICBpZiAoIXNob3VsZFByb21pc2UobmFtZSkgfHwgIWlzRm4oYXBpKSkge1xyXG4gICAgcmV0dXJuIGFwaVxyXG4gIH1cclxuICByZXR1cm4gZnVuY3Rpb24gcHJvbWlzZUFwaSAob3B0aW9ucyA9IHt9LCAuLi5wYXJhbXMpIHtcclxuICAgIGlmIChpc0ZuKG9wdGlvbnMuc3VjY2VzcykgfHwgaXNGbihvcHRpb25zLmZhaWwpIHx8IGlzRm4ob3B0aW9ucy5jb21wbGV0ZSkpIHtcclxuICAgICAgcmV0dXJuIHdyYXBwZXJSZXR1cm5WYWx1ZShuYW1lLCBpbnZva2VBcGkobmFtZSwgYXBpLCBvcHRpb25zLCAuLi5wYXJhbXMpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHdyYXBwZXJSZXR1cm5WYWx1ZShuYW1lLCBoYW5kbGVQcm9taXNlKG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaW52b2tlQXBpKG5hbWUsIGFwaSwgT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xyXG4gICAgICAgIHN1Y2Nlc3M6IHJlc29sdmUsXHJcbiAgICAgICAgZmFpbDogcmVqZWN0XHJcbiAgICAgIH0pLCAuLi5wYXJhbXMpO1xyXG4gICAgfSkpKVxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgRVBTID0gMWUtNDtcclxuY29uc3QgQkFTRV9ERVZJQ0VfV0lEVEggPSA3NTA7XHJcbmxldCBpc0lPUyA9IGZhbHNlO1xyXG5sZXQgZGV2aWNlV2lkdGggPSAwO1xyXG5sZXQgZGV2aWNlRFBSID0gMDtcclxuXHJcbmZ1bmN0aW9uIGNoZWNrRGV2aWNlV2lkdGggKCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHBsYXRmb3JtLFxyXG4gICAgcGl4ZWxSYXRpbyxcclxuICAgIHdpbmRvd1dpZHRoXHJcbiAgfSA9IGpkLmdldFN5c3RlbUluZm9TeW5jKCk7IC8vIHVuaT0+amQgcnVudGltZSDnvJbor5Hnm67moIfmmK8gdW5pIOWvueixoe+8jOWGhemDqOS4jeWFgeiuuOebtOaOpeS9v+eUqCB1bmlcclxuXHJcbiAgZGV2aWNlV2lkdGggPSB3aW5kb3dXaWR0aDtcclxuICBkZXZpY2VEUFIgPSBwaXhlbFJhdGlvO1xyXG4gIGlzSU9TID0gcGxhdGZvcm0gPT09ICdpb3MnO1xyXG59XHJcblxyXG5mdW5jdGlvbiB1cHgycHggKG51bWJlciwgbmV3RGV2aWNlV2lkdGgpIHtcclxuICBpZiAoZGV2aWNlV2lkdGggPT09IDApIHtcclxuICAgIGNoZWNrRGV2aWNlV2lkdGgoKTtcclxuICB9XHJcblxyXG4gIG51bWJlciA9IE51bWJlcihudW1iZXIpO1xyXG4gIGlmIChudW1iZXIgPT09IDApIHtcclxuICAgIHJldHVybiAwXHJcbiAgfVxyXG4gIGxldCByZXN1bHQgPSAobnVtYmVyIC8gQkFTRV9ERVZJQ0VfV0lEVEgpICogKG5ld0RldmljZVdpZHRoIHx8IGRldmljZVdpZHRoKTtcclxuICBpZiAocmVzdWx0IDwgMCkge1xyXG4gICAgcmVzdWx0ID0gLXJlc3VsdDtcclxuICB9XHJcbiAgcmVzdWx0ID0gTWF0aC5mbG9vcihyZXN1bHQgKyBFUFMpO1xyXG4gIGlmIChyZXN1bHQgPT09IDApIHtcclxuICAgIGlmIChkZXZpY2VEUFIgPT09IDEgfHwgIWlzSU9TKSB7XHJcbiAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXN1bHQgPSAwLjU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBudW1iZXIgPCAwID8gLXJlc3VsdCA6IHJlc3VsdFxyXG59XHJcblxyXG5jb25zdCBMT0NBTEVfWkhfSEFOUyA9ICd6aC1IYW5zJztcclxuY29uc3QgTE9DQUxFX1pIX0hBTlQgPSAnemgtSGFudCc7XHJcbmNvbnN0IExPQ0FMRV9FTiA9ICdlbic7XHJcbmNvbnN0IExPQ0FMRV9GUiA9ICdmcic7XHJcbmNvbnN0IExPQ0FMRV9FUyA9ICdlcyc7XHJcblxyXG5jb25zdCBtZXNzYWdlcyA9IHt9O1xyXG5cclxubGV0IGxvY2FsZTtcclxuXHJcbntcclxuICBsb2NhbGUgPSBub3JtYWxpemVMb2NhbGUoamQuZ2V0U3lzdGVtSW5mb1N5bmMoKS5sYW5ndWFnZSkgfHwgTE9DQUxFX0VOO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0STE4bk1lc3NhZ2VzICgpIHtcclxuICBpZiAoIWlzRW5hYmxlTG9jYWxlKCkpIHtcclxuICAgIHJldHVyblxyXG4gIH1cclxuICBjb25zdCBsb2NhbGVLZXlzID0gT2JqZWN0LmtleXMoX191bmlDb25maWcubG9jYWxlcyk7XHJcbiAgaWYgKGxvY2FsZUtleXMubGVuZ3RoKSB7XHJcbiAgICBsb2NhbGVLZXlzLmZvckVhY2goKGxvY2FsZSkgPT4ge1xyXG4gICAgICBjb25zdCBjdXJNZXNzYWdlcyA9IG1lc3NhZ2VzW2xvY2FsZV07XHJcbiAgICAgIGNvbnN0IHVzZXJNZXNzYWdlcyA9IF9fdW5pQ29uZmlnLmxvY2FsZXNbbG9jYWxlXTtcclxuICAgICAgaWYgKGN1ck1lc3NhZ2VzKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjdXJNZXNzYWdlcywgdXNlck1lc3NhZ2VzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBtZXNzYWdlc1tsb2NhbGVdID0gdXNlck1lc3NhZ2VzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmluaXRJMThuTWVzc2FnZXMoKTtcclxuXHJcbmNvbnN0IGkxOG4gPSBpbml0VnVlSTE4bihcclxuICBsb2NhbGUsXHJcbiAgIHt9XHJcbik7XHJcbmNvbnN0IHQgPSBpMThuLnQ7XHJcbmNvbnN0IGkxOG5NaXhpbiA9IChpMThuLm1peGluID0ge1xyXG4gIGJlZm9yZUNyZWF0ZSAoKSB7XHJcbiAgICBjb25zdCB1bndhdGNoID0gaTE4bi5pMThuLndhdGNoTG9jYWxlKCgpID0+IHtcclxuICAgICAgdGhpcy4kZm9yY2VVcGRhdGUoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy4kb25jZSgnaG9vazpiZWZvcmVEZXN0cm95JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICB1bndhdGNoKCk7XHJcbiAgICB9KTtcclxuICB9LFxyXG4gIG1ldGhvZHM6IHtcclxuICAgICQkdCAoa2V5LCB2YWx1ZXMpIHtcclxuICAgICAgcmV0dXJuIHQoa2V5LCB2YWx1ZXMpXHJcbiAgICB9XHJcbiAgfVxyXG59KTtcclxuY29uc3Qgc2V0TG9jYWxlID0gaTE4bi5zZXRMb2NhbGU7XHJcbmNvbnN0IGdldExvY2FsZSA9IGkxOG4uZ2V0TG9jYWxlO1xyXG5cclxuZnVuY3Rpb24gaW5pdEFwcExvY2FsZSAoVnVlLCBhcHBWbSwgbG9jYWxlKSB7XHJcbiAgY29uc3Qgc3RhdGUgPSBWdWUub2JzZXJ2YWJsZSh7XHJcbiAgICBsb2NhbGU6IGxvY2FsZSB8fCBpMThuLmdldExvY2FsZSgpXHJcbiAgfSk7XHJcbiAgY29uc3QgbG9jYWxlV2F0Y2hlcnMgPSBbXTtcclxuICBhcHBWbS4kd2F0Y2hMb2NhbGUgPSBmbiA9PiB7XHJcbiAgICBsb2NhbGVXYXRjaGVycy5wdXNoKGZuKTtcclxuICB9O1xyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcHBWbSwgJyRsb2NhbGUnLCB7XHJcbiAgICBnZXQgKCkge1xyXG4gICAgICByZXR1cm4gc3RhdGUubG9jYWxlXHJcbiAgICB9LFxyXG4gICAgc2V0ICh2KSB7XHJcbiAgICAgIHN0YXRlLmxvY2FsZSA9IHY7XHJcbiAgICAgIGxvY2FsZVdhdGNoZXJzLmZvckVhY2god2F0Y2ggPT4gd2F0Y2godikpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0VuYWJsZUxvY2FsZSAoKSB7XHJcbiAgcmV0dXJuIHR5cGVvZiBfX3VuaUNvbmZpZyAhPT0gJ3VuZGVmaW5lZCcgJiYgX191bmlDb25maWcubG9jYWxlcyAmJiAhIU9iamVjdC5rZXlzKF9fdW5pQ29uZmlnLmxvY2FsZXMpLmxlbmd0aFxyXG59XHJcblxyXG5mdW5jdGlvbiBpbmNsdWRlIChzdHIsIHBhcnRzKSB7XHJcbiAgcmV0dXJuICEhcGFydHMuZmluZCgocGFydCkgPT4gc3RyLmluZGV4T2YocGFydCkgIT09IC0xKVxyXG59XHJcblxyXG5mdW5jdGlvbiBzdGFydHNXaXRoIChzdHIsIHBhcnRzKSB7XHJcbiAgcmV0dXJuIHBhcnRzLmZpbmQoKHBhcnQpID0+IHN0ci5pbmRleE9mKHBhcnQpID09PSAwKVxyXG59XHJcblxyXG5mdW5jdGlvbiBub3JtYWxpemVMb2NhbGUgKGxvY2FsZSwgbWVzc2FnZXMpIHtcclxuICBpZiAoIWxvY2FsZSkge1xyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG4gIGxvY2FsZSA9IGxvY2FsZS50cmltKCkucmVwbGFjZSgvXy9nLCAnLScpO1xyXG4gIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlc1tsb2NhbGVdKSB7XHJcbiAgICByZXR1cm4gbG9jYWxlXHJcbiAgfVxyXG4gIGxvY2FsZSA9IGxvY2FsZS50b0xvd2VyQ2FzZSgpO1xyXG4gIGlmIChsb2NhbGUgPT09ICdjaGluZXNlJykge1xyXG4gICAgLy8g5pSv5LuY5a6dXHJcbiAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlNcclxuICB9XHJcbiAgaWYgKGxvY2FsZS5pbmRleE9mKCd6aCcpID09PSAwKSB7XHJcbiAgICBpZiAobG9jYWxlLmluZGV4T2YoJy1oYW5zJykgPiAtMSkge1xyXG4gICAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlNcclxuICAgIH1cclxuICAgIGlmIChsb2NhbGUuaW5kZXhPZignLWhhbnQnKSA+IC0xKSB7XHJcbiAgICAgIHJldHVybiBMT0NBTEVfWkhfSEFOVFxyXG4gICAgfVxyXG4gICAgaWYgKGluY2x1ZGUobG9jYWxlLCBbJy10dycsICctaGsnLCAnLW1vJywgJy1jaHQnXSkpIHtcclxuICAgICAgcmV0dXJuIExPQ0FMRV9aSF9IQU5UXHJcbiAgICB9XHJcbiAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlNcclxuICB9XHJcbiAgY29uc3QgbGFuZyA9IHN0YXJ0c1dpdGgobG9jYWxlLCBbTE9DQUxFX0VOLCBMT0NBTEVfRlIsIExPQ0FMRV9FU10pO1xyXG4gIGlmIChsYW5nKSB7XHJcbiAgICByZXR1cm4gbGFuZ1xyXG4gIH1cclxufVxyXG4vLyBleHBvcnQgZnVuY3Rpb24gaW5pdEkxOG4oKSB7XHJcbi8vICAgY29uc3QgbG9jYWxlS2V5cyA9IE9iamVjdC5rZXlzKF9fdW5pQ29uZmlnLmxvY2FsZXMgfHwge30pXHJcbi8vICAgaWYgKGxvY2FsZUtleXMubGVuZ3RoKSB7XHJcbi8vICAgICBsb2NhbGVLZXlzLmZvckVhY2goKGxvY2FsZSkgPT5cclxuLy8gICAgICAgaTE4bi5hZGQobG9jYWxlLCBfX3VuaUNvbmZpZy5sb2NhbGVzW2xvY2FsZV0pXHJcbi8vICAgICApXHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG5mdW5jdGlvbiBnZXRMb2NhbGUkMSAoKSB7XHJcbiAgLy8g5LyY5YWI5L2/55SoICRsb2NhbGVcclxuICBpZiAoaXNGbihnZXRBcHApKSB7XHJcbiAgICBjb25zdCBhcHAgPSBnZXRBcHAoe1xyXG4gICAgICBhbGxvd0RlZmF1bHQ6IHRydWVcclxuICAgIH0pO1xyXG4gICAgaWYgKGFwcCAmJiBhcHAuJHZtKSB7XHJcbiAgICAgIHJldHVybiBhcHAuJHZtLiRsb2NhbGVcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG5vcm1hbGl6ZUxvY2FsZShqZC5nZXRTeXN0ZW1JbmZvU3luYygpLmxhbmd1YWdlKSB8fCBMT0NBTEVfRU5cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0TG9jYWxlJDEgKGxvY2FsZSkge1xyXG4gIGNvbnN0IGFwcCA9IGlzRm4oZ2V0QXBwKSA/IGdldEFwcCgpIDogZmFsc2U7XHJcbiAgaWYgKCFhcHApIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICBjb25zdCBvbGRMb2NhbGUgPSBhcHAuJHZtLiRsb2NhbGU7XHJcbiAgaWYgKG9sZExvY2FsZSAhPT0gbG9jYWxlKSB7XHJcbiAgICBhcHAuJHZtLiRsb2NhbGUgPSBsb2NhbGU7XHJcbiAgICBvbkxvY2FsZUNoYW5nZUNhbGxiYWNrcy5mb3JFYWNoKChmbikgPT4gZm4oe1xyXG4gICAgICBsb2NhbGVcclxuICAgIH0pKTtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZVxyXG59XHJcblxyXG5jb25zdCBvbkxvY2FsZUNoYW5nZUNhbGxiYWNrcyA9IFtdO1xyXG5mdW5jdGlvbiBvbkxvY2FsZUNoYW5nZSAoZm4pIHtcclxuICBpZiAob25Mb2NhbGVDaGFuZ2VDYWxsYmFja3MuaW5kZXhPZihmbikgPT09IC0xKSB7XHJcbiAgICBvbkxvY2FsZUNoYW5nZUNhbGxiYWNrcy5wdXNoKGZuKTtcclxuICB9XHJcbn1cclxuXHJcbmlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xyXG4gIGdsb2JhbC5nZXRMb2NhbGUgPSBnZXRMb2NhbGUkMTtcclxufVxyXG5cclxuY29uc3QgaW50ZXJjZXB0b3JzID0ge1xyXG4gIHByb21pc2VJbnRlcmNlcHRvclxyXG59O1xyXG5cclxudmFyIGJhc2VBcGkgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XHJcbiAgX19wcm90b19fOiBudWxsLFxyXG4gIHVweDJweDogdXB4MnB4LFxyXG4gIGdldExvY2FsZTogZ2V0TG9jYWxlJDEsXHJcbiAgc2V0TG9jYWxlOiBzZXRMb2NhbGUkMSxcclxuICBvbkxvY2FsZUNoYW5nZTogb25Mb2NhbGVDaGFuZ2UsXHJcbiAgYWRkSW50ZXJjZXB0b3I6IGFkZEludGVyY2VwdG9yLFxyXG4gIHJlbW92ZUludGVyY2VwdG9yOiByZW1vdmVJbnRlcmNlcHRvcixcclxuICBpbnRlcmNlcHRvcnM6IGludGVyY2VwdG9yc1xyXG59KTtcclxuXHJcbmNvbnN0IFVVSURfS0VZID0gJ19fRENfU1RBVF9VVUlEJztcclxubGV0IGRldmljZUlkO1xyXG5mdW5jdGlvbiB1c2VEZXZpY2VJZCAocmVzdWx0KSB7XHJcbiAgZGV2aWNlSWQgPSBkZXZpY2VJZCB8fCBqZC5nZXRTdG9yYWdlU3luYyhVVUlEX0tFWSk7XHJcbiAgaWYgKCFkZXZpY2VJZCkge1xyXG4gICAgZGV2aWNlSWQgPSBEYXRlLm5vdygpICsgJycgKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxZTcpO1xyXG4gICAgamQuc2V0U3RvcmFnZSh7XHJcbiAgICAgIGtleTogVVVJRF9LRVksXHJcbiAgICAgIGRhdGE6IGRldmljZUlkXHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmVzdWx0LmRldmljZUlkID0gZGV2aWNlSWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZFNhZmVBcmVhSW5zZXRzIChyZXN1bHQpIHtcclxuICBpZiAocmVzdWx0LnNhZmVBcmVhKSB7XHJcbiAgICBjb25zdCBzYWZlQXJlYSA9IHJlc3VsdC5zYWZlQXJlYTtcclxuICAgIHJlc3VsdC5zYWZlQXJlYUluc2V0cyA9IHtcclxuICAgICAgdG9wOiBzYWZlQXJlYS50b3AsXHJcbiAgICAgIGxlZnQ6IHNhZmVBcmVhLmxlZnQsXHJcbiAgICAgIHJpZ2h0OiByZXN1bHQud2luZG93V2lkdGggLSBzYWZlQXJlYS5yaWdodCxcclxuICAgICAgYm90dG9tOiByZXN1bHQuc2NyZWVuSGVpZ2h0IC0gc2FmZUFyZWEuYm90dG9tXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcG9wdWxhdGVQYXJhbWV0ZXJzIChyZXN1bHQpIHtcclxuICBjb25zdCB7XHJcbiAgICBicmFuZCA9ICcnLCBtb2RlbCA9ICcnLCBzeXN0ZW0gPSAnJyxcclxuICAgIGxhbmd1YWdlID0gJycsIHRoZW1lLCB2ZXJzaW9uLFxyXG4gICAgcGxhdGZvcm0sIGZvbnRTaXplU2V0dGluZyxcclxuICAgIFNES1ZlcnNpb24sIHBpeGVsUmF0aW8sIGRldmljZU9yaWVudGF0aW9uXHJcbiAgfSA9IHJlc3VsdDtcclxuICAvLyBjb25zdCBpc1F1aWNrQXBwID0gXCJtcC1qZFwiLmluZGV4T2YoJ3F1aWNrYXBwLXdlYnZpZXcnKSAhPT0gLTFcclxuXHJcbiAgLy8gb3NOYW1lIG9zVmVyc2lvblxyXG4gIGxldCBvc05hbWUgPSAnJztcclxuICBsZXQgb3NWZXJzaW9uID0gJyc7XHJcbiAge1xyXG4gICAgb3NOYW1lID0gc3lzdGVtLnNwbGl0KCcgJylbMF0gfHwgJyc7XHJcbiAgICBvc1ZlcnNpb24gPSBzeXN0ZW0uc3BsaXQoJyAnKVsxXSB8fCAnJztcclxuICB9XHJcbiAgbGV0IGhvc3RWZXJzaW9uID0gdmVyc2lvbjtcclxuICB7XHJcbiAgICBob3N0VmVyc2lvbiA9IHJlc3VsdC5ob3N0VmVyc2lvbk5hbWU7XHJcbiAgfVxyXG5cclxuICAvLyBkZXZpY2VUeXBlXHJcbiAgY29uc3QgZGV2aWNlVHlwZSA9IGdldEdldERldmljZVR5cGUocmVzdWx0LCBtb2RlbCk7XHJcblxyXG4gIC8vIGRldmljZU1vZGVsXHJcbiAgY29uc3QgZGV2aWNlQnJhbmQgPSBnZXREZXZpY2VCcmFuZChicmFuZCk7XHJcblxyXG4gIC8vIGhvc3ROYW1lXHJcbiAgY29uc3QgX2hvc3ROYW1lID0gZ2V0SG9zdE5hbWUocmVzdWx0KTtcclxuXHJcbiAgLy8gZGV2aWNlT3JpZW50YXRpb25cclxuICBsZXQgX2RldmljZU9yaWVudGF0aW9uID0gZGV2aWNlT3JpZW50YXRpb247IC8vIOS7hSDlvq7kv6Eg55m+5bqmIOaUr+aMgVxyXG5cclxuICAvLyBkZXZpY2VQaXhlbFJhdGlvXHJcbiAgbGV0IF9kZXZpY2VQaXhlbFJhdGlvID0gcGl4ZWxSYXRpbztcclxuXHJcbiAgLy8gU0RLVmVyc2lvblxyXG4gIGxldCBfU0RLVmVyc2lvbiA9IFNES1ZlcnNpb247XHJcblxyXG4gIC8vIGhvc3RMYW5ndWFnZVxyXG4gIGNvbnN0IGhvc3RMYW5ndWFnZSA9IGxhbmd1YWdlLnJlcGxhY2UoL18vZywgJy0nKTtcclxuXHJcbiAgLy8gd3guZ2V0QWNjb3VudEluZm9TeW5jXHJcblxyXG4gIGNvbnN0IHBhcmFtZXRlcnMgPSB7XHJcbiAgICBhcHBJZDogcHJvY2Vzcy5lbnYuVU5JX0FQUF9JRCxcclxuICAgIGFwcE5hbWU6IHByb2Nlc3MuZW52LlVOSV9BUFBfTkFNRSxcclxuICAgIGFwcFZlcnNpb246IHByb2Nlc3MuZW52LlVOSV9BUFBfVkVSU0lPTl9OQU1FLFxyXG4gICAgYXBwVmVyc2lvbkNvZGU6IHByb2Nlc3MuZW52LlVOSV9BUFBfVkVSU0lPTl9DT0RFLFxyXG4gICAgYXBwTGFuZ3VhZ2U6IGdldEFwcExhbmd1YWdlKGhvc3RMYW5ndWFnZSksXHJcbiAgICB1bmlDb21waWxlVmVyc2lvbjogcHJvY2Vzcy5lbnYuVU5JX0NPTVBJTEVSX1ZFUlNJT04sXHJcbiAgICB1bmlSdW50aW1lVmVyc2lvbjogcHJvY2Vzcy5lbnYuVU5JX0NPTVBJTEVSX1ZFUlNJT04sXHJcbiAgICB1bmlQbGF0Zm9ybTogcHJvY2Vzcy5lbnYuVU5JX1NVQl9QTEFURk9STSB8fCBwcm9jZXNzLmVudi5VTklfUExBVEZPUk0sXHJcbiAgICBkZXZpY2VCcmFuZCxcclxuICAgIGRldmljZU1vZGVsOiBtb2RlbCxcclxuICAgIGRldmljZVR5cGUsXHJcbiAgICBkZXZpY2VQaXhlbFJhdGlvOiBfZGV2aWNlUGl4ZWxSYXRpbyxcclxuICAgIGRldmljZU9yaWVudGF0aW9uOiBfZGV2aWNlT3JpZW50YXRpb24sXHJcbiAgICBvc05hbWU6IG9zTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpLFxyXG4gICAgb3NWZXJzaW9uLFxyXG4gICAgaG9zdFRoZW1lOiB0aGVtZSxcclxuICAgIGhvc3RWZXJzaW9uLFxyXG4gICAgaG9zdExhbmd1YWdlLFxyXG4gICAgaG9zdE5hbWU6IF9ob3N0TmFtZSxcclxuICAgIGhvc3RTREtWZXJzaW9uOiBfU0RLVmVyc2lvbixcclxuICAgIGhvc3RGb250U2l6ZVNldHRpbmc6IGZvbnRTaXplU2V0dGluZyxcclxuICAgIHdpbmRvd1RvcDogMCxcclxuICAgIHdpbmRvd0JvdHRvbTogMCxcclxuICAgIC8vIFRPRE9cclxuICAgIG9zTGFuZ3VhZ2U6IHVuZGVmaW5lZCxcclxuICAgIG9zVGhlbWU6IHVuZGVmaW5lZCxcclxuICAgIHVhOiB1bmRlZmluZWQsXHJcbiAgICBob3N0UGFja2FnZU5hbWU6IHVuZGVmaW5lZCxcclxuICAgIGJyb3dzZXJOYW1lOiB1bmRlZmluZWQsXHJcbiAgICBicm93c2VyVmVyc2lvbjogdW5kZWZpbmVkXHJcbiAgfTtcclxuXHJcbiAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHBhcmFtZXRlcnMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRHZXREZXZpY2VUeXBlIChyZXN1bHQsIG1vZGVsKSB7XHJcbiAgbGV0IGRldmljZVR5cGUgPSByZXN1bHQuZGV2aWNlVHlwZSB8fCAncGhvbmUnO1xyXG4gIHtcclxuICAgIGNvbnN0IGRldmljZVR5cGVNYXBzID0ge1xyXG4gICAgICBpcGFkOiAncGFkJyxcclxuICAgICAgd2luZG93czogJ3BjJyxcclxuICAgICAgbWFjOiAncGMnXHJcbiAgICB9O1xyXG4gICAgY29uc3QgZGV2aWNlVHlwZU1hcHNLZXlzID0gT2JqZWN0LmtleXMoZGV2aWNlVHlwZU1hcHMpO1xyXG4gICAgY29uc3QgX21vZGVsID0gbW9kZWwudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkZXZpY2VUeXBlTWFwc0tleXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGNvbnN0IF9tID0gZGV2aWNlVHlwZU1hcHNLZXlzW2luZGV4XTtcclxuICAgICAgaWYgKF9tb2RlbC5pbmRleE9mKF9tKSAhPT0gLTEpIHtcclxuICAgICAgICBkZXZpY2VUeXBlID0gZGV2aWNlVHlwZU1hcHNbX21dO1xyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGRldmljZVR5cGVcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RGV2aWNlQnJhbmQgKGJyYW5kKSB7XHJcbiAgbGV0IGRldmljZUJyYW5kID0gYnJhbmQ7XHJcbiAgaWYgKGRldmljZUJyYW5kKSB7XHJcbiAgICBkZXZpY2VCcmFuZCA9IGJyYW5kLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgfVxyXG4gIHJldHVybiBkZXZpY2VCcmFuZFxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBcHBMYW5ndWFnZSAoZGVmYXVsdExhbmd1YWdlKSB7XHJcbiAgcmV0dXJuIGdldExvY2FsZSQxXHJcbiAgICA/IGdldExvY2FsZSQxKClcclxuICAgIDogZGVmYXVsdExhbmd1YWdlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEhvc3ROYW1lIChyZXN1bHQpIHtcclxuICBjb25zdCBfcGxhdGZvcm0gPSAgXCJtcC1qZFwiLnNwbGl0KCctJylbMV07XHJcbiAgbGV0IF9ob3N0TmFtZSA9IHJlc3VsdC5ob3N0TmFtZSB8fCBfcGxhdGZvcm07IC8vIG1wLWpkXHJcblxyXG4gIHJldHVybiBfaG9zdE5hbWVcclxufVxyXG5cclxudmFyIGdldFN5c3RlbUluZm8gPSB7XHJcbiAgcmV0dXJuVmFsdWU6IGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgIHVzZURldmljZUlkKHJlc3VsdCk7XHJcbiAgICBhZGRTYWZlQXJlYUluc2V0cyhyZXN1bHQpO1xyXG4gICAgcG9wdWxhdGVQYXJhbWV0ZXJzKHJlc3VsdCk7XHJcbiAgfVxyXG59O1xyXG5cclxuLy8gaW1wb3J0IG5hdmlnYXRlVG8gZnJvbSAndW5pLWhlbHBlcnMvbmF2aWdhdGUtdG8nXHJcbi8vIGltcG9ydCBnZXRVc2VyUHJvZmlsZSBmcm9tICcuLi8uLi8uLi9tcC13ZWl4aW4vaGVscGVycy9nZXQtdXNlci1wcm9maWxlJ1xyXG5cclxuLy8g6ZyA6KaB5YGa6L2s5o2i55qEIEFQSSDliJfooahcclxuY29uc3QgcHJvdG9jb2xzID0ge1xyXG4gIC8vIG5hdmlnYXRlVG8sXHJcbiAgLy8gcmVkaXJlY3RUbyxcclxuICAvLyBwcmV2aWV3SW1hZ2UsXHJcbiAgZ2V0U3lzdGVtSW5mbyxcclxuICBnZXRTeXN0ZW1JbmZvU3luYzogZ2V0U3lzdGVtSW5mb1xyXG4gIC8vIGdldFVzZXJQcm9maWxlXHJcbn07XHJcblxyXG4vLyDkuI3mlK/mjIHnmoQgQVBJIOWIl+ihqFxyXG5jb25zdCB0b2RvcyA9IFtcclxuICAnZ2V0U2VsZWN0ZWRUZXh0UmFuZ2UnXHJcbl07XHJcblxyXG4vLyDlrZjlnKjlhbzlrrnmgKfnmoQgQVBJIOWIl+ihqFxyXG5jb25zdCBjYW5JVXNlcyA9IFtdO1xyXG5cclxuY29uc3QgQ0FMTEJBQ0tTID0gWydzdWNjZXNzJywgJ2ZhaWwnLCAnY2FuY2VsJywgJ2NvbXBsZXRlJ107XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzQ2FsbGJhY2sgKG1ldGhvZE5hbWUsIG1ldGhvZCwgcmV0dXJuVmFsdWUpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKHJlcykge1xyXG4gICAgcmV0dXJuIG1ldGhvZChwcm9jZXNzUmV0dXJuVmFsdWUobWV0aG9kTmFtZSwgcmVzLCByZXR1cm5WYWx1ZSkpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzQXJncyAobWV0aG9kTmFtZSwgZnJvbUFyZ3MsIGFyZ3NPcHRpb24gPSB7fSwgcmV0dXJuVmFsdWUgPSB7fSwga2VlcEZyb21BcmdzID0gZmFsc2UpIHtcclxuICBpZiAoaXNQbGFpbk9iamVjdChmcm9tQXJncykpIHsgLy8g5LiA6IisIGFwaSDnmoTlj4LmlbDop6PmnpBcclxuICAgIGNvbnN0IHRvQXJncyA9IGtlZXBGcm9tQXJncyA9PT0gdHJ1ZSA/IGZyb21BcmdzIDoge307IC8vIHJldHVyblZhbHVlIOS4uiBmYWxzZSDml7bvvIzor7TmmI7mmK/moLzlvI/ljJbov5Tlm57lgLzvvIznm7TmjqXlnKjov5Tlm57lgLzlr7nosaHkuIrkv67mlLnotYvlgLxcclxuICAgIGlmIChpc0ZuKGFyZ3NPcHRpb24pKSB7XHJcbiAgICAgIGFyZ3NPcHRpb24gPSBhcmdzT3B0aW9uKGZyb21BcmdzLCB0b0FyZ3MpIHx8IHt9O1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbUFyZ3MpIHtcclxuICAgICAgaWYgKGhhc093bihhcmdzT3B0aW9uLCBrZXkpKSB7XHJcbiAgICAgICAgbGV0IGtleU9wdGlvbiA9IGFyZ3NPcHRpb25ba2V5XTtcclxuICAgICAgICBpZiAoaXNGbihrZXlPcHRpb24pKSB7XHJcbiAgICAgICAgICBrZXlPcHRpb24gPSBrZXlPcHRpb24oZnJvbUFyZ3Nba2V5XSwgZnJvbUFyZ3MsIHRvQXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgha2V5T3B0aW9uKSB7IC8vIOS4jeaUr+aMgeeahOWPguaVsFxyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaGUgJyR7bWV0aG9kTmFtZX0nIG1ldGhvZCBvZiBwbGF0Zm9ybSAn5Lqs5Lic5bCP56iL5bqPJyBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbiAnJHtrZXl9J2ApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNTdHIoa2V5T3B0aW9uKSkgeyAvLyDph43lhpnlj4LmlbAga2V5XHJcbiAgICAgICAgICB0b0FyZ3Nba2V5T3B0aW9uXSA9IGZyb21BcmdzW2tleV07XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGtleU9wdGlvbikpIHsgLy8ge25hbWU6bmV3TmFtZSx2YWx1ZTp2YWx1ZX3lj6/ph43mlrDmjIflrprlj4LmlbAga2V5OnZhbHVlXHJcbiAgICAgICAgICB0b0FyZ3Nba2V5T3B0aW9uLm5hbWUgPyBrZXlPcHRpb24ubmFtZSA6IGtleV0gPSBrZXlPcHRpb24udmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKENBTExCQUNLUy5pbmRleE9mKGtleSkgIT09IC0xKSB7XHJcbiAgICAgICAgaWYgKGlzRm4oZnJvbUFyZ3Nba2V5XSkpIHtcclxuICAgICAgICAgIHRvQXJnc1trZXldID0gcHJvY2Vzc0NhbGxiYWNrKG1ldGhvZE5hbWUsIGZyb21BcmdzW2tleV0sIHJldHVyblZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCFrZWVwRnJvbUFyZ3MpIHtcclxuICAgICAgICAgIHRvQXJnc1trZXldID0gZnJvbUFyZ3Nba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0b0FyZ3NcclxuICB9IGVsc2UgaWYgKGlzRm4oZnJvbUFyZ3MpKSB7XHJcbiAgICBmcm9tQXJncyA9IHByb2Nlc3NDYWxsYmFjayhtZXRob2ROYW1lLCBmcm9tQXJncywgcmV0dXJuVmFsdWUpO1xyXG4gIH1cclxuICByZXR1cm4gZnJvbUFyZ3NcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1JldHVyblZhbHVlIChtZXRob2ROYW1lLCByZXMsIHJldHVyblZhbHVlLCBrZWVwUmV0dXJuVmFsdWUgPSBmYWxzZSkge1xyXG4gIGlmIChpc0ZuKHByb3RvY29scy5yZXR1cm5WYWx1ZSkpIHsgLy8g5aSE55CG6YCa55SoIHJldHVyblZhbHVlXHJcbiAgICByZXMgPSBwcm90b2NvbHMucmV0dXJuVmFsdWUobWV0aG9kTmFtZSwgcmVzKTtcclxuICB9XHJcbiAgcmV0dXJuIHByb2Nlc3NBcmdzKG1ldGhvZE5hbWUsIHJlcywgcmV0dXJuVmFsdWUsIHt9LCBrZWVwUmV0dXJuVmFsdWUpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyYXBwZXIgKG1ldGhvZE5hbWUsIG1ldGhvZCkge1xyXG4gIGlmIChoYXNPd24ocHJvdG9jb2xzLCBtZXRob2ROYW1lKSkge1xyXG4gICAgY29uc3QgcHJvdG9jb2wgPSBwcm90b2NvbHNbbWV0aG9kTmFtZV07XHJcbiAgICBpZiAoIXByb3RvY29sKSB7IC8vIOaaguS4jeaUr+aMgeeahCBhcGlcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBQbGF0Zm9ybSAn5Lqs5Lic5bCP56iL5bqPJyBkb2VzIG5vdCBzdXBwb3J0ICcke21ldGhvZE5hbWV9Jy5gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcxLCBhcmcyKSB7IC8vIOebruWJjSBhcGkg5pyA5aSa5Lik5Liq5Y+C5pWwXHJcbiAgICAgIGxldCBvcHRpb25zID0gcHJvdG9jb2w7XHJcbiAgICAgIGlmIChpc0ZuKHByb3RvY29sKSkge1xyXG4gICAgICAgIG9wdGlvbnMgPSBwcm90b2NvbChhcmcxKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgYXJnMSA9IHByb2Nlc3NBcmdzKG1ldGhvZE5hbWUsIGFyZzEsIG9wdGlvbnMuYXJncywgb3B0aW9ucy5yZXR1cm5WYWx1ZSk7XHJcblxyXG4gICAgICBjb25zdCBhcmdzID0gW2FyZzFdO1xyXG4gICAgICBpZiAodHlwZW9mIGFyZzIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgYXJncy5wdXNoKGFyZzIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChpc0ZuKG9wdGlvbnMubmFtZSkpIHtcclxuICAgICAgICBtZXRob2ROYW1lID0gb3B0aW9ucy5uYW1lKGFyZzEpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzU3RyKG9wdGlvbnMubmFtZSkpIHtcclxuICAgICAgICBtZXRob2ROYW1lID0gb3B0aW9ucy5uYW1lO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gamRbbWV0aG9kTmFtZV0uYXBwbHkoamQsIGFyZ3MpO1xyXG4gICAgICBpZiAoaXNTeW5jQXBpKG1ldGhvZE5hbWUpKSB7IC8vIOWQjOatpSBhcGlcclxuICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVyblZhbHVlKG1ldGhvZE5hbWUsIHJldHVyblZhbHVlLCBvcHRpb25zLnJldHVyblZhbHVlLCBpc0NvbnRleHRBcGkobWV0aG9kTmFtZSkpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJldHVyblZhbHVlXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBtZXRob2RcclxufVxyXG5cclxuY29uc3QgdG9kb0FwaXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG5cclxuY29uc3QgVE9ET1MgPSBbXHJcbiAgJ29uVGFiQmFyTWlkQnV0dG9uVGFwJyxcclxuICAnc3Vic2NyaWJlUHVzaCcsXHJcbiAgJ3Vuc3Vic2NyaWJlUHVzaCcsXHJcbiAgJ29uUHVzaCcsXHJcbiAgJ29mZlB1c2gnLFxyXG4gICdzaGFyZSdcclxuXTtcclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVRvZG9BcGkgKG5hbWUpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gdG9kb0FwaSAoe1xyXG4gICAgZmFpbCxcclxuICAgIGNvbXBsZXRlXHJcbiAgfSkge1xyXG4gICAgY29uc3QgcmVzID0ge1xyXG4gICAgICBlcnJNc2c6IGAke25hbWV9OmZhaWwgbWV0aG9kICcke25hbWV9JyBub3Qgc3VwcG9ydGVkYFxyXG4gICAgfTtcclxuICAgIGlzRm4oZmFpbCkgJiYgZmFpbChyZXMpO1xyXG4gICAgaXNGbihjb21wbGV0ZSkgJiYgY29tcGxldGUocmVzKTtcclxuICB9XHJcbn1cclxuXHJcblRPRE9TLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcclxuICB0b2RvQXBpc1tuYW1lXSA9IGNyZWF0ZVRvZG9BcGkobmFtZSk7XHJcbn0pO1xyXG5cclxudmFyIHByb3ZpZGVycyA9IHtcclxuICBvYXV0aDogWydqZCddLFxyXG4gIHNoYXJlOiBbJ2pkJ10sXHJcbiAgcGF5bWVudDogWydqZCddLFxyXG4gIHB1c2g6IFsnamQnXVxyXG59O1xyXG5cclxuZnVuY3Rpb24gZ2V0UHJvdmlkZXIgKHtcclxuICBzZXJ2aWNlLFxyXG4gIHN1Y2Nlc3MsXHJcbiAgZmFpbCxcclxuICBjb21wbGV0ZVxyXG59KSB7XHJcbiAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gIGlmIChwcm92aWRlcnNbc2VydmljZV0pIHtcclxuICAgIHJlcyA9IHtcclxuICAgICAgZXJyTXNnOiAnZ2V0UHJvdmlkZXI6b2snLFxyXG4gICAgICBzZXJ2aWNlLFxyXG4gICAgICBwcm92aWRlcjogcHJvdmlkZXJzW3NlcnZpY2VdXHJcbiAgICB9O1xyXG4gICAgaXNGbihzdWNjZXNzKSAmJiBzdWNjZXNzKHJlcyk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHJlcyA9IHtcclxuICAgICAgZXJyTXNnOiAnZ2V0UHJvdmlkZXI6ZmFpbCBzZXJ2aWNlIG5vdCBmb3VuZCdcclxuICAgIH07XHJcbiAgICBpc0ZuKGZhaWwpICYmIGZhaWwocmVzKTtcclxuICB9XHJcbiAgaXNGbihjb21wbGV0ZSkgJiYgY29tcGxldGUocmVzKTtcclxufVxyXG5cclxudmFyIGV4dHJhQXBpID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xyXG4gIF9fcHJvdG9fXzogbnVsbCxcclxuICBnZXRQcm92aWRlcjogZ2V0UHJvdmlkZXJcclxufSk7XHJcblxyXG5jb25zdCBnZXRFbWl0dGVyID0gKGZ1bmN0aW9uICgpIHtcclxuICBsZXQgRW1pdHRlcjtcclxuICByZXR1cm4gZnVuY3Rpb24gZ2V0VW5pRW1pdHRlciAoKSB7XHJcbiAgICBpZiAoIUVtaXR0ZXIpIHtcclxuICAgICAgRW1pdHRlciA9IG5ldyBWdWUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBFbWl0dGVyXHJcbiAgfVxyXG59KSgpO1xyXG5cclxuZnVuY3Rpb24gYXBwbHkgKGN0eCwgbWV0aG9kLCBhcmdzKSB7XHJcbiAgcmV0dXJuIGN0eFttZXRob2RdLmFwcGx5KGN0eCwgYXJncylcclxufVxyXG5cclxuZnVuY3Rpb24gJG9uICgpIHtcclxuICByZXR1cm4gYXBwbHkoZ2V0RW1pdHRlcigpLCAnJG9uJywgWy4uLmFyZ3VtZW50c10pXHJcbn1cclxuZnVuY3Rpb24gJG9mZiAoKSB7XHJcbiAgcmV0dXJuIGFwcGx5KGdldEVtaXR0ZXIoKSwgJyRvZmYnLCBbLi4uYXJndW1lbnRzXSlcclxufVxyXG5mdW5jdGlvbiAkb25jZSAoKSB7XHJcbiAgcmV0dXJuIGFwcGx5KGdldEVtaXR0ZXIoKSwgJyRvbmNlJywgWy4uLmFyZ3VtZW50c10pXHJcbn1cclxuZnVuY3Rpb24gJGVtaXQgKCkge1xyXG4gIHJldHVybiBhcHBseShnZXRFbWl0dGVyKCksICckZW1pdCcsIFsuLi5hcmd1bWVudHNdKVxyXG59XHJcblxyXG52YXIgZXZlbnRBcGkgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XHJcbiAgX19wcm90b19fOiBudWxsLFxyXG4gICRvbjogJG9uLFxyXG4gICRvZmY6ICRvZmYsXHJcbiAgJG9uY2U6ICRvbmNlLFxyXG4gICRlbWl0OiAkZW1pdFxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiDmoYbmnrblhoUgdHJ5LWNhdGNoXHJcbiAqL1xyXG4vKipcclxuICog5byA5Y+R6ICFIHRyeS1jYXRjaFxyXG4gKi9cclxuZnVuY3Rpb24gdHJ5Q2F0Y2ggKGZuKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBmbi5hcHBseShmbiwgYXJndW1lbnRzKVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBUT0RPXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRBcGlDYWxsYmFja3MgKHBhcmFtcykge1xyXG4gIGNvbnN0IGFwaUNhbGxiYWNrcyA9IHt9O1xyXG4gIGZvciAoY29uc3QgbmFtZSBpbiBwYXJhbXMpIHtcclxuICAgIGNvbnN0IHBhcmFtID0gcGFyYW1zW25hbWVdO1xyXG4gICAgaWYgKGlzRm4ocGFyYW0pKSB7XHJcbiAgICAgIGFwaUNhbGxiYWNrc1tuYW1lXSA9IHRyeUNhdGNoKHBhcmFtKTtcclxuICAgICAgZGVsZXRlIHBhcmFtc1tuYW1lXTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGFwaUNhbGxiYWNrc1xyXG59XHJcblxyXG5sZXQgY2lkO1xyXG5sZXQgY2lkRXJyTXNnO1xyXG5sZXQgZW5hYmxlZDtcclxuXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVB1c2hNZXNzYWdlIChtZXNzYWdlKSB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKG1lc3NhZ2UpXHJcbiAgfSBjYXRjaCAoZSkge31cclxuICByZXR1cm4gbWVzc2FnZVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbnZva2VQdXNoQ2FsbGJhY2sgKFxyXG4gIGFyZ3NcclxuKSB7XHJcbiAgaWYgKGFyZ3MudHlwZSA9PT0gJ2VuYWJsZWQnKSB7XHJcbiAgICBlbmFibGVkID0gdHJ1ZTtcclxuICB9IGVsc2UgaWYgKGFyZ3MudHlwZSA9PT0gJ2NsaWVudElkJykge1xyXG4gICAgY2lkID0gYXJncy5jaWQ7XHJcbiAgICBjaWRFcnJNc2cgPSBhcmdzLmVyck1zZztcclxuICAgIGludm9rZUdldFB1c2hDaWRDYWxsYmFja3MoY2lkLCBhcmdzLmVyck1zZyk7XHJcbiAgfSBlbHNlIGlmIChhcmdzLnR5cGUgPT09ICdwdXNoTXNnJykge1xyXG4gICAgY29uc3QgbWVzc2FnZSA9IHtcclxuICAgICAgdHlwZTogJ3JlY2VpdmUnLFxyXG4gICAgICBkYXRhOiBub3JtYWxpemVQdXNoTWVzc2FnZShhcmdzLm1lc3NhZ2UpXHJcbiAgICB9O1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvblB1c2hNZXNzYWdlQ2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gb25QdXNoTWVzc2FnZUNhbGxiYWNrc1tpXTtcclxuICAgICAgY2FsbGJhY2sobWVzc2FnZSk7XHJcbiAgICAgIC8vIOivpea2iOaBr+W3suiiq+mYu+atolxyXG4gICAgICBpZiAobWVzc2FnZS5zdG9wcGVkKSB7XHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAoYXJncy50eXBlID09PSAnY2xpY2snKSB7XHJcbiAgICBvblB1c2hNZXNzYWdlQ2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XHJcbiAgICAgIGNhbGxiYWNrKHtcclxuICAgICAgICB0eXBlOiAnY2xpY2snLFxyXG4gICAgICAgIGRhdGE6IG5vcm1hbGl6ZVB1c2hNZXNzYWdlKGFyZ3MubWVzc2FnZSlcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGdldFB1c2hDaWRDYWxsYmFja3MgPSBbXTtcclxuXHJcbmZ1bmN0aW9uIGludm9rZUdldFB1c2hDaWRDYWxsYmFja3MgKGNpZCwgZXJyTXNnKSB7XHJcbiAgZ2V0UHVzaENpZENhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xyXG4gICAgY2FsbGJhY2soY2lkLCBlcnJNc2cpO1xyXG4gIH0pO1xyXG4gIGdldFB1c2hDaWRDYWxsYmFja3MubGVuZ3RoID0gMDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UHVzaENsaWVudElkIChhcmdzKSB7XHJcbiAgaWYgKCFpc1BsYWluT2JqZWN0KGFyZ3MpKSB7XHJcbiAgICBhcmdzID0ge307XHJcbiAgfVxyXG4gIGNvbnN0IHtcclxuICAgIHN1Y2Nlc3MsXHJcbiAgICBmYWlsLFxyXG4gICAgY29tcGxldGVcclxuICB9ID0gZ2V0QXBpQ2FsbGJhY2tzKGFyZ3MpO1xyXG4gIGNvbnN0IGhhc1N1Y2Nlc3MgPSBpc0ZuKHN1Y2Nlc3MpO1xyXG4gIGNvbnN0IGhhc0ZhaWwgPSBpc0ZuKGZhaWwpO1xyXG4gIGNvbnN0IGhhc0NvbXBsZXRlID0gaXNGbihjb21wbGV0ZSk7XHJcblxyXG4gIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiBlbmFibGVkID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBlbmFibGVkID0gZmFsc2U7XHJcbiAgICAgIGNpZCA9ICcnO1xyXG4gICAgICBjaWRFcnJNc2cgPSAndW5pUHVzaCBpcyBub3QgZW5hYmxlZCc7XHJcbiAgICB9XHJcbiAgICBnZXRQdXNoQ2lkQ2FsbGJhY2tzLnB1c2goKGNpZCwgZXJyTXNnKSA9PiB7XHJcbiAgICAgIGxldCByZXM7XHJcbiAgICAgIGlmIChjaWQpIHtcclxuICAgICAgICByZXMgPSB7XHJcbiAgICAgICAgICBlcnJNc2c6ICdnZXRQdXNoQ2xpZW50SWQ6b2snLFxyXG4gICAgICAgICAgY2lkXHJcbiAgICAgICAgfTtcclxuICAgICAgICBoYXNTdWNjZXNzICYmIHN1Y2Nlc3MocmVzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXMgPSB7XHJcbiAgICAgICAgICBlcnJNc2c6ICdnZXRQdXNoQ2xpZW50SWQ6ZmFpbCcgKyAoZXJyTXNnID8gJyAnICsgZXJyTXNnIDogJycpXHJcbiAgICAgICAgfTtcclxuICAgICAgICBoYXNGYWlsICYmIGZhaWwocmVzKTtcclxuICAgICAgfVxyXG4gICAgICBoYXNDb21wbGV0ZSAmJiBjb21wbGV0ZShyZXMpO1xyXG4gICAgfSk7XHJcbiAgICBpZiAodHlwZW9mIGNpZCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgaW52b2tlR2V0UHVzaENpZENhbGxiYWNrcyhjaWQsIGNpZEVyck1zZyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmNvbnN0IG9uUHVzaE1lc3NhZ2VDYWxsYmFja3MgPSBbXTtcclxuLy8g5LiN5L2/55SoIGRlZmluZU9uQXBpIOWunueOsO+8jOaYr+WboOS4uiBkZWZpbmVPbkFwaSDkvp3otZYgVW5pU2VydmljZUpTQnJpZGdlIO+8jOivpeWvueixoeebruWJjeWcqOWwj+eoi+W6j+S4iuacquaPkOS+m++8jOaVheeugOWNleWunueOsFxyXG5jb25zdCBvblB1c2hNZXNzYWdlID0gKGZuKSA9PiB7XHJcbiAgaWYgKG9uUHVzaE1lc3NhZ2VDYWxsYmFja3MuaW5kZXhPZihmbikgPT09IC0xKSB7XHJcbiAgICBvblB1c2hNZXNzYWdlQ2FsbGJhY2tzLnB1c2goZm4pO1xyXG4gIH1cclxufTtcclxuXHJcbmNvbnN0IG9mZlB1c2hNZXNzYWdlID0gKGZuKSA9PiB7XHJcbiAgaWYgKCFmbikge1xyXG4gICAgb25QdXNoTWVzc2FnZUNhbGxiYWNrcy5sZW5ndGggPSAwO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zdCBpbmRleCA9IG9uUHVzaE1lc3NhZ2VDYWxsYmFja3MuaW5kZXhPZihmbik7XHJcbiAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICBvblB1c2hNZXNzYWdlQ2FsbGJhY2tzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG59O1xyXG5cclxudmFyIGFwaSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcclxuICBfX3Byb3RvX186IG51bGwsXHJcbiAgZ2V0UHVzaENsaWVudElkOiBnZXRQdXNoQ2xpZW50SWQsXHJcbiAgb25QdXNoTWVzc2FnZTogb25QdXNoTWVzc2FnZSxcclxuICBvZmZQdXNoTWVzc2FnZTogb2ZmUHVzaE1lc3NhZ2UsXHJcbiAgaW52b2tlUHVzaENhbGxiYWNrOiBpbnZva2VQdXNoQ2FsbGJhY2tcclxufSk7XHJcblxyXG5jb25zdCBtb2NrcyA9IFsnX19yb3V0ZV9fJywgJ19fd3hFeHBhcnNlck5vZGVJZF9fJywgJ19fd3hXZWJ2aWV3SWRfXyddO1xyXG5cclxuZnVuY3Rpb24gZmluZFZtQnlWdWVJZCAodm0sIHZ1ZVBpZCkge1xyXG4gIGNvbnN0ICRjaGlsZHJlbiA9IHZtLiRjaGlsZHJlbjtcclxuICAvLyDkvJjlhYjmn6Xmib7nm7TlsZ4o5Y+N5ZCR5p+l5om+Omh0dHBzOi8vZ2l0aHViLmNvbS9kY2xvdWRpby91bmktYXBwL2lzc3Vlcy8xMjAwKVxyXG4gIGZvciAobGV0IGkgPSAkY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgIGNvbnN0IGNoaWxkVm0gPSAkY2hpbGRyZW5baV07XHJcbiAgICBpZiAoY2hpbGRWbS4kc2NvcGUuXyR2dWVJZCA9PT0gdnVlUGlkKSB7XHJcbiAgICAgIHJldHVybiBjaGlsZFZtXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIOWPjeWQkemAkuW9kuafpeaJvlxyXG4gIGxldCBwYXJlbnRWbTtcclxuICBmb3IgKGxldCBpID0gJGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICBwYXJlbnRWbSA9IGZpbmRWbUJ5VnVlSWQoJGNoaWxkcmVuW2ldLCB2dWVQaWQpO1xyXG4gICAgaWYgKHBhcmVudFZtKSB7XHJcbiAgICAgIHJldHVybiBwYXJlbnRWbVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEJlaGF2aW9yIChvcHRpb25zKSB7XHJcbiAgcmV0dXJuIEJlaGF2aW9yKG9wdGlvbnMpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUGFnZSAoKSB7XHJcbiAgcmV0dXJuICEhdGhpcy5yb3V0ZVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0UmVsYXRpb24gKGRldGFpbCkge1xyXG4gIHRoaXMudHJpZ2dlckV2ZW50KCdfX2wnLCBkZXRhaWwpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZWxlY3RBbGxDb21wb25lbnRzIChtcEluc3RhbmNlLCBzZWxlY3RvciwgJHJlZnMpIHtcclxuICBjb25zdCBjb21wb25lbnRzID0gbXBJbnN0YW5jZS5zZWxlY3RBbGxDb21wb25lbnRzKHNlbGVjdG9yKSB8fCBbXTtcclxuICBjb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcclxuICAgIGNvbnN0IHJlZiA9IGNvbXBvbmVudC5kYXRhc2V0LnJlZjtcclxuICAgICRyZWZzW3JlZl0gPSBjb21wb25lbnQuJHZtIHx8IHRvU2tpcChjb21wb25lbnQpO1xyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzeW5jUmVmcyAocmVmcywgbmV3UmVmcykge1xyXG4gIGNvbnN0IG9sZEtleXMgPSBuZXcgU2V0KC4uLk9iamVjdC5rZXlzKHJlZnMpKTtcclxuICBjb25zdCBuZXdLZXlzID0gT2JqZWN0LmtleXMobmV3UmVmcyk7XHJcbiAgbmV3S2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICBjb25zdCBvbGRWYWx1ZSA9IHJlZnNba2V5XTtcclxuICAgIGNvbnN0IG5ld1ZhbHVlID0gbmV3UmVmc1trZXldO1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2xkVmFsdWUpICYmIEFycmF5LmlzQXJyYXkobmV3VmFsdWUpICYmIG9sZFZhbHVlLmxlbmd0aCA9PT0gbmV3VmFsdWUubGVuZ3RoICYmIG5ld1ZhbHVlLmV2ZXJ5KHZhbHVlID0+IG9sZFZhbHVlLmluY2x1ZGVzKHZhbHVlKSkpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICByZWZzW2tleV0gPSBuZXdWYWx1ZTtcclxuICAgIG9sZEtleXMuZGVsZXRlKGtleSk7XHJcbiAgfSk7XHJcbiAgb2xkS2V5cy5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICBkZWxldGUgcmVmc1trZXldO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZWZzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRSZWZzICh2bSkge1xyXG4gIGNvbnN0IG1wSW5zdGFuY2UgPSB2bS4kc2NvcGU7XHJcbiAgY29uc3QgcmVmcyA9IHt9O1xyXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2bSwgJyRyZWZzJywge1xyXG4gICAgZ2V0ICgpIHtcclxuICAgICAgY29uc3QgJHJlZnMgPSB7fTtcclxuICAgICAgc2VsZWN0QWxsQ29tcG9uZW50cyhtcEluc3RhbmNlLCAnLnZ1ZS1yZWYnLCAkcmVmcyk7XHJcbiAgICAgIC8vIFRPRE8g5pqC5LiN6ICD6JmRIGZvciDkuK3nmoQgc2NvcGVkXHJcbiAgICAgIGNvbnN0IGZvckNvbXBvbmVudHMgPSBtcEluc3RhbmNlLnNlbGVjdEFsbENvbXBvbmVudHMoJy52dWUtcmVmLWluLWZvcicpIHx8IFtdO1xyXG4gICAgICBmb3JDb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcclxuICAgICAgICBjb25zdCByZWYgPSBjb21wb25lbnQuZGF0YXNldC5yZWY7XHJcbiAgICAgICAgaWYgKCEkcmVmc1tyZWZdKSB7XHJcbiAgICAgICAgICAkcmVmc1tyZWZdID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgICRyZWZzW3JlZl0ucHVzaChjb21wb25lbnQuJHZtIHx8IHRvU2tpcChjb21wb25lbnQpKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBzeW5jUmVmcyhyZWZzLCAkcmVmcylcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlTGluayAoZXZlbnQpIHtcclxuICBjb25zdCB7XHJcbiAgICB2dWVQaWQsXHJcbiAgICB2dWVPcHRpb25zXHJcbiAgfSA9IGV2ZW50LmRldGFpbCB8fCBldmVudC52YWx1ZTsgLy8gZGV0YWlsIOaYr+W+ruS/oSx2YWx1ZSDmmK/nmb7luqYoZGlwYXRjaClcclxuXHJcbiAgbGV0IHBhcmVudFZtO1xyXG5cclxuICBpZiAodnVlUGlkKSB7XHJcbiAgICBwYXJlbnRWbSA9IGZpbmRWbUJ5VnVlSWQodGhpcy4kdm0sIHZ1ZVBpZCk7XHJcbiAgfVxyXG5cclxuICBpZiAoIXBhcmVudFZtKSB7XHJcbiAgICBwYXJlbnRWbSA9IHRoaXMuJHZtO1xyXG4gIH1cclxuXHJcbiAgdnVlT3B0aW9ucy5wYXJlbnQgPSBwYXJlbnRWbTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWFya01QQ29tcG9uZW50IChjb21wb25lbnQpIHtcclxuICAvLyDlnKggVnVlIOS4reagh+iusOS4uuWwj+eoi+W6j+e7hOS7tlxyXG4gIGNvbnN0IElTX01QID0gJ19fdl9pc01QQ29tcG9uZW50JztcclxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29tcG9uZW50LCBJU19NUCwge1xyXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICB2YWx1ZTogdHJ1ZVxyXG4gIH0pO1xyXG4gIHJldHVybiBjb21wb25lbnRcclxufVxyXG5cclxuZnVuY3Rpb24gdG9Ta2lwIChvYmopIHtcclxuICBjb25zdCBPQiA9ICdfX29iX18nO1xyXG4gIGNvbnN0IFNLSVAgPSAnX192X3NraXAnO1xyXG4gIGlmIChpc09iamVjdChvYmopICYmIE9iamVjdC5pc0V4dGVuc2libGUob2JqKSkge1xyXG4gICAgLy8g6YG/5YWN6KKrIEB2dWUvY29tcG9zaXRpb24tYXBpIOingua1i1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgT0IsIHtcclxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxyXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgICAgdmFsdWU6IHtcclxuICAgICAgICBbU0tJUF06IHRydWVcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiBvYmpcclxufVxyXG5cclxuY29uc3QgTVBQYWdlID0gUGFnZTtcclxuY29uc3QgTVBDb21wb25lbnQgPSBDb21wb25lbnQ7XHJcblxyXG5jb25zdCBjdXN0b21pemVSRSA9IC86L2c7XHJcblxyXG5jb25zdCBjdXN0b21pemUgPSBjYWNoZWQoKHN0cikgPT4ge1xyXG4gIHJldHVybiBjYW1lbGl6ZShzdHIucmVwbGFjZShjdXN0b21pemVSRSwgJy0nKSlcclxufSk7XHJcblxyXG5mdW5jdGlvbiBpbml0VHJpZ2dlckV2ZW50IChtcEluc3RhbmNlKSB7XHJcbiAgY29uc3Qgb2xkVHJpZ2dlckV2ZW50ID0gbXBJbnN0YW5jZS50cmlnZ2VyRXZlbnQ7XHJcbiAgY29uc3QgbmV3VHJpZ2dlckV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50LCAuLi5hcmdzKSB7XHJcbiAgICAvLyDkuovku7blkI3nu5/kuIDovazpqbzls7DmoLzlvI/vvIzku4XlpITnkIbvvJrlvZPliY3nu4Tku7bkuLogdnVlIOe7hOS7tuOAgeW9k+WJjee7hOS7tuS4uiB2dWUg57uE5Lu25a2Q57uE5Lu2XHJcbiAgICBpZiAodGhpcy4kdm0gfHwgKHRoaXMuZGF0YXNldCAmJiB0aGlzLmRhdGFzZXQuY29tVHlwZSkpIHtcclxuICAgICAgZXZlbnQgPSBjdXN0b21pemUoZXZlbnQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9sZFRyaWdnZXJFdmVudC5hcHBseSh0aGlzLCBbZXZlbnQsIC4uLmFyZ3NdKVxyXG4gIH07XHJcbiAgdHJ5IHtcclxuICAgIC8vIOS6rOS4nOWwj+eoi+W6jyB0cmlnZ2VyRXZlbnQg5Li65Y+q6K+7XHJcbiAgICBtcEluc3RhbmNlLnRyaWdnZXJFdmVudCA9IG5ld1RyaWdnZXJFdmVudDtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgbXBJbnN0YW5jZS5fdHJpZ2dlckV2ZW50ID0gbmV3VHJpZ2dlckV2ZW50O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEhvb2sgKG5hbWUsIG9wdGlvbnMsIGlzQ29tcG9uZW50KSB7XHJcbiAgY29uc3Qgb2xkSG9vayA9IG9wdGlvbnNbbmFtZV07XHJcbiAgb3B0aW9uc1tuYW1lXSA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XHJcbiAgICBtYXJrTVBDb21wb25lbnQodGhpcyk7XHJcbiAgICBpbml0VHJpZ2dlckV2ZW50KHRoaXMpO1xyXG4gICAgaWYgKG9sZEhvb2spIHtcclxuICAgICAgcmV0dXJuIG9sZEhvb2suYXBwbHkodGhpcywgYXJncylcclxuICAgIH1cclxuICB9O1xyXG59XHJcbmlmICghTVBQYWdlLl9fJHdyYXBwZXJlZCkge1xyXG4gIE1QUGFnZS5fXyR3cmFwcGVyZWQgPSB0cnVlO1xyXG4gIFBhZ2UgPSBmdW5jdGlvbiAob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpbml0SG9vaygnb25Mb2FkJywgb3B0aW9ucyk7XHJcbiAgICByZXR1cm4gTVBQYWdlKG9wdGlvbnMpXHJcbiAgfTtcclxuICBQYWdlLmFmdGVyID0gTVBQYWdlLmFmdGVyO1xyXG5cclxuICBDb21wb25lbnQgPSBmdW5jdGlvbiAob3B0aW9ucyA9IHt9KSB7XHJcbiAgICBpbml0SG9vaygnY3JlYXRlZCcsIG9wdGlvbnMpO1xyXG4gICAgcmV0dXJuIE1QQ29tcG9uZW50KG9wdGlvbnMpXHJcbiAgfTtcclxufVxyXG5cclxuY29uc3QgUEFHRV9FVkVOVF9IT09LUyA9IFtcclxuICAnb25QdWxsRG93blJlZnJlc2gnLFxyXG4gICdvblJlYWNoQm90dG9tJyxcclxuICAnb25BZGRUb0Zhdm9yaXRlcycsXHJcbiAgJ29uU2hhcmVUaW1lbGluZScsXHJcbiAgJ29uU2hhcmVBcHBNZXNzYWdlJyxcclxuICAnb25QYWdlU2Nyb2xsJyxcclxuICAnb25SZXNpemUnLFxyXG4gICdvblRhYkl0ZW1UYXAnXHJcbl07XHJcblxyXG5mdW5jdGlvbiBpbml0TW9ja3MgKHZtLCBtb2Nrcykge1xyXG4gIGNvbnN0IG1wSW5zdGFuY2UgPSB2bS4kbXBbdm0ubXBUeXBlXTtcclxuICBtb2Nrcy5mb3JFYWNoKG1vY2sgPT4ge1xyXG4gICAgaWYgKGhhc093bihtcEluc3RhbmNlLCBtb2NrKSkge1xyXG4gICAgICB2bVttb2NrXSA9IG1wSW5zdGFuY2VbbW9ja107XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc0hvb2sgKGhvb2ssIHZ1ZU9wdGlvbnMpIHtcclxuICBpZiAoIXZ1ZU9wdGlvbnMpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBpZiAoVnVlLm9wdGlvbnMgJiYgQXJyYXkuaXNBcnJheShWdWUub3B0aW9uc1tob29rXSkpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICB2dWVPcHRpb25zID0gdnVlT3B0aW9ucy5kZWZhdWx0IHx8IHZ1ZU9wdGlvbnM7XHJcblxyXG4gIGlmIChpc0ZuKHZ1ZU9wdGlvbnMpKSB7XHJcbiAgICBpZiAoaXNGbih2dWVPcHRpb25zLmV4dGVuZE9wdGlvbnNbaG9va10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICBpZiAodnVlT3B0aW9ucy5zdXBlciAmJlxyXG4gICAgICB2dWVPcHRpb25zLnN1cGVyLm9wdGlvbnMgJiZcclxuICAgICAgQXJyYXkuaXNBcnJheSh2dWVPcHRpb25zLnN1cGVyLm9wdGlvbnNbaG9va10pKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIGlmIChpc0ZuKHZ1ZU9wdGlvbnNbaG9va10pIHx8IEFycmF5LmlzQXJyYXkodnVlT3B0aW9uc1tob29rXSkpIHtcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG4gIGNvbnN0IG1peGlucyA9IHZ1ZU9wdGlvbnMubWl4aW5zO1xyXG4gIGlmIChBcnJheS5pc0FycmF5KG1peGlucykpIHtcclxuICAgIHJldHVybiAhIW1peGlucy5maW5kKG1peGluID0+IGhhc0hvb2soaG9vaywgbWl4aW4pKVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdEhvb2tzIChtcE9wdGlvbnMsIGhvb2tzLCB2dWVPcHRpb25zKSB7XHJcbiAgaG9va3MuZm9yRWFjaChob29rID0+IHtcclxuICAgIGlmIChoYXNIb29rKGhvb2ssIHZ1ZU9wdGlvbnMpKSB7XHJcbiAgICAgIG1wT3B0aW9uc1tob29rXSA9IGZ1bmN0aW9uIChhcmdzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJHZtICYmIHRoaXMuJHZtLl9fY2FsbF9ob29rKGhvb2ssIGFyZ3MpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRVbmtub3duSG9va3MgKG1wT3B0aW9ucywgdnVlT3B0aW9ucywgZXhjbHVkZXMgPSBbXSkge1xyXG4gIGZpbmRIb29rcyh2dWVPcHRpb25zKS5mb3JFYWNoKChob29rKSA9PiBpbml0SG9vayQxKG1wT3B0aW9ucywgaG9vaywgZXhjbHVkZXMpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZmluZEhvb2tzICh2dWVPcHRpb25zLCBob29rcyA9IFtdKSB7XHJcbiAgaWYgKHZ1ZU9wdGlvbnMpIHtcclxuICAgIE9iamVjdC5rZXlzKHZ1ZU9wdGlvbnMpLmZvckVhY2goKG5hbWUpID0+IHtcclxuICAgICAgaWYgKG5hbWUuaW5kZXhPZignb24nKSA9PT0gMCAmJiBpc0ZuKHZ1ZU9wdGlvbnNbbmFtZV0pKSB7XHJcbiAgICAgICAgaG9va3MucHVzaChuYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiBob29rc1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0SG9vayQxIChtcE9wdGlvbnMsIGhvb2ssIGV4Y2x1ZGVzKSB7XHJcbiAgaWYgKGV4Y2x1ZGVzLmluZGV4T2YoaG9vaykgPT09IC0xICYmICFoYXNPd24obXBPcHRpb25zLCBob29rKSkge1xyXG4gICAgbXBPcHRpb25zW2hvb2tdID0gZnVuY3Rpb24gKGFyZ3MpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuJHZtICYmIHRoaXMuJHZtLl9fY2FsbF9ob29rKGhvb2ssIGFyZ3MpXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdFZ1ZUNvbXBvbmVudCAoVnVlLCB2dWVPcHRpb25zKSB7XHJcbiAgdnVlT3B0aW9ucyA9IHZ1ZU9wdGlvbnMuZGVmYXVsdCB8fCB2dWVPcHRpb25zO1xyXG4gIGxldCBWdWVDb21wb25lbnQ7XHJcbiAgaWYgKGlzRm4odnVlT3B0aW9ucykpIHtcclxuICAgIFZ1ZUNvbXBvbmVudCA9IHZ1ZU9wdGlvbnM7XHJcbiAgfSBlbHNlIHtcclxuICAgIFZ1ZUNvbXBvbmVudCA9IFZ1ZS5leHRlbmQodnVlT3B0aW9ucyk7XHJcbiAgfVxyXG4gIHZ1ZU9wdGlvbnMgPSBWdWVDb21wb25lbnQub3B0aW9ucztcclxuICByZXR1cm4gW1Z1ZUNvbXBvbmVudCwgdnVlT3B0aW9uc11cclxufVxyXG5cclxuZnVuY3Rpb24gaW5pdFNsb3RzICh2bSwgdnVlU2xvdHMpIHtcclxuICBpZiAoQXJyYXkuaXNBcnJheSh2dWVTbG90cykgJiYgdnVlU2xvdHMubGVuZ3RoKSB7XHJcbiAgICBjb25zdCAkc2xvdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gICAgdnVlU2xvdHMuZm9yRWFjaChzbG90TmFtZSA9PiB7XHJcbiAgICAgICRzbG90c1tzbG90TmFtZV0gPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgICB2bS4kc2NvcGVkU2xvdHMgPSB2bS4kc2xvdHMgPSAkc2xvdHM7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0VnVlSWRzICh2dWVJZHMsIG1wSW5zdGFuY2UpIHtcclxuICB2dWVJZHMgPSAodnVlSWRzIHx8ICcnKS5zcGxpdCgnLCcpO1xyXG4gIGNvbnN0IGxlbiA9IHZ1ZUlkcy5sZW5ndGg7XHJcblxyXG4gIGlmIChsZW4gPT09IDEpIHtcclxuICAgIG1wSW5zdGFuY2UuXyR2dWVJZCA9IHZ1ZUlkc1swXTtcclxuICB9IGVsc2UgaWYgKGxlbiA9PT0gMikge1xyXG4gICAgbXBJbnN0YW5jZS5fJHZ1ZUlkID0gdnVlSWRzWzBdO1xyXG4gICAgbXBJbnN0YW5jZS5fJHZ1ZVBpZCA9IHZ1ZUlkc1sxXTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXREYXRhICh2dWVPcHRpb25zLCBjb250ZXh0KSB7XHJcbiAgbGV0IGRhdGEgPSB2dWVPcHRpb25zLmRhdGEgfHwge307XHJcbiAgY29uc3QgbWV0aG9kcyA9IHZ1ZU9wdGlvbnMubWV0aG9kcyB8fCB7fTtcclxuXHJcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBkYXRhID0gZGF0YS5jYWxsKGNvbnRleHQpOyAvLyDmlK/mjIEgVnVlLnByb3RvdHlwZSDkuIrmjILnmoTmlbDmja5cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKHByb2Nlc3MuZW52LlZVRV9BUFBfREVCVUcpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ+agueaNriBWdWUg55qEIGRhdGEg5Ye95pWw5Yid5aeL5YyW5bCP56iL5bqPIGRhdGEg5aSx6LSl77yM6K+35bC96YeP56Gu5L+dIGRhdGEg5Ye95pWw5Lit5LiN6K6/6ZeuIHZtIOWvueixoe+8jOWQpuWImeWPr+iDveW9seWTjemmluasoeaVsOaNrua4suafk+mAn+W6puOAgicsIGRhdGEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIOWvuSBkYXRhIOagvOW8j+WMllxyXG4gICAgICBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XHJcbiAgICB9IGNhdGNoIChlKSB7IH1cclxuICB9XHJcblxyXG4gIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSkge1xyXG4gICAgZGF0YSA9IHt9O1xyXG4gIH1cclxuXHJcbiAgT2JqZWN0LmtleXMobWV0aG9kcykuZm9yRWFjaChtZXRob2ROYW1lID0+IHtcclxuICAgIGlmIChjb250ZXh0Ll9fbGlmZWN5Y2xlX2hvb2tzX18uaW5kZXhPZihtZXRob2ROYW1lKSA9PT0gLTEgJiYgIWhhc093bihkYXRhLCBtZXRob2ROYW1lKSkge1xyXG4gICAgICBkYXRhW21ldGhvZE5hbWVdID0gbWV0aG9kc1ttZXRob2ROYW1lXTtcclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIGRhdGFcclxufVxyXG5cclxuY29uc3QgUFJPUF9UWVBFUyA9IFtTdHJpbmcsIE51bWJlciwgQm9vbGVhbiwgT2JqZWN0LCBBcnJheSwgbnVsbF07XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVPYnNlcnZlciAobmFtZSkge1xyXG4gIHJldHVybiBmdW5jdGlvbiBvYnNlcnZlciAobmV3VmFsLCBvbGRWYWwpIHtcclxuICAgIGlmICh0aGlzLiR2bSkge1xyXG4gICAgICB0aGlzLiR2bVtuYW1lXSA9IG5ld1ZhbDsgLy8g5Li65LqG6Kem5Y+R5YW25LuW6Z2eIHJlbmRlciB3YXRjaGVyXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBpbml0QmVoYXZpb3JzICh2dWVPcHRpb25zLCBpbml0QmVoYXZpb3IpIHtcclxuICBjb25zdCB2dWVCZWhhdmlvcnMgPSB2dWVPcHRpb25zLmJlaGF2aW9ycztcclxuICBjb25zdCB2dWVFeHRlbmRzID0gdnVlT3B0aW9ucy5leHRlbmRzO1xyXG4gIGNvbnN0IHZ1ZU1peGlucyA9IHZ1ZU9wdGlvbnMubWl4aW5zO1xyXG5cclxuICBsZXQgdnVlUHJvcHMgPSB2dWVPcHRpb25zLnByb3BzO1xyXG5cclxuICBpZiAoIXZ1ZVByb3BzKSB7XHJcbiAgICB2dWVPcHRpb25zLnByb3BzID0gdnVlUHJvcHMgPSBbXTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGJlaGF2aW9ycyA9IFtdO1xyXG4gIGlmIChBcnJheS5pc0FycmF5KHZ1ZUJlaGF2aW9ycykpIHtcclxuICAgIHZ1ZUJlaGF2aW9ycy5mb3JFYWNoKGJlaGF2aW9yID0+IHtcclxuICAgICAgYmVoYXZpb3JzLnB1c2goYmVoYXZpb3IucmVwbGFjZSgndW5pOi8vJywgYCR7XCJqZFwifTovL2ApKTtcclxuICAgICAgaWYgKGJlaGF2aW9yID09PSAndW5pOi8vZm9ybS1maWVsZCcpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2dWVQcm9wcykpIHtcclxuICAgICAgICAgIHZ1ZVByb3BzLnB1c2goJ25hbWUnKTtcclxuICAgICAgICAgIHZ1ZVByb3BzLnB1c2goJ3ZhbHVlJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZ1ZVByb3BzLm5hbWUgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJydcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB2dWVQcm9wcy52YWx1ZSA9IHtcclxuICAgICAgICAgICAgdHlwZTogW1N0cmluZywgTnVtYmVyLCBCb29sZWFuLCBBcnJheSwgT2JqZWN0LCBEYXRlXSxcclxuICAgICAgICAgICAgZGVmYXVsdDogJydcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgaWYgKGlzUGxhaW5PYmplY3QodnVlRXh0ZW5kcykgJiYgdnVlRXh0ZW5kcy5wcm9wcykge1xyXG4gICAgYmVoYXZpb3JzLnB1c2goXHJcbiAgICAgIGluaXRCZWhhdmlvcih7XHJcbiAgICAgICAgcHJvcGVydGllczogaW5pdFByb3BlcnRpZXModnVlRXh0ZW5kcy5wcm9wcywgdHJ1ZSlcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIGlmIChBcnJheS5pc0FycmF5KHZ1ZU1peGlucykpIHtcclxuICAgIHZ1ZU1peGlucy5mb3JFYWNoKHZ1ZU1peGluID0+IHtcclxuICAgICAgaWYgKGlzUGxhaW5PYmplY3QodnVlTWl4aW4pICYmIHZ1ZU1peGluLnByb3BzKSB7XHJcbiAgICAgICAgYmVoYXZpb3JzLnB1c2goXHJcbiAgICAgICAgICBpbml0QmVoYXZpb3Ioe1xyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBpbml0UHJvcGVydGllcyh2dWVNaXhpbi5wcm9wcywgdHJ1ZSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHJldHVybiBiZWhhdmlvcnNcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VQcm9wVHlwZSAoa2V5LCB0eXBlLCBkZWZhdWx0VmFsdWUsIGZpbGUpIHtcclxuICAvLyBbU3RyaW5nXT0+U3RyaW5nXHJcbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkgJiYgdHlwZS5sZW5ndGggPT09IDEpIHtcclxuICAgIHJldHVybiB0eXBlWzBdXHJcbiAgfVxyXG4gIHJldHVybiB0eXBlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRQcm9wZXJ0aWVzIChwcm9wcywgaXNCZWhhdmlvciA9IGZhbHNlLCBmaWxlID0gJycsIG9wdGlvbnMpIHtcclxuICBjb25zdCBwcm9wZXJ0aWVzID0ge307XHJcbiAgaWYgKCFpc0JlaGF2aW9yKSB7XHJcbiAgICBwcm9wZXJ0aWVzLnZ1ZUlkID0ge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIHZhbHVlOiAnJ1xyXG4gICAgfTtcclxuICAgIC8vIHNjb3BlZFNsb3RzQ29tcGlsZXIgYXV0b1xyXG4gICAgcHJvcGVydGllcy5zY29wZWRTbG90c0NvbXBpbGVyID0ge1xyXG4gICAgICB0eXBlOiBTdHJpbmcsXHJcbiAgICAgIHZhbHVlOiAnJ1xyXG4gICAgfTtcclxuICAgIHByb3BlcnRpZXMudnVlU2xvdHMgPSB7IC8vIOWwj+eoi+W6j+S4jeiDveebtOaOpeWumuS5iSAkc2xvdHMg55qEIHByb3Bz77yM5omA5Lul6YCa6L+HIHZ1ZVNsb3RzIOi9rOaNouWIsCAkc2xvdHNcclxuICAgICAgdHlwZTogbnVsbCxcclxuICAgICAgdmFsdWU6IFtdLFxyXG4gICAgICBvYnNlcnZlcjogZnVuY3Rpb24gKG5ld1ZhbCwgb2xkVmFsKSB7XHJcbiAgICAgICAgY29uc3QgJHNsb3RzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICAgICAgICBuZXdWYWwuZm9yRWFjaChzbG90TmFtZSA9PiB7XHJcbiAgICAgICAgICAkc2xvdHNbc2xvdE5hbWVdID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICAgICAgJHNsb3RzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG4gIGlmIChBcnJheS5pc0FycmF5KHByb3BzKSkgeyAvLyBbJ3RpdGxlJ11cclxuICAgIHByb3BzLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgcHJvcGVydGllc1trZXldID0ge1xyXG4gICAgICAgIHR5cGU6IG51bGwsXHJcbiAgICAgICAgb2JzZXJ2ZXI6IGNyZWF0ZU9ic2VydmVyKGtleSlcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChwcm9wcykpIHsgLy8ge3RpdGxlOnt0eXBlOlN0cmluZyxkZWZhdWx0OicnfSxjb250ZW50OlN0cmluZ31cclxuICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGNvbnN0IG9wdHMgPSBwcm9wc1trZXldO1xyXG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChvcHRzKSkgeyAvLyB0aXRsZTp7dHlwZTpTdHJpbmcsZGVmYXVsdDonJ31cclxuICAgICAgICBsZXQgdmFsdWUgPSBvcHRzLmRlZmF1bHQ7XHJcbiAgICAgICAgaWYgKGlzRm4odmFsdWUpKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBvcHRzLnR5cGUgPSBwYXJzZVByb3BUeXBlKGtleSwgb3B0cy50eXBlKTtcclxuXHJcbiAgICAgICAgcHJvcGVydGllc1trZXldID0ge1xyXG4gICAgICAgICAgdHlwZTogUFJPUF9UWVBFUy5pbmRleE9mKG9wdHMudHlwZSkgIT09IC0xID8gb3B0cy50eXBlIDogbnVsbCxcclxuICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgb2JzZXJ2ZXI6IGNyZWF0ZU9ic2VydmVyKGtleSlcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2UgeyAvLyBjb250ZW50OlN0cmluZ1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBwYXJzZVByb3BUeXBlKGtleSwgb3B0cyk7XHJcbiAgICAgICAgcHJvcGVydGllc1trZXldID0ge1xyXG4gICAgICAgICAgdHlwZTogUFJPUF9UWVBFUy5pbmRleE9mKHR5cGUpICE9PSAtMSA/IHR5cGUgOiBudWxsLFxyXG4gICAgICAgICAgb2JzZXJ2ZXI6IGNyZWF0ZU9ic2VydmVyKGtleSlcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcmV0dXJuIHByb3BlcnRpZXNcclxufVxyXG5cclxuZnVuY3Rpb24gd3JhcHBlciQxIChldmVudCkge1xyXG4gIC8vIFRPRE8g5Y+I5b6X5YW85a65IG1wdnVlIOeahCBtcCDlr7nosaFcclxuICB0cnkge1xyXG4gICAgZXZlbnQubXAgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XHJcbiAgfSBjYXRjaCAoZSkgeyB9XHJcblxyXG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IG5vb3A7XHJcbiAgZXZlbnQucHJldmVudERlZmF1bHQgPSBub29wO1xyXG5cclxuICBldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQgfHwge307XHJcblxyXG4gIGlmICghaGFzT3duKGV2ZW50LCAnZGV0YWlsJykpIHtcclxuICAgIGV2ZW50LmRldGFpbCA9IHt9O1xyXG4gIH1cclxuXHJcbiAgaWYgKGhhc093bihldmVudCwgJ21hcmtlcklkJykpIHtcclxuICAgIGV2ZW50LmRldGFpbCA9IHR5cGVvZiBldmVudC5kZXRhaWwgPT09ICdvYmplY3QnID8gZXZlbnQuZGV0YWlsIDoge307XHJcbiAgICBldmVudC5kZXRhaWwubWFya2VySWQgPSBldmVudC5tYXJrZXJJZDtcclxuICB9XHJcblxyXG4gIGlmIChpc1BsYWluT2JqZWN0KGV2ZW50LmRldGFpbCkpIHtcclxuICAgIGV2ZW50LnRhcmdldCA9IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50LnRhcmdldCwgZXZlbnQuZGV0YWlsKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBldmVudFxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRFeHRyYVZhbHVlICh2bSwgZGF0YVBhdGhzQXJyYXkpIHtcclxuICBsZXQgY29udGV4dCA9IHZtO1xyXG4gIGRhdGFQYXRoc0FycmF5LmZvckVhY2goZGF0YVBhdGhBcnJheSA9PiB7XHJcbiAgICBjb25zdCBkYXRhUGF0aCA9IGRhdGFQYXRoQXJyYXlbMF07XHJcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFQYXRoQXJyYXlbMl07XHJcbiAgICBpZiAoZGF0YVBhdGggfHwgdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykgeyAvLyBbJycsJycsaW5kZXgsJ2Rpc2FibGUnXVxyXG4gICAgICBjb25zdCBwcm9wUGF0aCA9IGRhdGFQYXRoQXJyYXlbMV07XHJcbiAgICAgIGNvbnN0IHZhbHVlUGF0aCA9IGRhdGFQYXRoQXJyYXlbM107XHJcblxyXG4gICAgICBsZXQgdkZvcjtcclxuICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIoZGF0YVBhdGgpKSB7XHJcbiAgICAgICAgdkZvciA9IGRhdGFQYXRoO1xyXG4gICAgICB9IGVsc2UgaWYgKCFkYXRhUGF0aCkge1xyXG4gICAgICAgIHZGb3IgPSBjb250ZXh0O1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhUGF0aCA9PT0gJ3N0cmluZycgJiYgZGF0YVBhdGgpIHtcclxuICAgICAgICBpZiAoZGF0YVBhdGguaW5kZXhPZignI3MjJykgPT09IDApIHtcclxuICAgICAgICAgIHZGb3IgPSBkYXRhUGF0aC5zdWJzdHIoMyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZGb3IgPSB2bS5fX2dldF92YWx1ZShkYXRhUGF0aCwgY29udGV4dCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2Rm9yKSkge1xyXG4gICAgICAgIGNvbnRleHQgPSB2YWx1ZTtcclxuICAgICAgfSBlbHNlIGlmICghcHJvcFBhdGgpIHtcclxuICAgICAgICBjb250ZXh0ID0gdkZvclt2YWx1ZV07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodkZvcikpIHtcclxuICAgICAgICAgIGNvbnRleHQgPSB2Rm9yLmZpbmQodkZvckl0ZW0gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdm0uX19nZXRfdmFsdWUocHJvcFBhdGgsIHZGb3JJdGVtKSA9PT0gdmFsdWVcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2Rm9yKSkge1xyXG4gICAgICAgICAgY29udGV4dCA9IE9iamVjdC5rZXlzKHZGb3IpLmZpbmQodkZvcktleSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB2bS5fX2dldF92YWx1ZShwcm9wUGF0aCwgdkZvclt2Rm9yS2V5XSkgPT09IHZhbHVlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcigndi1mb3Ig5pqC5LiN5pSv5oyB5b6q546v5pWw5o2u77yaJywgdkZvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodmFsdWVQYXRoKSB7XHJcbiAgICAgICAgY29udGV4dCA9IHZtLl9fZ2V0X3ZhbHVlKHZhbHVlUGF0aCwgY29udGV4dCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuICByZXR1cm4gY29udGV4dFxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzRXZlbnRFeHRyYSAodm0sIGV4dHJhLCBldmVudCwgX19hcmdzX18pIHtcclxuICBjb25zdCBleHRyYU9iaiA9IHt9O1xyXG5cclxuICBpZiAoQXJyYXkuaXNBcnJheShleHRyYSkgJiYgZXh0cmEubGVuZ3RoKSB7XHJcbiAgICAvKipcclxuICAgICAqW1xyXG4gICAgICogICAgWydkYXRhLml0ZW1zJywgJ2RhdGEuaWQnLCBpdGVtLmRhdGEuaWRdLFxyXG4gICAgICogICAgWydtZXRhcycsICdpZCcsIG1ldGEuaWRdXHJcbiAgICAgKl0sXHJcbiAgICAgKltcclxuICAgICAqICAgIFsnZGF0YS5pdGVtcycsICdkYXRhLmlkJywgaXRlbS5kYXRhLmlkXSxcclxuICAgICAqICAgIFsnbWV0YXMnLCAnaWQnLCBtZXRhLmlkXVxyXG4gICAgICpdLFxyXG4gICAgICondGVzdCdcclxuICAgICAqL1xyXG4gICAgZXh0cmEuZm9yRWFjaCgoZGF0YVBhdGgsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2YgZGF0YVBhdGggPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKCFkYXRhUGF0aCkgeyAvLyBtb2RlbCxwcm9wLnN5bmNcclxuICAgICAgICAgIGV4dHJhT2JqWyckJyArIGluZGV4XSA9IHZtO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAoZGF0YVBhdGggPT09ICckZXZlbnQnKSB7IC8vICRldmVudFxyXG4gICAgICAgICAgICBleHRyYU9ialsnJCcgKyBpbmRleF0gPSBldmVudDtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVBhdGggPT09ICdhcmd1bWVudHMnKSB7XHJcbiAgICAgICAgICAgIGV4dHJhT2JqWyckJyArIGluZGV4XSA9IGV2ZW50LmRldGFpbCA/IGV2ZW50LmRldGFpbC5fX2FyZ3NfXyB8fCBfX2FyZ3NfXyA6IF9fYXJnc19fO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhUGF0aC5pbmRleE9mKCckZXZlbnQuJykgPT09IDApIHsgLy8gJGV2ZW50LnRhcmdldC52YWx1ZVxyXG4gICAgICAgICAgICBleHRyYU9ialsnJCcgKyBpbmRleF0gPSB2bS5fX2dldF92YWx1ZShkYXRhUGF0aC5yZXBsYWNlKCckZXZlbnQuJywgJycpLCBldmVudCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleHRyYU9ialsnJCcgKyBpbmRleF0gPSB2bS5fX2dldF92YWx1ZShkYXRhUGF0aCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGV4dHJhT2JqWyckJyArIGluZGV4XSA9IGdldEV4dHJhVmFsdWUodm0sIGRhdGFQYXRoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZXh0cmFPYmpcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0T2JqQnlBcnJheSAoYXJyKSB7XHJcbiAgY29uc3Qgb2JqID0ge307XHJcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJbaV07XHJcbiAgICBvYmpbZWxlbWVudFswXV0gPSBlbGVtZW50WzFdO1xyXG4gIH1cclxuICByZXR1cm4gb2JqXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MgKHZtLCBldmVudCwgYXJncyA9IFtdLCBleHRyYSA9IFtdLCBpc0N1c3RvbSwgbWV0aG9kTmFtZSkge1xyXG4gIGxldCBpc0N1c3RvbU1QRXZlbnQgPSBmYWxzZTsgLy8gd3hjb21wb25lbnQg57uE5Lu277yM5Lyg6YCS5Y6f5aeLIGV2ZW50IOWvueixoVxyXG5cclxuICAvLyBmaXhlZCDnlKjmiLfnm7TmjqXop6blj5EgbXBJbnN0YW5jZS50cmlnZ2VyRXZlbnRcclxuICBjb25zdCBfX2FyZ3NfXyA9IGlzUGxhaW5PYmplY3QoZXZlbnQuZGV0YWlsKVxyXG4gICAgPyBldmVudC5kZXRhaWwuX19hcmdzX18gfHwgW2V2ZW50LmRldGFpbF1cclxuICAgIDogW2V2ZW50LmRldGFpbF07XHJcblxyXG4gIGlmIChpc0N1c3RvbSkgeyAvLyDoh6rlrprkuYnkuovku7ZcclxuICAgIGlzQ3VzdG9tTVBFdmVudCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgJiZcclxuICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5kYXRhc2V0ICYmXHJcbiAgICAgIGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldC5jb21UeXBlID09PSAnd3gnO1xyXG4gICAgaWYgKCFhcmdzLmxlbmd0aCkgeyAvLyDml6Dlj4LmlbDvvIznm7TmjqXkvKDlhaUgZXZlbnQg5oiWIGRldGFpbCDmlbDnu4RcclxuICAgICAgaWYgKGlzQ3VzdG9tTVBFdmVudCkge1xyXG4gICAgICAgIHJldHVybiBbZXZlbnRdXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIF9fYXJnc19fXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBleHRyYU9iaiA9IHByb2Nlc3NFdmVudEV4dHJhKHZtLCBleHRyYSwgZXZlbnQsIF9fYXJnc19fKTtcclxuXHJcbiAgY29uc3QgcmV0ID0gW107XHJcbiAgYXJncy5mb3JFYWNoKGFyZyA9PiB7XHJcbiAgICBpZiAoYXJnID09PSAnJGV2ZW50Jykge1xyXG4gICAgICBpZiAobWV0aG9kTmFtZSA9PT0gJ19fc2V0X21vZGVsJyAmJiAhaXNDdXN0b20pIHsgLy8gaW5wdXQgdi1tb2RlbCB2YWx1ZVxyXG4gICAgICAgIHJldC5wdXNoKGV2ZW50LnRhcmdldC52YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKGlzQ3VzdG9tICYmICFpc0N1c3RvbU1QRXZlbnQpIHtcclxuICAgICAgICAgIHJldC5wdXNoKF9fYXJnc19fWzBdKTtcclxuICAgICAgICB9IGVsc2UgeyAvLyB3eGNvbXBvbmVudCDnu4Tku7bmiJblhoXnva7nu4Tku7ZcclxuICAgICAgICAgIHJldC5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnWzBdID09PSAnbycpIHtcclxuICAgICAgICByZXQucHVzaChnZXRPYmpCeUFycmF5KGFyZykpO1xyXG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnICYmIGhhc093bihleHRyYU9iaiwgYXJnKSkge1xyXG4gICAgICAgIHJldC5wdXNoKGV4dHJhT2JqW2FyZ10pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldC5wdXNoKGFyZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9KTtcclxuXHJcbiAgcmV0dXJuIHJldFxyXG59XHJcblxyXG5jb25zdCBPTkNFID0gJ34nO1xyXG5jb25zdCBDVVNUT00gPSAnXic7XHJcblxyXG5mdW5jdGlvbiBpc01hdGNoRXZlbnRUeXBlIChldmVudFR5cGUsIG9wdFR5cGUpIHtcclxuICByZXR1cm4gKGV2ZW50VHlwZSA9PT0gb3B0VHlwZSkgfHxcclxuICAgIChcclxuICAgICAgb3B0VHlwZSA9PT0gJ3JlZ2lvbmNoYW5nZScgJiZcclxuICAgICAgKFxyXG4gICAgICAgIGV2ZW50VHlwZSA9PT0gJ2JlZ2luJyB8fFxyXG4gICAgICAgIGV2ZW50VHlwZSA9PT0gJ2VuZCdcclxuICAgICAgKVxyXG4gICAgKVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDb250ZXh0Vm0gKHZtKSB7XHJcbiAgbGV0ICRwYXJlbnQgPSB2bS4kcGFyZW50O1xyXG4gIC8vIOeItue7hOS7tuaYryBzY29wZWQgc2xvdHMg5oiW6ICF5YW25LuW6Ieq5a6a5LmJ57uE5Lu25pe257un57ut5p+l5om+XHJcbiAgd2hpbGUgKCRwYXJlbnQgJiYgJHBhcmVudC4kcGFyZW50ICYmICgkcGFyZW50LiRvcHRpb25zLmdlbmVyaWMgfHwgJHBhcmVudC4kcGFyZW50LiRvcHRpb25zLmdlbmVyaWMgfHwgJHBhcmVudC4kc2NvcGUuXyR2dWVQaWQpKSB7XHJcbiAgICAkcGFyZW50ID0gJHBhcmVudC4kcGFyZW50O1xyXG4gIH1cclxuICByZXR1cm4gJHBhcmVudCAmJiAkcGFyZW50LiRwYXJlbnRcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlRXZlbnQgKGV2ZW50KSB7XHJcbiAgZXZlbnQgPSB3cmFwcGVyJDEoZXZlbnQpO1xyXG5cclxuICAvLyBbWyd0YXAnLFtbJ2hhbmRsZScsWzEsMixhXV0sWydoYW5kbGUxJyxbMSwyLGFdXV1dXVxyXG4gIGNvbnN0IGRhdGFzZXQgPSAoZXZlbnQuY3VycmVudFRhcmdldCB8fCBldmVudC50YXJnZXQpLmRhdGFzZXQ7XHJcbiAgaWYgKCFkYXRhc2V0KSB7XHJcbiAgICByZXR1cm4gY29uc29sZS53YXJuKCfkuovku7bkv6Hmga/kuI3lrZjlnKgnKVxyXG4gIH1cclxuICBjb25zdCBldmVudE9wdHMgPSBkYXRhc2V0LmV2ZW50T3B0cyB8fCBkYXRhc2V0WydldmVudC1vcHRzJ107IC8vIOaUr+S7mOWunSB3ZWItdmlldyDnu4Tku7YgZGF0YXNldCDpnZ7pqbzls7BcclxuICBpZiAoIWV2ZW50T3B0cykge1xyXG4gICAgcmV0dXJuIGNvbnNvbGUud2Fybign5LqL5Lu25L+h5oGv5LiN5a2Y5ZyoJylcclxuICB9XHJcblxyXG4gIC8vIFtbJ2hhbmRsZScsWzEsMixhXV0sWydoYW5kbGUxJyxbMSwyLGFdXV1cclxuICBjb25zdCBldmVudFR5cGUgPSBldmVudC50eXBlO1xyXG5cclxuICBjb25zdCByZXQgPSBbXTtcclxuXHJcbiAgZXZlbnRPcHRzLmZvckVhY2goZXZlbnRPcHQgPT4ge1xyXG4gICAgbGV0IHR5cGUgPSBldmVudE9wdFswXTtcclxuICAgIGNvbnN0IGV2ZW50c0FycmF5ID0gZXZlbnRPcHRbMV07XHJcblxyXG4gICAgY29uc3QgaXNDdXN0b20gPSB0eXBlLmNoYXJBdCgwKSA9PT0gQ1VTVE9NO1xyXG4gICAgdHlwZSA9IGlzQ3VzdG9tID8gdHlwZS5zbGljZSgxKSA6IHR5cGU7XHJcbiAgICBjb25zdCBpc09uY2UgPSB0eXBlLmNoYXJBdCgwKSA9PT0gT05DRTtcclxuICAgIHR5cGUgPSBpc09uY2UgPyB0eXBlLnNsaWNlKDEpIDogdHlwZTtcclxuXHJcbiAgICBpZiAoZXZlbnRzQXJyYXkgJiYgaXNNYXRjaEV2ZW50VHlwZShldmVudFR5cGUsIHR5cGUpKSB7XHJcbiAgICAgIGV2ZW50c0FycmF5LmZvckVhY2goZXZlbnRBcnJheSA9PiB7XHJcbiAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IGV2ZW50QXJyYXlbMF07XHJcbiAgICAgICAgaWYgKG1ldGhvZE5hbWUpIHtcclxuICAgICAgICAgIGxldCBoYW5kbGVyQ3R4ID0gdGhpcy4kdm07XHJcbiAgICAgICAgICBpZiAoaGFuZGxlckN0eC4kb3B0aW9ucy5nZW5lcmljKSB7IC8vIG1wLXdlaXhpbixtcC10b3V0aWFvIOaKveixoeiKgueCueaooeaLnyBzY29wZWQgc2xvdHNcclxuICAgICAgICAgICAgaGFuZGxlckN0eCA9IGdldENvbnRleHRWbShoYW5kbGVyQ3R4KSB8fCBoYW5kbGVyQ3R4O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICckZW1pdCcpIHtcclxuICAgICAgICAgICAgaGFuZGxlckN0eC4kZW1pdC5hcHBseShoYW5kbGVyQ3R4LFxyXG4gICAgICAgICAgICAgIHByb2Nlc3NFdmVudEFyZ3MoXHJcbiAgICAgICAgICAgICAgICB0aGlzLiR2bSxcclxuICAgICAgICAgICAgICAgIGV2ZW50LFxyXG4gICAgICAgICAgICAgICAgZXZlbnRBcnJheVsxXSxcclxuICAgICAgICAgICAgICAgIGV2ZW50QXJyYXlbMl0sXHJcbiAgICAgICAgICAgICAgICBpc0N1c3RvbSxcclxuICAgICAgICAgICAgICAgIG1ldGhvZE5hbWVcclxuICAgICAgICAgICAgICApKTtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlckN0eFttZXRob2ROYW1lXTtcclxuICAgICAgICAgIGlmICghaXNGbihoYW5kbGVyKSkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy4kdm0ubXBUeXBlID09PSAncGFnZScgPyAnUGFnZScgOiAnQ29tcG9uZW50JztcclxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IHRoaXMucm91dGUgfHwgdGhpcy5pcztcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3R5cGV9IFwiJHtwYXRofVwiIGRvZXMgbm90IGhhdmUgYSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCJgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGlzT25jZSkge1xyXG4gICAgICAgICAgICBpZiAoaGFuZGxlci5vbmNlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaGFuZGxlci5vbmNlID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBwYXJhbXMgPSBwcm9jZXNzRXZlbnRBcmdzKFxyXG4gICAgICAgICAgICB0aGlzLiR2bSxcclxuICAgICAgICAgICAgZXZlbnQsXHJcbiAgICAgICAgICAgIGV2ZW50QXJyYXlbMV0sXHJcbiAgICAgICAgICAgIGV2ZW50QXJyYXlbMl0sXHJcbiAgICAgICAgICAgIGlzQ3VzdG9tLFxyXG4gICAgICAgICAgICBtZXRob2ROYW1lXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcGFyYW1zID0gQXJyYXkuaXNBcnJheShwYXJhbXMpID8gcGFyYW1zIDogW107XHJcbiAgICAgICAgICAvLyDlj4LmlbDlsL7pg6jlop7liqDljp/lp4vkuovku7blr7nosaHnlKjkuo7lpI3mnYLooajovr7lvI/lhoXojrflj5bpop3lpJbmlbDmja5cclxuICAgICAgICAgIGlmICgvPVxccypcXFMrXFwuZXZlbnRQYXJhbXNcXHMqXFx8XFx8XFxzKlxcUytcXFtbJ1wiXWV2ZW50LXBhcmFtc1snXCJdXFxdLy50ZXN0KGhhbmRsZXIudG9TdHJpbmcoKSkpIHtcclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNwYXJzZS1hcnJheXNcclxuICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNvbmNhdChbLCAsICwgLCAsICwgLCAsICwgLCBldmVudF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0LnB1c2goaGFuZGxlci5hcHBseShoYW5kbGVyQ3R4LCBwYXJhbXMpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH0pO1xyXG5cclxuICBpZiAoXHJcbiAgICBldmVudFR5cGUgPT09ICdpbnB1dCcgJiZcclxuICAgIHJldC5sZW5ndGggPT09IDEgJiZcclxuICAgIHR5cGVvZiByZXRbMF0gIT09ICd1bmRlZmluZWQnXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gcmV0WzBdXHJcbiAgfVxyXG59XHJcblxyXG5jbGFzcyBFdmVudENoYW5uZWwge1xyXG4gIGNvbnN0cnVjdG9yIChpZCwgZXZlbnRzKSB7XHJcbiAgICB0aGlzLmlkID0gaWQ7XHJcbiAgICB0aGlzLmxpc3RlbmVyID0ge307XHJcbiAgICB0aGlzLmVtaXRDYWNoZSA9IHt9O1xyXG4gICAgaWYgKGV2ZW50cykge1xyXG4gICAgICBPYmplY3Qua2V5cyhldmVudHMpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgICAgdGhpcy5vbihuYW1lLCBldmVudHNbbmFtZV0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVtaXQgKGV2ZW50TmFtZSwgLi4uYXJncykge1xyXG4gICAgY29uc3QgZm5zID0gdGhpcy5saXN0ZW5lcltldmVudE5hbWVdO1xyXG4gICAgaWYgKCFmbnMpIHtcclxuICAgICAgcmV0dXJuICh0aGlzLmVtaXRDYWNoZVtldmVudE5hbWVdIHx8ICh0aGlzLmVtaXRDYWNoZVtldmVudE5hbWVdID0gW10pKS5wdXNoKGFyZ3MpXHJcbiAgICB9XHJcbiAgICBmbnMuZm9yRWFjaChvcHQgPT4ge1xyXG4gICAgICBvcHQuZm4uYXBwbHkob3B0LmZuLCBhcmdzKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5saXN0ZW5lcltldmVudE5hbWVdID0gZm5zLmZpbHRlcihvcHQgPT4gb3B0LnR5cGUgIT09ICdvbmNlJyk7XHJcbiAgfVxyXG5cclxuICBvbiAoZXZlbnROYW1lLCBmbikge1xyXG4gICAgdGhpcy5fYWRkTGlzdGVuZXIoZXZlbnROYW1lLCAnb24nLCBmbik7XHJcbiAgICB0aGlzLl9jbGVhckNhY2hlKGV2ZW50TmFtZSk7XHJcbiAgfVxyXG5cclxuICBvbmNlIChldmVudE5hbWUsIGZuKSB7XHJcbiAgICB0aGlzLl9hZGRMaXN0ZW5lcihldmVudE5hbWUsICdvbmNlJywgZm4pO1xyXG4gICAgdGhpcy5fY2xlYXJDYWNoZShldmVudE5hbWUpO1xyXG4gIH1cclxuXHJcbiAgb2ZmIChldmVudE5hbWUsIGZuKSB7XHJcbiAgICBjb25zdCBmbnMgPSB0aGlzLmxpc3RlbmVyW2V2ZW50TmFtZV07XHJcbiAgICBpZiAoIWZucykge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGlmIChmbikge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7KSB7XHJcbiAgICAgICAgaWYgKGZuc1tpXS5mbiA9PT0gZm4pIHtcclxuICAgICAgICAgIGZucy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICBpLS07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGkrKztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGVsZXRlIHRoaXMubGlzdGVuZXJbZXZlbnROYW1lXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9jbGVhckNhY2hlIChldmVudE5hbWUpIHtcclxuICAgIGNvbnN0IGNhY2hlQXJncyA9IHRoaXMuZW1pdENhY2hlW2V2ZW50TmFtZV07XHJcbiAgICBpZiAoY2FjaGVBcmdzKSB7XHJcbiAgICAgIGZvciAoOyBjYWNoZUFyZ3MubGVuZ3RoID4gMDspIHtcclxuICAgICAgICB0aGlzLmVtaXQuYXBwbHkodGhpcywgW2V2ZW50TmFtZV0uY29uY2F0KGNhY2hlQXJncy5zaGlmdCgpKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9hZGRMaXN0ZW5lciAoZXZlbnROYW1lLCB0eXBlLCBmbikge1xyXG4gICAgKHRoaXMubGlzdGVuZXJbZXZlbnROYW1lXSB8fCAodGhpcy5saXN0ZW5lcltldmVudE5hbWVdID0gW10pKS5wdXNoKHtcclxuICAgICAgZm4sXHJcbiAgICAgIHR5cGVcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgZXZlbnRDaGFubmVscyA9IHt9O1xyXG5cclxuY29uc3QgZXZlbnRDaGFubmVsU3RhY2sgPSBbXTtcclxuXHJcbmZ1bmN0aW9uIGdldEV2ZW50Q2hhbm5lbCAoaWQpIHtcclxuICBpZiAoaWQpIHtcclxuICAgIGNvbnN0IGV2ZW50Q2hhbm5lbCA9IGV2ZW50Q2hhbm5lbHNbaWRdO1xyXG4gICAgZGVsZXRlIGV2ZW50Q2hhbm5lbHNbaWRdO1xyXG4gICAgcmV0dXJuIGV2ZW50Q2hhbm5lbFxyXG4gIH1cclxuICByZXR1cm4gZXZlbnRDaGFubmVsU3RhY2suc2hpZnQoKVxyXG59XHJcblxyXG5jb25zdCBob29rcyA9IFtcclxuICAnb25TaG93JyxcclxuICAnb25IaWRlJyxcclxuICAnb25FcnJvcicsXHJcbiAgJ29uUGFnZU5vdEZvdW5kJyxcclxuICAnb25UaGVtZUNoYW5nZScsXHJcbiAgJ29uVW5oYW5kbGVkUmVqZWN0aW9uJ1xyXG5dO1xyXG5cclxuZnVuY3Rpb24gaW5pdEV2ZW50Q2hhbm5lbCAoKSB7XHJcbiAgVnVlLnByb3RvdHlwZS5nZXRPcGVuZXJFdmVudENoYW5uZWwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAoIXRoaXMuX19ldmVudENoYW5uZWxfXykge1xyXG4gICAgICB0aGlzLl9fZXZlbnRDaGFubmVsX18gPSBuZXcgRXZlbnRDaGFubmVsKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fX2V2ZW50Q2hhbm5lbF9fXHJcbiAgfTtcclxuICBjb25zdCBjYWxsSG9vayA9IFZ1ZS5wcm90b3R5cGUuX19jYWxsX2hvb2s7XHJcbiAgVnVlLnByb3RvdHlwZS5fX2NhbGxfaG9vayA9IGZ1bmN0aW9uIChob29rLCBhcmdzKSB7XHJcbiAgICBpZiAoaG9vayA9PT0gJ29uTG9hZCcgJiYgYXJncyAmJiBhcmdzLl9faWRfXykge1xyXG4gICAgICB0aGlzLl9fZXZlbnRDaGFubmVsX18gPSBnZXRFdmVudENoYW5uZWwoYXJncy5fX2lkX18pO1xyXG4gICAgICBkZWxldGUgYXJncy5fX2lkX187XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2FsbEhvb2suY2FsbCh0aGlzLCBob29rLCBhcmdzKVxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGluaXRTY29wZWRTbG90c1BhcmFtcyAoKSB7XHJcbiAgY29uc3QgY2VudGVyID0ge307XHJcbiAgY29uc3QgcGFyZW50cyA9IHt9O1xyXG5cclxuICBWdWUucHJvdG90eXBlLiRoYXNTY29wZWRTbG90c1BhcmFtcyA9IGZ1bmN0aW9uICh2dWVJZCkge1xyXG4gICAgY29uc3QgaGFzID0gY2VudGVyW3Z1ZUlkXTtcclxuICAgIGlmICghaGFzKSB7XHJcbiAgICAgIHBhcmVudHNbdnVlSWRdID0gdGhpcztcclxuICAgICAgdGhpcy4kb24oJ2hvb2s6ZGVzdHJveWVkJywgKCkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZSBwYXJlbnRzW3Z1ZUlkXTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaGFzXHJcbiAgfTtcclxuXHJcbiAgVnVlLnByb3RvdHlwZS4kZ2V0U2NvcGVkU2xvdHNQYXJhbXMgPSBmdW5jdGlvbiAodnVlSWQsIG5hbWUsIGtleSkge1xyXG4gICAgY29uc3QgZGF0YSA9IGNlbnRlclt2dWVJZF07XHJcbiAgICBpZiAoZGF0YSkge1xyXG4gICAgICBjb25zdCBvYmplY3QgPSBkYXRhW25hbWVdIHx8IHt9O1xyXG4gICAgICByZXR1cm4ga2V5ID8gb2JqZWN0W2tleV0gOiBvYmplY3RcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmVudHNbdnVlSWRdID0gdGhpcztcclxuICAgICAgdGhpcy4kb24oJ2hvb2s6ZGVzdHJveWVkJywgKCkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZSBwYXJlbnRzW3Z1ZUlkXTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgVnVlLnByb3RvdHlwZS4kc2V0U2NvcGVkU2xvdHNQYXJhbXMgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcclxuICAgIGNvbnN0IHZ1ZUlkcyA9IHRoaXMuJG9wdGlvbnMucHJvcHNEYXRhLnZ1ZUlkO1xyXG4gICAgaWYgKHZ1ZUlkcykge1xyXG4gICAgICBjb25zdCB2dWVJZCA9IHZ1ZUlkcy5zcGxpdCgnLCcpWzBdO1xyXG4gICAgICBjb25zdCBvYmplY3QgPSBjZW50ZXJbdnVlSWRdID0gY2VudGVyW3Z1ZUlkXSB8fCB7fTtcclxuICAgICAgb2JqZWN0W25hbWVdID0gdmFsdWU7XHJcbiAgICAgIGlmIChwYXJlbnRzW3Z1ZUlkXSkge1xyXG4gICAgICAgIHBhcmVudHNbdnVlSWRdLiRmb3JjZVVwZGF0ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgVnVlLm1peGluKHtcclxuICAgIGRlc3Ryb3llZCAoKSB7XHJcbiAgICAgIGNvbnN0IHByb3BzRGF0YSA9IHRoaXMuJG9wdGlvbnMucHJvcHNEYXRhO1xyXG4gICAgICBjb25zdCB2dWVJZCA9IHByb3BzRGF0YSAmJiBwcm9wc0RhdGEudnVlSWQ7XHJcbiAgICAgIGlmICh2dWVJZCkge1xyXG4gICAgICAgIGRlbGV0ZSBjZW50ZXJbdnVlSWRdO1xyXG4gICAgICAgIGRlbGV0ZSBwYXJlbnRzW3Z1ZUlkXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUJhc2VBcHAgKHZtLCB7XHJcbiAgbW9ja3MsXHJcbiAgaW5pdFJlZnNcclxufSkge1xyXG4gIGluaXRFdmVudENoYW5uZWwoKTtcclxuICB7XHJcbiAgICBpbml0U2NvcGVkU2xvdHNQYXJhbXMoKTtcclxuICB9XHJcbiAgaWYgKHZtLiRvcHRpb25zLnN0b3JlKSB7XHJcbiAgICBWdWUucHJvdG90eXBlLiRzdG9yZSA9IHZtLiRvcHRpb25zLnN0b3JlO1xyXG4gIH1cclxuICB1bmlJZE1peGluKFZ1ZSk7XHJcblxyXG4gIFZ1ZS5wcm90b3R5cGUubXBIb3N0ID0gXCJtcC1qZFwiO1xyXG5cclxuICBWdWUubWl4aW4oe1xyXG4gICAgYmVmb3JlQ3JlYXRlICgpIHtcclxuICAgICAgaWYgKCF0aGlzLiRvcHRpb25zLm1wVHlwZSkge1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm1wVHlwZSA9IHRoaXMuJG9wdGlvbnMubXBUeXBlO1xyXG5cclxuICAgICAgdGhpcy4kbXAgPSB7XHJcbiAgICAgICAgZGF0YToge30sXHJcbiAgICAgICAgW3RoaXMubXBUeXBlXTogdGhpcy4kb3B0aW9ucy5tcEluc3RhbmNlXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLiRzY29wZSA9IHRoaXMuJG9wdGlvbnMubXBJbnN0YW5jZTtcclxuXHJcbiAgICAgIGRlbGV0ZSB0aGlzLiRvcHRpb25zLm1wVHlwZTtcclxuICAgICAgZGVsZXRlIHRoaXMuJG9wdGlvbnMubXBJbnN0YW5jZTtcclxuICAgICAgaWYgKHRoaXMubXBUeXBlID09PSAncGFnZScgJiYgdHlwZW9mIGdldEFwcCA9PT0gJ2Z1bmN0aW9uJykgeyAvLyBoYWNrIHZ1ZS1pMThuXHJcbiAgICAgICAgY29uc3QgYXBwID0gZ2V0QXBwKCk7XHJcbiAgICAgICAgaWYgKGFwcC4kdm0gJiYgYXBwLiR2bS4kaTE4bikge1xyXG4gICAgICAgICAgdGhpcy5faTE4biA9IGFwcC4kdm0uJGkxOG47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLm1wVHlwZSAhPT0gJ2FwcCcpIHtcclxuICAgICAgICBpbml0UmVmcyh0aGlzKTtcclxuICAgICAgICBpbml0TW9ja3ModGhpcywgbW9ja3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0IGFwcE9wdGlvbnMgPSB7XHJcbiAgICBvbkxhdW5jaCAoYXJncykge1xyXG4gICAgICBpZiAodGhpcy4kdm0pIHsgLy8g5bey57uP5Yid5aeL5YyW6L+H5LqG77yM5Li76KaB5piv5Li65LqG55m+5bqm77yM55m+5bqmIG9uU2hvdyDlnKggb25MYXVuY2gg5LmL5YmNXHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuJHZtID0gdm07XHJcblxyXG4gICAgICB0aGlzLiR2bS4kbXAgPSB7XHJcbiAgICAgICAgYXBwOiB0aGlzXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLiR2bS4kc2NvcGUgPSB0aGlzO1xyXG4gICAgICAvLyB2bSDkuIrkuZ/mjILovb0gZ2xvYmFsRGF0YVxyXG4gICAgICB0aGlzLiR2bS5nbG9iYWxEYXRhID0gdGhpcy5nbG9iYWxEYXRhO1xyXG5cclxuICAgICAgdGhpcy4kdm0uX2lzTW91bnRlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuJHZtLl9fY2FsbF9ob29rKCdtb3VudGVkJywgYXJncyk7XHJcblxyXG4gICAgICB0aGlzLiR2bS5fX2NhbGxfaG9vaygnb25MYXVuY2gnLCBhcmdzKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyDlhbzlrrnml6fniYjmnKwgZ2xvYmFsRGF0YVxyXG4gIGFwcE9wdGlvbnMuZ2xvYmFsRGF0YSA9IHZtLiRvcHRpb25zLmdsb2JhbERhdGEgfHwge307XHJcbiAgLy8g5bCGIG1ldGhvZHMg5Lit55qE5pa55rOV5oyC5ZyoIGdldEFwcCgpIOS4rVxyXG4gIGNvbnN0IG1ldGhvZHMgPSB2bS4kb3B0aW9ucy5tZXRob2RzO1xyXG4gIGlmIChtZXRob2RzKSB7XHJcbiAgICBPYmplY3Qua2V5cyhtZXRob2RzKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICBhcHBPcHRpb25zW25hbWVdID0gbWV0aG9kc1tuYW1lXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgaW5pdEFwcExvY2FsZShWdWUsIHZtLCBub3JtYWxpemVMb2NhbGUoamQuZ2V0U3lzdGVtSW5mb1N5bmMoKS5sYW5ndWFnZSkgfHwgTE9DQUxFX0VOKTtcclxuXHJcbiAgaW5pdEhvb2tzKGFwcE9wdGlvbnMsIGhvb2tzKTtcclxuICBpbml0VW5rbm93bkhvb2tzKGFwcE9wdGlvbnMsIHZtLiRvcHRpb25zKTtcclxuXHJcbiAgcmV0dXJuIGFwcE9wdGlvbnNcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VBcHAgKHZtKSB7XHJcbiAgcmV0dXJuIHBhcnNlQmFzZUFwcCh2bSwge1xyXG4gICAgbW9ja3MsXHJcbiAgICBpbml0UmVmc1xyXG4gIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlQXBwJDEgKHZtKSB7XHJcbiAgcmV0dXJuIHBhcnNlQXBwKHZtKVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVBcHAgKHZtKSB7XHJcbiAgQXBwKHBhcnNlQXBwJDEodm0pKTtcclxuICByZXR1cm4gdm1cclxufVxyXG5cclxuY29uc3QgZW5jb2RlUmVzZXJ2ZVJFID0gL1shJygpKl0vZztcclxuY29uc3QgZW5jb2RlUmVzZXJ2ZVJlcGxhY2VyID0gYyA9PiAnJScgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpO1xyXG5jb25zdCBjb21tYVJFID0gLyUyQy9nO1xyXG5cclxuLy8gZml4ZWQgZW5jb2RlVVJJQ29tcG9uZW50IHdoaWNoIGlzIG1vcmUgY29uZm9ybWFudCB0byBSRkMzOTg2OlxyXG4vLyAtIGVzY2FwZXMgWyEnKCkqXVxyXG4vLyAtIHByZXNlcnZlIGNvbW1hc1xyXG5jb25zdCBlbmNvZGUgPSBzdHIgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cilcclxuICAucmVwbGFjZShlbmNvZGVSZXNlcnZlUkUsIGVuY29kZVJlc2VydmVSZXBsYWNlcilcclxuICAucmVwbGFjZShjb21tYVJFLCAnLCcpO1xyXG5cclxuZnVuY3Rpb24gc3RyaW5naWZ5UXVlcnkgKG9iaiwgZW5jb2RlU3RyID0gZW5jb2RlKSB7XHJcbiAgY29uc3QgcmVzID0gb2JqID8gT2JqZWN0LmtleXMob2JqKS5tYXAoa2V5ID0+IHtcclxuICAgIGNvbnN0IHZhbCA9IG9ialtrZXldO1xyXG5cclxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gJydcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBlbmNvZGVTdHIoa2V5KVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICAgIHZhbC5mb3JFYWNoKHZhbDIgPT4ge1xyXG4gICAgICAgIGlmICh2YWwyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsMiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2goZW5jb2RlU3RyKGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaChlbmNvZGVTdHIoa2V5KSArICc9JyArIGVuY29kZVN0cih2YWwyKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcmJylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZW5jb2RlU3RyKGtleSkgKyAnPScgKyBlbmNvZGVTdHIodmFsKVxyXG4gIH0pLmZpbHRlcih4ID0+IHgubGVuZ3RoID4gMCkuam9pbignJicpIDogbnVsbDtcclxuICByZXR1cm4gcmVzID8gYD8ke3Jlc31gIDogJydcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VCYXNlQ29tcG9uZW50ICh2dWVDb21wb25lbnRPcHRpb25zLCB7XHJcbiAgaXNQYWdlLFxyXG4gIGluaXRSZWxhdGlvblxyXG59ID0ge30sIG5lZWRWdWVPcHRpb25zKSB7XHJcbiAgY29uc3QgW1Z1ZUNvbXBvbmVudCwgdnVlT3B0aW9uc10gPSBpbml0VnVlQ29tcG9uZW50KFZ1ZSwgdnVlQ29tcG9uZW50T3B0aW9ucyk7XHJcblxyXG4gIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICBtdWx0aXBsZVNsb3RzOiB0cnVlLFxyXG4gICAgYWRkR2xvYmFsQ2xhc3M6IHRydWUsXHJcbiAgICAuLi4odnVlT3B0aW9ucy5vcHRpb25zIHx8IHt9KVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IGNvbXBvbmVudE9wdGlvbnMgPSB7XHJcbiAgICBvcHRpb25zLFxyXG4gICAgZGF0YTogaW5pdERhdGEodnVlT3B0aW9ucywgVnVlLnByb3RvdHlwZSksXHJcbiAgICBiZWhhdmlvcnM6IGluaXRCZWhhdmlvcnModnVlT3B0aW9ucywgaW5pdEJlaGF2aW9yKSxcclxuICAgIHByb3BlcnRpZXM6IGluaXRQcm9wZXJ0aWVzKHZ1ZU9wdGlvbnMucHJvcHMsIGZhbHNlLCB2dWVPcHRpb25zLl9fZmlsZSksXHJcbiAgICBsaWZldGltZXM6IHtcclxuICAgICAgYXR0YWNoZWQgKCkge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7XHJcblxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBtcFR5cGU6IGlzUGFnZS5jYWxsKHRoaXMpID8gJ3BhZ2UnIDogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICBtcEluc3RhbmNlOiB0aGlzLFxyXG4gICAgICAgICAgcHJvcHNEYXRhOiBwcm9wZXJ0aWVzXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaW5pdFZ1ZUlkcyhwcm9wZXJ0aWVzLnZ1ZUlkLCB0aGlzKTtcclxuXHJcbiAgICAgICAgLy8g5aSE55CG54i25a2Q5YWz57O7XHJcbiAgICAgICAgaW5pdFJlbGF0aW9uLmNhbGwodGhpcywge1xyXG4gICAgICAgICAgdnVlUGlkOiB0aGlzLl8kdnVlUGlkLFxyXG4gICAgICAgICAgdnVlT3B0aW9uczogb3B0aW9uc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDliJ3lp4vljJYgdnVlIOWunuS+i1xyXG4gICAgICAgIHRoaXMuJHZtID0gbmV3IFZ1ZUNvbXBvbmVudChvcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8g5aSE55CGJHNsb3RzLCRzY29wZWRTbG90c++8iOaaguS4jeaUr+aMgeWKqOaAgeWPmOWMliRzbG90c++8iVxyXG4gICAgICAgIGluaXRTbG90cyh0aGlzLiR2bSwgcHJvcGVydGllcy52dWVTbG90cyk7XHJcblxyXG4gICAgICAgIC8vIOinpuWPkemmluasoSBzZXREYXRhXHJcbiAgICAgICAgdGhpcy4kdm0uJG1vdW50KCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHJlYWR5ICgpIHtcclxuICAgICAgICAvLyDlvZPnu4Tku7YgcHJvcHMg6buY6K6k5YC85Li6IHRydWXvvIzliJ3lp4vljJbml7bkvKDlhaUgZmFsc2Ug5Lya5a+86Ie0IGNyZWF0ZWQscmVhZHkg6Kem5Y+RLCDkvYYgYXR0YWNoZWQg5LiN6Kem5Y+RXHJcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLndlaXhpbi5xcS5jb20vY29tbXVuaXR5L2RldmVsb3AvZG9jLzAwMDY2YWUyODQ0Y2MwZjhlYjg4M2UyYTU1NzgwMFxyXG4gICAgICAgIGlmICh0aGlzLiR2bSkge1xyXG4gICAgICAgICAgdGhpcy4kdm0uX2lzTW91bnRlZCA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLiR2bS5fX2NhbGxfaG9vaygnbW91bnRlZCcpO1xyXG4gICAgICAgICAgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUmVhZHknKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGRldGFjaGVkICgpIHtcclxuICAgICAgICB0aGlzLiR2bSAmJiB0aGlzLiR2bS4kZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgcGFnZUxpZmV0aW1lczoge1xyXG4gICAgICBzaG93IChhcmdzKSB7XHJcbiAgICAgICAgdGhpcy4kdm0gJiYgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUGFnZVNob3cnLCBhcmdzKTtcclxuICAgICAgfSxcclxuICAgICAgaGlkZSAoKSB7XHJcbiAgICAgICAgdGhpcy4kdm0gJiYgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUGFnZUhpZGUnKTtcclxuICAgICAgfSxcclxuICAgICAgcmVzaXplIChzaXplKSB7XHJcbiAgICAgICAgdGhpcy4kdm0gJiYgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uUGFnZVJlc2l6ZScsIHNpemUpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgbWV0aG9kczoge1xyXG4gICAgICBfX2w6IGhhbmRsZUxpbmssXHJcbiAgICAgIF9fZTogaGFuZGxlRXZlbnRcclxuICAgIH1cclxuICB9O1xyXG4gIC8vIGV4dGVybmFsQ2xhc3Nlc1xyXG4gIGlmICh2dWVPcHRpb25zLmV4dGVybmFsQ2xhc3Nlcykge1xyXG4gICAgY29tcG9uZW50T3B0aW9ucy5leHRlcm5hbENsYXNzZXMgPSB2dWVPcHRpb25zLmV4dGVybmFsQ2xhc3NlcztcclxuICB9XHJcblxyXG4gIGlmIChBcnJheS5pc0FycmF5KHZ1ZU9wdGlvbnMud3hzQ2FsbE1ldGhvZHMpKSB7XHJcbiAgICB2dWVPcHRpb25zLnd4c0NhbGxNZXRob2RzLmZvckVhY2goY2FsbE1ldGhvZCA9PiB7XHJcbiAgICAgIGNvbXBvbmVudE9wdGlvbnMubWV0aG9kc1tjYWxsTWV0aG9kXSA9IGZ1bmN0aW9uIChhcmdzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJHZtW2NhbGxNZXRob2RdKGFyZ3MpXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGlmIChuZWVkVnVlT3B0aW9ucykge1xyXG4gICAgcmV0dXJuIFtjb21wb25lbnRPcHRpb25zLCB2dWVPcHRpb25zLCBWdWVDb21wb25lbnRdXHJcbiAgfVxyXG4gIGlmIChpc1BhZ2UpIHtcclxuICAgIHJldHVybiBjb21wb25lbnRPcHRpb25zXHJcbiAgfVxyXG4gIHJldHVybiBbY29tcG9uZW50T3B0aW9ucywgVnVlQ29tcG9uZW50XVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNvbXBvbmVudCAodnVlQ29tcG9uZW50T3B0aW9ucywgbmVlZFZ1ZU9wdGlvbnMpIHtcclxuICByZXR1cm4gcGFyc2VCYXNlQ29tcG9uZW50KHZ1ZUNvbXBvbmVudE9wdGlvbnMsIHtcclxuICAgIGlzUGFnZSxcclxuICAgIGluaXRSZWxhdGlvblxyXG4gIH0sIG5lZWRWdWVPcHRpb25zKVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUNvbXBvbmVudCQxICh2dWVDb21wb25lbnRPcHRpb25zLCBuZWVkVnVlT3B0aW9ucykge1xyXG4gIGNvbnN0IFtjb21wb25lbnRPcHRpb25zLCB2dWVPcHRpb25zXSA9IHBhcnNlQ29tcG9uZW50KHZ1ZUNvbXBvbmVudE9wdGlvbnMsIHRydWUpO1xyXG4gIC8vIOS6rOS4nOWwj+eoi+W6jyBsaWZldGltZXMg5a2Y5Zyo5YW85a656Zeu6aKYXHJcbiAgY29uc3QgbGlmZXRpbWVzID0gY29tcG9uZW50T3B0aW9ucy5saWZldGltZXM7XHJcbiAgT2JqZWN0LmtleXMobGlmZXRpbWVzKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICBjb21wb25lbnRPcHRpb25zW2tleV0gPSBsaWZldGltZXNba2V5XTtcclxuICB9KTtcclxuICByZXR1cm4gbmVlZFZ1ZU9wdGlvbnMgPyBbY29tcG9uZW50T3B0aW9ucywgdnVlT3B0aW9uc10gOiBjb21wb25lbnRPcHRpb25zXHJcbn1cclxuXHJcbmNvbnN0IGhvb2tzJDEgPSBbXHJcbiAgJ29uU2hvdycsXHJcbiAgJ29uSGlkZScsXHJcbiAgJ29uVW5sb2FkJ1xyXG5dO1xyXG5cclxuaG9va3MkMS5wdXNoKC4uLlBBR0VfRVZFTlRfSE9PS1MpO1xyXG5cclxuZnVuY3Rpb24gcGFyc2VCYXNlUGFnZSAodnVlUGFnZU9wdGlvbnMpIHtcclxuICBjb25zdCBbcGFnZU9wdGlvbnMsIHZ1ZU9wdGlvbnNdID0gcGFyc2VDb21wb25lbnQkMSh2dWVQYWdlT3B0aW9ucywgdHJ1ZSk7XHJcblxyXG4gIGluaXRIb29rcyhwYWdlT3B0aW9ucy5tZXRob2RzLCBob29rcyQxLCB2dWVPcHRpb25zKTtcclxuXHJcbiAgcGFnZU9wdGlvbnMubWV0aG9kcy5vbkxvYWQgPSBmdW5jdGlvbiAocXVlcnkpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IHF1ZXJ5O1xyXG4gICAgY29uc3QgY29weVF1ZXJ5ID0gT2JqZWN0LmFzc2lnbih7fSwgcXVlcnkpO1xyXG4gICAgZGVsZXRlIGNvcHlRdWVyeS5fX2lkX187XHJcbiAgICB0aGlzLiRwYWdlID0ge1xyXG4gICAgICBmdWxsUGF0aDogJy8nICsgKHRoaXMucm91dGUgfHwgdGhpcy5pcykgKyBzdHJpbmdpZnlRdWVyeShjb3B5UXVlcnkpXHJcbiAgICB9O1xyXG4gICAgdGhpcy4kdm0uJG1wLnF1ZXJ5ID0gcXVlcnk7IC8vIOWFvOWuuSBtcHZ1ZVxyXG4gICAgdGhpcy4kdm0uX19jYWxsX2hvb2soJ29uTG9hZCcsIHF1ZXJ5KTtcclxuICB9O1xyXG4gIHtcclxuICAgIGluaXRVbmtub3duSG9va3MocGFnZU9wdGlvbnMubWV0aG9kcywgdnVlUGFnZU9wdGlvbnMsIFsnb25SZWFkeSddKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBwYWdlT3B0aW9uc1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVBhZ2UgKHZ1ZVBhZ2VPcHRpb25zKSB7XHJcbiAgcmV0dXJuIHBhcnNlQmFzZVBhZ2UodnVlUGFnZU9wdGlvbnMpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlUGFnZSQxICh2dWVQYWdlT3B0aW9ucykge1xyXG4gIHJldHVybiBwYXJzZVBhZ2UodnVlUGFnZU9wdGlvbnMpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVBhZ2UgKHZ1ZVBhZ2VPcHRpb25zKSB7XHJcbiAge1xyXG4gICAgcmV0dXJuIENvbXBvbmVudChwYXJzZVBhZ2UkMSh2dWVQYWdlT3B0aW9ucykpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKHZ1ZU9wdGlvbnMpIHtcclxuICB7XHJcbiAgICByZXR1cm4gQ29tcG9uZW50KHBhcnNlQ29tcG9uZW50JDEodnVlT3B0aW9ucykpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVTdWJwYWNrYWdlQXBwICh2bSkge1xyXG4gIGNvbnN0IGFwcE9wdGlvbnMgPSBwYXJzZUFwcCQxKHZtKTtcclxuICBjb25zdCBhcHAgPSBnZXRBcHAoe1xyXG4gICAgYWxsb3dEZWZhdWx0OiB0cnVlXHJcbiAgfSk7XHJcbiAgdm0uJHNjb3BlID0gYXBwO1xyXG4gIGNvbnN0IGdsb2JhbERhdGEgPSBhcHAuZ2xvYmFsRGF0YTtcclxuICBpZiAoZ2xvYmFsRGF0YSkge1xyXG4gICAgT2JqZWN0LmtleXMoYXBwT3B0aW9ucy5nbG9iYWxEYXRhKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICBpZiAoIWhhc093bihnbG9iYWxEYXRhLCBuYW1lKSkge1xyXG4gICAgICAgIGdsb2JhbERhdGFbbmFtZV0gPSBhcHBPcHRpb25zLmdsb2JhbERhdGFbbmFtZV07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBPYmplY3Qua2V5cyhhcHBPcHRpb25zKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgaWYgKCFoYXNPd24oYXBwLCBuYW1lKSkge1xyXG4gICAgICBhcHBbbmFtZV0gPSBhcHBPcHRpb25zW25hbWVdO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIGlmIChpc0ZuKGFwcE9wdGlvbnMub25TaG93KSAmJiBqZC5vbkFwcFNob3cpIHtcclxuICAgIGpkLm9uQXBwU2hvdygoLi4uYXJncykgPT4ge1xyXG4gICAgICB2bS5fX2NhbGxfaG9vaygnb25TaG93JywgYXJncyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgaWYgKGlzRm4oYXBwT3B0aW9ucy5vbkhpZGUpICYmIGpkLm9uQXBwSGlkZSkge1xyXG4gICAgamQub25BcHBIaWRlKCguLi5hcmdzKSA9PiB7XHJcbiAgICAgIHZtLl9fY2FsbF9ob29rKCdvbkhpZGUnLCBhcmdzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBpZiAoaXNGbihhcHBPcHRpb25zLm9uTGF1bmNoKSkge1xyXG4gICAgY29uc3QgYXJncyA9IGpkLmdldExhdW5jaE9wdGlvbnNTeW5jICYmIGpkLmdldExhdW5jaE9wdGlvbnNTeW5jKCk7XHJcbiAgICB2bS5fX2NhbGxfaG9vaygnb25MYXVuY2gnLCBhcmdzKTtcclxuICB9XHJcbiAgcmV0dXJuIHZtXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZVBsdWdpbiAodm0pIHtcclxuICBjb25zdCBhcHBPcHRpb25zID0gcGFyc2VBcHAkMSh2bSk7XHJcbiAgaWYgKGlzRm4oYXBwT3B0aW9ucy5vblNob3cpICYmIGpkLm9uQXBwU2hvdykge1xyXG4gICAgamQub25BcHBTaG93KCguLi5hcmdzKSA9PiB7XHJcbiAgICAgIHZtLl9fY2FsbF9ob29rKCdvblNob3cnLCBhcmdzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBpZiAoaXNGbihhcHBPcHRpb25zLm9uSGlkZSkgJiYgamQub25BcHBIaWRlKSB7XHJcbiAgICBqZC5vbkFwcEhpZGUoKC4uLmFyZ3MpID0+IHtcclxuICAgICAgdm0uX19jYWxsX2hvb2soJ29uSGlkZScsIGFyZ3MpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGlmIChpc0ZuKGFwcE9wdGlvbnMub25MYXVuY2gpKSB7XHJcbiAgICBjb25zdCBhcmdzID0gamQuZ2V0TGF1bmNoT3B0aW9uc1N5bmMgJiYgamQuZ2V0TGF1bmNoT3B0aW9uc1N5bmMoKTtcclxuICAgIHZtLl9fY2FsbF9ob29rKCdvbkxhdW5jaCcsIGFyZ3MpO1xyXG4gIH1cclxuICByZXR1cm4gdm1cclxufVxyXG5cclxudG9kb3MuZm9yRWFjaCh0b2RvQXBpID0+IHtcclxuICBwcm90b2NvbHNbdG9kb0FwaV0gPSBmYWxzZTtcclxufSk7XHJcblxyXG5jYW5JVXNlcy5mb3JFYWNoKGNhbklVc2VBcGkgPT4ge1xyXG4gIGNvbnN0IGFwaU5hbWUgPSBwcm90b2NvbHNbY2FuSVVzZUFwaV0gJiYgcHJvdG9jb2xzW2NhbklVc2VBcGldLm5hbWUgPyBwcm90b2NvbHNbY2FuSVVzZUFwaV0ubmFtZVxyXG4gICAgOiBjYW5JVXNlQXBpO1xyXG4gIGlmICghamQuY2FuSVVzZShhcGlOYW1lKSkge1xyXG4gICAgcHJvdG9jb2xzW2NhbklVc2VBcGldID0gZmFsc2U7XHJcbiAgfVxyXG59KTtcclxuXHJcbmxldCB1bmkgPSB7fTtcclxuXHJcbmlmICh0eXBlb2YgUHJveHkgIT09ICd1bmRlZmluZWQnICYmIFwibXAtamRcIiAhPT0gJ2FwcC1wbHVzJykge1xyXG4gIHVuaSA9IG5ldyBQcm94eSh7fSwge1xyXG4gICAgZ2V0ICh0YXJnZXQsIG5hbWUpIHtcclxuICAgICAgaWYgKGhhc093bih0YXJnZXQsIG5hbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChiYXNlQXBpW25hbWVdKSB7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VBcGlbbmFtZV1cclxuICAgICAgfVxyXG4gICAgICBpZiAoYXBpW25hbWVdKSB7XHJcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeShuYW1lLCBhcGlbbmFtZV0pXHJcbiAgICAgIH1cclxuICAgICAge1xyXG4gICAgICAgIGlmIChleHRyYUFwaVtuYW1lXSkge1xyXG4gICAgICAgICAgcmV0dXJuIHByb21pc2lmeShuYW1lLCBleHRyYUFwaVtuYW1lXSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRvZG9BcGlzW25hbWVdKSB7XHJcbiAgICAgICAgICByZXR1cm4gcHJvbWlzaWZ5KG5hbWUsIHRvZG9BcGlzW25hbWVdKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoZXZlbnRBcGlbbmFtZV0pIHtcclxuICAgICAgICByZXR1cm4gZXZlbnRBcGlbbmFtZV1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcHJvbWlzaWZ5KG5hbWUsIHdyYXBwZXIobmFtZSwgamRbbmFtZV0pKVxyXG4gICAgfSxcclxuICAgIHNldCAodGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xyXG4gICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9KTtcclxufSBlbHNlIHtcclxuICBPYmplY3Qua2V5cyhiYXNlQXBpKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgdW5pW25hbWVdID0gYmFzZUFwaVtuYW1lXTtcclxuICB9KTtcclxuXHJcbiAge1xyXG4gICAgT2JqZWN0LmtleXModG9kb0FwaXMpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICAgIHVuaVtuYW1lXSA9IHByb21pc2lmeShuYW1lLCB0b2RvQXBpc1tuYW1lXSk7XHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5rZXlzKGV4dHJhQXBpKS5mb3JFYWNoKG5hbWUgPT4ge1xyXG4gICAgICB1bmlbbmFtZV0gPSBwcm9taXNpZnkobmFtZSwgdG9kb0FwaXNbbmFtZV0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBPYmplY3Qua2V5cyhldmVudEFwaSkuZm9yRWFjaChuYW1lID0+IHtcclxuICAgIHVuaVtuYW1lXSA9IGV2ZW50QXBpW25hbWVdO1xyXG4gIH0pO1xyXG5cclxuICBPYmplY3Qua2V5cyhhcGkpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICB1bmlbbmFtZV0gPSBwcm9taXNpZnkobmFtZSwgYXBpW25hbWVdKTtcclxuICB9KTtcclxuXHJcbiAgT2JqZWN0LmtleXMoamQpLmZvckVhY2gobmFtZSA9PiB7XHJcbiAgICBpZiAoaGFzT3duKGpkLCBuYW1lKSB8fCBoYXNPd24ocHJvdG9jb2xzLCBuYW1lKSkge1xyXG4gICAgICB1bmlbbmFtZV0gPSBwcm9taXNpZnkobmFtZSwgd3JhcHBlcihuYW1lLCBqZFtuYW1lXSkpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5qZC5jcmVhdGVBcHAgPSBjcmVhdGVBcHA7XHJcbmpkLmNyZWF0ZVBhZ2UgPSBjcmVhdGVQYWdlO1xyXG5qZC5jcmVhdGVDb21wb25lbnQgPSBjcmVhdGVDb21wb25lbnQ7XHJcbmpkLmNyZWF0ZVN1YnBhY2thZ2VBcHAgPSBjcmVhdGVTdWJwYWNrYWdlQXBwO1xyXG5qZC5jcmVhdGVQbHVnaW4gPSBjcmVhdGVQbHVnaW47XHJcblxyXG52YXIgdW5pJDEgPSB1bmk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCB1bmkkMTtcclxuZXhwb3J0IHsgY3JlYXRlQXBwLCBjcmVhdGVDb21wb25lbnQsIGNyZWF0ZVBhZ2UsIGNyZWF0ZVBsdWdpbiwgY3JlYXRlU3VicGFja2FnZUFwcCB9O1xyXG4iLCJ2YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG4iLCJmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgIFwiZGVmYXVsdFwiOiBvYmpcbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzLmpzXCIpO1xudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXQuanNcIik7XG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qc1wiKTtcbnZhciBub25JdGVyYWJsZVJlc3QgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVJlc3QuanNcIik7XG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfc2xpY2VkVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2kgPSBudWxsID09IGFyciA/IG51bGwgOiBcInVuZGVmaW5lZFwiICE9IHR5cGVvZiBTeW1ib2wgJiYgYXJyW1N5bWJvbC5pdGVyYXRvcl0gfHwgYXJyW1wiQEBpdGVyYXRvclwiXTtcbiAgaWYgKG51bGwgIT0gX2kpIHtcbiAgICB2YXIgX3MsXG4gICAgICBfZSxcbiAgICAgIF94LFxuICAgICAgX3IsXG4gICAgICBfYXJyID0gW10sXG4gICAgICBfbiA9ICEwLFxuICAgICAgX2QgPSAhMTtcbiAgICB0cnkge1xuICAgICAgaWYgKF94ID0gKF9pID0gX2kuY2FsbChhcnIpKS5uZXh0LCAwID09PSBpKSB7XG4gICAgICAgIGlmIChPYmplY3QoX2kpICE9PSBfaSkgcmV0dXJuO1xuICAgICAgICBfbiA9ICExO1xuICAgICAgfSBlbHNlIGZvciAoOyAhKF9uID0gKF9zID0gX3guY2FsbChfaSkpLmRvbmUpICYmIChfYXJyLnB1c2goX3MudmFsdWUpLCBfYXJyLmxlbmd0aCAhPT0gaSk7IF9uID0gITApIHtcbiAgICAgICAgO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2QgPSAhMCwgX2UgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX24gJiYgbnVsbCAhPSBfaVtcInJldHVyblwiXSAmJiAoX3IgPSBfaVtcInJldHVyblwiXSgpLCBPYmplY3QoX3IpICE9PSBfcikpIHJldHVybjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfYXJyO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheS5qc1wiKTtcbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG4gIHJldHVybiBhcnIyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVJlc3QsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBfY2xhc3NDYWxsQ2hlY2ssIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgdG9Qcm9wZXJ0eUtleSA9IHJlcXVpcmUoXCIuL3RvUHJvcGVydHlLZXkuanNcIik7XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCB0b1Byb3BlcnR5S2V5KGRlc2NyaXB0b3Iua2V5KSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCBcInByb3RvdHlwZVwiLCB7XG4gICAgd3JpdGFibGU6IGZhbHNlXG4gIH0pO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9jcmVhdGVDbGFzcywgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoXCIuL3RvUHJpbWl0aXZlLmpzXCIpO1xuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkoYXJnKSB7XG4gIHZhciBrZXkgPSB0b1ByaW1pdGl2ZShhcmcsIFwic3RyaW5nXCIpO1xuICByZXR1cm4gX3R5cGVvZihrZXkpID09PSBcInN5bWJvbFwiID8ga2V5IDogU3RyaW5nKGtleSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90b1Byb3BlcnR5S2V5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIHJldHVybiAobW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgXCJzeW1ib2xcIiA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICB9IDogZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBvYmogJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gIH0sIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0cyksIF90eXBlb2Yob2JqKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIi4vdHlwZW9mLmpzXCIpW1wiZGVmYXVsdFwiXTtcbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZShpbnB1dCwgaGludCkge1xuICBpZiAoX3R5cGVvZihpbnB1dCkgIT09IFwib2JqZWN0XCIgfHwgaW5wdXQgPT09IG51bGwpIHJldHVybiBpbnB1dDtcbiAgdmFyIHByaW0gPSBpbnB1dFtTeW1ib2wudG9QcmltaXRpdmVdO1xuICBpZiAocHJpbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIHJlcyA9IHByaW0uY2FsbChpbnB1dCwgaGludCB8fCBcImRlZmF1bHRcIik7XG4gICAgaWYgKF90eXBlb2YocmVzKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHJlcztcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7XG4gIH1cbiAgcmV0dXJuIChoaW50ID09PSBcInN0cmluZ1wiID8gU3RyaW5nIDogTnVtYmVyKShpbnB1dCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF90b1ByaW1pdGl2ZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciB0b1Byb3BlcnR5S2V5ID0gcmVxdWlyZShcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiKTtcbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAga2V5ID0gdG9Qcm9wZXJ0eUtleShrZXkpO1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfZGVmaW5lUHJvcGVydHksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJ2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZi5qc1wiKTtcbnZhciBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QgPSByZXF1aXJlKFwiLi9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QuanNcIik7XG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3QuYmluZCgpLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICB2YXIgYSA9IFtudWxsXTtcbiAgICAgIGEucHVzaC5hcHBseShhLCBhcmdzKTtcbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgICAgaWYgKENsYXNzKSBzZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIH1cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKSA6IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7XG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZiwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBCb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoQm9vbGVhbiwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzLmpzXCIpO1xudmFyIGl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheS5qc1wiKTtcbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5LmpzXCIpO1xudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWQuanNcIik7XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gX3RvQ29uc3VtYWJsZUFycmF5LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gbW9kdWxlLmV4cG9ydHM7IiwidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5LmpzXCIpO1xuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRob3V0SG9sZXMsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgaXRlcltTeW1ib2wuaXRlcmF0b3JdICE9IG51bGwgfHwgaXRlcltcIkBAaXRlcmF0b3JcIl0gIT0gbnVsbCkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVTcHJlYWQsIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBtb2R1bGUuZXhwb3J0czsiLCJjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcclxuY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCc7XHJcbmNvbnN0IGRlZmF1bHREZWxpbWl0ZXJzID0gWyd7JywgJ30nXTtcclxuY2xhc3MgQmFzZUZvcm1hdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9jYWNoZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gICAgfVxyXG4gICAgaW50ZXJwb2xhdGUobWVzc2FnZSwgdmFsdWVzLCBkZWxpbWl0ZXJzID0gZGVmYXVsdERlbGltaXRlcnMpIHtcclxuICAgICAgICBpZiAoIXZhbHVlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gW21lc3NhZ2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdG9rZW5zID0gdGhpcy5fY2FjaGVzW21lc3NhZ2VdO1xyXG4gICAgICAgIGlmICghdG9rZW5zKSB7XHJcbiAgICAgICAgICAgIHRva2VucyA9IHBhcnNlKG1lc3NhZ2UsIGRlbGltaXRlcnMpO1xyXG4gICAgICAgICAgICB0aGlzLl9jYWNoZXNbbWVzc2FnZV0gPSB0b2tlbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb21waWxlKHRva2VucywgdmFsdWVzKTtcclxuICAgIH1cclxufVxyXG5jb25zdCBSRV9UT0tFTl9MSVNUX1ZBTFVFID0gL14oPzpcXGQpKy87XHJcbmNvbnN0IFJFX1RPS0VOX05BTUVEX1ZBTFVFID0gL14oPzpcXHcpKy87XHJcbmZ1bmN0aW9uIHBhcnNlKGZvcm1hdCwgW3N0YXJ0RGVsaW1pdGVyLCBlbmREZWxpbWl0ZXJdKSB7XHJcbiAgICBjb25zdCB0b2tlbnMgPSBbXTtcclxuICAgIGxldCBwb3NpdGlvbiA9IDA7XHJcbiAgICBsZXQgdGV4dCA9ICcnO1xyXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgZm9ybWF0Lmxlbmd0aCkge1xyXG4gICAgICAgIGxldCBjaGFyID0gZm9ybWF0W3Bvc2l0aW9uKytdO1xyXG4gICAgICAgIGlmIChjaGFyID09PSBzdGFydERlbGltaXRlcikge1xyXG4gICAgICAgICAgICBpZiAodGV4dCkge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5zLnB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiB0ZXh0IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRleHQgPSAnJztcclxuICAgICAgICAgICAgbGV0IHN1YiA9ICcnO1xyXG4gICAgICAgICAgICBjaGFyID0gZm9ybWF0W3Bvc2l0aW9uKytdO1xyXG4gICAgICAgICAgICB3aGlsZSAoY2hhciAhPT0gdW5kZWZpbmVkICYmIGNoYXIgIT09IGVuZERlbGltaXRlcikge1xyXG4gICAgICAgICAgICAgICAgc3ViICs9IGNoYXI7XHJcbiAgICAgICAgICAgICAgICBjaGFyID0gZm9ybWF0W3Bvc2l0aW9uKytdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGlzQ2xvc2VkID0gY2hhciA9PT0gZW5kRGVsaW1pdGVyO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gUkVfVE9LRU5fTElTVF9WQUxVRS50ZXN0KHN1YilcclxuICAgICAgICAgICAgICAgID8gJ2xpc3QnXHJcbiAgICAgICAgICAgICAgICA6IGlzQ2xvc2VkICYmIFJFX1RPS0VOX05BTUVEX1ZBTFVFLnRlc3Qoc3ViKVxyXG4gICAgICAgICAgICAgICAgICAgID8gJ25hbWVkJ1xyXG4gICAgICAgICAgICAgICAgICAgIDogJ3Vua25vd24nO1xyXG4gICAgICAgICAgICB0b2tlbnMucHVzaCh7IHZhbHVlOiBzdWIsIHR5cGUgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vICBlbHNlIGlmIChjaGFyID09PSAnJScpIHtcclxuICAgICAgICAvLyAgIC8vIHdoZW4gZm91bmQgcmFpbHMgaTE4biBzeW50YXgsIHNraXAgdGV4dCBjYXB0dXJlXHJcbiAgICAgICAgLy8gICBpZiAoZm9ybWF0W3Bvc2l0aW9uXSAhPT0gJ3snKSB7XHJcbiAgICAgICAgLy8gICAgIHRleHQgKz0gY2hhclxyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGV4dCArPSBjaGFyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHRleHQgJiYgdG9rZW5zLnB1c2goeyB0eXBlOiAndGV4dCcsIHZhbHVlOiB0ZXh0IH0pO1xyXG4gICAgcmV0dXJuIHRva2VucztcclxufVxyXG5mdW5jdGlvbiBjb21waWxlKHRva2VucywgdmFsdWVzKSB7XHJcbiAgICBjb25zdCBjb21waWxlZCA9IFtdO1xyXG4gICAgbGV0IGluZGV4ID0gMDtcclxuICAgIGNvbnN0IG1vZGUgPSBpc0FycmF5KHZhbHVlcylcclxuICAgICAgICA/ICdsaXN0J1xyXG4gICAgICAgIDogaXNPYmplY3QodmFsdWVzKVxyXG4gICAgICAgICAgICA/ICduYW1lZCdcclxuICAgICAgICAgICAgOiAndW5rbm93bic7XHJcbiAgICBpZiAobW9kZSA9PT0gJ3Vua25vd24nKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbXBpbGVkO1xyXG4gICAgfVxyXG4gICAgd2hpbGUgKGluZGV4IDwgdG9rZW5zLmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2luZGV4XTtcclxuICAgICAgICBzd2l0Y2ggKHRva2VuLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAndGV4dCc6XHJcbiAgICAgICAgICAgICAgICBjb21waWxlZC5wdXNoKHRva2VuLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdsaXN0JzpcclxuICAgICAgICAgICAgICAgIGNvbXBpbGVkLnB1c2godmFsdWVzW3BhcnNlSW50KHRva2VuLnZhbHVlLCAxMCldKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICduYW1lZCc6XHJcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ25hbWVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkLnB1c2godmFsdWVzW3Rva2VuLnZhbHVlXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFR5cGUgb2YgdG9rZW4gJyR7dG9rZW4udHlwZX0nIGFuZCBmb3JtYXQgb2YgdmFsdWUgJyR7bW9kZX0nIGRvbid0IG1hdGNoIWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd1bmtub3duJzpcclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBEZXRlY3QgJ3Vua25vd24nIHR5cGUgb2YgdG9rZW4hYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5kZXgrKztcclxuICAgIH1cclxuICAgIHJldHVybiBjb21waWxlZDtcclxufVxyXG5cclxuY29uc3QgTE9DQUxFX1pIX0hBTlMgPSAnemgtSGFucyc7XHJcbmNvbnN0IExPQ0FMRV9aSF9IQU5UID0gJ3poLUhhbnQnO1xyXG5jb25zdCBMT0NBTEVfRU4gPSAnZW4nO1xyXG5jb25zdCBMT0NBTEVfRlIgPSAnZnInO1xyXG5jb25zdCBMT0NBTEVfRVMgPSAnZXMnO1xyXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XHJcbmNvbnN0IGhhc093biA9ICh2YWwsIGtleSkgPT4gaGFzT3duUHJvcGVydHkuY2FsbCh2YWwsIGtleSk7XHJcbmNvbnN0IGRlZmF1bHRGb3JtYXR0ZXIgPSBuZXcgQmFzZUZvcm1hdHRlcigpO1xyXG5mdW5jdGlvbiBpbmNsdWRlKHN0ciwgcGFydHMpIHtcclxuICAgIHJldHVybiAhIXBhcnRzLmZpbmQoKHBhcnQpID0+IHN0ci5pbmRleE9mKHBhcnQpICE9PSAtMSk7XHJcbn1cclxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHBhcnRzKSB7XHJcbiAgICByZXR1cm4gcGFydHMuZmluZCgocGFydCkgPT4gc3RyLmluZGV4T2YocGFydCkgPT09IDApO1xyXG59XHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShsb2NhbGUsIG1lc3NhZ2VzKSB7XHJcbiAgICBpZiAoIWxvY2FsZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxvY2FsZSA9IGxvY2FsZS50cmltKCkucmVwbGFjZSgvXy9nLCAnLScpO1xyXG4gICAgaWYgKG1lc3NhZ2VzICYmIG1lc3NhZ2VzW2xvY2FsZV0pIHtcclxuICAgICAgICByZXR1cm4gbG9jYWxlO1xyXG4gICAgfVxyXG4gICAgbG9jYWxlID0gbG9jYWxlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBpZiAobG9jYWxlLmluZGV4T2YoJ3poJykgPT09IDApIHtcclxuICAgICAgICBpZiAobG9jYWxlLmluZGV4T2YoJy1oYW5zJykgPiAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsb2NhbGUuaW5kZXhPZignLWhhbnQnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBMT0NBTEVfWkhfSEFOVDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluY2x1ZGUobG9jYWxlLCBbJy10dycsICctaGsnLCAnLW1vJywgJy1jaHQnXSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIExPQ0FMRV9aSF9IQU5UO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gTE9DQUxFX1pIX0hBTlM7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsYW5nID0gc3RhcnRzV2l0aChsb2NhbGUsIFtMT0NBTEVfRU4sIExPQ0FMRV9GUiwgTE9DQUxFX0VTXSk7XHJcbiAgICBpZiAobGFuZykge1xyXG4gICAgICAgIHJldHVybiBsYW5nO1xyXG4gICAgfVxyXG59XHJcbmNsYXNzIEkxOG4ge1xyXG4gICAgY29uc3RydWN0b3IoeyBsb2NhbGUsIGZhbGxiYWNrTG9jYWxlLCBtZXNzYWdlcywgd2F0Y2hlciwgZm9ybWF0ZXIsIH0pIHtcclxuICAgICAgICB0aGlzLmxvY2FsZSA9IExPQ0FMRV9FTjtcclxuICAgICAgICB0aGlzLmZhbGxiYWNrTG9jYWxlID0gTE9DQUxFX0VOO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZSA9IHt9O1xyXG4gICAgICAgIHRoaXMubWVzc2FnZXMgPSB7fTtcclxuICAgICAgICB0aGlzLndhdGNoZXJzID0gW107XHJcbiAgICAgICAgaWYgKGZhbGxiYWNrTG9jYWxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmFsbGJhY2tMb2NhbGUgPSBmYWxsYmFja0xvY2FsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtYXRlciA9IGZvcm1hdGVyIHx8IGRlZmF1bHRGb3JtYXR0ZXI7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzIHx8IHt9O1xyXG4gICAgICAgIHRoaXMuc2V0TG9jYWxlKGxvY2FsZSB8fCBMT0NBTEVfRU4pO1xyXG4gICAgICAgIGlmICh3YXRjaGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2F0Y2hMb2NhbGUod2F0Y2hlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgc2V0TG9jYWxlKGxvY2FsZSkge1xyXG4gICAgICAgIGNvbnN0IG9sZExvY2FsZSA9IHRoaXMubG9jYWxlO1xyXG4gICAgICAgIHRoaXMubG9jYWxlID0gbm9ybWFsaXplTG9jYWxlKGxvY2FsZSwgdGhpcy5tZXNzYWdlcykgfHwgdGhpcy5mYWxsYmFja0xvY2FsZTtcclxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZXNbdGhpcy5sb2NhbGVdKSB7XHJcbiAgICAgICAgICAgIC8vIOWPr+iDveWIneWni+WMluaXtuS4jeWtmOWcqFxyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXSA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW3RoaXMubG9jYWxlXTtcclxuICAgICAgICAvLyDku4Xlj5HnlJ/lj5jljJbml7bvvIzpgJrnn6VcclxuICAgICAgICBpZiAob2xkTG9jYWxlICE9PSB0aGlzLmxvY2FsZSkge1xyXG4gICAgICAgICAgICB0aGlzLndhdGNoZXJzLmZvckVhY2goKHdhdGNoZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHdhdGNoZXIodGhpcy5sb2NhbGUsIG9sZExvY2FsZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldExvY2FsZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGU7XHJcbiAgICB9XHJcbiAgICB3YXRjaExvY2FsZShmbikge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy53YXRjaGVycy5wdXNoKGZuKSAtIDE7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy53YXRjaGVycy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICBhZGQobG9jYWxlLCBtZXNzYWdlLCBvdmVycmlkZSA9IHRydWUpIHtcclxuICAgICAgICBjb25zdCBjdXJNZXNzYWdlcyA9IHRoaXMubWVzc2FnZXNbbG9jYWxlXTtcclxuICAgICAgICBpZiAoY3VyTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgaWYgKG92ZXJyaWRlKSB7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGN1ck1lc3NhZ2VzLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG1lc3NhZ2UpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzT3duKGN1ck1lc3NhZ2VzLCBrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ck1lc3NhZ2VzW2tleV0gPSBtZXNzYWdlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZXNbbG9jYWxlXSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZihtZXNzYWdlLCB2YWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShtZXNzYWdlLCB2YWx1ZXMsIGRlbGltaXRlcnMpLmpvaW4oJycpO1xyXG4gICAgfVxyXG4gICAgdChrZXksIGxvY2FsZSwgdmFsdWVzKSB7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2U7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGxvY2FsZSA9IG5vcm1hbGl6ZUxvY2FsZShsb2NhbGUsIHRoaXMubWVzc2FnZXMpO1xyXG4gICAgICAgICAgICBsb2NhbGUgJiYgKG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW2xvY2FsZV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdmFsdWVzID0gbG9jYWxlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWhhc093bihtZXNzYWdlLCBrZXkpKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ2Fubm90IHRyYW5zbGF0ZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCAke2tleX0uIFVzZSB0aGUgdmFsdWUgb2Yga2V5cGF0aCBhcyBkZWZhdWx0LmApO1xyXG4gICAgICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRlci5pbnRlcnBvbGF0ZShtZXNzYWdlW2tleV0sIHZhbHVlcykuam9pbignJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdhdGNoQXBwTG9jYWxlKGFwcFZtLCBpMThuKSB7XHJcbiAgICAvLyDpnIDopoHkv53or4Egd2F0Y2gg55qE6Kem5Y+R5Zyo57uE5Lu25riy5p+T5LmL5YmNXHJcbiAgICBpZiAoYXBwVm0uJHdhdGNoTG9jYWxlKSB7XHJcbiAgICAgICAgLy8gdnVlMlxyXG4gICAgICAgIGFwcFZtLiR3YXRjaExvY2FsZSgobmV3TG9jYWxlKSA9PiB7XHJcbiAgICAgICAgICAgIGkxOG4uc2V0TG9jYWxlKG5ld0xvY2FsZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBhcHBWbS4kd2F0Y2goKCkgPT4gYXBwVm0uJGxvY2FsZSwgKG5ld0xvY2FsZSkgPT4ge1xyXG4gICAgICAgICAgICBpMThuLnNldExvY2FsZShuZXdMb2NhbGUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmZ1bmN0aW9uIGdldERlZmF1bHRMb2NhbGUoKSB7XHJcbiAgICBpZiAodHlwZW9mIHVuaSAhPT0gJ3VuZGVmaW5lZCcgJiYgdW5pLmdldExvY2FsZSkge1xyXG4gICAgICAgIHJldHVybiB1bmkuZ2V0TG9jYWxlKCk7XHJcbiAgICB9XHJcbiAgICAvLyDlsI/nqIvluo/lubPlj7DvvIx1bmkg5ZKMIHVuaS1pMThuIOS6kuebuOW8leeUqO+8jOWvvOiHtOiuv+mXruS4jeWIsCB1bmnvvIzmlYXlnKggZ2xvYmFsIOS4iuaMguS6hiBnZXRMb2NhbGVcclxuICAgIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWwuZ2V0TG9jYWxlKSB7XHJcbiAgICAgICAgcmV0dXJuIGdsb2JhbC5nZXRMb2NhbGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiBMT0NBTEVfRU47XHJcbn1cclxuZnVuY3Rpb24gaW5pdFZ1ZUkxOG4obG9jYWxlLCBtZXNzYWdlcyA9IHt9LCBmYWxsYmFja0xvY2FsZSwgd2F0Y2hlcikge1xyXG4gICAgLy8g5YW85a655pen54mI5pys5YWl5Y+CXHJcbiAgICBpZiAodHlwZW9mIGxvY2FsZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBbbG9jYWxlLCBtZXNzYWdlc10gPSBbXHJcbiAgICAgICAgICAgIG1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBsb2NhbGUsXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgbG9jYWxlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIC8vIOWboOS4uuWwj+eoi+W6j+W5s+WPsO+8jHVuaS1pMThuIOWSjCB1bmkg5LqS55u45byV55So77yM5a+86Ie05q2k5pe26K6/6ZeuIHVuaSDml7bvvIzkuLogdW5kZWZpbmVkXHJcbiAgICAgICAgbG9jYWxlID0gZ2V0RGVmYXVsdExvY2FsZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBmYWxsYmFja0xvY2FsZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBmYWxsYmFja0xvY2FsZSA9XHJcbiAgICAgICAgICAgICh0eXBlb2YgX191bmlDb25maWcgIT09ICd1bmRlZmluZWQnICYmIF9fdW5pQ29uZmlnLmZhbGxiYWNrTG9jYWxlKSB8fFxyXG4gICAgICAgICAgICAgICAgTE9DQUxFX0VOO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaTE4biA9IG5ldyBJMThuKHtcclxuICAgICAgICBsb2NhbGUsXHJcbiAgICAgICAgZmFsbGJhY2tMb2NhbGUsXHJcbiAgICAgICAgbWVzc2FnZXMsXHJcbiAgICAgICAgd2F0Y2hlcixcclxuICAgIH0pO1xyXG4gICAgbGV0IHQgPSAoa2V5LCB2YWx1ZXMpID0+IHtcclxuICAgICAgICBpZiAodHlwZW9mIGdldEFwcCAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAvLyBhcHAgdmlld1xyXG4gICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1mdW5jLWFzc2lnbiAqL1xyXG4gICAgICAgICAgICB0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWVzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTE4bi50KGtleSwgdmFsdWVzKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpc1dhdGNoZWRBcHBMb2NhbGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgdCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXBwVm0gPSBnZXRBcHAoKS4kdm07XHJcbiAgICAgICAgICAgICAgICAvLyDlj6/og70kdm3ov5jkuI3lrZjlnKjvvIzmr5TlpoLlnKjmlK/ku5jlrp3lsI/nqIvluo/kuK3vvIznu4Tku7blrprkuYnovoPml6nvvIzlnKhwcm9wc+eahGRlZmF1bHTph4zkvb/nlKjkuoZ0KCnlh73mlbDvvIjlpoJ1bmktZ29vZHMtbmF277yJ77yM5q2k5pe2YXBw6L+Y5pyq5Yid5aeL5YyWXHJcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICAvLyBcdHR5cGU6IEFycmF5LFxyXG4gICAgICAgICAgICAgICAgLy8gXHRkZWZhdWx0ICgpIHtcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRyZXR1cm4gW3tcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRcdGljb246ICdzaG9wJyxcclxuICAgICAgICAgICAgICAgIC8vIFx0XHRcdHRleHQ6IHQoXCJ1bmktZ29vZHMtbmF2Lm9wdGlvbnMuc2hvcFwiKSxcclxuICAgICAgICAgICAgICAgIC8vIFx0XHR9LCB7XHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0XHRpY29uOiAnY2FydCcsXHJcbiAgICAgICAgICAgICAgICAvLyBcdFx0XHR0ZXh0OiB0KFwidW5pLWdvb2RzLW5hdi5vcHRpb25zLmNhcnRcIilcclxuICAgICAgICAgICAgICAgIC8vIFx0XHR9XVxyXG4gICAgICAgICAgICAgICAgLy8gXHR9XHJcbiAgICAgICAgICAgICAgICAvLyB9LFxyXG4gICAgICAgICAgICAgICAgaWYgKGFwcFZtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6Kem5Y+R5ZON5bqU5byPXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwVm0uJGxvY2FsZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzV2F0Y2hlZEFwcExvY2FsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1dhdGNoZWRBcHBMb2NhbGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaEFwcExvY2FsZShhcHBWbSwgaTE4bik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGkxOG4udChrZXksIHZhbHVlcyk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0KGtleSwgdmFsdWVzKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGkxOG4sXHJcbiAgICAgICAgZihtZXNzYWdlLCB2YWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkxOG4uZihtZXNzYWdlLCB2YWx1ZXMsIGRlbGltaXRlcnMpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdChrZXksIHZhbHVlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gdChrZXksIHZhbHVlcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBhZGQobG9jYWxlLCBtZXNzYWdlLCBvdmVycmlkZSA9IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkxOG4uYWRkKGxvY2FsZSwgbWVzc2FnZSwgb3ZlcnJpZGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2F0Y2goZm4pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkxOG4ud2F0Y2hMb2NhbGUoZm4pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ2V0TG9jYWxlKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaTE4bi5nZXRMb2NhbGUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNldExvY2FsZShuZXdMb2NhbGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGkxOG4uc2V0TG9jYWxlKG5ld0xvY2FsZSk7XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbn1cclxuXHJcbmNvbnN0IGlzU3RyaW5nID0gKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XHJcbmxldCBmb3JtYXRlcjtcclxuZnVuY3Rpb24gaGFzSTE4bkpzb24oanNvbk9iaiwgZGVsaW1pdGVycykge1xyXG4gICAgaWYgKCFmb3JtYXRlcikge1xyXG4gICAgICAgIGZvcm1hdGVyID0gbmV3IEJhc2VGb3JtYXR0ZXIoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB3YWxrSnNvbk9iaihqc29uT2JqLCAoanNvbk9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBqc29uT2JqW2tleV07XHJcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xyXG4gICAgICAgICAgICBpZiAoaXNJMThuU3RyKHZhbHVlLCBkZWxpbWl0ZXJzKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBoYXNJMThuSnNvbih2YWx1ZSwgZGVsaW1pdGVycyk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn1cclxuZnVuY3Rpb24gcGFyc2VJMThuSnNvbihqc29uT2JqLCB2YWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgIGlmICghZm9ybWF0ZXIpIHtcclxuICAgICAgICBmb3JtYXRlciA9IG5ldyBCYXNlRm9ybWF0dGVyKCk7XHJcbiAgICB9XHJcbiAgICB3YWxrSnNvbk9iaihqc29uT2JqLCAoanNvbk9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSBqc29uT2JqW2tleV07XHJcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xyXG4gICAgICAgICAgICBpZiAoaXNJMThuU3RyKHZhbHVlLCBkZWxpbWl0ZXJzKSkge1xyXG4gICAgICAgICAgICAgICAganNvbk9ialtrZXldID0gY29tcGlsZVN0cih2YWx1ZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcGFyc2VJMThuSnNvbih2YWx1ZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBqc29uT2JqO1xyXG59XHJcbmZ1bmN0aW9uIGNvbXBpbGVJMThuSnNvblN0cihqc29uU3RyLCB7IGxvY2FsZSwgbG9jYWxlcywgZGVsaW1pdGVycywgfSkge1xyXG4gICAgaWYgKCFpc0kxOG5TdHIoanNvblN0ciwgZGVsaW1pdGVycykpIHtcclxuICAgICAgICByZXR1cm4ganNvblN0cjtcclxuICAgIH1cclxuICAgIGlmICghZm9ybWF0ZXIpIHtcclxuICAgICAgICBmb3JtYXRlciA9IG5ldyBCYXNlRm9ybWF0dGVyKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2NhbGVWYWx1ZXMgPSBbXTtcclxuICAgIE9iamVjdC5rZXlzKGxvY2FsZXMpLmZvckVhY2goKG5hbWUpID0+IHtcclxuICAgICAgICBpZiAobmFtZSAhPT0gbG9jYWxlKSB7XHJcbiAgICAgICAgICAgIGxvY2FsZVZhbHVlcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGxvY2FsZTogbmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogbG9jYWxlc1tuYW1lXSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBsb2NhbGVWYWx1ZXMudW5zaGlmdCh7IGxvY2FsZSwgdmFsdWVzOiBsb2NhbGVzW2xvY2FsZV0gfSk7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShjb21waWxlSnNvbk9iaihKU09OLnBhcnNlKGpzb25TdHIpLCBsb2NhbGVWYWx1ZXMsIGRlbGltaXRlcnMpLCBudWxsLCAyKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlKSB7IH1cclxuICAgIHJldHVybiBqc29uU3RyO1xyXG59XHJcbmZ1bmN0aW9uIGlzSTE4blN0cih2YWx1ZSwgZGVsaW1pdGVycykge1xyXG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YoZGVsaW1pdGVyc1swXSkgPiAtMTtcclxufVxyXG5mdW5jdGlvbiBjb21waWxlU3RyKHZhbHVlLCB2YWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgIHJldHVybiBmb3JtYXRlci5pbnRlcnBvbGF0ZSh2YWx1ZSwgdmFsdWVzLCBkZWxpbWl0ZXJzKS5qb2luKCcnKTtcclxufVxyXG5mdW5jdGlvbiBjb21waWxlVmFsdWUoanNvbk9iaiwga2V5LCBsb2NhbGVWYWx1ZXMsIGRlbGltaXRlcnMpIHtcclxuICAgIGNvbnN0IHZhbHVlID0ganNvbk9ialtrZXldO1xyXG4gICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xyXG4gICAgICAgIC8vIOWtmOWcqOWbvemZheWMllxyXG4gICAgICAgIGlmIChpc0kxOG5TdHIodmFsdWUsIGRlbGltaXRlcnMpKSB7XHJcbiAgICAgICAgICAgIGpzb25PYmpba2V5XSA9IGNvbXBpbGVTdHIodmFsdWUsIGxvY2FsZVZhbHVlc1swXS52YWx1ZXMsIGRlbGltaXRlcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYWxlVmFsdWVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICAgIC8vIOagvOW8j+WMluWbvemZheWMluivreiogFxyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVMb2NhbGVzID0gKGpzb25PYmpba2V5ICsgJ0xvY2FsZXMnXSA9IHt9KTtcclxuICAgICAgICAgICAgICAgIGxvY2FsZVZhbHVlcy5mb3JFYWNoKChsb2NhbFZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVMb2NhbGVzW2xvY2FsVmFsdWUubG9jYWxlXSA9IGNvbXBpbGVTdHIodmFsdWUsIGxvY2FsVmFsdWUudmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY29tcGlsZUpzb25PYmoodmFsdWUsIGxvY2FsZVZhbHVlcywgZGVsaW1pdGVycyk7XHJcbiAgICB9XHJcbn1cclxuZnVuY3Rpb24gY29tcGlsZUpzb25PYmooanNvbk9iaiwgbG9jYWxlVmFsdWVzLCBkZWxpbWl0ZXJzKSB7XHJcbiAgICB3YWxrSnNvbk9iaihqc29uT2JqLCAoanNvbk9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgY29tcGlsZVZhbHVlKGpzb25PYmosIGtleSwgbG9jYWxlVmFsdWVzLCBkZWxpbWl0ZXJzKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGpzb25PYmo7XHJcbn1cclxuZnVuY3Rpb24gd2Fsa0pzb25PYmooanNvbk9iaiwgd2Fsaykge1xyXG4gICAgaWYgKGlzQXJyYXkoanNvbk9iaikpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGpzb25PYmoubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHdhbGsoanNvbk9iaiwgaSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoaXNPYmplY3QoanNvbk9iaikpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uT2JqKSB7XHJcbiAgICAgICAgICAgIGlmICh3YWxrKGpzb25PYmosIGtleSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZXNvbHZlTG9jYWxlKGxvY2FsZXMpIHtcclxuICAgIHJldHVybiAobG9jYWxlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFsb2NhbGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9jYWxlID0gbm9ybWFsaXplTG9jYWxlKGxvY2FsZSkgfHwgbG9jYWxlO1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlTG9jYWxlQ2hhaW4obG9jYWxlKS5maW5kKChsb2NhbGUpID0+IGxvY2FsZXMuaW5kZXhPZihsb2NhbGUpID4gLTEpO1xyXG4gICAgfTtcclxufVxyXG5mdW5jdGlvbiByZXNvbHZlTG9jYWxlQ2hhaW4obG9jYWxlKSB7XHJcbiAgICBjb25zdCBjaGFpbiA9IFtdO1xyXG4gICAgY29uc3QgdG9rZW5zID0gbG9jYWxlLnNwbGl0KCctJyk7XHJcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCkge1xyXG4gICAgICAgIGNoYWluLnB1c2godG9rZW5zLmpvaW4oJy0nKSk7XHJcbiAgICAgICAgdG9rZW5zLnBvcCgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNoYWluO1xyXG59XHJcblxyXG5leHBvcnQgeyBCYXNlRm9ybWF0dGVyIGFzIEZvcm1hdHRlciwgSTE4biwgTE9DQUxFX0VOLCBMT0NBTEVfRVMsIExPQ0FMRV9GUiwgTE9DQUxFX1pIX0hBTlMsIExPQ0FMRV9aSF9IQU5ULCBjb21waWxlSTE4bkpzb25TdHIsIGhhc0kxOG5Kc29uLCBpbml0VnVlSTE4biwgaXNJMThuU3RyLCBpc1N0cmluZywgbm9ybWFsaXplTG9jYWxlLCBwYXJzZUkxOG5Kc29uLCByZXNvbHZlTG9jYWxlIH07XHJcbiIsIi8qIVxuICogVnVlLmpzIHYyLjYuMTFcbiAqIChjKSAyMDE0LTIwMjIgRXZhbiBZb3VcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuLyogICovXG5cbnZhciBlbXB0eU9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG4vLyBUaGVzZSBoZWxwZXJzIHByb2R1Y2UgYmV0dGVyIFZNIGNvZGUgaW4gSlMgZW5naW5lcyBkdWUgdG8gdGhlaXJcbi8vIGV4cGxpY2l0bmVzcyBhbmQgZnVuY3Rpb24gaW5saW5pbmcuXG5mdW5jdGlvbiBpc1VuZGVmICh2KSB7XG4gIHJldHVybiB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gbnVsbFxufVxuXG5mdW5jdGlvbiBpc0RlZiAodikge1xuICByZXR1cm4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNUcnVlICh2KSB7XG4gIHJldHVybiB2ID09PSB0cnVlXG59XG5cbmZ1bmN0aW9uIGlzRmFsc2UgKHYpIHtcbiAgcmV0dXJuIHYgPT09IGZhbHNlXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdmFsdWUgaXMgcHJpbWl0aXZlLlxuICovXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcgfHxcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJ1xuICApXG59XG5cbi8qKlxuICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsXG4gKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlXG4gKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0J1xufVxuXG4vKipcbiAqIEdldCB0aGUgcmF3IHR5cGUgc3RyaW5nIG9mIGEgdmFsdWUsIGUuZy4sIFtvYmplY3QgT2JqZWN0XS5cbiAqL1xudmFyIF90b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbmZ1bmN0aW9uIHRvUmF3VHlwZSAodmFsdWUpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSlcbn1cblxuLyoqXG4gKiBTdHJpY3Qgb2JqZWN0IHR5cGUgY2hlY2suIE9ubHkgcmV0dXJucyB0cnVlXG4gKiBmb3IgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0IChvYmopIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nXG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwICh2KSB7XG4gIHJldHVybiBfdG9TdHJpbmcuY2FsbCh2KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSdcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWwgaXMgYSB2YWxpZCBhcnJheSBpbmRleC5cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZEFycmF5SW5kZXggKHZhbCkge1xuICB2YXIgbiA9IHBhcnNlRmxvYXQoU3RyaW5nKHZhbCkpO1xuICByZXR1cm4gbiA+PSAwICYmIE1hdGguZmxvb3IobikgPT09IG4gJiYgaXNGaW5pdGUodmFsKVxufVxuXG5mdW5jdGlvbiBpc1Byb21pc2UgKHZhbCkge1xuICByZXR1cm4gKFxuICAgIGlzRGVmKHZhbCkgJiZcbiAgICB0eXBlb2YgdmFsLnRoZW4gPT09ICdmdW5jdGlvbicgJiZcbiAgICB0eXBlb2YgdmFsLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gIClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgdG8gYSBzdHJpbmcgdGhhdCBpcyBhY3R1YWxseSByZW5kZXJlZC5cbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcgKHZhbCkge1xuICByZXR1cm4gdmFsID09IG51bGxcbiAgICA/ICcnXG4gICAgOiBBcnJheS5pc0FycmF5KHZhbCkgfHwgKGlzUGxhaW5PYmplY3QodmFsKSAmJiB2YWwudG9TdHJpbmcgPT09IF90b1N0cmluZylcbiAgICAgID8gSlNPTi5zdHJpbmdpZnkodmFsLCBudWxsLCAyKVxuICAgICAgOiBTdHJpbmcodmFsKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gaW5wdXQgdmFsdWUgdG8gYSBudW1iZXIgZm9yIHBlcnNpc3RlbmNlLlxuICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyICh2YWwpIHtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG5cbn1cblxuLyoqXG4gKiBNYWtlIGEgbWFwIGFuZCByZXR1cm4gYSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYSBrZXlcbiAqIGlzIGluIHRoYXQgbWFwLlxuICovXG5mdW5jdGlvbiBtYWtlTWFwIChcbiAgc3RyLFxuICBleHBlY3RzTG93ZXJDYXNlXG4pIHtcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBsaXN0ID0gc3RyLnNwbGl0KCcsJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2VcbiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH1cbiAgICA6IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWxdOyB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB0YWcgaXMgYSBidWlsdC1pbiB0YWcuXG4gKi9cbnZhciBpc0J1aWx0SW5UYWcgPSBtYWtlTWFwKCdzbG90LGNvbXBvbmVudCcsIHRydWUpO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBpcyBhIHJlc2VydmVkIGF0dHJpYnV0ZS5cbiAqL1xudmFyIGlzUmVzZXJ2ZWRBdHRyaWJ1dGUgPSBtYWtlTWFwKCdrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpcycpO1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZSAoYXJyLCBpdGVtKSB7XG4gIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgdmFyIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHJldHVybiBhcnIuc3BsaWNlKGluZGV4LCAxKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkuXG4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBoYXNPd24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICB2YXIgaGl0ID0gY2FjaGVbc3RyXTtcbiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxpbWl0ZWQgc3RyaW5nLlxuICovXG52YXIgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykgeyByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnOyB9KVxufSk7XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBhIHN0cmluZy5cbiAqL1xudmFyIGNhcGl0YWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpXG59KTtcblxuLyoqXG4gKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLlxuICovXG52YXIgaHlwaGVuYXRlUkUgPSAvXFxCKFtBLVpdKS9nO1xudmFyIGh5cGhlbmF0ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShoeXBoZW5hdGVSRSwgJy0kMScpLnRvTG93ZXJDYXNlKClcbn0pO1xuXG4vKipcbiAqIFNpbXBsZSBiaW5kIHBvbHlmaWxsIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpdCxcbiAqIGUuZy4sIFBoYW50b21KUyAxLnguIFRlY2huaWNhbGx5LCB3ZSBkb24ndCBuZWVkIHRoaXMgYW55bW9yZVxuICogc2luY2UgbmF0aXZlIGJpbmQgaXMgbm93IHBlcmZvcm1hbnQgZW5vdWdoIGluIG1vc3QgYnJvd3NlcnMuXG4gKiBCdXQgcmVtb3ZpbmcgaXQgd291bGQgbWVhbiBicmVha2luZyBjb2RlIHRoYXQgd2FzIGFibGUgdG8gcnVuIGluXG4gKiBQaGFudG9tSlMgMS54LCBzbyB0aGlzIG11c3QgYmUga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gcG9seWZpbGxCaW5kIChmbiwgY3R4KSB7XG4gIGZ1bmN0aW9uIGJvdW5kRm4gKGEpIHtcbiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cblxuICBib3VuZEZuLl9sZW5ndGggPSBmbi5sZW5ndGg7XG4gIHJldHVybiBib3VuZEZuXG59XG5cbmZ1bmN0aW9uIG5hdGl2ZUJpbmQgKGZuLCBjdHgpIHtcbiAgcmV0dXJuIGZuLmJpbmQoY3R4KVxufVxuXG52YXIgYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG4gID8gbmF0aXZlQmluZFxuICA6IHBvbHlmaWxsQmluZDtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS5cbiAqL1xuZnVuY3Rpb24gdG9BcnJheSAobGlzdCwgc3RhcnQpIHtcbiAgc3RhcnQgPSBzdGFydCB8fCAwO1xuICB2YXIgaSA9IGxpc3QubGVuZ3RoIC0gc3RhcnQ7XG4gIHZhciByZXQgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0pIHtcbiAgICByZXRbaV0gPSBsaXN0W2kgKyBzdGFydF07XG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG4vKipcbiAqIE1peCBwcm9wZXJ0aWVzIGludG8gdGFyZ2V0IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZXh0ZW5kICh0bywgX2Zyb20pIHtcbiAgZm9yICh2YXIga2V5IGluIF9mcm9tKSB7XG4gICAgdG9ba2V5XSA9IF9mcm9tW2tleV07XG4gIH1cbiAgcmV0dXJuIHRvXG59XG5cbi8qKlxuICogTWVyZ2UgYW4gQXJyYXkgb2YgT2JqZWN0cyBpbnRvIGEgc2luZ2xlIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gdG9PYmplY3QgKGFycikge1xuICB2YXIgcmVzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGFycltpXSkge1xuICAgICAgZXh0ZW5kKHJlcywgYXJyW2ldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4vKipcbiAqIFBlcmZvcm0gbm8gb3BlcmF0aW9uLlxuICogU3R1YmJpbmcgYXJncyB0byBtYWtlIEZsb3cgaGFwcHkgd2l0aG91dCBsZWF2aW5nIHVzZWxlc3MgdHJhbnNwaWxlZCBjb2RlXG4gKiB3aXRoIC4uLnJlc3QgKGh0dHBzOi8vZmxvdy5vcmcvYmxvZy8yMDE3LzA1LzA3L1N0cmljdC1GdW5jdGlvbi1DYWxsLUFyaXR5LykuXG4gKi9cbmZ1bmN0aW9uIG5vb3AgKGEsIGIsIGMpIHt9XG5cbi8qKlxuICogQWx3YXlzIHJldHVybiBmYWxzZS5cbiAqL1xudmFyIG5vID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsgcmV0dXJuIGZhbHNlOyB9O1xuXG4vKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC12YXJzICovXG5cbi8qKlxuICogUmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuICovXG52YXIgaWRlbnRpdHkgPSBmdW5jdGlvbiAoXykgeyByZXR1cm4gXzsgfTtcblxuLyoqXG4gKiBDaGVjayBpZiB0d28gdmFsdWVzIGFyZSBsb29zZWx5IGVxdWFsIC0gdGhhdCBpcyxcbiAqIGlmIHRoZXkgYXJlIHBsYWluIG9iamVjdHMsIGRvIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaGFwZT9cbiAqL1xuZnVuY3Rpb24gbG9vc2VFcXVhbCAoYSwgYikge1xuICBpZiAoYSA9PT0gYikgeyByZXR1cm4gdHJ1ZSB9XG4gIHZhciBpc09iamVjdEEgPSBpc09iamVjdChhKTtcbiAgdmFyIGlzT2JqZWN0QiA9IGlzT2JqZWN0KGIpO1xuICBpZiAoaXNPYmplY3RBICYmIGlzT2JqZWN0Qikge1xuICAgIHRyeSB7XG4gICAgICB2YXIgaXNBcnJheUEgPSBBcnJheS5pc0FycmF5KGEpO1xuICAgICAgdmFyIGlzQXJyYXlCID0gQXJyYXkuaXNBcnJheShiKTtcbiAgICAgIGlmIChpc0FycmF5QSAmJiBpc0FycmF5Qikge1xuICAgICAgICByZXR1cm4gYS5sZW5ndGggPT09IGIubGVuZ3RoICYmIGEuZXZlcnkoZnVuY3Rpb24gKGUsIGkpIHtcbiAgICAgICAgICByZXR1cm4gbG9vc2VFcXVhbChlLCBiW2ldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgRGF0ZSAmJiBiIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpXG4gICAgICB9IGVsc2UgaWYgKCFpc0FycmF5QSAmJiAhaXNBcnJheUIpIHtcbiAgICAgICAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMoYSk7XG4gICAgICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKGIpO1xuICAgICAgICByZXR1cm4ga2V5c0EubGVuZ3RoID09PSBrZXlzQi5sZW5ndGggJiYga2V5c0EuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiBsb29zZUVxdWFsKGFba2V5XSwgYltrZXldKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfSBlbHNlIGlmICghaXNPYmplY3RBICYmICFpc09iamVjdEIpIHtcbiAgICByZXR1cm4gU3RyaW5nKGEpID09PSBTdHJpbmcoYilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggYSBsb29zZWx5IGVxdWFsIHZhbHVlIGNhbiBiZVxuICogZm91bmQgaW4gdGhlIGFycmF5IChpZiB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdCwgdGhlIGFycmF5IG11c3RcbiAqIGNvbnRhaW4gYW4gb2JqZWN0IG9mIHRoZSBzYW1lIHNoYXBlKSwgb3IgLTEgaWYgaXQgaXMgbm90IHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobG9vc2VFcXVhbChhcnJbaV0sIHZhbCkpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIEVuc3VyZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UuXG4gKi9cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBBU1NFVF9UWVBFUyA9IFtcbiAgJ2NvbXBvbmVudCcsXG4gICdkaXJlY3RpdmUnLFxuICAnZmlsdGVyJ1xuXTtcblxudmFyIExJRkVDWUNMRV9IT09LUyA9IFtcbiAgJ2JlZm9yZUNyZWF0ZScsXG4gICdjcmVhdGVkJyxcbiAgJ2JlZm9yZU1vdW50JyxcbiAgJ21vdW50ZWQnLFxuICAnYmVmb3JlVXBkYXRlJyxcbiAgJ3VwZGF0ZWQnLFxuICAnYmVmb3JlRGVzdHJveScsXG4gICdkZXN0cm95ZWQnLFxuICAnYWN0aXZhdGVkJyxcbiAgJ2RlYWN0aXZhdGVkJyxcbiAgJ2Vycm9yQ2FwdHVyZWQnLFxuICAnc2VydmVyUHJlZmV0Y2gnXG5dO1xuXG4vKiAgKi9cblxuXG5cbnZhciBjb25maWcgPSAoe1xuICAvKipcbiAgICogT3B0aW9uIG1lcmdlIHN0cmF0ZWdpZXMgKHVzZWQgaW4gY29yZS91dGlsL29wdGlvbnMpXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAgb3B0aW9uTWVyZ2VTdHJhdGVnaWVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN1cHByZXNzIHdhcm5pbmdzLlxuICAgKi9cbiAgc2lsZW50OiBmYWxzZSxcblxuICAvKipcbiAgICogU2hvdyBwcm9kdWN0aW9uIG1vZGUgdGlwIG1lc3NhZ2Ugb24gYm9vdD9cbiAgICovXG4gIHByb2R1Y3Rpb25UaXA6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGRldnRvb2xzXG4gICAqL1xuICBkZXZ0b29sczogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byByZWNvcmQgcGVyZlxuICAgKi9cbiAgcGVyZm9ybWFuY2U6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBFcnJvciBoYW5kbGVyIGZvciB3YXRjaGVyIGVycm9yc1xuICAgKi9cbiAgZXJyb3JIYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBXYXJuIGhhbmRsZXIgZm9yIHdhdGNoZXIgd2FybnNcbiAgICovXG4gIHdhcm5IYW5kbGVyOiBudWxsLFxuXG4gIC8qKlxuICAgKiBJZ25vcmUgY2VydGFpbiBjdXN0b20gZWxlbWVudHNcbiAgICovXG4gIGlnbm9yZWRFbGVtZW50czogW10sXG5cbiAgLyoqXG4gICAqIEN1c3RvbSB1c2VyIGtleSBhbGlhc2VzIGZvciB2LW9uXG4gICAqL1xuICAvLyAkZmxvdy1kaXNhYmxlLWxpbmVcbiAga2V5Q29kZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGFnIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXMgYVxuICAgKiBjb21wb25lbnQuIFRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50IGFuZCBtYXkgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBpc1Jlc2VydmVkVGFnOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIGlzIHJlc2VydmVkIHNvIHRoYXQgaXQgY2Fubm90IGJlIHVzZWQgYXMgYSBjb21wb25lbnRcbiAgICogcHJvcC4gVGhpcyBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW5kIG1heSBiZSBvdmVyd3JpdHRlbi5cbiAgICovXG4gIGlzUmVzZXJ2ZWRBdHRyOiBubyxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0YWcgaXMgYW4gdW5rbm93biBlbGVtZW50LlxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBpc1Vua25vd25FbGVtZW50OiBubyxcblxuICAvKipcbiAgICogR2V0IHRoZSBuYW1lc3BhY2Ugb2YgYW4gZWxlbWVudFxuICAgKi9cbiAgZ2V0VGFnTmFtZXNwYWNlOiBub29wLFxuXG4gIC8qKlxuICAgKiBQYXJzZSB0aGUgcmVhbCB0YWcgbmFtZSBmb3IgdGhlIHNwZWNpZmljIHBsYXRmb3JtLlxuICAgKi9cbiAgcGFyc2VQbGF0Zm9ybVRhZ05hbWU6IGlkZW50aXR5LFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbXVzdCBiZSBib3VuZCB1c2luZyBwcm9wZXJ0eSwgZS5nLiB2YWx1ZVxuICAgKiBQbGF0Zm9ybS1kZXBlbmRlbnQuXG4gICAqL1xuICBtdXN0VXNlUHJvcDogbm8sXG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdXBkYXRlcyBhc3luY2hyb25vdXNseS4gSW50ZW5kZWQgdG8gYmUgdXNlZCBieSBWdWUgVGVzdCBVdGlsc1xuICAgKiBUaGlzIHdpbGwgc2lnbmlmaWNhbnRseSByZWR1Y2UgcGVyZm9ybWFuY2UgaWYgc2V0IHRvIGZhbHNlLlxuICAgKi9cbiAgYXN5bmM6IHRydWUsXG5cbiAgLyoqXG4gICAqIEV4cG9zZWQgZm9yIGxlZ2FjeSByZWFzb25zXG4gICAqL1xuICBfbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LU1xufSk7XG5cbi8qICAqL1xuXG4vKipcbiAqIHVuaWNvZGUgbGV0dGVycyB1c2VkIGZvciBwYXJzaW5nIGh0bWwgdGFncywgY29tcG9uZW50IG5hbWVzIGFuZCBwcm9wZXJ0eSBwYXRocy5cbiAqIHVzaW5nIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTMvc2VtYW50aWNzLXNjcmlwdGluZy5odG1sI3BvdGVudGlhbGN1c3RvbWVsZW1lbnRuYW1lXG4gKiBza2lwcGluZyBcXHUxMDAwMC1cXHVFRkZGRiBkdWUgdG8gaXQgZnJlZXppbmcgdXAgUGhhbnRvbUpTXG4gKi9cbnZhciB1bmljb2RlUmVnRXhwID0gL2EtekEtWlxcdTAwQjdcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDNGLVxcdTIwNDBcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQvO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICQgb3IgX1xuICovXG5mdW5jdGlvbiBpc1Jlc2VydmVkIChzdHIpIHtcbiAgdmFyIGMgPSAoc3RyICsgJycpLmNoYXJDb2RlQXQoMCk7XG4gIHJldHVybiBjID09PSAweDI0IHx8IGMgPT09IDB4NUZcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gZGVmIChvYmosIGtleSwgdmFsLCBlbnVtZXJhYmxlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIHZhbHVlOiB2YWwsXG4gICAgZW51bWVyYWJsZTogISFlbnVtZXJhYmxlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBzaW1wbGUgcGF0aC5cbiAqL1xudmFyIGJhaWxSRSA9IG5ldyBSZWdFeHAoKFwiW15cIiArICh1bmljb2RlUmVnRXhwLnNvdXJjZSkgKyBcIi4kX1xcXFxkXVwiKSk7XG5mdW5jdGlvbiBwYXJzZVBhdGggKHBhdGgpIHtcbiAgaWYgKGJhaWxSRS50ZXN0KHBhdGgpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgdmFyIHNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLicpO1xuICByZXR1cm4gZnVuY3Rpb24gKG9iaikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghb2JqKSB7IHJldHVybiB9XG4gICAgICBvYmogPSBvYmpbc2VnbWVudHNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gb2JqXG4gIH1cbn1cblxuLyogICovXG5cbi8vIGNhbiB3ZSB1c2UgX19wcm90b19fP1xudmFyIGhhc1Byb3RvID0gJ19fcHJvdG9fXycgaW4ge307XG5cbi8vIEJyb3dzZXIgZW52aXJvbm1lbnQgc25pZmZpbmdcbnZhciBpbkJyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcbnZhciBpbldlZXggPSB0eXBlb2YgV1hFbnZpcm9ubWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgISFXWEVudmlyb25tZW50LnBsYXRmb3JtO1xudmFyIHdlZXhQbGF0Zm9ybSA9IGluV2VleCAmJiBXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCk7XG52YXIgVUEgPSBpbkJyb3dzZXIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbnZhciBpc0lFID0gVUEgJiYgL21zaWV8dHJpZGVudC8udGVzdChVQSk7XG52YXIgaXNJRTkgPSBVQSAmJiBVQS5pbmRleE9mKCdtc2llIDkuMCcpID4gMDtcbnZhciBpc0VkZ2UgPSBVQSAmJiBVQS5pbmRleE9mKCdlZGdlLycpID4gMDtcbnZhciBpc0FuZHJvaWQgPSAoVUEgJiYgVUEuaW5kZXhPZignYW5kcm9pZCcpID4gMCkgfHwgKHdlZXhQbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKTtcbnZhciBpc0lPUyA9IChVQSAmJiAvaXBob25lfGlwYWR8aXBvZHxpb3MvLnRlc3QoVUEpKSB8fCAod2VleFBsYXRmb3JtID09PSAnaW9zJyk7XG52YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXFwvXFxkKy8udGVzdChVQSkgJiYgIWlzRWRnZTtcbnZhciBpc1BoYW50b21KUyA9IFVBICYmIC9waGFudG9tanMvLnRlc3QoVUEpO1xudmFyIGlzRkYgPSBVQSAmJiBVQS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pO1xuXG4vLyBGaXJlZm94IGhhcyBhIFwid2F0Y2hcIiBmdW5jdGlvbiBvbiBPYmplY3QucHJvdG90eXBlLi4uXG52YXIgbmF0aXZlV2F0Y2ggPSAoe30pLndhdGNoO1xuaWYgKGluQnJvd3Nlcikge1xuICB0cnkge1xuICAgIHZhciBvcHRzID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdHMsICdwYXNzaXZlJywgKHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAgIH1cbiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODVcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdC1wYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbi8vIHRoaXMgbmVlZHMgdG8gYmUgbGF6eS1ldmFsZWQgYmVjYXVzZSB2dWUgbWF5IGJlIHJlcXVpcmVkIGJlZm9yZVxuLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlZcbnZhciBfaXNTZXJ2ZXI7XG52YXIgaXNTZXJ2ZXJSZW5kZXJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghaW5Ccm93c2VyICYmICFpbldlZXggJiYgdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGRldGVjdCBwcmVzZW5jZSBvZiB2dWUtc2VydmVyLXJlbmRlcmVyIGFuZCBhdm9pZFxuICAgICAgLy8gV2VicGFjayBzaGltbWluZyB0aGUgcHJvY2Vzc1xuICAgICAgX2lzU2VydmVyID0gZ2xvYmFsWydwcm9jZXNzJ10gJiYgZ2xvYmFsWydwcm9jZXNzJ10uZW52LlZVRV9FTlYgPT09ICdzZXJ2ZXInO1xuICAgIH0gZWxzZSB7XG4gICAgICBfaXNTZXJ2ZXIgPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9pc1NlcnZlclxufTtcblxuLy8gZGV0ZWN0IGRldnRvb2xzXG52YXIgZGV2dG9vbHMgPSBpbkJyb3dzZXIgJiYgd2luZG93Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX187XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBpc05hdGl2ZSAoQ3Rvcikge1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KEN0b3IudG9TdHJpbmcoKSlcbn1cblxudmFyIGhhc1N5bWJvbCA9XG4gIHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFN5bWJvbCkgJiZcbiAgdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFJlZmxlY3Qub3duS2V5cyk7XG5cbnZhciBfU2V0O1xuLyogaXN0YW5idWwgaWdub3JlIGlmICovIC8vICRmbG93LWRpc2FibGUtbGluZVxuaWYgKHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnICYmIGlzTmF0aXZlKFNldCkpIHtcbiAgLy8gdXNlIG5hdGl2ZSBTZXQgd2hlbiBhdmFpbGFibGUuXG4gIF9TZXQgPSBTZXQ7XG59IGVsc2Uge1xuICAvLyBhIG5vbi1zdGFuZGFyZCBTZXQgcG9seWZpbGwgdGhhdCBvbmx5IHdvcmtzIHdpdGggcHJpbWl0aXZlIGtleXMuXG4gIF9TZXQgPSAvKkBfX1BVUkVfXyovKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXQgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRba2V5XSA9PT0gdHJ1ZVxuICAgIH07XG4gICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGtleSkge1xuICAgICAgdGhpcy5zZXRba2V5XSA9IHRydWU7XG4gICAgfTtcbiAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2V0O1xuICB9KCkpO1xufVxuXG4vKiAgKi9cblxudmFyIHdhcm4gPSBub29wO1xudmFyIHRpcCA9IG5vb3A7XG52YXIgZ2VuZXJhdGVDb21wb25lbnRUcmFjZSA9IChub29wKTsgLy8gd29yayBhcm91bmQgZmxvdyBjaGVja1xudmFyIGZvcm1hdENvbXBvbmVudE5hbWUgPSAobm9vcCk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBoYXNDb25zb2xlID0gdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnO1xuICB2YXIgY2xhc3NpZnlSRSA9IC8oPzpefFstX10pKFxcdykvZztcbiAgdmFyIGNsYXNzaWZ5ID0gZnVuY3Rpb24gKHN0cikgeyByZXR1cm4gc3RyXG4gICAgLnJlcGxhY2UoY2xhc3NpZnlSRSwgZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMudG9VcHBlckNhc2UoKTsgfSlcbiAgICAucmVwbGFjZSgvWy1fXS9nLCAnJyk7IH07XG5cbiAgd2FybiA9IGZ1bmN0aW9uIChtc2csIHZtKSB7XG4gICAgdmFyIHRyYWNlID0gdm0gPyBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlKHZtKSA6ICcnO1xuXG4gICAgaWYgKGNvbmZpZy53YXJuSGFuZGxlcikge1xuICAgICAgY29uZmlnLndhcm5IYW5kbGVyLmNhbGwobnVsbCwgbXNnLCB2bSwgdHJhY2UpO1xuICAgIH0gZWxzZSBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIltWdWUgd2Fybl06IFwiICsgbXNnICsgdHJhY2UpKTtcbiAgICB9XG4gIH07XG5cbiAgdGlwID0gZnVuY3Rpb24gKG1zZywgdm0pIHtcbiAgICBpZiAoaGFzQ29uc29sZSAmJiAoIWNvbmZpZy5zaWxlbnQpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbVnVlIHRpcF06IFwiICsgbXNnICsgKFxuICAgICAgICB2bSA/IGdlbmVyYXRlQ29tcG9uZW50VHJhY2Uodm0pIDogJydcbiAgICAgICkpO1xuICAgIH1cbiAgfTtcblxuICBmb3JtYXRDb21wb25lbnROYW1lID0gZnVuY3Rpb24gKHZtLCBpbmNsdWRlRmlsZSkge1xuICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHtcbiAgICAgIGlmICh2bS4kb3B0aW9ucyAmJiB2bS4kb3B0aW9ucy5fX2ZpbGUpIHsgLy8gZml4ZWQgYnkgeHh4eHh4XG4gICAgICAgIHJldHVybiAoJycpICsgdm0uJG9wdGlvbnMuX19maWxlXG4gICAgICB9XG4gICAgICByZXR1cm4gJzxSb290PidcbiAgICB9XG4gICAgdmFyIG9wdGlvbnMgPSB0eXBlb2Ygdm0gPT09ICdmdW5jdGlvbicgJiYgdm0uY2lkICE9IG51bGxcbiAgICAgID8gdm0ub3B0aW9uc1xuICAgICAgOiB2bS5faXNWdWVcbiAgICAgICAgPyB2bS4kb3B0aW9ucyB8fCB2bS5jb25zdHJ1Y3Rvci5vcHRpb25zXG4gICAgICAgIDogdm07XG4gICAgdmFyIG5hbWUgPSBvcHRpb25zLm5hbWUgfHwgb3B0aW9ucy5fY29tcG9uZW50VGFnO1xuICAgIHZhciBmaWxlID0gb3B0aW9ucy5fX2ZpbGU7XG4gICAgaWYgKCFuYW1lICYmIGZpbGUpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwudnVlJC8pO1xuICAgICAgbmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAobmFtZSA/IChcIjxcIiArIChjbGFzc2lmeShuYW1lKSkgKyBcIj5cIikgOiBcIjxBbm9ueW1vdXM+XCIpICtcbiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/IChcIiBhdCBcIiArIGZpbGUpIDogJycpXG4gICAgKVxuICB9O1xuXG4gIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHdoaWxlIChuKSB7XG4gICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfVxuICAgICAgaWYgKG4gPiAxKSB7IHN0ciArPSBzdHI7IH1cbiAgICAgIG4gPj49IDE7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfTtcblxuICBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlID0gZnVuY3Rpb24gKHZtKSB7XG4gICAgaWYgKHZtLl9pc1Z1ZSAmJiB2bS4kcGFyZW50KSB7XG4gICAgICB2YXIgdHJlZSA9IFtdO1xuICAgICAgdmFyIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA9IDA7XG4gICAgICB3aGlsZSAodm0gJiYgdm0uJG9wdGlvbnMubmFtZSAhPT0gJ1BhZ2VCb2R5Jykge1xuICAgICAgICBpZiAodHJlZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdmFyIGxhc3QgPSB0cmVlW3RyZWUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKGxhc3QuY29uc3RydWN0b3IgPT09IHZtLmNvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgICBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UrKztcbiAgICAgICAgICAgIHZtID0gdm0uJHBhcmVudDtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPiAwKSB7XG4gICAgICAgICAgICB0cmVlW3RyZWUubGVuZ3RoIC0gMV0gPSBbbGFzdCwgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlXTtcbiAgICAgICAgICAgIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICF2bS4kb3B0aW9ucy5pc1Jlc2VydmVkICYmIHRyZWUucHVzaCh2bSk7XG4gICAgICAgIHZtID0gdm0uJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAnXFxuXFxuZm91bmQgaW5cXG5cXG4nICsgdHJlZVxuICAgICAgICAubWFwKGZ1bmN0aW9uICh2bSwgaSkgeyByZXR1cm4gKFwiXCIgKyAoaSA9PT0gMCA/ICctLS0+ICcgOiByZXBlYXQoJyAnLCA1ICsgaSAqIDIpKSArIChBcnJheS5pc0FycmF5KHZtKVxuICAgICAgICAgICAgPyAoKGZvcm1hdENvbXBvbmVudE5hbWUodm1bMF0pKSArIFwiLi4uIChcIiArICh2bVsxXSkgKyBcIiByZWN1cnNpdmUgY2FsbHMpXCIpXG4gICAgICAgICAgICA6IGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSk7IH0pXG4gICAgICAgIC5qb2luKCdcXG4nKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFwiXFxuXFxuKGZvdW5kIGluIFwiICsgKGZvcm1hdENvbXBvbmVudE5hbWUodm0pKSArIFwiKVwiKVxuICAgIH1cbiAgfTtcbn1cblxuLyogICovXG5cbnZhciB1aWQgPSAwO1xuXG4vKipcbiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICogZGlyZWN0aXZlcyBzdWJzY3JpYmluZyB0byBpdC5cbiAqL1xudmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7XG4gIHRoaXMuaWQgPSB1aWQrKztcbiAgdGhpcy5zdWJzID0gW107XG59O1xuXG5EZXAucHJvdG90eXBlLmFkZFN1YiA9IGZ1bmN0aW9uIGFkZFN1YiAoc3ViKSB7XG4gIHRoaXMuc3Vicy5wdXNoKHN1Yik7XG59O1xuXG5EZXAucHJvdG90eXBlLnJlbW92ZVN1YiA9IGZ1bmN0aW9uIHJlbW92ZVN1YiAoc3ViKSB7XG4gIHJlbW92ZSh0aGlzLnN1YnMsIHN1Yik7XG59O1xuXG5EZXAucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uIGRlcGVuZCAoKSB7XG4gIGlmIChEZXAuU2hhcmVkT2JqZWN0LnRhcmdldCkge1xuICAgIERlcC5TaGFyZWRPYmplY3QudGFyZ2V0LmFkZERlcCh0aGlzKTtcbiAgfVxufTtcblxuRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkge1xuICAvLyBzdGFiaWxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICB2YXIgc3VicyA9IHRoaXMuc3Vicy5zbGljZSgpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhY29uZmlnLmFzeW5jKSB7XG4gICAgLy8gc3VicyBhcmVuJ3Qgc29ydGVkIGluIHNjaGVkdWxlciBpZiBub3QgcnVubmluZyBhc3luY1xuICAgIC8vIHdlIG5lZWQgdG8gc29ydCB0aGVtIG5vdyB0byBtYWtlIHN1cmUgdGhleSBmaXJlIGluIGNvcnJlY3RcbiAgICAvLyBvcmRlclxuICAgIHN1YnMuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5pZCAtIGIuaWQ7IH0pO1xuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsID0gc3Vicy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBzdWJzW2ldLnVwZGF0ZSgpO1xuICB9XG59O1xuXG4vLyBUaGUgY3VycmVudCB0YXJnZXQgd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQuXG4vLyBUaGlzIGlzIGdsb2JhbGx5IHVuaXF1ZSBiZWNhdXNlIG9ubHkgb25lIHdhdGNoZXJcbi8vIGNhbiBiZSBldmFsdWF0ZWQgYXQgYSB0aW1lLlxuLy8gZml4ZWQgYnkgeHh4eHh4IChudnVlIHNoYXJlZCB2dWV4KVxuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbkRlcC5TaGFyZWRPYmplY3QgPSB7fTtcbkRlcC5TaGFyZWRPYmplY3QudGFyZ2V0ID0gbnVsbDtcbkRlcC5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sgPSBbXTtcblxuZnVuY3Rpb24gcHVzaFRhcmdldCAodGFyZ2V0KSB7XG4gIERlcC5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2sucHVzaCh0YXJnZXQpO1xuICBEZXAuU2hhcmVkT2JqZWN0LnRhcmdldCA9IHRhcmdldDtcbiAgRGVwLnRhcmdldCA9IHRhcmdldDtcbn1cblxuZnVuY3Rpb24gcG9wVGFyZ2V0ICgpIHtcbiAgRGVwLlNoYXJlZE9iamVjdC50YXJnZXRTdGFjay5wb3AoKTtcbiAgRGVwLlNoYXJlZE9iamVjdC50YXJnZXQgPSBEZXAuU2hhcmVkT2JqZWN0LnRhcmdldFN0YWNrW0RlcC5TaGFyZWRPYmplY3QudGFyZ2V0U3RhY2subGVuZ3RoIC0gMV07XG4gIERlcC50YXJnZXQgPSBEZXAuU2hhcmVkT2JqZWN0LnRhcmdldDtcbn1cblxuLyogICovXG5cbnZhciBWTm9kZSA9IGZ1bmN0aW9uIFZOb2RlIChcbiAgdGFnLFxuICBkYXRhLFxuICBjaGlsZHJlbixcbiAgdGV4dCxcbiAgZWxtLFxuICBjb250ZXh0LFxuICBjb21wb25lbnRPcHRpb25zLFxuICBhc3luY0ZhY3Rvcnlcbikge1xuICB0aGlzLnRhZyA9IHRhZztcbiAgdGhpcy5kYXRhID0gZGF0YTtcbiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB0aGlzLnRleHQgPSB0ZXh0O1xuICB0aGlzLmVsbSA9IGVsbTtcbiAgdGhpcy5ucyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5mbkNvbnRleHQgPSB1bmRlZmluZWQ7XG4gIHRoaXMuZm5PcHRpb25zID0gdW5kZWZpbmVkO1xuICB0aGlzLmZuU2NvcGVJZCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5rZXkgPSBkYXRhICYmIGRhdGEua2V5O1xuICB0aGlzLmNvbXBvbmVudE9wdGlvbnMgPSBjb21wb25lbnRPcHRpb25zO1xuICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICB0aGlzLnBhcmVudCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5yYXcgPSBmYWxzZTtcbiAgdGhpcy5pc1N0YXRpYyA9IGZhbHNlO1xuICB0aGlzLmlzUm9vdEluc2VydCA9IHRydWU7XG4gIHRoaXMuaXNDb21tZW50ID0gZmFsc2U7XG4gIHRoaXMuaXNDbG9uZWQgPSBmYWxzZTtcbiAgdGhpcy5pc09uY2UgPSBmYWxzZTtcbiAgdGhpcy5hc3luY0ZhY3RvcnkgPSBhc3luY0ZhY3Rvcnk7XG4gIHRoaXMuYXN5bmNNZXRhID0gdW5kZWZpbmVkO1xuICB0aGlzLmlzQXN5bmNQbGFjZWhvbGRlciA9IGZhbHNlO1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgY2hpbGQ6IHsgY29uZmlndXJhYmxlOiB0cnVlIH0gfTtcblxuLy8gREVQUkVDQVRFRDogYWxpYXMgZm9yIGNvbXBvbmVudEluc3RhbmNlIGZvciBiYWNrd2FyZHMgY29tcGF0LlxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbnByb3RvdHlwZUFjY2Vzc29ycy5jaGlsZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmNvbXBvbmVudEluc3RhbmNlXG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVk5vZGUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxudmFyIGNyZWF0ZUVtcHR5Vk5vZGUgPSBmdW5jdGlvbiAodGV4dCkge1xuICBpZiAoIHRleHQgPT09IHZvaWQgMCApIHRleHQgPSAnJztcblxuICB2YXIgbm9kZSA9IG5ldyBWTm9kZSgpO1xuICBub2RlLnRleHQgPSB0ZXh0O1xuICBub2RlLmlzQ29tbWVudCA9IHRydWU7XG4gIHJldHVybiBub2RlXG59O1xuXG5mdW5jdGlvbiBjcmVhdGVUZXh0Vk5vZGUgKHZhbCkge1xuICByZXR1cm4gbmV3IFZOb2RlKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFN0cmluZyh2YWwpKVxufVxuXG4vLyBvcHRpbWl6ZWQgc2hhbGxvdyBjbG9uZVxuLy8gdXNlZCBmb3Igc3RhdGljIG5vZGVzIGFuZCBzbG90IG5vZGVzIGJlY2F1c2UgdGhleSBtYXkgYmUgcmV1c2VkIGFjcm9zc1xuLy8gbXVsdGlwbGUgcmVuZGVycywgY2xvbmluZyB0aGVtIGF2b2lkcyBlcnJvcnMgd2hlbiBET00gbWFuaXB1bGF0aW9ucyByZWx5XG4vLyBvbiB0aGVpciBlbG0gcmVmZXJlbmNlLlxuZnVuY3Rpb24gY2xvbmVWTm9kZSAodm5vZGUpIHtcbiAgdmFyIGNsb25lZCA9IG5ldyBWTm9kZShcbiAgICB2bm9kZS50YWcsXG4gICAgdm5vZGUuZGF0YSxcbiAgICAvLyAjNzk3NVxuICAgIC8vIGNsb25lIGNoaWxkcmVuIGFycmF5IHRvIGF2b2lkIG11dGF0aW5nIG9yaWdpbmFsIGluIGNhc2Ugb2YgY2xvbmluZ1xuICAgIC8vIGEgY2hpbGQuXG4gICAgdm5vZGUuY2hpbGRyZW4gJiYgdm5vZGUuY2hpbGRyZW4uc2xpY2UoKSxcbiAgICB2bm9kZS50ZXh0LFxuICAgIHZub2RlLmVsbSxcbiAgICB2bm9kZS5jb250ZXh0LFxuICAgIHZub2RlLmNvbXBvbmVudE9wdGlvbnMsXG4gICAgdm5vZGUuYXN5bmNGYWN0b3J5XG4gICk7XG4gIGNsb25lZC5ucyA9IHZub2RlLm5zO1xuICBjbG9uZWQuaXNTdGF0aWMgPSB2bm9kZS5pc1N0YXRpYztcbiAgY2xvbmVkLmtleSA9IHZub2RlLmtleTtcbiAgY2xvbmVkLmlzQ29tbWVudCA9IHZub2RlLmlzQ29tbWVudDtcbiAgY2xvbmVkLmZuQ29udGV4dCA9IHZub2RlLmZuQ29udGV4dDtcbiAgY2xvbmVkLmZuT3B0aW9ucyA9IHZub2RlLmZuT3B0aW9ucztcbiAgY2xvbmVkLmZuU2NvcGVJZCA9IHZub2RlLmZuU2NvcGVJZDtcbiAgY2xvbmVkLmFzeW5jTWV0YSA9IHZub2RlLmFzeW5jTWV0YTtcbiAgY2xvbmVkLmlzQ2xvbmVkID0gdHJ1ZTtcbiAgcmV0dXJuIGNsb25lZFxufVxuXG4vKlxuICogbm90IHR5cGUgY2hlY2tpbmcgdGhpcyBmaWxlIGJlY2F1c2UgZmxvdyBkb2Vzbid0IHBsYXkgd2VsbCB3aXRoXG4gKiBkeW5hbWljYWxseSBhY2Nlc3NpbmcgbWV0aG9kcyBvbiBBcnJheSBwcm90b3R5cGVcbiAqL1xuXG52YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcbnZhciBhcnJheU1ldGhvZHMgPSBPYmplY3QuY3JlYXRlKGFycmF5UHJvdG8pO1xuXG52YXIgbWV0aG9kc1RvUGF0Y2ggPSBbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnXG5dO1xuXG4vKipcbiAqIEludGVyY2VwdCBtdXRhdGluZyBtZXRob2RzIGFuZCBlbWl0IGV2ZW50c1xuICovXG5tZXRob2RzVG9QYXRjaC5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgLy8gY2FjaGUgb3JpZ2luYWwgbWV0aG9kXG4gIHZhciBvcmlnaW5hbCA9IGFycmF5UHJvdG9bbWV0aG9kXTtcbiAgZGVmKGFycmF5TWV0aG9kcywgbWV0aG9kLCBmdW5jdGlvbiBtdXRhdG9yICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICB2YXIgcmVzdWx0ID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncyk7XG4gICAgdmFyIG9iID0gdGhpcy5fX29iX187XG4gICAgdmFyIGluc2VydGVkO1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdwdXNoJzpcbiAgICAgIGNhc2UgJ3Vuc2hpZnQnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3M7XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdzcGxpY2UnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3Muc2xpY2UoMik7XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICAgIGlmIChpbnNlcnRlZCkgeyBvYi5vYnNlcnZlQXJyYXkoaW5zZXJ0ZWQpOyB9XG4gICAgLy8gbm90aWZ5IGNoYW5nZVxuICAgIG9iLmRlcC5ub3RpZnkoKTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pO1xufSk7XG5cbi8qICAqL1xuXG52YXIgYXJyYXlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJyYXlNZXRob2RzKTtcblxuLyoqXG4gKiBJbiBzb21lIGNhc2VzIHdlIG1heSB3YW50IHRvIGRpc2FibGUgb2JzZXJ2YXRpb24gaW5zaWRlIGEgY29tcG9uZW50J3NcbiAqIHVwZGF0ZSBjb21wdXRhdGlvbi5cbiAqL1xudmFyIHNob3VsZE9ic2VydmUgPSB0cnVlO1xuXG5mdW5jdGlvbiB0b2dnbGVPYnNlcnZpbmcgKHZhbHVlKSB7XG4gIHNob3VsZE9ic2VydmUgPSB2YWx1ZTtcbn1cblxuLyoqXG4gKiBPYnNlcnZlciBjbGFzcyB0aGF0IGlzIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRoZSB0YXJnZXRcbiAqIG9iamVjdCdzIHByb3BlcnR5IGtleXMgaW50byBnZXR0ZXIvc2V0dGVycyB0aGF0XG4gKiBjb2xsZWN0IGRlcGVuZGVuY2llcyBhbmQgZGlzcGF0Y2ggdXBkYXRlcy5cbiAqL1xudmFyIE9ic2VydmVyID0gZnVuY3Rpb24gT2JzZXJ2ZXIgKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgdGhpcy5kZXAgPSBuZXcgRGVwKCk7XG4gIHRoaXMudm1Db3VudCA9IDA7XG4gIGRlZih2YWx1ZSwgJ19fb2JfXycsIHRoaXMpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAoaGFzUHJvdG8pIHtcbiAgICAgIHsvLyBmaXhlZCBieSB4eHh4eHgg5b6u5L+h5bCP56iL5bqP5L2/55SoIHBsdWdpbnMg5LmL5ZCO77yM5pWw57uE5pa55rOV6KKr55u05o6l5oyC6L295Yiw5LqG5pWw57uE5a+56LGh5LiK77yM6ZyA6KaB5omn6KGMIGNvcHlBdWdtZW50IOmAu+i+kVxuICAgICAgICBpZih2YWx1ZS5wdXNoICE9PSB2YWx1ZS5fX3Byb3RvX18ucHVzaCl7XG4gICAgICAgICAgY29weUF1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcywgYXJyYXlLZXlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm90b0F1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29weUF1Z21lbnQodmFsdWUsIGFycmF5TWV0aG9kcywgYXJyYXlLZXlzKTtcbiAgICB9XG4gICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMud2Fsayh2YWx1ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogV2FsayB0aHJvdWdoIGFsbCBwcm9wZXJ0aWVzIGFuZCBjb252ZXJ0IHRoZW0gaW50b1xuICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuXG4gKiB2YWx1ZSB0eXBlIGlzIE9iamVjdC5cbiAqL1xuT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMShvYmosIGtleXNbaV0pO1xuICB9XG59O1xuXG4vKipcbiAqIE9ic2VydmUgYSBsaXN0IG9mIEFycmF5IGl0ZW1zLlxuICovXG5PYnNlcnZlci5wcm90b3R5cGUub2JzZXJ2ZUFycmF5ID0gZnVuY3Rpb24gb2JzZXJ2ZUFycmF5IChpdGVtcykge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGl0ZW1zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIG9ic2VydmUoaXRlbXNbaV0pO1xuICB9XG59O1xuXG4vLyBoZWxwZXJzXG5cbi8qKlxuICogQXVnbWVudCBhIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nXG4gKiB0aGUgcHJvdG90eXBlIGNoYWluIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG4gIHRhcmdldC5fX3Byb3RvX18gPSBzcmM7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGEgdGFyZ2V0IE9iamVjdCBvciBBcnJheSBieSBkZWZpbmluZ1xuICogaGlkZGVuIHByb3BlcnRpZXMuXG4gKi9cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBjb3B5QXVnbWVudCAodGFyZ2V0LCBzcmMsIGtleXMpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGRlZih0YXJnZXQsIGtleSwgc3JjW2tleV0pO1xuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgaWYgc3VjY2Vzc2Z1bGx5IG9ic2VydmVkLFxuICogb3IgdGhlIGV4aXN0aW5nIG9ic2VydmVyIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGhhcyBvbmUuXG4gKi9cbmZ1bmN0aW9uIG9ic2VydmUgKHZhbHVlLCBhc1Jvb3REYXRhKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgb2I7XG4gIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikge1xuICAgIG9iID0gdmFsdWUuX19vYl9fO1xuICB9IGVsc2UgaWYgKFxuICAgIHNob3VsZE9ic2VydmUgJiZcbiAgICAhaXNTZXJ2ZXJSZW5kZXJpbmcoKSAmJlxuICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBpc1BsYWluT2JqZWN0KHZhbHVlKSkgJiZcbiAgICBPYmplY3QuaXNFeHRlbnNpYmxlKHZhbHVlKSAmJlxuICAgICF2YWx1ZS5faXNWdWUgJiZcbiAgICAhdmFsdWUuX192X2lzTVBDb21wb25lbnRcbiAgKSB7XG4gICAgb2IgPSBuZXcgT2JzZXJ2ZXIodmFsdWUpO1xuICB9XG4gIGlmIChhc1Jvb3REYXRhICYmIG9iKSB7XG4gICAgb2Iudm1Db3VudCsrO1xuICB9XG4gIHJldHVybiBvYlxufVxuXG4vKipcbiAqIERlZmluZSBhIHJlYWN0aXZlIHByb3BlcnR5IG9uIGFuIE9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUkJDEgKFxuICBvYmosXG4gIGtleSxcbiAgdmFsLFxuICBjdXN0b21TZXR0ZXIsXG4gIHNoYWxsb3dcbikge1xuICB2YXIgZGVwID0gbmV3IERlcCgpO1xuXG4gIHZhciBwcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpO1xuICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzXG4gIHZhciBnZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5nZXQ7XG4gIHZhciBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXQ7XG4gIGlmICgoIWdldHRlciB8fCBzZXR0ZXIpICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICB2YWwgPSBvYmpba2V5XTtcbiAgfVxuXG4gIHZhciBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZSh2YWwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/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+IHBhcnNlSW50KHRoaXMubWF4KSkge1xuICAgICAgICAgIHBydW5lQ2FjaGVFbnRyeShjYWNoZSwga2V5c1swXSwga2V5cywgdGhpcy5fdm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZub2RlLmRhdGEua2VlcEFsaXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHZub2RlIHx8IChzbG90ICYmIHNsb3RbMF0pXG4gIH1cbn07XG5cbnZhciBidWlsdEluQ29tcG9uZW50cyA9IHtcbiAgS2VlcEFsaXZlOiBLZWVwQWxpdmVcbn07XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0R2xvYmFsQVBJIChWdWUpIHtcbiAgLy8gY29uZmlnXG4gIHZhciBjb25maWdEZWYgPSB7fTtcbiAgY29uZmlnRGVmLmdldCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbmZpZzsgfTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25maWdEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcbiAgICAgICAgJ0RvIG5vdCByZXBsYWNlIHRoZSBWdWUuY29uZmlnIG9iamVjdCwgc2V0IGluZGl2aWR1YWwgZmllbGRzIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUsICdjb25maWcnLCBjb25maWdEZWYpO1xuXG4gIC8vIGV4cG9zZWQgdXRpbCBtZXRob2RzLlxuICAvLyBOT1RFOiB0aGVzZSBhcmUgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgcHVibGljIEFQSSAtIGF2b2lkIHJlbHlpbmcgb25cbiAgLy8gdGhlbSB1bmxlc3MgeW91IGFyZSBhd2FyZSBvZiB0aGUgcmlzay5cbiAgVnVlLnV0aWwgPSB7XG4gICAgd2Fybjogd2FybixcbiAgICBleHRlbmQ6IGV4dGVuZCxcbiAgICBtZXJnZU9wdGlvbnM6IG1lcmdlT3B0aW9ucyxcbiAgICBkZWZpbmVSZWFjdGl2ZTogZGVmaW5lUmVhY3RpdmUkJDFcbiAgfTtcblxuICBWdWUuc2V0ID0gc2V0O1xuICBWdWUuZGVsZXRlID0gZGVsO1xuICBWdWUubmV4dFRpY2sgPSBuZXh0VGljaztcblxuICAvLyAyLjYgZXhwbGljaXQgb2JzZXJ2YWJsZSBBUElcbiAgVnVlLm9ic2VydmFibGUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgb2JzZXJ2ZShvYmopO1xuICAgIHJldHVybiBvYmpcbiAgfTtcblxuICBWdWUub3B0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIEFTU0VUX1RZUEVTLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBWdWUub3B0aW9uc1t0eXBlICsgJ3MnXSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH0pO1xuXG4gIC8vIHRoaXMgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgXCJiYXNlXCIgY29uc3RydWN0b3IgdG8gZXh0ZW5kIGFsbCBwbGFpbi1vYmplY3RcbiAgLy8gY29tcG9uZW50cyB3aXRoIGluIFdlZXgncyBtdWx0aS1pbnN0YW5jZSBzY2VuYXJpb3MuXG4gIFZ1ZS5vcHRpb25zLl9iYXNlID0gVnVlO1xuXG4gIGV4dGVuZChWdWUub3B0aW9ucy5jb21wb25lbnRzLCBidWlsdEluQ29tcG9uZW50cyk7XG5cbiAgaW5pdFVzZShWdWUpO1xuICBpbml0TWl4aW4kMShWdWUpO1xuICBpbml0RXh0ZW5kKFZ1ZSk7XG4gIGluaXRBc3NldFJlZ2lzdGVycyhWdWUpO1xufVxuXG5pbml0R2xvYmFsQVBJKFZ1ZSk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJGlzU2VydmVyJywge1xuICBnZXQ6IGlzU2VydmVyUmVuZGVyaW5nXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZS5wcm90b3R5cGUsICckc3NyQ29udGV4dCcsIHtcbiAgZ2V0OiBmdW5jdGlvbiBnZXQgKCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHRcbiAgfVxufSk7XG5cbi8vIGV4cG9zZSBGdW5jdGlvbmFsUmVuZGVyQ29udGV4dCBmb3Igc3NyIHJ1bnRpbWUgaGVscGVyIGluc3RhbGxhdGlvblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ0Z1bmN0aW9uYWxSZW5kZXJDb250ZXh0Jywge1xuICB2YWx1ZTogRnVuY3Rpb25hbFJlbmRlckNvbnRleHRcbn0pO1xuXG5WdWUudmVyc2lvbiA9ICcyLjYuMTEnO1xuXG4vKipcbiAqIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9UZW5jZW50L3dlc3RvcmUvbWFzdGVyL3BhY2thZ2VzL3dlc3RvcmUvdXRpbHMvZGlmZi5qc1xuICovXG52YXIgQVJSQVlUWVBFID0gJ1tvYmplY3QgQXJyYXldJztcbnZhciBPQkpFQ1RUWVBFID0gJ1tvYmplY3QgT2JqZWN0XSc7XG52YXIgTlVMTFRZUEUgPSAnW29iamVjdCBOdWxsXSc7XG52YXIgVU5ERUZJTkVEVFlQRSA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuLy8gY29uc3QgRlVOQ1RJT05UWVBFID0gJ1tvYmplY3QgRnVuY3Rpb25dJ1xuXG5mdW5jdGlvbiBkaWZmKGN1cnJlbnQsIHByZSkge1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBzeW5jS2V5cyhjdXJyZW50LCBwcmUpO1xuICAgIF9kaWZmKGN1cnJlbnQsIHByZSwgJycsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBzeW5jS2V5cyhjdXJyZW50LCBwcmUpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gcHJlKSB7IHJldHVybiB9XG4gICAgdmFyIHJvb3RDdXJyZW50VHlwZSA9IHR5cGUoY3VycmVudCk7XG4gICAgdmFyIHJvb3RQcmVUeXBlID0gdHlwZShwcmUpO1xuICAgIGlmIChyb290Q3VycmVudFR5cGUgPT0gT0JKRUNUVFlQRSAmJiByb290UHJlVHlwZSA9PSBPQkpFQ1RUWVBFKSB7XG4gICAgICAgIGlmKE9iamVjdC5rZXlzKGN1cnJlbnQpLmxlbmd0aCA+PSBPYmplY3Qua2V5cyhwcmUpLmxlbmd0aCl7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcHJlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFtrZXldID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzeW5jS2V5cyhjdXJyZW50VmFsdWUsIHByZVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvb3RDdXJyZW50VHlwZSA9PSBBUlJBWVRZUEUgJiYgcm9vdFByZVR5cGUgPT0gQVJSQVlUWVBFKSB7XG4gICAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCA+PSBwcmUubGVuZ3RoKSB7XG4gICAgICAgICAgICBwcmUuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBzeW5jS2V5cyhjdXJyZW50W2luZGV4XSwgaXRlbSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gbnVsbE9yVW5kZWZpbmVkKGN1cnJlbnRUeXBlLCBwcmVUeXBlKSB7XG4gICAgaWYoXG4gICAgICAgIChjdXJyZW50VHlwZSA9PT0gTlVMTFRZUEUgfHwgY3VycmVudFR5cGUgPT09IFVOREVGSU5FRFRZUEUpICYmIFxuICAgICAgICAocHJlVHlwZSA9PT0gTlVMTFRZUEUgfHwgcHJlVHlwZSA9PT0gVU5ERUZJTkVEVFlQRSlcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG59XG5cbmZ1bmN0aW9uIF9kaWZmKGN1cnJlbnQsIHByZSwgcGF0aCwgcmVzdWx0KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByZSkgeyByZXR1cm4gfVxuICAgIHZhciByb290Q3VycmVudFR5cGUgPSB0eXBlKGN1cnJlbnQpO1xuICAgIHZhciByb290UHJlVHlwZSA9IHR5cGUocHJlKTtcbiAgICBpZiAocm9vdEN1cnJlbnRUeXBlID09IE9CSkVDVFRZUEUpIHtcbiAgICAgICAgaWYgKHJvb3RQcmVUeXBlICE9IE9CSkVDVFRZUEUgfHwgT2JqZWN0LmtleXMoY3VycmVudCkubGVuZ3RoIDwgT2JqZWN0LmtleXMocHJlKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQsIHBhdGgsIGN1cnJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIGtleSApIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gY3VycmVudFtrZXldO1xuICAgICAgICAgICAgICAgIHZhciBwcmVWYWx1ZSA9IHByZVtrZXldO1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VHlwZSA9IHR5cGUoY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICB2YXIgcHJlVHlwZSA9IHR5cGUocHJlVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VHlwZSAhPSBBUlJBWVRZUEUgJiYgY3VycmVudFR5cGUgIT0gT0JKRUNUVFlQRSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlICE9PSBwcmVba2V5XSAmJiBudWxsT3JVbmRlZmluZWQoY3VycmVudFR5cGUsIHByZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCAocGF0aCA9PSAnJyA/ICcnIDogcGF0aCArIFwiLlwiKSArIGtleSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFR5cGUgPT0gQVJSQVlUWVBFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVUeXBlICE9IEFSUkFZVFlQRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwgKHBhdGggPT0gJycgPyAnJyA6IHBhdGggKyBcIi5cIikgKyBrZXksIGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlLmxlbmd0aCA8IHByZVZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFJlc3VsdChyZXN1bHQsIChwYXRoID09ICcnID8gJycgOiBwYXRoICsgXCIuXCIpICsga2V5LCBjdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RpZmYoaXRlbSwgcHJlVmFsdWVbaW5kZXhdLCAocGF0aCA9PSAnJyA/ICcnIDogcGF0aCArIFwiLlwiKSArIGtleSArICdbJyArIGluZGV4ICsgJ10nLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VHlwZSA9PSBPQkpFQ1RUWVBFKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVUeXBlICE9IE9CSkVDVFRZUEUgfHwgT2JqZWN0LmtleXMoY3VycmVudFZhbHVlKS5sZW5ndGggPCBPYmplY3Qua2V5cyhwcmVWYWx1ZSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCAocGF0aCA9PSAnJyA/ICcnIDogcGF0aCArIFwiLlwiKSArIGtleSwgY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHN1YktleSBpbiBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGlmZihjdXJyZW50VmFsdWVbc3ViS2V5XSwgcHJlVmFsdWVbc3ViS2V5XSwgKHBhdGggPT0gJycgPyAnJyA6IHBhdGggKyBcIi5cIikgKyBrZXkgKyAnLicgKyBzdWJLZXksIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gY3VycmVudCkgbG9vcCgga2V5ICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJvb3RDdXJyZW50VHlwZSA9PSBBUlJBWVRZUEUpIHtcbiAgICAgICAgaWYgKHJvb3RQcmVUeXBlICE9IEFSUkFZVFlQRSkge1xuICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwgcGF0aCwgY3VycmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudC5sZW5ndGggPCBwcmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwgcGF0aCwgY3VycmVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RpZmYoaXRlbSwgcHJlW2luZGV4XSwgcGF0aCArICdbJyArIGluZGV4ICsgJ10nLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwgcGF0aCwgY3VycmVudCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN1bHQocmVzdWx0LCBrLCB2KSB7XG4gICAgLy8gaWYgKHR5cGUodikgIT0gRlVOQ1RJT05UWVBFKSB7XG4gICAgICAgIHJlc3VsdFtrXSA9IHY7XG4gICAgLy8gfVxufVxuXG5mdW5jdGlvbiB0eXBlKG9iaikge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZmx1c2hDYWxsYmFja3MkMSh2bSkge1xuICAgIGlmICh2bS5fX25leHRfdGlja19jYWxsYmFja3MgJiYgdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzLmxlbmd0aCkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuVlVFX0FQUF9ERUJVRykge1xuICAgICAgICAgICAgdmFyIG1wSW5zdGFuY2UgPSB2bS4kc2NvcGU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnWycgKyAoK25ldyBEYXRlKSArICddWycgKyAobXBJbnN0YW5jZS5pcyB8fCBtcEluc3RhbmNlLnJvdXRlKSArICddWycgKyB2bS5fdWlkICtcbiAgICAgICAgICAgICAgICAnXTpmbHVzaENhbGxiYWNrc1snICsgdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzLmxlbmd0aCArICddJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNvcGllcyA9IHZtLl9fbmV4dF90aWNrX2NhbGxiYWNrcy5zbGljZSgwKTtcbiAgICAgICAgdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29waWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb3BpZXNbaV0oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFzUmVuZGVyV2F0Y2hlcih2bSkge1xuICAgIHJldHVybiBxdWV1ZS5maW5kKGZ1bmN0aW9uICh3YXRjaGVyKSB7IHJldHVybiB2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlcjsgfSlcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2skMSh2bSwgY2IpIHtcbiAgICAvLzEubmV4dFRpY2sg5LmL5YmNIOW3siBzZXREYXRhIOS4lCBzZXREYXRhIOi/mOacquWbnuiwg+WujOaIkFxuICAgIC8vMi5uZXh0VGljayDkuYvliY3lrZjlnKggcmVuZGVyIHdhdGNoZXJcbiAgICBpZiAoIXZtLl9fbmV4dF90aWNrX3BlbmRpbmcgJiYgIWhhc1JlbmRlcldhdGNoZXIodm0pKSB7XG4gICAgICAgIGlmKHByb2Nlc3MuZW52LlZVRV9BUFBfREVCVUcpe1xuICAgICAgICAgICAgdmFyIG1wSW5zdGFuY2UgPSB2bS4kc2NvcGU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnWycgKyAoK25ldyBEYXRlKSArICddWycgKyAobXBJbnN0YW5jZS5pcyB8fCBtcEluc3RhbmNlLnJvdXRlKSArICddWycgKyB2bS5fdWlkICtcbiAgICAgICAgICAgICAgICAnXTpuZXh0VnVlVGljaycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXh0VGljayhjYiwgdm0pXG4gICAgfWVsc2V7XG4gICAgICAgIGlmKHByb2Nlc3MuZW52LlZVRV9BUFBfREVCVUcpe1xuICAgICAgICAgICAgdmFyIG1wSW5zdGFuY2UkMSA9IHZtLiRzY29wZTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbJyArICgrbmV3IERhdGUpICsgJ11bJyArIChtcEluc3RhbmNlJDEuaXMgfHwgbXBJbnN0YW5jZSQxLnJvdXRlKSArICddWycgKyB2bS5fdWlkICtcbiAgICAgICAgICAgICAgICAnXTpuZXh0TVBUaWNrJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIF9yZXNvbHZlO1xuICAgIGlmICghdm0uX19uZXh0X3RpY2tfY2FsbGJhY2tzKSB7XG4gICAgICAgIHZtLl9fbmV4dF90aWNrX2NhbGxiYWNrcyA9IFtdO1xuICAgIH1cbiAgICB2bS5fX25leHRfdGlja19jYWxsYmFja3MucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjYi5jYWxsKHZtKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihlLCB2bSwgJ25leHRUaWNrJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoX3Jlc29sdmUpIHtcbiAgICAgICAgICAgIF9yZXNvbHZlKHZtKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vICRmbG93LWRpc2FibGUtbGluZVxuICAgIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGNsZWFySW5zdGFuY2Uoa2V5LCB2YWx1ZSkge1xuICAvLyDnroDmmJPljrvpmaQgVnVlIOWSjOWwj+eoi+W6j+e7hOS7tuWunuS+i1xuICBpZiAodmFsdWUpIHtcbiAgICBpZiAodmFsdWUuX2lzVnVlIHx8IHZhbHVlLl9fdl9pc01QQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbmZ1bmN0aW9uIGNsb25lV2l0aERhdGEodm0pIHtcbiAgLy8g56Gu5L+d5b2T5YmNIHZtIOaJgOacieaVsOaNruiiq+WQjOatpVxuICB2YXIgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdmFyIGRhdGFLZXlzID0gW10uY29uY2F0KFxuICAgIE9iamVjdC5rZXlzKHZtLl9kYXRhIHx8IHt9KSxcbiAgICBPYmplY3Qua2V5cyh2bS5fY29tcHV0ZWRXYXRjaGVycyB8fCB7fSkpO1xuXG4gIGRhdGFLZXlzLnJlZHVjZShmdW5jdGlvbihyZXQsIGtleSkge1xuICAgIHJldFtrZXldID0gdm1ba2V5XTtcbiAgICByZXR1cm4gcmV0XG4gIH0sIHJldCk7XG5cbiAgLy8gdnVlLWNvbXBvc2l0aW9uLWFwaVxuICB2YXIgY29tcG9zaXRpb25BcGlTdGF0ZSA9IHZtLl9fY29tcG9zaXRpb25fYXBpX3N0YXRlX18gfHwgdm0uX19zZWNyZXRfdmZhX3N0YXRlX187XG4gIHZhciByYXdCaW5kaW5ncyA9IGNvbXBvc2l0aW9uQXBpU3RhdGUgJiYgY29tcG9zaXRpb25BcGlTdGF0ZS5yYXdCaW5kaW5ncztcbiAgaWYgKHJhd0JpbmRpbmdzKSB7XG4gICAgT2JqZWN0LmtleXMocmF3QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgcmV0W2tleV0gPSB2bVtrZXldO1xuICAgIH0pO1xuICB9XG5cbiAgLy9UT0RPIOmcgOimgeaKiuaXoOeUqOaVsOaNruWkhOeQhuaOie+8jOavlOWmgiBsaXN0PT5sMCDliJkgbGlzdCDpnIDopoHnp7vpmaTvvIzlkKbliJnlpJrkvKDovpPkuIDku73mlbDmja5cbiAgT2JqZWN0LmFzc2lnbihyZXQsIHZtLiRtcC5kYXRhIHx8IHt9KTtcbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkodm0uJG9wdGlvbnMuYmVoYXZpb3JzKSAmJlxuICAgIHZtLiRvcHRpb25zLmJlaGF2aW9ycy5pbmRleE9mKCd1bmk6Ly9mb3JtLWZpZWxkJykgIT09IC0xXG4gICkgeyAvL2Zvcm0tZmllbGRcbiAgICByZXRbJ25hbWUnXSA9IHZtLm5hbWU7XG4gICAgcmV0Wyd2YWx1ZSddID0gdm0udmFsdWU7XG4gIH1cblxuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXQsIGNsZWFySW5zdGFuY2UpKVxufVxuXG52YXIgcGF0Y2ggPSBmdW5jdGlvbihvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKHZub2RlID09PSBudWxsKSB7IC8vZGVzdHJveVxuICAgIHJldHVyblxuICB9XG4gIGlmICh0aGlzLm1wVHlwZSA9PT0gJ3BhZ2UnIHx8IHRoaXMubXBUeXBlID09PSAnY29tcG9uZW50Jykge1xuICAgIHZhciBtcEluc3RhbmNlID0gdGhpcy4kc2NvcGU7XG4gICAgdmFyIGRhdGEgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIHRyeSB7XG4gICAgICBkYXRhID0gY2xvbmVXaXRoRGF0YSh0aGlzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gICAgZGF0YS5fX3dlYnZpZXdJZF9fID0gbXBJbnN0YW5jZS5kYXRhLl9fd2Vidmlld0lkX187XG4gICAgdmFyIG1wRGF0YSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgT2JqZWN0LmtleXMoZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IC8v5LuF5ZCM5q2lIGRhdGEg5Lit5pyJ55qE5pWw5o2uXG4gICAgICBtcERhdGFba2V5XSA9IG1wSW5zdGFuY2UuZGF0YVtrZXldO1xuICAgIH0pO1xuICAgIHZhciBkaWZmRGF0YSA9IHRoaXMuJHNob3VsZERpZmZEYXRhID09PSBmYWxzZSA/IGRhdGEgOiBkaWZmKGRhdGEsIG1wRGF0YSk7XG4gICAgaWYgKE9iamVjdC5rZXlzKGRpZmZEYXRhKS5sZW5ndGgpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5WVUVfQVBQX0RFQlVHKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbJyArICgrbmV3IERhdGUpICsgJ11bJyArIChtcEluc3RhbmNlLmlzIHx8IG1wSW5zdGFuY2Uucm91dGUpICsgJ11bJyArIHRoaXMuX3VpZCArXG4gICAgICAgICAgJ13lt67ph4/mm7TmlrAnLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGRpZmZEYXRhKSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9fbmV4dF90aWNrX3BlbmRpbmcgPSB0cnVlO1xuICAgICAgbXBJbnN0YW5jZS5zZXREYXRhKGRpZmZEYXRhLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMkMS5fX25leHRfdGlja19wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIGZsdXNoQ2FsbGJhY2tzJDEodGhpcyQxKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmbHVzaENhbGxiYWNrcyQxKHRoaXMpO1xuICAgIH1cbiAgfVxufTtcblxuLyogICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUVtcHR5UmVuZGVyKCkge1xuXG59XG5cbmZ1bmN0aW9uIG1vdW50Q29tcG9uZW50JDEoXG4gIHZtLFxuICBlbCxcbiAgaHlkcmF0aW5nXG4pIHtcbiAgaWYgKCF2bS5tcFR5cGUpIHsvL21haW4uanMg5Lit55qEIG5ldyBWdWVcbiAgICByZXR1cm4gdm1cbiAgfVxuICBpZiAodm0ubXBUeXBlID09PSAnYXBwJykge1xuICAgIHZtLiRvcHRpb25zLnJlbmRlciA9IGNyZWF0ZUVtcHR5UmVuZGVyO1xuICB9XG4gIGlmICghdm0uJG9wdGlvbnMucmVuZGVyKSB7XG4gICAgdm0uJG9wdGlvbnMucmVuZGVyID0gY3JlYXRlRW1wdHlSZW5kZXI7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCh2bS4kb3B0aW9ucy50ZW1wbGF0ZSAmJiB2bS4kb3B0aW9ucy50ZW1wbGF0ZS5jaGFyQXQoMCkgIT09ICcjJykgfHxcbiAgICAgICAgdm0uJG9wdGlvbnMuZWwgfHwgZWwpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnWW91IGFyZSB1c2luZyB0aGUgcnVudGltZS1vbmx5IGJ1aWxkIG9mIFZ1ZSB3aGVyZSB0aGUgdGVtcGxhdGUgJyArXG4gICAgICAgICAgJ2NvbXBpbGVyIGlzIG5vdCBhdmFpbGFibGUuIEVpdGhlciBwcmUtY29tcGlsZSB0aGUgdGVtcGxhdGVzIGludG8gJyArXG4gICAgICAgICAgJ3JlbmRlciBmdW5jdGlvbnMsIG9yIHVzZSB0aGUgY29tcGlsZXItaW5jbHVkZWQgYnVpbGQuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnRmFpbGVkIHRvIG1vdW50IGNvbXBvbmVudDogdGVtcGxhdGUgb3IgcmVuZGVyIGZ1bmN0aW9uIG5vdCBkZWZpbmVkLicsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gICF2bS5fJGZhbGxiYWNrICYmIGNhbGxIb29rKHZtLCAnYmVmb3JlTW91bnQnKTtcblxuICB2YXIgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZtLl91cGRhdGUodm0uX3JlbmRlcigpLCBoeWRyYXRpbmcpO1xuICB9O1xuXG4gIC8vIHdlIHNldCB0aGlzIHRvIHZtLl93YXRjaGVyIGluc2lkZSB0aGUgd2F0Y2hlcidzIGNvbnN0cnVjdG9yXG4gIC8vIHNpbmNlIHRoZSB3YXRjaGVyJ3MgaW5pdGlhbCBwYXRjaCBtYXkgY2FsbCAkZm9yY2VVcGRhdGUgKGUuZy4gaW5zaWRlIGNoaWxkXG4gIC8vIGNvbXBvbmVudCdzIG1vdW50ZWQgaG9vayksIHdoaWNoIHJlbGllcyBvbiB2bS5fd2F0Y2hlciBiZWluZyBhbHJlYWR5IGRlZmluZWRcbiAgbmV3IFdhdGNoZXIodm0sIHVwZGF0ZUNvbXBvbmVudCwgbm9vcCwge1xuICAgIGJlZm9yZTogZnVuY3Rpb24gYmVmb3JlKCkge1xuICAgICAgaWYgKHZtLl9pc01vdW50ZWQgJiYgIXZtLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgICBjYWxsSG9vayh2bSwgJ2JlZm9yZVVwZGF0ZScpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgdHJ1ZSAvKiBpc1JlbmRlcldhdGNoZXIgKi8pO1xuICBoeWRyYXRpbmcgPSBmYWxzZTtcbiAgcmV0dXJuIHZtXG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiByZW5kZXJDbGFzcyAoXG4gIHN0YXRpY0NsYXNzLFxuICBkeW5hbWljQ2xhc3Ncbikge1xuICBpZiAoaXNEZWYoc3RhdGljQ2xhc3MpIHx8IGlzRGVmKGR5bmFtaWNDbGFzcykpIHtcbiAgICByZXR1cm4gY29uY2F0KHN0YXRpY0NsYXNzLCBzdHJpbmdpZnlDbGFzcyhkeW5hbWljQ2xhc3MpKVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJ1xufVxuXG5mdW5jdGlvbiBjb25jYXQgKGEsIGIpIHtcbiAgcmV0dXJuIGEgPyBiID8gKGEgKyAnICcgKyBiKSA6IGEgOiAoYiB8fCAnJylcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5Q2xhc3MgKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBzdHJpbmdpZnlBcnJheSh2YWx1ZSlcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIHN0cmluZ2lmeU9iamVjdCh2YWx1ZSlcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJ1xufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlBcnJheSAodmFsdWUpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgc3RyaW5naWZpZWQ7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgaWYgKGlzRGVmKHN0cmluZ2lmaWVkID0gc3RyaW5naWZ5Q2xhc3ModmFsdWVbaV0pKSAmJiBzdHJpbmdpZmllZCAhPT0gJycpIHtcbiAgICAgIGlmIChyZXMpIHsgcmVzICs9ICcgJzsgfVxuICAgICAgcmVzICs9IHN0cmluZ2lmaWVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdCAodmFsdWUpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAodmFsdWVba2V5XSkge1xuICAgICAgaWYgKHJlcykgeyByZXMgKz0gJyAnOyB9XG4gICAgICByZXMgKz0ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG52YXIgcGFyc2VTdHlsZVRleHQgPSBjYWNoZWQoZnVuY3Rpb24gKGNzc1RleHQpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICB2YXIgbGlzdERlbGltaXRlciA9IC87KD8hW14oXSpcXCkpL2c7XG4gIHZhciBwcm9wZXJ0eURlbGltaXRlciA9IC86KC4rKS87XG4gIGNzc1RleHQuc3BsaXQobGlzdERlbGltaXRlcikuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIGlmIChpdGVtKSB7XG4gICAgICB2YXIgdG1wID0gaXRlbS5zcGxpdChwcm9wZXJ0eURlbGltaXRlcik7XG4gICAgICB0bXAubGVuZ3RoID4gMSAmJiAocmVzW3RtcFswXS50cmltKCldID0gdG1wWzFdLnRyaW0oKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc1xufSk7XG5cbi8vIG5vcm1hbGl6ZSBwb3NzaWJsZSBhcnJheSAvIHN0cmluZyB2YWx1ZXMgaW50byBPYmplY3RcbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0eWxlQmluZGluZyAoYmluZGluZ1N0eWxlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGJpbmRpbmdTdHlsZSkpIHtcbiAgICByZXR1cm4gdG9PYmplY3QoYmluZGluZ1N0eWxlKVxuICB9XG4gIGlmICh0eXBlb2YgYmluZGluZ1N0eWxlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBwYXJzZVN0eWxlVGV4dChiaW5kaW5nU3R5bGUpXG4gIH1cbiAgcmV0dXJuIGJpbmRpbmdTdHlsZVxufVxuXG4vKiAgKi9cblxudmFyIE1QX01FVEhPRFMgPSBbJ2NyZWF0ZVNlbGVjdG9yUXVlcnknLCAnY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXInLCAnc2VsZWN0QWxsQ29tcG9uZW50cycsICdzZWxlY3RDb21wb25lbnQnXTtcblxuZnVuY3Rpb24gZ2V0VGFyZ2V0KG9iaiwgcGF0aCkge1xuICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gIHZhciBrZXkgPSBwYXJ0c1swXTtcbiAgaWYgKGtleS5pbmRleE9mKCdfXyRuJykgPT09IDApIHsgLy9udW1iZXIgaW5kZXhcbiAgICBrZXkgPSBwYXJzZUludChrZXkucmVwbGFjZSgnX18kbicsICcnKSk7XG4gIH1cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBvYmpba2V5XVxuICB9XG4gIHJldHVybiBnZXRUYXJnZXQob2JqW2tleV0sIHBhcnRzLnNsaWNlKDEpLmpvaW4oJy4nKSlcbn1cblxuZnVuY3Rpb24gaW50ZXJuYWxNaXhpbihWdWUpIHtcblxuICBWdWUuY29uZmlnLmVycm9ySGFuZGxlciA9IGZ1bmN0aW9uKGVyciwgdm0sIGluZm8pIHtcbiAgICBWdWUudXRpbC53YXJuKChcIkVycm9yIGluIFwiICsgaW5mbyArIFwiOiBcXFwiXCIgKyAoZXJyLnRvU3RyaW5nKCkpICsgXCJcXFwiXCIpLCB2bSk7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgdmFyIGFwcCA9IHR5cGVvZiBnZXRBcHAgPT09ICdmdW5jdGlvbicgJiYgZ2V0QXBwKCk7XG4gICAgaWYgKGFwcCAmJiBhcHAub25FcnJvcikge1xuICAgICAgYXBwLm9uRXJyb3IoZXJyKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIG9sZEVtaXQgPSBWdWUucHJvdG90eXBlLiRlbWl0O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJGVtaXQgPSBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICh0aGlzLiRzY29wZSAmJiBldmVudCkge1xuICAgICAgdmFyIHRyaWdnZXJFdmVudCA9IHRoaXMuJHNjb3BlWydfdHJpZ2dlckV2ZW50J10gfHwgdGhpcy4kc2NvcGVbJ3RyaWdnZXJFdmVudCddO1xuICAgICAgaWYgKHRyaWdnZXJFdmVudCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudC5jYWxsKHRoaXMuJHNjb3BlLCBldmVudCwge1xuICAgICAgICAgICAgX19hcmdzX186IHRvQXJyYXkoYXJndW1lbnRzLCAxKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9sZEVtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG5leHRUaWNrID0gZnVuY3Rpb24oZm4pIHtcbiAgICByZXR1cm4gbmV4dFRpY2skMSh0aGlzLCBmbilcbiAgfTtcblxuICBNUF9NRVRIT0RTLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgIFZ1ZS5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgIGlmICh0aGlzLiRzY29wZSAmJiB0aGlzLiRzY29wZVttZXRob2RdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRzY29wZVttZXRob2RdKGFyZ3MpXG4gICAgICB9XG4gICAgICAvLyBtcC1hbGlwYXlcbiAgICAgIGlmICh0eXBlb2YgbXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKG1ldGhvZCA9PT0gJ2NyZWF0ZVNlbGVjdG9yUXVlcnknKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4gICAgICAgIHJldHVybiBteS5jcmVhdGVTZWxlY3RvclF1ZXJ5KGFyZ3MpXG4gICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ2NyZWF0ZUludGVyc2VjdGlvbk9ic2VydmVyJykge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuICAgICAgICByZXR1cm4gbXkuY3JlYXRlSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoYXJncylcbiAgICAgIH1cbiAgICAgIC8vIFRPRE8gbXAtYWxpcGF5IOaaguS4jeaUr+aMgSBzZWxlY3RBbGxDb21wb25lbnRzLHNlbGVjdENvbXBvbmVudFxuICAgIH07XG4gIH0pO1xuXG4gIFZ1ZS5wcm90b3R5cGUuX19pbml0X3Byb3ZpZGUgPSBpbml0UHJvdmlkZTtcblxuICBWdWUucHJvdG90eXBlLl9faW5pdF9pbmplY3Rpb25zID0gaW5pdEluamVjdGlvbnM7XG5cbiAgVnVlLnByb3RvdHlwZS5fX2NhbGxfaG9vayA9IGZ1bmN0aW9uKGhvb2ssIGFyZ3MpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIC8vICM3NTczIGRpc2FibGUgZGVwIGNvbGxlY3Rpb24gd2hlbiBpbnZva2luZyBsaWZlY3ljbGUgaG9va3NcbiAgICBwdXNoVGFyZ2V0KCk7XG4gICAgdmFyIGhhbmRsZXJzID0gdm0uJG9wdGlvbnNbaG9va107XG4gICAgdmFyIGluZm8gPSBob29rICsgXCIgaG9va1wiO1xuICAgIHZhciByZXQ7XG4gICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICByZXQgPSBpbnZva2VXaXRoRXJyb3JIYW5kbGluZyhoYW5kbGVyc1tpXSwgdm0sIGFyZ3MgPyBbYXJnc10gOiBudWxsLCB2bSwgaW5mbyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2bS5faGFzSG9va0V2ZW50KSB7XG4gICAgICB2bS4kZW1pdCgnaG9vazonICsgaG9vaywgYXJncyk7XG4gICAgfVxuICAgIHBvcFRhcmdldCgpO1xuICAgIHJldHVybiByZXRcbiAgfTtcblxuICBWdWUucHJvdG90eXBlLl9fc2V0X21vZGVsID0gZnVuY3Rpb24odGFyZ2V0LCBrZXksIHZhbHVlLCBtb2RpZmllcnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtb2RpZmllcnMpKSB7XG4gICAgICBpZiAobW9kaWZpZXJzLmluZGV4T2YoJ3RyaW0nKSAhPT0gLTEpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICB9XG4gICAgICBpZiAobW9kaWZpZXJzLmluZGV4T2YoJ251bWJlcicpICE9PSAtMSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuX24odmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGFyZ2V0ID0gdGhpcztcbiAgICB9XG4gICAgLy8g6Kej5Yaz5Yqo5oCB5bGe5oCn5re75YqgXG4gICAgVnVlLnNldCh0YXJnZXQsIGtleSwgdmFsdWUpO1xuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX19zZXRfc3luYyA9IGZ1bmN0aW9uKHRhcmdldCwga2V5LCB2YWx1ZSkge1xuICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICB0YXJnZXQgPSB0aGlzO1xuICAgIH1cbiAgICAvLyDop6PlhrPliqjmgIHlsZ7mgKfmt7vliqBcbiAgICBWdWUuc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fX2dldF9vcmlnID0gZnVuY3Rpb24oaXRlbSkge1xuICAgIGlmIChpc1BsYWluT2JqZWN0KGl0ZW0pKSB7XG4gICAgICByZXR1cm4gaXRlbVsnJG9yaWcnXSB8fCBpdGVtXG4gICAgfVxuICAgIHJldHVybiBpdGVtXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fX2dldF92YWx1ZSA9IGZ1bmN0aW9uKGRhdGFQYXRoLCB0YXJnZXQpIHtcbiAgICByZXR1cm4gZ2V0VGFyZ2V0KHRhcmdldCB8fCB0aGlzLCBkYXRhUGF0aClcbiAgfTtcblxuXG4gIFZ1ZS5wcm90b3R5cGUuX19nZXRfY2xhc3MgPSBmdW5jdGlvbihkeW5hbWljQ2xhc3MsIHN0YXRpY0NsYXNzKSB7XG4gICAgcmV0dXJuIHJlbmRlckNsYXNzKHN0YXRpY0NsYXNzLCBkeW5hbWljQ2xhc3MpXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fX2dldF9zdHlsZSA9IGZ1bmN0aW9uKGR5bmFtaWNTdHlsZSwgc3RhdGljU3R5bGUpIHtcbiAgICBpZiAoIWR5bmFtaWNTdHlsZSAmJiAhc3RhdGljU3R5bGUpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICB2YXIgZHluYW1pY1N0eWxlT2JqID0gbm9ybWFsaXplU3R5bGVCaW5kaW5nKGR5bmFtaWNTdHlsZSk7XG4gICAgdmFyIHN0eWxlT2JqID0gc3RhdGljU3R5bGUgPyBleHRlbmQoc3RhdGljU3R5bGUsIGR5bmFtaWNTdHlsZU9iaikgOiBkeW5hbWljU3R5bGVPYmo7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0eWxlT2JqKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuICgoaHlwaGVuYXRlKG5hbWUpKSArIFwiOlwiICsgKHN0eWxlT2JqW25hbWVdKSk7IH0pLmpvaW4oJzsnKVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuX19tYXAgPSBmdW5jdGlvbih2YWwsIGl0ZXJhdGVlKSB7XG4gICAgLy9UT0RPIOaaguS4jeiAg+iZkSBzdHJpbmdcbiAgICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgcmV0ID0gbmV3IEFycmF5KHZhbC5sZW5ndGgpO1xuICAgICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcmV0W2ldID0gaXRlcmF0ZWUodmFsW2ldLCBpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXRcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgICByZXRba2V5XSA9IGl0ZXJhdGVlKHZhbFtrZXldLCBrZXksIGkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJldFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldCA9IG5ldyBBcnJheSh2YWwpO1xuICAgICAgZm9yIChpID0gMCwgbCA9IHZhbDsgaSA8IGw7IGkrKykge1xuICAgICAgICAvLyDnrKzkuIDkuKrlj4LmlbDmmoLml7bku43lkozlsI/nqIvluo/kuIDoh7RcbiAgICAgICAgcmV0W2ldID0gaXRlcmF0ZWUoaSwgaSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV0XG4gICAgfVxuICAgIHJldHVybiBbXVxuICB9O1xuXG59XG5cbi8qICAqL1xuXG52YXIgTElGRUNZQ0xFX0hPT0tTJDEgPSBbXG4gICAgLy9BcHBcbiAgICAnb25MYXVuY2gnLFxuICAgICdvblNob3cnLFxuICAgICdvbkhpZGUnLFxuICAgICdvblVuaU5WaWV3TWVzc2FnZScsXG4gICAgJ29uUGFnZU5vdEZvdW5kJyxcbiAgICAnb25UaGVtZUNoYW5nZScsXG4gICAgJ29uRXJyb3InLFxuICAgICdvblVuaGFuZGxlZFJlamVjdGlvbicsXG4gICAgLy9QYWdlXG4gICAgJ29uSW5pdCcsXG4gICAgJ29uTG9hZCcsXG4gICAgLy8gJ29uU2hvdycsXG4gICAgJ29uUmVhZHknLFxuICAgIC8vICdvbkhpZGUnLFxuICAgICdvblVubG9hZCcsXG4gICAgJ29uUHVsbERvd25SZWZyZXNoJyxcbiAgICAnb25SZWFjaEJvdHRvbScsXG4gICAgJ29uVGFiSXRlbVRhcCcsXG4gICAgJ29uQWRkVG9GYXZvcml0ZXMnLFxuICAgICdvblNoYXJlVGltZWxpbmUnLFxuICAgICdvblNoYXJlQXBwTWVzc2FnZScsXG4gICAgJ29uUmVzaXplJyxcbiAgICAnb25QYWdlU2Nyb2xsJyxcbiAgICAnb25OYXZpZ2F0aW9uQmFyQnV0dG9uVGFwJyxcbiAgICAnb25CYWNrUHJlc3MnLFxuICAgICdvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENoYW5nZWQnLFxuICAgICdvbk5hdmlnYXRpb25CYXJTZWFyY2hJbnB1dENvbmZpcm1lZCcsXG4gICAgJ29uTmF2aWdhdGlvbkJhclNlYXJjaElucHV0Q2xpY2tlZCcsXG4gICAgLy9Db21wb25lbnRcbiAgICAvLyAnb25SZWFkeScsIC8vIOWFvOWuueaXp+eJiOacrO+8jOW6lOivpeenu+mZpOivpeS6i+S7tlxuICAgICdvblBhZ2VTaG93JyxcbiAgICAnb25QYWdlSGlkZScsXG4gICAgJ29uUGFnZVJlc2l6ZScsXG4gICAgJ29uVXBsb2FkRG91eWluVmlkZW8nXG5dO1xuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4kMShWdWUpIHtcblxuICAgIC8vZml4ZWQgdnVlLWNsYXNzLWNvbXBvbmVudFxuICAgIHZhciBvbGRFeHRlbmQgPSBWdWUuZXh0ZW5kO1xuICAgIFZ1ZS5leHRlbmQgPSBmdW5jdGlvbihleHRlbmRPcHRpb25zKSB7XG4gICAgICAgIGV4dGVuZE9wdGlvbnMgPSBleHRlbmRPcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHZhciBtZXRob2RzID0gZXh0ZW5kT3B0aW9ucy5tZXRob2RzO1xuICAgICAgICBpZiAobWV0aG9kcykge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMobWV0aG9kcykuZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChMSUZFQ1lDTEVfSE9PS1MkMS5pbmRleE9mKG1ldGhvZE5hbWUpIT09LTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kT3B0aW9uc1ttZXRob2ROYW1lXSA9IG1ldGhvZHNbbWV0aG9kTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXRob2RzW21ldGhvZE5hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9sZEV4dGVuZC5jYWxsKHRoaXMsIGV4dGVuZE9wdGlvbnMpXG4gICAgfTtcblxuICAgIHZhciBzdHJhdGVnaWVzID0gVnVlLmNvbmZpZy5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7XG4gICAgdmFyIG1lcmdlSG9vayA9IHN0cmF0ZWdpZXMuY3JlYXRlZDtcbiAgICBMSUZFQ1lDTEVfSE9PS1MkMS5mb3JFYWNoKGZ1bmN0aW9uIChob29rKSB7XG4gICAgICAgIHN0cmF0ZWdpZXNbaG9va10gPSBtZXJnZUhvb2s7XG4gICAgfSk7XG5cbiAgICBWdWUucHJvdG90eXBlLl9fbGlmZWN5Y2xlX2hvb2tzX18gPSBMSUZFQ1lDTEVfSE9PS1MkMTtcbn1cblxuLyogICovXG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb25cblZ1ZS5wcm90b3R5cGUuX19wYXRjaF9fID0gcGF0Y2g7XG5cbi8vIHB1YmxpYyBtb3VudCBtZXRob2RcblZ1ZS5wcm90b3R5cGUuJG1vdW50ID0gZnVuY3Rpb24oXG4gICAgZWwgLFxuICAgIGh5ZHJhdGluZyBcbikge1xuICAgIHJldHVybiBtb3VudENvbXBvbmVudCQxKHRoaXMsIGVsLCBoeWRyYXRpbmcpXG59O1xuXG5saWZlY3ljbGVNaXhpbiQxKFZ1ZSk7XG5pbnRlcm5hbE1peGluKFZ1ZSk7XG5cbi8qICAqL1xuXG5leHBvcnQgZGVmYXVsdCBWdWU7XG4iLCIvKiBnbG9iYWxzIF9fVlVFX1NTUl9DT05URVhUX18gKi9cblxuLy8gSU1QT1JUQU5UOiBEbyBOT1QgdXNlIEVTMjAxNSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgKGV4Y2VwdCBmb3IgbW9kdWxlcykuXG4vLyBUaGlzIG1vZHVsZSBpcyBhIHJ1bnRpbWUgdXRpbGl0eSBmb3IgY2xlYW5lciBjb21wb25lbnQgbW9kdWxlIG91dHB1dCBhbmQgd2lsbFxuLy8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHdlYnBhY2sgdXNlciBidW5kbGUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbXBvbmVudCAoXG4gIHNjcmlwdEV4cG9ydHMsXG4gIHJlbmRlcixcbiAgc3RhdGljUmVuZGVyRm5zLFxuICBmdW5jdGlvbmFsVGVtcGxhdGUsXG4gIGluamVjdFN0eWxlcyxcbiAgc2NvcGVJZCxcbiAgbW9kdWxlSWRlbnRpZmllciwgLyogc2VydmVyIG9ubHkgKi9cbiAgc2hhZG93TW9kZSwgLyogdnVlLWNsaSBvbmx5ICovXG4gIGNvbXBvbmVudHMsIC8vIGZpeGVkIGJ5IHh4eHh4eCBhdXRvIGNvbXBvbmVudHNcbiAgcmVuZGVyanMgLy8gZml4ZWQgYnkgeHh4eHh4IHJlbmRlcmpzXG4pIHtcbiAgLy8gVnVlLmV4dGVuZCBjb25zdHJ1Y3RvciBleHBvcnQgaW50ZXJvcFxuICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzY3JpcHRFeHBvcnRzID09PSAnZnVuY3Rpb24nXG4gICAgPyBzY3JpcHRFeHBvcnRzLm9wdGlvbnNcbiAgICA6IHNjcmlwdEV4cG9ydHNcblxuICAvLyBmaXhlZCBieSB4eHh4eHggYXV0byBjb21wb25lbnRzXG4gIGlmIChjb21wb25lbnRzKSB7XG4gICAgaWYgKCFvcHRpb25zLmNvbXBvbmVudHMpIHtcbiAgICAgIG9wdGlvbnMuY29tcG9uZW50cyA9IHt9XG4gICAgfVxuICAgIHZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5XG4gICAgZm9yICh2YXIgbmFtZSBpbiBjb21wb25lbnRzKSB7XG4gICAgICBpZiAoaGFzT3duLmNhbGwoY29tcG9uZW50cywgbmFtZSkgJiYgIWhhc093bi5jYWxsKG9wdGlvbnMuY29tcG9uZW50cywgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9ucy5jb21wb25lbnRzW25hbWVdID0gY29tcG9uZW50c1tuYW1lXVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBmaXhlZCBieSB4eHh4eHggcmVuZGVyanNcbiAgaWYgKHJlbmRlcmpzKSB7XG4gICAgKHJlbmRlcmpzLmJlZm9yZUNyZWF0ZSB8fCAocmVuZGVyanMuYmVmb3JlQ3JlYXRlID0gW10pKS51bnNoaWZ0KGZ1bmN0aW9uKCkge1xuICAgICAgdGhpc1tyZW5kZXJqcy5fX21vZHVsZV0gPSB0aGlzXG4gICAgfSk7XG4gICAgKG9wdGlvbnMubWl4aW5zIHx8IChvcHRpb25zLm1peGlucyA9IFtdKSkucHVzaChyZW5kZXJqcylcbiAgfVxuXG4gIC8vIHJlbmRlciBmdW5jdGlvbnNcbiAgaWYgKHJlbmRlcikge1xuICAgIG9wdGlvbnMucmVuZGVyID0gcmVuZGVyXG4gICAgb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnMgPSBzdGF0aWNSZW5kZXJGbnNcbiAgICBvcHRpb25zLl9jb21waWxlZCA9IHRydWVcbiAgfVxuXG4gIC8vIGZ1bmN0aW9uYWwgdGVtcGxhdGVcbiAgaWYgKGZ1bmN0aW9uYWxUZW1wbGF0ZSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25hbCA9IHRydWVcbiAgfVxuXG4gIC8vIHNjb3BlZElkXG4gIGlmIChzY29wZUlkKSB7XG4gICAgb3B0aW9ucy5fc2NvcGVJZCA9ICdkYXRhLXYtJyArIHNjb3BlSWRcbiAgfVxuXG4gIHZhciBob29rXG4gIGlmIChtb2R1bGVJZGVudGlmaWVyKSB7IC8vIHNlcnZlciBidWlsZFxuICAgIGhvb2sgPSBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgLy8gMi4zIGluamVjdGlvblxuICAgICAgY29udGV4dCA9XG4gICAgICAgIGNvbnRleHQgfHwgLy8gY2FjaGVkIGNhbGxcbiAgICAgICAgKHRoaXMuJHZub2RlICYmIHRoaXMuJHZub2RlLnNzckNvbnRleHQpIHx8IC8vIHN0YXRlZnVsXG4gICAgICAgICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC4kdm5vZGUgJiYgdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQpIC8vIGZ1bmN0aW9uYWxcbiAgICAgIC8vIDIuMiB3aXRoIHJ1bkluTmV3Q29udGV4dDogdHJ1ZVxuICAgICAgaWYgKCFjb250ZXh0ICYmIHR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9fICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb250ZXh0ID0gX19WVUVfU1NSX0NPTlRFWFRfX1xuICAgICAgfVxuICAgICAgLy8gaW5qZWN0IGNvbXBvbmVudCBzdHlsZXNcbiAgICAgIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICAgICAgaW5qZWN0U3R5bGVzLmNhbGwodGhpcywgY29udGV4dClcbiAgICAgIH1cbiAgICAgIC8vIHJlZ2lzdGVyIGNvbXBvbmVudCBtb2R1bGUgaWRlbnRpZmllciBmb3IgYXN5bmMgY2h1bmsgaW5mZXJyZW5jZVxuICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMpIHtcbiAgICAgICAgY29udGV4dC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG1vZHVsZUlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHVzZWQgYnkgc3NyIGluIGNhc2UgY29tcG9uZW50IGlzIGNhY2hlZCBhbmQgYmVmb3JlQ3JlYXRlXG4gICAgLy8gbmV2ZXIgZ2V0cyBjYWxsZWRcbiAgICBvcHRpb25zLl9zc3JSZWdpc3RlciA9IGhvb2tcbiAgfSBlbHNlIGlmIChpbmplY3RTdHlsZXMpIHtcbiAgICBob29rID0gc2hhZG93TW9kZVxuICAgICAgPyBmdW5jdGlvbiAoKSB7IGluamVjdFN0eWxlcy5jYWxsKHRoaXMsIHRoaXMuJHJvb3QuJG9wdGlvbnMuc2hhZG93Um9vdCkgfVxuICAgICAgOiBpbmplY3RTdHlsZXNcbiAgfVxuXG4gIGlmIChob29rKSB7XG4gICAgaWYgKG9wdGlvbnMuZnVuY3Rpb25hbCkge1xuICAgICAgLy8gZm9yIHRlbXBsYXRlLW9ubHkgaG90LXJlbG9hZCBiZWNhdXNlIGluIHRoYXQgY2FzZSB0aGUgcmVuZGVyIGZuIGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRocm91Z2ggdGhlIG5vcm1hbGl6ZXJcbiAgICAgIG9wdGlvbnMuX2luamVjdFN0eWxlcyA9IGhvb2tcbiAgICAgIC8vIHJlZ2lzdGVyIGZvciBmdW5jdGlvYWwgY29tcG9uZW50IGluIHZ1ZSBmaWxlXG4gICAgICB2YXIgb3JpZ2luYWxSZW5kZXIgPSBvcHRpb25zLnJlbmRlclxuICAgICAgb3B0aW9ucy5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXJXaXRoU3R5bGVJbmplY3Rpb24gKGgsIGNvbnRleHQpIHtcbiAgICAgICAgaG9vay5jYWxsKGNvbnRleHQpXG4gICAgICAgIHJldHVybiBvcmlnaW5hbFJlbmRlcihoLCBjb250ZXh0KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpbmplY3QgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiBhcyBiZWZvcmVDcmVhdGUgaG9va1xuICAgICAgdmFyIGV4aXN0aW5nID0gb3B0aW9ucy5iZWZvcmVDcmVhdGVcbiAgICAgIG9wdGlvbnMuYmVmb3JlQ3JlYXRlID0gZXhpc3RpbmdcbiAgICAgICAgPyBbXS5jb25jYXQoZXhpc3RpbmcsIGhvb2spXG4gICAgICAgIDogW2hvb2tdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBleHBvcnRzOiBzY3JpcHRFeHBvcnRzLFxuICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgfVxufVxuIiwiY29uc3Qgc2hvd01vZGFsID0gKHRpdGxlLCBjb250ZW50LCBjYikgPT4ge1xyXG5cdHVuaS5zaG93TW9kYWwoe1xyXG5cdFx0dGl0bGUsXHJcblx0XHRjb250ZW50LFxyXG5cdFx0c2hvd0NhbmNlbDogZmFsc2UsXHJcblx0XHRjb21wbGV0ZTogKCkgPT4ge1xyXG5cdFx0XHRpZiAoY2IpIGNiKCk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn07XHJcbmNvbnN0IHNob3dMb2FkaW5nID0gKHRpdGxlKSA9PiB7XHJcblx0dW5pLnNob3dMb2FkaW5nKHtcclxuICAgICAgICB0aXRsZSxcclxuICAgICAgICBtYXNrOnRydWUsXHJcbiAgICB9KTtcclxufTtcclxuY29uc3QgaGlkZUxvYWRpbmcgPSAoKSA9PiB7XHJcblx0dW5pLmhpZGVMb2FkaW5nKCk7XHJcbn07XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdHNob3dNb2RhbCxcclxuXHRzaG93TG9hZGluZyxcclxuXHRoaWRlTG9hZGluZ1xyXG59O1xyXG5cclxuIiwiXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9lY0JMRUpELmpzJylcclxuIiwiY29uc3QgbG9nRW5hYmxlID0gZmFsc2U7XG5sZXQgaXNBbmRyb2lkID0gZmFsc2U7XG5sZXQgZWNCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2VDYWxsYmFjayA9ICgpID0+IHsgfTtcbmxldCBlY0JMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZUNhbGxiYWNrID0gKCkgPT4geyB9O1xubGV0IGVjRGV2aWNlSWQgPSAnJztcbmxldCBlY0dhdHRTZXJ2ZXJVVUlEID0gJyc7XG5jb25zdCBlY0dhdHRTZXJ2ZXJVVUlET3B0aW9uMSA9ICcwMDAwRkZGMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkInO1xuY29uc3QgZWNHYXR0U2VydmVyVVVJRE9wdGlvbjIgPSAnRkZGMCc7XG5sZXQgZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSUQgPSAnJztcbmNvbnN0IGVjR2F0dENoYXJhY3RlcmlzdGljV3JpdGVVVUlET3B0aW9uMSA9ICcwMDAwRkZGMi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkInO1xuY29uc3QgZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSURPcHRpb24yID0gJ0ZGRjInO1xuY29uc3QgbG9nID0gZGF0YSA9PiB7XG4gICAgaWYgKGxvZ0VuYWJsZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnW2VjaW90XTonICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIH1cbn07XG5jb25zdCBvbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZSA9IGNiID0+IHtcbiAgICBlY0JsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZUNhbGxiYWNrID0gY2I7XG59O1xuLy8gY29uc3QgZ2V0U2V0dGluZyA9ICgpID0+IHtcbi8vICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbi8vICAgICBqZC5nZXRTZXR0aW5nKHtcbi8vICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4vLyAgICAgICAgIGxvZyhyZXMpO1xuLy8gICAgICAgICBpZiAocmVzLmF1dGhTZXR0aW5nICYmIHJlcy5hdXRoU2V0dGluZ1snc2NvcGUuYmx1ZXRvb3RoJ10pIHtcbi8vICAgICAgICAgICByZXNvbHZlKHtcbi8vICAgICAgICAgICAgIG9rOiB0cnVlLFxuLy8gICAgICAgICAgICAgZXJyQ29kZTogMCxcbi8vICAgICAgICAgICAgIGVyck1zZzogJydcbi8vICAgICAgICAgICB9KTtcbi8vICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICByZXNvbHZlKHtcbi8vICAgICAgICAgICAgIG9rOiBmYWxzZSxcbi8vICAgICAgICAgICAgIGVyckNvZGU6IDMwMDAxLFxuLy8gICAgICAgICAgICAgZXJyTXNnOiAnZ2V0U2V0dGluZyBmYWlsJ1xuLy8gICAgICAgICAgIH0pO1xuLy8gICAgICAgICB9XG4vLyAgICAgICB9LFxuLy8gICAgICAgZmFpbChyZXMpIHtcbi8vICAgICAgICAgbG9nKHJlcyk7XG4vLyAgICAgICAgIHJlc29sdmUoe1xuLy8gICAgICAgICAgIG9rOiBmYWxzZSxcbi8vICAgICAgICAgICBlcnJDb2RlOiByZXMuZXJyQ29kZSA/IHJlcy5lcnJDb2RlIDogMzAwMDAsXG4vLyAgICAgICAgICAgZXJyTXNnOiByZXMuZXJyTXNnID8gcmVzLmVyck1zZyA6ICdnZXRTZXR0aW5nIGZhaWwnXG4vLyAgICAgICAgIH0pO1xuLy8gICAgICAgfVxuLy8gICAgIH0pO1xuLy8gICB9KTtcbi8vIH07XG4vLyBjb25zdCBhdXRob3JpemUgPSAoKSA9PiB7XG4vLyAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4vLyAgICAgamQuYXV0aG9yaXplKHtcbi8vICAgICAgIHNjb3BlOiAnc2NvcGUuYmx1ZXRvb3RoJyxcbi8vICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4vLyAgICAgICAgIGxvZyhyZXMpO1xuLy8gICAgICAgICByZXNvbHZlKHtcbi8vICAgICAgICAgICBvazogdHJ1ZSxcbi8vICAgICAgICAgICBlcnJDb2RlOiAwLFxuLy8gICAgICAgICAgIGVyck1zZzogJydcbi8vICAgICAgICAgfSk7XG4vLyAgICAgICB9LFxuLy8gICAgICAgZmFpbChyZXMpIHtcbi8vICAgICAgICAgbG9nKHJlcyk7XG4vLyAgICAgICAgIC8vIHtcImVyck1zZ1wiOlwiYXV0aG9yaXplOmZhaWw6YXV0aCBkZW55XCJ9XG4vLyAgICAgICAgIHJlc29sdmUoe1xuLy8gICAgICAgICAgIG9rOiBmYWxzZSxcbi8vICAgICAgICAgICBlcnJDb2RlOiAzMDAwMCxcbi8vICAgICAgICAgICBlcnJNc2c6IHJlcy5lcnJNc2dcbi8vICAgICAgICAgfSk7XG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyAgIH0pO1xuLy8gfTtcbmNvbnN0IF9vcGVuQmx1ZXRvb3RoQWRhcHRlciA9ICgpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBqZC5vcGVuQmx1ZXRvb3RoQWRhcHRlcih7XG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8vIHtlcnJubzogMCwgZXJyTXNnOiBcIm9wZW5CbHVldG9vdGhBZGFwdGVyOm9rXCJ9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiAwLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6ICcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbChyZXMpIHtcbiAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiByZXMuZXJyQ29kZSA/IHJlcy5lcnJDb2RlIDogMzAwMDAsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCBvcGVuQmx1ZXRvb3RoQWRhcHRlciA9IGFzeW5jICgpID0+IHtcbiAgICAvLyBhd2FpdCBfb3BlbkJsdWV0b290aEFkYXB0ZXIoKVxuICAgIGNvbnN0IHN5c3RlbUluZm8gPSBqZC5nZXRTeXN0ZW1JbmZvU3luYygpO1xuICAgIGxvZyhzeXN0ZW1JbmZvKTtcbiAgICBpZiAoc3lzdGVtSW5mby5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpID09PSAnYW5kcm9pZCcpIHtcbiAgICAgICAgaXNBbmRyb2lkID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gICBpZiAoIXN5c3RlbUluZm8uYmx1ZXRvb3RoRW5hYmxlZCkge1xuICAgIC8vICAgICBlY0JsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZUNhbGxiYWNrKHtcbiAgICAvLyAgICAgICBvazogZmFsc2UsXG4gICAgLy8gICAgICAgZXJyQ29kZTogMzAwMDEsXG4gICAgLy8gICAgICAgZXJyTXNnOiAn6K+35omT5byA57O757uf6JOd54mZ5byA5YWzJ1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vICAgfVxuICAgIC8vICAgaWYgKGlzQW5kcm9pZCAmJiAhc3lzdGVtSW5mby5sb2NhdGlvbkVuYWJsZWQpIHtcbiAgICAvLyAgICAgZWNCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2VDYWxsYmFjayh7XG4gICAgLy8gICAgICAgb2s6IGZhbHNlLFxuICAgIC8vICAgICAgIGVyckNvZGU6IDMwMDAyLFxuICAgIC8vICAgICAgIGVyck1zZzogJ+ivt+aJk+W8gOezu+e7n+WumuS9jeW8gOWFsydcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICAgIHJldHVybjtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGlmIChpc0FuZHJvaWQgJiYgIXN5c3RlbUluZm8ubG9jYXRpb25BdXRob3JpemVkKSB7XG4gICAgLy8gICAgIGVjQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlQ2FsbGJhY2soe1xuICAgIC8vICAgICAgIG9rOiBmYWxzZSxcbiAgICAvLyAgICAgICBlcnJDb2RlOiAzMDAwMyxcbiAgICAvLyAgICAgICBlcnJNc2c6ICfor7fmiZPlvIDlvq7kv6HlrprkvY3mnYPpmZDvvIzlhYHorrjlvq7kv6Hkvb/nlKjmgqjnmoTkvY3nva7kv6Hmga8nXG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICByZXR1cm47XG4gICAgLy8gICB9XG4gICAgLy8gICBjb25zdCBzZXR0aW5nID0gYXdhaXQgZ2V0U2V0dGluZygpOyAvL+Wwj+eoi+W6j+iTneeJmeadg+mZkFxuICAgIC8vICAgaWYgKCFzZXR0aW5nLm9rKSB7XG4gICAgLy8gICAgIGNvbnN0IGF1dGhSZXMgPSBhd2FpdCBhdXRob3JpemUoKTtcbiAgICAvLyAgICAgaWYgKCFhdXRoUmVzLm9rKSB7XG4gICAgLy8gICAgICAgZWNCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2VDYWxsYmFjayh7XG4gICAgLy8gICAgICAgICBvazogZmFsc2UsXG4gICAgLy8gICAgICAgICBlcnJDb2RlOiAzMDAwNCxcbiAgICAvLyAgICAgICAgIGVyck1zZzogJ+ivt+aJk+W8gOWwj+eoi+W6j+iTneeJmeW8gOWFs++8jOeCueWHu+WPs+S4iuinkuS4ieS4queCue+8jOeEtuWQjueCueWHu+iuvue9ridcbiAgICAvLyAgICAgICB9KTtcbiAgICAvLyAgICAgICByZXR1cm47XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH1cbiAgICBqZC5vZmZCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2UoKTtcbiAgICBqZC5vbkJsdWV0b290aEFkYXB0ZXJTdGF0ZUNoYW5nZShyZXMgPT4ge1xuICAgICAgICBsb2cocmVzKTsgLy8ge2F2YWlsYWJsZTogdHJ1ZSwgZGlzY292ZXJpbmc6IHRydWV9XG4gICAgICAgIGlmICghcmVzLmF2YWlsYWJsZSkge1xuICAgICAgICAgICAgZWNCbHVldG9vdGhBZGFwdGVyU3RhdGVDaGFuZ2VDYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVyckNvZGU6IDMwMDA1LFxuICAgICAgICAgICAgICAgIGVyck1zZzogJ+iTneeJmemAgumFjeWZqOS4jeWPr+eUqCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgb3BlblJlcyA9IGF3YWl0IF9vcGVuQmx1ZXRvb3RoQWRhcHRlcigpO1xuICAgIGVjQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlQ2FsbGJhY2sob3BlblJlcyk7XG59O1xuY29uc3Qgb25CbHVldG9vdGhEZXZpY2VGb3VuZCA9IGNiID0+IHtcbiAgICBqZC5vZmZCbHVldG9vdGhEZXZpY2VGb3VuZCgpO1xuICAgIGpkLm9uQmx1ZXRvb3RoRGV2aWNlRm91bmQocmVzID0+IHtcbiAgICAgICAgLy8gbG9nKHJlcyk7XG4gICAgICAgIGNvbnN0IGRldmljZSA9IHJlcy5kZXZpY2VzWzBdO1xuICAgICAgICBjb25zdCBuYW1lID0gZGV2aWNlLm5hbWUgPyBkZXZpY2UubmFtZSA6IGRldmljZS5sb2NhbE5hbWU7XG4gICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBpZCA9IGRldmljZS5kZXZpY2VJZDtcbiAgICAgICAgbGV0IHJzc2kgPSBkZXZpY2UuUlNTSTtcbiAgICAgICAgY2Ioe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgcnNzaVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCBzdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnkgPSAoKSA9PiB7XG4gICAgamQuc3RhcnRCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5KHtcbiAgICAgICAgLy9zZXJ2aWNlczogW2VjU2VydmVySWRdLFxuICAgICAgICBhbGxvd0R1cGxpY2F0ZXNLZXk6IHRydWUsXG4gICAgICAgIHBvd2VyTGV2ZWw6ICdoaWdoJyxcbiAgICAgICAgY29tcGxldGUocmVzKSB7XG4gICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbmNvbnN0IHN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5ID0gKCkgPT4ge1xuICAgIGpkLnN0b3BCbHVldG9vdGhEZXZpY2VzRGlzY292ZXJ5KHtcbiAgICAgICAgY29tcGxldGUocmVzKSB7XG4gICAgICAgICAgICAvLyB7ZXJybm86IDAsIGVyck1zZzogXCJzdG9wQmx1ZXRvb3RoRGV2aWNlc0Rpc2NvdmVyeTpva1wiLCBpc0Rpc2NvdmVyaW5nOiBmYWxzZX1cbiAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuY29uc3Qgb25CTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UgPSBjYiA9PiB7XG4gICAgZWNCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2VDYWxsYmFjayA9IGNiO1xufTtcbmNvbnN0IF9jcmVhdGVCTEVDb25uZWN0aW9uID0gKCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGpkLmNyZWF0ZUJMRUNvbm5lY3Rpb24oe1xuICAgICAgICAgICAgZGV2aWNlSWQ6IGVjRGV2aWNlSWQsXG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8vIHtcImVycm5vXCI6MCxcImVyckNvZGVcIjowLFwiZXJyTXNnXCI6XCJjcmVhdGVCTEVDb25uZWN0aW9uOm9rXCJ9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiAwLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6ICcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbChyZXMpIHtcbiAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICAvLyB7XCJlcnJub1wiOjEwMDEsXCJlcnJNc2dcIjpcImNyZWF0ZUJMRUNvbm5lY3Rpb246ZmFpbCBwYXJhbWV0ZXIgZXJyb3I6IHBhcmFtZXRlci5kZXZpY2VJZCBzaG91bGQgYmUgU3RyaW5nIGluc3RlYWQgb2YgVW5kZWZpbmVkO1wifVxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IHJlcy5lcnJDb2RlID8gcmVzLmVyckNvZGUgOiByZXMuZXJybm8sXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFpc0FuZHJvaWQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGpkLmNyZWF0ZUJMRUNvbm5lY3Rpb24oe1xuICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogZWNEZXZpY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8ge1wiZXJybm9cIjowLFwiZXJyQ29kZVwiOjAsXCJlcnJNc2dcIjpcImNyZWF0ZUJMRUNvbm5lY3Rpb246b2tcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZhaWwocmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHtcImVycm5vXCI6MTAwMSxcImVyck1zZ1wiOlwiY3JlYXRlQkxFQ29ubmVjdGlvbjpmYWlsIHBhcmFtZXRlciBlcnJvcjogcGFyYW1ldGVyLmRldmljZUlkIHNob3VsZCBiZSBTdHJpbmcgaW5zdGVhZCBvZiBVbmRlZmluZWQ7XCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogcmVzLmVyckNvZGUgPyByZXMuZXJyQ29kZSA6IHJlcy5lcnJubyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJNc2c6IHJlcy5lcnJNc2dcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAxMDAwKVxuICAgICAgICB9XG4gICAgfSk7XG59O1xuY29uc3QgZ2V0QkxFRGV2aWNlU2VydmljZXMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgamQuZ2V0QkxFRGV2aWNlU2VydmljZXMoe1xuICAgICAgICAgICAgZGV2aWNlSWQ6IGVjRGV2aWNlSWQsXG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8ve1wic2VydmljZXNcIjpbe1widXVpZFwiOlwiMDAwMEZGRjAtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCXCIsXCJpc1ByaW1hcnlcIjp0cnVlfV0sXCJlcnJDb2RlXCI6MCxcImVycm5vXCI6MCxcImVyck1zZ1wiOlwiZ2V0QkxFRGV2aWNlU2VydmljZXM6b2tcIn1cbiAgICAgICAgICAgICAgICAvLyB7XCJlcnJub1wiOjAsXCJkZXZpY2VJZFwiOlwiN0M3RTIwRjItQ0I3NS02REE4LUY4REYtRkZGNzAyQjBENjNGXCIsXCJzZXJ2aWNlc1wiOlt7XCJpc1ByaW1hcnlcIjp0cnVlLFwidXVpZFwiOlwiMDAwMEZGRjAtMDAwMC0xMDAwLTgwMDAtMDA4MDVGOUIzNEZCXCJ9XSxcImVyck1zZ1wiOlwiZ2V0QkxFRGV2aWNlU2VydmljZXM6b2tcIixcImVyckNvZGVcIjowfVxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogMCxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmljZXM6IHJlcy5zZXJ2aWNlc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWwocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogcmVzLmVyckNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCBnZXRCTEVEZXZpY2VDaGFyYWN0ZXJpc3RpY3MgPSBzZXJ2aWNlSWQgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGpkLmdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyh7XG4gICAgICAgICAgICBkZXZpY2VJZDogZWNEZXZpY2VJZCxcbiAgICAgICAgICAgIHNlcnZpY2VJZCxcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgLy8ge1wiY2hhcmFjdGVyaXN0aWNzXCI6W3tcInV1aWRcIjpcIjAwMDBGRkYyLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQlwiLFwiaGFuZGxlXCI6MyxcInByb3BlcnRpZXNcIjp7XCJyZWFkXCI6ZmFsc2UsXCJ3cml0ZVwiOnRydWUsXCJub3RpZnlcIjpmYWxzZSxcImluZGljYXRlXCI6ZmFsc2UsXCJ3cml0ZU5vUmVzcG9uc2VcIjp0cnVlLFwid3JpdGVEZWZhdWx0XCI6dHJ1ZX19LHtcInV1aWRcIjpcIjAwMDBGRkYxLTAwMDAtMTAwMC04MDAwLTAwODA1RjlCMzRGQlwiLFwiaGFuZGxlXCI6NSxcInByb3BlcnRpZXNcIjp7XCJyZWFkXCI6dHJ1ZSxcIndyaXRlXCI6dHJ1ZSxcIm5vdGlmeVwiOnRydWUsXCJpbmRpY2F0ZVwiOmZhbHNlLFwid3JpdGVOb1Jlc3BvbnNlXCI6dHJ1ZSxcIndyaXRlRGVmYXVsdFwiOnRydWV9fV0sXCJlcnJDb2RlXCI6MCxcImVycm5vXCI6MCxcImVyck1zZ1wiOlwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOm9rXCJ9XG4gICAgICAgICAgICAgICAgLy8ge1wiY2hhcmFjdGVyaXN0aWNzXCI6W3tcInByb3BlcnRpZXNcIjp7XCJ3cml0ZURlZmF1bHRcIjp0cnVlLFwibm90aWZ5XCI6ZmFsc2UsXCJ3cml0ZVwiOnRydWUsXCJpbmRpY2F0ZVwiOmZhbHNlLFwicmVhZFwiOmZhbHNlLFwid3JpdGVOb1Jlc3BvbnNlXCI6dHJ1ZX0sXCJ1dWlkXCI6XCIwMDAwRkZGMi0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkJcIn0se1wicHJvcGVydGllc1wiOntcIndyaXRlRGVmYXVsdFwiOnRydWUsXCJub3RpZnlcIjp0cnVlLFwid3JpdGVcIjp0cnVlLFwiaW5kaWNhdGVcIjpmYWxzZSxcInJlYWRcIjp0cnVlLFwid3JpdGVOb1Jlc3BvbnNlXCI6dHJ1ZX0sXCJ1dWlkXCI6XCIwMDAwRkZGMS0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkJcIn1dLFwiZGV2aWNlSWRcIjpcIjdDN0UyMEYyLUNCNzUtNkRBOC1GOERGLUZGRjcwMkIwRDYzRlwiLFwic2VydmljZUlkXCI6XCIwMDAwRkZGMC0wMDAwLTEwMDAtODAwMC0wMDgwNUY5QjM0RkJcIixcImVycm5vXCI6MCxcImVyck1zZ1wiOlwiZ2V0QkxFRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOm9rXCIsXCJlcnJDb2RlXCI6MH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IDAsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogJycsXG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljczogcmVzLmNoYXJhY3RlcmlzdGljc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWwocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogcmVzLmVyckNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCBub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlID0gKHNlcnZpY2VJZCwgY2hhcmFjdGVyaXN0aWNJZCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGpkLm5vdGlmeUJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2Uoe1xuICAgICAgICAgICAgc3RhdGU6IHRydWUsXG4gICAgICAgICAgICBkZXZpY2VJZDogZWNEZXZpY2VJZCxcbiAgICAgICAgICAgIHNlcnZpY2VJZCxcbiAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljSWQsXG4gICAgICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8vIHtcImVyckNvZGVcIjowLFwiZXJybm9cIjowLFwiZXJyTXNnXCI6XCJub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlOm9rXCJ9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiAwLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6ICcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbChyZXMpIHtcbiAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiByZXMuZXJyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiByZXMuZXJyTXNnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbmNvbnN0IHNldEJMRU1UVSA9IG10dSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgamQuc2V0QkxFTVRVKHtcbiAgICAgICAgICAgIGRldmljZUlkOiBlY0RldmljZUlkLFxuICAgICAgICAgICAgbXR1LFxuICAgICAgICAgICAgc3VjY2VzcyhyZXMpIHtcbiAgICAgICAgICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgICAgICAgICAvLyB7XCJlcnJNc2dcIjpcInNldEJMRU1UVTpva1wiLFwiZXJybm9cIjowLFwiZXJyQ29kZVwiOjAsXCJtdHVcIjo1MH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IDAsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogJydcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWlsKHJlcykge1xuICAgICAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICAgICAgICAgIC8vIHtcImVyckNvZGVcIjotMSxcImVycm5vXCI6MTUwMDEwNCxcImVyck1zZ1wiOlwic2V0QkxFTVRVOmZhaWw6aW50ZXJuYWwgZXJyb3JcIn1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiByZXMuZXJyQ29kZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiByZXMuZXJyTXNnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcbi8v5ZKM6K6+5aSH5bu656uL6L+e5o6lXG5jb25zdCBjcmVhdGVCTEVDb25uZWN0aW9uID0gYXN5bmMgaWQgPT4ge1xuICAgIGVjRGV2aWNlSWQgPSBpZDtcbiAgICBqZC5vZmZCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2UoKTtcbiAgICBqZC5vbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShhc3luYyByZXMgPT4ge1xuICAgICAgICBsb2cocmVzKTtcbiAgICAgICAgLy8ge1wiZGV2aWNlSWRcIjpcIkVDOjIyOjA1OjEzOjc4OjQ5XCIsXCJjb25uZWN0ZWRcIjp0cnVlfVxuICAgICAgICBpZiAocmVzLmNvbm5lY3RlZCkge1xuICAgICAgICAgICAgY29uc3Qgc2VydmljZXNSZXN1bHQgPSBhd2FpdCBnZXRCTEVEZXZpY2VTZXJ2aWNlcygpO1xuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlc1Jlc3VsdC5vaykge1xuICAgICAgICAgICAgICAgIGVjQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlQ2FsbGJhY2soc2VydmljZXNSZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNsb3NlQkxFQ29ubmVjdGlvbigpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiBzZXJ2aWNlc1Jlc3VsdC5zZXJ2aWNlcykge1xuICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlLnV1aWQudG9VcHBlckNhc2UoKSA9PT0gZWNHYXR0U2VydmVyVVVJRE9wdGlvbjEgfHwgc2VydmljZS51dWlkLnRvVXBwZXJDYXNlKCkgPT09IGVjR2F0dFNlcnZlclVVSURPcHRpb24yKSB7XG4gICAgICAgICAgICAgICAgICAgIGVjR2F0dFNlcnZlclVVSUQgPSBzZXJ2aWNlLnV1aWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJhY3RlcmlzdGljc1Jlc3VsdCA9IGF3YWl0IGdldEJMRURldmljZUNoYXJhY3RlcmlzdGljcyhzZXJ2aWNlLnV1aWQpO1xuICAgICAgICAgICAgICAgIGlmICghY2hhcmFjdGVyaXN0aWNzUmVzdWx0Lm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIGVjQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlQ2FsbGJhY2soY2hhcmFjdGVyaXN0aWNzUmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VCTEVDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGFyYWN0ZXJpc3RpYyBvZiBjaGFyYWN0ZXJpc3RpY3NSZXN1bHQuY2hhcmFjdGVyaXN0aWNzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJpc3RpYy5wcm9wZXJ0aWVzICYmIGNoYXJhY3RlcmlzdGljLnByb3BlcnRpZXMubm90aWZ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub3RpZnlSZXN1bHQgPSBhd2FpdCBub3RpZnlCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlKHNlcnZpY2UudXVpZCwgY2hhcmFjdGVyaXN0aWMudXVpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5vdGlmeVJlc3VsdC5vaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlQ2FsbGJhY2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IDMwMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJNc2c6ICdub3RpZnkgZXJyb3InXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VCTEVDb25uZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXJpc3RpYy51dWlkLnRvVXBwZXJDYXNlKCkgPT09IGVjR2F0dENoYXJhY3RlcmlzdGljV3JpdGVVVUlET3B0aW9uMSB8fCBjaGFyYWN0ZXJpc3RpYy51dWlkLnRvVXBwZXJDYXNlKCkgPT09IGVjR2F0dENoYXJhY3RlcmlzdGljV3JpdGVVVUlET3B0aW9uMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSUQgPSBjaGFyYWN0ZXJpc3RpYy51dWlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQW5kcm9pZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNldEJMRU1UVSgyNDcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWNCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2VDYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgb2s6IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyQ29kZTogMCxcbiAgICAgICAgICAgICAgICBlcnJNc2c6ICcnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVjQkxFQ29ubmVjdGlvblN0YXRlQ2hhbmdlQ2FsbGJhY2soe1xuICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlcnJDb2RlOiAwLFxuICAgICAgICAgICAgICAgIGVyck1zZzogJ2Rpc2Nvbm5lY3QnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IF9jcmVhdGVCTEVDb25uZWN0aW9uKCk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgZWNCTEVDb25uZWN0aW9uU3RhdGVDaGFuZ2VDYWxsYmFjayhyZXMpO1xuICAgIH1cbn07XG4vL+WFs+mXreW9k+WJjei/nuaOpVxuY29uc3QgY2xvc2VCTEVDb25uZWN0aW9uID0gKCkgPT4ge1xuICAgIGpkLmNsb3NlQkxFQ29ubmVjdGlvbih7XG4gICAgICAgIGRldmljZUlkOiBlY0RldmljZUlkLFxuICAgICAgICBjb21wbGV0ZShyZXMpIHtcbiAgICAgICAgICAgIGxvZyhyZXMpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuY29uc3Qgb25CTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlQ2hhbmdlID0gY2IgPT4ge1xuICAgIGpkLm9mZkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UoKTtcbiAgICBqZC5vbkJMRUNoYXJhY3RlcmlzdGljVmFsdWVDaGFuZ2UocmVzID0+IHtcbiAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgIGxldCB4ID0gbmV3IFVpbnQ4QXJyYXkocmVzLnZhbHVlKTtcbiAgICAgICAgbG9nKHgpO1xuICAgICAgICBsZXQgc3RyID0gdXRmOEJ5dGVzVG9TdHIoeCk7XG4gICAgICAgIGxldCBzdHJIZXggPSAnJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdHJIZXggPSBzdHJIZXggKyB4W2ldLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKHN0cik7XG4gICAgICAgIGxvZyhzdHJIZXgpO1xuICAgICAgICBjYihzdHIsIHN0ckhleCk7XG4gICAgfSk7XG59O1xuY29uc3QgX3dyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZSA9IGJ1ZmZlciA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgamQud3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlKHtcbiAgICAgICAgICAgIGRldmljZUlkOiBlY0RldmljZUlkLFxuICAgICAgICAgICAgc2VydmljZUlkOiBlY0dhdHRTZXJ2ZXJVVUlELFxuICAgICAgICAgICAgY2hhcmFjdGVyaXN0aWNJZDogZWNHYXR0Q2hhcmFjdGVyaXN0aWNXcml0ZVVVSUQsXG4gICAgICAgICAgICB2YWx1ZTogYnVmZmVyLFxuICAgICAgICAgICAgd3JpdGVUeXBlOiAnd3JpdGVOb1Jlc3BvbnNlJyxcbiAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgLy8ge1wiZXJybm9cIjowLFwiZXJyQ29kZVwiOjAsXCJlcnJNc2dcIjpcIndyaXRlQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZTpva1wifVxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogMCxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiAnJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWwocmVzKSB7XG4gICAgICAgICAgICAgICAgbG9nKHJlcyk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogcmVzLmVyckNvZGUsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogcmVzLmVyck1zZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5jb25zdCB3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWUgPSBhc3luYyAoc3RyLCBpc0hleCkgPT4ge1xuICAgIGlmIChzdHIubGVuZ3RoID09PSAwKSByZXR1cm4ge1xuICAgICAgICBvazogZmFsc2UsXG4gICAgICAgIGVyckNvZGU6IDMwMDAwLFxuICAgICAgICBlcnJNc2c6ICdkYXRhIGlzIG51bGwnXG4gICAgfTtcbiAgICBsZXQgYnVmZmVyO1xuICAgIGlmIChpc0hleCkge1xuICAgICAgICBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoc3RyLmxlbmd0aCAvIDIpO1xuICAgICAgICBsZXQgeCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgeFtpXSA9IHBhcnNlSW50KHN0ci5zdWJzdHIoMiAqIGksIDIpLCAxNik7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheShzdHJUb1V0ZjhCeXRlcyhzdHIpKS5idWZmZXI7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBfd3JpdGVCTEVDaGFyYWN0ZXJpc3RpY1ZhbHVlKGJ1ZmZlcik7XG59O1xuY29uc3QgdXRmOEJ5dGVzVG9TdHIgPSB1dGY4Qnl0ZXMgPT4ge1xuICAgIGxldCB1bmljb2RlU3RyID0gJyc7XG4gICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgdXRmOEJ5dGVzLmxlbmd0aDspIHtcbiAgICAgICAgbGV0IGZsYWcgPSB1dGY4Qnl0ZXNbcG9zXTtcbiAgICAgICAgbGV0IHVuaWNvZGUgPSAwO1xuICAgICAgICBpZiAoZmxhZyA+Pj4gNyA9PT0gMCkge1xuICAgICAgICAgICAgdW5pY29kZVN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHV0ZjhCeXRlc1twb3NdKTtcbiAgICAgICAgICAgIHBvcyArPSAxO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2UgaWYgKChmbGFnICYgMHhGQykgPT09IDB4RkMpIHtcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgPSAodXRmOEJ5dGVzW3Bvc10gJiAweDMpIDw8IDMwXG4gICAgICAgIC8vICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNGKSA8PCAyNFxuICAgICAgICAvLyAgICAgdW5pY29kZSB8PSAodXRmOEJ5dGVzW3BvcyArIDJdICYgMHgzRikgPDwgMThcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgfD0gKHV0ZjhCeXRlc1twb3MgKyAzXSAmIDB4M0YpIDw8IDEyXG4gICAgICAgIC8vICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgNF0gJiAweDNGKSA8PCA2XG4gICAgICAgIC8vICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgNV0gJiAweDNGKVxuICAgICAgICAvLyAgICAgdW5pY29kZVN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpXG4gICAgICAgIC8vICAgICBwb3MgKz0gNlxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGVsc2UgaWYgKChmbGFnICYgMHhGOCkgPT09IDB4RjgpIHtcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgPSAodXRmOEJ5dGVzW3Bvc10gJiAweDcpIDw8IDI0XG4gICAgICAgIC8vICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNGKSA8PCAxOFxuICAgICAgICAvLyAgICAgdW5pY29kZSB8PSAodXRmOEJ5dGVzW3BvcyArIDJdICYgMHgzRikgPDwgMTJcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgfD0gKHV0ZjhCeXRlc1twb3MgKyAzXSAmIDB4M0YpIDw8IDZcbiAgICAgICAgLy8gICAgIHVuaWNvZGUgfD0gKHV0ZjhCeXRlc1twb3MgKyA0XSAmIDB4M0YpXG4gICAgICAgIC8vICAgICB1bmljb2RlU3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSlcbiAgICAgICAgLy8gICAgIHBvcyArPSA1XG4gICAgICAgIC8vIH1cbiAgICAgICAgZWxzZSBpZiAoKGZsYWcgJiAweGYwKSA9PT0gMHhmMCkge1xuICAgICAgICAgICAgdW5pY29kZSA9ICh1dGY4Qnl0ZXNbcG9zXSAmIDB4ZikgPDwgMTg7XG4gICAgICAgICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNmKSA8PCAxMjtcbiAgICAgICAgICAgIHVuaWNvZGUgfD0gKHV0ZjhCeXRlc1twb3MgKyAyXSAmIDB4M2YpIDw8IDY7XG4gICAgICAgICAgICB1bmljb2RlIHw9IHV0ZjhCeXRlc1twb3MgKyAzXSAmIDB4M2Y7XG4gICAgICAgICAgICB1bmljb2RlU3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodW5pY29kZSk7XG4gICAgICAgICAgICBwb3MgKz0gNDtcbiAgICAgICAgfSBlbHNlIGlmICgoZmxhZyAmIDB4ZTApID09PSAweGUwKSB7XG4gICAgICAgICAgICB1bmljb2RlID0gKHV0ZjhCeXRlc1twb3NdICYgMHgxZikgPDwgMTI7XG4gICAgICAgICAgICB1bmljb2RlIHw9ICh1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNmKSA8PCA2O1xuICAgICAgICAgICAgdW5pY29kZSB8PSB1dGY4Qnl0ZXNbcG9zICsgMl0gJiAweDNmO1xuICAgICAgICAgICAgdW5pY29kZVN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpO1xuICAgICAgICAgICAgcG9zICs9IDM7XG4gICAgICAgIH0gZWxzZSBpZiAoKGZsYWcgJiAweGMwKSA9PT0gMHhjMCkge1xuICAgICAgICAgICAgLy8xMTBcbiAgICAgICAgICAgIHVuaWNvZGUgPSAodXRmOEJ5dGVzW3Bvc10gJiAweDNmKSA8PCA2O1xuICAgICAgICAgICAgdW5pY29kZSB8PSB1dGY4Qnl0ZXNbcG9zICsgMV0gJiAweDNmO1xuICAgICAgICAgICAgdW5pY29kZVN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHVuaWNvZGUpO1xuICAgICAgICAgICAgcG9zICs9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bmljb2RlU3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodXRmOEJ5dGVzW3Bvc10pO1xuICAgICAgICAgICAgcG9zICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuaWNvZGVTdHI7XG59O1xuY29uc3Qgc3RyVG9VdGY4Qnl0ZXMgPSBzdHIgPT4ge1xuICAgIGxldCBieXRlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGxldCBjb2RlID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjb2RlID49IDB4MTAwMDAgJiYgY29kZSA8PSAweDEwZmZmZikge1xuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDE4IHwgMHhmMCk7IC8vIOesrOS4gOS4quWtl+iKglxuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDEyICYgMHgzZiB8IDB4ODApO1xuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDYgJiAweDNmIHwgMHg4MCk7XG4gICAgICAgICAgICBieXRlcy5wdXNoKGNvZGUgJiAweDNmIHwgMHg4MCk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29kZSA+PSAweDgwMCAmJiBjb2RlIDw9IDB4ZmZmZikge1xuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDEyIHwgMHhlMCk7XG4gICAgICAgICAgICBieXRlcy5wdXNoKGNvZGUgPj4gNiAmIDB4M2YgfCAweDgwKTtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goY29kZSAmIDB4M2YgfCAweDgwKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2RlID49IDB4ODAgJiYgY29kZSA8PSAweDdmZikge1xuICAgICAgICAgICAgYnl0ZXMucHVzaChjb2RlID4+IDYgfCAweGMwKTtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goY29kZSAmIDB4M2YgfCAweDgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goY29kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG9uQmx1ZXRvb3RoQWRhcHRlclN0YXRlQ2hhbmdlLFxuICAgIG9wZW5CbHVldG9vdGhBZGFwdGVyLFxuXG4gICAgb25CbHVldG9vdGhEZXZpY2VGb3VuZCxcbiAgICBzdGFydEJsdWV0b290aERldmljZXNEaXNjb3ZlcnksXG4gICAgc3RvcEJsdWV0b290aERldmljZXNEaXNjb3ZlcnksXG5cbiAgICBvbkJMRUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSxcbiAgICBjcmVhdGVCTEVDb25uZWN0aW9uLFxuICAgIGNsb3NlQkxFQ29ubmVjdGlvbixcblxuICAgIG9uQkxFQ2hhcmFjdGVyaXN0aWNWYWx1ZUNoYW5nZSxcbiAgICB3cml0ZUJMRUNoYXJhY3RlcmlzdGljVmFsdWVcbn07IiwiLy8gVE9ETyhCYWJlbCA4KTogUmVtb3ZlIHRoaXMgZmlsZS5cblxudmFyIHJ1bnRpbWUgPSByZXF1aXJlKCdAYmFiZWwvcnVudGltZS9oZWxwZXJzL3JlZ2VuZXJhdG9yUnVudGltZScpKClcbm1vZHVsZS5leHBvcnRzID0gcnVudGltZVxuIiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiLi90eXBlb2YuanNcIilbXCJkZWZhdWx0XCJdO1xuZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8qISByZWdlbmVyYXRvci1ydW50aW1lIC0tIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLiAtLSBsaWNlbnNlIChNSVQpOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvYmxvYi9tYWluL0xJQ0VOU0UgKi9cbiAgbW9kdWxlLmV4cG9ydHMgPSBfcmVnZW5lcmF0b3JSdW50aW1lID0gZnVuY3Rpb24gX3JlZ2VuZXJhdG9yUnVudGltZSgpIHtcbiAgICByZXR1cm4gZXhwb3J0cztcbiAgfSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzO1xuICB2YXIgZXhwb3J0cyA9IHt9LFxuICAgIE9wID0gT2JqZWN0LnByb3RvdHlwZSxcbiAgICBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eSxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB8fCBmdW5jdGlvbiAob2JqLCBrZXksIGRlc2MpIHtcbiAgICAgIG9ialtrZXldID0gZGVzYy52YWx1ZTtcbiAgICB9LFxuICAgICRTeW1ib2wgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LFxuICAgIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIixcbiAgICBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCIsXG4gICAgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwXG4gICAgfSksIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3IsXG4gICAgICBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSksXG4gICAgICBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShnZW5lcmF0b3IsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KVxuICAgIH0pLCBnZW5lcmF0b3I7XG4gIH1cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwibm9ybWFsXCIsXG4gICAgICAgIGFyZzogZm4uY2FsbChvYmosIGFyZylcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInRocm93XCIsXG4gICAgICAgIGFyZzogZXJyXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIGRlZmluZShJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSk7XG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZixcbiAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiYgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkgJiYgKEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUpO1xuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPSBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAoXCJ0aHJvd1wiICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZyxcbiAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICYmIFwib2JqZWN0XCIgPT0gX3R5cGVvZih2YWx1ZSkgJiYgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSA/IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KSA6IFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHVud3JhcHBlZCkge1xuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZCwgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgIH1cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuICAgIGRlZmluZVByb3BlcnR5KHRoaXMsIFwiX2ludm9rZVwiLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUobWV0aG9kLCBhcmcpIHtcbiAgICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9IHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLCBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZykgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoXCJleGVjdXRpbmdcIiA9PT0gc3RhdGUpIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICBpZiAoXCJjb21wbGV0ZWRcIiA9PT0gc3RhdGUpIHtcbiAgICAgICAgaWYgKFwidGhyb3dcIiA9PT0gbWV0aG9kKSB0aHJvdyBhcmc7XG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnRleHQubWV0aG9kID0gbWV0aG9kLCBjb250ZXh0LmFyZyA9IGFyZzs7KSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFwibmV4dFwiID09PSBjb250ZXh0Lm1ldGhvZCkgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO2Vsc2UgaWYgKFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHtcbiAgICAgICAgICBpZiAoXCJzdXNwZW5kZWRTdGFydFwiID09PSBzdGF0ZSkgdGhyb3cgc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0LmFyZztcbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcbiAgICAgICAgfSBlbHNlIFwicmV0dXJuXCIgPT09IGNvbnRleHQubWV0aG9kICYmIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgc3RhdGUgPSBcImV4ZWN1dGluZ1wiO1xuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChcIm5vcm1hbFwiID09PSByZWNvcmQudHlwZSkge1xuICAgICAgICAgIGlmIChzdGF0ZSA9IGNvbnRleHQuZG9uZSA/IFwiY29tcGxldGVkXCIgOiBcInN1c3BlbmRlZFlpZWxkXCIsIHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSAmJiAoc3RhdGUgPSBcImNvbXBsZXRlZFwiLCBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIiwgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kTmFtZSA9IGNvbnRleHQubWV0aG9kLFxuICAgICAgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbbWV0aG9kTmFtZV07XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gbWV0aG9kKSByZXR1cm4gY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIFwidGhyb3dcIiA9PT0gbWV0aG9kTmFtZSAmJiBkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSAmJiAoY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiLCBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZCwgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCksIFwidGhyb3dcIiA9PT0gY29udGV4dC5tZXRob2QpIHx8IFwicmV0dXJuXCIgIT09IG1ldGhvZE5hbWUgJiYgKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICdcIiArIG1ldGhvZE5hbWUgKyBcIicgbWV0aG9kXCIpKSwgQ29udGludWVTZW50aW5lbDtcbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSByZXR1cm4gY29udGV4dC5tZXRob2QgPSBcInRocm93XCIsIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZywgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWw7XG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuICAgIHJldHVybiBpbmZvID8gaW5mby5kb25lID8gKGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlLCBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jLCBcInJldHVyblwiICE9PSBjb250ZXh0Lm1ldGhvZCAmJiAoY29udGV4dC5tZXRob2QgPSBcIm5leHRcIiwgY29udGV4dC5hcmcgPSB1bmRlZmluZWQpLCBjb250ZXh0LmRlbGVnYXRlID0gbnVsbCwgQ29udGludWVTZW50aW5lbCkgOiBpbmZvIDogKGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiLCBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKSwgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGwsIENvbnRpbnVlU2VudGluZWwpO1xuICB9XG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0ge1xuICAgICAgdHJ5TG9jOiBsb2NzWzBdXG4gICAgfTtcbiAgICAxIGluIGxvY3MgJiYgKGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXSksIDIgaW4gbG9jcyAmJiAoZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl0sIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiLCBkZWxldGUgcmVjb3JkLmFyZywgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3tcbiAgICAgIHRyeUxvYzogXCJyb290XCJcbiAgICB9XSwgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTtcbiAgfVxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgaXRlcmFibGUubmV4dCkgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsXG4gICAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgICBmb3IgKDsgKytpIDwgaXRlcmFibGUubGVuZ3RoOykge1xuICAgICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSByZXR1cm4gbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldLCBuZXh0LmRvbmUgPSAhMSwgbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXh0LnZhbHVlID0gdW5kZWZpbmVkLCBuZXh0LmRvbmUgPSAhMCwgbmV4dDtcbiAgICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGRvbmVSZXN1bHRcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBkb25lOiAhMFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmVQcm9wZXJ0eShHcCwgXCJjb25zdHJ1Y3RvclwiLCB7XG4gICAgdmFsdWU6IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIGNvbmZpZ3VyYWJsZTogITBcbiAgfSksIGRlZmluZVByb3BlcnR5KEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICB2YWx1ZTogR2VuZXJhdG9yRnVuY3Rpb24sXG4gICAgY29uZmlndXJhYmxlOiAhMFxuICB9KSwgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpLCBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGdlbkZ1biAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuICEhY3RvciAmJiAoY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHwgXCJHZW5lcmF0b3JGdW5jdGlvblwiID09PSAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpKTtcbiAgfSwgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24gKGdlbkZ1bikge1xuICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSkgOiAoZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLCBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKSksIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKSwgZ2VuRnVuO1xuICB9LCBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24gKGFyZykge1xuICAgIHJldHVybiB7XG4gICAgICBfX2F3YWl0OiBhcmdcbiAgICB9O1xuICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpLCBkZWZpbmUoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUsIGFzeW5jSXRlcmF0b3JTeW1ib2wsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3IsIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbiAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgdm9pZCAwID09PSBQcm9taXNlSW1wbCAmJiAoUHJvbWlzZUltcGwgPSBQcm9taXNlKTtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLCBQcm9taXNlSW1wbCk7XG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKSA/IGl0ZXIgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgIH0pO1xuICB9LCBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApLCBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKSwgZGVmaW5lKEdwLCBpdGVyYXRvclN5bWJvbCwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZGVmaW5lKEdwLCBcInRvU3RyaW5nXCIsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfSksIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YXIgb2JqZWN0ID0gT2JqZWN0KHZhbCksXG4gICAgICBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIHJldHVybiBrZXlzLnJldmVyc2UoKSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIGZvciAoOyBrZXlzLmxlbmd0aDspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSByZXR1cm4gbmV4dC52YWx1ZSA9IGtleSwgbmV4dC5kb25lID0gITEsIG5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV4dC5kb25lID0gITAsIG5leHQ7XG4gICAgfTtcbiAgfSwgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXMsIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldChza2lwVGVtcFJlc2V0KSB7XG4gICAgICBpZiAodGhpcy5wcmV2ID0gMCwgdGhpcy5uZXh0ID0gMCwgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZCwgdGhpcy5kb25lID0gITEsIHRoaXMuZGVsZWdhdGUgPSBudWxsLCB0aGlzLm1ldGhvZCA9IFwibmV4dFwiLCB0aGlzLmFyZyA9IHVuZGVmaW5lZCwgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSksICFza2lwVGVtcFJlc2V0KSBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgXCJ0XCIgPT09IG5hbWUuY2hhckF0KDApICYmIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmICFpc05hTigrbmFtZS5zbGljZSgxKSkgJiYgKHRoaXNbbmFtZV0gPSB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHRoaXMuZG9uZSA9ICEwO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtcbiAgICAgIGlmIChcInRocm93XCIgPT09IHJvb3RSZWNvcmQudHlwZSkgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uIGRpc3BhdGNoRXhjZXB0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJldHVybiByZWNvcmQudHlwZSA9IFwidGhyb3dcIiwgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbiwgY29udGV4dC5uZXh0ID0gbG9jLCBjYXVnaHQgJiYgKGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCIsIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkKSwgISFjYXVnaHQ7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXSxcbiAgICAgICAgICByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICBpZiAoXCJyb290XCIgPT09IGVudHJ5LnRyeUxvYykgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKSxcbiAgICAgICAgICAgIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsICEwKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgITApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc0ZpbmFsbHkpIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uIGFicnVwdCh0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJiBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZpbmFsbHlFbnRyeSAmJiAoXCJicmVha1wiID09PSB0eXBlIHx8IFwiY29udGludWVcIiA9PT0gdHlwZSkgJiYgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiYgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jICYmIChmaW5hbGx5RW50cnkgPSBudWxsKTtcbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmV0dXJuIHJlY29yZC50eXBlID0gdHlwZSwgcmVjb3JkLmFyZyA9IGFyZywgZmluYWxseUVudHJ5ID8gKHRoaXMubWV0aG9kID0gXCJuZXh0XCIsIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jLCBDb250aW51ZVNlbnRpbmVsKSA6IHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbiBjb21wbGV0ZShyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAoXCJ0aHJvd1wiID09PSByZWNvcmQudHlwZSkgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIHJldHVybiBcImJyZWFrXCIgPT09IHJlY29yZC50eXBlIHx8IFwiY29udGludWVcIiA9PT0gcmVjb3JkLnR5cGUgPyB0aGlzLm5leHQgPSByZWNvcmQuYXJnIDogXCJyZXR1cm5cIiA9PT0gcmVjb3JkLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnLCB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCIsIHRoaXMubmV4dCA9IFwiZW5kXCIpIDogXCJub3JtYWxcIiA9PT0gcmVjb3JkLnR5cGUgJiYgYWZ0ZXJMb2MgJiYgKHRoaXMubmV4dCA9IGFmdGVyTG9jKSwgQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuICAgIGZpbmlzaDogZnVuY3Rpb24gZmluaXNoKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykgcmV0dXJuIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpLCByZXNldFRyeUVudHJ5KGVudHJ5KSwgQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24gX2NhdGNoKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChcInRocm93XCIgPT09IHJlY29yZC50eXBlKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiBkZWxlZ2F0ZVlpZWxkKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH0sIFwibmV4dFwiID09PSB0aGlzLm1ldGhvZCAmJiAodGhpcy5hcmcgPSB1bmRlZmluZWQpLCBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfSwgZXhwb3J0cztcbn1cbm1vZHVsZS5leHBvcnRzID0gX3JlZ2VuZXJhdG9yUnVudGltZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICB9XG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBfYXN5bmNUb0dlbmVyYXRvciwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IG1vZHVsZS5leHBvcnRzOyJdLCJzb3VyY2VSb290IjoiIn0=
|