blob: a83ffe33f7d292e12388e3de9ddf414706fae96c [file] [log] [blame]
(this.nativeLog || function(s) {console.log(s)})('START WEEX HTML5: 0.5.0, Build 2017-08-14 14:07.');
;(this.getJSFMVersion = function(){return "0.21.9"});
var global = this, process = { env: {} };var setTimeout = global.setTimeout;
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.Weex = factory());
}(this, (function () { 'use strict';
function __$styleInject(css, returnValue) {
if (typeof document === 'undefined') {
return returnValue;
}
css = css || '';
var head = document.head || document.getElementsByTagName('head')[0];
var style = document.createElement('style');
style.type = 'text/css';
head.appendChild(style);
if (style.styleSheet){
style.styleSheet.cssText = css;
} else {
style.appendChild(document.createTextNode(css));
}
return returnValue;
}
__$styleInject("* {\n margin: 0;\n padding: 0;\n text-size-adjust: none;\n}\n\nul, ol {\n list-style: none;\n}\n\n.weex-container {\n box-sizing: border-box;\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-flex-direction: column;\n flex-direction: column;\n -webkit-flex-shrink: 0;\n flex-shrink: 0;\n -webkit-flex-grow: 0;\n flex-grow: 0;\n -webkit-flex-basis: auto;\n flex-basis: auto;\n align-items: stretch;\n box-align: stretch;\n align-content: flex-start;\n position: relative;\n border: 0 solid black;\n margin: 0;\n padding: 0;\n min-width: 0;\n}\n\n.weex-element {\n box-sizing: border-box;\n position: relative;\n -webkit-flex-shrink: 0;\n flex-shrink: 0;\n -webkit-flex-grow: 0;\n flex-grow: 0;\n -webkit-flex-basis: auto;\n flex-basis: auto;\n border: 0 solid black;\n margin: 0;\n padding: 0;\n min-width: 0;\n}\n",undefined);
var subversion = {"browser":"0.5.0","framework":"0.21.9","vue-render":"0.12.3","transformer":">=0.1.5 <0.5"};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
// Production steps of ECMA-262, Edition 6, 22.1.2.1
// Reference: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-array.from
/* istanbul ignore if */
if (!Array.from) {
Array.from = (function() {
var toStr = Object.prototype.toString;
var isCallable = function(fn) {
return typeof fn === 'function' || toStr.call(fn) === '[object Function]';
};
var toInteger = function(value) {
var number = Number(value);
if (isNaN(number)) {
return 0;
}
if (number === 0 || !isFinite(number)) {
return number;
}
return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));
};
var maxSafeInteger = Math.pow(2, 53) - 1;
var toLength = function(value) {
var len = toInteger(value);
return Math.min(Math.max(len, 0), maxSafeInteger);
};
// The length property of the from method is 1.
return function from(arrayLike/*, mapFn, thisArg */) {
// 1. Let C be the this value.
var C = this;
// 2. Let items be ToObject(arrayLike).
var items = Object(arrayLike);
// 3. ReturnIfAbrupt(items).
if (arrayLike == null) {
throw new TypeError('Array.from requires an array-like object - not null or undefined');
}
// 4. If mapfn is undefined, then let mapping be false.
var mapFn = arguments.length > 1 ? arguments[1] : void undefined;
var T;
if (typeof mapFn !== 'undefined') {
// 5. else
// 5. a If IsCallable(mapfn) is false, throw a TypeError exception.
if (!isCallable(mapFn)) {
throw new TypeError('Array.from: when provided, the second argument must be a function');
}
// 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.
if (arguments.length > 2) {
T = arguments[2];
}
}
// 10. Let lenValue be Get(items, "length").
// 11. Let len be ToLength(lenValue).
var len = toLength(items.length);
// 13. If IsConstructor(C) is true, then
// 13. a. Let A be the result of calling the [[Construct]] internal method of C with an argument list containing the single item len.
// 14. a. Else, Let A be ArrayCreate(len).
var A = isCallable(C) ? Object(new C(len)) : new Array(len);
// 16. Let k be 0.
var k = 0;
// 17. Repeat, while k < len… (also steps a - h)
var kValue;
while (k < len) {
kValue = items[k];
if (mapFn) {
A[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);
} else {
A[k] = kValue;
}
k += 1;
}
// 18. Let putStatus be Put(A, "length", len, true).
A.length = len;
// 20. Return A.
return A;
};
}());
}
var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function unwrapExports (x) {
return x && x.__esModule ? x['default'] : x;
}
function createCommonjsModule(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var _global = createCommonjsModule(function (module) {
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global = module.exports = typeof window != 'undefined' && window.Math == Math
? window : typeof self != 'undefined' && self.Math == Math ? self
// eslint-disable-next-line no-new-func
: Function('return this')();
if (typeof __g == 'number') { __g = global; } // eslint-disable-line no-undef
});
var _core = createCommonjsModule(function (module) {
var core = module.exports = { version: '2.5.0' };
if (typeof __e == 'number') { __e = core; } // eslint-disable-line no-undef
});
var _isObject = function (it) {
return typeof it === 'object' ? it !== null : typeof it === 'function';
};
var isObject = _isObject;
var _anObject = function (it) {
if (!isObject(it)) { throw TypeError(it + ' is not an object!'); }
return it;
};
var _fails = function (exec) {
try {
return !!exec();
} catch (e) {
return true;
}
};
// Thank's IE8 for his funny defineProperty
var _descriptors = !_fails(function () {
return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
});
var isObject$1 = _isObject;
var document$1 = _global.document;
// typeof document.createElement is 'object' in old IE
var is = isObject$1(document$1) && isObject$1(document$1.createElement);
var _domCreate = function (it) {
return is ? document$1.createElement(it) : {};
};
var _ie8DomDefine = !_descriptors && !_fails(function () {
return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;
});
// 7.1.1 ToPrimitive(input [, PreferredType])
var isObject$2 = _isObject;
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
// and the second argument - flag - preferred type is a string
var _toPrimitive = function (it, S) {
if (!isObject$2(it)) { return it; }
var fn, val;
if (S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))) { return val; }
if (typeof (fn = it.valueOf) == 'function' && !isObject$2(val = fn.call(it))) { return val; }
if (!S && typeof (fn = it.toString) == 'function' && !isObject$2(val = fn.call(it))) { return val; }
throw TypeError("Can't convert object to primitive value");
};
var anObject = _anObject;
var IE8_DOM_DEFINE = _ie8DomDefine;
var toPrimitive = _toPrimitive;
var dP$1 = Object.defineProperty;
var f$1 = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {
anObject(O);
P = toPrimitive(P, true);
anObject(Attributes);
if (IE8_DOM_DEFINE) { try {
return dP$1(O, P, Attributes);
} catch (e) { /* empty */ } }
if ('get' in Attributes || 'set' in Attributes) { throw TypeError('Accessors not supported!'); }
if ('value' in Attributes) { O[P] = Attributes.value; }
return O;
};
var _objectDp = {
f: f$1
};
var _propertyDesc = function (bitmap, value) {
return {
enumerable: !(bitmap & 1),
configurable: !(bitmap & 2),
writable: !(bitmap & 4),
value: value
};
};
var dP = _objectDp;
var createDesc = _propertyDesc;
var _hide = _descriptors ? function (object, key, value) {
return dP.f(object, key, createDesc(1, value));
} : function (object, key, value) {
object[key] = value;
return object;
};
var hasOwnProperty = {}.hasOwnProperty;
var _has = function (it, key) {
return hasOwnProperty.call(it, key);
};
var id = 0;
var px = Math.random();
var _uid = function (key) {
return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};
var _redefine = createCommonjsModule(function (module) {
var global = _global;
var hide = _hide;
var has = _has;
var SRC = _uid('src');
var TO_STRING = 'toString';
var $toString = Function[TO_STRING];
var TPL = ('' + $toString).split(TO_STRING);
_core.inspectSource = function (it) {
return $toString.call(it);
};
(module.exports = function (O, key, val, safe) {
var isFunction = typeof val == 'function';
if (isFunction) { has(val, 'name') || hide(val, 'name', key); }
if (O[key] === val) { return; }
if (isFunction) { has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); }
if (O === global) {
O[key] = val;
} else if (!safe) {
delete O[key];
hide(O, key, val);
} else if (O[key]) {
O[key] = val;
} else {
hide(O, key, val);
}
// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
})(Function.prototype, TO_STRING, function toString() {
return typeof this == 'function' && this[SRC] || $toString.call(this);
});
});
var _aFunction = function (it) {
if (typeof it != 'function') { throw TypeError(it + ' is not a function!'); }
return it;
};
// optional / simple context binding
var aFunction = _aFunction;
var _ctx = function (fn, that, length) {
aFunction(fn);
if (that === undefined) { return fn; }
switch (length) {
case 1: return function (a) {
return fn.call(that, a);
};
case 2: return function (a, b) {
return fn.call(that, a, b);
};
case 3: return function (a, b, c) {
return fn.call(that, a, b, c);
};
}
return function (/* ...args */) {
return fn.apply(that, arguments);
};
};
var global$1 = _global;
var core = _core;
var hide = _hide;
var redefine = _redefine;
var ctx = _ctx;
var PROTOTYPE = 'prototype';
var $export$1 = function (type, name, source) {
var IS_FORCED = type & $export$1.F;
var IS_GLOBAL = type & $export$1.G;
var IS_STATIC = type & $export$1.S;
var IS_PROTO = type & $export$1.P;
var IS_BIND = type & $export$1.B;
var target = IS_GLOBAL ? global$1 : IS_STATIC ? global$1[name] || (global$1[name] = {}) : (global$1[name] || {})[PROTOTYPE];
var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
var key, own, out, exp;
if (IS_GLOBAL) { source = name; }
for (key in source) {
// contains in native
own = !IS_FORCED && target && target[key] !== undefined;
// export native or passed
out = (own ? target : source)[key];
// bind timers to global for call from export context
exp = IS_BIND && own ? ctx(out, global$1) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
// extend global
if (target) { redefine(target, key, out, type & $export$1.U); }
// export
if (exports[key] != out) { hide(exports, key, exp); }
if (IS_PROTO && expProto[key] != out) { expProto[key] = out; }
}
};
global$1.core = core;
// type bitmap
$export$1.F = 1; // forced
$export$1.G = 2; // global
$export$1.S = 4; // static
$export$1.P = 8; // proto
$export$1.B = 16; // bind
$export$1.W = 32; // wrap
$export$1.U = 64; // safe
$export$1.R = 128; // real proto method for `library`
var _export = $export$1;
var toString$1 = {}.toString;
var _cof = function (it) {
return toString$1.call(it).slice(8, -1);
};
// fallback for non-array-like ES3 and non-enumerable old V8 strings
var cof = _cof;
// eslint-disable-next-line no-prototype-builtins
var _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
return cof(it) == 'String' ? it.split('') : Object(it);
};
// 7.2.1 RequireObjectCoercible(argument)
var _defined = function (it) {
if (it == undefined) { throw TypeError("Can't call method on " + it); }
return it;
};
// to indexed object, toObject with fallback for non-array-like ES3 strings
var IObject$1 = _iobject;
var defined = _defined;
var _toIobject = function (it) {
return IObject$1(defined(it));
};
// 7.1.4 ToInteger
var ceil = Math.ceil;
var floor = Math.floor;
var _toInteger = function (it) {
return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};
// 7.1.15 ToLength
var toInteger = _toInteger;
var min = Math.min;
var _toLength = function (it) {
return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
};
var toInteger$1 = _toInteger;
var max = Math.max;
var min$1 = Math.min;
var _toAbsoluteIndex = function (index, length) {
index = toInteger$1(index);
return index < 0 ? max(index + length, 0) : min$1(index, length);
};
// false -> Array#indexOf
// true -> Array#includes
var toIObject$1 = _toIobject;
var toLength = _toLength;
var toAbsoluteIndex = _toAbsoluteIndex;
var _arrayIncludes = function (IS_INCLUDES) {
return function ($this, el, fromIndex) {
var O = toIObject$1($this);
var length = toLength(O.length);
var index = toAbsoluteIndex(fromIndex, length);
var value;
// Array#includes uses SameValueZero equality algorithm
// eslint-disable-next-line no-self-compare
if (IS_INCLUDES && el != el) { while (length > index) {
value = O[index++];
// eslint-disable-next-line no-self-compare
if (value != value) { return true; }
// Array#indexOf ignores holes, Array#includes - not
} } else { for (;length > index; index++) { if (IS_INCLUDES || index in O) {
if (O[index] === el) { return IS_INCLUDES || index || 0; }
} } } return !IS_INCLUDES && -1;
};
};
var global$2 = _global;
var SHARED = '__core-js_shared__';
var store = global$2[SHARED] || (global$2[SHARED] = {});
var _shared = function (key) {
return store[key] || (store[key] = {});
};
var shared = _shared('keys');
var uid = _uid;
var _sharedKey = function (key) {
return shared[key] || (shared[key] = uid(key));
};
var has$1 = _has;
var toIObject = _toIobject;
var arrayIndexOf = _arrayIncludes(false);
var IE_PROTO = _sharedKey('IE_PROTO');
var _objectKeysInternal = function (object, names) {
var O = toIObject(object);
var i = 0;
var result = [];
var key;
for (key in O) { if (key != IE_PROTO) { has$1(O, key) && result.push(key); } }
// Don't enum bug & hidden keys
while (names.length > i) { if (has$1(O, key = names[i++])) {
~arrayIndexOf(result, key) || result.push(key);
} }
return result;
};
// IE 8- don't enum bug keys
var _enumBugKeys = (
'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
).split(',');
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var $keys = _objectKeysInternal;
var enumBugKeys = _enumBugKeys;
var _objectKeys = Object.keys || function keys(O) {
return $keys(O, enumBugKeys);
};
var f$2 = Object.getOwnPropertySymbols;
var _objectGops = {
f: f$2
};
var f$3 = {}.propertyIsEnumerable;
var _objectPie = {
f: f$3
};
// 7.1.13 ToObject(argument)
var defined$1 = _defined;
var _toObject = function (it) {
return Object(defined$1(it));
};
// 19.1.2.1 Object.assign(target, source, ...)
var getKeys = _objectKeys;
var gOPS = _objectGops;
var pIE = _objectPie;
var toObject = _toObject;
var IObject = _iobject;
var $assign = Object.assign;
// should work with symbols and should have deterministic property order (V8 bug)
var _objectAssign = !$assign || _fails(function () {
var A = {};
var B = {};
// eslint-disable-next-line no-undef
var S = Symbol();
var K = 'abcdefghijklmnopqrst';
A[S] = 7;
K.split('').forEach(function (k) { B[k] = k; });
return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
}) ? function assign(target, source) {
var arguments$1 = arguments;
// eslint-disable-line no-unused-vars
var T = toObject(target);
var aLen = arguments.length;
var index = 1;
var getSymbols = gOPS.f;
var isEnum = pIE.f;
while (aLen > index) {
var S = IObject(arguments$1[index++]);
var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
var length = keys.length;
var j = 0;
var key;
while (length > j) { if (isEnum.call(S, key = keys[j++])) { T[key] = S[key]; } }
} return T;
} : $assign;
// 19.1.3.1 Object.assign(target, source)
var $export = _export;
$export($export.S + $export.F, 'Object', { assign: _objectAssign });
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
// https://gist.github.com/WebReflection/5593554
/* istanbul ignore if */
if (!Object.setPrototypeOf) {
Object.setPrototypeOf = (function(Object, magic) {
var set;
function setPrototypeOf(O, proto) {
set.call(O, proto);
return O;
}
try {
// this works already in Firefox and Safari
set = Object.getOwnPropertyDescriptor(Object.prototype, magic).set;
set.call({}, null);
} catch (e) {
if (
// IE < 11 cannot be shimmed
Object.prototype !== {}[magic] ||
// neither can any browser that actually
// implemented __proto__ correctly
// (all but old V8 will return here)
{__proto__: null}.__proto__ === void 0
// this case means null objects cannot be passed
// through setPrototypeOf in a reliable way
// which means here a **Sham** is needed instead
) {
return;
}
// nodejs 0.8 and 0.10 are (buggy and..) fine here
// probably Chrome or some old Mobile stock browser
set = function(proto) {
this[magic] = proto;
};
// please note that this will **not** work
// in those browsers that do not inherit
// __proto__ by mistake from Object.prototype
// in these cases we should probably throw an error
// or at least be informed about the issue
setPrototypeOf.polyfill = setPrototypeOf(
setPrototypeOf({}, null),
Object.prototype
) instanceof Object;
// setPrototypeOf.polyfill === true means it works as meant
// setPrototypeOf.polyfill === false means it's not 100% reliable
// setPrototypeOf.polyfill === undefined
// or
// setPrototypeOf.polyfill == null means it's not a polyfill
// which means it works as expected
// we can even delete Object.prototype.__proto__;
}
return setPrototypeOf;
}(Object, '__proto__'));
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// fix Promise Problem on JSContext of iOS7~8
// @see https://bugs.webkit.org/show_bug.cgi?id=135866
var ref = commonjsGlobal;
var WXEnvironment$1 = ref.WXEnvironment;
/* istanbul ignore next */
if (WXEnvironment$1 && WXEnvironment$1.platform === 'iOS') {
commonjsGlobal.Promise = undefined;
}
var _wks = createCommonjsModule(function (module) {
var store = _shared('wks');
var uid = _uid;
var Symbol = _global.Symbol;
var USE_SYMBOL = typeof Symbol == 'function';
var $exports = module.exports = function (name) {
return store[name] || (store[name] =
USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
};
$exports.store = store;
});
// getting tag from 19.1.3.6 Object.prototype.toString()
var cof$1 = _cof;
var TAG = _wks('toStringTag');
// ES3 wrong here
var ARG = cof$1(function () { return arguments; }()) == 'Arguments';
// fallback for IE11 Script Access Denied error
var tryGet = function (it, key) {
try {
return it[key];
} catch (e) { /* empty */ }
};
var _classof = function (it) {
var O, T, B;
return it === undefined ? 'Undefined' : it === null ? 'Null'
// @@toStringTag case
: typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
// builtinTag case
: ARG ? cof$1(O)
// ES3 arguments fallback
: (B = cof$1(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};
// 19.1.3.6 Object.prototype.toString()
var classof = _classof;
var test = {};
test[_wks('toStringTag')] = 'z';
if (test + '' != '[object z]') {
_redefine(Object.prototype, 'toString', function toString() {
return '[object ' + classof(this) + ']';
}, true);
}
var toInteger$2 = _toInteger;
var defined$2 = _defined;
// true -> String#at
// false -> String#codePointAt
var _stringAt = function (TO_STRING) {
return function (that, pos) {
var s = String(defined$2(that));
var i = toInteger$2(pos);
var l = s.length;
var a, b;
if (i < 0 || i >= l) { return TO_STRING ? '' : undefined; }
a = s.charCodeAt(i);
return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
? TO_STRING ? s.charAt(i) : a
: TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
};
};
var _library = false;
var _iterators = {};
var dP$2 = _objectDp;
var anObject$2 = _anObject;
var getKeys$1 = _objectKeys;
var _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {
anObject$2(O);
var keys = getKeys$1(Properties);
var length = keys.length;
var i = 0;
var P;
while (length > i) { dP$2.f(O, P = keys[i++], Properties[P]); }
return O;
};
var document$2 = _global.document;
var _html = document$2 && document$2.documentElement;
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var anObject$1 = _anObject;
var dPs = _objectDps;
var enumBugKeys$1 = _enumBugKeys;
var IE_PROTO$1 = _sharedKey('IE_PROTO');
var Empty = function () { /* empty */ };
var PROTOTYPE$1 = 'prototype';
// Create object with fake `null` prototype: use iframe Object with cleared prototype
var createDict = function () {
// Thrash, waste and sodomy: IE GC bug
var iframe = _domCreate('iframe');
var i = enumBugKeys$1.length;
var lt = '<';
var gt = '>';
var iframeDocument;
iframe.style.display = 'none';
_html.appendChild(iframe);
iframe.src = 'javascript:'; // eslint-disable-line no-script-url
// createDict = iframe.contentWindow.Object;
// html.removeChild(iframe);
iframeDocument = iframe.contentWindow.document;
iframeDocument.open();
iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
iframeDocument.close();
createDict = iframeDocument.F;
while (i--) { delete createDict[PROTOTYPE$1][enumBugKeys$1[i]]; }
return createDict();
};
var _objectCreate = Object.create || function create(O, Properties) {
var result;
if (O !== null) {
Empty[PROTOTYPE$1] = anObject$1(O);
result = new Empty();
Empty[PROTOTYPE$1] = null;
// add "__proto__" for Object.getPrototypeOf polyfill
result[IE_PROTO$1] = O;
} else { result = createDict(); }
return Properties === undefined ? result : dPs(result, Properties);
};
var def = _objectDp.f;
var has$3 = _has;
var TAG$1 = _wks('toStringTag');
var _setToStringTag = function (it, tag, stat) {
if (it && !has$3(it = stat ? it : it.prototype, TAG$1)) { def(it, TAG$1, { configurable: true, value: tag }); }
};
var create$1 = _objectCreate;
var descriptor = _propertyDesc;
var setToStringTag$1 = _setToStringTag;
var IteratorPrototype = {};
// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
_hide(IteratorPrototype, _wks('iterator'), function () { return this; });
var _iterCreate = function (Constructor, NAME, next) {
Constructor.prototype = create$1(IteratorPrototype, { next: descriptor(1, next) });
setToStringTag$1(Constructor, NAME + ' Iterator');
};
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var has$4 = _has;
var toObject$1 = _toObject;
var IE_PROTO$2 = _sharedKey('IE_PROTO');
var ObjectProto = Object.prototype;
var _objectGpo = Object.getPrototypeOf || function (O) {
O = toObject$1(O);
if (has$4(O, IE_PROTO$2)) { return O[IE_PROTO$2]; }
if (typeof O.constructor == 'function' && O instanceof O.constructor) {
return O.constructor.prototype;
} return O instanceof Object ? ObjectProto : null;
};
var LIBRARY = _library;
var $export$2 = _export;
var redefine$1 = _redefine;
var hide$1 = _hide;
var has$2 = _has;
var Iterators = _iterators;
var $iterCreate = _iterCreate;
var setToStringTag = _setToStringTag;
var getPrototypeOf = _objectGpo;
var ITERATOR = _wks('iterator');
var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
var FF_ITERATOR = '@@iterator';
var KEYS = 'keys';
var VALUES = 'values';
var returnThis = function () { return this; };
var _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
$iterCreate(Constructor, NAME, next);
var getMethod = function (kind) {
if (!BUGGY && kind in proto) { return proto[kind]; }
switch (kind) {
case KEYS: return function keys() { return new Constructor(this, kind); };
case VALUES: return function values() { return new Constructor(this, kind); };
} return function entries() { return new Constructor(this, kind); };
};
var TAG = NAME + ' Iterator';
var DEF_VALUES = DEFAULT == VALUES;
var VALUES_BUG = false;
var proto = Base.prototype;
var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
var $default = $native || getMethod(DEFAULT);
var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
var methods, key, IteratorPrototype;
// Fix native
if ($anyNative) {
IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
// Set @@toStringTag to native iterators
setToStringTag(IteratorPrototype, TAG, true);
// fix for some old engines
if (!LIBRARY && !has$2(IteratorPrototype, ITERATOR)) { hide$1(IteratorPrototype, ITERATOR, returnThis); }
}
}
// fix Array#{values, @@iterator}.name in V8 / FF
if (DEF_VALUES && $native && $native.name !== VALUES) {
VALUES_BUG = true;
$default = function values() { return $native.call(this); };
}
// Define iterator
if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
hide$1(proto, ITERATOR, $default);
}
// Plug for library
Iterators[NAME] = $default;
Iterators[TAG] = returnThis;
if (DEFAULT) {
methods = {
values: DEF_VALUES ? $default : getMethod(VALUES),
keys: IS_SET ? $default : getMethod(KEYS),
entries: $entries
};
if (FORCED) { for (key in methods) {
if (!(key in proto)) { redefine$1(proto, key, methods[key]); }
} } else { $export$2($export$2.P + $export$2.F * (BUGGY || VALUES_BUG), NAME, methods); }
}
return methods;
};
var $at = _stringAt(true);
// 21.1.3.27 String.prototype[@@iterator]()
_iterDefine(String, 'String', function (iterated) {
this._t = String(iterated); // target
this._i = 0; // next index
// 21.1.5.2.1 %StringIteratorPrototype%.next()
}, function () {
var O = this._t;
var index = this._i;
var point;
if (index >= O.length) { return { value: undefined, done: true }; }
point = $at(O, index);
this._i += point.length;
return { value: point, done: false };
});
// 22.1.3.31 Array.prototype[@@unscopables]
var UNSCOPABLES = _wks('unscopables');
var ArrayProto = Array.prototype;
if (ArrayProto[UNSCOPABLES] == undefined) { _hide(ArrayProto, UNSCOPABLES, {}); }
var _addToUnscopables = function (key) {
ArrayProto[UNSCOPABLES][key] = true;
};
var _iterStep = function (done, value) {
return { value: value, done: !!done };
};
var addToUnscopables = _addToUnscopables;
var step = _iterStep;
var Iterators$2 = _iterators;
var toIObject$2 = _toIobject;
// 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()
var es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {
this._t = toIObject$2(iterated); // target
this._i = 0; // next index
this._k = kind; // kind
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
}, function () {
var O = this._t;
var kind = this._k;
var index = this._i++;
if (!O || index >= O.length) {
this._t = undefined;
return step(1);
}
if (kind == 'keys') { return step(0, index); }
if (kind == 'values') { return step(0, O[index]); }
return step(0, [index, O[index]]);
}, 'values');
// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
Iterators$2.Arguments = Iterators$2.Array;
addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');
var $iterators = es6_array_iterator;
var getKeys$2 = _objectKeys;
var redefine$2 = _redefine;
var global$3 = _global;
var hide$2 = _hide;
var Iterators$1 = _iterators;
var wks = _wks;
var ITERATOR$1 = wks('iterator');
var TO_STRING_TAG = wks('toStringTag');
var ArrayValues = Iterators$1.Array;
var DOMIterables = {
CSSRuleList: true, // TODO: Not spec compliant, should be false.
CSSStyleDeclaration: false,
CSSValueList: false,
ClientRectList: false,
DOMRectList: false,
DOMStringList: false,
DOMTokenList: true,
DataTransferItemList: false,
FileList: false,
HTMLAllCollection: false,
HTMLCollection: false,
HTMLFormElement: false,
HTMLSelectElement: false,
MediaList: true, // TODO: Not spec compliant, should be false.
MimeTypeArray: false,
NamedNodeMap: false,
NodeList: true,
PaintRequestList: false,
Plugin: false,
PluginArray: false,
SVGLengthList: false,
SVGNumberList: false,
SVGPathSegList: false,
SVGPointList: false,
SVGStringList: false,
SVGTransformList: false,
SourceBufferList: false,
StyleSheetList: true, // TODO: Not spec compliant, should be false.
TextTrackCueList: false,
TextTrackList: false,
TouchList: false
};
for (var collections = getKeys$2(DOMIterables), i = 0; i < collections.length; i++) {
var NAME = collections[i];
var explicit = DOMIterables[NAME];
var Collection = global$3[NAME];
var proto = Collection && Collection.prototype;
var key;
if (proto) {
if (!proto[ITERATOR$1]) { hide$2(proto, ITERATOR$1, ArrayValues); }
if (!proto[TO_STRING_TAG]) { hide$2(proto, TO_STRING_TAG, NAME); }
Iterators$1[NAME] = ArrayValues;
if (explicit) { for (key in $iterators) { if (!proto[key]) { redefine$2(proto, key, $iterators[key], true); } } }
}
}
var _anInstance = function (it, Constructor, name, forbiddenField) {
if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
throw TypeError(name + ': incorrect invocation!');
} return it;
};
// call something on iterator step with safe closing on error
var anObject$3 = _anObject;
var _iterCall = function (iterator, fn, value, entries) {
try {
return entries ? fn(anObject$3(value)[0], value[1]) : fn(value);
// 7.4.6 IteratorClose(iterator, completion)
} catch (e) {
var ret = iterator['return'];
if (ret !== undefined) { anObject$3(ret.call(iterator)); }
throw e;
}
};
// check on default Array iterator
var Iterators$3 = _iterators;
var ITERATOR$2 = _wks('iterator');
var ArrayProto$1 = Array.prototype;
var _isArrayIter = function (it) {
return it !== undefined && (Iterators$3.Array === it || ArrayProto$1[ITERATOR$2] === it);
};
var classof$2 = _classof;
var ITERATOR$3 = _wks('iterator');
var Iterators$4 = _iterators;
var core_getIteratorMethod = _core.getIteratorMethod = function (it) {
if (it != undefined) { return it[ITERATOR$3]
|| it['@@iterator']
|| Iterators$4[classof$2(it)]; }
};
var _forOf = createCommonjsModule(function (module) {
var ctx = _ctx;
var call = _iterCall;
var isArrayIter = _isArrayIter;
var anObject = _anObject;
var toLength = _toLength;
var getIterFn = core_getIteratorMethod;
var BREAK = {};
var RETURN = {};
var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);
var f = ctx(fn, that, entries ? 2 : 1);
var index = 0;
var length, step, iterator, result;
if (typeof iterFn != 'function') { throw TypeError(iterable + ' is not iterable!'); }
// fast case for arrays with default iterator
if (isArrayIter(iterFn)) { for (length = toLength(iterable.length); length > index; index++) {
result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
if (result === BREAK || result === RETURN) { return result; }
} } else { for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
result = call(iterator, f, step.value, entries);
if (result === BREAK || result === RETURN) { return result; }
} }
};
exports.BREAK = BREAK;
exports.RETURN = RETURN;
});
// 7.3.20 SpeciesConstructor(O, defaultConstructor)
var anObject$4 = _anObject;
var aFunction$2 = _aFunction;
var SPECIES = _wks('species');
var _speciesConstructor = function (O, D) {
var C = anObject$4(O).constructor;
var S;
return C === undefined || (S = anObject$4(C)[SPECIES]) == undefined ? D : aFunction$2(S);
};
// fast apply, http://jsperf.lnkit.com/fast-apply/5
var _invoke = function (fn, args, that) {
var un = that === undefined;
switch (args.length) {
case 0: return un ? fn()
: fn.call(that);
case 1: return un ? fn(args[0])
: fn.call(that, args[0]);
case 2: return un ? fn(args[0], args[1])
: fn.call(that, args[0], args[1]);
case 3: return un ? fn(args[0], args[1], args[2])
: fn.call(that, args[0], args[1], args[2]);
case 4: return un ? fn(args[0], args[1], args[2], args[3])
: fn.call(that, args[0], args[1], args[2], args[3]);
} return fn.apply(that, args);
};
var ctx$2 = _ctx;
var invoke = _invoke;
var html = _html;
var cel = _domCreate;
var global$5 = _global;
var process$2 = global$5.process;
var setTask = global$5.setImmediate;
var clearTask = global$5.clearImmediate;
var MessageChannel = global$5.MessageChannel;
var Dispatch = global$5.Dispatch;
var counter = 0;
var queue = {};
var ONREADYSTATECHANGE = 'onreadystatechange';
var defer;
var channel;
var port;
var run$1 = function () {
var id = +this;
// eslint-disable-next-line no-prototype-builtins
if (queue.hasOwnProperty(id)) {
var fn = queue[id];
delete queue[id];
fn();
}
};
var listener = function (event) {
run$1.call(event.data);
};
// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if (!setTask || !clearTask) {
setTask = function setImmediate(fn) {
var arguments$1 = arguments;
var args = [];
var i = 1;
while (arguments.length > i) { args.push(arguments$1[i++]); }
queue[++counter] = function () {
// eslint-disable-next-line no-new-func
invoke(typeof fn == 'function' ? fn : Function(fn), args);
};
defer(counter);
return counter;
};
clearTask = function clearImmediate(id) {
delete queue[id];
};
// Node.js 0.8-
if (_cof(process$2) == 'process') {
defer = function (id) {
process$2.nextTick(ctx$2(run$1, id, 1));
};
// Sphere (JS game engine) Dispatch API
} else if (Dispatch && Dispatch.now) {
defer = function (id) {
Dispatch.now(ctx$2(run$1, id, 1));
};
// Browsers with MessageChannel, includes WebWorkers
} else if (MessageChannel) {
channel = new MessageChannel();
port = channel.port2;
channel.port1.onmessage = listener;
defer = ctx$2(port.postMessage, port, 1);
// Browsers with postMessage, skip WebWorkers
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
} else if (global$5.addEventListener && typeof postMessage == 'function' && !global$5.importScripts) {
defer = function (id) {
global$5.postMessage(id + '', '*');
};
global$5.addEventListener('message', listener, false);
// IE8-
} else if (ONREADYSTATECHANGE in cel('script')) {
defer = function (id) {
html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
html.removeChild(this);
run$1.call(id);
};
};
// Rest old browsers
} else {
defer = function (id) {
setTimeout(ctx$2(run$1, id, 1), 0);
};
}
}
var _task = {
set: setTask,
clear: clearTask
};
var global$6 = _global;
var macrotask = _task.set;
var Observer = global$6.MutationObserver || global$6.WebKitMutationObserver;
var process$3 = global$6.process;
var Promise$1 = global$6.Promise;
var isNode$1 = _cof(process$3) == 'process';
var _microtask = function () {
var head, last, notify;
var flush = function () {
var parent, fn;
if (isNode$1 && (parent = process$3.domain)) { parent.exit(); }
while (head) {
fn = head.fn;
head = head.next;
try {
fn();
} catch (e) {
if (head) { notify(); }
else { last = undefined; }
throw e;
}
} last = undefined;
if (parent) { parent.enter(); }
};
// Node.js
if (isNode$1) {
notify = function () {
process$3.nextTick(flush);
};
// browsers with MutationObserver
} else if (Observer) {
var toggle = true;
var node = document.createTextNode('');
new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
notify = function () {
node.data = toggle = !toggle;
};
// environments with maybe non-completely correct, but existent Promise
} else if (Promise$1 && Promise$1.resolve) {
var promise = Promise$1.resolve();
notify = function () {
promise.then(flush);
};
// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
} else {
notify = function () {
// strange IE + webpack dev server bug - use .call(global)
macrotask.call(global$6, flush);
};
}
return function (fn) {
var task = { fn: fn, next: undefined };
if (last) { last.next = task; }
if (!head) {
head = task;
notify();
} last = task;
};
};
// 25.4.1.5 NewPromiseCapability(C)
var aFunction$3 = _aFunction;
function PromiseCapability(C) {
var resolve, reject;
this.promise = new C(function ($$resolve, $$reject) {
if (resolve !== undefined || reject !== undefined) { throw TypeError('Bad Promise constructor'); }
resolve = $$resolve;
reject = $$reject;
});
this.resolve = aFunction$3(resolve);
this.reject = aFunction$3(reject);
}
var f$4 = function (C) {
return new PromiseCapability(C);
};
var _newPromiseCapability = {
f: f$4
};
var _perform = function (exec) {
try {
return { e: false, v: exec() };
} catch (e) {
return { e: true, v: e };
}
};
var newPromiseCapability$1 = _newPromiseCapability;
var _promiseResolve = function (C, x) {
var promiseCapability = newPromiseCapability$1.f(C);
var resolve = promiseCapability.resolve;
resolve(x);
return promiseCapability.promise;
};
var redefine$3 = _redefine;
var _redefineAll = function (target, src, safe) {
for (var key in src) { redefine$3(target, key, src[key], safe); }
return target;
};
var global$7 = _global;
var dP$3 = _objectDp;
var DESCRIPTORS = _descriptors;
var SPECIES$1 = _wks('species');
var _setSpecies = function (KEY) {
var C = global$7[KEY];
if (DESCRIPTORS && C && !C[SPECIES$1]) { dP$3.f(C, SPECIES$1, {
configurable: true,
get: function () { return this; }
}); }
};
var ITERATOR$4 = _wks('iterator');
var SAFE_CLOSING = false;
try {
var riter = [7][ITERATOR$4]();
riter['return'] = function () { SAFE_CLOSING = true; };
// eslint-disable-next-line no-throw-literal
Array.from(riter, function () { throw 2; });
} catch (e) { /* empty */ }
var _iterDetect = function (exec, skipClosing) {
if (!skipClosing && !SAFE_CLOSING) { return false; }
var safe = false;
try {
var arr = [7];
var iter = arr[ITERATOR$4]();
iter.next = function () { return { done: safe = true }; };
arr[ITERATOR$4] = function () { return iter; };
exec(arr);
} catch (e) { /* empty */ }
return safe;
};
var LIBRARY$1 = _library;
var global$4 = _global;
var ctx$1 = _ctx;
var classof$1 = _classof;
var $export$3 = _export;
var isObject$3 = _isObject;
var aFunction$1 = _aFunction;
var anInstance = _anInstance;
var forOf = _forOf;
var speciesConstructor = _speciesConstructor;
var task = _task.set;
var microtask = _microtask();
var newPromiseCapabilityModule = _newPromiseCapability;
var perform = _perform;
var promiseResolve = _promiseResolve;
var PROMISE = 'Promise';
var TypeError$1 = global$4.TypeError;
var process$1 = global$4.process;
var $Promise = global$4[PROMISE];
var isNode = classof$1(process$1) == 'process';
var empty = function () { /* empty */ };
var Internal;
var newGenericPromiseCapability;
var OwnPromiseCapability;
var Wrapper;
var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
var USE_NATIVE = !!function () {
try {
// correct subclassing with @@species support
var promise = $Promise.resolve(1);
var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {
exec(empty, empty);
};
// unhandled rejections tracking support, NodeJS Promise without it fails @@species test
return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;
} catch (e) { /* empty */ }
}();
// helpers
var sameConstructor = LIBRARY$1 ? function (a, b) {
// with library wrapper special case
return a === b || a === $Promise && b === Wrapper;
} : function (a, b) {
return a === b;
};
var isThenable = function (it) {
var then;
return isObject$3(it) && typeof (then = it.then) == 'function' ? then : false;
};
var notify$1 = function (promise, isReject) {
if (promise._n) { return; }
promise._n = true;
var chain = promise._c;
microtask(function () {
var value = promise._v;
var ok = promise._s == 1;
var i = 0;
var run = function (reaction) {
var handler = ok ? reaction.ok : reaction.fail;
var resolve = reaction.resolve;
var reject = reaction.reject;
var domain = reaction.domain;
var result, then;
try {
if (handler) {
if (!ok) {
if (promise._h == 2) { onHandleUnhandled(promise); }
promise._h = 1;
}
if (handler === true) { result = value; }
else {
if (domain) { domain.enter(); }
result = handler(value);
if (domain) { domain.exit(); }
}
if (result === reaction.promise) {
reject(TypeError$1('Promise-chain cycle'));
} else if (then = isThenable(result)) {
then.call(result, resolve, reject);
} else { resolve(result); }
} else { reject(value); }
} catch (e) {
reject(e);
}
};
while (chain.length > i) { run(chain[i++]); } // variable length - can't use forEach
promise._c = [];
promise._n = false;
if (isReject && !promise._h) { onUnhandled(promise); }
});
};
var onUnhandled = function (promise) {
task.call(global$4, function () {
var value = promise._v;
var unhandled = isUnhandled(promise);
var result, handler, console;
if (unhandled) {
result = perform(function () {
if (isNode) {
process$1.emit('unhandledRejection', value, promise);
} else if (handler = global$4.onunhandledrejection) {
handler({ promise: promise, reason: value });
} else if ((console = global$4.console) && console.error) {
console.error('Unhandled promise rejection', value);
}
});
// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
promise._h = isNode || isUnhandled(promise) ? 2 : 1;
} promise._a = undefined;
if (unhandled && result.e) { throw result.v; }
});
};
var isUnhandled = function (promise) {
if (promise._h == 1) { return false; }
var chain = promise._a || promise._c;
var i = 0;
var reaction;
while (chain.length > i) {
reaction = chain[i++];
if (reaction.fail || !isUnhandled(reaction.promise)) { return false; }
} return true;
};
var onHandleUnhandled = function (promise) {
task.call(global$4, function () {
var handler;
if (isNode) {
process$1.emit('rejectionHandled', promise);
} else if (handler = global$4.onrejectionhandled) {
handler({ promise: promise, reason: promise._v });
}
});
};
var $reject = function (value) {
var promise = this;
if (promise._d) { return; }
promise._d = true;
promise = promise._w || promise; // unwrap
promise._v = value;
promise._s = 2;
if (!promise._a) { promise._a = promise._c.slice(); }
notify$1(promise, true);
};
var $resolve = function (value) {
var promise = this;
var then;
if (promise._d) { return; }
promise._d = true;
promise = promise._w || promise; // unwrap
try {
if (promise === value) { throw TypeError$1("Promise can't be resolved itself"); }
if (then = isThenable(value)) {
microtask(function () {
var wrapper = { _w: promise, _d: false }; // wrap
try {
then.call(value, ctx$1($resolve, wrapper, 1), ctx$1($reject, wrapper, 1));
} catch (e) {
$reject.call(wrapper, e);
}
});
} else {
promise._v = value;
promise._s = 1;
notify$1(promise, false);
}
} catch (e) {
$reject.call({ _w: promise, _d: false }, e); // wrap
}
};
// constructor polyfill
if (!USE_NATIVE) {
// 25.4.3.1 Promise(executor)
$Promise = function Promise(executor) {
anInstance(this, $Promise, PROMISE, '_h');
aFunction$1(executor);
Internal.call(this);
try {
executor(ctx$1($resolve, this, 1), ctx$1($reject, this, 1));
} catch (err) {
$reject.call(this, err);
}
};
// eslint-disable-next-line no-unused-vars
Internal = function Promise(executor) {
this._c = []; // <- awaiting reactions
this._a = undefined; // <- checked in isUnhandled reactions
this._s = 0; // <- state
this._d = false; // <- done
this._v = undefined; // <- value
this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
this._n = false; // <- notify
};
Internal.prototype = _redefineAll($Promise.prototype, {
// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
then: function then(onFulfilled, onRejected) {
var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
reaction.fail = typeof onRejected == 'function' && onRejected;
reaction.domain = isNode ? process$1.domain : undefined;
this._c.push(reaction);
if (this._a) { this._a.push(reaction); }
if (this._s) { notify$1(this, false); }
return reaction.promise;
},
// 25.4.5.1 Promise.prototype.catch(onRejected)
'catch': function (onRejected) {
return this.then(undefined, onRejected);
}
});
OwnPromiseCapability = function () {
var promise = new Internal();
this.promise = promise;
this.resolve = ctx$1($resolve, promise, 1);
this.reject = ctx$1($reject, promise, 1);
};
newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
return sameConstructor($Promise, C)
? new OwnPromiseCapability(C)
: newGenericPromiseCapability(C);
};
}
$export$3($export$3.G + $export$3.W + $export$3.F * !USE_NATIVE, { Promise: $Promise });
_setToStringTag($Promise, PROMISE);
_setSpecies(PROMISE);
Wrapper = _core[PROMISE];
// statics
$export$3($export$3.S + $export$3.F * !USE_NATIVE, PROMISE, {
// 25.4.4.5 Promise.reject(r)
reject: function reject(r) {
var capability = newPromiseCapability(this);
var $$reject = capability.reject;
$$reject(r);
return capability.promise;
}
});
$export$3($export$3.S + $export$3.F * (LIBRARY$1 || !USE_NATIVE), PROMISE, {
// 25.4.4.6 Promise.resolve(x)
resolve: function resolve(x) {
// instanceof instead of internal slot check because we should fix it without replacement native Promise core
if (x instanceof $Promise && sameConstructor(x.constructor, this)) { return x; }
return promiseResolve(this, x);
}
});
$export$3($export$3.S + $export$3.F * !(USE_NATIVE && _iterDetect(function (iter) {
$Promise.all(iter)['catch'](empty);
})), PROMISE, {
// 25.4.4.1 Promise.all(iterable)
all: function all(iterable) {
var C = this;
var capability = newPromiseCapability(C);
var resolve = capability.resolve;
var reject = capability.reject;
var result = perform(function () {
var values = [];
var index = 0;
var remaining = 1;
forOf(iterable, false, function (promise) {
var $index = index++;
var alreadyCalled = false;
values.push(undefined);
remaining++;
C.resolve(promise).then(function (value) {
if (alreadyCalled) { return; }
alreadyCalled = true;
values[$index] = value;
--remaining || resolve(values);
}, reject);
});
--remaining || resolve(values);
});
if (result.e) { reject(result.v); }
return capability.promise;
},
// 25.4.4.4 Promise.race(iterable)
race: function race(iterable) {
var C = this;
var capability = newPromiseCapability(C);
var reject = capability.reject;
var result = perform(function () {
forOf(iterable, false, function (promise) {
C.resolve(promise).then(capability.resolve, reject);
});
});
if (result.e) { reject(result.v); }
return capability.promise;
}
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* This file will hack `console` methods by `WXEnvironment.logLevel`.
* So we can control how many and which messages will be sent by change the log level.
* Additionally in native platform the message content must be primitive values and
* using `nativeLog(...args, logLevelMark)` so we create a new `console` object in
* global add a format process for its methods.
*/
var LEVELS = ['off', 'error', 'warn', 'info', 'log', 'debug'];
var levelMap = {};
var originalConsole = global.console;
/**
* Hack console for native environment.
*/
function setNativeConsole () {
generateLevelMap();
/* istanbul ignore next */
// mock console in native environment
if (global.WXEnvironment && global.WXEnvironment.platform !== 'Web') {
global.console = {
debug: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('debug')) { global.nativeLog.apply(global, format(args).concat( ['__DEBUG'] )); }
},
log: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('log')) { global.nativeLog.apply(global, format(args).concat( ['__LOG'] )); }
},
info: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('info')) { global.nativeLog.apply(global, format(args).concat( ['__INFO'] )); }
},
warn: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('warn')) { global.nativeLog.apply(global, format(args).concat( ['__WARN'] )); }
},
error: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('error')) { global.nativeLog.apply(global, format(args).concat( ['__ERROR'] )); }
}
};
}
// Web or Node
else {
var debug = console.debug;
var log = console.log;
var info = console.info;
var warn = console.warn;
var error = console.error;
console.__ori__ = { debug: debug, log: log, info: info, warn: warn, error: error };
console.debug = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('debug')) { console.__ori__.debug.apply(console, args); }
};
console.log = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('log')) { console.__ori__.log.apply(console, args); }
};
console.info = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('info')) { console.__ori__.info.apply(console, args); }
};
console.warn = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('warn')) { console.__ori__.warn.apply(console, args); }
};
console.error = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (checkLevel('error')) { console.__ori__.error.apply(console, args); }
};
}
}
/**
* Reset hacked console to original.
*/
/* istanbul ignore next */
function resetNativeConsole () {
levelMap = {};
global.console = originalConsole;
}
/**
* Generate map for which types of message will be sent in a certain message level
* as the order of LEVELS.
*/
function generateLevelMap () {
LEVELS.forEach(function (level) {
var levelIndex = LEVELS.indexOf(level);
levelMap[level] = {};
LEVELS.forEach(function (type) {
var typeIndex = LEVELS.indexOf(type);
if (typeIndex <= levelIndex) {
levelMap[level][type] = true;
}
});
});
}
/**
* Check if a certain type of message will be sent in current log level of env.
* @param {string} type
* @return {boolean}
*/
function checkLevel (type) {
var logLevel = (global.WXEnvironment && global.WXEnvironment.logLevel) || 'log';
return levelMap[logLevel] && levelMap[logLevel][type]
}
/**
* Convert all log arguments into primitive values.
* @param {array} args
* @return {array}
*/
/* istanbul ignore next */
function format (args) {
return args.map(function (v) {
var type = Object.prototype.toString.call(v);
if (type.toLowerCase() === '[object object]') {
v = JSON.stringify(v);
}
else {
v = String(v);
}
return v
})
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Polyfill `setTimeout` on Android V8 using native method
* `setTimeoutNative(callbackId, time)` and JS method
* `setTimeoutCallback(callbackId)`.
* This polyfill is only used in virtual-DOM diff & flush agorithm. Not
* accessed by JS Bundle code (The timer APIs polyfill for JS Bundle is in
* `html5/default/app/ctrl.js`).
*/
var originalSetTimeout = global.setTimeout;
var setTimeoutNative = global.setTimeoutNative;
/**
* Set up native timer
*/
/* istanbul ignore next */
function setNativeTimer () {
if (typeof setTimeout === 'undefined' &&
typeof setTimeoutNative === 'function') {
var timeoutMap = {};
var timeoutId = 0;
global.setTimeout = function (cb, time) {
timeoutMap[++timeoutId] = cb;
setTimeoutNative(timeoutId.toString(), time);
};
global.setTimeoutCallback = function (id) {
if (typeof timeoutMap[id] === 'function') {
timeoutMap[id]();
delete timeoutMap[id];
}
};
}
}
/* istanbul ignore next */
function resetNativeTimer () {
global.setTimeout = originalSetTimeout;
global.setTimeoutCallback = null;
}
setNativeTimer();
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Freeze the prototype of javascript build-in objects.
*/
/* istanbul ignore next */
function freezePrototype$1 () {
Object.freeze(Object);
Object.freeze(Array);
// Object.freeze(Object.prototype)
freezeObjectProto();
Object.freeze(Array.prototype);
Object.freeze(String.prototype);
Object.freeze(Number.prototype);
Object.freeze(Boolean.prototype);
// Object.freeze(Error.prototype)
freezeErrorProto();
Object.freeze(Date.prototype);
Object.freeze(RegExp.prototype);
}
function freezeObjectProto () {
var proto = Object.prototype;
var protoName = 'Object.prototype';
freezeProtoProperty(proto, '__defineGetter__', protoName);
freezeProtoProperty(proto, '__defineSetter__', protoName);
freezeProtoProperty(proto, '__lookupGetter__', protoName);
freezeProtoProperty(proto, '__lookupSetter__', protoName);
freezeProtoProperty(proto, 'constructor', protoName);
freezeProtoProperty(proto, 'hasOwnProperty', protoName);
freezeProtoProperty(proto, 'isPrototypeOf', protoName);
freezeProtoProperty(proto, 'propertyIsEnumerable', protoName);
freezeProtoProperty(proto, 'toLocaleString', protoName);
freezeProtoProperty(proto, 'toString', protoName);
freezeProtoProperty(proto, 'valueOf', protoName);
Object.seal(proto);
}
function freezeErrorProto () {
var proto = Error.prototype;
var protoName = 'Error.prototype';
freezeProtoProperty(proto, 'name', protoName);
freezeProtoProperty(proto, 'message', protoName);
freezeProtoProperty(proto, 'toString', protoName);
freezeProtoProperty(proto, 'constructor', protoName);
Object.seal(proto);
}
function freezeProtoProperty (proto, propertyName, protoName) {
if (!proto.hasOwnProperty(propertyName)) {
return
}
var origin = proto[propertyName];
Object.defineProperty(proto, propertyName, {
get: function () {
return origin
},
set: function (value) {
if (this === proto) {
throw Error(("Cannot assign to read only property " + propertyName + " of " + protoName))
}
Object.defineProperty(this, propertyName, {
value: value,
writable: true
});
return value
}
});
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// import promise hack and polyfills
/**
* Get a unique id.
*/
var nextNodeRef = 1;
function uniqueId () {
return (nextNodeRef++).toString()
}
function typof (v) {
var s = Object.prototype.toString.call(v);
return s.substring(8, s.length - 1)
}
function bufferToBase64 (buffer) {
if (typeof btoa !== 'function') {
return ''
}
var string = Array.prototype.map.call(
new Uint8Array(buffer),
function (code) { return String.fromCharCode(code); }
).join('');
return btoa(string) // eslint-disable-line no-undef
}
function base64ToBuffer (base64) {
if (typeof atob !== 'function') {
return new ArrayBuffer(0)
}
var string = atob(base64); // eslint-disable-line no-undef
var array = new Uint8Array(string.length);
Array.prototype.forEach.call(string, function (ch, i) {
array[i] = ch.charCodeAt(0);
});
return array.buffer
}
/**
* Normalize a primitive value.
* @param {any} v
* @return {primitive}
*/
function normalizePrimitive (v) {
var type = typof(v);
switch (type) {
case 'Undefined':
case 'Null':
return ''
case 'RegExp':
return v.toString()
case 'Date':
return v.toISOString()
case 'Number':
case 'String':
case 'Boolean':
case 'Array':
case 'Object':
return v
case 'ArrayBuffer':
return {
'@type': 'binary',
dataType: type,
base64: bufferToBase64(v)
}
case 'Int8Array':
case 'Uint8Array':
case 'Uint8ClampedArray':
case 'Int16Array':
case 'Uint16Array':
case 'Int32Array':
case 'Uint32Array':
case 'Float32Array':
case 'Float64Array':
return {
'@type': 'binary',
dataType: type,
base64: bufferToBase64(v.buffer)
}
default:
return JSON.stringify(v)
}
}
function decodePrimitive (data) {
if (typof(data) === 'Object') {
// decode base64 into binary
if (data['@type'] && data['@type'] === 'binary') {
return base64ToBuffer(data.base64 || '')
}
var realData = {};
for (var key in data) {
realData[key] = decodePrimitive(data[key]);
}
return realData
}
if (typof(data) === 'Array') {
return data.map(decodePrimitive)
}
return data
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* For general callback management of a certain Weex instance.
* Because function can not passed into native, so we create callback
* callback id for each function and pass the callback id into native
* in fact. And when a callback called from native, we can find the real
* callback through the callback id we have passed before.
*/
var CallbackManager = function CallbackManager (instanceId) {
this.instanceId = instanceId;
this.lastCallbackId = 0;
this.callbacks = {};
};
CallbackManager.prototype.add = function add (callback) {
this.lastCallbackId++;
this.callbacks[this.lastCallbackId] = callback;
return this.lastCallbackId
};
CallbackManager.prototype.remove = function remove (callbackId) {
var callback = this.callbacks[callbackId];
delete this.callbacks[callbackId];
return callback
};
CallbackManager.prototype.consume = function consume (callbackId, data, ifKeepAlive) {
var callback = this.callbacks[callbackId];
if (typeof ifKeepAlive === 'undefined' || ifKeepAlive === false) {
delete this.callbacks[callbackId];
}
if (typeof callback === 'function') {
return callback(decodePrimitive(data))
}
return new Error(("invalid callback id \"" + callbackId + "\""))
};
CallbackManager.prototype.close = function close () {
this.callbacks = {};
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var docMap = {};
/**
* Add a document object into docMap.
* @param {string} id
* @param {object} document
*/
function addDoc (id, doc) {
if (id) {
docMap[id] = doc;
}
}
/**
* Get the document object by id.
* @param {string} id
*/
function getDoc (id) {
return docMap[id]
}
/**
* Remove the document from docMap by id.
* @param {string} id
*/
function removeDoc (id) {
delete docMap[id];
}
/**
* @deprecated
* Get listener by document id.
* @param {string} id
* @return {object} listener
*/
/**
* Get TaskCenter instance by id.
* @param {string} id
* @return {object} TaskCenter
*/
function getTaskCenter (id) {
var doc = docMap[id];
if (doc && doc.taskCenter) {
return doc.taskCenter
}
return null
}
/**
* Append body node to documentElement.
* @param {object} document
* @param {object} node
* @param {object} before
*/
function appendBody (doc, node, before) {
var documentElement = doc.documentElement;
if (documentElement.pureChildren.length > 0 || node.parentNode) {
return
}
var children = documentElement.children;
var beforeIndex = children.indexOf(before);
if (beforeIndex < 0) {
children.push(node);
}
else {
children.splice(beforeIndex, 0, node);
}
if (node.nodeType === 1) {
if (node.role === 'body') {
node.docId = doc.id;
node.ownerDocument = doc;
node.parentNode = documentElement;
linkParent(node, documentElement);
}
else {
node.children.forEach(function (child) {
child.parentNode = node;
});
setBody(doc, node);
node.docId = doc.id;
node.ownerDocument = doc;
linkParent(node, documentElement);
delete doc.nodeMap[node.nodeId];
}
documentElement.pureChildren.push(node);
sendBody(doc, node);
}
else {
node.parentNode = documentElement;
doc.nodeMap[node.ref] = node;
}
}
function sendBody (doc, node) {
var body = node.toJSON();
var children = body.children;
delete body.children;
var result = doc.taskCenter.send('dom', { action: 'createBody' }, [body]);
if (children) {
children.forEach(function (child) {
result = doc.taskCenter.send('dom', { action: 'addElement' }, [body.ref, child, -1]);
});
}
return result
}
/**
* Set up body node.
* @param {object} document
* @param {object} element
*/
function setBody (doc, el) {
el.role = 'body';
el.depth = 1;
delete doc.nodeMap[el.nodeId];
el.ref = '_root';
doc.nodeMap._root = el;
doc.body = el;
}
/**
* Establish the connection between parent and child node.
* @param {object} child node
* @param {object} parent node
*/
function linkParent (node, parent) {
node.parentNode = parent;
if (parent.docId) {
node.docId = parent.docId;
node.ownerDocument = parent.ownerDocument;
node.ownerDocument.nodeMap[node.nodeId] = node;
node.depth = parent.depth + 1;
}
node.children.forEach(function (child) {
linkParent(child, node);
});
}
/**
* Get the next sibling element.
* @param {object} node
*/
function nextElement (node) {
while (node) {
if (node.nodeType === 1) {
return node
}
node = node.nextSibling;
}
}
/**
* Get the previous sibling element.
* @param {object} node
*/
function previousElement (node) {
while (node) {
if (node.nodeType === 1) {
return node
}
node = node.previousSibling;
}
}
/**
* Insert a node into list at the specified index.
* @param {object} target node
* @param {array} list
* @param {number} newIndex
* @param {boolean} changeSibling
* @return {number} newIndex
*/
function insertIndex (target, list, newIndex, changeSibling) {
/* istanbul ignore next */
if (newIndex < 0) {
newIndex = 0;
}
var before = list[newIndex - 1];
var after = list[newIndex];
list.splice(newIndex, 0, target);
if (changeSibling) {
before && (before.nextSibling = target);
target.previousSibling = before;
target.nextSibling = after;
after && (after.previousSibling = target);
}
return newIndex
}
/**
* Move the node to a new index in list.
* @param {object} target node
* @param {array} list
* @param {number} newIndex
* @param {boolean} changeSibling
* @return {number} newIndex
*/
function moveIndex (target, list, newIndex, changeSibling) {
var index = list.indexOf(target);
/* istanbul ignore next */
if (index < 0) {
return -1
}
if (changeSibling) {
var before = list[index - 1];
var after = list[index + 1];
before && (before.nextSibling = after);
after && (after.previousSibling = before);
}
list.splice(index, 1);
var newIndexAfter = newIndex;
if (index <= newIndex) {
newIndexAfter = newIndex - 1;
}
var beforeNew = list[newIndexAfter - 1];
var afterNew = list[newIndexAfter];
list.splice(newIndexAfter, 0, target);
if (changeSibling) {
beforeNew && (beforeNew.nextSibling = target);
target.previousSibling = beforeNew;
target.nextSibling = afterNew;
afterNew && (afterNew.previousSibling = target);
}
if (index === newIndexAfter) {
return -1
}
return newIndex
}
/**
* Remove the node from list.
* @param {object} target node
* @param {array} list
* @param {boolean} changeSibling
*/
function removeIndex (target, list, changeSibling) {
var index = list.indexOf(target);
/* istanbul ignore next */
if (index < 0) {
return
}
if (changeSibling) {
var before = list[index - 1];
var after = list[index + 1];
before && (before.nextSibling = after);
after && (after.previousSibling = before);
}
list.splice(index, 1);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var Node = function Node () {
this.nodeId = uniqueId();
this.ref = this.nodeId;
this.children = [];
this.pureChildren = [];
this.parentNode = null;
this.nextSibling = null;
this.previousSibling = null;
};
/**
* Destroy current node, and remove itself form nodeMap.
*/
Node.prototype.destroy = function destroy () {
var doc = getDoc(this.docId);
if (doc) {
delete this.docId;
delete doc.nodeMap[this.nodeId];
}
this.children.forEach(function (child) {
child.destroy();
});
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var Element$2;
function setElement (El) {
Element$2 = El;
}
/**
* A map which stores all type of elements.
* @type {Object}
*/
var registeredElements = {};
/**
* Register an extended element type with component methods.
* @param {string} type component type
* @param {array} methods a list of method names
*/
function registerElement (type, methods) {
// Skip when no special component methods.
if (!methods || !methods.length) {
return
}
// Init constructor.
var WeexElement = (function (Element) {
function WeexElement () {
Element.apply(this, arguments);
}if ( Element ) WeexElement.__proto__ = Element;
WeexElement.prototype = Object.create( Element && Element.prototype );
WeexElement.prototype.constructor = WeexElement;
return WeexElement;
}(Element$2));
// Add methods to prototype.
methods.forEach(function (methodName) {
WeexElement.prototype[methodName] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
return taskCenter.send('component', {
ref: this.ref,
component: type,
method: methodName
}, args)
}
};
});
// Add to element type map.
registeredElements[type] = WeexElement;
}
function getWeexElement (type) {
return registeredElements[type]
}
/**
* Clear all element types. Only for testing.
*/
// match the binding delimiter
var delimiterRE = /\[\[((?:.|\n)+?)\]\]/g;
function generateBinding (text) {
if (typof(text) === 'String') {
return { '@binding': text }
}
return text
}
function parseString (string) {
var tokens = [];
var lastIndex = delimiterRE.lastIndex = 0;
var match, index;
while ((match = delimiterRE.exec(string))) {
index = match.index;
if (index > lastIndex) {
tokens.push(string.slice(lastIndex, index));
}
var binding = generateBinding(match[1].trim());
tokens.push(binding);
lastIndex = index + match[0].length;
}
if (lastIndex < string.length) {
tokens.push(string.slice(lastIndex));
}
if (tokens.length === 1) {
return tokens[0]
}
return tokens
}
function filterDirective (value) {
if (typof(value) === 'String' && delimiterRE.test(value)) {
return parseString(value)
}
if (typof(value) === 'Object') {
var realData = {};
for (var key in value) {
realData[key] = filterDirective(value[key]);
}
return realData
}
if (typof(value) === 'Array') {
return value.map(filterDirective)
}
return value
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var DEFAULT_TAG_NAME = 'div';
var BUBBLE_EVENTS = [
'click', 'longpress', 'touchstart', 'touchmove', 'touchend',
'panstart', 'panmove', 'panend', 'horizontalpan', 'verticalpan', 'swipe'
];
function registerNode (docId, node) {
var doc = getDoc(docId);
doc.nodeMap[node.nodeId] = node;
}
var Element = (function (Node$$1) {
function Element (type, props, isExtended) {
if ( type === void 0 ) type = DEFAULT_TAG_NAME;
Node$$1.call(this);
var WeexElement = getWeexElement(type);
if (WeexElement && !isExtended) {
return new WeexElement(props)
}
props = props || {};
this.nodeType = 1;
this.nodeId = uniqueId();
this.ref = this.nodeId;
this.type = type;
this.attr = props.attr || {};
this.style = props.style || {};
this.classStyle = props.classStyle || {};
this.event = {};
this.children = [];
this.pureChildren = [];
}
if ( Node$$1 ) Element.__proto__ = Node$$1;
Element.prototype = Object.create( Node$$1 && Node$$1.prototype );
Element.prototype.constructor = Element;
/**
* Append a child node.
* @param {object} node
* @return {undefined | number} the signal sent by native
*/
Element.prototype.appendChild = function appendChild (node) {
if (node.parentNode && node.parentNode !== this) {
return
}
/* istanbul ignore else */
if (!node.parentNode) {
linkParent(node, this);
insertIndex(node, this.children, this.children.length, true);
if (this.docId) {
registerNode(this.docId, node);
}
if (node.nodeType === 1) {
insertIndex(node, this.pureChildren, this.pureChildren.length);
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
return taskCenter.send(
'dom',
{ action: 'addElement' },
[this.ref, node.toJSON(), -1]
)
}
}
}
else {
moveIndex(node, this.children, this.children.length, true);
if (node.nodeType === 1) {
var index = moveIndex(node, this.pureChildren, this.pureChildren.length);
var taskCenter$1 = getTaskCenter(this.docId);
if (taskCenter$1 && index >= 0) {
return taskCenter$1.send(
'dom',
{ action: 'moveElement' },
[node.ref, this.ref, index]
)
}
}
}
};
/**
* Insert a node before specified node.
* @param {object} node
* @param {object} before
* @return {undefined | number} the signal sent by native
*/
Element.prototype.insertBefore = function insertBefore (node, before) {
if (node.parentNode && node.parentNode !== this) {
return
}
if (node === before || (node.nextSibling && node.nextSibling === before)) {
return
}
if (!node.parentNode) {
linkParent(node, this);
insertIndex(node, this.children, this.children.indexOf(before), true);
if (this.docId) {
registerNode(this.docId, node);
}
if (node.nodeType === 1) {
var pureBefore = nextElement(before);
var index = insertIndex(
node,
this.pureChildren,
pureBefore
? this.pureChildren.indexOf(pureBefore)
: this.pureChildren.length
);
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
return taskCenter.send(
'dom',
{ action: 'addElement' },
[this.ref, node.toJSON(), index]
)
}
}
}
else {
moveIndex(node, this.children, this.children.indexOf(before), true);
if (node.nodeType === 1) {
var pureBefore$1 = nextElement(before);
/* istanbul ignore next */
var index$1 = moveIndex(
node,
this.pureChildren,
pureBefore$1
? this.pureChildren.indexOf(pureBefore$1)
: this.pureChildren.length
);
var taskCenter$1 = getTaskCenter(this.docId);
if (taskCenter$1 && index$1 >= 0) {
return taskCenter$1.send(
'dom',
{ action: 'moveElement' },
[node.ref, this.ref, index$1]
)
}
}
}
};
/**
* Insert a node after specified node.
* @param {object} node
* @param {object} after
* @return {undefined | number} the signal sent by native
*/
Element.prototype.insertAfter = function insertAfter (node, after) {
if (node.parentNode && node.parentNode !== this) {
return
}
if (node === after || (node.previousSibling && node.previousSibling === after)) {
return
}
if (!node.parentNode) {
linkParent(node, this);
insertIndex(node, this.children, this.children.indexOf(after) + 1, true);
/* istanbul ignore else */
if (this.docId) {
registerNode(this.docId, node);
}
if (node.nodeType === 1) {
var index = insertIndex(
node,
this.pureChildren,
this.pureChildren.indexOf(previousElement(after)) + 1
);
var taskCenter = getTaskCenter(this.docId);
/* istanbul ignore else */
if (taskCenter) {
return taskCenter.send(
'dom',
{ action: 'addElement' },
[this.ref, node.toJSON(), index]
)
}
}
}
else {
moveIndex(node, this.children, this.children.indexOf(after) + 1, true);
if (node.nodeType === 1) {
var index$1 = moveIndex(
node,
this.pureChildren,
this.pureChildren.indexOf(previousElement(after)) + 1
);
var taskCenter$1 = getTaskCenter(this.docId);
if (taskCenter$1 && index$1 >= 0) {
return taskCenter$1.send(
'dom',
{ action: 'moveElement' },
[node.ref, this.ref, index$1]
)
}
}
}
};
/**
* Remove a child node, and decide whether it should be destroyed.
* @param {object} node
* @param {boolean} preserved
*/
Element.prototype.removeChild = function removeChild (node, preserved) {
if (node.parentNode) {
removeIndex(node, this.children, true);
if (node.nodeType === 1) {
removeIndex(node, this.pureChildren);
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
taskCenter.send(
'dom',
{ action: 'removeElement' },
[node.ref]
);
}
}
}
if (!preserved) {
node.destroy();
}
};
/**
* Clear all child nodes.
*/
Element.prototype.clear = function clear () {
var taskCenter = getTaskCenter(this.docId);
/* istanbul ignore else */
if (taskCenter) {
this.pureChildren.forEach(function (node) {
taskCenter.send(
'dom',
{ action: 'removeElement' },
[node.ref]
);
});
}
this.children.forEach(function (node) {
node.destroy();
});
this.children.length = 0;
this.pureChildren.length = 0;
};
/**
* Set an attribute, and decide whether the task should be send to native.
* @param {string} key
* @param {string | number} value
* @param {boolean} silent
*/
Element.prototype.setAttr = function setAttr (key, value, silent) {
if (this.attr[key] === value && silent !== false) {
return
}
this.attr[key] = value;
var taskCenter = getTaskCenter(this.docId);
if (!silent && taskCenter) {
var result = {};
result[key] = filterDirective(value);
taskCenter.send(
'dom',
{ action: 'updateAttrs' },
[this.ref, result]
);
}
};
/**
* Set a style property, and decide whether the task should be send to native.
* @param {string} key
* @param {string | number} value
* @param {boolean} silent
*/
Element.prototype.setStyle = function setStyle (key, value, silent) {
if (this.style[key] === value && silent !== false) {
return
}
this.style[key] = value;
var taskCenter = getTaskCenter(this.docId);
if (!silent && taskCenter) {
var result = {};
result[key] = value;
taskCenter.send(
'dom',
{ action: 'updateStyle' },
[this.ref, result]
);
}
};
/**
* Set style properties from class.
* @param {object} classStyle
*/
Element.prototype.setClassStyle = function setClassStyle (classStyle) {
var this$1 = this;
// reset previous class style to empty string
for (var key in this.classStyle) {
this$1.classStyle[key] = '';
}
Object.assign(this.classStyle, classStyle);
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
taskCenter.send(
'dom',
{ action: 'updateStyle' },
[this.ref, this.toStyle()]
);
}
};
/**
* Add an event handler.
* @param {string} event type
* @param {function} event handler
*/
Element.prototype.addEvent = function addEvent (type, handler) {
if (!this.event[type]) {
this.event[type] = handler;
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
taskCenter.send(
'dom',
{ action: 'addEvent' },
[this.ref, type]
);
}
}
};
/**
* Remove an event handler.
* @param {string} event type
*/
Element.prototype.removeEvent = function removeEvent (type) {
if (this.event[type]) {
delete this.event[type];
var taskCenter = getTaskCenter(this.docId);
if (taskCenter) {
taskCenter.send(
'dom',
{ action: 'removeEvent' },
[this.ref, type]
);
}
}
};
/**
* Fire an event manually.
* @param {string} type type
* @param {function} e handler
* @param {boolean} isBubble whether or not event bubble
* @return {} anything returned by handler function
*/
Element.prototype.fireEvent = function fireEvent (type, e, isBubble) {
var result = null;
var isStopPropagation = false;
var handler = this.event[type];
if (handler && e) {
e.stopPropagation = function () {
isStopPropagation = true;
};
result = handler.call(this, e);
}
if (!isStopPropagation
&& isBubble
&& BUBBLE_EVENTS.includes(type)
&& this.parentNode
&& this.parentNode.fireEvent) {
e.currentTarget = this.parentNode;
this.parentNode.fireEvent(type, e, isBubble);
}
return result
};
/**
* Get all styles of current element.
* @return {object} style
*/
Element.prototype.toStyle = function toStyle () {
return Object.assign({}, this.classStyle, this.style)
};
/**
* Convert current element to JSON like object.
* @return {object} element
*/
Element.prototype.toJSON = function toJSON () {
var result = {
ref: this.ref.toString(),
type: this.type,
attr: filterDirective(this.attr),
style: this.toStyle()
};
var event = Object.keys(this.event);
if (event.length) {
result.event = event;
}
if (this.pureChildren.length) {
result.children = this.pureChildren.map(function (child) { return child.toJSON(); });
}
return result
};
/**
* Convert to HTML element tag string.
* @return {stirng} html
*/
Element.prototype.toString = function toString () {
return '<' + this.type +
' attr=' + JSON.stringify(this.attr) +
' style=' + JSON.stringify(this.toStyle()) + '>' +
this.pureChildren.map(function (child) { return child.toString(); }).join('') +
'</' + this.type + '>'
};
return Element;
}(Node));
setElement(Element);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var fallback = function () {};
// The API of TaskCenter would be re-design.
var TaskCenter = function TaskCenter (id, sendTasks) {
Object.defineProperty(this, 'instanceId', {
enumerable: true,
value: id
});
Object.defineProperty(this, 'callbackManager', {
enumerable: true,
value: new CallbackManager(id)
});
fallback = sendTasks || function () {};
};
TaskCenter.prototype.callback = function callback (callbackId, data, ifKeepAlive) {
return this.callbackManager.consume(callbackId, data, ifKeepAlive)
};
TaskCenter.prototype.destroyCallback = function destroyCallback () {
return this.callbackManager.close()
};
/**
* Normalize a value. Specially, if the value is a function, then generate a function id
* and save it to `CallbackManager`, at last return the function id.
* @param{any} v
* @return {primitive}
*/
TaskCenter.prototype.normalize = function normalize (v) {
var type = typof(v);
if (v && v instanceof Element) {
return v.ref
}
if (v && v._isVue && v.$el instanceof Element) {
return v.$el.ref
}
if (type === 'Function') {
return this.callbackManager.add(v).toString()
}
return normalizePrimitive(v)
};
TaskCenter.prototype.send = function send (type, params, args, options) {
var this$1 = this;
var action = params.action;
var component = params.component;
var ref = params.ref;
var module = params.module;
var method = params.method;
args = args.map(function (arg) { return this$1.normalize(arg); });
switch (type) {
case 'dom':
return this[action](this.instanceId, args)
case 'component':
return this.componentHandler(this.instanceId, ref, method, args, Object.assign({ component: component }, options))
default:
return this.moduleHandler(this.instanceId, module, method, args, options)
}
};
TaskCenter.prototype.callDOM = function callDOM (action, args) {
return this[action](this.instanceId, args)
};
TaskCenter.prototype.callComponent = function callComponent (ref, method, args, options) {
return this.componentHandler(this.instanceId, ref, method, args, options)
};
TaskCenter.prototype.callModule = function callModule (module, method, args, options) {
return this.moduleHandler(this.instanceId, module, method, args, options)
};
function init$2 () {
var DOM_METHODS = {
createFinish: global.callCreateFinish,
updateFinish: global.callUpdateFinish,
refreshFinish: global.callRefreshFinish,
createBody: global.callCreateBody,
addElement: global.callAddElement,
removeElement: global.callRemoveElement,
moveElement: global.callMoveElement,
updateAttrs: global.callUpdateAttrs,
updateStyle: global.callUpdateStyle,
addEvent: global.callAddEvent,
removeEvent: global.callRemoveEvent
};
var proto = TaskCenter.prototype;
var loop = function ( name ) {
var method = DOM_METHODS[name];
proto[name] = method ?
function (id, args) { return method.apply(void 0, [ id ].concat( args )); } :
function (id, args) { return fallback(id, [{ module: 'dom', method: name, args: args }], '-1'); };
};
for (var name in DOM_METHODS) loop( name );
proto.componentHandler = global.callNativeComponent ||
(function (id, ref, method, args, options) { return fallback(id, [{ component: options.component, ref: ref, method: method, args: args }]); });
proto.moduleHandler = global.callNativeModule ||
(function (id, module, method, args) { return fallback(id, [{ module: module, method: method, args: args }]); });
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// JS Services
var services = [];
/**
* Register a JavaScript service.
* A JavaScript service options could have a set of lifecycle methods
* for each Weex instance. For example: create, refresh, destroy.
* For the JS framework maintainer if you want to supply some features
* which need to work well in different Weex instances, even in different
* frameworks separately. You can make a JavaScript service to init
* its variables or classes for each Weex instance when it's created
* and recycle them when it's destroyed.
* @param {object} options Could have { create, refresh, destroy }
* lifecycle methods. In create method it should
* return an object of what variables or classes
* would be injected into the Weex instance.
*/
function register$1 (name, options) {
if (has$5(name)) {
console.warn(("Service \"" + name + "\" has been registered already!"));
}
else {
options = Object.assign({}, options);
services.push({ name: name, options: options });
}
}
/**
* Unregister a JavaScript service by name
* @param {string} name
*/
function unregister (name) {
services.some(function (service, index) {
if (service.name === name) {
services.splice(index, 1);
return true
}
});
}
/**
* Check if a JavaScript service with a certain name existed.
* @param {string} name
* @return {Boolean}
*/
function has$5 (name) {
return indexOf(name) >= 0
}
/**
* Find the index of a JavaScript service by name
* @param {string} name
* @return {number}
*/
function indexOf (name) {
return services.map(function (service) { return service.name; }).indexOf(name)
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var frameworks;
var runtimeConfig;
var versionRegExp = /^\s*\/\/ *(\{[^}]*\}) *\r?\n/;
/**
* Detect a JS Bundle code and make sure which framework it's based to. Each JS
* Bundle should make sure that it starts with a line of JSON comment and is
* more that one line.
* @param {string} code
* @return {object}
*/
function getBundleType (code) {
var result = versionRegExp.exec(code);
if (result) {
try {
var info = JSON.parse(result[1]);
return info.framework
}
catch (e) {}
}
// default bundle type
return 'Weex'
}
function createServices (id, env, config) {
// Init JavaScript services for this instance.
var serviceMap = Object.create(null);
serviceMap.service = Object.create(null);
services.forEach(function (ref) {
var name = ref.name;
var options = ref.options;
{
console.debug(("[JS Runtime] create service " + name + "."));
}
var create = options.create;
if (create) {
var result = create(id, env, config);
Object.assign(serviceMap.service, result);
Object.assign(serviceMap, result.instance);
}
});
delete serviceMap.service.instance;
Object.freeze(serviceMap.service);
return serviceMap
}
var instanceMap = {};
function getFrameworkType (id) {
if (instanceMap[id]) {
return instanceMap[id].framework
}
}
/**
* Check which framework a certain JS Bundle code based to. And create instance
* by this framework.
* @param {string} id
* @param {string} code
* @param {object} config
* @param {object} data
*/
function createInstance (id, code, config, data) {
if (instanceMap[id]) {
return new Error(("invalid instance id \"" + id + "\""))
}
// Init instance info.
var bundleType = getBundleType(code);
// Init instance config.
config = JSON.parse(JSON.stringify(config || {}));
config.env = JSON.parse(JSON.stringify(global.WXEnvironment || {}));
var context = {
config: config,
created: Date.now(),
framework: bundleType
};
context.services = createServices(id, context, runtimeConfig);
instanceMap[id] = context;
{
console.debug(("[JS Framework] create an " + bundleType + " instance"));
}
var fm = frameworks[bundleType];
if (!fm) {
return new Error(("invalid bundle type \"" + bundleType + "\"."))
}
return fm.createInstance(id, code, config, data, context)
}
var methods = {
createInstance: createInstance,
registerService: register$1,
unregisterService: unregister
};
/**
* Register methods which init each frameworks.
* @param {string} methodName
*/
function genInit (methodName) {
methods[methodName] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (methodName === 'registerComponents') {
checkComponentMethods(args[0]);
}
for (var name in frameworks) {
var framework = frameworks[name];
if (framework && framework[methodName]) {
framework[methodName].apply(framework, args);
}
}
};
}
function checkComponentMethods (components) {
if (Array.isArray(components)) {
components.forEach(function (name) {
if (name && name.type && name.methods) {
registerElement(name.type, name.methods);
}
});
}
}
/**
* Register methods which will be called for each instance.
* @param {string} methodName
*/
function genInstance (methodName) {
methods[methodName] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var id = args[0];
var type = getFrameworkType(id);
if (type && frameworks[type]) {
var result = (ref = frameworks[type])[methodName].apply(ref, args);
var info = { framework: type };
// Lifecycle methods
if (methodName === 'refreshInstance') {
services.forEach(function (service) {
var refresh = service.options.refresh;
if (refresh) {
refresh(id, { info: info, runtime: runtimeConfig });
}
});
}
else if (methodName === 'destroyInstance') {
services.forEach(function (service) {
var destroy = service.options.destroy;
if (destroy) {
destroy(id, { info: info, runtime: runtimeConfig });
}
});
delete instanceMap[id];
}
return result
}
return new Error(("invalid instance id \"" + id + "\""))
var ref;
};
}
/**
* Adapt some legacy method(s) which will be called for each instance. These
* methods should be deprecated and removed later.
* @param {string} methodName
* @param {string} nativeMethodName
*/
function adaptInstance (methodName, nativeMethodName) {
methods[nativeMethodName] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var id = args[0];
var type = getFrameworkType(id);
if (type && frameworks[type]) {
return (ref = frameworks[type])[methodName].apply(ref, args)
}
return new Error(("invalid instance id \"" + id + "\""))
var ref;
};
}
function init$1 (config) {
runtimeConfig = config || {};
frameworks = runtimeConfig.frameworks || {};
init$2();
// Init each framework by `init` method and `config` which contains three
// virtual-DOM Class: `Document`, `Element` & `Comment`, and a JS bridge method:
// `sendTasks(...args)`.
for (var name in frameworks) {
var framework = frameworks[name];
framework.init(config);
}
// @todo: The method `registerMethods` will be re-designed or removed later.
['registerComponents', 'registerModules', 'registerMethods'].forEach(genInit)
; ['destroyInstance', 'refreshInstance', 'receiveTasks', 'getRoot'].forEach(genInstance);
adaptInstance('receiveTasks', 'callJS');
return methods
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var Comment = (function (Node$$1) {
function Comment (value) {
Node$$1.call(this);
this.nodeType = 8;
this.nodeId = uniqueId();
this.ref = this.nodeId;
this.type = 'comment';
this.value = value;
this.children = [];
this.pureChildren = [];
}
if ( Node$$1 ) Comment.__proto__ = Node$$1;
Comment.prototype = Object.create( Node$$1 && Node$$1.prototype );
Comment.prototype.constructor = Comment;
/**
* Convert to HTML comment string.
* @return {stirng} html
*/
Comment.prototype.toString = function toString () {
return '<!-- ' + this.value + ' -->'
};
return Comment;
}(Node));
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Create the action object.
* @param {string} name
* @param {array} arguments
* @return {object} action
*/
function createAction (name, args) {
if ( args === void 0 ) args = [];
return { module: 'dom', method: name, args: args }
}
var Listener = function Listener (id, handler) {
this.id = id;
this.batched = false;
this.updates = [];
if (typeof handler === 'function') {
Object.defineProperty(this, 'handler', {
configurable: true,
enumerable: true,
writable: true,
value: handler
});
}
else {
console.error('[JS Runtime] invalid parameter, handler must be a function');
}
};
/**
* Send the "createFinish" signal.
* @param {function} callback
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.createFinish = function createFinish (callback) {
var handler = this.handler;
return handler([createAction('createFinish')], callback)
};
/**
* Send the "updateFinish" signal.
* @param {function} callback
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.updateFinish = function updateFinish (callback) {
var handler = this.handler;
return handler([createAction('updateFinish')], callback)
};
/**
* Send the "refreshFinish" signal.
* @param {function} callback
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.refreshFinish = function refreshFinish (callback) {
var handler = this.handler;
return handler([createAction('refreshFinish')], callback)
};
/**
* Send the "createBody" signal.
* @param {object} element
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.createBody = function createBody (element) {
var body = element.toJSON();
var children = body.children;
delete body.children;
var actions = [createAction('createBody', [body])];
if (children) {
actions.push.apply(actions, children.map(function (child) {
return createAction('addElement', [body.ref, child, -1])
}));
}
return this.addActions(actions)
};
/**
* Send the "addElement" signal.
* @param {object} element
* @param {stirng} reference id
* @param {number} index
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.addElement = function addElement (element, ref, index) {
if (!(index >= 0)) {
index = -1;
}
return this.addActions(createAction('addElement', [ref, element.toJSON(), index]))
};
/**
* Send the "removeElement" signal.
* @param {stirng} reference id
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.removeElement = function removeElement (ref) {
if (Array.isArray(ref)) {
var actions = ref.map(function (r) { return createAction('removeElement', [r]); });
return this.addActions(actions)
}
return this.addActions(createAction('removeElement', [ref]))
};
/**
* Send the "moveElement" signal.
* @param {stirng} target reference id
* @param {stirng} parent reference id
* @param {number} index
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.moveElement = function moveElement (targetRef, parentRef, index) {
return this.addActions(createAction('moveElement', [targetRef, parentRef, index]))
};
/**
* Send the "updateAttrs" signal.
* @param {stirng} reference id
* @param {stirng} key
* @param {stirng} value
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.setAttr = function setAttr (ref, key, value) {
var result = {};
result[key] = value;
return this.addActions(createAction('updateAttrs', [ref, result]))
};
/**
* Send the "updateStyle" signal, update a sole style.
* @param {stirng} reference id
* @param {stirng} key
* @param {stirng} value
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.setStyle = function setStyle (ref, key, value) {
var result = {};
result[key] = value;
return this.addActions(createAction('updateStyle', [ref, result]))
};
/**
* Send the "updateStyle" signal.
* @param {stirng} reference id
* @param {object} style
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.setStyles = function setStyles (ref, style) {
return this.addActions(createAction('updateStyle', [ref, style]))
};
/**
* Send the "addEvent" signal.
* @param {stirng} reference id
* @param {string} event type
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.addEvent = function addEvent (ref, type) {
return this.addActions(createAction('addEvent', [ref, type]))
};
/**
* Send the "removeEvent" signal.
* @param {stirng} reference id
* @param {string} event type
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.removeEvent = function removeEvent (ref, type) {
return this.addActions(createAction('removeEvent', [ref, type]))
};
/**
* Default handler.
* @param {object | array} actions
* @param {function} callback
* @return {} anything returned by callback function
*/
Listener.prototype.handler = function handler (actions, cb) {
return cb && cb()
};
/**
* Add actions into updates.
* @param {object | array} actions
* @return {undefined | number} the signal sent by native
*/
Listener.prototype.addActions = function addActions (actions) {
var updates = this.updates;
var handler = this.handler;
if (!Array.isArray(actions)) {
actions = [actions];
}
if (this.batched) {
updates.push.apply(updates, actions);
}
else {
return handler(actions)
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Task handler for communication between javascript and native.
*/
var handlerMap = {
createBody: 'callCreateBody',
addElement: 'callAddElement',
removeElement: 'callRemoveElement',
moveElement: 'callMoveElement',
updateAttrs: 'callUpdateAttrs',
updateStyle: 'callUpdateStyle',
addEvent: 'callAddEvent',
removeEvent: 'callRemoveEvent'
};
/**
* Create a task handler.
* @param {string} id
* @param {function} handler
* @return {function} taskHandler
*/
function createHandler (id, handler) {
var defaultHandler = handler || global.callNative;
/* istanbul ignore if */
if (typeof defaultHandler !== 'function') {
console.error('[JS Runtime] no default handler');
}
return function taskHandler (tasks) {
/* istanbul ignore if */
if (!Array.isArray(tasks)) {
tasks = [tasks];
}
for (var i = 0; i < tasks.length; i++) {
var returnValue = dispatchTask(id, tasks[i], defaultHandler);
if (returnValue === -1) {
return returnValue
}
}
}
}
/**
* Check if there is a corresponding available handler in the environment.
* @param {string} module
* @param {string} method
* @return {boolean}
*/
function hasAvailableHandler (module, method) {
return module === 'dom'
&& handlerMap[method]
&& typeof global[handlerMap[method]] === 'function'
}
/**
* Dispatch the task to the specified handler.
* @param {string} id
* @param {object} task
* @param {function} defaultHandler
* @return {number} signal returned from native
*/
function dispatchTask (id, task, defaultHandler) {
var module = task.module;
var method = task.method;
var args = task.args;
if (hasAvailableHandler(module, method)) {
return global[handlerMap[method]].apply(global, [ id ].concat( args, ['-1'] ))
}
return defaultHandler(id, [task], '-1')
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Update all changes for an element.
* @param {object} element
* @param {object} changes
*/
function updateElement (el, changes) {
var attrs = changes.attrs || {};
for (var name in attrs) {
el.setAttr(name, attrs[name], true);
}
var style = changes.style || {};
for (var name$1 in style) {
el.setStyle(name$1, style[name$1], true);
}
}
var Document = function Document (id, url, handler) {
id = id ? id.toString() : '';
this.id = id;
this.URL = url;
addDoc(id, this);
this.nodeMap = {};
var L = Document.Listener || Listener;
this.listener = new L(id, handler || createHandler(id, Document.handler)); // deprecated
this.taskCenter = new TaskCenter(id, handler ? function (id) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
return handler.apply(void 0, args);
} : Document.handler);
this.createDocumentElement();
};
/**
* Get the node from nodeMap.
* @param {string} reference id
* @return {object} node
*/
Document.prototype.getRef = function getRef (ref) {
return this.nodeMap[ref]
};
/**
* Turn on batched updates.
*/
Document.prototype.open = function open () {
this.listener.batched = false;
};
/**
* Turn off batched updates.
*/
Document.prototype.close = function close () {
this.listener.batched = true;
};
/**
* Create the document element.
* @return {object} documentElement
*/
Document.prototype.createDocumentElement = function createDocumentElement () {
var this$1 = this;
if (!this.documentElement) {
var el = new Element('document');
el.docId = this.id;
el.ownerDocument = this;
el.role = 'documentElement';
el.depth = 0;
el.ref = '_documentElement';
this.nodeMap._documentElement = el;
this.documentElement = el;
Object.defineProperty(el, 'appendChild', {
configurable: true,
enumerable: true,
writable: true,
value: function (node) {
appendBody(this$1, node);
}
});
Object.defineProperty(el, 'insertBefore', {
configurable: true,
enumerable: true,
writable: true,
value: function (node, before) {
appendBody(this$1, node, before);
}
});
}
return this.documentElement
};
/**
* Create the body element.
* @param {string} type
* @param {objct} props
* @return {object} body element
*/
Document.prototype.createBody = function createBody (type, props) {
if (!this.body) {
var el = new Element(type, props);
setBody(this, el);
}
return this.body
};
/**
* Create an element.
* @param {string} tagName
* @param {objct} props
* @return {object} element
*/
Document.prototype.createElement = function createElement (tagName, props) {
return new Element(tagName, props)
};
/**
* Create an comment.
* @param {string} text
* @return {object} comment
*/
Document.prototype.createComment = function createComment (text) {
return new Comment(text)
};
/**
* Fire an event on specified element manually.
* @param {object} element
* @param {string} event type
* @param {object} event object
* @param {object} dom changes
* @return {} anything returned by handler function
*/
Document.prototype.fireEvent = function fireEvent (el, type, e, domChanges) {
if (!el) {
return
}
e = e || {};
e.type = type;
e.target = el;
e.currentTarget = el;
e.timestamp = Date.now();
if (domChanges) {
updateElement(el, domChanges);
}
var isBubble = this.getRef('_root').attr['bubble'] === 'true';
return el.fireEvent(type, e, isBubble)
};
/**
* Destroy current document, and remove itself form docMap.
*/
Document.prototype.destroy = function destroy () {
this.taskCenter.destroyCallback();
delete this.listener;
delete this.nodeMap;
delete this.taskCenter;
removeDoc(this.id);
};
// default task handler
Document.handler = null;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var config = {
Document: Document, Element: Element, Comment: Comment, Listener: Listener,
TaskCenter: TaskCenter,
sendTasks: function sendTasks () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
if (typeof callNative === 'function') {
return callNative.apply(void 0, args)
}
return (global.callNative || (function () {})).apply(void 0, args)
}
};
Document.handler = config.sendTasks;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Register framework(s) in JS runtime. Weex supply two layers for 3rd-party
* framework(s): one is the instance management layer, another is the
* virtual-DOM layer.
*/
/* istanbul ignore next */
function freezePrototype$$1 () {
freezePrototype$1();
Object.freeze(config.Element);
Object.freeze(config.Comment);
Object.freeze(config.Listener);
Object.freeze(config.Document.prototype);
Object.freeze(config.Element.prototype);
Object.freeze(config.Comment.prototype);
Object.freeze(config.Listener.prototype);
}
var runtime = {
setNativeConsole: setNativeConsole,
resetNativeConsole: resetNativeConsole,
setNativeTimer: setNativeTimer,
resetNativeTimer: resetNativeTimer,
service: { register: register$1, unregister: unregister, has: has$5 },
freezePrototype: freezePrototype$$1,
init: init$1,
config: config
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var config$2 = {};
var instanceMap$1 = {};
function init$3 (cfg) {
config$2.Document = cfg.Document;
config$2.Element = cfg.Element;
config$2.Comment = cfg.Comment;
config$2.sendTasks = cfg.sendTasks;
}
function createInstance$1 (id, code, options, data, serviceObjects) {
if ( options === void 0 ) options = {};
if ( data === void 0 ) data = {};
if ( serviceObjects === void 0 ) serviceObjects = {};
var document = new config$2.Document(id, options.bundleUrl);
var callbacks = {};
var instance = { id: id, data: data, document: document, callbacks: callbacks };
var lastCallbackId = 0;
document.addCallback = function (func) {
lastCallbackId++;
callbacks[lastCallbackId] = func;
return lastCallbackId
};
document.handleCallback = function (funcId, data, ifLast) {
var callback = callbacks[funcId];
if (ifLast) {
delete callbacks[funcId];
}
return callback(data)
};
instanceMap$1[id] = instance;
var globalObjects = Object.assign({
Document: config$2.Document,
Element: config$2.Element,
Comment: config$2.Comment,
sendTasks: function (tasks) { return config$2.sendTasks(id, tasks, -1); },
options: options,
document: document
}, serviceObjects);
var globalKeys = [];
var globalValues = [];
for (var key in globalObjects) {
globalKeys.push(key);
globalValues.push(globalObjects[key]);
}
globalKeys.push(code);
var result = new (Function.prototype.bind.apply( Function, [ null ].concat( globalKeys) ));
result.apply(void 0, globalValues);
config$2.sendTasks(id, [{ module: 'dom', method: 'createFinish', args: [] }], -1);
return instance
}
function destroyInstance (id) {
delete instanceMap$1[id];
}
function getRoot (id) {
return instanceMap$1[id].document.body.toJSON()
}
function receiveTasks (id, tasks) {
var jsHandlers = {
fireEvent: function (id, ref, type, data, domChanges) {
var ref$1 = instanceMap$1[id];
var document = ref$1.document;
var el = document.getRef(ref);
return document.fireEvent(el, type, data, domChanges)
},
callback: function (id, funcId, data, ifLast) {
var ref = instanceMap$1[id];
var document = ref.document;
return document.handleCallback(funcId, data, ifLast)
}
};
var ref = instanceMap$1[id] || {};
var document = ref.document;
if (document && Array.isArray(tasks)) {
var results = [];
tasks.forEach(function (task) {
var handler = jsHandlers[task.method];
var args = [].concat( task.args );
if (typeof handler === 'function') {
args.unshift(id);
results.push(handler.apply(void 0, args));
}
});
return results
}
}
var Vanilla = Object.freeze({
init: init$3,
createInstance: createInstance$1,
destroyInstance: destroyInstance,
getRoot: getRoot,
receiveTasks: receiveTasks
});
var factory = createCommonjsModule(function (module) {
'use strict';
module.exports = function weexFactory (exports, renderer) {
/* */
// these helpers produces 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' ||
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'
}
var _toString = Object.prototype.toString;
/**
* 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(val);
return n >= 0 && Math.floor(n) === n && isFinite(val)
}
/**
* Convert a value to a string that is actually rendered.
*/
function toString (val) {
return val == null
? ''
: typeof val === 'object'
? JSON.stringify(val, null, 2)
: String(val)
}
/**
* Convert a 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 a attribute is a reserved attribute.
*/
var isReservedAttribute = makeMap('key,ref,slot,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 the 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 = /([^-])([A-Z])/g;
var hyphenate = cached(function (str) {
return str
.replace(hyphenateRE, '$1-$2')
.replace(hyphenateRE, '$1-$2')
.toLowerCase()
});
/**
* Simple bind, faster than native
*/
function bind (fn, ctx) {
function boundFn (a) {
var l = arguments.length;
return l
? l > 1
? fn.apply(ctx, arguments)
: fn.call(ctx, a)
: fn.call(ctx)
}
// record original fn length
boundFn._length = fn.length;
return boundFn
}
/**
* 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
}
/**
* 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; };
/**
* Return same value
*/
var identity = function (_) { return _; };
/**
* Generate a static keys string from compiler modules.
*/
/**
* 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 (!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
}
}
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 SSR_ATTR = 'data-server-rendered';
var ASSET_TYPES = [
'component',
'directive',
'filter'
];
var LIFECYCLE_HOOKS = [
'beforeCreate',
'created',
'beforeMount',
'mounted',
'beforeUpdate',
'updated',
'beforeDestroy',
'destroyed',
'activated',
'deactivated'
];
/* */
var config = ({
/**
* Option merge strategies (used in core/util/options)
*/
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
*/
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,
/**
* Exposed for legacy reasons
*/
_lifecycleHooks: LIFECYCLE_HOOKS
});
/* */
var emptyObject = Object.freeze({});
/**
* 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 = /[^\w.$]/;
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
}
}
/* */
var warn = noop;
var tip = noop;
var formatComponentName = (null); // work around flow check
{
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) {
return '<Root>'
}
var name = typeof vm === 'string'
? vm
: typeof vm === 'function' && vm.options
? vm.options.name
: vm._isVue
? vm.$options.name || vm.$options._componentTag
: vm.name;
var file = vm._isVue && vm.$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
};
var generateComponentTrace = function (vm) {
if (vm._isVue && vm.$parent) {
var tree = [];
var currentRecursiveSequence = 0;
while (vm) {
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;
}
}
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)) + ")")
}
};
}
/* */
function handleError (err, vm, info) {
if (config.errorHandler) {
config.errorHandler.call(null, err, vm, info);
} else {
{
warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
}
/* istanbul ignore else */
if (inBrowser && typeof console !== 'undefined') {
console.error(err);
} else {
throw err
}
}
}
/* */
/* globals MutationObserver */
// can we use __proto__?
var hasProto = '__proto__' in {};
// Browser environment sniffing
var inBrowser = typeof window !== 'undefined';
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;
var isIOS = UA && /iphone|ipad|ipod|ios/.test(UA);
var isChrome = UA && /chrome\/\d+/.test(UA) && !isEdge;
// Firefix has a "watch" function on Object.prototype...
var nativeWatch = ({}).watch;
var supportsPassive = false;
if (inBrowser) {
try {
var opts = {};
Object.defineProperty(opts, 'passive', ({
get: function get () {
/* istanbul ignore next */
supportsPassive = true;
}
})); // 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 && typeof commonjsGlobal !== 'undefined') {
// detect presence of vue-server-renderer and avoid
// Webpack shimming the process
_isServer = commonjsGlobal['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);
/**
* Defer a task to execute it asynchronously.
*/
var nextTick = (function () {
var callbacks = [];
var pending = false;
var timerFunc;
function nextTickHandler () {
pending = false;
var copies = callbacks.slice(0);
callbacks.length = 0;
for (var i = 0; i < copies.length; i++) {
copies[i]();
}
}
// 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 if */
if (typeof Promise !== 'undefined' && isNative(Promise)) {
var p = Promise.resolve();
var logError = function (err) { console.error(err); };
timerFunc = function () {
p.then(nextTickHandler).catch(logError);
// 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 (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 IE11, iOS7, Android 4.4
var counter = 1;
var observer = new MutationObserver(nextTickHandler);
var textNode = document.createTextNode(String(counter));
observer.observe(textNode, {
characterData: true
});
timerFunc = function () {
counter = (counter + 1) % 2;
textNode.data = String(counter);
};
} else {
// fallback to setTimeout
/* istanbul ignore next */
timerFunc = function () {
setTimeout(nextTickHandler, 0);
};
}
return function queueNextTick (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();
}
if (!cb && typeof Promise !== 'undefined') {
return new Promise(function (resolve, reject) {
_resolve = resolve;
})
}
}
})();
var _Set;
/* istanbul ignore if */
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 = (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 uid$1 = 0;
/**
* A dep is an observable that can have multiple
* directives subscribing to it.
*/
var Dep = function Dep () {
this.id = uid$1++;
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.target) {
Dep.target.addDep(this);
}
};
Dep.prototype.notify = function notify () {
// stabilize the subscriber list first
var subs = this.subs.slice();
for (var i = 0, l = subs.length; i < l; i++) {
subs[i].update();
}
};
// the current target watcher being evaluated.
// this is globally unique because there could be only one
// watcher being evaluated at any time.
Dep.target = null;
var targetStack = [];
function pushTarget (_target) {
if (Dep.target) { targetStack.push(Dep.target); }
Dep.target = _target;
}
function popTarget () {
Dep.target = targetStack.pop();
}
/*
* 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);[
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
]
.forEach(function (method) {
// cache original method
var original = arrayProto[method];
def(arrayMethods, method, function mutator () {
var arguments$1 = arguments;
var args = [], len = arguments.length;
while ( len-- ) { args[ len ] = arguments$1[ 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);
/**
* By default, when a reactive property is set, the new value is
* also converted to become reactive. However when passing down props,
* we don't want to force conversion because the value may be a nested value
* under a frozen data structure. Converting it would defeat the optimization.
*/
var observerState = {
shouldConvert: true
};
/**
* Observer class that are attached to each observed
* object. Once attached, the observer converts target
* object's property keys into getter/setters that
* collect dependencies and dispatches updates.
*/
var Observer = function Observer (value) {
this.value = value;
this.dep = new Dep();
this.vmCount = 0;
def(value, '__ob__', this);
if (Array.isArray(value)) {
var augment = hasProto
? protoAugment
: copyAugment;
augment(value, arrayMethods, arrayKeys);
this.observeArray(value);
} else {
this.walk(value);
}
};
/**
* Walk through each property 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], 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 an target Object or Array by intercepting
* the prototype chain using __proto__
*/
function protoAugment (target, src, keys) {
/* eslint-disable no-proto */
target.__proto__ = src;
/* eslint-enable no-proto */
}
/**
* Augment an 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)) {
return
}
var ob;
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer) {
ob = value.__ob__;
} else if (
observerState.shouldConvert &&
!isServerRendering() &&
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue
) {
ob = new Observer(value);
}
if (asRootData && ob) {
ob.vmCount++;
}
return ob
}
/**
* Define a reactive property on an Object.
*/
function defineReactive$$1 (
obj,
key,
val,
customSetter,
shallow
) {
var dep = new Dep();
var property = Object.getOwnPropertyDescriptor(obj, key);
if (property && property.configurable === false) {
return
}
// cater for pre-defined getter/setters
var getter = property && property.get;
var setter = property && property.set;
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.target) {
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 ("development" !== 'production' && customSetter) {
customSetter();
}
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 (Array.isArray(target) && isValidArrayIndex(key)) {
target.length = Math.max(target.length, key);
target.splice(key, 1, val);
return val
}
if (hasOwn(target, key)) {
target[key] = val;
return val
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
"development" !== 'production' && 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 (Array.isArray(target) && isValidArrayIndex(key)) {
target.splice(key, 1);
return
}
var ob = (target).__ob__;
if (target._isVue || (ob && ob.vmCount)) {
"development" !== 'production' && 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
*/
{
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 = Object.keys(from);
for (var i = 0; i < keys.length; i++) {
key = keys[i];
toVal = to[key];
fromVal = from[key];
if (!hasOwn(to, key)) {
set(to, key, fromVal);
} else if (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) : childVal,
typeof parentVal === 'function' ? parentVal.call(this) : parentVal
)
}
} else if (parentVal || childVal) {
return function mergedInstanceDataFn () {
// instance merge
var instanceData = typeof childVal === 'function'
? childVal.call(vm)
: childVal;
var defaultData = typeof parentVal === 'function'
? parentVal.call(vm)
: undefined;
if (instanceData) {
return mergeData(instanceData, defaultData)
} else {
return defaultData
}
}
}
}
strats.data = function (
parentVal,
childVal,
vm
) {
if (!vm) {
if (childVal && typeof childVal !== 'function') {
"development" !== 'production' && warn(
'The "data" option should be a function ' +
'that returns a per-instance value in component ' +
'definitions.',
vm
);
return parentVal
}
return mergeDataOrFn.call(this, parentVal, childVal)
}
return mergeDataOrFn(parentVal, childVal, vm)
};
/**
* Hooks and props are merged as arrays.
*/
function mergeHook (
parentVal,
childVal
) {
return childVal
? parentVal
? parentVal.concat(childVal)
: Array.isArray(childVal)
? childVal
: [childVal]
: parentVal
}
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) {
var res = Object.create(parentVal || null);
return childVal
? extend(res, childVal)
: 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) {
// 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 (!parentVal) { return childVal }
var ret = {};
extend(ret, parentVal);
for (var key in childVal) {
var parent = ret[key];
var child = childVal[key];
if (parent && !Array.isArray(parent)) {
parent = [parent];
}
ret[key] = 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) {
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) {
var lower = key.toLowerCase();
if (isBuiltInTag(lower) || config.isReservedTag(lower)) {
warn(
'Do not use built-in or reserved HTML elements as component ' +
'id: ' + key
);
}
}
}
/**
* Ensure all props option syntax are normalized into the
* Object-based format.
*/
function normalizeProps (options) {
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 {
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 };
}
}
options.props = res;
}
/**
* Normalize all injections into Object-based format
*/
function normalizeInject (options) {
var inject = options.inject;
if (Array.isArray(inject)) {
var normalized = options.inject = {};
for (var i = 0; i < inject.length; i++) {
normalized[inject[i]] = inject[i];
}
}
}
/**
* Normalize raw function directives into object format.
*/
function normalizeDirectives (options) {
var dirs = options.directives;
if (dirs) {
for (var key in dirs) {
var def = dirs[key];
if (typeof def === 'function') {
dirs[key] = { bind: def, update: def };
}
}
}
}
/**
* Merge two option objects into a new one.
* Core utility used in both instantiation and inheritance.
*/
function mergeOptions (
parent,
child,
vm
) {
{
checkComponents(child);
}
if (typeof child === 'function') {
child = child.options;
}
normalizeProps(child);
normalizeInject(child);
normalizeDirectives(child);
var extendsFrom = child.extends;
if (extendsFrom) {
parent = mergeOptions(parent, extendsFrom, 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 ("development" !== 'production' && 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];
// handle boolean props
if (isType(Boolean, prop.type)) {
if (absent && !hasOwn(prop, 'default')) {
value = false;
} else if (!isType(String, prop.type) && (value === '' || value === hyphenate(key))) {
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 prevShouldConvert = observerState.shouldConvert;
observerState.shouldConvert = true;
observe(value);
observerState.shouldConvert = prevShouldConvert;
}
{
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 ("development" !== 'production' && 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(
'Invalid prop: type check failed for prop "' + name + '".' +
' Expected ' + expectedTypes.map(capitalize).join(', ') +
', got ' + Object.prototype.toString.call(value).slice(8, -1) + '.',
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)) {
valid = typeof value === expectedType.toLowerCase();
} 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 isType (type, fn) {
if (!Array.isArray(fn)) {
return getType(fn) === getType(type)
}
for (var i = 0, len = fn.length; i < len; i++) {
if (getType(fn[i]) === getType(type)) {
return true
}
}
/* istanbul ignore next */
return false
}
/* */
/* not type checking this file because flow doesn't play well with Proxy */
var initProxy;
{
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 to declare reactive data " +
"properties in the data option.",
target
);
};
var hasProxy =
typeof Proxy !== 'undefined' &&
Proxy.toString().match(/native code/);
if (hasProxy) {
var isBuiltInModifier = makeMap('stop,prevent,self,ctrl,shift,alt,meta');
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) || key.charAt(0) === '_';
if (!has && !isAllowed) {
warnNonPresent(target, key);
}
return has || !isAllowed
}
};
var getHandler = {
get: function get (target, key) {
if (typeof key === 'string' && !(key in target)) {
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 mark;
var measure;
{
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 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.functionalContext = 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: {} };
// 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,
vnode.children,
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.isCloned = true;
return cloned
}
function cloneVNodes (vnodes) {
var len = vnodes.length;
var res = new Array(len);
for (var i = 0; i < len; i++) {
res[i] = cloneVNode(vnodes[i]);
}
return res
}
/* */
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) {
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++) {
cloned[i].apply(null, arguments$1);
}
} else {
// return handler return value for single handlers
return fns.apply(null, arguments)
}
}
invoker.fns = fns;
return invoker
}
function updateListeners (
on,
oldOn,
add,
remove$$1,
vm
) {
var name, cur, old, event;
for (name in on) {
cur = on[name];
old = oldOn[name];
event = normalizeEvent(name);
if (isUndef(cur)) {
"development" !== 'production' && warn(
"Invalid handler for event \"" + (event.name) + "\": got " + String(cur),
vm
);
} else if (isUndef(old)) {
if (isUndef(cur.fns)) {
cur = on[name] = createFnInvoker(cur);
}
add(event.name, cur, event.once, event.capture, event.passive);
} 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);
}
}
}
/* */
function mergeVNodeHook (def, hookKey, hook) {
var invoker;
var oldHook = def[hookKey];
function wrappedHook () {
hook.apply(this, arguments);
// important: remove merged hook to ensure it's called only once
// and prevent memory leak
remove(invoker.fns, wrappedHook);
}
if (isUndef(oldHook)) {
// no existing hook
invoker = createFnInvoker([wrappedHook]);
} else {
/* istanbul ignore if */
if (isDef(oldHook.fns) && isTrue(oldHook.merged)) {
// already a merged invoker
invoker = oldHook;
invoker.fns.push(wrappedHook);
} else {
// existing plain hook
invoker = createFnInvoker([oldHook, wrappedHook]);
}
}
invoker.merged = true;
def[hookKey] = invoker;
}
/* */
function extractPropsFromVNodeData (
data,
Ctor,
tag
) {
// 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)) {
return
}
var res = {};
var attrs = data.attrs;
var props = data.props;
if (isDef(attrs) || isDef(props)) {
for (var key in propOptions) {
var altKey = hyphenate(key);
{
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);
}
}
return res
}
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, last;
for (i = 0; i < children.length; i++) {
c = children[i];
if (isUndef(c) || typeof c === 'boolean') { continue }
last = res[res.length - 1];
// nested
if (Array.isArray(c)) {
res.push.apply(res, normalizeArrayChildren(c, ((nestedIndex || '') + "_" + i)));
} 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
(last).text += String(c);
} else if (c !== '') {
// convert primitive to vnode
res.push(createTextVNode(c));
}
} else {
if (isTextNode(c) && isTextNode(last)) {
// merge adjacent text nodes
res[res.length - 1] = 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 ensureCtor (comp, base) {
if (comp.__esModule && comp.default) {
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,
context
) {
if (isTrue(factory.error) && isDef(factory.errorComp)) {
return factory.errorComp
}
if (isDef(factory.resolved)) {
return factory.resolved
}
if (isTrue(factory.loading) && isDef(factory.loadingComp)) {
return factory.loadingComp
}
if (isDef(factory.contexts)) {
// already pending
factory.contexts.push(context);
} else {
var contexts = factory.contexts = [context];
var sync = true;
var forceRender = function () {
for (var i = 0, l = contexts.length; i < l; i++) {
contexts[i].$forceUpdate();
}
};
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();
}
});
var reject = once(function (reason) {
"development" !== 'production' && warn(
"Failed to resolve async component: " + (String(factory)) +
(reason ? ("\nReason: " + reason) : '')
);
if (isDef(factory.errorComp)) {
factory.error = true;
forceRender();
}
});
var res = factory(resolve, reject);
if (isObject(res)) {
if (typeof res.then === 'function') {
// () => Promise
if (isUndef(factory.resolved)) {
res.then(resolve, reject);
}
} else if (isDef(res.component) && typeof res.component.then === 'function') {
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 {
setTimeout(function () {
if (isUndef(factory.resolved) && isUndef(factory.error)) {
factory.loading = true;
forceRender();
}
}, res.delay || 200);
}
}
if (isDef(res.timeout)) {
setTimeout(function () {
if (isUndef(factory.resolved)) {
reject(
("timeout (" + (res.timeout) + "ms)")
);
}
}, res.timeout);
}
}
}
sync = false;
// return in case resolved synchronously
return factory.loading
? factory.loadingComp
: factory.resolved
}
}
/* */
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)) {
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, once$$1) {
if (once$$1) {
target.$once(event, fn);
} else {
target.$on(event, fn);
}
}
function remove$1 (event, fn) {
target.$off(event, fn);
}
function updateComponentListeners (
vm,
listeners,
oldListeners
) {
target = vm;
updateListeners(listeners, oldListeners || {}, add, remove$1, vm);
}
function eventsMixin (Vue) {
var hookRE = /^hook:/;
Vue.prototype.$on = function (event, fn) {
var this$1 = this;
var vm = this;
if (Array.isArray(event)) {
for (var i = 0, l = event.length; i < l; i++) {
this$1.$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 this$1 = this;
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++) {
this$1.$off(event[i$1], fn);
}
return vm
}
// specific event
var cbs = vm._events[event];
if (!cbs) {
return vm
}
if (arguments.length === 1) {
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;
{
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);
for (var i = 0, l = cbs.length; i < l; i++) {
try {
cbs[i].apply(vm, args);
} catch (e) {
handleError(e, vm, ("event handler for \"" + event + "\""));
}
}
}
return vm
};
}
/* */
/**
* Runtime helper for resolving raw children VNodes into a slot object.
*/
function resolveSlots (
children,
context
) {
var slots = {};
if (!children) {
return slots
}
var defaultSlot = [];
for (var i = 0, l = children.length; i < l; i++) {
var child = children[i];
// named slots should only be respected if the vnode was rendered in the
// same context.
if ((child.context === context || child.functionalContext === context) &&
child.data && child.data.slot != null
) {
var name = child.data.slot;
var slot = (slots[name] || (slots[name] = []));
if (child.tag === 'template') {
slot.push.apply(slot, child.children);
} else {
slot.push(child);
}
} else {
defaultSlot.push(child);
}
}
// ignore whitespace
if (!defaultSlot.every(isWhitespace)) {
slots.default = defaultSlot;
}
return slots
}
function isWhitespace (node) {
return node.isComment || node.text === ' '
}
function resolveScopedSlots (
fns, // see flow/vnode
res
) {
res = res || {};
for (var i = 0; i < fns.length; i++) {
if (Array.isArray(fns[i])) {
resolveScopedSlots(fns[i], res);
} else {
res[fns[i].key] = fns[i].fn;
}
}
return res
}
/* */
var activeInstance = null;
var isUpdatingChildComponent = false;
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;
if (vm._isMounted) {
callHook(vm, 'beforeUpdate');
}
var prevEl = vm.$el;
var prevVnode = vm._vnode;
var prevActiveInstance = activeInstance;
activeInstance = 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 */,
vm.$options._parentElm,
vm.$options._refElm
);
// no need for the ref nodes after initial patch
// this prevents keeping a detached DOM tree in memory (#5851)
vm.$options._parentElm = vm.$options._refElm = null;
} else {
// updates
vm.$el = vm.__patch__(prevVnode, vnode);
}
activeInstance = prevActiveInstance;
// 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;
}
};
}
function mountComponent (
vm,
el,
hydrating
) {
vm.$el = el;
if (!vm.$options.render) {
vm.$options.render = createEmptyVNode;
{
/* 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
);
}
}
}
callHook(vm, 'beforeMount');
var updateComponent;
/* istanbul ignore if */
if ("development" !== 'production' && config.performance && mark) {
updateComponent = function () {
var name = vm._name;
var id = vm._uid;
var startTag = "vue-perf-start:" + id;
var endTag = "vue-perf-end:" + id;
mark(startTag);
var vnode = vm._render();
mark(endTag);
measure((name + " render"), startTag, endTag);
mark(startTag);
vm._update(vnode, hydrating);
mark(endTag);
measure((name + " patch"), startTag, endTag);
};
} else {
updateComponent = function () {
vm._update(vm._render(), hydrating);
};
}
vm._watcher = new Watcher(vm, updateComponent, noop);
hydrating = false;
// manually mounted instance, call mounted on self
// mounted is called for render-created child components in its inserted hook
if (vm.$vnode == null) {
vm._isMounted = true;
callHook(vm, 'mounted');
}
return vm
}
function updateChildComponent (
vm,
propsData,
listeners,
parentVnode,
renderChildren
) {
{
isUpdatingChildComponent = true;
}
// determine whether component has slot children
// we need to do this before overwriting $options._renderChildren
var hasChildren = !!(
renderChildren || // has new static slots
vm.$options._renderChildren || // has old static slots
parentVnode.data.scopedSlots || // has new scoped slots
vm.$scopedSlots !== emptyObject // has old scoped slots
);
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 $listensers hash
// these are also reactive so they may trigger child update if the child
// used them during render
vm.$attrs = parentVnode.data && parentVnode.data.attrs;
vm.$listeners = listeners;
// update props
if (propsData && vm.$options.props) {
observerState.shouldConvert = false;
var props = vm._props;
var propKeys = vm.$options._propKeys || [];
for (var i = 0; i < propKeys.length; i++) {
var key = propKeys[i];
props[key] = validateProp(key, vm.$options.props, propsData, vm);
}
observerState.shouldConvert = true;
// keep a copy of raw propsData
vm.$options.propsData = propsData;
}
// update listeners
if (listeners) {
var oldListeners = vm.$options._parentListeners;
vm.$options._parentListeners = listeners;
updateComponentListeners(vm, listeners, oldListeners);
}
// resolve slots + force update if has children
if (hasChildren) {
vm.$slots = resolveSlots(renderChildren, parentVnode.context);
vm.$forceUpdate();
}
{
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) {
var handlers = vm.$options[hook];
if (handlers) {
for (var i = 0, j = handlers.length; i < j; i++) {
try {
handlers[i].call(vm);
} catch (e) {
handleError(e, vm, (hook + " hook"));
}
}
}
if (vm._hasHookEvent) {
vm.$emit('hook:' + hook);
}
}
/* */
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 = {};
{
circular = {};
}
waiting = flushing = false;
}
/**
* Flush both queues and run the watchers.
*/
function flushSchedulerQueue () {
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];
id = watcher.id;
has[id] = null;
watcher.run();
// in dev build, check and stop circular updates.
if ("development" !== 'production' && 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) {
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;
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
) {
this.vm = vm;
vm._watchers.push(this);
// options
if (options) {
this.deep = !!options.deep;
this.user = !!options.user;
this.lazy = !!options.lazy;
this.sync = !!options.sync;
} 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 = expOrFn.toString();
// parse expression for getter
if (typeof expOrFn === 'function') {
this.getter = expOrFn;
} else {
this.getter = parsePath(expOrFn);
if (!this.getter) {
this.getter = function () {};
"development" !== 'production' && 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 this$1 = this;
var i = this.deps.length;
while (i--) {
var dep = this$1.deps[i];
if (!this$1.newDepIds.has(dep.id)) {
dep.removeSub(this$1);
}
}
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 this$1 = this;
var i = this.deps.length;
while (i--) {
this$1.deps[i].depend();
}
};
/**
* Remove self from all dependencies' subscriber list.
*/
Watcher.prototype.teardown = function teardown () {
var this$1 = this;
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$1.deps[i].removeSub(this$1);
}
this.active = false;
}
};
/**
* Recursively traverse an object to evoke all converted
* getters, so that every nested property inside the object
* is collected as a "deep" dependency.
*/
var seenObjects = new _Set();
function traverse (val) {
seenObjects.clear();
_traverse(val, seenObjects);
}
function _traverse (val, seen) {
var i, keys;
var isA = Array.isArray(val);
if ((!isA && !isObject(val)) || !Object.isExtensible(val)) {
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 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 checkOptionType (vm, name) {
var option = vm.$options[name];
if (!isPlainObject(option)) {
warn(
("component option \"" + name + "\" should be an object."),
vm
);
}
}
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
observerState.shouldConvert = isRoot;
var loop = function ( key ) {
keys.push(key);
var value = validateProp(key, propsOptions, propsData, vm);
/* istanbul ignore else */
{
if (isReservedAttribute(key) || config.isReservedAttr(key)) {
warn(
("\"" + key + "\" is a reserved attribute and cannot be used as component prop."),
vm
);
}
defineReactive$$1(props, key, value, function () {
if (vm.$parent && !isUpdatingChildComponent) {
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
);
}
});
}
// 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 ); }
observerState.shouldConvert = true;
}
function initData (vm) {
var data = vm.$options.data;
data = vm._data = typeof data === 'function'
? getData(data, vm)
: data || {};
if (!isPlainObject(data)) {
data = {};
"development" !== 'production' && 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 (methods && hasOwn(methods, key)) {
warn(
("method \"" + key + "\" has already been defined as a data property."),
vm
);
}
}
if (props && hasOwn(props, key)) {
"development" !== 'production' && 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) {
try {
return data.call(vm)
} catch (e) {
handleError(e, vm, "data()");
return {}
}
}
var computedWatcherOptions = { lazy: true };
function initComputed (vm, computed) {
"development" !== 'production' && checkOptionType(vm, 'computed');
var watchers = vm._computedWatchers = Object.create(null);
for (var key in computed) {
var userDef = computed[key];
var getter = typeof userDef === 'function' ? userDef : userDef.get;
if ("development" !== 'production' && getter == null) {
warn(
("Getter is missing for computed property \"" + key + "\"."),
vm
);
}
// 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 (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) {
if (typeof userDef === 'function') {
sharedPropertyDefinition.get = createComputedGetter(key);
sharedPropertyDefinition.set = noop;
} else {
sharedPropertyDefinition.get = userDef.get
? userDef.cache !== false
? createComputedGetter(key)
: userDef.get
: noop;
sharedPropertyDefinition.set = userDef.set
? userDef.set
: noop;
}
if ("development" !== 'production' &&
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.target) {
watcher.depend();
}
return watcher.value
}
}
}
function initMethods (vm, methods) {
"development" !== 'production' && checkOptionType(vm, 'methods');
var props = vm.$options.props;
for (var key in methods) {
vm[key] = methods[key] == null ? noop : bind(methods[key], vm);
{
if (methods[key] == null) {
warn(
"method \"" + key + "\" has an undefined value 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
);
}
}
}
}
function initWatch (vm, watch) {
"development" !== 'production' && checkOptionType(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,
keyOrFn,
handler,
options
) {
if (isPlainObject(handler)) {
options = handler;
handler = handler.handler;
}
if (typeof handler === 'string') {
handler = vm[handler];
}
return vm.$watch(keyOrFn, 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 };
{
dataDef.set = function (newData) {
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) {
cb.call(vm, watcher.value);
}
return function unwatchFn () {
watcher.teardown();
}
};
}
/* */
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) {
observerState.shouldConvert = false;
Object.keys(result).forEach(function (key) {
/* istanbul ignore else */
{
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
);
});
}
});
observerState.shouldConvert = 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];
var provideKey = inject[key];
var source = vm;
while (source) {
if (source._provided && provideKey in source._provided) {
result[key] = source._provided[provideKey];
break
}
source = source.$parent;
}
if ("development" !== 'production' && !source) {
warn(("Injection \"" + key + "\" not found"), vm);
}
}
return result
}
}
/* */
function createFunctionalComponent (
Ctor,
propsData,
data,
context,
children
) {
var props = {};
var propOptions = Ctor.options.props;
if (isDef(propOptions)) {
for (var key in propOptions) {
props[key] = validateProp(key, propOptions, propsData || {});
}
} else {
if (isDef(data.attrs)) { mergeProps(props, data.attrs); }
if (isDef(data.props)) { mergeProps(props, data.props); }
}
// ensure the createElement function in functional components
// gets a unique context - this is necessary for correct named slot check
var _context = Object.create(context);
var h = function (a, b, c, d) { return createElement(_context, a, b, c, d, true); };
var vnode = Ctor.options.render.call(null, h, {
data: data,
props: props,
children: children,
parent: context,
listeners: data.on || {},
injections: resolveInject(Ctor.options.inject, context),
slots: function () { return resolveSlots(children, context); }
});
if (vnode instanceof VNode) {
vnode.functionalContext = context;
vnode.functionalOptions = Ctor.options;
if (data.slot) {
(vnode.data || (vnode.data = {})).slot = data.slot;
}
}
return vnode
}
function mergeProps (to, from) {
for (var key in from) {
to[camelize(key)] = from[key];
}
}
/* */
// hooks to be invoked on component VNodes during patch
var componentVNodeHooks = {
init: function init (
vnode,
hydrating,
parentElm,
refElm
) {
if (!vnode.componentInstance || vnode.componentInstance._isDestroyed) {
var child = vnode.componentInstance = createComponentInstanceForVnode(
vnode,
activeInstance,
parentElm,
refElm
);
child.$mount(hydrating ? vnode.elm : undefined, hydrating);
} else if (vnode.data.keepAlive) {
// kept-alive components, treat as a patch
var mountedNode = vnode; // work around flow
componentVNodeHooks.prepatch(mountedNode, mountedNode);
}
},
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) {
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') {
{
warn(("Invalid Component definition: " + (String(Ctor))), context);
}
return
}
// async component
var asyncFactory;
if (isUndef(Ctor.cid)) {
asyncFactory = Ctor;
Ctor = resolveAsyncComponent(asyncFactory, baseCtor, context);
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);
// 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;
}
}
// merge component management hooks onto the placeholder node
mergeHooks(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
parentElm,
refElm
) {
var vnodeComponentOptions = vnode.componentOptions;
var options = {
_isComponent: true,
parent: parent,
propsData: vnodeComponentOptions.propsData,
_componentTag: vnodeComponentOptions.tag,
_parentVnode: vnode,
_parentListeners: vnodeComponentOptions.listeners,
_renderChildren: vnodeComponentOptions.children,
_parentElm: parentElm || null,
_refElm: refElm || null
};
// check inline-template render functions
var inlineTemplate = vnode.data.inlineTemplate;
if (isDef(inlineTemplate)) {
options.render = inlineTemplate.render;
options.staticRenderFns = inlineTemplate.staticRenderFns;
}
return new vnodeComponentOptions.Ctor(options)
}
function mergeHooks (data) {
if (!data.hook) {
data.hook = {};
}
for (var i = 0; i < hooksToMerge.length; i++) {
var key = hooksToMerge[i];
var fromParent = data.hook[key];
var ours = componentVNodeHooks[key];
data.hook[key] = fromParent ? mergeHook$1(ours, fromParent) : ours;
}
}
function mergeHook$1 (one, two) {
return function (a, b, c, d) {
one(a, b, c, d);
two(a, b, c, d);
}
}
// 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.props || (data.props = {}))[prop] = data.model.value;
var on = data.on || (data.on = {});
if (isDef(on[event])) {
on[event] = [data.model.callback].concat(on[event]);
} else {
on[event] = data.model.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__)) {
"development" !== 'production' && 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 ("development" !== 'production' &&
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 = config.getTagNamespace(tag);
if (config.isReservedTag(tag)) {
// platform built-in elements
vnode = new VNode(
config.parsePlatformTagName(tag), data, children,
undefined, undefined, context
);
} else if (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 (isDef(vnode)) {
if (ns) { applyNS(vnode, ns); }
return vnode
} else {
return createEmptyVNode()
}
}
function applyNS (vnode, ns) {
vnode.ns = ns;
if (vnode.tag === 'foreignObject') {
// use default namespace inside foreignObject
return
}
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)) {
applyNS(child, ns);
}
}
}
}
/* */
/**
* 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);
}
} else if (typeof val === 'number') {
ret = new Array(val);
for (i = 0; i < val; i++) {
ret[i] = render(i + 1, i);
}
} else if (isObject(val)) {
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);
}
}
if (isDef(ret)) {
(ret)._isVList = true;
}
return ret
}
/* */
/**
* Runtime helper for rendering <slot>
*/
function renderSlot (
name,
fallback,
props,
bindObject
) {
var scopedSlotFn = this.$scopedSlots[name];
if (scopedSlotFn) { // scoped slot
props = props || {};
if (bindObject) {
props = extend(extend({}, bindObject), props);
}
return scopedSlotFn(props) || fallback
} else {
var slotNodes = this.$slots[name];
// warn duplicate slot usage
if (slotNodes && "development" !== 'production') {
slotNodes._rendered && warn(
"Duplicate presence of slot \"" + name + "\" found in the same render tree " +
"- this will likely cause render errors.",
this
);
slotNodes._rendered = true;
}
return slotNodes || fallback
}
}
/* */
/**
* Runtime helper for resolving filters
*/
function resolveFilter (id) {
return resolveAsset(this.$options, 'filters', id, true) || identity
}
/* */
/**
* Runtime helper for checking keyCodes from config.
*/
function checkKeyCodes (
eventKeyCode,
key,
builtInAlias
) {
var keyCodes = config.keyCodes[key] || builtInAlias;
if (Array.isArray(keyCodes)) {
return keyCodes.indexOf(eventKeyCode) === -1
} else {
return keyCodes !== eventKeyCode
}
}
/* */
/**
* Runtime helper for merging v-bind="object" into a VNode's data.
*/
function bindObjectProps (
data,
tag,
value,
asProp,
isSync
) {
if (value) {
if (!isObject(value)) {
"development" !== 'production' && 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 = {});
}
if (!(key 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 tree = this._staticTrees[index];
// if has already-rendered static tree and not inside v-for,
// we can reuse the same tree by doing a shallow clone.
if (tree && !isInFor) {
return Array.isArray(tree)
? cloneVNodes(tree)
: cloneVNode(tree)
}
// otherwise, render a fresh tree.
tree = this._staticTrees[index] =
this.$options.staticRenderFns[index].call(this._renderProxy);
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)) {
"development" !== 'production' && 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(ours, existing) : ours;
}
}
}
return data
}
/* */
function initRender (vm) {
vm._vnode = null; // the root of the child tree
vm._staticTrees = null;
var parentVnode = vm.$vnode = vm.$options._parentVnode; // the placeholder node in parent tree
var renderContext = parentVnode && parentVnode.context;
vm.$slots = resolveSlots(vm.$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 */
{
defineReactive$$1(vm, '$attrs', parentData && parentData.attrs, function () {
!isUpdatingChildComponent && warn("$attrs is readonly.", vm);
}, true);
defineReactive$$1(vm, '$listeners', vm.$options._parentListeners, function () {
!isUpdatingChildComponent && warn("$listeners is readonly.", vm);
}, true);
}
}
function renderMixin (Vue) {
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 staticRenderFns = ref.staticRenderFns;
var _parentVnode = ref._parentVnode;
if (vm._isMounted) {
// clone slot nodes on re-renders
for (var key in vm.$slots) {
vm.$slots[key] = cloneVNodes(vm.$slots[key]);
}
}
vm.$scopedSlots = (_parentVnode && _parentVnode.data.scopedSlots) || emptyObject;
if (staticRenderFns && !vm._staticTrees) {
vm._staticTrees = [];
}
// 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 {
vnode = render.call(vm._renderProxy, vm.$createElement);
} catch (e) {
handleError(e, vm, "render function");
// return error render result,
// or previous vnode to prevent render error causing blank component
/* istanbul ignore else */
{
vnode = vm.$options.renderError
? vm.$options.renderError.call(vm._renderProxy, vm.$createElement, e)
: vm._vnode;
}
}
// return empty vnode in case the render function errored out
if (!(vnode instanceof VNode)) {
if ("development" !== 'production' && 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
};
// internal render helpers.
// these are exposed on the instance prototype to reduce generated render
// code size.
Vue.prototype._o = markOnce;
Vue.prototype._n = toNumber;
Vue.prototype._s = toString;
Vue.prototype._l = renderList;
Vue.prototype._t = renderSlot;
Vue.prototype._q = looseEqual;
Vue.prototype._i = looseIndexOf;
Vue.prototype._m = renderStatic;
Vue.prototype._f = resolveFilter;
Vue.prototype._k = checkKeyCodes;
Vue.prototype._b = bindObjectProps;
Vue.prototype._v = createTextVNode;
Vue.prototype._e = createEmptyVNode;
Vue.prototype._u = resolveScopedSlots;
Vue.prototype._g = bindObjectListeners;
}
/* */
var uid = 0;
function initMixin (Vue) {
Vue.prototype._init = function (options) {
var vm = this;
// a uid
vm._uid = uid++;
var startTag, endTag;
/* istanbul ignore if */
if ("development" !== 'production' && config.performance && mark) {
startTag = "vue-perf-init:" + (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 */
{
initProxy(vm);
}
// expose real self
vm._self = vm;
initLifecycle(vm);
initEvents(vm);
initRender(vm);
callHook(vm, 'beforeCreate');
initInjections(vm); // resolve injections before data/props
initState(vm);
initProvide(vm); // resolve provide after data/props
callHook(vm, 'created');
/* istanbul ignore if */
if ("development" !== 'production' && config.performance && mark) {
vm._name = formatComponentName(vm, false);
mark(endTag);
measure(((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.
opts.parent = options.parent;
opts.propsData = options.propsData;
opts._parentVnode = options._parentVnode;
opts._parentListeners = options._parentListeners;
opts._renderChildren = options._renderChildren;
opts._componentTag = options._componentTag;
opts._parentElm = options._parentElm;
opts._refElm = options._refElm;
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 extended = Ctor.extendOptions;
var sealed = Ctor.sealedOptions;
for (var key in latest) {
if (latest[key] !== sealed[key]) {
if (!modified) { modified = {}; }
modified[key] = dedupe(latest[key], extended[key], sealed[key]);
}
}
return modified
}
function dedupe (latest, extended, sealed) {
// compare latest and sealed to ensure lifecycle hooks won't be duplicated
// between merges
if (Array.isArray(latest)) {
var res = [];
sealed = Array.isArray(sealed) ? sealed : [sealed];
extended = Array.isArray(extended) ? extended : [extended];
for (var i = 0; i < latest.length; i++) {
// push original options and not sealed options to exclude duplicated options
if (extended.indexOf(latest[i]) >= 0 || sealed.indexOf(latest[i]) < 0) {
res.push(latest[i]);
}
}
return res
} else {
return latest
}
}
function Vue$2 (options) {
if ("development" !== 'production' &&
!(this instanceof Vue$2)
) {
warn('Vue is a constructor and should be called with the `new` keyword');
}
this._init(options);
}
initMixin(Vue$2);
stateMixin(Vue$2);
eventsMixin(Vue$2);
lifecycleMixin(Vue$2);
renderMixin(Vue$2);
/* */
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 (!/^[a-zA-Z][\w-]*$/.test(name)) {
warn(
'Invalid component name: "' + name + '". Component names ' +
'can only contain alphanumeric characters and the hyphen, ' +
'and must start with a letter.'
);
}
}
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 (type === 'component' && config.isReservedTag(id)) {
warn(
'Do not use built-in or reserved HTML elements as component ' +
'id: ' + 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
}
};
});
}
/* */
var patternTypes = [String, RegExp, Array];
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 (cache, current, filter) {
for (var key in cache) {
var cachedNode = cache[key];
if (cachedNode) {
var name = getComponentName(cachedNode.componentOptions);
if (name && !filter(name)) {
if (cachedNode !== current) {
pruneCacheEntry(cachedNode);
}
cache[key] = null;
}
}
}
}
function pruneCacheEntry (vnode) {
if (vnode) {
vnode.componentInstance.$destroy();
}
}
var KeepAlive = {
name: 'keep-alive',
abstract: true,
props: {
include: patternTypes,
exclude: patternTypes
},
created: function created () {
this.cache = Object.create(null);
},
destroyed: function destroyed () {
var this$1 = this;
for (var key in this$1.cache) {
pruneCacheEntry(this$1.cache[key]);
}
},
watch: {
include: function include (val) {
pruneCache(this.cache, this._vnode, function (name) { return matches(val, name); });
},
exclude: function exclude (val) {
pruneCache(this.cache, this._vnode, function (name) { return !matches(val, name); });
}
},
render: function render () {
var vnode = getFirstComponentChild(this.$slots.default);
var componentOptions = vnode && vnode.componentOptions;
if (componentOptions) {
// check pattern
var name = getComponentName(componentOptions);
if (name && (
(this.include && !matches(this.include, name)) ||
(this.exclude && matches(this.exclude, name))
)) {
return vnode
}
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 (this.cache[key]) {
vnode.componentInstance = this.cache[key].componentInstance;
} else {
this.cache[key] = vnode;
}
vnode.data.keepAlive = true;
}
return vnode
}
};
var builtInComponents = {
KeepAlive: KeepAlive
};
/* */
function initGlobalAPI (Vue) {
// config
var configDef = {};
configDef.get = function () { return config; };
{
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;
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$2);
Object.defineProperty(Vue$2.prototype, '$isServer', {
get: isServerRendering
});
Object.defineProperty(Vue$2.prototype, '$ssrContext', {
get: function get () {
/* istanbul ignore next */
return this.$vnode && this.$vnode.ssrContext
}
});
Vue$2.version = '2.4.2';
/* globals renderer */
// renderer is injected by weex factory wrapper
var namespaceMap = {};
function createElement$1 (tagName) {
return new renderer.Element(tagName)
}
function createElementNS (namespace, tagName) {
return new renderer.Element(namespace + ':' + tagName)
}
function createTextNode (text) {
return new renderer.TextNode(text)
}
function createComment (text) {
return new renderer.Comment(text)
}
function insertBefore (node, target, before) {
if (target.nodeType === 3) {
if (node.type === 'text') {
node.setAttr('value', target.text);
target.parentNode = node;
} else {
var text = createElement$1('text');
text.setAttr('value', target.text);
node.insertBefore(text, before);
}
return
}
node.insertBefore(target, before);
}
function removeChild (node, child) {
if (child.nodeType === 3) {
node.setAttr('value', '');
return
}
node.removeChild(child);
}
function appendChild (node, child) {
if (child.nodeType === 3) {
if (node.type === 'text') {
node.setAttr('value', child.text);
child.parentNode = node;
} else {
var text = createElement$1('text');
text.setAttr('value', child.text);
node.appendChild(text);
}
return
}
node.appendChild(child);
}
function parentNode (node) {
return node.parentNode
}
function nextSibling (node) {
return node.nextSibling
}
function tagName (node) {
return node.type
}
function setTextContent (node, text) {
node.parentNode.setAttr('value', text);
}
function setAttribute (node, key, val) {
node.setAttr(key, val);
}
var nodeOps = Object.freeze({
namespaceMap: namespaceMap,
createElement: createElement$1,
createElementNS: createElementNS,
createTextNode: createTextNode,
createComment: createComment,
insertBefore: insertBefore,
removeChild: removeChild,
appendChild: appendChild,
parentNode: parentNode,
nextSibling: nextSibling,
tagName: tagName,
setTextContent: setTextContent,
setAttribute: setAttribute
});
/* */
var ref = {
create: function create (_, vnode) {
registerRef(vnode);
},
update: function update (oldVnode, vnode) {
if (oldVnode.data.ref !== vnode.data.ref) {
registerRef(oldVnode, true);
registerRef(vnode);
}
},
destroy: function destroy (vnode) {
registerRef(vnode, true);
}
};
function registerRef (vnode, isRemoval) {
var key = vnode.data.ref;
if (!key) { return }
var vm = vnode.context;
var ref = vnode.componentInstance || vnode.elm;
var refs = vm.$refs;
if (isRemoval) {
if (Array.isArray(refs[key])) {
remove(refs[key], ref);
} else if (refs[key] === ref) {
refs[key] = undefined;
}
} else {
if (vnode.data.refInFor) {
if (!Array.isArray(refs[key])) {
refs[key] = [ref];
} else if (refs[key].indexOf(ref) < 0) {
// $flow-disable-line
refs[key].push(ref);
}
} else {
refs[key] = ref;
}
}
}
/**
* Virtual DOM patching algorithm based on Snabbdom by
* Simon Friis Vindum (@paldepind)
* Licensed under the MIT License
* https://github.com/paldepind/snabbdom/blob/master/LICENSE
*
* modified by Evan You (@yyx990803)
*
/*
* Not type-checking this because this file is perf-critical and the cost
* of making flow understand it is not worth it.
*/
var emptyNode = new VNode('', {}, []);
var hooks = ['create', 'activate', 'update', 'remove', 'destroy'];
function sameVnode (a, b) {
return (
a.key === b.key && (
(
a.tag === b.tag &&
a.isComment === b.isComment &&
isDef(a.data) === isDef(b.data) &&
sameInputType(a, b)
) || (
isTrue(a.isAsyncPlaceholder) &&
a.asyncFactory === b.asyncFactory &&
isUndef(b.asyncFactory.error)
)
)
)
}
// Some browsers do not support dynamically changing type for <input>
// so they need to be treated as different nodes
function sameInputType (a, b) {
if (a.tag !== 'input') { return true }
var i;
var typeA = isDef(i = a.data) && isDef(i = i.attrs) && i.type;
var typeB = isDef(i = b.data) && isDef(i = i.attrs) && i.type;
return typeA === typeB
}
function createKeyToOldIdx (children, beginIdx, endIdx) {
var i, key;
var map = {};
for (i = beginIdx; i <= endIdx; ++i) {
key = children[i].key;
if (isDef(key)) { map[key] = i; }
}
return map
}
function createPatchFunction (backend) {
var i, j;
var cbs = {};
var modules = backend.modules;
var nodeOps = backend.nodeOps;
for (i = 0; i < hooks.length; ++i) {
cbs[hooks[i]] = [];
for (j = 0; j < modules.length; ++j) {
if (isDef(modules[j][hooks[i]])) {
cbs[hooks[i]].push(modules[j][hooks[i]]);
}
}
}
function emptyNodeAt (elm) {
return new VNode(nodeOps.tagName(elm).toLowerCase(), {}, [], undefined, elm)
}
function createRmCb (childElm, listeners) {
function remove$$1 () {
if (--remove$$1.listeners === 0) {
removeNode(childElm);
}
}
remove$$1.listeners = listeners;
return remove$$1
}
function removeNode (el) {
var parent = nodeOps.parentNode(el);
// element may have already been removed due to v-html / v-text
if (isDef(parent)) {
nodeOps.removeChild(parent, el);
}
}
var inPre = 0;
function createElm (vnode, insertedVnodeQueue, parentElm, refElm, nested) {
vnode.isRootInsert = !nested; // for transition enter check
if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {
return
}
var data = vnode.data;
var children = vnode.children;
var tag = vnode.tag;
if (isDef(tag)) {
{
if (data && data.pre) {
inPre++;
}
if (
!inPre &&
!vnode.ns &&
!(config.ignoredElements.length && config.ignoredElements.indexOf(tag) > -1) &&
config.isUnknownElement(tag)
) {
warn(
'Unknown custom element: <' + tag + '> - did you ' +
'register the component correctly? For recursive components, ' +
'make sure to provide the "name" option.',
vnode.context
);
}
}
vnode.elm = vnode.ns
? nodeOps.createElementNS(vnode.ns, tag)
: nodeOps.createElement(tag, vnode);
setScope(vnode);
/* istanbul ignore if */
{
// in Weex, the default insertion order is parent-first.
// List items can be optimized to use children-first insertion
// with append="tree".
var appendAsTree = isDef(data) && isTrue(data.appendAsTree);
if (!appendAsTree) {
if (isDef(data)) {
invokeCreateHooks(vnode, insertedVnodeQueue);
}
insert(parentElm, vnode.elm, refElm);
}
createChildren(vnode, children, insertedVnodeQueue);
if (appendAsTree) {
if (isDef(data)) {
invokeCreateHooks(vnode, insertedVnodeQueue);
}
insert(parentElm, vnode.elm, refElm);
}
}
if ("development" !== 'production' && data && data.pre) {
inPre--;
}
} else if (isTrue(vnode.isComment)) {
vnode.elm = nodeOps.createComment(vnode.text);
insert(parentElm, vnode.elm, refElm);
} else {
vnode.elm = nodeOps.createTextNode(vnode.text);
insert(parentElm, vnode.elm, refElm);
}
}
function createComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
var i = vnode.data;
if (isDef(i)) {
var isReactivated = isDef(vnode.componentInstance) && i.keepAlive;
if (isDef(i = i.hook) && isDef(i = i.init)) {
i(vnode, false /* hydrating */, parentElm, refElm);
}
// after calling the init hook, if the vnode is a child component
// it should've created a child instance and mounted it. the child
// component also has set the placeholder vnode's elm.
// in that case we can just return the element and be done.
if (isDef(vnode.componentInstance)) {
initComponent(vnode, insertedVnodeQueue);
if (isTrue(isReactivated)) {
reactivateComponent(vnode, insertedVnodeQueue, parentElm, refElm);
}
return true
}
}
}
function initComponent (vnode, insertedVnodeQueue) {
if (isDef(vnode.data.pendingInsert)) {
insertedVnodeQueue.push.apply(insertedVnodeQueue, vnode.data.pendingInsert);
vnode.data.pendingInsert = null;
}
vnode.elm = vnode.componentInstance.$el;
if (isPatchable(vnode)) {
invokeCreateHooks(vnode, insertedVnodeQueue);
setScope(vnode);
} else {
// empty component root.
// skip all element-related modules except for ref (#3455)
registerRef(vnode);
// make sure to invoke the insert hook
insertedVnodeQueue.push(vnode);
}
}
function reactivateComponent (vnode, insertedVnodeQueue, parentElm, refElm) {
var i;
// hack for #4339: a reactivated component with inner transition
// does not trigger because the inner node's created hooks are not called
// again. It's not ideal to involve module-specific logic in here but
// there doesn't seem to be a better way to do it.
var innerNode = vnode;
while (innerNode.componentInstance) {
innerNode = innerNode.componentInstance._vnode;
if (isDef(i = innerNode.data) && isDef(i = i.transition)) {
for (i = 0; i < cbs.activate.length; ++i) {
cbs.activate[i](emptyNode, innerNode);
}
insertedVnodeQueue.push(innerNode);
break
}
}
// unlike a newly created component,
// a reactivated keep-alive component doesn't insert itself
insert(parentElm, vnode.elm, refElm);
}
function insert (parent, elm, ref$$1) {
if (isDef(parent)) {
if (isDef(ref$$1)) {
if (ref$$1.parentNode === parent) {
nodeOps.insertBefore(parent, elm, ref$$1);
}
} else {
nodeOps.appendChild(parent, elm);
}
}
}
function createChildren (vnode, children, insertedVnodeQueue) {
if (Array.isArray(children)) {
for (var i = 0; i < children.length; ++i) {
createElm(children[i], insertedVnodeQueue, vnode.elm, null, true);
}
} else if (isPrimitive(vnode.text)) {
nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(vnode.text));
}
}
function isPatchable (vnode) {
while (vnode.componentInstance) {
vnode = vnode.componentInstance._vnode;
}
return isDef(vnode.tag)
}
function invokeCreateHooks (vnode, insertedVnodeQueue) {
for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {
cbs.create[i$1](emptyNode, vnode);
}
i = vnode.data.hook; // Reuse variable
if (isDef(i)) {
if (isDef(i.create)) { i.create(emptyNode, vnode); }
if (isDef(i.insert)) { insertedVnodeQueue.push(vnode); }
}
}
// set scope id attribute for scoped CSS.
// this is implemented as a special case to avoid the overhead
// of going through the normal attribute patching process.
function setScope (vnode) {
var i;
var ancestor = vnode;
while (ancestor) {
if (isDef(i = ancestor.context) && isDef(i = i.$options._scopeId)) {
nodeOps.setAttribute(vnode.elm, i, '');
}
ancestor = ancestor.parent;
}
// for slot content they should also get the scopeId from the host instance.
if (isDef(i = activeInstance) &&
i !== vnode.context &&
isDef(i = i.$options._scopeId)
) {
nodeOps.setAttribute(vnode.elm, i, '');
}
}
function addVnodes (parentElm, refElm, vnodes, startIdx, endIdx, insertedVnodeQueue) {
for (; startIdx <= endIdx; ++startIdx) {
createElm(vnodes[startIdx], insertedVnodeQueue, parentElm, refElm);
}
}
function invokeDestroyHook (vnode) {
var i, j;
var data = vnode.data;
if (isDef(data)) {
if (isDef(i = data.hook) && isDef(i = i.destroy)) { i(vnode); }
for (i = 0; i < cbs.destroy.length; ++i) { cbs.destroy[i](vnode); }
}
if (isDef(i = vnode.children)) {
for (j = 0; j < vnode.children.length; ++j) {
invokeDestroyHook(vnode.children[j]);
}
}
}
function removeVnodes (parentElm, vnodes, startIdx, endIdx) {
for (; startIdx <= endIdx; ++startIdx) {
var ch = vnodes[startIdx];
if (isDef(ch)) {
if (isDef(ch.tag)) {
removeAndInvokeRemoveHook(ch);
invokeDestroyHook(ch);
} else { // Text node
removeNode(ch.elm);
}
}
}
}
function removeAndInvokeRemoveHook (vnode, rm) {
if (isDef(rm) || isDef(vnode.data)) {
var i;
var listeners = cbs.remove.length + 1;
if (isDef(rm)) {
// we have a recursively passed down rm callback
// increase the listeners count
rm.listeners += listeners;
} else {
// directly removing
rm = createRmCb(vnode.elm, listeners);
}
// recursively invoke hooks on child component root node
if (isDef(i = vnode.componentInstance) && isDef(i = i._vnode) && isDef(i.data)) {
removeAndInvokeRemoveHook(i, rm);
}
for (i = 0; i < cbs.remove.length; ++i) {
cbs.remove[i](vnode, rm);
}
if (isDef(i = vnode.data.hook) && isDef(i = i.remove)) {
i(vnode, rm);
} else {
rm();
}
} else {
removeNode(vnode.elm);
}
}
function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {
var oldStartIdx = 0;
var newStartIdx = 0;
var oldEndIdx = oldCh.length - 1;
var oldStartVnode = oldCh[0];
var oldEndVnode = oldCh[oldEndIdx];
var newEndIdx = newCh.length - 1;
var newStartVnode = newCh[0];
var newEndVnode = newCh[newEndIdx];
var oldKeyToIdx, idxInOld, elmToMove, refElm;
// removeOnly is a special flag used only by <transition-group>
// to ensure removed elements stay in correct relative positions
// during leaving transitions
var canMove = !removeOnly;
while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {
if (isUndef(oldStartVnode)) {
oldStartVnode = oldCh[++oldStartIdx]; // Vnode has been moved left
} else if (isUndef(oldEndVnode)) {
oldEndVnode = oldCh[--oldEndIdx];
} else if (sameVnode(oldStartVnode, newStartVnode)) {
patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);
oldStartVnode = oldCh[++oldStartIdx];
newStartVnode = newCh[++newStartIdx];
} else if (sameVnode(oldEndVnode, newEndVnode)) {
patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);
oldEndVnode = oldCh[--oldEndIdx];
newEndVnode = newCh[--newEndIdx];
} else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right
patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);
canMove && nodeOps.insertBefore(parentElm, oldStartVnode.elm, nodeOps.nextSibling(oldEndVnode.elm));
oldStartVnode = oldCh[++oldStartIdx];
newEndVnode = newCh[--newEndIdx];
} else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left
patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);
canMove && nodeOps.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);
oldEndVnode = oldCh[--oldEndIdx];
newStartVnode = newCh[++newStartIdx];
} else {
if (isUndef(oldKeyToIdx)) { oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx); }
idxInOld = isDef(newStartVnode.key) ? oldKeyToIdx[newStartVnode.key] : null;
if (isUndef(idxInOld)) { // New element
createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);
newStartVnode = newCh[++newStartIdx];
} else {
elmToMove = oldCh[idxInOld];
/* istanbul ignore if */
if ("development" !== 'production' && !elmToMove) {
warn(
'It seems there are duplicate keys that is causing an update error. ' +
'Make sure each v-for item has a unique key.'
);
}
if (sameVnode(elmToMove, newStartVnode)) {
patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);
oldCh[idxInOld] = undefined;
canMove && nodeOps.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);
newStartVnode = newCh[++newStartIdx];
} else {
// same key but different element. treat as new element
createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm);
newStartVnode = newCh[++newStartIdx];
}
}
}
}
if (oldStartIdx > oldEndIdx) {
refElm = isUndef(newCh[newEndIdx + 1]) ? null : newCh[newEndIdx + 1].elm;
addVnodes(parentElm, refElm, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);
} else if (newStartIdx > newEndIdx) {
removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);
}
}
function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {
if (oldVnode === vnode) {
return
}
var elm = vnode.elm = oldVnode.elm;
if (isTrue(oldVnode.isAsyncPlaceholder)) {
if (isDef(vnode.asyncFactory.resolved)) {
hydrate(oldVnode.elm, vnode, insertedVnodeQueue);
} else {
vnode.isAsyncPlaceholder = true;
}
return
}
// reuse element for static trees.
// note we only do this if the vnode is cloned -
// if the new node is not cloned it means the render functions have been
// reset by the hot-reload-api and we need to do a proper re-render.
if (isTrue(vnode.isStatic) &&
isTrue(oldVnode.isStatic) &&
vnode.key === oldVnode.key &&
(isTrue(vnode.isCloned) || isTrue(vnode.isOnce))
) {
vnode.componentInstance = oldVnode.componentInstance;
return
}
var i;
var data = vnode.data;
if (isDef(data) && isDef(i = data.hook) && isDef(i = i.prepatch)) {
i(oldVnode, vnode);
}
var oldCh = oldVnode.children;
var ch = vnode.children;
if (isDef(data) && isPatchable(vnode)) {
for (i = 0; i < cbs.update.length; ++i) { cbs.update[i](oldVnode, vnode); }
if (isDef(i = data.hook) && isDef(i = i.update)) { i(oldVnode, vnode); }
}
if (isUndef(vnode.text)) {
if (isDef(oldCh) && isDef(ch)) {
if (oldCh !== ch) { updateChildren(elm, oldCh, ch, insertedVnodeQueue, removeOnly); }
} else if (isDef(ch)) {
if (isDef(oldVnode.text)) { nodeOps.setTextContent(elm, ''); }
addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);
} else if (isDef(oldCh)) {
removeVnodes(elm, oldCh, 0, oldCh.length - 1);
} else if (isDef(oldVnode.text)) {
nodeOps.setTextContent(elm, '');
}
} else if (oldVnode.text !== vnode.text) {
nodeOps.setTextContent(elm, vnode.text);
}
if (isDef(data)) {
if (isDef(i = data.hook) && isDef(i = i.postpatch)) { i(oldVnode, vnode); }
}
}
function invokeInsertHook (vnode, queue, initial) {
// delay insert hooks for component root nodes, invoke them after the
// element is really inserted
if (isTrue(initial) && isDef(vnode.parent)) {
vnode.parent.data.pendingInsert = queue;
} else {
for (var i = 0; i < queue.length; ++i) {
queue[i].data.hook.insert(queue[i]);
}
}
}
var bailed = false;
// list of modules that can skip create hook during hydration because they
// are already rendered on the client or has no need for initialization
var isRenderedModule = makeMap('attrs,style,class,staticClass,staticStyle,key');
// Note: this is a browser-only function so we can assume elms are DOM nodes.
function hydrate (elm, vnode, insertedVnodeQueue) {
if (isTrue(vnode.isComment) && isDef(vnode.asyncFactory)) {
vnode.elm = elm;
vnode.isAsyncPlaceholder = true;
return true
}
{
if (!assertNodeMatch(elm, vnode)) {
return false
}
}
vnode.elm = elm;
var tag = vnode.tag;
var data = vnode.data;
var children = vnode.children;
if (isDef(data)) {
if (isDef(i = data.hook) && isDef(i = i.init)) { i(vnode, true /* hydrating */); }
if (isDef(i = vnode.componentInstance)) {
// child component. it should have hydrated its own tree.
initComponent(vnode, insertedVnodeQueue);
return true
}
}
if (isDef(tag)) {
if (isDef(children)) {
// empty element, allow client to pick up and populate children
if (!elm.hasChildNodes()) {
createChildren(vnode, children, insertedVnodeQueue);
} else {
var childrenMatch = true;
var childNode = elm.firstChild;
for (var i$1 = 0; i$1 < children.length; i$1++) {
if (!childNode || !hydrate(childNode, children[i$1], insertedVnodeQueue)) {
childrenMatch = false;
break
}
childNode = childNode.nextSibling;
}
// if childNode is not null, it means the actual childNodes list is
// longer than the virtual children list.
if (!childrenMatch || childNode) {
if ("development" !== 'production' &&
typeof console !== 'undefined' &&
!bailed
) {
bailed = true;
console.warn('Parent: ', elm);
console.warn('Mismatching childNodes vs. VNodes: ', elm.childNodes, children);
}
return false
}
}
}
if (isDef(data)) {
for (var key in data) {
if (!isRenderedModule(key)) {
invokeCreateHooks(vnode, insertedVnodeQueue);
break
}
}
}
} else if (elm.data !== vnode.text) {
elm.data = vnode.text;
}
return true
}
function assertNodeMatch (node, vnode) {
if (isDef(vnode.tag)) {
return (
vnode.tag.indexOf('vue-component') === 0 ||
vnode.tag.toLowerCase() === (node.tagName && node.tagName.toLowerCase())
)
} else {
return node.nodeType === (vnode.isComment ? 8 : 3)
}
}
return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {
if (isUndef(vnode)) {
if (isDef(oldVnode)) { invokeDestroyHook(oldVnode); }
return
}
var isInitialPatch = false;
var insertedVnodeQueue = [];
if (isUndef(oldVnode)) {
// empty mount (likely as component), create new root element
isInitialPatch = true;
createElm(vnode, insertedVnodeQueue, parentElm, refElm);
} else {
var isRealElement = isDef(oldVnode.nodeType);
if (!isRealElement && sameVnode(oldVnode, vnode)) {
// patch existing root node
patchVnode(oldVnode, vnode, insertedVnodeQueue, removeOnly);
} else {
if (isRealElement) {
// mounting to a real element
// check if this is server-rendered content and if we can perform
// a successful hydration.
if (oldVnode.nodeType === 1 && oldVnode.hasAttribute(SSR_ATTR)) {
oldVnode.removeAttribute(SSR_ATTR);
hydrating = true;
}
if (isTrue(hydrating)) {
if (hydrate(oldVnode, vnode, insertedVnodeQueue)) {
invokeInsertHook(vnode, insertedVnodeQueue, true);
return oldVnode
} else {
warn(
'The client-side rendered virtual DOM tree is not matching ' +
'server-rendered content. This is likely caused by incorrect ' +
'HTML markup, for example nesting block-level elements inside ' +
'<p>, or missing <tbody>. Bailing hydration and performing ' +
'full client-side render.'
);
}
}
// either not server-rendered, or hydration failed.
// create an empty node and replace it
oldVnode = emptyNodeAt(oldVnode);
}
// replacing existing element
var oldElm = oldVnode.elm;
var parentElm$1 = nodeOps.parentNode(oldElm);
createElm(
vnode,
insertedVnodeQueue,
// extremely rare edge case: do not insert if old element is in a
// leaving transition. Only happens when combining transition +
// keep-alive + HOCs. (#4590)
oldElm._leaveCb ? null : parentElm$1,
nodeOps.nextSibling(oldElm)
);
if (isDef(vnode.parent)) {
// component root element replaced.
// update parent placeholder node element, recursively
var ancestor = vnode.parent;
while (ancestor) {
ancestor.elm = vnode.elm;
ancestor = ancestor.parent;
}
if (isPatchable(vnode)) {
for (var i = 0; i < cbs.create.length; ++i) {
cbs.create[i](emptyNode, vnode.parent);
}
}
}
if (isDef(parentElm$1)) {
removeVnodes(parentElm$1, [oldVnode], 0, 0);
} else if (isDef(oldVnode.tag)) {
invokeDestroyHook(oldVnode);
}
}
}
invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);
return vnode.elm
}
}
/* */
var directives = {
create: updateDirectives,
update: updateDirectives,
destroy: function unbindDirectives (vnode) {
updateDirectives(vnode, emptyNode);
}
};
function updateDirectives (oldVnode, vnode) {
if (oldVnode.data.directives || vnode.data.directives) {
_update(oldVnode, vnode);
}
}
function _update (oldVnode, vnode) {
var isCreate = oldVnode === emptyNode;
var isDestroy = vnode === emptyNode;
var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);
var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);
var dirsWithInsert = [];
var dirsWithPostpatch = [];
var key, oldDir, dir;
for (key in newDirs) {
oldDir = oldDirs[key];
dir = newDirs[key];
if (!oldDir) {
// new directive, bind
callHook$1(dir, 'bind', vnode, oldVnode);
if (dir.def && dir.def.inserted) {
dirsWithInsert.push(dir);
}
} else {
// existing directive, update
dir.oldValue = oldDir.value;
callHook$1(dir, 'update', vnode, oldVnode);
if (dir.def && dir.def.componentUpdated) {
dirsWithPostpatch.push(dir);
}
}
}
if (dirsWithInsert.length) {
var callInsert = function () {
for (var i = 0; i < dirsWithInsert.length; i++) {
callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);
}
};
if (isCreate) {
mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', callInsert);
} else {
callInsert();
}
}
if (dirsWithPostpatch.length) {
mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'postpatch', function () {
for (var i = 0; i < dirsWithPostpatch.length; i++) {
callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);
}
});
}
if (!isCreate) {
for (key in oldDirs) {
if (!newDirs[key]) {
// no longer present, unbind
callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);
}
}
}
}
var emptyModifiers = Object.create(null);
function normalizeDirectives$1 (
dirs,
vm
) {
var res = Object.create(null);
if (!dirs) {
return res
}
var i, dir;
for (i = 0; i < dirs.length; i++) {
dir = dirs[i];
if (!dir.modifiers) {
dir.modifiers = emptyModifiers;
}
res[getRawDirName(dir)] = dir;
dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);
}
return res
}
function getRawDirName (dir) {
return dir.rawName || ((dir.name) + "." + (Object.keys(dir.modifiers || {}).join('.')))
}
function callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {
var fn = dir.def && dir.def[hook];
if (fn) {
try {
fn(vnode.elm, dir, vnode, oldVnode, isDestroy);
} catch (e) {
handleError(e, vnode.context, ("directive " + (dir.name) + " " + hook + " hook"));
}
}
}
var baseModules = [
ref,
directives
];
/* */
function updateAttrs (oldVnode, vnode) {
if (!oldVnode.data.attrs && !vnode.data.attrs) {
return
}
var key, cur, old;
var elm = vnode.elm;
var oldAttrs = oldVnode.data.attrs || {};
var attrs = vnode.data.attrs || {};
// clone observed objects, as the user probably wants to mutate it
if (attrs.__ob__) {
attrs = vnode.data.attrs = extend({}, attrs);
}
for (key in attrs) {
cur = attrs[key];
old = oldAttrs[key];
if (old !== cur) {
elm.setAttr(key, cur);
}
}
for (key in oldAttrs) {
if (attrs[key] == null) {
elm.setAttr(key);
}
}
}
var attrs = {
create: updateAttrs,
update: updateAttrs
};
/* */
function updateClass (oldVnode, vnode) {
var el = vnode.elm;
var ctx = vnode.context;
var data = vnode.data;
var oldData = oldVnode.data;
if (!data.staticClass &&
!data.class &&
(!oldData || (!oldData.staticClass && !oldData.class))
) {
return
}
var oldClassList = [];
// unlike web, weex vnode staticClass is an Array
var oldStaticClass = oldData.staticClass;
if (oldStaticClass) {
oldClassList.push.apply(oldClassList, oldStaticClass);
}
if (oldData.class) {
oldClassList.push.apply(oldClassList, oldData.class);
}
var classList = [];
// unlike web, weex vnode staticClass is an Array
var staticClass = data.staticClass;
if (staticClass) {
classList.push.apply(classList, staticClass);
}
if (data.class) {
classList.push.apply(classList, data.class);
}
var style = getStyle(oldClassList, classList, ctx);
for (var key in style) {
el.setStyle(key, style[key]);
}
}
function getStyle (oldClassList, classList, ctx) {
// style is a weex-only injected object
// compiled from <style> tags in weex files
var stylesheet = ctx.$options.style || {};
var result = {};
classList.forEach(function (name) {
var style = stylesheet[name];
extend(result, style);
});
oldClassList.forEach(function (name) {
var style = stylesheet[name];
for (var key in style) {
if (!result.hasOwnProperty(key)) {
result[key] = '';
}
}
});
return result
}
var klass = {
create: updateClass,
update: updateClass
};
/* */
var target$1;
function add$1 (
event,
handler,
once,
capture
) {
if (capture) {
console.log('Weex do not support event in bubble phase.');
return
}
if (once) {
var oldHandler = handler;
var _target = target$1; // save current target element in closure
handler = function (ev) {
var res = arguments.length === 1
? oldHandler(ev)
: oldHandler.apply(null, arguments);
if (res !== null) {
remove$2(event, null, null, _target);
}
};
}
target$1.addEvent(event, handler);
}
function remove$2 (
event,
handler,
capture,
_target
) {
(_target || target$1).removeEvent(event);
}
function updateDOMListeners (oldVnode, vnode) {
if (!oldVnode.data.on && !vnode.data.on) {
return
}
var on = vnode.data.on || {};
var oldOn = oldVnode.data.on || {};
target$1 = vnode.elm;
updateListeners(on, oldOn, add$1, remove$2, vnode.context);
}
var events = {
create: updateDOMListeners,
update: updateDOMListeners
};
/* */
var normalize = cached(camelize);
function createStyle (oldVnode, vnode) {
if (!vnode.data.staticStyle) {
updateStyle(oldVnode, vnode);
return
}
var elm = vnode.elm;
var staticStyle = vnode.data.staticStyle;
for (var name in staticStyle) {
if (staticStyle[name]) {
elm.setStyle(normalize(name), staticStyle[name]);
}
}
updateStyle(oldVnode, vnode);
}
function updateStyle (oldVnode, vnode) {
if (!oldVnode.data.style && !vnode.data.style) {
return
}
var cur, name;
var elm = vnode.elm;
var oldStyle = oldVnode.data.style || {};
var style = vnode.data.style || {};
var needClone = style.__ob__;
// handle array syntax
if (Array.isArray(style)) {
style = vnode.data.style = toObject$1(style);
}
// clone the style for future updates,
// in case the user mutates the style object in-place.
if (needClone) {
style = vnode.data.style = extend({}, style);
}
for (name in oldStyle) {
if (!style[name]) {
elm.setStyle(normalize(name), '');
}
}
for (name in style) {
cur = style[name];
elm.setStyle(normalize(name), cur);
}
}
function toObject$1 (arr) {
var res = {};
for (var i = 0; i < arr.length; i++) {
if (arr[i]) {
extend(res, arr[i]);
}
}
return res
}
var style = {
create: createStyle,
update: updateStyle
};
/* */
/**
* Add class with compatibility for SVG since classList is not supported on
* SVG elements in IE
*/
/**
* Remove class with compatibility for SVG since classList is not supported on
* SVG elements in IE
*/
/* */
function resolveTransition (def$$1) {
if (!def$$1) {
return
}
/* istanbul ignore else */
if (typeof def$$1 === 'object') {
var res = {};
if (def$$1.css !== false) {
extend(res, autoCssTransition(def$$1.name || 'v'));
}
extend(res, def$$1);
return res
} else if (typeof def$$1 === 'string') {
return autoCssTransition(def$$1)
}
}
var autoCssTransition = cached(function (name) {
return {
enterClass: (name + "-enter"),
enterToClass: (name + "-enter-to"),
enterActiveClass: (name + "-enter-active"),
leaveClass: (name + "-leave"),
leaveToClass: (name + "-leave-to"),
leaveActiveClass: (name + "-leave-active")
}
});
// Transition property/event sniffing
// binding to window is necessary to make hot reload work in IE in strict mode
var raf = inBrowser && window.requestAnimationFrame
? window.requestAnimationFrame.bind(window)
: setTimeout;
var transition = {
create: enter,
activate: enter,
remove: leave
};
function enter (_, vnode) {
var el = vnode.elm;
// call leave callback now
if (el._leaveCb) {
el._leaveCb.cancelled = true;
el._leaveCb();
}
var data = resolveTransition(vnode.data.transition);
if (!data) {
return
}
/* istanbul ignore if */
if (el._enterCb) {
return
}
var enterClass = data.enterClass;
var enterToClass = data.enterToClass;
var enterActiveClass = data.enterActiveClass;
var appearClass = data.appearClass;
var appearToClass = data.appearToClass;
var appearActiveClass = data.appearActiveClass;
var beforeEnter = data.beforeEnter;
var enter = data.enter;
var afterEnter = data.afterEnter;
var enterCancelled = data.enterCancelled;
var beforeAppear = data.beforeAppear;
var appear = data.appear;
var afterAppear = data.afterAppear;
var appearCancelled = data.appearCancelled;
var context = activeInstance;
var transitionNode = activeInstance.$vnode;
while (transitionNode && transitionNode.parent) {
transitionNode = transitionNode.parent;
context = transitionNode.context;
}
var isAppear = !context._isMounted || !vnode.isRootInsert;
if (isAppear && !appear && appear !== '') {
return
}
var startClass = isAppear ? appearClass : enterClass;
var toClass = isAppear ? appearToClass : enterToClass;
var activeClass = isAppear ? appearActiveClass : enterActiveClass;
var beforeEnterHook = isAppear ? (beforeAppear || beforeEnter) : beforeEnter;
var enterHook = isAppear ? (typeof appear === 'function' ? appear : enter) : enter;
var afterEnterHook = isAppear ? (afterAppear || afterEnter) : afterEnter;
var enterCancelledHook = isAppear ? (appearCancelled || enterCancelled) : enterCancelled;
var userWantsControl =
enterHook &&
// enterHook may be a bound method which exposes
// the length of original fn as _length
(enterHook._length || enterHook.length) > 1;
var stylesheet = vnode.context.$options.style || {};
var startState = stylesheet[startClass];
var transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][activeClass]) || {};
var endState = getEnterTargetState(el, stylesheet, startClass, toClass, activeClass, vnode.context);
var needAnimation = Object.keys(endState).length > 0;
var cb = el._enterCb = once(function () {
if (cb.cancelled) {
enterCancelledHook && enterCancelledHook(el);
} else {
afterEnterHook && afterEnterHook(el);
}
el._enterCb = null;
});
// We need to wait until the native element has been inserted, but currently
// there's no API to do that. So we have to wait "one frame" - not entirely
// sure if this is guaranteed to be enough (e.g. on slow devices?)
setTimeout(function () {
var parent = el.parentNode;
var pendingNode = parent && parent._pending && parent._pending[vnode.key];
if (pendingNode &&
pendingNode.context === vnode.context &&
pendingNode.tag === vnode.tag &&
pendingNode.elm._leaveCb
) {
pendingNode.elm._leaveCb();
}
enterHook && enterHook(el, cb);
if (needAnimation) {
var animation = vnode.context.$requireWeexModule('animation');
animation.transition(el.ref, {
styles: endState,
duration: transitionProperties.duration || 0,
delay: transitionProperties.delay || 0,
timingFunction: transitionProperties.timingFunction || 'linear'
}, userWantsControl ? noop : cb);
} else if (!userWantsControl) {
cb();
}
}, 16);
// start enter transition
beforeEnterHook && beforeEnterHook(el);
if (startState) {
for (var key in startState) {
el.setStyle(key, startState[key]);
}
}
if (!needAnimation && !userWantsControl) {
cb();
}
}
function leave (vnode, rm) {
var el = vnode.elm;
// call enter callback now
if (el._enterCb) {
el._enterCb.cancelled = true;
el._enterCb();
}
var data = resolveTransition(vnode.data.transition);
if (!data) {
return rm()
}
if (el._leaveCb) {
return
}
var leaveClass = data.leaveClass;
var leaveToClass = data.leaveToClass;
var leaveActiveClass = data.leaveActiveClass;
var beforeLeave = data.beforeLeave;
var leave = data.leave;
var afterLeave = data.afterLeave;
var leaveCancelled = data.leaveCancelled;
var delayLeave = data.delayLeave;
var userWantsControl =
leave &&
// leave hook may be a bound method which exposes
// the length of original fn as _length
(leave._length || leave.length) > 1;
var stylesheet = vnode.context.$options.style || {};
var startState = stylesheet[leaveClass];
var endState = stylesheet[leaveToClass] || stylesheet[leaveActiveClass];
var transitionProperties = (stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][leaveActiveClass]) || {};
var cb = el._leaveCb = once(function () {
if (el.parentNode && el.parentNode._pending) {
el.parentNode._pending[vnode.key] = null;
}
if (cb.cancelled) {
leaveCancelled && leaveCancelled(el);
} else {
rm();
afterLeave && afterLeave(el);
}
el._leaveCb = null;
});
if (delayLeave) {
delayLeave(performLeave);
} else {
performLeave();
}
function performLeave () {
var animation = vnode.context.$requireWeexModule('animation');
// the delayed leave may have already been cancelled
if (cb.cancelled) {
return
}
// record leaving element
if (!vnode.data.show) {
(el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode;
}
beforeLeave && beforeLeave(el);
if (startState) {
animation.transition(el.ref, {
styles: startState
}, next);
} else {
next();
}
function next () {
animation.transition(el.ref, {
styles: endState,
duration: transitionProperties.duration || 0,
delay: transitionProperties.delay || 0,
timingFunction: transitionProperties.timingFunction || 'linear'
}, userWantsControl ? noop : cb);
}
leave && leave(el, cb);
if (!endState && !userWantsControl) {
cb();
}
}
}
// determine the target animation style for an entering transition.
function getEnterTargetState (el, stylesheet, startClass, endClass, activeClass, vm) {
var targetState = {};
var startState = stylesheet[startClass];
var endState = stylesheet[endClass];
var activeState = stylesheet[activeClass];
// 1. fallback to element's default styling
if (startState) {
for (var key in startState) {
targetState[key] = el.style[key];
if (
"development" !== 'production' &&
targetState[key] == null &&
(!activeState || activeState[key] == null) &&
(!endState || endState[key] == null)
) {
warn(
"transition property \"" + key + "\" is declared in enter starting class (." + startClass + "), " +
"but not declared anywhere in enter ending class (." + endClass + "), " +
"enter active cass (." + activeClass + ") or the element's default styling. " +
"Note in Weex, CSS properties need explicit values to be transitionable."
);
}
}
}
// 2. if state is mixed in active state, extract them while excluding
// transition properties
if (activeState) {
for (var key$1 in activeState) {
if (key$1.indexOf('transition') !== 0) {
targetState[key$1] = activeState[key$1];
}
}
}
// 3. explicit endState has highest priority
if (endState) {
extend(targetState, endState);
}
return targetState
}
var platformModules = [
attrs,
klass,
events,
style,
transition
];
/* */
// the directive module should be applied last, after all
// built-in modules have been applied.
var modules = platformModules.concat(baseModules);
var patch = createPatchFunction({
nodeOps: nodeOps,
modules: modules,
LONG_LIST_THRESHOLD: 10
});
var platformDirectives = {
};
function getVNodeType (vnode) {
if (!vnode.tag) {
return ''
}
return vnode.tag.replace(/vue\-component\-(\d+\-)?/, '')
}
function isSimpleSpan (vnode) {
return vnode.children && vnode.children.length === 1 && !vnode.children[0].tag
}
var cssLengthRE = /^([+-]?[0-9]+(\.[0-9]+)?)(px|em|ex|%|in|cm|mm|pt|pc)$/i;
function trimCSSUnit (prop) {
var res = String(prop).match(cssLengthRE);
if (res) {
return Number(res[1])
}
return prop
}
function parseStyle (vnode) {
if (!vnode || !vnode.data) {
return
}
var ref = vnode.data;
var staticStyle = ref.staticStyle;
var staticClass = ref.staticClass;
if (vnode.data.style || vnode.data.class || staticStyle || staticClass) {
var styles = Object.assign({}, staticStyle, vnode.data.style);
var cssMap = vnode.context.$options.style || {};
var classList = [].concat(staticClass, vnode.data.class);
classList.forEach(function (name) {
if (name && cssMap[name]) {
Object.assign(styles, cssMap[name]);
}
});
for (var key in styles) {
styles[key] = trimCSSUnit(styles[key]);
}
return styles
}
}
function convertVNodeChildren (children) {
if (!children.length) {
return
}
return children.map(function (vnode) {
var type = getVNodeType(vnode);
var props = { type: type };
// convert raw text node
if (!type) {
props.type = 'span';
props.attr = {
value: (vnode.text || '').trim()
};
} else {
props.style = parseStyle(vnode);
if (vnode.data) {
props.attr = vnode.data.attrs;
if (vnode.data.on) {
props.events = vnode.data.on;
}
}
if (type === 'span' && isSimpleSpan(vnode)) {
props.attr = props.attr || {};
props.attr.value = vnode.children[0].text.trim();
return props
}
}
if (vnode.children && vnode.children.length) {
props.children = convertVNodeChildren(vnode.children);
}
return props
})
}
var Richtext = {
name: 'richtext',
// abstract: true,
render: function render (h) {
return h('weex:richtext', {
on: this._events,
attrs: {
value: convertVNodeChildren(this.$options._renderChildren || [])
}
})
}
};
/* */
// Provides transition support for a single element/component.
// supports transition mode (out-in / in-out)
var transitionProps = {
name: String,
appear: Boolean,
css: Boolean,
mode: String,
type: String,
enterClass: String,
leaveClass: String,
enterToClass: String,
leaveToClass: String,
enterActiveClass: String,
leaveActiveClass: String,
appearClass: String,
appearActiveClass: String,
appearToClass: String,
duration: [Number, String, Object]
};
// in case the child is also an abstract component, e.g. <keep-alive>
// we want to recursively retrieve the real component to be rendered
function getRealChild (vnode) {
var compOptions = vnode && vnode.componentOptions;
if (compOptions && compOptions.Ctor.options.abstract) {
return getRealChild(getFirstComponentChild(compOptions.children))
} else {
return vnode
}
}
function extractTransitionData (comp) {
var data = {};
var options = comp.$options;
// props
for (var key in options.propsData) {
data[key] = comp[key];
}
// events.
// extract listeners and pass them directly to the transition methods
var listeners = options._parentListeners;
for (var key$1 in listeners) {
data[camelize(key$1)] = listeners[key$1];
}
return data
}
function placeholder (h, rawChild) {
if (/\d-keep-alive$/.test(rawChild.tag)) {
return h('keep-alive', {
props: rawChild.componentOptions.propsData
})
}
}
function hasParentTransition (vnode) {
while ((vnode = vnode.parent)) {
if (vnode.data.transition) {
return true
}
}
}
function isSameChild (child, oldChild) {
return oldChild.key === child.key && oldChild.tag === child.tag
}
function isAsyncPlaceholder (node) {
return node.isComment && node.asyncFactory
}
var Transition$1 = {
name: 'transition',
props: transitionProps,
abstract: true,
render: function render (h) {
var this$1 = this;
var children = this.$options._renderChildren;
if (!children) {
return
}
// filter out text nodes (possible whitespaces)
children = children.filter(function (c) { return c.tag || isAsyncPlaceholder(c); });
/* istanbul ignore if */
if (!children.length) {
return
}
// warn multiple elements
if ("development" !== 'production' && children.length > 1) {
warn(
'<transition> can only be used on a single element. Use ' +
'<transition-group> for lists.',
this.$parent
);
}
var mode = this.mode;
// warn invalid mode
if ("development" !== 'production' &&
mode && mode !== 'in-out' && mode !== 'out-in'
) {
warn(
'invalid <transition> mode: ' + mode,
this.$parent
);
}
var rawChild = children[0];
// if this is a component root node and the component's
// parent container node also has transition, skip.
if (hasParentTransition(this.$vnode)) {
return rawChild
}
// apply transition data to child
// use getRealChild() to ignore abstract components e.g. keep-alive
var child = getRealChild(rawChild);
/* istanbul ignore if */
if (!child) {
return rawChild
}
if (this._leaving) {
return placeholder(h, rawChild)
}
// ensure a key that is unique to the vnode type and to this transition
// component instance. This key will be used to remove pending leaving nodes
// during entering.
var id = "__transition-" + (this._uid) + "-";
child.key = child.key == null
? child.isComment
? id + 'comment'
: id + child.tag
: isPrimitive(child.key)
? (String(child.key).indexOf(id) === 0 ? child.key : id + child.key)
: child.key;
var data = (child.data || (child.data = {})).transition = extractTransitionData(this);
var oldRawChild = this._vnode;
var oldChild = getRealChild(oldRawChild);
// mark v-show
// so that the transition module can hand over the control to the directive
if (child.data.directives && child.data.directives.some(function (d) { return d.name === 'show'; })) {
child.data.show = true;
}
if (
oldChild &&
oldChild.data &&
!isSameChild(child, oldChild) &&
!isAsyncPlaceholder(oldChild)
) {
// replace old child transition data with fresh one
// important for dynamic transitions!
var oldData = oldChild && (oldChild.data.transition = extend({}, data));
// handle transition mode
if (mode === 'out-in') {
// return placeholder node and queue update when leave finishes
this._leaving = true;
mergeVNodeHook(oldData, 'afterLeave', function () {
this$1._leaving = false;
this$1.$forceUpdate();
});
return placeholder(h, rawChild)
} else if (mode === 'in-out') {
if (isAsyncPlaceholder(child)) {
return oldRawChild
}
var delayedLeave;
var performLeave = function () { delayedLeave(); };
mergeVNodeHook(data, 'afterEnter', performLeave);
mergeVNodeHook(data, 'enterCancelled', performLeave);
mergeVNodeHook(oldData, 'delayLeave', function (leave) { delayedLeave = leave; });
}
}
return rawChild
}
};
// reuse same transition component logic from web
var props = extend({
tag: String,
moveClass: String
}, transitionProps);
delete props.mode;
var TransitionGroup = {
props: props,
created: function created () {
var dom = this.$requireWeexModule('dom');
this.getPosition = function (el) { return new Promise(function (resolve, reject) {
dom.getComponentRect(el.ref, function (res) {
if (!res.result) {
reject(new Error(("failed to get rect for element: " + (el.tag))));
} else {
resolve(res.size);
}
});
}); };
var animation = this.$requireWeexModule('animation');
this.animate = function (el, options) { return new Promise(function (resolve) {
animation.transition(el.ref, options, resolve);
}); };
},
render: function render (h) {
var tag = this.tag || this.$vnode.data.tag || 'span';
var map = Object.create(null);
var prevChildren = this.prevChildren = this.children;
var rawChildren = this.$slots.default || [];
var children = this.children = [];
var transitionData = extractTransitionData(this);
for (var i = 0; i < rawChildren.length; i++) {
var c = rawChildren[i];
if (c.tag) {
if (c.key != null && String(c.key).indexOf('__vlist') !== 0) {
children.push(c);
map[c.key] = c
;(c.data || (c.data = {})).transition = transitionData;
} else {
var opts = c.componentOptions;
var name = opts
? (opts.Ctor.options.name || opts.tag)
: c.tag;
warn(("<transition-group> children must be keyed: <" + name + ">"));
}
}
}
if (prevChildren) {
var kept = [];
var removed = [];
prevChildren.forEach(function (c) {
c.data.transition = transitionData;
// TODO: record before patch positions
if (map[c.key]) {
kept.push(c);
} else {
removed.push(c);
}
});
this.kept = h(tag, null, kept);
this.removed = removed;
}
return h(tag, null, children)
},
beforeUpdate: function beforeUpdate () {
// force removing pass
this.__patch__(
this._vnode,
this.kept,
false, // hydrating
true // removeOnly (!important, avoids unnecessary moves)
);
this._vnode = this.kept;
},
updated: function updated () {
var children = this.prevChildren;
var moveClass = this.moveClass || ((this.name || 'v') + '-move');
var moveData = children.length && this.getMoveData(children[0].context, moveClass);
if (!moveData) {
return
}
// TODO: finish implementing move animations once
// we have access to sync getComponentRect()
// children.forEach(callPendingCbs)
// Promise.all(children.map(c => {
// const oldPos = c.data.pos
// const newPos = c.data.newPos
// const dx = oldPos.left - newPos.left
// const dy = oldPos.top - newPos.top
// if (dx || dy) {
// c.data.moved = true
// return this.animate(c.elm, {
// styles: {
// transform: `translate(${dx}px,${dy}px)`
// }
// })
// }
// })).then(() => {
// children.forEach(c => {
// if (c.data.moved) {
// this.animate(c.elm, {
// styles: {
// transform: ''
// },
// duration: moveData.duration || 0,
// delay: moveData.delay || 0,
// timingFunction: moveData.timingFunction || 'linear'
// })
// }
// })
// })
},
methods: {
getMoveData: function getMoveData (context, moveClass) {
var stylesheet = context.$options.style || {};
return stylesheet['@TRANSITION'] && stylesheet['@TRANSITION'][moveClass]
}
}
};
// function callPendingCbs (c) {
// /* istanbul ignore if */
// if (c.elm._moveCb) {
// c.elm._moveCb()
// }
// /* istanbul ignore if */
// if (c.elm._enterCb) {
// c.elm._enterCb()
// }
// }
var platformComponents = {
Richtext: Richtext,
Transition: Transition$1,
TransitionGroup: TransitionGroup
};
/* globals renderer */
var isReservedTag = makeMap(
'template,script,style,element,content,slot,link,meta,svg,view,' +
'a,div,img,image,text,span,input,switch,textarea,spinner,select,' +
'slider,slider-neighbor,indicator,canvas,' +
'list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,' +
'video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown',
true
);
// Elements that you can, intentionally, leave open (and which close themselves)
// more flexable than web
var canBeLeftOpenTag = makeMap(
'web,spinner,switch,video,textarea,canvas,' +
'indicator,marquee,countdown',
true
);
var isRuntimeComponent = makeMap(
'richtext,trisition,trisition-group',
true
);
var isUnaryTag = makeMap(
'embed,img,image,input,link,meta',
true
);
function mustUseProp () { /* console.log('mustUseProp') */ }
function isUnknownElement () { /* console.log('isUnknownElement') */ }
function query (el, document) {
// renderer is injected by weex factory wrapper
var placeholder = new renderer.Comment('root');
placeholder.hasAttribute = placeholder.removeAttribute = function () {}; // hack for patch
document.documentElement.appendChild(placeholder);
return placeholder
}
/* */
// install platform specific utils
Vue$2.config.mustUseProp = mustUseProp;
Vue$2.config.isReservedTag = isReservedTag;
Vue$2.config.isRuntimeComponent = isRuntimeComponent;
Vue$2.config.isUnknownElement = isUnknownElement;
// install platform runtime directives and components
Vue$2.options.directives = platformDirectives;
Vue$2.options.components = platformComponents;
// install platform patch function
Vue$2.prototype.__patch__ = patch;
// wrap mount
Vue$2.prototype.$mount = function (
el,
hydrating
) {
return mountComponent(
this,
el && query(el, this.$document),
hydrating
)
};
// this entry is built and wrapped with a factory function
// used to generate a fresh copy of Vue for every Weex instance.
exports.Vue = Vue$2;
};
});
var index = createCommonjsModule(function (module, exports) {
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var latestNodeId = 1;
function TextNode (text) {
this.instanceId = '';
this.nodeId = latestNodeId++;
this.parentNode = null;
this.nodeType = 3;
this.text = text;
}
// this will be preserved during build
var VueFactory = factory;
var instances = {};
var modules = {};
var components = {};
var renderer = {
TextNode: TextNode,
instances: instances,
modules: modules,
components: components
};
/**
* Prepare framework config, basically about the virtual-DOM and JS bridge.
* @param {object} cfg
*/
function init (cfg) {
renderer.Document = cfg.Document;
renderer.Element = cfg.Element;
renderer.Comment = cfg.Comment;
renderer.compileBundle = cfg.compileBundle;
}
/**
* Reset framework config and clear all registrations.
*/
function reset () {
clear(instances);
clear(modules);
clear(components);
delete renderer.Document;
delete renderer.Element;
delete renderer.Comment;
delete renderer.compileBundle;
}
/**
* Delete all keys of an object.
* @param {object} obj
*/
function clear (obj) {
for (var key in obj) {
delete obj[key];
}
}
/**
* Create an instance with id, code, config and external data.
* @param {string} instanceId
* @param {string} appCode
* @param {object} config
* @param {object} data
* @param {object} env { info, config, services }
*/
function createInstance (
instanceId,
appCode,
config,
data,
env
) {
if ( appCode === void 0 ) { appCode = ''; }
if ( config === void 0 ) { config = {}; }
if ( env === void 0 ) { env = {}; }
// Virtual-DOM object.
var document = new renderer.Document(instanceId, config.bundleUrl);
var instance = instances[instanceId] = {
instanceId: instanceId, config: config, data: data,
document: document
};
// Prepare native module getter and HTML5 Timer APIs.
var moduleGetter = genModuleGetter(instanceId);
var timerAPIs = getInstanceTimer(instanceId, moduleGetter);
// Prepare `weex` instance variable.
var weexInstanceVar = {
config: config,
document: document,
supports: supports,
requireModule: moduleGetter
};
Object.freeze(weexInstanceVar);
// Each instance has a independent `Vue` module instance
var Vue = instance.Vue = createVueModuleInstance(instanceId, moduleGetter);
// The function which create a closure the JS Bundle will run in.
// It will declare some instance variables like `Vue`, HTML5 Timer APIs etc.
var instanceVars = Object.assign({
Vue: Vue,
weex: weexInstanceVar
}, timerAPIs, env.services);
appCode = "(function(global){ \n" + appCode + "\n })(Object.create(this))";
if (!callFunctionNative(instanceVars, appCode)) {
// If failed to compile functionBody on native side,
// fallback to 'callFunction()'.
callFunction(instanceVars, appCode);
}
// Send `createFinish` signal in next tick.
timerAPIs.setTimeout(function () {
instance.document.taskCenter.send('dom', { action: 'createFinish' }, []);
}, 0);
return instance
}
/**
* Destroy an instance with id. It will make sure all memory of
* this instance released and no more leaks.
* @param {string} instanceId
*/
function destroyInstance (instanceId) {
var instance = instances[instanceId];
if (instance && instance.app instanceof instance.Vue) {
instance.document.destroy();
instance.app.$destroy();
}
delete instances[instanceId];
}
/**
* Refresh an instance with id and new top-level component data.
* It will use `Vue.set` on all keys of the new data. So it's better
* define all possible meaningful keys when instance created.
* @param {string} instanceId
* @param {object} data
*/
function refreshInstance (instanceId, data) {
var instance = instances[instanceId];
if (!instance || !(instance.app instanceof instance.Vue)) {
return new Error(("refreshInstance: instance " + instanceId + " not found!"))
}
for (var key in data) {
instance.Vue.set(instance.app, key, data[key]);
}
// Finally `refreshFinish` signal needed.
instance.document.taskCenter.send('dom', { action: 'refreshFinish' }, []);
}
/**
* Get the JSON object of the root element.
* @param {string} instanceId
*/
function getRoot (instanceId) {
var instance = instances[instanceId];
if (!instance || !(instance.app instanceof instance.Vue)) {
return new Error(("getRoot: instance " + instanceId + " not found!"))
}
return instance.app.$el.toJSON()
}
var jsHandlers = {
fireEvent: function (id) {
var arguments$1 = arguments;
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) { args[ len ] = arguments$1[ len + 1 ]; }
return fireEvent.apply(void 0, [ instances[id] ].concat( args ))
},
callback: function (id) {
var arguments$1 = arguments;
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) { args[ len ] = arguments$1[ len + 1 ]; }
return callback.apply(void 0, [ instances[id] ].concat( args ))
}
};
function fireEvent (instance, nodeId, type, e, domChanges) {
var el = instance.document.getRef(nodeId);
if (el) {
return instance.document.fireEvent(el, type, e, domChanges)
}
return new Error(("invalid element reference \"" + nodeId + "\""))
}
function callback (instance, callbackId, data, ifKeepAlive) {
var result = instance.document.taskCenter.callback(callbackId, data, ifKeepAlive);
instance.document.taskCenter.send('dom', { action: 'updateFinish' }, []);
return result
}
/**
* Accept calls from native (event or callback).
*
* @param {string} id
* @param {array} tasks list with `method` and `args`
*/
function receiveTasks (id, tasks) {
var instance = instances[id];
if (instance && Array.isArray(tasks)) {
var results = [];
tasks.forEach(function (task) {
var handler = jsHandlers[task.method];
var args = [].concat( task.args );
/* istanbul ignore else */
if (typeof handler === 'function') {
args.unshift(id);
results.push(handler.apply(void 0, args));
}
});
return results
}
return new Error(("invalid instance id \"" + id + "\" or tasks"))
}
/**
* Register native modules information.
* @param {object} newModules
*/
function registerModules (newModules) {
var loop = function ( name ) {
if (!modules[name]) {
modules[name] = {};
}
newModules[name].forEach(function (method) {
if (typeof method === 'string') {
modules[name][method] = true;
} else {
modules[name][method.name] = method.args;
}
});
};
for (var name in newModules) { loop( name ); }
}
/**
* Check whether the module or the method has been registered.
* @param {String} module name
* @param {String} method name (optional)
*/
function isRegisteredModule (name, method) {
if (typeof method === 'string') {
return !!(modules[name] && modules[name][method])
}
return !!modules[name]
}
/**
* Register native components information.
* @param {array} newComponents
*/
function registerComponents (newComponents) {
if (Array.isArray(newComponents)) {
newComponents.forEach(function (component) {
if (!component) {
return
}
if (typeof component === 'string') {
components[component] = true;
} else if (typeof component === 'object' && typeof component.type === 'string') {
components[component.type] = component;
}
});
}
}
/**
* Check whether the component has been registered.
* @param {String} component name
*/
function isRegisteredComponent (name) {
return !!components[name]
}
/**
* Detects whether Weex supports specific features.
* @param {String} condition
*/
function supports (condition) {
if (typeof condition !== 'string') { return null }
var res = condition.match(/^@(\w+)\/(\w+)(\.(\w+))?$/i);
if (res) {
var type = res[1];
var name = res[2];
var method = res[4];
switch (type) {
case 'module': return isRegisteredModule(name, method)
case 'component': return isRegisteredComponent(name)
}
}
return null
}
/**
* Create a fresh instance of Vue for each Weex instance.
*/
function createVueModuleInstance (instanceId, moduleGetter) {
var exports = {};
VueFactory(exports, renderer);
var Vue = exports.Vue;
var instance = instances[instanceId];
// patch reserved tag detection to account for dynamically registered
// components
var weexRegex = /^weex:/i;
var isReservedTag = Vue.config.isReservedTag || (function () { return false; });
var isRuntimeComponent = Vue.config.isRuntimeComponent || (function () { return false; });
Vue.config.isReservedTag = function (name) {
return (!isRuntimeComponent(name) && components[name]) ||
isReservedTag(name) ||
weexRegex.test(name)
};
Vue.config.parsePlatformTagName = function (name) { return name.replace(weexRegex, ''); };
// expose weex-specific info
Vue.prototype.$instanceId = instanceId;
Vue.prototype.$document = instance.document;
// expose weex native module getter on subVue prototype so that
// vdom runtime modules can access native modules via vnode.context
Vue.prototype.$requireWeexModule = moduleGetter;
// Hack `Vue` behavior to handle instance information and data
// before root component created.
Vue.mixin({
beforeCreate: function beforeCreate () {
var options = this.$options;
// root component (vm)
if (options.el) {
// set external data of instance
var dataOption = options.data;
var internalData = (typeof dataOption === 'function' ? dataOption() : dataOption) || {};
options.data = Object.assign(internalData, instance.data);
// record instance by id
instance.app = this;
}
}
});
/**
* @deprecated Just instance variable `weex.config`
* Get instance config.
* @return {object}
*/
Vue.prototype.$getConfig = function () {
if (instance.app instanceof Vue) {
return instance.config
}
};
return Vue
}
/**
* Generate native module getter. Each native module has several
* methods to call. And all the behaviors is instance-related. So
* this getter will return a set of methods which additionally
* send current instance id to native when called.
* @param {string} instanceId
* @return {function}
*/
function genModuleGetter (instanceId) {
var instance = instances[instanceId];
return function (name) {
var nativeModule = modules[name] || [];
var output = {};
var loop = function ( methodName ) {
Object.defineProperty(output, methodName, {
enumerable: true,
configurable: true,
get: function proxyGetter () {
return function () {
var arguments$1 = arguments;
var args = [], len = arguments.length;
while ( len-- ) { args[ len ] = arguments$1[ len ]; }
return instance.document.taskCenter.send('module', { module: name, method: methodName }, args)
}
},
set: function proxySetter (val) {
if (typeof val === 'function') {
return instance.document.taskCenter.send('module', { module: name, method: methodName }, [val])
}
}
});
};
for (var methodName in nativeModule) { loop( methodName ); }
return output
}
}
/**
* Generate HTML5 Timer APIs. An important point is that the callback
* will be converted into callback id when sent to native. So the
* framework can make sure no side effect of the callback happened after
* an instance destroyed.
* @param {[type]} instanceId [description]
* @param {[type]} moduleGetter [description]
* @return {[type]} [description]
*/
function getInstanceTimer (instanceId, moduleGetter) {
var instance = instances[instanceId];
var timer = moduleGetter('timer');
var timerAPIs = {
setTimeout: function () {
var arguments$1 = arguments;
var args = [], len = arguments.length;
while ( len-- ) { args[ len ] = arguments$1[ len ]; }
var handler = function () {
args[0].apply(args, args.slice(2));
};
timer.setTimeout(handler, args[1]);
return instance.document.taskCenter.callbackManager.lastCallbackId.toString()
},
setInterval: function () {
var arguments$1 = arguments;
var args = [], len = arguments.length;
while ( len-- ) { args[ len ] = arguments$1[ len ]; }
var handler = function () {
args[0].apply(args, args.slice(2));
};
timer.setInterval(handler, args[1]);
return instance.document.taskCenter.callbackManager.lastCallbackId.toString()
},
clearTimeout: function (n) {
timer.clearTimeout(n);
},
clearInterval: function (n) {
timer.clearInterval(n);
}
};
return timerAPIs
}
/**
* Call a new function body with some global objects.
* @param {object} globalObjects
* @param {string} code
* @return {any}
*/
function callFunction (globalObjects, body) {
var globalKeys = [];
var globalValues = [];
for (var key in globalObjects) {
globalKeys.push(key);
globalValues.push(globalObjects[key]);
}
globalKeys.push(body);
var result = new (Function.prototype.bind.apply( Function, [ null ].concat( globalKeys) ));
return result.apply(void 0, globalValues)
}
/**
* Call a new function generated on the V8 native side.
*
* This function helps speed up bundle compiling. Normally, the V8
* engine needs to download, parse, and compile a bundle on every
* visit. If 'compileBundle()' is available on native side,
* the downloding, parsing, and compiling steps would be skipped.
* @param {object} globalObjects
* @param {string} body
* @return {boolean}
*/
function callFunctionNative (globalObjects, body) {
if (typeof renderer.compileBundle !== 'function') {
return false
}
var fn = void 0;
var isNativeCompileOk = false;
var script = '(function (';
var globalKeys = [];
var globalValues = [];
for (var key in globalObjects) {
globalKeys.push(key);
globalValues.push(globalObjects[key]);
}
for (var i = 0; i < globalKeys.length - 1; ++i) {
script += globalKeys[i];
script += ',';
}
script += globalKeys[globalKeys.length - 1];
script += ') {';
script += body;
script += '} )';
try {
var weex = globalObjects.weex || {};
var config = weex.config || {};
fn = renderer.compileBundle(script,
config.bundleUrl,
config.bundleDigest,
config.codeCachePath);
if (fn && typeof fn === 'function') {
fn.apply(void 0, globalValues);
isNativeCompileOk = true;
}
} catch (e) {
console.error(e);
}
return isNativeCompileOk
}
exports.init = init;
exports.reset = reset;
exports.createInstance = createInstance;
exports.destroyInstance = destroyInstance;
exports.refreshInstance = refreshInstance;
exports.getRoot = getRoot;
exports.receiveTasks = receiveTasks;
exports.registerModules = registerModules;
exports.isRegisteredModule = isRegisteredModule;
exports.registerComponents = registerComponents;
exports.isRegisteredComponent = isRegisteredComponent;
exports.supports = supports;
});
var index$1 = unwrapExports(index);
var supports = index.supports;
var isRegisteredComponent = index.isRegisteredComponent;
var registerComponents = index.registerComponents;
var isRegisteredModule = index.isRegisteredModule;
var registerModules = index.registerModules;
var receiveTasks$1 = index.receiveTasks;
var getRoot$1 = index.getRoot;
var refreshInstance = index.refreshInstance;
var destroyInstance$1 = index.destroyInstance;
var createInstance$2 = index.createInstance;
var reset = index.reset;
var init$4 = index.init;
var Vue = Object.freeze({
default: index$1,
__moduleExports: index,
supports: supports,
isRegisteredComponent: isRegisteredComponent,
registerComponents: registerComponents,
isRegisteredModule: isRegisteredModule,
registerModules: registerModules,
receiveTasks: receiveTasks$1,
getRoot: getRoot$1,
refreshInstance: refreshInstance,
destroyInstance: destroyInstance$1,
createInstance: createInstance$2,
reset: reset,
init: init$4
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview The api for invoking with "$" prefix
*/
/**
* @deprecated use $vm instead
* find the vm by id
* Note: there is only one id in whole component
* @param {string} id
* @return {Vm}
*/
function $ (id) {
console.warn('[JS Framework] Vm#$ is deprecated, please use Vm#$vm instead');
var info = this._ids[id];
if (info) {
return info.vm
}
}
/**
* find the element by id
* Note: there is only one id in whole component
* @param {string} id
* @return {Element}
*/
function $el (id) {
var info = this._ids[id];
if (info) {
return info.el
}
}
/**
* find the vm of the custom component by id
* Note: there is only one id in whole component
* @param {string} id
* @return {Vm}
*/
function $vm (id) {
var info = this._ids[id];
if (info) {
return info.vm
}
}
/**
* Fire when differ rendering finished
*
* @param {Function} fn
*/
function $renderThen (fn) {
var app = this._app;
var differ = app.differ;
return differ.then(function () {
fn();
})
}
/**
* scroll an element specified by id into view,
* moreover specify a number of offset optionally
* @param {string} id
* @param {number} offset
*/
function $scrollTo (id, offset) {
console.warn('[JS Framework] Vm#$scrollTo is deprecated, ' +
'please use "require(\'@weex-module/dom\')' +
'.scrollTo(el, options)" instead');
var el = this.$el(id);
if (el) {
var dom = this._app.requireModule('dom');
dom.scrollToElement(el.ref, { offset: offset });
}
}
/**
* perform transition animation on an element specified by id
* @param {string} id
* @param {object} options
* @param {object} options.styles
* @param {object} options.duration(ms)
* @param {object} [options.timingFunction]
* @param {object} [options.delay=0(ms)]
* @param {Function} callback
*/
function $transition (id, options, callback) {
var this$1 = this;
var el = this.$el(id);
if (el && options && options.styles) {
var animation = this._app.requireModule('animation');
animation.transition(el.ref, options, function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
this$1._setStyle(el, options.styles);
callback && callback.apply(void 0, args);
});
}
}
/**
* get some config
* @return {object} some config for app instance
* @property {string} bundleUrl
* @property {boolean} debug
* @property {object} env
* @property {string} env.weexVersion(ex. 1.0.0)
* @property {string} env.appName(ex. TB/TM)
* @property {string} env.appVersion(ex. 5.0.0)
* @property {string} env.platform(ex. iOS/Android)
* @property {string} env.osVersion(ex. 7.0.0)
* @property {string} env.deviceModel **native only**
* @property {number} env.[deviceWidth=750]
* @property {number} env.deviceHeight
*/
function $getConfig (callback) {
var config = this._app.options;
if (typeof callback === 'function') {
console.warn('[JS Framework] the callback of Vm#$getConfig(callback) is deprecated, ' +
'this api now can directly RETURN config info.');
callback(config);
}
return config
}
/**
* @deprecated
* request network via http protocol
* @param {object} params
* @param {Function} callback
*/
function $sendHttp (params, callback) {
console.warn('[JS Framework] Vm#$sendHttp is deprecated, ' +
'please use "require(\'@weex-module/stream\')' +
'.sendHttp(params, callback)" instead');
var stream = this._app.requireModule('stream');
stream.sendHttp(params, callback);
}
/**
* @deprecated
* open a url
* @param {string} url
*/
function $openURL (url) {
console.warn('[JS Framework] Vm#$openURL is deprecated, ' +
'please use "require(\'@weex-module/event\')' +
'.openURL(url)" instead');
var event = this._app.requireModule('event');
event.openURL(url);
}
/**
* @deprecated
* set a title for page
* @param {string} title
*/
function $setTitle (title) {
console.warn('[JS Framework] Vm#$setTitle is deprecated, ' +
'please use "require(\'@weex-module/pageInfo\')' +
'.setTitle(title)" instead');
var pageInfo = this._app.requireModule('pageInfo');
pageInfo.setTitle(title);
}
/**
* @deprecated use "require('@weex-module/moduleName') instead"
* invoke a native method by specifing the name of module and method
* @param {string} moduleName
* @param {string} methodName
* @param {...*} the rest arguments
*/
function $call (moduleName, methodName) {
var args = [], len = arguments.length - 2;
while ( len-- > 0 ) args[ len ] = arguments[ len + 2 ];
console.warn('[JS Framework] Vm#$call is deprecated, ' +
'please use "require(\'@weex-module/moduleName\')" instead');
var module = this._app.requireModule(moduleName);
if (module && module[methodName]) {
module[methodName].apply(module, args);
}
}
var methods$1 = Object.freeze({
$: $,
$el: $el,
$vm: $vm,
$renderThen: $renderThen,
$scrollTo: $scrollTo,
$transition: $transition,
$getConfig: $getConfig,
$sendHttp: $sendHttp,
$openURL: $openURL,
$setTitle: $setTitle,
$call: $call
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Mix properties into target object.
*
* @param {Object} to
* @param {Object} from
*/
function extend (target) {
var src = [], len = arguments.length - 1;
while ( len-- > 0 ) src[ len ] = arguments[ len + 1 ];
/* istanbul ignore else */
if (typeof Object.assign === 'function') {
Object.assign.apply(Object, [ target ].concat( src ));
}
else {
var first = src.shift();
for (var key in first) {
target[key] = first[key];
}
if (src.length) {
extend.apply(void 0, [ target ].concat( src ));
}
}
return target
}
/**
* Define a property.
*
* @param {Object} obj
* @param {String} key
* @param {*} val
* @param {Boolean} [enumerable]
*/
function def$1 (obj, key, val, enumerable) {
Object.defineProperty(obj, key, {
value: val,
enumerable: !!enumerable,
writable: true,
configurable: true
});
}
/**
* Remove an item from an array
*
* @param {Array} arr
* @param {*} item
*/
function remove$1 (arr, item) {
if (arr.length) {
var index = arr.indexOf(item);
if (index > -1) {
return arr.splice(index, 1)
}
}
}
/**
* Check whether the object has the property.
*
* @param {Object} obj
* @param {String} key
* @return {Boolean}
*/
var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
function hasOwn (obj, key) {
return hasOwnProperty$1.call(obj, key)
}
/**
* Simple bind, faster than native
*
* @param {Function} fn
* @param {Object} ctx
* @return {Function}
*/
function bind (fn, ctx) {
return function (a) {
var l = arguments.length;
return l
? l > 1
? fn.apply(ctx, arguments)
: fn.call(ctx, a)
: fn.call(ctx)
}
}
/**
* Convert an Array-like object to a real Array.
*
* @param {Array-like} list
* @param {Number} [start] - start index
* @return {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
}
/**
* Quick object check - this is primarily used to tell
* Objects from primitive values when we know the value
* is a JSON-compliant type.
*
* @param {*} obj
* @return {Boolean}
*/
function isObject$4 (obj) {
return obj !== null && typeof obj === 'object'
}
/**
* Strict object type check. Only returns true
* for plain JavaScript objects.
*
* @param {*} obj
* @return {Boolean}
*/
var toString$2 = Object.prototype.toString;
var OBJECT_STRING = '[object Object]';
function isPlainObject (obj) {
return toString$2.call(obj) === OBJECT_STRING
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Check if a string starts with $ or _
*
* @param {String} str
* @return {Boolean}
*/
function isReserved (str) {
var c = (str + '').charCodeAt(0);
return c === 0x24 || c === 0x5F
}
// can we use __proto__?
var hasProto = '__proto__' in {};
var _Set;
/* istanbul ignore next */
if (typeof Set !== 'undefined' && Set.toString().match(/native code/)) {
// use native Set when available.
_Set = Set;
}
else {
// a non-standard Set polyfill that only works with primitive keys.
_Set = function () {
this.set = Object.create(null);
};
_Set.prototype.has = function (key) {
return this.set[key] !== undefined
};
_Set.prototype.add = function (key) {
if (key == null || this.set[key]) {
return
}
this.set[key] = 1;
};
_Set.prototype.clear = function () {
this.set = Object.create(null);
};
}
/**
* Polyfill in iOS7 by native because the JavaScript polyfill has memory problem.
* @return {object}
*/
function createNewSet () {
/* istanbul ignore next */
/* eslint-disable */
if (typeof nativeSet === 'object') {
return nativeSet.create()
}
/* eslint-enable */
return new _Set()
}
/**
* Create a cached version of a pure function.
*
* @param {Function} fn
* @return {Function}
*/
function typof$1 (v) {
var s = Object.prototype.toString.call(v);
return s.substring(8, s.length - 1).toLowerCase()
}
// weex name rules
var WEEX_COMPONENT_REG = /^@weex-component\//;
var WEEX_MODULE_REG = /^@weex-module\//;
var NORMAL_MODULE_REG = /^\.{1,2}\//;
var JS_SURFIX_REG = /\.js$/;
var isWeexComponent = function (name) { return !!name.match(WEEX_COMPONENT_REG); };
var isWeexModule = function (name) { return !!name.match(WEEX_MODULE_REG); };
var isNormalModule = function (name) { return !!name.match(NORMAL_MODULE_REG); };
var isNpmModule = function (name) { return !isWeexComponent(name) && !isWeexModule(name) && !isNormalModule(name); };
function removeWeexPrefix (str) {
var result = str.replace(WEEX_COMPONENT_REG, '').replace(WEEX_MODULE_REG, '');
return result
}
function removeJSSurfix (str) {
return str.replace(JS_SURFIX_REG, '')
}
/* eslint-disable */
var uid$2 = 0;
/**
* A dep is an observable that can have multiple
* directives subscribing to it.
*
* @constructor
*/
function Dep () {
this.id = uid$2++;
this.subs = [];
}
// the current target watcher being evaluated.
// this is globally unique because there could be only one
// watcher being evaluated at any time.
Dep.target = null;
var targetStack = [];
function pushTarget (_target) {
if (Dep.target) { targetStack.push(Dep.target); }
Dep.target = _target;
}
function popTarget () {
Dep.target = targetStack.pop();
}
function resetTarget () {
Dep.target = null;
targetStack = [];
}
/**
* Add a directive subscriber.
*
* @param {Directive} sub
*/
Dep.prototype.addSub = function (sub) {
this.subs.push(sub);
};
/**
* Remove a directive subscriber.
*
* @param {Directive} sub
*/
Dep.prototype.removeSub = function (sub) {
remove$1(this.subs, sub);
};
/**
* Add self as a dependency to the target watcher.
*/
Dep.prototype.depend = function () {
if (Dep.target) {
Dep.target.addDep(this);
}
};
/**
* Notify all subscribers of a new value.
*/
Dep.prototype.notify = function () {
// stablize the subscriber list first
var subs = this.subs.slice();
for (var i = 0, l = subs.length; i < l; i++) {
subs[i].update();
}
};
/* eslint-disable */
// import { pushWatcher } from './batcher'
var uid$1 = 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.
*
* @param {Vue} vm
* @param {String|Function} expOrFn
* @param {Function} cb
* @param {Object} options
* - {Array} filters
* - {Boolean} twoWay
* - {Boolean} deep
* - {Boolean} user
* - {Boolean} sync
* - {Boolean} lazy
* - {Function} [preProcess]
* - {Function} [postProcess]
* @constructor
*/
function Watcher (vm, expOrFn, cb, options) {
// mix in options
if (options) {
extend(this, options);
}
var isFn = typeof expOrFn === 'function';
this.vm = vm;
vm._watchers.push(this);
this.expression = expOrFn;
this.cb = cb;
this.id = ++uid$1; // uid for batching
this.active = true;
this.dirty = this.lazy; // for lazy watchers
this.deps = [];
this.newDeps = [];
this.depIds = createNewSet(); // new Set()
this.newDepIds = createNewSet(); // new Set()
// parse expression for getter
if (isFn) {
this.getter = expOrFn;
}
this.value = this.lazy
? undefined
: this.get();
// state for avoiding false triggers for deep and Array
// watchers during vm._digest()
this.queued = this.shallow = false;
}
/**
* Evaluate the getter, and re-collect dependencies.
*/
Watcher.prototype.get = function () {
pushTarget(this);
var value = this.getter.call(this.vm, this.vm);
// "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.
*
* @param {Dep} dep
*/
Watcher.prototype.addDep = function (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 () {
var this$1 = this;
var i = this.deps.length;
while (i--) {
var dep = this$1.deps[i];
if (!this$1.newDepIds.has(dep.id)) {
dep.removeSub(this$1);
}
}
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.
*
* @param {Boolean} shallow
*/
Watcher.prototype.update = function (shallow) {
if (this.lazy) {
this.dirty = true;
} else {
this.run();
}
// } else if (this.sync) {
// this.run()
// } else {
// // if queued, only overwrite shallow with non-shallow,
// // but not the other way around.
// this.shallow = this.queued
// ? shallow
// ? this.shallow
// : false
// : !!shallow
// this.queued = true
// pushWatcher(this)
// }
};
/**
* Batcher job interface.
* Will be called by the batcher.
*/
Watcher.prototype.run = function () {
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; but only do so if this is a
// non-shallow update (caused by a vm digest).
((isObject$4(value) || this.deep) && !this.shallow)
) {
// set new value
var oldValue = this.value;
this.value = value;
this.cb.call(this.vm, value, oldValue);
}
this.queued = this.shallow = false;
}
};
/**
* Evaluate the value of the watcher.
* This only gets called for lazy watchers.
*/
Watcher.prototype.evaluate = function () {
this.value = this.get();
this.dirty = false;
};
/**
* Depend on all deps collected by this watcher.
*/
Watcher.prototype.depend = function () {
var this$1 = this;
var i = this.deps.length;
while (i--) {
this$1.deps[i].depend();
}
};
/**
* Remove self from all dependencies' subcriber list.
*/
Watcher.prototype.teardown = function () {
var this$1 = this;
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 or is performing a v-for
// re-render (the watcher list is then filtered by v-for).
if (!this.vm._isBeingDestroyed && !this.vm._vForRemoving) {
remove$1(this.vm._watchers, this);
}
var i = this.deps.length;
while (i--) {
this$1.deps[i].removeSub(this$1);
}
this.active = false;
this.vm = this.cb = this.value = null;
}
};
/**
* Recrusively traverse an object to evoke all converted
* getters, so that every nested property inside the object
* is collected as a "deep" dependency.
*
* @param {*} val
* @param {Set} seen
*/
var seenObjects = createNewSet(); // new Set()
/* istanbul ignore next */
function traverse (val, seen) {
var i, keys, isA, isO;
if (!seen) {
seen = seenObjects;
seen.clear();
}
isA = Array.isArray(val);
isO = isObject$4(val);
if (isA || isO) {
if (val.__ob__) {
var depId = val.__ob__.dep.id;
if (seen.has(depId)) {
return
} else {
seen.add(depId);
}
}
if (isA) {
i = val.length;
while (i--) { traverse(val[i], seen); }
} else if (isO) {
keys = Object.keys(val);
i = keys.length;
while (i--) { traverse(val[keys[i]], seen); }
}
}
}
/* eslint-disable */
var arrayProto = Array.prototype;
var arrayMethods = Object.create(arrayProto);[
'push',
'pop',
'shift',
'unshift',
'splice',
'sort',
'reverse'
]
.forEach(function (method) {
// cache original method
var original = arrayProto[method];
def$1(arrayMethods, method, function mutator () {
var arguments$1 = arguments;
// avoid leaking arguments:
// http://jsperf.com/closure-with-arguments
var i = arguments.length;
var args = new Array(i);
while (i--) {
args[i] = arguments$1[i];
}
var result = original.apply(this, args);
var ob = this.__ob__;
var inserted;
switch (method) {
case 'push':
inserted = args;
break
case 'unshift':
inserted = args;
break
case 'splice':
inserted = args.slice(2);
break
}
if (inserted) { ob.observeArray(inserted); }
// notify change
ob.dep.notify();
return result
});
});
/**
* Swap the element at the given index with a new value
* and emits corresponding event.
*
* @param {Number} index
* @param {*} val
* @return {*} - replaced element
*/
def$1(
arrayProto,
'$set',
function $set (index, val) {
console.warn("[JS Framework] \"Array.prototype.$set\" is not a standard API,"
+ " it will be removed in the next version.");
if (index >= this.length) {
this.length = index + 1;
}
return this.splice(index, 1, val)[0]
}
);
/**
* Convenience method to remove the element at given index.
*
* @param {Number} index
* @param {*} val
*/
def$1(
arrayProto,
'$remove',
function $remove (index) {
console.warn("[JS Framework] \"Array.prototype.$remove\" is not a standard API,"
+ " it will be removed in the next version.");
/* istanbul ignore if */
if (!this.length) { return }
/* istanbul ignore else */
if (typeof index !== 'number') {
index = this.indexOf(index);
}
/* istanbul ignore else */
if (index > -1) {
this.splice(index, 1);
}
}
);
/* eslint-disable */
var arrayKeys = Object.getOwnPropertyNames(arrayMethods);
/**
* Observer class that are attached to each observed
* object. Once attached, the observer converts target
* object's property keys into getter/setters that
* collect dependencies and dispatches updates.
*
* @param {Array|Object} value
* @constructor
*/
function Observer$1 (value) {
this.value = value;
this.dep = new Dep();
def$1(value, '__ob__', this);
if (Array.isArray(value)) {
var augment = hasProto
? protoAugment
: copyAugment;
augment(value, arrayMethods, arrayKeys);
this.observeArray(value);
} else {
this.walk(value);
}
}
// Instance methods
/**
* Walk through each property and convert them into
* getter/setters. This method should only be called when
* value type is Object.
*
* @param {Object} obj
*/
Observer$1.prototype.walk = function (obj) {
var this$1 = this;
for (var key in obj) {
this$1.convert(key, obj[key]);
}
};
/**
* Observe a list of Array items.
*
* @param {Array} items
*/
Observer$1.prototype.observeArray = function (items) {
for (var i = 0, l = items.length; i < l; i++) {
observe(items[i]);
}
};
/**
* Convert a property into getter/setter so we can emit
* the events when the property is accessed/changed.
*
* @param {String} key
* @param {*} val
*/
Observer$1.prototype.convert = function (key, val) {
defineReactive(this.value, key, val);
};
/**
* Add an owner vm, so that when $set/$delete mutations
* happen we can notify owner vms to proxy the keys and
* digest the watchers. This is only called when the object
* is observed as an instance's root $data.
*
* @param {Vue} vm
*/
Observer$1.prototype.addVm = function (vm) {
(this.vms || (this.vms = [])).push(vm);
};
/**
* Remove an owner vm. This is called when the object is
* swapped out as an instance's $data object.
*
* @param {Vue} vm
*/
/* istanbul ignore next */
Observer$1.prototype.removeVm = function (vm) {
remove$1(this.vms, vm);
};
// helpers
/**
* Augment an target Object or Array by intercepting
* the prototype chain using __proto__
*
* @param {Object|Array} target
* @param {Object} src
*/
function protoAugment (target, src) {
/* eslint-disable no-proto */
target.__proto__ = src;
/* eslint-enable no-proto */
}
/**
* Augment an target Object or Array by defining
* hidden properties.
*
* @param {Object|Array} target
* @param {Object} proto
*/
/* istanbul ignore next */
function copyAugment (target, src, keys) {
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i];
def$1(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.
*
* @param {*} value
* @param {Vue} [vm]
* @return {Observer|undefined}
* @static
*/
function observe (value, vm) {
if (!isObject$4(value)) {
return
}
var ob;
if (hasOwn(value, '__ob__') && value.__ob__ instanceof Observer$1) {
ob = value.__ob__;
} else if (
(Array.isArray(value) || isPlainObject(value)) &&
Object.isExtensible(value) &&
!value._isVue
) {
ob = new Observer$1(value);
}
if (ob && vm) {
ob.addVm(vm);
}
return ob
}
/**
* Define a reactive property on an Object.
*
* @param {Object} obj
* @param {String} key
* @param {*} val
*/
function defineReactive (obj, key, val) {
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;
var childOb = observe(val);
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
var value = getter ? getter.call(obj) : val;
if (Dep.target) {
dep.depend();
if (childOb) {
childOb.dep.depend();
}
if (Array.isArray(value)) {
for (var e = (void 0), i = 0, l = value.length; i < l; i++) {
e = value[i];
e && e.__ob__ && e.__ob__.dep.depend();
}
}
}
return value
},
set: function reactiveSetter (newVal) {
var value = getter ? getter.call(obj) : val;
if (newVal === value) {
return
}
if (setter) {
setter.call(obj, newVal);
} else {
val = newVal;
}
childOb = 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.
*
* @param {Object} obj
* @param {String} key
* @param {*} val
* @public
*/
/* istanbul ignore next */
function set$1 (obj, key, val) {
if (Array.isArray(obj)) {
return obj.splice(key, 1, val)
}
if (hasOwn(obj, key)) {
obj[key] = val;
return
}
if (obj._isVue) {
set$1(obj._data, key, val);
return
}
var ob = obj.__ob__;
if (!ob) {
obj[key] = val;
return
}
ob.convert(key, val);
ob.dep.notify();
if (ob.vms) {
var i = ob.vms.length;
while (i--) {
var vm = ob.vms[i];
proxy(vm, key);
// vm.$forceUpdate()
}
}
return val
}
/**
* Delete a property and trigger change if necessary.
*
* @param {Object} obj
* @param {String} key
*/
/* istanbul ignore next */
function del (obj, key) {
if (!hasOwn(obj, key)) {
return
}
delete obj[key];
var ob = obj.__ob__;
if (!ob) {
if (obj._isVue) {
delete obj._data[key];
// obj.$forceUpdate()
}
return
}
ob.dep.notify();
if (ob.vms) {
var i = ob.vms.length;
while (i--) {
var vm = ob.vms[i];
unproxy(vm, key);
// vm.$forceUpdate()
}
}
}
var KEY_WORDS = ['$index', '$value', '$event'];
function proxy (vm, key) {
if (KEY_WORDS.indexOf(key) > -1 || !isReserved(key)) {
Object.defineProperty(vm, key, {
configurable: true,
enumerable: true,
get: function proxyGetter () {
return vm._data[key]
},
set: function proxySetter (val) {
vm._data[key] = val;
}
});
}
}
/* istanbul ignore next */
function unproxy (vm, key) {
if (!isReserved(key)) {
delete vm[key];
}
}
/* eslint-disable */
function initState (vm) {
vm._watchers = [];
initData(vm);
initComputed(vm);
initMethods(vm);
}
function initData (vm) {
var data = vm._data;
if (!isPlainObject(data)) {
data = {};
}
// proxy data on instance
var keys = Object.keys(data);
var i = keys.length;
while (i--) {
proxy(vm, keys[i]);
}
// observe data
observe(data, vm);
}
/* istanbul ignore next */
function noop$1 () {
}
function initComputed (vm) {
var computed = vm._computed;
if (computed) {
for (var key in computed) {
var userDef = computed[key];
var def$$1 = {
enumerable: true,
configurable: true
};
if (typeof userDef === 'function') {
def$$1.get = makeComputedGetter(userDef, vm);
def$$1.set = noop$1;
} else {
def$$1.get = userDef.get
? userDef.cache !== false
? makeComputedGetter(userDef.get, vm)
: bind(userDef.get, vm)
: noop$1;
def$$1.set = userDef.set
? bind(userDef.set, vm)
: noop$1;
}
Object.defineProperty(vm, key, def$$1);
}
}
}
function makeComputedGetter (getter, owner) {
var watcher = new Watcher(owner, getter, null, {
lazy: true
});
return function computedGetter () {
if (watcher.dirty) {
watcher.evaluate();
}
if (Dep.target) {
watcher.depend();
}
return watcher.value
}
}
function initMethods (vm) {
var methods = vm._methods;
if (methods) {
for (var key in methods) {
vm[key] = methods[key];
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// @todo: It should be registered by native from `registerComponents()`.
var config$3 = {
nativeComponentMap: {
text: true,
image: true,
container: true,
slider: {
type: 'slider',
append: 'tree'
},
cell: {
type: 'cell',
append: 'tree'
}
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Directive Parser
*/
var nativeComponentMap = config$3.nativeComponentMap;
var SETTERS = {
attr: 'setAttr',
style: 'setStyle',
event: 'addEvent'
};
/**
* apply the native component's options(specified by template.type)
* to the template
*/
function applyNaitveComponentOptions (template) {
var type = template.type;
var options = nativeComponentMap[type];
if (typeof options === 'object') {
for (var key in options) {
if (template[key] == null) {
template[key] = options[key];
}
else if (typof$1(template[key]) === 'object' &&
typof$1(options[key]) === 'object') {
for (var subkey in options[key]) {
if (template[key][subkey] == null) {
template[key][subkey] = options[key][subkey];
}
}
}
}
}
}
/**
* bind all id, attr, classnames, style, events to an element
*/
function bindElement (vm, el, template) {
setId(vm, el, template.id, vm);
setAttr$1(vm, el, template.attr);
setClass(vm, el, template.classList);
setStyle$1(vm, el, template.style);
bindEvents$1(vm, el, template.events);
}
/**
* bind all props to sub vm and bind all style, events to the root element
* of the sub vm if it doesn't have a replaced multi-node fragment
*/
function bindSubVm (vm, subVm, template, repeatItem) {
subVm = subVm || {};
template = template || {};
var options = subVm._options || {};
// bind props
var props = options.props;
if (Array.isArray(props)) {
props = props.reduce(function (result, value) {
result[value] = true;
return result
}, {});
}
mergeProps(repeatItem, props, vm, subVm);
mergeProps(template.attr, props, vm, subVm);
}
/**
* merge class and styles from vm to sub vm.
*/
function bindSubVmAfterInitialized (vm, subVm, template, target) {
if ( target === void 0 ) target = {};
mergeClassStyle(template.classList, vm, subVm);
mergeStyle(template.style, vm, subVm);
// bind subVm to the target element
if (target.children) {
target.children[target.children.length - 1]._vm = subVm;
}
else {
target._vm = subVm;
}
}
/**
* Bind props from vm to sub vm and watch their updates.
*/
function mergeProps (target, props, vm, subVm) {
if (!target) {
return
}
var loop = function ( key ) {
if (!props || props[key]) {
var value = target[key];
if (typeof value === 'function') {
var returnValue = watch(vm, value, function (v) {
subVm[key] = v;
});
subVm[key] = returnValue;
}
else {
subVm[key] = value;
}
}
};
for (var key in target) loop( key );
}
/**
* Bind style from vm to sub vm and watch their updates.
*/
function mergeStyle (target, vm, subVm) {
var loop = function ( key ) {
var value = target[key];
if (typeof value === 'function') {
var returnValue = watch(vm, value, function (v) {
if (subVm._rootEl) {
subVm._rootEl.setStyle(key, v);
}
});
subVm._rootEl.setStyle(key, returnValue);
}
else {
if (subVm._rootEl) {
subVm._rootEl.setStyle(key, value);
}
}
};
for (var key in target) loop( key );
}
/**
* Bind class & style from vm to sub vm and watch their updates.
*/
function mergeClassStyle (target, vm, subVm) {
var css = vm._options && vm._options.style || {};
/* istanbul ignore if */
if (!subVm._rootEl) {
return
}
var className = '@originalRootEl';
css[className] = subVm._rootEl.classStyle;
function addClassName (list, name) {
if (typof$1(list) === 'array') {
list.unshift(name);
}
}
if (typeof target === 'function') {
var value = watch(vm, target, function (v) {
addClassName(v, className);
setClassStyle$1(subVm._rootEl, css, v);
});
addClassName(value, className);
setClassStyle$1(subVm._rootEl, css, value);
}
else if (target != null) {
addClassName(target, className);
setClassStyle$1(subVm._rootEl, css, target);
}
}
/**
* bind id to an element
* each id is unique in a whole vm
*/
function setId (vm, el, id, target) {
var map = Object.create(null);
Object.defineProperties(map, {
vm: {
value: target,
writable: false,
configurable: false
},
el: {
get: function () { return el || target._rootEl; },
configurable: false
}
});
if (typeof id === 'function') {
var handler = id;
id = handler.call(vm);
if (id || id === 0) {
vm._ids[id] = map;
}
watch(vm, handler, function (newId) {
if (newId) {
vm._ids[newId] = map;
}
});
}
else if (id && typeof id === 'string') {
vm._ids[id] = map;
}
}
/**
* bind attr to an element
*/
function setAttr$1 (vm, el, attr) {
bindDir(vm, el, 'attr', attr);
}
function setClassStyle$1 (el, css, classList) {
if (typeof classList === 'string') {
classList = classList.split(/\s+/);
}
classList.forEach(function (name, i) {
classList.splice.apply(classList, [ i, 1 ].concat( name.split(/\s+/) ));
});
var classStyle = {};
var length = classList.length;
var loop = function ( i ) {
var style = css[classList[i]];
if (style) {
Object.keys(style).forEach(function (key) {
classStyle[key] = style[key];
});
}
};
for (var i = 0; i < length; i++) loop( i );
el.setClassStyle(classStyle);
}
/**
* bind classnames to an element
*/
function setClass (vm, el, classList) {
if (typeof classList !== 'function' && !Array.isArray(classList)) {
return
}
if (Array.isArray(classList) && !classList.length) {
el.setClassStyle({});
return
}
var style = vm._options && vm._options.style || {};
if (typeof classList === 'function') {
var value = watch(vm, classList, function (v) {
setClassStyle$1(el, style, v);
});
setClassStyle$1(el, style, value);
}
else {
setClassStyle$1(el, style, classList);
}
}
/**
* bind style to an element
*/
function setStyle$1 (vm, el, style) {
bindDir(vm, el, 'style', style);
}
/**
* add an event type and handler to an element and generate a dom update
*/
function setEvent (vm, el, type, handler) {
el.addEvent(type, bind(handler, vm));
}
/**
* add all events of an element
*/
function bindEvents$1 (vm, el, events) {
if (!events) {
return
}
var keys = Object.keys(events);
var i = keys.length;
while (i--) {
var key = keys[i];
var handler = events[key];
if (typeof handler === 'string') {
handler = vm[handler];
/* istanbul ignore if */
if (!handler) {
console.warn(("[JS Framework] The event handler \"" + handler + "\" is not defined."));
}
}
setEvent(vm, el, key, handler);
}
}
/**
* set a series of members as a kind of an element
* for example: style, attr, ...
* if the value is a function then bind the data changes
*/
function bindDir (vm, el, name, data) {
if (!data) {
return
}
var keys = Object.keys(data);
var i = keys.length;
while (i--) {
var key = keys[i];
var value = data[key];
if (typeof value === 'function') {
bindKey(vm, el, name, key, value);
}
else {
el[SETTERS[name]](key, value);
}
}
}
/**
* bind data changes to a certain key to a name series in an element
*/
function bindKey (vm, el, name, key, calc) {
var methodName = SETTERS[name];
// watch the calc, and returns a value by calc.call()
var value = watch(vm, calc, function (value) {
function handler () {
el[methodName](key, value);
}
var differ = vm && vm._app && vm._app.differ;
if (differ) {
differ.append('element', el.depth, el.ref, handler);
}
else {
handler();
}
});
el[methodName](key, value);
}
/**
* watch a calc function and callback if the calc value changes
*/
function watch (vm, calc, callback) {
if (vm._static) {
return calc.call(vm, vm)
}
var watcher = new Watcher(vm, calc, function (value, oldValue) {
/* istanbul ignore if */
if (typeof value !== 'object' && value === oldValue) {
return
}
callback(value);
});
return watcher.value
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview Document & Element Helpers.
*
* required:
* Document#: createElement, createComment, getRef
* Element#: appendChild, insertBefore, removeChild, nextSibling
*/
/**
* Create a body by type
* Using this._app.doc
*
* @param {string} type
*/
function createBody$1 (vm, type) {
var doc = vm._app.doc;
return doc.createBody(type)
}
/**
* Create an element by type
* Using this._app.doc
*
* @param {string} type
*/
function createElement$1 (vm, type) {
var doc = vm._app.doc;
return doc.createElement(type)
}
/**
* Create and return a frag block for an element.
* The frag block has a starter, ender and the element itself.
*
* @param {object} element
*/
function createBlock (vm, element) {
var start = createBlockStart(vm);
var end = createBlockEnd(vm);
var blockId = lastestBlockId++;
if (element.element) {
var updateMark = element.updateMark;
if (updateMark) {
if (updateMark.element) {
updateMark = updateMark.end;
}
element.element.insertAfter(end, updateMark);
element.element.insertAfter(start, updateMark);
element.updateMark = end;
}
else {
element.element.insertBefore(start, element.end);
element.element.insertBefore(end, element.end);
}
element = element.element;
}
else {
element.appendChild(start);
element.appendChild(end);
}
return { start: start, end: end, element: element, blockId: blockId }
}
var lastestBlockId = 1;
/**
* Create and return a block starter.
* Using this._app.doc
*/
function createBlockStart (vm) {
var doc = vm._app.doc;
var anchor = doc.createComment('start');
return anchor
}
/**
* Create and return a block ender.
* Using this._app.doc
*/
function createBlockEnd (vm) {
var doc = vm._app.doc;
var anchor = doc.createComment('end');
return anchor
}
/**
* Attach target to a certain dest using appendChild by default.
* If the dest is a frag block then insert before the ender.
* If the target is a frag block then attach the starter and ender in order.
*
* @param {object} target
* @param {object} dest
*/
function attachTarget (vm, target, dest) {
if (dest.element) {
var before = dest.end;
var after = dest.updateMark;
// push new target for watch list update later
if (dest.children) {
dest.children.push(target);
}
// for check repeat case
if (after) {
var signal = moveTarget(vm, target, after);
dest.updateMark = target.element ? target.end : target;
return signal
}
else if (target.element) {
dest.element.insertBefore(target.start, before);
dest.element.insertBefore(target.end, before);
}
else {
return dest.element.insertBefore(target, before)
}
}
else {
if (target.element) {
dest.appendChild(target.start);
dest.appendChild(target.end);
}
else {
return dest.appendChild(target)
}
}
}
/**
* Move target before a certain element. The target maybe block or element.
*
* @param {object} target
* @param {object} before
*/
function moveTarget (vm, target, after) {
if (target.element) {
return moveBlock(target, after)
}
return moveElement$1(target, after)
}
/**
* Move element before a certain element.
*
* @param {object} element
* @param {object} before
*/
function moveElement$1 (element, after) {
var parent = after.parentNode;
if (parent) {
return parent.insertAfter(element, after)
}
}
/**
* Move all elements of the block before a certain element.
*
* @param {object} fragBlock
* @param {object} before
*/
function moveBlock (fragBlock, after) {
var parent = after.parentNode;
if (parent) {
var el = fragBlock.start;
var signal;
var group = [el];
while (el && el !== fragBlock.end) {
el = el.nextSibling;
group.push(el);
}
var temp = after;
group.every(function (el) {
signal = parent.insertAfter(el, temp);
temp = el;
return signal !== -1
});
return signal
}
}
/**
* Remove target from DOM tree.
* If the target is a frag block then call _removeBlock
*
* @param {object} target
*/
function removeTarget (vm, target, preserveBlock) {
if ( preserveBlock === void 0 ) preserveBlock = false;
if (target.element) {
removeBlock(target, preserveBlock);
}
else {
removeElement$1(target);
}
if (target._vm) {
target._vm.$emit('hook:destroyed');
}
}
/**
* Remove a certain element.
* Using this._app.doc
*
* @param {object} target
*/
function removeElement$1 (target) {
var parent = target.parentNode;
if (parent) {
parent.removeChild(target);
}
}
/**
* Remove a frag block.
* The second param decides whether the block self should be removed too.
*
* @param {object} fragBlock
* @param {Boolean} preserveBlock=false
*/
function removeBlock (fragBlock, preserveBlock) {
if ( preserveBlock === void 0 ) preserveBlock = false;
var result = [];
var el = fragBlock.start.nextSibling;
while (el && el !== fragBlock.end) {
result.push(el);
el = el.nextSibling;
}
if (!preserveBlock) {
removeElement$1(fragBlock.start);
}
result.forEach(function (el) {
removeElement$1(el);
});
if (!preserveBlock) {
removeElement$1(fragBlock.end);
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* ViewModel template parser & data-binding process
*/
/**
* build()
* compile(template, parentNode)
* if (type is content) create contentNode
* else if (dirs have v-for) foreach -> create context
* -> compile(templateWithoutFor, parentNode): diff(list) onchange
* else if (dirs have v-if) assert
* -> compile(templateWithoutIf, parentNode): toggle(shown) onchange
* else if (type is dynamic)
* -> compile(templateWithoutDynamicType, parentNode): watch(type) onchange
* else if (type is custom)
* addChildVm(vm, parentVm)
* build(externalDirs)
* foreach childNodes -> compile(childNode, template)
* else if (type is native)
* set(dirs): update(id/attr/style/class) onchange
* append(template, parentNode)
* foreach childNodes -> compile(childNode, template)
*/
function build (vm) {
var opt = vm._options || {};
var template = opt.template || {};
if (opt.replace) {
if (template.children && template.children.length === 1) {
compile(vm, template.children[0], vm._parentEl);
}
else {
compile(vm, template.children, vm._parentEl);
}
}
else {
compile(vm, template, vm._parentEl);
}
console.debug(("[JS Framework] \"ready\" lifecycle in Vm(" + (vm._type) + ")"));
vm.$emit('hook:ready');
vm._ready = true;
}
/**
* Generate elements by child or children and append to parent elements.
* Root element info would be merged if has. The first argument may be an array
* if the root element with options.replace has not only one child.
*
* @param {object|array} target
* @param {object} dest
* @param {object} meta
*/
function compile (vm, target, dest, meta) {
var app = vm._app || {};
if (app.lastSignal === -1) {
return
}
if (target.attr && target.attr.hasOwnProperty('static')) {
vm._static = true;
}
if (targetIsFragment(target)) {
compileFragment(vm, target, dest, meta);
return
}
meta = meta || {};
if (targetIsContent(target)) {
console.debug('[JS Framework] compile "content" block by', target);
vm._content = createBlock(vm, dest);
return
}
if (targetNeedCheckRepeat(target, meta)) {
console.debug('[JS Framework] compile "repeat" logic by', target);
if (dest.type === 'document') {
console.warn('[JS Framework] The root element does\'t support `repeat` directive!');
}
else {
compileRepeat(vm, target, dest);
}
return
}
if (targetNeedCheckShown(target, meta)) {
console.debug('[JS Framework] compile "if" logic by', target);
if (dest.type === 'document') {
console.warn('[JS Framework] The root element does\'t support `if` directive!');
}
else {
compileShown(vm, target, dest, meta);
}
return
}
var typeGetter = meta.type || target.type;
if (targetNeedCheckType(typeGetter, meta)) {
compileType(vm, target, dest, typeGetter, meta);
return
}
var type = typeGetter;
var component = targetIsComposed(vm, target, type);
if (component) {
console.debug('[JS Framework] compile composed component by', target);
compileCustomComponent(vm, component, target, dest, type, meta);
return
}
console.debug('[JS Framework] compile native component by', target);
compileNativeComponent(vm, target, dest, type);
}
/**
* Check if target is a fragment (an array).
*
* @param {object} target
* @return {boolean}
*/
function targetIsFragment (target) {
return Array.isArray(target)
}
/**
* Check if target type is content/slot.
*
* @param {object} target
* @return {boolean}
*/
function targetIsContent (target) {
return target.type === 'content' || target.type === 'slot'
}
/**
* Check if target need to compile by a list.
*
* @param {object} target
* @param {object} meta
* @return {boolean}
*/
function targetNeedCheckRepeat (target, meta) {
return !meta.hasOwnProperty('repeat') && target.repeat
}
/**
* Check if target need to compile by a boolean value.
*
* @param {object} target
* @param {object} meta
* @return {boolean}
*/
function targetNeedCheckShown (target, meta) {
return !meta.hasOwnProperty('shown') && target.shown
}
/**
* Check if target need to compile by a dynamic type.
*
* @param {string|function} typeGetter
* @param {object} meta
* @return {boolean}
*/
function targetNeedCheckType (typeGetter, meta) {
return (typeof typeGetter === 'function') && !meta.hasOwnProperty('type')
}
/**
* Check if this kind of component is composed.
*
* @param {string} type
* @return {boolean}
*/
function targetIsComposed (vm, target, type) {
var component;
if (vm._app && vm._app.customComponentMap) {
component = vm._app.customComponentMap[type];
}
if (vm._options && vm._options.components) {
component = vm._options.components[type];
}
if (target.component) {
component = component || {};
}
return component
}
/**
* Compile a list of targets.
*
* @param {object} target
* @param {object} dest
* @param {object} meta
*/
function compileFragment (vm, target, dest, meta) {
var fragBlock = createBlock(vm, dest);
target.forEach(function (child) {
compile(vm, child, fragBlock, meta);
});
}
/**
* Compile a target with repeat directive.
*
* @param {object} target
* @param {object} dest
*/
function compileRepeat (vm, target, dest) {
var repeat = target.repeat;
var oldStyle = typeof repeat === 'function';
var getter = repeat.getter || repeat.expression || repeat;
if (typeof getter !== 'function') {
getter = function () { return [] };
}
var key = repeat.key || '$index';
var value = repeat.value || '$value';
var trackBy = repeat.trackBy || target.trackBy ||
(target.attr && target.attr.trackBy);
var fragBlock = createBlock(vm, dest);
fragBlock.children = [];
fragBlock.data = [];
fragBlock.vms = [];
bindRepeat(vm, target, fragBlock, { getter: getter, key: key, value: value, trackBy: trackBy, oldStyle: oldStyle });
}
/**
* Compile a target with if directive.
*
* @param {object} target
* @param {object} dest
* @param {object} meta
*/
function compileShown (vm, target, dest, meta) {
var newMeta = { shown: true };
var fragBlock = createBlock(vm, dest);
if (dest.element && dest.children) {
dest.children.push(fragBlock);
}
if (meta.repeat) {
newMeta.repeat = meta.repeat;
}
bindShown(vm, target, fragBlock, newMeta);
}
/**
* Compile a target with dynamic component type.
*
* @param {object} target
* @param {object} dest
* @param {function} typeGetter
*/
function compileType (vm, target, dest, typeGetter, meta) {
var type = typeGetter.call(vm);
var newMeta = extend({ type: type }, meta);
var fragBlock = createBlock(vm, dest);
if (dest.element && dest.children) {
dest.children.push(fragBlock);
}
watch(vm, typeGetter, function (value) {
var newMeta = extend({ type: value }, meta);
removeTarget(vm, fragBlock, true);
compile(vm, target, fragBlock, newMeta);
});
compile(vm, target, fragBlock, newMeta);
}
/**
* Compile a composed component.
*
* @param {object} target
* @param {object} dest
* @param {string} type
*/
function compileCustomComponent (vm, component, target, dest, type, meta) {
var Ctor = vm.constructor;
var subVm = new Ctor(type, component, vm, dest, undefined, {
'hook:init': function () {
if (vm._static) {
this._static = vm._static;
}
setId(vm, null, target.id, this);
// bind template earlier because of lifecycle issues
this._externalBinding = {
parent: vm,
template: target
};
},
'hook:created': function () {
bindSubVm(vm, this, target, meta.repeat);
},
'hook:ready': function () {
if (this._content) {
compileChildren(vm, target, this._content);
}
}
});
bindSubVmAfterInitialized(vm, subVm, target, dest);
}
/**
* Generate element from template and attach to the dest if needed.
* The time to attach depends on whether the mode status is node or tree.
*
* @param {object} template
* @param {object} dest
* @param {string} type
*/
function compileNativeComponent (vm, template, dest, type) {
applyNaitveComponentOptions(template);
var element;
if (dest.ref === '_documentElement') {
// if its parent is documentElement then it's a body
console.debug(("[JS Framework] compile to create body for " + type));
element = createBody$1(vm, type);
}
else {
console.debug(("[JS Framework] compile to create element for " + type));
element = createElement$1(vm, type);
}
if (!vm._rootEl) {
vm._rootEl = element;
// bind event earlier because of lifecycle issues
var binding = vm._externalBinding || {};
var target = binding.template;
var parentVm = binding.parent;
if (target && target.events && parentVm && element) {
for (var type$1 in target.events) {
var handler = parentVm[target.events[type$1]];
if (handler) {
element.addEvent(type$1, bind(handler, parentVm));
}
}
}
}
bindElement(vm, element, template);
if (template.attr && template.attr.append) { // backward, append prop in attr
template.append = template.attr.append;
}
if (template.append) { // give the append attribute for ios adaptation
element.attr = element.attr || {};
element.attr.append = template.append;
}
var treeMode = template.append === 'tree';
var app = vm._app || {};
if (app.lastSignal !== -1 && !treeMode) {
console.debug('[JS Framework] compile to append single node for', element);
app.lastSignal = attachTarget(vm, element, dest);
}
if (app.lastSignal !== -1) {
compileChildren(vm, template, element);
}
if (app.lastSignal !== -1 && treeMode) {
console.debug('[JS Framework] compile to append whole tree for', element);
app.lastSignal = attachTarget(vm, element, dest);
}
}
/**
* Set all children to a certain parent element.
*
* @param {object} template
* @param {object} dest
*/
function compileChildren (vm, template, dest) {
var app = vm._app || {};
var children = template.children;
if (children && children.length) {
children.every(function (child) {
compile(vm, child, dest);
return app.lastSignal !== -1
});
}
}
/**
* Watch the list update and refresh the changes.
*
* @param {object} target
* @param {object} fragBlock {vms, data, children}
* @param {object} info {getter, key, value, trackBy, oldStyle}
*/
function bindRepeat (vm, target, fragBlock, info) {
var vms = fragBlock.vms;
var children = fragBlock.children;
var getter = info.getter;
var trackBy = info.trackBy;
var oldStyle = info.oldStyle;
var keyName = info.key;
var valueName = info.value;
function compileItem (item, index, context) {
var mergedData;
if (oldStyle) {
mergedData = item;
if (isObject$4(item)) {
mergedData[keyName] = index;
if (!mergedData.hasOwnProperty('INDEX')) {
Object.defineProperty(mergedData, 'INDEX', {
value: function () {
console.warn('[JS Framework] "INDEX" in repeat is deprecated, ' +
'please use "$index" instead');
}
});
}
}
else {
console.warn('[JS Framework] Each list item must be an object in old-style repeat, '
+ 'please use `repeat={{v in list}}` instead.');
mergedData = {};
mergedData[keyName] = index;
mergedData[valueName] = item;
}
}
else {
mergedData = {};
mergedData[keyName] = index;
mergedData[valueName] = item;
}
var newContext = mergeContext(context, mergedData);
vms.push(newContext);
compile(newContext, target, fragBlock, { repeat: item });
}
var list = watchBlock(vm, fragBlock, getter, 'repeat',
function (data) {
console.debug('[JS Framework] the "repeat" item has changed', data);
if (!fragBlock || !data) {
return
}
var oldChildren = children.slice();
var oldVms = vms.slice();
var oldData = fragBlock.data.slice();
// 1. collect all new refs track by
var trackMap = {};
var reusedMap = {};
data.forEach(function (item, index) {
var key = trackBy ? item[trackBy] : (oldStyle ? item[keyName] : index);
/* istanbul ignore if */
if (key == null || key === '') {
return
}
trackMap[key] = item;
});
// 2. remove unused element foreach old item
var reusedList = [];
oldData.forEach(function (item, index) {
var key = trackBy ? item[trackBy] : (oldStyle ? item[keyName] : index);
if (trackMap.hasOwnProperty(key)) {
reusedMap[key] = {
item: item, index: index, key: key,
target: oldChildren[index],
vm: oldVms[index]
};
reusedList.push(item);
}
else {
removeTarget(vm, oldChildren[index]);
}
});
// 3. create new element foreach new item
children.length = 0;
vms.length = 0;
fragBlock.data = data.slice();
fragBlock.updateMark = fragBlock.start;
data.forEach(function (item, index) {
var key = trackBy ? item[trackBy] : (oldStyle ? item[keyName] : index);
var reused = reusedMap[key];
if (reused) {
if (reused.item === reusedList[0]) {
reusedList.shift();
}
else {
reusedList.$remove(reused.item);
moveTarget(vm, reused.target, fragBlock.updateMark, true);
}
children.push(reused.target);
vms.push(reused.vm);
if (oldStyle) {
reused.vm = item;
}
else {
reused.vm[valueName] = item;
}
reused.vm[keyName] = index;
fragBlock.updateMark = reused.target;
}
else {
compileItem(item, index, vm);
}
});
delete fragBlock.updateMark;
}
);
fragBlock.data = list.slice(0);
list.forEach(function (item, index) {
compileItem(item, index, vm);
});
}
/**
* Watch the display update and add/remove the element.
*
* @param {object} target
* @param {object} fragBlock
* @param {object} context
*/
function bindShown (vm, target, fragBlock, meta) {
var display = watchBlock(vm, fragBlock, target.shown, 'shown',
function (display) {
console.debug('[JS Framework] the "if" item was changed', display);
if (!fragBlock || !!fragBlock.display === !!display) {
return
}
fragBlock.display = !!display;
if (display) {
compile(vm, target, fragBlock, meta);
}
else {
removeTarget(vm, fragBlock, true);
}
}
);
fragBlock.display = !!display;
if (display) {
compile(vm, target, fragBlock, meta);
}
}
/**
* Watch calc value changes and append certain type action to differ.
* It is used for if or repeat data-binding generator.
*
* @param {object} fragBlock
* @param {function} calc
* @param {string} type
* @param {function} handler
* @return {any} init value of calc
*/
function watchBlock (vm, fragBlock, calc, type, handler) {
var differ = vm && vm._app && vm._app.differ;
var config = {};
var depth = (fragBlock.element.depth || 0) + 1;
return watch(vm, calc, function (value) {
config.latestValue = value;
if (differ && !config.recorded) {
differ.append(type, depth, fragBlock.blockId, function () {
var latestValue = config.latestValue;
handler(latestValue);
config.recorded = false;
config.latestValue = undefined;
});
}
config.recorded = true;
})
}
/**
* Clone a context and merge certain data.
*
* @param {object} mergedData
* @return {object}
*/
function mergeContext (context, mergedData) {
var newContext = Object.create(context);
newContext._data = mergedData;
initData(newContext);
initComputed(newContext);
newContext._realParent = context;
if (context._static) {
newContext._static = context._static;
}
return newContext
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Everything about component event which includes event object, event listener,
* event emitter and lifecycle hooks.
*/
/**
* Event object definition. An event object has `type`, `timestamp` and
* `detail` from which a component emit. The event object could be dispatched to
* parents or broadcasted to children except `this.stop()` is called.
* @param {string} type
* @param {any} detail
*/
function Evt (type, detail) {
if (detail instanceof Evt) {
return detail
}
this.timestamp = Date.now();
this.detail = detail;
this.type = type;
var shouldStop = false;
/**
* stop dispatch and broadcast
*/
this.stop = function () {
shouldStop = true;
};
/**
* check if it can't be dispatched or broadcasted
*/
this.hasStopped = function () {
return shouldStop
};
}
/**
* Emit an event but not broadcast down or dispatch up.
* @param {string} type
* @param {any} detail
*/
function $emit (type, detail) {
var this$1 = this;
var events = this._vmEvents;
var handlerList = events[type];
if (handlerList) {
var evt = new Evt(type, detail);
handlerList.forEach(function (handler) {
handler.call(this$1, evt);
});
}
}
/**
* Emit an event and dispatch it up.
* @param {string} type
* @param {any} detail
*/
function $dispatch (type, detail) {
var evt = new Evt(type, detail);
this.$emit(type, evt);
if (!evt.hasStopped() && this._parent && this._parent.$dispatch) {
this._parent.$dispatch(type, evt);
}
}
/**
* Emit an event and broadcast it down.
* @param {string} type
* @param {any} detail
*/
function $broadcast (type, detail) {
var evt = new Evt(type, detail);
this.$emit(type, evt);
if (!evt.hasStopped() && this._childrenVms) {
this._childrenVms.forEach(function (subVm) {
subVm.$broadcast(type, evt);
});
}
}
/**
* Add event listener.
* @param {string} type
* @param {function} handler
*/
function $on (type, handler) {
if (!type || typeof handler !== 'function') {
return
}
var events = this._vmEvents;
var handlerList = events[type] || [];
handlerList.push(handler);
events[type] = handlerList;
// fixed old version lifecycle design
/* istanbul ignore if */
if (type === 'hook:ready' && this._ready) {
this.$emit('hook:ready');
}
}
/**
* Remove event listener.
* @param {string} type
* @param {function} handler
*/
function $off (type, handler) {
if (!type) {
return
}
var events = this._vmEvents;
if (!handler) {
delete events[type];
return
}
var handlerList = events[type];
if (!handlerList) {
return
}
handlerList.$remove(handler);
}
var LIFE_CYCLE_TYPES = ['init', 'created', 'ready', 'destroyed'];
/**
* Init events:
* 1. listen `events` in component options & `externalEvents`.
* 2. bind lifecycle hooks.
* @param {Vm} vm
* @param {object} externalEvents
*/
function initEvents (vm, externalEvents) {
var options = vm._options || {};
var events = options.events || {};
for (var type1 in events) {
vm.$on(type1, events[type1]);
}
for (var type2 in externalEvents) {
vm.$on(type2, externalEvents[type2]);
}
LIFE_CYCLE_TYPES.forEach(function (type) {
vm.$on(("hook:" + type), options[type]);
});
}
/**
* Bind event related methods to ViewModel instance.
* @param {Vm} vm
*/
function mixinEvents (vm) {
vm.$emit = $emit;
vm.$dispatch = $dispatch;
vm.$broadcast = $broadcast;
vm.$on = $on;
vm.$off = $off;
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* ViewModel Constructor & definition
*/
/**
* ViewModel constructor
*
* @param {string} type
* @param {object} options component options
* @param {object} parentVm which contains _app
* @param {object} parentEl root element or frag block
* @param {object} mergedData external data
* @param {object} externalEvents external events
*/
function Vm (
type,
options,
parentVm,
parentEl,
mergedData,
externalEvents
) {
parentVm = parentVm || {};
this._parent = parentVm._realParent ? parentVm._realParent : parentVm;
this._app = parentVm._app || {};
parentVm._childrenVms && parentVm._childrenVms.push(this);
if (!options && this._app.customComponentMap) {
options = this._app.customComponentMap[type];
}
options = options || {};
var data = options.data || {};
this._options = options;
this._methods = options.methods || {};
this._computed = options.computed || {};
this._css = options.style || {};
this._ids = {};
this._vmEvents = {};
this._childrenVms = [];
this._type = type;
// bind events and lifecycles
initEvents(this, externalEvents);
console.debug(("[JS Framework] \"init\" lifecycle in Vm(" + (this._type) + ")"));
this.$emit('hook:init');
this._inited = true;
// proxy data and methods
// observe data and add this to vms
this._data = typeof data === 'function' ? data() : data;
if (mergedData) {
extend(this._data, mergedData);
}
initState(this);
console.debug(("[JS Framework] \"created\" lifecycle in Vm(" + (this._type) + ")"));
this.$emit('hook:created');
this._created = true;
// backward old ready entry
if (options.methods && options.methods.ready) {
console.warn('"exports.methods.ready" is deprecated, ' +
'please use "exports.created" instead');
options.methods.ready.call(this);
}
if (!this._app.doc) {
return
}
// if no parentElement then specify the documentElement
this._parentEl = parentEl || this._app.doc.documentElement;
build(this);
}
mixinEvents(Vm.prototype);
/**
* Watch an function and bind all the data appeared in it. When the related
* data changes, the callback will be called with new value as 1st param.
*
* @param {Function} fn
* @param {Function} callback
*/
Vm.prototype.$watch = function (fn, callback) {
watch(this, fn, callback);
};
Vm.set = set$1;
Vm.delete = del;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var nativeModules = {};
// for testing
/**
* for testing
*/
/**
* for testing
*/
// for framework
/**
* init modules for an app instance
* the second param determines whether to replace an existed method
*/
function initModules (modules, ifReplace) {
var loop = function ( moduleName ) {
// init `modules[moduleName][]`
var methods = nativeModules[moduleName];
if (!methods) {
methods = {};
nativeModules[moduleName] = methods;
}
// push each non-existed new method
modules[moduleName].forEach(function (method) {
if (typeof method === 'string') {
method = {
name: method
};
}
if (!methods[method.name] || ifReplace) {
methods[method.name] = method;
}
});
};
for (var moduleName in modules) loop( moduleName );
}
/**
* init app methods
*/
function initMethods$1 (Vm, apis) {
var p = Vm.prototype;
for (var apiName in apis) {
if (!p.hasOwnProperty(apiName)) {
p[apiName] = apis[apiName];
}
}
}
/**
* get a module of methods for an app instance
*/
function requireModule (app, name) {
var methods = nativeModules[name];
var target = {};
var loop = function ( methodName ) {
Object.defineProperty(target, methodName, {
configurable: true,
enumerable: true,
get: function moduleGetter () {
return function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return app.callTasks({
module: name,
method: methodName,
args: args
});
}
},
set: function moduleSetter (value) {
if (typeof value === 'function') {
return app.callTasks({
module: name,
method: methodName,
args: [value]
})
}
}
});
};
for (var methodName in methods) loop( methodName );
return target
}
/**
* get a custom component options
*/
function requireCustomComponent (app, name) {
var customComponentMap = app.customComponentMap;
return customComponentMap[name]
}
/**
* register a custom component options
*/
function registerCustomComponent (app, name, def) {
var customComponentMap = app.customComponentMap;
if (customComponentMap[name]) {
console.error(("[JS Framework] define a component(" + name + ") that already exists"));
return
}
customComponentMap[name] = def;
}
var semver = createCommonjsModule(function (module, exports) {
exports = module.exports = SemVer;
// The debug function is excluded entirely from the minified version.
/* nomin */ var debug;
/* nomin */ if (typeof process === 'object' &&
/* nomin */ process.env &&
/* nomin */ false &&
/* nomin */ /\bsemver\b/i.test(false))
/* nomin */ { debug = function() {
/* nomin */ var args = Array.prototype.slice.call(arguments, 0);
/* nomin */ args.unshift('SEMVER');
/* nomin */ console.log.apply(console, args);
/* nomin */ }; }
/* nomin */ else
/* nomin */ { debug = function() {}; }
// Note: this is the semver.org version of the spec that it implements
// Not necessarily the package version of this code.
exports.SEMVER_SPEC_VERSION = '2.0.0';
var MAX_LENGTH = 256;
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
// The actual regexps go on exports.re
var re = exports.re = [];
var src = exports.src = [];
var R = 0;
// The following Regular Expressions can be used for tokenizing,
// validating, and parsing SemVer version strings.
// ## Numeric Identifier
// A single `0`, or a non-zero digit followed by zero or more digits.
var NUMERICIDENTIFIER = R++;
src[NUMERICIDENTIFIER] = '0|[1-9]\\d*';
var NUMERICIDENTIFIERLOOSE = R++;
src[NUMERICIDENTIFIERLOOSE] = '[0-9]+';
// ## Non-numeric Identifier
// Zero or more digits, followed by a letter or hyphen, and then zero or
// more letters, digits, or hyphens.
var NONNUMERICIDENTIFIER = R++;
src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*';
// ## Main Version
// Three dot-separated numeric identifiers.
var MAINVERSION = R++;
src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
'(' + src[NUMERICIDENTIFIER] + ')\\.' +
'(' + src[NUMERICIDENTIFIER] + ')';
var MAINVERSIONLOOSE = R++;
src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
'(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
'(' + src[NUMERICIDENTIFIERLOOSE] + ')';
// ## Pre-release Version Identifier
// A numeric identifier, or a non-numeric identifier.
var PRERELEASEIDENTIFIER = R++;
src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
'|' + src[NONNUMERICIDENTIFIER] + ')';
var PRERELEASEIDENTIFIERLOOSE = R++;
src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
'|' + src[NONNUMERICIDENTIFIER] + ')';
// ## Pre-release Version
// Hyphen, followed by one or more dot-separated pre-release version
// identifiers.
var PRERELEASE = R++;
src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
'(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))';
var PRERELEASELOOSE = R++;
src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
'(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';
// ## Build Metadata Identifier
// Any combination of digits, letters, or hyphens.
var BUILDIDENTIFIER = R++;
src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';
// ## Build Metadata
// Plus sign, followed by one or more period-separated build metadata
// identifiers.
var BUILD = R++;
src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
'(?:\\.' + src[BUILDIDENTIFIER] + ')*))';
// ## Full Version String
// A main version, followed optionally by a pre-release version and
// build metadata.
// Note that the only major, minor, patch, and pre-release sections of
// the version string are capturing groups. The build metadata is not a
// capturing group, because it should not ever be used in version
// comparison.
var FULL = R++;
var FULLPLAIN = 'v?' + src[MAINVERSION] +
src[PRERELEASE] + '?' +
src[BUILD] + '?';
src[FULL] = '^' + FULLPLAIN + '$';
// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
// common in the npm registry.
var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
src[PRERELEASELOOSE] + '?' +
src[BUILD] + '?';
var LOOSE = R++;
src[LOOSE] = '^' + LOOSEPLAIN + '$';
var GTLT = R++;
src[GTLT] = '((?:<|>)?=?)';
// Something like "2.*" or "1.2.x".
// Note that "x.x" is a valid xRange identifer, meaning "any version"
// Only the first item is strictly required.
var XRANGEIDENTIFIERLOOSE = R++;
src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
var XRANGEIDENTIFIER = R++;
src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*';
var XRANGEPLAIN = R++;
src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
'(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
'(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
'(?:' + src[PRERELEASE] + ')?' +
src[BUILD] + '?' +
')?)?';
var XRANGEPLAINLOOSE = R++;
src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
'(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
'(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
'(?:' + src[PRERELEASELOOSE] + ')?' +
src[BUILD] + '?' +
')?)?';
var XRANGE = R++;
src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
var XRANGELOOSE = R++;
src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$';
// Tilde ranges.
// Meaning is "reasonably at or greater than"
var LONETILDE = R++;
src[LONETILDE] = '(?:~>?)';
var TILDETRIM = R++;
src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
var tildeTrimReplace = '$1~';
var TILDE = R++;
src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
var TILDELOOSE = R++;
src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
// Caret ranges.
// Meaning is "at least and backwards compatible with"
var LONECARET = R++;
src[LONECARET] = '(?:\\^)';
var CARETTRIM = R++;
src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
var caretTrimReplace = '$1^';
var CARET = R++;
src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
var CARETLOOSE = R++;
src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
// A simple gt/lt/eq thing, or just "" to indicate "any version"
var COMPARATORLOOSE = R++;
src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$';
var COMPARATOR = R++;
src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$';
// An expression to strip any whitespace between the gtlt and the thing
// it modifies, so that `> 1.2.3` ==> `>1.2.3`
var COMPARATORTRIM = R++;
src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
'\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';
// this one has to use the /g flag
re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');
var comparatorTrimReplace = '$1$2$3';
// Something like `1.2.3 - 1.2.4`
// Note that these all use the loose form, because they'll be
// checked against either the strict or loose comparator form
// later.
var HYPHENRANGE = R++;
src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
'\\s+-\\s+' +
'(' + src[XRANGEPLAIN] + ')' +
'\\s*$';
var HYPHENRANGELOOSE = R++;
src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
'\\s+-\\s+' +
'(' + src[XRANGEPLAINLOOSE] + ')' +
'\\s*$';
// Star ranges basically just allow anything at all.
var STAR = R++;
src[STAR] = '(<|>)?=?\\s*\\*';
// Compile to actual regexp objects.
// All are flag-free, unless they were created above with a flag.
for (var i = 0; i < R; i++) {
debug(i, src[i]);
if (!re[i])
{ re[i] = new RegExp(src[i]); }
}
exports.parse = parse;
function parse(version, loose) {
if (version instanceof SemVer)
{ return version; }
if (typeof version !== 'string')
{ return null; }
if (version.length > MAX_LENGTH)
{ return null; }
var r = loose ? re[LOOSE] : re[FULL];
if (!r.test(version))
{ return null; }
try {
return new SemVer(version, loose);
} catch (er) {
return null;
}
}
exports.valid = valid;
function valid(version, loose) {
var v = parse(version, loose);
return v ? v.version : null;
}
exports.clean = clean;
function clean(version, loose) {
var s = parse(version.trim().replace(/^[=v]+/, ''), loose);
return s ? s.version : null;
}
exports.SemVer = SemVer;
function SemVer(version, loose) {
if (version instanceof SemVer) {
if (version.loose === loose)
{ return version; }
else
{ version = version.version; }
} else if (typeof version !== 'string') {
throw new TypeError('Invalid Version: ' + version);
}
if (version.length > MAX_LENGTH)
{ throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') }
if (!(this instanceof SemVer))
{ return new SemVer(version, loose); }
debug('SemVer', version, loose);
this.loose = loose;
var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);
if (!m)
{ throw new TypeError('Invalid Version: ' + version); }
this.raw = version;
// these are actually numbers
this.major = +m[1];
this.minor = +m[2];
this.patch = +m[3];
if (this.major > MAX_SAFE_INTEGER || this.major < 0)
{ throw new TypeError('Invalid major version') }
if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)
{ throw new TypeError('Invalid minor version') }
if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)
{ throw new TypeError('Invalid patch version') }
// numberify any prerelease numeric ids
if (!m[4])
{ this.prerelease = []; }
else
{ this.prerelease = m[4].split('.').map(function(id) {
if (/^[0-9]+$/.test(id)) {
var num = +id;
if (num >= 0 && num < MAX_SAFE_INTEGER)
{ return num; }
}
return id;
}); }
this.build = m[5] ? m[5].split('.') : [];
this.format();
}
SemVer.prototype.format = function() {
this.version = this.major + '.' + this.minor + '.' + this.patch;
if (this.prerelease.length)
{ this.version += '-' + this.prerelease.join('.'); }
return this.version;
};
SemVer.prototype.toString = function() {
return this.version;
};
SemVer.prototype.compare = function(other) {
debug('SemVer.compare', this.version, this.loose, other);
if (!(other instanceof SemVer))
{ other = new SemVer(other, this.loose); }
return this.compareMain(other) || this.comparePre(other);
};
SemVer.prototype.compareMain = function(other) {
if (!(other instanceof SemVer))
{ other = new SemVer(other, this.loose); }
return compareIdentifiers(this.major, other.major) ||
compareIdentifiers(this.minor, other.minor) ||
compareIdentifiers(this.patch, other.patch);
};
SemVer.prototype.comparePre = function(other) {
var this$1 = this;
if (!(other instanceof SemVer))
{ other = new SemVer(other, this.loose); }
// NOT having a prerelease is > having one
if (this.prerelease.length && !other.prerelease.length)
{ return -1; }
else if (!this.prerelease.length && other.prerelease.length)
{ return 1; }
else if (!this.prerelease.length && !other.prerelease.length)
{ return 0; }
var i = 0;
do {
var a = this$1.prerelease[i];
var b = other.prerelease[i];
debug('prerelease compare', i, a, b);
if (a === undefined && b === undefined)
{ return 0; }
else if (b === undefined)
{ return 1; }
else if (a === undefined)
{ return -1; }
else if (a === b)
{ continue; }
else
{ return compareIdentifiers(a, b); }
} while (++i);
};
// preminor will bump the version up to the next minor release, and immediately
// down to pre-release. premajor and prepatch work the same way.
SemVer.prototype.inc = function(release, identifier) {
var this$1 = this;
switch (release) {
case 'premajor':
this.prerelease.length = 0;
this.patch = 0;
this.minor = 0;
this.major++;
this.inc('pre', identifier);
break;
case 'preminor':
this.prerelease.length = 0;
this.patch = 0;
this.minor++;
this.inc('pre', identifier);
break;
case 'prepatch':
// If this is already a prerelease, it will bump to the next version
// drop any prereleases that might already exist, since they are not
// relevant at this point.
this.prerelease.length = 0;
this.inc('patch', identifier);
this.inc('pre', identifier);
break;
// If the input is a non-prerelease version, this acts the same as
// prepatch.
case 'prerelease':
if (this.prerelease.length === 0)
{ this.inc('patch', identifier); }
this.inc('pre', identifier);
break;
case 'major':
// If this is a pre-major version, bump up to the same major version.
// Otherwise increment major.
// 1.0.0-5 bumps to 1.0.0
// 1.1.0 bumps to 2.0.0
if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)
{ this.major++; }
this.minor = 0;
this.patch = 0;
this.prerelease = [];
break;
case 'minor':
// If this is a pre-minor version, bump up to the same minor version.
// Otherwise increment minor.
// 1.2.0-5 bumps to 1.2.0
// 1.2.1 bumps to 1.3.0
if (this.patch !== 0 || this.prerelease.length === 0)
{ this.minor++; }
this.patch = 0;
this.prerelease = [];
break;
case 'patch':
// If this is not a pre-release version, it will increment the patch.
// If it is a pre-release it will bump up to the same patch version.
// 1.2.0-5 patches to 1.2.0
// 1.2.0 patches to 1.2.1
if (this.prerelease.length === 0)
{ this.patch++; }
this.prerelease = [];
break;
// This probably shouldn't be used publicly.
// 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
case 'pre':
if (this.prerelease.length === 0)
{ this.prerelease = [0]; }
else {
var i = this.prerelease.length;
while (--i >= 0) {
if (typeof this$1.prerelease[i] === 'number') {
this$1.prerelease[i]++;
i = -2;
}
}
if (i === -1) // didn't increment anything
{ this.prerelease.push(0); }
}
if (identifier) {
// 1.2.0-beta.1 bumps to 1.2.0-beta.2,
// 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
if (this.prerelease[0] === identifier) {
if (isNaN(this.prerelease[1]))
{ this.prerelease = [identifier, 0]; }
} else
{ this.prerelease = [identifier, 0]; }
}
break;
default:
throw new Error('invalid increment argument: ' + release);
}
this.format();
this.raw = this.version;
return this;
};
exports.inc = inc;
function inc(version, release, loose, identifier) {
if (typeof(loose) === 'string') {
identifier = loose;
loose = undefined;
}
try {
return new SemVer(version, loose).inc(release, identifier).version;
} catch (er) {
return null;
}
}
exports.diff = diff;
function diff(version1, version2) {
if (eq(version1, version2)) {
return null;
} else {
var v1 = parse(version1);
var v2 = parse(version2);
if (v1.prerelease.length || v2.prerelease.length) {
for (var key in v1) {
if (key === 'major' || key === 'minor' || key === 'patch') {
if (v1[key] !== v2[key]) {
return 'pre'+key;
}
}
}
return 'prerelease';
}
for (var key in v1) {
if (key === 'major' || key === 'minor' || key === 'patch') {
if (v1[key] !== v2[key]) {
return key;
}
}
}
}
}
exports.compareIdentifiers = compareIdentifiers;
var numeric = /^[0-9]+$/;
function compareIdentifiers(a, b) {
var anum = numeric.test(a);
var bnum = numeric.test(b);
if (anum && bnum) {
a = +a;
b = +b;
}
return (anum && !bnum) ? -1 :
(bnum && !anum) ? 1 :
a < b ? -1 :
a > b ? 1 :
0;
}
exports.rcompareIdentifiers = rcompareIdentifiers;
function rcompareIdentifiers(a, b) {
return compareIdentifiers(b, a);
}
exports.major = major;
function major(a, loose) {
return new SemVer(a, loose).major;
}
exports.minor = minor;
function minor(a, loose) {
return new SemVer(a, loose).minor;
}
exports.patch = patch;
function patch(a, loose) {
return new SemVer(a, loose).patch;
}
exports.compare = compare;
function compare(a, b, loose) {
return new SemVer(a, loose).compare(new SemVer(b, loose));
}
exports.compareLoose = compareLoose;
function compareLoose(a, b) {
return compare(a, b, true);
}
exports.rcompare = rcompare;
function rcompare(a, b, loose) {
return compare(b, a, loose);
}
exports.sort = sort;
function sort(list, loose) {
return list.sort(function(a, b) {
return exports.compare(a, b, loose);
});
}
exports.rsort = rsort;
function rsort(list, loose) {
return list.sort(function(a, b) {
return exports.rcompare(a, b, loose);
});
}
exports.gt = gt;
function gt(a, b, loose) {
return compare(a, b, loose) > 0;
}
exports.lt = lt;
function lt(a, b, loose) {
return compare(a, b, loose) < 0;
}
exports.eq = eq;
function eq(a, b, loose) {
return compare(a, b, loose) === 0;
}
exports.neq = neq;
function neq(a, b, loose) {
return compare(a, b, loose) !== 0;
}
exports.gte = gte;
function gte(a, b, loose) {
return compare(a, b, loose) >= 0;
}
exports.lte = lte;
function lte(a, b, loose) {
return compare(a, b, loose) <= 0;
}
exports.cmp = cmp;
function cmp(a, op, b, loose) {
var ret;
switch (op) {
case '===':
if (typeof a === 'object') { a = a.version; }
if (typeof b === 'object') { b = b.version; }
ret = a === b;
break;
case '!==':
if (typeof a === 'object') { a = a.version; }
if (typeof b === 'object') { b = b.version; }
ret = a !== b;
break;
case '': case '=': case '==': ret = eq(a, b, loose); break;
case '!=': ret = neq(a, b, loose); break;
case '>': ret = gt(a, b, loose); break;
case '>=': ret = gte(a, b, loose); break;
case '<': ret = lt(a, b, loose); break;
case '<=': ret = lte(a, b, loose); break;
default: throw new TypeError('Invalid operator: ' + op);
}
return ret;
}
exports.Comparator = Comparator;
function Comparator(comp, loose) {
if (comp instanceof Comparator) {
if (comp.loose === loose)
{ return comp; }
else
{ comp = comp.value; }
}
if (!(this instanceof Comparator))
{ return new Comparator(comp, loose); }
debug('comparator', comp, loose);
this.loose = loose;
this.parse(comp);
if (this.semver === ANY)
{ this.value = ''; }
else
{ this.value = this.operator + this.semver.version; }
debug('comp', this);
}
var ANY = {};
Comparator.prototype.parse = function(comp) {
var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
var m = comp.match(r);
if (!m)
{ throw new TypeError('Invalid comparator: ' + comp); }
this.operator = m[1];
if (this.operator === '=')
{ this.operator = ''; }
// if it literally is just '>' or '' then allow anything.
if (!m[2])
{ this.semver = ANY; }
else
{ this.semver = new SemVer(m[2], this.loose); }
};
Comparator.prototype.toString = function() {
return this.value;
};
Comparator.prototype.test = function(version) {
debug('Comparator.test', version, this.loose);
if (this.semver === ANY)
{ return true; }
if (typeof version === 'string')
{ version = new SemVer(version, this.loose); }
return cmp(version, this.operator, this.semver, this.loose);
};
Comparator.prototype.intersects = function(comp, loose) {
if (!(comp instanceof Comparator)) {
throw new TypeError('a Comparator is required');
}
var rangeTmp;
if (this.operator === '') {
rangeTmp = new Range(comp.value, loose);
return satisfies(this.value, rangeTmp, loose);
} else if (comp.operator === '') {
rangeTmp = new Range(this.value, loose);
return satisfies(comp.semver, rangeTmp, loose);
}
var sameDirectionIncreasing =
(this.operator === '>=' || this.operator === '>') &&
(comp.operator === '>=' || comp.operator === '>');
var sameDirectionDecreasing =
(this.operator === '<=' || this.operator === '<') &&
(comp.operator === '<=' || comp.operator === '<');
var sameSemVer = this.semver.version === comp.semver.version;
var differentDirectionsInclusive =
(this.operator === '>=' || this.operator === '<=') &&
(comp.operator === '>=' || comp.operator === '<=');
var oppositeDirectionsLessThan =
cmp(this.semver, '<', comp.semver, loose) &&
((this.operator === '>=' || this.operator === '>') &&
(comp.operator === '<=' || comp.operator === '<'));
var oppositeDirectionsGreaterThan =
cmp(this.semver, '>', comp.semver, loose) &&
((this.operator === '<=' || this.operator === '<') &&
(comp.operator === '>=' || comp.operator === '>'));
return sameDirectionIncreasing || sameDirectionDecreasing ||
(sameSemVer && differentDirectionsInclusive) ||
oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;
};
exports.Range = Range;
function Range(range, loose) {
if (range instanceof Range) {
if (range.loose === loose) {
return range;
} else {
return new Range(range.raw, loose);
}
}
if (range instanceof Comparator) {
return new Range(range.value, loose);
}
if (!(this instanceof Range))
{ return new Range(range, loose); }
this.loose = loose;
// First, split based on boolean or ||
this.raw = range;
this.set = range.split(/\s*\|\|\s*/).map(function(range) {
return this.parseRange(range.trim());
}, this).filter(function(c) {
// throw out any that are not relevant for whatever reason
return c.length;
});
if (!this.set.length) {
throw new TypeError('Invalid SemVer Range: ' + range);
}
this.format();
}
Range.prototype.format = function() {
this.range = this.set.map(function(comps) {
return comps.join(' ').trim();
}).join('||').trim();
return this.range;
};
Range.prototype.toString = function() {
return this.range;
};
Range.prototype.parseRange = function(range) {
var loose = this.loose;
range = range.trim();
debug('range', range, loose);
// `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
range = range.replace(hr, hyphenReplace);
debug('hyphen replace', range);
// `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
debug('comparator trim', range, re[COMPARATORTRIM]);
// `~ 1.2.3` => `~1.2.3`
range = range.replace(re[TILDETRIM], tildeTrimReplace);
// `^ 1.2.3` => `^1.2.3`
range = range.replace(re[CARETTRIM], caretTrimReplace);
// normalize spaces
range = range.split(/\s+/).join(' ');
// At this point, the range is completely trimmed and
// ready to be split into comparators.
var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
var set = range.split(' ').map(function(comp) {
return parseComparator(comp, loose);
}).join(' ').split(/\s+/);
if (this.loose) {
// in loose mode, throw out any that are not valid comparators
set = set.filter(function(comp) {
return !!comp.match(compRe);
});
}
set = set.map(function(comp) {
return new Comparator(comp, loose);
});
return set;
};
Range.prototype.intersects = function(range, loose) {
if (!(range instanceof Range)) {
throw new TypeError('a Range is required');
}
return this.set.some(function(thisComparators) {
return thisComparators.every(function(thisComparator) {
return range.set.some(function(rangeComparators) {
return rangeComparators.every(function(rangeComparator) {
return thisComparator.intersects(rangeComparator, loose);
});
});
});
});
};
// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators;
function toComparators(range, loose) {
return new Range(range, loose).set.map(function(comp) {
return comp.map(function(c) {
return c.value;
}).join(' ').trim().split(' ');
});
}
// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
function parseComparator(comp, loose) {
debug('comp', comp);
comp = replaceCarets(comp, loose);
debug('caret', comp);
comp = replaceTildes(comp, loose);
debug('tildes', comp);
comp = replaceXRanges(comp, loose);
debug('xrange', comp);
comp = replaceStars(comp, loose);
debug('stars', comp);
return comp;
}
function isX(id) {
return !id || id.toLowerCase() === 'x' || id === '*';
}
// ~, ~> --> * (any, kinda silly)
// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
function replaceTildes(comp, loose) {
return comp.trim().split(/\s+/).map(function(comp) {
return replaceTilde(comp, loose);
}).join(' ');
}
function replaceTilde(comp, loose) {
var r = loose ? re[TILDELOOSE] : re[TILDE];
return comp.replace(r, function(_, M, m, p, pr) {
debug('tilde', comp, _, M, m, p, pr);
var ret;
if (isX(M))
{ ret = ''; }
else if (isX(m))
{ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; }
else if (isX(p))
// ~1.2 == >=1.2.0 <1.3.0
{ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; }
else if (pr) {
debug('replaceTilde pr', pr);
if (pr.charAt(0) !== '-')
{ pr = '-' + pr; }
ret = '>=' + M + '.' + m + '.' + p + pr +
' <' + M + '.' + (+m + 1) + '.0';
} else
// ~1.2.3 == >=1.2.3 <1.3.0
{ ret = '>=' + M + '.' + m + '.' + p +
' <' + M + '.' + (+m + 1) + '.0'; }
debug('tilde return', ret);
return ret;
});
}
// ^ --> * (any, kinda silly)
// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
// ^1.2.3 --> >=1.2.3 <2.0.0
// ^1.2.0 --> >=1.2.0 <2.0.0
function replaceCarets(comp, loose) {
return comp.trim().split(/\s+/).map(function(comp) {
return replaceCaret(comp, loose);
}).join(' ');
}
function replaceCaret(comp, loose) {
debug('caret', comp, loose);
var r = loose ? re[CARETLOOSE] : re[CARET];
return comp.replace(r, function(_, M, m, p, pr) {
debug('caret', comp, _, M, m, p, pr);
var ret;
if (isX(M))
{ ret = ''; }
else if (isX(m))
{ ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; }
else if (isX(p)) {
if (M === '0')
{ ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; }
else
{ ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; }
} else if (pr) {
debug('replaceCaret pr', pr);
if (pr.charAt(0) !== '-')
{ pr = '-' + pr; }
if (M === '0') {
if (m === '0')
{ ret = '>=' + M + '.' + m + '.' + p + pr +
' <' + M + '.' + m + '.' + (+p + 1); }
else
{ ret = '>=' + M + '.' + m + '.' + p + pr +
' <' + M + '.' + (+m + 1) + '.0'; }
} else
{ ret = '>=' + M + '.' + m + '.' + p + pr +
' <' + (+M + 1) + '.0.0'; }
} else {
debug('no pr');
if (M === '0') {
if (m === '0')
{ ret = '>=' + M + '.' + m + '.' + p +
' <' + M + '.' + m + '.' + (+p + 1); }
else
{ ret = '>=' + M + '.' + m + '.' + p +
' <' + M + '.' + (+m + 1) + '.0'; }
} else
{ ret = '>=' + M + '.' + m + '.' + p +
' <' + (+M + 1) + '.0.0'; }
}
debug('caret return', ret);
return ret;
});
}
function replaceXRanges(comp, loose) {
debug('replaceXRanges', comp, loose);
return comp.split(/\s+/).map(function(comp) {
return replaceXRange(comp, loose);
}).join(' ');
}
function replaceXRange(comp, loose) {
comp = comp.trim();
var r = loose ? re[XRANGELOOSE] : re[XRANGE];
return comp.replace(r, function(ret, gtlt, M, m, p, pr) {
debug('xRange', comp, ret, gtlt, M, m, p, pr);
var xM = isX(M);
var xm = xM || isX(m);
var xp = xm || isX(p);
var anyX = xp;
if (gtlt === '=' && anyX)
{ gtlt = ''; }
if (xM) {
if (gtlt === '>' || gtlt === '<') {
// nothing is allowed
ret = '<0.0.0';
} else {
// nothing is forbidden
ret = '*';
}
} else if (gtlt && anyX) {
// replace X with 0
if (xm)
{ m = 0; }
if (xp)
{ p = 0; }
if (gtlt === '>') {
// >1 => >=2.0.0
// >1.2 => >=1.3.0
// >1.2.3 => >= 1.2.4
gtlt = '>=';
if (xm) {
M = +M + 1;
m = 0;
p = 0;
} else if (xp) {
m = +m + 1;
p = 0;
}
} else if (gtlt === '<=') {
// <=0.7.x is actually <0.8.0, since any 0.7.x should
// pass. Similarly, <=7.x is actually <8.0.0, etc.
gtlt = '<';
if (xm)
{ M = +M + 1; }
else
{ m = +m + 1; }
}
ret = gtlt + M + '.' + m + '.' + p;
} else if (xm) {
ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
} else if (xp) {
ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
}
debug('xRange return', ret);
return ret;
});
}
// Because * is AND-ed with everything else in the comparator,
// and '' means "any version", just remove the *s entirely.
function replaceStars(comp, loose) {
debug('replaceStars', comp, loose);
// Looseness is ignored here. star is always as loose as it gets!
return comp.trim().replace(re[STAR], '');
}
// This function is passed to string.replace(re[HYPHENRANGE])
// M, m, patch, prerelease, build
// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
// 1.2 - 3.4 => >=1.2.0 <3.5.0
function hyphenReplace($0,
from, fM, fm, fp, fpr, fb,
to, tM, tm, tp, tpr, tb) {
if (isX(fM))
{ from = ''; }
else if (isX(fm))
{ from = '>=' + fM + '.0.0'; }
else if (isX(fp))
{ from = '>=' + fM + '.' + fm + '.0'; }
else
{ from = '>=' + from; }
if (isX(tM))
{ to = ''; }
else if (isX(tm))
{ to = '<' + (+tM + 1) + '.0.0'; }
else if (isX(tp))
{ to = '<' + tM + '.' + (+tm + 1) + '.0'; }
else if (tpr)
{ to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; }
else
{ to = '<=' + to; }
return (from + ' ' + to).trim();
}
// if ANY of the sets match ALL of its comparators, then pass
Range.prototype.test = function(version) {
var this$1 = this;
if (!version)
{ return false; }
if (typeof version === 'string')
{ version = new SemVer(version, this.loose); }
for (var i = 0; i < this.set.length; i++) {
if (testSet(this$1.set[i], version))
{ return true; }
}
return false;
};
function testSet(set, version) {
for (var i = 0; i < set.length; i++) {
if (!set[i].test(version))
{ return false; }
}
if (version.prerelease.length) {
// Find the set of versions that are allowed to have prereleases
// For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
// That should allow `1.2.3-pr.2` to pass.
// However, `1.2.4-alpha.notready` should NOT be allowed,
// even though it's within the range set by the comparators.
for (var i = 0; i < set.length; i++) {
debug(set[i].semver);
if (set[i].semver === ANY)
{ continue; }
if (set[i].semver.prerelease.length > 0) {
var allowed = set[i].semver;
if (allowed.major === version.major &&
allowed.minor === version.minor &&
allowed.patch === version.patch)
{ return true; }
}
}
// Version has a -pre, but it's not one of the ones we like.
return false;
}
return true;
}
exports.satisfies = satisfies;
function satisfies(version, range, loose) {
try {
range = new Range(range, loose);
} catch (er) {
return false;
}
return range.test(version);
}
exports.maxSatisfying = maxSatisfying;
function maxSatisfying(versions, range, loose) {
var max = null;
var maxSV = null;
try {
var rangeObj = new Range(range, loose);
} catch (er) {
return null;
}
versions.forEach(function (v) {
if (rangeObj.test(v)) { // satisfies(v, range, loose)
if (!max || maxSV.compare(v) === -1) { // compare(max, v, true)
max = v;
maxSV = new SemVer(max, loose);
}
}
});
return max;
}
exports.minSatisfying = minSatisfying;
function minSatisfying(versions, range, loose) {
var min = null;
var minSV = null;
try {
var rangeObj = new Range(range, loose);
} catch (er) {
return null;
}
versions.forEach(function (v) {
if (rangeObj.test(v)) { // satisfies(v, range, loose)
if (!min || minSV.compare(v) === 1) { // compare(min, v, true)
min = v;
minSV = new SemVer(min, loose);
}
}
});
return min;
}
exports.validRange = validRange;
function validRange(range, loose) {
try {
// Return '*' instead of '' so that truthiness works.
// This will throw if it's invalid anyway
return new Range(range, loose).range || '*';
} catch (er) {
return null;
}
}
// Determine if version is less than all the versions possible in the range
exports.ltr = ltr;
function ltr(version, range, loose) {
return outside(version, range, '<', loose);
}
// Determine if version is greater than all the versions possible in the range.
exports.gtr = gtr;
function gtr(version, range, loose) {
return outside(version, range, '>', loose);
}
exports.outside = outside;
function outside(version, range, hilo, loose) {
version = new SemVer(version, loose);
range = new Range(range, loose);
var gtfn, ltefn, ltfn, comp, ecomp;
switch (hilo) {
case '>':
gtfn = gt;
ltefn = lte;
ltfn = lt;
comp = '>';
ecomp = '>=';
break;
case '<':
gtfn = lt;
ltefn = gte;
ltfn = gt;
comp = '<';
ecomp = '<=';
break;
default:
throw new TypeError('Must provide a hilo val of "<" or ">"');
}
// If it satisifes the range it is not outside
if (satisfies(version, range, loose)) {
return false;
}
// From now on, variable terms are as if we're in "gtr" mode.
// but note that everything is flipped for the "ltr" function.
for (var i = 0; i < range.set.length; ++i) {
var comparators = range.set[i];
var high = null;
var low = null;
comparators.forEach(function(comparator) {
if (comparator.semver === ANY) {
comparator = new Comparator('>=0.0.0');
}
high = high || comparator;
low = low || comparator;
if (gtfn(comparator.semver, high.semver, loose)) {
high = comparator;
} else if (ltfn(comparator.semver, low.semver, loose)) {
low = comparator;
}
});
// If the edge version comparator has a operator then our version
// isn't outside it
if (high.operator === comp || high.operator === ecomp) {
return false;
}
// If the lowest version comparator has an operator and our version
// is less than it then it isn't higher than the range
if ((!low.operator || low.operator === comp) &&
ltefn(version, low.semver)) {
return false;
} else if (low.operator === ecomp && ltfn(version, low.semver)) {
return false;
}
}
return true;
}
exports.prerelease = prerelease;
function prerelease(version, loose) {
var parsed = parse(version, loose);
return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;
}
exports.intersects = intersects;
function intersects(r1, r2, loose) {
r1 = new Range(r1, loose);
r2 = new Range(r2, loose);
return r1.intersects(r2)
}
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Normalize a version string.
* @param {String} Version. ie: 1, 1.0, 1.0.0
* @return {String} Version
*/
function normalizeVersion (v) {
var isValid = semver.valid(v);
if (isValid) {
return v
}
v = typeof (v) === 'string' ? v : '';
var split = v.split('.');
var i = 0;
var result = [];
while (i < 3) {
var s = typeof (split[i]) === 'string' && split[i] ? split[i] : '0';
result.push(s);
i++;
}
return result.join('.')
}
/**
* Get informations from different error key. Like:
* - code
* - errorMessage
* - errorType
* - isDowngrade
* @param {string} key
* @param {string} val
* @param {string} criteria
* @return {object}
*/
function getError (key, val, criteria) {
var result = {
isDowngrade: true,
errorType: 1,
code: 1000
};
var getMsg = function (key, val, criteria) {
return 'Downgrade[' + key + '] :: deviceInfo '
+ val + ' matched criteria ' + criteria
};
var _key = key.toLowerCase();
result.errorMessage = getMsg(key, val, criteria);
if (_key.indexOf('osversion') >= 0) {
result.code = 1001;
}
else if (_key.indexOf('appversion') >= 0) {
result.code = 1002;
}
else if (_key.indexOf('weexversion') >= 0) {
result.code = 1003;
}
else if (_key.indexOf('devicemodel') >= 0) {
result.code = 1004;
}
return result
}
/**
* WEEX framework input(deviceInfo)
* {
* platform: 'iOS' or 'android'
* osVersion: '1.0.0' or '1.0' or '1'
* appVersion: '1.0.0' or '1.0' or '1'
* weexVersion: '1.0.0' or '1.0' or '1'
* dDeviceModel: 'MODEL_NAME'
* }
*
* downgrade config(config)
* {
* ios: {
* osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* deviceModel: ['modelA', 'modelB', ...]
* },
* android: {
* osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* deviceModel: ['modelA', 'modelB', ...]
* }
* }
*
*
* @param {object} deviceInfo Weex SDK framework input
* @param {object} config user input
* @return {Object} { isDowngrade: true/false, errorMessage... }
*/
function check (config, deviceInfo) {
deviceInfo = deviceInfo || global.WXEnvironment;
deviceInfo = isPlainObject(deviceInfo) ? deviceInfo : {};
var result = {
isDowngrade: false // defautl is pass
};
if (typof$1(config) === 'function') {
var customDowngrade = config.call(this, deviceInfo, {
semver: semver,
normalizeVersion: normalizeVersion
});
customDowngrade = !!customDowngrade;
result = customDowngrade ? getError('custom', '', 'custom params') : result;
}
else {
config = isPlainObject(config) ? config : {};
var platform = deviceInfo.platform || 'unknow';
var dPlatform = platform.toLowerCase();
var cObj = config[dPlatform] || {};
for (var i in deviceInfo) {
var key = i;
var keyLower = key.toLowerCase();
var val = deviceInfo[i];
var isVersion = keyLower.indexOf('version') >= 0;
var isDeviceModel = keyLower.indexOf('devicemodel') >= 0;
var criteria = cObj[i];
if (criteria && isVersion) {
var c = normalizeVersion(criteria);
var d = normalizeVersion(deviceInfo[i]);
if (semver.satisfies(d, c)) {
result = getError(key, val, criteria);
break
}
}
else if (isDeviceModel) {
var _criteria = typof$1(criteria) === 'array' ? criteria : [criteria];
if (_criteria.indexOf(val) >= 0) {
result = getError(key, val, criteria);
break
}
}
}
}
return result
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function setViewport (app, configs) {
if ( configs === void 0 ) configs = {};
/* istanbul ignore if */
{
console.debug(("[JS Framework] Set viewport (width: " + (configs.width) + ") for app#" + (app.id) + "."));
validateViewport(configs);
}
// Send viewport configs to native
if (app && app.callTasks) {
return app.callTasks([{
module: 'meta',
method: 'setViewport',
args: [configs]
}])
}
/* istanbul ignore next */
else {
console.warn("[JS Framework] Can't find \"callTasks\" method on current app.");
}
}
/**
* Validate the viewport config.
* @param {Object} configs
*/
function validateViewport (configs) {
if ( configs === void 0 ) configs = {};
var width = configs.width;
if (width) {
if (typeof width !== 'number' && width !== 'device-width') {
console.warn(("[JS Framework] Not support to use " + width + " as viewport width."));
return false
}
return true
}
console.warn('[JS Framework] the viewport config should contain the "width" property.');
return false
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* bootstrap app from a certain custom component with config & data
*/
function bootstrap (app, name, config, data) {
console.debug(("[JS Framework] bootstrap for " + name));
// 1. validate custom component name first
var cleanName;
if (isWeexComponent(name)) {
cleanName = removeWeexPrefix(name);
}
else if (isNpmModule(name)) {
cleanName = removeJSSurfix(name);
// check if define by old 'define' method
/* istanbul ignore if */
if (!requireCustomComponent(app, cleanName)) {
return new Error(("It's not a component: " + name))
}
}
else {
return new Error(("Wrong component name: " + name))
}
// 2. validate configuration
config = isPlainObject(config) ? config : {};
// 2.1 transformer version check
if (typeof config.transformerVersion === 'string' &&
typeof global.transformerVersion === 'string' &&
!semver.satisfies(config.transformerVersion,
global.transformerVersion)) {
return new Error("JS Bundle version: " + (config.transformerVersion) + " " +
"not compatible with " + (global.transformerVersion))
}
// 2.2 downgrade version check
var downgradeResult = check(config.downgrade);
/* istanbul ignore if */
if (downgradeResult.isDowngrade) {
app.callTasks([{
module: 'instanceWrap',
method: 'error',
args: [
downgradeResult.errorType,
downgradeResult.code,
downgradeResult.errorMessage
]
}]);
return new Error(("Downgrade[" + (downgradeResult.code) + "]: " + (downgradeResult.errorMessage)))
}
// set viewport
if (config.viewport) {
setViewport(app, config.viewport);
}
// 3. create a new Vm with custom component name and data
app.vm = new Vm(cleanName, null, { _app: app }, null, data);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* define(name, factory) for primary usage
* or
* define(name, deps, factory) for compatibility
* Notice: DO NOT use function define() {},
* it will cause error after builded by webpack
*/
var defineFn = function (app, name) {
var args = [], len = arguments.length - 2;
while ( len-- > 0 ) args[ len ] = arguments[ len + 2 ];
console.debug(("[JS Framework] define a component " + name));
// adapt args:
// 1. name, deps[], factory()
// 2. name, factory()
// 3. name, definition{}
var factory, definition;
if (args.length > 1) {
definition = args[1];
}
else {
definition = args[0];
}
if (typeof definition === 'function') {
factory = definition;
definition = null;
}
// resolve definition from factory
if (factory) {
var r = function (name) {
if (isWeexComponent(name)) {
var cleanName = removeWeexPrefix(name);
return requireCustomComponent(app, cleanName)
}
if (isWeexModule(name)) {
var cleanName$1 = removeWeexPrefix(name);
return app.requireModule(cleanName$1)
}
if (isNormalModule(name) || isNpmModule(name)) {
var cleanName$2 = removeJSSurfix(name);
return app.commonModules[cleanName$2]
}
};
var m = { exports: {}};
factory(r, m.exports, m);
definition = m.exports;
}
// apply definition
if (isWeexComponent(name)) {
var cleanName = removeWeexPrefix(name);
registerCustomComponent(app, cleanName, definition);
}
else if (isWeexModule(name)) {
var cleanName$1 = removeWeexPrefix(name);
var obj;
initModules(( obj = {}, obj[cleanName$1] = definition, obj ));
}
else if (isNormalModule(name)) {
var cleanName$2 = removeJSSurfix(name);
app.commonModules[cleanName$2] = definition;
}
else if (isNpmModule(name)) {
var cleanName$3 = removeJSSurfix(name);
if (definition.template ||
definition.style ||
definition.methods) {
// downgrade to old define method (define('componentName', factory))
// the exports contain one key of template, style or methods
// but it has risk!!!
registerCustomComponent(app, cleanName$3, definition);
}
else {
app.commonModules[cleanName$3] = definition;
}
}
};
/**
* @deprecated
*/
function register$2 (app, type, options) {
console.warn('[JS Framework] Register is deprecated, please install lastest transformer.');
registerCustomComponent(app, type, options);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* api that invoked by js bundle code
*
* - define(name, factory): define a new composed component type
* - bootstrap(type, config, data): require a certain type &
* render with (optional) data
*
* deprecated:
* - register(type, options): register a new composed component type
* - render(type, data): render by a certain type with (optional) data
* - require(type)(data): require a type then render with data
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* instance controls from native
*
* - fire event
* - callback
* - refresh
* - destroy
*
* corresponded with the API of instance manager (framework.js)
*/
/**
* Refresh an app with data to its root component options.
* @param {object} app
* @param {any} data
*/
function refresh$1 (app, data) {
console.debug("[JS Framework] Refresh with", data,
("in instance[" + (app.id) + "]"));
var vm = app.vm;
if (vm && data) {
if (typeof vm.refreshData === 'function') {
vm.refreshData(data);
}
else {
extend(vm, data);
}
app.differ.flush();
app.doc.taskCenter.send('dom', { action: 'refreshFinish' }, []);
return
}
return new Error(("invalid data \"" + data + "\""))
}
/**
* Destroy an app.
* @param {object} app
*/
function destroy$1 (app) {
console.debug(("[JS Framework] Destory an instance(" + (app.id) + ")"));
if (app.vm) {
destroyVm(app.vm);
}
app.id = '';
app.options = null;
app.blocks = null;
app.vm = null;
app.doc.taskCenter.destroyCallback();
app.doc.destroy();
app.doc = null;
app.customComponentMap = null;
app.commonModules = null;
}
/**
* Destroy an Vm.
* @param {object} vm
*/
function destroyVm (vm) {
delete vm._app;
delete vm._computed;
delete vm._css;
delete vm._data;
delete vm._ids;
delete vm._methods;
delete vm._options;
delete vm._parent;
delete vm._parentEl;
delete vm._rootEl;
// remove all watchers
if (vm._watchers) {
var watcherCount = vm._watchers.length;
while (watcherCount--) {
vm._watchers[watcherCount].teardown();
}
delete vm._watchers;
}
// destroy child vms recursively
if (vm._childrenVms) {
var vmCount = vm._childrenVms.length;
while (vmCount--) {
destroyVm(vm._childrenVms[vmCount]);
}
delete vm._childrenVms;
}
console.debug(("[JS Framework] \"destroyed\" lifecycle in Vm(" + (vm._type) + ")"));
vm.$emit('hook:destroyed');
delete vm._type;
delete vm._vmEvents;
}
/**
* Get a JSON object to describe the document body.
* @param {object} app
* @return {object}
*/
function getRootElement (app) {
var doc = app.doc || {};
var body = doc.body || {};
return body.toJSON ? body.toJSON() : {}
}
/**
* Fire an event from renderer. The event has type, an event object and an
* element ref. If the event comes with some virtual-DOM changes, it should
* have one more parameter to describe the changes.
* @param {object} app
* @param {string} ref
* @param {type} type
* @param {object} e
* @param {object} domChanges
*/
function fireEvent$1 (app, ref, type, e, domChanges) {
console.debug(("[JS Framework] Fire a \"" + type + "\" event on an element(" + ref + ") in instance(" + (app.id) + ")"));
if (Array.isArray(ref)) {
ref.some(function (ref) {
return fireEvent$1(app, ref, type, e) !== false
});
return
}
var el = app.doc.getRef(ref);
if (el) {
var result = app.doc.fireEvent(el, type, e, domChanges);
app.differ.flush();
app.doc.taskCenter.send('dom', { action: 'updateFinish' }, []);
return result
}
return new Error(("invalid element reference \"" + ref + "\""))
}
/**
* Make a callback for a certain app.
* @param {object} app
* @param {number} callbackId
* @param {any} data
* @param {boolean} ifKeepAlive
*/
function callback$1 (app, callbackId, data, ifKeepAlive) {
console.debug(("[JS Framework] Invoke a callback(" + callbackId + ") with"), data,
("in instance(" + (app.id) + ")"));
var result = app.doc.taskCenter.callback(callbackId, data, ifKeepAlive);
updateActions(app);
app.doc.taskCenter.send('dom', { action: 'updateFinish' }, []);
return result
}
/**
* Collect all virtual-DOM mutations together and send them to renderer.
* @param {object} app
*/
function updateActions (app) {
app.differ.flush();
}
/**
* Call all tasks from an app to renderer (native).
* @param {object} app
* @param {array} tasks
*/
function callTasks (app, tasks) {
var result;
/* istanbul ignore next */
if (typof$1(tasks) !== 'array') {
tasks = [tasks];
}
tasks.forEach(function (task) {
result = app.doc.taskCenter.send(
'module',
{
module: task.module,
method: task.method
},
task.args
);
});
return result
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* instance controls from native
*
* - init bundle
*
* corresponded with the API of instance manager (framework.js)
*/
/**
* Init an app by run code witgh data
* @param {object} app
* @param {string} code
* @param {object} data
*/
function init$5 (app, code, data, services) {
console.debug('[JS Framework] Intialize an instance with:\n', data);
var result;
// prepare app env methods
var bundleDefine = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return defineFn.apply(void 0, [ app ].concat( args ));
};
var bundleBootstrap = function (name, config, _data) {
result = bootstrap(app, name, config, _data || data);
updateActions(app);
app.doc.listener.createFinish();
console.debug(("[JS Framework] After intialized an instance(" + (app.id) + ")"));
};
var bundleVm = Vm;
/* istanbul ignore next */
var bundleRegister = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
return register$2.apply(void 0, [ app ].concat( args ));
};
/* istanbul ignore next */
var bundleRender = function (name, _data) {
result = bootstrap(app, name, {}, _data);
};
/* istanbul ignore next */
var bundleRequire = function (name) { return function (_data) {
result = bootstrap(app, name, {}, _data);
}; };
var bundleDocument = app.doc;
/* istanbul ignore next */
var bundleRequireModule = function (name) { return app.requireModule(removeWeexPrefix(name)); };
var weexGlobalObject = {
config: app.options,
define: bundleDefine,
bootstrap: bundleBootstrap,
requireModule: bundleRequireModule,
document: bundleDocument,
Vm: bundleVm
};
Object.freeze(weexGlobalObject);
// prepare code
var functionBody;
/* istanbul ignore if */
if (typeof code === 'function') {
// `function () {...}` -> `{...}`
// not very strict
functionBody = code.toString().substr(12);
}
/* istanbul ignore next */
else if (code) {
functionBody = code.toString();
}
// wrap IFFE and use strict mode
functionBody = "(function(global){\n\n\"use strict\";\n\n " + functionBody + " \n\n})(Object.create(this))";
// run code and get result
var WXEnvironment = global.WXEnvironment;
var timerAPIs = {};
/* istanbul ignore if */
if (WXEnvironment && WXEnvironment.platform !== 'Web') {
// timer APIs polyfill in native
var timer = app.requireModule('timer');
Object.assign(timerAPIs, {
setTimeout: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var handler = function () {
args[0].apply(args, args.slice(2));
};
timer.setTimeout(handler, args[1]);
return app.doc.taskCenter.callbackManager.lastCallbackId.toString()
},
setInterval: function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var handler = function () {
args[0].apply(args, args.slice(2));
};
timer.setInterval(handler, args[1]);
return app.doc.taskCenter.callbackManager.lastCallbackId.toString()
},
clearTimeout: function (n) {
timer.clearTimeout(n);
},
clearInterval: function (n) {
timer.clearInterval(n);
}
});
}
// run code and get result
var globalObjects = Object.assign({
define: bundleDefine,
require: bundleRequire,
bootstrap: bundleBootstrap,
register: bundleRegister,
render: bundleRender,
__weex_define__: bundleDefine, // alias for define
__weex_bootstrap__: bundleBootstrap, // alias for bootstrap
__weex_document__: bundleDocument,
__weex_require__: bundleRequireModule,
__weex_viewmodel__: bundleVm,
weex: weexGlobalObject
}, timerAPIs, services);
if (!callFunctionNative(globalObjects, functionBody)) {
// If failed to compile functionBody on native side,
// fallback to callFunction.
callFunction(globalObjects, functionBody);
}
return result
}
/**
* Call a new function body with some global objects.
* @param {object} globalObjects
* @param {string} code
* @return {any}
*/
function callFunction (globalObjects, body) {
var globalKeys = [];
var globalValues = [];
for (var key in globalObjects) {
globalKeys.push(key);
globalValues.push(globalObjects[key]);
}
globalKeys.push(body);
var result = new (Function.prototype.bind.apply( Function, [ null ].concat( globalKeys) ));
return result.apply(void 0, globalValues)
}
/**
* Call a new function generated on the V8 native side.
* @param {object} globalObjects
* @param {string} body
* @return {boolean} return true if no error occurred.
*/
function callFunctionNative (globalObjects, body) {
if (typeof compileAndRunBundle !== 'function') {
return false
}
var fn = void 0;
var isNativeCompileOk = false;
var script = '(function (';
var globalKeys = [];
var globalValues = [];
for (var key in globalObjects) {
globalKeys.push(key);
globalValues.push(globalObjects[key]);
}
for (var i = 0; i < globalKeys.length - 1; ++i) {
script += globalKeys[i];
script += ',';
}
script += globalKeys[globalKeys.length - 1];
script += ') {';
script += body;
script += '} )';
try {
var weex = globalObjects.weex || {};
var config = weex.config || {};
fn = compileAndRunBundle(script,
config.bundleUrl,
config.bundleDigest,
config.codeCachePath);
if (fn && typeof fn === 'function') {
fn.apply(void 0, globalValues);
isNativeCompileOk = true;
}
}
catch (e) {
console.error(e);
}
return isNativeCompileOk
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* instance controls from native
*
* - init bundle
* - fire event
* - callback
* - destroy
*
* corresponded with the API of instance manager (framework.js)
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var Differ = function Differ (id) {
this.id = id;
this.map = [];
this.hooks = [];
};
Differ.prototype.isEmpty = function isEmpty () {
return this.map.length === 0
};
Differ.prototype.append = function append (type, depth, ref, handler) {
var this$1 = this;
if (!this.hasTimer) {
this.hasTimer = true;
setTimeout(function () {
this$1.hasTimer = false;
this$1.flush(true);
}, 0);
}
var map = this.map;
if (!map[depth]) {
map[depth] = {};
}
var group = map[depth];
if (!group[type]) {
group[type] = {};
}
if (type === 'element') {
if (!group[type][ref]) {
group[type][ref] = [];
}
group[type][ref].push(handler);
}
else {
group[type][ref] = handler;
}
};
Differ.prototype.flush = function flush (isTimeout) {
var map = this.map.slice();
this.map.length = 0;
map.forEach(function (group) {
callTypeMap(group, 'repeat');
callTypeMap(group, 'shown');
callTypeList(group, 'element');
});
var hooks = this.hooks.slice();
this.hooks.length = 0;
hooks.forEach(function (fn) {
fn();
});
if (!this.isEmpty()) {
this.flush();
}
};
Differ.prototype.then = function then (fn) {
this.hooks.push(fn);
};
function callTypeMap (group, type) {
var map = group[type];
for (var ref in map) {
map[ref]();
}
}
function callTypeList (group, type) {
var map = group[type];
for (var ref in map) {
var list = map[ref];
list.forEach(function (handler) { handler(); });
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Weex App constructor & definition
*/
/**
* App constructor for Weex framework.
* @param {string} id
* @param {object} options
*/
function App$1 (id, options) {
this.id = id;
this.options = options || {};
this.vm = null;
this.customComponentMap = {};
this.commonModules = {};
// document
this.doc = new config$3.Document(
id,
this.options.bundleUrl,
null,
config$3.Listener
);
this.differ = new Differ(id);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* Weex instance constructor & definition
*/
/**
* @deprecated
*/
App$1.prototype.requireModule = function (name) {
return requireModule(this, name)
};
/**
* @deprecated
*/
App$1.prototype.updateActions = function () {
return updateActions(this)
};
/**
* @deprecated
*/
App$1.prototype.callTasks = function (tasks) {
return callTasks(this, tasks)
};
/**
* Prevent modification of App and App.prototype
*/
Object.freeze(App$1);
Object.freeze(App$1.prototype);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var instanceMap$2 = {};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Create a Weex instance.
*
* @param {string} id
* @param {string} code
* @param {object} options
* option `HAS_LOG` enable print log
* @param {object} data
* @param {object} info { created, ... services }
*/
function createInstance$3 (id, code, options, data, info) {
var ref = info || {};
var services = ref.services;
resetTarget();
var instance = instanceMap$2[id];
/* istanbul ignore else */
options = options || {};
var result;
/* istanbul ignore else */
if (!instance) {
instance = new App$1(id, options);
instanceMap$2[id] = instance;
result = init$5(instance, code, data, services);
}
else {
result = new Error(("invalid instance id \"" + id + "\""));
}
return (result instanceof Error) ? result : instance
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Init config informations for Weex framework
* @param {object} cfg
*/
function init$6 (cfg) {
config$3.Document = cfg.Document;
config$3.Element = cfg.Element;
config$3.Comment = cfg.Comment;
config$3.sendTasks = cfg.sendTasks;
config$3.Listener = cfg.Listener;
}
/**
* Refresh a Weex instance with data.
*
* @param {string} id
* @param {object} data
*/
function refreshInstance$1 (id, data) {
var instance = instanceMap$2[id];
var result;
/* istanbul ignore else */
if (instance) {
result = refresh$1(instance, data);
}
else {
result = new Error(("invalid instance id \"" + id + "\""));
}
return result
}
/**
* Destroy a Weex instance.
* @param {string} id
*/
function destroyInstance$2 (id) {
// Markup some global state in native side
if (typeof markupState === 'function') {
markupState();
}
resetTarget();
var instance = instanceMap$2[id];
/* istanbul ignore else */
if (!instance) {
return new Error(("invalid instance id \"" + id + "\""))
}
destroy$1(instance);
delete instanceMap$2[id];
// notifyContextDisposed is used to tell v8 to do a full GC,
// but this would have a negative performance impact on weex,
// because all the inline cache in v8 would get cleared
// during a full GC.
// To take care of both memory and performance, just tell v8
// to do a full GC every eighteen times.
var idNum = Math.round(id);
var round = 18;
if (idNum > 0) {
var remainder = idNum % round;
if (!remainder && typeof notifyTrimMemory === 'function') {
notifyTrimMemory();
}
}
return instanceMap$2
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var nativeComponentMap$1 = config$3.nativeComponentMap;
/**
* Register the name of each native component.
* @param {array} components array of name
*/
function registerComponents$1 (components) {
if (Array.isArray(components)) {
components.forEach(function register (name) {
/* istanbul ignore if */
if (!name) {
return
}
if (typeof name === 'string') {
nativeComponentMap$1[name] = true;
}
/* istanbul ignore else */
else if (typeof name === 'object' && typeof name.type === 'string') {
nativeComponentMap$1[name.type] = name;
}
});
}
}
/**
* Register the name and methods of each module.
* @param {object} modules a object of modules
*/
function registerModules$1 (modules) {
/* istanbul ignore else */
if (typeof modules === 'object') {
initModules(modules);
}
}
/**
* Register the name and methods of each api.
* @param {object} apis a object of apis
*/
function registerMethods (methods) {
/* istanbul ignore else */
if (typeof methods === 'object') {
initMethods$1(Vm, methods);
}
}
// @todo: Hack for this framework only. Will be re-designed or removed later.
global.registerMethods = registerMethods;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var jsHandlers = {
fireEvent: function (id) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
return fireEvent$1.apply(void 0, [ instanceMap$2[id] ].concat( args ))
},
callback: function (id) {
var args = [], len = arguments.length - 1;
while ( len-- > 0 ) args[ len ] = arguments[ len + 1 ];
return callback$1.apply(void 0, [ instanceMap$2[id] ].concat( args ))
}
};
/**
* Accept calls from native (event or callback).
*
* @param {string} id
* @param {array} tasks list with `method` and `args`
*/
function receiveTasks$2 (id, tasks) {
var instance = instanceMap$2[id];
if (instance && Array.isArray(tasks)) {
var results = [];
tasks.forEach(function (task) {
var handler = jsHandlers[task.method];
var args = [].concat( task.args );
/* istanbul ignore else */
if (typeof handler === 'function') {
args.unshift(id);
results.push(handler.apply(void 0, args));
}
});
return results
}
return new Error(("invalid instance id \"" + id + "\" or tasks"))
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Get a whole element tree of an instance for debugging.
* @param {string} id
* @return {object} a virtual dom tree
*/
function getRoot$2 (id) {
var instance = instanceMap$2[id];
var result;
/* istanbul ignore else */
if (instance) {
result = getRootElement(instance);
}
else {
result = new Error(("invalid instance id \"" + id + "\""));
}
return result
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview Weex framework entry.
*/
// register special methods for Weex framework
registerMethods(methods$1);
/**
* Prevent modification of Vm and Vm.prototype
*/
Object.freeze(Vm);
var Weex$2 = Object.freeze({
registerComponents: registerComponents$1,
registerModules: registerModules$1,
registerMethods: registerMethods,
createInstance: createInstance$3,
init: init$6,
refreshInstance: refreshInstance$1,
destroyInstance: destroyInstance$2,
receiveTasks: receiveTasks$2,
getRoot: getRoot$2
});
var framework_weex = createCommonjsModule(function (module) {
module.exports = /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 3);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/*!***********************************************************************************!*\
!*** ./packages/weex-rax-framework/node_modules/event-target-shim/lib/commons.js ***!
\***********************************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* @author Toru Nagashima
* @copyright 2015 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
/**
* Creates a unique key.
*
* @param {string} name - A name to create.
* @returns {symbol|string} Generated unique key.
* @private
*/
var createUniqueKey = module.exports.createUniqueKey = (
typeof Symbol !== "undefined" ? Symbol : //eslint-disable-line no-undef
/* otherwise */ function createUniqueKey(name) {
return "[[" + name + "_" + Math.random().toFixed(8).slice(2) + "]]"
}
);
/**
* Checks whether the given value is a non-null object or not.
*
* @param {any} x - The value to be check.
* @returns {boolean} `true` if the value is a non-null object.
* @private
*/
var isObject = module.exports.isObject = function isObject(x) {
return typeof x === "object" && x !== null
};
/**
* The key of listeners.
*
* @type {symbol|string}
* @private
*/
module.exports.LISTENERS = createUniqueKey("listeners");
/**
* A value of kind for listeners which are registered in the capturing phase.
*
* @type {number}
* @private
*/
module.exports.CAPTURE = 1;
/**
* A value of kind for listeners which are registered in the bubbling phase.
*
* @type {number}
* @private
*/
module.exports.BUBBLE = 2;
/**
* A value of kind for listeners which are registered as an attribute.
*
* @type {number}
* @private
*/
module.exports.ATTRIBUTE = 3;
/**
* @typedef object ListenerNode
* @property {function} listener - A listener function.
* @property {number} kind - The kind of the listener.
* @property {ListenerNode|null} next - The next node.
* If this node is the last, this is `null`.
*/
/**
* Creates a node of singly linked list for a list of listeners.
*
* @param {function} listener - A listener function.
* @param {number} kind - The kind of the listener.
* @param {object} [options] - The option object.
* @param {boolean} [options.once] - The flag to remove the listener at the first call.
* @param {boolean} [options.passive] - The flag to ignore `event.preventDefault` method.
* @returns {ListenerNode} The created listener node.
*/
module.exports.newNode = function newNode(listener, kind, options) {
var obj = isObject(options);
return {
listener: listener,
kind: kind,
once: obj && Boolean(options.once),
passive: obj && Boolean(options.passive),
next: null,
}
};
/***/ }),
/* 1 */
/*!****************************************************!*\
!*** ./packages/weex-rax-framework/src/emitter.js ***!
\****************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var EventEmitter = function () {
function EventEmitter() {
_classCallCheck(this, EventEmitter);
this._listeners = {};
}
/**
* Adds a listener function to the specified event.
* @param {String} type
* @param {Function} listener
* @param {Boolean} once
*/
_createClass(EventEmitter, [{
key: "_addListener",
value: function _addListener(type, listener, once) {
this._listeners[type] = this._listeners[type] || [];
this._listeners[type].push({ listener: listener, once: once });
return this;
}
/**
* Adds a listener function to the specified event.
* @param {String} type
* @param {Function} listener
* @return {Object} Current instance of EventEmitter for chaining.
*/
}, {
key: "on",
value: function on(type, listener) {
return this._addListener(type, listener, false);
}
}, {
key: "once",
value: function once(type, listener) {
return this._addListener(type, listener, true);
}
/**
* Removes a listener function to the specified event.
* @param {String} type
* @param {Function} listener
* @return {Object} Current instance of EventEmitter for chaining.
*/
}, {
key: "off",
value: function off(type, listener) {
// alias
if (!this._listeners[type]) {
return this;
}
if (!this._listeners[type].length) {
return this;
}
if (!listener) {
delete this._listeners[type];
return this;
}
this._listeners[type] = this._listeners[type].filter(function (_listener) {
return !(_listener.listener === listener);
});
return this;
}
/**
* Emits an specified event.
* @param {String} type
* @param {Object} payload
* @return {Object} Current instance of EventEmitter for chaining.
*/
}, {
key: "emit",
value: function emit(type, payload) {
var _this = this;
if (!this._listeners[type]) {
return this;
}
this._listeners[type].forEach(function (_listener) {
_listener.listener.apply(_this, [payload]);
if (_listener.once) {
_this.removeListener(type, _listener.listener);
}
});
return this;
}
}]);
return EventEmitter;
}();
exports.default = EventEmitter;
module.exports = exports["default"];
/***/ }),
/* 2 */
/*!****************************************************************************************!*\
!*** ./packages/weex-rax-framework/node_modules/event-target-shim/lib/event-target.js ***!
\****************************************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* @author Toru Nagashima
* @copyright 2015 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
//------------------------------------------------------------------------------
// Requirements
//------------------------------------------------------------------------------
/*globals window */
var Commons = __webpack_require__(/*! ./commons */ 0);
var CustomEventTarget = __webpack_require__(/*! ./custom-event-target */ 15);
var EventWrapper = __webpack_require__(/*! ./event-wrapper */ 16);
var isObject = Commons.isObject;
var LISTENERS = Commons.LISTENERS;
var CAPTURE = Commons.CAPTURE;
var BUBBLE = Commons.BUBBLE;
var ATTRIBUTE = Commons.ATTRIBUTE;
var newNode = Commons.newNode;
var defineCustomEventTarget = CustomEventTarget.defineCustomEventTarget;
var createEventWrapper = EventWrapper.createEventWrapper;
var STOP_IMMEDIATE_PROPAGATION_FLAG = EventWrapper.STOP_IMMEDIATE_PROPAGATION_FLAG;
var PASSIVE_LISTENER_FLAG = EventWrapper.PASSIVE_LISTENER_FLAG;
//------------------------------------------------------------------------------
// Constants
//------------------------------------------------------------------------------
/**
* A flag which shows there is the native `EventTarget` interface object.
*
* @type {boolean}
* @private
*/
var HAS_EVENTTARGET_INTERFACE = (
typeof window !== "undefined" &&
typeof window.EventTarget !== "undefined"
);
//------------------------------------------------------------------------------
// Public Interface
//------------------------------------------------------------------------------
/**
* An implementation for `EventTarget` interface.
*
* @constructor
* @public
*/
var EventTarget = module.exports = function EventTarget() {
var arguments$1 = arguments;
if (this instanceof EventTarget) {
// this[LISTENERS] is a Map.
// Its key is event type.
// Its value is ListenerNode object or null.
//
// interface ListenerNode {
// var listener: Function
// var kind: CAPTURE|BUBBLE|ATTRIBUTE
// var next: ListenerNode|null
// }
Object.defineProperty(this, LISTENERS, {value: Object.create(null)});
}
else if (arguments.length === 1 && Array.isArray(arguments[0])) {
return defineCustomEventTarget(EventTarget, arguments[0])
}
else if (arguments.length > 0) {
var types = Array(arguments.length);
for (var i = 0; i < arguments.length; ++i) {
types[i] = arguments$1[i];
}
// To use to extend with attribute listener properties.
// e.g.
// class MyCustomObject extends EventTarget("message", "error") {
// //...
// }
return defineCustomEventTarget(EventTarget, types)
}
else {
throw new TypeError("Cannot call a class as a function")
}
};
EventTarget.prototype = Object.create(
(HAS_EVENTTARGET_INTERFACE ? window.EventTarget : Object).prototype,
{
constructor: {
value: EventTarget,
writable: true,
configurable: true,
},
addEventListener: {
value: function addEventListener(type, listener, options) {
if (listener == null) {
return false
}
if (typeof listener !== "function" && typeof listener !== "object") {
throw new TypeError("\"listener\" is not an object.")
}
var capture = isObject(options) ? Boolean(options.capture) : Boolean(options);
var kind = (capture ? CAPTURE : BUBBLE);
var node = this[LISTENERS][type];
if (node == null) {
this[LISTENERS][type] = newNode(listener, kind, options);
return true
}
var prev = null;
while (node != null) {
if (node.listener === listener && node.kind === kind) {
// Should ignore a duplicated listener.
return false
}
prev = node;
node = node.next;
}
prev.next = newNode(listener, kind, options);
return true
},
configurable: true,
writable: true,
},
removeEventListener: {
value: function removeEventListener(type, listener, options) {
var this$1 = this;
if (listener == null) {
return false
}
var capture = isObject(options) ? Boolean(options.capture) : Boolean(options);
var kind = (capture ? CAPTURE : BUBBLE);
var prev = null;
var node = this[LISTENERS][type];
while (node != null) {
if (node.listener === listener && node.kind === kind) {
if (prev == null) {
this$1[LISTENERS][type] = node.next;
}
else {
prev.next = node.next;
}
return true
}
prev = node;
node = node.next;
}
return false
},
configurable: true,
writable: true,
},
dispatchEvent: {
value: function dispatchEvent(event) {
var this$1 = this;
// If listeners aren't registered, terminate.
var type = event.type;
var node = this[LISTENERS][type];
if (node == null) {
return true
}
// Since we cannot rewrite several properties, so wrap object.
var wrapped = createEventWrapper(event, this);
// This doesn't process capturing phase and bubbling phase.
// This isn't participating in a tree.
var prev = null;
while (node != null) {
// Remove this listener if it's once
if (node.once) {
if (prev == null) {
this$1[LISTENERS][type] = node.next;
}
else {
prev.next = node.next;
}
}
else {
prev = node;
}
// Call this listener
wrapped[PASSIVE_LISTENER_FLAG] = node.passive;
if (typeof node.listener === "function") {
node.listener.call(this$1, wrapped);
}
else if (node.kind !== ATTRIBUTE && typeof node.listener.handleEvent === "function") {
node.listener.handleEvent(wrapped);
}
// Break if `event.stopImmediatePropagation` was called.
if (wrapped[STOP_IMMEDIATE_PROPAGATION_FLAG]) {
break
}
node = node.next;
}
return !wrapped.defaultPrevented
},
configurable: true,
writable: true,
},
}
);
/***/ }),
/* 3 */
/*!**************************************************!*\
!*** ./packages/weex-rax-framework/src/index.js ***!
\**************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) { break; } } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) { _i["return"](); } } finally { if (_d) { throw _e; } } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _extends = Object.assign || function (target) {
var arguments$1 = arguments;
for (var i = 1; i < arguments.length; i++) { var source = arguments$1[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.getInstance = getInstance;
exports.init = init;
exports.registerComponents = registerComponents;
exports.registerMethods = registerMethods;
exports.registerModules = registerModules;
exports.createInstance = createInstance;
exports.refreshInstance = refreshInstance;
exports.destroyInstance = destroyInstance;
exports.getRoot = getRoot;
exports.receiveTasks = receiveTasks;
var _builtin = __webpack_require__(/*! ./builtin */ 4);
var _emitter = __webpack_require__(/*! ./emitter */ 1);
var _emitter2 = _interopRequireDefault(_emitter);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var NativeComponents = {};
var NativeModules = {};
var Document = void 0;
var Element = void 0;
var Comment = void 0;
var MODULE_NAME_PREFIX = '@weex-module/';
var MODAL_MODULE = MODULE_NAME_PREFIX + 'modal';
var NAVIGATOR_MODULE = MODULE_NAME_PREFIX + 'navigator';
// Instance hub
var instances = {};
// Bundles hub
var bundles = {};
var noop = function noop() {};
function dispatchEventToInstance(event, targetOrigin) {
var instance;
for (var i in instances) {
if (instances.hasOwnProperty(i)) {
instance = instances[i];
if (targetOrigin === '*' || targetOrigin === instance.origin) {
event.target = instance.window;
// FIXME: Need async?
instance.window.dispatchEvent(event);
}
}
}
}
function updateFinish(doc) {
doc.taskCenter.send('dom', { action: 'updateFinish' }, []);
}
function getInstance(instanceId) {
var instance = instances[instanceId];
if (!instance) {
throw new Error('Invalid instance id "' + instanceId + '"');
}
return instance;
}
function init(config) {
Document = config.Document;
Element = config.Element;
Comment = config.Comment;
}
/**
* register the name of each native component
* @param {array} components array of name
*/
function registerComponents(components) {
if (Array.isArray(components)) {
components.forEach(function register(name) {
/* istanbul ignore if */
if (!name) {
return;
}
if (typeof name === 'string') {
NativeComponents[name] = true;
} else if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object' && typeof name.type === 'string') {
NativeComponents[name.type] = name;
}
});
}
}
/**
* register the name and methods of each api
* @param {object} apis a object of apis
*/
function registerMethods(apis) {}
// Noop
/**
* register the name and methods of each module
* @param {object} modules a object of modules
*/
function registerModules(newModules) {
if ((typeof newModules === 'undefined' ? 'undefined' : _typeof(newModules)) === 'object') {
for (var name in newModules) {
if (Object.prototype.hasOwnProperty.call(newModules, name)) {
NativeModules[name] = newModules[name];
}
}
}
}
function genBuiltinModules(modules, moduleFactories, context) {
for (var moduleName in moduleFactories) {
modules[moduleName] = {
factory: moduleFactories[moduleName].bind(context),
module: { exports: {} },
isInitialized: false
};
}
return modules;
}
function genNativeModules(modules, document) {
if ((typeof NativeModules === 'undefined' ? 'undefined' : _typeof(NativeModules)) === 'object') {
var _loop = function _loop(name) {
var moduleName = MODULE_NAME_PREFIX + name;
modules[moduleName] = {
module: { exports: {} },
isInitialized: true
};
NativeModules[name].forEach(function (method) {
if (typeof method === 'string') {
method = {
name: method
};
}
var methodName = method.name;
modules[moduleName].module.exports[methodName] = function () {
var arguments$1 = arguments;
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments$1[_key];
}
var options = {};
var lastArg = args[args.length - 1];
if (lastArg && (typeof lastArg === 'undefined' ? 'undefined' : _typeof(lastArg)) === 'object' && lastArg.__weex_options__) {
options = lastArg.__weex_options__;
// Remove the last in args
args.pop();
}
// https://github.com/alibaba/weex/issues/1677
return document.taskCenter.send('module', {
module: name,
method: methodName
}, args, options);
};
});
};
for (var name in NativeModules) {
_loop(name);
}
}
return modules;
}
/**
* create a Weex instance
*
* @param {string} instanceId
* @param {string} __weex_code__
* @param {object} [__weex_options__] {bundleUrl, debug}
*/
function createInstance(instanceId, __weex_code__, __weex_options__, __weex_data__, __weex_config__) {
var instance = instances[instanceId];
if (instance == undefined) {
// Mark start time
var responseEnd = Date.now();
var __weex_env__ = (typeof WXEnvironment === 'undefined' ? 'undefined' : _typeof(WXEnvironment)) === 'object' && WXEnvironment || {};
// For better performance use built-in promise first
var shared = __webpack_require__(/*! runtime-shared/dist/shared.function */ 6)();
var _Promise = typeof _Promise === 'function' ? _Promise : shared.Promise;
var _Symbol = typeof _Symbol === 'function' ? _Symbol : shared.Symbol;
var _Set = typeof _Set === 'function' ? _Set : shared.Set;
var _Map = typeof _Map === 'function' ? _Map : shared.Map;
var _WeakMap = typeof _WeakMap === 'function' ? _WeakMap : shared.WeakMap;
var _WeakSet = typeof _WeakSet === 'function' ? _WeakSet : shared.WeakSet;
var URL = shared.URL,
URLSearchParams = shared.URLSearchParams,
FontFace = shared.FontFace,
matchMedia = shared.matchMedia;
var bundleUrl = __weex_options__.bundleUrl || 'about:blank';
if (!__weex_options__.bundleUrl) {
console.error('Error: Must have bundleUrl option when createInstance, downgrade to "about:blank".');
}
var document = new Document(instanceId, bundleUrl);
var documentURL = new URL(bundleUrl);
var modules = {};
instance = instances[instanceId] = {
document: document,
instanceId: instanceId,
bundleUrl: bundleUrl,
bundleCode: __weex_code__,
modules: modules,
origin: documentURL.origin,
uid: 0
};
// Generate native modules map at instance init
genNativeModules(modules, document);
var __weex_define__ = __webpack_require__(/*! ./define.weex */ 7)(modules);
var __weex_require__ = __webpack_require__(/*! ./require.weex */ 8)(modules);
var __weex_downgrade__ = __webpack_require__(/*! ./downgrade.weex */ 9)(__weex_require__);
// Extend document
__webpack_require__(/*! ./document.weex */ 11)(__weex_require__, document);
var location = __webpack_require__(/*! ./location.weex */ 12)(__weex_require__, documentURL);
var _require = __webpack_require__(/*! ./fetch.weex */ 13)(__weex_require__, _Promise),
fetch = _require.fetch,
Headers = _require.Headers,
Request = _require.Request,
Response = _require.Response;
var XMLHttpRequest = __webpack_require__(/*! ./xmlhttprequest.weex */ 14)(__weex_require__);
var WebSocket = __webpack_require__(/*! ./websocket.weex */ 17)(__weex_require__);
var _require2 = __webpack_require__(/*! ./timer.weex */ 18)(__weex_require__, document),
setTimeout = _require2.setTimeout,
clearTimeout = _require2.clearTimeout,
setInterval = _require2.setInterval,
clearInterval = _require2.clearInterval,
requestAnimationFrame = _require2.requestAnimationFrame,
cancelAnimationFrame = _require2.cancelAnimationFrame;
var _require3 = __webpack_require__(/*! ./base64.weex */ 19)(),
atob = _require3.atob,
btoa = _require3.btoa;
var performance = __webpack_require__(/*! ./performance.weex */ 20)(responseEnd);
var _require4 = __webpack_require__(/*! ./event.weex */ 21)(),
Event = _require4.Event,
CustomEvent = _require4.CustomEvent;
var windowEmitter = new _emitter2.default();
var window = {
// ES
Promise: _Promise,
Symbol: _Symbol,
Map: _Map,
Set: _Set,
WeakMap: _WeakMap,
WeakSet: _WeakSet,
// W3C: https://www.w3.org/TR/html5/browsers.html#browsing-context-name
name: '',
// This read-only property indicates whether the referenced window is closed or not.
closed: false,
atob: atob,
btoa: btoa,
performance: performance,
// W3C
document: document,
location: location,
// https://www.w3.org/TR/2009/WD-html5-20090423/browsers.html#dom-navigator
navigator: {
product: 'Weex',
platform: __weex_env__.platform,
appName: __weex_env__.appName,
appVersion: __weex_env__.appVersion,
// Weex/0.12 iOS/9.3 (iPhone7,2) AppName/0.12
userAgent: 'Weex/' + __weex_env__.weexVersion + ' ' + __weex_env__.platform + '/' + __weex_env__.osVersion + ' (' + __weex_env__.deviceModel + ') ' + __weex_env__.appName + '/' + __weex_env__.appVersion
},
// https://drafts.csswg.org/cssom-view/#the-screen-interface
screen: {
width: __weex_env__.deviceWidth,
height: __weex_env__.deviceHeight,
availWidth: __weex_env__.deviceWidth,
availHeight: __weex_env__.deviceHeight,
colorDepth: 24,
pixelDepth: 24
},
devicePixelRatio: __weex_env__.scale,
fetch: fetch,
Headers: Headers,
Response: Response,
Request: Request,
XMLHttpRequest: XMLHttpRequest,
URL: URL,
URLSearchParams: URLSearchParams,
FontFace: FontFace,
WebSocket: WebSocket,
Event: Event,
CustomEvent: CustomEvent,
matchMedia: matchMedia,
setTimeout: setTimeout,
clearTimeout: clearTimeout,
setInterval: setInterval,
clearInterval: clearInterval,
requestAnimationFrame: requestAnimationFrame,
cancelAnimationFrame: cancelAnimationFrame,
alert: function alert(message) {
var modal = __weex_require__(MODAL_MODULE);
modal.alert({
message: message
}, function () {});
},
open: function open(url) {
var weexNavigator = __weex_require__(NAVIGATOR_MODULE);
weexNavigator.push({
url: url,
animated: true
}, noop);
},
close: function close() {
var weexNavigator = __weex_require__(NAVIGATOR_MODULE);
weexNavigator.close({
animated: true
}, noop, noop);
},
postMessage: function postMessage(message, targetOrigin) {
var event = {
origin: location.origin,
data: JSON.parse(JSON.stringify(message)),
type: 'message',
source: window // FIXME: maybe not export window
};
dispatchEventToInstance(event, targetOrigin);
},
addEventListener: function addEventListener(type, listener) {
windowEmitter.on(type, listener);
},
removeEventListener: function removeEventListener(type, listener) {
windowEmitter.off(type, listener);
},
dispatchEvent: function dispatchEvent(e) {
windowEmitter.emit(e.type, e);
},
// ModuleJS
define: __weex_define__,
require: __weex_require__,
// Weex
__weex_document__: document,
__weex_define__: __weex_define__,
__weex_require__: __weex_require__,
__weex_downgrade__: __weex_downgrade__,
__weex_env__: __weex_env__,
__weex_code__: __weex_code__,
__weex_options__: __weex_options__,
__weex_data__: __weex_data__
};
instance.window = window.self = window.window = window;
var builtinGlobals = {};
var builtinModules = {};
try {
builtinGlobals = __weex_config__.services.builtinGlobals;
// Modules should wrap as module factory format
builtinModules = __weex_config__.services.builtinModules;
} catch (e) {}
Object.assign(window, builtinGlobals);
var moduleFactories = _extends({}, _builtin.ModuleFactories, builtinModules);
genBuiltinModules(modules, moduleFactories, window);
// In weex iOS or Android
if (__weex_env__.platform !== 'Web') {
var timing = performance.timing;
timing.domLoading = Date.now();
// Use the cached init function, if existed in bundles
var _init = bundles[__weex_code__] ? bundles[__weex_code__] : new Function('with(this){(function(){"use strict";\n' + __weex_code__ + '\n}).call(this)}');
_init.call(
// Context is window
window);
timing.domInteractive = timing.domComplete = timing.domInteractive = Date.now();
// Cache the init function
bundles[__weex_code__] = _init;
} else {
// In weex h5
var _init2 = new Function('"use strict";\n' + __weex_code__);
_init2.call(window);
}
} else {
throw new Error('Instance id "' + instanceId + '" existed when create instance');
}
}
/**
* refresh a Weex instance
*
* @param {string} instanceId
* @param {object} data
*/
function refreshInstance(instanceId, data) {
var instance = getInstance(instanceId);
var document = instance.document;
document.documentElement.fireEvent('refresh', {
timestamp: Date.now(),
data: data
});
document.taskCenter.send('dom', { action: 'refreshFinish' }, []);
}
/**
* destroy a Weex instance
* @param {string} instanceId
*/
function destroyInstance(instanceId) {
var instance = getInstance(instanceId);
var bundleCode = instance.bundleCode;
instance.window.closed = true;
var document = instance.document;
document.documentElement.fireEvent('destory', {
timestamp: Date.now()
});
if (document.destroy) {
document.destroy();
}
if (document.taskCenter && document.taskCenter.destroyCallback) {
document.taskCenter.destroyCallback();
}
delete instances[instanceId];
delete bundles[bundleCode];
}
/**
* get a whole element tree of an instance
* for debugging
* @param {string} instanceId
* @return {object} a virtual dom tree
*/
function getRoot(instanceId) {
var instance = getInstance(instanceId);
var document = instance.document;
return document.toJSON ? document.toJSON() : {};
}
function fireEvent(doc, ref, type, e, domChanges) {
if (Array.isArray(ref)) {
ref.some(function (ref) {
return fireEvent(doc, ref, type, e) !== false;
});
return;
}
var el = doc.getRef(ref);
if (el) {
var result = doc.fireEvent(el, type, e, domChanges);
updateFinish(doc);
return result;
}
return new Error('Invalid element reference "' + ref + '"');
}
/**
* accept calls from native (event or callback)
*
* @param {string} instanceId
* @param {array} tasks list with `method` and `args`
*/
function receiveTasks(instanceId, tasks) {
var instance = getInstance(instanceId);
if (Array.isArray(tasks)) {
var document = instance.document;
var results = [];
tasks.forEach(function (task) {
var result = void 0;
if (task.method === 'fireEvent') {
var _task$args = _slicedToArray(task.args, 4),
nodeId = _task$args[0],
type = _task$args[1],
data = _task$args[2],
domChanges = _task$args[3];
result = fireEvent(document, nodeId, type, data, domChanges);
} else if (task.method === 'callback') {
var _task$args2 = _slicedToArray(task.args, 3),
uid = _task$args2[0],
_data = _task$args2[1],
ifKeepAlive = _task$args2[2];
result = document.taskCenter.callback(uid, _data, ifKeepAlive);
updateFinish(document);
}
results.push(result);
});
return results;
}
}
// FIXME: Hack for rollup build "import Rax from 'weex-rax-framework'", in rollup if `module.exports` has `__esModule` key must return by export default
exports.default = exports;
/***/ }),
/* 4 */
/*!****************************************************!*\
!*** ./packages/weex-rax-framework/src/builtin.js ***!
\****************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var ModuleFactories = exports.ModuleFactories = {
'rax': __webpack_require__(/*! rax/dist/rax.factory */ 5)
};
/***/ }),
/* 5 */
/*!******************************************!*\
!*** ./packages/rax/dist/rax.factory.js ***!
\******************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports) {
module.exports = function(require, exports, module) {
var __weex_document__ = this["__weex_document__"];
var document = this["document"];
module.exports = /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 15);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
/*
* Stateful things in runtime
*/
exports.default = {
component: null,
mountID: 1,
sandbox: true,
// Roots
rootComponents: {},
rootInstances: {},
// Inject
hook: null,
driver: null,
monitor: null
};
module.exports = exports["default"];
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _element = __webpack_require__(7);
var _unmountComponentAtNode = __webpack_require__(8);
var _unmountComponentAtNode2 = _interopRequireDefault(_unmountComponentAtNode);
var _instantiateComponent = __webpack_require__(2);
var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
var _shouldUpdateComponent = __webpack_require__(4);
var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent);
var _root = __webpack_require__(18);
var _root2 = _interopRequireDefault(_root);
var _universalEnv = __webpack_require__(3);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
/**
* Instance manager
*/
var KEY = '$$instance';
exports.default = {
set: function set(node, instance) {
if (!node[KEY]) {
node[KEY] = instance;
// Record root instance to roots map
if (instance.rootID) {
_host2.default.rootInstances[instance.rootID] = instance;
_host2.default.rootComponents[instance.rootID] = instance._internal;
}
}
},
get: function get(node) {
return node[KEY];
},
remove: function remove(node) {
var instance = this.get(node);
if (instance) {
node[KEY] = null;
if (instance.rootID) {
delete _host2.default.rootComponents[instance.rootID];
delete _host2.default.rootInstances[instance.rootID];
}
}
},
render: function render(element, container) {
_host2.default.driver.beforeRender && _host2.default.driver.beforeRender();
// Real native root node is body
if (container == null) {
container = _host2.default.driver.createBody();
}
var prevRootInstance = this.get(container);
var hasPrevRootInstance = prevRootInstance && prevRootInstance.isRootComponent;
if (hasPrevRootInstance) {
var prevRenderedComponent = prevRootInstance.getRenderedComponent();
var prevElement = prevRenderedComponent._currentElement;
if ((0, _shouldUpdateComponent2.default)(prevElement, element)) {
var prevUnmaskedContext = prevRenderedComponent._context;
prevRenderedComponent.updateComponent(prevElement, element, prevUnmaskedContext, prevUnmaskedContext);
return prevRootInstance;
} else {
_host2.default.hook.Reconciler.unmountComponent(prevRootInstance);
(0, _unmountComponentAtNode2.default)(container);
}
}
// Handle server rendered element
if (_universalEnv.isWeb && container.childNodes) {
// Clone childNodes, Because removeChild will causing change in childNodes length
var childNodes = [].concat(_toConsumableArray(container.childNodes));
for (var i = 0; i < childNodes.length; i++) {
var rootChildNode = childNodes[i];
if (rootChildNode.hasAttribute && rootChildNode.hasAttribute('data-rendered')) {
_host2.default.driver.removeChild(rootChildNode, container);
}
}
}
var wrappedElement = (0, _element.createElement)(_root2.default, null, element);
var renderedComponent = (0, _instantiateComponent2.default)(wrappedElement);
var defaultContext = {};
var rootInstance = renderedComponent.mountComponent(container, defaultContext);
this.set(container, rootInstance);
// After render callback
_host2.default.driver.afterRender && _host2.default.driver.afterRender(rootInstance);
// Devtool render new root hook
_host2.default.hook.Mount._renderNewRootComponent(rootInstance._internal);
return rootInstance;
}
};
module.exports = exports['default'];
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function instantiateComponent(element) {
var instance = void 0;
if (element === undefined || element === null || element === false || element === true) {
instance = new _host2.default.EmptyComponent();
} else if (Array.isArray(element)) {
instance = new _host2.default.FragmentComponent(element);
} else if ((typeof element === 'undefined' ? 'undefined' : _typeof(element)) === 'object' && element.type) {
// Special case string values
if (typeof element.type === 'string') {
instance = new _host2.default.NativeComponent(element);
} else {
instance = new _host2.default.CompositeComponent(element);
}
} else if (typeof element === 'string' || typeof element === 'number') {
instance = new _host2.default.TextComponent(element);
} else {
throw Error('Invalid element type ' + JSON.stringify(element));
}
instance._mountIndex = 0;
return instance;
}
exports.default = instantiateComponent;
module.exports = exports['default'];
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
};
// https://www.w3.org/TR/html5/webappapis.html#dom-navigator-appcodename
var isWeb = exports.isWeb = (typeof navigator === 'undefined' ? 'undefined' : _typeof(navigator)) === 'object' && (navigator.appCodeName === 'Mozilla' || navigator.product === 'Gecko');
var isNode = exports.isNode = typeof process !== 'undefined' && !!(process.versions && process.versions.node);
var isWeex = exports.isWeex = typeof callNative === 'function';
var isReactNative = exports.isReactNative = typeof __fbBatchedBridgeConfig !== 'undefined';
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
function shouldUpdateComponent(prevElement, nextElement) {
// TODO: prevElement and nextElement could be array
var prevEmpty = prevElement === null;
var nextEmpty = nextElement === null;
if (prevEmpty || nextEmpty) {
return prevEmpty === nextEmpty;
}
var prevType = typeof prevElement === 'undefined' ? 'undefined' : _typeof(prevElement);
var nextType = typeof nextElement === 'undefined' ? 'undefined' : _typeof(nextElement);
if (prevType === 'string' || prevType === 'number') {
return nextType === 'string' || nextType === 'number';
} else {
return prevType === 'object' && nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key;
}
}
exports.default = shouldUpdateComponent;
module.exports = exports['default'];
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Base component class.
*/
var Component = function () {
function Component(props, context, updater) {
_classCallCheck(this, Component);
this.props = props;
this.context = context;
this.refs = {};
this.updater = updater;
}
_createClass(Component, [{
key: "isComponentClass",
value: function isComponentClass() {}
}, {
key: "setState",
value: function setState(partialState, callback) {
this.updater.setState(this, partialState, callback);
}
}, {
key: "forceUpdate",
value: function forceUpdate(callback) {
this.updater.forceUpdate(this, callback);
}
}]);
return Component;
}();
exports.default = Component;
module.exports = exports["default"];
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.default = {
ComponentTree: {
getClosestInstanceFromNode: function getClosestInstanceFromNode(node) {
return _instance2.default.get(node);
},
getNodeFromInstance: function getNodeFromInstance(inst) {
// inst is an internal instance (but could be a composite)
while (inst._renderedComponent) {
inst = inst._renderedComponent;
}
if (inst) {
return inst._nativeNode;
} else {
return null;
}
}
},
Mount: {
_instancesByReactRootID: _host2.default.rootComponents,
// Stub - React DevTools expects to find this method and replace it
// with a wrapper in order to observe new root components being added
_renderNewRootComponent: function _renderNewRootComponent() {}
},
Reconciler: {
// Stubs - React DevTools expects to find these methods and replace them
// with wrappers in order to observe components being mounted, updated and
// unmounted
mountComponent: function mountComponent() {},
receiveComponent: function receiveComponent() {},
unmountComponent: function unmountComponent() {}
},
// monitor the info of all components
monitor: null
};
module.exports = exports['default'];
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.createElement = createElement;
exports.createFactory = createFactory;
exports.cloneElement = cloneElement;
exports.isValidElement = isValidElement;
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _flattenChildren = __webpack_require__(17);
var _flattenChildren2 = _interopRequireDefault(_flattenChildren);
var _universalEnv = __webpack_require__(3);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var RESERVED_PROPS = {
key: true,
ref: true
};
function getRenderErrorInfo() {
if (_host2.default.component) {
var name = _host2.default.component.getName();
if (name) {
return ' Check the render method of `' + name + '`.';
}
}
return '';
}
var Element = function Element(type, key, ref, props, owner) {
props = filterProps(type, props);
return {
// Built-in properties that belong on the element
type: type,
key: key,
ref: ref,
props: props,
// Record the component responsible for creating this element.
_owner: owner
};
};
exports.default = Element;
function flattenStyle(style) {
if (!style) {
return undefined;
}
if (!Array.isArray(style)) {
return style;
} else {
var result = {};
for (var i = 0; i < style.length; ++i) {
var computedStyle = flattenStyle(style[i]);
if (computedStyle) {
for (var key in computedStyle) {
result[key] = computedStyle[key];
}
}
}
return result;
}
}
// TODO: move to weex-drvier
function filterProps(type, props) {
// Only for weex text
if (_universalEnv.isWeex && type === 'text') {
var children = props.children;
var value = props.value;
// Value is first
if (value == null && children != null) {
if (Array.isArray(children)) {
children = children.map(function (val) {
if (typeof val === 'number' || typeof val === 'string') {
return val;
} else {
return '';
}
}).join('');
} else if (typeof children !== 'number' && typeof children !== 'string') {
children = '';
}
props.value = String(children);
}
props.children = null;
}
return props;
}
function createElement(type, config) {
var arguments$1 = arguments;
if (type == null) {
throw Error('createElement: type should not be null or undefined.' + getRenderErrorInfo());
}
// Reserved names are extracted
var props = {};
var propName = void 0;
var key = null;
var ref = null;
if (config != null) {
ref = config.ref === undefined ? null : config.ref;
key = config.key === undefined ? null : String(config.key);
// Remaining properties are added to a new props object
for (propName in config) {
if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
props[propName] = config[propName];
}
}
}
for (var _len = arguments.length, children = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
children[_key - 2] = arguments$1[_key];
}
if (children.length) {
props.children = (0, _flattenChildren2.default)(children);
}
// Resolve default props
if (type && type.defaultProps) {
var defaultProps = type.defaultProps;
for (propName in defaultProps) {
if (props[propName] === undefined) {
props[propName] = defaultProps[propName];
}
}
}
if (props.style && (Array.isArray(props.style) || _typeof(props.style) === 'object')) {
props.style = flattenStyle(props.style);
}
return new Element(type, key, ref, props, _host2.default.component);
}
function createFactory(type) {
var factory = createElement.bind(null, type);
// Expose the type on the factory and the prototype so that it can be
// easily accessed on elements. E.g. `<Foo />.type === Foo`.
// This should not be named `constructor` since this may not be the function
// that created the element, and it may not even be a constructor.
factory.type = type;
return factory;
}
function cloneElement(element, config) {
var arguments$1 = arguments;
if (!isValidElement(element)) {
throw Error('cloneElement: not a valid element.' + getRenderErrorInfo());
}
// Original props are copied
var props = Object.assign({}, element.props);
// Reserved names are extracted
var key = element.key;
var ref = element.ref;
// Owner will be preserved, unless ref is overridden
var owner = element._owner;
if (config) {
// Should reset ref and owner if has a new ref
if (config.ref !== undefined) {
ref = config.ref;
owner = _host2.default.component;
}
if (config.key !== undefined) {
key = String(config.key);
}
// Resolve default props
var defaultProps = void 0;
if (element.type && element.type.defaultProps) {
defaultProps = element.type.defaultProps;
}
// Remaining properties override existing props
var propName = void 0;
for (propName in config) {
if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
if (config[propName] === undefined && defaultProps !== undefined) {
// Resolve default props
props[propName] = defaultProps[propName];
} else {
props[propName] = config[propName];
}
}
}
}
for (var _len2 = arguments.length, children = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
children[_key2 - 2] = arguments$1[_key2];
}
if (children.length) {
props.children = (0, _flattenChildren2.default)(children);
}
return new Element(element.type, key, ref, props, owner);
}
function isValidElement(object) {
return (typeof object === 'undefined' ? 'undefined' : _typeof(object)) === 'object' && object !== null && object.type && object.props;
}
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = unmountComponentAtNode;
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function unmountComponentAtNode(node) {
var component = _instance2.default.get(node);
if (!component) {
return false;
}
_instance2.default.remove(node);
component._internal.unmountComponent();
return true;
}
module.exports = exports['default'];
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _ref = __webpack_require__(10);
var _ref2 = _interopRequireDefault(_ref);
var _instantiateComponent = __webpack_require__(2);
var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
var _shouldUpdateComponent = __webpack_require__(4);
var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent);
var _getElementKeyName = __webpack_require__(11);
var _getElementKeyName2 = _interopRequireDefault(_getElementKeyName);
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var STYLE = 'style';
var CHILDREN = 'children';
var TREE = 'tree';
var EVENT_PREFIX_REGEXP = /on[A-Z]/;
/**
* Native Component
*/
var NativeComponent = function () {
function NativeComponent(element) {
_classCallCheck(this, NativeComponent);
this._currentElement = element;
}
_createClass(NativeComponent, [{
key: 'mountComponent',
value: function mountComponent(parent, context, childMounter) {
// Parent native element
this._parent = parent;
this._context = context;
this._mountID = _host2.default.mountID++;
var props = this._currentElement.props;
var type = this._currentElement.type;
var instance = {
_internal: this,
type: type,
props: props
};
var appendType = props.append; // Default is node
this._instance = instance;
// Clone a copy for style diff
this._prevStyleCopy = Object.assign({}, props.style);
var nativeNode = this.getNativeNode();
if (appendType !== TREE) {
if (childMounter) {
childMounter(nativeNode, parent);
} else {
_host2.default.driver.appendChild(nativeNode, parent);
}
}
if (this._currentElement && this._currentElement.ref) {
_ref2.default.attach(this._currentElement._owner, this._currentElement.ref, this);
}
// Process children
var children = props.children;
if (children != null) {
this.mountChildren(children, context);
}
if (appendType === TREE) {
if (childMounter) {
childMounter(nativeNode, parent);
} else {
_host2.default.driver.appendChild(nativeNode, parent);
}
}
_host2.default.hook.Reconciler.mountComponent(this);
return instance;
}
}, {
key: 'mountChildren',
value: function mountChildren(children, context) {
var _this = this;
if (!Array.isArray(children)) {
children = [children];
}
var renderedChildren = this._renderedChildren = {};
var renderedChildrenImage = children.map(function (element, index) {
var renderedChild = (0, _instantiateComponent2.default)(element);
var name = (0, _getElementKeyName2.default)(renderedChildren, element, index);
renderedChildren[name] = renderedChild;
renderedChild._mountIndex = index;
// Mount
var mountImage = renderedChild.mountComponent(_this.getNativeNode(), context);
return mountImage;
});
return renderedChildrenImage;
}
}, {
key: 'unmountChildren',
value: function unmountChildren(notRemoveChild) {
var renderedChildren = this._renderedChildren;
if (renderedChildren) {
for (var name in renderedChildren) {
var renderedChild = renderedChildren[name];
renderedChild.unmountComponent(notRemoveChild);
}
this._renderedChildren = null;
}
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
if (this._nativeNode) {
var ref = this._currentElement.ref;
if (ref) {
_ref2.default.detach(this._currentElement._owner, ref, this);
}
_instance2.default.remove(this._nativeNode);
if (!notRemoveChild) {
_host2.default.driver.removeChild(this._nativeNode, this._parent);
}
_host2.default.driver.removeAllEventListeners(this._nativeNode);
}
this.unmountChildren(notRemoveChild);
_host2.default.hook.Reconciler.unmountComponent(this);
this._currentElement = null;
this._nativeNode = null;
this._parent = null;
this._context = null;
this._instance = null;
this._prevStyleCopy = null;
}
}, {
key: 'updateComponent',
value: function updateComponent(prevElement, nextElement, prevContext, nextContext) {
// Replace current element
this._currentElement = nextElement;
_ref2.default.update(prevElement, nextElement, this);
var prevProps = prevElement.props;
var nextProps = nextElement.props;
this.updateProperties(prevProps, nextProps);
this.updateChildren(nextProps.children, nextContext);
_host2.default.hook.Reconciler.receiveComponent(this);
}
}, {
key: 'updateProperties',
value: function updateProperties(prevProps, nextProps) {
var this$1 = this;
var propKey = void 0;
var styleName = void 0;
var styleUpdates = void 0;
for (propKey in prevProps) {
if (propKey === CHILDREN || nextProps.hasOwnProperty(propKey) || !prevProps.hasOwnProperty(propKey) || prevProps[propKey] == null) {
continue;
}
if (propKey === STYLE) {
var lastStyle = this$1._prevStyleCopy;
for (styleName in lastStyle) {
if (lastStyle.hasOwnProperty(styleName)) {
styleUpdates = styleUpdates || {};
styleUpdates[styleName] = '';
}
}
this$1._prevStyleCopy = null;
} else if (EVENT_PREFIX_REGEXP.test(propKey)) {
if (typeof prevProps[propKey] === 'function') {
_host2.default.driver.removeEventListener(this$1.getNativeNode(), propKey.slice(2).toLowerCase(), prevProps[propKey]);
}
} else {
_host2.default.driver.removeAttribute(this$1.getNativeNode(), propKey, prevProps[propKey]);
}
}
for (propKey in nextProps) {
var nextProp = nextProps[propKey];
var prevProp = propKey === STYLE ? this$1._prevStyleCopy : prevProps != null ? prevProps[propKey] : undefined;
if (propKey === CHILDREN || !nextProps.hasOwnProperty(propKey) || nextProp === prevProp || nextProp == null && prevProp == null) {
continue;
}
// Update style
if (propKey === STYLE) {
if (nextProp) {
// Clone property
nextProp = this$1._prevStyleCopy = Object.assign({}, nextProp);
} else {
this$1._prevStyleCopy = null;
}
if (prevProp != null) {
// Unset styles on `prevProp` but not on `nextProp`.
for (styleName in prevProp) {
if (prevProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
styleUpdates = styleUpdates || {};
styleUpdates[styleName] = '';
}
}
// Update styles that changed since `prevProp`.
for (styleName in nextProp) {
if (nextProp.hasOwnProperty(styleName) && prevProp[styleName] !== nextProp[styleName]) {
styleUpdates = styleUpdates || {};
styleUpdates[styleName] = nextProp[styleName];
}
}
} else {
// Assign next prop when prev style is null
styleUpdates = nextProp;
}
// Update event binding
} else if (EVENT_PREFIX_REGEXP.test(propKey)) {
if (typeof prevProp === 'function') {
_host2.default.driver.removeEventListener(this$1.getNativeNode(), propKey.slice(2).toLowerCase(), prevProp);
}
if (typeof nextProp === 'function') {
_host2.default.driver.addEventListener(this$1.getNativeNode(), propKey.slice(2).toLowerCase(), nextProp);
}
// Update other property
} else {
var payload = {};
payload[propKey] = nextProp;
if (nextProp != null) {
_host2.default.driver.setAttribute(this$1.getNativeNode(), propKey, nextProp);
} else {
_host2.default.driver.removeAttribute(this$1.getNativeNode(), propKey, prevProps[propKey]);
}
}
}
if (styleUpdates) {
_host2.default.driver.setStyles(this.getNativeNode(), styleUpdates);
}
}
}, {
key: 'updateChildren',
value: function updateChildren(nextChildrenElements, context) {
var _this2 = this;
// prev rendered children
var prevChildren = this._renderedChildren;
if (nextChildrenElements == null && prevChildren == null) {
return;
}
var nextChildren = {};
var oldNodes = {};
if (nextChildrenElements != null) {
if (!Array.isArray(nextChildrenElements)) {
nextChildrenElements = [nextChildrenElements];
}
// Update next children elements
for (var index = 0, length = nextChildrenElements.length; index < length; index++) {
var nextElement = nextChildrenElements[index];
var name = (0, _getElementKeyName2.default)(nextChildren, nextElement, index);
var prevChild = prevChildren && prevChildren[name];
var prevElement = prevChild && prevChild._currentElement;
if (prevChild != null && (0, _shouldUpdateComponent2.default)(prevElement, nextElement)) {
// Pass the same context when updating chidren
prevChild.updateComponent(prevElement, nextElement, context, context);
nextChildren[name] = prevChild;
} else {
// Unmount the prevChild when nextChild is different element type.
if (prevChild) {
var oldNativeNode = prevChild.getNativeNode();
// Delay remove child
prevChild.unmountComponent(true);
oldNodes[name] = oldNativeNode;
}
// The child must be instantiated before it's mounted.
nextChildren[name] = (0, _instantiateComponent2.default)(nextElement);
}
}
}
var firstPrevChild = void 0;
var delayRemoveFirstPrevChild = void 0;
// Unmount children that are no longer present.
if (prevChildren != null) {
for (var _name in prevChildren) {
if (!prevChildren.hasOwnProperty(_name)) {
continue;
}
var _prevChild = prevChildren[_name];
var shouldRemove = !nextChildren[_name];
// Store old first child ref for append node ahead and maybe delay remove it
if (!firstPrevChild) {
firstPrevChild = _prevChild;
delayRemoveFirstPrevChild = shouldRemove;
} else if (shouldRemove) {
_prevChild.unmountComponent();
}
}
}
if (nextChildren != null) {
(function () {
// `nextIndex` will increment for each child in `nextChildren`, but
// `lastIndex` will be the last index visited in `prevChildren`.
var lastIndex = 0;
var nextIndex = 0;
var lastPlacedNode = null;
var nextNativeNode = [];
var _loop = function _loop(_name2) {
if (!nextChildren.hasOwnProperty(_name2)) {
return 'continue';
}
var nextChild = nextChildren[_name2];
var prevChild = prevChildren && prevChildren[_name2];
if (prevChild === nextChild) {
var prevChildNativeNode = prevChild.getNativeNode();
// Convert to array type
if (!Array.isArray(prevChildNativeNode)) {
prevChildNativeNode = [prevChildNativeNode];
}
// If the index of `child` is less than `lastIndex`, then it needs to
// be moved. Otherwise, we do not need to move it because a child will be
// inserted or moved before `child`.
if (prevChild._mountIndex < lastIndex) {
// Get the last child
if (Array.isArray(lastPlacedNode)) {
lastPlacedNode = lastPlacedNode[lastPlacedNode.length - 1];
}
for (var _i = prevChildNativeNode.length - 1; _i >= 0; _i--) {
_host2.default.driver.insertAfter(prevChildNativeNode[_i], lastPlacedNode);
}
}
nextNativeNode = nextNativeNode.concat(prevChildNativeNode);
lastIndex = Math.max(prevChild._mountIndex, lastIndex);
prevChild._mountIndex = nextIndex;
} else {
if (prevChild != null) {
// Update `lastIndex` before `_mountIndex` gets unset by unmounting.
lastIndex = Math.max(prevChild._mountIndex, lastIndex);
}
var parent = _this2.getNativeNode();
// Fragment extended native component, so if parent is fragment should get this._parent
if (Array.isArray(parent)) {
parent = _this2._parent;
}
nextChild.mountComponent(parent, context, function (newChild, parent) {
// TODO: Rework the duplicate code
var oldChild = oldNodes[_name2];
if (!Array.isArray(newChild)) {
newChild = [newChild];
}
if (oldChild) {
// The oldChild or newChild all maybe fragment
if (!Array.isArray(oldChild)) {
oldChild = [oldChild];
}
// If newChild count large then oldChild
var lastNewChild = void 0;
for (var _i2 = 0; _i2 < newChild.length; _i2++) {
var child = newChild[_i2];
if (oldChild[_i2]) {
_host2.default.driver.replaceChild(child, oldChild[_i2]);
} else {
_host2.default.driver.insertAfter(child, lastNewChild);
}
lastNewChild = child;
}
// If newChild count less then oldChild
if (newChild.length < oldChild.length) {
for (var _i3 = newChild.length; _i3 < oldChild.length; _i3++) {
_host2.default.driver.removeChild(oldChild[_i3]);
}
}
} else {
// Insert child at a specific index
// Get the last child
if (Array.isArray(lastPlacedNode)) {
lastPlacedNode = lastPlacedNode[lastPlacedNode.length - 1];
}
var prevFirstNativeNode = void 0;
if (firstPrevChild && !lastPlacedNode) {
prevFirstNativeNode = firstPrevChild.getNativeNode();
if (Array.isArray(prevFirstNativeNode)) {
prevFirstNativeNode = prevFirstNativeNode[0];
}
}
for (var _i4 = newChild.length - 1; _i4 >= 0; _i4--) {
var _child = newChild[_i4];
if (lastPlacedNode) {
_host2.default.driver.insertAfter(_child, lastPlacedNode);
} else if (prevFirstNativeNode) {
_host2.default.driver.insertBefore(_child, prevFirstNativeNode);
} else {
_host2.default.driver.appendChild(_child, parent);
}
}
}
nextNativeNode = nextNativeNode.concat(newChild);
});
nextChild._mountIndex = nextIndex;
}
nextIndex++;
lastPlacedNode = nextChild.getNativeNode();
};
for (var _name2 in nextChildren) {
var _ret2 = _loop(_name2);
if (_ret2 === 'continue') { continue; }
}
// Sync update native refs
if (Array.isArray(_this2._nativeNode)) {
// Clear all and push the new array
_this2._nativeNode.splice(0, _this2._nativeNode.length);
for (var i = 0; i < nextNativeNode.length; i++) {
_this2._nativeNode.push(nextNativeNode[i]);
}
}
})();
}
if (delayRemoveFirstPrevChild) {
firstPrevChild.unmountComponent();
}
this._renderedChildren = nextChildren;
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
if (this._nativeNode == null) {
this._nativeNode = _host2.default.driver.createElement(this._instance);
_instance2.default.set(this._nativeNode, this._instance);
}
return this._nativeNode;
}
}, {
key: 'getPublicInstance',
value: function getPublicInstance() {
return this.getNativeNode();
}
}, {
key: 'getName',
value: function getName() {
return this._currentElement.type;
}
}]);
return NativeComponent;
}();
exports.default = NativeComponent;
module.exports = exports['default'];
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
/*
* Ref manager
*/
exports.default = {
update: function update(prevElement, nextElement, component) {
var prevRef = prevElement != null && prevElement.ref;
var nextRef = nextElement != null && nextElement.ref;
// Update refs in owner component
if (prevRef !== nextRef) {
// Detach prev RenderedElement's ref
prevRef != null && this.detach(prevElement._owner, prevRef, component);
// Attach next RenderedElement's ref
nextRef != null && this.attach(nextElement._owner, nextRef, component);
}
},
attach: function attach(ownerComponent, ref, component) {
if (!ownerComponent) {
throw new Error('You might be adding a ref to a component that was not created inside a component\'s ' + '`render` method, or you have multiple copies of Rax loaded.');
}
var instance = component.getPublicInstance();
if (typeof ref === 'function') {
ref(instance);
} else {
ownerComponent._instance.refs[ref] = instance;
}
},
detach: function detach(ownerComponent, ref, component) {
if (typeof ref === 'function') {
// When the referenced component is unmounted and whenever the ref changes, the old ref will be called with null as an argument.
ref(null);
} else {
// Must match component and ref could detach the ref on owner when A's before ref is B's current ref
var instance = component.getPublicInstance();
if (ownerComponent._instance.refs[ref] === instance) {
delete ownerComponent._instance.refs[ref];
}
}
}
};
module.exports = exports['default'];
/***/ }),
/* 11 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = function (children, element, index) {
var elementKey = element && element.key;
var hasKey = typeof elementKey === 'string';
var defaultName = '.' + index.toString(36);
if (hasKey) {
var keyName = '$' + elementKey;
// Child keys must be unique.
var keyUnique = children[keyName] === undefined;
// Only the first child will be used when encountered two children with the same key
if (!keyUnique) { console.warn('Encountered two children with the same key "' + elementKey + '".'); }
return keyUnique ? keyName : defaultName;
} else {
return defaultName;
}
};
module.exports = exports['default'];
/***/ }),
/* 12 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isRem = isRem;
exports.calcRem = calcRem;
exports.getRem = getRem;
exports.setRem = setRem;
exports.isUnitNumber = isUnitNumber;
exports.convertUnit = convertUnit;
/**
* CSS properties which accept numbers but are not in units of "px".
*/
var UNITLESS_NUMBER_PROPS = {
animationIterationCount: true,
borderImageOutset: true,
borderImageSlice: true,
borderImageWidth: true,
boxFlex: true,
boxFlexGroup: true,
boxOrdinalGroup: true,
columnCount: true,
flex: true,
flexGrow: true,
flexPositive: true,
flexShrink: true,
flexNegative: true,
flexOrder: true,
gridRow: true,
gridColumn: true,
fontWeight: true,
lineClamp: true,
// We make lineHeight default is px that is diff with w3c spec
// lineHeight: true,
opacity: true,
order: true,
orphans: true,
tabSize: true,
widows: true,
zIndex: true,
zoom: true,
// Weex only
lines: true
};
var SUFFIX = 'rem';
var REM_REG = /[-+]?\d*\.?\d+rem/g;
var defaultRem = void 0;
/**
* Is string contains rem
* @param {String} str
* @returns {Boolean}
*/
function isRem(str) {
return typeof str === 'string' && str.indexOf(SUFFIX) !== -1;
}
/**
* Calculate rem to pixels: '1.2rem' => 1.2 * rem
* @param {String} str
* @param {Number} rem
* @returns {number}
*/
function calcRem(str) {
var rem = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultRem;
return str.replace(REM_REG, function (remValue) {
return parseFloat(remValue) * rem + 'px';
});
}
function getRem() {
return defaultRem;
}
function setRem(rem) {
defaultRem = rem;
}
function isUnitNumber(val, prop) {
return typeof val === 'number' && !UNITLESS_NUMBER_PROPS[prop];
}
function convertUnit(val, prop) {
if (prop && isUnitNumber(val, prop)) {
return val * defaultRem + 'px';
} else if (isRem(val)) {
return calcRem(val);
}
return val;
}
/***/ }),
/* 13 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.transformPropsAttrsToStyle = transformPropsAttrsToStyle;
exports.renamePropsAttr = renamePropsAttr;
/**
* transformPropAttrsToStyle
*
* @param {Object} props
* @param {Array} attrs
*/
function transformPropsAttrsToStyle(props, attrs) {
props.style = props.style || {};
attrs.forEach(function (attr) {
if (props[attr] && !props.style[attr]) {
props.style[attr] = props[attr];
delete props[attr];
}
});
return props;
}
/**
* renamePropsAttr
*
* @param {Object} props
* @param {String} originalAttrName
* @param {String} newAttrName
*/
function renamePropsAttr(props, originalAttrName, newAttrName) {
if (props[originalAttrName] && !props[newAttrName]) {
props[newAttrName] = props[originalAttrName];
delete props[originalAttrName];
}
return props;
}
/***/ }),
/* 14 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function findDOMNode(instance) {
if (instance == null) {
return null;
}
// If a native node, weex may not export ownerDocument property
if (instance.ownerDocument || instance.nodeType) {
return instance;
}
// Native component
if (instance._nativeNode) {
return instance._nativeNode;
}
if (typeof instance == 'string') {
return _host2.default.driver.getElementById(instance);
}
if (typeof instance.render !== 'function') {
throw new Error('Appears to be neither Component nor DOMNode.');
}
// Composite component
var internal = instance._internal;
if (internal) {
while (!internal._nativeNode) {
internal = internal._renderedComponent;
// If not mounted
if (internal == null) {
return null;
}
}
return internal._nativeNode;
} else {
throw new Error('findDOMNode was called on an unmounted component.');
}
}
exports.default = findDOMNode;
module.exports = exports['default'];
/***/ }),
/* 15 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.version = exports.setNativeProps = exports.findComponentInstance = exports.unmountComponentAtNode = exports.findDOMNode = exports.render = exports.PropTypes = exports.PureComponent = exports.Component = exports.createFactory = exports.isValidElement = exports.cloneElement = exports.createElement = undefined;
__webpack_require__(16);
var _element = __webpack_require__(7);
var _component = __webpack_require__(5);
var _component2 = _interopRequireDefault(_component);
var _purecomponent = __webpack_require__(19);
var _purecomponent2 = _interopRequireDefault(_purecomponent);
var _proptypes = __webpack_require__(20);
var _proptypes2 = _interopRequireDefault(_proptypes);
var _render2 = __webpack_require__(21);
var _render3 = _interopRequireDefault(_render2);
var _findDOMNode2 = __webpack_require__(14);
var _findDOMNode3 = _interopRequireDefault(_findDOMNode2);
var _unmountComponentAtNode2 = __webpack_require__(8);
var _unmountComponentAtNode3 = _interopRequireDefault(_unmountComponentAtNode2);
var _findComponentInstance2 = __webpack_require__(42);
var _findComponentInstance3 = _interopRequireDefault(_findComponentInstance2);
var _setNativeProps2 = __webpack_require__(43);
var _setNativeProps3 = _interopRequireDefault(_setNativeProps2);
var _version2 = __webpack_require__(44);
var _version3 = _interopRequireDefault(_version2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.createElement = _element.createElement;
exports.cloneElement = _element.cloneElement;
exports.isValidElement = _element.isValidElement;
exports.createFactory = _element.createFactory;
exports.Component = _component2.default;
exports.PureComponent = _purecomponent2.default;
exports.PropTypes = _proptypes2.default;
exports.render = _render3.default;
exports.findDOMNode = _findDOMNode3.default;
exports.unmountComponentAtNode = _unmountComponentAtNode3.default;
exports.findComponentInstance = _findComponentInstance3.default;
exports.setNativeProps = _setNativeProps3.default;
exports.version = _version3.default;
/***/ }),
/* 16 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _hook = __webpack_require__(6);
var _hook2 = _interopRequireDefault(_hook);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') {
__REACT_DEVTOOLS_GLOBAL_HOOK__.inject(_hook2.default);
}
/***/ }),
/* 17 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = flattenChildren;
function traverseChildren(children, result) {
if (Array.isArray(children)) {
for (var i = 0, l = children.length; i < l; i++) {
traverseChildren(children[i], result);
}
} else {
result.push(children);
}
}
function flattenChildren(children) {
if (children == null) {
return children;
}
var result = [];
traverseChildren(children, result);
if (result.length === 1) {
result = result[0];
}
return result;
}
module.exports = exports["default"];
/***/ }),
/* 18 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
var _component = __webpack_require__(5);
var _component2 = _interopRequireDefault(_component);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
var rootCounter = 1;
var Root = function (_Component) {
_inherits(Root, _Component);
function Root() {
var arguments$1 = arguments;
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, Root);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments$1[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Root.__proto__ || Object.getPrototypeOf(Root)).call.apply(_ref, [this].concat(args))), _this), _this.rootID = rootCounter++, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(Root, [{
key: 'isRootComponent',
value: function isRootComponent() {}
}, {
key: 'render',
value: function render() {
return this.props.children;
}
}, {
key: 'getPublicInstance',
value: function getPublicInstance() {
return this.getRenderedComponent().getPublicInstance();
}
}, {
key: 'getRenderedComponent',
value: function getRenderedComponent() {
return this._internal._renderedComponent;
}
}]);
return Root;
}(_component2.default);
exports.default = Root;
module.exports = exports['default'];
/***/ }),
/* 19 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
var _component = __webpack_require__(5);
var _component2 = _interopRequireDefault(_component);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
/**
* Pure component class.
*/
var PureComponent = function (_Component) {
_inherits(PureComponent, _Component);
function PureComponent(props, context) {
_classCallCheck(this, PureComponent);
return _possibleConstructorReturn(this, (PureComponent.__proto__ || Object.getPrototypeOf(PureComponent)).call(this, props, context));
}
_createClass(PureComponent, [{
key: 'isPureComponentClass',
value: function isPureComponentClass() {}
}]);
return PureComponent;
}(_component2.default);
exports.default = PureComponent;
module.exports = exports['default'];
/***/ }),
/* 20 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
/*
* Current PropTypes only export some api with react, not validate in runtime.
*/
function createChainableTypeChecker(validate) {
function checkType(isRequired, props, propName, componentName, location, propFullName) {
return typeChecker;
}
var chainedCheckType = checkType.bind(null, false);
chainedCheckType.isRequired = checkType.bind(null, true);
return chainedCheckType;
}
function createTypeChecker(expectedType) {
function validate(props, propName, componentName, location, propFullName) {
// Noop
}
return createChainableTypeChecker(validate);
}
var typeChecker = createTypeChecker();
exports.default = {
array: typeChecker,
bool: typeChecker,
func: typeChecker,
number: typeChecker,
object: typeChecker,
string: typeChecker,
symbol: typeChecker,
element: typeChecker,
node: typeChecker,
any: typeChecker,
arrayOf: typeChecker,
instanceOf: typeChecker,
objectOf: typeChecker,
oneOf: typeChecker,
oneOfType: typeChecker,
shape: typeChecker
};
module.exports = exports["default"];
/***/ }),
/* 21 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _inject = __webpack_require__(22);
var _inject2 = _interopRequireDefault(_inject);
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function render(element, container, options, callback) {
// Compatible with `render(element, container, callback)`
if (typeof options === 'function') {
callback = options;
options = null;
}
// Init inject
(0, _inject2.default)(options || {});
var rootComponent = _instance2.default.render(element, container);
var component = rootComponent.getPublicInstance();
if (callback) {
callback.call(component);
}
return component;
}
exports.default = render;
module.exports = exports['default'];
/***/ }),
/* 22 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = inject;
var _universalEnv = __webpack_require__(3);
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _empty = __webpack_require__(23);
var _empty2 = _interopRequireDefault(_empty);
var _native = __webpack_require__(9);
var _native2 = _interopRequireDefault(_native);
var _text = __webpack_require__(24);
var _text2 = _interopRequireDefault(_text);
var _composite = __webpack_require__(25);
var _composite2 = _interopRequireDefault(_composite);
var _fragment = __webpack_require__(29);
var _fragment2 = _interopRequireDefault(_fragment);
var _driverWeex = __webpack_require__(30);
var _driverWeex2 = _interopRequireDefault(_driverWeex);
var _driverBrowser = __webpack_require__(40);
var _driverBrowser2 = _interopRequireDefault(_driverBrowser);
var _hook = __webpack_require__(6);
var _hook2 = _interopRequireDefault(_hook);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function inject(_ref) {
var driver = _ref.driver,
hook = _ref.hook,
measurer = _ref.measurer;
// Inject component class
_host2.default.EmptyComponent = _empty2.default;
_host2.default.NativeComponent = _native2.default;
_host2.default.TextComponent = _text2.default;
_host2.default.FragmentComponent = _fragment2.default;
_host2.default.CompositeComponent = _composite2.default;
// Inject devtool hook
_host2.default.hook = hook || _hook2.default;
// Inject performance measurer
_host2.default.measurer = measurer;
// Inject render driver
if (!_host2.default.driver) {
if (!driver) {
if (_universalEnv.isWeex) {
driver = _driverWeex2.default;
} else if (_universalEnv.isWeb) {
driver = _driverBrowser2.default;
} else {
throw Error('No builtin driver matched');
}
}
_host2.default.driver = driver;
}
}
module.exports = exports['default'];
/***/ }),
/* 23 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Empty Component
*/
var EmptyComponent = function () {
function EmptyComponent() {
_classCallCheck(this, EmptyComponent);
this._currentElement = null;
}
_createClass(EmptyComponent, [{
key: 'mountComponent',
value: function mountComponent(parent, context, childMounter) {
this._parent = parent;
this._context = context;
var instance = {
_internal: this
};
var nativeNode = this.getNativeNode();
if (childMounter) {
childMounter(nativeNode, parent);
} else {
_host2.default.driver.appendChild(nativeNode, parent);
}
return instance;
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
if (this._nativeNode && !notRemoveChild) {
_host2.default.driver.removeChild(this._nativeNode, this._parent);
}
this._nativeNode = null;
this._parent = null;
this._context = null;
}
}, {
key: 'updateComponent',
value: function updateComponent() {
// Noop
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
// Weex native node
if (this._nativeNode == null) {
this._nativeNode = _host2.default.driver.createEmpty();
}
return this._nativeNode;
}
}]);
return EmptyComponent;
}();
exports.default = EmptyComponent;
module.exports = exports['default'];
/***/ }),
/* 24 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Text Component
*/
var TextComponent = function () {
function TextComponent(element) {
_classCallCheck(this, TextComponent);
this._currentElement = element;
this._stringText = String(element);
}
_createClass(TextComponent, [{
key: 'mountComponent',
value: function mountComponent(parent, context, childMounter) {
this._parent = parent;
this._context = context;
this._mountID = _host2.default.mountID++;
// Weex dom operation
var nativeNode = this.getNativeNode();
if (childMounter) {
childMounter(nativeNode, parent);
} else {
_host2.default.driver.appendChild(nativeNode, parent);
}
var instance = {
_internal: this
};
_host2.default.hook.Reconciler.mountComponent(this);
return instance;
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
if (this._nativeNode && !notRemoveChild) {
_host2.default.driver.removeChild(this._nativeNode, this._parent);
}
_host2.default.hook.Reconciler.unmountComponent(this);
this._currentElement = null;
this._nativeNode = null;
this._parent = null;
this._context = null;
this._stringText = null;
}
}, {
key: 'updateComponent',
value: function updateComponent(prevElement, nextElement, context) {
// If some text do noting
if (prevElement !== nextElement) {
// Replace current element
this._currentElement = nextElement;
// Devtool read the latest stringText value
this._stringText = String(nextElement);
_host2.default.driver.updateText(this.getNativeNode(), this._stringText);
_host2.default.hook.Reconciler.receiveComponent(this);
}
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
if (this._nativeNode == null) {
this._nativeNode = _host2.default.driver.createText(this._stringText);
}
return this._nativeNode;
}
}]);
return TextComponent;
}();
exports.default = TextComponent;
module.exports = exports['default'];
/***/ }),
/* 25 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
var _stateless = __webpack_require__(26);
var _stateless2 = _interopRequireDefault(_stateless);
var _updater = __webpack_require__(27);
var _updater2 = _interopRequireDefault(_updater);
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _ref = __webpack_require__(10);
var _ref2 = _interopRequireDefault(_ref);
var _instantiateComponent = __webpack_require__(2);
var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
var _shouldUpdateComponent = __webpack_require__(4);
var _shouldUpdateComponent2 = _interopRequireDefault(_shouldUpdateComponent);
var _shallowEqual = __webpack_require__(28);
var _shallowEqual2 = _interopRequireDefault(_shallowEqual);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function performInSandbox(fn, handleError) {
try {
return fn();
} catch (e) {
if (handleError) {
handleError(e);
} else {
if (_host2.default.sandbox) {
setTimeout(function () {
throw e;
}, 0);
} else {
throw e;
}
}
}
}
var measureLifeCycle = void 0;
var CompositeComponent = function () {
function CompositeComponent(element) {
_classCallCheck(this, CompositeComponent);
this._currentElement = element;
}
_createClass(CompositeComponent, [{
key: 'getName',
value: function getName() {
var type = this._currentElement.type;
var constructor = this._instance && this._instance.constructor;
return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null;
}
}, {
key: 'mountComponent',
value: function mountComponent(parent, context, childMounter) {
var _this = this;
this._parent = parent;
this._context = context;
this._mountID = _host2.default.mountID++;
this._updateCount = 0;
var Component = this._currentElement.type;
var publicProps = this._currentElement.props;
var isClass = Component.prototype;
var isComponentClass = isClass && Component.prototype.isComponentClass;
// Class stateless component without state but have lifecycles
var isStatelessClass = isClass && Component.prototype.render;
// Context process
var publicContext = this._processContext(context);
// Initialize the public class
var instance = void 0;
var renderedElement = void 0;
if (isComponentClass || isStatelessClass) {
// Component instance
instance = new Component(publicProps, publicContext, _updater2.default);
} else if (typeof Component === 'function') {
// Functional stateless component without state and lifecycles
instance = new _stateless2.default(Component);
} else {
throw Error('Invalid component type ' + JSON.stringify(Component));
}
// These should be set up in the constructor, but as a convenience for
// simpler class abstractions, we set them up after the fact.
instance.props = publicProps;
instance.context = publicContext;
instance.refs = {};
// Inject the updater into instance
instance.updater = _updater2.default;
instance._internal = this;
this._instance = instance;
// Init state, must be set to an object or null
var initialState = instance.state;
if (initialState === undefined) {
// TODO clone the state?
instance.state = initialState = null;
}
performInSandbox(function () {
if (instance.componentWillMount) {
{
instance.componentWillMount();
}
}
});
if (renderedElement == null) {
_host2.default.component = this;
// Process pending state when call setState in componentWillMount
instance.state = this._processPendingState(publicProps, publicContext);
// FIXME: handleError should named as lifecycles
var handleError = void 0;
if (typeof instance.handleError === 'function') {
handleError = function handleError(e) {
instance.handleError(e);
};
}
performInSandbox(function () {
{
renderedElement = instance.render();
}
}, handleError);
_host2.default.component = null;
}
this._renderedComponent = (0, _instantiateComponent2.default)(renderedElement);
this._renderedComponent.mountComponent(this._parent, this._processChildContext(context), childMounter);
if (this._currentElement && this._currentElement.ref) {
_ref2.default.attach(this._currentElement._owner, this._currentElement.ref, this);
}
performInSandbox(function () {
if (instance.componentDidMount) {
{
instance.componentDidMount();
}
}
});
_host2.default.hook.Reconciler.mountComponent(this);
return instance;
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
var instance = this._instance;
performInSandbox(function () {
if (instance.componentWillUnmount) {
instance.componentWillUnmount();
}
});
_host2.default.hook.Reconciler.unmountComponent(this);
instance._internal = null;
if (this._renderedComponent != null) {
var ref = this._currentElement.ref;
if (ref) {
_ref2.default.detach(this._currentElement._owner, ref, this);
}
this._renderedComponent.unmountComponent(notRemoveChild);
this._renderedComponent = null;
this._instance = null;
}
this._currentElement = null;
// Reset pending fields
// Even if this component is scheduled for another update in ReactUpdates,
// it would still be ignored because these fields are reset.
this._pendingStateQueue = null;
this._pendingForceUpdate = false;
// These fields do not really need to be reset since this object is no
// longer accessible.
this._context = null;
}
/**
* Filters the context object to only contain keys specified in
* `contextTypes`
*/
}, {
key: '_processContext',
value: function _processContext(context) {
var Component = this._currentElement.type;
var contextTypes = Component.contextTypes;
if (!contextTypes) {
return {};
}
var maskedContext = {};
for (var contextName in contextTypes) {
maskedContext[contextName] = context[contextName];
}
return maskedContext;
}
}, {
key: '_processChildContext',
value: function _processChildContext(currentContext) {
var instance = this._instance;
var childContext = instance.getChildContext && instance.getChildContext();
if (childContext) {
return Object.assign({}, currentContext, childContext);
}
return currentContext;
}
}, {
key: '_processPendingState',
value: function _processPendingState(props, context) {
var instance = this._instance;
var queue = this._pendingStateQueue;
if (!queue) {
return instance.state;
}
// Reset pending queue
this._pendingStateQueue = null;
var nextState = Object.assign({}, instance.state);
for (var i = 0; i < queue.length; i++) {
var partial = queue[i];
Object.assign(nextState, typeof partial === 'function' ? partial.call(instance, nextState, props, context) : partial);
}
return nextState;
}
}, {
key: 'updateComponent',
value: function updateComponent(prevElement, nextElement, prevUnmaskedContext, nextUnmaskedContext) {
var instance = this._instance;
if (!instance) {
console.error('Update component \'' + this.getName() + '\' that has already been unmounted (or failed to mount).');
}
var willReceive = false;
var nextContext = void 0;
var nextProps = void 0;
// Determine if the context has changed or not
if (this._context === nextUnmaskedContext) {
nextContext = instance.context;
} else {
nextContext = this._processContext(nextUnmaskedContext);
willReceive = true;
}
// Distinguish between a props update versus a simple state update
if (prevElement === nextElement) {
// Skip checking prop types again -- we don't read component.props to avoid
// warning for DOM component props in this upgrade
nextProps = nextElement.props;
} else {
nextProps = nextElement.props;
willReceive = true;
}
var hasReceived = willReceive && instance.componentWillReceiveProps;
if (hasReceived) {
// Calling this.setState() within componentWillReceiveProps will not trigger an additional render.
this._pendingState = true;
performInSandbox(function () {
instance.componentWillReceiveProps(nextProps, nextContext);
});
this._pendingState = false;
}
// Update refs
_ref2.default.update(prevElement, nextElement, this);
// Shoud update always default
var shouldUpdate = true;
var prevProps = instance.props;
var prevState = instance.state;
// TODO: could delay execution processPendingState
var nextState = this._processPendingState(nextProps, nextContext);
// ShouldComponentUpdate is not called when forceUpdate is used
if (!this._pendingForceUpdate) {
if (instance.shouldComponentUpdate) {
shouldUpdate = performInSandbox(function () {
return instance.shouldComponentUpdate(nextProps, nextState, nextContext);
});
} else if (instance.isPureComponentClass) {
shouldUpdate = !(0, _shallowEqual2.default)(prevProps, nextProps) || !(0, _shallowEqual2.default)(prevState, nextState);
}
}
if (shouldUpdate) {
this._pendingForceUpdate = false;
// Will set `this.props`, `this.state` and `this.context`.
var prevContext = instance.context;
// Cannot use this.setState() in componentWillUpdate.
// If need to update state in response to a prop change, use componentWillReceiveProps instead.
performInSandbox(function () {
if (instance.componentWillUpdate) {
instance.componentWillUpdate(nextProps, nextState, nextContext);
}
});
// Replace with next
this._currentElement = nextElement;
this._context = nextUnmaskedContext;
instance.props = nextProps;
instance.state = nextState;
instance.context = nextContext;
this._updateRenderedComponent(nextUnmaskedContext);
performInSandbox(function () {
if (instance.componentDidUpdate) {
instance.componentDidUpdate(prevProps, prevState, prevContext);
}
});
this._updateCount++;
} else {
// If it's determined that a component should not update, we still want
// to set props and state but we shortcut the rest of the update.
this._currentElement = nextElement;
this._context = nextUnmaskedContext;
instance.props = nextProps;
instance.state = nextState;
instance.context = nextContext;
}
// Flush setState callbacks set in componentWillReceiveProps
if (hasReceived) {
var callbacks = this._pendingCallbacks;
this._pendingCallbacks = null;
_updater2.default.runCallbacks(callbacks, instance);
}
_host2.default.hook.Reconciler.receiveComponent(this);
}
/**
* Call the component's `render` method and update the DOM accordingly.
*/
}, {
key: '_updateRenderedComponent',
value: function _updateRenderedComponent(context) {
var _this2 = this;
var prevRenderedComponent = this._renderedComponent;
var prevRenderedElement = prevRenderedComponent._currentElement;
var instance = this._instance;
var nextRenderedElement = void 0;
_host2.default.component = this;
performInSandbox(function () {
{
nextRenderedElement = instance.render();
}
});
_host2.default.component = null;
if ((0, _shouldUpdateComponent2.default)(prevRenderedElement, nextRenderedElement)) {
prevRenderedComponent.updateComponent(prevRenderedElement, nextRenderedElement, prevRenderedComponent._context, this._processChildContext(context));
} else {
var oldChild = prevRenderedComponent.getNativeNode();
prevRenderedComponent.unmountComponent(true);
this._renderedComponent = (0, _instantiateComponent2.default)(nextRenderedElement);
this._renderedComponent.mountComponent(this._parent, this._processChildContext(context), function (newChild, parent) {
// TODO: Duplicate code in native component file
if (!Array.isArray(newChild)) {
newChild = [newChild];
}
// oldChild or newChild all maybe fragment
if (!Array.isArray(oldChild)) {
oldChild = [oldChild];
}
// If newChild count large then oldChild
var lastNewChild = void 0;
for (var i = 0; i < newChild.length; i++) {
var child = newChild[i];
if (oldChild[i]) {
_host2.default.driver.replaceChild(child, oldChild[i]);
} else {
_host2.default.driver.insertAfter(child, lastNewChild);
}
lastNewChild = child;
}
// If newChild count less then oldChild
if (newChild.length < oldChild.length) {
for (var _i = newChild.length; _i < oldChild.length; _i++) {
_host2.default.driver.removeChild(oldChild[_i]);
}
}
});
}
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
var renderedComponent = this._renderedComponent;
if (renderedComponent) {
return renderedComponent.getNativeNode();
}
}
}, {
key: 'getPublicInstance',
value: function getPublicInstance() {
var instance = this._instance;
// The Stateless components cannot be given refs
if (instance instanceof _stateless2.default) {
return null;
}
return instance;
}
}]);
return CompositeComponent;
}();
exports.default = CompositeComponent;
module.exports = exports['default'];
/***/ }),
/* 26 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/**
* Stateless Component Class Wrapper
*/
var StatelessComponent = function () {
function StatelessComponent(pureRender) {
_classCallCheck(this, StatelessComponent);
// A stateless function
this.pureRender = pureRender;
}
_createClass(StatelessComponent, [{
key: 'render',
value: function render() {
return this.pureRender(this.props, this.context);
}
}]);
return StatelessComponent;
}();
exports.default = StatelessComponent;
module.exports = exports['default'];
/***/ }),
/* 27 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function enqueueCallback(internal, callback) {
if (callback) {
var callbackQueue = internal._pendingCallbacks || (internal._pendingCallbacks = []);
callbackQueue.push(callback);
}
}
function enqueueState(internal, partialState) {
if (partialState) {
var stateQueue = internal._pendingStateQueue || (internal._pendingStateQueue = []);
stateQueue.push(partialState);
}
}
var Updater = {
setState: function setState(component, partialState, callback) {
var internal = component._internal;
if (!internal) {
return;
}
enqueueState(internal, partialState);
enqueueCallback(internal, callback);
if (!internal._pendingState) {
this.runUpdate(component);
}
},
forceUpdate: function forceUpdate(component, callback) {
var internal = component._internal;
if (!internal) {
return;
}
internal._pendingForceUpdate = true;
enqueueCallback(internal, callback);
this.runUpdate(component);
},
runUpdate: function runUpdate(component) {
var internal = component._internal;
if (!internal || !internal._renderedComponent) {
return;
}
// If updateComponent happens to enqueue any new updates, we
// shouldn't execute the callbacks until the next render happens, so
// stash the callbacks first
var callbacks = internal._pendingCallbacks;
internal._pendingCallbacks = null;
var prevElement = internal._currentElement;
var prevUnmaskedContext = internal._context;
if (internal._pendingStateQueue || internal._pendingForceUpdate) {
internal.updateComponent(prevElement, prevElement, prevUnmaskedContext, prevUnmaskedContext);
}
this.runCallbacks(callbacks, component);
},
runCallbacks: function runCallbacks(callbacks, context) {
if (callbacks) {
for (var i = 0; i < callbacks.length; i++) {
callbacks[i].call(context);
}
}
}
};
exports.default = Updater;
module.exports = exports["default"];
/***/ }),
/* 28 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var hasOwnProperty = Object.prototype.hasOwnProperty;
/**
* inlined Object.is polyfill to avoid requiring consumers ship their own
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
*/
function is(x, y) {
// SameValue algorithm
if (x === y) {
// Steps 1-5, 7-10
// Steps 6.b-6.e: +0 != -0
return x !== 0 || 1 / x === 1 / y;
} else {
// Step 6.a: NaN == NaN
return x !== x && y !== y;
}
}
/**
* Performs equality by iterating through keys on an object and returning false
* when any key has values which are not strictly equal between the arguments.
* Returns true when the values of all keys are strictly equal.
*/
function shallowEqual(objA, objB) {
if (is(objA, objB)) {
return true;
}
if ((typeof objA === 'undefined' ? 'undefined' : _typeof(objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : _typeof(objB)) !== 'object' || objB === null) {
return false;
}
var keysA = Object.keys(objA);
var keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
// Test for A's keys different from B.
for (var i = 0; i < keysA.length; i++) {
if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
return false;
}
}
return true;
}
exports.default = shallowEqual;
module.exports = exports['default'];
/***/ }),
/* 29 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _native = __webpack_require__(9);
var _native2 = _interopRequireDefault(_native);
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
var _instantiateComponent = __webpack_require__(2);
var _instantiateComponent2 = _interopRequireDefault(_instantiateComponent);
var _getElementKeyName = __webpack_require__(11);
var _getElementKeyName2 = _interopRequireDefault(_getElementKeyName);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
/**
* Fragment Component
*/
var FragmentComponent = function (_NativeComponent) {
_inherits(FragmentComponent, _NativeComponent);
function FragmentComponent(element) {
_classCallCheck(this, FragmentComponent);
return _possibleConstructorReturn(this, (FragmentComponent.__proto__ || Object.getPrototypeOf(FragmentComponent)).call(this, element));
}
_createClass(FragmentComponent, [{
key: 'mountComponent',
value: function mountComponent(parent, context, childMounter) {
// Parent native element
this._parent = parent;
this._context = context;
this._mountID = _host2.default.mountID++;
var instance = {
_internal: this
};
this._instance = instance;
var fragment = this.getNativeNode();
var children = this._currentElement;
// Process children
this.mountChildren(children, context);
if (childMounter) {
childMounter(fragment, parent);
} else {
var isFragmentParent = Array.isArray(parent);
for (var i = 0; i < fragment.length; i++) {
var child = fragment[i];
// When the parent is also a fragment
if (isFragmentParent) {
parent.push(child);
} else {
_host2.default.driver.appendChild(child, parent);
}
}
}
return instance;
}
}, {
key: 'mountChildren',
value: function mountChildren(children, context) {
var _this2 = this;
var renderedChildren = this._renderedChildren = {};
var fragment = this.getNativeNode();
var renderedChildrenImage = children.map(function (element, index) {
var renderedChild = (0, _instantiateComponent2.default)(element);
var name = (0, _getElementKeyName2.default)(renderedChildren, element, index);
renderedChildren[name] = renderedChild;
renderedChild._mountIndex = index;
// Mount
var mountImage = renderedChild.mountComponent(_this2._parent, context, function (nativeNode) {
if (Array.isArray(nativeNode)) {
for (var i = 0; i < nativeNode.length; i++) {
fragment.push(nativeNode[i]);
}
} else {
fragment.push(nativeNode);
}
});
return mountImage;
});
return renderedChildrenImage;
}
}, {
key: 'unmountComponent',
value: function unmountComponent(notRemoveChild) {
var this$1 = this;
if (this._nativeNode) {
_instance2.default.remove(this._nativeNode);
if (!notRemoveChild) {
for (var i = 0; i < this._nativeNode.length; i++) {
_host2.default.driver.removeChild(this$1._nativeNode[i]);
}
}
}
// Do not need remove child when their parent is removed
this.unmountChildren(true);
this._currentElement = null;
this._nativeNode = null;
this._parent = null;
this._context = null;
this._instance = null;
}
}, {
key: 'updateComponent',
value: function updateComponent(prevElement, nextElement, prevContext, nextContext) {
// Replace current element
this._currentElement = nextElement;
this.updateChildren(this._currentElement, nextContext);
}
}, {
key: 'getNativeNode',
value: function getNativeNode() {
if (this._nativeNode == null) {
this._nativeNode = [];
}
return this._nativeNode;
}
}, {
key: 'getPublicInstance',
value: function getPublicInstance() {
return this.getNativeNode();
}
}, {
key: 'getName',
value: function getName() {
return 'fragment';
}
}]);
return FragmentComponent;
}(_native2.default);
exports.default = FragmentComponent;
module.exports = exports['default'];
/***/ }),
/* 30 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
}; /**
* Weex driver
*/
var _styleUnit = __webpack_require__(12);
var _elements = __webpack_require__(31);
var _elements2 = _interopRequireDefault(_elements);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
var STYLE = 'style';
var ID = 'id';
var TEXT = 'text';
var CHILDREN = 'children';
var EVENT_PREFIX_REGEXP = /^on[A-Z]/;
var FULL_WIDTH_REM = 750;
var ARIA_PREFIX_REGEXP = /^aria-/;
var nodeMaps = {};
/* global __weex_document__ */
var document = (typeof __weex_document__ === 'undefined' ? 'undefined' : _typeof(__weex_document__)) === 'object' ? __weex_document__ : (typeof document === 'undefined' ? 'undefined' : _typeof(document)) === 'object' ? document : null;
var Driver = {
getElementById: function getElementById(id) {
return nodeMaps[id];
},
createBody: function createBody() {
if (document.body) {
return document.body;
}
var documentElement = document.documentElement;
var body = document.createBody();
documentElement.appendChild(body);
return body;
},
createComment: function createComment(content) {
return document.createComment(content);
},
createEmpty: function createEmpty() {
return this.createComment(' empty ');
},
createText: function createText(text) {
return Driver.createElement({
type: TEXT,
props: {
value: text
}
});
},
updateText: function updateText(node, content) {
this.setAttribute(node, 'value', content);
},
createElement: function createElement(component) {
var htmlElement = _elements2.default[component.type];
if (htmlElement) {
component = htmlElement.parse(component);
}
var props = component.props;
var events = [];
var style = {};
var originStyle = props[STYLE];
for (var prop in originStyle) {
style[prop] = (0, _styleUnit.convertUnit)(originStyle[prop], prop);
}
var node = document.createElement(component.type, {
style: style
});
this.setNativeProps(node, props, true);
return node;
},
appendChild: function appendChild(node, parent) {
return parent.appendChild(node);
},
removeChild: function removeChild(node, parent) {
parent = parent || node.parentNode;
var id = node.attr && node.attr[ID];
if (id != null) {
nodeMaps[id] = null;
}
return parent.removeChild(node);
},
replaceChild: function replaceChild(newChild, oldChild, parent) {
parent = parent || oldChild.parentNode;
var previousSibling = oldChild.previousSibling;
var nextSibling = oldChild.nextSibling;
this.removeChild(oldChild, parent);
if (previousSibling) {
this.insertAfter(newChild, previousSibling, parent);
} else if (nextSibling) {
this.insertBefore(newChild, nextSibling, parent);
} else {
this.appendChild(newChild, parent);
}
},
insertAfter: function insertAfter(node, after, parent) {
parent = parent || after.parentNode;
return parent.insertAfter(node, after);
},
insertBefore: function insertBefore(node, before, parent) {
parent = parent || before.parentNode;
return parent.insertBefore(node, before);
},
addEventListener: function addEventListener(node, eventName, eventHandler) {
return node.addEvent(eventName, eventHandler);
},
removeEventListener: function removeEventListener(node, eventName, eventHandler) {
return node.removeEvent(eventName, eventHandler);
},
removeAllEventListeners: function removeAllEventListeners(node) {
// Noop
},
removeAttribute: function removeAttribute(node, propKey, propValue) {
if (propKey == ID) {
nodeMaps[propValue] = null;
}
// Weex native will crash when pass null value
return node.setAttr(propKey, undefined, false);
},
setAttribute: function setAttribute(node, propKey, propValue) {
if (propKey == ID) {
nodeMaps[propValue] = node;
}
// Weex only support `ariaLabel` format, convert `aria-label` format to camelcase
if (ARIA_PREFIX_REGEXP.test(propKey)) {
propKey = propKey.replace(/\-(\w)/, function (m, p1) {
return p1.toUpperCase();
});
}
return node.setAttr(propKey, propValue, false);
},
setStyles: function setStyles(node, styles) {
// TODO if more then one style update, call setStyles will be better performance
for (var key in styles) {
var val = styles[key];
val = (0, _styleUnit.convertUnit)(val, key);
node.setStyle(key, val);
}
},
beforeRender: function beforeRender() {
// Turn off batched updates
document.open();
// Init rem unit
(0, _styleUnit.setRem)(this.getWindowWidth() / FULL_WIDTH_REM);
},
afterRender: function afterRender() {
if (document.listener && document.listener.createFinish) {
document.listener.createFinish();
}
// Turn on batched updates
document.close();
},
getWindowWidth: function getWindowWidth() {
return FULL_WIDTH_REM;
},
setNativeProps: function setNativeProps(node, props, skipSetStyles) {
var this$1 = this;
for (var prop in props) {
var value = props[prop];
if (prop === CHILDREN) {
continue;
}
if (value != null) {
if (prop === STYLE) {
if (skipSetStyles) {
continue;
}
this$1.setStyles(node, value);
} else if (EVENT_PREFIX_REGEXP.test(prop)) {
var eventName = prop.slice(2).toLowerCase();
this$1.addEventListener(node, eventName, value);
} else {
this$1.setAttribute(node, prop, value);
}
}
}
}
};
exports.default = Driver;
module.exports = exports['default'];
/***/ }),
/* 31 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _img = __webpack_require__(32);
var _img2 = _interopRequireDefault(_img);
var _video = __webpack_require__(33);
var _video2 = _interopRequireDefault(_video);
var _textarea = __webpack_require__(34);
var _textarea2 = _interopRequireDefault(_textarea);
var _span = __webpack_require__(35);
var _span2 = _interopRequireDefault(_span);
var _p = __webpack_require__(36);
var _p2 = _interopRequireDefault(_p);
var _button = __webpack_require__(37);
var _button2 = _interopRequireDefault(_button);
var _heading = __webpack_require__(38);
var _heading2 = _interopRequireDefault(_heading);
var _block = __webpack_require__(39);
var _block2 = _interopRequireDefault(_block);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
exports.default = {
span: _span2.default,
p: _p2.default,
img: _img2.default,
button: _button2.default,
video: _video2.default,
textarea: _textarea2.default,
h1: _heading2.default,
h2: _heading2.default,
h3: _heading2.default,
h4: _heading2.default,
h5: _heading2.default,
h6: _heading2.default,
nav: _block2.default,
article: _block2.default,
section: _block2.default,
// Conflict with weex header tag
// header: block,
footer: _block2.default,
aside: _block2.default,
main: _block2.default
};
module.exports = exports['default'];
/***/ }),
/* 32 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _parseProps = __webpack_require__(13);
exports.default = {
/**
* parse w3c attrs to weex module attrs
*
* @param {Object} w3c component data
* @return {Object} weex component data
*/
parse: function parse(component) {
var props = component.props;
component.type = 'image';
// modify props
component.props = (0, _parseProps.transformPropsAttrsToStyle)(props, ['width', 'height']);
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 33 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _parseProps = __webpack_require__(13);
exports.default = {
/**
* parse w3c attrs to weex module attrs
*
* @param {Object} w3c component data
* @return {Object} weex component data
*/
parse: function parse(component) {
var props = component.props;
// modify props
component.props = (0, _parseProps.transformPropsAttrsToStyle)(props, ['width', 'height']);
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 34 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = {
/**
* parse w3c attrs to weex module attrs
*
* @param {Object} w3c component data
* @return {Object} weex component data
*/
parse: function parse(component) {
var props = component.props;
if (typeof props.children === 'string' && !props.value) {
props.value = props.children;
props.children = null;
}
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 35 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = {
parse: function parse(component) {
var props = component.props;
component.type = 'text';
if (typeof props.children === 'string' && !props.value) {
props.value = props.children;
props.children = null;
}
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 36 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof2 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
} : function (obj) {
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
};
var _extends = Object.assign || function (target) {
var arguments$1 = arguments;
for (var i = 1; i < arguments.length; i++) {
var source = arguments$1[i];for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}return target;
};
var BASE_FONT_SIZE = 28;
var defaultParagraphStyle = {
fontSize: BASE_FONT_SIZE,
marginTop: BASE_FONT_SIZE,
marginBottom: BASE_FONT_SIZE
};
var TypographyElements = {
u: {
textDecoration: 'underline'
},
s: {
textDecoration: 'line-through'
},
i: {
fontStyle: 'italic'
},
b: {
fontWeight: 'bold'
},
del: {
textDecoration: 'line-through'
},
em: {
fontStyle: 'italic'
},
strong: {
fontWeight: 'bold'
},
big: {
fontSize: BASE_FONT_SIZE * 1.2
},
small: {
fontSize: BASE_FONT_SIZE * 0.8
}
};
function transformString(string) {
return {
type: 'span',
attr: {
value: string
}
};
}
function transformChild(child) {
var type = child.type;
var props = child.props;
var style = props.style;
var nestedChildren = props.children;
// Alias img tag
if (type === 'img') {
type = 'image';
}
// Transfrom to span
if (TypographyElements[type]) {
style = _extends({}, TypographyElements[type], style);
type = 'span';
}
props.style = null;
props.children = null;
var element = {
type: type,
style: style,
attr: props || {}
};
if (nestedChildren) {
if (type === 'span' && typeof nestedChildren === 'string') {
element.attr.value = nestedChildren;
} else {
element.children = transformChildren(nestedChildren);
}
}
return element;
}
function transformChildren(children) {
var elements = [];
if (!Array.isArray(children)) {
children = [children];
}
for (var i = 0; i < children.length; i++) {
var child = children[i];
if (typeof child === 'string') {
elements.push(transformString(child));
} else if ((typeof child === 'undefined' ? 'undefined' : _typeof(child)) === 'object') {
elements.push(transformChild(child));
}
}
return elements;
}
exports.default = {
parse: function parse(component) {
var props = component.props;
var children = props.children;
component.type = 'richtext';
props.style = _extends({}, defaultParagraphStyle, props.style);
props.value = transformChildren(children);
props.children = null;
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 37 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) {
var arguments$1 = arguments;
for (var i = 1; i < arguments.length; i++) {
var source = arguments$1[i];for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}return target;
};
/**
* weex button
*
* props: disabled, style
*/
exports.default = {
parse: function parse(component) {
var props = component.props;
component.type = 'text';
var style = props.style,
disabled = props.disabled,
children = props.children;
var textStyle = _extends({
textAlign: 'center',
fontSize: 22,
paddingTop: 4,
paddingRight: 12,
paddingBottom: 6,
paddingLeft: 12,
borderWidth: 4,
borderStyle: 'solid',
borderColor: '#000000',
backgroudColor: '#c0c0c0'
}, style);
if (disabled) {
props.onClick = null;
textStyle = _extends({}, textStyle, {
color: '#7f7f7f',
borderColor: '#7f7f7f'
});
}
if (typeof children === 'string') {
props.value = children;
props.children = null;
}
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 38 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) {
var arguments$1 = arguments;
for (var i = 1; i < arguments.length; i++) {
var source = arguments$1[i];for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}return target;
};
var BASE_FONT_SIZE = 28;
function generateHeadingStyle(baseFontSize, fontMultiplier, marginMultiplier) {
return {
fontSize: baseFontSize * fontMultiplier,
marginTop: baseFontSize * fontMultiplier * marginMultiplier,
marginBottom: baseFontSize * fontMultiplier * marginMultiplier,
fontWeight: 'bold'
};
}
var HeadingElements = {
h1: generateHeadingStyle(BASE_FONT_SIZE, 2, 0.67),
h2: generateHeadingStyle(BASE_FONT_SIZE, 1.5, 0.83),
h3: generateHeadingStyle(BASE_FONT_SIZE, 1.17, 1),
h4: generateHeadingStyle(BASE_FONT_SIZE, 1, 1.33),
h5: generateHeadingStyle(BASE_FONT_SIZE, 0.83, 1.67),
h6: generateHeadingStyle(BASE_FONT_SIZE, 0.67, 2.33)
};
exports.default = {
parse: function parse(component) {
var type = component.type,
props = component.props;
component.type = 'text';
props.style = _extends({}, HeadingElements[type] || HeadingElements.h6, props.style);
if (typeof props.children === 'string' && !props.value) {
props.value = props.children;
props.children = null;
}
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 39 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = {
/**
* parse w3c attrs to weex module attrs
*
* @param {Object} w3c component data
* @return {Object} weex component data
*/
parse: function parse(component) {
component.type = 'div';
return component;
}
};
module.exports = exports['default'];
/***/ }),
/* 40 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _styleUnit = __webpack_require__(12);
var _flexbox = __webpack_require__(41);
var _flexbox2 = _interopRequireDefault(_flexbox);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
/**
* Web Browser driver
**/
var FULL_WIDTH_REM = 750;
var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';
var CLASS_NAME = 'className';
var CLASS = 'class';
var STYLE = 'style';
var CHILDREN = 'children';
var EVENT_PREFIX_REGEXP = /on[A-Z]/;
var Driver = {
getElementById: function getElementById(id) {
return document.getElementById(id);
},
createBody: function createBody() {
return document.body;
},
createComment: function createComment(content) {
return document.createComment(content);
},
createEmpty: function createEmpty() {
return this.createComment(' empty ');
},
createText: function createText(text) {
return document.createTextNode(text);
},
updateText: function updateText(node, text) {
var textContentAttr = 'textContent' in document ? 'textContent' : 'nodeValue';
node[textContentAttr] = text;
},
createElement: function createElement(component) {
var node = document.createElement(component.type);
var props = component.props;
this.setNativeProps(node, props);
return node;
},
appendChild: function appendChild(node, parent) {
return parent.appendChild(node);
},
removeChild: function removeChild(node, parent) {
parent = parent || node.parentNode;
// Maybe has been removed when remove child
if (parent) {
parent.removeChild(node);
}
},
replaceChild: function replaceChild(newChild, oldChild, parent) {
parent = parent || oldChild.parentNode;
parent.replaceChild(newChild, oldChild);
},
insertAfter: function insertAfter(node, after, parent) {
parent = parent || after.parentNode;
var nextSibling = after.nextSibling;
if (nextSibling) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
},
insertBefore: function insertBefore(node, before, parent) {
parent = parent || before.parentNode;
parent.insertBefore(node, before);
},
addEventListener: function addEventListener(node, eventName, eventHandler) {
return node.addEventListener(eventName, eventHandler);
},
removeEventListener: function removeEventListener(node, eventName, eventHandler) {
return node.removeEventListener(eventName, eventHandler);
},
removeAllEventListeners: function removeAllEventListeners(node) {
// noop
},
removeAttribute: function removeAttribute(node, propKey) {
if (propKey === DANGEROUSLY_SET_INNER_HTML) {
return node.innerHTML = null;
}
if (propKey === CLASS_NAME) {
propKey = CLASS;
}
if (propKey in node) {
node[propKey] = null;
}
node.removeAttribute(propKey);
},
setAttribute: function setAttribute(node, propKey, propValue) {
if (propKey === DANGEROUSLY_SET_INNER_HTML) {
return node.innerHTML = propValue.__html;
}
if (propKey === CLASS_NAME) {
propKey = CLASS;
}
if (propKey in node) {
node[propKey] = propValue;
} else {
node.setAttribute(propKey, propValue);
}
},
setStyles: function setStyles(node, styles) {
var tranformedStyles = {};
for (var prop in styles) {
var val = styles[prop];
if (_flexbox2.default.isFlexProp(prop)) {
_flexbox2.default[prop](val, tranformedStyles);
} else {
tranformedStyles[prop] = (0, _styleUnit.convertUnit)(val, prop);
}
}
for (var _prop in tranformedStyles) {
var transformValue = tranformedStyles[_prop];
// hack handle compatibility issue
if (Array.isArray(transformValue)) {
for (var i = 0; i < transformValue.length; i++) {
node.style[_prop] = transformValue[i];
}
} else {
node.style[_prop] = transformValue;
}
}
},
beforeRender: function beforeRender() {
// Init rem unit
(0, _styleUnit.setRem)(this.getWindowWidth() / FULL_WIDTH_REM);
},
getWindowWidth: function getWindowWidth() {
return document.documentElement.clientWidth;
},
setNativeProps: function setNativeProps(node, props) {
var this$1 = this;
for (var prop in props) {
var value = props[prop];
if (prop === CHILDREN) {
continue;
}
if (value != null) {
if (prop === STYLE) {
this$1.setStyles(node, value);
} else if (EVENT_PREFIX_REGEXP.test(prop)) {
var eventName = prop.slice(2).toLowerCase();
this$1.addEventListener(node, eventName, value);
} else {
this$1.setAttribute(node, prop, value);
}
}
}
}
};
exports.default = Driver;
module.exports = exports['default'];
/***/ }),
/* 41 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var BOX_ALIGN = {
stretch: 'stretch',
'flex-start': 'start',
'flex-end': 'end',
center: 'center'
};
var BOX_ORIENT = {
row: 'horizontal',
column: 'vertical'
};
var BOX_PACK = {
'flex-start': 'start',
'flex-end': 'end',
center: 'center',
'space-between': 'justify',
'space-around': 'justify' // Just same as `space-between`
};
var FLEX_PROPS = {
display: true,
flex: true,
alignItems: true,
alignSelf: true,
flexDirection: true,
justifyContent: true,
flexWrap: true
};
var Flexbox = {
isFlexProp: function isFlexProp(prop) {
return FLEX_PROPS[prop];
},
display: function display(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (value === 'flex') {
style.display = ['-webkit-box', '-webkit-flex', 'flex'];
} else {
style.display = value;
}
return style;
},
flex: function flex(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitBoxFlex = value;
style.webkitFlex = value;
style.flex = value;
return style;
},
flexWrap: function flexWrap(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.flexWrap = value;
return style;
},
alignItems: function alignItems(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitBoxAlign = BOX_ALIGN[value];
style.webkitAlignItems = value;
style.alignItems = value;
return style;
},
alignSelf: function alignSelf(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitAlignSelf = value;
style.alignSelf = value;
return style;
},
flexDirection: function flexDirection(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitBoxOrient = BOX_ORIENT[value];
style.webkitFlexDirection = value;
style.flexDirection = value;
return style;
},
justifyContent: function justifyContent(value) {
var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
style.webkitBoxPack = BOX_PACK[value];
style.webkitJustifyContent = value;
style.justifyContent = value;
return style;
}
};
exports.default = Flexbox;
module.exports = exports['default'];
/***/ }),
/* 42 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _instance = __webpack_require__(1);
var _instance2 = _interopRequireDefault(_instance);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function findComponentInstance(node) {
if (node == null) {
return null;
}
return _instance2.default.get(node);
}
exports.default = findComponentInstance;
module.exports = exports['default'];
/***/ }),
/* 43 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = setNativeProps;
var _host = __webpack_require__(0);
var _host2 = _interopRequireDefault(_host);
var _findDOMNode = __webpack_require__(14);
var _findDOMNode2 = _interopRequireDefault(_findDOMNode);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function setNativeProps(node, props) {
node = (0, _findDOMNode2.default)(node);
_host2.default.driver.setNativeProps(node, props);
}
module.exports = exports['default'];
/***/ }),
/* 44 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = '0.4.7';
module.exports = exports['default'];
/***/ })
/******/ ]);};
/***/ }),
/* 6 */
/*!*********************************************************!*\
!*** ./packages/runtime-shared/dist/shared.function.js ***!
\*********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports) {
module.exports = function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, {
/******/ configurable: false,
/******/ enumerable: true,
/******/ get: getter
/******/ });
/******/ }
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 2);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/* eslint no-extend-native: "off", new-cap: "off" */
var defineProperties = Object.defineProperties,
defineProperty = Object.defineProperty,
SymbolPolyfill,
HiddenSymbol,
globalSymbols = Object.create(null);
function isSymbol(x) {
if (!x) { return false; }
if ((typeof x === 'undefined' ? 'undefined' : _typeof(x)) === 'symbol') { return true; }
if (!x.constructor) { return false; }
if (x.constructor.name !== 'Symbol') { return false; }
return x[x.constructor.toStringTag] === 'Symbol';
}
function validateSymbol(value) {
if (!isSymbol(value)) { throw new TypeError(value + ' is not a symbol'); }
return value;
}
var generateName = function () {
var created = Object.create(null);
return function (desc) {
var postfix = 0,
name;
while (created[desc + (postfix || '')]) {
++postfix;
}desc += postfix || '';
created[desc] = true;
name = '@@' + desc;
return name;
};
}();
// Internal constructor (not one exposed) for creating Symbol instances.
// This one is used to ensure that `someSymbol instanceof Symbol` always return false
HiddenSymbol = function _Symbol(description) {
if (this instanceof HiddenSymbol) { throw new TypeError('Symbol is not a constructor'); }
return SymbolPolyfill(description);
};
// Exposed `Symbol` constructor
// (returns instances of HiddenSymbol)
module.exports = SymbolPolyfill = function _Symbol2(description) {
var symbol;
if (this instanceof _Symbol2) { throw new TypeError('Symbol is not a constructor'); }
symbol = Object.create(HiddenSymbol.prototype);
description = description === undefined ? '' : String(description);
return defineProperties(symbol, {
__description__: { value: description },
__name__: { value: generateName(description) }
});
};
defineProperties(SymbolPolyfill, {
for: { value: function value(key) {
if (globalSymbols[key]) { return globalSymbols[key]; }
return globalSymbols[key] = SymbolPolyfill(String(key));
} },
keyFor: { value: function value(s) {
var key;
validateSymbol(s);
for (key in globalSymbols) {
if (globalSymbols[key] === s) { return key; }
}
} },
// To ensure proper interoperability with other native functions (e.g. Array.from)
// fallback to eventual native implementation of given symbol
hasInstance: { value: SymbolPolyfill('hasInstance') },
isConcatSpreadable: { value: SymbolPolyfill('isConcatSpreadable') },
iterator: { value: SymbolPolyfill('iterator') },
match: { value: SymbolPolyfill('match') },
replace: { value: SymbolPolyfill('replace') },
search: { value: SymbolPolyfill('search') },
species: { value: SymbolPolyfill('species') },
split: { value: SymbolPolyfill('split') },
toPrimitive: { value: SymbolPolyfill('toPrimitive') },
toStringTag: { value: SymbolPolyfill('toStringTag') },
unscopables: { value: SymbolPolyfill('unscopables') }
});
// Internal tweaks for real symbol producer
defineProperties(HiddenSymbol.prototype, {
constructor: { value: SymbolPolyfill },
toString: { value: function value() {
return this.__name__;
} }
});
// Proper implementation of methods exposed on Symbol.prototype
// They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
defineProperties(SymbolPolyfill.prototype, {
toString: { value: function value() {
return 'Symbol (' + validateSymbol(this).__description__ + ')';
} },
valueOf: { value: function value() {
return validateSymbol(this);
} }
});
defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, {
value: function value() {
var symbol = validateSymbol(this);
if ((typeof symbol === 'undefined' ? 'undefined' : _typeof(symbol)) === 'symbol') { return symbol; }
return symbol.toString();
}
});
defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, { value: 'Symbol' });
// Proper implementaton of toPrimitive and toStringTag for returned symbol instances
defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toStringTag, { value: SymbolPolyfill.prototype[SymbolPolyfill.toStringTag] });
// Note: It's important to define `toPrimitive` as last one, as some implementations
// implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
// And that may invoke error in definition flow:
// See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive, { value: SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive] });
/***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }(); // https://github.com/WebReflection/url-search-params
var _symbol = __webpack_require__(0);
var _symbol2 = _interopRequireDefault(_symbol);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var find = /[!'\(\)~]|%20|%00/g;
var plus = /\+/g;
var replace = {
'!': '%21',
"'": '%27',
'(': '%28',
')': '%29',
'~': '%7E',
'%20': '+',
'%00': '\x00'
};
var replacer = function replacer(match) {
return replace[match];
};
var secret = '__URLSearchParams__';
function encode(str) {
return encodeURIComponent(str).replace(find, replacer);
}
function decode(str) {
return decodeURIComponent(str.replace(plus, ' '));
}
var URLSearchParams = function () {
function URLSearchParams(query) {
var this$1 = this;
_classCallCheck(this, URLSearchParams);
this[secret] = Object.create(null);
if (!query) { return; }
if (query.charAt(0) === '?') {
query = query.slice(1);
}
for (var index, value, pairs = (query || '').split('&'), i = 0, length = pairs.length; i < length; i++) {
value = pairs[i];
index = value.indexOf('=');
if (-1 < index) {
this$1.append(decode(value.slice(0, index)), decode(value.slice(index + 1)));
} else if (value.length) {
this$1.append(decode(value), '');
}
}
}
_createClass(URLSearchParams, [{
key: 'append',
value: function append(name, value) {
var dict = this[secret];
if (name in dict) {
dict[name].push('' + value);
} else {
dict[name] = ['' + value];
}
}
}, {
key: 'delete',
value: function _delete(name) {
delete this[secret][name];
}
}, {
key: 'get',
value: function get(name) {
var dict = this[secret];
return name in dict ? dict[name][0] : null;
}
}, {
key: 'getAll',
value: function getAll(name) {
var dict = this[secret];
return name in dict ? dict[name].slice(0) : [];
}
}, {
key: 'has',
value: function has(name) {
return name in this[secret];
}
}, {
key: 'set',
value: function set(name, value) {
this[secret][name] = ['' + value];
}
}, {
key: 'forEach',
value: function forEach(callback, thisArg) {
var dict = this[secret];
Object.getOwnPropertyNames(dict).forEach(function (name) {
dict[name].forEach(function (value) {
callback.call(thisArg, value, name, this);
}, this);
}, this);
}
}, {
key: 'keys',
value: function keys() {
var items = [];
this.forEach(function (value, name) {
items.push(name);
});
var iterator = {
next: function next() {
var value = items.shift();
return { done: value === undefined, value: value };
}
};
iterator[_symbol2.default.iterator] = function () {
return iterator;
};
return iterator;
}
}, {
key: 'values',
value: function values() {
var items = [];
this.forEach(function (value) {
items.push(value);
});
var iterator = {
next: function next() {
var value = items.shift();
return { done: value === undefined, value: value };
}
};
iterator[_symbol2.default.iterator] = function () {
return iterator;
};
return iterator;
}
}, {
key: 'entries',
value: function entries() {
var items = [];
this.forEach(function (value, name) {
items.push([name, value]);
});
var iterator = {
next: function next() {
var value = items.shift();
return { done: value === undefined, value: value };
}
};
iterator[_symbol2.default.iterator] = function () {
return iterator;
};
return iterator;
}
}, {
key: 'toString',
value: function toString() {
var dict = this[secret],
query = [],
i,
key,
name,
value;
for (key in dict) {
name = encode(key);
for (i = 0, value = dict[key]; i < value.length; i++) {
query.push(name + '=' + encode(value[i]));
}
}
return query.join('&');
}
}]);
return URLSearchParams;
}();
URLSearchParams.prototype[_symbol2.default.iterator] = URLSearchParams.prototype.entries;
module.exports = URLSearchParams;
/***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = {
get Promise() {
return __webpack_require__(3);
},
get Symbol() {
return __webpack_require__(0);
},
get Map() {
return __webpack_require__(4);
},
get Set() {
return __webpack_require__(5);
},
get WeakMap() {
return __webpack_require__(6);
},
get WeakSet() {
return __webpack_require__(7);
},
get FontFace() {
return __webpack_require__(8);
},
get URL() {
return __webpack_require__(9);
},
get URLSearchParams() {
return __webpack_require__(1);
},
get matchMedia() {
return __webpack_require__(10);
}
};
/***/ }),
/* 3 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/* eslint no-extend-native: "off" */
function noop() {}
// Use polyfill for setImmediate for performance gains
var asap = typeof setImmediate === 'function' && setImmediate || function (fn) {
if (typeof setTimeout === 'function') {
setTimeout(fn, 0);
} else {
fn();
}
};
var onUnhandledRejection = function onUnhandledRejection(err) {
if (typeof console !== 'undefined' && console) {
console.log('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
}
};
// Polyfill for Function.prototype.bind
function bind(fn, thisArg) {
return function () {
fn.apply(thisArg, arguments);
};
}
function Promise(fn) {
if (_typeof(this) !== 'object') { throw new TypeError('Promises must be constructed via new'); }
if (typeof fn !== 'function') { throw new TypeError('Promise resolver is not a function'); }
this._state = 0;
this._handled = false;
this._value = undefined;
this._deferreds = [];
doResolve(fn, this);
}
function handle(self, deferred) {
while (self._state === 3) {
self = self._value;
}
if (self._state === 0) {
self._deferreds.push(deferred);
return;
}
self._handled = true;
asap(function () {
var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
if (cb === null) {
(self._state === 1 ? resolve : reject)(deferred.promise, self._value);
return;
}
var ret;
try {
ret = cb(self._value);
} catch (e) {
reject(deferred.promise, e);
return;
}
resolve(deferred.promise, ret);
});
}
function resolve(self, newValue) {
try {
// Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
if (newValue === self) { throw new TypeError('A promise cannot be resolved with itself.'); }
if (newValue && ((typeof newValue === 'undefined' ? 'undefined' : _typeof(newValue)) === 'object' || typeof newValue === 'function')) {
var then = newValue.then;
if (newValue instanceof Promise) {
self._state = 3;
self._value = newValue;
finale(self);
return;
} else if (typeof then === 'function') {
doResolve(bind(then, newValue), self);
return;
}
}
self._state = 1;
self._value = newValue;
finale(self);
} catch (e) {
reject(self, e);
}
}
function reject(self, newValue) {
self._state = 2;
self._value = newValue;
finale(self);
}
function finale(self) {
if (self._state === 2 && self._deferreds.length === 0) {
asap(function () {
if (!self._handled) {
onUnhandledRejection(self._value);
}
});
}
for (var i = 0, len = self._deferreds.length; i < len; i++) {
handle(self, self._deferreds[i]);
}
self._deferreds = null;
}
function Handler(onFulfilled, onRejected, promise) {
this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
this.onRejected = typeof onRejected === 'function' ? onRejected : null;
this.promise = promise;
}
/**
* Take a potentially misbehaving resolver function and make sure
* onFulfilled and onRejected are only called once.
*
* Makes no guarantees about asynchrony.
*/
function doResolve(fn, self) {
var done = false;
try {
fn(function (value) {
if (done) { return; }
done = true;
resolve(self, value);
}, function (reason) {
if (done) { return; }
done = true;
reject(self, reason);
});
} catch (ex) {
if (done) { return; }
done = true;
reject(self, ex);
}
}
Promise.prototype.catch = function (onRejected) {
return this.then(null, onRejected);
};
Promise.prototype.then = function (onFulfilled, onRejected) {
var prom = new this.constructor(noop);
handle(this, new Handler(onFulfilled, onRejected, prom));
return prom;
};
Promise.all = function (arr) {
var args = Array.prototype.slice.call(arr);
return new Promise(function (resolve, reject) {
if (args.length === 0) { return resolve([]); }
var remaining = args.length;
function res(i, val) {
try {
if (val && ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' || typeof val === 'function')) {
var then = val.then;
if (typeof then === 'function') {
then.call(val, function (val) {
res(i, val);
}, reject);
return;
}
}
args[i] = val;
if (--remaining === 0) {
resolve(args);
}
} catch (ex) {
reject(ex);
}
}
for (var i = 0; i < args.length; i++) {
res(i, args[i]);
}
});
};
Promise.resolve = function (value) {
if (value && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value.constructor === Promise) {
return value;
}
return new Promise(function (resolve) {
resolve(value);
});
};
Promise.reject = function (value) {
return new Promise(function (resolve, reject) {
reject(value);
});
};
Promise.race = function (values) {
return new Promise(function (resolve, reject) {
for (var i = 0, len = values.length; i < len; i++) {
values[i].then(resolve, reject);
}
});
};
/**
* Set the immediate function to execute callbacks
* @param fn {function} Function to execute
* @private
*/
Promise._setImmediateFn = function _setImmediateFn(fn) {
asap = fn;
};
Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
onUnhandledRejection = fn;
};
module.exports = Promise;
/***/ }),
/* 4 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _symbol = __webpack_require__(0);
var _symbol2 = _interopRequireDefault(_symbol);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Deleted map items mess with iterator pointers, so rather than removing them mark them as deleted. Can't use undefined or null since those both valid keys so use a private symbol.
var undefMarker = (0, _symbol2.default)('undef');
// NaN cannot be found in an array using indexOf, so we encode NaNs using a private symbol.
/* eslint no-extend-native: "off" */
var NaNMarker = (0, _symbol2.default)('NaN');
var ACCESSOR_SUPPORT = true;
function encodeKey(key) {
return Number.isNaN(key) ? NaNMarker : key;
}
function decodeKey(encodedKey) {
return encodedKey === NaNMarker ? NaN : encodedKey;
}
function makeIterator(mapInst, getter) {
var nextIdx = 0;
var done = false;
return {
next: function next() {
if (nextIdx === mapInst._keys.length) { done = true; }
if (!done) {
while (mapInst._keys[nextIdx] === undefMarker) {
nextIdx++;
}return { value: getter.call(mapInst, nextIdx++), done: false };
} else {
return { value: void 0, done: true };
}
}
};
}
function calcSize(mapInst) {
var size = 0;
for (var i = 0, s = mapInst._keys.length; i < s; i++) {
if (mapInst._keys[i] !== undefMarker) { size++; }
}
return size;
}
function hasProtoMethod(instance, method) {
return typeof instance[method] === 'function';
}
var Map = function Map(data) {
this._keys = [];
this._values = [];
// If `data` is iterable (indicated by presence of a forEach method), pre-populate the map
if (data && hasProtoMethod(data, 'forEach')) {
// Fastpath: If `data` is a Map, shortcircuit all following the checks
if (data instanceof Map ||
// If `data` is not an instance of Map, it could be because you have a Map from an iframe or a worker or something.
// Check if `data` has all the `Map` methods and if so, assume data is another Map
hasProtoMethod(data, 'clear') && hasProtoMethod(data, 'delete') && hasProtoMethod(data, 'entries') && hasProtoMethod(data, 'forEach') && hasProtoMethod(data, 'get') && hasProtoMethod(data, 'has') && hasProtoMethod(data, 'keys') && hasProtoMethod(data, 'set') && hasProtoMethod(data, 'values')) {
data.forEach(function (value, key) {
this.set.apply(this, [key, value]);
}, this);
} else {
data.forEach(function (item) {
this.set.apply(this, item);
}, this);
}
}
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
};
Map.prototype = {};
// Some old engines do not support ES5 getters/setters. Since Map only requires these for the size property, we can fall back to setting the size property statically each time the size of the map changes.
try {
Object.defineProperty(Map.prototype, 'size', {
get: function get() {
return calcSize(this);
}
});
} catch (e) {
ACCESSOR_SUPPORT = false;
}
Map.prototype.get = function (key) {
var idx = this._keys.indexOf(encodeKey(key));
return idx !== -1 ? this._values[idx] : undefined;
};
Map.prototype.set = function (key, value) {
var idx = this._keys.indexOf(encodeKey(key));
if (idx !== -1) {
this._values[idx] = value;
} else {
this._keys.push(encodeKey(key));
this._values.push(value);
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
}
return this;
};
Map.prototype.has = function (key) {
return this._keys.indexOf(encodeKey(key)) !== -1;
};
Map.prototype.delete = function (key) {
var idx = this._keys.indexOf(encodeKey(key));
if (idx === -1) { return false; }
this._keys[idx] = undefMarker;
this._values[idx] = undefMarker;
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
return true;
};
Map.prototype.clear = function () {
this._keys = this._values = [];
if (!ACCESSOR_SUPPORT) { this.size = 0; }
};
Map.prototype.values = function () {
return makeIterator(this, function (i) {
return this._values[i];
});
};
Map.prototype.keys = function () {
return makeIterator(this, function (i) {
return decodeKey(this._keys[i]);
});
};
Map.prototype.entries = Map.prototype[_symbol2.default.iterator] = function () {
return makeIterator(this, function (i) {
return [decodeKey(this._keys[i]), this._values[i]];
});
};
Map.prototype.forEach = function (callbackFn, thisArg) {
var this$1 = this;
thisArg = thisArg || commonjsGlobal;
var iterator = this.entries();
var result = iterator.next();
while (result.done === false) {
callbackFn.call(thisArg, result.value[1], result.value[0], this$1);
result = iterator.next();
}
};
Map.prototype[_symbol2.default.species] = Map;
Object.defineProperty(Map, 'constructor', {
value: Map
});
try {
Object.defineProperty(Map, 'length', {
value: 0
});
} catch (e) {}
module.exports = Map;
/***/ }),
/* 5 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _symbol = __webpack_require__(0);
var _symbol2 = _interopRequireDefault(_symbol);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// Deleted map items mess with iterator pointers, so rather than removing them mark them as deleted. Can't use undefined or null since those both valid keys so use a private symbol.
var undefMarker = (0, _symbol2.default)('undef');
// NaN cannot be found in an array using indexOf, so we encode NaNs using a private symbol.
/* eslint no-extend-native: "off" */
var NaNMarker = (0, _symbol2.default)('NaN');
var ACCESSOR_SUPPORT = true;
function encodeVal(data) {
return Number.isNaN(data) ? NaNMarker : data;
}
function decodeVal(encodedData) {
return encodedData === NaNMarker ? NaN : encodedData;
}
function makeIterator(setInst, getter) {
var nextIdx = 0;
return {
next: function next() {
while (setInst._values[nextIdx] === undefMarker) {
nextIdx++;
}if (nextIdx === setInst._values.length) {
return { value: void 0, done: true };
} else {
return { value: getter.call(setInst, nextIdx++), done: false };
}
}
};
}
function calcSize(setInst) {
var size = 0;
for (var i = 0, s = setInst._values.length; i < s; i++) {
if (setInst._values[i] !== undefMarker) { size++; }
}
return size;
}
var Set = function Set(data) {
this._values = [];
// If `data` is iterable (indicated by presence of a forEach method), pre-populate the set
data && typeof data.forEach === 'function' && data.forEach(function (item) {
this.add.call(this, item);
}, this);
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
};
// Some old engines do not support ES5 getters/setters. Since Set only requires these for the size property, we can fall back to setting the size property statically each time the size of the set changes.
try {
Object.defineProperty(Set.prototype, 'size', {
get: function get() {
return calcSize(this);
}
});
} catch (e) {
ACCESSOR_SUPPORT = false;
}
Set.prototype.add = function (value) {
value = encodeVal(value);
if (this._values.indexOf(value) === -1) {
this._values.push(value);
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
}
return this;
};
Set.prototype.has = function (value) {
return this._values.indexOf(encodeVal(value)) !== -1;
};
Set.prototype.delete = function (value) {
var idx = this._values.indexOf(encodeVal(value));
if (idx === -1) { return false; }
this._values[idx] = undefMarker;
if (!ACCESSOR_SUPPORT) { this.size = calcSize(this); }
return true;
};
Set.prototype.clear = function () {
this._values = [];
if (!ACCESSOR_SUPPORT) { this.size = 0; }
};
Set.prototype.values = Set.prototype.keys = function () {
return makeIterator(this, function (i) {
return decodeVal(this._values[i]);
});
};
Set.prototype.entries = Set.prototype[_symbol2.default.iterator] = function () {
return makeIterator(this, function (i) {
return [decodeVal(this._values[i]), decodeVal(this._values[i])];
});
};
Set.prototype.forEach = function (callbackFn, thisArg) {
var this$1 = this;
thisArg = thisArg || commonjsGlobal;
var iterator = this.entries();
var result = iterator.next();
while (result.done === false) {
callbackFn.call(thisArg, result.value[1], result.value[0], this$1);
result = iterator.next();
}
};
Set.prototype[_symbol2.default.species] = Set;
Object.defineProperty(Set, 'constructor', {
value: Set
});
try {
Object.defineProperty(Set, 'length', {
value: 0
});
} catch (e) {}
module.exports = Set;
/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
/* eslint no-extend-native: "off" */
var defineProperty = Object.defineProperty;
var counter = Date.now() % 1e9;
var WeakMap = function WeakMap(data) {
this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');
// If data is iterable (indicated by presence of a forEach method), pre-populate the map
data && data.forEach && data.forEach(function (item) {
this.set.apply(this, item);
}, this);
};
WeakMap.prototype.set = function (key, value) {
if ((typeof key === 'undefined' ? 'undefined' : _typeof(key)) !== 'object' && typeof key !== 'function') { throw new TypeError('Invalid value used as weak map key'); }
var entry = key[this.name];
if (entry && entry[0] === key) { entry[1] = value; }else { defineProperty(key, this.name, { value: [key, value], writable: true }); }
return this;
};
WeakMap.prototype.get = function (key) {
var entry;
return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;
};
WeakMap.prototype.delete = function (key) {
var entry = key[this.name];
if (!entry || entry[0] !== key) { return false; }
entry[0] = entry[1] = undefined;
return true;
};
WeakMap.prototype.has = function (key) {
var entry = key[this.name];
if (!entry) { return false; }
return entry[0] === key;
};
module.exports = WeakMap;
/***/ }),
/* 7 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/* eslint no-extend-native: "off" */
var counter = Date.now() % 1e9;
var WeakSet = function WeakSet(data) {
this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');
data && data.forEach && data.forEach(this.add, this);
};
WeakSet.prototype.add = function (obj) {
var name = this.name;
if (!obj[name]) { Object.defineProperty(obj, name, { value: true, writable: true }); }
return this;
};
WeakSet.prototype.delete = function (obj) {
if (!obj[this.name]) { return false; }
obj[this.name] = undefined;
return true;
};
WeakSet.prototype.has = function (obj) {
return !!obj[this.name];
};
module.exports = WeakSet;
/***/ }),
/* 8 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var FontFace = function FontFace(family, source) {
_classCallCheck(this, FontFace);
this.family = family;
this.source = source;
};
module.exports = FontFace;
/***/ }),
/* 9 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
// https://github.com/Polymer/URL
var URLSearchParams = __webpack_require__(1);
var relative = Object.create(null);
relative.ftp = 21;
relative.file = 0;
relative.gopher = 70;
relative.http = 80;
relative.https = 443;
relative.ws = 80;
relative.wss = 443;
var relativePathDotMapping = Object.create(null);
relativePathDotMapping['%2e'] = '.';
relativePathDotMapping['.%2e'] = '..';
relativePathDotMapping['%2e.'] = '..';
relativePathDotMapping['%2e%2e'] = '..';
function isRelativeScheme(scheme) {
return relative[scheme] !== undefined;
}
function invalid() {
clear.call(this);
this._isInvalid = true;
}
function IDNAToASCII(h) {
if ('' == h) {
invalid.call(this);
}
// XXX
return h.toLowerCase();
}
function percentEscape(c) {
var unicode = c.charCodeAt(0);
if (unicode > 0x20 && unicode < 0x7F &&
// " # < > ? `
[0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1) {
return c;
}
return encodeURIComponent(c);
}
function percentEscapeQuery(c) {
// XXX This actually needs to encode c using encoding and then
// convert the bytes one-by-one.
var unicode = c.charCodeAt(0);
if (unicode > 0x20 && unicode < 0x7F &&
// " # < > ` (do not escape '?')
[0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1) {
return c;
}
return encodeURIComponent(c);
}
var EOF = undefined,
ALPHA = /[a-zA-Z]/,
ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
function parse(input, stateOverride, base) {
var this$1 = this;
function err(message) {
errors.push(message);
}
var state = stateOverride || 'scheme start',
cursor = 0,
buffer = '',
seenAt = false,
seenBracket = false,
errors = [];
loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {
var c = input[cursor];
switch (state) {
case 'scheme start':
if (c && ALPHA.test(c)) {
buffer += c.toLowerCase(); // ASCII-safe
state = 'scheme';
} else if (!stateOverride) {
buffer = '';
state = 'no scheme';
continue;
} else {
err('Invalid scheme.');
break loop;
}
break;
case 'scheme':
if (c && ALPHANUMERIC.test(c)) {
buffer += c.toLowerCase(); // ASCII-safe
} else if (':' == c) {
this$1._scheme = buffer;
buffer = '';
if (stateOverride) {
break loop;
}
if (isRelativeScheme(this$1._scheme)) {
this$1._isRelative = true;
}
if ('file' == this$1._scheme) {
state = 'relative';
} else if (this$1._isRelative && base && base._scheme == this$1._scheme) {
state = 'relative or authority';
} else if (this$1._isRelative) {
state = 'authority first slash';
} else {
state = 'scheme data';
}
} else if (!stateOverride) {
buffer = '';
cursor = 0;
state = 'no scheme';
continue;
} else if (EOF == c) {
break loop;
} else {
err('Code point not allowed in scheme: ' + c);
break loop;
}
break;
case 'scheme data':
if ('?' == c) {
state = 'query';
} else if ('#' == c) {
this$1._fragment = '#';
state = 'fragment';
} else {
// XXX error handling
if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
this$1._schemeData += percentEscape(c);
}
}
break;
case 'no scheme':
if (!base || !isRelativeScheme(base._scheme)) {
err('Missing scheme.');
invalid.call(this$1);
} else {
state = 'relative';
continue;
}
break;
case 'relative or authority':
if ('/' == c && '/' == input[cursor + 1]) {
state = 'authority ignore slashes';
} else {
err('Expected /, got: ' + c);
state = 'relative';
continue;
}
break;
case 'relative':
this$1._isRelative = true;
if ('file' != this$1._scheme) { this$1._scheme = base._scheme; }
if (EOF == c) {
this$1._host = base._host;
this$1._port = base._port;
this$1._path = base._path.slice();
this$1._query = base._query;
this$1._username = base._username;
this$1._password = base._password;
break loop;
} else if ('/' == c || '\\' == c) {
if ('\\' == c) { err('\\ is an invalid code point.'); }
state = 'relative slash';
} else if ('?' == c) {
this$1._host = base._host;
this$1._port = base._port;
this$1._path = base._path.slice();
this$1._query = '?';
this$1._username = base._username;
this$1._password = base._password;
state = 'query';
} else if ('#' == c) {
this$1._host = base._host;
this$1._port = base._port;
this$1._path = base._path.slice();
this$1._query = base._query;
this$1._fragment = '#';
this$1._username = base._username;
this$1._password = base._password;
state = 'fragment';
} else {
var nextC = input[cursor + 1];
var nextNextC = input[cursor + 2];
if ('file' != this$1._scheme || !ALPHA.test(c) || nextC != ':' && nextC != '|' || EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC) {
this$1._host = base._host;
this$1._port = base._port;
this$1._username = base._username;
this$1._password = base._password;
this$1._path = base._path.slice();
this$1._path.pop();
}
state = 'relative path';
continue;
}
break;
case 'relative slash':
if ('/' == c || '\\' == c) {
if ('\\' == c) {
err('\\ is an invalid code point.');
}
if ('file' == this$1._scheme) {
state = 'file host';
} else {
state = 'authority ignore slashes';
}
} else {
if ('file' != this$1._scheme) {
this$1._host = base._host;
this$1._port = base._port;
this$1._username = base._username;
this$1._password = base._password;
}
state = 'relative path';
continue;
}
break;
case 'authority first slash':
if ('/' == c) {
state = 'authority second slash';
} else {
err("Expected '/', got: " + c);
state = 'authority ignore slashes';
continue;
}
break;
case 'authority second slash':
state = 'authority ignore slashes';
if ('/' != c) {
err("Expected '/', got: " + c);
continue;
}
break;
case 'authority ignore slashes':
if ('/' != c && '\\' != c) {
state = 'authority';
continue;
} else {
err('Expected authority, got: ' + c);
}
break;
case 'authority':
if ('@' == c) {
if (seenAt) {
err('@ already seen.');
buffer += '%40';
}
seenAt = true;
for (var i = 0; i < buffer.length; i++) {
var cp = buffer[i];
if ('\t' == cp || '\n' == cp || '\r' == cp) {
err('Invalid whitespace in authority.');
continue;
}
// XXX check URL code points
if (':' == cp && null === this$1._password) {
this$1._password = '';
continue;
}
var tempC = percentEscape(cp);
null !== this$1._password ? this$1._password += tempC : this$1._username += tempC;
}
buffer = '';
} else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
cursor -= buffer.length;
buffer = '';
state = 'host';
continue;
} else {
buffer += c;
}
break;
case 'file host':
if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {
state = 'relative path';
} else if (buffer.length == 0) {
state = 'relative path start';
} else {
this$1._host = IDNAToASCII.call(this$1, buffer);
buffer = '';
state = 'relative path start';
}
continue;
} else if ('\t' == c || '\n' == c || '\r' == c) {
err('Invalid whitespace in file host.');
} else {
buffer += c;
}
break;
case 'host':
case 'hostname':
if (':' == c && !seenBracket) {
// XXX host parsing
this$1._host = IDNAToASCII.call(this$1, buffer);
buffer = '';
state = 'port';
if ('hostname' == stateOverride) {
break loop;
}
} else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
this$1._host = IDNAToASCII.call(this$1, buffer);
buffer = '';
state = 'relative path start';
if (stateOverride) {
break loop;
}
continue;
} else if ('\t' != c && '\n' != c && '\r' != c) {
if ('[' == c) {
seenBracket = true;
} else if (']' == c) {
seenBracket = false;
}
buffer += c;
} else {
err('Invalid code point in host/hostname: ' + c);
}
break;
case 'port':
if (/[0-9]/.test(c)) {
buffer += c;
} else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) {
if ('' != buffer) {
var temp = parseInt(buffer, 10);
if (temp != relative[this$1._scheme]) {
this$1._port = temp + '';
}
buffer = '';
}
if (stateOverride) {
break loop;
}
state = 'relative path start';
continue;
} else if ('\t' == c || '\n' == c || '\r' == c) {
err('Invalid code point in port: ' + c);
} else {
invalid.call(this$1);
}
break;
case 'relative path start':
if ('\\' == c) { err("'\\' not allowed in path."); }
state = 'relative path';
if ('/' != c && '\\' != c) {
continue;
}
break;
case 'relative path':
if (EOF == c || '/' == c || '\\' == c || !stateOverride && ('?' == c || '#' == c)) {
if ('\\' == c) {
err('\\ not allowed in relative path.');
}
var tmp;
if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
buffer = tmp;
}
if ('..' == buffer) {
this$1._path.pop();
if ('/' != c && '\\' != c) {
this$1._path.push('');
}
} else if ('.' == buffer && '/' != c && '\\' != c) {
this$1._path.push('');
} else if ('.' != buffer) {
if ('file' == this$1._scheme && this$1._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {
buffer = buffer[0] + ':';
}
this$1._path.push(buffer);
}
buffer = '';
if ('?' == c) {
this$1._query = '?';
state = 'query';
} else if ('#' == c) {
this$1._fragment = '#';
state = 'fragment';
}
} else if ('\t' != c && '\n' != c && '\r' != c) {
buffer += percentEscape(c);
}
break;
case 'query':
if (!stateOverride && '#' == c) {
this$1._fragment = '#';
state = 'fragment';
} else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
this$1._query += percentEscapeQuery(c);
}
break;
case 'fragment':
if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
this$1._fragment += c;
}
break;
}
cursor++;
}
}
function clear() {
this._scheme = '';
this._schemeData = '';
this._username = '';
this._password = null;
this._host = '';
this._port = '';
this._path = [];
this._query = '';
this._fragment = '';
this._isInvalid = false;
this._isRelative = false;
}
// Does not process domain names or IP addresses.
// Does not handle encoding for the query parameter.
function URL(url, base /* , encoding */) {
if (base !== undefined && !(base instanceof URL)) { base = new URL(String(base)); }
this._url = url;
clear.call(this);
var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
// encoding = encoding || 'utf-8'
parse.call(this, input, null, base);
}
URL.prototype = {
toString: function toString() {
return this.href;
},
get href() {
if (this._isInvalid) { return this._url; }
var authority = '';
if ('' != this._username || null != this._password) {
authority = this._username + (null != this._password ? ':' + this._password : '') + '@';
}
return this.protocol + (this._isRelative ? '//' + authority + this.host : '') + this.pathname + this._query + this._fragment;
},
set href(href) {
clear.call(this);
parse.call(this, href);
},
get protocol() {
return this._scheme + ':';
},
set protocol(protocol) {
if (this._isInvalid) { return; }
parse.call(this, protocol + ':', 'scheme start');
},
get host() {
return this._isInvalid ? '' : this._port ? this._host + ':' + this._port : this._host;
},
set host(host) {
if (this._isInvalid || !this._isRelative) { return; }
parse.call(this, host, 'host');
},
get hostname() {
return this._host;
},
set hostname(hostname) {
if (this._isInvalid || !this._isRelative) { return; }
parse.call(this, hostname, 'hostname');
},
get port() {
return this._port;
},
set port(port) {
if (this._isInvalid || !this._isRelative) { return; }
parse.call(this, port, 'port');
},
get pathname() {
return this._isInvalid ? '' : this._isRelative ? '/' + this._path.join('/') : this._schemeData;
},
set pathname(pathname) {
if (this._isInvalid || !this._isRelative) { return; }
this._path = [];
parse.call(this, pathname, 'relative path start');
},
get search() {
return this._isInvalid || !this._query || '?' == this._query ? '' : this._query;
},
set search(search) {
if (this._isInvalid || !this._isRelative) { return; }
this._query = '?';
if ('?' == search[0]) { search = search.slice(1); }
parse.call(this, search, 'query');
},
get searchParams() {
return new URLSearchParams(this.search);
},
get hash() {
return this._isInvalid || !this._fragment || '#' == this._fragment ? '' : this._fragment;
},
set hash(hash) {
if (this._isInvalid) { return; }
this._fragment = '#';
if ('#' == hash[0]) { hash = hash.slice(1); }
parse.call(this, hash, 'fragment');
},
get origin() {
var host;
if (this._isInvalid || !this._scheme) {
return '';
}
// javascript: Gecko returns String(""), WebKit/Blink String("null")
// Gecko throws error for "data://"
// data: Gecko returns "", Blink returns "data://", WebKit returns "null"
// Gecko returns String("") for file: mailto:
// WebKit/Blink returns String("SCHEME://") for file: mailto:
switch (this._scheme) {
case 'data':
case 'file':
case 'javascript':
case 'mailto':
return 'null';
}
host = this.host;
if (!host) {
return '';
}
return this._scheme + '://' + host;
}
};
module.exports = URL;
/***/ }),
/* 10 */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
// https://github.com/ericf/css-mediaquery
var RE_MEDIA_QUERY = /^(?:(only|not)?\s*([_a-z][_a-z0-9-]*)|(\([^\)]+\)))(?:\s*and\s*(.*))?$/i,
RE_MQ_EXPRESSION = /^\(\s*([_a-z-][_a-z0-9-]*)\s*(?:\:\s*([^\)]+))?\s*\)$/,
RE_MQ_FEATURE = /^(?:(min|max)-)?(.+)/;
function _matches(media, values) {
return _parseQuery(media).some(function (query) {
var inverse = query.inverse;
var typeMatch = query.type === 'all' || values.type === query.type;
if (typeMatch && inverse || !(typeMatch || inverse)) {
return false;
}
var expressionsMatch = query.expressions.every(function (expression) {
var feature = expression.feature,
modifier = expression.modifier,
expValue = expression.value,
value = values[feature];
if (!value) {
return false;
}
switch (feature) {
case 'width':
case 'height':
expValue = parseFloat(expValue);
value = parseFloat(value);
break;
}
switch (modifier) {
case 'min':
return value >= expValue;
case 'max':
return value <= expValue;
default:
return value === expValue;
}
});
return expressionsMatch && !inverse || !expressionsMatch && inverse;
});
}
function _parseQuery(media) {
return media.split(',').map(function (query) {
query = query.trim();
var captures = query.match(RE_MEDIA_QUERY);
if (!captures) {
throw new SyntaxError('Invalid CSS media query: "' + query + '"');
}
var modifier = captures[1],
type = captures[2],
expressions = ((captures[3] || '') + (captures[4] || '')).trim(),
parsed = {};
parsed.inverse = !!modifier && modifier.toLowerCase() === 'not';
parsed.type = type ? type.toLowerCase() : 'all';
if (!expressions) {
parsed.expressions = [];
return parsed;
}
expressions = expressions.match(/\([^\)]+\)/g);
if (!expressions) {
throw new SyntaxError('Invalid CSS media query: "' + query + '"');
}
parsed.expressions = expressions.map(function (expression) {
var captures = expression.match(RE_MQ_EXPRESSION);
if (!captures) {
throw new SyntaxError('Invalid CSS media query: "' + query + '"');
}
var feature = captures[1].toLowerCase().match(RE_MQ_FEATURE);
return {
modifier: feature[1],
feature: feature[2],
value: captures[2]
};
});
return parsed;
});
}
function matchMedia(media) {
var mql = {
matches: false,
media: media
};
if (media === '') {
mql.matches = true;
return mql;
}
mql.matches = _matches(media, {
type: 'screen',
width: window.screen.width,
height: window.screen.height
});
return mql;
}
module.exports = matchMedia;
/***/ })
/******/ ])};
/***/ }),
/* 7 */
/*!********************************************************!*\
!*** ./packages/weex-rax-framework/src/define.weex.js ***!
\********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function (modules) {
function define(name, deps, factory) {
if (deps instanceof Function) {
factory = deps;
deps = [];
}
modules[name] = {
factory: factory,
deps: deps,
module: { exports: {} },
isInitialized: false,
hasError: false
};
}
return define;
};
/***/ }),
/* 8 */
/*!*********************************************************!*\
!*** ./packages/weex-rax-framework/src/require.weex.js ***!
\*********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function (modules) {
function require(name) {
var mod = modules[name];
if (mod && mod.isInitialized) {
return mod.module.exports;
}
if (!mod) {
throw new Error('Requiring unknown module "' + name + '"');
}
if (mod.hasError) {
throw new Error('Requiring module "' + name + '" which threw an exception');
}
try {
mod.isInitialized = true;
mod.factory(require, mod.module.exports, mod.module);
} catch (e) {
mod.hasError = true;
mod.isInitialized = false;
throw e;
}
return mod.module.exports;
}
return require;
};
/***/ }),
/* 9 */
/*!***********************************************************!*\
!*** ./packages/weex-rax-framework/src/downgrade.weex.js ***!
\***********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _semver = __webpack_require__(/*! ./semver */ 10);
var _semver2 = _interopRequireDefault(_semver);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function normalizeVersion(v) {
if (v == '*') {
return v;
}
v = typeof v === 'string' ? v : '';
var split = v.split('.');
var i = 0;
var result = [];
while (i < 3) {
var s = typeof split[i] === 'string' && split[i] ? split[i] : '0';
result.push(s);
i++;
}
return result.join('.');
} /* global WXEnvironment */
function getError(key, val, criteria) {
var result = {
isDowngrade: true,
errorType: 1,
code: 1000
};
var getMsg = function getMsg(key, val, criteria) {
return 'Downgrade[' + key + '] :: deviceInfo ' + val + ' matched criteria ' + criteria;
};
var _key = key.toLowerCase();
if (_key.indexOf('osversion') >= 0) {
result.code = 1001;
} else if (_key.indexOf('appversion') >= 0) {
result.code = 1002;
} else if (_key.indexOf('weexversion') >= 0) {
result.code = 1003;
} else if (_key.indexOf('devicemodel') >= 0) {
result.code = 1004;
}
result.errorMessage = getMsg(key, val, criteria);
return result;
}
/**
* config
*
* {
* ios: {
* osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* deviceModel: ['modelA', 'modelB', ...]
* },
* android: {
* osVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* appVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* weexVersion: '>1.0.0' or '>=1.0.0' or '<1.0.0' or '<=1.0.0' or '1.0.0'
* deviceModel: ['modelA', 'modelB', ...]
* }
* }
*
*/
function check(config) {
var result = {
isDowngrade: false
};
var deviceInfo = WXEnvironment;
var platform = deviceInfo.platform || 'unknow';
var dPlatform = platform.toLowerCase();
var cObj = config[dPlatform] || {};
for (var i in deviceInfo) {
var key = i;
var keyLower = key.toLowerCase();
var val = deviceInfo[i];
var isVersion = keyLower.indexOf('version') >= 0;
var isDeviceModel = keyLower.indexOf('devicemodel') >= 0;
var criteria = cObj[i];
if (criteria && isVersion) {
var c = normalizeVersion(criteria);
var d = normalizeVersion(deviceInfo[i]);
if (_semver2.default.satisfies(d, c)) {
result = getError(key, val, criteria);
break;
}
} else if (isDeviceModel) {
var _criteria = Array.isArray(criteria) ? criteria : [criteria];
if (_criteria.indexOf(val) >= 0) {
result = getError(key, val, criteria);
break;
}
}
}
return result;
}
module.exports = function (__weex_require__) {
return function (config) {
var nativeInstanceWrap = __weex_require__('@weex-module/instanceWrap');
var result = check(config);
if (result.isDowngrade) {
nativeInstanceWrap.error(result.errorType, result.code, result.errorMessage);
return true;
}
return false;
};
};
/***/ }),
/* 10 */
/*!***************************************************!*\
!*** ./packages/weex-rax-framework/src/semver.js ***!
\***************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
exports.default = {
satisfies: function satisfies(left, right) {
var regex = /(\W+)?([\d|.]+)/;
if ((typeof left === 'undefined' ? 'undefined' : _typeof(left)) + (typeof right === 'undefined' ? 'undefined' : _typeof(right)) != 'stringstring') { return false; }
if (right == '*') {
return true;
}
var arr = right.match(regex);
var a = left.split('.'),
i = 0,
b = arr[2].split('.'),
len = Math.max(a.length, b.length);
var flag = 0;
for (var _i = 0; _i < len; _i++) {
if (a[_i] && !b[_i] && parseInt(a[_i]) > 0 || parseInt(a[_i]) > parseInt(b[_i])) {
flag = 1;
break;
} else if (b[_i] && !a[_i] && parseInt(b[_i]) > 0 || parseInt(a[_i]) < parseInt(b[_i])) {
flag = -1;
break;
}
}
switch (arr[1]) {
case '<':
if (flag === -1) {
return true;
}
break;
case '<=':
if (flag !== 1) {
return true;
}
break;
case '>':
if (flag === 1) {
return true;
}
break;
case '>=':
if (flag !== -1) {
return true;
}
break;
default:
if (flag === 0) {
return true;
}
break;
}
return false;
}
};
module.exports = exports['default'];
/***/ }),
/* 11 */
/*!**********************************************************!*\
!*** ./packages/weex-rax-framework/src/document.weex.js ***!
\**********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _emitter = __webpack_require__(/*! ./emitter */ 1);
var _emitter2 = _interopRequireDefault(_emitter);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var DOM_MODULE = '@weex-module/dom';
var VISIBLE = 'visible';
var HIDDEN = 'hidden';
var VISIBILITY_CHANGE_EVENT = 'visibilitychange';
function addBodyAppearListener(document) {
document.body.addEvent('viewappear', function (e) {
document.visibilityState = VISIBLE;
e.type = VISIBILITY_CHANGE_EVENT;
document.dispatchEvent(e);
});
document.body.addEvent('viewdisappear', function (e) {
document.visibilityState = HIDDEN;
e.type = VISIBILITY_CHANGE_EVENT;
document.dispatchEvent(e);
});
}
function removeBodyAppearListener(document) {
if (document.body) {
document.body.removeEvent('viewappear');
document.body.removeEvent('viewdisappear');
}
}
module.exports = function (__weex_require__, document) {
// Add w3c events
var documentEmitter = new _emitter2.default();
var hasVisibilityEventPending = false;
// Weex freezed the document maybe throw error
try {
document.addEventListener = function (type, listener) {
if (type === VISIBILITY_CHANGE_EVENT) {
if (document.body) {
addBodyAppearListener(document);
} else {
hasVisibilityEventPending = true;
}
}
documentEmitter.on(type, listener);
};
document.removeEventListener = function (type, listener) {
if (type === VISIBILITY_CHANGE_EVENT) {
removeBodyAppearListener(document);
}
documentEmitter.off(type, listener);
};
document.dispatchEvent = function (e) {
documentEmitter.emit(e.type, e);
};
// FontFace
document.fonts = {
add: function add(fontFace) {
var domModule = __weex_require__(DOM_MODULE);
domModule.addRule('fontFace', {
fontFamily: fontFace.family,
src: fontFace.source // url('uri') : single quotes are required around uri, and double quotes can not work in weex
});
}
};
// Init visibility state
document.visibilityState = VISIBLE;
// Hijack the origin createBody
var originCreateBody = document.createBody;
Object.defineProperty(document, 'createBody', {
value: function value() {
var body = originCreateBody.apply(document, arguments);
if (hasVisibilityEventPending) {
addBodyAppearListener(document);
}
return body;
}
});
} catch (e) {
console.log(e);
}
return document;
};
/***/ }),
/* 12 */
/*!**********************************************************!*\
!*** ./packages/weex-rax-framework/src/location.weex.js ***!
\**********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var LOCATION_MODULE = '@weex-module/location';
var NAVIGATOR_MODULE = '@weex-module/navigator';
module.exports = function (__weex_require__, location) {
location.assign = function (url) {
var weexNavigator = __weex_require__(NAVIGATOR_MODULE);
weexNavigator.push({
url: url,
animated: 'true'
}, function (e) {
// noop
});
};
location.replace = function (url) {
var weexLocation = __weex_require__(LOCATION_MODULE);
weexLocation.replace(url);
};
location.reload = function (forceReload) {
var weexLocation = __weex_require__(LOCATION_MODULE);
weexLocation.reload(forceReload);
};
return location;
};
/***/ }),
/* 13 */
/*!*******************************************************!*\
!*** ./packages/weex-rax-framework/src/fetch.weex.js ***!
\*******************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var STREAM_MODULE = '@weex-module/stream';
module.exports = function (__weex_require__, Promise) {
function normalizeName(name) {
if (typeof name !== 'string') {
name = String(name);
}
// FIXME: In spdy the response header has name like ":version" that is invalid
// if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
// throw new TypeError('Invalid character in header field name');
// }
return name.toLowerCase();
}
function normalizeValue(value) {
if (typeof value !== 'string') {
value = String(value);
}
return value;
}
function Headers(headers) {
this.originHeaders = headers;
this.map = {};
if (headers instanceof Headers) {
headers.forEach(function (value, name) {
this.append(name, value);
}, this);
} else if (headers) {
Object.getOwnPropertyNames(headers).forEach(function (name) {
this.append(name, headers[name]);
}, this);
}
}
Headers.prototype.append = function (name, value) {
name = normalizeName(name);
value = normalizeValue(value);
var oldValue = this.map[name];
this.map[name] = oldValue ? oldValue + ',' + value : value;
};
Headers.prototype.delete = function (name) {
delete this.map[normalizeName(name)];
};
Headers.prototype.get = function (name) {
name = normalizeName(name);
return this.has(name) ? this.map[name] : null;
};
Headers.prototype.has = function (name) {
return this.map.hasOwnProperty(normalizeName(name));
};
Headers.prototype.set = function (name, value) {
this.map[normalizeName(name)] = [normalizeValue(value)];
};
Headers.prototype.forEach = function (callback, thisArg) {
var this$1 = this;
for (var name in this.map) {
if (this$1.map.hasOwnProperty(name)) {
callback.call(thisArg, this$1.map[name], name, this$1);
}
}
};
function consumed(body) {
if (body.bodyUsed) {
return Promise.reject(new TypeError('Already read'));
}
body.bodyUsed = true;
}
function Body() {
this.bodyUsed = false;
this._initBody = function (body, options) {
this._bodyInit = body;
if (typeof body === 'string') {
this._bodyText = body;
} else if (!body) {
this._bodyText = '';
} else {
throw new Error('unsupported BodyInit type');
}
};
this.text = function () {
var rejected = consumed(this);
return rejected ? rejected : Promise.resolve(this._bodyText);
};
this.json = function () {
return this.text().then(JSON.parse);
};
return this;
}
// HTTP methods whose capitalization should be normalized
var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
function normalizeMethod(method) {
var upcased = method.toUpperCase();
return methods.indexOf(upcased) > -1 ? upcased : method;
}
function Request(input, options) {
options = options || {};
var body = options.body;
if (Request.prototype.isPrototypeOf(input)) {
if (input.bodyUsed) {
throw new TypeError('Already read');
}
this.url = input.url;
this.credentials = input.credentials;
if (!options.headers) {
this.headers = new Headers(input.headers);
}
this.method = input.method;
this.mode = input.mode;
if (!body) {
body = input._bodyInit;
input.bodyUsed = true;
}
} else {
this.url = input;
}
this.credentials = options.credentials || this.credentials || 'omit';
if (options.headers || !this.headers) {
this.headers = new Headers(options.headers);
}
this.method = normalizeMethod(options.method || this.method || 'GET');
this.mode = options.mode || this.mode || null;
this.referrer = null;
if ((this.method === 'GET' || this.method === 'HEAD') && body) {
throw new TypeError('Body not allowed for GET or HEAD requests');
}
this._initBody(body, options);
}
Request.prototype.clone = function () {
return new Request(this);
};
function headers(xhr) {
var head = new Headers();
var pairs = xhr.getAllResponseHeaders().trim().split('\n');
pairs.forEach(function (header) {
var split = header.trim().split(':');
var key = split.shift().trim();
var value = split.join(':').trim();
head.append(key, value);
});
return head;
}
Body.call(Request.prototype);
function Response(bodyInit, options) {
if (!options) {
options = {};
}
this.type = 'default';
this.status = 'status' in options ? options.status : 200;
this.ok = this.status >= 200 && this.status < 300;
this.statusText = 'statusText' in options ? options.statusText : 'OK';
this.headers = new Headers(options.headers);
this.url = options.url || '';
this._initBody(bodyInit, options);
}
Body.call(Response.prototype);
Response.prototype.clone = function () {
return new Response(this._bodyInit, {
status: this.status,
statusText: this.statusText,
headers: new Headers(this.headers),
url: this.url
});
};
Response.error = function () {
var response = new Response(null, { status: 0, statusText: '' });
response.type = 'error';
return response;
};
var redirectStatuses = [301, 302, 303, 307, 308];
Response.redirect = function (url, status) {
if (redirectStatuses.indexOf(status) === -1) {
throw new RangeError('Invalid status code');
}
return new Response(null, { status: status, headers: { location: url } });
};
var fetch = function fetch(input, init) {
return new Promise(function (resolve, reject) {
var request;
if (Request.prototype.isPrototypeOf(input) && !init) {
request = input;
} else {
request = new Request(input, init);
}
var params = {
url: request.url,
method: request.method,
headers: request.headers && request.headers.originHeaders
};
if (typeof request._bodyInit !== 'undefined') {
params.body = request._bodyInit;
}
params.type = init && init.dataType ? init.dataType : 'text';
var nativeFetch = __weex_require__(STREAM_MODULE).fetch;
nativeFetch(params, function (response) {
try {
typeof response === 'string' && (response = JSON.parse(response));
var data = typeof response.data === 'string' ? response.data : JSON.stringify(response.data);
var res = new Response(data, {
status: response.status,
statusText: response.statusText,
headers: response.headers,
url: request.url
});
resolve(res);
} catch (err) {
reject(err);
}
}, function (progress) {});
});
};
return {
fetch: fetch,
Headers: Headers,
Request: Request,
Response: Response
};
};
/***/ }),
/* 14 */
/*!****************************************************************!*\
!*** ./packages/weex-rax-framework/src/xmlhttprequest.weex.js ***!
\****************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
var STREAM_MODULE = '@weex-module/stream';
var eventTarget = __webpack_require__(/*! event-target-shim */ 2);
var UNSENT = 0;
var OPENED = 1;
var HEADERS_RECEIVED = 2;
var LOADING = 3;
var DONE = 4;
var XHR_EVENTS = ['abort', 'error', 'load', 'loadstart', 'progress', 'timeout', 'loadend', 'readystatechange'];
module.exports = function (__weex_require__) {
var _class, _temp;
var XMLHttpRequest = (_temp = _class = function (_eventTarget) {
_inherits(XMLHttpRequest, _eventTarget);
// EventTarget automatically initializes these to `null`.
function XMLHttpRequest() {
_classCallCheck(this, XMLHttpRequest);
var _this = _possibleConstructorReturn(this, (XMLHttpRequest.__proto__ || Object.getPrototypeOf(XMLHttpRequest)).call(this));
_this.UNSENT = UNSENT;
_this.OPENED = OPENED;
_this.HEADERS_RECEIVED = HEADERS_RECEIVED;
_this.LOADING = LOADING;
_this.DONE = DONE;
_this.readyState = UNSENT;
_this.status = 0;
_this.statusText = '';
_this.timeout = 0;
_this._aborted = false;
_this._hasError = false;
_this._method = null;
_this._response = '';
_this._url = null;
_this._timedOut = false;
_this._reset();
return _this;
}
_createClass(XMLHttpRequest, [{
key: '_reset',
value: function _reset() {
this.readyState = this.UNSENT;
this.responseHeaders = undefined;
this.status = 0;
this._hasError = false;
this._headers = {};
this._response = '';
this._responseType = '';
this._sent = false;
this._lowerCaseResponseHeaders = {};
this._timedOut = false;
}
}, {
key: 'getAllResponseHeaders',
value: function getAllResponseHeaders() {
if (!this.responseHeaders) {
// according to the spec, return null if no response has been received
return null;
}
var headers = this.responseHeaders || {};
return Object.keys(headers).map(function (headerName) {
return headerName + ': ' + headers[headerName];
}).join('\r\n');
}
}, {
key: 'getResponseHeader',
value: function getResponseHeader(header) {
var value = this._lowerCaseResponseHeaders[header.toLowerCase()];
return value !== undefined ? value : null;
}
}, {
key: 'setRequestHeader',
value: function setRequestHeader(header, value) {
if (this.readyState !== this.OPENED) {
throw new Error('Request has not been opened');
}
this._headers[header.toLowerCase()] = String(value);
}
}, {
key: 'open',
value: function open(method, url, async) {
/* Other optional arguments are not supported yet */
if (this.readyState !== this.UNSENT) {
throw new Error('Cannot open, already sending');
}
if (async !== undefined && !async) {
// async is default
throw new Error('Synchronous http requests are not supported');
}
if (!url) {
throw new Error('Cannot load an empty url');
}
this._method = method.toUpperCase();
this._url = url;
this._aborted = false;
this.setReadyState(this.OPENED);
}
}, {
key: 'send',
value: function send(data) {
var _this2 = this;
if (this.readyState !== this.OPENED) {
throw new Error('Request has not been opened');
}
if (this._sent) {
throw new Error('Request has already been sent');
}
this._sent = true;
var nativeFetch = __weex_require__(STREAM_MODULE).fetch;
nativeFetch({
method: this._method,
url: this._url,
headers: this._headers,
body: data,
type: 'text'
}, function (response) {
try {
typeof response === 'string' && (response = JSON.parse(response));
_this2.status = response.status;
_this2.statusText = response.statusText;
_this2.setResponseHeaders(response.headers);
if (response.ok) {
_this2._response = response.data;
} else {
if (_this2._responseType === '' || _this2._responseType === 'text') {
_this2._response = response.data;
}
_this2._hasError = true;
}
} catch (err) {}
_this2.setReadyState(_this2.DONE);
}, function (progress) {
_this2.status = progress.status;
_this2.statusText = progress.statusText;
_this2.setResponseHeaders(progress.headers);
_this2.setReadyState(progress.readyState);
});
}
}, {
key: 'abort',
value: function abort() {
this._aborted = true;
// TODO: Weex native not support abort now
// only call onreadystatechange if there is something to abort,
// below logic is per spec
if (!(this.readyState === this.UNSENT || this.readyState === this.OPENED && !this._sent || this.readyState === this.DONE)) {
this._reset();
this.setReadyState(this.DONE);
}
// Reset again after, in case modified in handler
this._reset();
}
}, {
key: 'setResponseHeaders',
value: function setResponseHeaders(responseHeaders) {
this.responseHeaders = responseHeaders || null;
var headers = responseHeaders || {};
this._lowerCaseResponseHeaders = Object.keys(headers).reduce(function (lcaseHeaders, headerName) {
lcaseHeaders[headerName.toLowerCase()] = headers[headerName];
return lcaseHeaders;
}, {});
}
}, {
key: 'setReadyState',
value: function setReadyState(newState) {
this.readyState = newState;
this.dispatchEvent({ type: 'readystatechange' });
if (newState === this.DONE) {
if (this._aborted) {
this.dispatchEvent({ type: 'abort' });
} else if (this._hasError) {
if (this._timedOut) {
this.dispatchEvent({ type: 'timeout' });
} else {
this.dispatchEvent({ type: 'error' });
}
} else {
this.dispatchEvent({ type: 'load' });
}
this.dispatchEvent({ type: 'loadend' });
}
}
}, {
key: 'responseType',
get: function get() {
return this._responseType;
},
set: function set(responseType) {
if (this._sent) {
throw new Error('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The ' + 'response type cannot be set after the request has been sent.');
}
this._responseType = responseType;
}
}, {
key: 'responseText',
get: function get() {
if (this._responseType !== '' && this._responseType !== 'text') {
throw new Error("The 'responseText' property is only available if 'responseType' " + ('is set to \'\' or \'text\', but it is \'' + this._responseType + '\'.'));
}
if (this.readyState < LOADING) {
return '';
}
return this._response;
}
}, {
key: 'response',
get: function get() {
var responseType = this.responseType;
if (responseType === '' || responseType === 'text') {
return this.readyState < LOADING || this._hasError ? '' : this._response;
}
if (this.readyState !== DONE) {
return null;
}
}
}]);
return XMLHttpRequest;
}(eventTarget.apply(undefined, XHR_EVENTS)), _class.UNSENT = UNSENT, _class.OPENED = OPENED, _class.HEADERS_RECEIVED = HEADERS_RECEIVED, _class.LOADING = LOADING, _class.DONE = DONE, _temp);
return XMLHttpRequest;
};
/***/ }),
/* 15 */
/*!***********************************************************************************************!*\
!*** ./packages/weex-rax-framework/node_modules/event-target-shim/lib/custom-event-target.js ***!
\***********************************************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* @author Toru Nagashima
* @copyright 2015 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
//-----------------------------------------------------------------------------
// Requirements
//-----------------------------------------------------------------------------
var Commons = __webpack_require__(/*! ./commons */ 0);
var LISTENERS = Commons.LISTENERS;
var ATTRIBUTE = Commons.ATTRIBUTE;
var newNode = Commons.newNode;
//-----------------------------------------------------------------------------
// Helpers
//-----------------------------------------------------------------------------
/**
* Gets a specified attribute listener from a given EventTarget object.
*
* @param {EventTarget} eventTarget - An EventTarget object to get.
* @param {string} type - An event type to get.
* @returns {function|null} The found attribute listener.
*/
function getAttributeListener(eventTarget, type) {
var node = eventTarget[LISTENERS][type];
while (node != null) {
if (node.kind === ATTRIBUTE) {
return node.listener
}
node = node.next;
}
return null
}
/**
* Sets a specified attribute listener to a given EventTarget object.
*
* @param {EventTarget} eventTarget - An EventTarget object to set.
* @param {string} type - An event type to set.
* @param {function|null} listener - A listener to be set.
* @returns {void}
*/
function setAttributeListener(eventTarget, type, listener) {
if (typeof listener !== "function" && typeof listener !== "object") {
listener = null; // eslint-disable-line no-param-reassign
}
var prev = null;
var node = eventTarget[LISTENERS][type];
while (node != null) {
if (node.kind === ATTRIBUTE) {
// Remove old value.
if (prev == null) {
eventTarget[LISTENERS][type] = node.next;
}
else {
prev.next = node.next;
}
}
else {
prev = node;
}
node = node.next;
}
// Add new value.
if (listener != null) {
if (prev == null) {
eventTarget[LISTENERS][type] = newNode(listener, ATTRIBUTE);
}
else {
prev.next = newNode(listener, ATTRIBUTE);
}
}
}
//-----------------------------------------------------------------------------
// Public Interface
//-----------------------------------------------------------------------------
/**
* Defines an `EventTarget` implementation which has `onfoobar` attributes.
*
* @param {EventTarget} EventTargetBase - A base implementation of EventTarget.
* @param {string[]} types - A list of event types which are defined as attribute listeners.
* @returns {EventTarget} The defined `EventTarget` implementation which has attribute listeners.
*/
module.exports.defineCustomEventTarget = function(EventTargetBase, types) {
/**
* The constructor of custom event target.
* @constructor
*/
function EventTarget() {
EventTargetBase.call(this);
}
var descripter = {
constructor: {
value: EventTarget,
configurable: true,
writable: true,
},
};
types.forEach(function(type) {
descripter["on" + type] = {
get: function() {
return getAttributeListener(this, type)
},
set: function(listener) {
setAttributeListener(this, type, listener);
},
configurable: true,
enumerable: true,
};
});
EventTarget.prototype = Object.create(EventTargetBase.prototype, descripter);
return EventTarget
};
/***/ }),
/* 16 */
/*!*****************************************************************************************!*\
!*** ./packages/weex-rax-framework/node_modules/event-target-shim/lib/event-wrapper.js ***!
\*****************************************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
/**
* @author Toru Nagashima
* @copyright 2015 Toru Nagashima. All rights reserved.
* See LICENSE file in root directory for full license.
*/
//-----------------------------------------------------------------------------
// Requirements
//-----------------------------------------------------------------------------
var createUniqueKey = __webpack_require__(/*! ./commons */ 0).createUniqueKey;
//-----------------------------------------------------------------------------
// Constsnts
//-----------------------------------------------------------------------------
/**
* The key of the flag which is turned on by `stopImmediatePropagation` method.
*
* @type {symbol|string}
* @private
*/
var STOP_IMMEDIATE_PROPAGATION_FLAG =
createUniqueKey("stop_immediate_propagation_flag");
/**
* The key of the flag which is turned on by `preventDefault` method.
*
* @type {symbol|string}
* @private
*/
var CANCELED_FLAG = createUniqueKey("canceled_flag");
/**
* The key of the flag that it cannot use `preventDefault` method.
*
* @type {symbol|string}
* @private
*/
var PASSIVE_LISTENER_FLAG = createUniqueKey("passive_listener_flag");
/**
* The key of the original event object.
*
* @type {symbol|string}
* @private
*/
var ORIGINAL_EVENT = createUniqueKey("original_event");
/**
* Method definitions for the event wrapper.
*
* @type {object}
* @private
*/
var wrapperPrototypeDefinition = Object.freeze({
stopPropagation: Object.freeze({
value: function stopPropagation() {
var e = this[ORIGINAL_EVENT];
if (typeof e.stopPropagation === "function") {
e.stopPropagation();
}
},
writable: true,
configurable: true,
}),
stopImmediatePropagation: Object.freeze({
value: function stopImmediatePropagation() {
this[STOP_IMMEDIATE_PROPAGATION_FLAG] = true;
var e = this[ORIGINAL_EVENT];
if (typeof e.stopImmediatePropagation === "function") {
e.stopImmediatePropagation();
}
},
writable: true,
configurable: true,
}),
preventDefault: Object.freeze({
value: function preventDefault() {
if (this[PASSIVE_LISTENER_FLAG]) {
return
}
if (this.cancelable === true) {
this[CANCELED_FLAG] = true;
}
var e = this[ORIGINAL_EVENT];
if (typeof e.preventDefault === "function") {
e.preventDefault();
}
},
writable: true,
configurable: true,
}),
defaultPrevented: Object.freeze({
get: function defaultPrevented() {
return this[CANCELED_FLAG]
},
enumerable: true,
configurable: true,
}),
});
//-----------------------------------------------------------------------------
// Public Interface
//-----------------------------------------------------------------------------
module.exports.STOP_IMMEDIATE_PROPAGATION_FLAG = STOP_IMMEDIATE_PROPAGATION_FLAG;
module.exports.PASSIVE_LISTENER_FLAG = PASSIVE_LISTENER_FLAG;
/**
* Creates an event wrapper.
*
* We cannot modify several properties of `Event` object, so we need to create the wrapper.
* Plus, this wrapper supports non `Event` objects.
*
* @param {Event|{type: string}} event - An original event to create the wrapper.
* @param {EventTarget} eventTarget - The event target of the event.
* @returns {Event} The created wrapper. This object is implemented `Event` interface.
* @private
*/
module.exports.createEventWrapper = function createEventWrapper(event, eventTarget) {
var timeStamp = (
typeof event.timeStamp === "number" ? event.timeStamp : Date.now()
);
var propertyDefinition = {
type: {value: event.type, enumerable: true},
target: {value: eventTarget, enumerable: true},
currentTarget: {value: eventTarget, enumerable: true},
eventPhase: {value: 2, enumerable: true},
bubbles: {value: Boolean(event.bubbles), enumerable: true},
cancelable: {value: Boolean(event.cancelable), enumerable: true},
timeStamp: {value: timeStamp, enumerable: true},
isTrusted: {value: false, enumerable: true},
};
propertyDefinition[STOP_IMMEDIATE_PROPAGATION_FLAG] = {value: false, writable: true};
propertyDefinition[CANCELED_FLAG] = {value: false, writable: true};
propertyDefinition[PASSIVE_LISTENER_FLAG] = {value: false, writable: true};
propertyDefinition[ORIGINAL_EVENT] = {value: event};
// For CustomEvent.
if (typeof event.detail !== "undefined") {
propertyDefinition.detail = {value: event.detail, enumerable: true};
}
return Object.create(
Object.create(event, wrapperPrototypeDefinition),
propertyDefinition
)
};
/***/ }),
/* 17 */
/*!***********************************************************!*\
!*** ./packages/weex-rax-framework/src/websocket.weex.js ***!
\***********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) { descriptor.writable = true; } Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) { defineProperties(Constructor.prototype, protoProps); } if (staticProps) { defineProperties(Constructor, staticProps); } return Constructor; }; }();
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var eventTarget = __webpack_require__(/*! event-target-shim */ 2);
var WEB_SOCKET_MODULE = '@weex-module/webSocket';
var CONNECTING = 0;
var OPEN = 1;
var CLOSING = 2;
var CLOSED = 3;
var CLOSE_NORMAL = 1000;
var WEBSOCKET_EVENTS = ['close', 'error', 'message', 'open'];
/**
* Event object passed to the `onopen`, `onclose`, `onmessage`, `onerror`
* callbacks of `WebSocket`.
*
* The `type` property is "open", "close", "message", "error" respectively.
*
* In case of "message", the `data` property contains the incoming data.
*/
var WebSocketEvent = function WebSocketEvent(type, eventInitDict) {
_classCallCheck(this, WebSocketEvent);
this.type = type.toString();
Object.assign(this, eventInitDict);
};
module.exports = function (__weex_require__) {
var _class, _temp;
/**
* Browser-compatible WebSockets implementation.
*
* See https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
* See https://github.com/websockets/ws
*/
var WebSocket = (_temp = _class = function (_eventTarget) {
_inherits(WebSocket, _eventTarget);
function WebSocket(url, protocols) {
_classCallCheck(this, WebSocket);
var _this = _possibleConstructorReturn(this, (WebSocket.__proto__ || Object.getPrototypeOf(WebSocket)).call(this));
var websocket = __weex_require__(WEB_SOCKET_MODULE);
// eslint-disable-next-line new-cap
websocket.WebSocket(url, protocols);
_this.readyState = CONNECTING;
_this.websocket = websocket;
websocket.onmessage(function (ev) {
_this.dispatchEvent(new WebSocketEvent('message', ev));
});
websocket.onopen(function (ev) {
_this.readyState = OPEN;
_this.dispatchEvent(new WebSocketEvent('open'));
});
websocket.onclose(function (ev) {
_this.readyState = CLOSED;
_this.dispatchEvent(new WebSocketEvent('close', {
code: ev.code,
reason: ev.reason
}));
});
websocket.onerror(function (ev) {
_this.dispatchEvent(new WebSocketEvent('error', ev));
});
return _this;
}
_createClass(WebSocket, [{
key: 'close',
value: function close(code, reason) {
if (this.readyState === CLOSING || this.readyState === CLOSED) {
return;
}
this.readyState = CLOSING;
this.websocket.close(code, reason);
}
}, {
key: 'send',
value: function send(data) {
if (typeof data === 'string') {
this.websocket.send(data);
return;
}
throw new Error('Unsupported data type');
}
}]);
return WebSocket;
}(eventTarget(WEBSOCKET_EVENTS)), _class.CONNECTING = CONNECTING, _class.OPEN = OPEN, _class.CLOSING = CLOSING, _class.CLOSED = CLOSED, _temp);
return WebSocket;
};
/***/ }),
/* 18 */
/*!*******************************************************!*\
!*** ./packages/weex-rax-framework/src/timer.weex.js ***!
\*******************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var TIMER_MODULE = '@weex-module/timer';
module.exports = function (__weex_require__, document) {
var setTimeout = function setTimeout(handler, time) {
var timer = __weex_require__(TIMER_MODULE);
timer.setTimeout(handler, time);
return document.taskCenter.callbackManager.lastCallbackId.toString();
};
var setInterval = function setInterval(handler, time) {
var timer = __weex_require__(TIMER_MODULE);
timer.setInterval(handler, time);
return document.taskCenter.callbackManager.lastCallbackId.toString();
};
var clearTimeout = function clearTimeout(n) {
var timer = __weex_require__(TIMER_MODULE);
timer.clearTimeout(n);
};
var clearInterval = function clearInterval(n) {
var timer = __weex_require__(TIMER_MODULE);
timer.clearInterval(n);
};
var requestAnimationFrame = function requestAnimationFrame(callback) {
var timer = __weex_require__(TIMER_MODULE);
return timer.setTimeout(callback, 16);
};
var cancelAnimationFrame = function cancelAnimationFrame(n) {
var timer = __weex_require__(TIMER_MODULE);
timer.clearTimeout(n);
};
return {
setTimeout: setTimeout,
clearTimeout: clearTimeout,
setInterval: setInterval,
clearInterval: clearInterval,
requestAnimationFrame: requestAnimationFrame,
cancelAnimationFrame: cancelAnimationFrame
};
};
/***/ }),
/* 19 */
/*!********************************************************!*\
!*** ./packages/weex-rax-framework/src/base64.weex.js ***!
\********************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
module.exports = function () {
var base64 = {};
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
// encoder
// [https://gist.github.com/999166] by [https://github.com/nignag]
base64.btoa = function (input) {
var str = String(input);
for (
// initialize result and counter
var block, charCode, idx = 0, map = chars, output = '';
// if the next str index does not exist:
// change the mapping table to "="
// check if d has no fractional digits
str.charAt(idx | 0) || (map = '=', idx % 1);
// "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
output += map.charAt(63 & block >> 8 - idx % 1 * 8)) {
charCode = str.charCodeAt(idx += 3 / 4);
if (charCode > 0xFF) {
throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");
}
block = block << 8 | charCode;
}
return output;
};
// decoder
// [https://gist.github.com/1020396] by [https://github.com/atk]
base64.atob = function (input) {
var str = String(input).replace(/=+$/, '');
if (str.length % 4 == 1) {
throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");
}
for (
// initialize result and counters
var bc = 0, bs, buffer, idx = 0, output = '';
// get next character
buffer = str.charAt(idx++);
// character found in table? initialize bit storage and add its ascii value;
~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
// and if not first of each 4 characters,
// convert the first 8 bits to one ascii character
bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {
// try to find character in table (0-63, not found => -1)
buffer = chars.indexOf(buffer);
}
return output;
};
return base64;
};
/***/ }),
/* 20 */
/*!*************************************************************!*\
!*** ./packages/weex-rax-framework/src/performance.weex.js ***!
\*************************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
module.exports = function (responseEnd) {
var _performance$timing;
var performance = {};
// TODO: current can not get navigationStart time
performance.timing = (_performance$timing = {
unloadEventStart: 0,
unloadEventEnd: 0,
navigationStart: responseEnd,
redirectStart: 0,
redirectEnd: 0,
fetchStart: responseEnd,
domainLookupStart: responseEnd,
domainLookupEnd: responseEnd,
connectStart: responseEnd,
secureConnectionStart: responseEnd
}, _defineProperty(_performance$timing, "connectStart", responseEnd), _defineProperty(_performance$timing, "requestStart", responseEnd), _defineProperty(_performance$timing, "responseStart", responseEnd), _defineProperty(_performance$timing, "responseEnd", responseEnd), _defineProperty(_performance$timing, "domLoading", 0), _defineProperty(_performance$timing, "domInteractive", 0), _defineProperty(_performance$timing, "domComplete", 0), _defineProperty(_performance$timing, "domContentLoadedEventStart", 0), _defineProperty(_performance$timing, "domContentLoadedEventEnd", 0), _defineProperty(_performance$timing, "loadEventStart", 0), _defineProperty(_performance$timing, "loadEventEnd", 0), _performance$timing);
performance.now = function () {
return Date.now() - performance.timing.navigationStart;
};
return performance;
};
/***/ }),
/* 21 */
/*!*******************************************************!*\
!*** ./packages/weex-rax-framework/src/event.weex.js ***!
\*******************************************************/
/*! no static exports found */
/*! all exports used */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) { Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
module.exports = function () {
var Event = function Event(type) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
_classCallCheck(this, Event);
this.type = type;
this.bubbles = Boolean(params.bubbles);
this.cancelable = Boolean(params.cancelable);
};
var CustomEvent = function (_Event) {
_inherits(CustomEvent, _Event);
function CustomEvent(type) {
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
_classCallCheck(this, CustomEvent);
var _this = _possibleConstructorReturn(this, (CustomEvent.__proto__ || Object.getPrototypeOf(CustomEvent)).call(this, type, params));
_this.detail = params.detail;
return _this;
}
return CustomEvent;
}(Event);
return {
Event: Event,
CustomEvent: CustomEvent
};
};
/***/ })
/******/ ]);
});
var Rax = unwrapExports(framework_weex);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var frameworks$1 = {
Vanilla: Vanilla,
Vue: Vue,
Rax: Rax,
Weex: Weex$2
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var protocol = {
// weex instances
_instances: {},
// api meta info
_meta: {},
// Weex.registerApiModule used this to register and access apiModules.
apiModule: {},
// get the api method meta info array for the module.
getApiModuleMeta: function (moduleName) {
var metaObj = {};
metaObj[moduleName] = this._meta[moduleName];
return metaObj
},
// Set meta info for a api module.
// If there is a same named api, just replace it.
// opts:
// - metaObj: meta object like
// {
// dom: [{
// name: 'addElement',
// args: ['string', 'object']
// }]
// }
setApiModuleMeta: function (metaObj) {
var moduleName;
for (var k in metaObj) {
if (metaObj.hasOwnProperty(k)) {
moduleName = k;
}
}
var metaArray = this._meta[moduleName];
if (!metaArray) {
this._meta[moduleName] = metaObj[moduleName];
}
else {
var nameObj = {};
metaObj[moduleName].forEach(function (api) {
nameObj[api.name] = api;
});
metaArray.forEach(function (api, i) {
if (nameObj[api.name]) {
metaArray[i] = nameObj[api.name];
delete nameObj[api.name];
}
});
for (var k$1 in metaObj) {
if (metaObj.hasOwnProperty(k$1)) {
metaArray.push(metaObj[k$1]);
}
}
}
this._meta[moduleName] = metaObj[moduleName];
},
// Set meta info for a single api.
// opts:
// - moduleName: api module name.
// - meta: a meta object like:
// {
// name: 'addElement',
// args: ['string', 'object']
// }
setApiMeta: function (moduleName, meta) {
var metaArray = this._meta[moduleName];
if (!metaArray) {
this._meta[moduleName] = [meta];
}
else {
var metaIdx = -1;
metaArray.forEach(function (api, i) {
var name; // todo
if (meta.name === name) {
metaIdx = i;
}
});
if (metaIdx !== -1) {
metaArray[metaIdx] = meta;
}
else {
metaArray.push(meta);
}
}
}
};
// _registerModules([{
// modal: [{
// name: 'toast',
// args: ['object', 'function']
// }, {
// name: 'alert',
// args: ['object', 'function']
// }, {
// name: 'confirm',
// args: ['object', 'function']
// }, {
// name: 'prompt',
// args: ['object', 'function']
// }]
// }, {
// animation: [{
// name: 'transition',
// args: ['string', 'object', 'function']
// }]
// }])
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var config$4 = {
weexVersion: '0.5.0',
debug: false,
validRoots: ['div', 'list', 'vlist', 'scroller'],
downgrade: {
// root: true
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function isArray (arr) {
return Array.isArray
? Array.isArray(arr)
: (Object.prototype.toString.call(arr) === '[object Array]')
}
function slice (arr, start, end) {
if (isArray(arr)) {
return arr.slice(start, end)
}
var slice = Array.prototype.slice;
return slice.call(arr, start, end)
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global Image */
// const WEAPP_STYLE_ID = 'weapp-style'
var vendors = ['ms', 'moz', 'webkit', 'o'];
var _isWebpSupported = false; (function isSupportWebp () {
try {
var webP = new Image();
webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdA'
+ 'SoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';
webP.onload = function () {
if (webP.height === 2) {
_isWebpSupported = true;
}
};
}
catch (e) {
// do nothing.
}
})();
var _isStickySupported = false; (function isSupportSticky () {
var element = document.createElement('div');
var elementStyle = element.style;
elementStyle.cssText = vendors.concat(['']).map(function (vendor) {
return 'position:'
+ (vendor ? '-' + vendor + '-' : '')
+ 'sticky'
}).join(';') + ';';
_isStickySupported = elementStyle.position.indexOf('sticky') !== -1;
})();
// export function extend (to, from) {
// for (const key in from) {
// to[key] = from[key]
// }
// return to
// }
// export function isPlainObject (obj) {
// return Object.prototype.toString.call(obj)
// .slice(8, -1).toLowerCase() === 'object'
// }
function getType (obj) {
return Object.prototype.toString.call(obj)
.slice(8, -1).toLowerCase()
}
function appendStyle (css, styleId, replace) {
var style = document.getElementById(styleId);
if (style && replace) {
style.parentNode.removeChild(style);
style = null;
}
if (!style) {
style = document.createElement('style');
style.type = 'text/css';
styleId && (style.id = styleId);
document.getElementsByTagName('head')[0].appendChild(style);
}
style.appendChild(document.createTextNode(css));
}
function getUniqueFromArray (arr) {
if (!isArray(arr)) {
return []
}
var res = [];
var unique = {};
var val;
for (var i = 0, l = arr.length; i < l; i++) {
val = arr[i];
if (unique[val]) {
continue
}
unique[val] = true;
res.push(val);
}
return res
}
function detectWebp () {
return _isWebpSupported
}
function detectSticky () {
return _isStickySupported
}
function getRandom (num) {
var _defaultNum = 10;
if (typeof num !== 'number' || num <= 0) {
num = _defaultNum;
}
var _max = Math.pow(10, num);
return Math.floor(Date.now() + Math.random() * _max) % _max
}
function getRgb (color) {
var match;
color = color + '';
match = color.match(/#([\da-fA-F]{2})([\da-fA-F]{2})([\da-fA-F]{2})/);
if (match) {
return {
r: parseInt(match[1], 16),
g: parseInt(match[2], 16),
b: parseInt(match[3], 16)
}
}
match = color.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
if (match) {
return {
r: parseInt(match[1]),
g: parseInt(match[2]),
b: parseInt(match[3])
}
}
}
// direction: 'l' | 'r', default is 'r'
// num: how many times to loop, should be a positive integer
function loopArray (arr, num, direction) {
if (!isArray(arr)) {
return
}
var isLeft = (direction + '').toLowerCase() === 'l';
var len = arr.length;
num = num % len;
if (num < 0) {
num = -num;
isLeft = !isLeft;
}
if (num === 0) {
return arr
}
var lp, rp;
if (isLeft) {
lp = arr.slice(0, num);
rp = arr.slice(num);
}
else {
lp = arr.slice(0, len - num);
rp = arr.slice(len - num);
}
return rp.concat(lp)
}
function throttle (func, wait) {
var result;
var timerId = null;
var previous = 0;
var context;
var args;
var later = function () {
previous = Date.now();
timerId = null;
result = func.apply(context, args);
};
return function () {
var now = Date.now();
var remaining = wait - (now - previous);
context = this;
args = Array.prototype.slice.call(arguments);
if (remaining <= 0) {
clearTimeout(timerId);
timerId = null;
previous = now;
result = func.apply(context, args);
}
else if (!timerId) {
timerId = setTimeout(later, remaining);
}
return result
}
}
function camelToKebab (name) {
if (!name) { return '' }
return name.replace(/([A-Z])/g, function (g, g1) {
return ("-" + (g1.toLowerCase()))
})
}
function kebabToCamel (name) {
if (!name) { return '' }
return name.replace(/-([a-z])/g, function (g, g1) {
console.log(g1);
return ("" + (g1.toUpperCase()))
})
}
function findEnterKeyType (key) {
var keys = ['default', 'go', 'next', 'search', 'send'];
if (keys.indexOf(key) > -1) {
return key
}
return 'done'
}
var utils = Object.freeze({
isArray: isArray,
slice: slice,
vendors: vendors,
getType: getType,
appendStyle: appendStyle,
getUniqueFromArray: getUniqueFromArray,
detectWebp: detectWebp,
detectSticky: detectSticky,
getRandom: getRandom,
getRgb: getRgb,
loopArray: loopArray,
throttle: throttle,
camelToKebab: camelToKebab,
kebabToCamel: kebabToCamel,
findEnterKeyType: findEnterKeyType,
extend: extend,
def: def$1,
remove: remove$1,
hasOwn: hasOwn,
bind: bind,
toArray: toArray,
isObject: isObject$4,
isPlainObject: isPlainObject,
typof: typof$1
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var _senderMap = {};
function Sender (instance) {
if (!(this instanceof Sender)) {
return new Sender(instance)
}
this.instanceId = instance.instanceId;
this.weexInstance = instance;
_senderMap[this.instanceId] = this;
}
function _send (instanceId, msg) {
callJS(instanceId, [msg]);
}
Sender.getSender = function (instanceId) {
return _senderMap[instanceId]
};
Sender.prototype = {
// perform a callback to jsframework.
performCallback: function (callbackId, data, keepAlive) {
var args = [callbackId];
data && args.push(data);
keepAlive && args.push(keepAlive);
_send(this.instanceId, {
method: 'callback',
args: args
});
},
fireEvent: function (ref, type, func, event) {
func.extra && extend(event, func.extra());
_send(this.instanceId, {
method: 'fireEvent',
args: [ref, type, event, func.updator && func.updator()]
});
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// sync call native component method.
function callNativeComponent (instanceId, ref, method, args, options) {
return processCall(instanceId, {
component: options.component,
ref: ref,
method: method,
args: args
})
}
// sync call native module api.
function callNativeModule (instanceId, module, method, args, options) {
return processCall(instanceId, { module: module, method: method, args: args })
}
// callNative: jsFramework will call this method to talk to
// this renderer.
// params:
// - instanceId: string.
// - tasks: array of object.
// - callbackId: number.
function callNative$1 (instanceId, tasks, callbackId) {
var calls = [];
if (typeof tasks === 'string') {
try {
calls = JSON.parse(tasks);
}
catch (e) {
console.error('invalid tasks:', tasks);
}
}
else if (isArray(tasks)) {
calls = tasks;
}
var len = calls.length;
calls[len - 1].callbackId = (!callbackId && callbackId !== 0)
? -1
: callbackId;
for (var i = 0; i < len; i++) {
processCall(instanceId, calls[i]);
}
}
function processCall (instanceId, call) {
var isComponent = typeof call.module === 'undefined';
var res = isComponent ? componentCall(instanceId, call) : moduleCall(instanceId, call);
var callbackId = call.callbackId;
if ((callbackId
|| callbackId === 0
|| callbackId === '0')
&& callbackId !== '-1'
&& callbackId !== -1) {
performNextTick(instanceId, callbackId);
}
// for sync call.
return res
}
function moduleCall (instanceId, call) {
var moduleName = call.module;
var methodName = call.method;
var module, method;
var args = call.args || call.arguments || [];
if (!(module = protocol.apiModule[moduleName])) {
return
}
if (!(method = module[methodName])) {
return
}
return method.apply(global.weex.getInstance(instanceId), args)
}
function componentCall (instanceId, call) {
var componentName = call.component;
var ref = call.ref;
var methodName = call.method;
var args = call.args || call.arguments || [];
var elem = global.weex.getInstance(instanceId).getComponentManager().getComponent(ref);
if (!elem) {
return console.error(("[h5-render] component of ref " + ref + " doesn't exist."))
}
var method;
if (!(method = elem[methodName])) {
return console.error(("[h5-render] component " + componentName + " doesn't have a method named " + methodName + "."))
}
return method.apply(elem, args)
}
function performNextTick (instanceId, callbackId) {
Sender.getSender(instanceId).performCallback(callbackId);
}
function nativeLog () {
if (config$4.debug) {
if (arguments[0].match(/^perf/)) {
console.info.apply(console, arguments);
return
}
console.debug.apply(console, arguments);
}
}
function exportsBridgeMethodsToGlobal () {
global.callNative = callNative$1;
global.callNativeComponent = callNativeComponent;
global.callNativeModule = callNativeModule;
global.nativeLog = nativeLog;
}
var receiver = {
init: function () {
// exports methods to global(window).
exportsBridgeMethodsToGlobal();
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var watchedComponents = [];
var listened = false;
var scrollY = 0;
function needWatch (component) {
var events = component.data.event;
if (events
&& (events.indexOf('appear') !== -1
|| events.indexOf('disappear') !== -1)) {
return true
}
return false
}
function watchIfNeeded (component) {
if (needWatch(component)) {
watchedComponents.push(component);
if (!listened) {
listened = true;
var handler = throttle(onScroll, 100);
window.addEventListener('scroll', handler, false);
}
}
}
function isComponentInWindow (component) {
var rect = component.node.getBoundingClientRect();
return rect.right > 0 && rect.left < window.innerWidth &&
rect.bottom > 0 && rect.top < window.innerHeight
}
function hasIntersection (rect, ctRect) {
return (rect.left < ctRect.right && rect.right > ctRect.left)
&& (rect.top < ctRect.bottom && rect.bottom > ctRect.top)
}
function isComponentAppear (component) {
// NOTE: no more support embeded scrollers.
var parentScroller = component.getParentScroller();
if (!parentScroller) {
return isComponentInWindow(component)
}
return isComponentInWindow(component)
&& hasIntersection(
component.node.getBoundingClientRect(),
parentScroller.node.getBoundingClientRect())
}
function onScroll (e) {
var direction;
// NOTE: this condition strongly relies on the scroller's implementation.
if (e.originalType === 'scrolling') {
direction = e.direction;
}
else {
// NOTE: only VERTICAL window scroll can be detected.
var y = window.scrollY;
direction = y >= scrollY ? 'up' : 'down';
scrollY = y;
}
var len = watchedComponents.length;
for (var i = 0; i < len; i++) {
var component = watchedComponents[i];
var appear = isComponentAppear(component);
if (appear) {
component.dispatchEvent('appear', { direction: direction });
}
else if (!appear) {
component.dispatchEvent('disappear', { direction: direction });
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global Event */
// const lazyload = require('./lazyload')
// const animation = require('./animation')
var RENDERING_INDENT = 800;
var _instanceMap = {};
var typeMap = {};
var scrollableTypes = [
'scroller',
'hscroller',
'vscroller',
'list',
'hlist',
'vlist'
];
function ComponentManager (id) {
this.id = id;
this.batched = false;
this.updates = [];
this.componentMap = {};
_instanceMap[this.id] = this;
}
ComponentManager.getInstance = function (instanceId) { return _instanceMap[instanceId]; };
ComponentManager.registerComponent = function (type, definition) {
typeMap[type] = definition;
};
ComponentManager.getScrollableTypes = function () { return scrollableTypes; };
ComponentManager.prototype = {
getWeexInstance: function getWeexInstance () {
if (!this._weexInstance) {
this._weexInstance = global.weex
? global.weex.getInstance(this.id)
: null;
}
return this._weexInstance
},
// Fire a event 'renderbegin'/'renderend' on body element.
rendering: function rendering () {
function _renderingEnd () {
// get weex instance root
window.dispatchEvent(new Event('renderend'));
this._renderingTimer = null;
}
if (this._renderingTimer) {
clearTimeout(this._renderingTimer);
this._renderingTimer = setTimeout(
_renderingEnd.bind(this),
RENDERING_INDENT
);
}
else {
window.dispatchEvent(new Event('renderbegin'));
this._renderingTimer = setTimeout(
_renderingEnd.bind(this),
RENDERING_INDENT
);
}
},
getComponent: function getComponent (ref) {
return this.componentMap[ref]
},
removeComponent: function removeComponent (ref) {
var self = this;
if (!ref || !this.componentMap[ref]) {
return
}
// remove from this.componentMap cursively
(function _removeCursively (_ref) {
var child = self.componentMap[_ref];
var listeners = child._listeners;
var children = child.data.children;
if (children && children.length) {
for (var i = 0, l = children.length; i < l; i++) {
_removeCursively(children[i].ref);
}
}
// remove events from _ref component
if (listeners) {
for (var type in listeners) {
child.node.removeEventListener(type, listeners[type]);
}
}
delete child._listeners;
delete child.node._listeners;
// remove _ref component
delete self.componentMap[_ref];
})(ref);
},
createElement: function createElement (data, nodeType) {
var ComponentType = typeMap[data.type];
if (!ComponentType) {
ComponentType = typeMap['div'];
}
data.instanceId = this.id;
var component = new ComponentType(data, nodeType);
var ref = data.ref;
this.componentMap[ref] = component;
component.node.setAttribute('data-ref', ref);
return component
},
/**
* createBody: generate root component
* @param {object} element
*/
createBody: function createBody (element) {
console.log('[h5-render] createBody', element);
if (this.componentMap['_root']) {
return
}
var nodeType = element.type;
element.type = 'root';
element.rootId = this.getWeexInstance().rootId;
element.ref = '_root';
var root = this.createElement(element, nodeType);
var body = document.querySelector('#' + this.getWeexInstance().rootId)
|| document.body;
body.appendChild(root.node);
root._appended = true;
this.handleAppend(root);
},
appendChild: function appendChild (parentRef, data) {
var parent = this.componentMap[parentRef];
if (this.componentMap[data.ref] || !parent) {
return
}
if (parentRef === '_root' && !parent) {
parent = this.createElement({
type: 'root',
rootId: this.getWeexInstance().rootId,
ref: '_root'
});
parent._appended = true;
}
var child = parent.appendChild(data);
// In some parent component the implementation of method
// appendChild didn't return the component at all, therefor
// child maybe a undefined object.
if (child) {
child.parentRef = parentRef;
}
if (child && parent._appended) {
this.handleAppend(child);
}
},
// appendChildren (ref, elements) {
// for (let i = 0; i < elements.length; i++) {
// this.appendChild(ref, elements[i])
// }
// },
removeElement: function removeElement (ref) {
var this$1 = this;
if (isArray(ref)) {
return ref.map(function (r) { return this$1.removeElement(r); })
}
var component = this.componentMap[ref];
// fire event for rendering dom on body elment.
this.rendering();
if (component && component.parentRef) {
var parent = this.componentMap[component.parentRef];
component.onRemove && component.onRemove();
parent.removeChild(component);
}
else if (!component) {
console.error(("[h5-render] component of ref '" + ref + "' does not exist."));
}
else {
console.error(("[h5-render] parent component '" + (component.parentRef) + "' does not exist."));
}
},
moveElement: function moveElement (ref, parentRef, index) {
var component = this.componentMap[ref];
var newParent = this.componentMap[parentRef];
var oldParentRef = component.parentRef;
var children, before, i, l;
if (!component) {
return console.error(("[h5-render] component of ref '" + ref + "' does not exist."))
}
if (!newParent) {
return console.error(
("[h5-render] parent component '" + parentRef + "' does not exist."))
}
if (index < -1) {
index = -1;
return console.error('[h5-render] index cannot be less than -1.')
}
// fire event for rendering.
this.rendering();
children = newParent.data.children;
if (children
&& children.length
&& index !== -1
&& index < children.length) {
before = this.componentMap[newParent.data.children[index].ref];
}
// remove from oldParent.data.children
if (oldParentRef && this.componentMap[oldParentRef]) {
children = this.componentMap[oldParentRef].data.children;
if (children && children.length) {
for (i = 0, l = children.length; i < l; i++) {
if (children[i].ref === ref) {
break
}
}
if (l > i) {
children.splice(i, 1);
}
}
}
newParent.insertBefore(component, before);
component.onMove && component.onMove(parentRef, index);
},
insertBefore: function insertBefore (ref, data) {
var child, parent;
var before = this.componentMap[ref];
child = this.componentMap[data.ref];
before && (parent = this.componentMap[before.parentRef]);
if (child || !parent || !before) {
return
}
child = this.createElement(data);
if (child) {
child.parentRef = before.parentRef;
parent.insertBefore(child, before);
}
else {
return
}
if (this.componentMap[before.parentRef]._appended) {
this.handleAppend(child);
}
},
/**
* addElement
* If index is larget than any child's index, the
* element will be appended behind.
* @param {string} parentRef
* @param {obj} element (data of the component)
* @param {number} index
*/
addElement: function addElement (parentRef, element, index) {
// fire event for rendering dom on body elment.
this.rendering();
var parent = this.componentMap[parentRef];
if (!parent) {
return
}
var children = parent.data.children;
// -1 means append as the last.
if (index < -1) {
index = -1;
return console.error('[h5-render] index cannot be less than -1.')
}
if (children && children.length
&& children.length > index
&& index !== -1) {
this.insertBefore(children[index].ref, element);
}
else {
this.appendChild(parentRef, element);
}
},
addEvent: function addEvent (ref, type) {
var component = this.componentMap[ref];
if (!component) {
return console.error(("[h5-render] component of ref '" + ref + "' does not exist."))
}
component.bindEvents([type]);
},
removeEvent: function removeEvent (ref, type) {
var component = this.componentMap[ref];
if (!component) {
return console.error(("[h5-render] component of ref '" + ref + "' does not exist."))
}
component.unbindEvents([type]);
},
updateAttrs: function updateAttrs (ref, attrs) {
var component = this.componentMap[ref];
if (!component) {
return console.error(("[h5-render] component of ref '" + ref + "' does not exist."))
}
component.updateAttrs(attrs);
},
// setStyle (ref, key, value) {
// const component = this.componentMap[ref]
// if (!component) {
// return console.error(`[h5-render] component of ref '${ref}' does not exist.`)
// }
// component.updateStyle({ [key]: value })
// },
updateStyle: function updateStyle (ref, style) {
var component = this.componentMap[ref];
if (!component) {
return console.error(("[h5-render] component of ref '" + ref + "' does not exist."))
}
component.updateStyle(style);
},
handleAppend: function handleAppend (component) {
var this$1 = this;
component._appended = true;
component.onAppend && component.onAppend();
// invoke onAppend on children recursively
var children = component.data.children;
if (children) {
for (var i = 0; i < children.length; i++) {
var child = this$1.componentMap[children[i].ref];
if (child) {
this$1.handleAppend(child);
}
}
}
// watch appear/disappear of the component if needed
watchIfNeeded(component);
// do lazyload if needed
component.fireLazyload();
// lazyload.startIfNeeded(component);
},
createFinish: function createFinish (callback) {
window.dispatchEvent(new Event('weex:createfinish'));
},
updateFinish: function updateFinish (callback) {
window.dispatchEvent(new Event('weex:updatefinish'));
},
refreshFinish: function refreshFinish (callback) {
window.dispatchEvent(new Event('weex:refreshfinish'));
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global XMLHttpRequest */
function loadByXHR (config, callback) {
if (!config.source) {
callback(new Error('xhr loader: missing config.source.'));
}
var xhr = new XMLHttpRequest();
xhr.open('GET', config.source);
xhr.onload = function () {
callback(null, this.responseText);
};
xhr.onerror = function (error) {
callback(error);
};
xhr.send();
}
function loadByJsonp (config, callback) {
if (!config.source) {
callback(new Error('jsonp loader: missing config.source.'));
}
var callbackName = config.jsonpCallback || 'weexJsonpCallback';
window[callbackName] = function (code) {
if (code) {
callback(null, code);
}
else {
callback(new Error('load by jsonp error'));
}
};
var script = document.createElement('script');
script.src = decodeURIComponent(config.source);
script.type = 'text/javascript';
document.body.appendChild(script);
}
function loadBySourceCode (config, callback) {
// src is the jsbundle.
// no need to fetch from anywhere.
if (config.source) {
callback(null, config.source);
}
else {
callback(new Error('source code laoder: missing config.source.'));
}
}
var callbackMap = {
xhr: loadByXHR,
jsonp: loadByJsonp,
source: loadBySourceCode
};
function load (options, callback) {
var loadFn = callbackMap[options.loader];
loadFn(options, callback);
}
function registerLoader (name, loaderFunc) {
if (typeof loaderFunc === 'function') {
callbackMap[name] = loaderFunc;
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @fileOverview
* A simple virtual dom implementation
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var NOT_PX_NUMBER_PROPERTIES = ['flex', 'opacity', 'zIndex', 'fontWeight'];
function getFilters (key) {
if (NOT_PX_NUMBER_PROPERTIES.indexOf(key) !== -1) {
return {}
}
return {
number: function (val) {
return val + 'px'
},
string: function (val) {
// string of a number suffixed with a 'px' or 'wx' unit. original RegExp is /^-?\d*\.?\d+(?:px)?$/
var match = val.match(/^([+-]?\d.*)+([p,w]x)$/);
if (match && match.length === 3) {
if (match[2] === 'px') {
return parseFloat(match[1]) + 'px'
}
else if (match[2] === 'wx') {
return parseFloat(match[1]) * global.WXEnvironment.devicePixelRatio + 'px'
}
}
if (key.match(/transform/) && val.match(/translate/)) {
var ret = val.replace(/\d*\.?\d+px/g, function (match) {
return parseInt(parseFloat(match)) + 'px'
});
if (ret.match(/wx/)) {
ret = ret.replace(/\d*\.?\d+wx/g, function (match) {
return parseInt(parseFloat(match)) * global.WXEnvironment.devicePixelRatio + 'px'
});
}
return ret
}
if (key.match(/^border$/) && val.match(/^\d+(?:[w,p]x)?\s+/)) {
val = val.replace(/^(\d+(?:[w,p]x)?)/, function ($0, $1) {
var v = parseFloat($1) * (val.match(/^\d+(?:wx)+/) ? global.WXEnvironment.devicePixelRatio : 1);
return v + 'px'
});
}
return val
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var pseudoId = 0;
function getPseudoId () {
return '' + (pseudoId++)
}
function create$2 (nodeType) {
return document.createElement(nodeType || 'div')
}
function createChildren$1 () {
var this$1 = this;
var children = this.data.children;
var parentRef = this.data.ref;
var componentManager = this.getComponentManager();
if (children && children.length) {
var fragment = document.createDocumentFragment();
var isFlex = false;
for (var i = 0; i < children.length; i++) {
children[i].instanceId = this$1.data.instanceId;
var child = componentManager.createElement(children[i]);
fragment.appendChild(child.node);
child.parentRef = parentRef;
if (!isFlex
&& child.data.style
&& child.data.style.hasOwnProperty('flex')
) {
isFlex = true;
}
}
this.node.appendChild(fragment);
}
}
function appendChild$1 (data) {
var children = this.data.children;
var componentManager = this.getComponentManager();
var child = componentManager.createElement(data);
this.node.appendChild(child.node);
// update this.data.children
if (!children || !children.length) {
this.data.children = [data];
}
else {
children.push(data);
}
return child
}
function insertBefore$1 (child, before) {
var children = this.data.children;
var i = 0;
var l;
var isAppend = false;
// update this.data.children
if (!children || !children.length || !before) {
isAppend = true;
}
else {
for (l = children.length; i < l; i++) {
if (children[i].ref === before.data.ref) {
break
}
}
if (i === l) {
isAppend = true;
}
}
if (isAppend) {
this.node.appendChild(child.node);
children.push(child.data);
}
else {
if (before.fixedPlaceholder) {
this.node.insertBefore(child.node, before.fixedPlaceholder);
}
else if (before.stickyPlaceholder) {
this.node.insertBefore(child.node, before.stickyPlaceholder);
}
else {
this.node.insertBefore(child.node, before.node);
}
children.splice(i, 0, child.data);
}
}
function removeChild$1 (child) {
var children = this.data.children;
// remove from this.data.children
var i = 0;
var componentManager = this.getComponentManager();
if (children && children.length) {
var l;
for (l = children.length; i < l; i++) {
if (children[i].ref === child.data.ref) {
break
}
}
if (i < l) {
children.splice(i, 1);
}
}
// remove from componentMap recursively
componentManager.removeComponent(child.data.ref);
child.unsetPosition();
child.node.parentNode.removeChild(child.node);
}
function updateAttrs$1 (attrs) {
var this$1 = this;
// Note:attr must be injected into the dom element because
// it will be accessed from the outside developer by event.target.attr.
if (!this.node.attr) {
this.node.attr = {};
}
for (var key in attrs) {
var value = attrs[key];
var attrSetter = this$1.attr[key];
if (typeof attrSetter === 'function') {
attrSetter.call(this$1, value);
}
else {
if (typeof value === 'boolean') {
this$1.node[key] = value;
}
else {
this$1.node.setAttribute(key, value);
}
this$1.node.attr[key] = value;
}
}
}
function updateStyle$1 (style) {
var this$1 = this;
var pseudoData = {};
for (var key in style) {
var value = style[key];
var pseudoClassReg = /^([^:]+)((?::[^:]+)+)/;
var match = key.match(pseudoClassReg);
var styleName = (void 0), pseudoName = (void 0);
if (match) {
styleName = match[1];
pseudoName = match[2];
}
else {
styleName = key;
}
var styleSetter = this$1.style[styleName];
if (typeof styleSetter === 'function') {
styleSetter.call(this$1, value);
continue
}
var parser = getFilters(styleName)[typeof value];
if (typeof parser === 'function') {
value = parser(value);
}
if (!match) {
this$1.node.style[styleName] = value;
continue
}
if (pseudoData[pseudoName]) {
pseudoData[pseudoName][styleName] = value;
}
else {
var obj;
pseudoData[pseudoName] = ( obj = {}, obj[styleName] = value, obj );
}
}
if (Object.keys(pseudoData).length > 0) {
processPseudoClass(this, 'data-pseudo-id', pseudoData);
}
}
// modify styles of pseudo class.
function processPseudoClass (component, idName, pseudoData) {
var pseudoId = component.node.getAttribute('data-pseudo-id');
function getCssText (selector, rulesObj) {
// TODO: must process vendors if needed.
// !important is needed since the style rules is inline for most components.
var rulesText = Object.keys(rulesObj).map(function (key) { return ((camelToKebab(key)) + ":" + (rulesObj[key]) + "!important;"); }).join('');
return (selector + "{" + rulesText + "}")
}
if (!pseudoId) {
pseudoId = getPseudoId();
component.node.setAttribute('data-pseudo-id', pseudoId);
var style = document.createElement('style');
style.type = 'text/css';
style.setAttribute('data-pseudo-id', pseudoId);
document.getElementsByTagName('head')[0].appendChild(style);
var cssText = Object.keys(pseudoData).map(function (pseudo) {
var rules = pseudoData[pseudo];
return getCssText(("[data-pseudo-id=\"" + pseudoId + "\"]" + pseudo), rules)
}).join('');
return style.appendChild(document.createTextNode(cssText))
}
var styleSheets = Array.prototype.slice.call(document.styleSheets || [])
.filter(function (style) { return style.ownerNode.getAttribute('data-pseudo-id') === pseudoId; });
if (!styleSheets || styleSheets.length <= 0) {
return
}
var styleSheet = styleSheet[0];
var rules = styleSheet.cssRules || styleSheet.rules;
Object.keys(pseudoData).forEach(function (pseudo) {
var data = pseudoData[pseudo];
var selector = "[data-pseudo-id=\"" + pseudoId + "\"]" + pseudo;
var res = Array.prototype.slice.call(rules).reduce(function (res, rule, idx) {
(rule.selectorText === selector) && (res.idx = idx);
return res
}, { idx: -1 });
var idx = res.idx;
if (idx !== -1) {
var pseudoRule = rules[idx];
var match = pseudoRule.cssText.match(/^[^{]+\{([^}]+)\}/);
if (match && match[1]) {
var rulesData = match[1].split(';').reduce(function (res, str) {
var match = str.match(/(\S+)\s*:\s*(\S+)/);
if (match && match[1] && match[2]) {
res[match[1]] = match[2];
}
return res
}, {});
extend(rulesData, data);
Object.keys(rulesData).forEach(function (rule) {
if (!rulesData[rule]) { delete rulesData[rule]; }
});
styleSheet.deleteRule(idx);
styleSheet.insertRule(getCssText(selector, rulesData), rules.length - 1);
}
}
else {
styleSheet.insertRule(getCssText(selector, data), rules.length);
}
});
}
function bindEvents$2 (evts) {
var self = this;
var weexInstance = this.getWeexInstance();
evts.map(function (evt) {
var func = self.event[evt] || {};
var setter = func.setter;
if (setter) {
self.node.addEventListener(evt, setter);
return
}
var sender = weexInstance.sender;
var listener = function (e) {
// do stop bubbling.
// do not prevent default, otherwise the touchstart
// event will no longer trigger a click event
if (e._alreadyTriggered) {
return
}
e._alreadyTriggered = true;
var event = extend({}, e);
event.target = self.data;
sender.fireEvent(self.data.ref, evt, {
extra: func.extra && func.extra.bind(self),
updator: func.updator && func.updator.bind(self)
}, event);
};
self.node.addEventListener(evt, listener, false, false);
var listeners = self._listeners;
if (!listeners) {
listeners = self._listeners = {};
self.node._listeners = {};
}
listeners[evt] = listener;
self.node._listeners[evt] = listener;
});
}
function unbindEvents (evts) {
var self = this;
evts.map(function (evt) {
var listener = this._listeners;
if (listener) {
self.node.removeEventListener(evt, listener);
self._listeners[evt] = null;
self.node._listeners[evt] = null;
}
});
}
var operate = Object.freeze({
create: create$2,
createChildren: createChildren$1,
appendChild: appendChild$1,
insertBefore: insertBefore$1,
removeChild: removeChild$1,
updateAttrs: updateAttrs$1,
updateStyle: updateStyle$1,
bindEvents: bindEvents$2,
unbindEvents: unbindEvents
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global HTMLElement */
var ua = navigator.userAgent;
var isFirefox = !!ua.match(/Firefox/i);
var isIEMobile = !!ua.match(/IEMobile/i);
var cssPrefix = isFirefox ? '-moz-' : isIEMobile ? '-ms-' : '-webkit-';
var stylePrefix = isFirefox ? 'Moz' : isIEMobile ? 'ms' : 'webkit';
// even sticky, still not work. so...
// const supportSticky = detectSticky()
function bindParent (sticky) {
if (!sticky instanceof Sticky) {
return
}
var scroller = sticky.component.getParentScroller();
var pt;
if (scroller) {
pt = sticky.parent = scroller;
sticky.parentElement = pt.node;
}
else {
pt = sticky.parent = sticky.component.getRootContainer();
sticky.parentElement = pt;
}
}
function setSticky$1 (sticky) {
var comp = sticky.component;
var element = sticky.element;
comp.stickyPlaceholder = sticky.element.cloneNode(true);
comp.stickyPlaceholder.removeAttribute('data-ref');
comp.stickyPlaceholder.classList.add('weex-sticky-placeholder');
element.classList.add('weex-sticky');
sticky.preMarginTop = element.style.marginTop;
sticky.preTop = element.style.top;
element.style.marginTop = sticky.top || '0' + 'px';
element.parentNode.insertBefore(
comp.stickyPlaceholder, element);
element.style.position = 'fixed';
var top;
if (sticky.parent instanceof HTMLElement) {
top = 0;
}
else {
top = sticky.parentElement.getBoundingClientRect().top;
}
element.style.top = top + 'px';
sticky.parentElement.appendChild(element);
}
/**
* unsetSticky
* @param {Sticky} sticky : a sticky instance.
* @param {string} position : position replacing with (default: 'relative').
*/
function unsetSticky$1 (sticky, position) {
var comp = sticky.component;
var element = sticky.element;
position = position ? position + '' : sticky.prePosition;
element.style.position = position;
element.style.marginTop = sticky.preMarginTop || '';
element.style.top = sticky.preTop || '';
element.classList.remove('weex-sticky');
if (comp.stickyPlaceholder) {
var parent = comp.stickyPlaceholder.parentNode;
parent.insertBefore(element, comp.stickyPlaceholder);
parent.removeChild(comp.stickyPlaceholder);
comp.stickyPlaceholder = null;
}
}
/**
* @class Sticky
* @param {Component} component: a weex component.
* @param {object} options config options.
* - options.component (optional) incase the component param is missing, it can
* be specified in this options.
* - options.withinParent=false(optional,only for Android)the sticky effect is
* limited within the parent element only.
*/
function Sticky (component, options) {
options = options || {};
this.component = component;
this.element = component.node;
this.prePosition = this.element.style.position;
this.withinParent = options.withinParent || false;
this.parent = null;
this.init();
}
Sticky.prototype = {
constructor: Sticky,
init: function init () {
var elementStyle = this.element.style;
elementStyle[stylePrefix + 'Transform'] = 'translateZ(0)'; // fix flickering
elementStyle['transform'] = 'translateZ(0)';
bindParent(this);
// if (supportSticky) {
// elementStyle.position = cssPrefix + 'sticky'
// }
this._simulateSticky();
this._bindResize();
},
_bindResize: function _bindResize () {
var self = this;
var isAndroid = (/android/gi).test(navigator.appVersion);
var resizeEvent = self._resizeEvent = 'onorientationchange' in window
? 'orientationchange'
: 'resize';
var resizeHandler = self._resizeHandler = function () {
setTimeout(function () {
self.refresh();
}, isAndroid ? 200 : 0);
};
window.addEventListener(resizeEvent, resizeHandler, false);
},
/**
* Refresh a instance.
* If withParent is true and the parent' height altered, this
* method should be called.
*/
refresh: function refresh () {
// if (supportSticky) {
// return
// }
this._detach();
this._simulateSticky();
},
_simulateSticky: function _simulateSticky () {
var self = this;
var isInScrollable = this.isInScrollable();
// the initial y offset.
this.offset = (isInScrollable
? this.getParentScroller().offset
: window.pageYOffset)
|| 0;
var rectTop = this.element.getBoundingClientRect().top;
var wrapperTop = 0;
if (isInScrollable) {
wrapperTop = this.parentElement.getBoundingClientRect().top;
}
var withinParent = this.withinParent;
var thresholdBase = rectTop - wrapperTop + this.offset;
/**
* curState:
* 1 - normal
* 2 - sticky
* 3 - exceed parent
* @type {Number}
*/
this.curState = 1;
var scrollHandler = this._scrollHandler = throttle(function (e) {
var thresholdTop = thresholdBase;
var ypos = self.isInScrollable() ? e.offset : window.pageYOffset;
self.offset = ypos;
if (ypos < thresholdTop) {
if (self.curState !== 1) {
unsetSticky$1(self);
self.curState = 1;
}
}
else if ((!withinParent && ypos >= thresholdTop) ||
(withinParent && ypos >= thresholdTop/* && ypos < thresholdBottom*/)) {
if (self.curState !== 2) {
setSticky$1(self);
self.curState = 2;
}
}
}, 100);
window.addEventListener('scroll', scrollHandler, false);
// take effect once inited after a destroyment.
if (this.offset >= thresholdBase) {
var dummyEvent = document.createEvent('HTMLEvents');
dummyEvent.initEvent('scroll', true, true);
window.dispatchEvent(dummyEvent);
}
},
_detach: function _detach (position) {
position = position ? position + '' : 'relative';
// if (supportSticky) {
// return
// }
if (this.curState === 2) {
unsetSticky$1(this);
}
window.removeEventListener('scroll', this._scrollHandler, false);
},
isInScrollable: function isInScrollable () {
if (!this._isInScrollable) {
try {
this._isInScrollable = this.component.isInScrollable();
}
catch (err) {
// The parentRef is not in componentManager's componentMap yet, so
// it's invalid to get the parent and test if it's scrollable.
// This is most likely to happen in the case that the parent
// component's 'append' attribute is set to 'tree'.
console.error('isInScrollable is not yet available to call', err);
}
}
return this._isInScrollable
},
getParentScroller: function getParentScroller () {
return this.component.getParentScroller()
},
destroy: function destroy (position) {
this._detach(position);
var elementStyle = this.element.style;
elementStyle.removeProperty(cssPrefix + 'transform');
elementStyle.removeProperty('transform');
// if (supportSticky) {
// return
// }
window.removeEventListener(this._resizeEvent, this._resizeHandler, false);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// Set positon to fixed, with a placeholder if it's in a
// scrollable component.
function setFixed () {
// delay processing in case the node is not appended yet.
setTimeout(function () {
this.node.style.position = 'fixed';
if (!this.isInScrollable()) {
return
}
var parent = this.node.parentNode;
if (parent) {
// For the elements who are fixed: this fixedPlaceholder
// shoud be inserted, and the fixed element itself should
// be moved to the root container.
this.fixedPlaceholder = document.createElement('div');
this.fixedPlaceholder.classList.add('weex-fixed-placeholder');
this.fixedPlaceholder.style.cssText = [
'display:none;',
'width:0px;',
'height:0px;'
].join('');
parent.insertBefore(this.fixedPlaceholder, this.node);
this.getRootContainer().appendChild(this.node);
}
}.bind(this), 0);
}
// unset a fixed node to the pecified 'position' or 'relative' by default.
function unsetFixed (position) {
// For the elements who are fixed elements before, now
// are not fixed: the fixedPlaceholder has to be replaced
// by this element.
position = position ? position + '' : 'relative';
if (this.fixedPlaceholder) {
var parent = this.fixedPlaceholder.parentNode;
parent.insertBefore(this.node, this.fixedPlaceholder);
parent.removeChild(this.fixedPlaceholder);
this.fixedPlaceholder = null;
this.node.style.position = position;
}
}
function setSticky () {
this.node.style.zIndex = 100;
setTimeout(function () {
this.sticky = new Sticky(this);
}.bind(this), 0);
}
function unsetSticky () {
if (this.sticky) {
this.sticky.destroy();
this.sticky = null;
}
}
// usally used to unset sticky and fixed
function unsetPosition (position) {
this.style.position.call(this, position);
}
var style = {
position: function position (value) {
// This is a peace of hacking to fix the problem about
// mixing fixed and transform. See 'http://stackoverflo
// w.com/questions/15194313/webkit-css-transform3d-posi
// tion-fixed-issue' for more info.
value !== 'fixed' && this.unsetFixed();
value !== 'sticky' && this.unsetSticky();
if (value === 'fixed') {
return this.setFixed()
}
if (value === 'sticky') {
return this.setSticky()
}
this.node.style.position = value;
}
};
var position$1 = Object.freeze({
setFixed: setFixed,
unsetFixed: unsetFixed,
setSticky: setSticky,
unsetSticky: unsetSticky,
unsetPosition: unsetPosition,
style: style
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var boxAlignMap = {
stretch: 'stretch',
'flex-start': 'start',
'flex-end': 'end',
center: 'center'
};
var boxOrientMap = {
row: 'horizontal',
column: 'vertical'
};
var boxPackMap = {
'flex-start': 'start',
'flex-end': 'end',
center: 'center',
'space-between': 'justify',
'space-around': 'justify' // Just same as `space-between`
};
var flexbox = {
style: {
flex: function flex (value) {
this.node.style.webkitBoxFlex = value;
this.node.style.webkitFlex = value;
this.node.style.flex = value;
},
alignItems: function alignItems (value) {
this.node.style.webkitBoxAlign = boxAlignMap[value];
this.node.style.webkitAlignItems = value;
this.node.style.alignItems = value;
},
alignSelf: function alignSelf (value) {
this.node.style.webkitAlignSelf = value;
this.node.style.alignSelf = value;
},
flexDirection: function flexDirection (value) {
this.node.style.webkitBoxOrient = boxOrientMap[value];
this.node.style.webkitFlexDirection = value;
this.node.style.flexDirection = value;
},
justifyContent: function justifyContent (value) {
this.node.style.webkitBoxPack = boxPackMap[value];
this.node.style.webkitJustifyContent = value;
this.node.style.justifyContent = value;
}
}
}
/* eslint-disable */
;
/* eslint-enable */
(function (win, lib) {
var doc = document;
var appearEvt;
var disappearEvt;
function createEvent() {
appearEvt = doc.createEvent("HTMLEvents");//创建自定义显示事件
disappearEvt = doc.createEvent("HTMLEvents");//创建自定义消失事件
appearEvt.initEvent('_appear', false, true);
disappearEvt.initEvent('_disappear', false, true);
}
/**
* [throttle 节流函数]
* @param {[function]} func [执行函数]
* @param {[int]} wait [等待时长]
* @return {[type]} [description]
*/
function throttle(func, wait) {
var latest = Date.now(),
previous = 0,//上次执行的时间
timeout = null,//setTimout任务
context,//上下文
args,//参数
result;//结果
var later = function () {
previous = Date.now();
timeout = null;//清空计时器
func.apply(context, args);
};
return function () {
var now = Date.now();
context = this;
args = arguments;
var remaining = wait - (now - previous);
if (remaining <= 0 || remaining >= wait) {
//如果没有剩余时间,或者存在修改过系统时间导致剩余时间增大的情况,则执行
clearTimeout(timeout);
timeout = null;
result = func.apply(context, args);
} else if (timeout == null) {
timeout = setTimeout(later, remaining);
}
return result;
}
}
/**
* [getOffset 获取边距尺寸]
* @param {[type]} el [description]
* @param {[type]} param [description]
* @return {[type]} [description]
*/
function getOffset(el, param) {
var el, l, r, b, t;
if (!el) {
return;
}
if (!param) {
param = {x: 0, y: 0};
}
if (el != window) {
el = el.getBoundingClientRect();
l = el.left;
t = el.top;
r = el.right;
b = el.bottom;
} else {
l = 0;
t = 0;
r = l + el.innerWidth;
b = t + el.innerHeight;
}
return {
'left': l,
'top': t,
'right': r + param.x,
'bottom': b + param.y
};
}
//元素位置比较
function compareOffset(d1, d2) {
var left = d2.right > d1.left && d2.left < d1.right;
var top = d2.bottom > d1.top && d2.top < d1.bottom;
return left && top;
}
//获取移动方向
function getDirection(beforeOffset, nowOffset) {
var direction = 'none';
var horizental = beforeOffset.left - nowOffset.left;
var vertical = beforeOffset.top - nowOffset.top;
if (vertical == 0) {
if (horizental != 0) {
direction = horizental > 0 ? 'left' : 'right';
} else {
direction = 'none';
}
}
if (horizental == 0) {
if (vertical != 0) {
direction = vertical > 0 ? 'up' : 'down';
} else {
direction = 'none';
}
}
return direction;
}
function extend(target, el) {
for (var k in el) {
if (el.hasOwnProperty(k)) {
target[k] = el[k];
}
}
return target;
}
/**
* [__bindEvent 绑定事件,包括滚动、touchmove、transform、resize等]
* @return {[type]} [description]
*/
function __bindEvent() {
var self = this;
var handle = throttle(function () {
__fire.apply(self, arguments);
}, this.options.wait);
if (this.__handle) {
//避免重复绑定
this.container.removeEventListener('scroll', this.__handle);
this.__handle = null;
}
this.__handle = handle;
this.container.addEventListener('scroll', handle, false);
this.container.addEventListener('resize', function(ev) {
__fire.apply(self, arguments);
}, false);
this.container.addEventListener('animationEnd', function() {
__fire.apply(self, arguments);
}, false);
// android4.0以下
this.container.addEventListener('webkitAnimationEnd', function() {
__fire.apply(self, arguments);
}, false);
this.container.addEventListener('transitionend', function() {
__fire.apply(self, arguments);
}, false);
}
//获取容器内所有的加载元素
function __getElements(selector) {
var self = this;
//获取容器
var container = this.options.container;
if (typeof container == 'string') {
//如果是字符串,则选择器
this.container = doc.querySelector(container);
} else {
//对象传值
this.container = container;
}
//获取容器内的所有目标元素
if (this.container == window) {
var appearWatchElements = doc.querySelectorAll(selector);
} else {
var appearWatchElements = this.container.querySelectorAll(selector);
}
var appearWatchElements = [].slice.call(appearWatchElements, null);
appearWatchElements = appearWatchElements.filter(function(ele) {
// 如果已经绑定过,清除appear状态,不再加入到数组里
if (ele.dataset['bind'] == '1') {
delete ele._hasAppear;
delete ele._hasDisAppear;
delete ele._appear;
ele.classList.remove(self.options.cls);
return false;
} else {
return true;
}
});
return appearWatchElements;
}
function __initBoundingRect(elements) {
var self = this;
if (elements && elements.length > 0) {
[].forEach.call(elements, function (ele) {
ele._eleOffset = getOffset(ele);
//移除类名
ele.classList.remove(self.options.cls);
// 标志已经绑定
ele.dataset['bind'] = 1;
});
}
}
// 触发加载
function __fire() {
var container = this.container,
elements = this.appearWatchElements,
appearCallback = this.options.onAppear,//appear的执行函数
disappearCallback = this.options.onDisappear,//disappear的执行函数
containerOffset = getOffset(container, {
x: this.options.x,
y: this.options.y
}),
isOnce = this.options.once,//是否只执行一次
ev = arguments[0] || {};
if (elements && elements.length > 0) {
[].forEach.call(elements, function (ele, i) {
//获取左右距离
var eleOffset = getOffset(ele);
var direction = getDirection(ele._eleOffset, eleOffset);
//保存上个时段的位置信息
ele._eleOffset = eleOffset;
//查看是否在可视区域范围内
var isInView = compareOffset(containerOffset, eleOffset);
var appear = ele._appear;
var _hasAppear = ele._hasAppear;
var _hasDisAppear = ele._hasDisAppear;
appearEvt.data = {
direction: direction
};
disappearEvt.data = {
direction: direction
};
if (isInView && !appear) {
if ((isOnce && !_hasAppear) || !isOnce) {
//如果只触发一次并且没有触发过或者允许触发多次
//如果在可视区域内,并且是从disppear进入appear,则执行回调
appearCallback && appearCallback.call(ele, ev);
//触发自定义事件
ele.dispatchEvent(appearEvt);
ele._hasAppear = true;
ele._appear = true;
}
} else if (!isInView && appear) {
if ((isOnce && !_hasDisAppear) || !isOnce) {
//如果不在可视区域内,并且是从appear进入disappear,执行disappear回调
disappearCallback && disappearCallback.call(ele, ev);
//触发自定义事件
ele.dispatchEvent(disappearEvt);
ele._hasDisAppear = true;
ele._appear = false;
}
}
});
}
}
// proto = extend(proto, listener);
function __init(opts) {
//扩展参数
extend(this.options, opts || (opts = {}));
//获取目标元素
this.appearWatchElements = this.appearWatchElements || __getElements.call(this, '.' + this.options.cls);
//初始化位置信息
__initBoundingRect.call(this, this.appearWatchElements);
//绑定事件
__bindEvent.call(this);
}
var Appear = function () {
__init.apply(this, arguments);
};
var appear = {
instances: [],
init: function (opts) {
var proto = {
//默认参数
options: {
container: window,
wait: 100,
x: 0,
y: 0,
cls: 'lib-appear',
once: false,
onReset: function () {},
onAppear: function () {},
onDisappear: function () {}
},
container: null,
appearWatchElements: null,
bind: function (node) {
var cls = this.options.cls;
// 添加需要绑定的appear元素
if (typeof node == 'string') {
var elements = __getElements.call(this, node);
[].forEach.call(elements, function (ele, i) {
if (!ele.classList.contains(cls)) {
ele.classList.add(cls);
}
});
} else if (node.nodeType == 1 && this.container.contains(node)) {
//如果传入的是元素并且在包含在容器中,直接添加类名
if (!node.classList.contains(cls)) {
//添加类名
node.classList.add(cls);
}
} else {
return this;
}
//新增的子元素
var newElements = __getElements.call(this, '.' + this.options.cls);
//对缓存的子元素做增量
this.appearWatchElements = this.appearWatchElements.concat(newElements);
//初始化新子元素的位置信息
__initBoundingRect.call(this, newElements);
return this;
},
// 重置函数
reset: function (opts) {
__init.call(this, opts);
this.appearWatchElements.forEach(function(ele) {
delete ele._hasAppear;
delete ele._hasDisAppear;
delete ele._appear;
});
return this;
},
fire: function () {
if (!this.appearWatchElements) {
this.appearWatchElements = [];
}
var newElements = __getElements.call(this, '.' + this.options.cls);
this.appearWatchElements = this.appearWatchElements.concat(newElements);
//初始化位置信息
__initBoundingRect.call(this, newElements);
__fire.call(this);
return this;
}
};
Appear.prototype = proto;
var instance = new Appear(opts);
this.instances.push(instance);
return instance;
},
fireAll: function () {
var instances = this.instances;
instances.forEach(function (instance) {
instance.fire();
});
}
};
//注册事件
createEvent();
lib.appear = appear;
})(window, window.lib || (window.lib = {}));
var adapter = createCommonjsModule(function (module) {
/*
lazyimg
Author: _danz
*/
(function (win, lib) {
var adapter = {};
var appearInstance;
var runtimeFlags = {};
var config = {
'dataSrc': 'img-src', //指定图片地址的attribute名, 兼做lazy-class的作用
'lazyHeight': 0, //以此高度提前触发懒加载
'lazyWidth': 0 //以此宽度提前触发懒加载
};
function extendStrict(main, sub) {
var ret = {};
for (var k in main) {
if (main.hasOwnProperty(k)) {
ret[k] = sub.hasOwnProperty(k) ? sub[k] : main[k];
}
}
return ret;
}
function preLoadImg (src, loadCallback, errorCallback) {
var img = new Image();
img.src = src;
img.onload = loadCallback ? loadCallback.bind(img) : null;
img.onerror = errorCallback ? errorCallback.bind(img) : null;
}
function dispatchEvent (item, type, data) {
var evt = document.createEvent('CustomEvent');
evt.initCustomEvent(type, false, false, data);
item.dispatchEvent(evt);
}
function applySrc(item, processedSrc, placeholderSrc) {
if (!processedSrc) {
return;
}
if (item.nodeName.toUpperCase() == 'IMG') {
item.onerror = function () {
this.onerror = null;
this.src = placeholderSrc;
};
item.setAttribute('src', processedSrc);
if (!placeholderSrc) {
return
}
} else {
preLoadImg(processedSrc, function () {
item.style.backgroundImage = 'url("' + processedSrc + '")';
var naturalWidth = this.width;
var naturalHeight = this.height;
dispatchEvent(item, 'load', {
success: true,
size: { naturalWidth: naturalWidth, naturalHeight: naturalHeight }
});
}, function () {
dispatchEvent(item, 'load', { success: false });
preLoadImg(placeholderSrc, function () {
item.style.backgroundImage = 'url("' + placeholderSrc + '")';
});
});
}
}
function init() {
appearInstance = lib.appear.init({
cls: 'imgtmp', //可选,需要遍历的元素
once: true, //可选,是否只触发一次
x: config.lazyWidth, //可选,容器右边距离x以内的元素加载,默认为0
y: config.lazyHeight, //可选,容器底部距离y以内的元素加载,默认为0
onAppear: function (evt) {
var item = this;
applySrc(item, item.getAttribute('i-lazy-src'), item.dataset.placeholder);
item.removeAttribute('i-lazy-src');
}
});
}
adapter.logConfig = function () {
console.log('lib-img Config\n', config);
};
adapter.fire = function () {
if (!appearInstance) {
init();
}
var label = 'i_' + Date.now() % 100000;
var domList = document.querySelectorAll('[' + config.dataSrc + ']');
[].forEach.call(domList, function (item) {
if (item.dataset.lazy == 'false' && item.dataset.lazy != 'true') {
applySrc(item, item.getAttribute(config.dataSrc), item.dataset.placeholder);
} else {
item.classList.add(label);
item.setAttribute('i-lazy-src', item.getAttribute(config.dataSrc));
}
item.removeAttribute(config.dataSrc);
});
appearInstance.bind('.' + label);
appearInstance.fire();
};
adapter.defaultSrc = 'data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==';
lib.img = adapter;
module.exports = adapter;
})(window, window['lib'] || (window['lib'] = {}));
});
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global lib, HTMLElement */
var lazyloadTimer;
// fire lazyimg on images.
function fire () {
setTimeout(function () { return lib.img.fire(); }, 0);
}
// we don't know when all images are appended
// just use setTimeout to do delay lazyload
//
// -- actually everytime we add a element or update styles,
// the component manager will call startIfNeed to fire
// lazyload once again in the handleAppend function. so there
// is no way that any image element can miss it. See source
// code in componentMangager.js.
// just for the image component to start lazyload.
function startIfNeeded (target) {
if (!lazyloadTimer) {
lazyloadTimer = setTimeout(function () {
fire();
clearTimeout(lazyloadTimer);
lazyloadTimer = null;
}, 16);
}
}
// for a scope of element, not for a image.
function loadIfNeeded (elementScope) {
var notPreProcessed = elementScope.querySelectorAll('[img-src]');
// image elements which have attribute 'i-lazy-src' were elements
// that had been preprocessed by lib-img-core, but not loaded yet, and
// must be loaded when 'appear' events were fired. It turns out the
// 'appear' event was not fired correctly in the css-translate-transition
// situation, so 'i-lazy-src' must be checked and lazyload must be
// fired manually.
var preProcessed = elementScope.querySelectorAll('[i-lazy-src]');
if (notPreProcessed.length > 0 || preProcessed.length > 0) {
fire();
}
}
function makeImageLazy (image, src) {
image.removeAttribute('img-src');
image.removeAttribute('i-lazy-src');
image.removeAttribute('src');
image.setAttribute('img-src', src);
fire();
}
function fireLazyload (target) {
if (typeof target === 'object' && !(target instanceof HTMLElement)) {
target = target.node;
}
if (!target) {
return
}
if (target.tagName.toLowerCase() === 'image') {
return startIfNeeded(target)
}
return loadIfNeeded(target)
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var appearEvts = ['appear', 'disappear'];
/**
* check whether a event is valid to dispatch.
* @param {Component} comp the component that this event is to trigger on.
* @param {string} type the event type.
* @return {Boolean} is it valid to dispatch.
*/
function isEventValid (comp, type) {
// if a component has aleary triggered 'appear' event, then
// the 'appear' even† can't be triggered again utill the
// 'disappear' event triggered.
if (appearEvts.indexOf(type) <= -1) {
return true
}
if (comp._appear === undefined && type === 'disappear') {
return false
}
var res;
if (comp._appear === undefined && type === 'appear') {
res = true;
}
else {
res = type !== comp._appear;
}
res && (comp._appear = type);
return res
}
function Component (data, nodeType) {
this.data = data;
this.node = this.create(nodeType);
this.createChildren();
this.updateAttrs(this.data.attr || {});
// issue: when add element to a list in lifetime hook 'ready', the
// styles is set to the classStyle, not style. This is a issue
// that jsframework should do something about.
var classStyle = this.data.classStyle;
classStyle && this.updateStyle(this.data.classStyle);
this.updateStyle(this.data.style || {});
this.bindEvents(this.data.event || []);
}
Component.prototype = {
getComponentManager: function getComponentManager () {
return ComponentManager.getInstance(this.data.instanceId)
},
getWeexInstance: function getWeexInstance () {
return this.getComponentManager().getWeexInstance()
},
getParent: function getParent () {
return this.getComponentManager().componentMap[this.parentRef]
},
getParentScroller: function getParentScroller () {
if (this.isInScrollable()) {
return this._parentScroller
}
return null
},
getRootScroller: function getRootScroller () {
if (this.isInScrollable()) {
var scroller = this._parentScroller;
var parent = scroller._parentScroller;
while (parent) {
scroller = parent;
parent = scroller._parentScroller;
}
return scroller
}
return null
},
getRootContainer: function getRootContainer () {
var root = this.getWeexInstance().getRoot()
|| document.body;
return root
},
isScrollable: function isScrollable () {
var t = this.data.type;
return ComponentManager.getScrollableTypes().indexOf(t) !== -1
},
isInScrollable: function isInScrollable () {
if (typeof this._isInScrollable === 'boolean') {
return this._isInScrollable
}
var parent = this.getParent();
if (parent
&& (typeof parent._isInScrollable !== 'boolean')
&& !parent.isScrollable()) {
if (parent.data.ref === '_root') {
this._isInScrollable = false;
return false
}
this._isInScrollable = parent.isInScrollable();
this._parentScroller = parent._parentScroller;
return this._isInScrollable
}
if (parent && typeof parent._isInScrollable === 'boolean') {
this._isInScrollable = parent._isInScrollable;
this._parentScroller = parent._parentScroller;
return this._isInScrollable
}
if (parent && parent.isScrollable()) {
this._isInScrollable = true;
this._parentScroller = parent;
return true
}
},
// dispatch a specified event on this.node
// - type: event type
// - data: event data
// - config: event config object
// - bubbles
// - cancelable
dispatchEvent: function dispatchEvent (type, data, config) {
if (!isEventValid(this, type)) {
return
}
var event = document.createEvent('HTMLEvents');
config = config || {};
event.initEvent(type, config.bubbles || false, config.cancelable || false);
!data && (data = {});
event.data = extend({}, data);
extend(event, data);
this.node.dispatchEvent(event);
},
onAppend: function () {
var this$1 = this;
var evts = this.data.event;
if (!evts || !evts.length) { return }
var flag = false;
for (var i = 0, l = evts.length; i < l; i++) {
if (evts[i] === 'appear') {
flag = true;
break
}
}
if (!flag) {
return
}
// trigger 'appear' event in the next tick.
setTimeout(function () {
if (isComponentAppear(this$1)) {
this$1.dispatchEvent('appear', { direction: '' });
}
}, 0);
},
addAppendHandler: function addAppendHandler (cb) {
var pre;
if (this.onAppend) {
pre = this.onAppend.bind(this);
}
this.onAppend = function () {
pre && pre.call(this);
cb && cb.call(this);
}.bind(this);
},
// change src to img-src for lib.img to fire lazyload later.
enableLazyload: function enableLazyload (src) {
if (this.node) {
makeImageLazy(this.node, src);
}
else {
console.error('[h5-render] this.node does not exist.');
}
},
// target can be both weex component and dom element.
fireLazyload: function fireLazyload$1 (target) {
!target && (target = this);
fireLazyload(target);
},
attr: {}, // attr setters
style: {}, // style setters
// event funcs
// - 1. 'updator' for updating attrs or styles with out triggering messages.
// - 2. 'extra' for binding extra data.
// - 3. 'setter' set a specified event handler.
// funcs should be functions like this: (take 'change' event as a example)
// {
// change: {
// updator () {
// return {
// attrs: {
// checked: this.checked
// }
// }
// },
// extra () {
// return {
// value: this.checked
// }
// }
// }
// }
event: {},
clearAttr: function clearAttr () {
},
clearStyle: function clearStyle () {
this.node.cssText = '';
}
};
// extend operations.
extend(Component.prototype, operate);
// extend attr and style setters from 'position' and 'flexbox'.
extend(Component.prototype, position$1);
extend(Component.prototype.style, flexbox.style);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// Component which can have no subcomponents.
// This component should not be instantiated directly, since
// it is designed to be used as a base class to extend from.
function Atomic (data) {
Component.call(this, data);
}
Atomic.prototype = Object.create(Component.prototype);
Atomic.prototype.createChildren = function (data) {
// do nonthing
return
};
Atomic.prototype.appendChild = function (data) {
// do nothing
return
};
Atomic.prototype.insertBefore = function (child, before) {
// do nothing
return
};
Atomic.prototype.removeChild = function (child) {
// do nothing
return
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* save the original listener for 'addEventListener'.
* this is the dipaching listener which is waiting for feed.
* map structure: moduleName -> eventName -> [handlers].
*/
var handlerMap$1 = {};
window.addEventListener('moduleevent', function (event) {
var dt = event.detail || {};
var module = dt.module;
var type = dt.type;
try {
handlerMap$1[module][type].forEach(function (handler) { return handler(dt); });
}
catch (e) {
console.warn(("[h5-render] no such event " + type + " for module " + module + "."));
}
});
function addEventListener$1 (module, evt, callbackId, options) {
var this$1 = this;
var once = options && !!options.once;
var moduleMap = handlerMap$1[module];
if (!moduleMap) {
moduleMap = handlerMap$1[module] = {};
}
var handlers = moduleMap[evt];
if (!handlers) {
handlers = moduleMap[evt] = [];
}
handlers.push(function (data) { return this$1.sender.performCallback(callbackId, data, !once); });
}
function removeAllEventListeners$1 (module, evt) {
try {
delete handlerMap$1[module][evt];
}
catch (e) {
// do nothing.
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* register module event listener for every api module except 'globalEvent'.
*/
function registerModuleEventListener (name, module, meta) {
if (name !== 'globalEvent') {
module['addEventListener'] = function (evt, callbackId, options) {
return addEventListener$1.call(this, name, evt, callbackId, options)
};
module['removeAllEventListeners'] = function (evt) {
return removeAllEventListeners$1.call(this, name, evt)
}
; [{
name: 'addEventListener',
args: ['string', 'function', 'object']
}, {
name: 'removeAllEventListeners',
args: ['string']
}].forEach(function (info) { return meta[name].push(info); });
}
}
var methods$2 = {
// Register a new component with the specified name.
registerComponent: function registerComponent (name, comp) {
ComponentManager.registerComponent(name, comp);
},
// Register a new api module.
// If the module already exists, just add methods from the
// new module to the old one.
registerApiModule: function registerApiModule (name, module, meta) {
registerModuleEventListener(name, module, meta);
if (!protocol.apiModule[name]) {
protocol.apiModule[name] = module;
}
else {
for (var key in module) {
if (module.hasOwnProperty(key)) {
protocol.apiModule[name][key] = module[key];
}
}
}
// register API module's meta info to jsframework
if (meta) {
protocol.setApiModuleMeta(meta);
global.registerModules(protocol.getApiModuleMeta(name), true);
}
},
// Register a new api method for the specified module.
// opts:
// - args: type of arguments the API method takes such
// as ['string', 'function']
registerApi: function registerApi (moduleName, name, method, args) {
if (typeof method !== 'function') {
return
}
if (!protocol.apiModule[moduleName]) {
protocol.apiModule[moduleName] = {};
protocol._meta[moduleName] = [];
}
protocol.apiModule[moduleName][name] = method;
if (!args) {
return
}
// register API meta info to jsframework
protocol.setApiMeta(moduleName, {
name: name,
args: args
});
global.registerModules(protocol.getApiModuleMeta(moduleName), true);
},
// Register a new weex-bundle-loader.
registerLoader: function registerLoader$1 (name, loaderFunc) {
registerLoader(name, loaderFunc);
}
};
// To install components and plugins.
function install (mod) {
mod.init(this);
}
function bind$1 (Weex) {
Weex.install = install.bind(Weex);
extend(Weex, methods$2);
}
(typeof window === 'undefined') && (window = {ctrl: {}, lib: {}});!window.ctrl && (window.ctrl = {});!window.lib && (window.lib = {});!function(a,b){function c(a){Object.defineProperty(this,"val",{value:a.toString(),enumerable:!0}),this.gt=function(a){return c.compare(this,a)>0},this.gte=function(a){return c.compare(this,a)>=0},this.lt=function(a){return c.compare(this,a)<0},this.lte=function(a){return c.compare(this,a)<=0},this.eq=function(a){return 0===c.compare(this,a)};}b.env=b.env||{},c.prototype.toString=function(){return this.val},c.prototype.valueOf=function(){for(var a=this.val.split("."),b=[],c=0;c<a.length;c++){var d=parseInt(a[c],10);isNaN(d)&&(d=0);var e=d.toString();e.length<5&&(e=Array(6-e.length).join("0")+e),b.push(e),1===b.length&&b.push(".");}return parseFloat(b.join(""))},c.compare=function(a,b){a=a.toString().split("."),b=b.toString().split(".");for(var c=0;c<a.length||c<b.length;c++){var d=parseInt(a[c],10),e=parseInt(b[c],10);if(window.isNaN(d)&&(d=0),window.isNaN(e)&&(e=0),e>d){ return-1; }if(d>e){ return 1 }}return 0},b.version=function(a){return new c(a)};}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c=a.location.search.replace(/^\?/,"");if(b.env.params={},c){ for(var d=c.split("&"),e=0;e<d.length;e++){d[e]=d[e].split("=");try{b.env.params[d[e][0]]=decodeURIComponent(d[e][1]);}catch(f){b.env.params[d[e][0]]=d[e][1];}} }}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c,d=a.navigator.userAgent;if(c=d.match(/Windows\sPhone\s(?:OS\s)?([\d\.]+)/)){ b.env.os={name:"Windows Phone",isWindowsPhone:!0,version:c[1]}; }else if(d.match(/Safari/)&&(c=d.match(/Android[\s\/]([\d\.]+)/))){ b.env.os={version:c[1]},d.match(/Mobile\s+Safari/)?(b.env.os.name="Android",b.env.os.isAndroid=!0):(b.env.os.name="AndroidPad",b.env.os.isAndroidPad=!0); }else if(c=d.match(/(iPhone|iPad|iPod)/)){var e=c[1];c=d.match(/OS ([\d_\.]+) like Mac OS X/),b.env.os={name:e,isIPhone:"iPhone"===e||"iPod"===e,isIPad:"iPad"===e,isIOS:!0,version:c[1].split("_").join(".")};}else { b.env.os={name:"unknown",version:"0.0.0"}; }b.version&&(b.env.os.version=b.version(b.env.os.version));}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c,d=a.navigator.userAgent;(c=d.match(/(?:UCWEB|UCBrowser\/)([\d\.]+)/))?b.env.browser={name:"UC",isUC:!0,version:c[1]}:(c=d.match(/MQQBrowser\/([\d\.]+)/))?b.env.browser={name:"QQ",isQQ:!0,version:c[1]}:(c=d.match(/Firefox\/([\d\.]+)/))?b.env.browser={name:"Firefox",isFirefox:!0,version:c[1]}:(c=d.match(/MSIE\s([\d\.]+)/))||(c=d.match(/IEMobile\/([\d\.]+)/))?(b.env.browser={version:c[1]},d.match(/IEMobile/)?(b.env.browser.name="IEMobile",b.env.browser.isIEMobile=!0):(b.env.browser.name="IE",b.env.browser.isIE=!0),d.match(/Android|iPhone/)&&(b.env.browser.isIELikeWebkit=!0)):(c=d.match(/(?:Chrome|CriOS)\/([\d\.]+)/))?(b.env.browser={name:"Chrome",isChrome:!0,version:c[1]},d.match(/Version\/[\d+\.]+\s*Chrome/)&&(b.env.browser.name="Chrome Webview",b.env.browser.isWebview=!0)):d.match(/Safari/)&&(c=d.match(/Android[\s\/]([\d\.]+)/))?b.env.browser={name:"Android",isAndroid:!0,version:c[1]}:d.match(/iPhone|iPad|iPod/)?d.match(/Safari/)?(c=d.match(/Version\/([\d\.]+)/),b.env.browser={name:"Safari",isSafari:!0,version:c[1]}):(c=d.match(/OS ([\d_\.]+) like Mac OS X/),b.env.browser={name:"iOS Webview",isWebview:!0,version:c[1].replace(/\_/g,".")}):b.env.browser={name:"unknown",version:"0.0.0"},b.version&&(b.env.browser.version=b.version(b.env.browser.version));}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c=a.navigator.userAgent;c.match(/Weibo/i)?b.env.thirdapp={appname:"Weibo",isWeibo:!0}:c.match(/MicroMessenger/i)?b.env.thirdapp={appname:"Weixin",isWeixin:!0}:b.env.thirdapp=!1;}(window,window.lib||(window.lib={})),function(a,b){b.env=b.env||{};var c,d,e=a.navigator.userAgent;(d=e.match(/WindVane[\/\s]([\d\.\_]+)/))&&(c=d[1]);var f=!1,g="",h="",i="";(d=e.match(/AliApp\(([A-Z\-]+)\/([\d\.]+)\)/i))&&(f=!0,g=d[1],i=d[2],h=g.indexOf("-PD")>0?b.env.os.isIOS?"iPad":b.env.os.isAndroid?"AndroidPad":b.env.os.name:b.env.os.name),!g&&e.indexOf("TBIOS")>0&&(g="TB"),f?b.env.aliapp={windvane:b.version(c||"0.0.0"),appname:g||"unkown",version:b.version(i||"0.0.0"),platform:h||b.env.os.name}:b.env.aliapp=!1,b.env.taobaoApp=b.env.aliapp;}(window,window.lib||(window.lib={}));
(typeof window === 'undefined') && (window = {ctrl: {}, lib: {}});!window.ctrl && (window.ctrl = {});!window.lib && (window.lib = {});!function(a,b){function c(a){var b={};Object.defineProperty(this,"params",{set:function(a){if("object"==typeof a){for(var c in b){ delete b[c]; }for(var c in a){ b[c]=a[c]; }}},get:function(){return b},enumerable:!0}),Object.defineProperty(this,"search",{set:function(a){if("string"==typeof a){0===a.indexOf("?")&&(a=a.substr(1));var c=a.split("&");for(var d in b){ delete b[d]; }for(var e=0;e<c.length;e++){var f=c[e].split("=");if(void 0!==f[1]&&(f[1]=f[1].toString()),f[0]){ try{b[decodeURIComponent(f[0])]=decodeURIComponent(f[1]);}catch(g){b[f[0]]=f[1];} }}}},get:function(){var a=[];for(var c in b){ if(void 0!==b[c]){ if(""!==b[c]){ try{a.push(encodeURIComponent(c)+"="+encodeURIComponent(b[c]));}catch(d){a.push(c+"="+b[c]);} }else { try{a.push(encodeURIComponent(c));}catch(d){a.push(c);} } } }return a.length?"?"+a.join("&"):""},enumerable:!0});var c;Object.defineProperty(this,"hash",{set:function(a){"string"==typeof a&&(a&&a.indexOf("#")<0&&(a="#"+a),c=a||"");},get:function(){return c},enumerable:!0}),this.set=function(a){a=a||"";var b;if(!(b=a.match(new RegExp("^([a-z0-9-]+:)?[/]{2}(?:([^@/:?]+)(?::([^@/:]+))?@)?([^:/?#]+)(?:[:]([0-9]+))?([/][^?#;]*)?(?:[?]([^#]*))?([#][^?]*)?$","i")))){ throw new Error("Wrong uri scheme."); }this.protocol=b[1]||("object"==typeof location?location.protocol:""),this.username=b[2]||"",this.password=b[3]||"",this.hostname=this.host=b[4],this.port=b[5]||"",this.pathname=b[6]||"/",this.search=b[7]||"",this.hash=b[8]||"",this.origin=this.protocol+"//"+this.hostname;},this.toString=function(){var a=this.protocol+"//";return this.username&&(a+=this.username,this.password&&(a+=":"+this.password),a+="@"),a+=this.host,this.port&&"80"!==this.port&&(a+=":"+this.port),this.pathname&&(a+=this.pathname),this.search&&(a+=this.search),this.hash&&(a+=this.hash),a},a&&this.set(a.toString());}b.httpurl=function(a){return new c(a)};}(window,window.lib||(window.lib={}));
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
var isInitialized = false;
// major events supported:
// panstart
// panmove
// panend
// swipe
// longpress
// extra events supported:
// dualtouchstart
// dualtouch
// dualtouchend
// tap
// doubletap
// pressend
var doc = window.document;
var docEl = doc.documentElement;
var slice$1 = Array.prototype.slice;
var gestures = {};
var lastTap = null;
/**
* find the closest common ancestor
* if there's no one, return null
*
* @param {Element} el1 first element
* @param {Element} el2 second element
* @return {Element} common ancestor
*/
function getCommonAncestor(el1, el2) {
var el = el1;
while (el) {
if (el.contains(el2) || el == el2) {
return el
}
el = el.parentNode;
}
return null
}
/**
* fire a HTMLEvent
*
* @param {Element} element which element to fire a event on
* @param {string} type type of event
* @param {object} extra extra data for the event object
*/
function fireEvent$2(element, type, extra) {
var event = doc.createEvent('HTMLEvents');
event.initEvent(type, true, true);
if (typeof extra === 'object') {
for (var p in extra) {
event[p] = extra[p];
}
}
element.dispatchEvent(event);
}
/**
* calc the transform
* assume 4 points ABCD on the coordinate system
* > rotate:angle rotating from AB to CD
* > scale:scale ratio from AB to CD
* > translate:translate shift from A to C
*
* @param {number} x1 abscissa of A
* @param {number} y1 ordinate of A
* @param {number} x2 abscissa of B
* @param {number} y2 ordinate of B
* @param {number} x3 abscissa of C
* @param {number} y3 ordinate of C
* @param {number} x4 abscissa of D
* @param {number} y4 ordinate of D
* @return {object} transform object like
* {rotate, scale, translate[2], matrix[3][3]}
*/
function calc(x1, y1, x2, y2, x3, y3, x4, y4) {
var rotate = Math.atan2(y4 - y3, x4 - x3) - Math.atan2(y2 - y1, x2 - x1);
var scale = Math.sqrt((Math.pow(y4 - y3, 2)
+ Math.pow(x4 - x3, 2)) / (Math.pow(y2 - y1, 2)
+ Math.pow(x2 - x1, 2)));
var translate = [
x3
- scale * x1 * Math.cos(rotate)
+ scale * y1 * Math.sin(rotate),
y3
- scale * y1 * Math.cos(rotate)
- scale * x1 * Math.sin(rotate)];
return {
rotate: rotate,
scale: scale,
translate: translate,
matrix: [
[scale * Math.cos(rotate), -scale * Math.sin(rotate), translate[0]],
[scale * Math.sin(rotate), scale * Math.cos(rotate), translate[1]],
[0, 0, 1]
]
}
}
/**
* take over the touchstart events. Add new touches to the gestures.
* If there is no previous records, then bind touchmove, tochend
* and touchcancel events.
* new touches initialized with state 'tapping', and within 500 milliseconds
* if the state is still tapping, then trigger gesture 'press'.
* If there are two touche points, then the 'dualtouchstart' is triggerd. The
* node of the touch gesture is their cloest common ancestor.
*
* @event
* @param {event} event
*/
function touchstartHandler(event) {
if (Object.keys(gestures).length === 0) {
docEl.addEventListener('touchmove', touchmoveHandler, false);
docEl.addEventListener('touchend', touchendHandler, false);
docEl.addEventListener('touchcancel', touchcancelHandler, false);
}
// record every touch
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var touchRecord = {};
for (var p in touch) {
touchRecord[p] = touch[p];
}
var gesture = {
startTouch: touchRecord,
startTime: Date.now(),
status: 'tapping',
element: event.srcElement || event.target,
pressingHandler: setTimeout(function (element, touch) {
return function () {
if (gesture.status === 'tapping') {
gesture.status = 'pressing';
fireEvent$2(element, 'longpress', {
// add touch data for weex
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event
});
}
clearTimeout(gesture.pressingHandler);
gesture.pressingHandler = null;
}
}(event.srcElement || event.target, event.changedTouches[i]), 500)
};
gestures[touch.identifier] = gesture;
}
if (Object.keys(gestures).length == 2) {
var elements = [];
for (var p in gestures) {
elements.push(gestures[p].element);
}
fireEvent$2(getCommonAncestor(elements[0], elements[1]), 'dualtouchstart', {
touches: slice$1.call(event.touches),
touchEvent: event
});
}
}
/**
* take over touchmove events, and handle pan and dual related gestures.
*
* 1. traverse every touch point:
* > if 'tapping' and the shift is over 10 pixles, then it's a 'panning'.
* 2. if there are two touch points, then calc the tranform and trigger
* 'dualtouch'.
*
* @event
* @param {event} event
*/
function touchmoveHandler(event) {
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var gesture = gestures[touch.identifier];
if (!gesture) {
return
}
if (!gesture.lastTouch) {
gesture.lastTouch = gesture.startTouch;
}
if (!gesture.lastTime) {
gesture.lastTime = gesture.startTime;
}
if (!gesture.velocityX) {
gesture.velocityX = 0;
}
if (!gesture.velocityY) {
gesture.velocityY = 0;
}
if (!gesture.duration) {
gesture.duration = 0;
}
var time = Date.now() - gesture.lastTime;
var vx = (touch.clientX - gesture.lastTouch.clientX) / time;
var vy = (touch.clientY - gesture.lastTouch.clientY) / time;
var RECORD_DURATION = 70;
if (time > RECORD_DURATION) {
time = RECORD_DURATION;
}
if (gesture.duration + time > RECORD_DURATION) {
gesture.duration = RECORD_DURATION - time;
}
gesture.velocityX = (gesture.velocityX * gesture.duration + vx * time)
/ (gesture.duration + time);
gesture.velocityY = (gesture.velocityY * gesture.duration + vy * time)
/ (gesture.duration + time);
gesture.duration += time;
gesture.lastTouch = {};
for (var p in touch) {
gesture.lastTouch[p] = touch[p];
}
gesture.lastTime = Date.now();
var displacementX = touch.clientX - gesture.startTouch.clientX;
var displacementY = touch.clientY - gesture.startTouch.clientY;
var distance = Math.sqrt(Math.pow(displacementX, 2)
+ Math.pow(displacementY, 2));
var isVertical = !(Math.abs(displacementX) > Math.abs(displacementY));
var direction = isVertical
? displacementY >= 0 ? 'down' : 'up'
: displacementX >= 0 ? 'right' : 'left';
// magic number 10: moving 10px means pan, not tap
if ((gesture.status === 'tapping' || gesture.status === 'pressing')
&& distance > 10) {
gesture.status = 'panning';
gesture.isVertical = isVertical;
gesture.direction = direction;
fireEvent$2(gesture.element, 'panstart', {
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event,
isVertical: gesture.isVertical,
direction: direction
});
}
if (gesture.status === 'panning') {
gesture.panTime = Date.now();
fireEvent$2(gesture.element, 'panmove', {
displacementX: displacementX,
displacementY: displacementY,
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event,
isVertical: gesture.isVertical,
direction: direction
});
}
}
if (Object.keys(gestures).length == 2) {
var position = [];
var current = [];
var elements = [];
var transform;
for (var i = 0; i < event.touches.length; i++) {
var touch = event.touches[i];
var gesture = gestures[touch.identifier];
position.push([gesture.startTouch.clientX, gesture.startTouch.clientY]);
current.push([touch.clientX, touch.clientY]);
}
for (var p in gestures) {
elements.push(gestures[p].element);
}
transform = calc(
position[0][0],
position[0][1],
position[1][0],
position[1][1],
current[0][0],
current[0][1],
current[1][0],
current[1][1]
);
fireEvent$2(getCommonAncestor(elements[0], elements[1]), 'dualtouch', {
transform: transform,
touches: event.touches,
touchEvent: event
});
}
}
/**
* handle touchend event
*
* 1. if there are tow touch points, then trigger 'dualtouchend'如
*
* 2. traverse every touch piont:
* > if tapping, then trigger 'tap'.
* If there is a tap 300 milliseconds before, then it's a 'doubletap'.
* > if padding, then decide to trigger 'panend' or 'swipe'
* > if pressing, then trigger 'pressend'.
*
* 3. remove listeners.
*
* @event
* @param {event} event
*/
function touchendHandler(event) {
if (Object.keys(gestures).length == 2) {
var elements = [];
for (var p in gestures) {
elements.push(gestures[p].element);
}
fireEvent$2(getCommonAncestor(elements[0], elements[1]), 'dualtouchend', {
touches: slice$1.call(event.touches),
touchEvent: event
});
}
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var id = touch.identifier;
var gesture = gestures[id];
if (!gesture) {
continue
}
if (gesture.pressingHandler) {
clearTimeout(gesture.pressingHandler);
gesture.pressingHandler = null;
}
if (gesture.status === 'tapping') {
gesture.timestamp = Date.now();
fireEvent$2(gesture.element, 'tap', {
touch: touch,
touchEvent: event
});
if (lastTap && gesture.timestamp - lastTap.timestamp < 300) {
fireEvent$2(gesture.element, 'doubletap', {
touch: touch,
touchEvent: event
});
}
lastTap = gesture;
}
if (gesture.status === 'panning') {
var now = Date.now();
var duration = now - gesture.startTime;
var displacementX = touch.clientX - gesture.startTouch.clientX;
var displacementY = touch.clientY - gesture.startTouch.clientY;
var velocity = Math.sqrt(gesture.velocityY * gesture.velocityY
+ gesture.velocityX * gesture.velocityX);
var isSwipe = velocity > 0.5 && (now - gesture.lastTime) < 100;
var extra = {
duration: duration,
isSwipe: isSwipe,
velocityX: gesture.velocityX,
velocityY: gesture.velocityY,
displacementX: displacementX,
displacementY: displacementY,
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event,
isVertical: gesture.isVertical,
direction: gesture.direction
};
fireEvent$2(gesture.element, 'panend', extra);
if (isSwipe) {
fireEvent$2(gesture.element, 'swipe', extra);
}
}
if (gesture.status === 'pressing') {
fireEvent$2(gesture.element, 'pressend', {
touch: touch,
touchEvent: event
});
}
delete gestures[id];
}
if (Object.keys(gestures).length === 0) {
docEl.removeEventListener('touchmove', touchmoveHandler, false);
docEl.removeEventListener('touchend', touchendHandler, false);
docEl.removeEventListener('touchcancel', touchcancelHandler, false);
}
}
/**
* handle touchcancel
*
* 1. if there are two touch points, then trigger 'dualtouchend'
*
* 2. traverse everty touch point:
* > if pannnig, then trigger 'panend'
* > if pressing, then trigger 'pressend'
*
* 3. remove listeners
*
* @event
* @param {event} event
*/
function touchcancelHandler(event) {
if (Object.keys(gestures).length == 2) {
var elements = [];
for (var p in gestures) {
elements.push(gestures[p].element);
}
fireEvent$2(getCommonAncestor(elements[0], elements[1]), 'dualtouchend', {
touches: slice$1.call(event.touches),
touchEvent: event
});
}
for (var i = 0; i < event.changedTouches.length; i++) {
var touch = event.changedTouches[i];
var id = touch.identifier;
var gesture = gestures[id];
if (!gesture) {
continue
}
if (gesture.pressingHandler) {
clearTimeout(gesture.pressingHandler);
gesture.pressingHandler = null;
}
if (gesture.status === 'panning') {
fireEvent$2(gesture.element, 'panend', {
touch: touch,
touches: event.touches,
changedTouches: event.changedTouches,
touchEvent: event
});
}
if (gesture.status === 'pressing') {
fireEvent$2(gesture.element, 'pressend', {
touch: touch,
touchEvent: event
});
}
delete gestures[id];
}
if (Object.keys(gestures).length === 0) {
docEl.removeEventListener('touchmove', touchmoveHandler, false);
docEl.removeEventListener('touchend', touchendHandler, false);
docEl.removeEventListener('touchcancel', touchcancelHandler, false);
}
}
if (!isInitialized) {
docEl.addEventListener('touchstart', touchstartHandler, false);
isInitialized = true;
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global lib, WebSocket */
runtime.config.frameworks = frameworks$1;
var framework = subversion.framework;
var transformer = subversion.transformer;
// register framework meta info
global.frameworkVersion = framework;
global.transformerVersion = transformer;
// init bridge.
receiver.init();
// init frameworks
runtime.config.Document.Listener = ComponentManager;
var globalMethods = runtime.init(runtime.config);
// set global methods
var loop$1 = function ( methodName ) {
global[methodName] = function () {
var args = [], len = arguments.length;
while ( len-- ) args[ len ] = arguments[ len ];
var ret = globalMethods[methodName].apply(globalMethods, args);
if (ret instanceof Error) {
console.error(ret.toString());
}
return ret
};
};
for (var methodName in globalMethods) loop$1( methodName );
// gesture
var DEFAULT_DESIGN_WIDTH = 750;
var DEFAULT_ROOT_ID = 'weex';
var DEFAULT_JSONP_CALLBACK_NAME = 'weexJsonpCallback';
global.WXEnvironment = {
weexVersion: config$4.weexVersion,
appName: lib.env.aliapp ? lib.env.aliapp.appname : null,
appVersion: lib.env.aliapp ? lib.env.aliapp.version.val : null,
platform: 'Web',
osName: lib.env.browser ? lib.env.browser.name : null,
osVersion: lib.env.browser ? lib.env.browser.version.val : null,
deviceWidth: window.innerWidth,
deviceHeight: window.innerHeight,
devicePixelRatio: window.devicePixelRatio ? window.devicePixelRatio : (window.screen.width >= 1440 ? 3.5 : (window.screen.width >= 1080 ? 3 : (window.screen.width >= 800 ? 2.5 : (window.screen.width >= 640 ? 2 : (window.screen.width >= 480 ? 1.5 : 1)))))
};
var _weexInstance = {};
function noop () {}
function setupViewport (width) {
document.querySelector('meta[name=viewport]').setAttribute('content', ("width=" + width + ", user-scalable=no"));
}
(function initializeWithUrlParams () {
// in casperjs the protocol is file.
if (location.protocol.match(/file/)) {
return
}
var params = lib.httpurl(location.href).params;
// set global 'debug' config to true if there's a debug flag in current url.
var debug = params['debug'];
config$4.debug = debug === true || debug === 'true';
!config$4.debug && (console.debug = noop);
// config for the 'downgrade'.
for (var key in params) {
if (params.hasOwnProperty(key)) {
var match = key.match(/^downgrade_(\w+)$/);
if (!match || !match[1]) {
continue
}
var dk = match[1];
// downgrade in the config file has the highest priority.
if (typeof config$4.downgrade[dk] === 'boolean') {
continue
}
var dr = params[("downgrade_" + dk)];
config$4.downgrade[dk] = dr === true || dr === 'true';
}
}
})();
function Weex$1 (options) {
if (!(this instanceof Weex$1)) {
return new Weex$1(options)
}
// Width of the root container. Default is window.innerWidth.
this.width = options.width || window.innerWidth;
this.bundleUrl = options.bundleUrl || location.href;
this.instanceId = options.appId;
this.rootId = options.rootId || (DEFAULT_ROOT_ID + getRandom(10));
this.jsonpCallback = options.jsonpCallback || DEFAULT_JSONP_CALLBACK_NAME;
this.source = options.source;
this.loader = options.loader;
this.embed = options.embed;
// init viewport
setupViewport(DEFAULT_DESIGN_WIDTH);
// downgrade options.
var dg = options.downgrade || [];
dg.forEach(function (comp) {
config$4.downgrade[comp] = true;
});
this.data = options.data;
this.sender = new Sender(this);
_weexInstance[this.instanceId] = this;
// load bundle.
load({
jsonpCallback: this.jsonpCallback,
source: this.source,
loader: this.loader
}, function (err, appCode) {
if (!err) {
this.createApp(config$4, appCode);
}
else {
console.error('load bundle err:', err);
}
}.bind(this));
}
Weex$1.init = function (options) {
if (isArray(options)) {
options.forEach(function (config) {
new Weex$1(config);
});
}
else if (getType(options) === 'object') {
new Weex$1(options);
}
};
Weex$1.getInstance = function (instanceId) {
return _weexInstance[instanceId]
};
Weex$1.prototype = {
createApp: function (config, appCode) {
var root = document.querySelector('#' + this.rootId);
if (!root) {
root = document.createElement('div');
root.id = this.rootId;
document.body.appendChild(root);
}
var instance = window.createInstance(
this.instanceId,
appCode,
{
bundleUrl: this.bundleUrl,
debug: config.debug
},
this.data
);
if (instance instanceof Error) {
return console.error('[h5-render]', instance)
}
// Do not destroy instance before unload, because in most browser
// press back button to back to this page will not refresh
// the window and the instance will not be recreated then.
// window.addEventListener('beforeunload', function (e) {
// })
},
getComponentManager: function () {
if (!this._componentManager) {
this._componentManager = ComponentManager.getInstance(this.instanceId);
}
return this._componentManager
},
getRoot: function () {
return document.querySelector('#' + this.rootId)
}
};
Weex$1.stopTheWorld = function (instanceId) {
if (!instanceId) {
return Object.keys(_weexInstance).map(function (instanceId) {
Weex$1.stopTheWorld(instanceId);
})
}
window.destroyInstance(instanceId);
}
// for weex-toolkit.
; (function startRefreshController () {
if (location.protocol.match(/file/)) {
return
}
if (location.search.indexOf('hot-reload_controller') === -1) {
return
}
if (typeof WebSocket === 'undefined') {
console.info('auto refresh need WebSocket support');
return
}
var host = location.hostname;
var port = 8082;
var client = new WebSocket('ws://' + host + ':' + port + '/',
'echo-protocol'
);
client.onerror = function () {
console.log('refresh controller websocket connection error');
};
client.onmessage = function (e) {
console.log('Received: \'' + e.data + '\'');
if (e.data === 'refresh') {
location.reload();
}
};
})();
bind$1(Weex$1);
extend(Weex$1, {
Component: Component,
Atomic: Atomic,
ComponentManager: ComponentManager,
utils: utils,
config: config$4
});
global.weex = Weex$1;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function init$7 (Weex) {
var Component = Weex.Component;
function RootComponent (data, nodeType) {
var id = data.rootId + '-root';
var ct = document.querySelector(("#" + (data.rootId)));
var cm = ComponentManager.getInstance(data.instanceId);
this.data = data;
ct.classList.add('weex-container');
if (!data.style.height && !data.style.flex) {
// if no specification on root's height, then
// fill root container with the root element by full scale.
data.style.flex = 1;
}
// The root component should be implemented as a div component, as the scrollable
// components have performance issue compare to the original body scroll.
if (!nodeType) {
console.warn("[h5-render] no nodeType is specified, construct Root use 'droot' by default.");
nodeType = 'droot';
}
else if (config$4.validRoots.indexOf(nodeType) === -1) {
console.warn(("[h5-render] the root component type '" + nodeType + "' is not one of\nthe types in [" + (config$4.validRoots) + "] list. It is auto downgraded\nto 'droot'."));
nodeType = 'droot';
}
else if (config$4.downgrade.root) {
console.warn("[h5-render] the root is downgrade to 'droot' due to the downgrade\nconfiguration of weex.");
nodeType = 'droot';
}
data.type = nodeType;
var cmp = cm.createElement(data);
cmp.node.id = id;
return cmp
}
RootComponent.prototype = Object.create(Component.prototype);
Weex.registerComponent('root', RootComponent);
}
var root = { init: init$7 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function init$8 (Weex) {
var Component = Weex.Component;
function Div (data, nodeType) {
Component.call(this, data, nodeType);
this.node.classList.add('weex-container');
}
Div.prototype = Object.create(Component.prototype);
Weex.registerComponent('div', Div);
Weex.registerComponent('container', Div);
}
var div = { init: init$8 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var DEFAULT_LOAD_MORE_OFFSET = 0;
var Component$1;
var proto$1 = {
create: function create (nodeType) {
var node = document.createElement(nodeType || 'div');
node.classList.add('weex-droot');
node.classList.add('weex-container');
return node
},
bindEvents: function bindEvents (evts) {
Component$1.prototype.bindEvents.call(this, evts);
window.addEventListener('scroll', function (e) {
// fire loadmore event.
var body = document.body;
var leftDist = body.scrollHeight - window.innerHeight - body.scrollTop;
if (leftDist <= this.loadmoreoffset && this.isAvailableToFireloadmore) {
this.isAvailableToFireloadmore = false;
this.dispatchEvent('loadmore');
}
else if (leftDist > this.loadmoreoffset && !this.isAvailableToFireloadmore) {
this.isAvailableToFireloadmore = true;
}
}.bind(this));
}
};
var attr = {
loadmoreoffset: function loadmoreoffset (val) {
var value = parseFloat(val);
if (value < 0 || isNaN(value)) {
console.warn(("[h5-render] invalid loadmoreoffset: " + val));
return
}
this.loadmoreoffset = value;
}
};
function init$9 (Weex) {
Component$1 = Weex.Component;
var extend = Weex.utils.extend;
function Droot (data, nodeType) {
if (data.ref !== '_root') {
return console.warn('[h5-render] droot can only be used as a downgraded root.')
}
this.loadmoreoffset = DEFAULT_LOAD_MORE_OFFSET;
this.isAvailableToFireloadmore = true;
Component$1.call(this, data, nodeType);
}
Droot.prototype = Object.create(Component$1.prototype);
extend(Droot.prototype, proto$1);
extend(Droot.prototype, { attr: attr });
Weex.registerComponent('droot', Droot);
}
var droot = { init: init$9 };
__$styleInject(".weex-img {\n background-repeat: no-repeat;\n background-size: 100% 100%;\n background-position: 50%;\n}",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global lib */
var DEFAULT_SIZE = 200;
var RESIZE_MODES = ['stretch', 'cover', 'contain'];
var DEFAULT_RESIZE_MODE = 'stretch';
var Atomic$1;
/**
* resize: 'cover' | 'contain' | 'stretch', default is 'stretch'
* src: url
* placeholder / place-holder: url
*/
var proto$2 = {
create: function create () {
var node = document.createElement('div');
node.classList.add('weex-img');
node.classList.add('weex-element');
return node
},
clearAttr: function clearAttr () {
this.src = '';
this.node.style.backgroundImage = '';
}
};
var attr$1 = {
src: function (val) {
if (!this.src) {
this.src = lib.img.defaultSrc;
this.node.style.backgroundImage = 'url(' + this.src + ')';
}
this.enableLazyload(val);
},
placeholder: function (val) {
this.node.dataset.placeholder = val;
},
// alias for placeholder (place-holder)
placeHolder: function (val) {
return this.attr.placeholder.call(this, val)
},
resize: function (val) {
if (RESIZE_MODES.indexOf(val) === -1) {
val = 'stretch';
}
this.node.style.backgroundSize = val === 'stretch'
? '100% 100%'
: val;
}
};
var style$1 = {
width: function (val) {
val = parseFloat(val);
if (val < 0 || isNaN(val)) {
val = DEFAULT_SIZE;
}
this.node.style.width = val + 'px';
},
height: function (val) {
val = parseFloat(val);
if (val < 0 || isNaN(val)) {
val = DEFAULT_SIZE;
}
this.node.style.height = val + 'px';
}
};
var event = {
load: {
extra: function () {
var ref = this.node;
var naturalWidth = ref.naturalWidth;
var naturalHeight = ref.naturalHeight;
return {
naturalWidth: naturalWidth, naturalHeight: naturalHeight
}
}
}
};
function init$10 (Weex) {
Atomic$1 = Weex.Atomic;
var extend = Weex.utils.extend;
function Image (data) {
this.resize = DEFAULT_RESIZE_MODE;
Atomic$1.call(this, data);
}
Image.prototype = Object.create(Atomic$1.prototype);
extend(Image.prototype, proto$2);
extend(Image.prototype, { attr: attr$1 });
extend(Image.prototype, {
style: extend(Object.create(Atomic$1.prototype.style), style$1)
});
extend(Image.prototype, { event: event });
Weex.registerComponent('image', Image);
}
var Image$1 = { init: init$10 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var DEFAULT_FONT_SIZE = 32;
var DEFAULT_TEXT_OVERFLOW = 'ellipsis';
var proto$3 = {
create: function create () {
var node = document.createElement('div');
node.classList.add('weex-container');
node.style.fontSize = DEFAULT_FONT_SIZE + 'px';
this.textNode = document.createElement('span');
// Give the developers the ability to control space
// and line-breakers.
this.textNode.style.whiteSpace = 'pre-wrap';
this.textNode.style.wordWrap = 'break-word';
this.textNode.style.display = '-webkit-box';
this.textNode.style.webkitBoxOrient = 'vertical';
this.style.lines.call(this, (this.data.style || {}).lines);
node.appendChild(this.textNode);
return node
},
clearAttr: function clearAttr () {
this.node.firstChild.textContent = '';
}
};
var attr$2 = {
value: function (value) {
var span = this.node.firstChild;
span.innerHTML = '';
if (value == null || value === '') {
return
}
span.textContent = value;
/**
* Developers are supposed to have the ability to break text
* lines manually. Using ``&nbsp;`` to replace text space is
* not compatible with the ``-webkit-line-clamp``. Therefor
* we use ``white-space: no-wrap`` instead (instead of the
* code bellow).
const frag = document.createDocumentFragment()
text.split(' ').forEach(function(str) {
const textNode = document.createTextNode(str)
const space = document.createElement('i')
space.innerHTML = '&nbsp;'
frag.appendChild(space)
frag.appendChild(textNode)
})
frag.removeChild(frag.firstChild)
span.appendChild(document.createElement('br'))
span.appendChild(frag)
})
span.removeChild(span.firstChild)
*/
}
};
var style$2 = {
lines: function (val) {
val = parseInt(val);
if (isNaN(val)) {
return
}
if (val <= 0) {
this.textNode.style.textOverflow = '';
this.textNode.style.overflow = 'visible';
this.textNode.style.webkitLineClamp = '';
}
else {
var style = this.data ? this.data.style : null;
this.textNode.style.overflow = 'hidden';
this.textNode.style.textOverflow = style
? style.textOverflow
: DEFAULT_TEXT_OVERFLOW;
this.textNode.style.webkitLineClamp = val;
}
},
textOverflow: function (val) {
this.textNode.style.textOverflow = val;
}
};
function init$11 (Weex) {
var Atomic = Weex.Atomic;
var extend = Weex.utils.extend;
// attr
// - value: text content.
// style
// - lines: maximum lines of the text.
function Text (data) {
Atomic.call(this, data);
}
Text.prototype = Object.create(Atomic.prototype);
extend(Text.prototype, proto$3);
extend(Text.prototype, { attr: attr$2 });
extend(Text.prototype, {
style: extend(Object.create(Atomic.prototype.style), style$2)
});
Weex.registerComponent('text', Text);
}
var Text = { init: init$11 };
__$styleInject(".scrollable-wrap {\n display: block;\n overflow: hidden;\n}\n\n.scrollable-element.horizontal {\n -webkit-box-orient: horizontal;\n -webkit-flex-direction: row;\n flex-direction: row;\n}\n.scrollable-element.vertical {\n -webkit-box-orient: vertical;\n -webkit-flex-direction: column;\n flex-direction: column;\n}\n",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global lib: true */
/**
* transfer Quadratic Bezier Curve to Cubic Bezier Curve
*
* @param {number} a abscissa of p1
* @param {number} b ordinate of p1
* @return {Array} parameter matrix for cubic bezier curve
* like [[p1x, p1y], [p2x, p2y]]
*/
function quadratic2cubicBezier (a, b) {
return [
[
(a / 3 + (a + b) / 3 - a) / (b - a),
(a * a / 3 + a * b * 2 / 3 - a * a) / (b * b - a * a)
], [
(b / 3 + (a + b) / 3 - a) / (b - a),
(b * b / 3 + a * b * 2 / 3 - a * a) / (b * b - a * a)
]
]
}
/**
* derive position data from knowing motion parameters
* base on Newton's second law: s = vt + at^2/2
*
* @param {object} config object of { v, a, s, t }
* - v: initial velocity
* - a: accelerate speed
* - t: time
* - s: shifting
*/
function Motion (config) {
this.v = config.v || 0;
this.a = config.a || 0;
if (typeof config.t !== 'undefined') {
this.t = config.t;
}
if (typeof config.s !== 'undefined') {
this.s = config.s;
}
// derive time from shifting
if (typeof this.t === 'undefined') {
if (typeof this.s === 'undefined') {
this.t = -this.v / this.a;
}
else {
var t1 = (Math.sqrt(this.v * this.v + 2 * this.a * this.s) - this.v)
/ this.a;
var t2 = (-Math.sqrt(this.v * this.v + 2 * this.a * this.s) - this.v)
/ this.a;
this.t = Math.min(t1, t2);
}
}
// derive shifting from time
if (typeof this.s === 'undefined') {
this.s = this.a * this.t * this.t / 2 + this.v * this.t;
}
}
/**
* derive cubic bezier parameters from motion parameters
* @return {Array} parameter matrix for cubic bezier curve
* like [[p1x, p1y], [p2x, p2y]]
*/
Motion.prototype.generateCubicBezier = function () {
return quadratic2cubicBezier(
this.v / this.a, this.t + this.v / this.a
)
};
!lib && (lib = {});
lib.motion = Motion;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
var doc$1 = window.document;
var ua$1 = window.navigator.userAgent;
var scrollObjs = {};
var plugins = {};
var dpr = window.dpr
|| (!!window.navigator.userAgent.match(/iPhone|iPad|iPod/)
? document.documentElement.clientWidth / window.screen.availWidth
: 1);
var inertiaCoefficient = {
normal: [2 * dpr, 0.0015 * dpr],
slow: [1.5 * dpr, 0.003 * dpr],
veryslow: [1.5 * dpr, 0.005 * dpr]
};
var Firefox = !!ua$1.match(/Firefox/i);
var IEMobile = !!ua$1.match(/IEMobile/i);
var cssPrefix$1 = Firefox ? '-moz-' : IEMobile ? '-ms-' : '-webkit-';
var stylePrefix$1 = Firefox ? 'Moz' : IEMobile ? 'ms' : 'webkit';
function debugLog() {
if (lib.scroll.outputDebugLog) {
console.log.apply(console, arguments);
}
}
function getBoundingClientRect(el) {
var rect = el.getBoundingClientRect();
if (!rect) {
rect = {};
rect.width = el.offsetWidth;
rect.height = el.offsetHeight;
rect.left = el.offsetLeft;
rect.top = el.offsetTop;
var parent = el.offsetParent;
while (parent) {
rect.left += parent.offsetLeft;
rect.top += parent.offsetTop;
parent = parent.offsetParent;
}
rect.right = rect.left + rect.width;
rect.bottom = rect.top + rect.height;
}
return rect
}
function getMinScrollOffset(scrollObj) {
return 0 - scrollObj.options[scrollObj.axis + 'PaddingTop']
}
function getMaxScrollOffset(scrollObj) {
var rect = getBoundingClientRect(scrollObj.element);
var pRect = getBoundingClientRect(scrollObj.viewport);
var min = getMinScrollOffset(scrollObj);
if (scrollObj.axis === 'y') {
var max = 0 - rect.height + pRect.height;
} else {
var max = 0 - rect.width + pRect.width;
}
return Math.min(
max + scrollObj.options[scrollObj.axis + 'PaddingBottom'],
min
)
}
function getBoundaryOffset(scrollObj, offset) {
if (offset > scrollObj.minScrollOffset) {
return offset - scrollObj.minScrollOffset
}
if (offset < scrollObj.maxScrollOffset) {
return offset - scrollObj.maxScrollOffset
}
}
function touchBoundary(scrollObj, offset) {
if (offset > scrollObj.minScrollOffset) {
offset = scrollObj.minScrollOffset;
} else if (offset < scrollObj.maxScrollOffset) {
offset = scrollObj.maxScrollOffset;
}
return offset
}
function fireEvent$3(scrollObj, eventName, extra) {
debugLog(scrollObj.element.scrollId, eventName, extra);
var event = doc$1.createEvent('HTMLEvents');
event.initEvent(eventName, false, true);
event.scrollObj = scrollObj;
if (extra) {
for (var key in extra) {
event[key] = extra[key];
}
}
scrollObj.element.dispatchEvent(event);
scrollObj.viewport.dispatchEvent(event);
}
function getTransformOffset(scrollObj) {
var offset = {x: 0, y: 0};
var transform = getComputedStyle(scrollObj.element)
[stylePrefix$1 + 'Transform'];
var matched;
var reg1 = new RegExp('^matrix3d'
+ '\\((?:[-\\d.]+,\\s*){12}([-\\d.]+),'
+ '\\s*([-\\d.]+)(?:,\\s*[-\\d.]+){2}\\)');
var reg2 = new RegExp('^matrix'
+ '\\((?:[-\\d.]+,\\s*){4}([-\\d.]+),\\s*([-\\d.]+)\\)$');
if (transform !== 'none') {
if ((matched = transform.match(reg1) ||
transform.match(reg2))) {
offset.x = parseFloat(matched[1]) || 0;
offset.y = parseFloat(matched[2]) || 0;
}
}
return offset
}
var CSSMatrix = IEMobile ? 'MSCSSMatrix' : 'WebKitCSSMatrix';
var has3d = !!Firefox
|| CSSMatrix in window
&& 'm11' in new window[CSSMatrix]();
function getTranslate(x, y) {
x = parseFloat(x);
y = parseFloat(y);
if (x != 0) {
x += 'px';
}
if (y != 0) {
y += 'px';
}
if (has3d) {
return 'translate3d(' + x + ', ' + y + ', 0)'
}
return 'translate(' + x + ', ' + y + ')'
}
function setTransitionStyle(scrollObj, duration, timingFunction) {
if (duration === '' && timingFunction === '') {
scrollObj.element.style[stylePrefix$1 + 'Transition'] = '';
} else {
scrollObj.element.style[stylePrefix$1 + 'Transition']
= cssPrefix$1 + 'transform ' + duration + ' ' + timingFunction + ' 0s';
}
}
function setTransformStyle(scrollObj, offset) {
var x = 0;
var y = 0;
if (typeof offset === 'object') {
x = offset.x;
y = offset.y;
} else {
if (scrollObj.axis === 'y') {
y = offset;
} else {
x = offset;
}
}
scrollObj.element.style[stylePrefix$1 + 'Transform'] = getTranslate(x, y);
}
var panning = false;
doc$1.addEventListener('touchmove', function (e) {
if (panning) {
e.preventDefault();
return false
}
return true
}, false);
function Scroll(element, options) {
var this$1 = this;
var that = this;
options = options || {};
options.noBounce = !!options.noBounce;
options.padding = options.padding || {};
if (options.isPrevent == null) {
options.isPrevent = true;
} else {
options.isPrevent = !!options.isPrevent;
}
if (options.isFixScrollendClick == null) {
options.isFixScrollendClick = true;
} else {
options.isFixScrollendClick = !!options.isFixScrollendClick;
}
if (options.padding) {
options.yPaddingTop = -options.padding.top || 0;
options.yPaddingBottom = -options.padding.bottom || 0;
options.xPaddingTop = -options.padding.left || 0;
options.xPaddingBottom = -options.padding.right || 0;
} else {
options.yPaddingTop = 0;
options.yPaddingBottom = 0;
options.xPaddingTop = 0;
options.xPaddingBottom = 0;
}
options.direction = options.direction || 'y';
options.inertia = options.inertia || 'normal';
this.options = options;
that.axis = options.direction;
this.element = element;
this.viewport = element.parentNode;
this.plugins = {};
this.element.scrollId = setTimeout(function () {
scrollObjs[that.element.scrollId + ''] = that;
}, 1);
this.viewport.addEventListener('touchstart', touchstartHandler, false);
this.viewport.addEventListener('touchend', touchendHandler, false);
this.viewport.addEventListener('touchcancel', touchendHandler, false);
this.viewport.addEventListener('panstart', panstartHandler, false);
this.viewport.addEventListener('panmove', panHandler, false);
this.viewport.addEventListener('panend', panendHandler, false);
if (options.isPrevent) {
this.viewport.addEventListener('touchstart', function (e) {
panning = true;
}, false);
that.viewport.addEventListener('touchend', function (e) {
panning = false;
}, false);
}
// if (options.isPrevent) {
// var d = this.axis === 'y'?'vertical':'horizontal'
// this.viewport.addEventListener(d + 'panstart', function (e) {
// panning = true
// }, false)
// that.viewport.addEventListener('panend', function (e) {
// panning = false
// }, false)
// }
if (options.isFixScrollendClick) {
var preventScrollendClick;
var fixScrollendClickTimeoutId;
this.viewport.addEventListener('scrolling', function () {
preventScrollendClick = true;
fixScrollendClickTimeoutId && clearTimeout(fixScrollendClickTimeoutId);
fixScrollendClickTimeoutId = setTimeout(function (e) {
preventScrollendClick = false;
}, 400);
}, false);
function preventScrollendClickHandler(e) {
if (preventScrollendClick || isScrolling) {
e.preventDefault();
e.stopPropagation();
return false
}
return true
}
function fireNiceTapEventHandler(e) {
if (!preventScrollendClick && !isScrolling) {
setTimeout(function () {
var niceTapEvent = document.createEvent('HTMLEvents');
niceTapEvent.initEvent('niceclick', true, true);
e.target.dispatchEvent(niceTapEvent);
}, 300);
}
}
this.viewport.addEventListener('click', preventScrollendClickHandler);
this.viewport.addEventListener('tap', fireNiceTapEventHandler);
}
function setTransitionEndHandler(h, t) {
if (options.useFrameAnimation) {
return
}
transitionEndHandler = null;
clearTimeout(transitionEndTimeoutId);
transitionEndTimeoutId = setTimeout(function () {
if (transitionEndHandler) {
transitionEndHandler = null;
lib.animation.requestFrame(h);
}
}, (t || 400));
transitionEndHandler = h;
}
if (options.useFrameAnimation) {
var scrollAnimation;
Object.defineProperty(this, 'animation', {
get: function () {
return scrollAnimation
}
});
} else {
var transitionEndHandler;
var transitionEndTimeoutId = 0;
element.addEventListener(
Firefox
? 'transitionend'
: (stylePrefix$1 + 'TransitionEnd'), function (e) {
if (transitionEndHandler) {
var handler = transitionEndHandler;
transitionEndHandler = null;
clearTimeout(transitionEndTimeoutId);
lib.animation.requestFrame(function () {
handler(e);
});
}
}, false);
}
var panFixRatio;
var isScrolling;
var isFlickScrolling;
var cancelScrollEnd;
Object.defineProperty(this, 'isScrolling', {
get: function () {
return !!isScrolling
}
});
function isEnabled(e) {
if (!that.enabled) {
return false
}
if (typeof e.isVertical != 'undefined') {
if (that.axis === 'y' && e.isVertical
|| that.axis === 'x' && !e.isVertical) {
// gesture in same direction, stop bubbling up
e.stopPropagation();
} else {
// gesture in different direction, bubbling up
// to the top, without any other process
return false
}
}
return true
}
function touchstartHandler(e) {
if (!isEnabled(e)) {
return
}
if (isScrolling) {
scrollEnd();
}
if (options.useFrameAnimation) {
scrollAnimation && scrollAnimation.stop();
scrollAnimation = null;
} else {
var transform = getTransformOffset(that);
setTransformStyle(that, transform);
setTransitionStyle(that, '', '');
transitionEndHandler = null;
clearTimeout(transitionEndTimeoutId);
}
}
function touchendHandler(e) {
if (!isEnabled(e)) {
return
}
var s0 = getTransformOffset(that)[that.axis];
var boundaryOffset = getBoundaryOffset(that, s0);
if (boundaryOffset) {
// dragging out of boundray, bounce is needed
var s1 = touchBoundary(that, s0);
if (options.useFrameAnimation) {
// frame
var _s = s1 - s0;
scrollAnimation = new lib.animation(
400,
lib.cubicbezier.ease,
0,
function (i1, i2) {
var offset = (s0 + _s * i2).toFixed(2);
setTransformStyle(that, offset);
fireEvent$3(that, 'scrolling');
});
scrollAnimation.onend(scrollEnd);
scrollAnimation.play();
} else {
// css
var offset = s1.toFixed(0);
setTransitionEndHandler(scrollEnd, 400);
setTransitionStyle(that, '0.4s', 'ease');
setTransformStyle(that, offset);
lib.animation.requestFrame(function doScroll() {
if (isScrolling && that.enabled) {
fireEvent$3(that, 'scrolling');
lib.animation.requestFrame(doScroll);
}
});
}
if (boundaryOffset > 0) {
fireEvent$3(that, that.axis === 'y' ? 'pulldownend' : 'pullrightend');
} else if (boundaryOffset < 0) {
fireEvent$3(that, that.axis === 'y' ? 'pullupend' : 'pullleftend');
}
} else if (isScrolling) {
// without exceeding the boundary, just end it
scrollEnd();
}
}
var lastDisplacement;
function panstartHandler(e) {
if (!isEnabled(e)) {
return
}
that.transformOffset = getTransformOffset(that);
that.minScrollOffset = getMinScrollOffset(that);
that.maxScrollOffset = getMaxScrollOffset(that);
panFixRatio = 2.5;
cancelScrollEnd = true;
isScrolling = true;
isFlickScrolling = false;
fireEvent$3(that, 'scrollstart');
lastDisplacement = e['displacement' + that.axis.toUpperCase()];
}
function panHandler(e) {
if (!isEnabled(e)) {
return
}
// finger move less than 5 px. just ignore that.
var displacement = e['displacement' + that.axis.toUpperCase()];
if (Math.abs(displacement - lastDisplacement) < 5) {
e.stopPropagation();
return
}
lastDisplacement = displacement;
var offset = that.transformOffset[that.axis] + displacement;
if (offset > that.minScrollOffset) {
offset = that.minScrollOffset
+ (offset - that.minScrollOffset) / panFixRatio;
panFixRatio *= 1.003;
} else if (offset < that.maxScrollOffset) {
offset = that.maxScrollOffset
- (that.maxScrollOffset - offset) / panFixRatio;
panFixRatio *= 1.003;
}
if (panFixRatio > 4) {
panFixRatio = 4;
}
// tell whether or not reach the fringe
var boundaryOffset = getBoundaryOffset(that, offset);
if (boundaryOffset) {
fireEvent$3(
that,
boundaryOffset > 0
? (that.axis === 'y' ? 'pulldown' : 'pullright')
: (that.axis === 'y' ? 'pullup' : 'pullleft'), {
boundaryOffset: Math.abs(boundaryOffset)
});
if (that.options.noBounce) {
offset = touchBoundary(that, offset);
}
}
setTransformStyle(that, offset.toFixed(2));
fireEvent$3(that, 'scrolling');
}
function panendHandler(e) {
if (!isEnabled(e)) {
return
}
if (e.isSwipe) {
flickHandler(e);
}
}
function flickHandler(e) {
cancelScrollEnd = true;
var v0, a0, t0, s0, s, motion0;
var v1, a1, t1, s1, motion1,sign;
var v2, a2, t2, s2, motion2, ft;
s0 = getTransformOffset(that)[that.axis];
var boundaryOffset0 = getBoundaryOffset(that, s0);
if (!boundaryOffset0) {
// when fingers left the range of screen, let touch end handler
// to deal with it.
// when fingers left the screen, but still in the range of
// screen, calculate the intertia.
v0 = e['velocity' + that.axis.toUpperCase()];
var maxV = 2;
var friction = 0.0015;
if (options.inertia && inertiaCoefficient[options.inertia]) {
maxV = inertiaCoefficient[options.inertia][0];
friction = inertiaCoefficient[options.inertia][1];
}
if (v0 > maxV) {
v0 = maxV;
}
if (v0 < -maxV) {
v0 = -maxV;
}
a0 = friction * (v0 / Math.abs(v0));
motion0 = new lib.motion({
v: v0,
a: -a0
});
t0 = motion0.t;
s = s0 + motion0.s;
var boundaryOffset1 = getBoundaryOffset(that, s);
if (boundaryOffset1) {
debugLog('inertial calculation has exceeded the boundary',
boundaryOffset1);
v1 = v0;
a1 = a0;
if (boundaryOffset1 > 0) {
s1 = that.minScrollOffset;
sign = 1;
} else {
s1 = that.maxScrollOffset;
sign = -1;
}
motion1 = new lib.motion({
v: sign * v1,
a: -sign * a1,
s: Math.abs(s1 - s0)
});
t1 = motion1.t;
var timeFunction1 = motion1.generateCubicBezier();
v2 = v1 - a1 * t1;
a2 = 0.03 * (v2 / Math.abs(v2));
motion2 = new lib.motion({
v: v2,
a: -a2
});
t2 = motion2.t;
s2 = s1 + motion2.s;
var timeFunction2 = motion2.generateCubicBezier();
if (options.noBounce) {
debugLog('no bounce effect');
if (s0 !== s1) {
if (options.useFrameAnimation) {
// frame
var _s = s1 - s0;
var bezier = lib.cubicbezier(
timeFunction1[0][0],
timeFunction1[0][1],
timeFunction1[1][0],
timeFunction1[1][1]
);
scrollAnimation = new lib.animation(
t1.toFixed(0),
bezier,
0,
function (i1, i2) {
var offset = (s0 + _s * i2);
getTransformOffset(that, offset.toFixed(2));
fireEvent$3(that, 'scrolling', {
afterFlick: true
});
});
scrollAnimation.onend(scrollEnd);
scrollAnimation.play();
} else {
// css
var offset = s1.toFixed(0);
setTransitionEndHandler(
scrollEnd,
(t1 / 1000).toFixed(2) * 1000
);
setTransitionStyle(
that,
(t1 / 1000).toFixed(2) + 's',
'cubic-bezier(' + timeFunction1 + ')'
);
setTransformStyle(that, offset);
}
} else {
scrollEnd();
}
} else if (s0 !== s2) {
debugLog(
'scroll for inertia',
's=' + s2.toFixed(0),
't=' + ((t1 + t2) / 1000).toFixed(2)
);
if (options.useFrameAnimation) {
var _s = s2 - s0;
var bezier = lib.cubicbezier.easeOut;
scrollAnimation = new lib.animation(
(t1 + t2).toFixed(0),
bezier,
0,
function (i1, i2) {
var offset = s0 + _s * i2;
setTransformStyle(that, offset.toFixed(2));
fireEvent$3(that, 'scrolling',{
afterFlick: true
});
});
scrollAnimation.onend(function () {
if (!that.enabled) {
return
}
var _s = s1 - s2;
var bezier = lib.cubicbezier.ease;
scrollAnimation = new lib.animation(
400,
bezier,
0,
function (i1, i2) {
var offset = s2 + _s * i2;
setTransformStyle(that, offset.toFixed(2));
fireEvent$3(that, 'scrolling',{
afterFlick: true
});
});
scrollAnimation.onend(scrollEnd);
scrollAnimation.play();
});
scrollAnimation.play();
} else {
var offset = s2.toFixed(0);
setTransitionEndHandler(function (e) {
if (!that.enabled) {
return
}
debugLog('inertial bounce',
's=' + s1.toFixed(0),
't=400'
);
if (s2 !== s1) {
var offset = s1.toFixed(0);
setTransitionStyle(that, '0.4s', 'ease');
setTransformStyle(that, offset);
setTransitionEndHandler(scrollEnd, 400);
} else {
scrollEnd();
}
}, ((t1 + t2) / 1000).toFixed(2) * 1000);
setTransitionStyle(
that,
((t1 + t2) / 1000).toFixed(2) + 's',
'ease-out'
);
setTransformStyle(that, offset);
}
} else {
scrollEnd();
}
} else {
debugLog('inertial calculation hasn\'t exceeded the boundary');
var timeFunction = motion0.generateCubicBezier();
if (options.useFrameAnimation) {
// frame
var _s = s - s0;
var bezier = lib.cubicbezier(
timeFunction[0][0],
timeFunction[0][1],
timeFunction[1][0],
timeFunction[1][1]
);
scrollAnimation = new lib.animation(
t0.toFixed(0),
bezier,
0,
function (i1, i2) {
var offset = (s0 + _s * i2).toFixed(2);
setTransformStyle(that, offset);
fireEvent$3(that, 'scrolling',{
afterFlick: true
});
});
scrollAnimation.onend(scrollEnd);
scrollAnimation.play();
} else {
// css
var offset = s.toFixed(0);
setTransitionEndHandler(scrollEnd, (t0 / 1000).toFixed(2) * 1000);
setTransitionStyle(
that,
(t0 / 1000).toFixed(2) + 's',
'cubic-bezier(' + timeFunction + ')'
);
setTransformStyle(that, offset);
}
}
isFlickScrolling = true;
if (!options.useFrameAnimation) {
lib.animation.requestFrame(function doScroll() {
if (isScrolling && isFlickScrolling && that.enabled) {
fireEvent$3(that, 'scrolling', {
afterFlick: true
});
lib.animation.requestFrame(doScroll);
}
});
}
}
}
function scrollEnd() {
if (!that.enabled) {
return
}
cancelScrollEnd = false;
setTimeout(function () {
if (!cancelScrollEnd && isScrolling) {
isScrolling = false;
isFlickScrolling = false;
if (options.useFrameAnimation) {
scrollAnimation && scrollAnimation.stop();
scrollAnimation = null;
} else {
setTransitionStyle(that, '', '');
}
fireEvent$3(that, 'scrollend');
}
}, 50);
}
var proto = {
init: function () {
this.enable();
this.refresh();
this.scrollTo(0);
return this
},
enable: function () {
this.enabled = true;
return this
},
disable: function () {
var el = this.element;
this.enabled = false;
if (this.options.useFrameAnimation) {
scrollAnimation && scrollAnimation.stop();
} else {
lib.animation.requestFrame(function () {
el.style[stylePrefix$1 + 'Transform']
= getComputedStyle(el)[stylePrefix$1 + 'Transform'];
});
}
return this
},
getScrollWidth: function () {
return getBoundingClientRect(this.element).width
},
getScrollHeight: function () {
return getBoundingClientRect(this.element).height
},
getScrollLeft: function () {
return -getTransformOffset(this).x - this.options.xPaddingTop
},
getScrollTop: function () {
return -getTransformOffset(this).y - this.options.yPaddingTop
},
getMaxScrollLeft: function () {
return -that.maxScrollOffset - this.options.xPaddingTop
},
getMaxScrollTop: function () {
return -that.maxScrollOffset - this.options.yPaddingTop
},
getBoundaryOffset: function () {
return Math.abs(
getBoundaryOffset(this, getTransformOffset(this)[this.axis]) || 0
)
},
refresh: function () {
var el = this.element;
var isVertical = (this.axis === 'y');
var type = isVertical ? 'height' : 'width';
var size, rect, extraSize;
function getExtraSize(el, isVertical) {
var extraType = isVertical ? ['top', 'bottom'] : ['left', 'right'];
return parseFloat(
getComputedStyle(el.firstElementChild)['margin-' + extraType[0]]
) + parseFloat(
getComputedStyle(el.lastElementChild)['margin-' + extraType[1]]
)
}
if (this.options[type] != null) {
// use options
size = this.options[type];
} else if (el.childElementCount <= 0) {
el.style[type] = 'auto';
size = null;
} else if (!!this.options.useElementRect) {
el.style[type] = 'auto';
rect = getBoundingClientRect(el);
size = rect[type];
size += getExtraSize(el, isVertical);
} else {
var range, rect;
var firstEl = el.firstElementChild;
var lastEl = el.lastElementChild;
if (document.createRange && !this.options.ignoreOverflow) {
// use range
range = document.createRange();
range.selectNodeContents(el);
rect = getBoundingClientRect(range);
}
if (rect) {
size = rect[type];
} else {
// use child offsets
while (firstEl) {
if (getBoundingClientRect(firstEl)[type] === 0
&& firstEl.nextElementSibling) {
firstEl = firstEl.nextElementSibling;
} else {
break
}
}
while (lastEl && lastEl !== firstEl) {
if (getBoundingClientRect(lastEl)[type] === 0
&& lastEl.previousElementSibling) {
lastEl = lastEl.previousElementSibling;
} else {
break
}
}
size = getBoundingClientRect(lastEl)[
isVertical ? 'bottom' : 'right']
- getBoundingClientRect(firstEl)[
isVertical ? 'top' : 'left'];
}
size += getExtraSize(el, isVertical);
}
el.style[type] = size ? size + 'px' : 'auto';
this.transformOffset = getTransformOffset(this);
this.minScrollOffset = getMinScrollOffset(this);
this.maxScrollOffset = getMaxScrollOffset(this);
this.scrollTo(
-this.transformOffset[this.axis]
- this.options[this.axis + 'PaddingTop']
);
fireEvent$3(this, 'contentrefresh');
return this
},
offset: function (childEl) {
var elRect = getBoundingClientRect(this.element);
var childRect = getBoundingClientRect(childEl);
if (this.axis === 'y') {
var offsetRect = {
top: childRect.top - elRect.top - this.options.yPaddingTop,
left: childRect.left - elRect.left,
right: elRect.right - childRect.right,
width: childRect.width,
height: childRect.height
};
offsetRect.bottom = offsetRect.top + offsetRect.height;
} else {
var offsetRect = {
top: childRect.top - elRect.top,
bottom: elRect.bottom - childRect.bottom,
left: childRect.left - elRect.left - this.options.xPaddingTop,
width: childRect.width,
height: childRect.height
};
offsetRect.right = offsetRect.left + offsetRect.width;
}
return offsetRect
},
getRect: function (childEl) {
var viewRect = getBoundingClientRect(this.viewport);
var childRect = getBoundingClientRect(childEl);
if (this.axis === 'y') {
var offsetRect = {
top: childRect.top - viewRect.top,
left: childRect.left - viewRect.left,
right: viewRect.right - childRect.right,
width: childRect.width,
height: childRect.height
};
offsetRect.bottom = offsetRect.top + offsetRect.height;
} else {
var offsetRect = {
top: childRect.top - viewRect.top,
bottom: viewRect.bottom - childRect.bottom,
left: childRect.left - viewRect.left,
width: childRect.width,
height: childRect.height
};
offsetRect.right = offsetRect.left + offsetRect.width;
}
return offsetRect
},
isInView: function (childEl) {
var viewRect = this.getRect(this.viewport);
var childRect = this.getRect(childEl);
if (this.axis === 'y') {
return viewRect.top < childRect.bottom
&& viewRect.bottom > childRect.top
}
return viewRect.left < childRect.right
&& viewRect.right > childRect.left
},
scrollTo: function (offset, isSmooth) {
var that = this;
var element = this.element;
offset = -offset - this.options[this.axis + 'PaddingTop'];
offset = touchBoundary(this, offset);
isScrolling = true;
if (isSmooth === true) {
if (this.options.useFrameAnimation) {
var s0 = getTransformOffset(that)[this.axis];
var _s = offset - s0;
scrollAnimation = new lib.animation(
400,
lib.cubicbezier.easeInOut,
0,
function (i1, i2) {
var offset = (s0 + _s * i2).toFixed(2);
setTransformStyle(that, offset);
fireEvent$3(that, 'scrolling');
});
scrollAnimation.onend(scrollEnd);
scrollAnimation.play();
} else {
setTransitionEndHandler(scrollEnd, 400);
setTransitionStyle(that, '0.4s', 'ease-in-out');
setTransformStyle(that, offset);
function _cancelScroll() {
if (isScrolling && that.enabled) {
fireEvent$3(that, 'scrolling');
lib.animation.requestFrame(_cancelScroll);
}
}
lib.animation.requestFrame(_cancelScroll);
}
} else {
if (!this.options.useFrameAnimation) {
setTransitionStyle(that, '', '');
}
setTransformStyle(that, offset);
scrollEnd();
}
return this
},
scrollToElement: function (childEl, isSmooth, topOffset) {
var offset = this.offset(childEl);
offset = offset[this.axis === 'y'?'top':'left'];
topOffset && (offset += topOffset);
return this.scrollTo(offset, isSmooth)
},
getViewWidth: function () {
return getBoundingClientRect(this.viewport).width
},
getViewHeight: function () {
return getBoundingClientRect(this.viewport).height
},
addPulldownHandler: function (handler) {
var that = this;
this.element.addEventListener('pulldownend', function (e) {
that.disable();
handler.call(that, e, function () {
that.scrollTo(0, true);
that.refresh();
that.enable();
});
}, false);
return this
},
addPullupHandler: function (handler) {
var that = this;
this.element.addEventListener('pullupend', function (e) {
that.disable();
handler.call(that, e, function () {
that.scrollTo(that.getScrollHeight(), true);
that.refresh();
that.enable();
});
}, false);
return this
},
addScrollstartHandler: function (handler) {
var that = this;
this.element.addEventListener('scrollstart', function (e) {
handler.call(that, e);
}, false);
return this
},
addScrollingHandler: function (handler) {
var that = this;
this.element.addEventListener('scrolling', function (e) {
handler.call(that, e);
}, false);
return this
},
addScrollendHandler: function (handler) {
var that = this;
this.element.addEventListener('scrollend', function (e) {
handler.call(that, e);
}, false);
return this
},
addContentrenfreshHandler: function (handler) {
var that = this;
this.element.addEventListener('contentrefresh', function (e) {
handler.call(that, e);
}, false);
},
addEventListener: function (name, handler, useCapture) {
var that = this;
this.element.addEventListener(name, function (e) {
handler.call(that, e);
}, !!useCapture);
},
removeEventListener: function (name, handler) {
var that = this;
this.element.removeEventListener(name, function (e) {
handler.call(that, e);
});
},
enablePlugin: function (name, options) {
var plugin = plugins[name];
if (plugin && !this.plugins[name]) {
this.plugins[name] = true;
options = options || {};
plugin.call(this, name, options);
}
return this
}
};
for (var k in proto) {
this$1[k] = proto[k];
}
// delete proto
}
lib.scroll = function (el, options) {
if (arguments.length === 1 && !(arguments[0] instanceof HTMLElement)) {
options = arguments[0];
if (options.scrollElement) {
el = options.scrollElement;
} else if (options.scrollWrap) {
el = options.scrollWrap.firstElementChild;
} else {
throw new Error('no scroll element')
}
}
if (!el.parentNode) {
throw new Error('wrong dom tree')
}
if (options
&& options.direction
&& ['x', 'y'].indexOf(options.direction) < 0) {
throw new Error('wrong direction')
}
var scroll;
if (options.downgrade === true
&& lib.scroll.downgrade) {
scroll = lib.scroll.downgrade(el, options);
} else {
if (el.scrollId) {
scroll = scrollObjs[el.scrollId];
} else {
scroll = new Scroll(el, options);
}
}
return scroll
};
lib.scroll.plugin = function (name, constructor) {
if (constructor) {
name = name.split(',');
name.forEach(function (n) {
plugins[n] = constructor;
});
} else {
return plugins[name]
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global lib */
// lib.scroll events:
// - scrollstart
// - scrolling
// - pulldownend
// - pullupend
// - pullleftend
// - pullrightend
// - pulldown
// - pullup
// - pullleft
// - pullright
// - contentrefresh
var directionMap = {
h: ['row', 'horizontal', 'h', 'x'],
v: ['column', 'vertical', 'v', 'y']
};
var DEFAULT_DIRECTION = 'column';
var DEFAULT_LOAD_MORE_OFFSET$1 = 0;
function refreshWhenDomRenderend (comp) {
if (!comp.renderendHandler) {
comp.renderendHandler = function () {
comp.scroller.refresh();
};
}
window.addEventListener('renderend', comp.renderendHandler);
}
function removeEvents (comp) {
if (comp.renderendHandler) {
window.removeEventListener('renderend', comp.renderendHandler);
}
}
function getProto$1 (Weex) {
var Component = Weex.Component;
function create (nodeType) {
var Scroll = lib.scroll;
var node = Component.prototype.create.call(this, nodeType);
node.classList.add('weex-container');
node.classList.add('scrollable-wrap');
this.scrollElement = document.createElement('div');
this.scrollElement.classList.add('weex-container');
this.scrollElement.classList.add('scrollable-element');
this.scrollElement.classList.add('dir-' + this.direction);
this.scrollElement.style.webkitBoxOrient = directionMap[this.direction][1];
this.scrollElement.style.webkitFlexDirection = directionMap[this.direction][0];
this.scrollElement.style.flexDirection = directionMap[this.direction][0];
node.appendChild(this.scrollElement);
this.scroller = new Scroll({
// if the direction is x, then the bounding rect of the scroll element
// should be got by the 'Range' API other than the 'getBoundingClientRect'
// API, because the width outside the viewport won't be count in by
// 'getBoundingClientRect'.
// Otherwise should use the element rect in case there is a child scroller
// or list in this scroller. If using 'Range', the whole scroll element
// including the hiding part will be count in the rect.
useElementRect: this.direction === 'v',
scrollElement: this.scrollElement,
direction: this.direction === 'h' ? 'x' : 'y'
});
this.scroller.init();
this.offset = 0;
return node
}
function createChildren () {
var this$1 = this;
var children = this.data.children;
var parentRef = this.data.ref;
var componentManager = this.getComponentManager();
if (children && children.length) {
var fragment = document.createDocumentFragment();
var isFlex = false;
for (var i = 0; i < children.length; i++) {
children[i].instanceId = this$1.data.instanceId;
var child = componentManager.createElement(children[i]);
fragment.appendChild(child.node);
child.parentRef = parentRef;
if (!isFlex
&& child.data.style
&& child.data.style.hasOwnProperty('flex')
) {
isFlex = true;
}
}
this.scrollElement.appendChild(fragment);
}
// wait for fragment to appended on scrollElement on UI thread.
setTimeout(function () {
this.scroller.refresh();
}.bind(this), 0);
}
function appendChild (data) {
var children = this.data.children;
var componentManager = this.getComponentManager();
var child = componentManager.createElement(data);
this.scrollElement.appendChild(child.node);
// wait for UI thread to update.
setTimeout(function () {
this.scroller.refresh();
}.bind(this), 0);
// update this.data.children
if (!children || !children.length) {
this.data.children = [data];
}
else {
children.push(data);
}
return child
}
function insertBefore (child, before) {
var children = this.data.children;
var i = 0;
var isAppend = false;
// update this.data.children
if (!children || !children.length || !before) {
isAppend = true;
}
else {
var l;
for (l = children.length; i < l; i++) {
if (children[i].ref === before.data.ref) {
break
}
}
if (i === l) {
isAppend = true;
}
}
if (isAppend) {
this.scrollElement.appendChild(child.node);
children.push(child.data);
}
else {
var refreshLoadingPlaceholder = before.refreshPlaceholder
|| before.loadingPlaceholder;
if (refreshLoadingPlaceholder) {
this.scrollElement.insertBefore(child.node, refreshLoadingPlaceholder);
}
else if (before.fixedPlaceholder) {
this.scrollElement.insertBefore(child.node, before.fixedPlaceholder);
}
else if (before.stickyPlaceholder) {
this.scrollElement.insertBefore(child.node, before.stickyPlaceholder);
}
else {
this.scrollElement.insertBefore(child.node, before.node);
}
children.splice(i, 0, child.data);
}
// wait for UI thread to update.
setTimeout(function () {
this.scroller.refresh();
}.bind(this), 0);
}
function removeChild (child) {
var children = this.data.children;
// remove from this.data.children
var i = 0;
var componentManager = this.getComponentManager();
if (children && children.length) {
var l;
for (l = children.length; i < l; i++) {
if (children[i].ref === child.data.ref) {
break
}
}
if (i < l) {
children.splice(i, 1);
}
}
// remove from componentMap recursively
componentManager.removeComponent(child.data.ref);
var refreshLoadingPlaceholder = child.refreshPlaceholder
|| child.loadingPlaceholder;
child.unsetPosition();
if (refreshLoadingPlaceholder) {
this.scrollElement.removeChild(refreshLoadingPlaceholder);
}
child.node.parentNode.removeChild(child.node);
// wait for UI thread to update.
setTimeout(function () {
this.scroller.refresh();
}.bind(this), 0);
}
function bindEvents (evts) {
Component.prototype.bindEvents.call(this, evts);
// to enable lazyload for Images
this.scroller.addEventListener('scrolling', function (e) {
var so = e.scrollObj;
var scrollTop = so.getScrollTop();
var scrollLeft = so.getScrollLeft();
var offset = this.direction === 'v' ? scrollTop : scrollLeft;
var diff = offset - this.offset;
var dir;
if (diff >= 0) {
dir = this.direction === 'v' ? 'up' : 'left';
}
else {
dir = this.direction === 'v' ? 'down' : 'right';
}
this.dispatchEvent('scroll', {
originalType: 'scrolling',
scrollTop: so.getScrollTop(),
scrollLeft: so.getScrollLeft(),
offset: offset,
direction: dir
}, {
bubbles: true
});
this.offset = offset;
// fire loadmore event.
var leftDist = Math.abs(so.maxScrollOffset) - this.offset;
if (leftDist <= this.loadmoreoffset && this.isAvailableToFireloadmore) {
this.isAvailableToFireloadmore = false;
this.dispatchEvent('loadmore');
}
else if (leftDist > this.loadmoreoffset && !this.isAvailableToFireloadmore) {
this.isAvailableToFireloadmore = true;
}
}.bind(this));
}
function onAppend () {
refreshWhenDomRenderend(this);
}
function onRemove () {
removeEvents(this);
}
return {
create: create,
createChildren: createChildren,
appendChild: appendChild,
insertBefore: insertBefore,
removeChild: removeChild,
bindEvents: bindEvents,
onAppend: onAppend,
onRemove: onRemove
}
}
var attr$3 = {
loadmoreoffset: function (val) {
val = parseFloat(val);
if (val < 0 || isNaN(val)) {
console.warn('[h5-render] invalida');
return
}
this.loadmoreoffset = val;
}
};
function init$15 (Weex) {
var Component = Weex.Component;
var extend = Weex.utils.extend;
// attrs:
// - loadmoreoffset: updatable
// - scroll-direciton: none|vertical|horizontal (default is vertical)
// - show-scrollbar: true|false (default is true)
function Scrollable (data, nodeType) {
this.loadmoreoffset = DEFAULT_LOAD_MORE_OFFSET$1;
this.isAvailableToFireloadmore = true;
var attrs = data.attr || {};
var direction = attrs.scrollDirection
|| attrs.direction
|| DEFAULT_DIRECTION;
this.direction = directionMap.h.indexOf(direction) === -1
? 'v'
: 'h';
this.showScrollbar = attrs.showScrollbar || true;
Component.call(this, data, nodeType);
}
Scrollable.prototype = Object.create(Component.prototype);
extend(Scrollable.prototype, getProto$1(Weex));
extend(Scrollable.prototype, { attr: attr$3 });
return Scrollable
}
var scrollableModule = { init: init$15 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var availableChildrenTypes = ['cell', 'loading', 'refresh'];
function getProto (Scrollable) {
return {
create: function create () {
var node = Scrollable.prototype.create.call(this);
node.classList.add('list-wrap');
this.scrollElement.classList.add('list-element');
return node
},
createChildren: function createChildren () {
var children = this.data.children || [];
children.forEach(function (data) {
var type = data.type;
if (availableChildrenTypes.indexOf(type) === -1) {
// throw new Error('[h5-render] invalid child type "'
// + type + '" for list.')
console.warn('[h5-render] invalid child type "'
+ type + '" for list.');
}
});
return Scrollable.prototype.createChildren.call(this)
},
appendChild: function appendChild (data) {
var type = data.type;
if (availableChildrenTypes.indexOf(type) === -1) {
// throw new Error('[h5-render] invalid child type "'
// + type + '" for list.')
console.warn('[h5-render] invalid child type "'
+ type + '" for list.');
}
return Scrollable.prototype.appendChild.call(this, data)
},
insertBefore: function insertBefore (child, before) {
var type = child.data.type;
if (availableChildrenTypes.indexOf(type) === -1) {
// throw new Error('[h5-render] invalid child type "'
// + type + '" for list.')
console.warn('[h5-render] invalid child type "'
+ type + '" for list.');
}
return Scrollable.prototype.insertBefore.call(this, child, before)
}
}
}
function init$14 (Weex) {
var Scrollable = scrollableModule.init(Weex);
function List (data, nodeType) {
Scrollable.call(this, data, nodeType);
}
var extend = Weex.utils.extend;
List.prototype = Object.create(Scrollable.prototype);
extend(List.prototype, getProto(Scrollable));
return List
}
var listModule = { init: init$14 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function init$13 (Weex) {
var List = listModule.init(Weex);
function Vlist (data, nodeType) {
data.attr.direction = 'v';
List.call(this, data, nodeType);
}
Vlist.prototype = Object.create(List.prototype);
Weex.registerComponent('list', Vlist);
Weex.registerComponent('vlist', Vlist);
}
var Vlist = { init: init$13 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function init$16 (Weex) {
var List = listModule.init(Weex);
function Hlist (data, nodeType) {
data.attr.direction = 'h';
List.call(this, data, nodeType);
}
Hlist.prototype = Object.create(List.prototype);
Weex.registerComponent('hlist', Hlist);
}
var Hlist = { init: init$16 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function init$12 (Weex) {
Weex.install(Vlist);
Weex.install(Hlist);
}
var list = { init: init$12 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function init$17 (Weex) {
var Scrollable = scrollableModule.init(Weex);
function Scroller (data, nodeType) {
Scrollable.call(this, data, nodeType);
}
var extend = Weex.utils.extend;
Scroller.prototype = Object.create(Scrollable.prototype);
extend(Scroller.prototype, {
create: function create () {
var node = Scrollable.prototype.create.call(this);
node.classList.add('scroller-wrap');
this.scrollElement.classList.add('scroller-element');
return node
}
});
Weex.registerComponent('scroller', Scroller);
}
var scroller = { init: init$17 };
__$styleInject(".weex-refresh {\n // -webkit-box-align: center;\n // -webkit-align-items: center;\n // align-items: center;\n // -webkit-box-pack: center;\n // -webkit-justify-content: center;\n // justify-content: center;\n overflow: hidden;\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 0;\n z-index: 999999;\n background-color: #666;\n}",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var parents = ['scroller', 'list', 'vlist'];
// Only if pulldown offset is larger than this value can this
// component trigger the 'refresh' event, otherwise just recover
// to the start point.
var DEFAULT_CLAMP = 130;
var DEFAULT_ALIGN_ITEMS = 'center';
var DEFAULT_JUSTIFY_CONTENT = 'center';
function adjustHeight (refresh, val) {
refresh.node.style.height = val + 'px';
}
// function adJustPosition (refresh, val) {
// refresh.node.style.top = -val + 'px'
// }
function handleRefresh (refresh, e) {
refresh.node.style.height = refresh.clamp + 'px';
refresh.dispatchEvent('refresh');
refresh.isRefreshing = true;
}
function show (refresh) {
refresh.display = true;
refresh.node.style.display = '-webkit-box';
refresh.node.style.display = '-webkit-flex';
refresh.node.style.display = 'flex';
}
function hide$3 (refresh) {
refresh.display = false;
refresh.node.style.display = 'none';
refresh.isRefreshing = false;
}
var proto$4 = {
create: function create () {
var node = document.createElement('div');
node.classList.add('weex-container');
node.classList.add('weex-refresh');
return node
},
onAppend: function onAppend () {
var parent = this.getParent();
var self = this;
if (parents.indexOf(parent.data.type) === -1) {
// not in a scroller or a list
return
}
this.refreshPlaceholder = document.createElement('div');
this.refreshPlaceholder.classList.add('weex-refresh-placeholder');
this.refreshPlaceholder.style.display = 'none';
this.refreshPlaceholder.style.width = '0px';
this.refreshPlaceholder.style.height = '0px';
var scrollElement = parent.scrollElement || parent.listElement;
scrollElement.insertBefore(this.refreshPlaceholder, this.node);
parent.node.appendChild(this.node);
parent.scroller.addEventListener('pulldown', function (e) {
if (self.isRefreshing) {
return
}
adjustHeight(self, Math.abs(e.scrollObj.getScrollTop()));
if (!self.display) {
show(self);
}
});
parent.scroller.addEventListener('pulldownend', function (e) {
if (self.isRefreshing) {
return
}
var top = Math.abs(e.scrollObj.getScrollTop());
if (top > self.clamp) {
handleRefresh(self, e);
}
else {
hide$3(self);
}
});
}
};
var attr$4 = {
display: function (val) {
if (val === 'show') {
setTimeout(function () {
show(this);
}.bind(this), 0);
}
else if (val === 'hide') {
setTimeout(function () {
hide$3(this);
}.bind(this), 0);
}
else {
console.error('[h5-render] attr \'display\' of <refresh>\': value '
+ val
+ ' is invalid. Should be \'show\' or \'hide\'');
}
}
};
var style$3 = {
height: function (val) {
val = parseFloat(val);
if (isNaN(val) || val < 0) {
return console.warn('[h5-render] <refresh>\'s height (' + val + ') is invalid.')
}
this.clamp = val;
}
};
function init$18 (Weex) {
var Component = Weex.Component;
var extend = Weex.utils.extend;
function Refresh (data) {
this.isRefreshing = false;
this.clamp = data.style.height || DEFAULT_CLAMP;
!data.style.alignItems && (data.style.alignItems = DEFAULT_ALIGN_ITEMS);
!data.style.justifyContent
&& (data.style.justifyContent = DEFAULT_JUSTIFY_CONTENT);
Component.call(this, data);
}
Refresh.prototype = Object.create(Component.prototype);
extend(Refresh.prototype, proto$4);
extend(Refresh.prototype, { attr: attr$4 });
extend(Refresh.prototype, {
style: extend(Object.create(Component.prototype.style), style$3)
});
Weex.registerComponent('refresh', Refresh);
}
var refresh$2 = { init: init$18 };
__$styleInject(".weex-loading {\n // -webkit-box-align: center;\n // -webkit-align-items: center;\n // align-items: center;\n // -webkit-box-pack: center;\n // -webkit-justify-content: center;\n // justify-content: center;\n overflow: hidden;\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 0;\n background-color: #666;\n}",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var parents$1 = ['scroller', 'list', 'vlist'];
var DEFAULT_CLAMP$1 = 130;
var DEFAULT_ALIGN_ITEMS$1 = 'center';
var DEFAULT_JUSTIFY_CONTENT$1 = 'center';
function adjustHeight$1 (loading, val) {
loading.node.style.height = val + 'px';
}
function handleLoading (loading, e) {
loading.node.style.height = loading.clamp + 'px';
loading.dispatchEvent('loading');
loading.isLoading = true;
}
function show$1 (loading) {
loading.display = true;
loading.node.style.display = '-webkit-box';
loading.node.style.display = '-webkit-flex';
loading.node.style.display = 'flex';
}
function hide$4 (loading) {
loading.display = false;
loading.node.style.display = 'none';
loading.isLoading = false;
}
var proto$5 = {
create: function create () {
var node = document.createElement('div');
node.classList.add('weex-container');
node.classList.add('weex-loading');
return node
},
onAppend: function onAppend () {
var parent = this.getParent();
var self = this;
var scrollWrapHeight = parent.node.getBoundingClientRect().height;
if (parents$1.indexOf(parent.data.type) === -1) {
// not in a scroller or a list
return
}
this.loadingPlaceholder = document.createElement('div');
this.loadingPlaceholder.classList.add('weex-loading-placeholder');
this.loadingPlaceholder.style.display = 'none';
this.loadingPlaceholder.style.width = '0px';
this.loadingPlaceholder.style.height = '0px';
var scrollElement = parent.scrollElement || parent.listElement;
scrollElement.insertBefore(this.loadingPlaceholder, this.node);
parent.node.appendChild(this.node);
parent.scroller.addEventListener('pullup', function (e) {
if (self.isLoading) {
return
}
var obj = e.scrollObj;
adjustHeight$1(self, Math.abs(
obj.getScrollHeight() - obj.getScrollTop() - scrollWrapHeight));
if (!self.display) {
show$1(self);
}
});
parent.scroller.addEventListener('pullupend', function (e) {
if (self.isLoading) {
return
}
handleLoading(self, e);
});
}
};
var attr$5 = {
display: function (val) {
if (val === 'show') {
setTimeout(function () {
show$1(this);
}.bind(this), 0);
}
else if (val === 'hide') {
setTimeout(function () {
hide$4(this);
}.bind(this), 0);
}
else {
console.error('[h5-render] attr \'display\' of <refresh>\': value '
+ val
+ ' is invalid. Should be \'show\' or \'hide\'');
}
}
};
var style$4 = {
height: function (val) {
val = parseFloat(val);
if (Number.isNaN(val) || val < 0) {
return console.warn('[h5-render] <loading>\'s height (' + val + ') is invalid.')
}
this.clamp = val;
}
};
function init$19 (Weex) {
var Component = Weex.Component;
var extend = Weex.utils.extend;
function Loading (data) {
this.clamp = (data.style.height || DEFAULT_CLAMP$1);
!data.style.alignItems && (data.style.alignItems = DEFAULT_ALIGN_ITEMS$1);
!data.style.justifyContent
&& (data.style.justifyContent = DEFAULT_JUSTIFY_CONTENT$1);
Component.call(this, data);
}
Loading.prototype = Object.create(Component.prototype);
extend(Loading.prototype, proto$5);
extend(Loading.prototype, { attr: attr$5 });
extend(Loading.prototype, {
style: extend(Object.create(Component.prototype.style), style$4)
});
Weex.registerComponent('loading', Loading);
}
var loading = { init: init$19 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var Scrollable = {
init: function (Weex) {
Weex.install(list);
Weex.install(scroller);
Weex.install(refresh$2);
Weex.install(loading);
}
}
/* eslint-disable */
;
/* eslint-enable */
(typeof window === 'undefined') && (window = {ctrl: {}, lib: {}});!window.ctrl && (window.ctrl = {});!window.lib && (window.lib = {});!function(a,b){function c(a,b,c,d){function e(a){return(3*k*a+2*l)*a+m}function f(a){return((k*a+l)*a+m)*a}function g(a){return((n*a+o)*a+p)*a}function h(a){for(var b,c,d=a,g=0;8>g;g++){if(c=f(d)-a,Math.abs(c)<j){ return d; }if(b=e(d),Math.abs(b)<j){ break; }d-=c/b;}var h=1,i=0;for(d=a;h>i;){if(c=f(d)-a,Math.abs(c)<j){ return d; }c>0?h=d:i=d,d=(h+i)/2;}return d}function i(a){return g(h(a))}var j=1e-6,k=3*a-3*c+1,l=3*c-6*a,m=3*a,n=3*b-3*d+1,o=3*d-6*b,p=3*b;return i}b.cubicbezier=c,b.cubicbezier.linear=c(0,0,1,1),b.cubicbezier.ease=c(.25,.1,.25,1),b.cubicbezier.easeIn=c(.42,0,1,1),b.cubicbezier.easeOut=c(0,0,.58,1),b.cubicbezier.easeInOut=c(.42,0,.58,1);}(window,window.lib||(window.lib={}));
(typeof window === 'undefined') && (window = {ctrl: {}, lib: {}});!window.ctrl && (window.ctrl = {});!window.lib && (window.lib = {});!function(a,b){function c(a){return setTimeout(a,l)}function d(a){clearTimeout(a);}function e(){var a={},b=new m(function(b,c){a.resolve=b,a.reject=c;});return a.promise=b,a}function f(a,b){return["then","catch"].forEach(function(c){b[c]=function(){return a[c].apply(a,arguments)};}),b}function g(b){var c,d,h=!1;this.request=function(){h=!1;var g=arguments;return c=e(),f(c.promise,this),d=n(function(){h||c&&c.resolve(b.apply(a,g));}),this},this.cancel=function(){return d&&(h=!0,o(d),c&&c.reject("CANCEL")),this},this.clone=function(){return new g(b)};}function h(a,b){"function"==typeof b&&(b={0:b});for(var c=a/l,d=1/c,e=[],f=Object.keys(b).map(function(a){return parseInt(a)}),h=0;c>h;h++){var i=f[0],j=d*h;if(null!=i&&100*j>=i){var k=b[""+i];k instanceof g||(k=new g(k)),e.push(k),f.shift();}else { e.length&&e.push(e[e.length-1].clone()); }}return e}function i(a){var c;return"string"==typeof a||a instanceof Array?b.cubicbezier?"string"==typeof a?b.cubicbezier[a]&&(c=b.cubicbezier[a]):a instanceof Array&&4===a.length&&(c=b.cubicbezier.apply(b.cubicbezier,a)):console.error("require lib.cubicbezier"):"function"==typeof a&&(c=a),c}function j(a,b,c){var d,g=h(a,c),j=1/(a/l),k=0,m=i(b);if(!m){ throw new Error("unexcept timing function"); }var n=!1;this.play=function(){function a(){var c=j*(k+1).toFixed(10),e=g[k];e.request(c.toFixed(10),b(c).toFixed(10)).then(function(){n&&(k===g.length-1?(n=!1,d&&d.resolve("FINISH"),d=null):(k++,a()));},function(){});}if(!n){ return n=!0,d||(d=e(),f(d.promise,this)),a(),this }},this.stop=function(){return n?(n=!1,g[k]&&g[k].cancel(),this):void 0};}var k=60,l=1e3/k,m=a.Promise||b.promise&&b.promise.ES6Promise,n=window.requestAnimationFrame||window.msRequestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||c,o=window.cancelAnimationFrame||window.msCancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||d;(n===c||o===d)&&(n=c,o=d),b.animation=function(a,b,c){return new j(a,b,c)},b.animation.frame=function(a){return new g(a)},b.animation.requestFrame=function(a){var b=new g(a);return b.request()};}(window,window.lib||(window.lib={}));
__$styleInject("[data-ctrl-name=\"carrousel\"] {\n position: relative;\n -webkit-transform: translateZ(1px);\n -ms-transform: translateZ(1px);\n transform: translateZ(1px);\n}",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
var _fallback = false;
var raf = window.requestAnimationFrame
|| window.webkitRequestAnimationFrame;
if (!raf) {
_fallback = true;
raf = function (callback) {
return setTimeout$2(callback, 16)
};
}
var caf = window.cancelAnimationFrame
|| window.webkitCancelAnimationFrame;
if (!caf && _fallback) {
caf = function (id) {
return clearTimeout$2(id)
};
} else if (!caf) {
caf = function() {};
}
var MAX = (Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1) - 1;
var _idMap = {};
var _globalId = 0;
function _getGlobalId() {
_globalId = (_globalId + 1) % MAX;
if (_idMap[_globalId]) {
return _getGlobalId()
}
return _globalId
}
function setTimeout$2 (cb, ms) {
var id = _getGlobalId();
var start = Date.now();
_idMap[id] = raf(function loop() {
if (!_idMap[id] && _idMap[id] !== 0) {
return
}
var ind = Date.now() - start;
if (ind < ms) {
_idMap[id] = raf(loop);
} else {
delete _idMap[id];
cb();
}
});
return id
}
function clearTimeout$2 (id) {
var tid = _idMap[id];
tid && caf(tid);
delete _idMap[id];
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* eslint-disable */
// require('./gesture')
var doc$2 = window.document;
var ua$2 = window.navigator.userAgent;
var Firefox$1 = !!ua$2.match(/Firefox/i);
var IEMobile$1 = !!ua$2.match(/IEMobile/i);
var stylePrefix$2 = Firefox$1 ? 'Moz' : IEMobile$1 ? 'ms' : 'webkit';
var setTimeout$1 = setTimeout$2;
var clearTimeout$1 = clearTimeout$2;
function getTransformOffset$1(element) {
var offset = { x: 0, y: 0 };
var transform = getComputedStyle(element)[stylePrefix$2 + 'Transform'];
var regMatrix3d = new RegExp('^matrix3d\\((?:[-\\d.]+,\\s*){12}([-\\d.]+),'
+ '\\s*([-\\d.]+)(?:,\\s*[-\\d.]+){2}\\)');
var regMatrix = /^matrix\((?:[-\d.]+,\s*){4}([-\d.]+),\s*([-\d.]+)\)$/;
var matched;
if (transform !== 'none') {
if ((matched = transform.match(regMatrix3d)
|| transform.match(regMatrix))) {
offset.x = parseFloat(matched[1]) || 0;
offset.y = parseFloat(matched[2]) || 0;
}
}
return offset
}
var CSSMatrix$1 = IEMobile$1 ? 'MSCSSMatrix' : 'WebKitCSSMatrix';
var has3d$1 = !!Firefox$1 || CSSMatrix$1 in window && 'm11' in new window[CSSMatrix$1]();
function getTranslate$1(x, y) {
x = parseFloat(x);
y = parseFloat(y);
if (x != 0) {
x += 'px';
}
if (y != 0) {
y += 'px';
}
if (has3d$1) {
return 'translate3d(' + x + ', ' + y + ', 0)'
}
return 'translate(' + x + ', ' + y + ')'
}
var slice$2 = Array.prototype.slice;
function ArrayFrom(a) {
return slice$2.call(a)
}
var incId = 0;
function Carrousel(element, options) {
var that = this;
var views = [];
var pages = {};
var id = Date.now() + '-' + (++incId);
var root = document.createDocumentFragment();
if (arguments.length === 1 && !(arguments[0] instanceof HTMLElement)) {
options = arguments[0];
element = null;
}
if (!element) {
element = document.createElement('ul');
root.appendChild(element);
}
options = options || {};
element.setAttribute('data-ctrl-name', 'carrousel');
element.setAttribute('data-ctrl-id', id);
function fireEvent(name, extra) {
var ev = doc$2.createEvent('HTMLEvents');
ev.initEvent(name, false, false);
if (extra) {
for (var key in extra) {
ev[key] = extra[key];
}
}
root.dispatchEvent(ev);
}
element.style.position = 'relative';
element.style[stylePrefix$2 + 'Transform'] = getTranslate$1(0, 0);
var transformOffset = 0;
var items = {};
var itemLength = 0;
var itemStep = options.step || element.getBoundingClientRect().width;
var itemIndex = 0;
items.add = function (html) {
var li = document.createElement('li');
li.style.display = 'none';
li.style.float = 'left';
li.index = itemLength;
if (typeof html === 'string') {
li.innerHTML = html;
} else if (html instanceof HTMLElement) {
li.appendChild(html);
}
element.appendChild(li);
Object.defineProperty(items, itemLength + '', {
get: function () {
return li
}
});
itemLength++;
return li
};
function normalizeIndex(index) {
while (index < 0) {
index += itemLength;
}
while (index >= itemLength) {
index -= itemLength;
}
return index
}
items.get = function (index) {
return items[normalizeIndex(index)]
};
items.getCloned = function (index) {
var index = normalizeIndex(index);
var item = element.querySelector('[cloned="cloned-' + index + '"]');
var originalItem = items[index];
// If there a _listeners attribute on the dom element
// then clone the _listeners as well for the events' binding
function cloneEvents(origin, clone, deep) {
var listeners = origin._listeners;
if (listeners) {
clone._listeners = listeners;
for (var type in listeners) {
clone.addEventListener(type, listeners[type]);
}
}
if (deep && origin.children && origin.children.length) {
for (var i = 0, l = origin.children.length; i < l; i++) {
cloneEvents(origin.children[i], clone.children[i], deep);
}
}
}
if (!item) {
item = originalItem.cloneNode(true);
cloneEvents(originalItem, item, true);
element.appendChild(item);
item.setAttribute('cloned', 'cloned-' + index);
item.index = index;
}
return item
};
function activate(index) {
if (itemLength === 0) {
return
}
var curItem = items.get(index);
var prevItem;
var nextItem;
if (itemLength > 1) {
prevItem = items.get(index - 1);
if (itemLength === 2) {
nextItem = items.getCloned(index + 1);
} else {
nextItem = items.get(index + 1);
}
curItem.style.left = -transformOffset + 'px';
prevItem.style.left = (-transformOffset - itemStep) + 'px';
nextItem.style.left = (-transformOffset + itemStep) + 'px';
}
itemIndex = curItem.index;
fireEvent('change', {
prevItem: prevItem,
curItem: curItem,
nextItem: nextItem
});
}
items.slide = function (index) {
if (itemLength === 0) {
return
}
if (itemLength === 1) {
index = 0;
}
var startOffset = getTransformOffset$1(element).x;
var endOffset = transformOffset + itemStep * (-index);
var interOffset = endOffset - startOffset;
if (interOffset === 0) {
return
}
var anim = new lib.animation(
400,
lib.cubicbezier.ease,
function (i1, i2) {
element.style[stylePrefix$2 + 'Transform']
= getTranslate$1(startOffset + interOffset * i2, 0);
}).play().then(function () {
transformOffset = endOffset;
element.style[stylePrefix$2 + 'Transform'] = getTranslate$1(endOffset, 0);
index && activate(itemIndex + index);
});
};
items.next = function () {
items.slide(1);
};
items.prev = function () {
items.slide(-1);
};
ArrayFrom(element.children).forEach(function (el) {
el.style.position = 'absolute';
el.style.top = '0';
el.style.left = itemLength * itemStep + 'px';
el.style.float = 'left';
el.index = itemLength;
Object.defineProperty(items, itemLength + '', {
get: function () {
return el
}
});
itemLength++;
});
Object.defineProperty(this, 'items', {
get: function () {
return items
}
});
Object.defineProperty(items, 'length', {
get: function () {
return itemLength
}
});
Object.defineProperty(items, 'index', {
get: function () {
return itemIndex
}
});
Object.defineProperty(items, 'step', {
get: function () {
return itemStep
},
set: function (v) {
itemStep = v;
}
});
var starting = false;
var playing = false;
var isSliding = false;
this.play = function () {
if (!starting) {
starting = true;
return activate(0)
}
if (!!playing) {
return
}
playing = setTimeout$1(function play() {
isSliding = true;
items.next();
setTimeout$1(function () {
isSliding = false;
}, 500);
playing = setTimeout$1(play, 400 + playInterval);
}, 400 + playInterval);
};
this.stop = function () {
if (!playing) {
return
}
clearTimeout$1(playing);
setTimeout$1(function () {
playing = false;
}, 500);
};
var autoplay = false;
var readyToPlay = false;
Object.defineProperty(this, 'autoplay', {
get: function () {
return autoplay
},
set: function (v) {
autoplay = !!v;
if (readyToPlay) {
clearTimeout$1(readyToPlay);
readyToPlay = false;
}
if (autoplay) {
readyToPlay = setTimeout$1(function () {
that.play();
}, 2000);
} else {
that.stop();
}
}
});
this.autoplay = !!options.autoplay;
var playInterval = 1500;
Object.defineProperty(this, 'playInterval', {
get: function () {
return playInterval
},
set: function (n) {
playInterval = n;
}
});
this.playInterval = !!options.playInterval || 1500;
if (options.useGesture) {
var panning = false;
var displacement;
element.addEventListener('panstart', function (e) {
if (!e.isVertical && !(panning && isSliding)) {
e.preventDefault();
e.stopPropagation();
if (autoplay) {
that.stop();
}
displacement = 0;
panning = true;
}
});
element.addEventListener('panmove', function (e) {
if (!e.isVertical && panning) {
e.preventDefault();
e.stopPropagation();
displacement = e.displacementX;
element.style[stylePrefix$2 + 'Transform']
= getTranslate$1(transformOffset + displacement, 0);
}
});
element.addEventListener('panend', function (e) {
if (!e.isVertical && panning) {
e.preventDefault();
e.stopPropagation();
panning = false;
if (e.isSwipe) {
if (displacement < 0) {
items.next();
} else {
items.prev();
}
} else {
if (Math.abs(displacement) < itemStep / 2) {
items.slide(0);
} else {
items.slide(displacement < 0?1:-1);
}
}
if (autoplay) {
setTimeout$1(function () {
that.play();
}, 2000);
}
}
}, false);
element.addEventListener('swipe', function (e) {
if (!e.isVertical) {
e.preventDefault();
e.stopPropagation();
}
});
}
this.addEventListener = function (name, handler) {
this.root.addEventListener(name, handler, false);
};
this.removeEventListener = function (name, handler) {
this.root.removeEventListener(name, handler, false);
};
this.root = root;
this.element = element;
}
!lib && (lib = {});
lib.carrousel = Carrousel;
__$styleInject(".slider {\n position: relative;\n}\n\n.slider .indicator-container {\n position: absolute;\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n -webkit-box-align: center;\n box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n font-size: 0;\n}\n.slider .indicator-container .indicator {\n border-radius: 50%;\n}\n.slider .indicator-container.row {\n -webkit-box-orient: horizontal;\n box-orient: horizontal;\n -webkit-flex-direction: row;\n flex-direction: row;\n}\n.slider .indicator-container.column {\n -webkit-box-orient: vertical;\n box-orient: vertical;\n -webkit-flex-direction: column;\n flex-direction: column;\n}\n",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global lib */
var DEFAULT_INTERVAL = 3000;
var extend$1;
var Component$2;
function idleWhenPageDisappear (slider) {
function handlePageShow () {
slider.isPageShow = true;
slider.autoPlay && !slider.isDomRendering && slider.play();
}
function handlePageHide () {
slider.isPageShow = false;
slider.stop();
}
global.addEventListener('pageshow', handlePageShow);
global.addEventListener('pagehide', handlePageHide);
document.addEventListener('visibilitychange', function () {
if (document.visibilityState === 'visible') {
handlePageShow();
}
else if (document.visibilityState === 'hidden') {
handlePageHide();
}
});
}
function idleWhenDomRendering (slider) {
global.addEventListener('renderend', function () {
slider.isDomRendering = false;
slider.autoPlay && slider.isPageShow && slider.play();
});
global.addEventListener('renderbegin', function () {
slider.isDomRendering = true;
slider.stop();
});
}
function updateIndicators (slider) {
slider.indicator && slider.indicator.setIndex(slider.currentIndex);
}
function getSliderChangeHandler (slider) {
if (!slider._sliderChangeHandler) {
slider._sliderChangeHandler = function (e) {
var index = this.carrousel.items.index;
this.currentIndex = index;
updateIndicators(this);
this.dispatchEvent('change', { index: index });
}.bind(slider);
}
return slider._sliderChangeHandler
}
function doRender (slider) {
slider.createChildren();
slider.onAppend();
}
var proto$6 = {
create: function create () {
var node = document.createElement('div');
node.classList.add('slider');
node.classList.add('weex-container');
node.style.position = 'relative';
node.style.overflow = 'hidden';
return node
},
createChildren: function createChildren () {
var this$1 = this;
var componentManager = this.getComponentManager();
// recreate slider container.
if (this.sliderContainer) {
this.node.removeChild(this.sliderContainer);
}
if (this.indicator) {
this.indicator.node.parentNode.removeChild(this.indicator.node);
}
this.children = [];
var sliderContainer = document.createElement('ul');
sliderContainer.style.listStyle = 'none';
this.node.appendChild(sliderContainer);
this.sliderContainer = sliderContainer;
var children = this.data.children;
var fragment = document.createDocumentFragment();
var indicatorData, width, height;
var childWidth = 0;
var childHeight = 0;
if (children && children.length) {
for (var i = 0; i < children.length; i++) {
var child = (void 0);
children[i].instanceId = this$1.data.instanceId;
if (children[i].type === 'indicator') {
indicatorData = extend$1(children[i], {
extra: {
amount: children.length - 1,
index: 0
}
});
}
else {
child = componentManager.createElement(children[i], 'li');
this$1.children.push(child);
fragment.appendChild(child.node);
width = child.data.style.width || 0;
height = child.data.style.height || 0;
width > childWidth && (childWidth = width);
height > childHeight && (childHeight = height);
child.parentRef = this$1.data.ref;
}
}
// append indicator
if (indicatorData) {
indicatorData.extra.width = this.data.style.width || childWidth;
indicatorData.extra.height = this.data.style.height || childHeight;
this.indicator = componentManager.createElement(indicatorData);
this.indicator.parentRef = this.data.ref;
this.indicator.slider = this;
this.node.appendChild(this.indicator.node);
}
sliderContainer.style.height = this.data.style.height + 'px';
sliderContainer.appendChild(fragment);
}
},
appendChild: function appendChild (data) {
var children = this.data.children || (this.data.children = []);
children.push(data);
doRender(this);
if (this.children.length > 0) {
return this.children[this.children.length - 1]
}
},
insertBefore: function insertBefore (child, before) {
var children = this.data.children;
var childIndex = -1;
for (var i = 0, l = children.length; i < l; i++) {
if (children[i].ref === before.data.ref) {
childIndex = i;
break
}
}
children.splice(childIndex, 0, child.data);
doRender(this);
if (this.children.length > 0) {
return this.children[this.children.length - 1]
}
},
removeChild: function removeChild (child) {
var children = this.data.children;
if (children) {
for (var i = 0; i < children.length; i++) {
if (child.data.ref === children[i].ref) {
children.splice(i, 1);
break
}
}
}
doRender(this);
},
onAppend: function onAppend () {
if (this.carrousel) {
this.carrousel.removeEventListener('change', getSliderChangeHandler(this));
this.carrousel.stop();
this.carrousel = null;
}
var Carrousel = lib.carrousel;
this.carrousel = new Carrousel(this.sliderContainer, {
autoplay: this.autoPlay,
useGesture: true
});
this.carrousel.playInterval = this.interval;
this.carrousel.addEventListener('change', getSliderChangeHandler(this));
this.currentIndex = 0;
// preload all images for slider
// because:
// 1. lib-img doesn't listen to event transitionend
// 2. even if we fire lazy load in slider's change event handler,
// the next image still won't be preloaded utill the moment it
// slides into the view, which is too late.
if (this.preloadImgsTimer) {
clearTimeout(this.preloadImgsTimer);
}
// The time just before the second slide appear and enough
// for all child elements to append is ok.
var preloadTime = 0.8;
this.preloadImgsTimer = setTimeout(function () {
var imgs = this.carrousel.element.querySelectorAll('.weex-img');
for (var i = 0, l = imgs.length; i < l; i++) {
var img = imgs[i];
var iLazySrc = img.getAttribute('i-lazy-src');
var imgSrc = img.getAttribute('img-src');
if (iLazySrc) {
img.style.backgroundImage = 'url(' + iLazySrc + ')';
}
else if (imgSrc) {
img.style.backgroundImage = 'url(' + imgSrc + ')';
}
img.removeAttribute('i-lazy-src');
img.removeAttribute('img-src');
}
}.bind(this), preloadTime * 1000);
// avoid page scroll when panning
var panning = false;
this.carrousel.element.addEventListener('panstart', function (e) {
if (!e.isVertical) {
panning = true;
}
});
this.carrousel.element.addEventListener('panend', function (e) {
if (!e.isVertical) {
panning = false;
}
});
document.addEventListener('touchmove', function (e) {
if (panning) {
e.preventDefault();
return false
}
return true
});
Component$2.prototype.onAppend.call(this);
},
play: function play () {
this.carrousel.play();
},
stop: function stop () {
this.carrousel.stop();
},
slideTo: function slideTo (index) {
var offset = index - this.currentIndex;
this.carrousel.items.slide(offset);
}
};
var attr$6 = {
interval: function (val) {
this.interval = parseInt(val) || DEFAULT_INTERVAL;
if (this.carrousel) {
this.carrousel.playInterval = this.interval;
}
},
index: function (val) {
var _this = this;
function doSlide (index) {
index = parseInt(index);
if (index < 0 || isNaN(index)) {
return console.error('[h5-render] invalid index ', index)
}
_this.slideTo(index);
if (_this._updateIndex) {
window.removeEventListener('renderend', _this._updateIndex);
}
}
if (this.isDomRendering) {
var pre = !!this._updateIndex;
this._updateIndex = function () {
_this.autoPlay && _this.isPageShow && _this.play();
doSlide(val);
};
!pre && window.addEventListener('renderend', this._updateIndex);
}
else {
doSlide(val);
}
},
playstatus: function (val) {
this.playstatus = val && val !== 'false';
this.autoPlay = this.playstatus;
if (this.carrousel) {
if (this.playstatus) {
this.play();
}
else {
this.stop();
}
}
},
// support playstatus' alias auto-play for compatibility
autoPlay: function (val) {
this.attr.playstatus.call(this, val);
}
};
var event$1 = {
change: {
updator: function () {
return {
attrs: {
index: this.currentIndex
}
}
}
}
};
function init$20 (Weex) {
Component$2 = Weex.Component;
extend$1 = Weex.utils.extend;
function Slider (data) {
this.autoPlay = false; // default value is false.
this.interval = DEFAULT_INTERVAL;
this.direction = 'row'; // 'column' is not temporarily supported.
this.children = [];
this.isPageShow = true;
this.isDomRendering = true;
// bind event 'pageshow', 'pagehide' and 'visibilitychange' on window.
idleWhenPageDisappear(this);
// bind event 'renderBegin' and 'renderEnd' on window.
idleWhenDomRendering(this);
Component$2.call(this, data);
}
Slider.prototype = Object.create(Component$2.prototype);
extend$1(Slider.prototype, proto$6);
extend$1(Slider.prototype, { attr: attr$6 });
extend$1(Slider.prototype, { event: event$1 });
Weex.registerComponent('slider', Slider);
}
var Slider = { init: init$20 };
__$styleInject(".weex-indicators {\n position: absolute;\n white-space: nowrap;\n}\n.weex-indicators .weex-indicator {\n float: left;\n border-radius: 50%;\n}\n",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var DEFAULT_ITEM_COLOR = '#999';
var DEFAULT_ITEM_SELECTED_COLOR = '#0000ff';
var DEFAULT_ITEM_SIZE = 20;
var DEFAULT_MARGIN_SIZE = 10;
function resetColor (indicator) {
var len = indicator.items.length;
if (typeof indicator.index !== 'undefined' && len > indicator.index) {
for (var i = 0; i < len; i++) {
var item = indicator.items[i];
if (indicator.index === i) {
item.classList.add('active');
item.style.backgroundColor = indicator.itemSelectedColor;
}
else {
item.style.backgroundColor = indicator.itemColor;
}
}
}
}
function handleClick (indicator, idx, e) {
indicator.slider.slideTo(idx);
}
var proto$7 = {
create: function create () {
var node = document.createElement('div');
node.classList.add('weex-indicators');
node.classList.add('weex-element');
node.style.position = 'absolute';
this.node = node;
this.style.itemSize.call(this, 0);
this.updateStyle({
left: 0,
top: 0,
itemSize: 0
});
return node
},
createChildren: function createChildren () {
var this$1 = this;
var root = document.createDocumentFragment();
for (var i = 0; i < this.amount; i++) {
var indicator = document.createElement('div');
indicator.classList.add('weex-indicator');
indicator.style.boxSizing = 'border-box';
indicator.style.margin = '0 '
+ DEFAULT_MARGIN_SIZE
+ 'px';
indicator.style.width = this$1.itemSize + 'px';
indicator.style.height = this$1.itemSize + 'px';
indicator.setAttribute('index', i);
if (this$1.index === i) {
indicator.classList.add('active');
indicator.style.backgroundColor = this$1.itemSelectedColor;
}
else {
indicator.style.backgroundColor = this$1.itemColor;
}
indicator.addEventListener('click', handleClick.bind(null, this$1, i));
this$1.items[i] = indicator;
root.appendChild(indicator);
}
this.node.appendChild(root);
},
setIndex: function setIndex (idx) {
if (idx >= this.amount) {
return
}
var prev = this.items[this.index];
var cur = this.items[idx];
prev.classList.remove('active');
prev.style.backgroundColor = this.itemColor;
cur.classList.add('active');
cur.style.backgroundColor = this.itemSelectedColor;
this.index = idx;
}
};
var style$5 = {
itemColor: function itemColor (val) {
this.itemColor = val || DEFAULT_ITEM_COLOR;
resetColor(this);
},
itemSelectedColor: function itemSelectedColor (val) {
this.itemSelectedColor = val || DEFAULT_ITEM_SELECTED_COLOR;
resetColor(this);
},
itemSize: function itemSize (val) {
var this$1 = this;
val = parseInt(val) || DEFAULT_ITEM_SIZE;
this.itemSize = val;
this.node.style.height = val + 'px';
for (var i = 0, l = this.items.length; i < l; i++) {
this$1.items[i].style.width = val + 'px';
this$1.items[i].style.height = val + 'px';
}
},
width: function width (val) {
val = parseInt(val) || parseInt(this.sliderWidth);
this.virtualWrapperWidth = val;
},
height: function height (val) {
val = parseInt(val) || parseInt(this.sliderHeight);
this.virtualWrapperHeight = val;
},
top: function top (val) {
val = this.virtualWrapperHeight / 2 - this.itemSize / 2 + val;
this.node.style.bottom = '';
this.node.style.top = val + 'px';
},
bottom: function bottom (val) {
val = this.virtualWrapperHeight / 2 - this.itemSize / 2 + val;
this.node.style.top = '';
this.node.style.bottom = val + 'px';
},
left: function left (val) {
val = this.virtualWrapperWidth / 2
- (this.itemSize + 2 * DEFAULT_MARGIN_SIZE) * this.amount / 2 + val;
this.node.style.right = '';
this.node.style.left = val + 'px';
},
right: function right (val) {
val = this.virtualWrapperWidth / 2
- (this.itemSize + 2 * DEFAULT_MARGIN_SIZE) * this.amount / 2 + val;
this.node.style.left = '';
this.node.style.right = val + 'px';
}
};
function init$21 (Weex) {
var Atomic = Weex.Atomic;
var extend = Weex.utils.extend;
// Style supported:
// position: (default - absolute)
// itemColor: color of indicator dots
// itemSelectedColor: color of the selected indicator dot
// itemSize: size of indicators
// other layout styles
function Indicator (data) {
this.direction = 'row'; // 'column' is not temporarily supported.
this.amount = data.extra.amount;
this.index = data.extra.index;
this.sliderWidth = data.extra.width;
this.sliderHeight = data.extra.height;
var styles = data.style || {};
this.data = data;
this.style.width.call(this, styles.width);
this.style.height.call(this, styles.height);
this.itemColor = styles.itemColor || DEFAULT_ITEM_COLOR;
this.itemSelectedColor = styles.itemSelectedColor
|| DEFAULT_ITEM_SELECTED_COLOR;
this.items = [];
Atomic.call(this, data);
}
Indicator.prototype = Object.create(Atomic.prototype);
extend(Indicator.prototype, proto$7);
extend(Indicator.prototype, {
style: extend(Object.create(Atomic.prototype.style), style$5)
});
Weex.registerComponent('indicator', Indicator);
}
var Indicator = { init: init$21 };
__$styleInject(".tab-header {\n position: relative;\n width: 10rem;\n font-size: 14px;\n color: #333;\n}\n.tab-header .header-bar {\n height: 1.17rem;\n line-height: 1.17rem;\n display: none;\n color: #999;\n padding-left: 0.4rem;\n}\n.tab-header .header-body {\n margin-right: 1.07rem;\n overflow-x: auto;\n overflow-y: hidden;\n}\n.tab-header .header-body::-webkit-scrollbar {\n width: 0;\n height: 0;\n overflow: hidden;\n}\n.tab-header .fold-toggle {\n position: absolute;\n top: 0.59rem;\n -webkit-transform: translateY(-50%);\n right: 0.29rem;\n width: 0.48rem;\n height: 0.48rem;\n line-height: 0.48rem;\n text-align: center;\n z-index: 99;\n font-size: 14px;\n}\n.tab-header.unfold-header {\n position: fixed !important;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.tabheader {\n list-style: none;\n white-space: nowrap;\n height: 1.17rem;\n line-height: 1.17rem;\n}\n.tabheader .th-item {\n padding-left: 0.72rem;\n position: relative;\n display: inline-block;\n}\n.tabheader .hl-icon {\n width: 0.4rem;\n height: 0.4rem;\n line-height: 0.4rem;\n text-align: center;\n position: absolute;\n top: 50%;\n -webkit-transform: translateY(-50%);\n left: 0.24rem;\n font-size: 14px;\n}\n\n.unfold-header .header-bar {\n display: block;\n}\n.unfold-header .fold-toggle {\n -webkit-transform: translateY(-50%) rotate(180deg);\n}\n.unfold-header .header-body {\n margin-right: 0;\n padding: 0.24rem;\n}\n.unfold-header .tabheader {\n display: block;\n height: auto;\n}\n.unfold-header .th-item {\n box-sizing: border-box;\n float: left;\n width: 33.3333%;\n height: 1.01rem;\n line-height: 1.01rem;\n}\n.unfold-header .hl-icon {\n margin-right: 0;\n position: absolute;\n}\n.unfold-header.tabheader-mask {\n display: block;\n width: 100%;\n height: 100%;\n background-color: rgba(0, 0, 0, 0.6);\n}\n\n.tabheader-mask {\n display: none;\n position: fixed;\n left: 0;\n top: 0;\n}\n\n@font-face {\n font-family: \"iconfont\";\n src: url(\"data:application/x-font-ttf;charset=utf-8;base64,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R7AEQ7CAYmAgsAArIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbCAYmGwAiVGYTgjIDwjOBshICBGI0ewACsjYTghWbEkARQrLbA7LLAuKy6xJAEUKy2wPCywLyshIyAgPLAEI0IjOLEkARQrsARDLrAkKy2wPSywABUgR7AAI0KyAAEBFRQTLrAqKi2wPiywABUgR7AAI0KyAAEBFRQTLrAqKi2wPyyxAAEUE7ArKi2wQCywLSotsEEssAAWRSMgLiBGiiNhOLEkARQrLbBCLLAJI0KwQSstsEMssgAAOistsEQssgABOistsEUssgEAOistsEYssgEBOistsEcssgAAOystsEgssgABOystsEkssgEAOystsEossgEBOystsEsssgAANystsEwssgABNystsE0ssgEANystsE4ssgEBNystsE8ssgAAOSstsFAssgABOSstsFEssgEAOSstsFIssgEBOSstsFMssgAAPCstsFQssgABPCstsFUssgEAPCstsFYssgEBPCstsFcssgAAOCstsFgssgABOCstsFkssgEAOCstsFossgEBOCstsFsssDArLrEkARQrLbBcLLAwK7A0Ky2wXSywMCuwNSstsF4ssAAWsDArsDYrLbBfLLAxKy6xJAEUKy2wYCywMSuwNCstsGEssDErsDUrLbBiLLAxK7A2Ky2wYyywMisusSQBFCstsGQssDIrsDQrLbBlLLAyK7A1Ky2wZiywMiuwNistsGcssDMrLrEkARQrLbBoLLAzK7A0Ky2waSywMyuwNSstsGossDMrsDYrLbBrLCuwCGWwAyRQeLABFTAtAABLuADIUlixAQGOWbkIAAgAYyCwASNEILADI3CwDkUgIEu4AA5RS7AGU1pYsDQbsChZYGYgilVYsAIlYbABRWMjYrACI0SzCgkFBCuzCgsFBCuzDg8FBCtZsgQoCUVSRLMKDQYEK7EGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAAAA==\") format(\"truetype\");\n}\n.iconfont {\n font-family: iconfont !important;\n font-size: 16px;\n font-style: normal;\n -webkit-font-smoothing: antialiased;\n -webkit-text-stroke-width: 0.2px;\n -moz-osx-font-smoothing: grayscale;\n}\n\n[data-dpr=\"2\"] .tab-header {\n font-size: 28px;\n}\n\n[data-dpr=\"3\"] .tab-header {\n font-size: 42px;\n}\n\n[data-dpr=\"2\"] .tabheader .hl-icon {\n font-size: 28px;\n}\n\n[data-dpr=\"3\"] .tabheader .hl-icon {\n font-size: 42px;\n}\n\n[data-dpr=\"2\"] .tab-header .fold-toggle {\n font-size: 28px;\n}\n\n[data-dpr=\"3\"] .tab-header .fold-toggle {\n font-size: 42px;\n}\n",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// TODO: refactor this scss code since this is strongly
// dependent on lib.flexible other than the value of
// scale.
function initFoldBtn (tabheader) {
var node = tabheader.node;
var btn = document.createElement('span');
btn.className = 'fold-toggle iconfont';
btn.innerHTML = '&#xe661;';
node.appendChild(btn);
btn.addEventListener('click', function () {
if (tabheader.unfolding) {
folding(tabheader);
}
else {
unfolding(tabheader);
}
});
}
function initMask (tabheader) {
var mask = document.createElement('div');
mask.className = 'tabheader-mask';
tabheader.mask = mask;
// stop default behavior: page moving.
mask.addEventListener('touchmove', function (evt) {
evt.preventDefault();
});
// click to unfold.
mask.addEventListener('click', function () {
folding(tabheader);
});
document.body.appendChild(mask);
}
function unfolding (tabheader) {
// mark the initial posiiton of tabheader
if (!tabheader.flag) {
var flag = document.createComment('tabheader');
tabheader.flag = flag;
tabheader.node.parentNode.insertBefore(flag, tabheader.node);
}
if (!tabheader.mask) {
initMask(tabheader);
}
// record the scroll position.
tabheader._scrollVal = tabheader._body.scrollLeft;
// record the position in document.
tabheader._topVal = tabheader.node.getBoundingClientRect().top;
tabheader._styleTop = tabheader.node.style.top;
document.body.appendChild(tabheader.node);
tabheader.node.classList.add('unfold-header');
tabheader.node.style.height = 'auto';
// recalc the position when it is unfolded.
var thHeight = tabheader.node.getBoundingClientRect().height;
if (thHeight + tabheader._topVal > window.innerHeight) {
tabheader._topVal = tabheader._topVal
+ (window.innerHeight - thHeight - tabheader._topVal);
}
tabheader.node.style.top = tabheader._topVal + 'px';
// process mask style
tabheader.mask.classList.add('unfold-header');
tabheader.mask.style.height = window.innerHeight + 'px';
tabheader.unfolding = true;
}
function folding (tabheader) {
if (tabheader.unfolding !== true) {
return
}
tabheader.mask.classList.remove('unfold-header');
tabheader.node.classList.remove('unfold-header');
tabheader.node.style.height = '';
tabheader.node.style.top = tabheader._styleTop;
// recover the position of tabheader.
tabheader.flag.parentNode.insertBefore(tabheader.node, tabheader.flag);
// recover the position of scoller.
tabheader._body.scrollLeft = tabheader._scrollVal;
scrollToView(tabheader);
tabheader.unfolding = false;
}
function initEvent (tabheader) {
initClickEvent(tabheader);
initSelectEvent(tabheader);
}
// init events.
function initClickEvent (tabheader) {
var box = tabheader.box;
box.addEventListener('click', function (evt) {
var target = evt.target;
if (target.nodeName === 'UL') {
return
}
if (target.parentNode.nodeName === 'LI') {
target = target.parentNode;
}
var floor = target.getAttribute('data-floor');
/* eslint-disable eqeqeq */
if (tabheader.data.attr.selectedIndex == floor) {
// Duplicated clicking, not to trigger select event.
return
}
/* eslint-enable eqeqeq */
fireEvent$4(target, 'select', { index: floor });
});
}
function initSelectEvent (tabheader) {
var node = tabheader.node;
node.addEventListener('select', function (evt) {
var index;
if (evt.index !== undefined) {
index = evt.index;
}
else if (evt.data && evt.data.index !== undefined) {
index = evt.data.index;
}
if (index === undefined) {
return
}
tabheader.attr.selectedIndex.call(tabheader, index);
});
}
function scrollToView (tabheader, node) {
if (!node) {
var attr = tabheader.data.attr;
node = tabheader.node.querySelector('[data-floor="' + attr.selectedIndex + '"]');
}
if (!node) {
return
}
// const defaultVal = tabheader._body.scrollLeft
// const leftVal = defaultVal - node.offsetLeft + 300
var scrollVal = getScrollVal(tabheader._body.getBoundingClientRect(), node);
doScroll$1(tabheader._body, scrollVal);
}
// scroll the tabheader.
// positive val means to scroll right.
// negative val means to scroll left.
function doScroll$1 (node, val, finish) {
if (!val) {
return
}
if (finish === undefined) {
finish = Math.abs(val);
}
if (finish <= 0) {
return
}
setTimeout(function () {
if (val > 0) {
node.scrollLeft += 2;
}
else {
node.scrollLeft -= 2;
}
finish -= 2;
doScroll$1(node, val, finish);
});
}
// get scroll distance.
function getScrollVal (rect, node) {
var left = node.previousSibling;
var right = node.nextSibling;
var scrollVal;
// process left-side element first.
if (left) {
var leftRect = left.getBoundingClientRect();
// only need to compare the value of left.
if (leftRect.left < rect.left) {
scrollVal = leftRect.left;
return scrollVal
}
}
if (right) {
var rightRect = right.getBoundingClientRect();
// compare the value of right.
if (rightRect.right > rect.right) {
scrollVal = rightRect.right - rect.right;
return scrollVal
}
}
// process current node, from left to right.
var nodeRect = node.getBoundingClientRect();
if (nodeRect.left < rect.left) {
scrollVal = nodeRect.left;
}
else if (nodeRect.right > rect.right) {
scrollVal = nodeRect.right - rect.right;
}
return scrollVal
}
// trigger and broadcast events.
function fireEvent$4 (element, type, data) {
var evt = document.createEvent('Event');
evt.data = data;
for (var k in data) {
if (data.hasOwnProperty(k)) {
evt[k] = data[k];
}
}
// need bubble.
evt.initEvent(type, true, true);
element.dispatchEvent(evt);
}
function createHighlightIcon (code) {
var html = '<i class="hl-icon iconfont">' + '&#xe650' + '</i>';
return html
}
function isValidColor (color) {
if (!color) {
return false
}
if (color.charAt(0) !== '#') {
return false
}
if (color.length !== 7) {
return false
}
return true
}
var proto$8 = {
create: function create () {
// outside container.
var node = document.createElement('div');
node.className = 'tab-header';
// tip on the top.
var bar = document.createElement('div');
bar.className = 'header-bar';
bar.textContent = 'CHANGE FLOOR';
// middle layer.
var body = document.createElement('div');
body.className = 'header-body';
var box = document.createElement('ul');
box.className = 'tabheader';
body.appendChild(box);
node.appendChild(bar);
node.appendChild(body);
this._bar = bar;
this._body = body;
this.box = box;
this.node = node;
// init events.
initFoldBtn(this);
initEvent(this);
return node
}
};
var attr$7 = {
highlightIcon: function highlightIcon () {
return createHighlightIcon()
},
data: function data () {
var attr = this.data.attr;
// Ensure there is a default selected value.
if (attr.selectedIndex === undefined) {
attr.selectedIndex = 0;
}
var list = attr.data || [];
var curItem = attr.selectedIndex;
var ret = [];
var itemTmpl = '<li class="th-item" data-floor="{{floor}}">'
+ '{{hlIcon}}{{floorName}}</li>';
list.forEach(function (item, idx) {
var html = itemTmpl.replace('{{floor}}', idx);
/* eslint-disable eqeqeq */
if (curItem == idx) {
html = html.replace('{{hlIcon}}', createHighlightIcon());
}
else {
html = html.replace('{{hlIcon}}', '');
}
/* eslint-enable eqeqeq */
html = html.replace('{{floorName}}', item);
ret.push(html);
}, this);
this.box.innerHTML = ret.join('');
},
selectedIndex: function selectedIndex (val) {
var attr = this.data.attr;
if (val === undefined) {
val = 0;
}
// if (val == attr.selectedIndex) {
// return
// }
attr.selectedIndex = val;
this.attr.data.call(this);
folding(this);
this.style.textHighlightColor.call(this, this.textHighlightColor);
}
};
var style$6 = {
opacity: function opacity (val) {
if (val === undefined || val < 0 || val > 1) {
val = 1;
}
this.node.style.opacity = val;
},
textColor: function textColor (val) {
if (!isValidColor(val)) {
return
}
this.node.style.color = val;
},
textHighlightColor: function textHighlightColor (val) {
if (!isValidColor(val)) {
return
}
this.textHighlightColor = val;
var attr = this.data.attr;
var node = this.node.querySelector('[data-floor="'
+ attr.selectedIndex + '"]');
if (node) {
node.style.color = val;
scrollToView(this, node);
}
}
};
function init$22 (Weex) {
var Atomic = Weex.Atomic;
var extend = Weex.utils.extend;
function TabHeader (data) {
Atomic.call(this, data);
}
TabHeader.prototype = Object.create(Atomic.prototype);
extend(TabHeader.prototype, proto$8);
extend(TabHeader.prototype, { attr: attr$7 });
extend(TabHeader.prototype, {
style: extend(Object.create(Atomic.prototype.style), style$6)
});
Weex.registerComponent('tabheader', TabHeader);
}
var Tabheader = { init: init$22 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var appendStyle$1;
var availableTypes = ['text', 'password', 'tel', 'email', 'url', 'date', 'time'];
var DEFAULT_TYPE = 'text';
function setPlaceholderColor (input, placeholderColor) {
if (!placeholderColor) {
return
}
var vendors$$1 = [
'::-webkit-input-placeholder',
':-moz-placeholder',
'::-moz-placeholder',
':-ms-input-placeholder',
':placeholder-shown'
];
var css = '';
var cssRule = 'color: ' + placeholderColor + ';';
for (var i = 0, l = vendors$$1.length; i < l; i++) {
css += '.' + input.className + vendors$$1[i] + '{'
+ cssRule + '}';
}
appendStyle$1(css, input.styleId, true);
}
var proto$9 = {
create: function create () {
var node = document.createElement('input');
var uuid = Math.floor(10000000000000 * Math.random()) + Date.now();
this.className = 'weex-ipt-' + uuid;
this.styleId = 'weex-style-' + uuid;
node.classList.add(this.className);
node.classList.add('weex-element');
this.placeholder && (node.placeholder = this.placeholder);
this.createKeybordEvent(node);
return node
},
// support enter key envent
createKeybordEvent: function createKeybordEvent (node) {
var this$1 = this;
if (Array.isArray(this.data.event) && this.data.event.indexOf('return') > -1) {
node.addEventListener('keyup', function (ev) {
var code = ev.keyCode;
var key = ev.key;
if (code === 13) {
if (key.toLowerCase() === 'tab') {
key = 'next';
}
var rightKeyType = findEnterKeyType(this$1.data.attr['returnKeyType']);
this$1.dispatchEvent('return', { returnKeyType: rightKeyType });
}
}, false);
}
},
focus: function focus () {
this.node.focus();
},
blur: function blur () {
this.node.blur();
}
};
// updatable attributes
var attr$8 = {
disabled: function disabled (val) {
this.node.disabled = !!val;
},
placeholder: function placeholder (val) {
this.node.placeholder = val || '';
},
value: function value (val) {
this.node.value = val || '';
},
autofocus: function autofocus (val) {
this.node.autofocus = !!val;
},
type: function type (val) {
this.node.type = availableTypes.indexOf(val) !== -1
? val
: DEFAULT_TYPE;
},
returnKeyType: function returnKeyType (val) {
this.node.returnKeyType = val || '';
}
};
// updatable styles
var style$7 = {
placeholderColor: function (val) {
setPlaceholderColor(this, val);
}
};
// events configurations
var event$2 = {
input: {
updator: function updator () {
return {
attrs: {
value: this.node.value
}
}
},
extra: function extra () {
return {
value: this.node.value,
timestamp: Date.now()
}
}
},
change: {
updator: function () {
return {
attrs: {
value: this.node.value
}
}
},
extra: function () {
return {
value: this.node.value,
timestamp: Date.now()
}
}
},
return: {
updator: function (obj) {
return {
attrs: {
value: this.node.value
}
}
}
}
};
function init$23 (Weex) {
var Atomic = Weex.Atomic;
var extend$$1 = Weex.utils.extend;
appendStyle$1 = Weex.utils.appendStyle;
// attrs:
// - type: text|password|tel|email|url
// - value
// - placeholder
// - disabled
// - autofocus
function Input (data) {
Atomic.call(this, data);
}
Input.prototype = Object.create(Atomic.prototype);
extend$$1(Input.prototype, proto$9);
extend$$1(Input.prototype, { attr: attr$8 });
extend$$1(Input.prototype, {
style: extend$$1(Object.create(Atomic.prototype.style), style$7)
});
extend$$1(Input.prototype, { event: event$2 });
Weex.registerComponent('input', Input);
}
var Input = { init: init$23 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var DEFAULT_ROWS = 2;
/**
* attr:
* rows: default is 2.
* disabled
* placeholder
*/
var proto$10 = {
create: function create () {
var node = document.createElement('textarea');
node.classList.add('weex-element');
node.classList.add('weex-textarea');
this.createKeyboardEvent(node);
return node
},
// support enter key envent
createKeyboardEvent: function createKeyboardEvent (node) {
var this$1 = this;
if (Array.isArray(this.data.event) && this.data.event.indexOf('return') > -1) {
node.addEventListener('keyup', function (ev) {
var code = ev.keyCode;
var key = ev.key;
if (code === 13) {
if (key.toLowerCase() === 'tab') {
key = 'next';
}
var rightKeyType = findEnterKeyType(this$1.data.attr['returnKeyType']);
this$1.dispatchEvent('return', { returnKeyType: rightKeyType });
}
}, false);
}
}
};
// updatable attributes
var attr$9 = {
rows: function rows (val) {
this.node.rows = val || DEFAULT_ROWS;
},
disabled: function disabled (val) {
this.node.disabled = !!val;
},
placeholder: function placeholder (val) {
this.node.placeholder = val || '';
},
value: function value (val) {
this.node.value = val || '';
},
autofocus: function autofocus (val) {
this.node.autofocus = !!val;
},
returnKeyType: function returnKeyType (val) {
this.node.returnKeyType = val || '';
}
};
// events configurations
var event$3 = {
input: {
updator: function updator () {
return {
attrs: {
value: this.node.value
}
}
},
extra: function extra () {
return {
value: this.node.value,
timestamp: Date.now()
}
}
},
change: {
updator: function () {
return {
attrs: {
value: this.node.value
}
}
},
extra: function () {
return {
value: this.node.value,
timestamp: Date.now()
}
}
},
return: {
updator: function (obj) {
return {
attrs: {
value: this.node.value
}
}
}
}
};
function init$24 (Weex) {
var Atomic = Weex.Atomic;
var extend$$1 = Weex.utils.extend;
// attrs:
// - rows
// - disabled
// - placeholder
function Textarea (data) {
Atomic.call(this, data);
}
Textarea.prototype = Object.create(Atomic.prototype);
extend$$1(Textarea.prototype, proto$10);
extend$$1(Textarea.prototype, { attr: attr$9 });
extend$$1(Textarea.prototype, { event: event$3 });
Weex.registerComponent('textarea', Textarea);
}
var Textarea = { init: init$24 };
__$styleInject(".weex-video {\n\tbackground-color: #000;\n}",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getProto$2 (Weex) {
var Atomic = Weex.Atomic;
return {
create: function create () {
var this$1 = this;
var node = document.createElement('video');
node.classList.add('weex-video');
node.classList.add('weex-element');
node.controls = true;
node.autoplay = this.autoPlay;
node.setAttribute('playsinline', '');
node.setAttribute('webkit-playsinline', '');
node.setAttribute('play-status', this.playStatus);
this.node = node;
if (this.autoPlay && this.playStatus === 'play') {
// set timer to avoid error: uncaught DOM exception: the play() request
// was interrupted by a new load request.
setTimeout(function () {
this$1.play();
}, 0);
}
return node
},
bindEvents: function bindEvents (evts) {
var this$1 = this;
Atomic.prototype.bindEvents.call(this, evts);
// convert w3c-video events to weex-video events.
var evtsMap = {
start: 'play',
finish: 'ended',
fail: 'error'
};
for (var evtName in evtsMap) {
this$1.node.addEventListener(evtsMap[evtName], function (type, e) {
this.dispatchEvent(type, e.data);
}.bind(this$1, evtName));
}
},
play: function play () {
var src = this.node.getAttribute('src');
if (!src) {
src = this.node.getAttribute('data-src');
src && this.node.setAttribute('src', src);
}
try {
this.node.play();
}
catch (err) {
// DO NOTHING.
}
},
pause: function pause () {
this.node.pause();
},
stop: function stop () {
this.node.pause();
this.node.autoplay = false;
this.node.setAttribute('data-src', this.node.src);
this.node.src = '';
}
}
}
var attr$10 = {
playStatus: function playStatus (val) {
if (val !== 'play' && val !== 'stop' && val !== 'pause') {
val = 'pause';
}
if (this.playStatus === val) {
return
}
this.playStatus = val;
this.node.setAttribute('play-status', val);
this[this.playStatus]();
},
autoPlay: function autoPlay (val) {
// DO NOTHING
}
};
function init$25 (Weex) {
var Atomic = Weex.Atomic;
var extend = Weex.utils.extend;
// attrs:
// - autoPlay: true | false (default: false)
// - playStatus: play | pause | stop
// - src: {string}
// - poster: {string}
// - loop: true | false (default: false)
// - muted: true | false (default: false)
// events:
// - start
// - pause
// - finish
// - fail
function Video (data) {
var autoPlay = data.attr.autoPlay;
var playStatus = data.attr.playStatus;
this.autoPlay = autoPlay === true || autoPlay === 'true';
if (playStatus !== 'play'
&& playStatus !== 'stop'
&& playStatus !== 'pause') {
this.playStatus = 'pause';
}
else {
this.playStatus = playStatus;
}
Atomic.call(this, data);
}
Video.prototype = Object.create(Atomic.prototype);
extend(Video.prototype, getProto$2(Weex));
extend(Video.prototype, { attr: attr$10 });
Weex.registerComponent('video', Video);
}
var Video = { init: init$25 };
__$styleInject("/* switch defaults. */\n.weex-switch {\n background-color: #fff;\n border: 1px solid #dfdfdf;\n cursor: pointer;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n -moz-user-select: none;\n -khtml-user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n box-sizing: content-box;\n background-clip: content-box;\n}\n\n.weex-switch > small {\n background: #fff;\n border-radius: 100%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n position: absolute;\n top: 0;\n}\n",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var defaults = {
color: '#64bd63',
secondaryColor: '#dfdfdf',
jackColor: '#fff',
jackSecondaryColor: null,
className: 'weex-switch',
disabledOpacity: 0.5,
speed: '0.4s',
width: 100,
height: 60,
// is width and height scalable ?
scalable: false
};
function transitionize (element, props) {
var transitions = [];
for (var key in props) {
transitions.push(key + ' ' + props[key]);
}
element.style.transition = transitions.join(', ');
element.style.webkitTransition = transitions.join(', ');
}
function setSize (comp) {
var min = Math.min(comp.width, comp.height);
var max = Math.max(comp.width, comp.height);
comp.node.style.width = max + 'px';
comp.node.style.height = min + 'px';
comp.node.style.borderRadius = min / 2 + 'px';
comp.jack.style.width
= comp.jack.style.height
= min + 'px';
}
function setPosition (comp, clicked) {
var checked = comp.checked;
var node = comp.node;
var jack = comp.jack;
if (clicked && checked) {
checked = false;
}
else if (clicked && !checked) {
checked = true;
}
if (checked === true) {
comp.checked = true;
if (window.getComputedStyle) {
jack.style.left = parseInt(window.getComputedStyle(node).width)
- parseInt(window.getComputedStyle(jack).width) + 'px';
}
else {
jack.style.left = parseInt(node.currentStyle['width'])
- parseInt(jack.currentStyle['width']) + 'px';
}
comp.options.color && colorize(comp);
setSpeed(comp);
}
else {
comp.checked = false;
jack.style.left = 0;
node.style.boxShadow = 'inset 0 0 0 0 ' + comp.options.secondaryColor;
node.style.borderColor = comp.options.secondaryColor;
node.style.backgroundColor
= (comp.options.secondaryColor !== defaults.secondaryColor)
? comp.options.secondaryColor
: '#fff';
jack.style.backgroundColor
= (comp.options.jackSecondaryColor !== comp.options.jackColor)
? comp.options.jackSecondaryColor
: comp.options.jackColor;
setSpeed(comp);
}
}
function setSpeed (comp) {
var switcherProp = {};
var jackProp = {
'background-color': comp.options.speed,
left: comp.options.speed.replace(/[a-z]/, '') / 2 + 's'
};
if (comp.checked) {
switcherProp = {
border: comp.options.speed,
'box-shadow': comp.options.speed,
'background-color': comp.options.speed.replace(/[a-z]/, '') * 3 + 's'
};
}
else {
switcherProp = {
border: comp.options.speed,
'box-shadow': comp.options.speed
};
}
transitionize(comp.node, switcherProp);
transitionize(comp.jack, jackProp);
}
function colorize (comp) {
var nodeHeight = comp.node.offsetHeight / 2;
comp.node.style.backgroundColor = comp.options.color;
comp.node.style.borderColor = comp.options.color;
comp.node.style.boxShadow = 'inset 0 0 0 '
+ nodeHeight
+ 'px '
+ comp.options.color;
comp.jack.style.backgroundColor = comp.options.jackColor;
}
function getClickHandler (comp) {
if (!comp._clickHandler) {
comp._clickHandler = function () {
setPosition(comp, true);
comp.dispatchEvent('change', {
value: comp.checked
});
};
}
return comp._clickHandler
}
var proto$11 = {
create: function create () {
var node = document.createElement('span');
this.jack = document.createElement('small');
node.appendChild(this.jack);
node.className = this.options.className;
this.node = node;
this.attr.disabled.call(this, this.data.attr.disabled);
return node
},
onAppend: function onAppend () {
setSize(this);
setPosition(this);
},
enable: function enable () {
this.disabled && (this.disabled = false);
this.node.style.opacity = 1;
this.node.addEventListener('click', getClickHandler(this));
},
disable: function disable () {
!this.disabled && (this.disabled = true);
this.node.style.opacity = defaults.disabledOpacity;
this.node.removeEventListener('click', getClickHandler(this));
}
};
var attr$11 = {
disabled: function (val) {
this.disabled = val && val !== 'false';
this.disabled ? this.disable() : this.enable();
}
};
var style$8 = {
width: function (val) {
if (!this.options.scalable) {
return
}
val = parseFloat(val);
if (isNaN(val) || val < 0) {
val = this.options.width;
}
this.width = val;
this.setSize();
},
height: function (val) {
if (!this.options.scalable) {
return
}
val = parseFloat(val);
if (isNaN(val) || val < 0) {
val = this.options.height;
}
this.height = val;
this.setSize();
}
};
var event$4 = {
change: {
updator: function updator () {
return {
attrs: {
checked: this.checked
}
}
},
extra: function extra () {
return {
value: this.checked
}
}
}
};
function init$26 (Weex) {
var Atomic = Weex.Atomic;
var extend = Weex.utils.extend;
// attrs:
// - checked: if is checked.
// - disabled: if true, this component is not available for interaction.
function Switch (data) {
this.options = extend({}, defaults);
this.checked = data.attr.checked
&& data.attr.checked !== 'false';
this.data = data;
this.width = this.options.width;
this.height = this.options.height;
Atomic.call(this, data);
}
Switch.prototype = Object.create(Atomic.prototype);
extend(Switch.prototype, proto$11);
extend(Switch.prototype, { attr: attr$11 });
extend(Switch.prototype, {
style: extend(Object.create(Atomic.prototype.style), style$8)
});
extend(Switch.prototype, { event: event$4 });
Weex.registerComponent('switch', Switch);
}
var Switch = { init: init$26 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
function getProto$3 (Weex) {
var Component = Weex.Component;
return {
create: function create () {
var node = document.createElement('a');
node.classList.add('weex-container');
node.style.textDecoration = 'none';
return node
},
bindEvents: function bindEvents (evts) {
// event handler for click event will be processed
// before the url redirection.
Component.prototype.bindEvents.call(this, evts);
this.node.addEventListener('click', function (evt) {
if (evt._alreadyFired && evt.target !== this.node) {
// if the event target is this.node, then this is
// just another click event handler for the same
// target, not a handler for a bubbling up event,
// otherwise it is a bubbling up event, and it
// should be disregarded.
return
}
evt._alreadyFired = true;
location.href = this.href;
}.bind(this));
}
}
}
var attr$12 = {
href: function (val) {
if (!val) {
return console.warn('[web-render] href of <a> should not be a null value.')
}
this.href = val;
this.node.setAttribute('data-href', val);
}
};
function init$27 (Weex) {
var Component = Weex.Component;
var extend = Weex.utils.extend;
// attrs:
// - href
function A (data) {
Component.call(this, data);
}
A.prototype = Object.create(Component.prototype);
extend(A.prototype, getProto$3(Weex));
extend(A.prototype, { attr: attr$12 });
Weex.registerComponent('a', A);
}
var A = { init: init$27 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var ID_PREFIX = 'weex_embed_';
var getRandom$1;
function _generateId () {
return ID_PREFIX + getRandom$1(10)
}
var proto$12 = {
create: function create () {
var node = document.createElement('div');
node.id = this.id;
node.style.overflow = 'scroll';
return node
},
initWeex: function initWeex () {
this.id = _generateId();
this.node.id = this.id;
var config = {
appId: this.id,
source: this.source,
bundleUrl: this.source,
loader: this.loader,
jsonpCallback: this.jsonpCallback,
width: this.node.getBoundingClientRect().width,
rootId: this.id,
embed: true
};
window.weex.init(config);
},
destroyWeex: function destroyWeex () {
this.id && window.destroyInstance(this.id);
// TODO: unbind events and clear doms.
this.node.innerHTML = '';
},
reloadWeex: function reloadWeex () {
if (this.id) {
this.destroyWeex();
this.id = null;
this.node.id = null;
this.node.innerHTML = '';
}
this.initWeex();
}
};
// not recommended, because of the leak of memory.
var attr$13 = {
src: function (value) {
this.source = value;
this.reloadWeex();
}
};
function init$28 (Weex) {
var Component = Weex.Component;
var extend = Weex.utils.extend;
getRandom$1 = Weex.utils.getRandom;
function Embed (data, nodeType) {
var attr = data.attr;
if (attr) {
this.source = attr.src;
this.loader = attr.loader || 'xhr';
this.jsonpCallback = attr.jsonpCallback;
}
Component.call(this, data, nodeType);
}
Embed.prototype = Object.create(Component.prototype);
extend(Embed.prototype, proto$12);
extend(Embed.prototype, { attr: attr$13 });
Weex.registerComponent('embed', Embed);
}
var Embed = { init: init$28 };
__$styleInject(".weex-spinner-wrap {\n width: 1.013333rem; /* 76px */\n height: 1.013333rem;\n -webkit-box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n overflow: visible;\n}\n\n.weex-spinner {\n font-size: 0.16rem; /* 12px */\n width: 1em;\n height: 1em;\n border-radius: 50%;\n position: relative;\n text-indent: -9999em;\n -webkit-animation: weex-spinner 1.1s infinite ease;\n animation: weex-spinner 1.1s infinite ease;\n -webkit-transform: translateZ(0);\n -ms-transform: translateZ(0);\n transform: translateZ(0);\n}\n@-webkit-keyframes weex-spinner {\n 0%,\n 100% {\n box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);\n }\n 12.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);\n }\n 25% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 37.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 50% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 62.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 75% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 87.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;\n }\n}\n@keyframes weex-spinner {\n 0%,\n 100% {\n box-shadow: 0em -2.6em 0em 0em #ffffff, 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.5), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7);\n }\n 12.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.7), 1.8em -1.8em 0 0em #ffffff, 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5);\n }\n 25% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.5), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.7), 2.5em 0em 0 0em #ffffff, 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 37.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.5), 2.5em 0em 0 0em rgba(255, 255, 255, 0.7), 1.75em 1.75em 0 0em #ffffff, 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 50% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.5), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.7), 0em 2.5em 0 0em #ffffff, -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.2), -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 62.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.5), 0em 2.5em 0 0em rgba(255, 255, 255, 0.7), -1.8em 1.8em 0 0em #ffffff, -2.6em 0em 0 0em rgba(255, 255, 255, 0.2), -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 75% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.5), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.7), -2.6em 0em 0 0em #ffffff, -1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2);\n }\n 87.5% {\n box-shadow: 0em -2.6em 0em 0em rgba(255, 255, 255, 0.2), 1.8em -1.8em 0 0em rgba(255, 255, 255, 0.2), 2.5em 0em 0 0em rgba(255, 255, 255, 0.2), 1.75em 1.75em 0 0em rgba(255, 255, 255, 0.2), 0em 2.5em 0 0em rgba(255, 255, 255, 0.2), -1.8em 1.8em 0 0em rgba(255, 255, 255, 0.5), -2.6em 0em 0 0em rgba(255, 255, 255, 0.7), -1.8em -1.8em 0 0em #ffffff;\n }\n}\n",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global CSSRule */
var loopArray$1;
var getRgb$1;
function getStyleSheet (spinner) {
if (spinner.styleSheet) {
return
}
var styles = document.styleSheets;
var i, l, j, m;
/* eslint-disable no-labels */
outer: for (i = 0, l = styles.length; i < l; i++) {
var rules = styles[i].rules;
if (!rules) {
continue
}
for (j = 0, m = rules.length; j < m; j++) {
var item = rules.item(j);
if (
(item.type === CSSRule.KEYFRAMES_RULE
|| item.type === CSSRule.WEBKIT_KEYFRAMES_RULE)
&& item.name === 'weex-spinner') {
break outer
}
}
}
/* eslint-enable no-labels */
spinner.styleSheet = styles[i];
}
function setKeyframeColor (spinner, val) {
getStyleSheet(spinner);
var keyframeRules = computeKeyFrameRules(val);
var rules = spinner.styleSheet.rules;
for (var i = 0, l = rules.length; i < l; i++) {
var item = rules.item(i);
if ((item.type === CSSRule.KEYFRAMES_RULE
|| item.type === CSSRule.WEBKIT_KEYFRAMES_RULE)
&& item.name === 'weex-spinner') {
var cssRules = item.cssRules;
for (var j = 0, m = cssRules.length; j < m; j++) {
var keyframe = cssRules[j];
if (keyframe.type === CSSRule.KEYFRAME_RULE
|| keyframe.type === CSSRule.WEBKIT_KEYFRAME_RULE) {
keyframe.style.boxShadow = keyframeRules[j];
}
}
}
}
}
function computeKeyFrameRules (rgb) {
if (!rgb) {
return
}
var scaleArr = [
'0em -2.6em 0em 0em',
'1.8em -1.8em 0 0em',
'2.5em 0em 0 0em',
'1.75em 1.75em 0 0em',
'0em 2.5em 0 0em',
'-1.8em 1.8em 0 0em',
'-2.6em 0em 0 0em',
'-1.8em -1.8em 0 0em'];
var colorArr = [
'1',
'0.2',
'0.2',
'0.2',
'0.2',
'0.2',
'0.5',
'0.7'].map(function (e) {
return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + e + ')'
});
var rules = [];
var loop = function ( i ) {
var tmpColorArr = loopArray$1(colorArr, i, 'r');
rules.push(scaleArr.map(function (scaleStr, i) {
return scaleStr + ' ' + tmpColorArr[i]
}).join(', '));
};
for (var i = 0; i < scaleArr.length; i++) loop( i );
return rules
}
var proto$13 = {
create: function create () {
var node = document.createElement('div');
node.classList.add('weex-container');
node.classList.add('weex-spinner-wrap');
this.spinner = document.createElement('div');
this.spinner.classList.add('weex-element');
this.spinner.classList.add('weex-spinner');
node.appendChild(this.spinner);
return node
}
};
var style$9 = {
color: function (val) {
var rgb = getRgb$1(val);
if (!rgb) {
return console.error('[web-render] invalid color value:', val)
}
setKeyframeColor(this, rgb);
}
};
// Spinner.prototype.updateStyle = function (style) {
// Atomic.prototype.updateStyle.call(this, style)
// if (style && style.color) {
// this.setKeyframeColor(global.weex.utils.getRgb(this.node.style.color))
// }
// }
function init$29 (Weex) {
var Atomic = Weex.Atomic;
var extend = Weex.utils.extend;
getRgb$1 = Weex.utils.getRgb;
loopArray$1 = Weex.utils.loopArray;
function Spinner (data) {
Atomic.call(this, data);
}
Spinner.prototype = Object.create(Atomic.prototype);
extend(Spinner.prototype, proto$13);
extend(Spinner.prototype, {
style: extend(Object.create(Atomic.prototype.style), style$9)
});
Weex.registerComponent('spinner', Spinner);
Weex.registerComponent('loading-indicator', Spinner);
}
var Spinner = { init: init$29 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var isArray$1;
function handleMsg (web, evt) {
var msg = evt.data;
if (typeof msg === 'string') {
try {
msg = JSON.parse(msg);
}
catch (e) {}
}
if (!msg) {
return
}
if (msg.type === 'weex') {
if (!isArray$1(msg.content)) {
return console.error('[h5-render] weex msg received by web component.'
+ ' msg.content should be a array:', msg.content)
}
callNative(web.getComponentManager().instanceId, msg.content);
}
}
function getProto$4 (Weex) {
var Atomic = Weex.Atomic;
return {
create: function create () {
// Iframe's defect: can't use position:absolute and top, left, right,
// bottom all setting to zero and use margin to leave specified
// height for a blank area, and have to use 100% to fill the parent
// container, otherwise it will use a unwanted default size instead.
// Therefore a div as a iframe wrapper is needed here.
var node = document.createElement('div');
node.classList.add('weex-container');
this.web = document.createElement('iframe');
node.appendChild(this.web);
this.web.classList.add('weex-element');
this.web.style.width = '100%';
this.web.style.height = '100%';
this.web.style.border = 'none';
return node
},
bindEvents: function bindEvents (evts) {
Atomic.prototype.bindEvents.call(this, evts);
var that = this;
this.web.addEventListener('load', function (e) {
that.dispatchEvent('pagefinish', {
url: that.web.src
});
});
window.addEventListener('message', handleMsg.bind(null, this));
},
goBack: function goBack () {
this.web.contentWindow.history.back();
},
goForward: function goForward () {
this.web.contentWindow.history.forward();
},
reload: function reload () {
this.web.contentWindow.location.reload();
}
}
}
var attr$14 = {
src: function (val) {
this.web.src = val;
setTimeout(function () {
this.dispatchEvent('pagestart', { url: val });
}.bind(this), 0);
}
};
function init$30 (Weex) {
var Atomic = Weex.Atomic;
var extend = Weex.utils.extend;
isArray$1 = Weex.utils.isArray;
// A component to import web pages, which works like
// a iframe element or a webview.
// attrs:
// - src
// events:
// - pagestart
// - pagefinish
// - error
function Web (data) {
Atomic.call(this, data);
}
Web.prototype = Object.create(Atomic.prototype);
extend(Web.prototype, getProto$4(Weex));
extend(Web.prototype, { attr: attr$14 });
Weex.registerComponent('web', Web);
}
var Web = { init: init$30 };
__$styleInject(".weex-neighbor-item {\n position: absolute !important;\n top: 50% !important;\n left: 50% !important;\n -webkit-box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n}\n",undefined);
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global lib */
var DEFAULT_INTERVAL$1 = 3000;
var DEFAULT_NEIGHBOR_SPACE = 20;
var DEFAULT_NEIGHBOR_ALPHA = 0.6;
var DEFAULT_NEIGHBOR_SCALE = 0.8;
var TRANSITION_DURATION = 400;
var MAIN_SLIDE_SCALE = 0.9;
var MAIN_SLIDE_OPACITY = 1;
var extend$2;
var Component$3;
function idleWhenPageDisappear$1 (slider) {
function handlePageShow () {
slider.isPageShow = true;
slider.autoPlay && !slider.isDomRendering && slider.play();
}
function handlePageHide () {
slider.isPageShow = false;
slider.stop();
}
global.addEventListener('pageshow', handlePageShow);
global.addEventListener('pagehide', handlePageHide);
document.addEventListener('visibilitychange', function () {
if (document.visibilityState === 'visible') {
handlePageShow();
}
else if (document.visibilityState === 'hidden') {
handlePageHide();
}
});
}
function idleWhenDomRendering$1 (slider) {
global.addEventListener('renderend', function () {
slider.isDomRendering = false;
slider.autoPlay && slider.isPageShow && slider.play();
});
global.addEventListener('renderbegin', function () {
slider.isDomRendering = true;
slider.stop();
});
}
function _renderIndicators (slider, ct, data) {
data.extra.width = data.style.width || slider.width;
data.extra.height = data.style.height || slider.height;
var indicator = slider.getComponentManager().createElement(data);
indicator.parentRef = slider.data.ref;
indicator.slider = slider;
slider.indicator = indicator;
ct.appendChild(indicator.node);
}
function renderIndicators (slider, ct, data) {
setTimeout(function () { return _renderIndicators(slider, ct, data); }, 0);
}
function updateIndicators$1 (slider) {
slider.indicator && slider.indicator.setIndex(slider.currentIndex);
}
function transitionOnce (node, duration, timingFunc) {
var transitionStr = "all " + duration + "ms " + timingFunc;
node.style.webkitTransition = transitionStr;
node.style.transition = transitionStr;
setTimeout(function () {
node.style.webkitTransition = '';
node.style.transition = '';
}, duration);
}
function animateTransform (node, style, duration, timeFunction) {
transitionOnce(node, duration || TRANSITION_DURATION, timeFunction || 'ease');
for (var k in style) {
node.style[k] = style[k];
}
}
function transformSlide (slider, index) {
var node = slider.slides[index].node;
node.style.opacity = slider.neighborAlpha;
var transformStr = "scale(" + (slider.neighborScale) + ")";
node.style.webkitTransform = transformStr;
node.style.transform = transformStr;
node.style.width = slider.width + 'px';
node.style.height = slider.height + 'px';
node.style.position = 'absolute';
node.style.top = '0px';
node.style.left = '0px';
}
function loadImg (slider) {
var imgs1 = slider.node.querySelectorAll('[img-src]') || [];
var imgs2 = slider.node.querySelectorAll('[i-lazy-src]') || [];
function load (node) {
var src = node.getAttribute('img-src') || node.getAttribute('i-lazy-src');
lib.img.applySrc(node, src, node.dataset.placeholder);
}
for (var i = 0; i < imgs1.length; i++) {
load(imgs1[i]);
}
for (var i$1 = 0; i$1 < imgs2.length; i$1++) {
load(imgs2[i$1]);
}
}
function _doRender (slider) {
loadImg(slider);
slider.total = slider.slides.length;
slider.currentIndex = 0;
var width = slider.data.style.width || 0;
var height = slider.data.style.height || 0;
slider.width = parseFloat(width) || slider.node.getBoundingClientRect().width;
slider.height = parseFloat(height) || slider.node.getBoundingClientRect().height;
var l = slider.slides.length;
for (var i = 0; i < l; i++) {
transformSlide(slider, i);
}
setTimeout(function () { return slider.slideTo(0); }, 0);
}
function doRender$1 (slider) {
setTimeout(_doRender.bind(null, slider), 0);
}
function loopIndex (idx, total) {
if (total === 0) {
return 0
}
return (total + idx) % total
}
function autoPlay$1 (slider) {
var next = slider.currentIndex + 1;
setTimeout(function () { return slider.slideTo(next); }, 0);
slider.playTimer = setTimeout(function () { return autoPlay$1(slider); }, slider.interval + TRANSITION_DURATION);
}
function useGesture (slider) {
var node = slider.node;
var displacement, panning;
node.addEventListener('panstart', function (e) {
if (!e.isVertical) {
e.preventDefault();
e.stopPropagation();
slider.stop();
panning = true;
displacement = 0;
}
});
node.addEventListener('panmove', function (e) {
if (!e.isVertical && panning) {
e.preventDefault();
e.stopPropagation();
var displacement = e.displacementX;
moveSlides(slider, displacement);
}
});
node.addEventListener('panend', function (e) {
if (!e.isVertical && panning) {
e.preventDefault();
e.stopPropagation();
displacement = e.displacementX;
if (e.isSwipe) {
if (displacement < 0) {
slider.slideToNext();
}
else {
slider.slideToPrev();
}
}
else {
if (Math.abs(displacement) < slider.width / 2) {
slider.slideTo(slider.currentIndex);
}
else if (displacement < 0) {
slider.slideToNext();
}
else {
slider.slideToPrev();
}
}
panning = false;
slider.play();
}
});
node.addEventListener('swipe', function (e) {
if (!e.isVertical) {
e.preventDefault();
e.stopPropagation();
}
});
}
function moveSlides (slider, offset) {
var mainTransformStr = "translate(" + offset + "px, 0px) scale(" + MAIN_SLIDE_SCALE + ")";
var mainNode = slider.mainSlide.node;
mainNode.style.webkitTransform = mainTransformStr;
mainNode.style.transform = mainTransformStr;
var leftTransformStr = "translate(" + (slider.leftTranslate + offset) + "px, 0px) scale(" + (slider.neighborScale) + ")";
var leftNode = slider.leftSlide.node;
leftNode.style.webkitTransform = leftTransformStr;
leftNode.style.transform = leftTransformStr;
var rightTransformStr = "translate(" + (slider.rightTranslate + offset) + "px, 0px) scale(" + (slider.neighborScale) + ")";
var rightNode = slider.rightSlide.node;
rightNode.style.webkitTransform = rightTransformStr;
rightNode.style.transform = rightTransformStr;
}
function resetSideSlidePos (slider, side) {
var signMap = { left: '-', right: '' };
var transformStr = "translate(" + (signMap[side] + slider.width) + "px, 0px)";
var node = slider[side + 'Slide'].node;
node.style.webkitTransform = transformStr;
node.style.transform = transformStr;
}
function resetOutsideSlides (slider, indexArr) {
indexArr = indexArr || [];
var l = slider.slides.length;
for (var i = 0; i < l; i++) {
if (indexArr.indexOf(i) <= -1) {
slider.slides[i].node.style.opacity = 0;
}
}
}
var proto$14 = {
create: function create () {
var node = document.createElement('div');
this.node = node;
node.classList.add('slider-neighbor');
node.classList.add('weex-container');
this.style.flexDirection.call(this, 'row');
node.style.position = 'relative';
node.style.overflow = 'hidden';
return node
},
createChildren: function createChildren () {
var this$1 = this;
var componentManager = this.getComponentManager();
var children = this.data.children;
var fragment = document.createDocumentFragment();
if (children && children.length) {
for (var i = 0; i < children.length; i++) {
var child = (void 0);
var data = children[i];
data.instanceId = this$1.data.instanceId;
// 'indicator' maybe the last child of this component.
if (data.type !== 'indicator') {
child = componentManager.createElement(data);
child.node.classList.add('weex-neighbor-item');
var width = (data.style || {}).width || this$1.data.style.width;
var height = (data.style || {}).height || this$1.data.style.height;
child.node.style.marginTop = -(height / 2) + 'px';
child.node.style.marginLeft = -(width / 2) + 'px';
this$1.slides.push(child);
fragment.appendChild(child.node);
child.parentRef = this$1.data.ref;
}
else {
renderIndicators(this$1, fragment, extend$2(data, {
extra: {
amount: children.length - 1,
index: 0
}
}));
}
}
resetOutsideSlides(this, []);
this.node.appendChild(fragment);
doRender$1(this);
}
},
appendChild: function appendChild (data) {
var children = this.data.children;
var componentManager = this.getComponentManager();
var child;
if (data.type === 'indicator') {
renderIndicators(this, this.node, extend$2(data, {
extra: {
amount: children.length,
index: this.currentIndex
}
}));
}
else {
child = componentManager.createElement(data);
child.node.classList.add('weex-neighbor-item');
var width = (data.style || {}).width || this.data.style.width;
var height = (data.style || {}).height || this.data.style.height;
child.node.style.marginTop = -(height / 2) + 'px';
child.node.style.marginLeft = -(width / 2) + 'px';
this.slides.push(child);
resetOutsideSlides(this, []);
this.node.appendChild(child.node);
}
doRender$1(this);
if (!children || !children.length) {
this.data.children = [data];
}
else {
children.push(data);
}
return child || this.indicator
},
insertBefore: function insertBefore (child, before) {
var children = this.data.children;
var i = 0;
var slidesIdx = 0;
var isAppend = false;
if (!children || !children.length || !before) {
isAppend = true;
}
else {
var l;
for (l = children.length; i < l; i++) {
if (children[i].ref === before.data.ref) {
break
}
if (children[i].type !== 'indicator') {
slidesIdx++;
}
}
if (i === l) {
isAppend = true;
}
}
child.node.classList.add('weex-neighbor-item');
var data = child.data;
var width = (data.style || {}).width || this.data.style.width;
var height = (data.style || {}).height || this.data.style.height;
child.node.style.marginTop = -(height / 2) + 'px';
child.node.style.marginLeft = -(width / 2) + 'px';
if (isAppend) {
this.node.appendChild(child.node);
this.slides.push(child);
resetOutsideSlides(this, []);
children.push(child.data);
}
else {
this.node.insertBefore(child.node, before.node);
this.slides.splice(slidesIdx, 0, child);
children.splice(i, 0, child.data);
}
doRender$1(this);
},
removeChild: function removeChild (child) {
var children = this.data.children;
var i = 0;
var slidesIdx = 0;
if (children && children.length) {
var l;
for (l = children.length; i < l; i++) {
if (children[i].ref === child.data.ref) {
break
}
if (children[i].type !== 'indicator') {
slidesIdx++;
}
}
if (i < l) {
children.splice(i, 1);
this.slides.splice(slidesIdx, 1);
resetOutsideSlides(this, []);
}
}
this.getComponentManager().removeComponent(child.data.ref);
child.node.parentNode.removeChild(child.node);
doRender$1(this);
},
onAppend: function onAppend () {
this.slideTo(0);
useGesture(this);
Component$3.prototype.onAppend.call(this);
},
play: function play () {
// start playing
this.playTimer && clearTimeout(this.playTimer);
if (this.playstatus/* && !this.toggleOff*/) {
this.playTimer = setTimeout(autoPlay$1.bind(null, this), this.interval);
}
},
stop: function stop () {
// stop playing
this.playTimer && clearTimeout(this.playTimer);
},
slideTo: function slideTo (index, restartAutoplay) {
var this$1 = this;
var total = this.slides.length;
if (total === 0) {
return
}
if (restartAutoplay) {
this.stop();
setTimeout(function () { return this$1.play(); }, 100);
}
var origIdx = index;
index = loopIndex(origIdx, total);
var leftIndex = loopIndex(index - 1, total);
var rightIndex = loopIndex(index + 1, total);
this.mainSlide = this.slides[index];
this.leftSlide = this.slides[loopIndex(index - 1, total)];
this.rightSlide = this.slides[loopIndex(index + 1, total)];
var mainTransformStr = "translate(0px, 0px) scale(" + MAIN_SLIDE_SCALE + ")";
setTimeout(function () { return animateTransform(this$1.mainSlide.node, {
webkitTransform: mainTransformStr,
transform: mainTransformStr,
opacity: MAIN_SLIDE_OPACITY,
zIndex: 99
}); }, 100);
var translateX = this.width
- this.width * (1 - this.neighborScale) / 2
- this.neighborSpace;
this.leftTranslate = -translateX;
this.rightTranslate = translateX;
if (origIdx > this.currentIndex) {
resetSideSlidePos(this, 'right');
}
else if (origIdx < this.currentIndex) {
resetSideSlidePos(this, 'left');
}
var leftTransformStr = "translate(" + (-translateX + 'px') + ", 0px) scale(" + (this.neighborScale) + ")";
setTimeout(function () { return animateTransform(this$1.leftSlide.node, {
webkitTransform: leftTransformStr,
transform: leftTransformStr,
opacity: this$1.neighborAlpha,
zIndex: 1
}); }, 100);
var rightTransformStr = "translate(" + (translateX + 'px') + ", 0px) scale(" + (this.neighborScale) + ")";
setTimeout(function () { return animateTransform(this$1.rightSlide.node, {
webkitTransform: rightTransformStr,
transform: rightTransformStr,
opacity: this$1.neighborAlpha,
zIndex: 1
}); }, 100);
resetOutsideSlides(this, [index, leftIndex, rightIndex]);
this.currentIndex = index;
updateIndicators$1(this);
this.dispatchEvent('change', { index: this.currentIndex });
},
slideToPrev: function slideToPrev () {
this.slideTo(this.currentIndex - 1);
},
slideToNext: function slideToNext () {
this.slideTo(this.currentIndex + 1);
}
};
var attr$15 = {
interval: function (val) {
this.interval = parseInt(val) || DEFAULT_INTERVAL$1;
},
index: function (val) {
var _this = this;
function doSlide (index) {
index = parseInt(index);
if (index < 0 || isNaN(index)) {
return console.error('[h5-render] invalid index ', index)
}
_this.stop();
_this.slideTo(index);
_this.autoPlay && _this.isPageShow && _this.play();
if (_this._updateIndex) {
window.removeEventListener('renderend', _this._updateIndex);
}
}
if (this.isDomRendering) {
var pre = !!this._updateIndex;
this._updateIndex = function () {
doSlide(val);
};
!pre && window.addEventListener('renderend', this._updateIndex);
}
else {
doSlide(val);
}
},
playstatus: function (val) {
var _this = this;
this.playstatus = val && val !== 'false';
this.autoPlay = this.playstatus;
function doPlay () {
_this.isPageShow && _this.play();
if (_this._updatePlaystatus) {
window.removeEventListener('renderend', _this._updatePlaystatus);
}
}
if (this.playstatus) {
if (this.isDomRendering) {
var pre = !!this._updatePlaystatus;
this._updatePlaystatus = function () {
doPlay();
};
!pre && window.addEventListener('renderend', this._updatePlaystatus);
}
else {
doPlay();
}
}
else {
this.stop();
}
},
// support playstatus' alias auto-play for compatibility
autoPlay: function (val) {
this.attr.playstatus.call(this, val);
},
neighborSpace: function neighborSpace (val) {
var ns = parseFloat(val);
if (!isNaN(ns) && ns >= 0) {
this.neighborSpace = ns;
}
else {
console.warn(("[h5-render] invalid value for 'neighbor-space' of slider-neighbor: " + val + "."));
}
},
neighborAlpha: function neighborAlpha (val) {
var na = parseFloat(val);
if (!isNaN(na) && na >= 0 && na <= 1) {
this.neighborAlpha = na;
}
else {
console.warn(("[h5-render] invalid value for 'neighbor-alpha' of slider-neighbor: " + val + "."));
}
},
neighborScale: function neighborScale (val) {
var ns = parseFloat(val);
if (!isNaN(ns) && ns >= 0 && ns <= 1) {
this.neighborScale = ns;
}
else {
console.warn(("[h5-render] invalid value for 'neighbor-scale' of slider-neighbor: " + val + "."));
}
}
};
var event$5 = {
change: {
updator: function () {
return {
attrs: {
index: this.currentIndex
}
}
}
}
};
function init$31 (Weex) {
Component$3 = Weex.Component;
extend$2 = Weex.utils.extend;
/**
* data.attr
* support slider's attributes and three
* @param {number} neighbor-space 0 - 375, the exposing width of slides on both other sides.
* @param {number} neighbor-alpha 0 - 1, opacity of both other sides of slides, default is 0.6.
* @param {number} neighbor-scale 0 - 1, the scale of both other sides of slides, default is 0.8.
*/
function SliderNeighbor (data) {
this.autoPlay = false; // default value is false.
this.interval = DEFAULT_INTERVAL$1;
this.direction = 'row'; // 'column' is not temporarily supported.
this.slides = [];
this.isPageShow = true;
this.isDomRendering = true;
this.currentIndex = 0;
this.neighborSpace = DEFAULT_NEIGHBOR_SPACE;
this.neighborAlpha = DEFAULT_NEIGHBOR_ALPHA;
this.neighborScale = DEFAULT_NEIGHBOR_SCALE;
// bind event 'pageshow', 'pagehide' and 'visibilitychange' on window.
idleWhenPageDisappear$1(this);
// bind event 'renderBegin' and 'renderEnd' on window.
idleWhenDomRendering$1(this);
Component$3.call(this, data);
}
SliderNeighbor.prototype = Object.create(Component$3.prototype);
extend$2(SliderNeighbor.prototype, proto$14);
extend$2(SliderNeighbor.prototype, { attr: attr$15 });
extend$2(SliderNeighbor.prototype, { event: event$5 });
Weex.registerComponent('slider-neighbor', SliderNeighbor);
}
var Neighbor = { init: init$31 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var displayMap = {
a: 'inline',
image: 'inline-block',
span: 'inline-block'
};
var typeMap$1 = {
a: 'a',
image: 'image',
span: 'text'
};
var _richTextNodeRef = 0;
var getRichTextNodeRef = function () {
return ("rtn-" + (_richTextNodeRef++))
};
function _isArray (arr) {
return Object.prototype.toString.call(arr).slice(8, -1) === 'Array'
}
function _isPlainObject (obj) {
return Object.prototype.toString.call(obj).slice(8, -1) === 'Object'
}
function _parse (parent, parentNode, value) {
if (_isArray(value)) {
return value.forEach(function (node) { return _parse(parent, parentNode, node); })
}
if (_isPlainObject(value)) {
var type = value.type;
var attr = value.attr;
var style = value.style;
var children = value.children;
// don't pass children to componnent's own `createChildren` method.
// otherwise there's no chance to set children's display to `inline`.
delete value.children;
var comp = parent.getComponentManager().createElement({
type: typeMap$1[type],
ref: getRichTextNodeRef(),
attr: attr,
style: style
});
comp.node.style.display = displayMap[type];
parentNode.appendChild(comp.node);
if (_isArray(children)) {
children.forEach(function (child) { return _parse(comp, comp.node, child); });
}
}
}
var proto$15 = {
create: function create () {
var node = document.createElement('div');
node.classList.add('weex-element');
node.classList.add('weex-richtext');
return node
},
parse: function parse () {
var this$1 = this;
Array.prototype.slice.call(this.node.children)
.forEach(function (child) { return this$1.node.removeChild(child); });
if (!this.value) {
return
}
_parse(this, this.node, this.value);
}
};
// updatable attributes
var attr$16 = {
value: function value (val) {
this.value = val;
this.parse();
}
};
function init$32 (Weex) {
var Atomic = Weex.Atomic;
var extend = Weex.utils.extend;
/**
* attrs:
* - value
*/
function RichText (data) {
Atomic.call(this, data);
}
RichText.prototype = Object.create(Atomic.prototype);
extend(RichText.prototype, proto$15);
extend(RichText.prototype, { attr: attr$16 });
Weex.registerComponent('richtext', RichText);
}
var Richtext = { init: init$32 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* config:
* - styles
* - duration [Number] milliseconds(ms)
* - timingFunction [string]
* - dealy [Number] milliseconds(ms)
*/
function transitionOnce$1 (comp, config, callback) {
var styles = config.styles || {};
var duration = config.duration || 1000; // ms
var timingFunction = config.timingFunction || 'ease';
var delay = config.delay || 0; // ms
var transitionValue = 'all ' + duration + 'ms '
+ timingFunction + ' ' + delay + 'ms';
var dom = comp.node;
var transitionEndHandler = function (e) {
e.stopPropagation();
dom.removeEventListener('webkitTransitionEnd', transitionEndHandler);
dom.removeEventListener('transitionend', transitionEndHandler);
dom.style.transition = '';
dom.style.webkitTransition = '';
callback();
};
dom.style.transition = transitionValue;
dom.style.webkitTransition = transitionValue;
dom.addEventListener('webkitTransitionEnd', transitionEndHandler);
dom.addEventListener('transitionend', transitionEndHandler);
comp.updateStyle(styles);
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var _data = {};
var animation = {
/**
* transition
* @param {string} ref [description]
* @param {obj} config [description]
* @param {string} callbackId [description]
*/
transition: function (ref, config, callbackId) {
var refData = _data[ref];
var stylesKey = JSON.stringify(config.styles);
var weexInstance = this;
// If the same component perform a animation with exactly the same
// styles in a sequence with so short interval that the prev animation
// is still in playing, then the next animation should be ignored.
if (refData && refData[stylesKey]) {
return
}
if (!refData) {
refData = _data[ref] = {};
}
refData[stylesKey] = true;
var component = this.getComponentManager().getComponent(ref);
return transitionOnce$1(component, config, function () {
// Remove the stylesKey in refData so that the same animation
// can be played again after current animation is already finished.
delete refData[stylesKey];
weexInstance.sender.performCallback(callbackId);
})
}
};
var meta = {
animation: [{
name: 'transition',
args: ['string', 'object', 'function']
}]
};
var Animation = {
init: function (Weex) {
Weex.registerApiModule('animation', animation, meta);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
AUCTION:
taskQueue
Clipboard.setString() NOW not works, facing to user-act lose of taskQueue.
works in Chrome Firefox Opera. but not in Safari.
@see https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand#Browser_compatibility
Clipboard.getString() unimplemented. There is no easy way to do paste from clipboard to js variable.
So look out your app behavior, when downgrade to html5 render.
Any idea is welcome.
**/
var WEEX_CLIPBOARD_ID = '__weex_clipboard_id__';
var clipboard = {
getString: function (callbackId) {
// not supported in html5
console.log('clipboard.getString() is not supported now.');
},
setString: function (text) {
// not support safari
if (typeof text === 'string' && text !== '' && document.execCommand) {
var tempInput = element();
tempInput.value = text;
tempInput.select();
document.execCommand('copy');
// var out = document.execCommand('copy');
// console.log("execCommand out is " + out);
tempInput.value = '';
tempInput.blur();
}
else {
console.log('only support string input now');
}
}
};
function element () {
var tempInput = document.getElementById(WEEX_CLIPBOARD_ID);
if (!tempInput) {
tempInput = document.createElement('input');
tempInput.setAttribute('id', WEEX_CLIPBOARD_ID);
tempInput.style.cssText = 'height:1px;width:1px;border:none;';
// tempInput.style.cssText = "height:40px;width:300px;border:solid;"
document.body.appendChild(tempInput);
}
return tempInput
}
var meta$1 = {
clipboard: [{
name: 'getString',
args: ['function']
}, {
name: 'setString',
args: ['string']
}]
};
var Clipboard = {
init: function (Weex) {
Weex.registerApiModule('clipboard', clipboard, meta$1);
}
};
/**
* Expose `Emitter`.
*/
var index$5 = Emitter$1;
/**
* Initialize a new `Emitter`.
*
* @api public
*/
function Emitter$1(obj) {
if (obj) { return mixin(obj); }
}
/**
* Mixin the emitter properties.
*
* @param {Object} obj
* @return {Object}
* @api private
*/
function mixin(obj) {
for (var key in Emitter$1.prototype) {
obj[key] = Emitter$1.prototype[key];
}
return obj;
}
/**
* Listen on the given `event` with `fn`.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter$1.prototype.on =
Emitter$1.prototype.addEventListener = function(event, fn){
this._callbacks = this._callbacks || {};
(this._callbacks['$' + event] = this._callbacks['$' + event] || [])
.push(fn);
return this;
};
/**
* Adds an `event` listener that will be invoked a single
* time then automatically removed.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter$1.prototype.once = function(event, fn){
function on() {
this.off(event, on);
fn.apply(this, arguments);
}
on.fn = fn;
this.on(event, on);
return this;
};
/**
* Remove the given callback for `event` or all
* registered callbacks.
*
* @param {String} event
* @param {Function} fn
* @return {Emitter}
* @api public
*/
Emitter$1.prototype.off =
Emitter$1.prototype.removeListener =
Emitter$1.prototype.removeAllListeners =
Emitter$1.prototype.removeEventListener = function(event, fn){
this._callbacks = this._callbacks || {};
// all
if (0 == arguments.length) {
this._callbacks = {};
return this;
}
// specific event
var callbacks = this._callbacks['$' + event];
if (!callbacks) { return this; }
// remove all handlers
if (1 == arguments.length) {
delete this._callbacks['$' + event];
return this;
}
// remove specific handler
var cb;
for (var i = 0; i < callbacks.length; i++) {
cb = callbacks[i];
if (cb === fn || cb.fn === fn) {
callbacks.splice(i, 1);
break;
}
}
return this;
};
/**
* Emit `event` with the given args.
*
* @param {String} event
* @param {Mixed} ...
* @return {Emitter}
*/
Emitter$1.prototype.emit = function(event){
var this$1 = this;
this._callbacks = this._callbacks || {};
var args = [].slice.call(arguments, 1)
, callbacks = this._callbacks['$' + event];
if (callbacks) {
callbacks = callbacks.slice(0);
for (var i = 0, len = callbacks.length; i < len; ++i) {
callbacks[i].apply(this$1, args);
}
}
return this;
};
/**
* Return array of callbacks for `event`.
*
* @param {String} event
* @return {Array}
* @api public
*/
Emitter$1.prototype.listeners = function(event){
this._callbacks = this._callbacks || {};
return this._callbacks['$' + event] || [];
};
/**
* Check if this emitter has `event` handlers.
*
* @param {String} event
* @return {Boolean}
* @api public
*/
Emitter$1.prototype.hasListeners = function(event){
return !! this.listeners(event).length;
};
/**
* toString ref.
*/
var toString$3 = Object.prototype.toString;
/**
* Return the type of `val`.
*
* @param {Mixed} val
* @return {String}
* @api public
*/
var index$9 = function(val){
switch (toString$3.call(val)) {
case '[object Date]': return 'date';
case '[object RegExp]': return 'regexp';
case '[object Arguments]': return 'arguments';
case '[object Array]': return 'array';
case '[object Error]': return 'error';
}
if (val === null) { return 'null'; }
if (val === undefined) { return 'undefined'; }
if (val !== val) { return 'nan'; }
if (val && val.nodeType === 1) { return 'element'; }
val = val.valueOf
? val.valueOf()
: Object.prototype.valueOf.apply(val);
return typeof val;
};
/**
* Module dependencies.
*/
var type$2;
try {
type$2 = index$9;
} catch (_) {
type$2 = index$9;
}
/**
* Module exports.
*/
var index$7 = clone$1;
/**
* Clones objects.
*
* @param {Mixed} any object
* @api public
*/
function clone$1(obj){
switch (type$2(obj)) {
case 'object':
var copy = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = clone$1(obj[key]);
}
}
return copy;
case 'array':
var copy = new Array(obj.length);
for (var i = 0, l = obj.length; i < l; i++) {
copy[i] = clone$1(obj[i]);
}
return copy;
case 'regexp':
// from millermedeiros/amd-utils - MIT
var flags = '';
flags += obj.multiline ? 'm' : '';
flags += obj.global ? 'g' : '';
flags += obj.ignoreCase ? 'i' : '';
return new RegExp(obj.source, flags);
case 'date':
return new Date(obj.getTime());
default: // string, number, boolean, …
return obj;
}
}
var index$11 = createCommonjsModule(function (module, exports) {
// easing functions from "Tween.js"
exports.linear = function(n){
return n;
};
exports.inQuad = function(n){
return n * n;
};
exports.outQuad = function(n){
return n * (2 - n);
};
exports.inOutQuad = function(n){
n *= 2;
if (n < 1) { return 0.5 * n * n; }
return - 0.5 * (--n * (n - 2) - 1);
};
exports.inCube = function(n){
return n * n * n;
};
exports.outCube = function(n){
return --n * n * n + 1;
};
exports.inOutCube = function(n){
n *= 2;
if (n < 1) { return 0.5 * n * n * n; }
return 0.5 * ((n -= 2 ) * n * n + 2);
};
exports.inQuart = function(n){
return n * n * n * n;
};
exports.outQuart = function(n){
return 1 - (--n * n * n * n);
};
exports.inOutQuart = function(n){
n *= 2;
if (n < 1) { return 0.5 * n * n * n * n; }
return -0.5 * ((n -= 2) * n * n * n - 2);
};
exports.inQuint = function(n){
return n * n * n * n * n;
};
exports.outQuint = function(n){
return --n * n * n * n * n + 1;
};
exports.inOutQuint = function(n){
n *= 2;
if (n < 1) { return 0.5 * n * n * n * n * n; }
return 0.5 * ((n -= 2) * n * n * n * n + 2);
};
exports.inSine = function(n){
return 1 - Math.cos(n * Math.PI / 2 );
};
exports.outSine = function(n){
return Math.sin(n * Math.PI / 2);
};
exports.inOutSine = function(n){
return .5 * (1 - Math.cos(Math.PI * n));
};
exports.inExpo = function(n){
return 0 == n ? 0 : Math.pow(1024, n - 1);
};
exports.outExpo = function(n){
return 1 == n ? n : 1 - Math.pow(2, -10 * n);
};
exports.inOutExpo = function(n){
if (0 == n) { return 0; }
if (1 == n) { return 1; }
if ((n *= 2) < 1) { return .5 * Math.pow(1024, n - 1); }
return .5 * (-Math.pow(2, -10 * (n - 1)) + 2);
};
exports.inCirc = function(n){
return 1 - Math.sqrt(1 - n * n);
};
exports.outCirc = function(n){
return Math.sqrt(1 - (--n * n));
};
exports.inOutCirc = function(n){
n *= 2;
if (n < 1) { return -0.5 * (Math.sqrt(1 - n * n) - 1); }
return 0.5 * (Math.sqrt(1 - (n -= 2) * n) + 1);
};
exports.inBack = function(n){
var s = 1.70158;
return n * n * (( s + 1 ) * n - s);
};
exports.outBack = function(n){
var s = 1.70158;
return --n * n * ((s + 1) * n + s) + 1;
};
exports.inOutBack = function(n){
var s = 1.70158 * 1.525;
if ( ( n *= 2 ) < 1 ) { return 0.5 * ( n * n * ( ( s + 1 ) * n - s ) ); }
return 0.5 * ( ( n -= 2 ) * n * ( ( s + 1 ) * n + s ) + 2 );
};
exports.inBounce = function(n){
return 1 - exports.outBounce(1 - n);
};
exports.outBounce = function(n){
if ( n < ( 1 / 2.75 ) ) {
return 7.5625 * n * n;
} else if ( n < ( 2 / 2.75 ) ) {
return 7.5625 * ( n -= ( 1.5 / 2.75 ) ) * n + 0.75;
} else if ( n < ( 2.5 / 2.75 ) ) {
return 7.5625 * ( n -= ( 2.25 / 2.75 ) ) * n + 0.9375;
} else {
return 7.5625 * ( n -= ( 2.625 / 2.75 ) ) * n + 0.984375;
}
};
exports.inOutBounce = function(n){
if (n < .5) { return exports.inBounce(n * 2) * .5; }
return exports.outBounce(n * 2 - 1) * .5 + .5;
};
// aliases
exports['in-quad'] = exports.inQuad;
exports['out-quad'] = exports.outQuad;
exports['in-out-quad'] = exports.inOutQuad;
exports['in-cube'] = exports.inCube;
exports['out-cube'] = exports.outCube;
exports['in-out-cube'] = exports.inOutCube;
exports['in-quart'] = exports.inQuart;
exports['out-quart'] = exports.outQuart;
exports['in-out-quart'] = exports.inOutQuart;
exports['in-quint'] = exports.inQuint;
exports['out-quint'] = exports.outQuint;
exports['in-out-quint'] = exports.inOutQuint;
exports['in-sine'] = exports.inSine;
exports['out-sine'] = exports.outSine;
exports['in-out-sine'] = exports.inOutSine;
exports['in-expo'] = exports.inExpo;
exports['out-expo'] = exports.outExpo;
exports['in-out-expo'] = exports.inOutExpo;
exports['in-circ'] = exports.inCirc;
exports['out-circ'] = exports.outCirc;
exports['in-out-circ'] = exports.inOutCirc;
exports['in-back'] = exports.inBack;
exports['out-back'] = exports.outBack;
exports['in-out-back'] = exports.inOutBack;
exports['in-bounce'] = exports.inBounce;
exports['out-bounce'] = exports.outBounce;
exports['in-out-bounce'] = exports.inOutBounce;
});
/**
* Module dependencies.
*/
var Emitter = index$5;
var clone = index$7;
var type$1 = index$9;
var ease = index$11;
/**
* Expose `Tween`.
*/
var index$3 = Tween$1;
/**
* Initialize a new `Tween` with `obj`.
*
* @param {Object|Array} obj
* @api public
*/
function Tween$1(obj) {
if (!(this instanceof Tween$1)) { return new Tween$1(obj); }
this._from = obj;
this.ease('linear');
this.duration(500);
}
/**
* Mixin emitter.
*/
Emitter(Tween$1.prototype);
/**
* Reset the tween.
*
* @api public
*/
Tween$1.prototype.reset = function(){
this.isArray = 'array' === type$1(this._from);
this._curr = clone(this._from);
this._done = false;
this._start = Date.now();
return this;
};
/**
* Tween to `obj` and reset internal state.
*
* tween.to({ x: 50, y: 100 })
*
* @param {Object|Array} obj
* @return {Tween} self
* @api public
*/
Tween$1.prototype.to = function(obj){
this.reset();
this._to = obj;
return this;
};
/**
* Set duration to `ms` [500].
*
* @param {Number} ms
* @return {Tween} self
* @api public
*/
Tween$1.prototype.duration = function(ms){
this._duration = ms;
return this;
};
/**
* Set easing function to `fn`.
*
* tween.ease('in-out-sine')
*
* @param {String|Function} fn
* @return {Tween}
* @api public
*/
Tween$1.prototype.ease = function(fn){
fn = 'function' == typeof fn ? fn : ease[fn];
if (!fn) { throw new TypeError('invalid easing function'); }
this._ease = fn;
return this;
};
/**
* Stop the tween and immediately emit "stop" and "end".
*
* @return {Tween}
* @api public
*/
Tween$1.prototype.stop = function(){
this.stopped = true;
this._done = true;
this.emit('stop');
this.emit('end');
return this;
};
/**
* Perform a step.
*
* @return {Tween} self
* @api private
*/
Tween$1.prototype.step = function(){
if (this._done) { return; }
// duration
var duration = this._duration;
var now = Date.now();
var delta = now - this._start;
var done = delta >= duration;
// complete
if (done) {
this._from = this._to;
this._update(this._to);
this._done = true;
this.emit('end');
return this;
}
// tween
var from = this._from;
var to = this._to;
var curr = this._curr;
var fn = this._ease;
var p = (now - this._start) / duration;
var n = fn(p);
// array
if (this.isArray) {
for (var i = 0; i < from.length; ++i) {
curr[i] = from[i] + (to[i] - from[i]) * n;
}
this._update(curr);
return this;
}
// objech
for (var k in from) {
curr[k] = from[k] + (to[k] - from[k]) * n;
}
this._update(curr);
return this;
};
/**
* Set update function to `fn` or
* when no argument is given this performs
* a "step".
*
* @param {Function} fn
* @return {Tween} self
* @api public
*/
Tween$1.prototype.update = function(fn){
if (0 == arguments.length) { return this.step(); }
this._update = fn;
return this;
};
var index$13 = createCommonjsModule(function (module, exports) {
/**
* Expose `requestAnimationFrame()`.
*/
exports = module.exports = window.requestAnimationFrame
|| window.webkitRequestAnimationFrame
|| window.mozRequestAnimationFrame
|| fallback;
/**
* Fallback implementation.
*/
var prev = new Date().getTime();
function fallback(fn) {
var curr = new Date().getTime();
var ms = Math.max(0, 16 - (curr - prev));
var req = setTimeout(fn, ms);
prev = curr;
return req;
}
/**
* Cancel.
*/
var cancel = window.cancelAnimationFrame
|| window.webkitCancelAnimationFrame
|| window.mozCancelAnimationFrame
|| window.clearTimeout;
exports.cancel = function(id){
cancel.call(window, id);
};
});
/**
* Module dependencies.
*/
var Tween = index$3;
var raf$1 = index$13;
/**
* Expose `scrollTo`.
*/
var index$2 = scrollTo;
/**
* Scroll to `(x, y)`.
*
* @param {Number} x
* @param {Number} y
* @api public
*/
function scrollTo(x, y, options) {
options = options || {};
// start position
var start = scroll();
// setup tween
var tween = Tween(start)
.ease(options.ease || 'out-circ')
.to({ top: y, left: x })
.duration(options.duration || 1000);
// scroll
tween.update(function(o){
window.scrollTo(o.left | 0, o.top | 0);
});
// handle end
tween.on('end', function(){
animate = function(){};
});
// animate
function animate() {
raf$1(animate);
tween.update();
}
animate();
return tween;
}
/**
* Return scroll position.
*
* @return {Object}
* @api private
*/
function scroll() {
var y = window.pageYOffset || document.documentElement.scrollTop;
var x = window.pageXOffset || document.documentElement.scrollLeft;
return { top: y, left: x };
}
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var camelToKebab$1;
var appendStyle$2;
var dom = {
/**
* createBody: create root component
* @param {object} element
* container|listview|scrollview
* @return {[type]} [description]
*/
createBody: function (element) {
var componentManager = this.getComponentManager();
element.instanceId = componentManager.instanceId;
return componentManager.createBody(element)
},
addElement: function (parentRef, element, index) {
var componentManager = this.getComponentManager();
element.instanceId = componentManager.instanceId;
return componentManager.addElement(parentRef, element, index)
},
removeElement: function (ref) {
var componentManager = this.getComponentManager();
return componentManager.removeElement(ref)
},
moveElement: function (ref, parentRef, index) {
var componentManager = this.getComponentManager();
return componentManager.moveElement(ref, parentRef, index)
},
addEvent: function (ref, type) {
var componentManager = this.getComponentManager();
return componentManager.addEvent(ref, type)
},
removeEvent: function (ref, type) {
var componentManager = this.getComponentManager();
return componentManager.removeEvent(ref, type)
},
/**
* updateAttrs: update attributes of component
* @param {string} ref
* @param {obj} attr
*/
updateAttrs: function (ref, attr) {
var componentManager = this.getComponentManager();
return componentManager.updateAttrs(ref, attr)
},
/**
* updateStyle: udpate style of component
* @param {string} ref
* @param {obj} style
*/
updateStyle: function (ref, style) {
var componentManager = this.getComponentManager();
return componentManager.updateStyle(ref, style)
},
/**
* scrollToElement
* @param {string} ref
* @param {obj} options {offset:Number}
* ps: scroll-to has 'ease' and 'duration'(ms) as options.
*/
scrollToElement: function (ref, options) {
!options && (options = {});
var offset = Number(options.offset) || 0;
var elem = this.getComponentManager().getComponent(ref);
if (!elem) {
return console.error(("[h5-render] component of ref " + ref + " doesn't exist."))
}
var parentScroller = elem.getParentScroller();
if (parentScroller) {
parentScroller.scroller.scrollToElement(elem.node, true, offset);
}
else {
var offsetTop = elem.node.getBoundingClientRect().top
+ document.body.scrollTop;
var tween = index$2(0, offsetTop + offset, options);
tween.on('end', function () {
console.log('scroll end.');
});
}
},
/**
* getComponentRect
* @param {string} ref
* @param {function} callbackId
*/
getComponentRect: function (ref, callbackId) {
var info = { result: false };
if (ref && ref === 'viewport') {
info.result = true;
info.size = {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
top: 0,
left: 0,
right: document.documentElement.clientWidth,
bottom: document.documentElement.clientHeight
};
}
else {
var elem = this.getComponentManager().getComponent(ref);
if (elem && elem.node) {
info.result = true;
info.size = elem.node.getBoundingClientRect();
}
}
var message = info.result ? info : {
result: false,
errMsg: 'Illegal parameter'
};
this.sender.performCallback(callbackId, message);
return message
},
/**
* for adding fontFace
* @param {string} key fontFace
* @param {object} styles rules
*/
addRule: function (key, styles) {
key = camelToKebab$1(key);
var stylesText = '';
for (var k in styles) {
if (styles.hasOwnProperty(k)) {
stylesText += camelToKebab$1(k) + ':' + styles[k] + ';';
}
}
var styleText = "@" + key + "{" + stylesText + "}";
appendStyle$2(styleText, 'dom-added-rules');
},
createFinish: function createFinish (callback) {
return this.getComponentManager().createFinish()
},
updateFinish: function updateFinish (callback) {
return this.getComponentManager().updateFinish()
},
refreshFinish: function refreshFinish (callback) {
return this.getComponentManager().refreshFinish()
}
};
var meta$2 = {
dom: [{
name: 'createBody',
args: ['object']
}, {
name: 'addElement',
args: ['string', 'object', 'number']
}, {
name: 'removeElement',
args: ['string']
}, {
name: 'moveElement',
args: ['string', 'string', 'number']
}, {
name: 'addEvent',
args: ['string', 'string']
}, {
name: 'removeEvent',
args: ['string', 'string']
}, {
name: 'updateAttrs',
args: ['string', 'object']
}, {
name: 'updateStyle',
args: ['string', 'object']
}, {
name: 'createFinish',
args: []
}, {
name: 'updateFinish',
args: []
}, {
name: 'refreshFinish',
args: []
}, {
name: 'scrollToElement',
args: ['string', 'object']
}, {
name: 'getComponentRect',
args: ['string', 'function']
}, {
name: 'addRule',
args: ['string', 'object']
}]
};
var Dom = {
init: function (Weex) {
camelToKebab$1 = Weex.utils.camelToKebab;
appendStyle$2 = Weex.utils.appendStyle;
Weex.registerApiModule('dom', dom, meta$2);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var event$6 = {
/**
* openUrl
* @param {string} url
*/
openURL: function (url) {
location.href = url;
}
};
var meta$3 = {
event: [{
name: 'openURL',
args: ['string']
}]
};
var Event$1 = {
init: function (Weex) {
Weex.registerApiModule('event', event$6, meta$3);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var supportGeolocation = 'geolocation' in navigator;
var errorMsg = "[h5-render]: browser doesn't support geolocation.";
var geolocation = {
// options:
// - enableHighAccuracy optional, value is true or false, false by default.
// - timeout [none-native] optional, value is a number (milliseconds), default vaule is FINFINITY.
// - maximumAge [none-native] optional, value is a number (milliseconds), default value is 0.
getCurrentPosition: function getCurrentPosition (successCbId, errorCbId, options) {
var this$1 = this;
var successCb = function (pos) { return this$1.sender.performCallback(successCbId, pos); };
var errorCb = function (err) { return this$1.sender.performCallback(errorCbId, err); };
if (supportGeolocation) {
navigator.geolocation.getCurrentPosition(successCb, errorCb, options);
}
else {
console.warn(errorMsg);
errorCb(new Error(errorMsg));
}
},
// options: the same with `getCurrentPosition`.
watchPosition: function watchPosition (successCbId, errorCbId, options) {
var this$1 = this;
var successCb = function (pos) { return this$1.sender.performCallback(successCbId, pos, true); };
var errorCb = function (err) { return this$1.sender.performCallback(errorCbId, err); };
if (supportGeolocation) {
var id = navigator.geolocation.watchPosition(function (pos) {
pos.watchId = id;
successCb(pos);
}, errorCb, options);
}
else {
console.warn(errorMsg);
errorCb(new Error(errorMsg));
}
},
clearWatch: function clearWatch (watchId) {
if (supportGeolocation) {
navigator.geolocation.clearWatch(watchId);
}
else {
console.warn(errorMsg);
}
}
};
var meta$4 = {
geolocation: [{
name: 'getCurrentPosition',
args: ['function', 'function', 'object']
}, {
name: 'watchPosition',
args: ['function', 'function', 'object']
}, {
name: 'clearWatch',
args: ['string']
}]
};
var Geolocation = {
init: function init (Weex) {
Weex.registerApiModule('geolocation', geolocation, meta$4);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// track varies kinds of events and listeners.
var handlerTraker = {};
var globalEvent = {
/**
* addEventListener
* @param {string} evt - the event name to add a listener on.
*/
addEventListener: function addEventListener (evt, callbackId) {
var this$1 = this;
var cb = function (e) { return this$1.sender.performCallback(callbackId, e, true); };
if (!handlerTraker[evt]) {
handlerTraker[evt] = [cb];
}
else {
handlerTraker[evt].push(cb);
}
document.addEventListener(evt, cb);
},
/**
* removeEventListener
* @param {string} evt - the event name to remove a listener from.
*/
removeEventListener: function removeEventListener (evt) {
handlerTraker[evt].forEach(function (cb) { return document.removeEventListener(evt, cb); });
}
};
var meta$5 = {
globalEvent: [{
name: 'addEventListener',
args: ['string', 'function']
}, {
name: 'removeEventListener',
args: ['string']
}]
};
var GlobalEvent = {
init: function init (Weex) {
Weex.registerApiModule('globalEvent', globalEvent, meta$5);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var metaModule = {
/**
* setViewport
* @param {object} config
* - width: number | 'device-width'
*/
setViewport: function (config) {
document.querySelector('meta[name=viewport]').setAttribute('content', ("width=" + (config.width) + ", user-scalable=no"));
}
};
var meta$6 = {
meta: [{
name: 'setViewport',
args: ['object']
}]
};
var Meta = {
init: function (Weex) {
Weex.registerApiModule('meta', metaModule, meta$6);
}
};
__$styleInject(".amfe-modal-wrap {\n display: none;\n position: fixed;\n z-index: 999999999;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: #000;\n opacity: 0.5;\n}\n\n.amfe-modal-node {\n position: fixed;\n z-index: 9999999999;\n top: 50%;\n left: 50%;\n width: 6.666667rem;\n min-height: 2.666667rem;\n border-radius: 0.066667rem;\n -webkit-transform: translate(-50%, -50%);\n transform: translate(-50%, -50%);\n background-color: #fff;\n}\n.amfe-modal-node.hide {\n display: none;\n}\n.amfe-modal-node .content {\n display: -webkit-box;\n display: -webkit-flex;\n display: flex;\n -webkit-box-orient: vertical;\n -webkit-flex-direction: column;\n flex-direction: column;\n -webkit-box-align: center;\n -webkit-align-items: center;\n align-items: center;\n -webkit-box-pack: center;\n -webkit-justify-content: center;\n justify-content: center;\n width: 100%;\n min-height: 1.866667rem;\n box-sizing: border-box;\n font-size: 0.32rem;\n line-height: 0.426667rem;\n padding: 0.213333rem;\n border-bottom: 1px solid #ddd;\n}\n.amfe-modal-node .btn-group {\n width: 100%;\n height: 0.8rem;\n font-size: 0.373333rem;\n text-align: center;\n margin: 0;\n padding: 0;\n border: none;\n}\n.amfe-modal-node .btn-group .btn {\n box-sizing: border-box;\n height: 0.8rem;\n line-height: 0.8rem;\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n}\n",undefined);
// there will be only one instance of modal.
var MODAL_WRAP_CLASS = 'amfe-modal-wrap';
var MODAL_NODE_CLASS = 'amfe-modal-node';
function Modal$2() {
this.wrap = document.querySelector(MODAL_WRAP_CLASS);
this.node = document.querySelector(MODAL_NODE_CLASS);
if (!this.wrap) {
this.createWrap();
}
if (!this.node) {
this.createNode();
}
this.clearNode();
this.createNodeContent();
this.bindEvents();
}
Modal$2.prototype = {
show: function () {
this.wrap.style.display = 'block';
this.node.classList.remove('hide');
},
destroy: function () {
document.body.removeChild(this.wrap);
document.body.removeChild(this.node);
this.wrap = null;
this.node = null;
},
createWrap: function () {
this.wrap = document.createElement('div');
this.wrap.className = MODAL_WRAP_CLASS;
document.body.appendChild(this.wrap);
},
createNode: function () {
this.node = document.createElement('div');
this.node.classList.add(MODAL_NODE_CLASS, 'hide');
document.body.appendChild(this.node);
},
clearNode: function () {
this.node.innerHTML = '';
},
createNodeContent: function () {
// do nothing.
// child classes can override this method.
},
bindEvents: function () {
this.wrap.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
});
}
};
var modal$2 = Modal$2;
__$styleInject(".amfe-alert .amfe-alert-ok {\n width: 100%;\n}\n",undefined);
var Modal$1 = modal$2;
var CONTENT_CLASS = 'content';
var MSG_CLASS = 'content-msg';
var BUTTON_GROUP_CLASS = 'btn-group';
var BUTTON_CLASS = 'btn';
function Alert$1(config) {
this.msg = config.message || '';
this.callback = config.callback;
this.okTitle = config.okTitle || 'OK';
Modal$1.call(this);
this.node.classList.add('amfe-alert');
}
Alert$1.prototype = Object.create(Modal$1.prototype);
Alert$1.prototype.createNodeContent = function () {
var content = document.createElement('div');
content.classList.add(CONTENT_CLASS);
this.node.appendChild(content);
var msg = document.createElement('div');
msg.classList.add(MSG_CLASS);
msg.appendChild(document.createTextNode(this.msg));
content.appendChild(msg);
var buttonGroup = document.createElement('div');
buttonGroup.classList.add(BUTTON_GROUP_CLASS);
this.node.appendChild(buttonGroup);
var button = document.createElement('div');
button.classList.add(BUTTON_CLASS, 'alert-ok');
button.appendChild(document.createTextNode(this.okTitle));
buttonGroup.appendChild(button);
};
Alert$1.prototype.bindEvents = function () {
Modal$1.prototype.bindEvents.call(this);
var button = this.node.querySelector('.' + BUTTON_CLASS);
button.addEventListener('click', function () {
this.destroy();
this.callback && this.callback();
}.bind(this));
};
var alert$1 = Alert$1;
__$styleInject(".amfe-confirm .btn-group .btn {\n float: left;\n width: 50%;\n}\n.amfe-confirm .btn-group .btn.btn-ok {\n border-right: 1px solid #ddd;\n}\n",undefined);
var Modal$3 = modal$2;
var CONTENT_CLASS$1 = 'content';
var MSG_CLASS$1 = 'content-msg';
var BUTTON_GROUP_CLASS$1 = 'btn-group';
var BUTTON_CLASS$1 = 'btn';
function Confirm$1(config) {
this.msg = config.message || '';
this.callback = config.callback;
this.okTitle = config.okTitle || 'OK';
this.cancelTitle = config.cancelTitle || 'Cancel';
Modal$3.call(this);
this.node.classList.add('amfe-confirm');
}
Confirm$1.prototype = Object.create(Modal$3.prototype);
Confirm$1.prototype.createNodeContent = function () {
var content = document.createElement('div');
content.classList.add(CONTENT_CLASS$1);
this.node.appendChild(content);
var msg = document.createElement('div');
msg.classList.add(MSG_CLASS$1);
msg.appendChild(document.createTextNode(this.msg));
content.appendChild(msg);
var buttonGroup = document.createElement('div');
buttonGroup.classList.add(BUTTON_GROUP_CLASS$1);
this.node.appendChild(buttonGroup);
var btnOk = document.createElement('div');
btnOk.appendChild(document.createTextNode(this.okTitle));
btnOk.classList.add('btn-ok', BUTTON_CLASS$1);
var btnCancel = document.createElement('div');
btnCancel.appendChild(document.createTextNode(this.cancelTitle));
btnCancel.classList.add('btn-cancel', BUTTON_CLASS$1);
buttonGroup.appendChild(btnOk);
buttonGroup.appendChild(btnCancel);
this.node.appendChild(buttonGroup);
};
Confirm$1.prototype.bindEvents = function () {
Modal$3.prototype.bindEvents.call(this);
var btnOk = this.node.querySelector('.' + BUTTON_CLASS$1 + '.btn-ok');
var btnCancel = this.node.querySelector('.' + BUTTON_CLASS$1 + '.btn-cancel');
btnOk.addEventListener('click', function () {
this.destroy();
this.callback && this.callback(this.okTitle);
}.bind(this));
btnCancel.addEventListener('click', function () {
this.destroy();
this.callback && this.callback(this.cancelTitle);
}.bind(this));
};
var confirm = Confirm$1;
__$styleInject(".amfe-prompt .input-wrap {\n box-sizing: border-box;\n width: 100%;\n margin-top: 0.133333rem;\n // padding: 0.24rem 0.213333rem 0.213333rem;\n height: 0.96rem;\n}\n.amfe-prompt .input-wrap .input {\n box-sizing: border-box;\n width: 100%;\n height: 0.56rem;\n line-height: 0.56rem;\n font-size: 0.32rem;\n border: 1px solid #999;\n}\n.amfe-prompt .btn-group .btn {\n float: left;\n width: 50%;\n}\n.amfe-prompt .btn-group .btn.btn-ok {\n border-right: 1px solid #ddd;\n}\n",undefined);
var Modal$4 = modal$2;
var CONTENT_CLASS$2 = 'content';
var MSG_CLASS$2 = 'content-msg';
var BUTTON_GROUP_CLASS$2 = 'btn-group';
var BUTTON_CLASS$2 = 'btn';
var INPUT_WRAP_CLASS = 'input-wrap';
var INPUT_CLASS = 'input';
function Prompt$1(config) {
this.msg = config.message || '';
this.defaultMsg = config.default || '';
this.callback = config.callback;
this.okTitle = config.okTitle || 'OK';
this.cancelTitle = config.cancelTitle || 'Cancel';
Modal$4.call(this);
this.node.classList.add('amfe-prompt');
}
Prompt$1.prototype = Object.create(Modal$4.prototype);
Prompt$1.prototype.createNodeContent = function () {
var content = document.createElement('div');
content.classList.add(CONTENT_CLASS$2);
this.node.appendChild(content);
var msg = document.createElement('div');
msg.classList.add(MSG_CLASS$2);
msg.appendChild(document.createTextNode(this.msg));
content.appendChild(msg);
var inputWrap = document.createElement('div');
inputWrap.classList.add(INPUT_WRAP_CLASS);
content.appendChild(inputWrap);
var input = document.createElement('input');
input.classList.add(INPUT_CLASS);
input.type = 'text';
input.autofocus = true;
input.placeholder = this.defaultMsg;
inputWrap.appendChild(input);
var buttonGroup = document.createElement('div');
buttonGroup.classList.add(BUTTON_GROUP_CLASS$2);
var btnOk = document.createElement('div');
btnOk.appendChild(document.createTextNode(this.okTitle));
btnOk.classList.add('btn-ok', BUTTON_CLASS$2);
var btnCancel = document.createElement('div');
btnCancel.appendChild(document.createTextNode(this.cancelTitle));
btnCancel.classList.add('btn-cancel', BUTTON_CLASS$2);
buttonGroup.appendChild(btnOk);
buttonGroup.appendChild(btnCancel);
this.node.appendChild(buttonGroup);
};
Prompt$1.prototype.bindEvents = function () {
Modal$4.prototype.bindEvents.call(this);
var btnOk = this.node.querySelector('.' + BUTTON_CLASS$2 + '.btn-ok');
var btnCancel = this.node.querySelector('.' + BUTTON_CLASS$2 + '.btn-cancel');
var that = this;
btnOk.addEventListener('click', function () {
var val = document.querySelector('input').value;
this.destroy();
this.callback && this.callback({
result: that.okTitle,
data: val
});
}.bind(this));
btnCancel.addEventListener('click', function () {
var val = document.querySelector('input').value;
this.destroy();
this.callback && this.callback({
result: that.cancelTitle,
data: val
});
}.bind(this));
};
var prompt = Prompt$1;
__$styleInject(".amfe-toast {\n font-size: 0.32rem;\n line-height: 0.426667rem;\n position: fixed;\n box-sizing: border-box;\n max-width: 80%;\n bottom: 2.666667rem;\n left: 50%;\n padding: 0.213333rem;\n background-color: #000;\n color: #fff;\n text-align: center;\n opacity: 0.6;\n transition: all 0.4s ease-in-out;\n border-radius: 0.066667rem;\n -webkit-transform: translateX(-50%);\n transform: translateX(-50%);\n}\n\n.amfe-toast.hide {\n opacity: 0;\n}\n",undefined);
var queue$1 = [];
var timer;
var isProcessing = false;
var toastWin;
var TOAST_WIN_CLASS_NAME = 'amfe-toast';
var DEFAULT_DURATION = 0.8;
function showToastWindow(msg, callback) {
var handleTransitionEnd = function () {
toastWin.removeEventListener('transitionend', handleTransitionEnd);
toastWin.removeEventListener('webkitTransitionEnd', handleTransitionEnd);
callback && callback();
};
if (!toastWin) {
toastWin = document.createElement('div');
toastWin.classList.add(TOAST_WIN_CLASS_NAME, 'hide');
document.body.appendChild(toastWin);
}
toastWin.textContent = msg;
toastWin.addEventListener('transitionend', handleTransitionEnd);
toastWin.addEventListener('webkitTransitionEnd', handleTransitionEnd);
setTimeout(function () {
toastWin.classList.remove('hide');
}, 0);
}
function hideToastWindow(callback) {
var handleTransitionEnd = function () {
toastWin.removeEventListener('transitionend', handleTransitionEnd);
toastWin.removeEventListener('webkitTransitionEnd', handleTransitionEnd);
callback && callback();
};
if (!toastWin) {
return
}
toastWin.addEventListener('transitionend', handleTransitionEnd);
toastWin.addEventListener('webkitTransitionEnd', handleTransitionEnd);
setTimeout(function () {
toastWin.classList.add('hide');
}, 0);
}
var toast$1 = {
push: function (msg, duration) {
queue$1.push({
msg: msg,
duration: duration || DEFAULT_DURATION
});
this.show();
},
show: function () {
var that = this;
// All messages had been toasted already, so remove the toast window,
if (!queue$1.length) {
toastWin && toastWin.parentNode.removeChild(toastWin);
toastWin = null;
return
}
// the previous toast is not ended yet.
if (isProcessing) {
return
}
isProcessing = true;
var toastInfo = queue$1.shift();
showToastWindow(toastInfo.msg, function () {
timer = setTimeout(function () {
timer = null;
hideToastWindow(function () {
isProcessing = false;
that.show();
});
}, toastInfo.duration * 1000);
});
}
};
var toast_1 = {
push: toast$1.push.bind(toast$1)
};
var Alert = alert$1;
var Confirm = confirm;
var Prompt = prompt;
var toast = toast_1;
var modal = {
toast: function (msg, duration) {
toast.push(msg, duration);
},
alert: function (config) {
new Alert(config).show();
},
prompt: function (config) {
new Prompt(config).show();
},
confirm: function (config) {
new Confirm(config).show();
}
};
!window.lib && (window.lib = {});
window.lib.modal = modal;
var index$15 = modal;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var msg = {
// duration: default is 0.8 seconds.
toast: function (config) {
index$15.toast(config.message, config.duration);
},
// config:
// - message: string
// - okTitle: title of ok button
// - callback
alert: function (config, callbackId) {
var sender = this.sender;
config.callback = function () {
sender.performCallback(callbackId);
};
index$15.alert(config);
},
// config:
// - message: string
// - okTitle: title of ok button
// - cancelTitle: title of cancel button
// - callback
confirm: function (config, callbackId) {
var sender = this.sender;
config.callback = function (val) {
sender.performCallback(callbackId, val);
};
index$15.confirm(config);
},
// config:
// - message: string
// - okTitle: title of ok button
// - cancelTitle: title of cancel button
// - callback
prompt: function (config, callbackId) {
var sender = this.sender;
config.callback = function (val) {
sender.performCallback(callbackId, val);
};
index$15.prompt(config);
}
};
var meta$7 = {
modal: [{
name: 'toast',
args: ['object']
}, {
name: 'alert',
args: ['object', 'function']
}, {
name: 'confirm',
args: ['object', 'function']
}, {
name: 'prompt',
args: ['object', 'function']
}]
};
var Modal = {
init: function (Weex) {
Weex.registerApiModule('modal', msg, meta$7);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var navigator$1 = {
// config
// - url: the url to push
// - animated: this configuration item is native only
// callback is not currently supported
push: function (config, callbackId) {
window.location.href = config.url;
this.sender.performCallback(callbackId);
},
// config
// - animated: this configuration item is native only
// callback is note currently supported
pop: function (config, callbackId) {
window.history.back();
this.sender.performCallback(callbackId);
}
};
var meta$8 = {
navigator: [{
name: 'push',
args: ['object', 'function']
}, {
name: 'pop',
args: ['object', 'function']
}]
};
var Navigator = {
init: function (Weex) {
Weex.registerApiModule('navigator', navigator$1, meta$8);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var pageInfo = {
setTitle: function (title) {
title = title || 'Weex HTML5';
try {
title = decodeURIComponent(title);
}
catch (e) {}
document.title = title;
}
};
var meta$9 = {
pageInfo: [{
name: 'setTitle',
args: ['string']
}]
};
var PageInfo = {
init: function (Weex) {
Weex.registerApiModule('pageInfo', pageInfo, meta$9);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global localStorage */
var supportLocalStorage = typeof localStorage !== 'undefined';
var SUCCESS = 'success';
var FAILED = 'failed';
var INVALID_PARAM = 'invalid_param';
var UNDEFINED = 'undefined';
var storage = {
/**
* When passed a key name and value, will add that key to the storage,
* or update that key's value if it already exists.
* @param {string} key
* @param {string} value
* @param {function} callbackId
*/
setItem: function (key, value, callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
if (!key || !value) {
sender.performCallback(callbackId, {
result: 'failed',
data: INVALID_PARAM
});
return
}
try {
localStorage.setItem(key, value);
sender.performCallback(callbackId, {
result: SUCCESS,
data: UNDEFINED
});
}
catch (e) {
// accept any exception thrown during a storage attempt as a quota error
sender.performCallback(callbackId, {
result: FAILED,
data: UNDEFINED
});
}
},
/**
* When passed a key name, will return that key's value.
* @param {string} key
* @param {function} callbackId
*/
getItem: function (key, callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
if (!key) {
sender.performCallback(callbackId, {
result: FAILED,
data: INVALID_PARAM
});
return
}
var val = localStorage.getItem(key);
sender.performCallback(callbackId, {
result: val ? SUCCESS : FAILED,
data: val || UNDEFINED
});
},
/**
*When passed a key name, will remove that key from the storage.
* @param {string} key
* @param {function} callbackId
*/
removeItem: function (key, callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
if (!key) {
sender.performCallback(callbackId, {
result: FAILED,
data: INVALID_PARAM
});
return
}
localStorage.removeItem(key);
sender.performCallback(callbackId, {
result: SUCCESS,
data: UNDEFINED
});
},
/**
* Returns an integer representing the number of data items stored in the Storage object.
* @param {function} callbackId
*/
length: function (callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
var len = localStorage.length;
sender.performCallback(callbackId, {
result: SUCCESS,
data: len
});
},
/**
* Returns an array that contains all keys stored in Storage object.
* @param {function} callbackId
*/
getAllKeys: function (callbackId) {
if (!supportLocalStorage) {
console.error('your browser is not support localStorage yet.');
return
}
var sender = this.sender;
var _arr = [];
for (var i = 0; i < localStorage.length; i++) {
_arr.push(localStorage.key(i));
}
sender.performCallback(callbackId, {
result: SUCCESS,
data: _arr
});
}
};
var meta$10 = {
storage: [{
name: 'setItem',
args: ['string', 'string', 'function']
}, {
name: 'getItem',
args: ['string', 'function']
}, {
name: 'removeItem',
args: ['string', 'function']
}, {
name: 'length',
args: ['function']
}, {
name: 'getAllKeys',
args: ['function']
}]
};
var Storage = {
init: function (Weex) {
Weex.registerApiModule('storage', storage, meta$10);
}
};
var index$17 = function (str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
return '%' + c.charCodeAt(0).toString(16).toUpperCase();
});
};
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject$2(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
// Detect buggy property enumeration order in older V8 versions.
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
test1[5] = 'de';
if (Object.getOwnPropertyNames(test1)[0] === '5') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test2 = {};
for (var i = 0; i < 10; i++) {
test2['_' + String.fromCharCode(i)] = i;
}
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
return test2[n];
});
if (order2.join('') !== '0123456789') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test3 = {};
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join('') !==
'abcdefghijklmnopqrst') {
return false;
}
return true;
} catch (err) {
// We don't expect any of the above to throw, but better to be safe.
return false;
}
}
var index$19 = shouldUseNative() ? Object.assign : function (target, source) {
var arguments$1 = arguments;
var from;
var to = toObject$2(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments$1[s]);
for (var key in from) {
if (hasOwnProperty$2.call(from, key)) {
to[key] = from[key];
}
}
if (getOwnPropertySymbols) {
symbols = getOwnPropertySymbols(from);
for (var i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
};
var strictUriEncode = index$17;
var objectAssign = index$19;
function encoderForArrayFormat(opts) {
switch (opts.arrayFormat) {
case 'index':
return function (key, value, index) {
return value === null ? [
encode(key, opts),
'[',
index,
']'
].join('') : [
encode(key, opts),
'[',
encode(index, opts),
']=',
encode(value, opts)
].join('');
};
case 'bracket':
return function (key, value) {
return value === null ? encode(key, opts) : [
encode(key, opts),
'[]=',
encode(value, opts)
].join('');
};
default:
return function (key, value) {
return value === null ? encode(key, opts) : [
encode(key, opts),
'=',
encode(value, opts)
].join('');
};
}
}
function parserForArrayFormat(opts) {
var result;
switch (opts.arrayFormat) {
case 'index':
return function (key, value, accumulator) {
result = /\[(\d*)\]$/.exec(key);
key = key.replace(/\[\d*\]$/, '');
if (!result) {
accumulator[key] = value;
return;
}
if (accumulator[key] === undefined) {
accumulator[key] = {};
}
accumulator[key][result[1]] = value;
};
case 'bracket':
return function (key, value, accumulator) {
result = /(\[\])$/.exec(key);
key = key.replace(/\[\]$/, '');
if (!result) {
accumulator[key] = value;
return;
} else if (accumulator[key] === undefined) {
accumulator[key] = [value];
return;
}
accumulator[key] = [].concat(accumulator[key], value);
};
default:
return function (key, value, accumulator) {
if (accumulator[key] === undefined) {
accumulator[key] = value;
return;
}
accumulator[key] = [].concat(accumulator[key], value);
};
}
}
function encode(value, opts) {
if (opts.encode) {
return opts.strict ? strictUriEncode(value) : encodeURIComponent(value);
}
return value;
}
function keysSorter(input) {
if (Array.isArray(input)) {
return input.sort();
} else if (typeof input === 'object') {
return keysSorter(Object.keys(input)).sort(function (a, b) {
return Number(a) - Number(b);
}).map(function (key) {
return input[key];
});
}
return input;
}
var extract = function (str) {
return str.split('?')[1] || '';
};
var parse$2 = function (str, opts) {
opts = objectAssign({arrayFormat: 'none'}, opts);
var formatter = parserForArrayFormat(opts);
// Create an object with no prototype
// https://github.com/sindresorhus/query-string/issues/47
var ret = Object.create(null);
if (typeof str !== 'string') {
return ret;
}
str = str.trim().replace(/^(\?|#|&)/, '');
if (!str) {
return ret;
}
str.split('&').forEach(function (param) {
var parts = param.replace(/\+/g, ' ').split('=');
// Firefox (pre 40) decodes `%3D` to `=`
// https://github.com/sindresorhus/query-string/pull/37
var key = parts.shift();
var val = parts.length > 0 ? parts.join('=') : undefined;
// missing `=` should be `null`:
// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters
val = val === undefined ? null : decodeURIComponent(val);
formatter(decodeURIComponent(key), val, ret);
});
return Object.keys(ret).sort().reduce(function (result, key) {
var val = ret[key];
if (Boolean(val) && typeof val === 'object' && !Array.isArray(val)) {
// Sort object keys, not values
result[key] = keysSorter(val);
} else {
result[key] = val;
}
return result;
}, Object.create(null));
};
var stringify = function (obj, opts) {
var defaults = {
encode: true,
strict: true,
arrayFormat: 'none'
};
opts = objectAssign(defaults, opts);
var formatter = encoderForArrayFormat(opts);
return obj ? Object.keys(obj).sort().map(function (key) {
var val = obj[key];
if (val === undefined) {
return '';
}
if (val === null) {
return encode(key, opts);
}
if (Array.isArray(val)) {
var result = [];
val.slice().forEach(function (val2) {
if (val2 === undefined) {
return;
}
result.push(formatter(key, val2, result.length));
});
return result.join('&');
}
return encode(key, opts) + '=' + encode(val, opts);
}).filter(function (x) {
return x.length > 0;
}).join('&') : '';
};
var index$16 = {
extract: extract,
parse: parse$2,
stringify: stringify
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global lib, XMLHttpRequest */
/* deps: httpurl */
var utils$1;
var jsonpCnt = 0;
var ERROR_STATE = -1;
function _jsonp (config, callback, progressCallback) {
var cbName = 'jsonp_' + (++jsonpCnt);
var url;
if (!config.url) {
console.error('[h5-render] config.url should be set in _jsonp for \'fetch\' API.');
}
global[cbName] = (function (cb) {
return function (response) {
callback({
status: 200,
ok: true,
statusText: 'OK',
data: response
});
delete global[cb];
}
})(cbName);
var script = document.createElement('script');
try {
url = lib.httpurl(config.url);
}
catch (err) {
console.error('[h5-render] invalid config.url in _jsonp for \'fetch\' API: '
+ config.url);
}
url.params.callback = cbName;
script.type = 'text/javascript';
script.src = url.toString();
// script.onerror is not working on IE or safari.
// but they are not considered here.
script.onerror = (function (cb) {
return function (err) {
console.error('[h5-render] unexpected error in _jsonp for \'fetch\' API', err);
callback({
status: ERROR_STATE,
ok: false,
statusText: '',
data: ''
});
delete global[cb];
}
})(cbName);
var head = document.getElementsByTagName('head')[0];
head.insertBefore(script, null);
}
function _xhr (config, callback, progressCallback) {
var xhr = new XMLHttpRequest();
xhr.responseType = config.type;
xhr.open(config.method, config.url, true);
// cors cookie support
if (config.withCredentials === true) {
xhr.withCredentials = true;
}
var headers = config.headers || {};
for (var k in headers) {
xhr.setRequestHeader(k, headers[k]);
}
xhr.onload = function (res) {
callback({
status: xhr.status,
ok: xhr.status >= 200 && xhr.status < 300,
statusText: xhr.statusText,
data: xhr.response,
headers: xhr.getAllResponseHeaders().split('\n')
.reduce(function (obj, headerStr) {
var headerArr = headerStr.match(/(.+): (.+)/);
if (headerArr) {
obj[headerArr[1]] = headerArr[2];
}
return obj
}, {})
});
};
if (progressCallback) {
xhr.onprogress = function (e) {
progressCallback({
readyState: xhr.readyState,
status: xhr.status,
length: e.loaded,
total: e.total,
statusText: xhr.statusText,
headers: xhr.getAllResponseHeaders().split('\n')
.reduce(function (obj, headerStr) {
var headerArr = headerStr.match(/(.+): (.+)/);
if (headerArr) {
obj[headerArr[1]] = headerArr[2];
}
return obj
}, {})
});
};
}
xhr.onerror = function (err) {
console.error('[h5-render] unexpected error in _xhr for \'fetch\' API', err);
callback({
status: ERROR_STATE,
ok: false,
statusText: '',
data: ''
});
};
xhr.send(config.body || null);
}
var stream = {
/**
* sendHttp
* @deprecated
* Note: This API is deprecated. Please use stream.fetch instead.
* send a http request through XHR.
* @param {obj} params
* - method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'PATCH',
* - url: url requested
* @param {string} callbackId
*/
sendHttp: function (param, callbackId) {
if (typeof param === 'string') {
try {
param = JSON.parse(param);
}
catch (e) {
return
}
}
if (typeof param !== 'object' || !param.url) {
return console.error(
'[h5-render] invalid config or invalid config.url for sendHttp API')
}
var sender = this.sender;
var method = param.method || 'GET';
var xhr = new XMLHttpRequest();
xhr.open(method, param.url, true);
xhr.onload = function () {
sender.performCallback(callbackId, this.responseText);
};
xhr.onerror = function (error) {
return console.error('[h5-render] unexpected error in sendHttp API', error)
// sender.performCallback(
// callbackId,
// new Error('unexpected error in sendHttp API')
// )
};
xhr.send();
},
/**
* fetch
* use stream.fetch to request for a json file, a plain text file or
* a arraybuffer for a file stream. (You can use Blob and FileReader
* API implemented by most modern browsers to read a arraybuffer.)
* @param {object} options config options
* - method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'HEAD' | 'PATCH'
* - headers {obj}
* - url {string}
* - mode {string} 'cors' | 'no-cors' | 'same-origin' | 'navigate'
* - withCredentials {boolean}
* - body
* - type {string} 'json' | 'jsonp' | 'text'
* @param {string} callbackId
* @param {string} progressCallbackId
*/
fetch: function (options, callbackId, progressCallbackId) {
var DEFAULT_METHOD = 'GET';
var DEFAULT_MODE = 'cors';
var DEFAULT_TYPE = 'text';
var methodOptions = ['GET', 'POST', 'PUT', 'DELETE', 'HEAD', 'PATCH'];
var modeOptions = ['cors', 'no-cors', 'same-origin', 'navigate'];
var typeOptions = ['text', 'json', 'jsonp', 'arraybuffer'];
// const fallback = false // fallback from 'fetch' API to XHR.
var sender = this.sender;
var config = utils$1.extend({}, options);
// validate options.method
if (typeof config.method === 'undefined') {
config.method = DEFAULT_METHOD;
console.warn('[h5-render] options.method for \'fetch\' API has been set to '
+ 'default value \'' + config.method + '\'');
}
else if (methodOptions.indexOf((config.method + '')
.toUpperCase()) === -1) {
return console.error('[h5-render] options.method \''
+ config.method
+ '\' for \'fetch\' API should be one of '
+ methodOptions + '.')
}
// validate options.url
if (!config.url) {
return console.error('[h5-render] options.url should be set for \'fetch\' API.')
}
// validate body content for method 'GET'.
if (config.method.toUpperCase() === 'GET') {
var body = config.body;
if (utils$1.isPlainObject(body)) {
body = index$16.stringify(body);
}
var url = config.url;
var hashIdx = url.indexOf('#');
hashIdx <= -1 && (hashIdx = url.length);
var hash = url.substr(hashIdx);
hash && (hash = '#' + hash);
url = url.substring(0, hashIdx);
url += (config.url.indexOf('?') <= -1 ? '?' : '&') + body + hash;
config.url = url;
}
// validate options.mode
if (typeof config.mode === 'undefined') {
config.mode = DEFAULT_MODE;
}
else if (modeOptions.indexOf((config.mode + '').toLowerCase()) === -1) {
return console.error('[h5-render] options.mode \''
+ config.mode
+ '\' for \'fetch\' API should be one of '
+ modeOptions + '.')
}
// validate options.type
if (typeof config.type === 'undefined') {
config.type = DEFAULT_TYPE;
console.warn('[h5-render] options.type for \'fetch\' API has been set to '
+ 'default value \'' + config.type + '\'.');
}
else if (typeOptions.indexOf((config.type + '').toLowerCase()) === -1) {
return console.error('[h5-render] options.type \''
+ config.type
+ '\' for \'fetch\' API should be one of '
+ typeOptions + '.')
}
// validate options.headers
config.headers = config.headers || {};
if (!utils$1.isPlainObject(config.headers)) {
return console.error('[h5-render] options.headers should be a plain object')
}
// validate options.timeout
config.timeout = parseInt(config.timeout, 10) || 2500;
var _callArgs = [config, function (res) {
sender.performCallback(callbackId, res);
}];
if (progressCallbackId) {
_callArgs.push(function (res) {
// Set 'keepAlive' to true for sending continuous callbacks
sender.performCallback(progressCallbackId, res, true);
});
}
if (config.type === 'jsonp') {
_jsonp.apply(this, _callArgs);
}
else {
_xhr.apply(this, _callArgs);
}
}
};
var meta$11 = {
stream: [{
name: 'sendHttp',
args: ['object', 'function']
}, {
name: 'fetch',
args: ['object', 'function', 'function']
}]
};
var Stream = {
init: function (Weex) {
utils$1 = Weex.utils;
Weex.registerApiModule('stream', stream, meta$11);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
var webview = {
// ref: ref of the web component.
goBack: function (ref) {
var webComp = this.getComponentManager().getComponent(ref);
if (!webComp.goBack) {
console.error('error: the specified component has no method of'
+ ' goBack. Please make sure it is a webview component.');
return
}
webComp.goBack();
},
// ref: ref of the web component.
goForward: function (ref) {
var webComp = this.getComponentManager().getComponent(ref);
if (!webComp.goForward) {
console.error('error: the specified component has no method of'
+ ' goForward. Please make sure it is a webview component.');
return
}
webComp.goForward();
},
// ref: ref of the web component.
reload: function (ref) {
var webComp = this.getComponentManager().getComponent(ref);
if (!webComp.reload) {
console.error('error: the specified component has no method of'
+ ' reload. Please make sure it is a webview component.');
return
}
webComp.reload();
}
};
var meta$12 = {
webview: [{
name: 'goBack',
args: ['string']
}, {
name: 'goForward',
args: ['string']
}, {
name: 'reload',
args: ['string']
}]
};
var Webview = {
init: function (Weex) {
Weex.registerApiModule('webview', webview, meta$12);
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* global WebSocket */
var instance;
var callback$2 = { };
var webSocketIns = {
WebSocket: function (url, protocol) {
if (instance) {
instance.close();
instance = undefined;
callback$2 = { };
}
if (protocol === '') {
protocol = undefined;
}
var self = this;
instance = new WebSocket(url, protocol);
instance.onopen = function (e) {
if (callback$2.onopen) {
self.sender.performCallback(callback$2.onopen, { type: e.type }, true);
}
};
instance.onmessage = function (e) {
if (callback$2.onmessage) {
self.sender.performCallback(callback$2.onmessage, { origin: e.origin, data: e.data, source: e.data }, true);
}
};
instance.onerror = function (e) {
if (callback$2.onerror) {
self.sender.performCallback(callback$2.onerror, { code: e.code, data: e.data });
}
};
instance.onclose = function (e) {
if (callback$2.onclose) {
self.sender.performCallback(callback$2.onclose, { data: e.data, code: e.code, reason: e.reason });
}
};
},
close: function (code, signal) {
if (instance) {
instance.close(code, signal);
instance = undefined;
callback$2 = { };
}
},
send: function (data) {
if (instance) {
instance.send(data);
}
},
onopen: function (func) {
if (instance) {
callback$2.onopen = func;
}
},
onerror: function (func) {
if (instance) {
callback$2.onerror = func;
}
},
onmessage: function (func) {
if (instance) {
callback$2.onmessage = func;
}
},
onclose: function (func) {
if (instance) {
callback$2.onclose = func;
}
}
};
var meta$13 = {
webSocket: [{
name: 'WebSocket',
args: ['string', 'string']
}, {
name: 'close',
args: ['numble', 'string']
}, {
name: 'send',
args: ['string']
}, {
name: 'onopen',
args: ['function']
}, {
name: 'onmessage',
args: ['function']
}, {
name: 'onclose',
args: ['function']
}, {
name: 'onerror',
args: ['function']
}]
};
var WebSocket$1 = {
init: function (Weex) {
Weex.registerApiModule('webSocket', webSocketIns, meta$13);
}
};
// import components.
// import apis.
var packages = { Image: Image$1, Text: Text, Scrollable: Scrollable, Slider: Slider, Indicator: Indicator, Tabheader: Tabheader, Input: Input, Textarea: Textarea, Video: Video, Switch: Switch, A: A, Embed: Embed, Spinner: Spinner, Web: Web, Neighbor: Neighbor, Richtext: Richtext, Animation: Animation, Clipboard: Clipboard, Dom: Dom, Event: Event$1, Geolocation: Geolocation, GlobalEvent: GlobalEvent, Meta: Meta, Modal: Modal, Navigator: Navigator, PageInfo: PageInfo, Storage: Storage, Stream: Stream, Webview: Webview, WebSocket: WebSocket$1 };
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// install the apis and components as packages.
var extensions = {
init: function init (Weex) {
if (typeof packages !== 'object') {
return
}
for (var k in packages) {
Weex.install(packages[k]);
}
// packages.forEach(pkg => Weex.install(pkg))
}
};
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
// install the extended apis and components.
Weex$1.install(root);
Weex$1.install(div);
Weex$1.install(droot);
Weex$1.install(extensions);
global.registerComponents([
{ type: 'input', methods: ['focus', 'blur'] }
]);
return Weex$1;
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi4uLy4uL2h0bWw1L3NoYXJlZC9hcnJheUZyb20uanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWFic29sdXRlLWluZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1waWUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcyIsIi4uLy4uL2h0bWw1L3NoYXJlZC9vYmplY3RBc3NpZ24uanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvb2JqZWN0U2V0UHJvdG90eXBlT2YuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvcHJvbWlzZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NsYXNzb2YuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXJhdG9ycy5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19odG1sLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZWZpbmUuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3IuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19taWNyb3Rhc2suanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb21pc2UtcmVzb2x2ZS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3JlZGVmaW5lLWFsbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwiLi4vLi4vaHRtbDUvc2hhcmVkL2NvbnNvbGUuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvc2V0VGltZW91dC5qcyIsIi4uLy4uL2h0bWw1L3NoYXJlZC9mcmVlemUuanMiLCIuLi8uLi9odG1sNS9zaGFyZWQvaW5kZXguanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3V0aWxzLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2Uvbm9ybWFsaXplLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2UvQ2FsbGJhY2tNYW5hZ2VyLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL29wZXJhdGlvbi5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvdmRvbS9Ob2RlLmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL1dlZXhFbGVtZW50LmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL2RpcmVjdGl2ZS5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvdmRvbS9FbGVtZW50LmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS9icmlkZ2UvVGFza0NlbnRlci5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvYXBpL3NlcnZpY2UuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2FwaS9pbml0LmpzIiwiLi4vLi4vaHRtbDUvcnVudGltZS92ZG9tL0NvbW1lbnQuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2JyaWRnZS9MaXN0ZW5lci5qcyIsIi4uLy4uL2h0bWw1L3J1bnRpbWUvYnJpZGdlL0hhbmRsZXIuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vRG9jdW1lbnQuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL3Zkb20vaW5kZXguanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2FwaS9jb25maWcuanMiLCIuLi8uLi9odG1sNS9ydW50aW1lL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy92YW5pbGxhL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3dlZXgtdnVlLWZyYW1ld29yay9mYWN0b3J5LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3dlZXgtdnVlLWZyYW1ld29yay9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwaS9tZXRob2RzLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvdXRpbC9zaGFyZWQuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS91dGlsL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvY29yZS9kZXAuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9jb3JlL3dhdGNoZXIuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9jb3JlL2FycmF5LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvY29yZS9vYnNlcnZlci5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2NvcmUvc3RhdGUuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9jb25maWcuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9kaXJlY3RpdmUuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9kb20taGVscGVyLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvdm0vY29tcGlsZXIuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9ldmVudHMuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS92bS9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9yZWdpc3Rlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9zZW12ZXIvc2VtdmVyLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvYXBwL2Rvd25ncmFkZS5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC92aWV3cG9ydC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9idW5kbGUvYm9vdHN0cmFwLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvYXBwL2J1bmRsZS9kZWZpbmUuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvYnVuZGxlL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvYXBwL2N0cmwvbWlzYy5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9jdHJsL2luaXQuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvY3RybC9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L2FwcC9kaWZmZXIuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvaW5zdGFuY2UuanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9hcHAvaW5kZXguanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2xlZ2FjeS9zdGF0aWMvbWFwLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvc3RhdGljL2NyZWF0ZS5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L3N0YXRpYy9saWZlLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvc3RhdGljL3JlZ2lzdGVyLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvc3RhdGljL2JyaWRnZS5qcyIsIi4uLy4uL2h0bWw1L2ZyYW1ld29ya3MvbGVnYWN5L3N0YXRpYy9taXNjLmpzIiwiLi4vLi4vaHRtbDUvZnJhbWV3b3Jrcy9sZWdhY3kvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvd2VleC1yYXgtZnJhbWV3b3JrL2Rpc3QvZnJhbWV3b3JrLndlZXguanMiLCIuLi8uLi9odG1sNS9mcmFtZXdvcmtzL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYnJpZGdlL3Byb3RvY29sLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvcmVuZGVyL2NvbmZpZy5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL3V0aWxzL2FycmF5LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvdXRpbHMvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9icmlkZ2Uvc2VuZGVyLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYnJpZGdlL3JlY2VpdmVyLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYnJpZGdlL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZG9tL2FwcGVhcldhdGNoZXIuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9kb20vY29tcG9uZW50TWFuYWdlci5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL3JlbmRlci9sb2FkZXIuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9kb20vaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9iYXNlL2NvbXBvbmVudC92YWx1ZUZpbHRlci5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2UvY29tcG9uZW50L29wZXJhdGUuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9iYXNlL2NvbXBvbmVudC9zdGlja3kuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9iYXNlL2NvbXBvbmVudC9wb3NpdGlvbi5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2UvY29tcG9uZW50L2ZsZXhib3guanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvYXBwZWFyanMvc3JjL2FwcGVhci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9sYXp5aW1nL3NyYy9hZGFwdGVyLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYmFzZS9jb21wb25lbnQvbGF6eWxvYWQuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9iYXNlL2NvbXBvbmVudC9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2UvYXRvbWljLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYmFzZS9tb2R1bGVFdmVudC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL3JlbmRlci9yZWdpc3Rlci5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9lbnZkL2J1aWxkL2VudmQuY29tbW9uLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2h0dHB1cmwvYnVpbGQvaHR0cHVybC5jb21tb24uanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9yZW5kZXIvZ2VzdHVyZS5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL3JlbmRlci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2Uvcm9vdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2Jhc2UvZGl2LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvYmFzZS9kcm9vdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL2ltYWdlL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvdGV4dC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvbW90aW9uLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvc2Nyb2xsYWJsZS9zY3JvbGwuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL3Njcm9sbGFibGUuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL2xpc3QvbGlzdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvbGlzdC92bGlzdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvbGlzdC9obGlzdC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvbGlzdC9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3Njcm9sbGFibGUvc2Nyb2xsZXIvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL3JlZnJlc2gvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL2xvYWRpbmcvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9zY3JvbGxhYmxlL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2N1YmljYmV6aWVyL2J1aWxkL2N1YmljYmV6aWVyLmNvbW1vbi5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9hbmltYXRpb25qcy9idWlsZC9hbmltYXRpb24uY29tbW9uLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvc2xpZGVyL3RpbWVyLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvc2xpZGVyL2NhcnJvdXNlbC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3NsaWRlci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL2luZGljYXRvci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3RhYmhlYWRlci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL2lucHV0LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2NvbXBvbmVudHMvdGV4dGFyZWEuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy92aWRlby9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3N3aXRjaC9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL2EuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9lbWJlZC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3NwaW5uZXIvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy93ZWIuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvY29tcG9uZW50cy9uZWlnaGJvci9pbmRleC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9jb21wb25lbnRzL3JpY2h0ZXh0LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9hbmltYXRpb24vbGliLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9hbmltYXRpb24vaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL2NsaXBib2FyZC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb21wb25lbnQtZW1pdHRlci9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb21wb25lbnQtdHlwZS9pbmRleC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9jb21wb25lbnQtY2xvbmUvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvZWFzZS1jb21wb25lbnQvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvY29tcG9uZW50LXR3ZWVuL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL2NvbXBvbmVudC1yYWYvaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvc2Nyb2xsLXRvL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9kb20uanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL2V2ZW50LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9nZW9sb2NhdGlvbi5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9hcGkvZ2xvYmFsRXZlbnQuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL21ldGEuanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvbW9kYWxzL3NyYy9tb2RhbC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9tb2RhbHMvc3JjL2FsZXJ0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL21vZGFscy9zcmMvY29uZmlybS5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9tb2RhbHMvc3JjL3Byb21wdC5qcyIsIi4uLy4uL25vZGVfbW9kdWxlcy9tb2RhbHMvc3JjL3RvYXN0LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL21vZGFscy9zcmMvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL21vZGFsLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9uYXZpZ2F0b3IuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL3BhZ2VJbmZvLmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9zdG9yYWdlLmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL3N0cmljdC11cmktZW5jb2RlL2luZGV4LmpzIiwiLi4vLi4vbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCIuLi8uLi9ub2RlX21vZHVsZXMvcXVlcnktc3RyaW5nL2luZGV4LmpzIiwiLi4vLi4vaHRtbDUvcmVuZGVyL2Jyb3dzZXIvZXh0ZW5kL2FwaS9zdHJlYW0uanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL3dlYnZpZXcuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvYXBpL3dlYlNvY2tldC5qcyIsIi4uLy4uL2h0bWw1L3JlbmRlci9icm93c2VyL2V4dGVuZC9wYWNrZXIuanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9leHRlbmQvaW5kZXguanMiLCIuLi8uLi9odG1sNS9yZW5kZXIvYnJvd3Nlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gUHJvZHVjdGlvbiBzdGVwcyBvZiBFQ01BLTI2MiwgRWRpdGlvbiA2LCAyMi4xLjIuMVxuLy8gUmVmZXJlbmNlOiBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtYXJyYXkuZnJvbVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmICghQXJyYXkuZnJvbSkge1xuICBBcnJheS5mcm9tID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB0b1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgdmFyIGlzQ2FsbGFibGUgPSBmdW5jdGlvbihmbikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fCB0b1N0ci5jYWxsKGZuKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9O1xuICAgIHZhciB0b0ludGVnZXIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIG51bWJlciA9IE51bWJlcih2YWx1ZSk7XG4gICAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChudW1iZXIgPT09IDAgfHwgIWlzRmluaXRlKG51bWJlcikpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgIH1cbiAgICAgIHJldHVybiAobnVtYmVyID4gMCA/IDEgOiAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKG51bWJlcikpO1xuICAgIH07XG4gICAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcbiAgICB2YXIgdG9MZW5ndGggPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgdmFyIGxlbiA9IHRvSW50ZWdlcih2YWx1ZSk7XG4gICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobGVuLCAwKSwgbWF4U2FmZUludGVnZXIpO1xuICAgIH07XG5cbiAgICAvLyBUaGUgbGVuZ3RoIHByb3BlcnR5IG9mIHRoZSBmcm9tIG1ldGhvZCBpcyAxLlxuICAgIHJldHVybiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZS8qLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgICAgLy8gMS4gTGV0IEMgYmUgdGhlIHRoaXMgdmFsdWUuXG4gICAgICB2YXIgQyA9IHRoaXM7XG5cbiAgICAgIC8vIDIuIExldCBpdGVtcyBiZSBUb09iamVjdChhcnJheUxpa2UpLlxuICAgICAgdmFyIGl0ZW1zID0gT2JqZWN0KGFycmF5TGlrZSk7XG5cbiAgICAgIC8vIDMuIFJldHVybklmQWJydXB0KGl0ZW1zKS5cbiAgICAgIGlmIChhcnJheUxpa2UgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5mcm9tIHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0IC0gbm90IG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIElmIG1hcGZuIGlzIHVuZGVmaW5lZCwgdGhlbiBsZXQgbWFwcGluZyBiZSBmYWxzZS5cbiAgICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCB1bmRlZmluZWQ7XG4gICAgICB2YXIgVDtcbiAgICAgIGlmICh0eXBlb2YgbWFwRm4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIDUuIGVsc2VcbiAgICAgICAgLy8gNS4gYSBJZiBJc0NhbGxhYmxlKG1hcGZuKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuICAgICAgICBpZiAoIWlzQ2FsbGFibGUobWFwRm4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkuZnJvbTogd2hlbiBwcm92aWRlZCwgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIGIuIElmIHRoaXNBcmcgd2FzIHN1cHBsaWVkLCBsZXQgVCBiZSB0aGlzQXJnOyBlbHNlIGxldCBUIGJlIHVuZGVmaW5lZC5cbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgVCA9IGFyZ3VtZW50c1syXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAxMC4gTGV0IGxlblZhbHVlIGJlIEdldChpdGVtcywgXCJsZW5ndGhcIikuXG4gICAgICAvLyAxMS4gTGV0IGxlbiBiZSBUb0xlbmd0aChsZW5WYWx1ZSkuXG4gICAgICB2YXIgbGVuID0gdG9MZW5ndGgoaXRlbXMubGVuZ3RoKTtcblxuICAgICAgLy8gMTMuIElmIElzQ29uc3RydWN0b3IoQykgaXMgdHJ1ZSwgdGhlblxuICAgICAgLy8gMTMuIGEuIExldCBBIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgW1tDb25zdHJ1Y3RdXSBpbnRlcm5hbCBtZXRob2Qgb2YgQyB3aXRoIGFuIGFyZ3VtZW50IGxpc3QgY29udGFpbmluZyB0aGUgc2luZ2xlIGl0ZW0gbGVuLlxuICAgICAgLy8gMTQuIGEuIEVsc2UsIExldCBBIGJlIEFycmF5Q3JlYXRlKGxlbikuXG4gICAgICB2YXIgQSA9IGlzQ2FsbGFibGUoQykgPyBPYmplY3QobmV3IEMobGVuKSkgOiBuZXcgQXJyYXkobGVuKTtcblxuICAgICAgLy8gMTYuIExldCBrIGJlIDAuXG4gICAgICB2YXIgayA9IDA7XG4gICAgICAvLyAxNy4gUmVwZWF0LCB3aGlsZSBrIDwgbGVu4oCmIChhbHNvIHN0ZXBzIGEgLSBoKVxuICAgICAgdmFyIGtWYWx1ZTtcbiAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgIGtWYWx1ZSA9IGl0ZW1zW2tdO1xuICAgICAgICBpZiAobWFwRm4pIHtcbiAgICAgICAgICBBW2tdID0gdHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gbWFwRm4oa1ZhbHVlLCBrKSA6IG1hcEZuLmNhbGwoVCwga1ZhbHVlLCBrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBBW2tdID0ga1ZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGsgKz0gMTtcbiAgICAgIH1cbiAgICAgIC8vIDE4LiBMZXQgcHV0U3RhdHVzIGJlIFB1dChBLCBcImxlbmd0aFwiLCBsZW4sIHRydWUpLlxuICAgICAgQS5sZW5ndGggPSBsZW47XG4gICAgICAvLyAyMC4gUmV0dXJuIEEuXG4gICAgICByZXR1cm4gQTtcbiAgICB9O1xuICB9KCkpO1xufVxuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYgKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpIF9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNS4wJyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR107XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTtcbiIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBjb2YoaXQpID09ICdTdHJpbmcnID8gaXQuc3BsaXQoJycpIDogT2JqZWN0KGl0KTtcbn07XG4iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTtcbiIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nO1xudmFyIHN0b3JlID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0ge30pO1xufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKTtcbnZhciBJRV9QUk9UTyA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IHRvSU9iamVjdChvYmplY3QpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gTykgaWYgKGtleSAhPSBJRV9QUk9UTykgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTtcbiIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBJT2JqZWN0ID0gcmVxdWlyZSgnLi9faW9iamVjdCcpO1xudmFyICRhc3NpZ24gPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBBID0ge307XG4gIHZhciBCID0ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICB2YXIgUyA9IFN5bWJvbCgpO1xuICB2YXIgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7IEJba10gPSBrOyB9KTtcbiAgcmV0dXJuICRhc3NpZ24oe30sIEEpW1NdICE9IDcgfHwgT2JqZWN0LmtleXMoJGFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IEs7XG59KSA/IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQsIHNvdXJjZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUID0gdG9PYmplY3QodGFyZ2V0KTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICB3aGlsZSAoYUxlbiA+IGluZGV4KSB7XG4gICAgdmFyIFMgPSBJT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSk7XG4gICAgdmFyIGtleXMgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpO1xuICAgIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgICB2YXIgaiA9IDA7XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaikgaWYgKGlzRW51bS5jYWxsKFMsIGtleSA9IGtleXNbaisrXSkpIFRba2V5XSA9IFNba2V5XTtcbiAgfSByZXR1cm4gVDtcbn0gOiAkYXNzaWduO1xuIiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0JywgeyBhc3NpZ246IHJlcXVpcmUoJy4vX29iamVjdC1hc3NpZ24nKSB9KTtcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICdjb3JlLWpzL2ZuL29iamVjdC9hc3NpZ24nXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vV2ViUmVmbGVjdGlvbi81NTkzNTU0XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKCFPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mID0gKGZ1bmN0aW9uKE9iamVjdCwgbWFnaWMpIHtcbiAgICB2YXIgc2V0O1xuICAgIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICBzZXQuY2FsbChPLCBwcm90byk7XG4gICAgICByZXR1cm4gTztcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIHRoaXMgd29ya3MgYWxyZWFkeSBpbiBGaXJlZm94IGFuZCBTYWZhcmlcbiAgICAgIHNldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSwgbWFnaWMpLnNldDtcbiAgICAgIHNldC5jYWxsKHt9LCBudWxsKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIC8vIElFIDwgMTEgY2Fubm90IGJlIHNoaW1tZWRcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZSAhPT0ge31bbWFnaWNdIHx8XG4gICAgICAgIC8vIG5laXRoZXIgY2FuIGFueSBicm93c2VyIHRoYXQgYWN0dWFsbHlcbiAgICAgICAgLy8gaW1wbGVtZW50ZWQgX19wcm90b19fIGNvcnJlY3RseVxuICAgICAgICAvLyAoYWxsIGJ1dCBvbGQgVjggd2lsbCByZXR1cm4gaGVyZSlcbiAgICAgICAge19fcHJvdG9fXzogbnVsbH0uX19wcm90b19fID09PSB2b2lkIDBcbiAgICAgICAgLy8gdGhpcyBjYXNlIG1lYW5zIG51bGwgb2JqZWN0cyBjYW5ub3QgYmUgcGFzc2VkXG4gICAgICAgIC8vIHRocm91Z2ggc2V0UHJvdG90eXBlT2YgaW4gYSByZWxpYWJsZSB3YXlcbiAgICAgICAgLy8gd2hpY2ggbWVhbnMgaGVyZSBhICoqU2hhbSoqIGlzIG5lZWRlZCBpbnN0ZWFkXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gbm9kZWpzIDAuOCBhbmQgMC4xMCBhcmUgKGJ1Z2d5IGFuZC4uKSBmaW5lIGhlcmVcbiAgICAgIC8vIHByb2JhYmx5IENocm9tZSBvciBzb21lIG9sZCBNb2JpbGUgc3RvY2sgYnJvd3NlclxuICAgICAgc2V0ID0gZnVuY3Rpb24ocHJvdG8pIHtcbiAgICAgICAgdGhpc1ttYWdpY10gPSBwcm90bztcbiAgICAgIH07XG4gICAgICAvLyBwbGVhc2Ugbm90ZSB0aGF0IHRoaXMgd2lsbCAqKm5vdCoqIHdvcmtcbiAgICAgIC8vIGluIHRob3NlIGJyb3dzZXJzIHRoYXQgZG8gbm90IGluaGVyaXRcbiAgICAgIC8vIF9fcHJvdG9fXyBieSBtaXN0YWtlIGZyb20gT2JqZWN0LnByb3RvdHlwZVxuICAgICAgLy8gaW4gdGhlc2UgY2FzZXMgd2Ugc2hvdWxkIHByb2JhYmx5IHRocm93IGFuIGVycm9yXG4gICAgICAvLyBvciBhdCBsZWFzdCBiZSBpbmZvcm1lZCBhYm91dCB0aGUgaXNzdWVcbiAgICAgIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID0gc2V0UHJvdG90eXBlT2YoXG4gICAgICAgIHNldFByb3RvdHlwZU9mKHt9LCBudWxsKSxcbiAgICAgICAgT2JqZWN0LnByb3RvdHlwZVxuICAgICAgKSBpbnN0YW5jZW9mIE9iamVjdDtcbiAgICAgIC8vIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID09PSB0cnVlIG1lYW5zIGl0IHdvcmtzIGFzIG1lYW50XG4gICAgICAvLyBzZXRQcm90b3R5cGVPZi5wb2x5ZmlsbCA9PT0gZmFsc2UgbWVhbnMgaXQncyBub3QgMTAwJSByZWxpYWJsZVxuICAgICAgLy8gc2V0UHJvdG90eXBlT2YucG9seWZpbGwgPT09IHVuZGVmaW5lZFxuICAgICAgLy8gb3JcbiAgICAgIC8vIHNldFByb3RvdHlwZU9mLnBvbHlmaWxsID09ICBudWxsIG1lYW5zIGl0J3Mgbm90IGEgcG9seWZpbGxcbiAgICAgIC8vIHdoaWNoIG1lYW5zIGl0IHdvcmtzIGFzIGV4cGVjdGVkXG4gICAgICAvLyB3ZSBjYW4gZXZlbiBkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX187XG4gICAgfVxuICAgIHJldHVybiBzZXRQcm90b3R5cGVPZjtcbiAgfShPYmplY3QsICdfX3Byb3RvX18nKSk7XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gZml4IFByb21pc2UgUHJvYmxlbSBvbiBKU0NvbnRleHQgb2YgaU9TN344XG4vLyBAc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzU4NjZcblxuY29uc3QgeyBXWEVudmlyb25tZW50IH0gPSBnbG9iYWxcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChXWEVudmlyb25tZW50ICYmIFdYRW52aXJvbm1lbnQucGxhdGZvcm0gPT09ICdpT1MnKSB7XG4gIGdsb2JhbC5Qcm9taXNlID0gdW5kZWZpbmVkXG59XG4iLCJ2YXIgc3RvcmUgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG52YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sO1xudmFyIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG4iLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBjb2YoZnVuY3Rpb24gKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIHRlc3QgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYgKHRlc3QgKyAnJyAhPSAnW29iamVjdCB6XScpIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufVxuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuLy8gdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBmYWxzZSAtPiBTdHJpbmcjY29kZVBvaW50QXRcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFRPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIHBvcykge1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICAgIHZhciBpID0gdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSBsKSByZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZmFsc2U7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIiwidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIiwidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBkZXNjcmlwdG9yID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwgeyBuZXh0OiBkZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG4iLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoTykge1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmIChoYXMoTywgSUVfUFJPVE8pKSByZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmICh0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKSB7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpO1xudmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG5pZiAoQXJyYXlQcm90b1tVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSByZXF1aXJlKCcuL19oaWRlJykoQXJyYXlQcm90bywgVU5TQ09QQUJMRVMsIHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICBBcnJheVByb3RvW1VOU0NPUEFCTEVTXVtrZXldID0gdHJ1ZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iLCJ2YXIgJGl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5BcnJheTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiBmYWxzZSxcbiAgQ1NTVmFsdWVMaXN0OiBmYWxzZSxcbiAgQ2xpZW50UmVjdExpc3Q6IGZhbHNlLFxuICBET01SZWN0TGlzdDogZmFsc2UsXG4gIERPTVN0cmluZ0xpc3Q6IGZhbHNlLFxuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiBmYWxzZSxcbiAgRmlsZUxpc3Q6IGZhbHNlLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTEZvcm1FbGVtZW50OiBmYWxzZSxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IGZhbHNlLFxuICBNZWRpYUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBNaW1lVHlwZUFycmF5OiBmYWxzZSxcbiAgTmFtZWROb2RlTWFwOiBmYWxzZSxcbiAgTm9kZUxpc3Q6IHRydWUsXG4gIFBhaW50UmVxdWVzdExpc3Q6IGZhbHNlLFxuICBQbHVnaW46IGZhbHNlLFxuICBQbHVnaW5BcnJheTogZmFsc2UsXG4gIFNWR0xlbmd0aExpc3Q6IGZhbHNlLFxuICBTVkdOdW1iZXJMaXN0OiBmYWxzZSxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IGZhbHNlLFxuICBTVkdQb2ludExpc3Q6IGZhbHNlLFxuICBTVkdTdHJpbmdMaXN0OiBmYWxzZSxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogZmFsc2UsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IGZhbHNlLFxuICBTdHlsZVNoZWV0TGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIFRleHRUcmFja0N1ZUxpc3Q6IGZhbHNlLFxuICBUZXh0VHJhY2tMaXN0OiBmYWxzZSxcbiAgVG91Y2hMaXN0OiBmYWxzZVxufTtcblxuZm9yICh2YXIgY29sbGVjdGlvbnMgPSBnZXRLZXlzKERPTUl0ZXJhYmxlcyksIGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBjb2xsZWN0aW9uc1tpXTtcbiAgdmFyIGV4cGxpY2l0ID0gRE9NSXRlcmFibGVzW05BTUVdO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGtleTtcbiAgaWYgKHByb3RvKSB7XG4gICAgaWYgKCFwcm90b1tJVEVSQVRPUl0pIGhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYgKCFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgaWYgKGV4cGxpY2l0KSBmb3IgKGtleSBpbiAkaXRlcmF0b3JzKSBpZiAoIXByb3RvW2tleV0pIHJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG4iLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoSXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SXSA9PT0gaXQpO1xufTtcbiIsInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBCUkVBSyA9IHt9O1xudmFyIFJFVFVSTiA9IHt9O1xudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYWJsZSwgZW50cmllcywgZm4sIHRoYXQsIElURVJBVE9SKSB7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXJhYmxlOyB9IDogZ2V0SXRlckZuKGl0ZXJhYmxlKTtcbiAgdmFyIGYgPSBjdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYgKGlzQXJyYXlJdGVyKGl0ZXJGbikpIGZvciAobGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihhbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgcmVzdWx0ID0gY2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcbiIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IGFuT2JqZWN0KE8pLmNvbnN0cnVjdG9yO1xuICB2YXIgUztcbiAgcmV0dXJuIEMgPT09IHVuZGVmaW5lZCB8fCAoUyA9IGFuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogYUZ1bmN0aW9uKFMpO1xufTtcbiIsIi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi9faHRtbCcpO1xudmFyIGNlbCA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgc2V0VGFzayA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXJUYXNrID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaWQgPSArdGhpcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldFRhc2sgfHwgIWNsZWFyVGFzaykge1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBtYWNyb3Rhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIE9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzLmRvbWFpbikpIHBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUgKGhlYWQpIHtcbiAgICAgIGZuID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaGVhZCkgbm90aWZ5KCk7XG4gICAgICAgIGVsc2UgbGFzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoaXNOb2RlKSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIpIHtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZTtcbiAgICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgT2JzZXJ2ZXIoZmx1c2gpLm9ic2VydmUobm9kZSwgeyBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmIChQcm9taXNlICYmIFByb21pc2UucmVzb2x2ZSkge1xuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcblxuZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZTogZmFsc2UsIHY6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsgZTogdHJ1ZSwgdjogZSB9O1xuICB9XG59O1xuIiwidmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzcmNba2V5XSwgc2FmZSk7XG4gIHJldHVybiB0YXJnZXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSBnbG9iYWxbS0VZXTtcbiAgaWYgKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pIGRQLmYoQywgU1BFQ0lFUywge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuIiwidmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUl0oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGhyb3ctbGl0ZXJhbFxuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbiAoKSB7IHRocm93IDI7IH0pO1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBzYWZlO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKSAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gTElCUkFSWSA/IGZ1bmN0aW9uIChhLCBiKSB7XG4gIC8vIHdpdGggbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gYSA9PT0gYiB8fCBhID09PSAkUHJvbWlzZSAmJiBiID09PSBXcmFwcGVyO1xufSA6IGZ1bmN0aW9uIChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgaWYgKHByb21pc2UuX2ggPT0gMikgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkgcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKSBvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIHVuaGFuZGxlZCA9IGlzVW5oYW5kbGVkKHByb21pc2UpO1xuICAgIHZhciByZXN1bHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYgKHVuaGFuZGxlZCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodW5oYW5kbGVkICYmIHJlc3VsdC5lKSB0aHJvdyByZXN1bHQudjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgaWYgKHByb21pc2UuX2ggPT0gMSkgcmV0dXJuIGZhbHNlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9hIHx8IHByb21pc2UuX2M7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlYWN0aW9uO1xuICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkge1xuICAgIHJlYWN0aW9uID0gY2hhaW5baSsrXTtcbiAgICBpZiAocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpIHJldHVybiBmYWxzZTtcbiAgfSByZXR1cm4gdHJ1ZTtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBzYW1lQ29uc3RydWN0b3IoJFByb21pc2UsIEMpXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIC8vIGluc3RhbmNlb2YgaW5zdGVhZCBvZiBpbnRlcm5hbCBzbG90IGNoZWNrIGJlY2F1c2Ugd2Ugc2hvdWxkIGZpeCBpdCB3aXRob3V0IHJlcGxhY2VtZW50IG5hdGl2ZSBQcm9taXNlIGNvcmVcbiAgICBpZiAoeCBpbnN0YW5jZW9mICRQcm9taXNlICYmIHNhbWVDb25zdHJ1Y3Rvcih4LmNvbnN0cnVjdG9yLCB0aGlzKSkgcmV0dXJuIHg7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogVGhpcyBmaWxlIHdpbGwgaGFjayBgY29uc29sZWAgbWV0aG9kcyBieSBgV1hFbnZpcm9ubWVudC5sb2dMZXZlbGAuXG4gKiBTbyB3ZSBjYW4gY29udHJvbCBob3cgbWFueSBhbmQgd2hpY2ggbWVzc2FnZXMgd2lsbCBiZSBzZW50IGJ5IGNoYW5nZSB0aGUgbG9nIGxldmVsLlxuICogQWRkaXRpb25hbGx5IGluIG5hdGl2ZSBwbGF0Zm9ybSB0aGUgbWVzc2FnZSBjb250ZW50IG11c3QgYmUgcHJpbWl0aXZlIHZhbHVlcyBhbmRcbiAqIHVzaW5nIGBuYXRpdmVMb2coLi4uYXJncywgbG9nTGV2ZWxNYXJrKWAgc28gd2UgY3JlYXRlIGEgbmV3IGBjb25zb2xlYCBvYmplY3QgaW5cbiAqIGdsb2JhbCBhZGQgYSBmb3JtYXQgcHJvY2VzcyBmb3IgaXRzIG1ldGhvZHMuXG4gKi9cblxuY29uc3QgTEVWRUxTID0gWydvZmYnLCAnZXJyb3InLCAnd2FybicsICdpbmZvJywgJ2xvZycsICdkZWJ1ZyddXG5sZXQgbGV2ZWxNYXAgPSB7fVxuXG5jb25zdCBvcmlnaW5hbENvbnNvbGUgPSBnbG9iYWwuY29uc29sZVxuXG4vKipcbiAqIEhhY2sgY29uc29sZSBmb3IgbmF0aXZlIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmF0aXZlQ29uc29sZSAoKSB7XG4gIGdlbmVyYXRlTGV2ZWxNYXAoKVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIC8vIG1vY2sgY29uc29sZSBpbiBuYXRpdmUgZW52aXJvbm1lbnRcbiAgaWYgKGdsb2JhbC5XWEVudmlyb25tZW50ICYmIGdsb2JhbC5XWEVudmlyb25tZW50LnBsYXRmb3JtICE9PSAnV2ViJykge1xuICAgIGdsb2JhbC5jb25zb2xlID0ge1xuICAgICAgZGVidWc6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xldmVsKCdkZWJ1ZycpKSB7IGdsb2JhbC5uYXRpdmVMb2coLi4uZm9ybWF0KGFyZ3MpLCAnX19ERUJVRycpIH1cbiAgICAgIH0sXG4gICAgICBsb2c6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xldmVsKCdsb2cnKSkgeyBnbG9iYWwubmF0aXZlTG9nKC4uLmZvcm1hdChhcmdzKSwgJ19fTE9HJykgfVxuICAgICAgfSxcbiAgICAgIGluZm86ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGlmIChjaGVja0xldmVsKCdpbmZvJykpIHsgZ2xvYmFsLm5hdGl2ZUxvZyguLi5mb3JtYXQoYXJncyksICdfX0lORk8nKSB9XG4gICAgICB9LFxuICAgICAgd2FybjogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrTGV2ZWwoJ3dhcm4nKSkgeyBnbG9iYWwubmF0aXZlTG9nKC4uLmZvcm1hdChhcmdzKSwgJ19fV0FSTicpIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGNoZWNrTGV2ZWwoJ2Vycm9yJykpIHsgZ2xvYmFsLm5hdGl2ZUxvZyguLi5mb3JtYXQoYXJncyksICdfX0VSUk9SJykgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFdlYiBvciBOb2RlXG4gIGVsc2Uge1xuICAgIGNvbnN0IHsgZGVidWcsIGxvZywgaW5mbywgd2FybiwgZXJyb3IgfSA9IGNvbnNvbGVcbiAgICBjb25zb2xlLl9fb3JpX18gPSB7IGRlYnVnLCBsb2csIGluZm8sIHdhcm4sIGVycm9yIH1cbiAgICBjb25zb2xlLmRlYnVnID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChjaGVja0xldmVsKCdkZWJ1ZycpKSB7IGNvbnNvbGUuX19vcmlfXy5kZWJ1Zy5hcHBseShjb25zb2xlLCBhcmdzKSB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChjaGVja0xldmVsKCdsb2cnKSkgeyBjb25zb2xlLl9fb3JpX18ubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3MpIH1cbiAgICB9XG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmIChjaGVja0xldmVsKCdpbmZvJykpIHsgY29uc29sZS5fX29yaV9fLmluZm8uYXBwbHkoY29uc29sZSwgYXJncykgfVxuICAgIH1cbiAgICBjb25zb2xlLndhcm4gPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGNoZWNrTGV2ZWwoJ3dhcm4nKSkgeyBjb25zb2xlLl9fb3JpX18ud2Fybi5hcHBseShjb25zb2xlLCBhcmdzKSB9XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IgPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGNoZWNrTGV2ZWwoJ2Vycm9yJykpIHsgY29uc29sZS5fX29yaV9fLmVycm9yLmFwcGx5KGNvbnNvbGUsIGFyZ3MpIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldCBoYWNrZWQgY29uc29sZSB0byBvcmlnaW5hbC5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldE5hdGl2ZUNvbnNvbGUgKCkge1xuICBsZXZlbE1hcCA9IHt9XG4gIGdsb2JhbC5jb25zb2xlID0gb3JpZ2luYWxDb25zb2xlXG59XG5cbi8qKlxuICogR2VuZXJhdGUgbWFwIGZvciB3aGljaCB0eXBlcyBvZiBtZXNzYWdlIHdpbGwgYmUgc2VudCBpbiBhIGNlcnRhaW4gbWVzc2FnZSBsZXZlbFxuICogYXMgdGhlIG9yZGVyIG9mIExFVkVMUy5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVMZXZlbE1hcCAoKSB7XG4gIExFVkVMUy5mb3JFYWNoKGxldmVsID0+IHtcbiAgICBjb25zdCBsZXZlbEluZGV4ID0gTEVWRUxTLmluZGV4T2YobGV2ZWwpXG4gICAgbGV2ZWxNYXBbbGV2ZWxdID0ge31cbiAgICBMRVZFTFMuZm9yRWFjaCh0eXBlID0+IHtcbiAgICAgIGNvbnN0IHR5cGVJbmRleCA9IExFVkVMUy5pbmRleE9mKHR5cGUpXG4gICAgICBpZiAodHlwZUluZGV4IDw9IGxldmVsSW5kZXgpIHtcbiAgICAgICAgbGV2ZWxNYXBbbGV2ZWxdW3R5cGVdID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBjZXJ0YWluIHR5cGUgb2YgbWVzc2FnZSB3aWxsIGJlIHNlbnQgaW4gY3VycmVudCBsb2cgbGV2ZWwgb2YgZW52LlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjaGVja0xldmVsICh0eXBlKSB7XG4gIGNvbnN0IGxvZ0xldmVsID0gKGdsb2JhbC5XWEVudmlyb25tZW50ICYmIGdsb2JhbC5XWEVudmlyb25tZW50LmxvZ0xldmVsKSB8fCAnbG9nJ1xuICByZXR1cm4gbGV2ZWxNYXBbbG9nTGV2ZWxdICYmIGxldmVsTWFwW2xvZ0xldmVsXVt0eXBlXVxufVxuXG4vKipcbiAqIENvbnZlcnQgYWxsIGxvZyBhcmd1bWVudHMgaW50byBwcmltaXRpdmUgdmFsdWVzLlxuICogQHBhcmFtICB7YXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gZm9ybWF0IChhcmdzKSB7XG4gIHJldHVybiBhcmdzLm1hcCgodikgPT4ge1xuICAgIGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodilcbiAgICBpZiAodHlwZS50b0xvd2VyQ2FzZSgpID09PSAnW29iamVjdCBvYmplY3RdJykge1xuICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdiA9IFN0cmluZyh2KVxuICAgIH1cbiAgICByZXR1cm4gdlxuICB9KVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogUG9seWZpbGwgYHNldFRpbWVvdXRgIG9uIEFuZHJvaWQgVjggdXNpbmcgbmF0aXZlIG1ldGhvZFxuICogYHNldFRpbWVvdXROYXRpdmUoY2FsbGJhY2tJZCwgdGltZSlgIGFuZCBKUyBtZXRob2RcbiAqIGBzZXRUaW1lb3V0Q2FsbGJhY2soY2FsbGJhY2tJZClgLlxuICogVGhpcyBwb2x5ZmlsbCBpcyBvbmx5IHVzZWQgaW4gdmlydHVhbC1ET00gZGlmZiAmIGZsdXNoIGFnb3JpdGhtLiBOb3RcbiAqIGFjY2Vzc2VkIGJ5IEpTIEJ1bmRsZSBjb2RlIChUaGUgdGltZXIgQVBJcyBwb2x5ZmlsbCBmb3IgSlMgQnVuZGxlIGlzIGluXG4gKiBgaHRtbDUvZGVmYXVsdC9hcHAvY3RybC5qc2ApLlxuICovXG5cbmNvbnN0IG9yaWdpbmFsU2V0VGltZW91dCA9IGdsb2JhbC5zZXRUaW1lb3V0XG5jb25zdCBzZXRUaW1lb3V0TmF0aXZlID0gZ2xvYmFsLnNldFRpbWVvdXROYXRpdmVcblxuLyoqXG4gKiBTZXQgdXAgbmF0aXZlIHRpbWVyXG4gKi9cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TmF0aXZlVGltZXIgKCkge1xuICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBzZXRUaW1lb3V0TmF0aXZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3QgdGltZW91dE1hcCA9IHt9XG4gICAgbGV0IHRpbWVvdXRJZCA9IDBcblxuICAgIGdsb2JhbC5zZXRUaW1lb3V0ID0gKGNiLCB0aW1lKSA9PiB7XG4gICAgICB0aW1lb3V0TWFwWysrdGltZW91dElkXSA9IGNiXG4gICAgICBzZXRUaW1lb3V0TmF0aXZlKHRpbWVvdXRJZC50b1N0cmluZygpLCB0aW1lKVxuICAgIH1cblxuICAgIGdsb2JhbC5zZXRUaW1lb3V0Q2FsbGJhY2sgPSAoaWQpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdGltZW91dE1hcFtpZF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGltZW91dE1hcFtpZF0oKVxuICAgICAgICBkZWxldGUgdGltZW91dE1hcFtpZF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldE5hdGl2ZVRpbWVyICgpIHtcbiAgZ2xvYmFsLnNldFRpbWVvdXQgPSBvcmlnaW5hbFNldFRpbWVvdXRcbiAgZ2xvYmFsLnNldFRpbWVvdXRDYWxsYmFjayA9IG51bGxcbn1cblxuc2V0TmF0aXZlVGltZXIoKVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEZyZWV6ZSB0aGUgcHJvdG90eXBlIG9mIGphdmFzY3JpcHQgYnVpbGQtaW4gb2JqZWN0cy5cbiAqL1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmcmVlemVQcm90b3R5cGUgKCkge1xuICBPYmplY3QuZnJlZXplKE9iamVjdClcbiAgT2JqZWN0LmZyZWV6ZShBcnJheSlcblxuICAvLyBPYmplY3QuZnJlZXplKE9iamVjdC5wcm90b3R5cGUpXG4gIGZyZWV6ZU9iamVjdFByb3RvKClcbiAgT2JqZWN0LmZyZWV6ZShBcnJheS5wcm90b3R5cGUpXG4gIE9iamVjdC5mcmVlemUoU3RyaW5nLnByb3RvdHlwZSlcbiAgT2JqZWN0LmZyZWV6ZShOdW1iZXIucHJvdG90eXBlKVxuICBPYmplY3QuZnJlZXplKEJvb2xlYW4ucHJvdG90eXBlKVxuXG4gIC8vIE9iamVjdC5mcmVlemUoRXJyb3IucHJvdG90eXBlKVxuICBmcmVlemVFcnJvclByb3RvKClcbiAgT2JqZWN0LmZyZWV6ZShEYXRlLnByb3RvdHlwZSlcbiAgT2JqZWN0LmZyZWV6ZShSZWdFeHAucHJvdG90eXBlKVxufVxuXG5mdW5jdGlvbiBmcmVlemVPYmplY3RQcm90byAoKSB7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LnByb3RvdHlwZVxuICBjb25zdCBwcm90b05hbWUgPSAnT2JqZWN0LnByb3RvdHlwZSdcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ19fZGVmaW5lR2V0dGVyX18nLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdfX2RlZmluZVNldHRlcl9fJywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAnX19sb29rdXBHZXR0ZXJfXycsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ19fbG9va3VwU2V0dGVyX18nLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdjb25zdHJ1Y3RvcicsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ2hhc093blByb3BlcnR5JywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAnaXNQcm90b3R5cGVPZicsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAndG9Mb2NhbGVTdHJpbmcnLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICd0b1N0cmluZycsIHByb3RvTmFtZSlcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ3ZhbHVlT2YnLCBwcm90b05hbWUpXG4gIE9iamVjdC5zZWFsKHByb3RvKVxufVxuXG5mdW5jdGlvbiBmcmVlemVFcnJvclByb3RvICgpIHtcbiAgY29uc3QgcHJvdG8gPSBFcnJvci5wcm90b3R5cGVcbiAgY29uc3QgcHJvdG9OYW1lID0gJ0Vycm9yLnByb3RvdHlwZSdcbiAgZnJlZXplUHJvdG9Qcm9wZXJ0eShwcm90bywgJ25hbWUnLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdtZXNzYWdlJywgcHJvdG9OYW1lKVxuICBmcmVlemVQcm90b1Byb3BlcnR5KHByb3RvLCAndG9TdHJpbmcnLCBwcm90b05hbWUpXG4gIGZyZWV6ZVByb3RvUHJvcGVydHkocHJvdG8sICdjb25zdHJ1Y3RvcicsIHByb3RvTmFtZSlcbiAgT2JqZWN0LnNlYWwocHJvdG8pXG59XG5cbmZ1bmN0aW9uIGZyZWV6ZVByb3RvUHJvcGVydHkgKHByb3RvLCBwcm9wZXJ0eU5hbWUsIHByb3RvTmFtZSkge1xuICBpZiAoIXByb3RvLmhhc093blByb3BlcnR5KHByb3BlcnR5TmFtZSkpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG9yaWdpbiA9IHByb3RvW3Byb3BlcnR5TmFtZV1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBwcm9wZXJ0eU5hbWUsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvcmlnaW5cbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gcHJvdG8pIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCBhc3NpZ24gdG8gcmVhZCBvbmx5IHByb3BlcnR5ICR7cHJvcGVydHlOYW1lfSBvZiAke3Byb3RvTmFtZX1gKVxuICAgICAgfVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlOYW1lLCB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfSlcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICcuL2FycmF5RnJvbSdcbmltcG9ydCAnLi9vYmplY3RBc3NpZ24nXG5pbXBvcnQgJy4vb2JqZWN0U2V0UHJvdG90eXBlT2YnXG5cbi8vIGltcG9ydCBwcm9taXNlIGhhY2sgYW5kIHBvbHlmaWxsc1xuaW1wb3J0ICcuL3Byb21pc2UnXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZydcbmltcG9ydCAnY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InXG5pbXBvcnQgJ2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJ1xuaW1wb3J0ICdjb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UnXG5cbmV4cG9ydCAqIGZyb20gJy4vY29uc29sZSdcbmV4cG9ydCAqIGZyb20gJy4vc2V0VGltZW91dCdcbmV4cG9ydCAqIGZyb20gJy4vZnJlZXplJ1xuIiwiXG4vKipcbiAqIEdldCBhIHVuaXF1ZSBpZC5cbiAqL1xubGV0IG5leHROb2RlUmVmID0gMVxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZUlkICgpIHtcbiAgcmV0dXJuIChuZXh0Tm9kZVJlZisrKS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBvZiAodikge1xuICBjb25zdCBzID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpXG4gIHJldHVybiBzLnN1YnN0cmluZyg4LCBzLmxlbmd0aCAtIDEpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWZmZXJUb0Jhc2U2NCAoYnVmZmVyKSB7XG4gIGlmICh0eXBlb2YgYnRvYSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IHN0cmluZyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChcbiAgICBuZXcgVWludDhBcnJheShidWZmZXIpLFxuICAgIGNvZGUgPT4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKVxuICApLmpvaW4oJycpXG4gIHJldHVybiBidG9hKHN0cmluZykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0VG9CdWZmZXIgKGJhc2U2NCkge1xuICBpZiAodHlwZW9mIGF0b2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApXG4gIH1cbiAgY29uc3Qgc3RyaW5nID0gYXRvYihiYXNlNjQpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShzdHJpbmcubGVuZ3RoKVxuICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHN0cmluZywgKGNoLCBpKSA9PiB7XG4gICAgYXJyYXlbaV0gPSBjaC5jaGFyQ29kZUF0KDApXG4gIH0pXG4gIHJldHVybiBhcnJheS5idWZmZXJcbn1cbiIsImltcG9ydCB7IHR5cG9mLCBidWZmZXJUb0Jhc2U2NCwgYmFzZTY0VG9CdWZmZXIgfSBmcm9tICcuLi91dGlscydcblxuLyoqXG4gKiBOb3JtYWxpemUgYSBwcmltaXRpdmUgdmFsdWUuXG4gKiBAcGFyYW0gIHthbnl9ICAgICAgICB2XG4gKiBAcmV0dXJuIHtwcmltaXRpdmV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQcmltaXRpdmUgKHYpIHtcbiAgY29uc3QgdHlwZSA9IHR5cG9mKHYpXG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnVW5kZWZpbmVkJzpcbiAgICBjYXNlICdOdWxsJzpcbiAgICAgIHJldHVybiAnJ1xuXG4gICAgY2FzZSAnUmVnRXhwJzpcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKClcbiAgICBjYXNlICdEYXRlJzpcbiAgICAgIHJldHVybiB2LnRvSVNPU3RyaW5nKClcblxuICAgIGNhc2UgJ051bWJlcic6XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICBjYXNlICdCb29sZWFuJzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgY2FzZSAnT2JqZWN0JzpcbiAgICAgIHJldHVybiB2XG5cbiAgICBjYXNlICdBcnJheUJ1ZmZlcic6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnQHR5cGUnOiAnYmluYXJ5JyxcbiAgICAgICAgZGF0YVR5cGU6IHR5cGUsXG4gICAgICAgIGJhc2U2NDogYnVmZmVyVG9CYXNlNjQodilcbiAgICAgIH1cblxuICAgIGNhc2UgJ0ludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhBcnJheSc6XG4gICAgY2FzZSAnVWludDhDbGFtcGVkQXJyYXknOlxuICAgIGNhc2UgJ0ludDE2QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQxNkFycmF5JzpcbiAgICBjYXNlICdJbnQzMkFycmF5JzpcbiAgICBjYXNlICdVaW50MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQzMkFycmF5JzpcbiAgICBjYXNlICdGbG9hdDY0QXJyYXknOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ0B0eXBlJzogJ2JpbmFyeScsXG4gICAgICAgIGRhdGFUeXBlOiB0eXBlLFxuICAgICAgICBiYXNlNjQ6IGJ1ZmZlclRvQmFzZTY0KHYuYnVmZmVyKVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVQcmltaXRpdmUgKGRhdGEpIHtcbiAgaWYgKHR5cG9mKGRhdGEpID09PSAnT2JqZWN0Jykge1xuICAgIC8vIGRlY29kZSBiYXNlNjQgaW50byBiaW5hcnlcbiAgICBpZiAoZGF0YVsnQHR5cGUnXSAmJiBkYXRhWydAdHlwZSddID09PSAnYmluYXJ5Jykge1xuICAgICAgcmV0dXJuIGJhc2U2NFRvQnVmZmVyKGRhdGEuYmFzZTY0IHx8ICcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlYWxEYXRhID0ge31cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICByZWFsRGF0YVtrZXldID0gZGVjb2RlUHJpbWl0aXZlKGRhdGFba2V5XSlcbiAgICB9XG4gICAgcmV0dXJuIHJlYWxEYXRhXG4gIH1cbiAgaWYgKHR5cG9mKGRhdGEpID09PSAnQXJyYXknKSB7XG4gICAgcmV0dXJuIGRhdGEubWFwKGRlY29kZVByaW1pdGl2ZSlcbiAgfVxuICByZXR1cm4gZGF0YVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGRlY29kZVByaW1pdGl2ZSB9IGZyb20gJy4vbm9ybWFsaXplJ1xuXG4vKipcbiAqIEZvciBnZW5lcmFsIGNhbGxiYWNrIG1hbmFnZW1lbnQgb2YgYSBjZXJ0YWluIFdlZXggaW5zdGFuY2UuXG4gKiBCZWNhdXNlIGZ1bmN0aW9uIGNhbiBub3QgcGFzc2VkIGludG8gbmF0aXZlLCBzbyB3ZSBjcmVhdGUgY2FsbGJhY2tcbiAqIGNhbGxiYWNrIGlkIGZvciBlYWNoIGZ1bmN0aW9uIGFuZCBwYXNzIHRoZSBjYWxsYmFjayBpZCBpbnRvIG5hdGl2ZVxuICogaW4gZmFjdC4gQW5kIHdoZW4gYSBjYWxsYmFjayBjYWxsZWQgZnJvbSBuYXRpdmUsIHdlIGNhbiBmaW5kIHRoZSByZWFsXG4gKiBjYWxsYmFjayB0aHJvdWdoIHRoZSBjYWxsYmFjayBpZCB3ZSBoYXZlIHBhc3NlZCBiZWZvcmUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbGxiYWNrTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yIChpbnN0YW5jZUlkKSB7XG4gICAgdGhpcy5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZFxuICAgIHRoaXMubGFzdENhbGxiYWNrSWQgPSAwXG4gICAgdGhpcy5jYWxsYmFja3MgPSB7fVxuICB9XG4gIGFkZCAoY2FsbGJhY2spIHtcbiAgICB0aGlzLmxhc3RDYWxsYmFja0lkKytcbiAgICB0aGlzLmNhbGxiYWNrc1t0aGlzLmxhc3RDYWxsYmFja0lkXSA9IGNhbGxiYWNrXG4gICAgcmV0dXJuIHRoaXMubGFzdENhbGxiYWNrSWRcbiAgfVxuICByZW1vdmUgKGNhbGxiYWNrSWQpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2NhbGxiYWNrSWRdXG4gICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2NhbGxiYWNrSWRdXG4gICAgcmV0dXJuIGNhbGxiYWNrXG4gIH1cbiAgY29uc3VtZSAoY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuY2FsbGJhY2tzW2NhbGxiYWNrSWRdXG4gICAgaWYgKHR5cGVvZiBpZktlZXBBbGl2ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgaWZLZWVwQWxpdmUgPT09IGZhbHNlKSB7XG4gICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbY2FsbGJhY2tJZF1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGRlY29kZVByaW1pdGl2ZShkYXRhKSlcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBjYWxsYmFjayBpZCBcIiR7Y2FsbGJhY2tJZH1cImApXG4gIH1cbiAgY2xvc2UgKCkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0ge31cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IGRvY01hcCA9IHt9XG5cbi8qKlxuICogQWRkIGEgZG9jdW1lbnQgb2JqZWN0IGludG8gZG9jTWFwLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZERvYyAoaWQsIGRvYykge1xuICBpZiAoaWQpIHtcbiAgICBkb2NNYXBbaWRdID0gZG9jXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGRvY3VtZW50IG9iamVjdCBieSBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9jIChpZCkge1xuICByZXR1cm4gZG9jTWFwW2lkXVxufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgZG9jdW1lbnQgZnJvbSBkb2NNYXAgYnkgaWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURvYyAoaWQpIHtcbiAgZGVsZXRlIGRvY01hcFtpZF1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogR2V0IGxpc3RlbmVyIGJ5IGRvY3VtZW50IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcmV0dXJuIHtvYmplY3R9IGxpc3RlbmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaXN0ZW5lciAoaWQpIHtcbiAgY29uc3QgZG9jID0gZG9jTWFwW2lkXVxuICBpZiAoZG9jICYmIGRvYy5saXN0ZW5lcikge1xuICAgIHJldHVybiBkb2MubGlzdGVuZXJcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEdldCBUYXNrQ2VudGVyIGluc3RhbmNlIGJ5IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcmV0dXJuIHtvYmplY3R9IFRhc2tDZW50ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRhc2tDZW50ZXIgKGlkKSB7XG4gIGNvbnN0IGRvYyA9IGRvY01hcFtpZF1cbiAgaWYgKGRvYyAmJiBkb2MudGFza0NlbnRlcikge1xuICAgIHJldHVybiBkb2MudGFza0NlbnRlclxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogQXBwZW5kIGJvZHkgbm9kZSB0byBkb2N1bWVudEVsZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gYmVmb3JlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRCb2R5IChkb2MsIG5vZGUsIGJlZm9yZSkge1xuICBjb25zdCB7IGRvY3VtZW50RWxlbWVudCB9ID0gZG9jXG5cbiAgaWYgKGRvY3VtZW50RWxlbWVudC5wdXJlQ2hpbGRyZW4ubGVuZ3RoID4gMCB8fCBub2RlLnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBjaGlsZHJlbiA9IGRvY3VtZW50RWxlbWVudC5jaGlsZHJlblxuICBjb25zdCBiZWZvcmVJbmRleCA9IGNoaWxkcmVuLmluZGV4T2YoYmVmb3JlKVxuICBpZiAoYmVmb3JlSW5kZXggPCAwKSB7XG4gICAgY2hpbGRyZW4ucHVzaChub2RlKVxuICB9XG4gIGVsc2Uge1xuICAgIGNoaWxkcmVuLnNwbGljZShiZWZvcmVJbmRleCwgMCwgbm9kZSlcbiAgfVxuXG4gIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgaWYgKG5vZGUucm9sZSA9PT0gJ2JvZHknKSB7XG4gICAgICBub2RlLmRvY0lkID0gZG9jLmlkXG4gICAgICBub2RlLm93bmVyRG9jdW1lbnQgPSBkb2NcbiAgICAgIG5vZGUucGFyZW50Tm9kZSA9IGRvY3VtZW50RWxlbWVudFxuICAgICAgbGlua1BhcmVudChub2RlLCBkb2N1bWVudEVsZW1lbnQpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgY2hpbGQucGFyZW50Tm9kZSA9IG5vZGVcbiAgICAgIH0pXG4gICAgICBzZXRCb2R5KGRvYywgbm9kZSlcbiAgICAgIG5vZGUuZG9jSWQgPSBkb2MuaWRcbiAgICAgIG5vZGUub3duZXJEb2N1bWVudCA9IGRvY1xuICAgICAgbGlua1BhcmVudChub2RlLCBkb2N1bWVudEVsZW1lbnQpXG4gICAgICBkZWxldGUgZG9jLm5vZGVNYXBbbm9kZS5ub2RlSWRdXG4gICAgfVxuICAgIGRvY3VtZW50RWxlbWVudC5wdXJlQ2hpbGRyZW4ucHVzaChub2RlKVxuICAgIHNlbmRCb2R5KGRvYywgbm9kZSlcbiAgfVxuICBlbHNlIHtcbiAgICBub2RlLnBhcmVudE5vZGUgPSBkb2N1bWVudEVsZW1lbnRcbiAgICBkb2Mubm9kZU1hcFtub2RlLnJlZl0gPSBub2RlXG4gIH1cbn1cblxuZnVuY3Rpb24gc2VuZEJvZHkgKGRvYywgbm9kZSkge1xuICBjb25zdCBib2R5ID0gbm9kZS50b0pTT04oKVxuICBjb25zdCBjaGlsZHJlbiA9IGJvZHkuY2hpbGRyZW5cbiAgZGVsZXRlIGJvZHkuY2hpbGRyZW5cbiAgbGV0IHJlc3VsdCA9IGRvYy50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAnY3JlYXRlQm9keScgfSwgW2JvZHldKVxuICBpZiAoY2hpbGRyZW4pIHtcbiAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIHJlc3VsdCA9IGRvYy50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAnYWRkRWxlbWVudCcgfSwgW2JvZHkucmVmLCBjaGlsZCwgLTFdKVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFNldCB1cCBib2R5IG5vZGUuXG4gKiBAcGFyYW0ge29iamVjdH0gZG9jdW1lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRCb2R5IChkb2MsIGVsKSB7XG4gIGVsLnJvbGUgPSAnYm9keSdcbiAgZWwuZGVwdGggPSAxXG4gIGRlbGV0ZSBkb2Mubm9kZU1hcFtlbC5ub2RlSWRdXG4gIGVsLnJlZiA9ICdfcm9vdCdcbiAgZG9jLm5vZGVNYXAuX3Jvb3QgPSBlbFxuICBkb2MuYm9keSA9IGVsXG59XG5cbi8qKlxuICogRXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gcGFyZW50IGFuZCBjaGlsZCBub2RlLlxuICogQHBhcmFtIHtvYmplY3R9IGNoaWxkIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJlbnQgbm9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlua1BhcmVudCAobm9kZSwgcGFyZW50KSB7XG4gIG5vZGUucGFyZW50Tm9kZSA9IHBhcmVudFxuICBpZiAocGFyZW50LmRvY0lkKSB7XG4gICAgbm9kZS5kb2NJZCA9IHBhcmVudC5kb2NJZFxuICAgIG5vZGUub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50XG4gICAgbm9kZS5vd25lckRvY3VtZW50Lm5vZGVNYXBbbm9kZS5ub2RlSWRdID0gbm9kZVxuICAgIG5vZGUuZGVwdGggPSBwYXJlbnQuZGVwdGggKyAxXG4gIH1cbiAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICBsaW5rUGFyZW50KGNoaWxkLCBub2RlKVxuICB9KVxufVxuXG4vKipcbiAqIEdldCB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gbm9kZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dEVsZW1lbnQgKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmdcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcHJldmlvdXMgc2libGluZyBlbGVtZW50LlxuICogQHBhcmFtIHtvYmplY3R9IG5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXZpb3VzRWxlbWVudCAobm9kZSkge1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICByZXR1cm4gbm9kZVxuICAgIH1cbiAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmdcbiAgfVxufVxuXG4vKipcbiAqIEluc2VydCBhIG5vZGUgaW50byBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0IG5vZGVcbiAqIEBwYXJhbSB7YXJyYXl9IGxpc3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZXdJbmRleFxuICogQHBhcmFtIHtib29sZWFufSBjaGFuZ2VTaWJsaW5nXG4gKiBAcmV0dXJuIHtudW1iZXJ9IG5ld0luZGV4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRJbmRleCAodGFyZ2V0LCBsaXN0LCBuZXdJbmRleCwgY2hhbmdlU2libGluZykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAobmV3SW5kZXggPCAwKSB7XG4gICAgbmV3SW5kZXggPSAwXG4gIH1cbiAgY29uc3QgYmVmb3JlID0gbGlzdFtuZXdJbmRleCAtIDFdXG4gIGNvbnN0IGFmdGVyID0gbGlzdFtuZXdJbmRleF1cbiAgbGlzdC5zcGxpY2UobmV3SW5kZXgsIDAsIHRhcmdldClcbiAgaWYgKGNoYW5nZVNpYmxpbmcpIHtcbiAgICBiZWZvcmUgJiYgKGJlZm9yZS5uZXh0U2libGluZyA9IHRhcmdldClcbiAgICB0YXJnZXQucHJldmlvdXNTaWJsaW5nID0gYmVmb3JlXG4gICAgdGFyZ2V0Lm5leHRTaWJsaW5nID0gYWZ0ZXJcbiAgICBhZnRlciAmJiAoYWZ0ZXIucHJldmlvdXNTaWJsaW5nID0gdGFyZ2V0KVxuICB9XG4gIHJldHVybiBuZXdJbmRleFxufVxuXG4vKipcbiAqIE1vdmUgdGhlIG5vZGUgdG8gYSBuZXcgaW5kZXggaW4gbGlzdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgbm9kZVxuICogQHBhcmFtIHthcnJheX0gbGlzdFxuICogQHBhcmFtIHtudW1iZXJ9IG5ld0luZGV4XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNoYW5nZVNpYmxpbmdcbiAqIEByZXR1cm4ge251bWJlcn0gbmV3SW5kZXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdmVJbmRleCAodGFyZ2V0LCBsaXN0LCBuZXdJbmRleCwgY2hhbmdlU2libGluZykge1xuICBjb25zdCBpbmRleCA9IGxpc3QuaW5kZXhPZih0YXJnZXQpXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoY2hhbmdlU2libGluZykge1xuICAgIGNvbnN0IGJlZm9yZSA9IGxpc3RbaW5kZXggLSAxXVxuICAgIGNvbnN0IGFmdGVyID0gbGlzdFtpbmRleCArIDFdXG4gICAgYmVmb3JlICYmIChiZWZvcmUubmV4dFNpYmxpbmcgPSBhZnRlcilcbiAgICBhZnRlciAmJiAoYWZ0ZXIucHJldmlvdXNTaWJsaW5nID0gYmVmb3JlKVxuICB9XG4gIGxpc3Quc3BsaWNlKGluZGV4LCAxKVxuICBsZXQgbmV3SW5kZXhBZnRlciA9IG5ld0luZGV4XG4gIGlmIChpbmRleCA8PSBuZXdJbmRleCkge1xuICAgIG5ld0luZGV4QWZ0ZXIgPSBuZXdJbmRleCAtIDFcbiAgfVxuICBjb25zdCBiZWZvcmVOZXcgPSBsaXN0W25ld0luZGV4QWZ0ZXIgLSAxXVxuICBjb25zdCBhZnRlck5ldyA9IGxpc3RbbmV3SW5kZXhBZnRlcl1cbiAgbGlzdC5zcGxpY2UobmV3SW5kZXhBZnRlciwgMCwgdGFyZ2V0KVxuICBpZiAoY2hhbmdlU2libGluZykge1xuICAgIGJlZm9yZU5ldyAmJiAoYmVmb3JlTmV3Lm5leHRTaWJsaW5nID0gdGFyZ2V0KVxuICAgIHRhcmdldC5wcmV2aW91c1NpYmxpbmcgPSBiZWZvcmVOZXdcbiAgICB0YXJnZXQubmV4dFNpYmxpbmcgPSBhZnRlck5ld1xuICAgIGFmdGVyTmV3ICYmIChhZnRlck5ldy5wcmV2aW91c1NpYmxpbmcgPSB0YXJnZXQpXG4gIH1cbiAgaWYgKGluZGV4ID09PSBuZXdJbmRleEFmdGVyKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgcmV0dXJuIG5ld0luZGV4XG59XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBub2RlIGZyb20gbGlzdC5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXQgbm9kZVxuICogQHBhcmFtIHthcnJheX0gbGlzdFxuICogQHBhcmFtIHtib29sZWFufSBjaGFuZ2VTaWJsaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVJbmRleCAodGFyZ2V0LCBsaXN0LCBjaGFuZ2VTaWJsaW5nKSB7XG4gIGNvbnN0IGluZGV4ID0gbGlzdC5pbmRleE9mKHRhcmdldClcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVyblxuICB9XG4gIGlmIChjaGFuZ2VTaWJsaW5nKSB7XG4gICAgY29uc3QgYmVmb3JlID0gbGlzdFtpbmRleCAtIDFdXG4gICAgY29uc3QgYWZ0ZXIgPSBsaXN0W2luZGV4ICsgMV1cbiAgICBiZWZvcmUgJiYgKGJlZm9yZS5uZXh0U2libGluZyA9IGFmdGVyKVxuICAgIGFmdGVyICYmIChhZnRlci5wcmV2aW91c1NpYmxpbmcgPSBiZWZvcmUpXG4gIH1cbiAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IGdldERvYyB9IGZyb20gJy4vb3BlcmF0aW9uJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb2RlIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHRoaXMubm9kZUlkID0gdW5pcXVlSWQoKVxuICAgIHRoaXMucmVmID0gdGhpcy5ub2RlSWRcbiAgICB0aGlzLmNoaWxkcmVuID0gW11cbiAgICB0aGlzLnB1cmVDaGlsZHJlbiA9IFtdXG4gICAgdGhpcy5wYXJlbnROb2RlID0gbnVsbFxuICAgIHRoaXMubmV4dFNpYmxpbmcgPSBudWxsXG4gICAgdGhpcy5wcmV2aW91c1NpYmxpbmcgPSBudWxsXG4gIH1cblxuICAvKipcbiAgKiBEZXN0cm95IGN1cnJlbnQgbm9kZSwgYW5kIHJlbW92ZSBpdHNlbGYgZm9ybSBub2RlTWFwLlxuICAqL1xuICBkZXN0cm95ICgpIHtcbiAgICBjb25zdCBkb2MgPSBnZXREb2ModGhpcy5kb2NJZClcbiAgICBpZiAoZG9jKSB7XG4gICAgICBkZWxldGUgdGhpcy5kb2NJZFxuICAgICAgZGVsZXRlIGRvYy5ub2RlTWFwW3RoaXMubm9kZUlkXVxuICAgIH1cbiAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgY2hpbGQuZGVzdHJveSgpXG4gICAgfSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBnZXRUYXNrQ2VudGVyIH0gZnJvbSAnLi9vcGVyYXRpb24nXG5cbmxldCBFbGVtZW50XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRFbGVtZW50IChFbCkge1xuICBFbGVtZW50ID0gRWxcbn1cblxuLyoqXG4gKiBBIG1hcCB3aGljaCBzdG9yZXMgYWxsIHR5cGUgb2YgZWxlbWVudHMuXG4gKiBAdHlwZSB7T2JqZWN0fVxuICovXG5jb25zdCByZWdpc3RlcmVkRWxlbWVudHMgPSB7fVxuXG4vKipcbiAqIFJlZ2lzdGVyIGFuIGV4dGVuZGVkIGVsZW1lbnQgdHlwZSB3aXRoIGNvbXBvbmVudCBtZXRob2RzLlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlICAgIGNvbXBvbmVudCB0eXBlXG4gKiBAcGFyYW0gIHthcnJheX0gIG1ldGhvZHMgYSBsaXN0IG9mIG1ldGhvZCBuYW1lc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJFbGVtZW50ICh0eXBlLCBtZXRob2RzKSB7XG4gIC8vIFNraXAgd2hlbiBubyBzcGVjaWFsIGNvbXBvbmVudCBtZXRob2RzLlxuICBpZiAoIW1ldGhvZHMgfHwgIW1ldGhvZHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBJbml0IGNvbnN0cnVjdG9yLlxuICBjbGFzcyBXZWV4RWxlbWVudCBleHRlbmRzIEVsZW1lbnQge31cblxuICAvLyBBZGQgbWV0aG9kcyB0byBwcm90b3R5cGUuXG4gIG1ldGhvZHMuZm9yRWFjaChtZXRob2ROYW1lID0+IHtcbiAgICBXZWV4RWxlbWVudC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgIHJldHVybiB0YXNrQ2VudGVyLnNlbmQoJ2NvbXBvbmVudCcsIHtcbiAgICAgICAgICByZWY6IHRoaXMucmVmLFxuICAgICAgICAgIGNvbXBvbmVudDogdHlwZSxcbiAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWVcbiAgICAgICAgfSwgYXJncylcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgLy8gQWRkIHRvIGVsZW1lbnQgdHlwZSBtYXAuXG4gIHJlZ2lzdGVyZWRFbGVtZW50c1t0eXBlXSA9IFdlZXhFbGVtZW50XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyRWxlbWVudCAodHlwZSkge1xuICBkZWxldGUgcmVnaXN0ZXJlZEVsZW1lbnRzW3R5cGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWV4RWxlbWVudCAodHlwZSkge1xuICByZXR1cm4gcmVnaXN0ZXJlZEVsZW1lbnRzW3R5cGVdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dlZXhFbGVtZW50ICh0eXBlKSB7XG4gIHJldHVybiAhIXJlZ2lzdGVyZWRFbGVtZW50c1t0eXBlXVxufVxuXG4vKipcbiAqIENsZWFyIGFsbCBlbGVtZW50IHR5cGVzLiBPbmx5IGZvciB0ZXN0aW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJXZWV4RWxlbWVudHMgKCkge1xuICBmb3IgKGNvbnN0IHR5cGUgaW4gcmVnaXN0ZXJlZEVsZW1lbnRzKSB7XG4gICAgdW5yZWdpc3RlckVsZW1lbnQodHlwZSlcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwb2YgfSBmcm9tICcuLi91dGlscydcblxuLy8gbWF0Y2ggdGhlIGJpbmRpbmcgZGVsaW1pdGVyXG5jb25zdCBkZWxpbWl0ZXJSRSA9IC9cXFtcXFsoKD86LnxcXG4pKz8pXFxdXFxdL2dcblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlQmluZGluZyAodGV4dCkge1xuICBpZiAodHlwb2YodGV4dCkgPT09ICdTdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgJ0BiaW5kaW5nJzogdGV4dCB9XG4gIH1cbiAgcmV0dXJuIHRleHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RyaW5nIChzdHJpbmcpIHtcbiAgY29uc3QgdG9rZW5zID0gW11cbiAgbGV0IGxhc3RJbmRleCA9IGRlbGltaXRlclJFLmxhc3RJbmRleCA9IDBcbiAgbGV0IG1hdGNoLCBpbmRleFxuICB3aGlsZSAoKG1hdGNoID0gZGVsaW1pdGVyUkUuZXhlYyhzdHJpbmcpKSkge1xuICAgIGluZGV4ID0gbWF0Y2guaW5kZXhcbiAgICBpZiAoaW5kZXggPiBsYXN0SW5kZXgpIHtcbiAgICAgIHRva2Vucy5wdXNoKHN0cmluZy5zbGljZShsYXN0SW5kZXgsIGluZGV4KSlcbiAgICB9XG4gICAgY29uc3QgYmluZGluZyA9IGdlbmVyYXRlQmluZGluZyhtYXRjaFsxXS50cmltKCkpXG4gICAgdG9rZW5zLnB1c2goYmluZGluZylcbiAgICBsYXN0SW5kZXggPSBpbmRleCArIG1hdGNoWzBdLmxlbmd0aFxuICB9XG4gIGlmIChsYXN0SW5kZXggPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgdG9rZW5zLnB1c2goc3RyaW5nLnNsaWNlKGxhc3RJbmRleCkpXG4gIH1cbiAgaWYgKHRva2Vucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gdG9rZW5zWzBdXG4gIH1cbiAgcmV0dXJuIHRva2Vuc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRGlyZWN0aXZlICh2YWx1ZSkge1xuICBpZiAodHlwb2YodmFsdWUpID09PSAnU3RyaW5nJyAmJiBkZWxpbWl0ZXJSRS50ZXN0KHZhbHVlKSkge1xuICAgIHJldHVybiBwYXJzZVN0cmluZyh2YWx1ZSlcbiAgfVxuICBpZiAodHlwb2YodmFsdWUpID09PSAnT2JqZWN0Jykge1xuICAgIGNvbnN0IHJlYWxEYXRhID0ge31cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgcmVhbERhdGFba2V5XSA9IGZpbHRlckRpcmVjdGl2ZSh2YWx1ZVtrZXldKVxuICAgIH1cbiAgICByZXR1cm4gcmVhbERhdGFcbiAgfVxuICBpZiAodHlwb2YodmFsdWUpID09PSAnQXJyYXknKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcChmaWx0ZXJEaXJlY3RpdmUpXG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IE5vZGUgZnJvbSAnLi9Ob2RlJ1xuaW1wb3J0IHtcbiAgZ2V0RG9jLFxuICBnZXRUYXNrQ2VudGVyLFxuICBsaW5rUGFyZW50LFxuICBuZXh0RWxlbWVudCxcbiAgcHJldmlvdXNFbGVtZW50LFxuICBpbnNlcnRJbmRleCxcbiAgbW92ZUluZGV4LFxuICByZW1vdmVJbmRleFxufSBmcm9tICcuL29wZXJhdGlvbidcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBnZXRXZWV4RWxlbWVudCwgc2V0RWxlbWVudCB9IGZyb20gJy4vV2VleEVsZW1lbnQnXG5pbXBvcnQgeyBmaWx0ZXJEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZSdcblxuY29uc3QgREVGQVVMVF9UQUdfTkFNRSA9ICdkaXYnXG5jb25zdCBCVUJCTEVfRVZFTlRTID0gW1xuICAnY2xpY2snLCAnbG9uZ3ByZXNzJywgJ3RvdWNoc3RhcnQnLCAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJyxcbiAgJ3BhbnN0YXJ0JywgJ3Bhbm1vdmUnLCAncGFuZW5kJywgJ2hvcml6b250YWxwYW4nLCAndmVydGljYWxwYW4nLCAnc3dpcGUnXG5dXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTm9kZSAoZG9jSWQsIG5vZGUpIHtcbiAgY29uc3QgZG9jID0gZ2V0RG9jKGRvY0lkKVxuICBkb2Mubm9kZU1hcFtub2RlLm5vZGVJZF0gPSBub2RlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVsZW1lbnQgZXh0ZW5kcyBOb2RlIHtcbiAgY29uc3RydWN0b3IgKHR5cGUgPSBERUZBVUxUX1RBR19OQU1FLCBwcm9wcywgaXNFeHRlbmRlZCkge1xuICAgIHN1cGVyKClcblxuICAgIGNvbnN0IFdlZXhFbGVtZW50ID0gZ2V0V2VleEVsZW1lbnQodHlwZSlcbiAgICBpZiAoV2VleEVsZW1lbnQgJiYgIWlzRXh0ZW5kZWQpIHtcbiAgICAgIHJldHVybiBuZXcgV2VleEVsZW1lbnQocHJvcHMpXG4gICAgfVxuXG4gICAgcHJvcHMgPSBwcm9wcyB8fCB7fVxuICAgIHRoaXMubm9kZVR5cGUgPSAxXG4gICAgdGhpcy5ub2RlSWQgPSB1bmlxdWVJZCgpXG4gICAgdGhpcy5yZWYgPSB0aGlzLm5vZGVJZFxuICAgIHRoaXMudHlwZSA9IHR5cGVcbiAgICB0aGlzLmF0dHIgPSBwcm9wcy5hdHRyIHx8IHt9XG4gICAgdGhpcy5zdHlsZSA9IHByb3BzLnN0eWxlIHx8IHt9XG4gICAgdGhpcy5jbGFzc1N0eWxlID0gcHJvcHMuY2xhc3NTdHlsZSB8fCB7fVxuICAgIHRoaXMuZXZlbnQgPSB7fVxuICAgIHRoaXMuY2hpbGRyZW4gPSBbXVxuICAgIHRoaXMucHVyZUNoaWxkcmVuID0gW11cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmQgYSBjaGlsZCBub2RlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGFwcGVuZENoaWxkIChub2RlKSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSAmJiBub2RlLnBhcmVudE5vZGUgIT09IHRoaXMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHRoaXMpXG4gICAgICBpbnNlcnRJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgdHJ1ZSlcbiAgICAgIGlmICh0aGlzLmRvY0lkKSB7XG4gICAgICAgIHJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLCBub2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgaW5zZXJ0SW5kZXgobm9kZSwgdGhpcy5wdXJlQ2hpbGRyZW4sIHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aClcbiAgICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgICAgaWYgKHRhc2tDZW50ZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2FkZEVsZW1lbnQnIH0sXG4gICAgICAgICAgICBbdGhpcy5yZWYsIG5vZGUudG9KU09OKCksIC0xXVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG1vdmVJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmxlbmd0aCwgdHJ1ZSlcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbW92ZUluZGV4KG5vZGUsIHRoaXMucHVyZUNoaWxkcmVuLCB0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyICYmIGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ21vdmVFbGVtZW50JyB9LFxuICAgICAgICAgICAgW25vZGUucmVmLCB0aGlzLnJlZiwgaW5kZXhdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5vZGUgYmVmb3JlIHNwZWNpZmllZCBub2RlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gbm9kZVxuICAgKiBAcGFyYW0ge29iamVjdH0gYmVmb3JlXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgaW5zZXJ0QmVmb3JlIChub2RlLCBiZWZvcmUpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlICYmIG5vZGUucGFyZW50Tm9kZSAhPT0gdGhpcykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChub2RlID09PSBiZWZvcmUgfHwgKG5vZGUubmV4dFNpYmxpbmcgJiYgbm9kZS5uZXh0U2libGluZyA9PT0gYmVmb3JlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICghbm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICBsaW5rUGFyZW50KG5vZGUsIHRoaXMpXG4gICAgICBpbnNlcnRJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmluZGV4T2YoYmVmb3JlKSwgdHJ1ZSlcbiAgICAgIGlmICh0aGlzLmRvY0lkKSB7XG4gICAgICAgIHJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLCBub2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgY29uc3QgcHVyZUJlZm9yZSA9IG5leHRFbGVtZW50KGJlZm9yZSlcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbnNlcnRJbmRleChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLFxuICAgICAgICAgIHB1cmVCZWZvcmVcbiAgICAgICAgICA/IHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHVyZUJlZm9yZSlcbiAgICAgICAgICA6IHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgICAgcmV0dXJuIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAgICdkb20nLFxuICAgICAgICAgICAgeyBhY3Rpb246ICdhZGRFbGVtZW50JyB9LFxuICAgICAgICAgICAgW3RoaXMucmVmLCBub2RlLnRvSlNPTigpLCBpbmRleF1cbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBtb3ZlSW5kZXgobm9kZSwgdGhpcy5jaGlsZHJlbiwgdGhpcy5jaGlsZHJlbi5pbmRleE9mKGJlZm9yZSksIHRydWUpXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICBjb25zdCBwdXJlQmVmb3JlID0gbmV4dEVsZW1lbnQoYmVmb3JlKVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICBjb25zdCBpbmRleCA9IG1vdmVJbmRleChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLFxuICAgICAgICAgIHB1cmVCZWZvcmVcbiAgICAgICAgICA/IHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHVyZUJlZm9yZSlcbiAgICAgICAgICA6IHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyICYmIGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ21vdmVFbGVtZW50JyB9LFxuICAgICAgICAgICAgW25vZGUucmVmLCB0aGlzLnJlZiwgaW5kZXhdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5vZGUgYWZ0ZXIgc3BlY2lmaWVkIG5vZGUuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBub2RlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhZnRlclxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGluc2VydEFmdGVyIChub2RlLCBhZnRlcikge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUgJiYgbm9kZS5wYXJlbnROb2RlICE9PSB0aGlzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKG5vZGUgPT09IGFmdGVyIHx8IChub2RlLnByZXZpb3VzU2libGluZyAmJiBub2RlLnByZXZpb3VzU2libGluZyA9PT0gYWZ0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIGxpbmtQYXJlbnQobm9kZSwgdGhpcylcbiAgICAgIGluc2VydEluZGV4KG5vZGUsIHRoaXMuY2hpbGRyZW4sIHRoaXMuY2hpbGRyZW4uaW5kZXhPZihhZnRlcikgKyAxLCB0cnVlKVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICh0aGlzLmRvY0lkKSB7XG4gICAgICAgIHJlZ2lzdGVyTm9kZSh0aGlzLmRvY0lkLCBub2RlKVxuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbnNlcnRJbmRleChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLFxuICAgICAgICAgIHRoaXMucHVyZUNoaWxkcmVuLmluZGV4T2YocHJldmlvdXNFbGVtZW50KGFmdGVyKSkgKyAxXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKHRhc2tDZW50ZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2FkZEVsZW1lbnQnIH0sXG4gICAgICAgICAgICBbdGhpcy5yZWYsIG5vZGUudG9KU09OKCksIGluZGV4XVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG1vdmVJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLmluZGV4T2YoYWZ0ZXIpICsgMSwgdHJ1ZSlcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbW92ZUluZGV4KFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdGhpcy5wdXJlQ2hpbGRyZW4sXG4gICAgICAgICAgdGhpcy5wdXJlQ2hpbGRyZW4uaW5kZXhPZihwcmV2aW91c0VsZW1lbnQoYWZ0ZXIpKSArIDFcbiAgICAgICAgKVxuICAgICAgICBjb25zdCB0YXNrQ2VudGVyID0gZ2V0VGFza0NlbnRlcih0aGlzLmRvY0lkKVxuICAgICAgICBpZiAodGFza0NlbnRlciAmJiBpbmRleCA+PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAgICdkb20nLFxuICAgICAgICAgICAgeyBhY3Rpb246ICdtb3ZlRWxlbWVudCcgfSxcbiAgICAgICAgICAgIFtub2RlLnJlZiwgdGhpcy5yZWYsIGluZGV4XVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjaGlsZCBub2RlLCBhbmQgZGVjaWRlIHdoZXRoZXIgaXQgc2hvdWxkIGJlIGRlc3Ryb3llZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IG5vZGVcbiAgICogQHBhcmFtIHtib29sZWFufSBwcmVzZXJ2ZWRcbiAgICovXG4gIHJlbW92ZUNoaWxkIChub2RlLCBwcmVzZXJ2ZWQpIHtcbiAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICByZW1vdmVJbmRleChub2RlLCB0aGlzLmNoaWxkcmVuLCB0cnVlKVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgcmVtb3ZlSW5kZXgobm9kZSwgdGhpcy5wdXJlQ2hpbGRyZW4pXG4gICAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgICAgdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgICB7IGFjdGlvbjogJ3JlbW92ZUVsZW1lbnQnIH0sXG4gICAgICAgICAgICBbbm9kZS5yZWZdXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghcHJlc2VydmVkKSB7XG4gICAgICBub2RlLmRlc3Ryb3koKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY2hpbGQgbm9kZXMuXG4gICAqL1xuICBjbGVhciAoKSB7XG4gICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICB0aGlzLnB1cmVDaGlsZHJlbi5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICB0YXNrQ2VudGVyLnNlbmQoXG4gICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgeyBhY3Rpb246ICdyZW1vdmVFbGVtZW50JyB9LFxuICAgICAgICAgIFtub2RlLnJlZl1cbiAgICAgICAgKVxuICAgICAgfSlcbiAgICB9XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgbm9kZS5kZXN0cm95KClcbiAgICB9KVxuICAgIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gMFxuICAgIHRoaXMucHVyZUNoaWxkcmVuLmxlbmd0aCA9IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYW4gYXR0cmlidXRlLCBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIGJlIHNlbmQgdG8gbmF0aXZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudFxuICAgKi9cbiAgc2V0QXR0ciAoa2V5LCB2YWx1ZSwgc2lsZW50KSB7XG4gICAgaWYgKHRoaXMuYXR0cltrZXldID09PSB2YWx1ZSAmJiBzaWxlbnQgIT09IGZhbHNlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5hdHRyW2tleV0gPSB2YWx1ZVxuICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgaWYgKCFzaWxlbnQgJiYgdGFza0NlbnRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICAgIHJlc3VsdFtrZXldID0gZmlsdGVyRGlyZWN0aXZlKHZhbHVlKVxuICAgICAgdGFza0NlbnRlci5zZW5kKFxuICAgICAgICAnZG9tJyxcbiAgICAgICAgeyBhY3Rpb246ICd1cGRhdGVBdHRycycgfSxcbiAgICAgICAgW3RoaXMucmVmLCByZXN1bHRdXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHN0eWxlIHByb3BlcnR5LCBhbmQgZGVjaWRlIHdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIGJlIHNlbmQgdG8gbmF0aXZlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNpbGVudFxuICAgKi9cbiAgc2V0U3R5bGUgKGtleSwgdmFsdWUsIHNpbGVudCkge1xuICAgIGlmICh0aGlzLnN0eWxlW2tleV0gPT09IHZhbHVlICYmIHNpbGVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnN0eWxlW2tleV0gPSB2YWx1ZVxuICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgaWYgKCFzaWxlbnQgJiYgdGFza0NlbnRlcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgJ2RvbScsXG4gICAgICAgIHsgYWN0aW9uOiAndXBkYXRlU3R5bGUnIH0sXG4gICAgICAgIFt0aGlzLnJlZiwgcmVzdWx0XVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc3R5bGUgcHJvcGVydGllcyBmcm9tIGNsYXNzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY2xhc3NTdHlsZVxuICAgKi9cbiAgc2V0Q2xhc3NTdHlsZSAoY2xhc3NTdHlsZSkge1xuICAgIC8vIHJlc2V0IHByZXZpb3VzIGNsYXNzIHN0eWxlIHRvIGVtcHR5IHN0cmluZ1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY2xhc3NTdHlsZSkge1xuICAgICAgdGhpcy5jbGFzc1N0eWxlW2tleV0gPSAnJ1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5jbGFzc1N0eWxlLCBjbGFzc1N0eWxlKVxuICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgaWYgKHRhc2tDZW50ZXIpIHtcbiAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgJ2RvbScsXG4gICAgICAgIHsgYWN0aW9uOiAndXBkYXRlU3R5bGUnIH0sXG4gICAgICAgIFt0aGlzLnJlZiwgdGhpcy50b1N0eWxlKCldXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBldmVudCBoYW5kbGVyXG4gICAqL1xuICBhZGRFdmVudCAodHlwZSwgaGFuZGxlcikge1xuICAgIGlmICghdGhpcy5ldmVudFt0eXBlXSkge1xuICAgICAgdGhpcy5ldmVudFt0eXBlXSA9IGhhbmRsZXJcbiAgICAgIGNvbnN0IHRhc2tDZW50ZXIgPSBnZXRUYXNrQ2VudGVyKHRoaXMuZG9jSWQpXG4gICAgICBpZiAodGFza0NlbnRlcikge1xuICAgICAgICB0YXNrQ2VudGVyLnNlbmQoXG4gICAgICAgICAgJ2RvbScsXG4gICAgICAgICAgeyBhY3Rpb246ICdhZGRFdmVudCcgfSxcbiAgICAgICAgICBbdGhpcy5yZWYsIHR5cGVdXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGhhbmRsZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCB0eXBlXG4gICAqL1xuICByZW1vdmVFdmVudCAodHlwZSkge1xuICAgIGlmICh0aGlzLmV2ZW50W3R5cGVdKSB7XG4gICAgICBkZWxldGUgdGhpcy5ldmVudFt0eXBlXVxuICAgICAgY29uc3QgdGFza0NlbnRlciA9IGdldFRhc2tDZW50ZXIodGhpcy5kb2NJZClcbiAgICAgIGlmICh0YXNrQ2VudGVyKSB7XG4gICAgICAgIHRhc2tDZW50ZXIuc2VuZChcbiAgICAgICAgICAnZG9tJyxcbiAgICAgICAgICB7IGFjdGlvbjogJ3JlbW92ZUV2ZW50JyB9LFxuICAgICAgICAgIFt0aGlzLnJlZiwgdHlwZV1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlIGFuIGV2ZW50IG1hbnVhbGx5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSB0eXBlXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGUgaGFuZGxlclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQnViYmxlIHdoZXRoZXIgb3Igbm90IGV2ZW50IGJ1YmJsZVxuICAgKiBAcmV0dXJuIHt9IGFueXRoaW5nIHJldHVybmVkIGJ5IGhhbmRsZXIgZnVuY3Rpb25cbiAgICovXG4gIGZpcmVFdmVudCAodHlwZSwgZSwgaXNCdWJibGUpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbFxuICAgIGxldCBpc1N0b3BQcm9wYWdhdGlvbiA9IGZhbHNlXG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuZXZlbnRbdHlwZV1cbiAgICBpZiAoaGFuZGxlciAmJiBlKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbiA9ICgpID0+IHtcbiAgICAgICAgaXNTdG9wUHJvcGFnYXRpb24gPSB0cnVlXG4gICAgICB9XG4gICAgICByZXN1bHQgPSBoYW5kbGVyLmNhbGwodGhpcywgZSlcbiAgICB9XG5cbiAgICBpZiAoIWlzU3RvcFByb3BhZ2F0aW9uXG4gICAgICAmJiBpc0J1YmJsZVxuICAgICAgJiYgQlVCQkxFX0VWRU5UUy5pbmNsdWRlcyh0eXBlKVxuICAgICAgJiYgdGhpcy5wYXJlbnROb2RlXG4gICAgICAmJiB0aGlzLnBhcmVudE5vZGUuZmlyZUV2ZW50KSB7XG4gICAgICBlLmN1cnJlbnRUYXJnZXQgPSB0aGlzLnBhcmVudE5vZGVcbiAgICAgIHRoaXMucGFyZW50Tm9kZS5maXJlRXZlbnQodHlwZSwgZSwgaXNCdWJibGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgc3R5bGVzIG9mIGN1cnJlbnQgZWxlbWVudC5cbiAgICogQHJldHVybiB7b2JqZWN0fSBzdHlsZVxuICAgKi9cbiAgdG9TdHlsZSAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuY2xhc3NTdHlsZSwgdGhpcy5zdHlsZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGN1cnJlbnQgZWxlbWVudCB0byBKU09OIGxpa2Ugb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IGVsZW1lbnRcbiAgICovXG4gIHRvSlNPTiAoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgcmVmOiB0aGlzLnJlZi50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgYXR0cjogZmlsdGVyRGlyZWN0aXZlKHRoaXMuYXR0ciksXG4gICAgICBzdHlsZTogdGhpcy50b1N0eWxlKClcbiAgICB9XG4gICAgY29uc3QgZXZlbnQgPSBPYmplY3Qua2V5cyh0aGlzLmV2ZW50KVxuICAgIGlmIChldmVudC5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5ldmVudCA9IGV2ZW50XG4gICAgfVxuICAgIGlmICh0aGlzLnB1cmVDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IHRoaXMucHVyZUNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IGNoaWxkLnRvSlNPTigpKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0byBIVE1MIGVsZW1lbnQgdGFnIHN0cmluZy5cbiAgICogQHJldHVybiB7c3Rpcm5nfSBodG1sXG4gICAqL1xuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuICc8JyArIHRoaXMudHlwZSArXG4gICAgJyBhdHRyPScgKyBKU09OLnN0cmluZ2lmeSh0aGlzLmF0dHIpICtcbiAgICAnIHN0eWxlPScgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnRvU3R5bGUoKSkgKyAnPicgK1xuICAgIHRoaXMucHVyZUNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IGNoaWxkLnRvU3RyaW5nKCkpLmpvaW4oJycpICtcbiAgICAnPC8nICsgdGhpcy50eXBlICsgJz4nXG4gIH1cbn1cblxuc2V0RWxlbWVudChFbGVtZW50KVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgQ2FsbGJhY2tNYW5hZ2VyIGZyb20gJy4vQ2FsbGJhY2tNYW5hZ2VyJ1xuaW1wb3J0IEVsZW1lbnQgZnJvbSAnLi4vdmRvbS9FbGVtZW50J1xuaW1wb3J0IHsgdHlwb2YgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCB7IG5vcm1hbGl6ZVByaW1pdGl2ZSB9IGZyb20gJy4vbm9ybWFsaXplJ1xuXG5sZXQgZmFsbGJhY2sgPSBmdW5jdGlvbiAoKSB7fVxuXG4vLyBUaGUgQVBJIG9mIFRhc2tDZW50ZXIgd291bGQgYmUgcmUtZGVzaWduLlxuZXhwb3J0IGNsYXNzIFRhc2tDZW50ZXIge1xuICBjb25zdHJ1Y3RvciAoaWQsIHNlbmRUYXNrcykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaW5zdGFuY2VJZCcsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogaWRcbiAgICB9KVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnY2FsbGJhY2tNYW5hZ2VyJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBuZXcgQ2FsbGJhY2tNYW5hZ2VyKGlkKVxuICAgIH0pXG4gICAgZmFsbGJhY2sgPSBzZW5kVGFza3MgfHwgZnVuY3Rpb24gKCkge31cbiAgfVxuXG4gIGNhbGxiYWNrIChjYWxsYmFja0lkLCBkYXRhLCBpZktlZXBBbGl2ZSkge1xuICAgIHJldHVybiB0aGlzLmNhbGxiYWNrTWFuYWdlci5jb25zdW1lKGNhbGxiYWNrSWQsIGRhdGEsIGlmS2VlcEFsaXZlKVxuICB9XG5cbiAgZGVzdHJveUNhbGxiYWNrICgpIHtcbiAgICByZXR1cm4gdGhpcy5jYWxsYmFja01hbmFnZXIuY2xvc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBhIHZhbHVlLiBTcGVjaWFsbHksIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCB0aGVuIGdlbmVyYXRlIGEgZnVuY3Rpb24gaWRcbiAgICogYW5kIHNhdmUgaXQgdG8gYENhbGxiYWNrTWFuYWdlcmAsIGF0IGxhc3QgcmV0dXJuIHRoZSBmdW5jdGlvbiBpZC5cbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgdlxuICAgKiBAcmV0dXJuIHtwcmltaXRpdmV9XG4gICAqL1xuICBub3JtYWxpemUgKHYpIHtcbiAgICBjb25zdCB0eXBlID0gdHlwb2YodilcbiAgICBpZiAodiAmJiB2IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHYucmVmXG4gICAgfVxuICAgIGlmICh2ICYmIHYuX2lzVnVlICYmIHYuJGVsIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHYuJGVsLnJlZlxuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ0Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuY2FsbGJhY2tNYW5hZ2VyLmFkZCh2KS50b1N0cmluZygpXG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVQcmltaXRpdmUodilcbiAgfVxuXG4gIHNlbmQgKHR5cGUsIHBhcmFtcywgYXJncywgb3B0aW9ucykge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBjb21wb25lbnQsIHJlZiwgbW9kdWxlLCBtZXRob2QgfSA9IHBhcmFtc1xuXG4gICAgYXJncyA9IGFyZ3MubWFwKGFyZyA9PiB0aGlzLm5vcm1hbGl6ZShhcmcpKVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdkb20nOlxuICAgICAgICByZXR1cm4gdGhpc1thY3Rpb25dKHRoaXMuaW5zdGFuY2VJZCwgYXJncylcbiAgICAgIGNhc2UgJ2NvbXBvbmVudCc6XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLCByZWYsIG1ldGhvZCwgYXJncywgT2JqZWN0LmFzc2lnbih7IGNvbXBvbmVudCB9LCBvcHRpb25zKSlcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLm1vZHVsZUhhbmRsZXIodGhpcy5pbnN0YW5jZUlkLCBtb2R1bGUsIG1ldGhvZCwgYXJncywgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICBjYWxsRE9NIChhY3Rpb24sIGFyZ3MpIHtcbiAgICByZXR1cm4gdGhpc1thY3Rpb25dKHRoaXMuaW5zdGFuY2VJZCwgYXJncylcbiAgfVxuXG4gIGNhbGxDb21wb25lbnQgKHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50SGFuZGxlcih0aGlzLmluc3RhbmNlSWQsIHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKVxuICB9XG5cbiAgY2FsbE1vZHVsZSAobW9kdWxlLCBtZXRob2QsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tb2R1bGVIYW5kbGVyKHRoaXMuaW5zdGFuY2VJZCwgbW9kdWxlLCBtZXRob2QsIGFyZ3MsIG9wdGlvbnMpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKCkge1xuICBjb25zdCBET01fTUVUSE9EUyA9IHtcbiAgICBjcmVhdGVGaW5pc2g6IGdsb2JhbC5jYWxsQ3JlYXRlRmluaXNoLFxuICAgIHVwZGF0ZUZpbmlzaDogZ2xvYmFsLmNhbGxVcGRhdGVGaW5pc2gsXG4gICAgcmVmcmVzaEZpbmlzaDogZ2xvYmFsLmNhbGxSZWZyZXNoRmluaXNoLFxuXG4gICAgY3JlYXRlQm9keTogZ2xvYmFsLmNhbGxDcmVhdGVCb2R5LFxuXG4gICAgYWRkRWxlbWVudDogZ2xvYmFsLmNhbGxBZGRFbGVtZW50LFxuICAgIHJlbW92ZUVsZW1lbnQ6IGdsb2JhbC5jYWxsUmVtb3ZlRWxlbWVudCxcbiAgICBtb3ZlRWxlbWVudDogZ2xvYmFsLmNhbGxNb3ZlRWxlbWVudCxcbiAgICB1cGRhdGVBdHRyczogZ2xvYmFsLmNhbGxVcGRhdGVBdHRycyxcbiAgICB1cGRhdGVTdHlsZTogZ2xvYmFsLmNhbGxVcGRhdGVTdHlsZSxcblxuICAgIGFkZEV2ZW50OiBnbG9iYWwuY2FsbEFkZEV2ZW50LFxuICAgIHJlbW92ZUV2ZW50OiBnbG9iYWwuY2FsbFJlbW92ZUV2ZW50XG4gIH1cbiAgY29uc3QgcHJvdG8gPSBUYXNrQ2VudGVyLnByb3RvdHlwZVxuXG4gIGZvciAoY29uc3QgbmFtZSBpbiBET01fTUVUSE9EUykge1xuICAgIGNvbnN0IG1ldGhvZCA9IERPTV9NRVRIT0RTW25hbWVdXG4gICAgcHJvdG9bbmFtZV0gPSBtZXRob2QgP1xuICAgICAgKGlkLCBhcmdzKSA9PiBtZXRob2QoaWQsIC4uLmFyZ3MpIDpcbiAgICAgIChpZCwgYXJncykgPT4gZmFsbGJhY2soaWQsIFt7IG1vZHVsZTogJ2RvbScsIG1ldGhvZDogbmFtZSwgYXJncyB9XSwgJy0xJylcbiAgfVxuXG4gIHByb3RvLmNvbXBvbmVudEhhbmRsZXIgPSBnbG9iYWwuY2FsbE5hdGl2ZUNvbXBvbmVudCB8fFxuICAgICgoaWQsIHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKSA9PlxuICAgICAgZmFsbGJhY2soaWQsIFt7IGNvbXBvbmVudDogb3B0aW9ucy5jb21wb25lbnQsIHJlZiwgbWV0aG9kLCBhcmdzIH1dKSlcblxuICBwcm90by5tb2R1bGVIYW5kbGVyID0gZ2xvYmFsLmNhbGxOYXRpdmVNb2R1bGUgfHxcbiAgICAoKGlkLCBtb2R1bGUsIG1ldGhvZCwgYXJncykgPT5cbiAgICAgIGZhbGxiYWNrKGlkLCBbeyBtb2R1bGUsIG1ldGhvZCwgYXJncyB9XSkpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gSlMgU2VydmljZXNcblxuZXhwb3J0IGNvbnN0IHNlcnZpY2VzID0gW11cblxuLyoqXG4gKiBSZWdpc3RlciBhIEphdmFTY3JpcHQgc2VydmljZS5cbiAqIEEgSmF2YVNjcmlwdCBzZXJ2aWNlIG9wdGlvbnMgY291bGQgaGF2ZSBhIHNldCBvZiBsaWZlY3ljbGUgbWV0aG9kc1xuICogZm9yIGVhY2ggV2VleCBpbnN0YW5jZS4gRm9yIGV4YW1wbGU6IGNyZWF0ZSwgcmVmcmVzaCwgZGVzdHJveS5cbiAqIEZvciB0aGUgSlMgZnJhbWV3b3JrIG1haW50YWluZXIgaWYgeW91IHdhbnQgdG8gc3VwcGx5IHNvbWUgZmVhdHVyZXNcbiAqIHdoaWNoIG5lZWQgdG8gd29yayB3ZWxsIGluIGRpZmZlcmVudCBXZWV4IGluc3RhbmNlcywgZXZlbiBpbiBkaWZmZXJlbnRcbiAqIGZyYW1ld29ya3Mgc2VwYXJhdGVseS4gWW91IGNhbiBtYWtlIGEgSmF2YVNjcmlwdCBzZXJ2aWNlIHRvIGluaXRcbiAqIGl0cyB2YXJpYWJsZXMgb3IgY2xhc3NlcyBmb3IgZWFjaCBXZWV4IGluc3RhbmNlIHdoZW4gaXQncyBjcmVhdGVkXG4gKiBhbmQgcmVjeWNsZSB0aGVtIHdoZW4gaXQncyBkZXN0cm95ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBDb3VsZCBoYXZlIHsgY3JlYXRlLCByZWZyZXNoLCBkZXN0cm95IH1cbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZSBtZXRob2RzLiBJbiBjcmVhdGUgbWV0aG9kIGl0IHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFuIG9iamVjdCBvZiB3aGF0IHZhcmlhYmxlcyBvciBjbGFzc2VzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBiZSBpbmplY3RlZCBpbnRvIHRoZSBXZWV4IGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXIgKG5hbWUsIG9wdGlvbnMpIHtcbiAgaWYgKGhhcyhuYW1lKSkge1xuICAgIGNvbnNvbGUud2FybihgU2VydmljZSBcIiR7bmFtZX1cIiBoYXMgYmVlbiByZWdpc3RlcmVkIGFscmVhZHkhYClcbiAgfVxuICBlbHNlIHtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucylcbiAgICBzZXJ2aWNlcy5wdXNoKHsgbmFtZSwgb3B0aW9ucyB9KVxuICB9XG59XG5cbi8qKlxuICogVW5yZWdpc3RlciBhIEphdmFTY3JpcHQgc2VydmljZSBieSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5yZWdpc3RlciAobmFtZSkge1xuICBzZXJ2aWNlcy5zb21lKChzZXJ2aWNlLCBpbmRleCkgPT4ge1xuICAgIGlmIChzZXJ2aWNlLm5hbWUgPT09IG5hbWUpIHtcbiAgICAgIHNlcnZpY2VzLnNwbGljZShpbmRleCwgMSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgSmF2YVNjcmlwdCBzZXJ2aWNlIHdpdGggYSBjZXJ0YWluIG5hbWUgZXhpc3RlZC5cbiAqIEBwYXJhbSAge3N0cmluZ30gIG5hbWVcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXMgKG5hbWUpIHtcbiAgcmV0dXJuIGluZGV4T2YobmFtZSkgPj0gMFxufVxuXG4vKipcbiAqIEZpbmQgdGhlIGluZGV4IG9mIGEgSmF2YVNjcmlwdCBzZXJ2aWNlIGJ5IG5hbWVcbiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBpbmRleE9mIChuYW1lKSB7XG4gIHJldHVybiBzZXJ2aWNlcy5tYXAoc2VydmljZSA9PiBzZXJ2aWNlLm5hbWUpLmluZGV4T2YobmFtZSlcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgaW5pdCBhcyBpbml0VGFza0hhbmRsZXIgfSBmcm9tICcuLi9icmlkZ2UvVGFza0NlbnRlcidcbmltcG9ydCB7IHJlZ2lzdGVyRWxlbWVudCB9IGZyb20gJy4uL3Zkb20vV2VleEVsZW1lbnQnXG5pbXBvcnQgeyBzZXJ2aWNlcywgcmVnaXN0ZXIsIHVucmVnaXN0ZXIgfSBmcm9tICcuL3NlcnZpY2UnXG5cbmxldCBmcmFtZXdvcmtzXG5sZXQgcnVudGltZUNvbmZpZ1xuXG5jb25zdCB2ZXJzaW9uUmVnRXhwID0gL15cXHMqXFwvXFwvICooXFx7W159XSpcXH0pICpcXHI/XFxuL1xuXG4vKipcbiAqIERldGVjdCBhIEpTIEJ1bmRsZSBjb2RlIGFuZCBtYWtlIHN1cmUgd2hpY2ggZnJhbWV3b3JrIGl0J3MgYmFzZWQgdG8uIEVhY2ggSlNcbiAqIEJ1bmRsZSBzaG91bGQgbWFrZSBzdXJlIHRoYXQgaXQgc3RhcnRzIHdpdGggYSBsaW5lIG9mIEpTT04gY29tbWVudCBhbmQgaXNcbiAqIG1vcmUgdGhhdCBvbmUgbGluZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gY29kZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRCdW5kbGVUeXBlIChjb2RlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHZlcnNpb25SZWdFeHAuZXhlYyhjb2RlKVxuICBpZiAocmVzdWx0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJlc3VsdFsxXSlcbiAgICAgIHJldHVybiBpbmZvLmZyYW1ld29ya1xuICAgIH1cbiAgICBjYXRjaCAoZSkge31cbiAgfVxuXG4gIC8vIGRlZmF1bHQgYnVuZGxlIHR5cGVcbiAgcmV0dXJuICdXZWV4J1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTZXJ2aWNlcyAoaWQsIGVudiwgY29uZmlnKSB7XG4gIC8vIEluaXQgSmF2YVNjcmlwdCBzZXJ2aWNlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgY29uc3Qgc2VydmljZU1hcCA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgc2VydmljZU1hcC5zZXJ2aWNlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICBzZXJ2aWNlcy5mb3JFYWNoKCh7IG5hbWUsIG9wdGlvbnMgfSkgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgW0pTIFJ1bnRpbWVdIGNyZWF0ZSBzZXJ2aWNlICR7bmFtZX0uYClcbiAgICB9XG4gICAgY29uc3QgY3JlYXRlID0gb3B0aW9ucy5jcmVhdGVcbiAgICBpZiAoY3JlYXRlKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBjcmVhdGUoaWQsIGVudiwgY29uZmlnKVxuICAgICAgT2JqZWN0LmFzc2lnbihzZXJ2aWNlTWFwLnNlcnZpY2UsIHJlc3VsdClcbiAgICAgIE9iamVjdC5hc3NpZ24oc2VydmljZU1hcCwgcmVzdWx0Lmluc3RhbmNlKVxuICAgIH1cbiAgfSlcbiAgZGVsZXRlIHNlcnZpY2VNYXAuc2VydmljZS5pbnN0YW5jZVxuICBPYmplY3QuZnJlZXplKHNlcnZpY2VNYXAuc2VydmljZSlcbiAgcmV0dXJuIHNlcnZpY2VNYXBcbn1cblxuY29uc3QgaW5zdGFuY2VNYXAgPSB7fVxuXG5mdW5jdGlvbiBnZXRGcmFtZXdvcmtUeXBlIChpZCkge1xuICBpZiAoaW5zdGFuY2VNYXBbaWRdKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlTWFwW2lkXS5mcmFtZXdvcmtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoaWNoIGZyYW1ld29yayBhIGNlcnRhaW4gSlMgQnVuZGxlIGNvZGUgYmFzZWQgdG8uIEFuZCBjcmVhdGUgaW5zdGFuY2VcbiAqIGJ5IHRoaXMgZnJhbWV3b3JrLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UgKGlkLCBjb2RlLCBjb25maWcsIGRhdGEpIHtcbiAgaWYgKGluc3RhbmNlTWFwW2lkXSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxuXG4gIC8vIEluaXQgaW5zdGFuY2UgaW5mby5cbiAgY29uc3QgYnVuZGxlVHlwZSA9IGdldEJ1bmRsZVR5cGUoY29kZSlcblxuICAvLyBJbml0IGluc3RhbmNlIGNvbmZpZy5cbiAgY29uZmlnID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb25maWcgfHwge30pKVxuICBjb25maWcuZW52ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShnbG9iYWwuV1hFbnZpcm9ubWVudCB8fCB7fSkpXG5cbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICBjb25maWcsXG4gICAgY3JlYXRlZDogRGF0ZS5ub3coKSxcbiAgICBmcmFtZXdvcms6IGJ1bmRsZVR5cGVcbiAgfVxuICBjb250ZXh0LnNlcnZpY2VzID0gY3JlYXRlU2VydmljZXMoaWQsIGNvbnRleHQsIHJ1bnRpbWVDb25maWcpXG4gIGluc3RhbmNlTWFwW2lkXSA9IGNvbnRleHRcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBjcmVhdGUgYW4gJHtidW5kbGVUeXBlfSBpbnN0YW5jZWApXG4gIH1cblxuICBjb25zdCBmbSA9IGZyYW1ld29ya3NbYnVuZGxlVHlwZV1cbiAgaWYgKCFmbSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgYnVuZGxlIHR5cGUgXCIke2J1bmRsZVR5cGV9XCIuYClcbiAgfVxuXG4gIHJldHVybiBmbS5jcmVhdGVJbnN0YW5jZShpZCwgY29kZSwgY29uZmlnLCBkYXRhLCBjb250ZXh0KVxufVxuXG5jb25zdCBtZXRob2RzID0ge1xuICBjcmVhdGVJbnN0YW5jZSxcbiAgcmVnaXN0ZXJTZXJ2aWNlOiByZWdpc3RlcixcbiAgdW5yZWdpc3RlclNlcnZpY2U6IHVucmVnaXN0ZXJcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBtZXRob2RzIHdoaWNoIGluaXQgZWFjaCBmcmFtZXdvcmtzLlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAqL1xuZnVuY3Rpb24gZ2VuSW5pdCAobWV0aG9kTmFtZSkge1xuICBtZXRob2RzW21ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gJ3JlZ2lzdGVyQ29tcG9uZW50cycpIHtcbiAgICAgIGNoZWNrQ29tcG9uZW50TWV0aG9kcyhhcmdzWzBdKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gZnJhbWV3b3Jrcykge1xuICAgICAgY29uc3QgZnJhbWV3b3JrID0gZnJhbWV3b3Jrc1tuYW1lXVxuICAgICAgaWYgKGZyYW1ld29yayAmJiBmcmFtZXdvcmtbbWV0aG9kTmFtZV0pIHtcbiAgICAgICAgZnJhbWV3b3JrW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrQ29tcG9uZW50TWV0aG9kcyAoY29tcG9uZW50cykge1xuICBpZiAoQXJyYXkuaXNBcnJheShjb21wb25lbnRzKSkge1xuICAgIGNvbXBvbmVudHMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgaWYgKG5hbWUgJiYgbmFtZS50eXBlICYmIG5hbWUubWV0aG9kcykge1xuICAgICAgICByZWdpc3RlckVsZW1lbnQobmFtZS50eXBlLCBuYW1lLm1ldGhvZHMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIG1ldGhvZHMgd2hpY2ggd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICovXG5mdW5jdGlvbiBnZW5JbnN0YW5jZSAobWV0aG9kTmFtZSkge1xuICBtZXRob2RzW21ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBpZCA9IGFyZ3NbMF1cbiAgICBjb25zdCB0eXBlID0gZ2V0RnJhbWV3b3JrVHlwZShpZClcbiAgICBpZiAodHlwZSAmJiBmcmFtZXdvcmtzW3R5cGVdKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBmcmFtZXdvcmtzW3R5cGVdW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICBjb25zdCBpbmZvID0geyBmcmFtZXdvcms6IHR5cGUgfVxuXG4gICAgICAvLyBMaWZlY3ljbGUgbWV0aG9kc1xuICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdyZWZyZXNoSW5zdGFuY2UnKSB7XG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVmcmVzaCA9IHNlcnZpY2Uub3B0aW9ucy5yZWZyZXNoXG4gICAgICAgICAgaWYgKHJlZnJlc2gpIHtcbiAgICAgICAgICAgIHJlZnJlc2goaWQsIHsgaW5mbywgcnVudGltZTogcnVudGltZUNvbmZpZyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICdkZXN0cm95SW5zdGFuY2UnKSB7XG4gICAgICAgIHNlcnZpY2VzLmZvckVhY2goc2VydmljZSA9PiB7XG4gICAgICAgICAgY29uc3QgZGVzdHJveSA9IHNlcnZpY2Uub3B0aW9ucy5kZXN0cm95XG4gICAgICAgICAgaWYgKGRlc3Ryb3kpIHtcbiAgICAgICAgICAgIGRlc3Ryb3koaWQsIHsgaW5mbywgcnVudGltZTogcnVudGltZUNvbmZpZyB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgZGVsZXRlIGluc3RhbmNlTWFwW2lkXVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxufVxuXG4vKipcbiAqIEFkYXB0IHNvbWUgbGVnYWN5IG1ldGhvZChzKSB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaCBpbnN0YW5jZS4gVGhlc2VcbiAqIG1ldGhvZHMgc2hvdWxkIGJlIGRlcHJlY2F0ZWQgYW5kIHJlbW92ZWQgbGF0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hdGl2ZU1ldGhvZE5hbWVcbiAqL1xuZnVuY3Rpb24gYWRhcHRJbnN0YW5jZSAobWV0aG9kTmFtZSwgbmF0aXZlTWV0aG9kTmFtZSkge1xuICBtZXRob2RzW25hdGl2ZU1ldGhvZE5hbWVdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICBjb25zdCBpZCA9IGFyZ3NbMF1cbiAgICBjb25zdCB0eXBlID0gZ2V0RnJhbWV3b3JrVHlwZShpZClcbiAgICBpZiAodHlwZSAmJiBmcmFtZXdvcmtzW3R5cGVdKSB7XG4gICAgICByZXR1cm4gZnJhbWV3b3Jrc1t0eXBlXVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEVycm9yKGBpbnZhbGlkIGluc3RhbmNlIGlkIFwiJHtpZH1cImApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdCAoY29uZmlnKSB7XG4gIHJ1bnRpbWVDb25maWcgPSBjb25maWcgfHwge31cbiAgZnJhbWV3b3JrcyA9IHJ1bnRpbWVDb25maWcuZnJhbWV3b3JrcyB8fCB7fVxuICBpbml0VGFza0hhbmRsZXIoKVxuXG4gIC8vIEluaXQgZWFjaCBmcmFtZXdvcmsgYnkgYGluaXRgIG1ldGhvZCBhbmQgYGNvbmZpZ2Agd2hpY2ggY29udGFpbnMgdGhyZWVcbiAgLy8gdmlydHVhbC1ET00gQ2xhc3M6IGBEb2N1bWVudGAsIGBFbGVtZW50YCAmIGBDb21tZW50YCwgYW5kIGEgSlMgYnJpZGdlIG1ldGhvZDpcbiAgLy8gYHNlbmRUYXNrcyguLi5hcmdzKWAuXG4gIGZvciAoY29uc3QgbmFtZSBpbiBmcmFtZXdvcmtzKSB7XG4gICAgY29uc3QgZnJhbWV3b3JrID0gZnJhbWV3b3Jrc1tuYW1lXVxuICAgIGZyYW1ld29yay5pbml0KGNvbmZpZylcbiAgfVxuXG4gIC8vIEB0b2RvOiBUaGUgbWV0aG9kIGByZWdpc3Rlck1ldGhvZHNgIHdpbGwgYmUgcmUtZGVzaWduZWQgb3IgcmVtb3ZlZCBsYXRlci5cbiAgOyBbJ3JlZ2lzdGVyQ29tcG9uZW50cycsICdyZWdpc3Rlck1vZHVsZXMnLCAncmVnaXN0ZXJNZXRob2RzJ10uZm9yRWFjaChnZW5Jbml0KVxuXG4gIDsgWydkZXN0cm95SW5zdGFuY2UnLCAncmVmcmVzaEluc3RhbmNlJywgJ3JlY2VpdmVUYXNrcycsICdnZXRSb290J10uZm9yRWFjaChnZW5JbnN0YW5jZSlcblxuICBhZGFwdEluc3RhbmNlKCdyZWNlaXZlVGFza3MnLCAnY2FsbEpTJylcblxuICByZXR1cm4gbWV0aG9kc1xufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBOb2RlIGZyb20gJy4vTm9kZSdcbmltcG9ydCB7IHVuaXF1ZUlkIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbW1lbnQgZXh0ZW5kcyBOb2RlIHtcbiAgY29uc3RydWN0b3IgKHZhbHVlKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5ub2RlVHlwZSA9IDhcbiAgICB0aGlzLm5vZGVJZCA9IHVuaXF1ZUlkKClcbiAgICB0aGlzLnJlZiA9IHRoaXMubm9kZUlkXG4gICAgdGhpcy50eXBlID0gJ2NvbW1lbnQnXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdXG4gICAgdGhpcy5wdXJlQ2hpbGRyZW4gPSBbXVxuICB9XG5cbiAgLyoqXG4gICogQ29udmVydCB0byBIVE1MIGNvbW1lbnQgc3RyaW5nLlxuICAqIEByZXR1cm4ge3N0aXJuZ30gaHRtbFxuICAqL1xuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuICc8IS0tICcgKyB0aGlzLnZhbHVlICsgJyAtLT4nXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiogQ3JlYXRlIHRoZSBhY3Rpb24gb2JqZWN0LlxuKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuKiBAcGFyYW0ge2FycmF5fSBhcmd1bWVudHNcbiogQHJldHVybiB7b2JqZWN0fSBhY3Rpb25cbiovXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb24gKG5hbWUsIGFyZ3MgPSBbXSkge1xuICByZXR1cm4geyBtb2R1bGU6ICdkb20nLCBtZXRob2Q6IG5hbWUsIGFyZ3M6IGFyZ3MgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXN0ZW5lciB7XG4gIGNvbnN0cnVjdG9yIChpZCwgaGFuZGxlcikge1xuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMuYmF0Y2hlZCA9IGZhbHNlXG4gICAgdGhpcy51cGRhdGVzID0gW11cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaGFuZGxlcicsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGhhbmRsZXJcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignW0pTIFJ1bnRpbWVdIGludmFsaWQgcGFyYW1ldGVyLCBoYW5kbGVyIG11c3QgYmUgYSBmdW5jdGlvbicpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIFwiY3JlYXRlRmluaXNoXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGNyZWF0ZUZpbmlzaCAoY2FsbGJhY2spIHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyXG4gICAgcmV0dXJuIGhhbmRsZXIoW2NyZWF0ZUFjdGlvbignY3JlYXRlRmluaXNoJyldLCBjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInVwZGF0ZUZpbmlzaFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICB1cGRhdGVGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlclxuICAgIHJldHVybiBoYW5kbGVyKFtjcmVhdGVBY3Rpb24oJ3VwZGF0ZUZpbmlzaCcpXSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJyZWZyZXNoRmluaXNoXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHJlZnJlc2hGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlclxuICAgIHJldHVybiBoYW5kbGVyKFtjcmVhdGVBY3Rpb24oJ3JlZnJlc2hGaW5pc2gnKV0sIGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIFwiY3JlYXRlQm9keVwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnRcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICBjcmVhdGVCb2R5IChlbGVtZW50KSB7XG4gICAgY29uc3QgYm9keSA9IGVsZW1lbnQudG9KU09OKClcbiAgICBjb25zdCBjaGlsZHJlbiA9IGJvZHkuY2hpbGRyZW5cbiAgICBkZWxldGUgYm9keS5jaGlsZHJlblxuICAgIGNvbnN0IGFjdGlvbnMgPSBbY3JlYXRlQWN0aW9uKCdjcmVhdGVCb2R5JywgW2JvZHldKV1cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGFjdGlvbnMucHVzaC5hcHBseShhY3Rpb25zLCBjaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlQWN0aW9uKCdhZGRFbGVtZW50JywgW2JvZHkucmVmLCBjaGlsZCwgLTFdKVxuICAgICAgfSkpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoYWN0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcImFkZEVsZW1lbnRcIiBzaWduYWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50XG4gICAqIEBwYXJhbSB7c3Rpcm5nfSByZWZlcmVuY2UgaWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgYWRkRWxlbWVudCAoZWxlbWVudCwgcmVmLCBpbmRleCkge1xuICAgIGlmICghKGluZGV4ID49IDApKSB7XG4gICAgICBpbmRleCA9IC0xXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCdhZGRFbGVtZW50JywgW3JlZiwgZWxlbWVudC50b0pTT04oKSwgaW5kZXhdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInJlbW92ZUVsZW1lbnRcIiBzaWduYWwuXG4gICAqIEBwYXJhbSB7c3Rpcm5nfSByZWZlcmVuY2UgaWRcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICByZW1vdmVFbGVtZW50IChyZWYpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZWYpKSB7XG4gICAgICBjb25zdCBhY3Rpb25zID0gcmVmLm1hcCgocikgPT4gY3JlYXRlQWN0aW9uKCdyZW1vdmVFbGVtZW50JywgW3JdKSlcbiAgICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoYWN0aW9ucylcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oJ3JlbW92ZUVsZW1lbnQnLCBbcmVmXSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJtb3ZlRWxlbWVudFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtzdGlybmd9IHRhcmdldCByZWZlcmVuY2UgaWRcbiAgICogQHBhcmFtIHtzdGlybmd9IHBhcmVudCByZWZlcmVuY2UgaWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgbW92ZUVsZW1lbnQgKHRhcmdldFJlZiwgcGFyZW50UmVmLCBpbmRleCkge1xuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCdtb3ZlRWxlbWVudCcsIFt0YXJnZXRSZWYsIHBhcmVudFJlZiwgaW5kZXhdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInVwZGF0ZUF0dHJzXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge3N0aXJuZ30gcmVmZXJlbmNlIGlkXG4gICAqIEBwYXJhbSB7c3Rpcm5nfSBrZXlcbiAgICogQHBhcmFtIHtzdGlybmd9IHZhbHVlXG4gICAqIEByZXR1cm4ge3VuZGVmaW5lZCB8IG51bWJlcn0gdGhlIHNpZ25hbCBzZW50IGJ5IG5hdGl2ZVxuICAgKi9cbiAgc2V0QXR0ciAocmVmLCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge31cbiAgICByZXN1bHRba2V5XSA9IHZhbHVlXG4gICAgcmV0dXJuIHRoaXMuYWRkQWN0aW9ucyhjcmVhdGVBY3Rpb24oJ3VwZGF0ZUF0dHJzJywgW3JlZiwgcmVzdWx0XSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJ1cGRhdGVTdHlsZVwiIHNpZ25hbCwgdXBkYXRlIGEgc29sZSBzdHlsZS5cbiAgICogQHBhcmFtIHtzdGlybmd9IHJlZmVyZW5jZSBpZFxuICAgKiBAcGFyYW0ge3N0aXJuZ30ga2V5XG4gICAqIEBwYXJhbSB7c3Rpcm5nfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHNldFN0eWxlIChyZWYsIGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuICAgIHJlc3VsdFtrZXldID0gdmFsdWVcbiAgICByZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigndXBkYXRlU3R5bGUnLCBbcmVmLCByZXN1bHRdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSBcInVwZGF0ZVN0eWxlXCIgc2lnbmFsLlxuICAgKiBAcGFyYW0ge3N0aXJuZ30gcmVmZXJlbmNlIGlkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHNldFN0eWxlcyAocmVmLCBzdHlsZSkge1xuICAgIHJldHVybiB0aGlzLmFkZEFjdGlvbnMoY3JlYXRlQWN0aW9uKCd1cGRhdGVTdHlsZScsIFtyZWYsIHN0eWxlXSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJhZGRFdmVudFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtzdGlybmd9IHJlZmVyZW5jZSBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIGFkZEV2ZW50IChyZWYsIHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbignYWRkRXZlbnQnLCBbcmVmLCB0eXBlXSkpXG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgXCJyZW1vdmVFdmVudFwiIHNpZ25hbC5cbiAgICogQHBhcmFtIHtzdGlybmd9IHJlZmVyZW5jZSBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAgKiBAcmV0dXJuIHt1bmRlZmluZWQgfCBudW1iZXJ9IHRoZSBzaWduYWwgc2VudCBieSBuYXRpdmVcbiAgICovXG4gIHJlbW92ZUV2ZW50IChyZWYsIHR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5hZGRBY3Rpb25zKGNyZWF0ZUFjdGlvbigncmVtb3ZlRXZlbnQnLCBbcmVmLCB0eXBlXSkpXG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBoYW5kbGVyLlxuICAgKiBAcGFyYW0ge29iamVjdCB8IGFycmF5fSBhY3Rpb25zXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm4ge30gYW55dGhpbmcgcmV0dXJuZWQgYnkgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIGhhbmRsZXIgKGFjdGlvbnMsIGNiKSB7XG4gICAgcmV0dXJuIGNiICYmIGNiKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYWN0aW9ucyBpbnRvIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0IHwgYXJyYXl9IGFjdGlvbnNcbiAgICogQHJldHVybiB7dW5kZWZpbmVkIHwgbnVtYmVyfSB0aGUgc2lnbmFsIHNlbnQgYnkgbmF0aXZlXG4gICAqL1xuICBhZGRBY3Rpb25zIChhY3Rpb25zKSB7XG4gICAgY29uc3QgdXBkYXRlcyA9IHRoaXMudXBkYXRlc1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShhY3Rpb25zKSkge1xuICAgICAgYWN0aW9ucyA9IFthY3Rpb25zXVxuICAgIH1cblxuICAgIGlmICh0aGlzLmJhdGNoZWQpIHtcbiAgICAgIHVwZGF0ZXMucHVzaC5hcHBseSh1cGRhdGVzLCBhY3Rpb25zKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBoYW5kbGVyKGFjdGlvbnMpXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBUYXNrIGhhbmRsZXIgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBqYXZhc2NyaXB0IGFuZCBuYXRpdmUuXG4gKi9cblxuY29uc3QgaGFuZGxlck1hcCA9IHtcbiAgY3JlYXRlQm9keTogJ2NhbGxDcmVhdGVCb2R5JyxcbiAgYWRkRWxlbWVudDogJ2NhbGxBZGRFbGVtZW50JyxcbiAgcmVtb3ZlRWxlbWVudDogJ2NhbGxSZW1vdmVFbGVtZW50JyxcbiAgbW92ZUVsZW1lbnQ6ICdjYWxsTW92ZUVsZW1lbnQnLFxuICB1cGRhdGVBdHRyczogJ2NhbGxVcGRhdGVBdHRycycsXG4gIHVwZGF0ZVN0eWxlOiAnY2FsbFVwZGF0ZVN0eWxlJyxcbiAgYWRkRXZlbnQ6ICdjYWxsQWRkRXZlbnQnLFxuICByZW1vdmVFdmVudDogJ2NhbGxSZW1vdmVFdmVudCdcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSB0YXNrIGhhbmRsZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXJcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSB0YXNrSGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFuZGxlciAoaWQsIGhhbmRsZXIpIHtcbiAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBoYW5kbGVyIHx8IGdsb2JhbC5jYWxsTmF0aXZlXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgZGVmYXVsdEhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbSlMgUnVudGltZV0gbm8gZGVmYXVsdCBoYW5kbGVyJylcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiB0YXNrSGFuZGxlciAodGFza3MpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgICB0YXNrcyA9IFt0YXNrc11cbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBkaXNwYXRjaFRhc2soaWQsIHRhc2tzW2ldLCBkZWZhdWx0SGFuZGxlcilcbiAgICAgIGlmIChyZXR1cm5WYWx1ZSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIGF2YWlsYWJsZSBoYW5kbGVyIGluIHRoZSBlbnZpcm9ubWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc0F2YWlsYWJsZUhhbmRsZXIgKG1vZHVsZSwgbWV0aG9kKSB7XG4gIHJldHVybiBtb2R1bGUgPT09ICdkb20nXG4gICAgJiYgaGFuZGxlck1hcFttZXRob2RdXG4gICAgJiYgdHlwZW9mIGdsb2JhbFtoYW5kbGVyTWFwW21ldGhvZF1dID09PSAnZnVuY3Rpb24nXG59XG5cbi8qKlxuICogRGlzcGF0Y2ggdGhlIHRhc2sgdG8gdGhlIHNwZWNpZmllZCBoYW5kbGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0ge29iamVjdH0gdGFza1xuICogQHBhcmFtIHtmdW5jdGlvbn0gZGVmYXVsdEhhbmRsZXJcbiAqIEByZXR1cm4ge251bWJlcn0gc2lnbmFsIHJldHVybmVkIGZyb20gbmF0aXZlXG4gKi9cbmZ1bmN0aW9uIGRpc3BhdGNoVGFzayAoaWQsIHRhc2ssIGRlZmF1bHRIYW5kbGVyKSB7XG4gIGNvbnN0IHsgbW9kdWxlLCBtZXRob2QsIGFyZ3MgfSA9IHRhc2tcblxuICBpZiAoaGFzQXZhaWxhYmxlSGFuZGxlcihtb2R1bGUsIG1ldGhvZCkpIHtcbiAgICByZXR1cm4gZ2xvYmFsW2hhbmRsZXJNYXBbbWV0aG9kXV0oaWQsIC4uLmFyZ3MsICctMScpXG4gIH1cblxuICByZXR1cm4gZGVmYXVsdEhhbmRsZXIoaWQsIFt0YXNrXSwgJy0xJylcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgQ29tbWVudCBmcm9tICcuL0NvbW1lbnQnXG5pbXBvcnQgRWxlbWVudCBmcm9tICcuL0VsZW1lbnQnXG5pbXBvcnQgTGlzdGVuZXIgZnJvbSAnLi4vYnJpZGdlL0xpc3RlbmVyJ1xuaW1wb3J0IHsgVGFza0NlbnRlciB9IGZyb20gJy4uL2JyaWRnZS9UYXNrQ2VudGVyJ1xuaW1wb3J0IHsgY3JlYXRlSGFuZGxlciB9IGZyb20gJy4uL2JyaWRnZS9IYW5kbGVyJ1xuaW1wb3J0IHsgYWRkRG9jLCByZW1vdmVEb2MsIGFwcGVuZEJvZHksIHNldEJvZHkgfSBmcm9tICcuL29wZXJhdGlvbidcblxuLyoqXG4gKiBVcGRhdGUgYWxsIGNoYW5nZXMgZm9yIGFuIGVsZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudFxuICogQHBhcmFtIHtvYmplY3R9IGNoYW5nZXNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlRWxlbWVudCAoZWwsIGNoYW5nZXMpIHtcbiAgY29uc3QgYXR0cnMgPSBjaGFuZ2VzLmF0dHJzIHx8IHt9XG4gIGZvciAoY29uc3QgbmFtZSBpbiBhdHRycykge1xuICAgIGVsLnNldEF0dHIobmFtZSwgYXR0cnNbbmFtZV0sIHRydWUpXG4gIH1cbiAgY29uc3Qgc3R5bGUgPSBjaGFuZ2VzLnN0eWxlIHx8IHt9XG4gIGZvciAoY29uc3QgbmFtZSBpbiBzdHlsZSkge1xuICAgIGVsLnNldFN0eWxlKG5hbWUsIHN0eWxlW25hbWVdLCB0cnVlKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvY3VtZW50IHtcbiAgY29uc3RydWN0b3IgKGlkLCB1cmwsIGhhbmRsZXIpIHtcbiAgICBpZCA9IGlkID8gaWQudG9TdHJpbmcoKSA6ICcnXG4gICAgdGhpcy5pZCA9IGlkXG4gICAgdGhpcy5VUkwgPSB1cmxcblxuICAgIGFkZERvYyhpZCwgdGhpcylcbiAgICB0aGlzLm5vZGVNYXAgPSB7fVxuICAgIGNvbnN0IEwgPSBEb2N1bWVudC5MaXN0ZW5lciB8fCBMaXN0ZW5lclxuICAgIHRoaXMubGlzdGVuZXIgPSBuZXcgTChpZCwgaGFuZGxlciB8fCBjcmVhdGVIYW5kbGVyKGlkLCBEb2N1bWVudC5oYW5kbGVyKSkgLy8gZGVwcmVjYXRlZFxuICAgIHRoaXMudGFza0NlbnRlciA9IG5ldyBUYXNrQ2VudGVyKGlkLCBoYW5kbGVyID8gKGlkLCAuLi5hcmdzKSA9PiBoYW5kbGVyKC4uLmFyZ3MpIDogRG9jdW1lbnQuaGFuZGxlcilcbiAgICB0aGlzLmNyZWF0ZURvY3VtZW50RWxlbWVudCgpXG4gIH1cblxuICAvKipcbiAgKiBHZXQgdGhlIG5vZGUgZnJvbSBub2RlTWFwLlxuICAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcmVuY2UgaWRcbiAgKiBAcmV0dXJuIHtvYmplY3R9IG5vZGVcbiAgKi9cbiAgZ2V0UmVmIChyZWYpIHtcbiAgICByZXR1cm4gdGhpcy5ub2RlTWFwW3JlZl1cbiAgfVxuXG4gIC8qKlxuICAqIFR1cm4gb24gYmF0Y2hlZCB1cGRhdGVzLlxuICAqL1xuICBvcGVuICgpIHtcbiAgICB0aGlzLmxpc3RlbmVyLmJhdGNoZWQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICogVHVybiBvZmYgYmF0Y2hlZCB1cGRhdGVzLlxuICAqL1xuICBjbG9zZSAoKSB7XG4gICAgdGhpcy5saXN0ZW5lci5iYXRjaGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICogQ3JlYXRlIHRoZSBkb2N1bWVudCBlbGVtZW50LlxuICAqIEByZXR1cm4ge29iamVjdH0gZG9jdW1lbnRFbGVtZW50XG4gICovXG4gIGNyZWF0ZURvY3VtZW50RWxlbWVudCAoKSB7XG4gICAgaWYgKCF0aGlzLmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgY29uc3QgZWwgPSBuZXcgRWxlbWVudCgnZG9jdW1lbnQnKVxuICAgICAgZWwuZG9jSWQgPSB0aGlzLmlkXG4gICAgICBlbC5vd25lckRvY3VtZW50ID0gdGhpc1xuICAgICAgZWwucm9sZSA9ICdkb2N1bWVudEVsZW1lbnQnXG4gICAgICBlbC5kZXB0aCA9IDBcbiAgICAgIGVsLnJlZiA9ICdfZG9jdW1lbnRFbGVtZW50J1xuICAgICAgdGhpcy5ub2RlTWFwLl9kb2N1bWVudEVsZW1lbnQgPSBlbFxuICAgICAgdGhpcy5kb2N1bWVudEVsZW1lbnQgPSBlbFxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdhcHBlbmRDaGlsZCcsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IChub2RlKSA9PiB7XG4gICAgICAgICAgYXBwZW5kQm9keSh0aGlzLCBub2RlKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWwsICdpbnNlcnRCZWZvcmUnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiAobm9kZSwgYmVmb3JlKSA9PiB7XG4gICAgICAgICAgYXBwZW5kQm9keSh0aGlzLCBub2RlLCBiZWZvcmUpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRFbGVtZW50XG4gIH1cblxuICAvKipcbiAgKiBDcmVhdGUgdGhlIGJvZHkgZWxlbWVudC5cbiAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAqIEBwYXJhbSB7b2JqY3R9IHByb3BzXG4gICogQHJldHVybiB7b2JqZWN0fSBib2R5IGVsZW1lbnRcbiAgKi9cbiAgY3JlYXRlQm9keSAodHlwZSwgcHJvcHMpIHtcbiAgICBpZiAoIXRoaXMuYm9keSkge1xuICAgICAgY29uc3QgZWwgPSBuZXcgRWxlbWVudCh0eXBlLCBwcm9wcylcbiAgICAgIHNldEJvZHkodGhpcywgZWwpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYm9keVxuICB9XG5cbiAgLyoqXG4gICogQ3JlYXRlIGFuIGVsZW1lbnQuXG4gICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWVcbiAgKiBAcGFyYW0ge29iamN0fSBwcm9wc1xuICAqIEByZXR1cm4ge29iamVjdH0gZWxlbWVudFxuICAqL1xuICBjcmVhdGVFbGVtZW50ICh0YWdOYW1lLCBwcm9wcykge1xuICAgIHJldHVybiBuZXcgRWxlbWVudCh0YWdOYW1lLCBwcm9wcylcbiAgfVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhbiBjb21tZW50LlxuICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICogQHJldHVybiB7b2JqZWN0fSBjb21tZW50XG4gICovXG4gIGNyZWF0ZUNvbW1lbnQgKHRleHQpIHtcbiAgICByZXR1cm4gbmV3IENvbW1lbnQodGV4dClcbiAgfVxuXG4gIC8qKlxuICAqIEZpcmUgYW4gZXZlbnQgb24gc3BlY2lmaWVkIGVsZW1lbnQgbWFudWFsbHkuXG4gICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnRcbiAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgdHlwZVxuICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBvYmplY3RcbiAgKiBAcGFyYW0ge29iamVjdH0gZG9tIGNoYW5nZXNcbiAgKiBAcmV0dXJuIHt9IGFueXRoaW5nIHJldHVybmVkIGJ5IGhhbmRsZXIgZnVuY3Rpb25cbiAgKi9cbiAgZmlyZUV2ZW50IChlbCwgdHlwZSwgZSwgZG9tQ2hhbmdlcykge1xuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBlID0gZSB8fCB7fVxuICAgIGUudHlwZSA9IHR5cGVcbiAgICBlLnRhcmdldCA9IGVsXG4gICAgZS5jdXJyZW50VGFyZ2V0ID0gZWxcbiAgICBlLnRpbWVzdGFtcCA9IERhdGUubm93KClcbiAgICBpZiAoZG9tQ2hhbmdlcykge1xuICAgICAgdXBkYXRlRWxlbWVudChlbCwgZG9tQ2hhbmdlcylcbiAgICB9XG4gICAgY29uc3QgaXNCdWJibGUgPSB0aGlzLmdldFJlZignX3Jvb3QnKS5hdHRyWydidWJibGUnXSA9PT0gJ3RydWUnXG4gICAgcmV0dXJuIGVsLmZpcmVFdmVudCh0eXBlLCBlLCBpc0J1YmJsZSlcbiAgfVxuXG4gIC8qKlxuICAqIERlc3Ryb3kgY3VycmVudCBkb2N1bWVudCwgYW5kIHJlbW92ZSBpdHNlbGYgZm9ybSBkb2NNYXAuXG4gICovXG4gIGRlc3Ryb3kgKCkge1xuICAgIHRoaXMudGFza0NlbnRlci5kZXN0cm95Q2FsbGJhY2soKVxuICAgIGRlbGV0ZSB0aGlzLmxpc3RlbmVyXG4gICAgZGVsZXRlIHRoaXMubm9kZU1hcFxuICAgIGRlbGV0ZSB0aGlzLnRhc2tDZW50ZXJcbiAgICByZW1vdmVEb2ModGhpcy5pZClcbiAgfVxufVxuXG4vLyBkZWZhdWx0IHRhc2sgaGFuZGxlclxuRG9jdW1lbnQuaGFuZGxlciA9IG51bGxcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgTm9kZSBmcm9tICcuL05vZGUnXG5pbXBvcnQgRWxlbWVudCBmcm9tICcuL0VsZW1lbnQnXG5pbXBvcnQgQ29tbWVudCBmcm9tICcuL0NvbW1lbnQnXG5pbXBvcnQgRG9jdW1lbnQgZnJvbSAnLi9Eb2N1bWVudCdcblxuZXhwb3J0IHtcbiAgcmVnaXN0ZXJFbGVtZW50LFxuICB1bnJlZ2lzdGVyRWxlbWVudCxcbiAgaXNXZWV4RWxlbWVudCxcbiAgY2xlYXJXZWV4RWxlbWVudHNcbn0gZnJvbSAnLi9XZWV4RWxlbWVudCdcblxuZXhwb3J0IHtcbiAgRG9jdW1lbnQsXG4gIE5vZGUsXG4gIEVsZW1lbnQsXG4gIENvbW1lbnRcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgRG9jdW1lbnQsIEVsZW1lbnQsIENvbW1lbnQgfSBmcm9tICcuLi92ZG9tJ1xuaW1wb3J0IExpc3RlbmVyIGZyb20gJy4uL2JyaWRnZS9MaXN0ZW5lcidcbmltcG9ydCB7IFRhc2tDZW50ZXIgfSBmcm9tICcuLi9icmlkZ2UvVGFza0NlbnRlcidcblxuY29uc3QgY29uZmlnID0ge1xuICBEb2N1bWVudCwgRWxlbWVudCwgQ29tbWVudCwgTGlzdGVuZXIsXG4gIFRhc2tDZW50ZXIsXG4gIHNlbmRUYXNrcyAoLi4uYXJncykge1xuICAgIGlmICh0eXBlb2YgY2FsbE5hdGl2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNhbGxOYXRpdmUoLi4uYXJncylcbiAgICB9XG4gICAgcmV0dXJuIChnbG9iYWwuY2FsbE5hdGl2ZSB8fCAoKCkgPT4ge30pKSguLi5hcmdzKVxuICB9XG59XG5cbkRvY3VtZW50LmhhbmRsZXIgPSBjb25maWcuc2VuZFRhc2tzXG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZ1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogUmVnaXN0ZXIgZnJhbWV3b3JrKHMpIGluIEpTIHJ1bnRpbWUuIFdlZXggc3VwcGx5IHR3byBsYXllcnMgZm9yIDNyZC1wYXJ0eVxuICogZnJhbWV3b3JrKHMpOiBvbmUgaXMgdGhlIGluc3RhbmNlIG1hbmFnZW1lbnQgbGF5ZXIsIGFub3RoZXIgaXMgdGhlXG4gKiB2aXJ0dWFsLURPTSBsYXllci5cbiAqL1xuXG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnLi4vc2hhcmVkJ1xuXG5pbXBvcnQgaW5pdCBmcm9tICcuL2FwaS9pbml0J1xuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2FwaS9jb25maWcnXG5pbXBvcnQgeyByZWdpc3RlciwgdW5yZWdpc3RlciwgaGFzIH0gZnJvbSAnLi9hcGkvc2VydmljZSdcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmZ1bmN0aW9uIGZyZWV6ZVByb3RvdHlwZSAoKSB7XG4gIHNoYXJlZC5mcmVlemVQcm90b3R5cGUoKVxuXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkVsZW1lbnQpXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkNvbW1lbnQpXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkxpc3RlbmVyKVxuICBPYmplY3QuZnJlZXplKGNvbmZpZy5Eb2N1bWVudC5wcm90b3R5cGUpXG4gIE9iamVjdC5mcmVlemUoY29uZmlnLkVsZW1lbnQucHJvdG90eXBlKVxuICBPYmplY3QuZnJlZXplKGNvbmZpZy5Db21tZW50LnByb3RvdHlwZSlcbiAgT2JqZWN0LmZyZWV6ZShjb25maWcuTGlzdGVuZXIucHJvdG90eXBlKVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNldE5hdGl2ZUNvbnNvbGU6IHNoYXJlZC5zZXROYXRpdmVDb25zb2xlLFxuICByZXNldE5hdGl2ZUNvbnNvbGU6IHNoYXJlZC5yZXNldE5hdGl2ZUNvbnNvbGUsXG4gIHNldE5hdGl2ZVRpbWVyOiBzaGFyZWQuc2V0TmF0aXZlVGltZXIsXG4gIHJlc2V0TmF0aXZlVGltZXI6IHNoYXJlZC5yZXNldE5hdGl2ZVRpbWVyLFxuICBzZXJ2aWNlOiB7IHJlZ2lzdGVyLCB1bnJlZ2lzdGVyLCBoYXMgfSxcbiAgZnJlZXplUHJvdG90eXBlLFxuICBpbml0LFxuICBjb25maWdcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuY29uc3QgY29uZmlnID0ge31cblxuY29uc3QgaW5zdGFuY2VNYXAgPSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdCAoY2ZnKSB7XG4gIGNvbmZpZy5Eb2N1bWVudCA9IGNmZy5Eb2N1bWVudFxuICBjb25maWcuRWxlbWVudCA9IGNmZy5FbGVtZW50XG4gIGNvbmZpZy5Db21tZW50ID0gY2ZnLkNvbW1lbnRcbiAgY29uZmlnLnNlbmRUYXNrcyA9IGNmZy5zZW5kVGFza3Ncbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlIChpZCwgY29kZSwgb3B0aW9ucyA9IHt9LCBkYXRhID0ge30sIHNlcnZpY2VPYmplY3RzID0ge30pIHtcbiAgY29uc3QgZG9jdW1lbnQgPSBuZXcgY29uZmlnLkRvY3VtZW50KGlkLCBvcHRpb25zLmJ1bmRsZVVybClcbiAgY29uc3QgY2FsbGJhY2tzID0ge31cbiAgY29uc3QgaW5zdGFuY2UgPSB7IGlkLCBkYXRhLCBkb2N1bWVudCwgY2FsbGJhY2tzIH1cblxuICBsZXQgbGFzdENhbGxiYWNrSWQgPSAwXG4gIGRvY3VtZW50LmFkZENhbGxiYWNrID0gZnVuYyA9PiB7XG4gICAgbGFzdENhbGxiYWNrSWQrK1xuICAgIGNhbGxiYWNrc1tsYXN0Q2FsbGJhY2tJZF0gPSBmdW5jXG4gICAgcmV0dXJuIGxhc3RDYWxsYmFja0lkXG4gIH1cbiAgZG9jdW1lbnQuaGFuZGxlQ2FsbGJhY2sgPSAoZnVuY0lkLCBkYXRhLCBpZkxhc3QpID0+IHtcbiAgICBjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1tmdW5jSWRdXG4gICAgaWYgKGlmTGFzdCkge1xuICAgICAgZGVsZXRlIGNhbGxiYWNrc1tmdW5jSWRdXG4gICAgfVxuICAgIHJldHVybiBjYWxsYmFjayhkYXRhKVxuICB9XG4gIGluc3RhbmNlTWFwW2lkXSA9IGluc3RhbmNlXG5cbiAgY29uc3QgZ2xvYmFsT2JqZWN0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIERvY3VtZW50OiBjb25maWcuRG9jdW1lbnQsXG4gICAgRWxlbWVudDogY29uZmlnLkVsZW1lbnQsXG4gICAgQ29tbWVudDogY29uZmlnLkNvbW1lbnQsXG4gICAgc2VuZFRhc2tzOiB0YXNrcyA9PiBjb25maWcuc2VuZFRhc2tzKGlkLCB0YXNrcywgLTEpLFxuICAgIG9wdGlvbnMsXG4gICAgZG9jdW1lbnRcbiAgfSwgc2VydmljZU9iamVjdHMpXG5cbiAgY29uc3QgZ2xvYmFsS2V5cyA9IFtdXG4gIGNvbnN0IGdsb2JhbFZhbHVlcyA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIGdsb2JhbE9iamVjdHMpIHtcbiAgICBnbG9iYWxLZXlzLnB1c2goa2V5KVxuICAgIGdsb2JhbFZhbHVlcy5wdXNoKGdsb2JhbE9iamVjdHNba2V5XSlcbiAgfVxuICBnbG9iYWxLZXlzLnB1c2goY29kZSlcblxuICBjb25zdCByZXN1bHQgPSBuZXcgRnVuY3Rpb24oLi4uZ2xvYmFsS2V5cylcbiAgcmVzdWx0KC4uLmdsb2JhbFZhbHVlcylcblxuICBjb25maWcuc2VuZFRhc2tzKGlkLCBbeyBtb2R1bGU6ICdkb20nLCBtZXRob2Q6ICdjcmVhdGVGaW5pc2gnLCBhcmdzOiBbXSB9XSwgLTEpXG5cbiAgcmV0dXJuIGluc3RhbmNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95SW5zdGFuY2UgKGlkKSB7XG4gIGRlbGV0ZSBpbnN0YW5jZU1hcFtpZF1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3QgKGlkKSB7XG4gIHJldHVybiBpbnN0YW5jZU1hcFtpZF0uZG9jdW1lbnQuYm9keS50b0pTT04oKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjZWl2ZVRhc2tzIChpZCwgdGFza3MpIHtcbiAgY29uc3QganNIYW5kbGVycyA9IHtcbiAgICBmaXJlRXZlbnQ6IChpZCwgcmVmLCB0eXBlLCBkYXRhLCBkb21DaGFuZ2VzKSA9PiB7XG4gICAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBpbnN0YW5jZU1hcFtpZF1cbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0UmVmKHJlZilcbiAgICAgIHJldHVybiBkb2N1bWVudC5maXJlRXZlbnQoZWwsIHR5cGUsIGRhdGEsIGRvbUNoYW5nZXMpXG4gICAgfSxcblxuICAgIGNhbGxiYWNrOiAoaWQsIGZ1bmNJZCwgZGF0YSwgaWZMYXN0KSA9PiB7XG4gICAgICBjb25zdCB7IGRvY3VtZW50IH0gPSBpbnN0YW5jZU1hcFtpZF1cbiAgICAgIHJldHVybiBkb2N1bWVudC5oYW5kbGVDYWxsYmFjayhmdW5jSWQsIGRhdGEsIGlmTGFzdClcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IGRvY3VtZW50IH0gPSBpbnN0YW5jZU1hcFtpZF0gfHwge31cbiAgaWYgKGRvY3VtZW50ICYmIEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IFtdXG4gICAgdGFza3MuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGpzSGFuZGxlcnNbdGFzay5tZXRob2RdXG4gICAgICBjb25zdCBhcmdzID0gWy4uLnRhc2suYXJnc11cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhcmdzLnVuc2hpZnQoaWQpXG4gICAgICAgIHJlc3VsdHMucHVzaChoYW5kbGVyKC4uLmFyZ3MpKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHJlc3VsdHNcbiAgfVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHdlZXhGYWN0b3J5IChleHBvcnRzLCByZW5kZXJlcikge1xuXG4vKiAgKi9cblxuLy8gdGhlc2UgaGVscGVycyBwcm9kdWNlcyBiZXR0ZXIgdm0gY29kZSBpbiBKUyBlbmdpbmVzIGR1ZSB0byB0aGVpclxuLy8gZXhwbGljaXRuZXNzIGFuZCBmdW5jdGlvbiBpbmxpbmluZ1xuZnVuY3Rpb24gaXNVbmRlZiAodikge1xuICByZXR1cm4gdiA9PT0gdW5kZWZpbmVkIHx8IHYgPT09IG51bGxcbn1cblxuZnVuY3Rpb24gaXNEZWYgKHYpIHtcbiAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsXG59XG5cbmZ1bmN0aW9uIGlzVHJ1ZSAodikge1xuICByZXR1cm4gdiA9PT0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpc0ZhbHNlICh2KSB7XG4gIHJldHVybiB2ID09PSBmYWxzZVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHZhbHVlIGlzIHByaW1pdGl2ZVxuICovXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZSAodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nXG4gIClcbn1cblxuLyoqXG4gKiBRdWljayBvYmplY3QgY2hlY2sgLSB0aGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHRlbGxcbiAqIE9iamVjdHMgZnJvbSBwcmltaXRpdmUgdmFsdWVzIHdoZW4gd2Uga25vdyB0aGUgdmFsdWVcbiAqIGlzIGEgSlNPTi1jb21wbGlhbnQgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG59XG5cbnZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4vKipcbiAqIFN0cmljdCBvYmplY3QgdHlwZSBjaGVjay4gT25seSByZXR1cm5zIHRydWVcbiAqIGZvciBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikge1xuICByZXR1cm4gX3RvU3RyaW5nLmNhbGwob2JqKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAgKHYpIHtcbiAgcmV0dXJuIF90b1N0cmluZy5jYWxsKHYpID09PSAnW29iamVjdCBSZWdFeHBdJ1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHZhbCBpcyBhIHZhbGlkIGFycmF5IGluZGV4LlxuICovXG5mdW5jdGlvbiBpc1ZhbGlkQXJyYXlJbmRleCAodmFsKSB7XG4gIHZhciBuID0gcGFyc2VGbG9hdCh2YWwpO1xuICByZXR1cm4gbiA+PSAwICYmIE1hdGguZmxvb3IobikgPT09IG4gJiYgaXNGaW5pdGUodmFsKVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB0aGF0IGlzIGFjdHVhbGx5IHJlbmRlcmVkLlxuICovXG5mdW5jdGlvbiB0b1N0cmluZyAodmFsKSB7XG4gIHJldHVybiB2YWwgPT0gbnVsbFxuICAgID8gJydcbiAgICA6IHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gICAgICA/IEpTT04uc3RyaW5naWZ5KHZhbCwgbnVsbCwgMilcbiAgICAgIDogU3RyaW5nKHZhbClcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgaW5wdXQgdmFsdWUgdG8gYSBudW1iZXIgZm9yIHBlcnNpc3RlbmNlLlxuICogSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMsIHJldHVybiBvcmlnaW5hbCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyICh2YWwpIHtcbiAgdmFyIG4gPSBwYXJzZUZsb2F0KHZhbCk7XG4gIHJldHVybiBpc05hTihuKSA/IHZhbCA6IG5cbn1cblxuLyoqXG4gKiBNYWtlIGEgbWFwIGFuZCByZXR1cm4gYSBmdW5jdGlvbiBmb3IgY2hlY2tpbmcgaWYgYSBrZXlcbiAqIGlzIGluIHRoYXQgbWFwLlxuICovXG5mdW5jdGlvbiBtYWtlTWFwIChcbiAgc3RyLFxuICBleHBlY3RzTG93ZXJDYXNlXG4pIHtcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBsaXN0ID0gc3RyLnNwbGl0KCcsJyk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIG1hcFtsaXN0W2ldXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGV4cGVjdHNMb3dlckNhc2VcbiAgICA/IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWwudG9Mb3dlckNhc2UoKV07IH1cbiAgICA6IGZ1bmN0aW9uICh2YWwpIHsgcmV0dXJuIG1hcFt2YWxdOyB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSB0YWcgaXMgYSBidWlsdC1pbiB0YWcuXG4gKi9cbnZhciBpc0J1aWx0SW5UYWcgPSBtYWtlTWFwKCdzbG90LGNvbXBvbmVudCcsIHRydWUpO1xuXG4vKipcbiAqIENoZWNrIGlmIGEgYXR0cmlidXRlIGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuICovXG52YXIgaXNSZXNlcnZlZEF0dHJpYnV0ZSA9IG1ha2VNYXAoJ2tleSxyZWYsc2xvdCxpcycpO1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXlcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlIChhcnIsIGl0ZW0pIHtcbiAgaWYgKGFyci5sZW5ndGgpIHtcbiAgICB2YXIgaW5kZXggPSBhcnIuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgcmV0dXJuIGFyci5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGhhcyB0aGUgcHJvcGVydHkuXG4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5mdW5jdGlvbiBoYXNPd24gKG9iaiwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGNhY2hlZCB2ZXJzaW9uIG9mIGEgcHVyZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICB2YXIgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gKGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICB2YXIgaGl0ID0gY2FjaGVbc3RyXTtcbiAgICByZXR1cm4gaGl0IHx8IChjYWNoZVtzdHJdID0gZm4oc3RyKSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxpbWl0ZWQgc3RyaW5nLlxuICovXG52YXIgY2FtZWxpemVSRSA9IC8tKFxcdykvZztcbnZhciBjYW1lbGl6ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShjYW1lbGl6ZVJFLCBmdW5jdGlvbiAoXywgYykgeyByZXR1cm4gYyA/IGMudG9VcHBlckNhc2UoKSA6ICcnOyB9KVxufSk7XG5cbi8qKlxuICogQ2FwaXRhbGl6ZSBhIHN0cmluZy5cbiAqL1xudmFyIGNhcGl0YWxpemUgPSBjYWNoZWQoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpXG59KTtcblxuLyoqXG4gKiBIeXBoZW5hdGUgYSBjYW1lbENhc2Ugc3RyaW5nLlxuICovXG52YXIgaHlwaGVuYXRlUkUgPSAvKFteLV0pKFtBLVpdKS9nO1xudmFyIGh5cGhlbmF0ZSA9IGNhY2hlZChmdW5jdGlvbiAoc3RyKSB7XG4gIHJldHVybiBzdHJcbiAgICAucmVwbGFjZShoeXBoZW5hdGVSRSwgJyQxLSQyJylcbiAgICAucmVwbGFjZShoeXBoZW5hdGVSRSwgJyQxLSQyJylcbiAgICAudG9Mb3dlckNhc2UoKVxufSk7XG5cbi8qKlxuICogU2ltcGxlIGJpbmQsIGZhc3RlciB0aGFuIG5hdGl2ZVxuICovXG5mdW5jdGlvbiBiaW5kIChmbiwgY3R4KSB7XG4gIGZ1bmN0aW9uIGJvdW5kRm4gKGEpIHtcbiAgICB2YXIgbCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cbiAgLy8gcmVjb3JkIG9yaWdpbmFsIGZuIGxlbmd0aFxuICBib3VuZEZuLl9sZW5ndGggPSBmbi5sZW5ndGg7XG4gIHJldHVybiBib3VuZEZuXG59XG5cbi8qKlxuICogQ29udmVydCBhbiBBcnJheS1saWtlIG9iamVjdCB0byBhIHJlYWwgQXJyYXkuXG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7XG4gIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgdmFyIGkgPSBsaXN0Lmxlbmd0aCAtIHN0YXJ0O1xuICB2YXIgcmV0ID0gbmV3IEFycmF5KGkpO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgcmV0W2ldID0gbGlzdFtpICsgc3RhcnRdO1xuICB9XG4gIHJldHVybiByZXRcbn1cblxuLyoqXG4gKiBNaXggcHJvcGVydGllcyBpbnRvIHRhcmdldCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGV4dGVuZCAodG8sIF9mcm9tKSB7XG4gIGZvciAodmFyIGtleSBpbiBfZnJvbSkge1xuICAgIHRvW2tleV0gPSBfZnJvbVtrZXldO1xuICB9XG4gIHJldHVybiB0b1xufVxuXG4vKipcbiAqIE1lcmdlIGFuIEFycmF5IG9mIE9iamVjdHMgaW50byBhIHNpbmdsZSBPYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHRvT2JqZWN0IChhcnIpIHtcbiAgdmFyIHJlcyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgIGlmIChhcnJbaV0pIHtcbiAgICAgIGV4dGVuZChyZXMsIGFycltpXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyoqXG4gKiBQZXJmb3JtIG5vIG9wZXJhdGlvbi5cbiAqIFN0dWJiaW5nIGFyZ3MgdG8gbWFrZSBGbG93IGhhcHB5IHdpdGhvdXQgbGVhdmluZyB1c2VsZXNzIHRyYW5zcGlsZWQgY29kZVxuICogd2l0aCAuLi5yZXN0IChodHRwczovL2Zsb3cub3JnL2Jsb2cvMjAxNy8wNS8wNy9TdHJpY3QtRnVuY3Rpb24tQ2FsbC1Bcml0eS8pXG4gKi9cbmZ1bmN0aW9uIG5vb3AgKGEsIGIsIGMpIHt9XG5cbi8qKlxuICogQWx3YXlzIHJldHVybiBmYWxzZS5cbiAqL1xudmFyIG5vID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsgcmV0dXJuIGZhbHNlOyB9O1xuXG4vKipcbiAqIFJldHVybiBzYW1lIHZhbHVlXG4gKi9cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uIChfKSB7IHJldHVybiBfOyB9O1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgc3RhdGljIGtleXMgc3RyaW5nIGZyb20gY29tcGlsZXIgbW9kdWxlcy5cbiAqL1xuXG5cbi8qKlxuICogQ2hlY2sgaWYgdHdvIHZhbHVlcyBhcmUgbG9vc2VseSBlcXVhbCAtIHRoYXQgaXMsXG4gKiBpZiB0aGV5IGFyZSBwbGFpbiBvYmplY3RzLCBkbyB0aGV5IGhhdmUgdGhlIHNhbWUgc2hhcGU/XG4gKi9cbmZ1bmN0aW9uIGxvb3NlRXF1YWwgKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHsgcmV0dXJuIHRydWUgfVxuICB2YXIgaXNPYmplY3RBID0gaXNPYmplY3QoYSk7XG4gIHZhciBpc09iamVjdEIgPSBpc09iamVjdChiKTtcbiAgaWYgKGlzT2JqZWN0QSAmJiBpc09iamVjdEIpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGlzQXJyYXlBID0gQXJyYXkuaXNBcnJheShhKTtcbiAgICAgIHZhciBpc0FycmF5QiA9IEFycmF5LmlzQXJyYXkoYik7XG4gICAgICBpZiAoaXNBcnJheUEgJiYgaXNBcnJheUIpIHtcbiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSBiLmxlbmd0aCAmJiBhLmV2ZXJ5KGZ1bmN0aW9uIChlLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIGxvb3NlRXF1YWwoZSwgYltpXSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAoIWlzQXJyYXlBICYmICFpc0FycmF5Qikge1xuICAgICAgICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhhKTtcbiAgICAgICAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMoYik7XG4gICAgICAgIHJldHVybiBrZXlzQS5sZW5ndGggPT09IGtleXNCLmxlbmd0aCAmJiBrZXlzQS5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGxvb3NlRXF1YWwoYVtrZXldLCBiW2tleV0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9IGVsc2UgaWYgKCFpc09iamVjdEEgJiYgIWlzT2JqZWN0Qikge1xuICAgIHJldHVybiBTdHJpbmcoYSkgPT09IFN0cmluZyhiKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmZ1bmN0aW9uIGxvb3NlSW5kZXhPZiAoYXJyLCB2YWwpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAobG9vc2VFcXVhbChhcnJbaV0sIHZhbCkpIHsgcmV0dXJuIGkgfVxuICB9XG4gIHJldHVybiAtMVxufVxuXG4vKipcbiAqIEVuc3VyZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UuXG4gKi9cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgY2FsbGVkID0gdHJ1ZTtcbiAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBTU1JfQVRUUiA9ICdkYXRhLXNlcnZlci1yZW5kZXJlZCc7XG5cbnZhciBBU1NFVF9UWVBFUyA9IFtcbiAgJ2NvbXBvbmVudCcsXG4gICdkaXJlY3RpdmUnLFxuICAnZmlsdGVyJ1xuXTtcblxudmFyIExJRkVDWUNMRV9IT09LUyA9IFtcbiAgJ2JlZm9yZUNyZWF0ZScsXG4gICdjcmVhdGVkJyxcbiAgJ2JlZm9yZU1vdW50JyxcbiAgJ21vdW50ZWQnLFxuICAnYmVmb3JlVXBkYXRlJyxcbiAgJ3VwZGF0ZWQnLFxuICAnYmVmb3JlRGVzdHJveScsXG4gICdkZXN0cm95ZWQnLFxuICAnYWN0aXZhdGVkJyxcbiAgJ2RlYWN0aXZhdGVkJ1xuXTtcblxuLyogICovXG5cbnZhciBjb25maWcgPSAoe1xuICAvKipcbiAgICogT3B0aW9uIG1lcmdlIHN0cmF0ZWdpZXMgKHVzZWQgaW4gY29yZS91dGlsL29wdGlvbnMpXG4gICAqL1xuICBvcHRpb25NZXJnZVN0cmF0ZWdpZXM6IE9iamVjdC5jcmVhdGUobnVsbCksXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc3VwcHJlc3Mgd2FybmluZ3MuXG4gICAqL1xuICBzaWxlbnQ6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBTaG93IHByb2R1Y3Rpb24gbW9kZSB0aXAgbWVzc2FnZSBvbiBib290P1xuICAgKi9cbiAgcHJvZHVjdGlvblRpcDogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyxcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgZGV2dG9vbHNcbiAgICovXG4gIGRldnRvb2xzOiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlY29yZCBwZXJmXG4gICAqL1xuICBwZXJmb3JtYW5jZTogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEVycm9yIGhhbmRsZXIgZm9yIHdhdGNoZXIgZXJyb3JzXG4gICAqL1xuICBlcnJvckhhbmRsZXI6IG51bGwsXG5cbiAgLyoqXG4gICAqIFdhcm4gaGFuZGxlciBmb3Igd2F0Y2hlciB3YXJuc1xuICAgKi9cbiAgd2FybkhhbmRsZXI6IG51bGwsXG5cbiAgLyoqXG4gICAqIElnbm9yZSBjZXJ0YWluIGN1c3RvbSBlbGVtZW50c1xuICAgKi9cbiAgaWdub3JlZEVsZW1lbnRzOiBbXSxcblxuICAvKipcbiAgICogQ3VzdG9tIHVzZXIga2V5IGFsaWFzZXMgZm9yIHYtb25cbiAgICovXG4gIGtleUNvZGVzOiBPYmplY3QuY3JlYXRlKG51bGwpLFxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHRhZyBpcyByZXNlcnZlZCBzbyB0aGF0IGl0IGNhbm5vdCBiZSByZWdpc3RlcmVkIGFzIGFcbiAgICogY29tcG9uZW50LiBUaGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuLlxuICAgKi9cbiAgaXNSZXNlcnZlZFRhZzogbm8sXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBzbyB0aGF0IGl0IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29tcG9uZW50XG4gICAqIHByb3AuIFRoaXMgaXMgcGxhdGZvcm0tZGVwZW5kZW50IGFuZCBtYXkgYmUgb3ZlcndyaXR0ZW4uXG4gICAqL1xuICBpc1Jlc2VydmVkQXR0cjogbm8sXG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGFnIGlzIGFuIHVua25vd24gZWxlbWVudC5cbiAgICogUGxhdGZvcm0tZGVwZW5kZW50LlxuICAgKi9cbiAgaXNVbmtub3duRWxlbWVudDogbm8sXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbmFtZXNwYWNlIG9mIGFuIGVsZW1lbnRcbiAgICovXG4gIGdldFRhZ05hbWVzcGFjZTogbm9vcCxcblxuICAvKipcbiAgICogUGFyc2UgdGhlIHJlYWwgdGFnIG5hbWUgZm9yIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybS5cbiAgICovXG4gIHBhcnNlUGxhdGZvcm1UYWdOYW1lOiBpZGVudGl0eSxcblxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIG11c3QgYmUgYm91bmQgdXNpbmcgcHJvcGVydHksIGUuZy4gdmFsdWVcbiAgICogUGxhdGZvcm0tZGVwZW5kZW50LlxuICAgKi9cbiAgbXVzdFVzZVByb3A6IG5vLFxuXG4gIC8qKlxuICAgKiBFeHBvc2VkIGZvciBsZWdhY3kgcmVhc29uc1xuICAgKi9cbiAgX2xpZmVjeWNsZUhvb2tzOiBMSUZFQ1lDTEVfSE9PS1Ncbn0pO1xuXG4vKiAgKi9cblxudmFyIGVtcHR5T2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzdHJpbmcgc3RhcnRzIHdpdGggJCBvciBfXG4gKi9cbmZ1bmN0aW9uIGlzUmVzZXJ2ZWQgKHN0cikge1xuICB2YXIgYyA9IChzdHIgKyAnJykuY2hhckNvZGVBdCgwKTtcbiAgcmV0dXJuIGMgPT09IDB4MjQgfHwgYyA9PT0gMHg1RlxufVxuXG4vKipcbiAqIERlZmluZSBhIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBkZWYgKG9iaiwga2V5LCB2YWwsIGVudW1lcmFibGUpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgdmFsdWU6IHZhbCxcbiAgICBlbnVtZXJhYmxlOiAhIWVudW1lcmFibGUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIHNpbXBsZSBwYXRoLlxuICovXG52YXIgYmFpbFJFID0gL1teXFx3LiRdLztcbmZ1bmN0aW9uIHBhcnNlUGF0aCAocGF0aCkge1xuICBpZiAoYmFpbFJFLnRlc3QocGF0aCkpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcuJyk7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFvYmopIHsgcmV0dXJuIH1cbiAgICAgIG9iaiA9IG9ialtzZWdtZW50c1tpXV07XG4gICAgfVxuICAgIHJldHVybiBvYmpcbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIHdhcm4gPSBub29wO1xudmFyIHRpcCA9IG5vb3A7XG52YXIgZm9ybWF0Q29tcG9uZW50TmFtZSA9IChudWxsKTsgLy8gd29yayBhcm91bmQgZmxvdyBjaGVja1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgaGFzQ29uc29sZSA9IHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJztcbiAgdmFyIGNsYXNzaWZ5UkUgPSAvKD86XnxbLV9dKShcXHcpL2c7XG4gIHZhciBjbGFzc2lmeSA9IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKGNsYXNzaWZ5UkUsIGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRvVXBwZXJDYXNlKCk7IH0pXG4gICAgLnJlcGxhY2UoL1stX10vZywgJycpOyB9O1xuXG4gIHdhcm4gPSBmdW5jdGlvbiAobXNnLCB2bSkge1xuICAgIHZhciB0cmFjZSA9IHZtID8gZ2VuZXJhdGVDb21wb25lbnRUcmFjZSh2bSkgOiAnJztcblxuICAgIGlmIChjb25maWcud2FybkhhbmRsZXIpIHtcbiAgICAgIGNvbmZpZy53YXJuSGFuZGxlci5jYWxsKG51bGwsIG1zZywgdm0sIHRyYWNlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbVnVlIHdhcm5dOiBcIiArIG1zZyArIHRyYWNlKSk7XG4gICAgfVxuICB9O1xuXG4gIHRpcCA9IGZ1bmN0aW9uIChtc2csIHZtKSB7XG4gICAgaWYgKGhhc0NvbnNvbGUgJiYgKCFjb25maWcuc2lsZW50KSkge1xuICAgICAgY29uc29sZS53YXJuKFwiW1Z1ZSB0aXBdOiBcIiArIG1zZyArIChcbiAgICAgICAgdm0gPyBnZW5lcmF0ZUNvbXBvbmVudFRyYWNlKHZtKSA6ICcnXG4gICAgICApKTtcbiAgICB9XG4gIH07XG5cbiAgZm9ybWF0Q29tcG9uZW50TmFtZSA9IGZ1bmN0aW9uICh2bSwgaW5jbHVkZUZpbGUpIHtcbiAgICBpZiAodm0uJHJvb3QgPT09IHZtKSB7XG4gICAgICByZXR1cm4gJzxSb290PidcbiAgICB9XG4gICAgdmFyIG5hbWUgPSB0eXBlb2Ygdm0gPT09ICdzdHJpbmcnXG4gICAgICA/IHZtXG4gICAgICA6IHR5cGVvZiB2bSA9PT0gJ2Z1bmN0aW9uJyAmJiB2bS5vcHRpb25zXG4gICAgICAgID8gdm0ub3B0aW9ucy5uYW1lXG4gICAgICAgIDogdm0uX2lzVnVlXG4gICAgICAgICAgPyB2bS4kb3B0aW9ucy5uYW1lIHx8IHZtLiRvcHRpb25zLl9jb21wb25lbnRUYWdcbiAgICAgICAgICA6IHZtLm5hbWU7XG5cbiAgICB2YXIgZmlsZSA9IHZtLl9pc1Z1ZSAmJiB2bS4kb3B0aW9ucy5fX2ZpbGU7XG4gICAgaWYgKCFuYW1lICYmIGZpbGUpIHtcbiAgICAgIHZhciBtYXRjaCA9IGZpbGUubWF0Y2goLyhbXi9cXFxcXSspXFwudnVlJC8pO1xuICAgICAgbmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAobmFtZSA/IChcIjxcIiArIChjbGFzc2lmeShuYW1lKSkgKyBcIj5cIikgOiBcIjxBbm9ueW1vdXM+XCIpICtcbiAgICAgIChmaWxlICYmIGluY2x1ZGVGaWxlICE9PSBmYWxzZSA/IChcIiBhdCBcIiArIGZpbGUpIDogJycpXG4gICAgKVxuICB9O1xuXG4gIHZhciByZXBlYXQgPSBmdW5jdGlvbiAoc3RyLCBuKSB7XG4gICAgdmFyIHJlcyA9ICcnO1xuICAgIHdoaWxlIChuKSB7XG4gICAgICBpZiAobiAlIDIgPT09IDEpIHsgcmVzICs9IHN0cjsgfVxuICAgICAgaWYgKG4gPiAxKSB7IHN0ciArPSBzdHI7IH1cbiAgICAgIG4gPj49IDE7XG4gICAgfVxuICAgIHJldHVybiByZXNcbiAgfTtcblxuICB2YXIgZ2VuZXJhdGVDb21wb25lbnRUcmFjZSA9IGZ1bmN0aW9uICh2bSkge1xuICAgIGlmICh2bS5faXNWdWUgJiYgdm0uJHBhcmVudCkge1xuICAgICAgdmFyIHRyZWUgPSBbXTtcbiAgICAgIHZhciBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2UgPSAwO1xuICAgICAgd2hpbGUgKHZtKSB7XG4gICAgICAgIGlmICh0cmVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB2YXIgbGFzdCA9IHRyZWVbdHJlZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICBpZiAobGFzdC5jb25zdHJ1Y3RvciA9PT0gdm0uY29uc3RydWN0b3IpIHtcbiAgICAgICAgICAgIGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSsrO1xuICAgICAgICAgICAgdm0gPSB2bS4kcGFyZW50O1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRSZWN1cnNpdmVTZXF1ZW5jZSA+IDApIHtcbiAgICAgICAgICAgIHRyZWVbdHJlZS5sZW5ndGggLSAxXSA9IFtsYXN0LCBjdXJyZW50UmVjdXJzaXZlU2VxdWVuY2VdO1xuICAgICAgICAgICAgY3VycmVudFJlY3Vyc2l2ZVNlcXVlbmNlID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHJlZS5wdXNoKHZtKTtcbiAgICAgICAgdm0gPSB2bS4kcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuICdcXG5cXG5mb3VuZCBpblxcblxcbicgKyB0cmVlXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKHZtLCBpKSB7IHJldHVybiAoXCJcIiArIChpID09PSAwID8gJy0tLT4gJyA6IHJlcGVhdCgnICcsIDUgKyBpICogMikpICsgKEFycmF5LmlzQXJyYXkodm0pXG4gICAgICAgICAgICA/ICgoZm9ybWF0Q29tcG9uZW50TmFtZSh2bVswXSkpICsgXCIuLi4gKFwiICsgKHZtWzFdKSArIFwiIHJlY3Vyc2l2ZSBjYWxscylcIilcbiAgICAgICAgICAgIDogZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpKTsgfSlcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoXCJcXG5cXG4oZm91bmQgaW4gXCIgKyAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgXCIpXCIpXG4gICAgfVxuICB9O1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3IgKGVyciwgdm0sIGluZm8pIHtcbiAgaWYgKGNvbmZpZy5lcnJvckhhbmRsZXIpIHtcbiAgICBjb25maWcuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCwgZXJyLCB2bSwgaW5mbyk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm4oKFwiRXJyb3IgaW4gXCIgKyBpbmZvICsgXCI6IFxcXCJcIiArIChlcnIudG9TdHJpbmcoKSkgKyBcIlxcXCJcIiksIHZtKTtcbiAgICB9XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaW5Ccm93c2VyICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG4vKiBnbG9iYWxzIE11dGF0aW9uT2JzZXJ2ZXIgKi9cblxuLy8gY2FuIHdlIHVzZSBfX3Byb3RvX18/XG52YXIgaGFzUHJvdG8gPSAnX19wcm90b19fJyBpbiB7fTtcblxuLy8gQnJvd3NlciBlbnZpcm9ubWVudCBzbmlmZmluZ1xudmFyIGluQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xudmFyIFVBID0gaW5Ccm93c2VyICYmIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG52YXIgaXNJRSA9IFVBICYmIC9tc2llfHRyaWRlbnQvLnRlc3QoVUEpO1xudmFyIGlzSUU5ID0gVUEgJiYgVUEuaW5kZXhPZignbXNpZSA5LjAnKSA+IDA7XG52YXIgaXNFZGdlID0gVUEgJiYgVUEuaW5kZXhPZignZWRnZS8nKSA+IDA7XG52YXIgaXNBbmRyb2lkID0gVUEgJiYgVUEuaW5kZXhPZignYW5kcm9pZCcpID4gMDtcbnZhciBpc0lPUyA9IFVBICYmIC9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChVQSk7XG52YXIgaXNDaHJvbWUgPSBVQSAmJiAvY2hyb21lXFwvXFxkKy8udGVzdChVQSkgJiYgIWlzRWRnZTtcblxuLy8gRmlyZWZpeCBoYXMgYSBcIndhdGNoXCIgZnVuY3Rpb24gb24gT2JqZWN0LnByb3RvdHlwZS4uLlxudmFyIG5hdGl2ZVdhdGNoID0gKHt9KS53YXRjaDtcblxudmFyIHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlO1xuaWYgKGluQnJvd3Nlcikge1xuICB0cnkge1xuICAgIHZhciBvcHRzID0ge307XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9wdHMsICdwYXNzaXZlJywgKHtcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0ICgpIHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgc3VwcG9ydHNQYXNzaXZlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KSk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODVcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdC1wYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbi8vIHRoaXMgbmVlZHMgdG8gYmUgbGF6eS1ldmFsZWQgYmVjYXVzZSB2dWUgbWF5IGJlIHJlcXVpcmVkIGJlZm9yZVxuLy8gdnVlLXNlcnZlci1yZW5kZXJlciBjYW4gc2V0IFZVRV9FTlZcbnZhciBfaXNTZXJ2ZXI7XG52YXIgaXNTZXJ2ZXJSZW5kZXJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChfaXNTZXJ2ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghaW5Ccm93c2VyICYmIHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBkZXRlY3QgcHJlc2VuY2Ugb2YgdnVlLXNlcnZlci1yZW5kZXJlciBhbmQgYXZvaWRcbiAgICAgIC8vIFdlYnBhY2sgc2hpbW1pbmcgdGhlIHByb2Nlc3NcbiAgICAgIF9pc1NlcnZlciA9IGdsb2JhbFsncHJvY2VzcyddLmVudi5WVUVfRU5WID09PSAnc2VydmVyJztcbiAgICB9IGVsc2Uge1xuICAgICAgX2lzU2VydmVyID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBfaXNTZXJ2ZXJcbn07XG5cbi8vIGRldGVjdCBkZXZ0b29sc1xudmFyIGRldnRvb2xzID0gaW5Ccm93c2VyICYmIHdpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gaXNOYXRpdmUgKEN0b3IpIHtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09PSAnZnVuY3Rpb24nICYmIC9uYXRpdmUgY29kZS8udGVzdChDdG9yLnRvU3RyaW5nKCkpXG59XG5cbnZhciBoYXNTeW1ib2wgPVxuICB0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShTeW1ib2wpICYmXG4gIHR5cGVvZiBSZWZsZWN0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShSZWZsZWN0Lm93bktleXMpO1xuXG4vKipcbiAqIERlZmVyIGEgdGFzayB0byBleGVjdXRlIGl0IGFzeW5jaHJvbm91c2x5LlxuICovXG52YXIgbmV4dFRpY2sgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgY2FsbGJhY2tzID0gW107XG4gIHZhciBwZW5kaW5nID0gZmFsc2U7XG4gIHZhciB0aW1lckZ1bmM7XG5cbiAgZnVuY3Rpb24gbmV4dFRpY2tIYW5kbGVyICgpIHtcbiAgICBwZW5kaW5nID0gZmFsc2U7XG4gICAgdmFyIGNvcGllcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICBjYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvcGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29waWVzW2ldKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gdGhlIG5leHRUaWNrIGJlaGF2aW9yIGxldmVyYWdlcyB0aGUgbWljcm90YXNrIHF1ZXVlLCB3aGljaCBjYW4gYmUgYWNjZXNzZWRcbiAgLy8gdmlhIGVpdGhlciBuYXRpdmUgUHJvbWlzZS50aGVuIG9yIE11dGF0aW9uT2JzZXJ2ZXIuXG4gIC8vIE11dGF0aW9uT2JzZXJ2ZXIgaGFzIHdpZGVyIHN1cHBvcnQsIGhvd2V2ZXIgaXQgaXMgc2VyaW91c2x5IGJ1Z2dlZCBpblxuICAvLyBVSVdlYlZpZXcgaW4gaU9TID49IDkuMy4zIHdoZW4gdHJpZ2dlcmVkIGluIHRvdWNoIGV2ZW50IGhhbmRsZXJzLiBJdFxuICAvLyBjb21wbGV0ZWx5IHN0b3BzIHdvcmtpbmcgYWZ0ZXIgdHJpZ2dlcmluZyBhIGZldyB0aW1lcy4uLiBzbywgaWYgbmF0aXZlXG4gIC8vIFByb21pc2UgaXMgYXZhaWxhYmxlLCB3ZSB3aWxsIHVzZSBpdDpcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNOYXRpdmUoUHJvbWlzZSkpIHtcbiAgICB2YXIgcCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHZhciBsb2dFcnJvciA9IGZ1bmN0aW9uIChlcnIpIHsgY29uc29sZS5lcnJvcihlcnIpOyB9O1xuICAgIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHAudGhlbihuZXh0VGlja0hhbmRsZXIpLmNhdGNoKGxvZ0Vycm9yKTtcbiAgICAgIC8vIGluIHByb2JsZW1hdGljIFVJV2ViVmlld3MsIFByb21pc2UudGhlbiBkb2Vzbid0IGNvbXBsZXRlbHkgYnJlYWssIGJ1dFxuICAgICAgLy8gaXQgY2FuIGdldCBzdHVjayBpbiBhIHdlaXJkIHN0YXRlIHdoZXJlIGNhbGxiYWNrcyBhcmUgcHVzaGVkIGludG8gdGhlXG4gICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYnV0IHRoZSBxdWV1ZSBpc24ndCBiZWluZyBmbHVzaGVkLCB1bnRpbCB0aGUgYnJvd3NlclxuICAgICAgLy8gbmVlZHMgdG8gZG8gc29tZSBvdGhlciB3b3JrLCBlLmcuIGhhbmRsZSBhIHRpbWVyLiBUaGVyZWZvcmUgd2UgY2FuXG4gICAgICAvLyBcImZvcmNlXCIgdGhlIG1pY3JvdGFzayBxdWV1ZSB0byBiZSBmbHVzaGVkIGJ5IGFkZGluZyBhbiBlbXB0eSB0aW1lci5cbiAgICAgIGlmIChpc0lPUykgeyBzZXRUaW1lb3V0KG5vb3ApOyB9XG4gICAgfTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgTXV0YXRpb25PYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgKFxuICAgIGlzTmF0aXZlKE11dGF0aW9uT2JzZXJ2ZXIpIHx8XG4gICAgLy8gUGhhbnRvbUpTIGFuZCBpT1MgNy54XG4gICAgTXV0YXRpb25PYnNlcnZlci50b1N0cmluZygpID09PSAnW29iamVjdCBNdXRhdGlvbk9ic2VydmVyQ29uc3RydWN0b3JdJ1xuICApKSB7XG4gICAgLy8gdXNlIE11dGF0aW9uT2JzZXJ2ZXIgd2hlcmUgbmF0aXZlIFByb21pc2UgaXMgbm90IGF2YWlsYWJsZSxcbiAgICAvLyBlLmcuIFBoYW50b21KUyBJRTExLCBpT1M3LCBBbmRyb2lkIDQuNFxuICAgIHZhciBjb3VudGVyID0gMTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihuZXh0VGlja0hhbmRsZXIpO1xuICAgIHZhciB0ZXh0Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjb3VudGVyKSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0ZXh0Tm9kZSwge1xuICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgIH0pO1xuICAgIHRpbWVyRnVuYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvdW50ZXIgPSAoY291bnRlciArIDEpICUgMjtcbiAgICAgIHRleHROb2RlLmRhdGEgPSBTdHJpbmcoY291bnRlcik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBmYWxsYmFjayB0byBzZXRUaW1lb3V0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICB0aW1lckZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRUaW1lb3V0KG5leHRUaWNrSGFuZGxlciwgMCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBxdWV1ZU5leHRUaWNrIChjYiwgY3R4KSB7XG4gICAgdmFyIF9yZXNvbHZlO1xuICAgIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChjYikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNiLmNhbGwoY3R4KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGhhbmRsZUVycm9yKGUsIGN0eCwgJ25leHRUaWNrJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoX3Jlc29sdmUpIHtcbiAgICAgICAgX3Jlc29sdmUoY3R4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSB0cnVlO1xuICAgICAgdGltZXJGdW5jKCk7XG4gICAgfVxuICAgIGlmICghY2IgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KVxuICAgIH1cbiAgfVxufSkoKTtcblxudmFyIF9TZXQ7XG4vKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbmlmICh0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJyAmJiBpc05hdGl2ZShTZXQpKSB7XG4gIC8vIHVzZSBuYXRpdmUgU2V0IHdoZW4gYXZhaWxhYmxlLlxuICBfU2V0ID0gU2V0O1xufSBlbHNlIHtcbiAgLy8gYSBub24tc3RhbmRhcmQgU2V0IHBvbHlmaWxsIHRoYXQgb25seSB3b3JrcyB3aXRoIHByaW1pdGl2ZSBrZXlzLlxuICBfU2V0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTZXQgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH1cbiAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyAoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5zZXRba2V5XSA9PT0gdHJ1ZVxuICAgIH07XG4gICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGtleSkge1xuICAgICAgdGhpcy5zZXRba2V5XSA9IHRydWU7XG4gICAgfTtcbiAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIgKCkge1xuICAgICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIH07XG5cbiAgICByZXR1cm4gU2V0O1xuICB9KCkpO1xufVxuXG4vKiAgKi9cblxuXG52YXIgdWlkJDEgPSAwO1xuXG4vKipcbiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICogZGlyZWN0aXZlcyBzdWJzY3JpYmluZyB0byBpdC5cbiAqL1xudmFyIERlcCA9IGZ1bmN0aW9uIERlcCAoKSB7XG4gIHRoaXMuaWQgPSB1aWQkMSsrO1xuICB0aGlzLnN1YnMgPSBbXTtcbn07XG5cbkRlcC5wcm90b3R5cGUuYWRkU3ViID0gZnVuY3Rpb24gYWRkU3ViIChzdWIpIHtcbiAgdGhpcy5zdWJzLnB1c2goc3ViKTtcbn07XG5cbkRlcC5wcm90b3R5cGUucmVtb3ZlU3ViID0gZnVuY3Rpb24gcmVtb3ZlU3ViIChzdWIpIHtcbiAgcmVtb3ZlKHRoaXMuc3Vicywgc3ViKTtcbn07XG5cbkRlcC5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgaWYgKERlcC50YXJnZXQpIHtcbiAgICBEZXAudGFyZ2V0LmFkZERlcCh0aGlzKTtcbiAgfVxufTtcblxuRGVwLnByb3RvdHlwZS5ub3RpZnkgPSBmdW5jdGlvbiBub3RpZnkgKCkge1xuICAvLyBzdGFiaWxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICB2YXIgc3VicyA9IHRoaXMuc3Vicy5zbGljZSgpO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHN1YnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgc3Vic1tpXS51cGRhdGUoKTtcbiAgfVxufTtcblxuLy8gdGhlIGN1cnJlbnQgdGFyZ2V0IHdhdGNoZXIgYmVpbmcgZXZhbHVhdGVkLlxuLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZVxuLy8gd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQgYXQgYW55IHRpbWUuXG5EZXAudGFyZ2V0ID0gbnVsbDtcbnZhciB0YXJnZXRTdGFjayA9IFtdO1xuXG5mdW5jdGlvbiBwdXNoVGFyZ2V0IChfdGFyZ2V0KSB7XG4gIGlmIChEZXAudGFyZ2V0KSB7IHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldCk7IH1cbiAgRGVwLnRhcmdldCA9IF90YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIHBvcFRhcmdldCAoKSB7XG4gIERlcC50YXJnZXQgPSB0YXJnZXRTdGFjay5wb3AoKTtcbn1cblxuLypcbiAqIG5vdCB0eXBlIGNoZWNraW5nIHRoaXMgZmlsZSBiZWNhdXNlIGZsb3cgZG9lc24ndCBwbGF5IHdlbGwgd2l0aFxuICogZHluYW1pY2FsbHkgYWNjZXNzaW5nIG1ldGhvZHMgb24gQXJyYXkgcHJvdG90eXBlXG4gKi9cblxudmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGU7XG52YXIgYXJyYXlNZXRob2RzID0gT2JqZWN0LmNyZWF0ZShhcnJheVByb3RvKTtbXG4gICdwdXNoJyxcbiAgJ3BvcCcsXG4gICdzaGlmdCcsXG4gICd1bnNoaWZ0JyxcbiAgJ3NwbGljZScsXG4gICdzb3J0JyxcbiAgJ3JldmVyc2UnXG5dXG4uZm9yRWFjaChmdW5jdGlvbiAobWV0aG9kKSB7XG4gIC8vIGNhY2hlIG9yaWdpbmFsIG1ldGhvZFxuICB2YXIgb3JpZ2luYWwgPSBhcnJheVByb3RvW21ldGhvZF07XG4gIGRlZihhcnJheU1ldGhvZHMsIG1ldGhvZCwgZnVuY3Rpb24gbXV0YXRvciAoKSB7XG4gICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgdmFyIHJlc3VsdCA9IG9yaWdpbmFsLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIHZhciBvYiA9IHRoaXMuX19vYl9fO1xuICAgIHZhciBpbnNlcnRlZDtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncHVzaCc6XG4gICAgICBjYXNlICd1bnNoaWZ0JzpcbiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzO1xuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnc3BsaWNlJzpcbiAgICAgICAgaW5zZXJ0ZWQgPSBhcmdzLnNsaWNlKDIpO1xuICAgICAgICBicmVha1xuICAgIH1cbiAgICBpZiAoaW5zZXJ0ZWQpIHsgb2Iub2JzZXJ2ZUFycmF5KGluc2VydGVkKTsgfVxuICAgIC8vIG5vdGlmeSBjaGFuZ2VcbiAgICBvYi5kZXAubm90aWZ5KCk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KTtcbn0pO1xuXG4vKiAgKi9cblxudmFyIGFycmF5S2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFycmF5TWV0aG9kcyk7XG5cbi8qKlxuICogQnkgZGVmYXVsdCwgd2hlbiBhIHJlYWN0aXZlIHByb3BlcnR5IGlzIHNldCwgdGhlIG5ldyB2YWx1ZSBpc1xuICogYWxzbyBjb252ZXJ0ZWQgdG8gYmVjb21lIHJlYWN0aXZlLiBIb3dldmVyIHdoZW4gcGFzc2luZyBkb3duIHByb3BzLFxuICogd2UgZG9uJ3Qgd2FudCB0byBmb3JjZSBjb252ZXJzaW9uIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBhIG5lc3RlZCB2YWx1ZVxuICogdW5kZXIgYSBmcm96ZW4gZGF0YSBzdHJ1Y3R1cmUuIENvbnZlcnRpbmcgaXQgd291bGQgZGVmZWF0IHRoZSBvcHRpbWl6YXRpb24uXG4gKi9cbnZhciBvYnNlcnZlclN0YXRlID0ge1xuICBzaG91bGRDb252ZXJ0OiB0cnVlXG59O1xuXG4vKipcbiAqIE9ic2VydmVyIGNsYXNzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRhcmdldFxuICogb2JqZWN0J3MgcHJvcGVydHkga2V5cyBpbnRvIGdldHRlci9zZXR0ZXJzIHRoYXRcbiAqIGNvbGxlY3QgZGVwZW5kZW5jaWVzIGFuZCBkaXNwYXRjaGVzIHVwZGF0ZXMuXG4gKi9cbnZhciBPYnNlcnZlciA9IGZ1bmN0aW9uIE9ic2VydmVyICh2YWx1ZSkge1xuICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIHRoaXMuZGVwID0gbmV3IERlcCgpO1xuICB0aGlzLnZtQ291bnQgPSAwO1xuICBkZWYodmFsdWUsICdfX29iX18nLCB0aGlzKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFyIGF1Z21lbnQgPSBoYXNQcm90b1xuICAgICAgPyBwcm90b0F1Z21lbnRcbiAgICAgIDogY29weUF1Z21lbnQ7XG4gICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpO1xuICAgIHRoaXMub2JzZXJ2ZUFycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLndhbGsodmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFdhbGsgdGhyb3VnaCBlYWNoIHByb3BlcnR5IGFuZCBjb252ZXJ0IHRoZW0gaW50b1xuICogZ2V0dGVyL3NldHRlcnMuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuXG4gKiB2YWx1ZSB0eXBlIGlzIE9iamVjdC5cbiAqL1xuT2JzZXJ2ZXIucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiB3YWxrIChvYmopIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMShvYmosIGtleXNbaV0sIG9ialtrZXlzW2ldXSk7XG4gIH1cbn07XG5cbi8qKlxuICogT2JzZXJ2ZSBhIGxpc3Qgb2YgQXJyYXkgaXRlbXMuXG4gKi9cbk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiBvYnNlcnZlQXJyYXkgKGl0ZW1zKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgb2JzZXJ2ZShpdGVtc1tpXSk7XG4gIH1cbn07XG5cbi8vIGhlbHBlcnNcblxuLyoqXG4gKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgaW50ZXJjZXB0aW5nXG4gKiB0aGUgcHJvdG90eXBlIGNoYWluIHVzaW5nIF9fcHJvdG9fX1xuICovXG5mdW5jdGlvbiBwcm90b0F1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG4gIHRhcmdldC5fX3Byb3RvX18gPSBzcmM7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgZGVmaW5pbmdcbiAqIGhpZGRlbiBwcm9wZXJ0aWVzLlxuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZnVuY3Rpb24gY29weUF1Z21lbnQgKHRhcmdldCwgc3JjLCBrZXlzKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0ga2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBkZWYodGFyZ2V0LCBrZXksIHNyY1trZXldKTtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gY3JlYXRlIGFuIG9ic2VydmVyIGluc3RhbmNlIGZvciBhIHZhbHVlLFxuICogcmV0dXJucyB0aGUgbmV3IG9ic2VydmVyIGlmIHN1Y2Nlc3NmdWxseSBvYnNlcnZlZCxcbiAqIG9yIHRoZSBleGlzdGluZyBvYnNlcnZlciBpZiB0aGUgdmFsdWUgYWxyZWFkeSBoYXMgb25lLlxuICovXG5mdW5jdGlvbiBvYnNlcnZlICh2YWx1ZSwgYXNSb290RGF0YSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvYjtcbiAgaWYgKGhhc093bih2YWx1ZSwgJ19fb2JfXycpICYmIHZhbHVlLl9fb2JfXyBpbnN0YW5jZW9mIE9ic2VydmVyKSB7XG4gICAgb2IgPSB2YWx1ZS5fX29iX187XG4gIH0gZWxzZSBpZiAoXG4gICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ICYmXG4gICAgIWlzU2VydmVyUmVuZGVyaW5nKCkgJiZcbiAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgaXNQbGFpbk9iamVjdCh2YWx1ZSkpICYmXG4gICAgT2JqZWN0LmlzRXh0ZW5zaWJsZSh2YWx1ZSkgJiZcbiAgICAhdmFsdWUuX2lzVnVlXG4gICkge1xuICAgIG9iID0gbmV3IE9ic2VydmVyKHZhbHVlKTtcbiAgfVxuICBpZiAoYXNSb290RGF0YSAmJiBvYikge1xuICAgIG9iLnZtQ291bnQrKztcbiAgfVxuICByZXR1cm4gb2Jcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSByZWFjdGl2ZSBwcm9wZXJ0eSBvbiBhbiBPYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGRlZmluZVJlYWN0aXZlJCQxIChcbiAgb2JqLFxuICBrZXksXG4gIHZhbCxcbiAgY3VzdG9tU2V0dGVyLFxuICBzaGFsbG93XG4pIHtcbiAgdmFyIGRlcCA9IG5ldyBEZXAoKTtcblxuICB2YXIgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTtcbiAgaWYgKHByb3BlcnR5ICYmIHByb3BlcnR5LmNvbmZpZ3VyYWJsZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIGNhdGVyIGZvciBwcmUtZGVmaW5lZCBnZXR0ZXIvc2V0dGVyc1xuICB2YXIgZ2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuZ2V0O1xuICB2YXIgc2V0dGVyID0gcHJvcGVydHkgJiYgcHJvcGVydHkuc2V0O1xuXG4gIHZhciBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZSh2YWwpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGdldHRlciA/IGdldHRlci5jYWxsKG9iaikgOiB2YWw7XG4gICAgICBpZiAoRGVwLnRhcmdldCkge1xuICAgICAgICBkZXAuZGVwZW5kKCk7XG4gICAgICAgIGlmIChjaGlsZE9iKSB7XG4gICAgICAgICAgY2hpbGRPYi5kZXAuZGVwZW5kKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgZGVwZW5kQXJyYXkodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gcmVhY3RpdmVTZXR0ZXIgKG5ld1ZhbCkge1xuICAgICAgdmFyIHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbDtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUgfHwgKG5ld1ZhbCAhPT0gbmV3VmFsICYmIHZhbHVlICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY3VzdG9tU2V0dGVyKSB7XG4gICAgICAgIGN1c3RvbVNldHRlcigpO1xuICAgICAgfVxuICAgICAgaWYgKHNldHRlcikge1xuICAgICAgICBzZXR0ZXIuY2FsbChvYmosIG5ld1ZhbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWwgPSBuZXdWYWw7XG4gICAgICB9XG4gICAgICBjaGlsZE9iID0gIXNoYWxsb3cgJiYgb2JzZXJ2ZShuZXdWYWwpO1xuICAgICAgZGVwLm5vdGlmeSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kXG4gKiB0cmlnZ2VycyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0XG4gKiBhbHJlYWR5IGV4aXN0LlxuICovXG5mdW5jdGlvbiBzZXQgKHRhcmdldCwga2V5LCB2YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0Lmxlbmd0aCA9IE1hdGgubWF4KHRhcmdldC5sZW5ndGgsIGtleSk7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEsIHZhbCk7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGlmIChoYXNPd24odGFyZ2V0LCBrZXkpKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGFkZGluZyByZWFjdGl2ZSBwcm9wZXJ0aWVzIHRvIGEgVnVlIGluc3RhbmNlIG9yIGl0cyByb290ICRkYXRhICcgK1xuICAgICAgJ2F0IHJ1bnRpbWUgLSBkZWNsYXJlIGl0IHVwZnJvbnQgaW4gdGhlIGRhdGEgb3B0aW9uLidcbiAgICApO1xuICAgIHJldHVybiB2YWxcbiAgfVxuICBpZiAoIW9iKSB7XG4gICAgdGFyZ2V0W2tleV0gPSB2YWw7XG4gICAgcmV0dXJuIHZhbFxuICB9XG4gIGRlZmluZVJlYWN0aXZlJCQxKG9iLnZhbHVlLCBrZXksIHZhbCk7XG4gIG9iLmRlcC5ub3RpZnkoKTtcbiAgcmV0dXJuIHZhbFxufVxuXG4vKipcbiAqIERlbGV0ZSBhIHByb3BlcnR5IGFuZCB0cmlnZ2VyIGNoYW5nZSBpZiBuZWNlc3NhcnkuXG4gKi9cbmZ1bmN0aW9uIGRlbCAodGFyZ2V0LCBrZXkpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSAmJiBpc1ZhbGlkQXJyYXlJbmRleChrZXkpKSB7XG4gICAgdGFyZ2V0LnNwbGljZShrZXksIDEpO1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvYiA9ICh0YXJnZXQpLl9fb2JfXztcbiAgaWYgKHRhcmdldC5faXNWdWUgfHwgKG9iICYmIG9iLnZtQ291bnQpKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgJ0F2b2lkIGRlbGV0aW5nIHByb3BlcnRpZXMgb24gYSBWdWUgaW5zdGFuY2Ugb3IgaXRzIHJvb3QgJGRhdGEgJyArXG4gICAgICAnLSBqdXN0IHNldCBpdCB0byBudWxsLidcbiAgICApO1xuICAgIHJldHVyblxuICB9XG4gIGlmICghaGFzT3duKHRhcmdldCwga2V5KSkge1xuICAgIHJldHVyblxuICB9XG4gIGRlbGV0ZSB0YXJnZXRba2V5XTtcbiAgaWYgKCFvYikge1xuICAgIHJldHVyblxuICB9XG4gIG9iLmRlcC5ub3RpZnkoKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGRlcGVuZGVuY2llcyBvbiBhcnJheSBlbGVtZW50cyB3aGVuIHRoZSBhcnJheSBpcyB0b3VjaGVkLCBzaW5jZVxuICogd2UgY2Fubm90IGludGVyY2VwdCBhcnJheSBlbGVtZW50IGFjY2VzcyBsaWtlIHByb3BlcnR5IGdldHRlcnMuXG4gKi9cbmZ1bmN0aW9uIGRlcGVuZEFycmF5ICh2YWx1ZSkge1xuICBmb3IgKHZhciBlID0gKHZvaWQgMCksIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZSA9IHZhbHVlW2ldO1xuICAgIGUgJiYgZS5fX29iX18gJiYgZS5fX29iX18uZGVwLmRlcGVuZCgpO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBkZXBlbmRBcnJheShlKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogT3B0aW9uIG92ZXJ3cml0aW5nIHN0cmF0ZWdpZXMgYXJlIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZVxuICogaG93IHRvIG1lcmdlIGEgcGFyZW50IG9wdGlvbiB2YWx1ZSBhbmQgYSBjaGlsZCBvcHRpb25cbiAqIHZhbHVlIGludG8gdGhlIGZpbmFsIHZhbHVlLlxuICovXG52YXIgc3RyYXRzID0gY29uZmlnLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztcblxuLyoqXG4gKiBPcHRpb25zIHdpdGggcmVzdHJpY3Rpb25zXG4gKi9cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHN0cmF0cy5lbCA9IHN0cmF0cy5wcm9wc0RhdGEgPSBmdW5jdGlvbiAocGFyZW50LCBjaGlsZCwgdm0sIGtleSkge1xuICAgIGlmICghdm0pIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIFwib3B0aW9uIFxcXCJcIiArIGtleSArIFwiXFxcIiBjYW4gb25seSBiZSB1c2VkIGR1cmluZyBpbnN0YW5jZSBcIiArXG4gICAgICAgICdjcmVhdGlvbiB3aXRoIHRoZSBgbmV3YCBrZXl3b3JkLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0U3RyYXQocGFyZW50LCBjaGlsZClcbiAgfTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdGhhdCByZWN1cnNpdmVseSBtZXJnZXMgdHdvIGRhdGEgb2JqZWN0cyB0b2dldGhlci5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhICh0bywgZnJvbSkge1xuICBpZiAoIWZyb20pIHsgcmV0dXJuIHRvIH1cbiAgdmFyIGtleSwgdG9WYWwsIGZyb21WYWw7XG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJvbSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgdG9WYWwgPSB0b1trZXldO1xuICAgIGZyb21WYWwgPSBmcm9tW2tleV07XG4gICAgaWYgKCFoYXNPd24odG8sIGtleSkpIHtcbiAgICAgIHNldCh0bywga2V5LCBmcm9tVmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodG9WYWwpICYmIGlzUGxhaW5PYmplY3QoZnJvbVZhbCkpIHtcbiAgICAgIG1lcmdlRGF0YSh0b1ZhbCwgZnJvbVZhbCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0b1xufVxuXG4vKipcbiAqIERhdGFcbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhT3JGbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtXG4pIHtcbiAgaWYgKCF2bSkge1xuICAgIC8vIGluIGEgVnVlLmV4dGVuZCBtZXJnZSwgYm90aCBzaG91bGQgYmUgZnVuY3Rpb25zXG4gICAgaWYgKCFjaGlsZFZhbCkge1xuICAgICAgcmV0dXJuIHBhcmVudFZhbFxuICAgIH1cbiAgICBpZiAoIXBhcmVudFZhbCkge1xuICAgICAgcmV0dXJuIGNoaWxkVmFsXG4gICAgfVxuICAgIC8vIHdoZW4gcGFyZW50VmFsICYgY2hpbGRWYWwgYXJlIGJvdGggcHJlc2VudCxcbiAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcbiAgICAvLyBtZXJnZWQgcmVzdWx0IG9mIGJvdGggZnVuY3Rpb25zLi4uIG5vIG5lZWQgdG9cbiAgICAvLyBjaGVjayBpZiBwYXJlbnRWYWwgaXMgYSBmdW5jdGlvbiBoZXJlIGJlY2F1c2VcbiAgICAvLyBpdCBoYXMgdG8gYmUgYSBmdW5jdGlvbiB0byBwYXNzIHByZXZpb3VzIG1lcmdlcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkRGF0YUZuICgpIHtcbiAgICAgIHJldHVybiBtZXJnZURhdGEoXG4gICAgICAgIHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IGNoaWxkVmFsLmNhbGwodGhpcykgOiBjaGlsZFZhbCxcbiAgICAgICAgdHlwZW9mIHBhcmVudFZhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcmVudFZhbC5jYWxsKHRoaXMpIDogcGFyZW50VmFsXG4gICAgICApXG4gICAgfVxuICB9IGVsc2UgaWYgKHBhcmVudFZhbCB8fCBjaGlsZFZhbCkge1xuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZWRJbnN0YW5jZURhdGFGbiAoKSB7XG4gICAgICAvLyBpbnN0YW5jZSBtZXJnZVxuICAgICAgdmFyIGluc3RhbmNlRGF0YSA9IHR5cGVvZiBjaGlsZFZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IGNoaWxkVmFsLmNhbGwodm0pXG4gICAgICAgIDogY2hpbGRWYWw7XG4gICAgICB2YXIgZGVmYXVsdERhdGEgPSB0eXBlb2YgcGFyZW50VmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gcGFyZW50VmFsLmNhbGwodm0pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGluc3RhbmNlRGF0YSkge1xuICAgICAgICByZXR1cm4gbWVyZ2VEYXRhKGluc3RhbmNlRGF0YSwgZGVmYXVsdERhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGVmYXVsdERhdGFcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuc3RyYXRzLmRhdGEgPSBmdW5jdGlvbiAoXG4gIHBhcmVudFZhbCxcbiAgY2hpbGRWYWwsXG4gIHZtXG4pIHtcbiAgaWYgKCF2bSkge1xuICAgIGlmIChjaGlsZFZhbCAmJiB0eXBlb2YgY2hpbGRWYWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ1RoZSBcImRhdGFcIiBvcHRpb24gc2hvdWxkIGJlIGEgZnVuY3Rpb24gJyArXG4gICAgICAgICd0aGF0IHJldHVybnMgYSBwZXItaW5zdGFuY2UgdmFsdWUgaW4gY29tcG9uZW50ICcgK1xuICAgICAgICAnZGVmaW5pdGlvbnMuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBwYXJlbnRWYWxcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlRGF0YU9yRm4uY2FsbCh0aGlzLCBwYXJlbnRWYWwsIGNoaWxkVmFsKVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlRGF0YU9yRm4ocGFyZW50VmFsLCBjaGlsZFZhbCwgdm0pXG59O1xuXG4vKipcbiAqIEhvb2tzIGFuZCBwcm9wcyBhcmUgbWVyZ2VkIGFzIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VIb29rIChcbiAgcGFyZW50VmFsLFxuICBjaGlsZFZhbFxuKSB7XG4gIHJldHVybiBjaGlsZFZhbFxuICAgID8gcGFyZW50VmFsXG4gICAgICA/IHBhcmVudFZhbC5jb25jYXQoY2hpbGRWYWwpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRWYWwpXG4gICAgICAgID8gY2hpbGRWYWxcbiAgICAgICAgOiBbY2hpbGRWYWxdXG4gICAgOiBwYXJlbnRWYWxcbn1cblxuTElGRUNZQ0xFX0hPT0tTLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgc3RyYXRzW2hvb2tdID0gbWVyZ2VIb29rO1xufSk7XG5cbi8qKlxuICogQXNzZXRzXG4gKlxuICogV2hlbiBhIHZtIGlzIHByZXNlbnQgKGluc3RhbmNlIGNyZWF0aW9uKSwgd2UgbmVlZCB0byBkb1xuICogYSB0aHJlZS13YXkgbWVyZ2UgYmV0d2VlbiBjb25zdHJ1Y3RvciBvcHRpb25zLCBpbnN0YW5jZVxuICogb3B0aW9ucyBhbmQgcGFyZW50IG9wdGlvbnMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlQXNzZXRzIChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XG4gIHZhciByZXMgPSBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKTtcbiAgcmV0dXJuIGNoaWxkVmFsXG4gICAgPyBleHRlbmQocmVzLCBjaGlsZFZhbClcbiAgICA6IHJlc1xufVxuXG5BU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gIHN0cmF0c1t0eXBlICsgJ3MnXSA9IG1lcmdlQXNzZXRzO1xufSk7XG5cbi8qKlxuICogV2F0Y2hlcnMuXG4gKlxuICogV2F0Y2hlcnMgaGFzaGVzIHNob3VsZCBub3Qgb3ZlcndyaXRlIG9uZVxuICogYW5vdGhlciwgc28gd2UgbWVyZ2UgdGhlbSBhcyBhcnJheXMuXG4gKi9cbnN0cmF0cy53YXRjaCA9IGZ1bmN0aW9uIChwYXJlbnRWYWwsIGNoaWxkVmFsKSB7XG4gIC8vIHdvcmsgYXJvdW5kIEZpcmVmb3gncyBPYmplY3QucHJvdG90eXBlLndhdGNoLi4uXG4gIGlmIChwYXJlbnRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IHBhcmVudFZhbCA9IHVuZGVmaW5lZDsgfVxuICBpZiAoY2hpbGRWYWwgPT09IG5hdGl2ZVdhdGNoKSB7IGNoaWxkVmFsID0gdW5kZWZpbmVkOyB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIWNoaWxkVmFsKSB7IHJldHVybiBPYmplY3QuY3JlYXRlKHBhcmVudFZhbCB8fCBudWxsKSB9XG4gIGlmICghcGFyZW50VmFsKSB7IHJldHVybiBjaGlsZFZhbCB9XG4gIHZhciByZXQgPSB7fTtcbiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTtcbiAgZm9yICh2YXIga2V5IGluIGNoaWxkVmFsKSB7XG4gICAgdmFyIHBhcmVudCA9IHJldFtrZXldO1xuICAgIHZhciBjaGlsZCA9IGNoaWxkVmFsW2tleV07XG4gICAgaWYgKHBhcmVudCAmJiAhQXJyYXkuaXNBcnJheShwYXJlbnQpKSB7XG4gICAgICBwYXJlbnQgPSBbcGFyZW50XTtcbiAgICB9XG4gICAgcmV0W2tleV0gPSBwYXJlbnRcbiAgICAgID8gcGFyZW50LmNvbmNhdChjaGlsZClcbiAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZCkgPyBjaGlsZCA6IFtjaGlsZF07XG4gIH1cbiAgcmV0dXJuIHJldFxufTtcblxuLyoqXG4gKiBPdGhlciBvYmplY3QgaGFzaGVzLlxuICovXG5zdHJhdHMucHJvcHMgPVxuc3RyYXRzLm1ldGhvZHMgPVxuc3RyYXRzLmluamVjdCA9XG5zdHJhdHMuY29tcHV0ZWQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkge1xuICBpZiAoIXBhcmVudFZhbCkgeyByZXR1cm4gY2hpbGRWYWwgfVxuICB2YXIgcmV0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgZXh0ZW5kKHJldCwgcGFyZW50VmFsKTtcbiAgaWYgKGNoaWxkVmFsKSB7IGV4dGVuZChyZXQsIGNoaWxkVmFsKTsgfVxuICByZXR1cm4gcmV0XG59O1xuc3RyYXRzLnByb3ZpZGUgPSBtZXJnZURhdGFPckZuO1xuXG4vKipcbiAqIERlZmF1bHQgc3RyYXRlZ3kuXG4gKi9cbnZhciBkZWZhdWx0U3RyYXQgPSBmdW5jdGlvbiAocGFyZW50VmFsLCBjaGlsZFZhbCkge1xuICByZXR1cm4gY2hpbGRWYWwgPT09IHVuZGVmaW5lZFxuICAgID8gcGFyZW50VmFsXG4gICAgOiBjaGlsZFZhbFxufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBjb21wb25lbnQgbmFtZXNcbiAqL1xuZnVuY3Rpb24gY2hlY2tDb21wb25lbnRzIChvcHRpb25zKSB7XG4gIGZvciAodmFyIGtleSBpbiBvcHRpb25zLmNvbXBvbmVudHMpIHtcbiAgICB2YXIgbG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAoaXNCdWlsdEluVGFnKGxvd2VyKSB8fCBjb25maWcuaXNSZXNlcnZlZFRhZyhsb3dlcikpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgK1xuICAgICAgICAnaWQ6ICcgKyBrZXlcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRW5zdXJlIGFsbCBwcm9wcyBvcHRpb24gc3ludGF4IGFyZSBub3JtYWxpemVkIGludG8gdGhlXG4gKiBPYmplY3QtYmFzZWQgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQcm9wcyAob3B0aW9ucykge1xuICB2YXIgcHJvcHMgPSBvcHRpb25zLnByb3BzO1xuICBpZiAoIXByb3BzKSB7IHJldHVybiB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGksIHZhbCwgbmFtZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgaSA9IHByb3BzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2YWwgPSBwcm9wc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYW1lID0gY2FtZWxpemUodmFsKTtcbiAgICAgICAgcmVzW25hbWVdID0geyB0eXBlOiBudWxsIH07XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FybigncHJvcHMgbXVzdCBiZSBzdHJpbmdzIHdoZW4gdXNpbmcgYXJyYXkgc3ludGF4LicpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHByb3BzKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFsID0gcHJvcHNba2V5XTtcbiAgICAgIG5hbWUgPSBjYW1lbGl6ZShrZXkpO1xuICAgICAgcmVzW25hbWVdID0gaXNQbGFpbk9iamVjdCh2YWwpXG4gICAgICAgID8gdmFsXG4gICAgICAgIDogeyB0eXBlOiB2YWwgfTtcbiAgICB9XG4gIH1cbiAgb3B0aW9ucy5wcm9wcyA9IHJlcztcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgYWxsIGluamVjdGlvbnMgaW50byBPYmplY3QtYmFzZWQgZm9ybWF0XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUluamVjdCAob3B0aW9ucykge1xuICB2YXIgaW5qZWN0ID0gb3B0aW9ucy5pbmplY3Q7XG4gIGlmIChBcnJheS5pc0FycmF5KGluamVjdCkpIHtcbiAgICB2YXIgbm9ybWFsaXplZCA9IG9wdGlvbnMuaW5qZWN0ID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmplY3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5vcm1hbGl6ZWRbaW5qZWN0W2ldXSA9IGluamVjdFtpXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgcmF3IGZ1bmN0aW9uIGRpcmVjdGl2ZXMgaW50byBvYmplY3QgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEaXJlY3RpdmVzIChvcHRpb25zKSB7XG4gIHZhciBkaXJzID0gb3B0aW9ucy5kaXJlY3RpdmVzO1xuICBpZiAoZGlycykge1xuICAgIGZvciAodmFyIGtleSBpbiBkaXJzKSB7XG4gICAgICB2YXIgZGVmID0gZGlyc1trZXldO1xuICAgICAgaWYgKHR5cGVvZiBkZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZGlyc1trZXldID0geyBiaW5kOiBkZWYsIHVwZGF0ZTogZGVmIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIG9wdGlvbiBvYmplY3RzIGludG8gYSBuZXcgb25lLlxuICogQ29yZSB1dGlsaXR5IHVzZWQgaW4gYm90aCBpbnN0YW50aWF0aW9uIGFuZCBpbmhlcml0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VPcHRpb25zIChcbiAgcGFyZW50LFxuICBjaGlsZCxcbiAgdm1cbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNoZWNrQ29tcG9uZW50cyhjaGlsZCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGNoaWxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2hpbGQgPSBjaGlsZC5vcHRpb25zO1xuICB9XG5cbiAgbm9ybWFsaXplUHJvcHMoY2hpbGQpO1xuICBub3JtYWxpemVJbmplY3QoY2hpbGQpO1xuICBub3JtYWxpemVEaXJlY3RpdmVzKGNoaWxkKTtcbiAgdmFyIGV4dGVuZHNGcm9tID0gY2hpbGQuZXh0ZW5kcztcbiAgaWYgKGV4dGVuZHNGcm9tKSB7XG4gICAgcGFyZW50ID0gbWVyZ2VPcHRpb25zKHBhcmVudCwgZXh0ZW5kc0Zyb20sIHZtKTtcbiAgfVxuICBpZiAoY2hpbGQubWl4aW5zKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZC5taXhpbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBwYXJlbnQgPSBtZXJnZU9wdGlvbnMocGFyZW50LCBjaGlsZC5taXhpbnNbaV0sIHZtKTtcbiAgICB9XG4gIH1cbiAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgdmFyIGtleTtcbiAgZm9yIChrZXkgaW4gcGFyZW50KSB7XG4gICAgbWVyZ2VGaWVsZChrZXkpO1xuICB9XG4gIGZvciAoa2V5IGluIGNoaWxkKSB7XG4gICAgaWYgKCFoYXNPd24ocGFyZW50LCBrZXkpKSB7XG4gICAgICBtZXJnZUZpZWxkKGtleSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIG1lcmdlRmllbGQgKGtleSkge1xuICAgIHZhciBzdHJhdCA9IHN0cmF0c1trZXldIHx8IGRlZmF1bHRTdHJhdDtcbiAgICBvcHRpb25zW2tleV0gPSBzdHJhdChwYXJlbnRba2V5XSwgY2hpbGRba2V5XSwgdm0sIGtleSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGFzc2V0LlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJlY2F1c2UgY2hpbGQgaW5zdGFuY2VzIG5lZWQgYWNjZXNzXG4gKiB0byBhc3NldHMgZGVmaW5lZCBpbiBpdHMgYW5jZXN0b3IgY2hhaW4uXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBc3NldCAoXG4gIG9wdGlvbnMsXG4gIHR5cGUsXG4gIGlkLFxuICB3YXJuTWlzc2luZ1xuKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBhc3NldHMgPSBvcHRpb25zW3R5cGVdO1xuICAvLyBjaGVjayBsb2NhbCByZWdpc3RyYXRpb24gdmFyaWF0aW9ucyBmaXJzdFxuICBpZiAoaGFzT3duKGFzc2V0cywgaWQpKSB7IHJldHVybiBhc3NldHNbaWRdIH1cbiAgdmFyIGNhbWVsaXplZElkID0gY2FtZWxpemUoaWQpO1xuICBpZiAoaGFzT3duKGFzc2V0cywgY2FtZWxpemVkSWQpKSB7IHJldHVybiBhc3NldHNbY2FtZWxpemVkSWRdIH1cbiAgdmFyIFBhc2NhbENhc2VJZCA9IGNhcGl0YWxpemUoY2FtZWxpemVkSWQpO1xuICBpZiAoaGFzT3duKGFzc2V0cywgUGFzY2FsQ2FzZUlkKSkgeyByZXR1cm4gYXNzZXRzW1Bhc2NhbENhc2VJZF0gfVxuICAvLyBmYWxsYmFjayB0byBwcm90b3R5cGUgY2hhaW5cbiAgdmFyIHJlcyA9IGFzc2V0c1tpZF0gfHwgYXNzZXRzW2NhbWVsaXplZElkXSB8fCBhc3NldHNbUGFzY2FsQ2FzZUlkXTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2Fybk1pc3NpbmcgJiYgIXJlcykge1xuICAgIHdhcm4oXG4gICAgICAnRmFpbGVkIHRvIHJlc29sdmUgJyArIHR5cGUuc2xpY2UoMCwgLTEpICsgJzogJyArIGlkLFxuICAgICAgb3B0aW9uc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wIChcbiAga2V5LFxuICBwcm9wT3B0aW9ucyxcbiAgcHJvcHNEYXRhLFxuICB2bVxuKSB7XG4gIHZhciBwcm9wID0gcHJvcE9wdGlvbnNba2V5XTtcbiAgdmFyIGFic2VudCA9ICFoYXNPd24ocHJvcHNEYXRhLCBrZXkpO1xuICB2YXIgdmFsdWUgPSBwcm9wc0RhdGFba2V5XTtcbiAgLy8gaGFuZGxlIGJvb2xlYW4gcHJvcHNcbiAgaWYgKGlzVHlwZShCb29sZWFuLCBwcm9wLnR5cGUpKSB7XG4gICAgaWYgKGFic2VudCAmJiAhaGFzT3duKHByb3AsICdkZWZhdWx0JykpIHtcbiAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmICghaXNUeXBlKFN0cmluZywgcHJvcC50eXBlKSAmJiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBoeXBoZW5hdGUoa2V5KSkpIHtcbiAgICAgIHZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgLy8gY2hlY2sgZGVmYXVsdCB2YWx1ZVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHZhbHVlID0gZ2V0UHJvcERlZmF1bHRWYWx1ZSh2bSwgcHJvcCwga2V5KTtcbiAgICAvLyBzaW5jZSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhIGZyZXNoIGNvcHksXG4gICAgLy8gbWFrZSBzdXJlIHRvIG9ic2VydmUgaXQuXG4gICAgdmFyIHByZXZTaG91bGRDb252ZXJ0ID0gb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0O1xuICAgIG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydCA9IHRydWU7XG4gICAgb2JzZXJ2ZSh2YWx1ZSk7XG4gICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gcHJldlNob3VsZENvbnZlcnQ7XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBhc3NlcnRQcm9wKHByb3AsIGtleSwgdmFsdWUsIHZtLCBhYnNlbnQpO1xuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHByb3AuXG4gKi9cbmZ1bmN0aW9uIGdldFByb3BEZWZhdWx0VmFsdWUgKHZtLCBwcm9wLCBrZXkpIHtcbiAgLy8gbm8gZGVmYXVsdCwgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAoIWhhc093bihwcm9wLCAnZGVmYXVsdCcpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG4gIHZhciBkZWYgPSBwcm9wLmRlZmF1bHQ7XG4gIC8vIHdhcm4gYWdhaW5zdCBub24tZmFjdG9yeSBkZWZhdWx0cyBmb3IgT2JqZWN0ICYgQXJyYXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgaXNPYmplY3QoZGVmKSkge1xuICAgIHdhcm4oXG4gICAgICAnSW52YWxpZCBkZWZhdWx0IHZhbHVlIGZvciBwcm9wIFwiJyArIGtleSArICdcIjogJyArXG4gICAgICAnUHJvcHMgd2l0aCB0eXBlIE9iamVjdC9BcnJheSBtdXN0IHVzZSBhIGZhY3RvcnkgZnVuY3Rpb24gJyArXG4gICAgICAndG8gcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLicsXG4gICAgICB2bVxuICAgICk7XG4gIH1cbiAgLy8gdGhlIHJhdyBwcm9wIHZhbHVlIHdhcyBhbHNvIHVuZGVmaW5lZCBmcm9tIHByZXZpb3VzIHJlbmRlcixcbiAgLy8gcmV0dXJuIHByZXZpb3VzIGRlZmF1bHQgdmFsdWUgdG8gYXZvaWQgdW5uZWNlc3Nhcnkgd2F0Y2hlciB0cmlnZ2VyXG4gIGlmICh2bSAmJiB2bS4kb3B0aW9ucy5wcm9wc0RhdGEgJiZcbiAgICB2bS4kb3B0aW9ucy5wcm9wc0RhdGFba2V5XSA9PT0gdW5kZWZpbmVkICYmXG4gICAgdm0uX3Byb3BzW2tleV0gIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICByZXR1cm4gdm0uX3Byb3BzW2tleV1cbiAgfVxuICAvLyBjYWxsIGZhY3RvcnkgZnVuY3Rpb24gZm9yIG5vbi1GdW5jdGlvbiB0eXBlc1xuICAvLyBhIHZhbHVlIGlzIEZ1bmN0aW9uIGlmIGl0cyBwcm90b3R5cGUgaXMgZnVuY3Rpb24gZXZlbiBhY3Jvc3MgZGlmZmVyZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gIHJldHVybiB0eXBlb2YgZGVmID09PSAnZnVuY3Rpb24nICYmIGdldFR5cGUocHJvcC50eXBlKSAhPT0gJ0Z1bmN0aW9uJ1xuICAgID8gZGVmLmNhbGwodm0pXG4gICAgOiBkZWZcbn1cblxuLyoqXG4gKiBBc3NlcnQgd2hldGhlciBhIHByb3AgaXMgdmFsaWQuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFByb3AgKFxuICBwcm9wLFxuICBuYW1lLFxuICB2YWx1ZSxcbiAgdm0sXG4gIGFic2VudFxuKSB7XG4gIGlmIChwcm9wLnJlcXVpcmVkICYmIGFic2VudCkge1xuICAgIHdhcm4oXG4gICAgICAnTWlzc2luZyByZXF1aXJlZCBwcm9wOiBcIicgKyBuYW1lICsgJ1wiJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodmFsdWUgPT0gbnVsbCAmJiAhcHJvcC5yZXF1aXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciB0eXBlID0gcHJvcC50eXBlO1xuICB2YXIgdmFsaWQgPSAhdHlwZSB8fCB0eXBlID09PSB0cnVlO1xuICB2YXIgZXhwZWN0ZWRUeXBlcyA9IFtdO1xuICBpZiAodHlwZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZSA9IFt0eXBlXTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlLmxlbmd0aCAmJiAhdmFsaWQ7IGkrKykge1xuICAgICAgdmFyIGFzc2VydGVkVHlwZSA9IGFzc2VydFR5cGUodmFsdWUsIHR5cGVbaV0pO1xuICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGFzc2VydGVkVHlwZS5leHBlY3RlZFR5cGUgfHwgJycpO1xuICAgICAgdmFsaWQgPSBhc3NlcnRlZFR5cGUudmFsaWQ7XG4gICAgfVxuICB9XG4gIGlmICghdmFsaWQpIHtcbiAgICB3YXJuKFxuICAgICAgJ0ludmFsaWQgcHJvcDogdHlwZSBjaGVjayBmYWlsZWQgZm9yIHByb3AgXCInICsgbmFtZSArICdcIi4nICtcbiAgICAgICcgRXhwZWN0ZWQgJyArIGV4cGVjdGVkVHlwZXMubWFwKGNhcGl0YWxpemUpLmpvaW4oJywgJykgK1xuICAgICAgJywgZ290ICcgKyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKSArICcuJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgdmFsaWRhdG9yID0gcHJvcC52YWxpZGF0b3I7XG4gIGlmICh2YWxpZGF0b3IpIHtcbiAgICBpZiAoIXZhbGlkYXRvcih2YWx1ZSkpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgICdJbnZhbGlkIHByb3A6IGN1c3RvbSB2YWxpZGF0b3IgY2hlY2sgZmFpbGVkIGZvciBwcm9wIFwiJyArIG5hbWUgKyAnXCIuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbnZhciBzaW1wbGVDaGVja1JFID0gL14oU3RyaW5nfE51bWJlcnxCb29sZWFufEZ1bmN0aW9ufFN5bWJvbCkkLztcblxuZnVuY3Rpb24gYXNzZXJ0VHlwZSAodmFsdWUsIHR5cGUpIHtcbiAgdmFyIHZhbGlkO1xuICB2YXIgZXhwZWN0ZWRUeXBlID0gZ2V0VHlwZSh0eXBlKTtcbiAgaWYgKHNpbXBsZUNoZWNrUkUudGVzdChleHBlY3RlZFR5cGUpKSB7XG4gICAgdmFsaWQgPSB0eXBlb2YgdmFsdWUgPT09IGV4cGVjdGVkVHlwZS50b0xvd2VyQ2FzZSgpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ09iamVjdCcpIHtcbiAgICB2YWxpZCA9IGlzUGxhaW5PYmplY3QodmFsdWUpO1xuICB9IGVsc2UgaWYgKGV4cGVjdGVkVHlwZSA9PT0gJ0FycmF5Jykge1xuICAgIHZhbGlkID0gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIHR5cGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB2YWxpZDogdmFsaWQsXG4gICAgZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGVcbiAgfVxufVxuXG4vKipcbiAqIFVzZSBmdW5jdGlvbiBzdHJpbmcgbmFtZSB0byBjaGVjayBidWlsdC1pbiB0eXBlcyxcbiAqIGJlY2F1c2UgYSBzaW1wbGUgZXF1YWxpdHkgY2hlY2sgd2lsbCBmYWlsIHdoZW4gcnVubmluZ1xuICogYWNyb3NzIGRpZmZlcmVudCB2bXMgLyBpZnJhbWVzLlxuICovXG5mdW5jdGlvbiBnZXRUeXBlIChmbikge1xuICB2YXIgbWF0Y2ggPSBmbiAmJiBmbi50b1N0cmluZygpLm1hdGNoKC9eXFxzKmZ1bmN0aW9uIChcXHcrKS8pO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6ICcnXG59XG5cbmZ1bmN0aW9uIGlzVHlwZSAodHlwZSwgZm4pIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGZuKSkge1xuICAgIHJldHVybiBnZXRUeXBlKGZuKSA9PT0gZ2V0VHlwZSh0eXBlKVxuICB9XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBmbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGlmIChnZXRUeXBlKGZuW2ldKSA9PT0gZ2V0VHlwZSh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qICAqL1xuXG4vKiBub3QgdHlwZSBjaGVja2luZyB0aGlzIGZpbGUgYmVjYXVzZSBmbG93IGRvZXNuJ3QgcGxheSB3ZWxsIHdpdGggUHJveHkgKi9cblxudmFyIGluaXRQcm94eTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGFsbG93ZWRHbG9iYWxzID0gbWFrZU1hcChcbiAgICAnSW5maW5pdHksdW5kZWZpbmVkLE5hTixpc0Zpbml0ZSxpc05hTiwnICtcbiAgICAncGFyc2VGbG9hdCxwYXJzZUludCxkZWNvZGVVUkksZGVjb2RlVVJJQ29tcG9uZW50LGVuY29kZVVSSSxlbmNvZGVVUklDb21wb25lbnQsJyArXG4gICAgJ01hdGgsTnVtYmVyLERhdGUsQXJyYXksT2JqZWN0LEJvb2xlYW4sU3RyaW5nLFJlZ0V4cCxNYXAsU2V0LEpTT04sSW50bCwnICtcbiAgICAncmVxdWlyZScgLy8gZm9yIFdlYnBhY2svQnJvd3NlcmlmeVxuICApO1xuXG4gIHZhciB3YXJuTm9uUHJlc2VudCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIHdhcm4oXG4gICAgICBcIlByb3BlcnR5IG9yIG1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgb24gdGhlIGluc3RhbmNlIGJ1dCBcIiArXG4gICAgICBcInJlZmVyZW5jZWQgZHVyaW5nIHJlbmRlci4gTWFrZSBzdXJlIHRvIGRlY2xhcmUgcmVhY3RpdmUgZGF0YSBcIiArXG4gICAgICBcInByb3BlcnRpZXMgaW4gdGhlIGRhdGEgb3B0aW9uLlwiLFxuICAgICAgdGFyZ2V0XG4gICAgKTtcbiAgfTtcblxuICB2YXIgaGFzUHJveHkgPVxuICAgIHR5cGVvZiBQcm94eSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBQcm94eS50b1N0cmluZygpLm1hdGNoKC9uYXRpdmUgY29kZS8pO1xuXG4gIGlmIChoYXNQcm94eSkge1xuICAgIHZhciBpc0J1aWx0SW5Nb2RpZmllciA9IG1ha2VNYXAoJ3N0b3AscHJldmVudCxzZWxmLGN0cmwsc2hpZnQsYWx0LG1ldGEnKTtcbiAgICBjb25maWcua2V5Q29kZXMgPSBuZXcgUHJveHkoY29uZmlnLmtleUNvZGVzLCB7XG4gICAgICBzZXQ6IGZ1bmN0aW9uIHNldCAodGFyZ2V0LCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc0J1aWx0SW5Nb2RpZmllcihrZXkpKSB7XG4gICAgICAgICAgd2FybigoXCJBdm9pZCBvdmVyd3JpdGluZyBidWlsdC1pbiBtb2RpZmllciBpbiBjb25maWcua2V5Q29kZXM6IC5cIiArIGtleSkpO1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIGhhc0hhbmRsZXIgPSB7XG4gICAgaGFzOiBmdW5jdGlvbiBoYXMgKHRhcmdldCwga2V5KSB7XG4gICAgICB2YXIgaGFzID0ga2V5IGluIHRhcmdldDtcbiAgICAgIHZhciBpc0FsbG93ZWQgPSBhbGxvd2VkR2xvYmFscyhrZXkpIHx8IGtleS5jaGFyQXQoMCkgPT09ICdfJztcbiAgICAgIGlmICghaGFzICYmICFpc0FsbG93ZWQpIHtcbiAgICAgICAgd2Fybk5vblByZXNlbnQodGFyZ2V0LCBrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcyB8fCAhaXNBbGxvd2VkXG4gICAgfVxuICB9O1xuXG4gIHZhciBnZXRIYW5kbGVyID0ge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0ICh0YXJnZXQsIGtleSkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmICEoa2V5IGluIHRhcmdldCkpIHtcbiAgICAgICAgd2Fybk5vblByZXNlbnQodGFyZ2V0LCBrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgfVxuICB9O1xuXG4gIGluaXRQcm94eSA9IGZ1bmN0aW9uIGluaXRQcm94eSAodm0pIHtcbiAgICBpZiAoaGFzUHJveHkpIHtcbiAgICAgIC8vIGRldGVybWluZSB3aGljaCBwcm94eSBoYW5kbGVyIHRvIHVzZVxuICAgICAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcbiAgICAgIHZhciBoYW5kbGVycyA9IG9wdGlvbnMucmVuZGVyICYmIG9wdGlvbnMucmVuZGVyLl93aXRoU3RyaXBwZWRcbiAgICAgICAgPyBnZXRIYW5kbGVyXG4gICAgICAgIDogaGFzSGFuZGxlcjtcbiAgICAgIHZtLl9yZW5kZXJQcm94eSA9IG5ldyBQcm94eSh2bSwgaGFuZGxlcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSB2bTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBtYXJrO1xudmFyIG1lYXN1cmU7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBwZXJmID0gaW5Ccm93c2VyICYmIHdpbmRvdy5wZXJmb3JtYW5jZTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChcbiAgICBwZXJmICYmXG4gICAgcGVyZi5tYXJrICYmXG4gICAgcGVyZi5tZWFzdXJlICYmXG4gICAgcGVyZi5jbGVhck1hcmtzICYmXG4gICAgcGVyZi5jbGVhck1lYXN1cmVzXG4gICkge1xuICAgIG1hcmsgPSBmdW5jdGlvbiAodGFnKSB7IHJldHVybiBwZXJmLm1hcmsodGFnKTsgfTtcbiAgICBtZWFzdXJlID0gZnVuY3Rpb24gKG5hbWUsIHN0YXJ0VGFnLCBlbmRUYWcpIHtcbiAgICAgIHBlcmYubWVhc3VyZShuYW1lLCBzdGFydFRhZywgZW5kVGFnKTtcbiAgICAgIHBlcmYuY2xlYXJNYXJrcyhzdGFydFRhZyk7XG4gICAgICBwZXJmLmNsZWFyTWFya3MoZW5kVGFnKTtcbiAgICAgIHBlcmYuY2xlYXJNZWFzdXJlcyhuYW1lKTtcbiAgICB9O1xuICB9XG59XG5cbi8qICAqL1xuXG52YXIgVk5vZGUgPSBmdW5jdGlvbiBWTm9kZSAoXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIHRleHQsXG4gIGVsbSxcbiAgY29udGV4dCxcbiAgY29tcG9uZW50T3B0aW9ucyxcbiAgYXN5bmNGYWN0b3J5XG4pIHtcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMuZGF0YSA9IGRhdGE7XG4gIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgdGhpcy50ZXh0ID0gdGV4dDtcbiAgdGhpcy5lbG0gPSBlbG07XG4gIHRoaXMubnMgPSB1bmRlZmluZWQ7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMuZnVuY3Rpb25hbENvbnRleHQgPSB1bmRlZmluZWQ7XG4gIHRoaXMua2V5ID0gZGF0YSAmJiBkYXRhLmtleTtcbiAgdGhpcy5jb21wb25lbnRPcHRpb25zID0gY29tcG9uZW50T3B0aW9ucztcbiAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5wYXJlbnQgPSB1bmRlZmluZWQ7XG4gIHRoaXMucmF3ID0gZmFsc2U7XG4gIHRoaXMuaXNTdGF0aWMgPSBmYWxzZTtcbiAgdGhpcy5pc1Jvb3RJbnNlcnQgPSB0cnVlO1xuICB0aGlzLmlzQ29tbWVudCA9IGZhbHNlO1xuICB0aGlzLmlzQ2xvbmVkID0gZmFsc2U7XG4gIHRoaXMuaXNPbmNlID0gZmFsc2U7XG4gIHRoaXMuYXN5bmNGYWN0b3J5ID0gYXN5bmNGYWN0b3J5O1xuICB0aGlzLmFzeW5jTWV0YSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXIgPSBmYWxzZTtcbn07XG5cbnZhciBwcm90b3R5cGVBY2Nlc3NvcnMgPSB7IGNoaWxkOiB7fSB9O1xuXG4vLyBERVBSRUNBVEVEOiBhbGlhcyBmb3IgY29tcG9uZW50SW5zdGFuY2UgZm9yIGJhY2t3YXJkcyBjb21wYXQuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xucHJvdG90eXBlQWNjZXNzb3JzLmNoaWxkLmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2Vcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWTm9kZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyApO1xuXG52YXIgY3JlYXRlRW1wdHlWTm9kZSA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIGlmICggdGV4dCA9PT0gdm9pZCAwICkgdGV4dCA9ICcnO1xuXG4gIHZhciBub2RlID0gbmV3IFZOb2RlKCk7XG4gIG5vZGUudGV4dCA9IHRleHQ7XG4gIG5vZGUuaXNDb21tZW50ID0gdHJ1ZTtcbiAgcmV0dXJuIG5vZGVcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVRleHRWTm9kZSAodmFsKSB7XG4gIHJldHVybiBuZXcgVk5vZGUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgU3RyaW5nKHZhbCkpXG59XG5cbi8vIG9wdGltaXplZCBzaGFsbG93IGNsb25lXG4vLyB1c2VkIGZvciBzdGF0aWMgbm9kZXMgYW5kIHNsb3Qgbm9kZXMgYmVjYXVzZSB0aGV5IG1heSBiZSByZXVzZWQgYWNyb3NzXG4vLyBtdWx0aXBsZSByZW5kZXJzLCBjbG9uaW5nIHRoZW0gYXZvaWRzIGVycm9ycyB3aGVuIERPTSBtYW5pcHVsYXRpb25zIHJlbHlcbi8vIG9uIHRoZWlyIGVsbSByZWZlcmVuY2UuXG5mdW5jdGlvbiBjbG9uZVZOb2RlICh2bm9kZSkge1xuICB2YXIgY2xvbmVkID0gbmV3IFZOb2RlKFxuICAgIHZub2RlLnRhZyxcbiAgICB2bm9kZS5kYXRhLFxuICAgIHZub2RlLmNoaWxkcmVuLFxuICAgIHZub2RlLnRleHQsXG4gICAgdm5vZGUuZWxtLFxuICAgIHZub2RlLmNvbnRleHQsXG4gICAgdm5vZGUuY29tcG9uZW50T3B0aW9ucyxcbiAgICB2bm9kZS5hc3luY0ZhY3RvcnlcbiAgKTtcbiAgY2xvbmVkLm5zID0gdm5vZGUubnM7XG4gIGNsb25lZC5pc1N0YXRpYyA9IHZub2RlLmlzU3RhdGljO1xuICBjbG9uZWQua2V5ID0gdm5vZGUua2V5O1xuICBjbG9uZWQuaXNDb21tZW50ID0gdm5vZGUuaXNDb21tZW50O1xuICBjbG9uZWQuaXNDbG9uZWQgPSB0cnVlO1xuICByZXR1cm4gY2xvbmVkXG59XG5cbmZ1bmN0aW9uIGNsb25lVk5vZGVzICh2bm9kZXMpIHtcbiAgdmFyIGxlbiA9IHZub2Rlcy5sZW5ndGg7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobGVuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc1tpXSA9IGNsb25lVk5vZGUodm5vZGVzW2ldKTtcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbi8qICAqL1xuXG52YXIgbm9ybWFsaXplRXZlbnQgPSBjYWNoZWQoZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyIHBhc3NpdmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyYnO1xuICBuYW1lID0gcGFzc2l2ZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICB2YXIgb25jZSQkMSA9IG5hbWUuY2hhckF0KDApID09PSAnfic7IC8vIFByZWZpeGVkIGxhc3QsIGNoZWNrZWQgZmlyc3RcbiAgbmFtZSA9IG9uY2UkJDEgPyBuYW1lLnNsaWNlKDEpIDogbmFtZTtcbiAgdmFyIGNhcHR1cmUgPSBuYW1lLmNoYXJBdCgwKSA9PT0gJyEnO1xuICBuYW1lID0gY2FwdHVyZSA/IG5hbWUuc2xpY2UoMSkgOiBuYW1lO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgb25jZTogb25jZSQkMSxcbiAgICBjYXB0dXJlOiBjYXB0dXJlLFxuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUZuSW52b2tlciAoZm5zKSB7XG4gIGZ1bmN0aW9uIGludm9rZXIgKCkge1xuICAgIHZhciBhcmd1bWVudHMkMSA9IGFyZ3VtZW50cztcblxuICAgIHZhciBmbnMgPSBpbnZva2VyLmZucztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmbnMpKSB7XG4gICAgICB2YXIgY2xvbmVkID0gZm5zLnNsaWNlKCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsb25lZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjbG9uZWRbaV0uYXBwbHkobnVsbCwgYXJndW1lbnRzJDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXR1cm4gaGFuZGxlciByZXR1cm4gdmFsdWUgZm9yIHNpbmdsZSBoYW5kbGVyc1xuICAgICAgcmV0dXJuIGZucy5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gICAgfVxuICB9XG4gIGludm9rZXIuZm5zID0gZm5zO1xuICByZXR1cm4gaW52b2tlclxufVxuXG5mdW5jdGlvbiB1cGRhdGVMaXN0ZW5lcnMgKFxuICBvbixcbiAgb2xkT24sXG4gIGFkZCxcbiAgcmVtb3ZlJCQxLFxuICB2bVxuKSB7XG4gIHZhciBuYW1lLCBjdXIsIG9sZCwgZXZlbnQ7XG4gIGZvciAobmFtZSBpbiBvbikge1xuICAgIGN1ciA9IG9uW25hbWVdO1xuICAgIG9sZCA9IG9sZE9uW25hbWVdO1xuICAgIGV2ZW50ID0gbm9ybWFsaXplRXZlbnQobmFtZSk7XG4gICAgaWYgKGlzVW5kZWYoY3VyKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkludmFsaWQgaGFuZGxlciBmb3IgZXZlbnQgXFxcIlwiICsgKGV2ZW50Lm5hbWUpICsgXCJcXFwiOiBnb3QgXCIgKyBTdHJpbmcoY3VyKSxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZCkpIHtcbiAgICAgIGlmIChpc1VuZGVmKGN1ci5mbnMpKSB7XG4gICAgICAgIGN1ciA9IG9uW25hbWVdID0gY3JlYXRlRm5JbnZva2VyKGN1cik7XG4gICAgICB9XG4gICAgICBhZGQoZXZlbnQubmFtZSwgY3VyLCBldmVudC5vbmNlLCBldmVudC5jYXB0dXJlLCBldmVudC5wYXNzaXZlKTtcbiAgICB9IGVsc2UgaWYgKGN1ciAhPT0gb2xkKSB7XG4gICAgICBvbGQuZm5zID0gY3VyO1xuICAgICAgb25bbmFtZV0gPSBvbGQ7XG4gICAgfVxuICB9XG4gIGZvciAobmFtZSBpbiBvbGRPbikge1xuICAgIGlmIChpc1VuZGVmKG9uW25hbWVdKSkge1xuICAgICAgZXZlbnQgPSBub3JtYWxpemVFdmVudChuYW1lKTtcbiAgICAgIHJlbW92ZSQkMShldmVudC5uYW1lLCBvbGRPbltuYW1lXSwgZXZlbnQuY2FwdHVyZSk7XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBtZXJnZVZOb2RlSG9vayAoZGVmLCBob29rS2V5LCBob29rKSB7XG4gIHZhciBpbnZva2VyO1xuICB2YXIgb2xkSG9vayA9IGRlZltob29rS2V5XTtcblxuICBmdW5jdGlvbiB3cmFwcGVkSG9vayAoKSB7XG4gICAgaG9vay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIC8vIGltcG9ydGFudDogcmVtb3ZlIG1lcmdlZCBob29rIHRvIGVuc3VyZSBpdCdzIGNhbGxlZCBvbmx5IG9uY2VcbiAgICAvLyBhbmQgcHJldmVudCBtZW1vcnkgbGVha1xuICAgIHJlbW92ZShpbnZva2VyLmZucywgd3JhcHBlZEhvb2spO1xuICB9XG5cbiAgaWYgKGlzVW5kZWYob2xkSG9vaykpIHtcbiAgICAvLyBubyBleGlzdGluZyBob29rXG4gICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbd3JhcHBlZEhvb2tdKTtcbiAgfSBlbHNlIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoaXNEZWYob2xkSG9vay5mbnMpICYmIGlzVHJ1ZShvbGRIb29rLm1lcmdlZCkpIHtcbiAgICAgIC8vIGFscmVhZHkgYSBtZXJnZWQgaW52b2tlclxuICAgICAgaW52b2tlciA9IG9sZEhvb2s7XG4gICAgICBpbnZva2VyLmZucy5wdXNoKHdyYXBwZWRIb29rKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXhpc3RpbmcgcGxhaW4gaG9va1xuICAgICAgaW52b2tlciA9IGNyZWF0ZUZuSW52b2tlcihbb2xkSG9vaywgd3JhcHBlZEhvb2tdKTtcbiAgICB9XG4gIH1cblxuICBpbnZva2VyLm1lcmdlZCA9IHRydWU7XG4gIGRlZltob29rS2V5XSA9IGludm9rZXI7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBleHRyYWN0UHJvcHNGcm9tVk5vZGVEYXRhIChcbiAgZGF0YSxcbiAgQ3RvcixcbiAgdGFnXG4pIHtcbiAgLy8gd2UgYXJlIG9ubHkgZXh0cmFjdGluZyByYXcgdmFsdWVzIGhlcmUuXG4gIC8vIHZhbGlkYXRpb24gYW5kIGRlZmF1bHQgdmFsdWVzIGFyZSBoYW5kbGVkIGluIHRoZSBjaGlsZFxuICAvLyBjb21wb25lbnQgaXRzZWxmLlxuICB2YXIgcHJvcE9wdGlvbnMgPSBDdG9yLm9wdGlvbnMucHJvcHM7XG4gIGlmIChpc1VuZGVmKHByb3BPcHRpb25zKSkge1xuICAgIHJldHVyblxuICB9XG4gIHZhciByZXMgPSB7fTtcbiAgdmFyIGF0dHJzID0gZGF0YS5hdHRycztcbiAgdmFyIHByb3BzID0gZGF0YS5wcm9wcztcbiAgaWYgKGlzRGVmKGF0dHJzKSB8fCBpc0RlZihwcm9wcykpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcE9wdGlvbnMpIHtcbiAgICAgIHZhciBhbHRLZXkgPSBoeXBoZW5hdGUoa2V5KTtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhciBrZXlJbkxvd2VyQ2FzZSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ICE9PSBrZXlJbkxvd2VyQ2FzZSAmJlxuICAgICAgICAgIGF0dHJzICYmIGhhc093bihhdHRycywga2V5SW5Mb3dlckNhc2UpXG4gICAgICAgICkge1xuICAgICAgICAgIHRpcChcbiAgICAgICAgICAgIFwiUHJvcCBcXFwiXCIgKyBrZXlJbkxvd2VyQ2FzZSArIFwiXFxcIiBpcyBwYXNzZWQgdG8gY29tcG9uZW50IFwiICtcbiAgICAgICAgICAgIChmb3JtYXRDb21wb25lbnROYW1lKHRhZyB8fCBDdG9yKSkgKyBcIiwgYnV0IHRoZSBkZWNsYXJlZCBwcm9wIG5hbWUgaXNcIiArXG4gICAgICAgICAgICBcIiBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuIFwiICtcbiAgICAgICAgICAgIFwiTm90ZSB0aGF0IEhUTUwgYXR0cmlidXRlcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgY2FtZWxDYXNlZCBcIiArXG4gICAgICAgICAgICBcInByb3BzIG5lZWQgdG8gdXNlIHRoZWlyIGtlYmFiLWNhc2UgZXF1aXZhbGVudHMgd2hlbiB1c2luZyBpbi1ET00gXCIgK1xuICAgICAgICAgICAgXCJ0ZW1wbGF0ZXMuIFlvdSBzaG91bGQgcHJvYmFibHkgdXNlIFxcXCJcIiArIGFsdEtleSArIFwiXFxcIiBpbnN0ZWFkIG9mIFxcXCJcIiArIGtleSArIFwiXFxcIi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNoZWNrUHJvcChyZXMsIHByb3BzLCBrZXksIGFsdEtleSwgdHJ1ZSkgfHxcbiAgICAgIGNoZWNrUHJvcChyZXMsIGF0dHJzLCBrZXksIGFsdEtleSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcCAoXG4gIHJlcyxcbiAgaGFzaCxcbiAga2V5LFxuICBhbHRLZXksXG4gIHByZXNlcnZlXG4pIHtcbiAgaWYgKGlzRGVmKGhhc2gpKSB7XG4gICAgaWYgKGhhc093bihoYXNoLCBrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IGhhc2hba2V5XTtcbiAgICAgIGlmICghcHJlc2VydmUpIHtcbiAgICAgICAgZGVsZXRlIGhhc2hba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBlbHNlIGlmIChoYXNPd24oaGFzaCwgYWx0S2V5KSkge1xuICAgICAgcmVzW2tleV0gPSBoYXNoW2FsdEtleV07XG4gICAgICBpZiAoIXByZXNlcnZlKSB7XG4gICAgICAgIGRlbGV0ZSBoYXNoW2FsdEtleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyogICovXG5cbi8vIFRoZSB0ZW1wbGF0ZSBjb21waWxlciBhdHRlbXB0cyB0byBtaW5pbWl6ZSB0aGUgbmVlZCBmb3Igbm9ybWFsaXphdGlvbiBieVxuLy8gc3RhdGljYWxseSBhbmFseXppbmcgdGhlIHRlbXBsYXRlIGF0IGNvbXBpbGUgdGltZS5cbi8vXG4vLyBGb3IgcGxhaW4gSFRNTCBtYXJrdXAsIG5vcm1hbGl6YXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgc2tpcHBlZCBiZWNhdXNlIHRoZVxuLy8gZ2VuZXJhdGVkIHJlbmRlciBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBBcnJheTxWTm9kZT4uIFRoZXJlIGFyZVxuLy8gdHdvIGNhc2VzIHdoZXJlIGV4dHJhIG5vcm1hbGl6YXRpb24gaXMgbmVlZGVkOlxuXG4vLyAxLiBXaGVuIHRoZSBjaGlsZHJlbiBjb250YWlucyBjb21wb25lbnRzIC0gYmVjYXVzZSBhIGZ1bmN0aW9uYWwgY29tcG9uZW50XG4vLyBtYXkgcmV0dXJuIGFuIEFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBqdXN0IGEgc2ltcGxlXG4vLyBub3JtYWxpemF0aW9uIGlzIG5lZWRlZCAtIGlmIGFueSBjaGlsZCBpcyBhbiBBcnJheSwgd2UgZmxhdHRlbiB0aGUgd2hvbGVcbi8vIHRoaW5nIHdpdGggQXJyYXkucHJvdG90eXBlLmNvbmNhdC4gSXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvbmx5IDEtbGV2ZWwgZGVlcFxuLy8gYmVjYXVzZSBmdW5jdGlvbmFsIGNvbXBvbmVudHMgYWxyZWFkeSBub3JtYWxpemUgdGhlaXIgb3duIGNoaWxkcmVuLlxuZnVuY3Rpb24gc2ltcGxlTm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbltpXSkpIHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjaGlsZHJlbilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoaWxkcmVuXG59XG5cbi8vIDIuIFdoZW4gdGhlIGNoaWxkcmVuIGNvbnRhaW5zIGNvbnN0cnVjdHMgdGhhdCBhbHdheXMgZ2VuZXJhdGVkIG5lc3RlZCBBcnJheXMsXG4vLyBlLmcuIDx0ZW1wbGF0ZT4sIDxzbG90Piwgdi1mb3IsIG9yIHdoZW4gdGhlIGNoaWxkcmVuIGlzIHByb3ZpZGVkIGJ5IHVzZXJcbi8vIHdpdGggaGFuZC13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMgLyBKU1guIEluIHN1Y2ggY2FzZXMgYSBmdWxsIG5vcm1hbGl6YXRpb25cbi8vIGlzIG5lZWRlZCB0byBjYXRlciB0byBhbGwgcG9zc2libGUgdHlwZXMgb2YgY2hpbGRyZW4gdmFsdWVzLlxuZnVuY3Rpb24gbm9ybWFsaXplQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIHJldHVybiBpc1ByaW1pdGl2ZShjaGlsZHJlbilcbiAgICA/IFtjcmVhdGVUZXh0Vk5vZGUoY2hpbGRyZW4pXVxuICAgIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgID8gbm9ybWFsaXplQXJyYXlDaGlsZHJlbihjaGlsZHJlbilcbiAgICAgIDogdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIGlzVGV4dE5vZGUgKG5vZGUpIHtcbiAgcmV0dXJuIGlzRGVmKG5vZGUpICYmIGlzRGVmKG5vZGUudGV4dCkgJiYgaXNGYWxzZShub2RlLmlzQ29tbWVudClcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXlDaGlsZHJlbiAoY2hpbGRyZW4sIG5lc3RlZEluZGV4KSB7XG4gIHZhciByZXMgPSBbXTtcbiAgdmFyIGksIGMsIGxhc3Q7XG4gIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGMgPSBjaGlsZHJlbltpXTtcbiAgICBpZiAoaXNVbmRlZihjKSB8fCB0eXBlb2YgYyA9PT0gJ2Jvb2xlYW4nKSB7IGNvbnRpbnVlIH1cbiAgICBsYXN0ID0gcmVzW3Jlcy5sZW5ndGggLSAxXTtcbiAgICAvLyAgbmVzdGVkXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYykpIHtcbiAgICAgIHJlcy5wdXNoLmFwcGx5KHJlcywgbm9ybWFsaXplQXJyYXlDaGlsZHJlbihjLCAoKG5lc3RlZEluZGV4IHx8ICcnKSArIFwiX1wiICsgaSkpKTtcbiAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKGMpKSB7XG4gICAgICBpZiAoaXNUZXh0Tm9kZShsYXN0KSkge1xuICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICAgIC8vIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBTU1IgaHlkcmF0aW9uIGJlY2F1c2UgdGV4dCBub2RlcyBhcmVcbiAgICAgICAgLy8gZXNzZW50aWFsbHkgbWVyZ2VkIHdoZW4gcmVuZGVyZWQgdG8gSFRNTCBzdHJpbmdzXG4gICAgICAgIChsYXN0KS50ZXh0ICs9IFN0cmluZyhjKTtcbiAgICAgIH0gZWxzZSBpZiAoYyAhPT0gJycpIHtcbiAgICAgICAgLy8gY29udmVydCBwcmltaXRpdmUgdG8gdm5vZGVcbiAgICAgICAgcmVzLnB1c2goY3JlYXRlVGV4dFZOb2RlKGMpKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzVGV4dE5vZGUoYykgJiYgaXNUZXh0Tm9kZShsYXN0KSkge1xuICAgICAgICAvLyBtZXJnZSBhZGphY2VudCB0ZXh0IG5vZGVzXG4gICAgICAgIHJlc1tyZXMubGVuZ3RoIC0gMV0gPSBjcmVhdGVUZXh0Vk5vZGUobGFzdC50ZXh0ICsgYy50ZXh0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRlZmF1bHQga2V5IGZvciBuZXN0ZWQgYXJyYXkgY2hpbGRyZW4gKGxpa2VseSBnZW5lcmF0ZWQgYnkgdi1mb3IpXG4gICAgICAgIGlmIChpc1RydWUoY2hpbGRyZW4uX2lzVkxpc3QpICYmXG4gICAgICAgICAgaXNEZWYoYy50YWcpICYmXG4gICAgICAgICAgaXNVbmRlZihjLmtleSkgJiZcbiAgICAgICAgICBpc0RlZihuZXN0ZWRJbmRleCkpIHtcbiAgICAgICAgICBjLmtleSA9IFwiX192bGlzdFwiICsgbmVzdGVkSW5kZXggKyBcIl9cIiArIGkgKyBcIl9fXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGVuc3VyZUN0b3IgKGNvbXAsIGJhc2UpIHtcbiAgaWYgKGNvbXAuX19lc01vZHVsZSAmJiBjb21wLmRlZmF1bHQpIHtcbiAgICBjb21wID0gY29tcC5kZWZhdWx0O1xuICB9XG4gIHJldHVybiBpc09iamVjdChjb21wKVxuICAgID8gYmFzZS5leHRlbmQoY29tcClcbiAgICA6IGNvbXBcbn1cblxuZnVuY3Rpb24gY3JlYXRlQXN5bmNQbGFjZWhvbGRlciAoXG4gIGZhY3RvcnksXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICB0YWdcbikge1xuICB2YXIgbm9kZSA9IGNyZWF0ZUVtcHR5Vk5vZGUoKTtcbiAgbm9kZS5hc3luY0ZhY3RvcnkgPSBmYWN0b3J5O1xuICBub2RlLmFzeW5jTWV0YSA9IHsgZGF0YTogZGF0YSwgY29udGV4dDogY29udGV4dCwgY2hpbGRyZW46IGNoaWxkcmVuLCB0YWc6IHRhZyB9O1xuICByZXR1cm4gbm9kZVxufVxuXG5mdW5jdGlvbiByZXNvbHZlQXN5bmNDb21wb25lbnQgKFxuICBmYWN0b3J5LFxuICBiYXNlQ3RvcixcbiAgY29udGV4dFxuKSB7XG4gIGlmIChpc1RydWUoZmFjdG9yeS5lcnJvcikgJiYgaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7XG4gICAgcmV0dXJuIGZhY3RvcnkuZXJyb3JDb21wXG4gIH1cblxuICBpZiAoaXNEZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICByZXR1cm4gZmFjdG9yeS5yZXNvbHZlZFxuICB9XG5cbiAgaWYgKGlzVHJ1ZShmYWN0b3J5LmxvYWRpbmcpICYmIGlzRGVmKGZhY3RvcnkubG9hZGluZ0NvbXApKSB7XG4gICAgcmV0dXJuIGZhY3RvcnkubG9hZGluZ0NvbXBcbiAgfVxuXG4gIGlmIChpc0RlZihmYWN0b3J5LmNvbnRleHRzKSkge1xuICAgIC8vIGFscmVhZHkgcGVuZGluZ1xuICAgIGZhY3RvcnkuY29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY29udGV4dHMgPSBmYWN0b3J5LmNvbnRleHRzID0gW2NvbnRleHRdO1xuICAgIHZhciBzeW5jID0gdHJ1ZTtcblxuICAgIHZhciBmb3JjZVJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY29udGV4dHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnRleHRzW2ldLiRmb3JjZVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgcmVzb2x2ZSA9IG9uY2UoZnVuY3Rpb24gKHJlcykge1xuICAgICAgLy8gY2FjaGUgcmVzb2x2ZWRcbiAgICAgIGZhY3RvcnkucmVzb2x2ZWQgPSBlbnN1cmVDdG9yKHJlcywgYmFzZUN0b3IpO1xuICAgICAgLy8gaW52b2tlIGNhbGxiYWNrcyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgc3luY2hyb25vdXMgcmVzb2x2ZVxuICAgICAgLy8gKGFzeW5jIHJlc29sdmVzIGFyZSBzaGltbWVkIGFzIHN5bmNocm9ub3VzIGR1cmluZyBTU1IpXG4gICAgICBpZiAoIXN5bmMpIHtcbiAgICAgICAgZm9yY2VSZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciByZWplY3QgPSBvbmNlKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJGYWlsZWQgdG8gcmVzb2x2ZSBhc3luYyBjb21wb25lbnQ6IFwiICsgKFN0cmluZyhmYWN0b3J5KSkgK1xuICAgICAgICAocmVhc29uID8gKFwiXFxuUmVhc29uOiBcIiArIHJlYXNvbikgOiAnJylcbiAgICAgICk7XG4gICAgICBpZiAoaXNEZWYoZmFjdG9yeS5lcnJvckNvbXApKSB7XG4gICAgICAgIGZhY3RvcnkuZXJyb3IgPSB0cnVlO1xuICAgICAgICBmb3JjZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIHJlcyA9IGZhY3RvcnkocmVzb2x2ZSwgcmVqZWN0KTtcblxuICAgIGlmIChpc09iamVjdChyZXMpKSB7XG4gICAgICBpZiAodHlwZW9mIHJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vICgpID0+IFByb21pc2VcbiAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgICByZXMudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzRGVmKHJlcy5jb21wb25lbnQpICYmIHR5cGVvZiByZXMuY29tcG9uZW50LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzLmNvbXBvbmVudC50aGVuKHJlc29sdmUsIHJlamVjdCk7XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy5lcnJvcikpIHtcbiAgICAgICAgICBmYWN0b3J5LmVycm9yQ29tcCA9IGVuc3VyZUN0b3IocmVzLmVycm9yLCBiYXNlQ3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEZWYocmVzLmxvYWRpbmcpKSB7XG4gICAgICAgICAgZmFjdG9yeS5sb2FkaW5nQ29tcCA9IGVuc3VyZUN0b3IocmVzLmxvYWRpbmcsIGJhc2VDdG9yKTtcbiAgICAgICAgICBpZiAocmVzLmRlbGF5ID09PSAwKSB7XG4gICAgICAgICAgICBmYWN0b3J5LmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkgJiYgaXNVbmRlZihmYWN0b3J5LmVycm9yKSkge1xuICAgICAgICAgICAgICAgIGZhY3RvcnkubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yY2VSZW5kZXIoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVzLmRlbGF5IHx8IDIwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVmKHJlcy50aW1lb3V0KSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGlzVW5kZWYoZmFjdG9yeS5yZXNvbHZlZCkpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICAgICAgICAgICAgICAgID8gKFwidGltZW91dCAoXCIgKyAocmVzLnRpbWVvdXQpICsgXCJtcylcIilcbiAgICAgICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHJlcy50aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHN5bmMgPSBmYWxzZTtcbiAgICAvLyByZXR1cm4gaW4gY2FzZSByZXNvbHZlZCBzeW5jaHJvbm91c2x5XG4gICAgcmV0dXJuIGZhY3RvcnkubG9hZGluZ1xuICAgICAgPyBmYWN0b3J5LmxvYWRpbmdDb21wXG4gICAgICA6IGZhY3RvcnkucmVzb2x2ZWRcbiAgfVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gZ2V0Rmlyc3RDb21wb25lbnRDaGlsZCAoY2hpbGRyZW4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBjaGlsZHJlbltpXTtcbiAgICAgIGlmIChpc0RlZihjKSAmJiBpc0RlZihjLmNvbXBvbmVudE9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBjXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qICAqL1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdEV2ZW50cyAodm0pIHtcbiAgdm0uX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZtLl9oYXNIb29rRXZlbnQgPSBmYWxzZTtcbiAgLy8gaW5pdCBwYXJlbnQgYXR0YWNoZWQgZXZlbnRzXG4gIHZhciBsaXN0ZW5lcnMgPSB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICBpZiAobGlzdGVuZXJzKSB7XG4gICAgdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzKHZtLCBsaXN0ZW5lcnMpO1xuICB9XG59XG5cbnZhciB0YXJnZXQ7XG5cbmZ1bmN0aW9uIGFkZCAoZXZlbnQsIGZuLCBvbmNlJCQxKSB7XG4gIGlmIChvbmNlJCQxKSB7XG4gICAgdGFyZ2V0LiRvbmNlKGV2ZW50LCBmbik7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0LiRvbihldmVudCwgZm4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSQxIChldmVudCwgZm4pIHtcbiAgdGFyZ2V0LiRvZmYoZXZlbnQsIGZuKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ29tcG9uZW50TGlzdGVuZXJzIChcbiAgdm0sXG4gIGxpc3RlbmVycyxcbiAgb2xkTGlzdGVuZXJzXG4pIHtcbiAgdGFyZ2V0ID0gdm07XG4gIHVwZGF0ZUxpc3RlbmVycyhsaXN0ZW5lcnMsIG9sZExpc3RlbmVycyB8fCB7fSwgYWRkLCByZW1vdmUkMSwgdm0pO1xufVxuXG5mdW5jdGlvbiBldmVudHNNaXhpbiAoVnVlKSB7XG4gIHZhciBob29rUkUgPSAvXmhvb2s6LztcbiAgVnVlLnByb3RvdHlwZS4kb24gPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGV2ZW50KSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBldmVudC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdGhpcyQxLiRvbihldmVudFtpXSwgZm4pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAodm0uX2V2ZW50c1tldmVudF0gfHwgKHZtLl9ldmVudHNbZXZlbnRdID0gW10pKS5wdXNoKGZuKTtcbiAgICAgIC8vIG9wdGltaXplIGhvb2s6ZXZlbnQgY29zdCBieSB1c2luZyBhIGJvb2xlYW4gZmxhZyBtYXJrZWQgYXQgcmVnaXN0cmF0aW9uXG4gICAgICAvLyBpbnN0ZWFkIG9mIGEgaGFzaCBsb29rdXBcbiAgICAgIGlmIChob29rUkUudGVzdChldmVudCkpIHtcbiAgICAgICAgdm0uX2hhc0hvb2tFdmVudCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2bVxuICB9O1xuXG4gIFZ1ZS5wcm90b3R5cGUuJG9uY2UgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBmdW5jdGlvbiBvbiAoKSB7XG4gICAgICB2bS4kb2ZmKGV2ZW50LCBvbik7XG4gICAgICBmbi5hcHBseSh2bSwgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgb24uZm4gPSBmbjtcbiAgICB2bS4kb24oZXZlbnQsIG9uKTtcbiAgICByZXR1cm4gdm1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRvZmYgPSBmdW5jdGlvbiAoZXZlbnQsIGZuKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIC8vIGFsbFxuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdm0uX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gYXJyYXkgb2YgZXZlbnRzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnQpKSB7XG4gICAgICBmb3IgKHZhciBpJDEgPSAwLCBsID0gZXZlbnQubGVuZ3RoOyBpJDEgPCBsOyBpJDErKykge1xuICAgICAgICB0aGlzJDEuJG9mZihldmVudFtpJDFdLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm1cbiAgICB9XG4gICAgLy8gc3BlY2lmaWMgZXZlbnRcbiAgICB2YXIgY2JzID0gdm0uX2V2ZW50c1tldmVudF07XG4gICAgaWYgKCFjYnMpIHtcbiAgICAgIHJldHVybiB2bVxuICAgIH1cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdm0uX2V2ZW50c1tldmVudF0gPSBudWxsO1xuICAgICAgcmV0dXJuIHZtXG4gICAgfVxuICAgIC8vIHNwZWNpZmljIGhhbmRsZXJcbiAgICB2YXIgY2I7XG4gICAgdmFyIGkgPSBjYnMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNiID0gY2JzW2ldO1xuICAgICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcbiAgICAgICAgY2JzLnNwbGljZShpLCAxKTtcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZtXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZW1pdCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBsb3dlckNhc2VFdmVudCA9IGV2ZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAobG93ZXJDYXNlRXZlbnQgIT09IGV2ZW50ICYmIHZtLl9ldmVudHNbbG93ZXJDYXNlRXZlbnRdKSB7XG4gICAgICAgIHRpcChcbiAgICAgICAgICBcIkV2ZW50IFxcXCJcIiArIGxvd2VyQ2FzZUV2ZW50ICsgXCJcXFwiIGlzIGVtaXR0ZWQgaW4gY29tcG9uZW50IFwiICtcbiAgICAgICAgICAoZm9ybWF0Q29tcG9uZW50TmFtZSh2bSkpICsgXCIgYnV0IHRoZSBoYW5kbGVyIGlzIHJlZ2lzdGVyZWQgZm9yIFxcXCJcIiArIGV2ZW50ICsgXCJcXFwiLiBcIiArXG4gICAgICAgICAgXCJOb3RlIHRoYXQgSFRNTCBhdHRyaWJ1dGVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCB5b3UgY2Fubm90IHVzZSBcIiArXG4gICAgICAgICAgXCJ2LW9uIHRvIGxpc3RlbiB0byBjYW1lbENhc2UgZXZlbnRzIHdoZW4gdXNpbmcgaW4tRE9NIHRlbXBsYXRlcy4gXCIgK1xuICAgICAgICAgIFwiWW91IHNob3VsZCBwcm9iYWJseSB1c2UgXFxcIlwiICsgKGh5cGhlbmF0ZShldmVudCkpICsgXCJcXFwiIGluc3RlYWQgb2YgXFxcIlwiICsgZXZlbnQgKyBcIlxcXCIuXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGNicyA9IHZtLl9ldmVudHNbZXZlbnRdO1xuICAgIGlmIChjYnMpIHtcbiAgICAgIGNicyA9IGNicy5sZW5ndGggPiAxID8gdG9BcnJheShjYnMpIDogY2JzO1xuICAgICAgdmFyIGFyZ3MgPSB0b0FycmF5KGFyZ3VtZW50cywgMSk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNicy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYnNbaV0uYXBwbHkodm0sIGFyZ3MpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sIChcImV2ZW50IGhhbmRsZXIgZm9yIFxcXCJcIiArIGV2ZW50ICsgXCJcXFwiXCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm1cbiAgfTtcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyByYXcgY2hpbGRyZW4gVk5vZGVzIGludG8gYSBzbG90IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNsb3RzIChcbiAgY2hpbGRyZW4sXG4gIGNvbnRleHRcbikge1xuICB2YXIgc2xvdHMgPSB7fTtcbiAgaWYgKCFjaGlsZHJlbikge1xuICAgIHJldHVybiBzbG90c1xuICB9XG4gIHZhciBkZWZhdWx0U2xvdCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIC8vIG5hbWVkIHNsb3RzIHNob3VsZCBvbmx5IGJlIHJlc3BlY3RlZCBpZiB0aGUgdm5vZGUgd2FzIHJlbmRlcmVkIGluIHRoZVxuICAgIC8vIHNhbWUgY29udGV4dC5cbiAgICBpZiAoKGNoaWxkLmNvbnRleHQgPT09IGNvbnRleHQgfHwgY2hpbGQuZnVuY3Rpb25hbENvbnRleHQgPT09IGNvbnRleHQpICYmXG4gICAgICBjaGlsZC5kYXRhICYmIGNoaWxkLmRhdGEuc2xvdCAhPSBudWxsXG4gICAgKSB7XG4gICAgICB2YXIgbmFtZSA9IGNoaWxkLmRhdGEuc2xvdDtcbiAgICAgIHZhciBzbG90ID0gKHNsb3RzW25hbWVdIHx8IChzbG90c1tuYW1lXSA9IFtdKSk7XG4gICAgICBpZiAoY2hpbGQudGFnID09PSAndGVtcGxhdGUnKSB7XG4gICAgICAgIHNsb3QucHVzaC5hcHBseShzbG90LCBjaGlsZC5jaGlsZHJlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzbG90LnB1c2goY2hpbGQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWZhdWx0U2xvdC5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH1cbiAgLy8gaWdub3JlIHdoaXRlc3BhY2VcbiAgaWYgKCFkZWZhdWx0U2xvdC5ldmVyeShpc1doaXRlc3BhY2UpKSB7XG4gICAgc2xvdHMuZGVmYXVsdCA9IGRlZmF1bHRTbG90O1xuICB9XG4gIHJldHVybiBzbG90c1xufVxuXG5mdW5jdGlvbiBpc1doaXRlc3BhY2UgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUuaXNDb21tZW50IHx8IG5vZGUudGV4dCA9PT0gJyAnXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRTbG90cyAoXG4gIGZucywgLy8gc2VlIGZsb3cvdm5vZGVcbiAgcmVzXG4pIHtcbiAgcmVzID0gcmVzIHx8IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGZuc1tpXSkpIHtcbiAgICAgIHJlc29sdmVTY29wZWRTbG90cyhmbnNbaV0sIHJlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc1tmbnNbaV0ua2V5XSA9IGZuc1tpXS5mbjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG4vKiAgKi9cblxudmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcbnZhciBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaW5pdExpZmVjeWNsZSAodm0pIHtcbiAgdmFyIG9wdGlvbnMgPSB2bS4kb3B0aW9ucztcblxuICAvLyBsb2NhdGUgZmlyc3Qgbm9uLWFic3RyYWN0IHBhcmVudFxuICB2YXIgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIGlmIChwYXJlbnQgJiYgIW9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICB3aGlsZSAocGFyZW50LiRvcHRpb25zLmFic3RyYWN0ICYmIHBhcmVudC4kcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQuJHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50LiRjaGlsZHJlbi5wdXNoKHZtKTtcbiAgfVxuXG4gIHZtLiRwYXJlbnQgPSBwYXJlbnQ7XG4gIHZtLiRyb290ID0gcGFyZW50ID8gcGFyZW50LiRyb290IDogdm07XG5cbiAgdm0uJGNoaWxkcmVuID0gW107XG4gIHZtLiRyZWZzID0ge307XG5cbiAgdm0uX3dhdGNoZXIgPSBudWxsO1xuICB2bS5faW5hY3RpdmUgPSBudWxsO1xuICB2bS5fZGlyZWN0SW5hY3RpdmUgPSBmYWxzZTtcbiAgdm0uX2lzTW91bnRlZCA9IGZhbHNlO1xuICB2bS5faXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbGlmZWN5Y2xlTWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiAodm5vZGUsIGh5ZHJhdGluZykge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl9pc01vdW50ZWQpIHtcbiAgICAgIGNhbGxIb29rKHZtLCAnYmVmb3JlVXBkYXRlJyk7XG4gICAgfVxuICAgIHZhciBwcmV2RWwgPSB2bS4kZWw7XG4gICAgdmFyIHByZXZWbm9kZSA9IHZtLl92bm9kZTtcbiAgICB2YXIgcHJldkFjdGl2ZUluc3RhbmNlID0gYWN0aXZlSW5zdGFuY2U7XG4gICAgYWN0aXZlSW5zdGFuY2UgPSB2bTtcbiAgICB2bS5fdm5vZGUgPSB2bm9kZTtcbiAgICAvLyBWdWUucHJvdG90eXBlLl9fcGF0Y2hfXyBpcyBpbmplY3RlZCBpbiBlbnRyeSBwb2ludHNcbiAgICAvLyBiYXNlZCBvbiB0aGUgcmVuZGVyaW5nIGJhY2tlbmQgdXNlZC5cbiAgICBpZiAoIXByZXZWbm9kZSkge1xuICAgICAgLy8gaW5pdGlhbCByZW5kZXJcbiAgICAgIHZtLiRlbCA9IHZtLl9fcGF0Y2hfXyhcbiAgICAgICAgdm0uJGVsLCB2bm9kZSwgaHlkcmF0aW5nLCBmYWxzZSAvKiByZW1vdmVPbmx5ICovLFxuICAgICAgICB2bS4kb3B0aW9ucy5fcGFyZW50RWxtLFxuICAgICAgICB2bS4kb3B0aW9ucy5fcmVmRWxtXG4gICAgICApO1xuICAgICAgLy8gbm8gbmVlZCBmb3IgdGhlIHJlZiBub2RlcyBhZnRlciBpbml0aWFsIHBhdGNoXG4gICAgICAvLyB0aGlzIHByZXZlbnRzIGtlZXBpbmcgYSBkZXRhY2hlZCBET00gdHJlZSBpbiBtZW1vcnkgKCM1ODUxKVxuICAgICAgdm0uJG9wdGlvbnMuX3BhcmVudEVsbSA9IHZtLiRvcHRpb25zLl9yZWZFbG0gPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1cGRhdGVzXG4gICAgICB2bS4kZWwgPSB2bS5fX3BhdGNoX18ocHJldlZub2RlLCB2bm9kZSk7XG4gICAgfVxuICAgIGFjdGl2ZUluc3RhbmNlID0gcHJldkFjdGl2ZUluc3RhbmNlO1xuICAgIC8vIHVwZGF0ZSBfX3Z1ZV9fIHJlZmVyZW5jZVxuICAgIGlmIChwcmV2RWwpIHtcbiAgICAgIHByZXZFbC5fX3Z1ZV9fID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHZtLiRlbCkge1xuICAgICAgdm0uJGVsLl9fdnVlX18gPSB2bTtcbiAgICB9XG4gICAgLy8gaWYgcGFyZW50IGlzIGFuIEhPQywgdXBkYXRlIGl0cyAkZWwgYXMgd2VsbFxuICAgIGlmICh2bS4kdm5vZGUgJiYgdm0uJHBhcmVudCAmJiB2bS4kdm5vZGUgPT09IHZtLiRwYXJlbnQuX3Zub2RlKSB7XG4gICAgICB2bS4kcGFyZW50LiRlbCA9IHZtLiRlbDtcbiAgICB9XG4gICAgLy8gdXBkYXRlZCBob29rIGlzIGNhbGxlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGVuc3VyZSB0aGF0IGNoaWxkcmVuIGFyZVxuICAgIC8vIHVwZGF0ZWQgaW4gYSBwYXJlbnQncyB1cGRhdGVkIGhvb2suXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS4kZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZtID0gdGhpcztcbiAgICBpZiAodm0uX3dhdGNoZXIpIHtcbiAgICAgIHZtLl93YXRjaGVyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfTtcblxuICBWdWUucHJvdG90eXBlLiRkZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgaWYgKHZtLl9pc0JlaW5nRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY2FsbEhvb2sodm0sICdiZWZvcmVEZXN0cm95Jyk7XG4gICAgdm0uX2lzQmVpbmdEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIHJlbW92ZSBzZWxmIGZyb20gcGFyZW50XG4gICAgdmFyIHBhcmVudCA9IHZtLiRwYXJlbnQ7XG4gICAgaWYgKHBhcmVudCAmJiAhcGFyZW50Ll9pc0JlaW5nRGVzdHJveWVkICYmICF2bS4kb3B0aW9ucy5hYnN0cmFjdCkge1xuICAgICAgcmVtb3ZlKHBhcmVudC4kY2hpbGRyZW4sIHZtKTtcbiAgICB9XG4gICAgLy8gdGVhcmRvd24gd2F0Y2hlcnNcbiAgICBpZiAodm0uX3dhdGNoZXIpIHtcbiAgICAgIHZtLl93YXRjaGVyLnRlYXJkb3duKCk7XG4gICAgfVxuICAgIHZhciBpID0gdm0uX3dhdGNoZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB2bS5fd2F0Y2hlcnNbaV0udGVhcmRvd24oKTtcbiAgICB9XG4gICAgLy8gcmVtb3ZlIHJlZmVyZW5jZSBmcm9tIGRhdGEgb2JcbiAgICAvLyBmcm96ZW4gb2JqZWN0IG1heSBub3QgaGF2ZSBvYnNlcnZlci5cbiAgICBpZiAodm0uX2RhdGEuX19vYl9fKSB7XG4gICAgICB2bS5fZGF0YS5fX29iX18udm1Db3VudC0tO1xuICAgIH1cbiAgICAvLyBjYWxsIHRoZSBsYXN0IGhvb2suLi5cbiAgICB2bS5faXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIC8vIGludm9rZSBkZXN0cm95IGhvb2tzIG9uIGN1cnJlbnQgcmVuZGVyZWQgdHJlZVxuICAgIHZtLl9fcGF0Y2hfXyh2bS5fdm5vZGUsIG51bGwpO1xuICAgIC8vIGZpcmUgZGVzdHJveWVkIGhvb2tcbiAgICBjYWxsSG9vayh2bSwgJ2Rlc3Ryb3llZCcpO1xuICAgIC8vIHR1cm4gb2ZmIGFsbCBpbnN0YW5jZSBsaXN0ZW5lcnMuXG4gICAgdm0uJG9mZigpO1xuICAgIC8vIHJlbW92ZSBfX3Z1ZV9fIHJlZmVyZW5jZVxuICAgIGlmICh2bS4kZWwpIHtcbiAgICAgIHZtLiRlbC5fX3Z1ZV9fID0gbnVsbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIG1vdW50Q29tcG9uZW50IChcbiAgdm0sXG4gIGVsLFxuICBoeWRyYXRpbmdcbikge1xuICB2bS4kZWwgPSBlbDtcbiAgaWYgKCF2bS4kb3B0aW9ucy5yZW5kZXIpIHtcbiAgICB2bS4kb3B0aW9ucy5yZW5kZXIgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICgodm0uJG9wdGlvbnMudGVtcGxhdGUgJiYgdm0uJG9wdGlvbnMudGVtcGxhdGUuY2hhckF0KDApICE9PSAnIycpIHx8XG4gICAgICAgIHZtLiRvcHRpb25zLmVsIHx8IGVsKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ1lvdSBhcmUgdXNpbmcgdGhlIHJ1bnRpbWUtb25seSBidWlsZCBvZiBWdWUgd2hlcmUgdGhlIHRlbXBsYXRlICcgK1xuICAgICAgICAgICdjb21waWxlciBpcyBub3QgYXZhaWxhYmxlLiBFaXRoZXIgcHJlLWNvbXBpbGUgdGhlIHRlbXBsYXRlcyBpbnRvICcgK1xuICAgICAgICAgICdyZW5kZXIgZnVuY3Rpb25zLCBvciB1c2UgdGhlIGNvbXBpbGVyLWluY2x1ZGVkIGJ1aWxkLicsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ0ZhaWxlZCB0byBtb3VudCBjb21wb25lbnQ6IHRlbXBsYXRlIG9yIHJlbmRlciBmdW5jdGlvbiBub3QgZGVmaW5lZC4nLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNhbGxIb29rKHZtLCAnYmVmb3JlTW91bnQnKTtcblxuICB2YXIgdXBkYXRlQ29tcG9uZW50O1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICB1cGRhdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmFtZSA9IHZtLl9uYW1lO1xuICAgICAgdmFyIGlkID0gdm0uX3VpZDtcbiAgICAgIHZhciBzdGFydFRhZyA9IFwidnVlLXBlcmYtc3RhcnQ6XCIgKyBpZDtcbiAgICAgIHZhciBlbmRUYWcgPSBcInZ1ZS1wZXJmLWVuZDpcIiArIGlkO1xuXG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICAgIHZhciB2bm9kZSA9IHZtLl9yZW5kZXIoKTtcbiAgICAgIG1hcmsoZW5kVGFnKTtcbiAgICAgIG1lYXN1cmUoKG5hbWUgKyBcIiByZW5kZXJcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuXG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICAgIHZtLl91cGRhdGUodm5vZGUsIGh5ZHJhdGluZyk7XG4gICAgICBtYXJrKGVuZFRhZyk7XG4gICAgICBtZWFzdXJlKChuYW1lICsgXCIgcGF0Y2hcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgdXBkYXRlQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdm0uX3VwZGF0ZSh2bS5fcmVuZGVyKCksIGh5ZHJhdGluZyk7XG4gICAgfTtcbiAgfVxuXG4gIHZtLl93YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIHVwZGF0ZUNvbXBvbmVudCwgbm9vcCk7XG4gIGh5ZHJhdGluZyA9IGZhbHNlO1xuXG4gIC8vIG1hbnVhbGx5IG1vdW50ZWQgaW5zdGFuY2UsIGNhbGwgbW91bnRlZCBvbiBzZWxmXG4gIC8vIG1vdW50ZWQgaXMgY2FsbGVkIGZvciByZW5kZXItY3JlYXRlZCBjaGlsZCBjb21wb25lbnRzIGluIGl0cyBpbnNlcnRlZCBob29rXG4gIGlmICh2bS4kdm5vZGUgPT0gbnVsbCkge1xuICAgIHZtLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgIGNhbGxIb29rKHZtLCAnbW91bnRlZCcpO1xuICB9XG4gIHJldHVybiB2bVxufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGlsZENvbXBvbmVudCAoXG4gIHZtLFxuICBwcm9wc0RhdGEsXG4gIGxpc3RlbmVycyxcbiAgcGFyZW50Vm5vZGUsXG4gIHJlbmRlckNoaWxkcmVuXG4pIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSB0cnVlO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIHdoZXRoZXIgY29tcG9uZW50IGhhcyBzbG90IGNoaWxkcmVuXG4gIC8vIHdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgb3ZlcndyaXRpbmcgJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuXG4gIHZhciBoYXNDaGlsZHJlbiA9ICEhKFxuICAgIHJlbmRlckNoaWxkcmVuIHx8ICAgICAgICAgICAgICAgLy8gaGFzIG5ldyBzdGF0aWMgc2xvdHNcbiAgICB2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4gfHwgIC8vIGhhcyBvbGQgc3RhdGljIHNsb3RzXG4gICAgcGFyZW50Vm5vZGUuZGF0YS5zY29wZWRTbG90cyB8fCAvLyBoYXMgbmV3IHNjb3BlZCBzbG90c1xuICAgIHZtLiRzY29wZWRTbG90cyAhPT0gZW1wdHlPYmplY3QgLy8gaGFzIG9sZCBzY29wZWQgc2xvdHNcbiAgKTtcblxuICB2bS4kb3B0aW9ucy5fcGFyZW50Vm5vZGUgPSBwYXJlbnRWbm9kZTtcbiAgdm0uJHZub2RlID0gcGFyZW50Vm5vZGU7IC8vIHVwZGF0ZSB2bSdzIHBsYWNlaG9sZGVyIG5vZGUgd2l0aG91dCByZS1yZW5kZXJcblxuICBpZiAodm0uX3Zub2RlKSB7IC8vIHVwZGF0ZSBjaGlsZCB0cmVlJ3MgcGFyZW50XG4gICAgdm0uX3Zub2RlLnBhcmVudCA9IHBhcmVudFZub2RlO1xuICB9XG4gIHZtLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbiA9IHJlbmRlckNoaWxkcmVuO1xuXG4gIC8vIHVwZGF0ZSAkYXR0cnMgYW5kICRsaXN0ZW5zZXJzIGhhc2hcbiAgLy8gdGhlc2UgYXJlIGFsc28gcmVhY3RpdmUgc28gdGhleSBtYXkgdHJpZ2dlciBjaGlsZCB1cGRhdGUgaWYgdGhlIGNoaWxkXG4gIC8vIHVzZWQgdGhlbSBkdXJpbmcgcmVuZGVyXG4gIHZtLiRhdHRycyA9IHBhcmVudFZub2RlLmRhdGEgJiYgcGFyZW50Vm5vZGUuZGF0YS5hdHRycztcbiAgdm0uJGxpc3RlbmVycyA9IGxpc3RlbmVycztcblxuICAvLyB1cGRhdGUgcHJvcHNcbiAgaWYgKHByb3BzRGF0YSAmJiB2bS4kb3B0aW9ucy5wcm9wcykge1xuICAgIG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydCA9IGZhbHNlO1xuICAgIHZhciBwcm9wcyA9IHZtLl9wcm9wcztcbiAgICB2YXIgcHJvcEtleXMgPSB2bS4kb3B0aW9ucy5fcHJvcEtleXMgfHwgW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IHByb3BLZXlzW2ldO1xuICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHZtLiRvcHRpb25zLnByb3BzLCBwcm9wc0RhdGEsIHZtKTtcbiAgICB9XG4gICAgb2JzZXJ2ZXJTdGF0ZS5zaG91bGRDb252ZXJ0ID0gdHJ1ZTtcbiAgICAvLyBrZWVwIGEgY29weSBvZiByYXcgcHJvcHNEYXRhXG4gICAgdm0uJG9wdGlvbnMucHJvcHNEYXRhID0gcHJvcHNEYXRhO1xuICB9XG5cbiAgLy8gdXBkYXRlIGxpc3RlbmVyc1xuICBpZiAobGlzdGVuZXJzKSB7XG4gICAgdmFyIG9sZExpc3RlbmVycyA9IHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7XG4gICAgdm0uJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycyA9IGxpc3RlbmVycztcbiAgICB1cGRhdGVDb21wb25lbnRMaXN0ZW5lcnModm0sIGxpc3RlbmVycywgb2xkTGlzdGVuZXJzKTtcbiAgfVxuICAvLyByZXNvbHZlIHNsb3RzICsgZm9yY2UgdXBkYXRlIGlmIGhhcyBjaGlsZHJlblxuICBpZiAoaGFzQ2hpbGRyZW4pIHtcbiAgICB2bS4kc2xvdHMgPSByZXNvbHZlU2xvdHMocmVuZGVyQ2hpbGRyZW4sIHBhcmVudFZub2RlLmNvbnRleHQpO1xuICAgIHZtLiRmb3JjZVVwZGF0ZSgpO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0luSW5hY3RpdmVUcmVlICh2bSkge1xuICB3aGlsZSAodm0gJiYgKHZtID0gdm0uJHBhcmVudCkpIHtcbiAgICBpZiAodm0uX2luYWN0aXZlKSB7IHJldHVybiB0cnVlIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkge1xuICBpZiAoZGlyZWN0KSB7XG4gICAgdm0uX2RpcmVjdEluYWN0aXZlID0gZmFsc2U7XG4gICAgaWYgKGlzSW5JbmFjdGl2ZVRyZWUodm0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH0gZWxzZSBpZiAodm0uX2RpcmVjdEluYWN0aXZlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHZtLl9pbmFjdGl2ZSB8fCB2bS5faW5hY3RpdmUgPT09IG51bGwpIHtcbiAgICB2bS5faW5hY3RpdmUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZtLiRjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICBjYWxsSG9vayh2bSwgJ2FjdGl2YXRlZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCAodm0sIGRpcmVjdCkge1xuICBpZiAoZGlyZWN0KSB7XG4gICAgdm0uX2RpcmVjdEluYWN0aXZlID0gdHJ1ZTtcbiAgICBpZiAoaXNJbkluYWN0aXZlVHJlZSh2bSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuICBpZiAoIXZtLl9pbmFjdGl2ZSkge1xuICAgIHZtLl9pbmFjdGl2ZSA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2bS4kY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYWN0aXZhdGVDaGlsZENvbXBvbmVudCh2bS4kY2hpbGRyZW5baV0pO1xuICAgIH1cbiAgICBjYWxsSG9vayh2bSwgJ2RlYWN0aXZhdGVkJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbEhvb2sgKHZtLCBob29rKSB7XG4gIHZhciBoYW5kbGVycyA9IHZtLiRvcHRpb25zW2hvb2tdO1xuICBpZiAoaGFuZGxlcnMpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcnNbaV0uY2FsbCh2bSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGUsIHZtLCAoaG9vayArIFwiIGhvb2tcIikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAodm0uX2hhc0hvb2tFdmVudCkge1xuICAgIHZtLiRlbWl0KCdob29rOicgKyBob29rKTtcbiAgfVxufVxuXG4vKiAgKi9cblxuXG52YXIgTUFYX1VQREFURV9DT1VOVCA9IDEwMDtcblxudmFyIHF1ZXVlID0gW107XG52YXIgYWN0aXZhdGVkQ2hpbGRyZW4gPSBbXTtcbnZhciBoYXMgPSB7fTtcbnZhciBjaXJjdWxhciA9IHt9O1xudmFyIHdhaXRpbmcgPSBmYWxzZTtcbnZhciBmbHVzaGluZyA9IGZhbHNlO1xudmFyIGluZGV4ID0gMDtcblxuLyoqXG4gKiBSZXNldCB0aGUgc2NoZWR1bGVyJ3Mgc3RhdGUuXG4gKi9cbmZ1bmN0aW9uIHJlc2V0U2NoZWR1bGVyU3RhdGUgKCkge1xuICBpbmRleCA9IHF1ZXVlLmxlbmd0aCA9IGFjdGl2YXRlZENoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIGhhcyA9IHt9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNpcmN1bGFyID0ge307XG4gIH1cbiAgd2FpdGluZyA9IGZsdXNoaW5nID0gZmFsc2U7XG59XG5cbi8qKlxuICogRmx1c2ggYm90aCBxdWV1ZXMgYW5kIHJ1biB0aGUgd2F0Y2hlcnMuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoU2NoZWR1bGVyUXVldWUgKCkge1xuICBmbHVzaGluZyA9IHRydWU7XG4gIHZhciB3YXRjaGVyLCBpZDtcblxuICAvLyBTb3J0IHF1ZXVlIGJlZm9yZSBmbHVzaC5cbiAgLy8gVGhpcyBlbnN1cmVzIHRoYXQ6XG4gIC8vIDEuIENvbXBvbmVudHMgYXJlIHVwZGF0ZWQgZnJvbSBwYXJlbnQgdG8gY2hpbGQuIChiZWNhdXNlIHBhcmVudCBpcyBhbHdheXNcbiAgLy8gICAgY3JlYXRlZCBiZWZvcmUgdGhlIGNoaWxkKVxuICAvLyAyLiBBIGNvbXBvbmVudCdzIHVzZXIgd2F0Y2hlcnMgYXJlIHJ1biBiZWZvcmUgaXRzIHJlbmRlciB3YXRjaGVyIChiZWNhdXNlXG4gIC8vICAgIHVzZXIgd2F0Y2hlcnMgYXJlIGNyZWF0ZWQgYmVmb3JlIHRoZSByZW5kZXIgd2F0Y2hlcilcbiAgLy8gMy4gSWYgYSBjb21wb25lbnQgaXMgZGVzdHJveWVkIGR1cmluZyBhIHBhcmVudCBjb21wb25lbnQncyB3YXRjaGVyIHJ1bixcbiAgLy8gICAgaXRzIHdhdGNoZXJzIGNhbiBiZSBza2lwcGVkLlxuICBxdWV1ZS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhLmlkIC0gYi5pZDsgfSk7XG5cbiAgLy8gZG8gbm90IGNhY2hlIGxlbmd0aCBiZWNhdXNlIG1vcmUgd2F0Y2hlcnMgbWlnaHQgYmUgcHVzaGVkXG4gIC8vIGFzIHdlIHJ1biBleGlzdGluZyB3YXRjaGVyc1xuICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBxdWV1ZS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICB3YXRjaGVyID0gcXVldWVbaW5kZXhdO1xuICAgIGlkID0gd2F0Y2hlci5pZDtcbiAgICBoYXNbaWRdID0gbnVsbDtcbiAgICB3YXRjaGVyLnJ1bigpO1xuICAgIC8vIGluIGRldiBidWlsZCwgY2hlY2sgYW5kIHN0b3AgY2lyY3VsYXIgdXBkYXRlcy5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBoYXNbaWRdICE9IG51bGwpIHtcbiAgICAgIGNpcmN1bGFyW2lkXSA9IChjaXJjdWxhcltpZF0gfHwgMCkgKyAxO1xuICAgICAgaWYgKGNpcmN1bGFyW2lkXSA+IE1BWF9VUERBVEVfQ09VTlQpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAnWW91IG1heSBoYXZlIGFuIGluZmluaXRlIHVwZGF0ZSBsb29wICcgKyAoXG4gICAgICAgICAgICB3YXRjaGVyLnVzZXJcbiAgICAgICAgICAgICAgPyAoXCJpbiB3YXRjaGVyIHdpdGggZXhwcmVzc2lvbiBcXFwiXCIgKyAod2F0Y2hlci5leHByZXNzaW9uKSArIFwiXFxcIlwiKVxuICAgICAgICAgICAgICA6IFwiaW4gYSBjb21wb25lbnQgcmVuZGVyIGZ1bmN0aW9uLlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICB3YXRjaGVyLnZtXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8ga2VlcCBjb3BpZXMgb2YgcG9zdCBxdWV1ZXMgYmVmb3JlIHJlc2V0dGluZyBzdGF0ZVxuICB2YXIgYWN0aXZhdGVkUXVldWUgPSBhY3RpdmF0ZWRDaGlsZHJlbi5zbGljZSgpO1xuICB2YXIgdXBkYXRlZFF1ZXVlID0gcXVldWUuc2xpY2UoKTtcblxuICByZXNldFNjaGVkdWxlclN0YXRlKCk7XG5cbiAgLy8gY2FsbCBjb21wb25lbnQgdXBkYXRlZCBhbmQgYWN0aXZhdGVkIGhvb2tzXG4gIGNhbGxBY3RpdmF0ZWRIb29rcyhhY3RpdmF0ZWRRdWV1ZSk7XG4gIGNhbGxVcGRhdGVkSG9va3ModXBkYXRlZFF1ZXVlKTtcblxuICAvLyBkZXZ0b29sIGhvb2tcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChkZXZ0b29scyAmJiBjb25maWcuZGV2dG9vbHMpIHtcbiAgICBkZXZ0b29scy5lbWl0KCdmbHVzaCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxVcGRhdGVkSG9va3MgKHF1ZXVlKSB7XG4gIHZhciBpID0gcXVldWUubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgdmFyIHdhdGNoZXIgPSBxdWV1ZVtpXTtcbiAgICB2YXIgdm0gPSB3YXRjaGVyLnZtO1xuICAgIGlmICh2bS5fd2F0Y2hlciA9PT0gd2F0Y2hlciAmJiB2bS5faXNNb3VudGVkKSB7XG4gICAgICBjYWxsSG9vayh2bSwgJ3VwZGF0ZWQnKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBRdWV1ZSBhIGtlcHQtYWxpdmUgY29tcG9uZW50IHRoYXQgd2FzIGFjdGl2YXRlZCBkdXJpbmcgcGF0Y2guXG4gKiBUaGUgcXVldWUgd2lsbCBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIGVudGlyZSB0cmVlIGhhcyBiZWVuIHBhdGNoZWQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXVlQWN0aXZhdGVkQ29tcG9uZW50ICh2bSkge1xuICAvLyBzZXR0aW5nIF9pbmFjdGl2ZSB0byBmYWxzZSBoZXJlIHNvIHRoYXQgYSByZW5kZXIgZnVuY3Rpb24gY2FuXG4gIC8vIHJlbHkgb24gY2hlY2tpbmcgd2hldGhlciBpdCdzIGluIGFuIGluYWN0aXZlIHRyZWUgKGUuZy4gcm91dGVyLXZpZXcpXG4gIHZtLl9pbmFjdGl2ZSA9IGZhbHNlO1xuICBhY3RpdmF0ZWRDaGlsZHJlbi5wdXNoKHZtKTtcbn1cblxuZnVuY3Rpb24gY2FsbEFjdGl2YXRlZEhvb2tzIChxdWV1ZSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgcXVldWVbaV0uX2luYWN0aXZlID0gdHJ1ZTtcbiAgICBhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KHF1ZXVlW2ldLCB0cnVlIC8qIHRydWUgKi8pO1xuICB9XG59XG5cbi8qKlxuICogUHVzaCBhIHdhdGNoZXIgaW50byB0aGUgd2F0Y2hlciBxdWV1ZS5cbiAqIEpvYnMgd2l0aCBkdXBsaWNhdGUgSURzIHdpbGwgYmUgc2tpcHBlZCB1bmxlc3MgaXQnc1xuICogcHVzaGVkIHdoZW4gdGhlIHF1ZXVlIGlzIGJlaW5nIGZsdXNoZWQuXG4gKi9cbmZ1bmN0aW9uIHF1ZXVlV2F0Y2hlciAod2F0Y2hlcikge1xuICB2YXIgaWQgPSB3YXRjaGVyLmlkO1xuICBpZiAoaGFzW2lkXSA9PSBudWxsKSB7XG4gICAgaGFzW2lkXSA9IHRydWU7XG4gICAgaWYgKCFmbHVzaGluZykge1xuICAgICAgcXVldWUucHVzaCh3YXRjaGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgYWxyZWFkeSBmbHVzaGluZywgc3BsaWNlIHRoZSB3YXRjaGVyIGJhc2VkIG9uIGl0cyBpZFxuICAgICAgLy8gaWYgYWxyZWFkeSBwYXN0IGl0cyBpZCwgaXQgd2lsbCBiZSBydW4gbmV4dCBpbW1lZGlhdGVseS5cbiAgICAgIHZhciBpID0gcXVldWUubGVuZ3RoIC0gMTtcbiAgICAgIHdoaWxlIChpID4gaW5kZXggJiYgcXVldWVbaV0uaWQgPiB3YXRjaGVyLmlkKSB7XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnNwbGljZShpICsgMSwgMCwgd2F0Y2hlcik7XG4gICAgfVxuICAgIC8vIHF1ZXVlIHRoZSBmbHVzaFxuICAgIGlmICghd2FpdGluZykge1xuICAgICAgd2FpdGluZyA9IHRydWU7XG4gICAgICBuZXh0VGljayhmbHVzaFNjaGVkdWxlclF1ZXVlKTtcbiAgICB9XG4gIH1cbn1cblxuLyogICovXG5cbnZhciB1aWQkMiA9IDA7XG5cbi8qKlxuICogQSB3YXRjaGVyIHBhcnNlcyBhbiBleHByZXNzaW9uLCBjb2xsZWN0cyBkZXBlbmRlbmNpZXMsXG4gKiBhbmQgZmlyZXMgY2FsbGJhY2sgd2hlbiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBjaGFuZ2VzLlxuICogVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAkd2F0Y2goKSBhcGkgYW5kIGRpcmVjdGl2ZXMuXG4gKi9cbnZhciBXYXRjaGVyID0gZnVuY3Rpb24gV2F0Y2hlciAoXG4gIHZtLFxuICBleHBPckZuLFxuICBjYixcbiAgb3B0aW9uc1xuKSB7XG4gIHRoaXMudm0gPSB2bTtcbiAgdm0uX3dhdGNoZXJzLnB1c2godGhpcyk7XG4gIC8vIG9wdGlvbnNcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICB0aGlzLmRlZXAgPSAhIW9wdGlvbnMuZGVlcDtcbiAgICB0aGlzLnVzZXIgPSAhIW9wdGlvbnMudXNlcjtcbiAgICB0aGlzLmxhenkgPSAhIW9wdGlvbnMubGF6eTtcbiAgICB0aGlzLnN5bmMgPSAhIW9wdGlvbnMuc3luYztcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmRlZXAgPSB0aGlzLnVzZXIgPSB0aGlzLmxhenkgPSB0aGlzLnN5bmMgPSBmYWxzZTtcbiAgfVxuICB0aGlzLmNiID0gY2I7XG4gIHRoaXMuaWQgPSArK3VpZCQyOyAvLyB1aWQgZm9yIGJhdGNoaW5nXG4gIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eTsgLy8gZm9yIGxhenkgd2F0Y2hlcnNcbiAgdGhpcy5kZXBzID0gW107XG4gIHRoaXMubmV3RGVwcyA9IFtdO1xuICB0aGlzLmRlcElkcyA9IG5ldyBfU2V0KCk7XG4gIHRoaXMubmV3RGVwSWRzID0gbmV3IF9TZXQoKTtcbiAgdGhpcy5leHByZXNzaW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgID8gZXhwT3JGbi50b1N0cmluZygpXG4gICAgOiAnJztcbiAgLy8gcGFyc2UgZXhwcmVzc2lvbiBmb3IgZ2V0dGVyXG4gIGlmICh0eXBlb2YgZXhwT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMuZ2V0dGVyID0gZXhwT3JGbjtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmdldHRlciA9IHBhcnNlUGF0aChleHBPckZuKTtcbiAgICBpZiAoIXRoaXMuZ2V0dGVyKSB7XG4gICAgICB0aGlzLmdldHRlciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiB3YXJuKFxuICAgICAgICBcIkZhaWxlZCB3YXRjaGluZyBwYXRoOiBcXFwiXCIgKyBleHBPckZuICsgXCJcXFwiIFwiICtcbiAgICAgICAgJ1dhdGNoZXIgb25seSBhY2NlcHRzIHNpbXBsZSBkb3QtZGVsaW1pdGVkIHBhdGhzLiAnICtcbiAgICAgICAgJ0ZvciBmdWxsIGNvbnRyb2wsIHVzZSBhIGZ1bmN0aW9uIGluc3RlYWQuJyxcbiAgICAgICAgdm1cbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHRoaXMudmFsdWUgPSB0aGlzLmxhenlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogdGhpcy5nZXQoKTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgdGhlIGdldHRlciwgYW5kIHJlLWNvbGxlY3QgZGVwZW5kZW5jaWVzLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQgKCkge1xuICBwdXNoVGFyZ2V0KHRoaXMpO1xuICB2YXIgdmFsdWU7XG4gIHZhciB2bSA9IHRoaXMudm07XG4gIHRyeSB7XG4gICAgdmFsdWUgPSB0aGlzLmdldHRlci5jYWxsKHZtLCB2bSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bSwgKFwiZ2V0dGVyIGZvciB3YXRjaGVyIFxcXCJcIiArICh0aGlzLmV4cHJlc3Npb24pICsgXCJcXFwiXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBcInRvdWNoXCIgZXZlcnkgcHJvcGVydHkgc28gdGhleSBhcmUgYWxsIHRyYWNrZWQgYXNcbiAgICAvLyBkZXBlbmRlbmNpZXMgZm9yIGRlZXAgd2F0Y2hpbmdcbiAgICBpZiAodGhpcy5kZWVwKSB7XG4gICAgICB0cmF2ZXJzZSh2YWx1ZSk7XG4gICAgfVxuICAgIHBvcFRhcmdldCgpO1xuICAgIHRoaXMuY2xlYW51cERlcHMoKTtcbiAgfVxuICByZXR1cm4gdmFsdWVcbn07XG5cbi8qKlxuICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIGRpcmVjdGl2ZS5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuYWRkRGVwID0gZnVuY3Rpb24gYWRkRGVwIChkZXApIHtcbiAgdmFyIGlkID0gZGVwLmlkO1xuICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHtcbiAgICB0aGlzLm5ld0RlcElkcy5hZGQoaWQpO1xuICAgIHRoaXMubmV3RGVwcy5wdXNoKGRlcCk7XG4gICAgaWYgKCF0aGlzLmRlcElkcy5oYXMoaWQpKSB7XG4gICAgICBkZXAuYWRkU3ViKHRoaXMpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBDbGVhbiB1cCBmb3IgZGVwZW5kZW5jeSBjb2xsZWN0aW9uLlxuICovXG5XYXRjaGVyLnByb3RvdHlwZS5jbGVhbnVwRGVwcyA9IGZ1bmN0aW9uIGNsZWFudXBEZXBzICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIgZGVwID0gdGhpcyQxLmRlcHNbaV07XG4gICAgaWYgKCF0aGlzJDEubmV3RGVwSWRzLmhhcyhkZXAuaWQpKSB7XG4gICAgICBkZXAucmVtb3ZlU3ViKHRoaXMkMSk7XG4gICAgfVxuICB9XG4gIHZhciB0bXAgPSB0aGlzLmRlcElkcztcbiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkcztcbiAgdGhpcy5uZXdEZXBJZHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwSWRzLmNsZWFyKCk7XG4gIHRtcCA9IHRoaXMuZGVwcztcbiAgdGhpcy5kZXBzID0gdGhpcy5uZXdEZXBzO1xuICB0aGlzLm5ld0RlcHMgPSB0bXA7XG4gIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwO1xufTtcblxuLyoqXG4gKiBTdWJzY3JpYmVyIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIHdoZW4gYSBkZXBlbmRlbmN5IGNoYW5nZXMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0aGlzLmxhenkpIHtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfSBlbHNlIGlmICh0aGlzLnN5bmMpIHtcbiAgICB0aGlzLnJ1bigpO1xuICB9IGVsc2Uge1xuICAgIHF1ZXVlV2F0Y2hlcih0aGlzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTY2hlZHVsZXIgam9iIGludGVyZmFjZS5cbiAqIFdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBzY2hlZHVsZXIuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIHJ1biAoKSB7XG4gIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgIT09IHRoaXMudmFsdWUgfHxcbiAgICAgIC8vIERlZXAgd2F0Y2hlcnMgYW5kIHdhdGNoZXJzIG9uIE9iamVjdC9BcnJheXMgc2hvdWxkIGZpcmUgZXZlblxuICAgICAgLy8gd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGJlY2F1c2UgdGhlIHZhbHVlIG1heVxuICAgICAgLy8gaGF2ZSBtdXRhdGVkLlxuICAgICAgaXNPYmplY3QodmFsdWUpIHx8XG4gICAgICB0aGlzLmRlZXBcbiAgICApIHtcbiAgICAgIC8vIHNldCBuZXcgdmFsdWVcbiAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy51c2VyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jYi5jYWxsKHRoaXMudm0sIHZhbHVlLCBvbGRWYWx1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCB0aGlzLnZtLCAoXCJjYWxsYmFjayBmb3Igd2F0Y2hlciBcXFwiXCIgKyAodGhpcy5leHByZXNzaW9uKSArIFwiXFxcIlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgdmFsdWUgb2YgdGhlIHdhdGNoZXIuXG4gKiBUaGlzIG9ubHkgZ2V0cyBjYWxsZWQgZm9yIGxhenkgd2F0Y2hlcnMuXG4gKi9cbldhdGNoZXIucHJvdG90eXBlLmV2YWx1YXRlID0gZnVuY3Rpb24gZXZhbHVhdGUgKCkge1xuICB0aGlzLnZhbHVlID0gdGhpcy5nZXQoKTtcbiAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xufTtcblxuLyoqXG4gKiBEZXBlbmQgb24gYWxsIGRlcHMgY29sbGVjdGVkIGJ5IHRoaXMgd2F0Y2hlci5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gZGVwZW5kICgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICB2YXIgaSA9IHRoaXMuZGVwcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB0aGlzJDEuZGVwc1tpXS5kZXBlbmQoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZW1vdmUgc2VsZiBmcm9tIGFsbCBkZXBlbmRlbmNpZXMnIHN1YnNjcmliZXIgbGlzdC5cbiAqL1xuV2F0Y2hlci5wcm90b3R5cGUudGVhcmRvd24gPSBmdW5jdGlvbiB0ZWFyZG93biAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdFxuICAgIC8vIHRoaXMgaXMgYSBzb21ld2hhdCBleHBlbnNpdmUgb3BlcmF0aW9uIHNvIHdlIHNraXAgaXRcbiAgICAvLyBpZiB0aGUgdm0gaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgIGlmICghdGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZCkge1xuICAgICAgcmVtb3ZlKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKTtcbiAgICB9XG4gICAgdmFyIGkgPSB0aGlzLmRlcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHRoaXMkMS5kZXBzW2ldLnJlbW92ZVN1Yih0aGlzJDEpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIGFuIG9iamVjdCB0byBldm9rZSBhbGwgY29udmVydGVkXG4gKiBnZXR0ZXJzLCBzbyB0aGF0IGV2ZXJ5IG5lc3RlZCBwcm9wZXJ0eSBpbnNpZGUgdGhlIG9iamVjdFxuICogaXMgY29sbGVjdGVkIGFzIGEgXCJkZWVwXCIgZGVwZW5kZW5jeS5cbiAqL1xudmFyIHNlZW5PYmplY3RzID0gbmV3IF9TZXQoKTtcbmZ1bmN0aW9uIHRyYXZlcnNlICh2YWwpIHtcbiAgc2Vlbk9iamVjdHMuY2xlYXIoKTtcbiAgX3RyYXZlcnNlKHZhbCwgc2Vlbk9iamVjdHMpO1xufVxuXG5mdW5jdGlvbiBfdHJhdmVyc2UgKHZhbCwgc2Vlbikge1xuICB2YXIgaSwga2V5cztcbiAgdmFyIGlzQSA9IEFycmF5LmlzQXJyYXkodmFsKTtcbiAgaWYgKCghaXNBICYmICFpc09iamVjdCh2YWwpKSB8fCAhT2JqZWN0LmlzRXh0ZW5zaWJsZSh2YWwpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHZhbC5fX29iX18pIHtcbiAgICB2YXIgZGVwSWQgPSB2YWwuX19vYl9fLmRlcC5pZDtcbiAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2Vlbi5hZGQoZGVwSWQpO1xuICB9XG4gIGlmIChpc0EpIHtcbiAgICBpID0gdmFsLmxlbmd0aDtcbiAgICB3aGlsZSAoaS0tKSB7IF90cmF2ZXJzZSh2YWxbaV0sIHNlZW4pOyB9XG4gIH0gZWxzZSB7XG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgaSA9IGtleXMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHsgX3RyYXZlcnNlKHZhbFtrZXlzW2ldXSwgc2Vlbik7IH1cbiAgfVxufVxuXG4vKiAgKi9cblxudmFyIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbiA9IHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IG5vb3AsXG4gIHNldDogbm9vcFxufTtcblxuZnVuY3Rpb24gcHJveHkgKHRhcmdldCwgc291cmNlS2V5LCBrZXkpIHtcbiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLmdldCA9IGZ1bmN0aW9uIHByb3h5R2V0dGVyICgpIHtcbiAgICByZXR1cm4gdGhpc1tzb3VyY2VLZXldW2tleV1cbiAgfTtcbiAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHtcbiAgICB0aGlzW3NvdXJjZUtleV1ba2V5XSA9IHZhbDtcbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24pO1xufVxuXG5mdW5jdGlvbiBpbml0U3RhdGUgKHZtKSB7XG4gIHZtLl93YXRjaGVycyA9IFtdO1xuICB2YXIgb3B0cyA9IHZtLiRvcHRpb25zO1xuICBpZiAob3B0cy5wcm9wcykgeyBpbml0UHJvcHModm0sIG9wdHMucHJvcHMpOyB9XG4gIGlmIChvcHRzLm1ldGhvZHMpIHsgaW5pdE1ldGhvZHModm0sIG9wdHMubWV0aG9kcyk7IH1cbiAgaWYgKG9wdHMuZGF0YSkge1xuICAgIGluaXREYXRhKHZtKTtcbiAgfSBlbHNlIHtcbiAgICBvYnNlcnZlKHZtLl9kYXRhID0ge30sIHRydWUgLyogYXNSb290RGF0YSAqLyk7XG4gIH1cbiAgaWYgKG9wdHMuY29tcHV0ZWQpIHsgaW5pdENvbXB1dGVkKHZtLCBvcHRzLmNvbXB1dGVkKTsgfVxuICBpZiAob3B0cy53YXRjaCAmJiBvcHRzLndhdGNoICE9PSBuYXRpdmVXYXRjaCkge1xuICAgIGluaXRXYXRjaCh2bSwgb3B0cy53YXRjaCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tPcHRpb25UeXBlICh2bSwgbmFtZSkge1xuICB2YXIgb3B0aW9uID0gdm0uJG9wdGlvbnNbbmFtZV07XG4gIGlmICghaXNQbGFpbk9iamVjdChvcHRpb24pKSB7XG4gICAgd2FybihcbiAgICAgIChcImNvbXBvbmVudCBvcHRpb24gXFxcIlwiICsgbmFtZSArIFwiXFxcIiBzaG91bGQgYmUgYW4gb2JqZWN0LlwiKSxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMgKHZtLCBwcm9wc09wdGlvbnMpIHtcbiAgdmFyIHByb3BzRGF0YSA9IHZtLiRvcHRpb25zLnByb3BzRGF0YSB8fCB7fTtcbiAgdmFyIHByb3BzID0gdm0uX3Byb3BzID0ge307XG4gIC8vIGNhY2hlIHByb3Aga2V5cyBzbyB0aGF0IGZ1dHVyZSBwcm9wcyB1cGRhdGVzIGNhbiBpdGVyYXRlIHVzaW5nIEFycmF5XG4gIC8vIGluc3RlYWQgb2YgZHluYW1pYyBvYmplY3Qga2V5IGVudW1lcmF0aW9uLlxuICB2YXIga2V5cyA9IHZtLiRvcHRpb25zLl9wcm9wS2V5cyA9IFtdO1xuICB2YXIgaXNSb290ID0gIXZtLiRwYXJlbnQ7XG4gIC8vIHJvb3QgaW5zdGFuY2UgcHJvcHMgc2hvdWxkIGJlIGNvbnZlcnRlZFxuICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSBpc1Jvb3Q7XG4gIHZhciBsb29wID0gZnVuY3Rpb24gKCBrZXkgKSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gICAgdmFyIHZhbHVlID0gdmFsaWRhdGVQcm9wKGtleSwgcHJvcHNPcHRpb25zLCBwcm9wc0RhdGEsIHZtKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaXNSZXNlcnZlZEF0dHJpYnV0ZShrZXkpIHx8IGNvbmZpZy5pc1Jlc2VydmVkQXR0cihrZXkpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgKFwiXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGEgcmVzZXJ2ZWQgYXR0cmlidXRlIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBjb21wb25lbnQgcHJvcC5cIiksXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHByb3BzLCBrZXksIHZhbHVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh2bS4kcGFyZW50ICYmICFpc1VwZGF0aW5nQ2hpbGRDb21wb25lbnQpIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgXCJBdm9pZCBtdXRhdGluZyBhIHByb3AgZGlyZWN0bHkgc2luY2UgdGhlIHZhbHVlIHdpbGwgYmUgXCIgK1xuICAgICAgICAgICAgXCJvdmVyd3JpdHRlbiB3aGVuZXZlciB0aGUgcGFyZW50IGNvbXBvbmVudCByZS1yZW5kZXJzLiBcIiArXG4gICAgICAgICAgICBcIkluc3RlYWQsIHVzZSBhIGRhdGEgb3IgY29tcHV0ZWQgcHJvcGVydHkgYmFzZWQgb24gdGhlIHByb3AncyBcIiArXG4gICAgICAgICAgICBcInZhbHVlLiBQcm9wIGJlaW5nIG11dGF0ZWQ6IFxcXCJcIiArIGtleSArIFwiXFxcIlwiLFxuICAgICAgICAgICAgdm1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVmaW5lUmVhY3RpdmUkJDEocHJvcHMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvLyBzdGF0aWMgcHJvcHMgYXJlIGFscmVhZHkgcHJveGllZCBvbiB0aGUgY29tcG9uZW50J3MgcHJvdG90eXBlXG4gICAgLy8gZHVyaW5nIFZ1ZS5leHRlbmQoKS4gV2Ugb25seSBuZWVkIHRvIHByb3h5IHByb3BzIGRlZmluZWQgYXRcbiAgICAvLyBpbnN0YW50aWF0aW9uIGhlcmUuXG4gICAgaWYgKCEoa2V5IGluIHZtKSkge1xuICAgICAgcHJveHkodm0sIFwiX3Byb3BzXCIsIGtleSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGtleSBpbiBwcm9wc09wdGlvbnMpIGxvb3AoIGtleSApO1xuICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpbml0RGF0YSAodm0pIHtcbiAgdmFyIGRhdGEgPSB2bS4kb3B0aW9ucy5kYXRhO1xuICBkYXRhID0gdm0uX2RhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZ2V0RGF0YShkYXRhLCB2bSlcbiAgICA6IGRhdGEgfHwge307XG4gIGlmICghaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgIGRhdGEgPSB7fTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAnZGF0YSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBhbiBvYmplY3Q6XFxuJyArXG4gICAgICAnaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvY29tcG9uZW50cy5odG1sI2RhdGEtTXVzdC1CZS1hLUZ1bmN0aW9uJyxcbiAgICAgIHZtXG4gICAgKTtcbiAgfVxuICAvLyBwcm94eSBkYXRhIG9uIGluc3RhbmNlXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIHZhciBwcm9wcyA9IHZtLiRvcHRpb25zLnByb3BzO1xuICB2YXIgbWV0aG9kcyA9IHZtLiRvcHRpb25zLm1ldGhvZHM7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKG1ldGhvZHMgJiYgaGFzT3duKG1ldGhvZHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJtZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIGRhdGEgcHJvcGVydHkuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgXCJUaGUgZGF0YSBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgYWxyZWFkeSBkZWNsYXJlZCBhcyBhIHByb3AuIFwiICtcbiAgICAgICAgXCJVc2UgcHJvcCBkZWZhdWx0IHZhbHVlIGluc3RlYWQuXCIsXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQoa2V5KSkge1xuICAgICAgcHJveHkodm0sIFwiX2RhdGFcIiwga2V5KTtcbiAgICB9XG4gIH1cbiAgLy8gb2JzZXJ2ZSBkYXRhXG4gIG9ic2VydmUoZGF0YSwgdHJ1ZSAvKiBhc1Jvb3REYXRhICovKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YSAoZGF0YSwgdm0pIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGF0YS5jYWxsKHZtKVxuICB9IGNhdGNoIChlKSB7XG4gICAgaGFuZGxlRXJyb3IoZSwgdm0sIFwiZGF0YSgpXCIpO1xuICAgIHJldHVybiB7fVxuICB9XG59XG5cbnZhciBjb21wdXRlZFdhdGNoZXJPcHRpb25zID0geyBsYXp5OiB0cnVlIH07XG5cbmZ1bmN0aW9uIGluaXRDb21wdXRlZCAodm0sIGNvbXB1dGVkKSB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY2hlY2tPcHRpb25UeXBlKHZtLCAnY29tcHV0ZWQnKTtcbiAgdmFyIHdhdGNoZXJzID0gdm0uX2NvbXB1dGVkV2F0Y2hlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIGZvciAodmFyIGtleSBpbiBjb21wdXRlZCkge1xuICAgIHZhciB1c2VyRGVmID0gY29tcHV0ZWRba2V5XTtcbiAgICB2YXIgZ2V0dGVyID0gdHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicgPyB1c2VyRGVmIDogdXNlckRlZi5nZXQ7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZ2V0dGVyID09IG51bGwpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIChcIkdldHRlciBpcyBtaXNzaW5nIGZvciBjb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIuXCIpLFxuICAgICAgICB2bVxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gY3JlYXRlIGludGVybmFsIHdhdGNoZXIgZm9yIHRoZSBjb21wdXRlZCBwcm9wZXJ0eS5cbiAgICB3YXRjaGVyc1trZXldID0gbmV3IFdhdGNoZXIodm0sIGdldHRlciB8fCBub29wLCBub29wLCBjb21wdXRlZFdhdGNoZXJPcHRpb25zKTtcblxuICAgIC8vIGNvbXBvbmVudC1kZWZpbmVkIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIGFscmVhZHkgZGVmaW5lZCBvbiB0aGVcbiAgICAvLyBjb21wb25lbnQgcHJvdG90eXBlLiBXZSBvbmx5IG5lZWQgdG8gZGVmaW5lIGNvbXB1dGVkIHByb3BlcnRpZXMgZGVmaW5lZFxuICAgIC8vIGF0IGluc3RhbnRpYXRpb24gaGVyZS5cbiAgICBpZiAoIShrZXkgaW4gdm0pKSB7XG4gICAgICBkZWZpbmVDb21wdXRlZCh2bSwga2V5LCB1c2VyRGVmKTtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChrZXkgaW4gdm0uJGRhdGEpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBkYXRhLlwiKSwgdm0pO1xuICAgICAgfSBlbHNlIGlmICh2bS4kb3B0aW9ucy5wcm9wcyAmJiBrZXkgaW4gdm0uJG9wdGlvbnMucHJvcHMpIHtcbiAgICAgICAgd2FybigoXCJUaGUgY29tcHV0ZWQgcHJvcGVydHkgXFxcIlwiICsga2V5ICsgXCJcXFwiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIHByb3AuXCIpLCB2bSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZUNvbXB1dGVkICh0YXJnZXQsIGtleSwgdXNlckRlZikge1xuICBpZiAodHlwZW9mIHVzZXJEZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIoa2V5KTtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gbm9vcDtcbiAgfSBlbHNlIHtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uZ2V0ID0gdXNlckRlZi5nZXRcbiAgICAgID8gdXNlckRlZi5jYWNoZSAhPT0gZmFsc2VcbiAgICAgICAgPyBjcmVhdGVDb21wdXRlZEdldHRlcihrZXkpXG4gICAgICAgIDogdXNlckRlZi5nZXRcbiAgICAgIDogbm9vcDtcbiAgICBzaGFyZWRQcm9wZXJ0eURlZmluaXRpb24uc2V0ID0gdXNlckRlZi5zZXRcbiAgICAgID8gdXNlckRlZi5zZXRcbiAgICAgIDogbm9vcDtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uLnNldCA9PT0gbm9vcCkge1xuICAgIHNoYXJlZFByb3BlcnR5RGVmaW5pdGlvbi5zZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAoXCJDb21wdXRlZCBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgd2FzIGFzc2lnbmVkIHRvIGJ1dCBpdCBoYXMgbm8gc2V0dGVyLlwiKSxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc2hhcmVkUHJvcGVydHlEZWZpbml0aW9uKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29tcHV0ZWRHZXR0ZXIgKGtleSkge1xuICByZXR1cm4gZnVuY3Rpb24gY29tcHV0ZWRHZXR0ZXIgKCkge1xuICAgIHZhciB3YXRjaGVyID0gdGhpcy5fY29tcHV0ZWRXYXRjaGVycyAmJiB0aGlzLl9jb21wdXRlZFdhdGNoZXJzW2tleV07XG4gICAgaWYgKHdhdGNoZXIpIHtcbiAgICAgIGlmICh3YXRjaGVyLmRpcnR5KSB7XG4gICAgICAgIHdhdGNoZXIuZXZhbHVhdGUoKTtcbiAgICAgIH1cbiAgICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICAgIHdhdGNoZXIuZGVwZW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2F0Y2hlci52YWx1ZVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0TWV0aG9kcyAodm0sIG1ldGhvZHMpIHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBjaGVja09wdGlvblR5cGUodm0sICdtZXRob2RzJyk7XG4gIHZhciBwcm9wcyA9IHZtLiRvcHRpb25zLnByb3BzO1xuICBmb3IgKHZhciBrZXkgaW4gbWV0aG9kcykge1xuICAgIHZtW2tleV0gPSBtZXRob2RzW2tleV0gPT0gbnVsbCA/IG5vb3AgOiBiaW5kKG1ldGhvZHNba2V5XSwgdm0pO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAobWV0aG9kc1trZXldID09IG51bGwpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICBcIm1ldGhvZCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaGFzIGFuIHVuZGVmaW5lZCB2YWx1ZSBpbiB0aGUgY29tcG9uZW50IGRlZmluaXRpb24uIFwiICtcbiAgICAgICAgICBcIkRpZCB5b3UgcmVmZXJlbmNlIHRoZSBmdW5jdGlvbiBjb3JyZWN0bHk/XCIsXG4gICAgICAgICAgdm1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcyAmJiBoYXNPd24ocHJvcHMsIGtleSkpIHtcbiAgICAgICAgd2FybihcbiAgICAgICAgICAoXCJtZXRob2QgXFxcIlwiICsga2V5ICsgXCJcXFwiIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCBhcyBhIHByb3AuXCIpLFxuICAgICAgICAgIHZtXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRXYXRjaCAodm0sIHdhdGNoKSB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY2hlY2tPcHRpb25UeXBlKHZtLCAnd2F0Y2gnKTtcbiAgZm9yICh2YXIga2V5IGluIHdhdGNoKSB7XG4gICAgdmFyIGhhbmRsZXIgPSB3YXRjaFtrZXldO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXIpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY3JlYXRlV2F0Y2hlcih2bSwga2V5LCBoYW5kbGVyW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3JlYXRlV2F0Y2hlcih2bSwga2V5LCBoYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlV2F0Y2hlciAoXG4gIHZtLFxuICBrZXlPckZuLFxuICBoYW5kbGVyLFxuICBvcHRpb25zXG4pIHtcbiAgaWYgKGlzUGxhaW5PYmplY3QoaGFuZGxlcikpIHtcbiAgICBvcHRpb25zID0gaGFuZGxlcjtcbiAgICBoYW5kbGVyID0gaGFuZGxlci5oYW5kbGVyO1xuICB9XG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ3N0cmluZycpIHtcbiAgICBoYW5kbGVyID0gdm1baGFuZGxlcl07XG4gIH1cbiAgcmV0dXJuIHZtLiR3YXRjaChrZXlPckZuLCBoYW5kbGVyLCBvcHRpb25zKVxufVxuXG5mdW5jdGlvbiBzdGF0ZU1peGluIChWdWUpIHtcbiAgLy8gZmxvdyBzb21laG93IGhhcyBwcm9ibGVtcyB3aXRoIGRpcmVjdGx5IGRlY2xhcmVkIGRlZmluaXRpb24gb2JqZWN0XG4gIC8vIHdoZW4gdXNpbmcgT2JqZWN0LmRlZmluZVByb3BlcnR5LCBzbyB3ZSBoYXZlIHRvIHByb2NlZHVyYWxseSBidWlsZCB1cFxuICAvLyB0aGUgb2JqZWN0IGhlcmUuXG4gIHZhciBkYXRhRGVmID0ge307XG4gIGRhdGFEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGF0YSB9O1xuICB2YXIgcHJvcHNEZWYgPSB7fTtcbiAgcHJvcHNEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fcHJvcHMgfTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBkYXRhRGVmLnNldCA9IGZ1bmN0aW9uIChuZXdEYXRhKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAnQXZvaWQgcmVwbGFjaW5nIGluc3RhbmNlIHJvb3QgJGRhdGEuICcgK1xuICAgICAgICAnVXNlIG5lc3RlZCBkYXRhIHByb3BlcnRpZXMgaW5zdGVhZC4nLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgIH07XG4gICAgcHJvcHNEZWYuc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgd2FybihcIiRwcm9wcyBpcyByZWFkb25seS5cIiwgdGhpcyk7XG4gICAgfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwgJyRkYXRhJywgZGF0YURlZik7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShWdWUucHJvdG90eXBlLCAnJHByb3BzJywgcHJvcHNEZWYpO1xuXG4gIFZ1ZS5wcm90b3R5cGUuJHNldCA9IHNldDtcbiAgVnVlLnByb3RvdHlwZS4kZGVsZXRlID0gZGVsO1xuXG4gIFZ1ZS5wcm90b3R5cGUuJHdhdGNoID0gZnVuY3Rpb24gKFxuICAgIGV4cE9yRm4sXG4gICAgY2IsXG4gICAgb3B0aW9uc1xuICApIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIGlmIChpc1BsYWluT2JqZWN0KGNiKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZVdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKVxuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLnVzZXIgPSB0cnVlO1xuICAgIHZhciB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5pbW1lZGlhdGUpIHtcbiAgICAgIGNiLmNhbGwodm0sIHdhdGNoZXIudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gdW53YXRjaEZuICgpIHtcbiAgICAgIHdhdGNoZXIudGVhcmRvd24oKTtcbiAgICB9XG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0UHJvdmlkZSAodm0pIHtcbiAgdmFyIHByb3ZpZGUgPSB2bS4kb3B0aW9ucy5wcm92aWRlO1xuICBpZiAocHJvdmlkZSkge1xuICAgIHZtLl9wcm92aWRlZCA9IHR5cGVvZiBwcm92aWRlID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHByb3ZpZGUuY2FsbCh2bSlcbiAgICAgIDogcHJvdmlkZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0SW5qZWN0aW9ucyAodm0pIHtcbiAgdmFyIHJlc3VsdCA9IHJlc29sdmVJbmplY3Qodm0uJG9wdGlvbnMuaW5qZWN0LCB2bSk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBvYnNlcnZlclN0YXRlLnNob3VsZENvbnZlcnQgPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCBrZXksIHJlc3VsdFtrZXldLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgd2FybihcbiAgICAgICAgICAgIFwiQXZvaWQgbXV0YXRpbmcgYW4gaW5qZWN0ZWQgdmFsdWUgZGlyZWN0bHkgc2luY2UgdGhlIGNoYW5nZXMgd2lsbCBiZSBcIiArXG4gICAgICAgICAgICBcIm92ZXJ3cml0dGVuIHdoZW5ldmVyIHRoZSBwcm92aWRlZCBjb21wb25lbnQgcmUtcmVuZGVycy4gXCIgK1xuICAgICAgICAgICAgXCJpbmplY3Rpb24gYmVpbmcgbXV0YXRlZDogXFxcIlwiICsga2V5ICsgXCJcXFwiXCIsXG4gICAgICAgICAgICB2bVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sIGtleSwgcmVzdWx0W2tleV0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyU3RhdGUuc2hvdWxkQ29udmVydCA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUluamVjdCAoaW5qZWN0LCB2bSkge1xuICBpZiAoaW5qZWN0KSB7XG4gICAgLy8gaW5qZWN0IGlzIDphbnkgYmVjYXVzZSBmbG93IGlzIG5vdCBzbWFydCBlbm91Z2ggdG8gZmlndXJlIG91dCBjYWNoZWRcbiAgICB2YXIgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB2YXIga2V5cyA9IGhhc1N5bWJvbFxuICAgICAgICA/IFJlZmxlY3Qub3duS2V5cyhpbmplY3QpXG4gICAgICAgIDogT2JqZWN0LmtleXMoaW5qZWN0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgcHJvdmlkZUtleSA9IGluamVjdFtrZXldO1xuICAgICAgdmFyIHNvdXJjZSA9IHZtO1xuICAgICAgd2hpbGUgKHNvdXJjZSkge1xuICAgICAgICBpZiAoc291cmNlLl9wcm92aWRlZCAmJiBwcm92aWRlS2V5IGluIHNvdXJjZS5fcHJvdmlkZWQpIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHNvdXJjZS5fcHJvdmlkZWRbcHJvdmlkZUtleV07XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2UgPSBzb3VyY2UuJHBhcmVudDtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmICFzb3VyY2UpIHtcbiAgICAgICAgd2FybigoXCJJbmplY3Rpb24gXFxcIlwiICsga2V5ICsgXCJcXFwiIG5vdCBmb3VuZFwiKSwgdm0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uYWxDb21wb25lbnQgKFxuICBDdG9yLFxuICBwcm9wc0RhdGEsXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuXG4pIHtcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wT3B0aW9ucyA9IEN0b3Iub3B0aW9ucy5wcm9wcztcbiAgaWYgKGlzRGVmKHByb3BPcHRpb25zKSkge1xuICAgIGZvciAodmFyIGtleSBpbiBwcm9wT3B0aW9ucykge1xuICAgICAgcHJvcHNba2V5XSA9IHZhbGlkYXRlUHJvcChrZXksIHByb3BPcHRpb25zLCBwcm9wc0RhdGEgfHwge30pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNEZWYoZGF0YS5hdHRycykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5hdHRycyk7IH1cbiAgICBpZiAoaXNEZWYoZGF0YS5wcm9wcykpIHsgbWVyZ2VQcm9wcyhwcm9wcywgZGF0YS5wcm9wcyk7IH1cbiAgfVxuICAvLyBlbnN1cmUgdGhlIGNyZWF0ZUVsZW1lbnQgZnVuY3Rpb24gaW4gZnVuY3Rpb25hbCBjb21wb25lbnRzXG4gIC8vIGdldHMgYSB1bmlxdWUgY29udGV4dCAtIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0IG5hbWVkIHNsb3QgY2hlY2tcbiAgdmFyIF9jb250ZXh0ID0gT2JqZWN0LmNyZWF0ZShjb250ZXh0KTtcbiAgdmFyIGggPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudChfY29udGV4dCwgYSwgYiwgYywgZCwgdHJ1ZSk7IH07XG4gIHZhciB2bm9kZSA9IEN0b3Iub3B0aW9ucy5yZW5kZXIuY2FsbChudWxsLCBoLCB7XG4gICAgZGF0YTogZGF0YSxcbiAgICBwcm9wczogcHJvcHMsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgIHBhcmVudDogY29udGV4dCxcbiAgICBsaXN0ZW5lcnM6IGRhdGEub24gfHwge30sXG4gICAgaW5qZWN0aW9uczogcmVzb2x2ZUluamVjdChDdG9yLm9wdGlvbnMuaW5qZWN0LCBjb250ZXh0KSxcbiAgICBzbG90czogZnVuY3Rpb24gKCkgeyByZXR1cm4gcmVzb2x2ZVNsb3RzKGNoaWxkcmVuLCBjb250ZXh0KTsgfVxuICB9KTtcbiAgaWYgKHZub2RlIGluc3RhbmNlb2YgVk5vZGUpIHtcbiAgICB2bm9kZS5mdW5jdGlvbmFsQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgdm5vZGUuZnVuY3Rpb25hbE9wdGlvbnMgPSBDdG9yLm9wdGlvbnM7XG4gICAgaWYgKGRhdGEuc2xvdCkge1xuICAgICAgKHZub2RlLmRhdGEgfHwgKHZub2RlLmRhdGEgPSB7fSkpLnNsb3QgPSBkYXRhLnNsb3Q7XG4gICAgfVxuICB9XG4gIHJldHVybiB2bm9kZVxufVxuXG5mdW5jdGlvbiBtZXJnZVByb3BzICh0bywgZnJvbSkge1xuICBmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuICAgIHRvW2NhbWVsaXplKGtleSldID0gZnJvbVtrZXldO1xuICB9XG59XG5cbi8qICAqL1xuXG4vLyBob29rcyB0byBiZSBpbnZva2VkIG9uIGNvbXBvbmVudCBWTm9kZXMgZHVyaW5nIHBhdGNoXG52YXIgY29tcG9uZW50Vk5vZGVIb29rcyA9IHtcbiAgaW5pdDogZnVuY3Rpb24gaW5pdCAoXG4gICAgdm5vZGUsXG4gICAgaHlkcmF0aW5nLFxuICAgIHBhcmVudEVsbSxcbiAgICByZWZFbG1cbiAgKSB7XG4gICAgaWYgKCF2bm9kZS5jb21wb25lbnRJbnN0YW5jZSB8fCB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2VGb3JWbm9kZShcbiAgICAgICAgdm5vZGUsXG4gICAgICAgIGFjdGl2ZUluc3RhbmNlLFxuICAgICAgICBwYXJlbnRFbG0sXG4gICAgICAgIHJlZkVsbVxuICAgICAgKTtcbiAgICAgIGNoaWxkLiRtb3VudChoeWRyYXRpbmcgPyB2bm9kZS5lbG0gOiB1bmRlZmluZWQsIGh5ZHJhdGluZyk7XG4gICAgfSBlbHNlIGlmICh2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgLy8ga2VwdC1hbGl2ZSBjb21wb25lbnRzLCB0cmVhdCBhcyBhIHBhdGNoXG4gICAgICB2YXIgbW91bnRlZE5vZGUgPSB2bm9kZTsgLy8gd29yayBhcm91bmQgZmxvd1xuICAgICAgY29tcG9uZW50Vk5vZGVIb29rcy5wcmVwYXRjaChtb3VudGVkTm9kZSwgbW91bnRlZE5vZGUpO1xuICAgIH1cbiAgfSxcblxuICBwcmVwYXRjaDogZnVuY3Rpb24gcHJlcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSkge1xuICAgIHZhciBvcHRpb25zID0gdm5vZGUuY29tcG9uZW50T3B0aW9ucztcbiAgICB2YXIgY2hpbGQgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IG9sZFZub2RlLmNvbXBvbmVudEluc3RhbmNlO1xuICAgIHVwZGF0ZUNoaWxkQ29tcG9uZW50KFxuICAgICAgY2hpbGQsXG4gICAgICBvcHRpb25zLnByb3BzRGF0YSwgLy8gdXBkYXRlZCBwcm9wc1xuICAgICAgb3B0aW9ucy5saXN0ZW5lcnMsIC8vIHVwZGF0ZWQgbGlzdGVuZXJzXG4gICAgICB2bm9kZSwgLy8gbmV3IHBhcmVudCB2bm9kZVxuICAgICAgb3B0aW9ucy5jaGlsZHJlbiAvLyBuZXcgY2hpbGRyZW5cbiAgICApO1xuICB9LFxuXG4gIGluc2VydDogZnVuY3Rpb24gaW5zZXJ0ICh2bm9kZSkge1xuICAgIHZhciBjb250ZXh0ID0gdm5vZGUuY29udGV4dDtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQpIHtcbiAgICAgIGNvbXBvbmVudEluc3RhbmNlLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgY2FsbEhvb2soY29tcG9uZW50SW5zdGFuY2UsICdtb3VudGVkJyk7XG4gICAgfVxuICAgIGlmICh2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgaWYgKGNvbnRleHQuX2lzTW91bnRlZCkge1xuICAgICAgICAvLyB2dWUtcm91dGVyIzEyMTJcbiAgICAgICAgLy8gRHVyaW5nIHVwZGF0ZXMsIGEga2VwdC1hbGl2ZSBjb21wb25lbnQncyBjaGlsZCBjb21wb25lbnRzIG1heVxuICAgICAgICAvLyBjaGFuZ2UsIHNvIGRpcmVjdGx5IHdhbGtpbmcgdGhlIHRyZWUgaGVyZSBtYXkgY2FsbCBhY3RpdmF0ZWQgaG9va3NcbiAgICAgICAgLy8gb24gaW5jb3JyZWN0IGNoaWxkcmVuLiBJbnN0ZWFkIHdlIHB1c2ggdGhlbSBpbnRvIGEgcXVldWUgd2hpY2ggd2lsbFxuICAgICAgICAvLyBiZSBwcm9jZXNzZWQgYWZ0ZXIgdGhlIHdob2xlIHBhdGNoIHByb2Nlc3MgZW5kZWQuXG4gICAgICAgIHF1ZXVlQWN0aXZhdGVkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRlQ2hpbGRDb21wb25lbnQoY29tcG9uZW50SW5zdGFuY2UsIHRydWUgLyogZGlyZWN0ICovKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICBpZiAoIWNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCkge1xuICAgICAgaWYgKCF2bm9kZS5kYXRhLmtlZXBBbGl2ZSkge1xuICAgICAgICBjb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVhY3RpdmF0ZUNoaWxkQ29tcG9uZW50KGNvbXBvbmVudEluc3RhbmNlLCB0cnVlIC8qIGRpcmVjdCAqLyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG52YXIgaG9va3NUb01lcmdlID0gT2JqZWN0LmtleXMoY29tcG9uZW50Vk5vZGVIb29rcyk7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudCAoXG4gIEN0b3IsXG4gIGRhdGEsXG4gIGNvbnRleHQsXG4gIGNoaWxkcmVuLFxuICB0YWdcbikge1xuICBpZiAoaXNVbmRlZihDdG9yKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGJhc2VDdG9yID0gY29udGV4dC4kb3B0aW9ucy5fYmFzZTtcblxuICAvLyBwbGFpbiBvcHRpb25zIG9iamVjdDogdHVybiBpdCBpbnRvIGEgY29uc3RydWN0b3JcbiAgaWYgKGlzT2JqZWN0KEN0b3IpKSB7XG4gICAgQ3RvciA9IGJhc2VDdG9yLmV4dGVuZChDdG9yKTtcbiAgfVxuXG4gIC8vIGlmIGF0IHRoaXMgc3RhZ2UgaXQncyBub3QgYSBjb25zdHJ1Y3RvciBvciBhbiBhc3luYyBjb21wb25lbnQgZmFjdG9yeSxcbiAgLy8gcmVqZWN0LlxuICBpZiAodHlwZW9mIEN0b3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgd2FybigoXCJJbnZhbGlkIENvbXBvbmVudCBkZWZpbml0aW9uOiBcIiArIChTdHJpbmcoQ3RvcikpKSwgY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gYXN5bmMgY29tcG9uZW50XG4gIHZhciBhc3luY0ZhY3Rvcnk7XG4gIGlmIChpc1VuZGVmKEN0b3IuY2lkKSkge1xuICAgIGFzeW5jRmFjdG9yeSA9IEN0b3I7XG4gICAgQ3RvciA9IHJlc29sdmVBc3luY0NvbXBvbmVudChhc3luY0ZhY3RvcnksIGJhc2VDdG9yLCBjb250ZXh0KTtcbiAgICBpZiAoQ3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyByZXR1cm4gYSBwbGFjZWhvbGRlciBub2RlIGZvciBhc3luYyBjb21wb25lbnQsIHdoaWNoIGlzIHJlbmRlcmVkXG4gICAgICAvLyBhcyBhIGNvbW1lbnQgbm9kZSBidXQgcHJlc2VydmVzIGFsbCB0aGUgcmF3IGluZm9ybWF0aW9uIGZvciB0aGUgbm9kZS5cbiAgICAgIC8vIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHVzZWQgZm9yIGFzeW5jIHNlcnZlci1yZW5kZXJpbmcgYW5kIGh5ZHJhdGlvbi5cbiAgICAgIHJldHVybiBjcmVhdGVBc3luY1BsYWNlaG9sZGVyKFxuICAgICAgICBhc3luY0ZhY3RvcnksXG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICB0YWdcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBkYXRhID0gZGF0YSB8fCB7fTtcblxuICAvLyByZXNvbHZlIGNvbnN0cnVjdG9yIG9wdGlvbnMgaW4gY2FzZSBnbG9iYWwgbWl4aW5zIGFyZSBhcHBsaWVkIGFmdGVyXG4gIC8vIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBjcmVhdGlvblxuICByZXNvbHZlQ29uc3RydWN0b3JPcHRpb25zKEN0b3IpO1xuXG4gIC8vIHRyYW5zZm9ybSBjb21wb25lbnQgdi1tb2RlbCBkYXRhIGludG8gcHJvcHMgJiBldmVudHNcbiAgaWYgKGlzRGVmKGRhdGEubW9kZWwpKSB7XG4gICAgdHJhbnNmb3JtTW9kZWwoQ3Rvci5vcHRpb25zLCBkYXRhKTtcbiAgfVxuXG4gIC8vIGV4dHJhY3QgcHJvcHNcbiAgdmFyIHByb3BzRGF0YSA9IGV4dHJhY3RQcm9wc0Zyb21WTm9kZURhdGEoZGF0YSwgQ3RvciwgdGFnKTtcblxuICAvLyBmdW5jdGlvbmFsIGNvbXBvbmVudFxuICBpZiAoaXNUcnVlKEN0b3Iub3B0aW9ucy5mdW5jdGlvbmFsKSkge1xuICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbmFsQ29tcG9uZW50KEN0b3IsIHByb3BzRGF0YSwgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4pXG4gIH1cblxuICAvLyBleHRyYWN0IGxpc3RlbmVycywgc2luY2UgdGhlc2UgbmVlZHMgdG8gYmUgdHJlYXRlZCBhc1xuICAvLyBjaGlsZCBjb21wb25lbnQgbGlzdGVuZXJzIGluc3RlYWQgb2YgRE9NIGxpc3RlbmVyc1xuICB2YXIgbGlzdGVuZXJzID0gZGF0YS5vbjtcbiAgLy8gcmVwbGFjZSB3aXRoIGxpc3RlbmVycyB3aXRoIC5uYXRpdmUgbW9kaWZpZXJcbiAgLy8gc28gaXQgZ2V0cyBwcm9jZXNzZWQgZHVyaW5nIHBhcmVudCBjb21wb25lbnQgcGF0Y2guXG4gIGRhdGEub24gPSBkYXRhLm5hdGl2ZU9uO1xuXG4gIGlmIChpc1RydWUoQ3Rvci5vcHRpb25zLmFic3RyYWN0KSkge1xuICAgIC8vIGFic3RyYWN0IGNvbXBvbmVudHMgZG8gbm90IGtlZXAgYW55dGhpbmdcbiAgICAvLyBvdGhlciB0aGFuIHByb3BzICYgbGlzdGVuZXJzICYgc2xvdFxuXG4gICAgLy8gd29yayBhcm91bmQgZmxvd1xuICAgIHZhciBzbG90ID0gZGF0YS5zbG90O1xuICAgIGRhdGEgPSB7fTtcbiAgICBpZiAoc2xvdCkge1xuICAgICAgZGF0YS5zbG90ID0gc2xvdDtcbiAgICB9XG4gIH1cblxuICAvLyBtZXJnZSBjb21wb25lbnQgbWFuYWdlbWVudCBob29rcyBvbnRvIHRoZSBwbGFjZWhvbGRlciBub2RlXG4gIG1lcmdlSG9va3MoZGF0YSk7XG5cbiAgLy8gcmV0dXJuIGEgcGxhY2Vob2xkZXIgdm5vZGVcbiAgdmFyIG5hbWUgPSBDdG9yLm9wdGlvbnMubmFtZSB8fCB0YWc7XG4gIHZhciB2bm9kZSA9IG5ldyBWTm9kZShcbiAgICAoXCJ2dWUtY29tcG9uZW50LVwiICsgKEN0b3IuY2lkKSArIChuYW1lID8gKFwiLVwiICsgbmFtZSkgOiAnJykpLFxuICAgIGRhdGEsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbnRleHQsXG4gICAgeyBDdG9yOiBDdG9yLCBwcm9wc0RhdGE6IHByb3BzRGF0YSwgbGlzdGVuZXJzOiBsaXN0ZW5lcnMsIHRhZzogdGFnLCBjaGlsZHJlbjogY2hpbGRyZW4gfSxcbiAgICBhc3luY0ZhY3RvcnlcbiAgKTtcbiAgcmV0dXJuIHZub2RlXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlRm9yVm5vZGUgKFxuICB2bm9kZSwgLy8gd2Uga25vdyBpdCdzIE1vdW50ZWRDb21wb25lbnRWTm9kZSBidXQgZmxvdyBkb2Vzbid0XG4gIHBhcmVudCwgLy8gYWN0aXZlSW5zdGFuY2UgaW4gbGlmZWN5Y2xlIHN0YXRlXG4gIHBhcmVudEVsbSxcbiAgcmVmRWxtXG4pIHtcbiAgdmFyIHZub2RlQ29tcG9uZW50T3B0aW9ucyA9IHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIHZhciBvcHRpb25zID0ge1xuICAgIF9pc0NvbXBvbmVudDogdHJ1ZSxcbiAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICBwcm9wc0RhdGE6IHZub2RlQ29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEsXG4gICAgX2NvbXBvbmVudFRhZzogdm5vZGVDb21wb25lbnRPcHRpb25zLnRhZyxcbiAgICBfcGFyZW50Vm5vZGU6IHZub2RlLFxuICAgIF9wYXJlbnRMaXN0ZW5lcnM6IHZub2RlQ29tcG9uZW50T3B0aW9ucy5saXN0ZW5lcnMsXG4gICAgX3JlbmRlckNoaWxkcmVuOiB2bm9kZUNvbXBvbmVudE9wdGlvbnMuY2hpbGRyZW4sXG4gICAgX3BhcmVudEVsbTogcGFyZW50RWxtIHx8IG51bGwsXG4gICAgX3JlZkVsbTogcmVmRWxtIHx8IG51bGxcbiAgfTtcbiAgLy8gY2hlY2sgaW5saW5lLXRlbXBsYXRlIHJlbmRlciBmdW5jdGlvbnNcbiAgdmFyIGlubGluZVRlbXBsYXRlID0gdm5vZGUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtcbiAgaWYgKGlzRGVmKGlubGluZVRlbXBsYXRlKSkge1xuICAgIG9wdGlvbnMucmVuZGVyID0gaW5saW5lVGVtcGxhdGUucmVuZGVyO1xuICAgIG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zID0gaW5saW5lVGVtcGxhdGUuc3RhdGljUmVuZGVyRm5zO1xuICB9XG4gIHJldHVybiBuZXcgdm5vZGVDb21wb25lbnRPcHRpb25zLkN0b3Iob3B0aW9ucylcbn1cblxuZnVuY3Rpb24gbWVyZ2VIb29rcyAoZGF0YSkge1xuICBpZiAoIWRhdGEuaG9vaykge1xuICAgIGRhdGEuaG9vayA9IHt9O1xuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3NUb01lcmdlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IGhvb2tzVG9NZXJnZVtpXTtcbiAgICB2YXIgZnJvbVBhcmVudCA9IGRhdGEuaG9va1trZXldO1xuICAgIHZhciBvdXJzID0gY29tcG9uZW50Vk5vZGVIb29rc1trZXldO1xuICAgIGRhdGEuaG9va1trZXldID0gZnJvbVBhcmVudCA/IG1lcmdlSG9vayQxKG91cnMsIGZyb21QYXJlbnQpIDogb3VycztcbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJnZUhvb2skMSAob25lLCB0d28pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjLCBkKSB7XG4gICAgb25lKGEsIGIsIGMsIGQpO1xuICAgIHR3byhhLCBiLCBjLCBkKTtcbiAgfVxufVxuXG4vLyB0cmFuc2Zvcm0gY29tcG9uZW50IHYtbW9kZWwgaW5mbyAodmFsdWUgYW5kIGNhbGxiYWNrKSBpbnRvXG4vLyBwcm9wIGFuZCBldmVudCBoYW5kbGVyIHJlc3BlY3RpdmVseS5cbmZ1bmN0aW9uIHRyYW5zZm9ybU1vZGVsIChvcHRpb25zLCBkYXRhKSB7XG4gIHZhciBwcm9wID0gKG9wdGlvbnMubW9kZWwgJiYgb3B0aW9ucy5tb2RlbC5wcm9wKSB8fCAndmFsdWUnO1xuICB2YXIgZXZlbnQgPSAob3B0aW9ucy5tb2RlbCAmJiBvcHRpb25zLm1vZGVsLmV2ZW50KSB8fCAnaW5wdXQnOyhkYXRhLnByb3BzIHx8IChkYXRhLnByb3BzID0ge30pKVtwcm9wXSA9IGRhdGEubW9kZWwudmFsdWU7XG4gIHZhciBvbiA9IGRhdGEub24gfHwgKGRhdGEub24gPSB7fSk7XG4gIGlmIChpc0RlZihvbltldmVudF0pKSB7XG4gICAgb25bZXZlbnRdID0gW2RhdGEubW9kZWwuY2FsbGJhY2tdLmNvbmNhdChvbltldmVudF0pO1xuICB9IGVsc2Uge1xuICAgIG9uW2V2ZW50XSA9IGRhdGEubW9kZWwuY2FsbGJhY2s7XG4gIH1cbn1cblxuLyogICovXG5cbnZhciBTSU1QTEVfTk9STUFMSVpFID0gMTtcbnZhciBBTFdBWVNfTk9STUFMSVpFID0gMjtcblxuLy8gd3JhcHBlciBmdW5jdGlvbiBmb3IgcHJvdmlkaW5nIGEgbW9yZSBmbGV4aWJsZSBpbnRlcmZhY2Vcbi8vIHdpdGhvdXQgZ2V0dGluZyB5ZWxsZWQgYXQgYnkgZmxvd1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCAoXG4gIGNvbnRleHQsXG4gIHRhZyxcbiAgZGF0YSxcbiAgY2hpbGRyZW4sXG4gIG5vcm1hbGl6YXRpb25UeXBlLFxuICBhbHdheXNOb3JtYWxpemVcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSB8fCBpc1ByaW1pdGl2ZShkYXRhKSkge1xuICAgIG5vcm1hbGl6YXRpb25UeXBlID0gY2hpbGRyZW47XG4gICAgY2hpbGRyZW4gPSBkYXRhO1xuICAgIGRhdGEgPSB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKGlzVHJ1ZShhbHdheXNOb3JtYWxpemUpKSB7XG4gICAgbm9ybWFsaXphdGlvblR5cGUgPSBBTFdBWVNfTk9STUFMSVpFO1xuICB9XG4gIHJldHVybiBfY3JlYXRlRWxlbWVudChjb250ZXh0LCB0YWcsIGRhdGEsIGNoaWxkcmVuLCBub3JtYWxpemF0aW9uVHlwZSlcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnQgKFxuICBjb250ZXh0LFxuICB0YWcsXG4gIGRhdGEsXG4gIGNoaWxkcmVuLFxuICBub3JtYWxpemF0aW9uVHlwZVxuKSB7XG4gIGlmIChpc0RlZihkYXRhKSAmJiBpc0RlZigoZGF0YSkuX19vYl9fKSkge1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgIFwiQXZvaWQgdXNpbmcgb2JzZXJ2ZWQgZGF0YSBvYmplY3QgYXMgdm5vZGUgZGF0YTogXCIgKyAoSlNPTi5zdHJpbmdpZnkoZGF0YSkpICsgXCJcXG5cIiArXG4gICAgICAnQWx3YXlzIGNyZWF0ZSBmcmVzaCB2bm9kZSBkYXRhIG9iamVjdHMgaW4gZWFjaCByZW5kZXIhJyxcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyBvYmplY3Qgc3ludGF4IGluIHYtYmluZFxuICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoZGF0YS5pcykpIHtcbiAgICB0YWcgPSBkYXRhLmlzO1xuICB9XG4gIGlmICghdGFnKSB7XG4gICAgLy8gaW4gY2FzZSBvZiBjb21wb25lbnQgOmlzIHNldCB0byBmYWxzeSB2YWx1ZVxuICAgIHJldHVybiBjcmVhdGVFbXB0eVZOb2RlKClcbiAgfVxuICAvLyB3YXJuIGFnYWluc3Qgbm9uLXByaW1pdGl2ZSBrZXlcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICBpc0RlZihkYXRhKSAmJiBpc0RlZihkYXRhLmtleSkgJiYgIWlzUHJpbWl0aXZlKGRhdGEua2V5KVxuICApIHtcbiAgICB3YXJuKFxuICAgICAgJ0F2b2lkIHVzaW5nIG5vbi1wcmltaXRpdmUgdmFsdWUgYXMga2V5LCAnICtcbiAgICAgICd1c2Ugc3RyaW5nL251bWJlciB2YWx1ZSBpbnN0ZWFkLicsXG4gICAgICBjb250ZXh0XG4gICAgKTtcbiAgfVxuICAvLyBzdXBwb3J0IHNpbmdsZSBmdW5jdGlvbiBjaGlsZHJlbiBhcyBkZWZhdWx0IHNjb3BlZCBzbG90XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSAmJlxuICAgIHR5cGVvZiBjaGlsZHJlblswXSA9PT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICBkYXRhID0gZGF0YSB8fCB7fTtcbiAgICBkYXRhLnNjb3BlZFNsb3RzID0geyBkZWZhdWx0OiBjaGlsZHJlblswXSB9O1xuICAgIGNoaWxkcmVuLmxlbmd0aCA9IDA7XG4gIH1cbiAgaWYgKG5vcm1hbGl6YXRpb25UeXBlID09PSBBTFdBWVNfTk9STUFMSVpFKSB7XG4gICAgY2hpbGRyZW4gPSBub3JtYWxpemVDaGlsZHJlbihjaGlsZHJlbik7XG4gIH0gZWxzZSBpZiAobm9ybWFsaXphdGlvblR5cGUgPT09IFNJTVBMRV9OT1JNQUxJWkUpIHtcbiAgICBjaGlsZHJlbiA9IHNpbXBsZU5vcm1hbGl6ZUNoaWxkcmVuKGNoaWxkcmVuKTtcbiAgfVxuICB2YXIgdm5vZGUsIG5zO1xuICBpZiAodHlwZW9mIHRhZyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgQ3RvcjtcbiAgICBucyA9IGNvbmZpZy5nZXRUYWdOYW1lc3BhY2UodGFnKTtcbiAgICBpZiAoY29uZmlnLmlzUmVzZXJ2ZWRUYWcodGFnKSkge1xuICAgICAgLy8gcGxhdGZvcm0gYnVpbHQtaW4gZWxlbWVudHNcbiAgICAgIHZub2RlID0gbmV3IFZOb2RlKFxuICAgICAgICBjb25maWcucGFyc2VQbGF0Zm9ybVRhZ05hbWUodGFnKSwgZGF0YSwgY2hpbGRyZW4sXG4gICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNEZWYoQ3RvciA9IHJlc29sdmVBc3NldChjb250ZXh0LiRvcHRpb25zLCAnY29tcG9uZW50cycsIHRhZykpKSB7XG4gICAgICAvLyBjb21wb25lbnRcbiAgICAgIHZub2RlID0gY3JlYXRlQ29tcG9uZW50KEN0b3IsIGRhdGEsIGNvbnRleHQsIGNoaWxkcmVuLCB0YWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1bmtub3duIG9yIHVubGlzdGVkIG5hbWVzcGFjZWQgZWxlbWVudHNcbiAgICAgIC8vIGNoZWNrIGF0IHJ1bnRpbWUgYmVjYXVzZSBpdCBtYXkgZ2V0IGFzc2lnbmVkIGEgbmFtZXNwYWNlIHdoZW4gaXRzXG4gICAgICAvLyBwYXJlbnQgbm9ybWFsaXplcyBjaGlsZHJlblxuICAgICAgdm5vZGUgPSBuZXcgVk5vZGUoXG4gICAgICAgIHRhZywgZGF0YSwgY2hpbGRyZW4sXG4gICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb250ZXh0XG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBkaXJlY3QgY29tcG9uZW50IG9wdGlvbnMgLyBjb25zdHJ1Y3RvclxuICAgIHZub2RlID0gY3JlYXRlQ29tcG9uZW50KHRhZywgZGF0YSwgY29udGV4dCwgY2hpbGRyZW4pO1xuICB9XG4gIGlmIChpc0RlZih2bm9kZSkpIHtcbiAgICBpZiAobnMpIHsgYXBwbHlOUyh2bm9kZSwgbnMpOyB9XG4gICAgcmV0dXJuIHZub2RlXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVtcHR5Vk5vZGUoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5TlMgKHZub2RlLCBucykge1xuICB2bm9kZS5ucyA9IG5zO1xuICBpZiAodm5vZGUudGFnID09PSAnZm9yZWlnbk9iamVjdCcpIHtcbiAgICAvLyB1c2UgZGVmYXVsdCBuYW1lc3BhY2UgaW5zaWRlIGZvcmVpZ25PYmplY3RcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaXNEZWYodm5vZGUuY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSB2bm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IHZub2RlLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKGlzRGVmKGNoaWxkLnRhZykgJiYgaXNVbmRlZihjaGlsZC5ucykpIHtcbiAgICAgICAgYXBwbHlOUyhjaGlsZCwgbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKiAgKi9cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3IgcmVuZGVyaW5nIHYtZm9yIGxpc3RzLlxuICovXG5mdW5jdGlvbiByZW5kZXJMaXN0IChcbiAgdmFsLFxuICByZW5kZXJcbikge1xuICB2YXIgcmV0LCBpLCBsLCBrZXlzLCBrZXk7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkgfHwgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXQgPSBuZXcgQXJyYXkodmFsLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgbCA9IHZhbC5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IHJlbmRlcih2YWxbaV0sIGkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHJldCA9IG5ldyBBcnJheSh2YWwpO1xuICAgIGZvciAoaSA9IDA7IGkgPCB2YWw7IGkrKykge1xuICAgICAgcmV0W2ldID0gcmVuZGVyKGkgKyAxLCBpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSkge1xuICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgIHJldCA9IG5ldyBBcnJheShrZXlzLmxlbmd0aCk7XG4gICAgZm9yIChpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgcmV0W2ldID0gcmVuZGVyKHZhbFtrZXldLCBrZXksIGkpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNEZWYocmV0KSkge1xuICAgIChyZXQpLl9pc1ZMaXN0ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgPHNsb3Q+XG4gKi9cbmZ1bmN0aW9uIHJlbmRlclNsb3QgKFxuICBuYW1lLFxuICBmYWxsYmFjayxcbiAgcHJvcHMsXG4gIGJpbmRPYmplY3Rcbikge1xuICB2YXIgc2NvcGVkU2xvdEZuID0gdGhpcy4kc2NvcGVkU2xvdHNbbmFtZV07XG4gIGlmIChzY29wZWRTbG90Rm4pIHsgLy8gc2NvcGVkIHNsb3RcbiAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGlmIChiaW5kT2JqZWN0KSB7XG4gICAgICBwcm9wcyA9IGV4dGVuZChleHRlbmQoe30sIGJpbmRPYmplY3QpLCBwcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiBzY29wZWRTbG90Rm4ocHJvcHMpIHx8IGZhbGxiYWNrXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsb3ROb2RlcyA9IHRoaXMuJHNsb3RzW25hbWVdO1xuICAgIC8vIHdhcm4gZHVwbGljYXRlIHNsb3QgdXNhZ2VcbiAgICBpZiAoc2xvdE5vZGVzICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHNsb3ROb2Rlcy5fcmVuZGVyZWQgJiYgd2FybihcbiAgICAgICAgXCJEdXBsaWNhdGUgcHJlc2VuY2Ugb2Ygc2xvdCBcXFwiXCIgKyBuYW1lICsgXCJcXFwiIGZvdW5kIGluIHRoZSBzYW1lIHJlbmRlciB0cmVlIFwiICtcbiAgICAgICAgXCItIHRoaXMgd2lsbCBsaWtlbHkgY2F1c2UgcmVuZGVyIGVycm9ycy5cIixcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICAgIHNsb3ROb2Rlcy5fcmVuZGVyZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gc2xvdE5vZGVzIHx8IGZhbGxiYWNrXG4gIH1cbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIHJlc29sdmluZyBmaWx0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVGaWx0ZXIgKGlkKSB7XG4gIHJldHVybiByZXNvbHZlQXNzZXQodGhpcy4kb3B0aW9ucywgJ2ZpbHRlcnMnLCBpZCwgdHJ1ZSkgfHwgaWRlbnRpdHlcbn1cblxuLyogICovXG5cbi8qKlxuICogUnVudGltZSBoZWxwZXIgZm9yIGNoZWNraW5nIGtleUNvZGVzIGZyb20gY29uZmlnLlxuICovXG5mdW5jdGlvbiBjaGVja0tleUNvZGVzIChcbiAgZXZlbnRLZXlDb2RlLFxuICBrZXksXG4gIGJ1aWx0SW5BbGlhc1xuKSB7XG4gIHZhciBrZXlDb2RlcyA9IGNvbmZpZy5rZXlDb2Rlc1trZXldIHx8IGJ1aWx0SW5BbGlhcztcbiAgaWYgKEFycmF5LmlzQXJyYXkoa2V5Q29kZXMpKSB7XG4gICAgcmV0dXJuIGtleUNvZGVzLmluZGV4T2YoZXZlbnRLZXlDb2RlKSA9PT0gLTFcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ga2V5Q29kZXMgIT09IGV2ZW50S2V5Q29kZVxuICB9XG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciBtZXJnaW5nIHYtYmluZD1cIm9iamVjdFwiIGludG8gYSBWTm9kZSdzIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGJpbmRPYmplY3RQcm9wcyAoXG4gIGRhdGEsXG4gIHRhZyxcbiAgdmFsdWUsXG4gIGFzUHJvcCxcbiAgaXNTeW5jXG4pIHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgd2FybihcbiAgICAgICAgJ3YtYmluZCB3aXRob3V0IGFyZ3VtZW50IGV4cGVjdHMgYW4gT2JqZWN0IG9yIEFycmF5IHZhbHVlJyxcbiAgICAgICAgdGhpc1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdG9PYmplY3QodmFsdWUpO1xuICAgICAgfVxuICAgICAgdmFyIGhhc2g7XG4gICAgICB2YXIgbG9vcCA9IGZ1bmN0aW9uICgga2V5ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5ID09PSAnY2xhc3MnIHx8XG4gICAgICAgICAga2V5ID09PSAnc3R5bGUnIHx8XG4gICAgICAgICAgaXNSZXNlcnZlZEF0dHJpYnV0ZShrZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIGhhc2ggPSBkYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciB0eXBlID0gZGF0YS5hdHRycyAmJiBkYXRhLmF0dHJzLnR5cGU7XG4gICAgICAgICAgaGFzaCA9IGFzUHJvcCB8fCBjb25maWcubXVzdFVzZVByb3AodGFnLCB0eXBlLCBrZXkpXG4gICAgICAgICAgICA/IGRhdGEuZG9tUHJvcHMgfHwgKGRhdGEuZG9tUHJvcHMgPSB7fSlcbiAgICAgICAgICAgIDogZGF0YS5hdHRycyB8fCAoZGF0YS5hdHRycyA9IHt9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShrZXkgaW4gaGFzaCkpIHtcbiAgICAgICAgICBoYXNoW2tleV0gPSB2YWx1ZVtrZXldO1xuXG4gICAgICAgICAgaWYgKGlzU3luYykge1xuICAgICAgICAgICAgdmFyIG9uID0gZGF0YS5vbiB8fCAoZGF0YS5vbiA9IHt9KTtcbiAgICAgICAgICAgIG9uWyhcInVwZGF0ZTpcIiArIGtleSldID0gZnVuY3Rpb24gKCRldmVudCkge1xuICAgICAgICAgICAgICB2YWx1ZVtrZXldID0gJGV2ZW50O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgbG9vcCgga2V5ICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkYXRhXG59XG5cbi8qICAqL1xuXG4vKipcbiAqIFJ1bnRpbWUgaGVscGVyIGZvciByZW5kZXJpbmcgc3RhdGljIHRyZWVzLlxuICovXG5mdW5jdGlvbiByZW5kZXJTdGF0aWMgKFxuICBpbmRleCxcbiAgaXNJbkZvclxuKSB7XG4gIHZhciB0cmVlID0gdGhpcy5fc3RhdGljVHJlZXNbaW5kZXhdO1xuICAvLyBpZiBoYXMgYWxyZWFkeS1yZW5kZXJlZCBzdGF0aWMgdHJlZSBhbmQgbm90IGluc2lkZSB2LWZvcixcbiAgLy8gd2UgY2FuIHJldXNlIHRoZSBzYW1lIHRyZWUgYnkgZG9pbmcgYSBzaGFsbG93IGNsb25lLlxuICBpZiAodHJlZSAmJiAhaXNJbkZvcikge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHRyZWUpXG4gICAgICA/IGNsb25lVk5vZGVzKHRyZWUpXG4gICAgICA6IGNsb25lVk5vZGUodHJlZSlcbiAgfVxuICAvLyBvdGhlcndpc2UsIHJlbmRlciBhIGZyZXNoIHRyZWUuXG4gIHRyZWUgPSB0aGlzLl9zdGF0aWNUcmVlc1tpbmRleF0gPVxuICAgIHRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2luZGV4XS5jYWxsKHRoaXMuX3JlbmRlclByb3h5KTtcbiAgbWFya1N0YXRpYyh0cmVlLCAoXCJfX3N0YXRpY19fXCIgKyBpbmRleCksIGZhbHNlKTtcbiAgcmV0dXJuIHRyZWVcbn1cblxuLyoqXG4gKiBSdW50aW1lIGhlbHBlciBmb3Igdi1vbmNlLlxuICogRWZmZWN0aXZlbHkgaXQgbWVhbnMgbWFya2luZyB0aGUgbm9kZSBhcyBzdGF0aWMgd2l0aCBhIHVuaXF1ZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIG1hcmtPbmNlIChcbiAgdHJlZSxcbiAgaW5kZXgsXG4gIGtleVxuKSB7XG4gIG1hcmtTdGF0aWModHJlZSwgKFwiX19vbmNlX19cIiArIGluZGV4ICsgKGtleSA/IChcIl9cIiArIGtleSkgOiBcIlwiKSksIHRydWUpO1xuICByZXR1cm4gdHJlZVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhdGljIChcbiAgdHJlZSxcbiAga2V5LFxuICBpc09uY2Vcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheSh0cmVlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRyZWVbaV0gJiYgdHlwZW9mIHRyZWVbaV0gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1hcmtTdGF0aWNOb2RlKHRyZWVbaV0sIChrZXkgKyBcIl9cIiArIGkpLCBpc09uY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBtYXJrU3RhdGljTm9kZSh0cmVlLCBrZXksIGlzT25jZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFya1N0YXRpY05vZGUgKG5vZGUsIGtleSwgaXNPbmNlKSB7XG4gIG5vZGUuaXNTdGF0aWMgPSB0cnVlO1xuICBub2RlLmtleSA9IGtleTtcbiAgbm9kZS5pc09uY2UgPSBpc09uY2U7XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBiaW5kT2JqZWN0TGlzdGVuZXJzIChkYXRhLCB2YWx1ZSkge1xuICBpZiAodmFsdWUpIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIHdhcm4oXG4gICAgICAgICd2LW9uIHdpdGhvdXQgYXJndW1lbnQgZXhwZWN0cyBhbiBPYmplY3QgdmFsdWUnLFxuICAgICAgICB0aGlzXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgb24gPSBkYXRhLm9uID0gZGF0YS5vbiA/IGV4dGVuZCh7fSwgZGF0YS5vbikgOiB7fTtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICB2YXIgZXhpc3RpbmcgPSBvbltrZXldO1xuICAgICAgICB2YXIgb3VycyA9IHZhbHVlW2tleV07XG4gICAgICAgIG9uW2tleV0gPSBleGlzdGluZyA/IFtdLmNvbmNhdChvdXJzLCBleGlzdGluZykgOiBvdXJzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YVxufVxuXG4vKiAgKi9cblxuZnVuY3Rpb24gaW5pdFJlbmRlciAodm0pIHtcbiAgdm0uX3Zub2RlID0gbnVsbDsgLy8gdGhlIHJvb3Qgb2YgdGhlIGNoaWxkIHRyZWVcbiAgdm0uX3N0YXRpY1RyZWVzID0gbnVsbDtcbiAgdmFyIHBhcmVudFZub2RlID0gdm0uJHZub2RlID0gdm0uJG9wdGlvbnMuX3BhcmVudFZub2RlOyAvLyB0aGUgcGxhY2Vob2xkZXIgbm9kZSBpbiBwYXJlbnQgdHJlZVxuICB2YXIgcmVuZGVyQ29udGV4dCA9IHBhcmVudFZub2RlICYmIHBhcmVudFZub2RlLmNvbnRleHQ7XG4gIHZtLiRzbG90cyA9IHJlc29sdmVTbG90cyh2bS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW4sIHJlbmRlckNvbnRleHQpO1xuICB2bS4kc2NvcGVkU2xvdHMgPSBlbXB0eU9iamVjdDtcbiAgLy8gYmluZCB0aGUgY3JlYXRlRWxlbWVudCBmbiB0byB0aGlzIGluc3RhbmNlXG4gIC8vIHNvIHRoYXQgd2UgZ2V0IHByb3BlciByZW5kZXIgY29udGV4dCBpbnNpZGUgaXQuXG4gIC8vIGFyZ3Mgb3JkZXI6IHRhZywgZGF0YSwgY2hpbGRyZW4sIG5vcm1hbGl6YXRpb25UeXBlLCBhbHdheXNOb3JtYWxpemVcbiAgLy8gaW50ZXJuYWwgdmVyc2lvbiBpcyB1c2VkIGJ5IHJlbmRlciBmdW5jdGlvbnMgY29tcGlsZWQgZnJvbSB0ZW1wbGF0ZXNcbiAgdm0uX2MgPSBmdW5jdGlvbiAoYSwgYiwgYywgZCkgeyByZXR1cm4gY3JlYXRlRWxlbWVudCh2bSwgYSwgYiwgYywgZCwgZmFsc2UpOyB9O1xuICAvLyBub3JtYWxpemF0aW9uIGlzIGFsd2F5cyBhcHBsaWVkIGZvciB0aGUgcHVibGljIHZlcnNpb24sIHVzZWQgaW5cbiAgLy8gdXNlci13cml0dGVuIHJlbmRlciBmdW5jdGlvbnMuXG4gIHZtLiRjcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGEsIGIsIGMsIGQpIHsgcmV0dXJuIGNyZWF0ZUVsZW1lbnQodm0sIGEsIGIsIGMsIGQsIHRydWUpOyB9O1xuXG4gIC8vICRhdHRycyAmICRsaXN0ZW5lcnMgYXJlIGV4cG9zZWQgZm9yIGVhc2llciBIT0MgY3JlYXRpb24uXG4gIC8vIHRoZXkgbmVlZCB0byBiZSByZWFjdGl2ZSBzbyB0aGF0IEhPQ3MgdXNpbmcgdGhlbSBhcmUgYWx3YXlzIHVwZGF0ZWRcbiAgdmFyIHBhcmVudERhdGEgPSBwYXJlbnRWbm9kZSAmJiBwYXJlbnRWbm9kZS5kYXRhO1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGF0dHJzJywgcGFyZW50RGF0YSAmJiBwYXJlbnREYXRhLmF0dHJzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ICYmIHdhcm4oXCIkYXR0cnMgaXMgcmVhZG9ubHkuXCIsIHZtKTtcbiAgICB9LCB0cnVlKTtcbiAgICBkZWZpbmVSZWFjdGl2ZSQkMSh2bSwgJyRsaXN0ZW5lcnMnLCB2bS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAhaXNVcGRhdGluZ0NoaWxkQ29tcG9uZW50ICYmIHdhcm4oXCIkbGlzdGVuZXJzIGlzIHJlYWRvbmx5LlwiLCB2bSk7XG4gICAgfSwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgZGVmaW5lUmVhY3RpdmUkJDEodm0sICckYXR0cnMnLCBwYXJlbnREYXRhICYmIHBhcmVudERhdGEuYXR0cnMsIG51bGwsIHRydWUpO1xuICAgIGRlZmluZVJlYWN0aXZlJCQxKHZtLCAnJGxpc3RlbmVycycsIHZtLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnMsIG51bGwsIHRydWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlck1peGluIChWdWUpIHtcbiAgVnVlLnByb3RvdHlwZS4kbmV4dFRpY2sgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICByZXR1cm4gbmV4dFRpY2soZm4sIHRoaXMpXG4gIH07XG5cbiAgVnVlLnByb3RvdHlwZS5fcmVuZGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB2bSA9IHRoaXM7XG4gICAgdmFyIHJlZiA9IHZtLiRvcHRpb25zO1xuICAgIHZhciByZW5kZXIgPSByZWYucmVuZGVyO1xuICAgIHZhciBzdGF0aWNSZW5kZXJGbnMgPSByZWYuc3RhdGljUmVuZGVyRm5zO1xuICAgIHZhciBfcGFyZW50Vm5vZGUgPSByZWYuX3BhcmVudFZub2RlO1xuXG4gICAgaWYgKHZtLl9pc01vdW50ZWQpIHtcbiAgICAgIC8vIGNsb25lIHNsb3Qgbm9kZXMgb24gcmUtcmVuZGVyc1xuICAgICAgZm9yICh2YXIga2V5IGluIHZtLiRzbG90cykge1xuICAgICAgICB2bS4kc2xvdHNba2V5XSA9IGNsb25lVk5vZGVzKHZtLiRzbG90c1trZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2bS4kc2NvcGVkU2xvdHMgPSAoX3BhcmVudFZub2RlICYmIF9wYXJlbnRWbm9kZS5kYXRhLnNjb3BlZFNsb3RzKSB8fCBlbXB0eU9iamVjdDtcblxuICAgIGlmIChzdGF0aWNSZW5kZXJGbnMgJiYgIXZtLl9zdGF0aWNUcmVlcykge1xuICAgICAgdm0uX3N0YXRpY1RyZWVzID0gW107XG4gICAgfVxuICAgIC8vIHNldCBwYXJlbnQgdm5vZGUuIHRoaXMgYWxsb3dzIHJlbmRlciBmdW5jdGlvbnMgdG8gaGF2ZSBhY2Nlc3NcbiAgICAvLyB0byB0aGUgZGF0YSBvbiB0aGUgcGxhY2Vob2xkZXIgbm9kZS5cbiAgICB2bS4kdm5vZGUgPSBfcGFyZW50Vm5vZGU7XG4gICAgLy8gcmVuZGVyIHNlbGZcbiAgICB2YXIgdm5vZGU7XG4gICAgdHJ5IHtcbiAgICAgIHZub2RlID0gcmVuZGVyLmNhbGwodm0uX3JlbmRlclByb3h5LCB2bS4kY3JlYXRlRWxlbWVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaGFuZGxlRXJyb3IoZSwgdm0sIFwicmVuZGVyIGZ1bmN0aW9uXCIpO1xuICAgICAgLy8gcmV0dXJuIGVycm9yIHJlbmRlciByZXN1bHQsXG4gICAgICAvLyBvciBwcmV2aW91cyB2bm9kZSB0byBwcmV2ZW50IHJlbmRlciBlcnJvciBjYXVzaW5nIGJsYW5rIGNvbXBvbmVudFxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZub2RlID0gdm0uJG9wdGlvbnMucmVuZGVyRXJyb3JcbiAgICAgICAgICA/IHZtLiRvcHRpb25zLnJlbmRlckVycm9yLmNhbGwodm0uX3JlbmRlclByb3h5LCB2bS4kY3JlYXRlRWxlbWVudCwgZSlcbiAgICAgICAgICA6IHZtLl92bm9kZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlID0gdm0uX3Zub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyByZXR1cm4gZW1wdHkgdm5vZGUgaW4gY2FzZSB0aGUgcmVuZGVyIGZ1bmN0aW9uIGVycm9yZWQgb3V0XG4gICAgaWYgKCEodm5vZGUgaW5zdGFuY2VvZiBWTm9kZSkpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmIEFycmF5LmlzQXJyYXkodm5vZGUpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgJ011bHRpcGxlIHJvb3Qgbm9kZXMgcmV0dXJuZWQgZnJvbSByZW5kZXIgZnVuY3Rpb24uIFJlbmRlciBmdW5jdGlvbiAnICtcbiAgICAgICAgICAnc2hvdWxkIHJldHVybiBhIHNpbmdsZSByb290IG5vZGUuJyxcbiAgICAgICAgICB2bVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdm5vZGUgPSBjcmVhdGVFbXB0eVZOb2RlKCk7XG4gICAgfVxuICAgIC8vIHNldCBwYXJlbnRcbiAgICB2bm9kZS5wYXJlbnQgPSBfcGFyZW50Vm5vZGU7XG4gICAgcmV0dXJuIHZub2RlXG4gIH07XG5cbiAgLy8gaW50ZXJuYWwgcmVuZGVyIGhlbHBlcnMuXG4gIC8vIHRoZXNlIGFyZSBleHBvc2VkIG9uIHRoZSBpbnN0YW5jZSBwcm90b3R5cGUgdG8gcmVkdWNlIGdlbmVyYXRlZCByZW5kZXJcbiAgLy8gY29kZSBzaXplLlxuICBWdWUucHJvdG90eXBlLl9vID0gbWFya09uY2U7XG4gIFZ1ZS5wcm90b3R5cGUuX24gPSB0b051bWJlcjtcbiAgVnVlLnByb3RvdHlwZS5fcyA9IHRvU3RyaW5nO1xuICBWdWUucHJvdG90eXBlLl9sID0gcmVuZGVyTGlzdDtcbiAgVnVlLnByb3RvdHlwZS5fdCA9IHJlbmRlclNsb3Q7XG4gIFZ1ZS5wcm90b3R5cGUuX3EgPSBsb29zZUVxdWFsO1xuICBWdWUucHJvdG90eXBlLl9pID0gbG9vc2VJbmRleE9mO1xuICBWdWUucHJvdG90eXBlLl9tID0gcmVuZGVyU3RhdGljO1xuICBWdWUucHJvdG90eXBlLl9mID0gcmVzb2x2ZUZpbHRlcjtcbiAgVnVlLnByb3RvdHlwZS5fayA9IGNoZWNrS2V5Q29kZXM7XG4gIFZ1ZS5wcm90b3R5cGUuX2IgPSBiaW5kT2JqZWN0UHJvcHM7XG4gIFZ1ZS5wcm90b3R5cGUuX3YgPSBjcmVhdGVUZXh0Vk5vZGU7XG4gIFZ1ZS5wcm90b3R5cGUuX2UgPSBjcmVhdGVFbXB0eVZOb2RlO1xuICBWdWUucHJvdG90eXBlLl91ID0gcmVzb2x2ZVNjb3BlZFNsb3RzO1xuICBWdWUucHJvdG90eXBlLl9nID0gYmluZE9iamVjdExpc3RlbmVycztcbn1cblxuLyogICovXG5cbnZhciB1aWQgPSAwO1xuXG5mdW5jdGlvbiBpbml0TWl4aW4gKFZ1ZSkge1xuICBWdWUucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB2YXIgdm0gPSB0aGlzO1xuICAgIC8vIGEgdWlkXG4gICAgdm0uX3VpZCA9IHVpZCsrO1xuXG4gICAgdmFyIHN0YXJ0VGFnLCBlbmRUYWc7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHN0YXJ0VGFnID0gXCJ2dWUtcGVyZi1pbml0OlwiICsgKHZtLl91aWQpO1xuICAgICAgZW5kVGFnID0gXCJ2dWUtcGVyZi1lbmQ6XCIgKyAodm0uX3VpZCk7XG4gICAgICBtYXJrKHN0YXJ0VGFnKTtcbiAgICB9XG5cbiAgICAvLyBhIGZsYWcgdG8gYXZvaWQgdGhpcyBiZWluZyBvYnNlcnZlZFxuICAgIHZtLl9pc1Z1ZSA9IHRydWU7XG4gICAgLy8gbWVyZ2Ugb3B0aW9uc1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuX2lzQ29tcG9uZW50KSB7XG4gICAgICAvLyBvcHRpbWl6ZSBpbnRlcm5hbCBjb21wb25lbnQgaW5zdGFudGlhdGlvblxuICAgICAgLy8gc2luY2UgZHluYW1pYyBvcHRpb25zIG1lcmdpbmcgaXMgcHJldHR5IHNsb3csIGFuZCBub25lIG9mIHRoZVxuICAgICAgLy8gaW50ZXJuYWwgY29tcG9uZW50IG9wdGlvbnMgbmVlZHMgc3BlY2lhbCB0cmVhdG1lbnQuXG4gICAgICBpbml0SW50ZXJuYWxDb21wb25lbnQodm0sIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS4kb3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhcbiAgICAgICAgcmVzb2x2ZUNvbnN0cnVjdG9yT3B0aW9ucyh2bS5jb25zdHJ1Y3RvciksXG4gICAgICAgIG9wdGlvbnMgfHwge30sXG4gICAgICAgIHZtXG4gICAgICApO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpbml0UHJveHkodm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB2bS5fcmVuZGVyUHJveHkgPSB2bTtcbiAgICB9XG4gICAgLy8gZXhwb3NlIHJlYWwgc2VsZlxuICAgIHZtLl9zZWxmID0gdm07XG4gICAgaW5pdExpZmVjeWNsZSh2bSk7XG4gICAgaW5pdEV2ZW50cyh2bSk7XG4gICAgaW5pdFJlbmRlcih2bSk7XG4gICAgY2FsbEhvb2sodm0sICdiZWZvcmVDcmVhdGUnKTtcbiAgICBpbml0SW5qZWN0aW9ucyh2bSk7IC8vIHJlc29sdmUgaW5qZWN0aW9ucyBiZWZvcmUgZGF0YS9wcm9wc1xuICAgIGluaXRTdGF0ZSh2bSk7XG4gICAgaW5pdFByb3ZpZGUodm0pOyAvLyByZXNvbHZlIHByb3ZpZGUgYWZ0ZXIgZGF0YS9wcm9wc1xuICAgIGNhbGxIb29rKHZtLCAnY3JlYXRlZCcpO1xuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY29uZmlnLnBlcmZvcm1hbmNlICYmIG1hcmspIHtcbiAgICAgIHZtLl9uYW1lID0gZm9ybWF0Q29tcG9uZW50TmFtZSh2bSwgZmFsc2UpO1xuICAgICAgbWFyayhlbmRUYWcpO1xuICAgICAgbWVhc3VyZSgoKHZtLl9uYW1lKSArIFwiIGluaXRcIiksIHN0YXJ0VGFnLCBlbmRUYWcpO1xuICAgIH1cblxuICAgIGlmICh2bS4kb3B0aW9ucy5lbCkge1xuICAgICAgdm0uJG1vdW50KHZtLiRvcHRpb25zLmVsKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGluaXRJbnRlcm5hbENvbXBvbmVudCAodm0sIG9wdGlvbnMpIHtcbiAgdmFyIG9wdHMgPSB2bS4kb3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodm0uY29uc3RydWN0b3Iub3B0aW9ucyk7XG4gIC8vIGRvaW5nIHRoaXMgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuIGR5bmFtaWMgZW51bWVyYXRpb24uXG4gIG9wdHMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG4gIG9wdHMucHJvcHNEYXRhID0gb3B0aW9ucy5wcm9wc0RhdGE7XG4gIG9wdHMuX3BhcmVudFZub2RlID0gb3B0aW9ucy5fcGFyZW50Vm5vZGU7XG4gIG9wdHMuX3BhcmVudExpc3RlbmVycyA9IG9wdGlvbnMuX3BhcmVudExpc3RlbmVycztcbiAgb3B0cy5fcmVuZGVyQ2hpbGRyZW4gPSBvcHRpb25zLl9yZW5kZXJDaGlsZHJlbjtcbiAgb3B0cy5fY29tcG9uZW50VGFnID0gb3B0aW9ucy5fY29tcG9uZW50VGFnO1xuICBvcHRzLl9wYXJlbnRFbG0gPSBvcHRpb25zLl9wYXJlbnRFbG07XG4gIG9wdHMuX3JlZkVsbSA9IG9wdGlvbnMuX3JlZkVsbTtcbiAgaWYgKG9wdGlvbnMucmVuZGVyKSB7XG4gICAgb3B0cy5yZW5kZXIgPSBvcHRpb25zLnJlbmRlcjtcbiAgICBvcHRzLnN0YXRpY1JlbmRlckZucyA9IG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnM7XG4gIGlmIChDdG9yLnN1cGVyKSB7XG4gICAgdmFyIHN1cGVyT3B0aW9ucyA9IHJlc29sdmVDb25zdHJ1Y3Rvck9wdGlvbnMoQ3Rvci5zdXBlcik7XG4gICAgdmFyIGNhY2hlZFN1cGVyT3B0aW9ucyA9IEN0b3Iuc3VwZXJPcHRpb25zO1xuICAgIGlmIChzdXBlck9wdGlvbnMgIT09IGNhY2hlZFN1cGVyT3B0aW9ucykge1xuICAgICAgLy8gc3VwZXIgb3B0aW9uIGNoYW5nZWQsXG4gICAgICAvLyBuZWVkIHRvIHJlc29sdmUgbmV3IG9wdGlvbnMuXG4gICAgICBDdG9yLnN1cGVyT3B0aW9ucyA9IHN1cGVyT3B0aW9ucztcbiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbGF0ZS1tb2RpZmllZC9hdHRhY2hlZCBvcHRpb25zICgjNDk3NilcbiAgICAgIHZhciBtb2RpZmllZE9wdGlvbnMgPSByZXNvbHZlTW9kaWZpZWRPcHRpb25zKEN0b3IpO1xuICAgICAgLy8gdXBkYXRlIGJhc2UgZXh0ZW5kIG9wdGlvbnNcbiAgICAgIGlmIChtb2RpZmllZE9wdGlvbnMpIHtcbiAgICAgICAgZXh0ZW5kKEN0b3IuZXh0ZW5kT3B0aW9ucywgbW9kaWZpZWRPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIG9wdGlvbnMgPSBDdG9yLm9wdGlvbnMgPSBtZXJnZU9wdGlvbnMoc3VwZXJPcHRpb25zLCBDdG9yLmV4dGVuZE9wdGlvbnMpO1xuICAgICAgaWYgKG9wdGlvbnMubmFtZSkge1xuICAgICAgICBvcHRpb25zLmNvbXBvbmVudHNbb3B0aW9ucy5uYW1lXSA9IEN0b3I7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRpb25zXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNb2RpZmllZE9wdGlvbnMgKEN0b3IpIHtcbiAgdmFyIG1vZGlmaWVkO1xuICB2YXIgbGF0ZXN0ID0gQ3Rvci5vcHRpb25zO1xuICB2YXIgZXh0ZW5kZWQgPSBDdG9yLmV4dGVuZE9wdGlvbnM7XG4gIHZhciBzZWFsZWQgPSBDdG9yLnNlYWxlZE9wdGlvbnM7XG4gIGZvciAodmFyIGtleSBpbiBsYXRlc3QpIHtcbiAgICBpZiAobGF0ZXN0W2tleV0gIT09IHNlYWxlZFtrZXldKSB7XG4gICAgICBpZiAoIW1vZGlmaWVkKSB7IG1vZGlmaWVkID0ge307IH1cbiAgICAgIG1vZGlmaWVkW2tleV0gPSBkZWR1cGUobGF0ZXN0W2tleV0sIGV4dGVuZGVkW2tleV0sIHNlYWxlZFtrZXldKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1vZGlmaWVkXG59XG5cbmZ1bmN0aW9uIGRlZHVwZSAobGF0ZXN0LCBleHRlbmRlZCwgc2VhbGVkKSB7XG4gIC8vIGNvbXBhcmUgbGF0ZXN0IGFuZCBzZWFsZWQgdG8gZW5zdXJlIGxpZmVjeWNsZSBob29rcyB3b24ndCBiZSBkdXBsaWNhdGVkXG4gIC8vIGJldHdlZW4gbWVyZ2VzXG4gIGlmIChBcnJheS5pc0FycmF5KGxhdGVzdCkpIHtcbiAgICB2YXIgcmVzID0gW107XG4gICAgc2VhbGVkID0gQXJyYXkuaXNBcnJheShzZWFsZWQpID8gc2VhbGVkIDogW3NlYWxlZF07XG4gICAgZXh0ZW5kZWQgPSBBcnJheS5pc0FycmF5KGV4dGVuZGVkKSA/IGV4dGVuZGVkIDogW2V4dGVuZGVkXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhdGVzdC5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gcHVzaCBvcmlnaW5hbCBvcHRpb25zIGFuZCBub3Qgc2VhbGVkIG9wdGlvbnMgdG8gZXhjbHVkZSBkdXBsaWNhdGVkIG9wdGlvbnNcbiAgICAgIGlmIChleHRlbmRlZC5pbmRleE9mKGxhdGVzdFtpXSkgPj0gMCB8fCBzZWFsZWQuaW5kZXhPZihsYXRlc3RbaV0pIDwgMCkge1xuICAgICAgICByZXMucHVzaChsYXRlc3RbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxhdGVzdFxuICB9XG59XG5cbmZ1bmN0aW9uIFZ1ZSQyIChvcHRpb25zKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgISh0aGlzIGluc3RhbmNlb2YgVnVlJDIpXG4gICkge1xuICAgIHdhcm4oJ1Z1ZSBpcyBhIGNvbnN0cnVjdG9yIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQnKTtcbiAgfVxuICB0aGlzLl9pbml0KG9wdGlvbnMpO1xufVxuXG5pbml0TWl4aW4oVnVlJDIpO1xuc3RhdGVNaXhpbihWdWUkMik7XG5ldmVudHNNaXhpbihWdWUkMik7XG5saWZlY3ljbGVNaXhpbihWdWUkMik7XG5yZW5kZXJNaXhpbihWdWUkMik7XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0VXNlIChWdWUpIHtcbiAgVnVlLnVzZSA9IGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICB2YXIgaW5zdGFsbGVkUGx1Z2lucyA9ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zIHx8ICh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zID0gW10pKTtcbiAgICBpZiAoaW5zdGFsbGVkUGx1Z2lucy5pbmRleE9mKHBsdWdpbikgPiAtMSkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvLyBhZGRpdGlvbmFsIHBhcmFtZXRlcnNcbiAgICB2YXIgYXJncyA9IHRvQXJyYXkoYXJndW1lbnRzLCAxKTtcbiAgICBhcmdzLnVuc2hpZnQodGhpcyk7XG4gICAgaWYgKHR5cGVvZiBwbHVnaW4uaW5zdGFsbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcGx1Z2luLmluc3RhbGwuYXBwbHkocGx1Z2luLCBhcmdzKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwbHVnaW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBsdWdpbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9XG4gICAgaW5zdGFsbGVkUGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgcmV0dXJuIHRoaXNcbiAgfTtcbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRNaXhpbiQxIChWdWUpIHtcbiAgVnVlLm1peGluID0gZnVuY3Rpb24gKG1peGluKSB7XG4gICAgdGhpcy5vcHRpb25zID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucywgbWl4aW4pO1xuICAgIHJldHVybiB0aGlzXG4gIH07XG59XG5cbi8qICAqL1xuXG5mdW5jdGlvbiBpbml0RXh0ZW5kIChWdWUpIHtcbiAgLyoqXG4gICAqIEVhY2ggaW5zdGFuY2UgY29uc3RydWN0b3IsIGluY2x1ZGluZyBWdWUsIGhhcyBhIHVuaXF1ZVxuICAgKiBjaWQuIFRoaXMgZW5hYmxlcyB1cyB0byBjcmVhdGUgd3JhcHBlZCBcImNoaWxkXG4gICAqIGNvbnN0cnVjdG9yc1wiIGZvciBwcm90b3R5cGFsIGluaGVyaXRhbmNlIGFuZCBjYWNoZSB0aGVtLlxuICAgKi9cbiAgVnVlLmNpZCA9IDA7XG4gIHZhciBjaWQgPSAxO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBpbmhlcml0YW5jZVxuICAgKi9cbiAgVnVlLmV4dGVuZCA9IGZ1bmN0aW9uIChleHRlbmRPcHRpb25zKSB7XG4gICAgZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnMgfHwge307XG4gICAgdmFyIFN1cGVyID0gdGhpcztcbiAgICB2YXIgU3VwZXJJZCA9IFN1cGVyLmNpZDtcbiAgICB2YXIgY2FjaGVkQ3RvcnMgPSBleHRlbmRPcHRpb25zLl9DdG9yIHx8IChleHRlbmRPcHRpb25zLl9DdG9yID0ge30pO1xuICAgIGlmIChjYWNoZWRDdG9yc1tTdXBlcklkXSkge1xuICAgICAgcmV0dXJuIGNhY2hlZEN0b3JzW1N1cGVySWRdXG4gICAgfVxuXG4gICAgdmFyIG5hbWUgPSBleHRlbmRPcHRpb25zLm5hbWUgfHwgU3VwZXIub3B0aW9ucy5uYW1lO1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoIS9eW2EtekEtWl1bXFx3LV0qJC8udGVzdChuYW1lKSkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgICdJbnZhbGlkIGNvbXBvbmVudCBuYW1lOiBcIicgKyBuYW1lICsgJ1wiLiBDb21wb25lbnQgbmFtZXMgJyArXG4gICAgICAgICAgJ2NhbiBvbmx5IGNvbnRhaW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIHRoZSBoeXBoZW4sICcgK1xuICAgICAgICAgICdhbmQgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgU3ViID0gZnVuY3Rpb24gVnVlQ29tcG9uZW50IChvcHRpb25zKSB7XG4gICAgICB0aGlzLl9pbml0KG9wdGlvbnMpO1xuICAgIH07XG4gICAgU3ViLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU3VwZXIucHJvdG90eXBlKTtcbiAgICBTdWIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3ViO1xuICAgIFN1Yi5jaWQgPSBjaWQrKztcbiAgICBTdWIub3B0aW9ucyA9IG1lcmdlT3B0aW9ucyhcbiAgICAgIFN1cGVyLm9wdGlvbnMsXG4gICAgICBleHRlbmRPcHRpb25zXG4gICAgKTtcbiAgICBTdWJbJ3N1cGVyJ10gPSBTdXBlcjtcblxuICAgIC8vIEZvciBwcm9wcyBhbmQgY29tcHV0ZWQgcHJvcGVydGllcywgd2UgZGVmaW5lIHRoZSBwcm94eSBnZXR0ZXJzIG9uXG4gICAgLy8gdGhlIFZ1ZSBpbnN0YW5jZXMgYXQgZXh0ZW5zaW9uIHRpbWUsIG9uIHRoZSBleHRlbmRlZCBwcm90b3R5cGUuIFRoaXNcbiAgICAvLyBhdm9pZHMgT2JqZWN0LmRlZmluZVByb3BlcnR5IGNhbGxzIGZvciBlYWNoIGluc3RhbmNlIGNyZWF0ZWQuXG4gICAgaWYgKFN1Yi5vcHRpb25zLnByb3BzKSB7XG4gICAgICBpbml0UHJvcHMkMShTdWIpO1xuICAgIH1cbiAgICBpZiAoU3ViLm9wdGlvbnMuY29tcHV0ZWQpIHtcbiAgICAgIGluaXRDb21wdXRlZCQxKFN1Yik7XG4gICAgfVxuXG4gICAgLy8gYWxsb3cgZnVydGhlciBleHRlbnNpb24vbWl4aW4vcGx1Z2luIHVzYWdlXG4gICAgU3ViLmV4dGVuZCA9IFN1cGVyLmV4dGVuZDtcbiAgICBTdWIubWl4aW4gPSBTdXBlci5taXhpbjtcbiAgICBTdWIudXNlID0gU3VwZXIudXNlO1xuXG4gICAgLy8gY3JlYXRlIGFzc2V0IHJlZ2lzdGVycywgc28gZXh0ZW5kZWQgY2xhc3Nlc1xuICAgIC8vIGNhbiBoYXZlIHRoZWlyIHByaXZhdGUgYXNzZXRzIHRvby5cbiAgICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICBTdWJbdHlwZV0gPSBTdXBlclt0eXBlXTtcbiAgICB9KTtcbiAgICAvLyBlbmFibGUgcmVjdXJzaXZlIHNlbGYtbG9va3VwXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIFN1Yi5vcHRpb25zLmNvbXBvbmVudHNbbmFtZV0gPSBTdWI7XG4gICAgfVxuXG4gICAgLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgc3VwZXIgb3B0aW9ucyBhdCBleHRlbnNpb24gdGltZS5cbiAgICAvLyBsYXRlciBhdCBpbnN0YW50aWF0aW9uIHdlIGNhbiBjaGVjayBpZiBTdXBlcidzIG9wdGlvbnMgaGF2ZVxuICAgIC8vIGJlZW4gdXBkYXRlZC5cbiAgICBTdWIuc3VwZXJPcHRpb25zID0gU3VwZXIub3B0aW9ucztcbiAgICBTdWIuZXh0ZW5kT3B0aW9ucyA9IGV4dGVuZE9wdGlvbnM7XG4gICAgU3ViLnNlYWxlZE9wdGlvbnMgPSBleHRlbmQoe30sIFN1Yi5vcHRpb25zKTtcblxuICAgIC8vIGNhY2hlIGNvbnN0cnVjdG9yXG4gICAgY2FjaGVkQ3RvcnNbU3VwZXJJZF0gPSBTdWI7XG4gICAgcmV0dXJuIFN1YlxuICB9O1xufVxuXG5mdW5jdGlvbiBpbml0UHJvcHMkMSAoQ29tcCkge1xuICB2YXIgcHJvcHMgPSBDb21wLm9wdGlvbnMucHJvcHM7XG4gIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgIHByb3h5KENvbXAucHJvdG90eXBlLCBcIl9wcm9wc1wiLCBrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXRDb21wdXRlZCQxIChDb21wKSB7XG4gIHZhciBjb21wdXRlZCA9IENvbXAub3B0aW9ucy5jb21wdXRlZDtcbiAgZm9yICh2YXIga2V5IGluIGNvbXB1dGVkKSB7XG4gICAgZGVmaW5lQ29tcHV0ZWQoQ29tcC5wcm90b3R5cGUsIGtleSwgY29tcHV0ZWRba2V5XSk7XG4gIH1cbn1cblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRBc3NldFJlZ2lzdGVycyAoVnVlKSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYXNzZXQgcmVnaXN0cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBBU1NFVF9UWVBFUy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgVnVlW3R5cGVdID0gZnVuY3Rpb24gKFxuICAgICAgaWQsXG4gICAgICBkZWZpbml0aW9uXG4gICAgKSB7XG4gICAgICBpZiAoIWRlZmluaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1t0eXBlICsgJ3MnXVtpZF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGlmICh0eXBlID09PSAnY29tcG9uZW50JyAmJiBjb25maWcuaXNSZXNlcnZlZFRhZyhpZCkpIHtcbiAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICdEbyBub3QgdXNlIGJ1aWx0LWluIG9yIHJlc2VydmVkIEhUTUwgZWxlbWVudHMgYXMgY29tcG9uZW50ICcgK1xuICAgICAgICAgICAgICAnaWQ6ICcgKyBpZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdjb21wb25lbnQnICYmIGlzUGxhaW5PYmplY3QoZGVmaW5pdGlvbikpIHtcbiAgICAgICAgICBkZWZpbml0aW9uLm5hbWUgPSBkZWZpbml0aW9uLm5hbWUgfHwgaWQ7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHRoaXMub3B0aW9ucy5fYmFzZS5leHRlbmQoZGVmaW5pdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdkaXJlY3RpdmUnICYmIHR5cGVvZiBkZWZpbml0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZGVmaW5pdGlvbiA9IHsgYmluZDogZGVmaW5pdGlvbiwgdXBkYXRlOiBkZWZpbml0aW9uIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zW3R5cGUgKyAncyddW2lkXSA9IGRlZmluaXRpb247XG4gICAgICAgIHJldHVybiBkZWZpbml0aW9uXG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qICAqL1xuXG52YXIgcGF0dGVyblR5cGVzID0gW1N0cmluZywgUmVnRXhwLCBBcnJheV07XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUgKG9wdHMpIHtcbiAgcmV0dXJuIG9wdHMgJiYgKG9wdHMuQ3Rvci5vcHRpb25zLm5hbWUgfHwgb3B0cy50YWcpXG59XG5cbmZ1bmN0aW9uIG1hdGNoZXMgKHBhdHRlcm4sIG5hbWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0dGVybikpIHtcbiAgICByZXR1cm4gcGF0dGVybi5pbmRleE9mKG5hbWUpID4gLTFcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGF0dGVybi5zcGxpdCgnLCcpLmluZGV4T2YobmFtZSkgPiAtMVxuICB9IGVsc2UgaWYgKGlzUmVnRXhwKHBhdHRlcm4pKSB7XG4gICAgcmV0dXJuIHBhdHRlcm4udGVzdChuYW1lKVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBwcnVuZUNhY2hlIChjYWNoZSwgY3VycmVudCwgZmlsdGVyKSB7XG4gIGZvciAodmFyIGtleSBpbiBjYWNoZSkge1xuICAgIHZhciBjYWNoZWROb2RlID0gY2FjaGVba2V5XTtcbiAgICBpZiAoY2FjaGVkTm9kZSkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGNhY2hlZE5vZGUuY29tcG9uZW50T3B0aW9ucyk7XG4gICAgICBpZiAobmFtZSAmJiAhZmlsdGVyKG5hbWUpKSB7XG4gICAgICAgIGlmIChjYWNoZWROb2RlICE9PSBjdXJyZW50KSB7XG4gICAgICAgICAgcHJ1bmVDYWNoZUVudHJ5KGNhY2hlZE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhY2hlW2tleV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcnVuZUNhY2hlRW50cnkgKHZub2RlKSB7XG4gIGlmICh2bm9kZSkge1xuICAgIHZub2RlLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCk7XG4gIH1cbn1cblxudmFyIEtlZXBBbGl2ZSA9IHtcbiAgbmFtZTogJ2tlZXAtYWxpdmUnLFxuICBhYnN0cmFjdDogdHJ1ZSxcblxuICBwcm9wczoge1xuICAgIGluY2x1ZGU6IHBhdHRlcm5UeXBlcyxcbiAgICBleGNsdWRlOiBwYXR0ZXJuVHlwZXNcbiAgfSxcblxuICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkICgpIHtcbiAgICB0aGlzLmNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfSxcblxuICBkZXN0cm95ZWQ6IGZ1bmN0aW9uIGRlc3Ryb3llZCAoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcyQxLmNhY2hlKSB7XG4gICAgICBwcnVuZUNhY2hlRW50cnkodGhpcyQxLmNhY2hlW2tleV0pO1xuICAgIH1cbiAgfSxcblxuICB3YXRjaDoge1xuICAgIGluY2x1ZGU6IGZ1bmN0aW9uIGluY2x1ZGUgKHZhbCkge1xuICAgICAgcHJ1bmVDYWNoZSh0aGlzLmNhY2hlLCB0aGlzLl92bm9kZSwgZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIG1hdGNoZXModmFsLCBuYW1lKTsgfSk7XG4gICAgfSxcbiAgICBleGNsdWRlOiBmdW5jdGlvbiBleGNsdWRlICh2YWwpIHtcbiAgICAgIHBydW5lQ2FjaGUodGhpcy5jYWNoZSwgdGhpcy5fdm5vZGUsIGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiAhbWF0Y2hlcyh2YWwsIG5hbWUpOyB9KTtcbiAgICB9XG4gIH0sXG5cbiAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIgKCkge1xuICAgIHZhciB2bm9kZSA9IGdldEZpcnN0Q29tcG9uZW50Q2hpbGQodGhpcy4kc2xvdHMuZGVmYXVsdCk7XG4gICAgdmFyIGNvbXBvbmVudE9wdGlvbnMgPSB2bm9kZSAmJiB2bm9kZS5jb21wb25lbnRPcHRpb25zO1xuICAgIGlmIChjb21wb25lbnRPcHRpb25zKSB7XG4gICAgICAvLyBjaGVjayBwYXR0ZXJuXG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoY29tcG9uZW50T3B0aW9ucyk7XG4gICAgICBpZiAobmFtZSAmJiAoXG4gICAgICAgICh0aGlzLmluY2x1ZGUgJiYgIW1hdGNoZXModGhpcy5pbmNsdWRlLCBuYW1lKSkgfHxcbiAgICAgICAgKHRoaXMuZXhjbHVkZSAmJiBtYXRjaGVzKHRoaXMuZXhjbHVkZSwgbmFtZSkpXG4gICAgICApKSB7XG4gICAgICAgIHJldHVybiB2bm9kZVxuICAgICAgfVxuICAgICAgdmFyIGtleSA9IHZub2RlLmtleSA9PSBudWxsXG4gICAgICAgIC8vIHNhbWUgY29uc3RydWN0b3IgbWF5IGdldCByZWdpc3RlcmVkIGFzIGRpZmZlcmVudCBsb2NhbCBjb21wb25lbnRzXG4gICAgICAgIC8vIHNvIGNpZCBhbG9uZSBpcyBub3QgZW5vdWdoICgjMzI2OSlcbiAgICAgICAgPyBjb21wb25lbnRPcHRpb25zLkN0b3IuY2lkICsgKGNvbXBvbmVudE9wdGlvbnMudGFnID8gKFwiOjpcIiArIChjb21wb25lbnRPcHRpb25zLnRhZykpIDogJycpXG4gICAgICAgIDogdm5vZGUua2V5O1xuICAgICAgaWYgKHRoaXMuY2FjaGVba2V5XSkge1xuICAgICAgICB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuY2FjaGVba2V5XS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2FjaGVba2V5XSA9IHZub2RlO1xuICAgICAgfVxuICAgICAgdm5vZGUuZGF0YS5rZWVwQWxpdmUgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdm5vZGVcbiAgfVxufTtcblxudmFyIGJ1aWx0SW5Db21wb25lbnRzID0ge1xuICBLZWVwQWxpdmU6IEtlZXBBbGl2ZVxufTtcblxuLyogICovXG5cbmZ1bmN0aW9uIGluaXRHbG9iYWxBUEkgKFZ1ZSkge1xuICAvLyBjb25maWdcbiAgdmFyIGNvbmZpZ0RlZiA9IHt9O1xuICBjb25maWdEZWYuZ2V0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gY29uZmlnOyB9O1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbmZpZ0RlZi5zZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuKFxuICAgICAgICAnRG8gbm90IHJlcGxhY2UgdGhlIFZ1ZS5jb25maWcgb2JqZWN0LCBzZXQgaW5kaXZpZHVhbCBmaWVsZHMgaW5zdGVhZC4nXG4gICAgICApO1xuICAgIH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSwgJ2NvbmZpZycsIGNvbmZpZ0RlZik7XG5cbiAgLy8gZXhwb3NlZCB1dGlsIG1ldGhvZHMuXG4gIC8vIE5PVEU6IHRoZXNlIGFyZSBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIC0gYXZvaWQgcmVseWluZyBvblxuICAvLyB0aGVtIHVubGVzcyB5b3UgYXJlIGF3YXJlIG9mIHRoZSByaXNrLlxuICBWdWUudXRpbCA9IHtcbiAgICB3YXJuOiB3YXJuLFxuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIG1lcmdlT3B0aW9uczogbWVyZ2VPcHRpb25zLFxuICAgIGRlZmluZVJlYWN0aXZlOiBkZWZpbmVSZWFjdGl2ZSQkMVxuICB9O1xuXG4gIFZ1ZS5zZXQgPSBzZXQ7XG4gIFZ1ZS5kZWxldGUgPSBkZWw7XG4gIFZ1ZS5uZXh0VGljayA9IG5leHRUaWNrO1xuXG4gIFZ1ZS5vcHRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgQVNTRVRfVFlQRVMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSkge1xuICAgIFZ1ZS5vcHRpb25zW3R5cGUgKyAncyddID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfSk7XG5cbiAgLy8gdGhpcyBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBcImJhc2VcIiBjb25zdHJ1Y3RvciB0byBleHRlbmQgYWxsIHBsYWluLW9iamVjdFxuICAvLyBjb21wb25lbnRzIHdpdGggaW4gV2VleCdzIG11bHRpLWluc3RhbmNlIHNjZW5hcmlvcy5cbiAgVnVlLm9wdGlvbnMuX2Jhc2UgPSBWdWU7XG5cbiAgZXh0ZW5kKFZ1ZS5vcHRpb25zLmNvbXBvbmVudHMsIGJ1aWx0SW5Db21wb25lbnRzKTtcblxuICBpbml0VXNlKFZ1ZSk7XG4gIGluaXRNaXhpbiQxKFZ1ZSk7XG4gIGluaXRFeHRlbmQoVnVlKTtcbiAgaW5pdEFzc2V0UmVnaXN0ZXJzKFZ1ZSk7XG59XG5cbmluaXRHbG9iYWxBUEkoVnVlJDIpO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlJDIucHJvdG90eXBlLCAnJGlzU2VydmVyJywge1xuICBnZXQ6IGlzU2VydmVyUmVuZGVyaW5nXG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZ1ZSQyLnByb3RvdHlwZSwgJyRzc3JDb250ZXh0Jywge1xuICBnZXQ6IGZ1bmN0aW9uIGdldCAoKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdGhpcy4kdm5vZGUgJiYgdGhpcy4kdm5vZGUuc3NyQ29udGV4dFxuICB9XG59KTtcblxuVnVlJDIudmVyc2lvbiA9ICcyLjQuMic7XG5cbi8qIGdsb2JhbHMgcmVuZGVyZXIgKi9cbi8vIHJlbmRlcmVyIGlzIGluamVjdGVkIGJ5IHdlZXggZmFjdG9yeSB3cmFwcGVyXG5cbnZhciBuYW1lc3BhY2VNYXAgPSB7fTtcblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCQxICh0YWdOYW1lKSB7XG4gIHJldHVybiBuZXcgcmVuZGVyZXIuRWxlbWVudCh0YWdOYW1lKVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50TlMgKG5hbWVzcGFjZSwgdGFnTmFtZSkge1xuICByZXR1cm4gbmV3IHJlbmRlcmVyLkVsZW1lbnQobmFtZXNwYWNlICsgJzonICsgdGFnTmFtZSlcbn1cblxuZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUgKHRleHQpIHtcbiAgcmV0dXJuIG5ldyByZW5kZXJlci5UZXh0Tm9kZSh0ZXh0KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21tZW50ICh0ZXh0KSB7XG4gIHJldHVybiBuZXcgcmVuZGVyZXIuQ29tbWVudCh0ZXh0KVxufVxuXG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUgKG5vZGUsIHRhcmdldCwgYmVmb3JlKSB7XG4gIGlmICh0YXJnZXQubm9kZVR5cGUgPT09IDMpIHtcbiAgICBpZiAobm9kZS50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIG5vZGUuc2V0QXR0cigndmFsdWUnLCB0YXJnZXQudGV4dCk7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0ZXh0ID0gY3JlYXRlRWxlbWVudCQxKCd0ZXh0Jyk7XG4gICAgICB0ZXh0LnNldEF0dHIoJ3ZhbHVlJywgdGFyZ2V0LnRleHQpO1xuICAgICAgbm9kZS5pbnNlcnRCZWZvcmUodGV4dCwgYmVmb3JlKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgbm9kZS5pbnNlcnRCZWZvcmUodGFyZ2V0LCBiZWZvcmUpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZCAobm9kZSwgY2hpbGQpIHtcbiAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAzKSB7XG4gICAgbm9kZS5zZXRBdHRyKCd2YWx1ZScsICcnKTtcbiAgICByZXR1cm5cbiAgfVxuICBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kQ2hpbGQgKG5vZGUsIGNoaWxkKSB7XG4gIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgIGlmIChub2RlLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgbm9kZS5zZXRBdHRyKCd2YWx1ZScsIGNoaWxkLnRleHQpO1xuICAgICAgY2hpbGQucGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0ZXh0ID0gY3JlYXRlRWxlbWVudCQxKCd0ZXh0Jyk7XG4gICAgICB0ZXh0LnNldEF0dHIoJ3ZhbHVlJywgY2hpbGQudGV4dCk7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHRleHQpO1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIG5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQpO1xufVxuXG5mdW5jdGlvbiBwYXJlbnROb2RlIChub2RlKSB7XG4gIHJldHVybiBub2RlLnBhcmVudE5vZGVcbn1cblxuZnVuY3Rpb24gbmV4dFNpYmxpbmcgKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmdcbn1cblxuZnVuY3Rpb24gdGFnTmFtZSAobm9kZSkge1xuICByZXR1cm4gbm9kZS50eXBlXG59XG5cbmZ1bmN0aW9uIHNldFRleHRDb250ZW50IChub2RlLCB0ZXh0KSB7XG4gIG5vZGUucGFyZW50Tm9kZS5zZXRBdHRyKCd2YWx1ZScsIHRleHQpO1xufVxuXG5mdW5jdGlvbiBzZXRBdHRyaWJ1dGUgKG5vZGUsIGtleSwgdmFsKSB7XG4gIG5vZGUuc2V0QXR0cihrZXksIHZhbCk7XG59XG5cblxudmFyIG5vZGVPcHMgPSBPYmplY3QuZnJlZXplKHtcblx0bmFtZXNwYWNlTWFwOiBuYW1lc3BhY2VNYXAsXG5cdGNyZWF0ZUVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnQkMSxcblx0Y3JlYXRlRWxlbWVudE5TOiBjcmVhdGVFbGVtZW50TlMsXG5cdGNyZWF0ZVRleHROb2RlOiBjcmVhdGVUZXh0Tm9kZSxcblx0Y3JlYXRlQ29tbWVudDogY3JlYXRlQ29tbWVudCxcblx0aW5zZXJ0QmVmb3JlOiBpbnNlcnRCZWZvcmUsXG5cdHJlbW92ZUNoaWxkOiByZW1vdmVDaGlsZCxcblx0YXBwZW5kQ2hpbGQ6IGFwcGVuZENoaWxkLFxuXHRwYXJlbnROb2RlOiBwYXJlbnROb2RlLFxuXHRuZXh0U2libGluZzogbmV4dFNpYmxpbmcsXG5cdHRhZ05hbWU6IHRhZ05hbWUsXG5cdHNldFRleHRDb250ZW50OiBzZXRUZXh0Q29udGVudCxcblx0c2V0QXR0cmlidXRlOiBzZXRBdHRyaWJ1dGVcbn0pO1xuXG4vKiAgKi9cblxudmFyIHJlZiA9IHtcbiAgY3JlYXRlOiBmdW5jdGlvbiBjcmVhdGUgKF8sIHZub2RlKSB7XG4gICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICB9LFxuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSAob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgaWYgKG9sZFZub2RlLmRhdGEucmVmICE9PSB2bm9kZS5kYXRhLnJlZikge1xuICAgICAgcmVnaXN0ZXJSZWYob2xkVm5vZGUsIHRydWUpO1xuICAgICAgcmVnaXN0ZXJSZWYodm5vZGUpO1xuICAgIH1cbiAgfSxcbiAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSAodm5vZGUpIHtcbiAgICByZWdpc3RlclJlZih2bm9kZSwgdHJ1ZSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUmVmICh2bm9kZSwgaXNSZW1vdmFsKSB7XG4gIHZhciBrZXkgPSB2bm9kZS5kYXRhLnJlZjtcbiAgaWYgKCFrZXkpIHsgcmV0dXJuIH1cblxuICB2YXIgdm0gPSB2bm9kZS5jb250ZXh0O1xuICB2YXIgcmVmID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgfHwgdm5vZGUuZWxtO1xuICB2YXIgcmVmcyA9IHZtLiRyZWZzO1xuICBpZiAoaXNSZW1vdmFsKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVmc1trZXldKSkge1xuICAgICAgcmVtb3ZlKHJlZnNba2V5XSwgcmVmKTtcbiAgICB9IGVsc2UgaWYgKHJlZnNba2V5XSA9PT0gcmVmKSB7XG4gICAgICByZWZzW2tleV0gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICh2bm9kZS5kYXRhLnJlZkluRm9yKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVmc1trZXldKSkge1xuICAgICAgICByZWZzW2tleV0gPSBbcmVmXTtcbiAgICAgIH0gZWxzZSBpZiAocmVmc1trZXldLmluZGV4T2YocmVmKSA8IDApIHtcbiAgICAgICAgLy8gJGZsb3ctZGlzYWJsZS1saW5lXG4gICAgICAgIHJlZnNba2V5XS5wdXNoKHJlZik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZnNba2V5XSA9IHJlZjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWaXJ0dWFsIERPTSBwYXRjaGluZyBhbGdvcml0aG0gYmFzZWQgb24gU25hYmJkb20gYnlcbiAqIFNpbW9uIEZyaWlzIFZpbmR1bSAoQHBhbGRlcGluZClcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZVxuICogaHR0cHM6Ly9naXRodWIuY29tL3BhbGRlcGluZC9zbmFiYmRvbS9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKlxuICogbW9kaWZpZWQgYnkgRXZhbiBZb3UgKEB5eXg5OTA4MDMpXG4gKlxuXG4vKlxuICogTm90IHR5cGUtY2hlY2tpbmcgdGhpcyBiZWNhdXNlIHRoaXMgZmlsZSBpcyBwZXJmLWNyaXRpY2FsIGFuZCB0aGUgY29zdFxuICogb2YgbWFraW5nIGZsb3cgdW5kZXJzdGFuZCBpdCBpcyBub3Qgd29ydGggaXQuXG4gKi9cblxudmFyIGVtcHR5Tm9kZSA9IG5ldyBWTm9kZSgnJywge30sIFtdKTtcblxudmFyIGhvb2tzID0gWydjcmVhdGUnLCAnYWN0aXZhdGUnLCAndXBkYXRlJywgJ3JlbW92ZScsICdkZXN0cm95J107XG5cbmZ1bmN0aW9uIHNhbWVWbm9kZSAoYSwgYikge1xuICByZXR1cm4gKFxuICAgIGEua2V5ID09PSBiLmtleSAmJiAoXG4gICAgICAoXG4gICAgICAgIGEudGFnID09PSBiLnRhZyAmJlxuICAgICAgICBhLmlzQ29tbWVudCA9PT0gYi5pc0NvbW1lbnQgJiZcbiAgICAgICAgaXNEZWYoYS5kYXRhKSA9PT0gaXNEZWYoYi5kYXRhKSAmJlxuICAgICAgICBzYW1lSW5wdXRUeXBlKGEsIGIpXG4gICAgICApIHx8IChcbiAgICAgICAgaXNUcnVlKGEuaXNBc3luY1BsYWNlaG9sZGVyKSAmJlxuICAgICAgICBhLmFzeW5jRmFjdG9yeSA9PT0gYi5hc3luY0ZhY3RvcnkgJiZcbiAgICAgICAgaXNVbmRlZihiLmFzeW5jRmFjdG9yeS5lcnJvcilcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuLy8gU29tZSBicm93c2VycyBkbyBub3Qgc3VwcG9ydCBkeW5hbWljYWxseSBjaGFuZ2luZyB0eXBlIGZvciA8aW5wdXQ+XG4vLyBzbyB0aGV5IG5lZWQgdG8gYmUgdHJlYXRlZCBhcyBkaWZmZXJlbnQgbm9kZXNcbmZ1bmN0aW9uIHNhbWVJbnB1dFR5cGUgKGEsIGIpIHtcbiAgaWYgKGEudGFnICE9PSAnaW5wdXQnKSB7IHJldHVybiB0cnVlIH1cbiAgdmFyIGk7XG4gIHZhciB0eXBlQSA9IGlzRGVmKGkgPSBhLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHZhciB0eXBlQiA9IGlzRGVmKGkgPSBiLmRhdGEpICYmIGlzRGVmKGkgPSBpLmF0dHJzKSAmJiBpLnR5cGU7XG4gIHJldHVybiB0eXBlQSA9PT0gdHlwZUJcbn1cblxuZnVuY3Rpb24gY3JlYXRlS2V5VG9PbGRJZHggKGNoaWxkcmVuLCBiZWdpbklkeCwgZW5kSWR4KSB7XG4gIHZhciBpLCBrZXk7XG4gIHZhciBtYXAgPSB7fTtcbiAgZm9yIChpID0gYmVnaW5JZHg7IGkgPD0gZW5kSWR4OyArK2kpIHtcbiAgICBrZXkgPSBjaGlsZHJlbltpXS5rZXk7XG4gICAgaWYgKGlzRGVmKGtleSkpIHsgbWFwW2tleV0gPSBpOyB9XG4gIH1cbiAgcmV0dXJuIG1hcFxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRjaEZ1bmN0aW9uIChiYWNrZW5kKSB7XG4gIHZhciBpLCBqO1xuICB2YXIgY2JzID0ge307XG5cbiAgdmFyIG1vZHVsZXMgPSBiYWNrZW5kLm1vZHVsZXM7XG4gIHZhciBub2RlT3BzID0gYmFja2VuZC5ub2RlT3BzO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7ICsraSkge1xuICAgIGNic1tob29rc1tpXV0gPSBbXTtcbiAgICBmb3IgKGogPSAwOyBqIDwgbW9kdWxlcy5sZW5ndGg7ICsraikge1xuICAgICAgaWYgKGlzRGVmKG1vZHVsZXNbal1baG9va3NbaV1dKSkge1xuICAgICAgICBjYnNbaG9va3NbaV1dLnB1c2gobW9kdWxlc1tqXVtob29rc1tpXV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0IChlbG0pIHtcbiAgICByZXR1cm4gbmV3IFZOb2RlKG5vZGVPcHMudGFnTmFtZShlbG0pLnRvTG93ZXJDYXNlKCksIHt9LCBbXSwgdW5kZWZpbmVkLCBlbG0pXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVSbUNiIChjaGlsZEVsbSwgbGlzdGVuZXJzKSB7XG4gICAgZnVuY3Rpb24gcmVtb3ZlJCQxICgpIHtcbiAgICAgIGlmICgtLXJlbW92ZSQkMS5saXN0ZW5lcnMgPT09IDApIHtcbiAgICAgICAgcmVtb3ZlTm9kZShjaGlsZEVsbSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlbW92ZSQkMS5saXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG4gICAgcmV0dXJuIHJlbW92ZSQkMVxuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlTm9kZSAoZWwpIHtcbiAgICB2YXIgcGFyZW50ID0gbm9kZU9wcy5wYXJlbnROb2RlKGVsKTtcbiAgICAvLyBlbGVtZW50IG1heSBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGR1ZSB0byB2LWh0bWwgLyB2LXRleHRcbiAgICBpZiAoaXNEZWYocGFyZW50KSkge1xuICAgICAgbm9kZU9wcy5yZW1vdmVDaGlsZChwYXJlbnQsIGVsKTtcbiAgICB9XG4gIH1cblxuICB2YXIgaW5QcmUgPSAwO1xuICBmdW5jdGlvbiBjcmVhdGVFbG0gKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtLCBuZXN0ZWQpIHtcbiAgICB2bm9kZS5pc1Jvb3RJbnNlcnQgPSAhbmVzdGVkOyAvLyBmb3IgdHJhbnNpdGlvbiBlbnRlciBjaGVja1xuICAgIGlmIChjcmVhdGVDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgdmFyIHRhZyA9IHZub2RlLnRhZztcbiAgICBpZiAoaXNEZWYodGFnKSkge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5wcmUpIHtcbiAgICAgICAgICBpblByZSsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhaW5QcmUgJiZcbiAgICAgICAgICAhdm5vZGUubnMgJiZcbiAgICAgICAgICAhKGNvbmZpZy5pZ25vcmVkRWxlbWVudHMubGVuZ3RoICYmIGNvbmZpZy5pZ25vcmVkRWxlbWVudHMuaW5kZXhPZih0YWcpID4gLTEpICYmXG4gICAgICAgICAgY29uZmlnLmlzVW5rbm93bkVsZW1lbnQodGFnKVxuICAgICAgICApIHtcbiAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgJ1Vua25vd24gY3VzdG9tIGVsZW1lbnQ6IDwnICsgdGFnICsgJz4gLSBkaWQgeW91ICcgK1xuICAgICAgICAgICAgJ3JlZ2lzdGVyIHRoZSBjb21wb25lbnQgY29ycmVjdGx5PyBGb3IgcmVjdXJzaXZlIGNvbXBvbmVudHMsICcgK1xuICAgICAgICAgICAgJ21ha2Ugc3VyZSB0byBwcm92aWRlIHRoZSBcIm5hbWVcIiBvcHRpb24uJyxcbiAgICAgICAgICAgIHZub2RlLmNvbnRleHRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2bm9kZS5lbG0gPSB2bm9kZS5uc1xuICAgICAgICA/IG5vZGVPcHMuY3JlYXRlRWxlbWVudE5TKHZub2RlLm5zLCB0YWcpXG4gICAgICAgIDogbm9kZU9wcy5jcmVhdGVFbGVtZW50KHRhZywgdm5vZGUpO1xuICAgICAgc2V0U2NvcGUodm5vZGUpO1xuXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIHtcbiAgICAgICAgLy8gaW4gV2VleCwgdGhlIGRlZmF1bHQgaW5zZXJ0aW9uIG9yZGVyIGlzIHBhcmVudC1maXJzdC5cbiAgICAgICAgLy8gTGlzdCBpdGVtcyBjYW4gYmUgb3B0aW1pemVkIHRvIHVzZSBjaGlsZHJlbi1maXJzdCBpbnNlcnRpb25cbiAgICAgICAgLy8gd2l0aCBhcHBlbmQ9XCJ0cmVlXCIuXG4gICAgICAgIHZhciBhcHBlbmRBc1RyZWUgPSBpc0RlZihkYXRhKSAmJiBpc1RydWUoZGF0YS5hcHBlbmRBc1RyZWUpO1xuICAgICAgICBpZiAoIWFwcGVuZEFzVHJlZSkge1xuICAgICAgICAgIGlmIChpc0RlZihkYXRhKSkge1xuICAgICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVDaGlsZHJlbih2bm9kZSwgY2hpbGRyZW4sIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIGlmIChhcHBlbmRBc1RyZWUpIHtcbiAgICAgICAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgICAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnNlcnQocGFyZW50RWxtLCB2bm9kZS5lbG0sIHJlZkVsbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgZGF0YSAmJiBkYXRhLnByZSkge1xuICAgICAgICBpblByZS0tO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNUcnVlKHZub2RlLmlzQ29tbWVudCkpIHtcbiAgICAgIHZub2RlLmVsbSA9IG5vZGVPcHMuY3JlYXRlQ29tbWVudCh2bm9kZS50ZXh0KTtcbiAgICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdm5vZGUuZWxtID0gbm9kZU9wcy5jcmVhdGVUZXh0Tm9kZSh2bm9kZS50ZXh0KTtcbiAgICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKSB7XG4gICAgdmFyIGkgPSB2bm9kZS5kYXRhO1xuICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgdmFyIGlzUmVhY3RpdmF0ZWQgPSBpc0RlZih2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkgJiYgaS5rZWVwQWxpdmU7XG4gICAgICBpZiAoaXNEZWYoaSA9IGkuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHtcbiAgICAgICAgaSh2bm9kZSwgZmFsc2UgLyogaHlkcmF0aW5nICovLCBwYXJlbnRFbG0sIHJlZkVsbSk7XG4gICAgICB9XG4gICAgICAvLyBhZnRlciBjYWxsaW5nIHRoZSBpbml0IGhvb2ssIGlmIHRoZSB2bm9kZSBpcyBhIGNoaWxkIGNvbXBvbmVudFxuICAgICAgLy8gaXQgc2hvdWxkJ3ZlIGNyZWF0ZWQgYSBjaGlsZCBpbnN0YW5jZSBhbmQgbW91bnRlZCBpdC4gdGhlIGNoaWxkXG4gICAgICAvLyBjb21wb25lbnQgYWxzbyBoYXMgc2V0IHRoZSBwbGFjZWhvbGRlciB2bm9kZSdzIGVsbS5cbiAgICAgIC8vIGluIHRoYXQgY2FzZSB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGVsZW1lbnQgYW5kIGJlIGRvbmUuXG4gICAgICBpZiAoaXNEZWYodm5vZGUuY29tcG9uZW50SW5zdGFuY2UpKSB7XG4gICAgICAgIGluaXRDb21wb25lbnQodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIGlmIChpc1RydWUoaXNSZWFjdGl2YXRlZCkpIHtcbiAgICAgICAgICByZWFjdGl2YXRlQ29tcG9uZW50KHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluaXRDb21wb25lbnQgKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSkge1xuICAgICAgaW5zZXJ0ZWRWbm9kZVF1ZXVlLnB1c2guYXBwbHkoaW5zZXJ0ZWRWbm9kZVF1ZXVlLCB2bm9kZS5kYXRhLnBlbmRpbmdJbnNlcnQpO1xuICAgICAgdm5vZGUuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gbnVsbDtcbiAgICB9XG4gICAgdm5vZGUuZWxtID0gdm5vZGUuY29tcG9uZW50SW5zdGFuY2UuJGVsO1xuICAgIGlmIChpc1BhdGNoYWJsZSh2bm9kZSkpIHtcbiAgICAgIGludm9rZUNyZWF0ZUhvb2tzKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgc2V0U2NvcGUodm5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbXB0eSBjb21wb25lbnQgcm9vdC5cbiAgICAgIC8vIHNraXAgYWxsIGVsZW1lbnQtcmVsYXRlZCBtb2R1bGVzIGV4Y2VwdCBmb3IgcmVmICgjMzQ1NSlcbiAgICAgIHJlZ2lzdGVyUmVmKHZub2RlKTtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0byBpbnZva2UgdGhlIGluc2VydCBob29rXG4gICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhY3RpdmF0ZUNvbXBvbmVudCAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pIHtcbiAgICB2YXIgaTtcbiAgICAvLyBoYWNrIGZvciAjNDMzOTogYSByZWFjdGl2YXRlZCBjb21wb25lbnQgd2l0aCBpbm5lciB0cmFuc2l0aW9uXG4gICAgLy8gZG9lcyBub3QgdHJpZ2dlciBiZWNhdXNlIHRoZSBpbm5lciBub2RlJ3MgY3JlYXRlZCBob29rcyBhcmUgbm90IGNhbGxlZFxuICAgIC8vIGFnYWluLiBJdCdzIG5vdCBpZGVhbCB0byBpbnZvbHZlIG1vZHVsZS1zcGVjaWZpYyBsb2dpYyBpbiBoZXJlIGJ1dFxuICAgIC8vIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gaXQuXG4gICAgdmFyIGlubmVyTm9kZSA9IHZub2RlO1xuICAgIHdoaWxlIChpbm5lck5vZGUuY29tcG9uZW50SW5zdGFuY2UpIHtcbiAgICAgIGlubmVyTm9kZSA9IGlubmVyTm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgICBpZiAoaXNEZWYoaSA9IGlubmVyTm9kZS5kYXRhKSAmJiBpc0RlZihpID0gaS50cmFuc2l0aW9uKSkge1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmFjdGl2YXRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY2JzLmFjdGl2YXRlW2ldKGVtcHR5Tm9kZSwgaW5uZXJOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaChpbm5lck5vZGUpO1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB1bmxpa2UgYSBuZXdseSBjcmVhdGVkIGNvbXBvbmVudCxcbiAgICAvLyBhIHJlYWN0aXZhdGVkIGtlZXAtYWxpdmUgY29tcG9uZW50IGRvZXNuJ3QgaW5zZXJ0IGl0c2VsZlxuICAgIGluc2VydChwYXJlbnRFbG0sIHZub2RlLmVsbSwgcmVmRWxtKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydCAocGFyZW50LCBlbG0sIHJlZiQkMSkge1xuICAgIGlmIChpc0RlZihwYXJlbnQpKSB7XG4gICAgICBpZiAoaXNEZWYocmVmJCQxKSkge1xuICAgICAgICBpZiAocmVmJCQxLnBhcmVudE5vZGUgPT09IHBhcmVudCkge1xuICAgICAgICAgIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudCwgZWxtLCByZWYkJDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlT3BzLmFwcGVuZENoaWxkKHBhcmVudCwgZWxtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDaGlsZHJlbiAodm5vZGUsIGNoaWxkcmVuLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY3JlYXRlRWxtKGNoaWxkcmVuW2ldLCBpbnNlcnRlZFZub2RlUXVldWUsIHZub2RlLmVsbSwgbnVsbCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2bm9kZS50ZXh0KSkge1xuICAgICAgbm9kZU9wcy5hcHBlbmRDaGlsZCh2bm9kZS5lbG0sIG5vZGVPcHMuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCkpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUGF0Y2hhYmxlICh2bm9kZSkge1xuICAgIHdoaWxlICh2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkge1xuICAgICAgdm5vZGUgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7XG4gICAgfVxuICAgIHJldHVybiBpc0RlZih2bm9kZS50YWcpXG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VDcmVhdGVIb29rcyAodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNicy5jcmVhdGUubGVuZ3RoOyArK2kkMSkge1xuICAgICAgY2JzLmNyZWF0ZVtpJDFdKGVtcHR5Tm9kZSwgdm5vZGUpO1xuICAgIH1cbiAgICBpID0gdm5vZGUuZGF0YS5ob29rOyAvLyBSZXVzZSB2YXJpYWJsZVxuICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgaWYgKGlzRGVmKGkuY3JlYXRlKSkgeyBpLmNyZWF0ZShlbXB0eU5vZGUsIHZub2RlKTsgfVxuICAgICAgaWYgKGlzRGVmKGkuaW5zZXJ0KSkgeyBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7IH1cbiAgICB9XG4gIH1cblxuICAvLyBzZXQgc2NvcGUgaWQgYXR0cmlidXRlIGZvciBzY29wZWQgQ1NTLlxuICAvLyB0aGlzIGlzIGltcGxlbWVudGVkIGFzIGEgc3BlY2lhbCBjYXNlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZFxuICAvLyBvZiBnb2luZyB0aHJvdWdoIHRoZSBub3JtYWwgYXR0cmlidXRlIHBhdGNoaW5nIHByb2Nlc3MuXG4gIGZ1bmN0aW9uIHNldFNjb3BlICh2bm9kZSkge1xuICAgIHZhciBpO1xuICAgIHZhciBhbmNlc3RvciA9IHZub2RlO1xuICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgaWYgKGlzRGVmKGkgPSBhbmNlc3Rvci5jb250ZXh0KSAmJiBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZCkpIHtcbiAgICAgICAgbm9kZU9wcy5zZXRBdHRyaWJ1dGUodm5vZGUuZWxtLCBpLCAnJyk7XG4gICAgICB9XG4gICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDtcbiAgICB9XG4gICAgLy8gZm9yIHNsb3QgY29udGVudCB0aGV5IHNob3VsZCBhbHNvIGdldCB0aGUgc2NvcGVJZCBmcm9tIHRoZSBob3N0IGluc3RhbmNlLlxuICAgIGlmIChpc0RlZihpID0gYWN0aXZlSW5zdGFuY2UpICYmXG4gICAgICBpICE9PSB2bm9kZS5jb250ZXh0ICYmXG4gICAgICBpc0RlZihpID0gaS4kb3B0aW9ucy5fc2NvcGVJZClcbiAgICApIHtcbiAgICAgIG5vZGVPcHMuc2V0QXR0cmlidXRlKHZub2RlLmVsbSwgaSwgJycpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFZub2RlcyAocGFyZW50RWxtLCByZWZFbG0sIHZub2Rlcywgc3RhcnRJZHgsIGVuZElkeCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSB7XG4gICAgZm9yICg7IHN0YXJ0SWR4IDw9IGVuZElkeDsgKytzdGFydElkeCkge1xuICAgICAgY3JlYXRlRWxtKHZub2Rlc1tzdGFydElkeF0sIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCByZWZFbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZURlc3Ryb3lIb29rICh2bm9kZSkge1xuICAgIHZhciBpLCBqO1xuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5kZXN0cm95KSkgeyBpKHZub2RlKTsgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKSB7IGNicy5kZXN0cm95W2ldKHZub2RlKTsgfVxuICAgIH1cbiAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNoaWxkcmVuKSkge1xuICAgICAgZm9yIChqID0gMDsgaiA8IHZub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGludm9rZURlc3Ryb3lIb29rKHZub2RlLmNoaWxkcmVuW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVWbm9kZXMgKHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgZm9yICg7IHN0YXJ0SWR4IDw9IGVuZElkeDsgKytzdGFydElkeCkge1xuICAgICAgdmFyIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgaWYgKGlzRGVmKGNoLnRhZykpIHtcbiAgICAgICAgICByZW1vdmVBbmRJbnZva2VSZW1vdmVIb29rKGNoKTtcbiAgICAgICAgICBpbnZva2VEZXN0cm95SG9vayhjaCk7XG4gICAgICAgIH0gZWxzZSB7IC8vIFRleHQgbm9kZVxuICAgICAgICAgIHJlbW92ZU5vZGUoY2guZWxtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2sgKHZub2RlLCBybSkge1xuICAgIGlmIChpc0RlZihybSkgfHwgaXNEZWYodm5vZGUuZGF0YSkpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdmFyIGxpc3RlbmVycyA9IGNicy5yZW1vdmUubGVuZ3RoICsgMTtcbiAgICAgIGlmIChpc0RlZihybSkpIHtcbiAgICAgICAgLy8gd2UgaGF2ZSBhIHJlY3Vyc2l2ZWx5IHBhc3NlZCBkb3duIHJtIGNhbGxiYWNrXG4gICAgICAgIC8vIGluY3JlYXNlIHRoZSBsaXN0ZW5lcnMgY291bnRcbiAgICAgICAgcm0ubGlzdGVuZXJzICs9IGxpc3RlbmVycztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGRpcmVjdGx5IHJlbW92aW5nXG4gICAgICAgIHJtID0gY3JlYXRlUm1DYih2bm9kZS5lbG0sIGxpc3RlbmVycyk7XG4gICAgICB9XG4gICAgICAvLyByZWN1cnNpdmVseSBpbnZva2UgaG9va3Mgb24gY2hpbGQgY29tcG9uZW50IHJvb3Qgbm9kZVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5jb21wb25lbnRJbnN0YW5jZSkgJiYgaXNEZWYoaSA9IGkuX3Zub2RlKSAmJiBpc0RlZihpLmRhdGEpKSB7XG4gICAgICAgIHJlbW92ZUFuZEludm9rZVJlbW92ZUhvb2soaSwgcm0pO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5yZW1vdmUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY2JzLnJlbW92ZVtpXSh2bm9kZSwgcm0pO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLnJlbW92ZSkpIHtcbiAgICAgICAgaSh2bm9kZSwgcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm0oKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlTm9kZSh2bm9kZS5lbG0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUNoaWxkcmVuIChwYXJlbnRFbG0sIG9sZENoLCBuZXdDaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCByZW1vdmVPbmx5KSB7XG4gICAgdmFyIG9sZFN0YXJ0SWR4ID0gMDtcbiAgICB2YXIgbmV3U3RhcnRJZHggPSAwO1xuICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgIHZhciBvbGRTdGFydFZub2RlID0gb2xkQ2hbMF07XG4gICAgdmFyIG9sZEVuZFZub2RlID0gb2xkQ2hbb2xkRW5kSWR4XTtcbiAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICB2YXIgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWzBdO1xuICAgIHZhciBuZXdFbmRWbm9kZSA9IG5ld0NoW25ld0VuZElkeF07XG4gICAgdmFyIG9sZEtleVRvSWR4LCBpZHhJbk9sZCwgZWxtVG9Nb3ZlLCByZWZFbG07XG5cbiAgICAvLyByZW1vdmVPbmx5IGlzIGEgc3BlY2lhbCBmbGFnIHVzZWQgb25seSBieSA8dHJhbnNpdGlvbi1ncm91cD5cbiAgICAvLyB0byBlbnN1cmUgcmVtb3ZlZCBlbGVtZW50cyBzdGF5IGluIGNvcnJlY3QgcmVsYXRpdmUgcG9zaXRpb25zXG4gICAgLy8gZHVyaW5nIGxlYXZpbmcgdHJhbnNpdGlvbnNcbiAgICB2YXIgY2FuTW92ZSA9ICFyZW1vdmVPbmx5O1xuXG4gICAgd2hpbGUgKG9sZFN0YXJ0SWR4IDw9IG9sZEVuZElkeCAmJiBuZXdTdGFydElkeCA8PSBuZXdFbmRJZHgpIHtcbiAgICAgIGlmIChpc1VuZGVmKG9sZFN0YXJ0Vm5vZGUpKSB7XG4gICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTsgLy8gVm5vZGUgaGFzIGJlZW4gbW92ZWQgbGVmdFxuICAgICAgfSBlbHNlIGlmIChpc1VuZGVmKG9sZEVuZFZub2RlKSkge1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgIH0gZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7XG4gICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRFbmRWbm9kZSwgbmV3RW5kVm5vZGUpKSB7XG4gICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgICAgbmV3RW5kVm5vZGUgPSBuZXdDaFstLW5ld0VuZElkeF07XG4gICAgICB9IGVsc2UgaWYgKHNhbWVWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSkpIHsgLy8gVm5vZGUgbW92ZWQgcmlnaHRcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdFbmRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVuZFZub2RlLmVsbSkpO1xuICAgICAgICBvbGRTdGFydFZub2RlID0gb2xkQ2hbKytvbGRTdGFydElkeF07XG4gICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgfSBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7IC8vIFZub2RlIG1vdmVkIGxlZnRcbiAgICAgICAgcGF0Y2hWbm9kZShvbGRFbmRWbm9kZSwgbmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgY2FuTW92ZSAmJiBub2RlT3BzLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICBvbGRFbmRWbm9kZSA9IG9sZENoWy0tb2xkRW5kSWR4XTtcbiAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzVW5kZWYob2xkS2V5VG9JZHgpKSB7IG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpOyB9XG4gICAgICAgIGlkeEluT2xkID0gaXNEZWYobmV3U3RhcnRWbm9kZS5rZXkpID8gb2xkS2V5VG9JZHhbbmV3U3RhcnRWbm9kZS5rZXldIDogbnVsbDtcbiAgICAgICAgaWYgKGlzVW5kZWYoaWR4SW5PbGQpKSB7IC8vIE5ldyBlbGVtZW50XG4gICAgICAgICAgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcGFyZW50RWxtLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsbVRvTW92ZSA9IG9sZENoW2lkeEluT2xkXTtcbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiAhZWxtVG9Nb3ZlKSB7XG4gICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAnSXQgc2VlbXMgdGhlcmUgYXJlIGR1cGxpY2F0ZSBrZXlzIHRoYXQgaXMgY2F1c2luZyBhbiB1cGRhdGUgZXJyb3IuICcgK1xuICAgICAgICAgICAgICAnTWFrZSBzdXJlIGVhY2ggdi1mb3IgaXRlbSBoYXMgYSB1bmlxdWUga2V5LidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzYW1lVm5vZGUoZWxtVG9Nb3ZlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICAgICAgcGF0Y2hWbm9kZShlbG1Ub01vdmUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICBvbGRDaFtpZHhJbk9sZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjYW5Nb3ZlICYmIG5vZGVPcHMuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgZWxtVG9Nb3ZlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzYW1lIGtleSBidXQgZGlmZmVyZW50IGVsZW1lbnQuIHRyZWF0IGFzIG5ldyBlbGVtZW50XG4gICAgICAgICAgICBjcmVhdGVFbG0obmV3U3RhcnRWbm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9sZFN0YXJ0SWR4ID4gb2xkRW5kSWR4KSB7XG4gICAgICByZWZFbG0gPSBpc1VuZGVmKG5ld0NoW25ld0VuZElkeCArIDFdKSA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07XG4gICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCByZWZFbG0sIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgIH0gZWxzZSBpZiAobmV3U3RhcnRJZHggPiBuZXdFbmRJZHgpIHtcbiAgICAgIHJlbW92ZVZub2RlcyhwYXJlbnRFbG0sIG9sZENoLCBvbGRTdGFydElkeCwgb2xkRW5kSWR4KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXRjaFZub2RlIChvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSkge1xuICAgIGlmIChvbGRWbm9kZSA9PT0gdm5vZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBlbG0gPSB2bm9kZS5lbG0gPSBvbGRWbm9kZS5lbG07XG5cbiAgICBpZiAoaXNUcnVlKG9sZFZub2RlLmlzQXN5bmNQbGFjZWhvbGRlcikpIHtcbiAgICAgIGlmIChpc0RlZih2bm9kZS5hc3luY0ZhY3RvcnkucmVzb2x2ZWQpKSB7XG4gICAgICAgIGh5ZHJhdGUob2xkVm5vZGUuZWxtLCB2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZub2RlLmlzQXN5bmNQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyByZXVzZSBlbGVtZW50IGZvciBzdGF0aWMgdHJlZXMuXG4gICAgLy8gbm90ZSB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIHZub2RlIGlzIGNsb25lZCAtXG4gICAgLy8gaWYgdGhlIG5ldyBub2RlIGlzIG5vdCBjbG9uZWQgaXQgbWVhbnMgdGhlIHJlbmRlciBmdW5jdGlvbnMgaGF2ZSBiZWVuXG4gICAgLy8gcmVzZXQgYnkgdGhlIGhvdC1yZWxvYWQtYXBpIGFuZCB3ZSBuZWVkIHRvIGRvIGEgcHJvcGVyIHJlLXJlbmRlci5cbiAgICBpZiAoaXNUcnVlKHZub2RlLmlzU3RhdGljKSAmJlxuICAgICAgaXNUcnVlKG9sZFZub2RlLmlzU3RhdGljKSAmJlxuICAgICAgdm5vZGUua2V5ID09PSBvbGRWbm9kZS5rZXkgJiZcbiAgICAgIChpc1RydWUodm5vZGUuaXNDbG9uZWQpIHx8IGlzVHJ1ZSh2bm9kZS5pc09uY2UpKVxuICAgICkge1xuICAgICAgdm5vZGUuY29tcG9uZW50SW5zdGFuY2UgPSBvbGRWbm9kZS5jb21wb25lbnRJbnN0YW5jZTtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBpO1xuICAgIHZhciBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICBpZiAoaXNEZWYoZGF0YSkgJiYgaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkucHJlcGF0Y2gpKSB7XG4gICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgfVxuXG4gICAgdmFyIG9sZENoID0gb2xkVm5vZGUuY2hpbGRyZW47XG4gICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47XG4gICAgaWYgKGlzRGVmKGRhdGEpICYmIGlzUGF0Y2hhYmxlKHZub2RlKSkge1xuICAgICAgZm9yIChpID0gMDsgaSA8IGNicy51cGRhdGUubGVuZ3RoOyArK2kpIHsgY2JzLnVwZGF0ZVtpXShvbGRWbm9kZSwgdm5vZGUpOyB9XG4gICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSkgeyBpKG9sZFZub2RlLCB2bm9kZSk7IH1cbiAgICB9XG4gICAgaWYgKGlzVW5kZWYodm5vZGUudGV4dCkpIHtcbiAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7XG4gICAgICAgIGlmIChvbGRDaCAhPT0gY2gpIHsgdXBkYXRlQ2hpbGRyZW4oZWxtLCBvbGRDaCwgY2gsIGluc2VydGVkVm5vZGVRdWV1ZSwgcmVtb3ZlT25seSk7IH1cbiAgICAgIH0gZWxzZSBpZiAoaXNEZWYoY2gpKSB7XG4gICAgICAgIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkgeyBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpOyB9XG4gICAgICAgIGFkZFZub2RlcyhlbG0sIG51bGwsIGNoLCAwLCBjaC5sZW5ndGggLSAxLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRDaCkpIHtcbiAgICAgICAgcmVtb3ZlVm5vZGVzKGVsbSwgb2xkQ2gsIDAsIG9sZENoLmxlbmd0aCAtIDEpO1xuICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRWbm9kZS50ZXh0KSkge1xuICAgICAgICBub2RlT3BzLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob2xkVm5vZGUudGV4dCAhPT0gdm5vZGUudGV4dCkge1xuICAgICAgbm9kZU9wcy5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgIH1cbiAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgIGlmIChpc0RlZihpID0gZGF0YS5ob29rKSAmJiBpc0RlZihpID0gaS5wb3N0cGF0Y2gpKSB7IGkob2xkVm5vZGUsIHZub2RlKTsgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUluc2VydEhvb2sgKHZub2RlLCBxdWV1ZSwgaW5pdGlhbCkge1xuICAgIC8vIGRlbGF5IGluc2VydCBob29rcyBmb3IgY29tcG9uZW50IHJvb3Qgbm9kZXMsIGludm9rZSB0aGVtIGFmdGVyIHRoZVxuICAgIC8vIGVsZW1lbnQgaXMgcmVhbGx5IGluc2VydGVkXG4gICAgaWYgKGlzVHJ1ZShpbml0aWFsKSAmJiBpc0RlZih2bm9kZS5wYXJlbnQpKSB7XG4gICAgICB2bm9kZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0ID0gcXVldWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcXVldWVbaV0uZGF0YS5ob29rLmluc2VydChxdWV1ZVtpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhaWxlZCA9IGZhbHNlO1xuICAvLyBsaXN0IG9mIG1vZHVsZXMgdGhhdCBjYW4gc2tpcCBjcmVhdGUgaG9vayBkdXJpbmcgaHlkcmF0aW9uIGJlY2F1c2UgdGhleVxuICAvLyBhcmUgYWxyZWFkeSByZW5kZXJlZCBvbiB0aGUgY2xpZW50IG9yIGhhcyBubyBuZWVkIGZvciBpbml0aWFsaXphdGlvblxuICB2YXIgaXNSZW5kZXJlZE1vZHVsZSA9IG1ha2VNYXAoJ2F0dHJzLHN0eWxlLGNsYXNzLHN0YXRpY0NsYXNzLHN0YXRpY1N0eWxlLGtleScpO1xuXG4gIC8vIE5vdGU6IHRoaXMgaXMgYSBicm93c2VyLW9ubHkgZnVuY3Rpb24gc28gd2UgY2FuIGFzc3VtZSBlbG1zIGFyZSBET00gbm9kZXMuXG4gIGZ1bmN0aW9uIGh5ZHJhdGUgKGVsbSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgIGlmIChpc1RydWUodm5vZGUuaXNDb21tZW50KSAmJiBpc0RlZih2bm9kZS5hc3luY0ZhY3RvcnkpKSB7XG4gICAgICB2bm9kZS5lbG0gPSBlbG07XG4gICAgICB2bm9kZS5pc0FzeW5jUGxhY2Vob2xkZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICghYXNzZXJ0Tm9kZU1hdGNoKGVsbSwgdm5vZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICB2bm9kZS5lbG0gPSBlbG07XG4gICAgdmFyIHRhZyA9IHZub2RlLnRhZztcbiAgICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gICAgdmFyIGNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgaWYgKGlzRGVmKGRhdGEpKSB7XG4gICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHsgaSh2bm9kZSwgdHJ1ZSAvKiBoeWRyYXRpbmcgKi8pOyB9XG4gICAgICBpZiAoaXNEZWYoaSA9IHZub2RlLmNvbXBvbmVudEluc3RhbmNlKSkge1xuICAgICAgICAvLyBjaGlsZCBjb21wb25lbnQuIGl0IHNob3VsZCBoYXZlIGh5ZHJhdGVkIGl0cyBvd24gdHJlZS5cbiAgICAgICAgaW5pdENvbXBvbmVudCh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRGVmKHRhZykpIHtcbiAgICAgIGlmIChpc0RlZihjaGlsZHJlbikpIHtcbiAgICAgICAgLy8gZW1wdHkgZWxlbWVudCwgYWxsb3cgY2xpZW50IHRvIHBpY2sgdXAgYW5kIHBvcHVsYXRlIGNoaWxkcmVuXG4gICAgICAgIGlmICghZWxtLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgICAgICAgIGNyZWF0ZUNoaWxkcmVuKHZub2RlLCBjaGlsZHJlbiwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW5NYXRjaCA9IHRydWU7XG4gICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGVsbS5maXJzdENoaWxkO1xuICAgICAgICAgIGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IGNoaWxkcmVuLmxlbmd0aDsgaSQxKyspIHtcbiAgICAgICAgICAgIGlmICghY2hpbGROb2RlIHx8ICFoeWRyYXRlKGNoaWxkTm9kZSwgY2hpbGRyZW5baSQxXSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSkge1xuICAgICAgICAgICAgICBjaGlsZHJlbk1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGlmIGNoaWxkTm9kZSBpcyBub3QgbnVsbCwgaXQgbWVhbnMgdGhlIGFjdHVhbCBjaGlsZE5vZGVzIGxpc3QgaXNcbiAgICAgICAgICAvLyBsb25nZXIgdGhhbiB0aGUgdmlydHVhbCBjaGlsZHJlbiBsaXN0LlxuICAgICAgICAgIGlmICghY2hpbGRyZW5NYXRjaCB8fCBjaGlsZE5vZGUpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAhYmFpbGVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgYmFpbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdQYXJlbnQ6ICcsIGVsbSk7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWlzbWF0Y2hpbmcgY2hpbGROb2RlcyB2cy4gVk5vZGVzOiAnLCBlbG0uY2hpbGROb2RlcywgY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNEZWYoZGF0YSkpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICBpZiAoIWlzUmVuZGVyZWRNb2R1bGUoa2V5KSkge1xuICAgICAgICAgICAgaW52b2tlQ3JlYXRlSG9va3Modm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZWxtLmRhdGEgIT09IHZub2RlLnRleHQpIHtcbiAgICAgIGVsbS5kYXRhID0gdm5vZGUudGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzc2VydE5vZGVNYXRjaCAobm9kZSwgdm5vZGUpIHtcbiAgICBpZiAoaXNEZWYodm5vZGUudGFnKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdm5vZGUudGFnLmluZGV4T2YoJ3Z1ZS1jb21wb25lbnQnKSA9PT0gMCB8fFxuICAgICAgICB2bm9kZS50YWcudG9Mb3dlckNhc2UoKSA9PT0gKG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09ICh2bm9kZS5pc0NvbW1lbnQgPyA4IDogMylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcGF0Y2ggKG9sZFZub2RlLCB2bm9kZSwgaHlkcmF0aW5nLCByZW1vdmVPbmx5LCBwYXJlbnRFbG0sIHJlZkVsbSkge1xuICAgIGlmIChpc1VuZGVmKHZub2RlKSkge1xuICAgICAgaWYgKGlzRGVmKG9sZFZub2RlKSkgeyBpbnZva2VEZXN0cm95SG9vayhvbGRWbm9kZSk7IH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBpc0luaXRpYWxQYXRjaCA9IGZhbHNlO1xuICAgIHZhciBpbnNlcnRlZFZub2RlUXVldWUgPSBbXTtcblxuICAgIGlmIChpc1VuZGVmKG9sZFZub2RlKSkge1xuICAgICAgLy8gZW1wdHkgbW91bnQgKGxpa2VseSBhcyBjb21wb25lbnQpLCBjcmVhdGUgbmV3IHJvb3QgZWxlbWVudFxuICAgICAgaXNJbml0aWFsUGF0Y2ggPSB0cnVlO1xuICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHBhcmVudEVsbSwgcmVmRWxtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGlzUmVhbEVsZW1lbnQgPSBpc0RlZihvbGRWbm9kZS5ub2RlVHlwZSk7XG4gICAgICBpZiAoIWlzUmVhbEVsZW1lbnQgJiYgc2FtZVZub2RlKG9sZFZub2RlLCB2bm9kZSkpIHtcbiAgICAgICAgLy8gcGF0Y2ggZXhpc3Rpbmcgcm9vdCBub2RlXG4gICAgICAgIHBhdGNoVm5vZGUob2xkVm5vZGUsIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUsIHJlbW92ZU9ubHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzUmVhbEVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBtb3VudGluZyB0byBhIHJlYWwgZWxlbWVudFxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQgYW5kIGlmIHdlIGNhbiBwZXJmb3JtXG4gICAgICAgICAgLy8gYSBzdWNjZXNzZnVsIGh5ZHJhdGlvbi5cbiAgICAgICAgICBpZiAob2xkVm5vZGUubm9kZVR5cGUgPT09IDEgJiYgb2xkVm5vZGUuaGFzQXR0cmlidXRlKFNTUl9BVFRSKSkge1xuICAgICAgICAgICAgb2xkVm5vZGUucmVtb3ZlQXR0cmlidXRlKFNTUl9BVFRSKTtcbiAgICAgICAgICAgIGh5ZHJhdGluZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1RydWUoaHlkcmF0aW5nKSkge1xuICAgICAgICAgICAgaWYgKGh5ZHJhdGUob2xkVm5vZGUsIHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpKSB7XG4gICAgICAgICAgICAgIGludm9rZUluc2VydEhvb2sodm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgIHJldHVybiBvbGRWbm9kZVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICAgICAgJ1RoZSBjbGllbnQtc2lkZSByZW5kZXJlZCB2aXJ0dWFsIERPTSB0cmVlIGlzIG5vdCBtYXRjaGluZyAnICtcbiAgICAgICAgICAgICAgICAnc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQuIFRoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSBpbmNvcnJlY3QgJyArXG4gICAgICAgICAgICAgICAgJ0hUTUwgbWFya3VwLCBmb3IgZXhhbXBsZSBuZXN0aW5nIGJsb2NrLWxldmVsIGVsZW1lbnRzIGluc2lkZSAnICtcbiAgICAgICAgICAgICAgICAnPHA+LCBvciBtaXNzaW5nIDx0Ym9keT4uIEJhaWxpbmcgaHlkcmF0aW9uIGFuZCBwZXJmb3JtaW5nICcgK1xuICAgICAgICAgICAgICAgICdmdWxsIGNsaWVudC1zaWRlIHJlbmRlci4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVpdGhlciBub3Qgc2VydmVyLXJlbmRlcmVkLCBvciBoeWRyYXRpb24gZmFpbGVkLlxuICAgICAgICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBub2RlIGFuZCByZXBsYWNlIGl0XG4gICAgICAgICAgb2xkVm5vZGUgPSBlbXB0eU5vZGVBdChvbGRWbm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVwbGFjaW5nIGV4aXN0aW5nIGVsZW1lbnRcbiAgICAgICAgdmFyIG9sZEVsbSA9IG9sZFZub2RlLmVsbTtcbiAgICAgICAgdmFyIHBhcmVudEVsbSQxID0gbm9kZU9wcy5wYXJlbnROb2RlKG9sZEVsbSk7XG4gICAgICAgIGNyZWF0ZUVsbShcbiAgICAgICAgICB2bm9kZSxcbiAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUsXG4gICAgICAgICAgLy8gZXh0cmVtZWx5IHJhcmUgZWRnZSBjYXNlOiBkbyBub3QgaW5zZXJ0IGlmIG9sZCBlbGVtZW50IGlzIGluIGFcbiAgICAgICAgICAvLyBsZWF2aW5nIHRyYW5zaXRpb24uIE9ubHkgaGFwcGVucyB3aGVuIGNvbWJpbmluZyB0cmFuc2l0aW9uICtcbiAgICAgICAgICAvLyBrZWVwLWFsaXZlICsgSE9Dcy4gKCM0NTkwKVxuICAgICAgICAgIG9sZEVsbS5fbGVhdmVDYiA/IG51bGwgOiBwYXJlbnRFbG0kMSxcbiAgICAgICAgICBub2RlT3BzLm5leHRTaWJsaW5nKG9sZEVsbSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoaXNEZWYodm5vZGUucGFyZW50KSkge1xuICAgICAgICAgIC8vIGNvbXBvbmVudCByb290IGVsZW1lbnQgcmVwbGFjZWQuXG4gICAgICAgICAgLy8gdXBkYXRlIHBhcmVudCBwbGFjZWhvbGRlciBub2RlIGVsZW1lbnQsIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgdmFyIGFuY2VzdG9yID0gdm5vZGUucGFyZW50O1xuICAgICAgICAgIHdoaWxlIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgYW5jZXN0b3IuZWxtID0gdm5vZGUuZWxtO1xuICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1BhdGNoYWJsZSh2bm9kZSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICBjYnMuY3JlYXRlW2ldKGVtcHR5Tm9kZSwgdm5vZGUucGFyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEZWYocGFyZW50RWxtJDEpKSB7XG4gICAgICAgICAgcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSQxLCBbb2xkVm5vZGVdLCAwLCAwKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RlZihvbGRWbm9kZS50YWcpKSB7XG4gICAgICAgICAgaW52b2tlRGVzdHJveUhvb2sob2xkVm5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW52b2tlSW5zZXJ0SG9vayh2bm9kZSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLCBpc0luaXRpYWxQYXRjaCk7XG4gICAgcmV0dXJuIHZub2RlLmVsbVxuICB9XG59XG5cbi8qICAqL1xuXG52YXIgZGlyZWN0aXZlcyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVEaXJlY3RpdmVzLFxuICB1cGRhdGU6IHVwZGF0ZURpcmVjdGl2ZXMsXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIHVuYmluZERpcmVjdGl2ZXMgKHZub2RlKSB7XG4gICAgdXBkYXRlRGlyZWN0aXZlcyh2bm9kZSwgZW1wdHlOb2RlKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gdXBkYXRlRGlyZWN0aXZlcyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIGlmIChvbGRWbm9kZS5kYXRhLmRpcmVjdGl2ZXMgfHwgdm5vZGUuZGF0YS5kaXJlY3RpdmVzKSB7XG4gICAgX3VwZGF0ZShvbGRWbm9kZSwgdm5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF91cGRhdGUgKG9sZFZub2RlLCB2bm9kZSkge1xuICB2YXIgaXNDcmVhdGUgPSBvbGRWbm9kZSA9PT0gZW1wdHlOb2RlO1xuICB2YXIgaXNEZXN0cm95ID0gdm5vZGUgPT09IGVtcHR5Tm9kZTtcbiAgdmFyIG9sZERpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEob2xkVm5vZGUuZGF0YS5kaXJlY3RpdmVzLCBvbGRWbm9kZS5jb250ZXh0KTtcbiAgdmFyIG5ld0RpcnMgPSBub3JtYWxpemVEaXJlY3RpdmVzJDEodm5vZGUuZGF0YS5kaXJlY3RpdmVzLCB2bm9kZS5jb250ZXh0KTtcblxuICB2YXIgZGlyc1dpdGhJbnNlcnQgPSBbXTtcbiAgdmFyIGRpcnNXaXRoUG9zdHBhdGNoID0gW107XG5cbiAgdmFyIGtleSwgb2xkRGlyLCBkaXI7XG4gIGZvciAoa2V5IGluIG5ld0RpcnMpIHtcbiAgICBvbGREaXIgPSBvbGREaXJzW2tleV07XG4gICAgZGlyID0gbmV3RGlyc1trZXldO1xuICAgIGlmICghb2xkRGlyKSB7XG4gICAgICAvLyBuZXcgZGlyZWN0aXZlLCBiaW5kXG4gICAgICBjYWxsSG9vayQxKGRpciwgJ2JpbmQnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgaWYgKGRpci5kZWYgJiYgZGlyLmRlZi5pbnNlcnRlZCkge1xuICAgICAgICBkaXJzV2l0aEluc2VydC5wdXNoKGRpcik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGV4aXN0aW5nIGRpcmVjdGl2ZSwgdXBkYXRlXG4gICAgICBkaXIub2xkVmFsdWUgPSBvbGREaXIudmFsdWU7XG4gICAgICBjYWxsSG9vayQxKGRpciwgJ3VwZGF0ZScsIHZub2RlLCBvbGRWbm9kZSk7XG4gICAgICBpZiAoZGlyLmRlZiAmJiBkaXIuZGVmLmNvbXBvbmVudFVwZGF0ZWQpIHtcbiAgICAgICAgZGlyc1dpdGhQb3N0cGF0Y2gucHVzaChkaXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aEluc2VydC5sZW5ndGgpIHtcbiAgICB2YXIgY2FsbEluc2VydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhJbnNlcnQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aEluc2VydFtpXSwgJ2luc2VydGVkJywgdm5vZGUsIG9sZFZub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpc0NyZWF0ZSkge1xuICAgICAgbWVyZ2VWTm9kZUhvb2sodm5vZGUuZGF0YS5ob29rIHx8ICh2bm9kZS5kYXRhLmhvb2sgPSB7fSksICdpbnNlcnQnLCBjYWxsSW5zZXJ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbEluc2VydCgpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkaXJzV2l0aFBvc3RwYXRjaC5sZW5ndGgpIHtcbiAgICBtZXJnZVZOb2RlSG9vayh2bm9kZS5kYXRhLmhvb2sgfHwgKHZub2RlLmRhdGEuaG9vayA9IHt9KSwgJ3Bvc3RwYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyc1dpdGhQb3N0cGF0Y2gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbEhvb2skMShkaXJzV2l0aFBvc3RwYXRjaFtpXSwgJ2NvbXBvbmVudFVwZGF0ZWQnLCB2bm9kZSwgb2xkVm5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFpc0NyZWF0ZSkge1xuICAgIGZvciAoa2V5IGluIG9sZERpcnMpIHtcbiAgICAgIGlmICghbmV3RGlyc1trZXldKSB7XG4gICAgICAgIC8vIG5vIGxvbmdlciBwcmVzZW50LCB1bmJpbmRcbiAgICAgICAgY2FsbEhvb2skMShvbGREaXJzW2tleV0sICd1bmJpbmQnLCBvbGRWbm9kZSwgb2xkVm5vZGUsIGlzRGVzdHJveSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBlbXB0eU1vZGlmaWVycyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURpcmVjdGl2ZXMkMSAoXG4gIGRpcnMsXG4gIHZtXG4pIHtcbiAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGlmICghZGlycykge1xuICAgIHJldHVybiByZXNcbiAgfVxuICB2YXIgaSwgZGlyO1xuICBmb3IgKGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykge1xuICAgIGRpciA9IGRpcnNbaV07XG4gICAgaWYgKCFkaXIubW9kaWZpZXJzKSB7XG4gICAgICBkaXIubW9kaWZpZXJzID0gZW1wdHlNb2RpZmllcnM7XG4gICAgfVxuICAgIHJlc1tnZXRSYXdEaXJOYW1lKGRpcildID0gZGlyO1xuICAgIGRpci5kZWYgPSByZXNvbHZlQXNzZXQodm0uJG9wdGlvbnMsICdkaXJlY3RpdmVzJywgZGlyLm5hbWUsIHRydWUpO1xuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gZ2V0UmF3RGlyTmFtZSAoZGlyKSB7XG4gIHJldHVybiBkaXIucmF3TmFtZSB8fCAoKGRpci5uYW1lKSArIFwiLlwiICsgKE9iamVjdC5rZXlzKGRpci5tb2RpZmllcnMgfHwge30pLmpvaW4oJy4nKSkpXG59XG5cbmZ1bmN0aW9uIGNhbGxIb29rJDEgKGRpciwgaG9vaywgdm5vZGUsIG9sZFZub2RlLCBpc0Rlc3Ryb3kpIHtcbiAgdmFyIGZuID0gZGlyLmRlZiAmJiBkaXIuZGVmW2hvb2tdO1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgZm4odm5vZGUuZWxtLCBkaXIsIHZub2RlLCBvbGRWbm9kZSwgaXNEZXN0cm95KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoYW5kbGVFcnJvcihlLCB2bm9kZS5jb250ZXh0LCAoXCJkaXJlY3RpdmUgXCIgKyAoZGlyLm5hbWUpICsgXCIgXCIgKyBob29rICsgXCIgaG9va1wiKSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBiYXNlTW9kdWxlcyA9IFtcbiAgcmVmLFxuICBkaXJlY3RpdmVzXG5dO1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gdXBkYXRlQXR0cnMgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoIW9sZFZub2RlLmRhdGEuYXR0cnMgJiYgIXZub2RlLmRhdGEuYXR0cnMpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIga2V5LCBjdXIsIG9sZDtcbiAgdmFyIGVsbSA9IHZub2RlLmVsbTtcbiAgdmFyIG9sZEF0dHJzID0gb2xkVm5vZGUuZGF0YS5hdHRycyB8fCB7fTtcbiAgdmFyIGF0dHJzID0gdm5vZGUuZGF0YS5hdHRycyB8fCB7fTtcbiAgLy8gY2xvbmUgb2JzZXJ2ZWQgb2JqZWN0cywgYXMgdGhlIHVzZXIgcHJvYmFibHkgd2FudHMgdG8gbXV0YXRlIGl0XG4gIGlmIChhdHRycy5fX29iX18pIHtcbiAgICBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMgPSBleHRlbmQoe30sIGF0dHJzKTtcbiAgfVxuXG4gIGZvciAoa2V5IGluIGF0dHJzKSB7XG4gICAgY3VyID0gYXR0cnNba2V5XTtcbiAgICBvbGQgPSBvbGRBdHRyc1trZXldO1xuICAgIGlmIChvbGQgIT09IGN1cikge1xuICAgICAgZWxtLnNldEF0dHIoa2V5LCBjdXIpO1xuICAgIH1cbiAgfVxuICBmb3IgKGtleSBpbiBvbGRBdHRycykge1xuICAgIGlmIChhdHRyc1trZXldID09IG51bGwpIHtcbiAgICAgIGVsbS5zZXRBdHRyKGtleSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBhdHRycyA9IHtcbiAgY3JlYXRlOiB1cGRhdGVBdHRycyxcbiAgdXBkYXRlOiB1cGRhdGVBdHRyc1xufTtcblxuLyogICovXG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzIChvbGRWbm9kZSwgdm5vZGUpIHtcbiAgdmFyIGVsID0gdm5vZGUuZWxtO1xuICB2YXIgY3R4ID0gdm5vZGUuY29udGV4dDtcblxuICB2YXIgZGF0YSA9IHZub2RlLmRhdGE7XG4gIHZhciBvbGREYXRhID0gb2xkVm5vZGUuZGF0YTtcbiAgaWYgKCFkYXRhLnN0YXRpY0NsYXNzICYmXG4gICAgIWRhdGEuY2xhc3MgJiZcbiAgICAoIW9sZERhdGEgfHwgKCFvbGREYXRhLnN0YXRpY0NsYXNzICYmICFvbGREYXRhLmNsYXNzKSlcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgb2xkQ2xhc3NMaXN0ID0gW107XG4gIC8vIHVubGlrZSB3ZWIsIHdlZXggdm5vZGUgc3RhdGljQ2xhc3MgaXMgYW4gQXJyYXlcbiAgdmFyIG9sZFN0YXRpY0NsYXNzID0gb2xkRGF0YS5zdGF0aWNDbGFzcztcbiAgaWYgKG9sZFN0YXRpY0NsYXNzKSB7XG4gICAgb2xkQ2xhc3NMaXN0LnB1c2guYXBwbHkob2xkQ2xhc3NMaXN0LCBvbGRTdGF0aWNDbGFzcyk7XG4gIH1cbiAgaWYgKG9sZERhdGEuY2xhc3MpIHtcbiAgICBvbGRDbGFzc0xpc3QucHVzaC5hcHBseShvbGRDbGFzc0xpc3QsIG9sZERhdGEuY2xhc3MpO1xuICB9XG5cbiAgdmFyIGNsYXNzTGlzdCA9IFtdO1xuICAvLyB1bmxpa2Ugd2ViLCB3ZWV4IHZub2RlIHN0YXRpY0NsYXNzIGlzIGFuIEFycmF5XG4gIHZhciBzdGF0aWNDbGFzcyA9IGRhdGEuc3RhdGljQ2xhc3M7XG4gIGlmIChzdGF0aWNDbGFzcykge1xuICAgIGNsYXNzTGlzdC5wdXNoLmFwcGx5KGNsYXNzTGlzdCwgc3RhdGljQ2xhc3MpO1xuICB9XG4gIGlmIChkYXRhLmNsYXNzKSB7XG4gICAgY2xhc3NMaXN0LnB1c2guYXBwbHkoY2xhc3NMaXN0LCBkYXRhLmNsYXNzKTtcbiAgfVxuXG4gIHZhciBzdHlsZSA9IGdldFN0eWxlKG9sZENsYXNzTGlzdCwgY2xhc3NMaXN0LCBjdHgpO1xuICBmb3IgKHZhciBrZXkgaW4gc3R5bGUpIHtcbiAgICBlbC5zZXRTdHlsZShrZXksIHN0eWxlW2tleV0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0eWxlIChvbGRDbGFzc0xpc3QsIGNsYXNzTGlzdCwgY3R4KSB7XG4gIC8vIHN0eWxlIGlzIGEgd2VleC1vbmx5IGluamVjdGVkIG9iamVjdFxuICAvLyBjb21waWxlZCBmcm9tIDxzdHlsZT4gdGFncyBpbiB3ZWV4IGZpbGVzXG4gIHZhciBzdHlsZXNoZWV0ID0gY3R4LiRvcHRpb25zLnN0eWxlIHx8IHt9O1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGNsYXNzTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdmFyIHN0eWxlID0gc3R5bGVzaGVldFtuYW1lXTtcbiAgICBleHRlbmQocmVzdWx0LCBzdHlsZSk7XG4gIH0pO1xuICBvbGRDbGFzc0xpc3QuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0eWxlc2hlZXRbbmFtZV07XG4gICAgZm9yICh2YXIga2V5IGluIHN0eWxlKSB7XG4gICAgICBpZiAoIXJlc3VsdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG52YXIga2xhc3MgPSB7XG4gIGNyZWF0ZTogdXBkYXRlQ2xhc3MsXG4gIHVwZGF0ZTogdXBkYXRlQ2xhc3Ncbn07XG5cbi8qICAqL1xuXG52YXIgdGFyZ2V0JDE7XG5cbmZ1bmN0aW9uIGFkZCQxIChcbiAgZXZlbnQsXG4gIGhhbmRsZXIsXG4gIG9uY2UsXG4gIGNhcHR1cmVcbikge1xuICBpZiAoY2FwdHVyZSkge1xuICAgIGNvbnNvbGUubG9nKCdXZWV4IGRvIG5vdCBzdXBwb3J0IGV2ZW50IGluIGJ1YmJsZSBwaGFzZS4nKTtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob25jZSkge1xuICAgIHZhciBvbGRIYW5kbGVyID0gaGFuZGxlcjtcbiAgICB2YXIgX3RhcmdldCA9IHRhcmdldCQxOyAvLyBzYXZlIGN1cnJlbnQgdGFyZ2V0IGVsZW1lbnQgaW4gY2xvc3VyZVxuICAgIGhhbmRsZXIgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgIHZhciByZXMgPSBhcmd1bWVudHMubGVuZ3RoID09PSAxXG4gICAgICAgID8gb2xkSGFuZGxlcihldilcbiAgICAgICAgOiBvbGRIYW5kbGVyLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAocmVzICE9PSBudWxsKSB7XG4gICAgICAgIHJlbW92ZSQyKGV2ZW50LCBudWxsLCBudWxsLCBfdGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHRhcmdldCQxLmFkZEV2ZW50KGV2ZW50LCBoYW5kbGVyKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlJDIgKFxuICBldmVudCxcbiAgaGFuZGxlcixcbiAgY2FwdHVyZSxcbiAgX3RhcmdldFxuKSB7XG4gIChfdGFyZ2V0IHx8IHRhcmdldCQxKS5yZW1vdmVFdmVudChldmVudCk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZURPTUxpc3RlbmVycyAob2xkVm5vZGUsIHZub2RlKSB7XG4gIGlmICghb2xkVm5vZGUuZGF0YS5vbiAmJiAhdm5vZGUuZGF0YS5vbikge1xuICAgIHJldHVyblxuICB9XG4gIHZhciBvbiA9IHZub2RlLmRhdGEub24gfHwge307XG4gIHZhciBvbGRPbiA9IG9sZFZub2RlLmRhdGEub24gfHwge307XG4gIHRhcmdldCQxID0gdm5vZGUuZWxtO1xuICB1cGRhdGVMaXN0ZW5lcnMob24sIG9sZE9uLCBhZGQkMSwgcmVtb3ZlJDIsIHZub2RlLmNvbnRleHQpO1xufVxuXG52YXIgZXZlbnRzID0ge1xuICBjcmVhdGU6IHVwZGF0ZURPTUxpc3RlbmVycyxcbiAgdXBkYXRlOiB1cGRhdGVET01MaXN0ZW5lcnNcbn07XG5cbi8qICAqL1xuXG52YXIgbm9ybWFsaXplID0gY2FjaGVkKGNhbWVsaXplKTtcblxuZnVuY3Rpb24gY3JlYXRlU3R5bGUgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoIXZub2RlLmRhdGEuc3RhdGljU3R5bGUpIHtcbiAgICB1cGRhdGVTdHlsZShvbGRWbm9kZSwgdm5vZGUpO1xuICAgIHJldHVyblxuICB9XG4gIHZhciBlbG0gPSB2bm9kZS5lbG07XG4gIHZhciBzdGF0aWNTdHlsZSA9IHZub2RlLmRhdGEuc3RhdGljU3R5bGU7XG4gIGZvciAodmFyIG5hbWUgaW4gc3RhdGljU3R5bGUpIHtcbiAgICBpZiAoc3RhdGljU3R5bGVbbmFtZV0pIHtcbiAgICAgIGVsbS5zZXRTdHlsZShub3JtYWxpemUobmFtZSksIHN0YXRpY1N0eWxlW25hbWVdKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlU3R5bGUob2xkVm5vZGUsIHZub2RlKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3R5bGUgKG9sZFZub2RlLCB2bm9kZSkge1xuICBpZiAoIW9sZFZub2RlLmRhdGEuc3R5bGUgJiYgIXZub2RlLmRhdGEuc3R5bGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICB2YXIgY3VyLCBuYW1lO1xuICB2YXIgZWxtID0gdm5vZGUuZWxtO1xuICB2YXIgb2xkU3R5bGUgPSBvbGRWbm9kZS5kYXRhLnN0eWxlIHx8IHt9O1xuICB2YXIgc3R5bGUgPSB2bm9kZS5kYXRhLnN0eWxlIHx8IHt9O1xuXG4gIHZhciBuZWVkQ2xvbmUgPSBzdHlsZS5fX29iX187XG5cbiAgLy8gaGFuZGxlIGFycmF5IHN5bnRheFxuICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZSkpIHtcbiAgICBzdHlsZSA9IHZub2RlLmRhdGEuc3R5bGUgPSB0b09iamVjdCQxKHN0eWxlKTtcbiAgfVxuXG4gIC8vIGNsb25lIHRoZSBzdHlsZSBmb3IgZnV0dXJlIHVwZGF0ZXMsXG4gIC8vIGluIGNhc2UgdGhlIHVzZXIgbXV0YXRlcyB0aGUgc3R5bGUgb2JqZWN0IGluLXBsYWNlLlxuICBpZiAobmVlZENsb25lKSB7XG4gICAgc3R5bGUgPSB2bm9kZS5kYXRhLnN0eWxlID0gZXh0ZW5kKHt9LCBzdHlsZSk7XG4gIH1cblxuICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHtcbiAgICBpZiAoIXN0eWxlW25hbWVdKSB7XG4gICAgICBlbG0uc2V0U3R5bGUobm9ybWFsaXplKG5hbWUpLCAnJyk7XG4gICAgfVxuICB9XG4gIGZvciAobmFtZSBpbiBzdHlsZSkge1xuICAgIGN1ciA9IHN0eWxlW25hbWVdO1xuICAgIGVsbS5zZXRTdHlsZShub3JtYWxpemUobmFtZSksIGN1cik7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9PYmplY3QkMSAoYXJyKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJyW2ldKSB7XG4gICAgICBleHRlbmQocmVzLCBhcnJbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbnZhciBzdHlsZSA9IHtcbiAgY3JlYXRlOiBjcmVhdGVTdHlsZSxcbiAgdXBkYXRlOiB1cGRhdGVTdHlsZVxufTtcblxuLyogICovXG5cbi8qKlxuICogQWRkIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uXG4gKiBTVkcgZWxlbWVudHMgaW4gSUVcbiAqL1xuXG5cbi8qKlxuICogUmVtb3ZlIGNsYXNzIHdpdGggY29tcGF0aWJpbGl0eSBmb3IgU1ZHIHNpbmNlIGNsYXNzTGlzdCBpcyBub3Qgc3VwcG9ydGVkIG9uXG4gKiBTVkcgZWxlbWVudHMgaW4gSUVcbiAqL1xuXG4vKiAgKi9cblxuZnVuY3Rpb24gcmVzb2x2ZVRyYW5zaXRpb24gKGRlZiQkMSkge1xuICBpZiAoIWRlZiQkMSkge1xuICAgIHJldHVyblxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgZGVmJCQxID09PSAnb2JqZWN0Jykge1xuICAgIHZhciByZXMgPSB7fTtcbiAgICBpZiAoZGVmJCQxLmNzcyAhPT0gZmFsc2UpIHtcbiAgICAgIGV4dGVuZChyZXMsIGF1dG9Dc3NUcmFuc2l0aW9uKGRlZiQkMS5uYW1lIHx8ICd2JykpO1xuICAgIH1cbiAgICBleHRlbmQocmVzLCBkZWYkJDEpO1xuICAgIHJldHVybiByZXNcbiAgfSBlbHNlIGlmICh0eXBlb2YgZGVmJCQxID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhdXRvQ3NzVHJhbnNpdGlvbihkZWYkJDEpXG4gIH1cbn1cblxudmFyIGF1dG9Dc3NUcmFuc2l0aW9uID0gY2FjaGVkKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB7XG4gICAgZW50ZXJDbGFzczogKG5hbWUgKyBcIi1lbnRlclwiKSxcbiAgICBlbnRlclRvQ2xhc3M6IChuYW1lICsgXCItZW50ZXItdG9cIiksXG4gICAgZW50ZXJBY3RpdmVDbGFzczogKG5hbWUgKyBcIi1lbnRlci1hY3RpdmVcIiksXG4gICAgbGVhdmVDbGFzczogKG5hbWUgKyBcIi1sZWF2ZVwiKSxcbiAgICBsZWF2ZVRvQ2xhc3M6IChuYW1lICsgXCItbGVhdmUtdG9cIiksXG4gICAgbGVhdmVBY3RpdmVDbGFzczogKG5hbWUgKyBcIi1sZWF2ZS1hY3RpdmVcIilcbiAgfVxufSk7XG5cblxuLy8gVHJhbnNpdGlvbiBwcm9wZXJ0eS9ldmVudCBzbmlmZmluZ1xuXG5cblxuXG4vLyBiaW5kaW5nIHRvIHdpbmRvdyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBob3QgcmVsb2FkIHdvcmsgaW4gSUUgaW4gc3RyaWN0IG1vZGVcbnZhciByYWYgPSBpbkJyb3dzZXIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpXG4gIDogc2V0VGltZW91dDtcblxudmFyIHRyYW5zaXRpb24gPSB7XG4gIGNyZWF0ZTogZW50ZXIsXG4gIGFjdGl2YXRlOiBlbnRlcixcbiAgcmVtb3ZlOiBsZWF2ZVxufTtcblxuZnVuY3Rpb24gZW50ZXIgKF8sIHZub2RlKSB7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcblxuICAvLyBjYWxsIGxlYXZlIGNhbGxiYWNrIG5vd1xuICBpZiAoZWwuX2xlYXZlQ2IpIHtcbiAgICBlbC5fbGVhdmVDYi5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIGVsLl9sZWF2ZUNiKCk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHJlc29sdmVUcmFuc2l0aW9uKHZub2RlLmRhdGEudHJhbnNpdGlvbik7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChlbC5fZW50ZXJDYikge1xuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIGVudGVyQ2xhc3MgPSBkYXRhLmVudGVyQ2xhc3M7XG4gIHZhciBlbnRlclRvQ2xhc3MgPSBkYXRhLmVudGVyVG9DbGFzcztcbiAgdmFyIGVudGVyQWN0aXZlQ2xhc3MgPSBkYXRhLmVudGVyQWN0aXZlQ2xhc3M7XG4gIHZhciBhcHBlYXJDbGFzcyA9IGRhdGEuYXBwZWFyQ2xhc3M7XG4gIHZhciBhcHBlYXJUb0NsYXNzID0gZGF0YS5hcHBlYXJUb0NsYXNzO1xuICB2YXIgYXBwZWFyQWN0aXZlQ2xhc3MgPSBkYXRhLmFwcGVhckFjdGl2ZUNsYXNzO1xuICB2YXIgYmVmb3JlRW50ZXIgPSBkYXRhLmJlZm9yZUVudGVyO1xuICB2YXIgZW50ZXIgPSBkYXRhLmVudGVyO1xuICB2YXIgYWZ0ZXJFbnRlciA9IGRhdGEuYWZ0ZXJFbnRlcjtcbiAgdmFyIGVudGVyQ2FuY2VsbGVkID0gZGF0YS5lbnRlckNhbmNlbGxlZDtcbiAgdmFyIGJlZm9yZUFwcGVhciA9IGRhdGEuYmVmb3JlQXBwZWFyO1xuICB2YXIgYXBwZWFyID0gZGF0YS5hcHBlYXI7XG4gIHZhciBhZnRlckFwcGVhciA9IGRhdGEuYWZ0ZXJBcHBlYXI7XG4gIHZhciBhcHBlYXJDYW5jZWxsZWQgPSBkYXRhLmFwcGVhckNhbmNlbGxlZDtcblxuICB2YXIgY29udGV4dCA9IGFjdGl2ZUluc3RhbmNlO1xuICB2YXIgdHJhbnNpdGlvbk5vZGUgPSBhY3RpdmVJbnN0YW5jZS4kdm5vZGU7XG4gIHdoaWxlICh0cmFuc2l0aW9uTm9kZSAmJiB0cmFuc2l0aW9uTm9kZS5wYXJlbnQpIHtcbiAgICB0cmFuc2l0aW9uTm9kZSA9IHRyYW5zaXRpb25Ob2RlLnBhcmVudDtcbiAgICBjb250ZXh0ID0gdHJhbnNpdGlvbk5vZGUuY29udGV4dDtcbiAgfVxuXG4gIHZhciBpc0FwcGVhciA9ICFjb250ZXh0Ll9pc01vdW50ZWQgfHwgIXZub2RlLmlzUm9vdEluc2VydDtcblxuICBpZiAoaXNBcHBlYXIgJiYgIWFwcGVhciAmJiBhcHBlYXIgIT09ICcnKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgc3RhcnRDbGFzcyA9IGlzQXBwZWFyID8gYXBwZWFyQ2xhc3MgOiBlbnRlckNsYXNzO1xuICB2YXIgdG9DbGFzcyA9IGlzQXBwZWFyID8gYXBwZWFyVG9DbGFzcyA6IGVudGVyVG9DbGFzcztcbiAgdmFyIGFjdGl2ZUNsYXNzID0gaXNBcHBlYXIgPyBhcHBlYXJBY3RpdmVDbGFzcyA6IGVudGVyQWN0aXZlQ2xhc3M7XG4gIHZhciBiZWZvcmVFbnRlckhvb2sgPSBpc0FwcGVhciA/IChiZWZvcmVBcHBlYXIgfHwgYmVmb3JlRW50ZXIpIDogYmVmb3JlRW50ZXI7XG4gIHZhciBlbnRlckhvb2sgPSBpc0FwcGVhciA/ICh0eXBlb2YgYXBwZWFyID09PSAnZnVuY3Rpb24nID8gYXBwZWFyIDogZW50ZXIpIDogZW50ZXI7XG4gIHZhciBhZnRlckVudGVySG9vayA9IGlzQXBwZWFyID8gKGFmdGVyQXBwZWFyIHx8IGFmdGVyRW50ZXIpIDogYWZ0ZXJFbnRlcjtcbiAgdmFyIGVudGVyQ2FuY2VsbGVkSG9vayA9IGlzQXBwZWFyID8gKGFwcGVhckNhbmNlbGxlZCB8fCBlbnRlckNhbmNlbGxlZCkgOiBlbnRlckNhbmNlbGxlZDtcblxuICB2YXIgdXNlcldhbnRzQ29udHJvbCA9XG4gICAgZW50ZXJIb29rICYmXG4gICAgLy8gZW50ZXJIb29rIG1heSBiZSBhIGJvdW5kIG1ldGhvZCB3aGljaCBleHBvc2VzXG4gICAgLy8gdGhlIGxlbmd0aCBvZiBvcmlnaW5hbCBmbiBhcyBfbGVuZ3RoXG4gICAgKGVudGVySG9vay5fbGVuZ3RoIHx8IGVudGVySG9vay5sZW5ndGgpID4gMTtcblxuICB2YXIgc3R5bGVzaGVldCA9IHZub2RlLmNvbnRleHQuJG9wdGlvbnMuc3R5bGUgfHwge307XG4gIHZhciBzdGFydFN0YXRlID0gc3R5bGVzaGVldFtzdGFydENsYXNzXTtcbiAgdmFyIHRyYW5zaXRpb25Qcm9wZXJ0aWVzID0gKHN0eWxlc2hlZXRbJ0BUUkFOU0lUSU9OJ10gJiYgc3R5bGVzaGVldFsnQFRSQU5TSVRJT04nXVthY3RpdmVDbGFzc10pIHx8IHt9O1xuICB2YXIgZW5kU3RhdGUgPSBnZXRFbnRlclRhcmdldFN0YXRlKGVsLCBzdHlsZXNoZWV0LCBzdGFydENsYXNzLCB0b0NsYXNzLCBhY3RpdmVDbGFzcywgdm5vZGUuY29udGV4dCk7XG4gIHZhciBuZWVkQW5pbWF0aW9uID0gT2JqZWN0LmtleXMoZW5kU3RhdGUpLmxlbmd0aCA+IDA7XG5cbiAgdmFyIGNiID0gZWwuX2VudGVyQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICBlbnRlckNhbmNlbGxlZEhvb2sgJiYgZW50ZXJDYW5jZWxsZWRIb29rKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWZ0ZXJFbnRlckhvb2sgJiYgYWZ0ZXJFbnRlckhvb2soZWwpO1xuICAgIH1cbiAgICBlbC5fZW50ZXJDYiA9IG51bGw7XG4gIH0pO1xuXG4gIC8vIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgbmF0aXZlIGVsZW1lbnQgaGFzIGJlZW4gaW5zZXJ0ZWQsIGJ1dCBjdXJyZW50bHlcbiAgLy8gdGhlcmUncyBubyBBUEkgdG8gZG8gdGhhdC4gU28gd2UgaGF2ZSB0byB3YWl0IFwib25lIGZyYW1lXCIgLSBub3QgZW50aXJlbHlcbiAgLy8gc3VyZSBpZiB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgZW5vdWdoIChlLmcuIG9uIHNsb3cgZGV2aWNlcz8pXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQgPSBlbC5wYXJlbnROb2RlO1xuICAgIHZhciBwZW5kaW5nTm9kZSA9IHBhcmVudCAmJiBwYXJlbnQuX3BlbmRpbmcgJiYgcGFyZW50Ll9wZW5kaW5nW3Zub2RlLmtleV07XG4gICAgaWYgKHBlbmRpbmdOb2RlICYmXG4gICAgICBwZW5kaW5nTm9kZS5jb250ZXh0ID09PSB2bm9kZS5jb250ZXh0ICYmXG4gICAgICBwZW5kaW5nTm9kZS50YWcgPT09IHZub2RlLnRhZyAmJlxuICAgICAgcGVuZGluZ05vZGUuZWxtLl9sZWF2ZUNiXG4gICAgKSB7XG4gICAgICBwZW5kaW5nTm9kZS5lbG0uX2xlYXZlQ2IoKTtcbiAgICB9XG4gICAgZW50ZXJIb29rICYmIGVudGVySG9vayhlbCwgY2IpO1xuXG4gICAgaWYgKG5lZWRBbmltYXRpb24pIHtcbiAgICAgIHZhciBhbmltYXRpb24gPSB2bm9kZS5jb250ZXh0LiRyZXF1aXJlV2VleE1vZHVsZSgnYW5pbWF0aW9uJyk7XG4gICAgICBhbmltYXRpb24udHJhbnNpdGlvbihlbC5yZWYsIHtcbiAgICAgICAgc3R5bGVzOiBlbmRTdGF0ZSxcbiAgICAgICAgZHVyYXRpb246IHRyYW5zaXRpb25Qcm9wZXJ0aWVzLmR1cmF0aW9uIHx8IDAsXG4gICAgICAgIGRlbGF5OiB0cmFuc2l0aW9uUHJvcGVydGllcy5kZWxheSB8fCAwLFxuICAgICAgICB0aW1pbmdGdW5jdGlvbjogdHJhbnNpdGlvblByb3BlcnRpZXMudGltaW5nRnVuY3Rpb24gfHwgJ2xpbmVhcidcbiAgICAgIH0sIHVzZXJXYW50c0NvbnRyb2wgPyBub29wIDogY2IpO1xuICAgIH0gZWxzZSBpZiAoIXVzZXJXYW50c0NvbnRyb2wpIHtcbiAgICAgIGNiKCk7XG4gICAgfVxuICB9LCAxNik7XG5cbiAgLy8gc3RhcnQgZW50ZXIgdHJhbnNpdGlvblxuICBiZWZvcmVFbnRlckhvb2sgJiYgYmVmb3JlRW50ZXJIb29rKGVsKTtcblxuICBpZiAoc3RhcnRTdGF0ZSkge1xuICAgIGZvciAodmFyIGtleSBpbiBzdGFydFN0YXRlKSB7XG4gICAgICBlbC5zZXRTdHlsZShrZXksIHN0YXJ0U3RhdGVba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFuZWVkQW5pbWF0aW9uICYmICF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgY2IoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsZWF2ZSAodm5vZGUsIHJtKSB7XG4gIHZhciBlbCA9IHZub2RlLmVsbTtcblxuICAvLyBjYWxsIGVudGVyIGNhbGxiYWNrIG5vd1xuICBpZiAoZWwuX2VudGVyQ2IpIHtcbiAgICBlbC5fZW50ZXJDYi5jYW5jZWxsZWQgPSB0cnVlO1xuICAgIGVsLl9lbnRlckNiKCk7XG4gIH1cblxuICB2YXIgZGF0YSA9IHJlc29sdmVUcmFuc2l0aW9uKHZub2RlLmRhdGEudHJhbnNpdGlvbik7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybiBybSgpXG4gIH1cblxuICBpZiAoZWwuX2xlYXZlQ2IpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciBsZWF2ZUNsYXNzID0gZGF0YS5sZWF2ZUNsYXNzO1xuICB2YXIgbGVhdmVUb0NsYXNzID0gZGF0YS5sZWF2ZVRvQ2xhc3M7XG4gIHZhciBsZWF2ZUFjdGl2ZUNsYXNzID0gZGF0YS5sZWF2ZUFjdGl2ZUNsYXNzO1xuICB2YXIgYmVmb3JlTGVhdmUgPSBkYXRhLmJlZm9yZUxlYXZlO1xuICB2YXIgbGVhdmUgPSBkYXRhLmxlYXZlO1xuICB2YXIgYWZ0ZXJMZWF2ZSA9IGRhdGEuYWZ0ZXJMZWF2ZTtcbiAgdmFyIGxlYXZlQ2FuY2VsbGVkID0gZGF0YS5sZWF2ZUNhbmNlbGxlZDtcbiAgdmFyIGRlbGF5TGVhdmUgPSBkYXRhLmRlbGF5TGVhdmU7XG5cbiAgdmFyIHVzZXJXYW50c0NvbnRyb2wgPVxuICAgIGxlYXZlICYmXG4gICAgLy8gbGVhdmUgaG9vayBtYXkgYmUgYSBib3VuZCBtZXRob2Qgd2hpY2ggZXhwb3Nlc1xuICAgIC8vIHRoZSBsZW5ndGggb2Ygb3JpZ2luYWwgZm4gYXMgX2xlbmd0aFxuICAgIChsZWF2ZS5fbGVuZ3RoIHx8IGxlYXZlLmxlbmd0aCkgPiAxO1xuXG4gIHZhciBzdHlsZXNoZWV0ID0gdm5vZGUuY29udGV4dC4kb3B0aW9ucy5zdHlsZSB8fCB7fTtcbiAgdmFyIHN0YXJ0U3RhdGUgPSBzdHlsZXNoZWV0W2xlYXZlQ2xhc3NdO1xuICB2YXIgZW5kU3RhdGUgPSBzdHlsZXNoZWV0W2xlYXZlVG9DbGFzc10gfHwgc3R5bGVzaGVldFtsZWF2ZUFjdGl2ZUNsYXNzXTtcbiAgdmFyIHRyYW5zaXRpb25Qcm9wZXJ0aWVzID0gKHN0eWxlc2hlZXRbJ0BUUkFOU0lUSU9OJ10gJiYgc3R5bGVzaGVldFsnQFRSQU5TSVRJT04nXVtsZWF2ZUFjdGl2ZUNsYXNzXSkgfHwge307XG5cbiAgdmFyIGNiID0gZWwuX2xlYXZlQ2IgPSBvbmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZWwucGFyZW50Tm9kZSAmJiBlbC5wYXJlbnROb2RlLl9wZW5kaW5nKSB7XG4gICAgICBlbC5wYXJlbnROb2RlLl9wZW5kaW5nW3Zub2RlLmtleV0gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICBsZWF2ZUNhbmNlbGxlZCAmJiBsZWF2ZUNhbmNlbGxlZChlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJtKCk7XG4gICAgICBhZnRlckxlYXZlICYmIGFmdGVyTGVhdmUoZWwpO1xuICAgIH1cbiAgICBlbC5fbGVhdmVDYiA9IG51bGw7XG4gIH0pO1xuXG4gIGlmIChkZWxheUxlYXZlKSB7XG4gICAgZGVsYXlMZWF2ZShwZXJmb3JtTGVhdmUpO1xuICB9IGVsc2Uge1xuICAgIHBlcmZvcm1MZWF2ZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVyZm9ybUxlYXZlICgpIHtcbiAgICB2YXIgYW5pbWF0aW9uID0gdm5vZGUuY29udGV4dC4kcmVxdWlyZVdlZXhNb2R1bGUoJ2FuaW1hdGlvbicpO1xuICAgIC8vIHRoZSBkZWxheWVkIGxlYXZlIG1heSBoYXZlIGFscmVhZHkgYmVlbiBjYW5jZWxsZWRcbiAgICBpZiAoY2IuY2FuY2VsbGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcmVjb3JkIGxlYXZpbmcgZWxlbWVudFxuICAgIGlmICghdm5vZGUuZGF0YS5zaG93KSB7XG4gICAgICAoZWwucGFyZW50Tm9kZS5fcGVuZGluZyB8fCAoZWwucGFyZW50Tm9kZS5fcGVuZGluZyA9IHt9KSlbdm5vZGUua2V5XSA9IHZub2RlO1xuICAgIH1cbiAgICBiZWZvcmVMZWF2ZSAmJiBiZWZvcmVMZWF2ZShlbCk7XG5cbiAgICBpZiAoc3RhcnRTdGF0ZSkge1xuICAgICAgYW5pbWF0aW9uLnRyYW5zaXRpb24oZWwucmVmLCB7XG4gICAgICAgIHN0eWxlczogc3RhcnRTdGF0ZVxuICAgICAgfSwgbmV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXh0ICgpIHtcbiAgICAgIGFuaW1hdGlvbi50cmFuc2l0aW9uKGVsLnJlZiwge1xuICAgICAgICBzdHlsZXM6IGVuZFN0YXRlLFxuICAgICAgICBkdXJhdGlvbjogdHJhbnNpdGlvblByb3BlcnRpZXMuZHVyYXRpb24gfHwgMCxcbiAgICAgICAgZGVsYXk6IHRyYW5zaXRpb25Qcm9wZXJ0aWVzLmRlbGF5IHx8IDAsXG4gICAgICAgIHRpbWluZ0Z1bmN0aW9uOiB0cmFuc2l0aW9uUHJvcGVydGllcy50aW1pbmdGdW5jdGlvbiB8fCAnbGluZWFyJ1xuICAgICAgfSwgdXNlcldhbnRzQ29udHJvbCA/IG5vb3AgOiBjYik7XG4gICAgfVxuXG4gICAgbGVhdmUgJiYgbGVhdmUoZWwsIGNiKTtcbiAgICBpZiAoIWVuZFN0YXRlICYmICF1c2VyV2FudHNDb250cm9sKSB7XG4gICAgICBjYigpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBkZXRlcm1pbmUgdGhlIHRhcmdldCBhbmltYXRpb24gc3R5bGUgZm9yIGFuIGVudGVyaW5nIHRyYW5zaXRpb24uXG5mdW5jdGlvbiBnZXRFbnRlclRhcmdldFN0YXRlIChlbCwgc3R5bGVzaGVldCwgc3RhcnRDbGFzcywgZW5kQ2xhc3MsIGFjdGl2ZUNsYXNzLCB2bSkge1xuICB2YXIgdGFyZ2V0U3RhdGUgPSB7fTtcbiAgdmFyIHN0YXJ0U3RhdGUgPSBzdHlsZXNoZWV0W3N0YXJ0Q2xhc3NdO1xuICB2YXIgZW5kU3RhdGUgPSBzdHlsZXNoZWV0W2VuZENsYXNzXTtcbiAgdmFyIGFjdGl2ZVN0YXRlID0gc3R5bGVzaGVldFthY3RpdmVDbGFzc107XG4gIC8vIDEuIGZhbGxiYWNrIHRvIGVsZW1lbnQncyBkZWZhdWx0IHN0eWxpbmdcbiAgaWYgKHN0YXJ0U3RhdGUpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3RhcnRTdGF0ZSkge1xuICAgICAgdGFyZ2V0U3RhdGVba2V5XSA9IGVsLnN0eWxlW2tleV07XG4gICAgICBpZiAoXG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICAgdGFyZ2V0U3RhdGVba2V5XSA9PSBudWxsICYmXG4gICAgICAgICghYWN0aXZlU3RhdGUgfHwgYWN0aXZlU3RhdGVba2V5XSA9PSBudWxsKSAmJlxuICAgICAgICAoIWVuZFN0YXRlIHx8IGVuZFN0YXRlW2tleV0gPT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICB3YXJuKFxuICAgICAgICAgIFwidHJhbnNpdGlvbiBwcm9wZXJ0eSBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgaXMgZGVjbGFyZWQgaW4gZW50ZXIgc3RhcnRpbmcgY2xhc3MgKC5cIiArIHN0YXJ0Q2xhc3MgKyBcIiksIFwiICtcbiAgICAgICAgICBcImJ1dCBub3QgZGVjbGFyZWQgYW55d2hlcmUgaW4gZW50ZXIgZW5kaW5nIGNsYXNzICguXCIgKyBlbmRDbGFzcyArIFwiKSwgXCIgK1xuICAgICAgICAgIFwiZW50ZXIgYWN0aXZlIGNhc3MgKC5cIiArIGFjdGl2ZUNsYXNzICsgXCIpIG9yIHRoZSBlbGVtZW50J3MgZGVmYXVsdCBzdHlsaW5nLiBcIiArXG4gICAgICAgICAgXCJOb3RlIGluIFdlZXgsIENTUyBwcm9wZXJ0aWVzIG5lZWQgZXhwbGljaXQgdmFsdWVzIHRvIGJlIHRyYW5zaXRpb25hYmxlLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIDIuIGlmIHN0YXRlIGlzIG1peGVkIGluIGFjdGl2ZSBzdGF0ZSwgZXh0cmFjdCB0aGVtIHdoaWxlIGV4Y2x1ZGluZ1xuICAvLyAgICB0cmFuc2l0aW9uIHByb3BlcnRpZXNcbiAgaWYgKGFjdGl2ZVN0YXRlKSB7XG4gICAgZm9yICh2YXIga2V5JDEgaW4gYWN0aXZlU3RhdGUpIHtcbiAgICAgIGlmIChrZXkkMS5pbmRleE9mKCd0cmFuc2l0aW9uJykgIT09IDApIHtcbiAgICAgICAgdGFyZ2V0U3RhdGVba2V5JDFdID0gYWN0aXZlU3RhdGVba2V5JDFdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyAzLiBleHBsaWNpdCBlbmRTdGF0ZSBoYXMgaGlnaGVzdCBwcmlvcml0eVxuICBpZiAoZW5kU3RhdGUpIHtcbiAgICBleHRlbmQodGFyZ2V0U3RhdGUsIGVuZFN0YXRlKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0U3RhdGVcbn1cblxudmFyIHBsYXRmb3JtTW9kdWxlcyA9IFtcbiAgYXR0cnMsXG4gIGtsYXNzLFxuICBldmVudHMsXG4gIHN0eWxlLFxuICB0cmFuc2l0aW9uXG5dO1xuXG4vKiAgKi9cblxuLy8gdGhlIGRpcmVjdGl2ZSBtb2R1bGUgc2hvdWxkIGJlIGFwcGxpZWQgbGFzdCwgYWZ0ZXIgYWxsXG4vLyBidWlsdC1pbiBtb2R1bGVzIGhhdmUgYmVlbiBhcHBsaWVkLlxudmFyIG1vZHVsZXMgPSBwbGF0Zm9ybU1vZHVsZXMuY29uY2F0KGJhc2VNb2R1bGVzKTtcblxudmFyIHBhdGNoID0gY3JlYXRlUGF0Y2hGdW5jdGlvbih7XG4gIG5vZGVPcHM6IG5vZGVPcHMsXG4gIG1vZHVsZXM6IG1vZHVsZXMsXG4gIExPTkdfTElTVF9USFJFU0hPTEQ6IDEwXG59KTtcblxudmFyIHBsYXRmb3JtRGlyZWN0aXZlcyA9IHtcbn07XG5cbmZ1bmN0aW9uIGdldFZOb2RlVHlwZSAodm5vZGUpIHtcbiAgaWYgKCF2bm9kZS50YWcpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICByZXR1cm4gdm5vZGUudGFnLnJlcGxhY2UoL3Z1ZVxcLWNvbXBvbmVudFxcLShcXGQrXFwtKT8vLCAnJylcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVTcGFuICh2bm9kZSkge1xuICByZXR1cm4gdm5vZGUuY2hpbGRyZW4gJiYgdm5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxICYmICF2bm9kZS5jaGlsZHJlblswXS50YWdcbn1cblxudmFyIGNzc0xlbmd0aFJFID0gL14oWystXT9bMC05XSsoXFwuWzAtOV0rKT8pKHB4fGVtfGV4fCV8aW58Y218bW18cHR8cGMpJC9pO1xuZnVuY3Rpb24gdHJpbUNTU1VuaXQgKHByb3ApIHtcbiAgdmFyIHJlcyA9IFN0cmluZyhwcm9wKS5tYXRjaChjc3NMZW5ndGhSRSk7XG4gIGlmIChyZXMpIHtcbiAgICByZXR1cm4gTnVtYmVyKHJlc1sxXSlcbiAgfVxuICByZXR1cm4gcHJvcFxufVxuXG5mdW5jdGlvbiBwYXJzZVN0eWxlICh2bm9kZSkge1xuICBpZiAoIXZub2RlIHx8ICF2bm9kZS5kYXRhKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgcmVmID0gdm5vZGUuZGF0YTtcbiAgdmFyIHN0YXRpY1N0eWxlID0gcmVmLnN0YXRpY1N0eWxlO1xuICB2YXIgc3RhdGljQ2xhc3MgPSByZWYuc3RhdGljQ2xhc3M7XG4gIGlmICh2bm9kZS5kYXRhLnN0eWxlIHx8IHZub2RlLmRhdGEuY2xhc3MgfHwgc3RhdGljU3R5bGUgfHwgc3RhdGljQ2xhc3MpIHtcbiAgICB2YXIgc3R5bGVzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGljU3R5bGUsIHZub2RlLmRhdGEuc3R5bGUpO1xuXG4gICAgdmFyIGNzc01hcCA9IHZub2RlLmNvbnRleHQuJG9wdGlvbnMuc3R5bGUgfHwge307XG4gICAgdmFyIGNsYXNzTGlzdCA9IFtdLmNvbmNhdChzdGF0aWNDbGFzcywgdm5vZGUuZGF0YS5jbGFzcyk7XG4gICAgY2xhc3NMaXN0LmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgIGlmIChuYW1lICYmIGNzc01hcFtuYW1lXSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlcywgY3NzTWFwW25hbWVdKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzdHlsZXMpIHtcbiAgICAgIHN0eWxlc1trZXldID0gdHJpbUNTU1VuaXQoc3R5bGVzW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gc3R5bGVzXG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFZOb2RlQ2hpbGRyZW4gKGNoaWxkcmVuKSB7XG4gIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW4ubWFwKGZ1bmN0aW9uICh2bm9kZSkge1xuICAgIHZhciB0eXBlID0gZ2V0Vk5vZGVUeXBlKHZub2RlKTtcbiAgICB2YXIgcHJvcHMgPSB7IHR5cGU6IHR5cGUgfTtcblxuICAgIC8vIGNvbnZlcnQgcmF3IHRleHQgbm9kZVxuICAgIGlmICghdHlwZSkge1xuICAgICAgcHJvcHMudHlwZSA9ICdzcGFuJztcbiAgICAgIHByb3BzLmF0dHIgPSB7XG4gICAgICAgIHZhbHVlOiAodm5vZGUudGV4dCB8fCAnJykudHJpbSgpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wcy5zdHlsZSA9IHBhcnNlU3R5bGUodm5vZGUpO1xuICAgICAgaWYgKHZub2RlLmRhdGEpIHtcbiAgICAgICAgcHJvcHMuYXR0ciA9IHZub2RlLmRhdGEuYXR0cnM7XG4gICAgICAgIGlmICh2bm9kZS5kYXRhLm9uKSB7XG4gICAgICAgICAgcHJvcHMuZXZlbnRzID0gdm5vZGUuZGF0YS5vbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NwYW4nICYmIGlzU2ltcGxlU3Bhbih2bm9kZSkpIHtcbiAgICAgICAgcHJvcHMuYXR0ciA9IHByb3BzLmF0dHIgfHwge307XG4gICAgICAgIHByb3BzLmF0dHIudmFsdWUgPSB2bm9kZS5jaGlsZHJlblswXS50ZXh0LnRyaW0oKTtcbiAgICAgICAgcmV0dXJuIHByb3BzXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZub2RlLmNoaWxkcmVuICYmIHZub2RlLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgcHJvcHMuY2hpbGRyZW4gPSBjb252ZXJ0Vk5vZGVDaGlsZHJlbih2bm9kZS5jaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzXG4gIH0pXG59XG5cbnZhciBSaWNodGV4dCA9IHtcbiAgbmFtZTogJ3JpY2h0ZXh0JyxcbiAgLy8gYWJzdHJhY3Q6IHRydWUsXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyIChoKSB7XG4gICAgcmV0dXJuIGgoJ3dlZXg6cmljaHRleHQnLCB7XG4gICAgICBvbjogdGhpcy5fZXZlbnRzLFxuICAgICAgYXR0cnM6IHtcbiAgICAgICAgdmFsdWU6IGNvbnZlcnRWTm9kZUNoaWxkcmVuKHRoaXMuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuIHx8IFtdKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn07XG5cbi8qICAqL1xuXG4vLyBQcm92aWRlcyB0cmFuc2l0aW9uIHN1cHBvcnQgZm9yIGEgc2luZ2xlIGVsZW1lbnQvY29tcG9uZW50LlxuLy8gc3VwcG9ydHMgdHJhbnNpdGlvbiBtb2RlIChvdXQtaW4gLyBpbi1vdXQpXG5cbnZhciB0cmFuc2l0aW9uUHJvcHMgPSB7XG4gIG5hbWU6IFN0cmluZyxcbiAgYXBwZWFyOiBCb29sZWFuLFxuICBjc3M6IEJvb2xlYW4sXG4gIG1vZGU6IFN0cmluZyxcbiAgdHlwZTogU3RyaW5nLFxuICBlbnRlckNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQ2xhc3M6IFN0cmluZyxcbiAgZW50ZXJUb0NsYXNzOiBTdHJpbmcsXG4gIGxlYXZlVG9DbGFzczogU3RyaW5nLFxuICBlbnRlckFjdGl2ZUNsYXNzOiBTdHJpbmcsXG4gIGxlYXZlQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyQWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgYXBwZWFyVG9DbGFzczogU3RyaW5nLFxuICBkdXJhdGlvbjogW051bWJlciwgU3RyaW5nLCBPYmplY3RdXG59O1xuXG4vLyBpbiBjYXNlIHRoZSBjaGlsZCBpcyBhbHNvIGFuIGFic3RyYWN0IGNvbXBvbmVudCwgZS5nLiA8a2VlcC1hbGl2ZT5cbi8vIHdlIHdhbnQgdG8gcmVjdXJzaXZlbHkgcmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IHRvIGJlIHJlbmRlcmVkXG5mdW5jdGlvbiBnZXRSZWFsQ2hpbGQgKHZub2RlKSB7XG4gIHZhciBjb21wT3B0aW9ucyA9IHZub2RlICYmIHZub2RlLmNvbXBvbmVudE9wdGlvbnM7XG4gIGlmIChjb21wT3B0aW9ucyAmJiBjb21wT3B0aW9ucy5DdG9yLm9wdGlvbnMuYWJzdHJhY3QpIHtcbiAgICByZXR1cm4gZ2V0UmVhbENoaWxkKGdldEZpcnN0Q29tcG9uZW50Q2hpbGQoY29tcE9wdGlvbnMuY2hpbGRyZW4pKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB2bm9kZVxuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RUcmFuc2l0aW9uRGF0YSAoY29tcCkge1xuICB2YXIgZGF0YSA9IHt9O1xuICB2YXIgb3B0aW9ucyA9IGNvbXAuJG9wdGlvbnM7XG4gIC8vIHByb3BzXG4gIGZvciAodmFyIGtleSBpbiBvcHRpb25zLnByb3BzRGF0YSkge1xuICAgIGRhdGFba2V5XSA9IGNvbXBba2V5XTtcbiAgfVxuICAvLyBldmVudHMuXG4gIC8vIGV4dHJhY3QgbGlzdGVuZXJzIGFuZCBwYXNzIHRoZW0gZGlyZWN0bHkgdG8gdGhlIHRyYW5zaXRpb24gbWV0aG9kc1xuICB2YXIgbGlzdGVuZXJzID0gb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO1xuICBmb3IgKHZhciBrZXkkMSBpbiBsaXN0ZW5lcnMpIHtcbiAgICBkYXRhW2NhbWVsaXplKGtleSQxKV0gPSBsaXN0ZW5lcnNba2V5JDFdO1xuICB9XG4gIHJldHVybiBkYXRhXG59XG5cbmZ1bmN0aW9uIHBsYWNlaG9sZGVyIChoLCByYXdDaGlsZCkge1xuICBpZiAoL1xcZC1rZWVwLWFsaXZlJC8udGVzdChyYXdDaGlsZC50YWcpKSB7XG4gICAgcmV0dXJuIGgoJ2tlZXAtYWxpdmUnLCB7XG4gICAgICBwcm9wczogcmF3Q2hpbGQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGFcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGhhc1BhcmVudFRyYW5zaXRpb24gKHZub2RlKSB7XG4gIHdoaWxlICgodm5vZGUgPSB2bm9kZS5wYXJlbnQpKSB7XG4gICAgaWYgKHZub2RlLmRhdGEudHJhbnNpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNTYW1lQ2hpbGQgKGNoaWxkLCBvbGRDaGlsZCkge1xuICByZXR1cm4gb2xkQ2hpbGQua2V5ID09PSBjaGlsZC5rZXkgJiYgb2xkQ2hpbGQudGFnID09PSBjaGlsZC50YWdcbn1cblxuZnVuY3Rpb24gaXNBc3luY1BsYWNlaG9sZGVyIChub2RlKSB7XG4gIHJldHVybiBub2RlLmlzQ29tbWVudCAmJiBub2RlLmFzeW5jRmFjdG9yeVxufVxuXG52YXIgVHJhbnNpdGlvbiQxID0ge1xuICBuYW1lOiAndHJhbnNpdGlvbicsXG4gIHByb3BzOiB0cmFuc2l0aW9uUHJvcHMsXG4gIGFic3RyYWN0OiB0cnVlLFxuXG4gIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyIChoKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbjtcbiAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHRleHQgbm9kZXMgKHBvc3NpYmxlIHdoaXRlc3BhY2VzKVxuICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLnRhZyB8fCBpc0FzeW5jUGxhY2Vob2xkZXIoYyk7IH0pO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB3YXJuIG11bHRpcGxlIGVsZW1lbnRzXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMSkge1xuICAgICAgd2FybihcbiAgICAgICAgJzx0cmFuc2l0aW9uPiBjYW4gb25seSBiZSB1c2VkIG9uIGEgc2luZ2xlIGVsZW1lbnQuIFVzZSAnICtcbiAgICAgICAgJzx0cmFuc2l0aW9uLWdyb3VwPiBmb3IgbGlzdHMuJyxcbiAgICAgICAgdGhpcy4kcGFyZW50XG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBtb2RlID0gdGhpcy5tb2RlO1xuXG4gICAgLy8gd2FybiBpbnZhbGlkIG1vZGVcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgbW9kZSAmJiBtb2RlICE9PSAnaW4tb3V0JyAmJiBtb2RlICE9PSAnb3V0LWluJ1xuICAgICkge1xuICAgICAgd2FybihcbiAgICAgICAgJ2ludmFsaWQgPHRyYW5zaXRpb24+IG1vZGU6ICcgKyBtb2RlLFxuICAgICAgICB0aGlzLiRwYXJlbnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIHJhd0NoaWxkID0gY2hpbGRyZW5bMF07XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgY29tcG9uZW50IHJvb3Qgbm9kZSBhbmQgdGhlIGNvbXBvbmVudCdzXG4gICAgLy8gcGFyZW50IGNvbnRhaW5lciBub2RlIGFsc28gaGFzIHRyYW5zaXRpb24sIHNraXAuXG4gICAgaWYgKGhhc1BhcmVudFRyYW5zaXRpb24odGhpcy4kdm5vZGUpKSB7XG4gICAgICByZXR1cm4gcmF3Q2hpbGRcbiAgICB9XG5cbiAgICAvLyBhcHBseSB0cmFuc2l0aW9uIGRhdGEgdG8gY2hpbGRcbiAgICAvLyB1c2UgZ2V0UmVhbENoaWxkKCkgdG8gaWdub3JlIGFic3RyYWN0IGNvbXBvbmVudHMgZS5nLiBrZWVwLWFsaXZlXG4gICAgdmFyIGNoaWxkID0gZ2V0UmVhbENoaWxkKHJhd0NoaWxkKTtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIWNoaWxkKSB7XG4gICAgICByZXR1cm4gcmF3Q2hpbGRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGVhdmluZykge1xuICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyKGgsIHJhd0NoaWxkKVxuICAgIH1cblxuICAgIC8vIGVuc3VyZSBhIGtleSB0aGF0IGlzIHVuaXF1ZSB0byB0aGUgdm5vZGUgdHlwZSBhbmQgdG8gdGhpcyB0cmFuc2l0aW9uXG4gICAgLy8gY29tcG9uZW50IGluc3RhbmNlLiBUaGlzIGtleSB3aWxsIGJlIHVzZWQgdG8gcmVtb3ZlIHBlbmRpbmcgbGVhdmluZyBub2Rlc1xuICAgIC8vIGR1cmluZyBlbnRlcmluZy5cbiAgICB2YXIgaWQgPSBcIl9fdHJhbnNpdGlvbi1cIiArICh0aGlzLl91aWQpICsgXCItXCI7XG4gICAgY2hpbGQua2V5ID0gY2hpbGQua2V5ID09IG51bGxcbiAgICAgID8gY2hpbGQuaXNDb21tZW50XG4gICAgICAgID8gaWQgKyAnY29tbWVudCdcbiAgICAgICAgOiBpZCArIGNoaWxkLnRhZ1xuICAgICAgOiBpc1ByaW1pdGl2ZShjaGlsZC5rZXkpXG4gICAgICAgID8gKFN0cmluZyhjaGlsZC5rZXkpLmluZGV4T2YoaWQpID09PSAwID8gY2hpbGQua2V5IDogaWQgKyBjaGlsZC5rZXkpXG4gICAgICAgIDogY2hpbGQua2V5O1xuXG4gICAgdmFyIGRhdGEgPSAoY2hpbGQuZGF0YSB8fCAoY2hpbGQuZGF0YSA9IHt9KSkudHJhbnNpdGlvbiA9IGV4dHJhY3RUcmFuc2l0aW9uRGF0YSh0aGlzKTtcbiAgICB2YXIgb2xkUmF3Q2hpbGQgPSB0aGlzLl92bm9kZTtcbiAgICB2YXIgb2xkQ2hpbGQgPSBnZXRSZWFsQ2hpbGQob2xkUmF3Q2hpbGQpO1xuXG4gICAgLy8gbWFyayB2LXNob3dcbiAgICAvLyBzbyB0aGF0IHRoZSB0cmFuc2l0aW9uIG1vZHVsZSBjYW4gaGFuZCBvdmVyIHRoZSBjb250cm9sIHRvIHRoZSBkaXJlY3RpdmVcbiAgICBpZiAoY2hpbGQuZGF0YS5kaXJlY3RpdmVzICYmIGNoaWxkLmRhdGEuZGlyZWN0aXZlcy5zb21lKGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLm5hbWUgPT09ICdzaG93JzsgfSkpIHtcbiAgICAgIGNoaWxkLmRhdGEuc2hvdyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgb2xkQ2hpbGQgJiZcbiAgICAgIG9sZENoaWxkLmRhdGEgJiZcbiAgICAgICFpc1NhbWVDaGlsZChjaGlsZCwgb2xkQ2hpbGQpICYmXG4gICAgICAhaXNBc3luY1BsYWNlaG9sZGVyKG9sZENoaWxkKVxuICAgICkge1xuICAgICAgLy8gcmVwbGFjZSBvbGQgY2hpbGQgdHJhbnNpdGlvbiBkYXRhIHdpdGggZnJlc2ggb25lXG4gICAgICAvLyBpbXBvcnRhbnQgZm9yIGR5bmFtaWMgdHJhbnNpdGlvbnMhXG4gICAgICB2YXIgb2xkRGF0YSA9IG9sZENoaWxkICYmIChvbGRDaGlsZC5kYXRhLnRyYW5zaXRpb24gPSBleHRlbmQoe30sIGRhdGEpKTtcbiAgICAgIC8vIGhhbmRsZSB0cmFuc2l0aW9uIG1vZGVcbiAgICAgIGlmIChtb2RlID09PSAnb3V0LWluJykge1xuICAgICAgICAvLyByZXR1cm4gcGxhY2Vob2xkZXIgbm9kZSBhbmQgcXVldWUgdXBkYXRlIHdoZW4gbGVhdmUgZmluaXNoZXNcbiAgICAgICAgdGhpcy5fbGVhdmluZyA9IHRydWU7XG4gICAgICAgIG1lcmdlVk5vZGVIb29rKG9sZERhdGEsICdhZnRlckxlYXZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMkMS5fbGVhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMkMS4kZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcihoLCByYXdDaGlsZClcbiAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ2luLW91dCcpIHtcbiAgICAgICAgaWYgKGlzQXN5bmNQbGFjZWhvbGRlcihjaGlsZCkpIHtcbiAgICAgICAgICByZXR1cm4gb2xkUmF3Q2hpbGRcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsYXllZExlYXZlO1xuICAgICAgICB2YXIgcGVyZm9ybUxlYXZlID0gZnVuY3Rpb24gKCkgeyBkZWxheWVkTGVhdmUoKTsgfTtcbiAgICAgICAgbWVyZ2VWTm9kZUhvb2soZGF0YSwgJ2FmdGVyRW50ZXInLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhkYXRhLCAnZW50ZXJDYW5jZWxsZWQnLCBwZXJmb3JtTGVhdmUpO1xuICAgICAgICBtZXJnZVZOb2RlSG9vayhvbGREYXRhLCAnZGVsYXlMZWF2ZScsIGZ1bmN0aW9uIChsZWF2ZSkgeyBkZWxheWVkTGVhdmUgPSBsZWF2ZTsgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJhd0NoaWxkXG4gIH1cbn07XG5cbi8vIHJldXNlIHNhbWUgdHJhbnNpdGlvbiBjb21wb25lbnQgbG9naWMgZnJvbSB3ZWJcblxudmFyIHByb3BzID0gZXh0ZW5kKHtcbiAgdGFnOiBTdHJpbmcsXG4gIG1vdmVDbGFzczogU3RyaW5nXG59LCB0cmFuc2l0aW9uUHJvcHMpO1xuXG5kZWxldGUgcHJvcHMubW9kZTtcblxudmFyIFRyYW5zaXRpb25Hcm91cCA9IHtcbiAgcHJvcHM6IHByb3BzLFxuXG4gIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQgKCkge1xuICAgIHZhciBkb20gPSB0aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgnZG9tJyk7XG4gICAgdGhpcy5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZG9tLmdldENvbXBvbmVudFJlY3QoZWwucmVmLCBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgIGlmICghcmVzLnJlc3VsdCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoKFwiZmFpbGVkIHRvIGdldCByZWN0IGZvciBlbGVtZW50OiBcIiArIChlbC50YWcpKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUocmVzLnNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTsgfTtcblxuICAgIHZhciBhbmltYXRpb24gPSB0aGlzLiRyZXF1aXJlV2VleE1vZHVsZSgnYW5pbWF0aW9uJyk7XG4gICAgdGhpcy5hbmltYXRlID0gZnVuY3Rpb24gKGVsLCBvcHRpb25zKSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgYW5pbWF0aW9uLnRyYW5zaXRpb24oZWwucmVmLCBvcHRpb25zLCByZXNvbHZlKTtcbiAgICB9KTsgfTtcbiAgfSxcblxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlciAoaCkge1xuICAgIHZhciB0YWcgPSB0aGlzLnRhZyB8fCB0aGlzLiR2bm9kZS5kYXRhLnRhZyB8fCAnc3Bhbic7XG4gICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdmFyIHByZXZDaGlsZHJlbiA9IHRoaXMucHJldkNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcbiAgICB2YXIgcmF3Q2hpbGRyZW4gPSB0aGlzLiRzbG90cy5kZWZhdWx0IHx8IFtdO1xuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB2YXIgdHJhbnNpdGlvbkRhdGEgPSBleHRyYWN0VHJhbnNpdGlvbkRhdGEodGhpcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhd0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHJhd0NoaWxkcmVuW2ldO1xuICAgICAgaWYgKGMudGFnKSB7XG4gICAgICAgIGlmIChjLmtleSAhPSBudWxsICYmIFN0cmluZyhjLmtleSkuaW5kZXhPZignX192bGlzdCcpICE9PSAwKSB7XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChjKTtcbiAgICAgICAgICBtYXBbYy5rZXldID0gY1xuICAgICAgICAgIDsoYy5kYXRhIHx8IChjLmRhdGEgPSB7fSkpLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgdmFyIG9wdHMgPSBjLmNvbXBvbmVudE9wdGlvbnM7XG4gICAgICAgICAgdmFyIG5hbWUgPSBvcHRzXG4gICAgICAgICAgICA/IChvcHRzLkN0b3Iub3B0aW9ucy5uYW1lIHx8IG9wdHMudGFnKVxuICAgICAgICAgICAgOiBjLnRhZztcbiAgICAgICAgICB3YXJuKChcIjx0cmFuc2l0aW9uLWdyb3VwPiBjaGlsZHJlbiBtdXN0IGJlIGtleWVkOiA8XCIgKyBuYW1lICsgXCI+XCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHZhciBrZXB0ID0gW107XG4gICAgICB2YXIgcmVtb3ZlZCA9IFtdO1xuICAgICAgcHJldkNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgYy5kYXRhLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRGF0YTtcblxuICAgICAgICAvLyBUT0RPOiByZWNvcmQgYmVmb3JlIHBhdGNoIHBvc2l0aW9uc1xuXG4gICAgICAgIGlmIChtYXBbYy5rZXldKSB7XG4gICAgICAgICAga2VwdC5wdXNoKGMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbW92ZWQucHVzaChjKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmtlcHQgPSBoKHRhZywgbnVsbCwga2VwdCk7XG4gICAgICB0aGlzLnJlbW92ZWQgPSByZW1vdmVkO1xuICAgIH1cblxuICAgIHJldHVybiBoKHRhZywgbnVsbCwgY2hpbGRyZW4pXG4gIH0sXG5cbiAgYmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBiZWZvcmVVcGRhdGUgKCkge1xuICAgIC8vIGZvcmNlIHJlbW92aW5nIHBhc3NcbiAgICB0aGlzLl9fcGF0Y2hfXyhcbiAgICAgIHRoaXMuX3Zub2RlLFxuICAgICAgdGhpcy5rZXB0LFxuICAgICAgZmFsc2UsIC8vIGh5ZHJhdGluZ1xuICAgICAgdHJ1ZSAvLyByZW1vdmVPbmx5ICghaW1wb3J0YW50LCBhdm9pZHMgdW5uZWNlc3NhcnkgbW92ZXMpXG4gICAgKTtcbiAgICB0aGlzLl92bm9kZSA9IHRoaXMua2VwdDtcbiAgfSxcblxuICB1cGRhdGVkOiBmdW5jdGlvbiB1cGRhdGVkICgpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByZXZDaGlsZHJlbjtcbiAgICB2YXIgbW92ZUNsYXNzID0gdGhpcy5tb3ZlQ2xhc3MgfHwgKCh0aGlzLm5hbWUgfHwgJ3YnKSArICctbW92ZScpO1xuICAgIHZhciBtb3ZlRGF0YSA9IGNoaWxkcmVuLmxlbmd0aCAmJiB0aGlzLmdldE1vdmVEYXRhKGNoaWxkcmVuWzBdLmNvbnRleHQsIG1vdmVDbGFzcyk7XG4gICAgaWYgKCFtb3ZlRGF0YSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVE9ETzogZmluaXNoIGltcGxlbWVudGluZyBtb3ZlIGFuaW1hdGlvbnMgb25jZVxuICAgIC8vIHdlIGhhdmUgYWNjZXNzIHRvIHN5bmMgZ2V0Q29tcG9uZW50UmVjdCgpXG5cbiAgICAvLyBjaGlsZHJlbi5mb3JFYWNoKGNhbGxQZW5kaW5nQ2JzKVxuXG4gICAgLy8gUHJvbWlzZS5hbGwoY2hpbGRyZW4ubWFwKGMgPT4ge1xuICAgIC8vICAgY29uc3Qgb2xkUG9zID0gYy5kYXRhLnBvc1xuICAgIC8vICAgY29uc3QgbmV3UG9zID0gYy5kYXRhLm5ld1Bvc1xuICAgIC8vICAgY29uc3QgZHggPSBvbGRQb3MubGVmdCAtIG5ld1Bvcy5sZWZ0XG4gICAgLy8gICBjb25zdCBkeSA9IG9sZFBvcy50b3AgLSBuZXdQb3MudG9wXG4gICAgLy8gICBpZiAoZHggfHwgZHkpIHtcbiAgICAvLyAgICAgYy5kYXRhLm1vdmVkID0gdHJ1ZVxuICAgIC8vICAgICByZXR1cm4gdGhpcy5hbmltYXRlKGMuZWxtLCB7XG4gICAgLy8gICAgICAgc3R5bGVzOiB7XG4gICAgLy8gICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHtkeH1weCwke2R5fXB4KWBcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICB9XG4gICAgLy8gfSkpLnRoZW4oKCkgPT4ge1xuICAgIC8vICAgY2hpbGRyZW4uZm9yRWFjaChjID0+IHtcbiAgICAvLyAgICAgaWYgKGMuZGF0YS5tb3ZlZCkge1xuICAgIC8vICAgICAgIHRoaXMuYW5pbWF0ZShjLmVsbSwge1xuICAgIC8vICAgICAgICAgc3R5bGVzOiB7XG4gICAgLy8gICAgICAgICAgIHRyYW5zZm9ybTogJydcbiAgICAvLyAgICAgICAgIH0sXG4gICAgLy8gICAgICAgICBkdXJhdGlvbjogbW92ZURhdGEuZHVyYXRpb24gfHwgMCxcbiAgICAvLyAgICAgICAgIGRlbGF5OiBtb3ZlRGF0YS5kZWxheSB8fCAwLFxuICAgIC8vICAgICAgICAgdGltaW5nRnVuY3Rpb246IG1vdmVEYXRhLnRpbWluZ0Z1bmN0aW9uIHx8ICdsaW5lYXInXG4gICAgLy8gICAgICAgfSlcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSlcbiAgICAvLyB9KVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICBnZXRNb3ZlRGF0YTogZnVuY3Rpb24gZ2V0TW92ZURhdGEgKGNvbnRleHQsIG1vdmVDbGFzcykge1xuICAgICAgdmFyIHN0eWxlc2hlZXQgPSBjb250ZXh0LiRvcHRpb25zLnN0eWxlIHx8IHt9O1xuICAgICAgcmV0dXJuIHN0eWxlc2hlZXRbJ0BUUkFOU0lUSU9OJ10gJiYgc3R5bGVzaGVldFsnQFRSQU5TSVRJT04nXVttb3ZlQ2xhc3NdXG4gICAgfVxuICB9XG59O1xuXG4vLyBmdW5jdGlvbiBjYWxsUGVuZGluZ0NicyAoYykge1xuLy8gICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbi8vICAgaWYgKGMuZWxtLl9tb3ZlQ2IpIHtcbi8vICAgICBjLmVsbS5fbW92ZUNiKClcbi8vICAgfVxuLy8gICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbi8vICAgaWYgKGMuZWxtLl9lbnRlckNiKSB7XG4vLyAgICAgYy5lbG0uX2VudGVyQ2IoKVxuLy8gICB9XG4vLyB9XG5cbnZhciBwbGF0Zm9ybUNvbXBvbmVudHMgPSB7XG4gIFJpY2h0ZXh0OiBSaWNodGV4dCxcbiAgVHJhbnNpdGlvbjogVHJhbnNpdGlvbiQxLFxuICBUcmFuc2l0aW9uR3JvdXA6IFRyYW5zaXRpb25Hcm91cFxufTtcblxuLyogZ2xvYmFscyByZW5kZXJlciAqL1xuXG52YXIgaXNSZXNlcnZlZFRhZyA9IG1ha2VNYXAoXG4gICd0ZW1wbGF0ZSxzY3JpcHQsc3R5bGUsZWxlbWVudCxjb250ZW50LHNsb3QsbGluayxtZXRhLHN2Zyx2aWV3LCcgK1xuICAnYSxkaXYsaW1nLGltYWdlLHRleHQsc3BhbixpbnB1dCxzd2l0Y2gsdGV4dGFyZWEsc3Bpbm5lcixzZWxlY3QsJyArXG4gICdzbGlkZXIsc2xpZGVyLW5laWdoYm9yLGluZGljYXRvcixjYW52YXMsJyArXG4gICdsaXN0LGNlbGwsaGVhZGVyLGxvYWRpbmcsbG9hZGluZy1pbmRpY2F0b3IscmVmcmVzaCxzY3JvbGxhYmxlLHNjcm9sbGVyLCcgK1xuICAndmlkZW8sd2ViLGVtYmVkLHRhYmJhcix0YWJoZWFkZXIsZGF0ZXBpY2tlcix0aW1lcGlja2VyLG1hcnF1ZWUsY291bnRkb3duJyxcbiAgdHJ1ZVxuKTtcblxuLy8gRWxlbWVudHMgdGhhdCB5b3UgY2FuLCBpbnRlbnRpb25hbGx5LCBsZWF2ZSBvcGVuIChhbmQgd2hpY2ggY2xvc2UgdGhlbXNlbHZlcylcbi8vIG1vcmUgZmxleGFibGUgdGhhbiB3ZWJcbnZhciBjYW5CZUxlZnRPcGVuVGFnID0gbWFrZU1hcChcbiAgJ3dlYixzcGlubmVyLHN3aXRjaCx2aWRlbyx0ZXh0YXJlYSxjYW52YXMsJyArXG4gICdpbmRpY2F0b3IsbWFycXVlZSxjb3VudGRvd24nLFxuICB0cnVlXG4pO1xuXG52YXIgaXNSdW50aW1lQ29tcG9uZW50ID0gbWFrZU1hcChcbiAgJ3JpY2h0ZXh0LHRyaXNpdGlvbix0cmlzaXRpb24tZ3JvdXAnLFxuICB0cnVlXG4pO1xuXG52YXIgaXNVbmFyeVRhZyA9IG1ha2VNYXAoXG4gICdlbWJlZCxpbWcsaW1hZ2UsaW5wdXQsbGluayxtZXRhJyxcbiAgdHJ1ZVxuKTtcblxuZnVuY3Rpb24gbXVzdFVzZVByb3AgKCkgeyAvKiBjb25zb2xlLmxvZygnbXVzdFVzZVByb3AnKSAqLyB9XG5cbmZ1bmN0aW9uIGlzVW5rbm93bkVsZW1lbnQgKCkgeyAvKiBjb25zb2xlLmxvZygnaXNVbmtub3duRWxlbWVudCcpICovIH1cblxuZnVuY3Rpb24gcXVlcnkgKGVsLCBkb2N1bWVudCkge1xuICAvLyByZW5kZXJlciBpcyBpbmplY3RlZCBieSB3ZWV4IGZhY3Rvcnkgd3JhcHBlclxuICB2YXIgcGxhY2Vob2xkZXIgPSBuZXcgcmVuZGVyZXIuQ29tbWVudCgncm9vdCcpO1xuICBwbGFjZWhvbGRlci5oYXNBdHRyaWJ1dGUgPSBwbGFjZWhvbGRlci5yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoKSB7fTsgLy8gaGFjayBmb3IgcGF0Y2hcbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHBsYWNlaG9sZGVyKTtcbiAgcmV0dXJuIHBsYWNlaG9sZGVyXG59XG5cbi8qICAqL1xuXG4vLyBpbnN0YWxsIHBsYXRmb3JtIHNwZWNpZmljIHV0aWxzXG5WdWUkMi5jb25maWcubXVzdFVzZVByb3AgPSBtdXN0VXNlUHJvcDtcblZ1ZSQyLmNvbmZpZy5pc1Jlc2VydmVkVGFnID0gaXNSZXNlcnZlZFRhZztcblZ1ZSQyLmNvbmZpZy5pc1J1bnRpbWVDb21wb25lbnQgPSBpc1J1bnRpbWVDb21wb25lbnQ7XG5WdWUkMi5jb25maWcuaXNVbmtub3duRWxlbWVudCA9IGlzVW5rbm93bkVsZW1lbnQ7XG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcnVudGltZSBkaXJlY3RpdmVzIGFuZCBjb21wb25lbnRzXG5WdWUkMi5vcHRpb25zLmRpcmVjdGl2ZXMgPSBwbGF0Zm9ybURpcmVjdGl2ZXM7XG5WdWUkMi5vcHRpb25zLmNvbXBvbmVudHMgPSBwbGF0Zm9ybUNvbXBvbmVudHM7XG5cbi8vIGluc3RhbGwgcGxhdGZvcm0gcGF0Y2ggZnVuY3Rpb25cblZ1ZSQyLnByb3RvdHlwZS5fX3BhdGNoX18gPSBwYXRjaDtcblxuLy8gd3JhcCBtb3VudFxuVnVlJDIucHJvdG90eXBlLiRtb3VudCA9IGZ1bmN0aW9uIChcbiAgZWwsXG4gIGh5ZHJhdGluZ1xuKSB7XG4gIHJldHVybiBtb3VudENvbXBvbmVudChcbiAgICB0aGlzLFxuICAgIGVsICYmIHF1ZXJ5KGVsLCB0aGlzLiRkb2N1bWVudCksXG4gICAgaHlkcmF0aW5nXG4gIClcbn07XG5cbi8vIHRoaXMgZW50cnkgaXMgYnVpbHQgYW5kIHdyYXBwZWQgd2l0aCBhIGZhY3RvcnkgZnVuY3Rpb25cbi8vIHVzZWQgdG8gZ2VuZXJhdGUgYSBmcmVzaCBjb3B5IG9mIFZ1ZSBmb3IgZXZlcnkgV2VleCBpbnN0YW5jZS5cblxuZXhwb3J0cy5WdWUgPSBWdWUkMjtcblxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgbGF0ZXN0Tm9kZUlkID0gMTtcblxuZnVuY3Rpb24gVGV4dE5vZGUgKHRleHQpIHtcbiAgdGhpcy5pbnN0YW5jZUlkID0gJyc7XG4gIHRoaXMubm9kZUlkID0gbGF0ZXN0Tm9kZUlkKys7XG4gIHRoaXMucGFyZW50Tm9kZSA9IG51bGw7XG4gIHRoaXMubm9kZVR5cGUgPSAzO1xuICB0aGlzLnRleHQgPSB0ZXh0O1xufVxuXG4vLyB0aGlzIHdpbGwgYmUgcHJlc2VydmVkIGR1cmluZyBidWlsZFxudmFyIFZ1ZUZhY3RvcnkgPSByZXF1aXJlKCcuL2ZhY3RvcnknKTtcblxudmFyIGluc3RhbmNlcyA9IHt9O1xudmFyIG1vZHVsZXMgPSB7fTtcbnZhciBjb21wb25lbnRzID0ge307XG5cbnZhciByZW5kZXJlciA9IHtcbiAgVGV4dE5vZGU6IFRleHROb2RlLFxuICBpbnN0YW5jZXM6IGluc3RhbmNlcyxcbiAgbW9kdWxlczogbW9kdWxlcyxcbiAgY29tcG9uZW50czogY29tcG9uZW50c1xufTtcblxuLyoqXG4gKiBQcmVwYXJlIGZyYW1ld29yayBjb25maWcsIGJhc2ljYWxseSBhYm91dCB0aGUgdmlydHVhbC1ET00gYW5kIEpTIGJyaWRnZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBjZmdcbiAqL1xuZnVuY3Rpb24gaW5pdCAoY2ZnKSB7XG4gIHJlbmRlcmVyLkRvY3VtZW50ID0gY2ZnLkRvY3VtZW50O1xuICByZW5kZXJlci5FbGVtZW50ID0gY2ZnLkVsZW1lbnQ7XG4gIHJlbmRlcmVyLkNvbW1lbnQgPSBjZmcuQ29tbWVudDtcbiAgcmVuZGVyZXIuY29tcGlsZUJ1bmRsZSA9IGNmZy5jb21waWxlQnVuZGxlO1xufVxuXG4vKipcbiAqIFJlc2V0IGZyYW1ld29yayBjb25maWcgYW5kIGNsZWFyIGFsbCByZWdpc3RyYXRpb25zLlxuICovXG5mdW5jdGlvbiByZXNldCAoKSB7XG4gIGNsZWFyKGluc3RhbmNlcyk7XG4gIGNsZWFyKG1vZHVsZXMpO1xuICBjbGVhcihjb21wb25lbnRzKTtcbiAgZGVsZXRlIHJlbmRlcmVyLkRvY3VtZW50O1xuICBkZWxldGUgcmVuZGVyZXIuRWxlbWVudDtcbiAgZGVsZXRlIHJlbmRlcmVyLkNvbW1lbnQ7XG4gIGRlbGV0ZSByZW5kZXJlci5jb21waWxlQnVuZGxlO1xufVxuXG4vKipcbiAqIERlbGV0ZSBhbGwga2V5cyBvZiBhbiBvYmplY3QuXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqXG4gKi9cbmZ1bmN0aW9uIGNsZWFyIChvYmopIHtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGRlbGV0ZSBvYmpba2V5XTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBpbnN0YW5jZSB3aXRoIGlkLCBjb2RlLCBjb25maWcgYW5kIGV4dGVybmFsIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFuY2VJZFxuICogQHBhcmFtIHtzdHJpbmd9IGFwcENvZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWdcbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gKiBAcGFyYW0ge29iamVjdH0gZW52IHsgaW5mbywgY29uZmlnLCBzZXJ2aWNlcyB9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlIChcbiAgaW5zdGFuY2VJZCxcbiAgYXBwQ29kZSxcbiAgY29uZmlnLFxuICBkYXRhLFxuICBlbnZcbikge1xuICBpZiAoIGFwcENvZGUgPT09IHZvaWQgMCApIGFwcENvZGUgPSAnJztcbiAgaWYgKCBjb25maWcgPT09IHZvaWQgMCApIGNvbmZpZyA9IHt9O1xuICBpZiAoIGVudiA9PT0gdm9pZCAwICkgZW52ID0ge307XG5cbiAgLy8gVmlydHVhbC1ET00gb2JqZWN0LlxuICB2YXIgZG9jdW1lbnQgPSBuZXcgcmVuZGVyZXIuRG9jdW1lbnQoaW5zdGFuY2VJZCwgY29uZmlnLmJ1bmRsZVVybCk7XG5cbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdID0ge1xuICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlSWQsIGNvbmZpZzogY29uZmlnLCBkYXRhOiBkYXRhLFxuICAgIGRvY3VtZW50OiBkb2N1bWVudFxuICB9O1xuXG4gIC8vIFByZXBhcmUgbmF0aXZlIG1vZHVsZSBnZXR0ZXIgYW5kIEhUTUw1IFRpbWVyIEFQSXMuXG4gIHZhciBtb2R1bGVHZXR0ZXIgPSBnZW5Nb2R1bGVHZXR0ZXIoaW5zdGFuY2VJZCk7XG4gIHZhciB0aW1lckFQSXMgPSBnZXRJbnN0YW5jZVRpbWVyKGluc3RhbmNlSWQsIG1vZHVsZUdldHRlcik7XG5cbiAgLy8gUHJlcGFyZSBgd2VleGAgaW5zdGFuY2UgdmFyaWFibGUuXG4gIHZhciB3ZWV4SW5zdGFuY2VWYXIgPSB7XG4gICAgY29uZmlnOiBjb25maWcsXG4gICAgZG9jdW1lbnQ6IGRvY3VtZW50LFxuICAgIHN1cHBvcnRzOiBzdXBwb3J0cyxcbiAgICByZXF1aXJlTW9kdWxlOiBtb2R1bGVHZXR0ZXJcbiAgfTtcbiAgT2JqZWN0LmZyZWV6ZSh3ZWV4SW5zdGFuY2VWYXIpO1xuXG4gIC8vIEVhY2ggaW5zdGFuY2UgaGFzIGEgaW5kZXBlbmRlbnQgYFZ1ZWAgbW9kdWxlIGluc3RhbmNlXG4gIHZhciBWdWUgPSBpbnN0YW5jZS5WdWUgPSBjcmVhdGVWdWVNb2R1bGVJbnN0YW5jZShpbnN0YW5jZUlkLCBtb2R1bGVHZXR0ZXIpO1xuXG4gIC8vIFRoZSBmdW5jdGlvbiB3aGljaCBjcmVhdGUgYSBjbG9zdXJlIHRoZSBKUyBCdW5kbGUgd2lsbCBydW4gaW4uXG4gIC8vIEl0IHdpbGwgZGVjbGFyZSBzb21lIGluc3RhbmNlIHZhcmlhYmxlcyBsaWtlIGBWdWVgLCBIVE1MNSBUaW1lciBBUElzIGV0Yy5cbiAgdmFyIGluc3RhbmNlVmFycyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIFZ1ZTogVnVlLFxuICAgIHdlZXg6IHdlZXhJbnN0YW5jZVZhclxuICB9LCB0aW1lckFQSXMsIGVudi5zZXJ2aWNlcyk7XG5cbiAgYXBwQ29kZSA9IFwiKGZ1bmN0aW9uKGdsb2JhbCl7IFxcblwiICsgYXBwQ29kZSArIFwiXFxuIH0pKE9iamVjdC5jcmVhdGUodGhpcykpXCI7XG5cbiAgaWYgKCFjYWxsRnVuY3Rpb25OYXRpdmUoaW5zdGFuY2VWYXJzLCBhcHBDb2RlKSkge1xuICAgIC8vIElmIGZhaWxlZCB0byBjb21waWxlIGZ1bmN0aW9uQm9keSBvbiBuYXRpdmUgc2lkZSxcbiAgICAvLyBmYWxsYmFjayB0byAnY2FsbEZ1bmN0aW9uKCknLlxuICAgIGNhbGxGdW5jdGlvbihpbnN0YW5jZVZhcnMsIGFwcENvZGUpO1xuICB9XG5cbiAgLy8gU2VuZCBgY3JlYXRlRmluaXNoYCBzaWduYWwgaW4gbmV4dCB0aWNrLlxuICB0aW1lckFQSXMuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgaW5zdGFuY2UuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ2NyZWF0ZUZpbmlzaCcgfSwgW10pO1xuICB9LCAwKTtcblxuICByZXR1cm4gaW5zdGFuY2Vcbn1cblxuLyoqXG4gKiBEZXN0cm95IGFuIGluc3RhbmNlIHdpdGggaWQuIEl0IHdpbGwgbWFrZSBzdXJlIGFsbCBtZW1vcnkgb2ZcbiAqIHRoaXMgaW5zdGFuY2UgcmVsZWFzZWQgYW5kIG5vIG1vcmUgbGVha3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdGFuY2VJZFxuICovXG5mdW5jdGlvbiBkZXN0cm95SW5zdGFuY2UgKGluc3RhbmNlSWQpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuYXBwIGluc3RhbmNlb2YgaW5zdGFuY2UuVnVlKSB7XG4gICAgaW5zdGFuY2UuZG9jdW1lbnQuZGVzdHJveSgpO1xuICAgIGluc3RhbmNlLmFwcC4kZGVzdHJveSgpO1xuICB9XG4gIGRlbGV0ZSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG59XG5cbi8qKlxuICogUmVmcmVzaCBhbiBpbnN0YW5jZSB3aXRoIGlkIGFuZCBuZXcgdG9wLWxldmVsIGNvbXBvbmVudCBkYXRhLlxuICogSXQgd2lsbCB1c2UgYFZ1ZS5zZXRgIG9uIGFsbCBrZXlzIG9mIHRoZSBuZXcgZGF0YS4gU28gaXQncyBiZXR0ZXJcbiAqIGRlZmluZSBhbGwgcG9zc2libGUgbWVhbmluZ2Z1bCBrZXlzIHdoZW4gaW5zdGFuY2UgY3JlYXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YW5jZUlkXG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICovXG5mdW5jdGlvbiByZWZyZXNoSW5zdGFuY2UgKGluc3RhbmNlSWQsIGRhdGEpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICBpZiAoIWluc3RhbmNlIHx8ICEoaW5zdGFuY2UuYXBwIGluc3RhbmNlb2YgaW5zdGFuY2UuVnVlKSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoKFwicmVmcmVzaEluc3RhbmNlOiBpbnN0YW5jZSBcIiArIGluc3RhbmNlSWQgKyBcIiBub3QgZm91bmQhXCIpKVxuICB9XG4gIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgaW5zdGFuY2UuVnVlLnNldChpbnN0YW5jZS5hcHAsIGtleSwgZGF0YVtrZXldKTtcbiAgfVxuICAvLyBGaW5hbGx5IGByZWZyZXNoRmluaXNoYCBzaWduYWwgbmVlZGVkLlxuICBpbnN0YW5jZS5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAncmVmcmVzaEZpbmlzaCcgfSwgW10pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgSlNPTiBvYmplY3Qgb2YgdGhlIHJvb3QgZWxlbWVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YW5jZUlkXG4gKi9cbmZ1bmN0aW9uIGdldFJvb3QgKGluc3RhbmNlSWQpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICBpZiAoIWluc3RhbmNlIHx8ICEoaW5zdGFuY2UuYXBwIGluc3RhbmNlb2YgaW5zdGFuY2UuVnVlKSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoKFwiZ2V0Um9vdDogaW5zdGFuY2UgXCIgKyBpbnN0YW5jZUlkICsgXCIgbm90IGZvdW5kIVwiKSlcbiAgfVxuICByZXR1cm4gaW5zdGFuY2UuYXBwLiRlbC50b0pTT04oKVxufVxuXG52YXIganNIYW5kbGVycyA9IHtcbiAgZmlyZUV2ZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgICByZXR1cm4gZmlyZUV2ZW50LmFwcGx5KHZvaWQgMCwgWyBpbnN0YW5jZXNbaWRdIF0uY29uY2F0KCBhcmdzICkpXG4gIH0sXG4gIGNhbGxiYWNrOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoIGxlbi0tID4gMCApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gKyAxIF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodm9pZCAwLCBbIGluc3RhbmNlc1tpZF0gXS5jb25jYXQoIGFyZ3MgKSlcbiAgfVxufTtcblxuZnVuY3Rpb24gZmlyZUV2ZW50IChpbnN0YW5jZSwgbm9kZUlkLCB0eXBlLCBlLCBkb21DaGFuZ2VzKSB7XG4gIHZhciBlbCA9IGluc3RhbmNlLmRvY3VtZW50LmdldFJlZihub2RlSWQpO1xuICBpZiAoZWwpIHtcbiAgICByZXR1cm4gaW5zdGFuY2UuZG9jdW1lbnQuZmlyZUV2ZW50KGVsLCB0eXBlLCBlLCBkb21DaGFuZ2VzKVxuICB9XG4gIHJldHVybiBuZXcgRXJyb3IoKFwiaW52YWxpZCBlbGVtZW50IHJlZmVyZW5jZSBcXFwiXCIgKyBub2RlSWQgKyBcIlxcXCJcIikpXG59XG5cbmZ1bmN0aW9uIGNhbGxiYWNrIChpbnN0YW5jZSwgY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpIHtcbiAgdmFyIHJlc3VsdCA9IGluc3RhbmNlLmRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2soY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpO1xuICBpbnN0YW5jZS5kb2N1bWVudC50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAndXBkYXRlRmluaXNoJyB9LCBbXSk7XG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBBY2NlcHQgY2FsbHMgZnJvbSBuYXRpdmUgKGV2ZW50IG9yIGNhbGxiYWNrKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0gIHthcnJheX0gdGFza3MgbGlzdCB3aXRoIGBtZXRob2RgIGFuZCBgYXJnc2BcbiAqL1xuZnVuY3Rpb24gcmVjZWl2ZVRhc2tzIChpZCwgdGFza3MpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2lkXTtcbiAgaWYgKGluc3RhbmNlICYmIEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICB0YXNrcy5mb3JFYWNoKGZ1bmN0aW9uICh0YXNrKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IGpzSGFuZGxlcnNbdGFzay5tZXRob2RdO1xuICAgICAgdmFyIGFyZ3MgPSBbXS5jb25jYXQoIHRhc2suYXJncyApO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhcmdzLnVuc2hpZnQoaWQpO1xuICAgICAgICByZXN1bHRzLnB1c2goaGFuZGxlci5hcHBseSh2b2lkIDAsIGFyZ3MpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG4gIHJldHVybiBuZXcgRXJyb3IoKFwiaW52YWxpZCBpbnN0YW5jZSBpZCBcXFwiXCIgKyBpZCArIFwiXFxcIiBvciB0YXNrc1wiKSlcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBuYXRpdmUgbW9kdWxlcyBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuZXdNb2R1bGVzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlcyAobmV3TW9kdWxlcykge1xuICB2YXIgbG9vcCA9IGZ1bmN0aW9uICggbmFtZSApIHtcbiAgICBpZiAoIW1vZHVsZXNbbmFtZV0pIHtcbiAgICAgIG1vZHVsZXNbbmFtZV0gPSB7fTtcbiAgICB9XG4gICAgbmV3TW9kdWxlc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICBtb2R1bGVzW25hbWVdW21ldGhvZF0gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW9kdWxlc1tuYW1lXVttZXRob2QubmFtZV0gPSBtZXRob2QuYXJncztcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBuYW1lIGluIG5ld01vZHVsZXMpIGxvb3AoIG5hbWUgKTtcbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBtb2R1bGUgb3IgdGhlIG1ldGhvZCBoYXMgYmVlbiByZWdpc3RlcmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIG5hbWUgKG9wdGlvbmFsKVxuICovXG5mdW5jdGlvbiBpc1JlZ2lzdGVyZWRNb2R1bGUgKG5hbWUsIG1ldGhvZCkge1xuICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gISEobW9kdWxlc1tuYW1lXSAmJiBtb2R1bGVzW25hbWVdW21ldGhvZF0pXG4gIH1cbiAgcmV0dXJuICEhbW9kdWxlc1tuYW1lXVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIG5hdGl2ZSBjb21wb25lbnRzIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHthcnJheX0gbmV3Q29tcG9uZW50c1xuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbXBvbmVudHMgKG5ld0NvbXBvbmVudHMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobmV3Q29tcG9uZW50cykpIHtcbiAgICBuZXdDb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCkge1xuICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29tcG9uZW50c1tjb21wb25lbnRdID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGNvbXBvbmVudC50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb21wb25lbnRzW2NvbXBvbmVudC50eXBlXSA9IGNvbXBvbmVudDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZWdpc3RlcmVkLlxuICogQHBhcmFtIHtTdHJpbmd9IGNvbXBvbmVudCBuYW1lXG4gKi9cbmZ1bmN0aW9uIGlzUmVnaXN0ZXJlZENvbXBvbmVudCAobmFtZSkge1xuICByZXR1cm4gISFjb21wb25lbnRzW25hbWVdXG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIFdlZXggc3VwcG9ydHMgc3BlY2lmaWMgZmVhdHVyZXMuXG4gKiBAcGFyYW0ge1N0cmluZ30gY29uZGl0aW9uXG4gKi9cbmZ1bmN0aW9uIHN1cHBvcnRzIChjb25kaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBjb25kaXRpb24gIT09ICdzdHJpbmcnKSB7IHJldHVybiBudWxsIH1cblxuICB2YXIgcmVzID0gY29uZGl0aW9uLm1hdGNoKC9eQChcXHcrKVxcLyhcXHcrKShcXC4oXFx3KykpPyQvaSk7XG4gIGlmIChyZXMpIHtcbiAgICB2YXIgdHlwZSA9IHJlc1sxXTtcbiAgICB2YXIgbmFtZSA9IHJlc1syXTtcbiAgICB2YXIgbWV0aG9kID0gcmVzWzRdO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnbW9kdWxlJzogcmV0dXJuIGlzUmVnaXN0ZXJlZE1vZHVsZShuYW1lLCBtZXRob2QpXG4gICAgICBjYXNlICdjb21wb25lbnQnOiByZXR1cm4gaXNSZWdpc3RlcmVkQ29tcG9uZW50KG5hbWUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmcmVzaCBpbnN0YW5jZSBvZiBWdWUgZm9yIGVhY2ggV2VleCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlVnVlTW9kdWxlSW5zdGFuY2UgKGluc3RhbmNlSWQsIG1vZHVsZUdldHRlcikge1xuICB2YXIgZXhwb3J0cyA9IHt9O1xuICBWdWVGYWN0b3J5KGV4cG9ydHMsIHJlbmRlcmVyKTtcbiAgdmFyIFZ1ZSA9IGV4cG9ydHMuVnVlO1xuXG4gIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXTtcblxuICAvLyBwYXRjaCByZXNlcnZlZCB0YWcgZGV0ZWN0aW9uIHRvIGFjY291bnQgZm9yIGR5bmFtaWNhbGx5IHJlZ2lzdGVyZWRcbiAgLy8gY29tcG9uZW50c1xuICB2YXIgd2VleFJlZ2V4ID0gL153ZWV4Oi9pO1xuICB2YXIgaXNSZXNlcnZlZFRhZyA9IFZ1ZS5jb25maWcuaXNSZXNlcnZlZFRhZyB8fCAoZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH0pO1xuICB2YXIgaXNSdW50aW1lQ29tcG9uZW50ID0gVnVlLmNvbmZpZy5pc1J1bnRpbWVDb21wb25lbnQgfHwgKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9KTtcbiAgVnVlLmNvbmZpZy5pc1Jlc2VydmVkVGFnID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gKCFpc1J1bnRpbWVDb21wb25lbnQobmFtZSkgJiYgY29tcG9uZW50c1tuYW1lXSkgfHxcbiAgICAgIGlzUmVzZXJ2ZWRUYWcobmFtZSkgfHxcbiAgICAgIHdlZXhSZWdleC50ZXN0KG5hbWUpXG4gIH07XG4gIFZ1ZS5jb25maWcucGFyc2VQbGF0Zm9ybVRhZ05hbWUgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gbmFtZS5yZXBsYWNlKHdlZXhSZWdleCwgJycpOyB9O1xuXG4gIC8vIGV4cG9zZSB3ZWV4LXNwZWNpZmljIGluZm9cbiAgVnVlLnByb3RvdHlwZS4kaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQ7XG4gIFZ1ZS5wcm90b3R5cGUuJGRvY3VtZW50ID0gaW5zdGFuY2UuZG9jdW1lbnQ7XG5cbiAgLy8gZXhwb3NlIHdlZXggbmF0aXZlIG1vZHVsZSBnZXR0ZXIgb24gc3ViVnVlIHByb3RvdHlwZSBzbyB0aGF0XG4gIC8vIHZkb20gcnVudGltZSBtb2R1bGVzIGNhbiBhY2Nlc3MgbmF0aXZlIG1vZHVsZXMgdmlhIHZub2RlLmNvbnRleHRcbiAgVnVlLnByb3RvdHlwZS4kcmVxdWlyZVdlZXhNb2R1bGUgPSBtb2R1bGVHZXR0ZXI7XG5cbiAgLy8gSGFjayBgVnVlYCBiZWhhdmlvciB0byBoYW5kbGUgaW5zdGFuY2UgaW5mb3JtYXRpb24gYW5kIGRhdGFcbiAgLy8gYmVmb3JlIHJvb3QgY29tcG9uZW50IGNyZWF0ZWQuXG4gIFZ1ZS5taXhpbih7XG4gICAgYmVmb3JlQ3JlYXRlOiBmdW5jdGlvbiBiZWZvcmVDcmVhdGUgKCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLiRvcHRpb25zO1xuICAgICAgLy8gcm9vdCBjb21wb25lbnQgKHZtKVxuICAgICAgaWYgKG9wdGlvbnMuZWwpIHtcbiAgICAgICAgLy8gc2V0IGV4dGVybmFsIGRhdGEgb2YgaW5zdGFuY2VcbiAgICAgICAgdmFyIGRhdGFPcHRpb24gPSBvcHRpb25zLmRhdGE7XG4gICAgICAgIHZhciBpbnRlcm5hbERhdGEgPSAodHlwZW9mIGRhdGFPcHRpb24gPT09ICdmdW5jdGlvbicgPyBkYXRhT3B0aW9uKCkgOiBkYXRhT3B0aW9uKSB8fCB7fTtcbiAgICAgICAgb3B0aW9ucy5kYXRhID0gT2JqZWN0LmFzc2lnbihpbnRlcm5hbERhdGEsIGluc3RhbmNlLmRhdGEpO1xuICAgICAgICAvLyByZWNvcmQgaW5zdGFuY2UgYnkgaWRcbiAgICAgICAgaW5zdGFuY2UuYXBwID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBKdXN0IGluc3RhbmNlIHZhcmlhYmxlIGB3ZWV4LmNvbmZpZ2BcbiAgICogR2V0IGluc3RhbmNlIGNvbmZpZy5cbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgVnVlLnByb3RvdHlwZS4kZ2V0Q29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChpbnN0YW5jZS5hcHAgaW5zdGFuY2VvZiBWdWUpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5jb25maWdcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFZ1ZVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIG5hdGl2ZSBtb2R1bGUgZ2V0dGVyLiBFYWNoIG5hdGl2ZSBtb2R1bGUgaGFzIHNldmVyYWxcbiAqIG1ldGhvZHMgdG8gY2FsbC4gQW5kIGFsbCB0aGUgYmVoYXZpb3JzIGlzIGluc3RhbmNlLXJlbGF0ZWQuIFNvXG4gKiB0aGlzIGdldHRlciB3aWxsIHJldHVybiBhIHNldCBvZiBtZXRob2RzIHdoaWNoIGFkZGl0aW9uYWxseVxuICogc2VuZCBjdXJyZW50IGluc3RhbmNlIGlkIHRvIG5hdGl2ZSB3aGVuIGNhbGxlZC5cbiAqIEBwYXJhbSAge3N0cmluZ30gIGluc3RhbmNlSWRcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBnZW5Nb2R1bGVHZXR0ZXIgKGluc3RhbmNlSWQpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICByZXR1cm4gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB2YXIgbmF0aXZlTW9kdWxlID0gbW9kdWxlc1tuYW1lXSB8fCBbXTtcbiAgICB2YXIgb3V0cHV0ID0ge307XG4gICAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIG1ldGhvZE5hbWUgKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3V0cHV0LCBtZXRob2ROYW1lLCB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiBwcm94eUdldHRlciAoKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdtb2R1bGUnLCB7IG1vZHVsZTogbmFtZSwgbWV0aG9kOiBtZXRob2ROYW1lIH0sIGFyZ3MpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIHByb3h5U2V0dGVyICh2YWwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLmRvY3VtZW50LnRhc2tDZW50ZXIuc2VuZCgnbW9kdWxlJywgeyBtb2R1bGU6IG5hbWUsIG1ldGhvZDogbWV0aG9kTmFtZSB9LCBbdmFsXSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBtZXRob2ROYW1lIGluIG5hdGl2ZU1vZHVsZSkgbG9vcCggbWV0aG9kTmFtZSApO1xuICAgIHJldHVybiBvdXRwdXRcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIEhUTUw1IFRpbWVyIEFQSXMuIEFuIGltcG9ydGFudCBwb2ludCBpcyB0aGF0IHRoZSBjYWxsYmFja1xuICogd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBjYWxsYmFjayBpZCB3aGVuIHNlbnQgdG8gbmF0aXZlLiBTbyB0aGVcbiAqIGZyYW1ld29yayBjYW4gbWFrZSBzdXJlIG5vIHNpZGUgZWZmZWN0IG9mIHRoZSBjYWxsYmFjayBoYXBwZW5lZCBhZnRlclxuICogYW4gaW5zdGFuY2UgZGVzdHJveWVkLlxuICogQHBhcmFtICB7W3R5cGVdfSBpbnN0YW5jZUlkICAgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7W3R5cGVdfSBtb2R1bGVHZXR0ZXIgW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7W3R5cGVdfSAgICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBnZXRJbnN0YW5jZVRpbWVyIChpbnN0YW5jZUlkLCBtb2R1bGVHZXR0ZXIpIHtcbiAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzW2luc3RhbmNlSWRdO1xuICB2YXIgdGltZXIgPSBtb2R1bGVHZXR0ZXIoJ3RpbWVyJyk7XG4gIHZhciB0aW1lckFQSXMgPSB7XG4gICAgc2V0VGltZW91dDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhcmdzWzBdLmFwcGx5KGFyZ3MsIGFyZ3Muc2xpY2UoMikpO1xuICAgICAgfTtcblxuICAgICAgdGltZXIuc2V0VGltZW91dChoYW5kbGVyLCBhcmdzWzFdKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5kb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpXG4gICAgfSxcbiAgICBzZXRJbnRlcnZhbDogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGFyZ3MgPSBbXSwgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHdoaWxlICggbGVuLS0gKSBhcmdzWyBsZW4gXSA9IGFyZ3VtZW50c1sgbGVuIF07XG5cbiAgICAgIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBhcmdzWzBdLmFwcGx5KGFyZ3MsIGFyZ3Muc2xpY2UoMikpO1xuICAgICAgfTtcblxuICAgICAgdGltZXIuc2V0SW50ZXJ2YWwoaGFuZGxlciwgYXJnc1sxXSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuZG9jdW1lbnQudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQudG9TdHJpbmcoKVxuICAgIH0sXG4gICAgY2xlYXJUaW1lb3V0OiBmdW5jdGlvbiAobikge1xuICAgICAgdGltZXIuY2xlYXJUaW1lb3V0KG4pO1xuICAgIH0sXG4gICAgY2xlYXJJbnRlcnZhbDogZnVuY3Rpb24gKG4pIHtcbiAgICAgIHRpbWVyLmNsZWFySW50ZXJ2YWwobik7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdGltZXJBUElzXG59XG5cbi8qKlxuICogQ2FsbCBhIG5ldyBmdW5jdGlvbiBib2R5IHdpdGggc29tZSBnbG9iYWwgb2JqZWN0cy5cbiAqIEBwYXJhbSAge29iamVjdH0gZ2xvYmFsT2JqZWN0c1xuICogQHBhcmFtICB7c3RyaW5nfSBjb2RlXG4gKiBAcmV0dXJuIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGNhbGxGdW5jdGlvbiAoZ2xvYmFsT2JqZWN0cywgYm9keSkge1xuICB2YXIgZ2xvYmFsS2V5cyA9IFtdO1xuICB2YXIgZ2xvYmFsVmFsdWVzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBnbG9iYWxPYmplY3RzKSB7XG4gICAgZ2xvYmFsS2V5cy5wdXNoKGtleSk7XG4gICAgZ2xvYmFsVmFsdWVzLnB1c2goZ2xvYmFsT2JqZWN0c1trZXldKTtcbiAgfVxuICBnbG9iYWxLZXlzLnB1c2goYm9keSk7XG5cbiAgdmFyIHJlc3VsdCA9IG5ldyAoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkoIEZ1bmN0aW9uLCBbIG51bGwgXS5jb25jYXQoIGdsb2JhbEtleXMpICkpO1xuICByZXR1cm4gcmVzdWx0LmFwcGx5KHZvaWQgMCwgZ2xvYmFsVmFsdWVzKVxufVxuXG4vKipcbiAqIENhbGwgYSBuZXcgZnVuY3Rpb24gZ2VuZXJhdGVkIG9uIHRoZSBWOCBuYXRpdmUgc2lkZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGhlbHBzIHNwZWVkIHVwIGJ1bmRsZSBjb21waWxpbmcuIE5vcm1hbGx5LCB0aGUgVjhcbiAqIGVuZ2luZSBuZWVkcyB0byBkb3dubG9hZCwgcGFyc2UsIGFuZCBjb21waWxlIGEgYnVuZGxlIG9uIGV2ZXJ5XG4gKiB2aXNpdC4gSWYgJ2NvbXBpbGVCdW5kbGUoKScgaXMgYXZhaWxhYmxlIG9uIG5hdGl2ZSBzaWRlLFxuICogdGhlIGRvd25sb2RpbmcsIHBhcnNpbmcsIGFuZCBjb21waWxpbmcgc3RlcHMgd291bGQgYmUgc2tpcHBlZC5cbiAqIEBwYXJhbSAge29iamVjdH0gZ2xvYmFsT2JqZWN0c1xuICogQHBhcmFtICB7c3RyaW5nfSBib2R5XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjYWxsRnVuY3Rpb25OYXRpdmUgKGdsb2JhbE9iamVjdHMsIGJvZHkpIHtcbiAgaWYgKHR5cGVvZiByZW5kZXJlci5jb21waWxlQnVuZGxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICB2YXIgZm4gPSB2b2lkIDA7XG4gIHZhciBpc05hdGl2ZUNvbXBpbGVPayA9IGZhbHNlO1xuICB2YXIgc2NyaXB0ID0gJyhmdW5jdGlvbiAoJztcbiAgdmFyIGdsb2JhbEtleXMgPSBbXTtcbiAgdmFyIGdsb2JhbFZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gZ2xvYmFsT2JqZWN0cykge1xuICAgIGdsb2JhbEtleXMucHVzaChrZXkpO1xuICAgIGdsb2JhbFZhbHVlcy5wdXNoKGdsb2JhbE9iamVjdHNba2V5XSk7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBnbG9iYWxLZXlzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgIHNjcmlwdCArPSBnbG9iYWxLZXlzW2ldO1xuICAgIHNjcmlwdCArPSAnLCc7XG4gIH1cbiAgc2NyaXB0ICs9IGdsb2JhbEtleXNbZ2xvYmFsS2V5cy5sZW5ndGggLSAxXTtcbiAgc2NyaXB0ICs9ICcpIHsnO1xuICBzY3JpcHQgKz0gYm9keTtcbiAgc2NyaXB0ICs9ICd9ICknO1xuXG4gIHRyeSB7XG4gICAgdmFyIHdlZXggPSBnbG9iYWxPYmplY3RzLndlZXggfHwge307XG4gICAgdmFyIGNvbmZpZyA9IHdlZXguY29uZmlnIHx8IHt9O1xuICAgIGZuID0gcmVuZGVyZXIuY29tcGlsZUJ1bmRsZShzY3JpcHQsXG4gICAgICBjb25maWcuYnVuZGxlVXJsLFxuICAgICAgY29uZmlnLmJ1bmRsZURpZ2VzdCxcbiAgICAgIGNvbmZpZy5jb2RlQ2FjaGVQYXRoKTtcbiAgICBpZiAoZm4gJiYgdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmbi5hcHBseSh2b2lkIDAsIGdsb2JhbFZhbHVlcyk7XG4gICAgICBpc05hdGl2ZUNvbXBpbGVPayA9IHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgfVxuXG4gIHJldHVybiBpc05hdGl2ZUNvbXBpbGVPa1xufVxuXG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5yZXNldCA9IHJlc2V0O1xuZXhwb3J0cy5jcmVhdGVJbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlO1xuZXhwb3J0cy5kZXN0cm95SW5zdGFuY2UgPSBkZXN0cm95SW5zdGFuY2U7XG5leHBvcnRzLnJlZnJlc2hJbnN0YW5jZSA9IHJlZnJlc2hJbnN0YW5jZTtcbmV4cG9ydHMuZ2V0Um9vdCA9IGdldFJvb3Q7XG5leHBvcnRzLnJlY2VpdmVUYXNrcyA9IHJlY2VpdmVUYXNrcztcbmV4cG9ydHMucmVnaXN0ZXJNb2R1bGVzID0gcmVnaXN0ZXJNb2R1bGVzO1xuZXhwb3J0cy5pc1JlZ2lzdGVyZWRNb2R1bGUgPSBpc1JlZ2lzdGVyZWRNb2R1bGU7XG5leHBvcnRzLnJlZ2lzdGVyQ29tcG9uZW50cyA9IHJlZ2lzdGVyQ29tcG9uZW50cztcbmV4cG9ydHMuaXNSZWdpc3RlcmVkQ29tcG9uZW50ID0gaXNSZWdpc3RlcmVkQ29tcG9uZW50O1xuZXhwb3J0cy5zdXBwb3J0cyA9IHN1cHBvcnRzO1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgVGhlIGFwaSBmb3IgaW52b2tpbmcgd2l0aCBcIiRcIiBwcmVmaXhcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSAkdm0gaW5zdGVhZFxuICogZmluZCB0aGUgdm0gYnkgaWRcbiAqIE5vdGU6IHRoZXJlIGlzIG9ubHkgb25lIGlkIGluIHdob2xlIGNvbXBvbmVudFxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7Vm19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkIChpZCkge1xuICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFZtIyQgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBWbSMkdm0gaW5zdGVhZCcpXG4gIGNvbnN0IGluZm8gPSB0aGlzLl9pZHNbaWRdXG4gIGlmIChpbmZvKSB7XG4gICAgcmV0dXJuIGluZm8udm1cbiAgfVxufVxuXG4vKipcbiAqIGZpbmQgdGhlIGVsZW1lbnQgYnkgaWRcbiAqIE5vdGU6IHRoZXJlIGlzIG9ubHkgb25lIGlkIGluIHdob2xlIGNvbXBvbmVudFxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7RWxlbWVudH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRlbCAoaWQpIHtcbiAgY29uc3QgaW5mbyA9IHRoaXMuX2lkc1tpZF1cbiAgaWYgKGluZm8pIHtcbiAgICByZXR1cm4gaW5mby5lbFxuICB9XG59XG5cbi8qKlxuICogZmluZCB0aGUgdm0gb2YgdGhlIGN1c3RvbSBjb21wb25lbnQgYnkgaWRcbiAqIE5vdGU6IHRoZXJlIGlzIG9ubHkgb25lIGlkIGluIHdob2xlIGNvbXBvbmVudFxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7Vm19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkdm0gKGlkKSB7XG4gIGNvbnN0IGluZm8gPSB0aGlzLl9pZHNbaWRdXG4gIGlmIChpbmZvKSB7XG4gICAgcmV0dXJuIGluZm8udm1cbiAgfVxufVxuXG4vKipcbiAqIEZpcmUgd2hlbiBkaWZmZXIgcmVuZGVyaW5nIGZpbmlzaGVkXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkcmVuZGVyVGhlbiAoZm4pIHtcbiAgY29uc3QgYXBwID0gdGhpcy5fYXBwXG4gIGNvbnN0IGRpZmZlciA9IGFwcC5kaWZmZXJcbiAgcmV0dXJuIGRpZmZlci50aGVuKCgpID0+IHtcbiAgICBmbigpXG4gIH0pXG59XG5cbi8qKlxuICogc2Nyb2xsIGFuIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IGlkIGludG8gdmlldyxcbiAqIG1vcmVvdmVyIHNwZWNpZnkgYSBudW1iZXIgb2Ygb2Zmc2V0IG9wdGlvbmFsbHlcbiAqIEBwYXJhbSAge3N0cmluZ30gaWRcbiAqIEBwYXJhbSAge251bWJlcn0gb2Zmc2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkc2Nyb2xsVG8gKGlkLCBvZmZzZXQpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBWbSMkc2Nyb2xsVG8gaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAgICAgJ3BsZWFzZSB1c2UgXCJyZXF1aXJlKFxcJ0B3ZWV4LW1vZHVsZS9kb21cXCcpJyArXG4gICAgICAgICAgJy5zY3JvbGxUbyhlbCwgb3B0aW9ucylcIiBpbnN0ZWFkJylcbiAgY29uc3QgZWwgPSB0aGlzLiRlbChpZClcbiAgaWYgKGVsKSB7XG4gICAgY29uc3QgZG9tID0gdGhpcy5fYXBwLnJlcXVpcmVNb2R1bGUoJ2RvbScpXG4gICAgZG9tLnNjcm9sbFRvRWxlbWVudChlbC5yZWYsIHsgb2Zmc2V0OiBvZmZzZXQgfSlcbiAgfVxufVxuXG4vKipcbiAqIHBlcmZvcm0gdHJhbnNpdGlvbiBhbmltYXRpb24gb24gYW4gZWxlbWVudCBzcGVjaWZpZWQgYnkgaWRcbiAqIEBwYXJhbSAge3N0cmluZ30gICBpZFxuICogQHBhcmFtICB7b2JqZWN0fSAgIG9wdGlvbnNcbiAqIEBwYXJhbSAge29iamVjdH0gICBvcHRpb25zLnN0eWxlc1xuICogQHBhcmFtICB7b2JqZWN0fSAgIG9wdGlvbnMuZHVyYXRpb24obXMpXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgW29wdGlvbnMudGltaW5nRnVuY3Rpb25dXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgW29wdGlvbnMuZGVsYXk9MChtcyldXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICR0cmFuc2l0aW9uIChpZCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgY29uc3QgZWwgPSB0aGlzLiRlbChpZClcbiAgaWYgKGVsICYmIG9wdGlvbnMgJiYgb3B0aW9ucy5zdHlsZXMpIHtcbiAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLl9hcHAucmVxdWlyZU1vZHVsZSgnYW5pbWF0aW9uJylcbiAgICBhbmltYXRpb24udHJhbnNpdGlvbihlbC5yZWYsIG9wdGlvbnMsICguLi5hcmdzKSA9PiB7XG4gICAgICB0aGlzLl9zZXRTdHlsZShlbCwgb3B0aW9ucy5zdHlsZXMpXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayguLi5hcmdzKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBnZXQgc29tZSBjb25maWdcbiAqIEByZXR1cm4ge29iamVjdH0gc29tZSBjb25maWcgZm9yIGFwcCBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1bmRsZVVybFxuICogQHByb3BlcnR5IHtib29sZWFufSBkZWJ1Z1xuICogQHByb3BlcnR5IHtvYmplY3R9IGVudlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi53ZWV4VmVyc2lvbihleC4gMS4wLjApXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW52LmFwcE5hbWUoZXguIFRCL1RNKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi5hcHBWZXJzaW9uKGV4LiA1LjAuMClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBlbnYucGxhdGZvcm0oZXguIGlPUy9BbmRyb2lkKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi5vc1ZlcnNpb24oZXguIDcuMC4wKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudi5kZXZpY2VNb2RlbCAqKm5hdGl2ZSBvbmx5KipcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbnYuW2RldmljZVdpZHRoPTc1MF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlbnYuZGV2aWNlSGVpZ2h0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiAkZ2V0Q29uZmlnIChjYWxsYmFjaykge1xuICBjb25zdCBjb25maWcgPSB0aGlzLl9hcHAub3B0aW9uc1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSB0aGUgY2FsbGJhY2sgb2YgVm0jJGdldENvbmZpZyhjYWxsYmFjaykgaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAndGhpcyBhcGkgbm93IGNhbiBkaXJlY3RseSBSRVRVUk4gY29uZmlnIGluZm8uJylcbiAgICBjYWxsYmFjayhjb25maWcpXG4gIH1cbiAgcmV0dXJuIGNvbmZpZ1xufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiByZXF1ZXN0IG5ldHdvcmsgdmlhIGh0dHAgcHJvdG9jb2xcbiAqIEBwYXJhbSAge29iamVjdH0gICBwYXJhbXNcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gJHNlbmRIdHRwIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIGNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gVm0jJHNlbmRIdHRwIGlzIGRlcHJlY2F0ZWQsICcgK1xuICAgICAgICAgICdwbGVhc2UgdXNlIFwicmVxdWlyZShcXCdAd2VleC1tb2R1bGUvc3RyZWFtXFwnKScgK1xuICAgICAgICAgICcuc2VuZEh0dHAocGFyYW1zLCBjYWxsYmFjaylcIiBpbnN0ZWFkJylcbiAgY29uc3Qgc3RyZWFtID0gdGhpcy5fYXBwLnJlcXVpcmVNb2R1bGUoJ3N0cmVhbScpXG4gIHN0cmVhbS5zZW5kSHR0cChwYXJhbXMsIGNhbGxiYWNrKVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBvcGVuIGEgdXJsXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVybFxuICovXG5leHBvcnQgZnVuY3Rpb24gJG9wZW5VUkwgKHVybCkge1xuICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFZtIyRvcGVuVVJMIGlzIGRlcHJlY2F0ZWQsICcgK1xuICAgICAgICAgICdwbGVhc2UgdXNlIFwicmVxdWlyZShcXCdAd2VleC1tb2R1bGUvZXZlbnRcXCcpJyArXG4gICAgICAgICAgJy5vcGVuVVJMKHVybClcIiBpbnN0ZWFkJylcbiAgY29uc3QgZXZlbnQgPSB0aGlzLl9hcHAucmVxdWlyZU1vZHVsZSgnZXZlbnQnKVxuICBldmVudC5vcGVuVVJMKHVybClcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogc2V0IGEgdGl0bGUgZm9yIHBhZ2VcbiAqIEBwYXJhbSAge3N0cmluZ30gdGl0bGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRzZXRUaXRsZSAodGl0bGUpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBWbSMkc2V0VGl0bGUgaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAgICAgJ3BsZWFzZSB1c2UgXCJyZXF1aXJlKFxcJ0B3ZWV4LW1vZHVsZS9wYWdlSW5mb1xcJyknICtcbiAgICAgICAgICAnLnNldFRpdGxlKHRpdGxlKVwiIGluc3RlYWQnKVxuICBjb25zdCBwYWdlSW5mbyA9IHRoaXMuX2FwcC5yZXF1aXJlTW9kdWxlKCdwYWdlSW5mbycpXG4gIHBhZ2VJbmZvLnNldFRpdGxlKHRpdGxlKVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBcInJlcXVpcmUoJ0B3ZWV4LW1vZHVsZS9tb2R1bGVOYW1lJykgaW5zdGVhZFwiXG4gKiBpbnZva2UgYSBuYXRpdmUgbWV0aG9kIGJ5IHNwZWNpZmluZyB0aGUgbmFtZSBvZiBtb2R1bGUgYW5kIG1ldGhvZFxuICogQHBhcmFtICB7c3RyaW5nfSBtb2R1bGVOYW1lXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSAgey4uLip9IHRoZSByZXN0IGFyZ3VtZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gJGNhbGwgKG1vZHVsZU5hbWUsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBWbSMkY2FsbCBpcyBkZXByZWNhdGVkLCAnICtcbiAgICAncGxlYXNlIHVzZSBcInJlcXVpcmUoXFwnQHdlZXgtbW9kdWxlL21vZHVsZU5hbWVcXCcpXCIgaW5zdGVhZCcpXG4gIGNvbnN0IG1vZHVsZSA9IHRoaXMuX2FwcC5yZXF1aXJlTW9kdWxlKG1vZHVsZU5hbWUpXG4gIGlmIChtb2R1bGUgJiYgbW9kdWxlW21ldGhvZE5hbWVdKSB7XG4gICAgbW9kdWxlW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBNaXggcHJvcGVydGllcyBpbnRvIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHRvXG4gKiBAcGFyYW0ge09iamVjdH0gZnJvbVxuICovXG5cbmZ1bmN0aW9uIGV4dGVuZCAodGFyZ2V0LCAuLi5zcmMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduID09PSAnZnVuY3Rpb24nKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIC4uLnNyYylcbiAgfVxuICBlbHNlIHtcbiAgICBjb25zdCBmaXJzdCA9IHNyYy5zaGlmdCgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZmlyc3QpIHtcbiAgICAgIHRhcmdldFtrZXldID0gZmlyc3Rba2V5XVxuICAgIH1cbiAgICBpZiAoc3JjLmxlbmd0aCkge1xuICAgICAgZXh0ZW5kKHRhcmdldCwgLi4uc3JjKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0XG59XG5cbi8qKlxuICogRGVmaW5lIGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2VudW1lcmFibGVdXG4gKi9cblxuZnVuY3Rpb24gZGVmIChvYmosIGtleSwgdmFsLCBlbnVtZXJhYmxlKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgIHZhbHVlOiB2YWwsXG4gICAgZW51bWVyYWJsZTogISFlbnVtZXJhYmxlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxufVxuXG4vKipcbiAqIFJlbW92ZSBhbiBpdGVtIGZyb20gYW4gYXJyYXlcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJcbiAqIEBwYXJhbSB7Kn0gaXRlbVxuICovXG5cbmZ1bmN0aW9uIHJlbW92ZSAoYXJyLCBpdGVtKSB7XG4gIGlmIChhcnIubGVuZ3RoKSB7XG4gICAgY29uc3QgaW5kZXggPSBhcnIuaW5kZXhPZihpdGVtKVxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICByZXR1cm4gYXJyLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBvYmplY3QgaGFzIHRoZSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5jb25zdCBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHlcbmZ1bmN0aW9uIGhhc093biAob2JqLCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpXG59XG5cbi8qKlxuICogU2ltcGxlIGJpbmQsIGZhc3RlciB0aGFuIG5hdGl2ZVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuXG5mdW5jdGlvbiBiaW5kIChmbiwgY3R4KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgIGNvbnN0IGwgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgcmV0dXJuIGxcbiAgICAgID8gbCA+IDFcbiAgICAgICAgPyBmbi5hcHBseShjdHgsIGFyZ3VtZW50cylcbiAgICAgICAgOiBmbi5jYWxsKGN0eCwgYSlcbiAgICAgIDogZm4uY2FsbChjdHgpXG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIEFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgcmVhbCBBcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5LWxpa2V9IGxpc3RcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc3RhcnRdIC0gc3RhcnQgaW5kZXhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5cbmZ1bmN0aW9uIHRvQXJyYXkgKGxpc3QsIHN0YXJ0KSB7XG4gIHN0YXJ0ID0gc3RhcnQgfHwgMFxuICBsZXQgaSA9IGxpc3QubGVuZ3RoIC0gc3RhcnRcbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5KGkpXG4gIHdoaWxlIChpLS0pIHtcbiAgICByZXRbaV0gPSBsaXN0W2kgKyBzdGFydF1cbiAgfVxuICByZXR1cm4gcmV0XG59XG5cbi8qKlxuICogUXVpY2sgb2JqZWN0IGNoZWNrIC0gdGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byB0ZWxsXG4gKiBPYmplY3RzIGZyb20gcHJpbWl0aXZlIHZhbHVlcyB3aGVuIHdlIGtub3cgdGhlIHZhbHVlXG4gKiBpcyBhIEpTT04tY29tcGxpYW50IHR5cGUuXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG59XG5cbi8qKlxuICogU3RyaWN0IG9iamVjdCB0eXBlIGNoZWNrLiBPbmx5IHJldHVybnMgdHJ1ZVxuICogZm9yIHBsYWluIEphdmFTY3JpcHQgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuXG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbmNvbnN0IE9CSkVDVF9TVFJJTkcgPSAnW29iamVjdCBPYmplY3RdJ1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCAob2JqKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IE9CSkVDVF9TVFJJTkdcbn1cblxuZXhwb3J0IHtcbiAgZXh0ZW5kLFxuICBkZWYsXG4gIHJlbW92ZSxcbiAgaGFzT3duLFxuICBiaW5kLFxuICB0b0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5leHBvcnQge1xuICBleHRlbmQsXG4gIGRlZixcbiAgcmVtb3ZlLFxuICBoYXNPd24sXG4gIGJpbmQsXG4gIHRvQXJyYXksXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0XG59IGZyb20gJy4vc2hhcmVkJ1xuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoICQgb3IgX1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzZXJ2ZWQgKHN0cikge1xuICBjb25zdCBjID0gKHN0ciArICcnKS5jaGFyQ29kZUF0KDApXG4gIHJldHVybiBjID09PSAweDI0IHx8IGMgPT09IDB4NUZcbn1cblxuLy8gY2FuIHdlIHVzZSBfX3Byb3RvX18/XG5leHBvcnQgY29uc3QgaGFzUHJvdG8gPSAnX19wcm90b19fJyBpbiB7fVxuXG5sZXQgX1NldFxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmICh0eXBlb2YgU2V0ICE9PSAndW5kZWZpbmVkJyAmJiBTZXQudG9TdHJpbmcoKS5tYXRjaCgvbmF0aXZlIGNvZGUvKSkge1xuICAvLyB1c2UgbmF0aXZlIFNldCB3aGVuIGF2YWlsYWJsZS5cbiAgX1NldCA9IFNldFxufVxuZWxzZSB7XG4gIC8vIGEgbm9uLXN0YW5kYXJkIFNldCBwb2x5ZmlsbCB0aGF0IG9ubHkgd29ya3Mgd2l0aCBwcmltaXRpdmUga2V5cy5cbiAgX1NldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnNldCA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgfVxuICBfU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0W2tleV0gIT09IHVuZGVmaW5lZFxuICB9XG4gIF9TZXQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoa2V5ID09IG51bGwgfHwgdGhpcy5zZXRba2V5XSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMuc2V0W2tleV0gPSAxXG4gIH1cbiAgX1NldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpXG4gIH1cbn1cblxuZXhwb3J0IHsgX1NldCB9XG5cbi8qKlxuICogUG9seWZpbGwgaW4gaU9TNyBieSBuYXRpdmUgYmVjYXVzZSB0aGUgSmF2YVNjcmlwdCBwb2x5ZmlsbCBoYXMgbWVtb3J5IHByb2JsZW0uXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5ld1NldCAoKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIC8qIGVzbGludC1kaXNhYmxlICovXG4gIGlmICh0eXBlb2YgbmF0aXZlU2V0ID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBuYXRpdmVTZXQuY3JlYXRlKClcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlICovXG4gIHJldHVybiBuZXcgX1NldCgpXG59XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FjaGVkIHZlcnNpb24gb2YgYSBwdXJlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVkIChmbikge1xuICBjb25zdCBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgcmV0dXJuIGZ1bmN0aW9uIGNhY2hlZEZuIChzdHIpIHtcbiAgICBjb25zdCBoaXQgPSBjYWNoZVtzdHJdXG4gICAgcmV0dXJuIGhpdCB8fCAoY2FjaGVbc3RyXSA9IGZuKHN0cikpXG4gIH1cbn1cblxuLyoqXG4gKiBDYW1lbGl6ZSBhIGh5cGhlbi1kZWxtaXRlZCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmNvbnN0IGNhbWVsaXplUkUgPSAvLShcXHcpL2dcbmV4cG9ydCBjb25zdCBjYW1lbGl6ZSA9IGNhY2hlZChzdHIgPT4ge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoY2FtZWxpemVSRSwgdG9VcHBlcilcbn0pXG5cbmZ1bmN0aW9uIHRvVXBwZXIgKF8sIGMpIHtcbiAgcmV0dXJuIGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJ1xufVxuXG4vKipcbiAqIEh5cGhlbmF0ZSBhIGNhbWVsQ2FzZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5cbmNvbnN0IGh5cGhlbmF0ZVJFID0gLyhbYS16XFxkXSkoW0EtWl0pL2dcbmV4cG9ydCBjb25zdCBoeXBoZW5hdGUgPSBjYWNoZWQoc3RyID0+IHtcbiAgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKGh5cGhlbmF0ZVJFLCAnJDEtJDInKVxuICAgIC50b0xvd2VyQ2FzZSgpXG59KVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwb2YgKHYpIHtcbiAgY29uc3QgcyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KVxuICByZXR1cm4gcy5zdWJzdHJpbmcoOCwgcy5sZW5ndGggLSAxKS50b0xvd2VyQ2FzZSgpXG59XG5cbi8vIHdlZXggbmFtZSBydWxlc1xuXG5jb25zdCBXRUVYX0NPTVBPTkVOVF9SRUcgPSAvXkB3ZWV4LWNvbXBvbmVudFxcLy9cbmNvbnN0IFdFRVhfTU9EVUxFX1JFRyA9IC9eQHdlZXgtbW9kdWxlXFwvL1xuY29uc3QgTk9STUFMX01PRFVMRV9SRUcgPSAvXlxcLnsxLDJ9XFwvL1xuY29uc3QgSlNfU1VSRklYX1JFRyA9IC9cXC5qcyQvXG5cbmV4cG9ydCBjb25zdCBpc1dlZXhDb21wb25lbnQgPSBuYW1lID0+ICEhbmFtZS5tYXRjaChXRUVYX0NPTVBPTkVOVF9SRUcpXG5leHBvcnQgY29uc3QgaXNXZWV4TW9kdWxlID0gbmFtZSA9PiAhIW5hbWUubWF0Y2goV0VFWF9NT0RVTEVfUkVHKVxuZXhwb3J0IGNvbnN0IGlzTm9ybWFsTW9kdWxlID0gbmFtZSA9PiAhIW5hbWUubWF0Y2goTk9STUFMX01PRFVMRV9SRUcpXG5leHBvcnQgY29uc3QgaXNOcG1Nb2R1bGUgPSBuYW1lID0+ICFpc1dlZXhDb21wb25lbnQobmFtZSkgJiYgIWlzV2VleE1vZHVsZShuYW1lKSAmJiAhaXNOb3JtYWxNb2R1bGUobmFtZSlcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVdlZXhQcmVmaXggKHN0cikge1xuICBjb25zdCByZXN1bHQgPSBzdHIucmVwbGFjZShXRUVYX0NPTVBPTkVOVF9SRUcsICcnKS5yZXBsYWNlKFdFRVhfTU9EVUxFX1JFRywgJycpXG4gIHJldHVybiByZXN1bHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUpTU3VyZml4IChzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKEpTX1NVUkZJWF9SRUcsICcnKVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5pbXBvcnQgeyByZW1vdmUgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5sZXQgdWlkID0gMFxuXG4vKipcbiAqIEEgZGVwIGlzIGFuIG9ic2VydmFibGUgdGhhdCBjYW4gaGF2ZSBtdWx0aXBsZVxuICogZGlyZWN0aXZlcyBzdWJzY3JpYmluZyB0byBpdC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEZXAgKCkge1xuICB0aGlzLmlkID0gdWlkKytcbiAgdGhpcy5zdWJzID0gW11cbn1cblxuLy8gdGhlIGN1cnJlbnQgdGFyZ2V0IHdhdGNoZXIgYmVpbmcgZXZhbHVhdGVkLlxuLy8gdGhpcyBpcyBnbG9iYWxseSB1bmlxdWUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvbmx5IG9uZVxuLy8gd2F0Y2hlciBiZWluZyBldmFsdWF0ZWQgYXQgYW55IHRpbWUuXG5EZXAudGFyZ2V0ID0gbnVsbFxubGV0IHRhcmdldFN0YWNrID0gW11cblxuZXhwb3J0IGZ1bmN0aW9uIHB1c2hUYXJnZXQgKF90YXJnZXQpIHtcbiAgaWYgKERlcC50YXJnZXQpIHRhcmdldFN0YWNrLnB1c2goRGVwLnRhcmdldClcbiAgRGVwLnRhcmdldCA9IF90YXJnZXRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvcFRhcmdldCAoKSB7XG4gIERlcC50YXJnZXQgPSB0YXJnZXRTdGFjay5wb3AoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRUYXJnZXQgKCkge1xuICBEZXAudGFyZ2V0ID0gbnVsbFxuICB0YXJnZXRTdGFjayA9IFtdXG59XG5cbi8qKlxuICogQWRkIGEgZGlyZWN0aXZlIHN1YnNjcmliZXIuXG4gKlxuICogQHBhcmFtIHtEaXJlY3RpdmV9IHN1YlxuICovXG5cbkRlcC5wcm90b3R5cGUuYWRkU3ViID0gZnVuY3Rpb24gKHN1Yikge1xuICB0aGlzLnN1YnMucHVzaChzdWIpXG59XG5cbi8qKlxuICogUmVtb3ZlIGEgZGlyZWN0aXZlIHN1YnNjcmliZXIuXG4gKlxuICogQHBhcmFtIHtEaXJlY3RpdmV9IHN1YlxuICovXG5cbkRlcC5wcm90b3R5cGUucmVtb3ZlU3ViID0gZnVuY3Rpb24gKHN1Yikge1xuICByZW1vdmUodGhpcy5zdWJzLCBzdWIpXG59XG5cbi8qKlxuICogQWRkIHNlbGYgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSB0YXJnZXQgd2F0Y2hlci5cbiAqL1xuXG5EZXAucHJvdG90eXBlLmRlcGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKERlcC50YXJnZXQpIHtcbiAgICBEZXAudGFyZ2V0LmFkZERlcCh0aGlzKVxuICB9XG59XG5cbi8qKlxuICogTm90aWZ5IGFsbCBzdWJzY3JpYmVycyBvZiBhIG5ldyB2YWx1ZS5cbiAqL1xuXG5EZXAucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gc3RhYmxpemUgdGhlIHN1YnNjcmliZXIgbGlzdCBmaXJzdFxuICBjb25zdCBzdWJzID0gdGhpcy5zdWJzLnNsaWNlKClcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBzdWJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHN1YnNbaV0udXBkYXRlKClcbiAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cblxuXG5pbXBvcnQgRGVwLCB7IHB1c2hUYXJnZXQsIHBvcFRhcmdldCB9IGZyb20gJy4vZGVwJ1xuLy8gaW1wb3J0IHsgcHVzaFdhdGNoZXIgfSBmcm9tICcuL2JhdGNoZXInXG5pbXBvcnQge1xuICByZW1vdmUsXG4gIGV4dGVuZCxcbiAgaXNPYmplY3QsXG4gIGNyZWF0ZU5ld1NldFxuICAvLyBfU2V0IGFzIFNldFxufSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5sZXQgdWlkID0gMFxuXG4vKipcbiAqIEEgd2F0Y2hlciBwYXJzZXMgYW4gZXhwcmVzc2lvbiwgY29sbGVjdHMgZGVwZW5kZW5jaWVzLFxuICogYW5kIGZpcmVzIGNhbGxiYWNrIHdoZW4gdGhlIGV4cHJlc3Npb24gdmFsdWUgY2hhbmdlcy5cbiAqIFRoaXMgaXMgdXNlZCBmb3IgYm90aCB0aGUgJHdhdGNoKCkgYXBpIGFuZCBkaXJlY3RpdmVzLlxuICpcbiAqIEBwYXJhbSB7VnVlfSB2bVxuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IGV4cE9yRm5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNiXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgICAgICAgICAgIC0ge0FycmF5fSBmaWx0ZXJzXG4gKiAgICAgICAgICAgICAgICAgLSB7Qm9vbGVhbn0gdHdvV2F5XG4gKiAgICAgICAgICAgICAgICAgLSB7Qm9vbGVhbn0gZGVlcFxuICogICAgICAgICAgICAgICAgIC0ge0Jvb2xlYW59IHVzZXJcbiAqICAgICAgICAgICAgICAgICAtIHtCb29sZWFufSBzeW5jXG4gKiAgICAgICAgICAgICAgICAgLSB7Qm9vbGVhbn0gbGF6eVxuICogICAgICAgICAgICAgICAgIC0ge0Z1bmN0aW9ufSBbcHJlUHJvY2Vzc11cbiAqICAgICAgICAgICAgICAgICAtIHtGdW5jdGlvbn0gW3Bvc3RQcm9jZXNzXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gV2F0Y2hlciAodm0sIGV4cE9yRm4sIGNiLCBvcHRpb25zKSB7XG4gIC8vIG1peCBpbiBvcHRpb25zXG4gIGlmIChvcHRpb25zKSB7XG4gICAgZXh0ZW5kKHRoaXMsIG9wdGlvbnMpXG4gIH1cbiAgY29uc3QgaXNGbiA9IHR5cGVvZiBleHBPckZuID09PSAnZnVuY3Rpb24nXG4gIHRoaXMudm0gPSB2bVxuICB2bS5fd2F0Y2hlcnMucHVzaCh0aGlzKVxuICB0aGlzLmV4cHJlc3Npb24gPSBleHBPckZuXG4gIHRoaXMuY2IgPSBjYlxuICB0aGlzLmlkID0gKyt1aWQgLy8gdWlkIGZvciBiYXRjaGluZ1xuICB0aGlzLmFjdGl2ZSA9IHRydWVcbiAgdGhpcy5kaXJ0eSA9IHRoaXMubGF6eSAvLyBmb3IgbGF6eSB3YXRjaGVyc1xuICB0aGlzLmRlcHMgPSBbXVxuICB0aGlzLm5ld0RlcHMgPSBbXVxuICB0aGlzLmRlcElkcyA9IGNyZWF0ZU5ld1NldCgpIC8vIG5ldyBTZXQoKVxuICB0aGlzLm5ld0RlcElkcyA9IGNyZWF0ZU5ld1NldCgpIC8vIG5ldyBTZXQoKVxuICAvLyBwYXJzZSBleHByZXNzaW9uIGZvciBnZXR0ZXJcbiAgaWYgKGlzRm4pIHtcbiAgICB0aGlzLmdldHRlciA9IGV4cE9yRm5cbiAgfVxuICB0aGlzLnZhbHVlID0gdGhpcy5sYXp5XG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHRoaXMuZ2V0KClcbiAgLy8gc3RhdGUgZm9yIGF2b2lkaW5nIGZhbHNlIHRyaWdnZXJzIGZvciBkZWVwIGFuZCBBcnJheVxuICAvLyB3YXRjaGVycyBkdXJpbmcgdm0uX2RpZ2VzdCgpXG4gIHRoaXMucXVldWVkID0gdGhpcy5zaGFsbG93ID0gZmFsc2Vcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSB0aGUgZ2V0dGVyLCBhbmQgcmUtY29sbGVjdCBkZXBlbmRlbmNpZXMuXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICBwdXNoVGFyZ2V0KHRoaXMpXG4gIGNvbnN0IHZhbHVlID0gdGhpcy5nZXR0ZXIuY2FsbCh0aGlzLnZtLCB0aGlzLnZtKVxuICAvLyBcInRvdWNoXCIgZXZlcnkgcHJvcGVydHkgc28gdGhleSBhcmUgYWxsIHRyYWNrZWQgYXNcbiAgLy8gZGVwZW5kZW5jaWVzIGZvciBkZWVwIHdhdGNoaW5nXG4gIGlmICh0aGlzLmRlZXApIHtcbiAgICB0cmF2ZXJzZSh2YWx1ZSlcbiAgfVxuICBwb3BUYXJnZXQoKVxuICB0aGlzLmNsZWFudXBEZXBzKClcbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQWRkIGEgZGVwZW5kZW5jeSB0byB0aGlzIGRpcmVjdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge0RlcH0gZGVwXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuYWRkRGVwID0gZnVuY3Rpb24gKGRlcCkge1xuICBjb25zdCBpZCA9IGRlcC5pZFxuICBpZiAoIXRoaXMubmV3RGVwSWRzLmhhcyhpZCkpIHtcbiAgICB0aGlzLm5ld0RlcElkcy5hZGQoaWQpXG4gICAgdGhpcy5uZXdEZXBzLnB1c2goZGVwKVxuICAgIGlmICghdGhpcy5kZXBJZHMuaGFzKGlkKSkge1xuICAgICAgZGVwLmFkZFN1Yih0aGlzKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENsZWFuIHVwIGZvciBkZXBlbmRlbmN5IGNvbGxlY3Rpb24uXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuY2xlYW51cERlcHMgPSBmdW5jdGlvbiAoKSB7XG4gIGxldCBpID0gdGhpcy5kZXBzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29uc3QgZGVwID0gdGhpcy5kZXBzW2ldXG4gICAgaWYgKCF0aGlzLm5ld0RlcElkcy5oYXMoZGVwLmlkKSkge1xuICAgICAgZGVwLnJlbW92ZVN1Yih0aGlzKVxuICAgIH1cbiAgfVxuICBsZXQgdG1wID0gdGhpcy5kZXBJZHNcbiAgdGhpcy5kZXBJZHMgPSB0aGlzLm5ld0RlcElkc1xuICB0aGlzLm5ld0RlcElkcyA9IHRtcFxuICB0aGlzLm5ld0RlcElkcy5jbGVhcigpXG4gIHRtcCA9IHRoaXMuZGVwc1xuICB0aGlzLmRlcHMgPSB0aGlzLm5ld0RlcHNcbiAgdGhpcy5uZXdEZXBzID0gdG1wXG4gIHRoaXMubmV3RGVwcy5sZW5ndGggPSAwXG59XG5cbi8qKlxuICogU3Vic2NyaWJlciBpbnRlcmZhY2UuXG4gKiBXaWxsIGJlIGNhbGxlZCB3aGVuIGEgZGVwZW5kZW5jeSBjaGFuZ2VzLlxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hhbGxvd1xuICovXG5cbldhdGNoZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChzaGFsbG93KSB7XG4gIGlmICh0aGlzLmxhenkpIHtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZVxuICB9IGVsc2Uge1xuICAgIHRoaXMucnVuKClcbiAgfVxuICAvLyB9IGVsc2UgaWYgKHRoaXMuc3luYykge1xuICAvLyAgIHRoaXMucnVuKClcbiAgLy8gfSBlbHNlIHtcbiAgLy8gICAvLyBpZiBxdWV1ZWQsIG9ubHkgb3ZlcndyaXRlIHNoYWxsb3cgd2l0aCBub24tc2hhbGxvdyxcbiAgLy8gICAvLyBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLlxuICAvLyAgIHRoaXMuc2hhbGxvdyA9IHRoaXMucXVldWVkXG4gIC8vICAgICA/IHNoYWxsb3dcbiAgLy8gICAgICAgPyB0aGlzLnNoYWxsb3dcbiAgLy8gICAgICAgOiBmYWxzZVxuICAvLyAgICAgOiAhIXNoYWxsb3dcbiAgLy8gICB0aGlzLnF1ZXVlZCA9IHRydWVcbiAgLy8gICBwdXNoV2F0Y2hlcih0aGlzKVxuICAvLyB9XG59XG5cbi8qKlxuICogQmF0Y2hlciBqb2IgaW50ZXJmYWNlLlxuICogV2lsbCBiZSBjYWxsZWQgYnkgdGhlIGJhdGNoZXIuXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KClcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAhPT0gdGhpcy52YWx1ZSB8fFxuICAgICAgLy8gRGVlcCB3YXRjaGVycyBhbmQgd2F0Y2hlcnMgb24gT2JqZWN0L0FycmF5cyBzaG91bGQgZmlyZSBldmVuXG4gICAgICAvLyB3aGVuIHRoZSB2YWx1ZSBpcyB0aGUgc2FtZSwgYmVjYXVzZSB0aGUgdmFsdWUgbWF5XG4gICAgICAvLyBoYXZlIG11dGF0ZWQ7IGJ1dCBvbmx5IGRvIHNvIGlmIHRoaXMgaXMgYVxuICAgICAgLy8gbm9uLXNoYWxsb3cgdXBkYXRlIChjYXVzZWQgYnkgYSB2bSBkaWdlc3QpLlxuICAgICAgKChpc09iamVjdCh2YWx1ZSkgfHwgdGhpcy5kZWVwKSAmJiAhdGhpcy5zaGFsbG93KVxuICAgICkge1xuICAgICAgLy8gc2V0IG5ldyB2YWx1ZVxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnZhbHVlXG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWVcbiAgICAgIHRoaXMuY2IuY2FsbCh0aGlzLnZtLCB2YWx1ZSwgb2xkVmFsdWUpXG4gICAgfVxuICAgIHRoaXMucXVldWVkID0gdGhpcy5zaGFsbG93ID0gZmFsc2VcbiAgfVxufVxuXG4vKipcbiAqIEV2YWx1YXRlIHRoZSB2YWx1ZSBvZiB0aGUgd2F0Y2hlci5cbiAqIFRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGF6eSB3YXRjaGVycy5cbiAqL1xuXG5XYXRjaGVyLnByb3RvdHlwZS5ldmFsdWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy52YWx1ZSA9IHRoaXMuZ2V0KClcbiAgdGhpcy5kaXJ0eSA9IGZhbHNlXG59XG5cbi8qKlxuICogRGVwZW5kIG9uIGFsbCBkZXBzIGNvbGxlY3RlZCBieSB0aGlzIHdhdGNoZXIuXG4gKi9cblxuV2F0Y2hlci5wcm90b3R5cGUuZGVwZW5kID0gZnVuY3Rpb24gKCkge1xuICBsZXQgaSA9IHRoaXMuZGVwcy5sZW5ndGhcbiAgd2hpbGUgKGktLSkge1xuICAgIHRoaXMuZGVwc1tpXS5kZXBlbmQoKVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIHNlbGYgZnJvbSBhbGwgZGVwZW5kZW5jaWVzJyBzdWJjcmliZXIgbGlzdC5cbiAqL1xuXG5XYXRjaGVyLnByb3RvdHlwZS50ZWFyZG93biA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuYWN0aXZlKSB7XG4gICAgLy8gcmVtb3ZlIHNlbGYgZnJvbSB2bSdzIHdhdGNoZXIgbGlzdFxuICAgIC8vIHRoaXMgaXMgYSBzb21ld2hhdCBleHBlbnNpdmUgb3BlcmF0aW9uIHNvIHdlIHNraXAgaXRcbiAgICAvLyBpZiB0aGUgdm0gaXMgYmVpbmcgZGVzdHJveWVkIG9yIGlzIHBlcmZvcm1pbmcgYSB2LWZvclxuICAgIC8vIHJlLXJlbmRlciAodGhlIHdhdGNoZXIgbGlzdCBpcyB0aGVuIGZpbHRlcmVkIGJ5IHYtZm9yKS5cbiAgICBpZiAoIXRoaXMudm0uX2lzQmVpbmdEZXN0cm95ZWQgJiYgIXRoaXMudm0uX3ZGb3JSZW1vdmluZykge1xuICAgICAgcmVtb3ZlKHRoaXMudm0uX3dhdGNoZXJzLCB0aGlzKVxuICAgIH1cbiAgICBsZXQgaSA9IHRoaXMuZGVwcy5sZW5ndGhcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICB0aGlzLmRlcHNbaV0ucmVtb3ZlU3ViKHRoaXMpXG4gICAgfVxuICAgIHRoaXMuYWN0aXZlID0gZmFsc2VcbiAgICB0aGlzLnZtID0gdGhpcy5jYiA9IHRoaXMudmFsdWUgPSBudWxsXG4gIH1cbn1cblxuLyoqXG4gKiBSZWNydXNpdmVseSB0cmF2ZXJzZSBhbiBvYmplY3QgdG8gZXZva2UgYWxsIGNvbnZlcnRlZFxuICogZ2V0dGVycywgc28gdGhhdCBldmVyeSBuZXN0ZWQgcHJvcGVydHkgaW5zaWRlIHRoZSBvYmplY3RcbiAqIGlzIGNvbGxlY3RlZCBhcyBhIFwiZGVlcFwiIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHsqfSB2YWxcbiAqIEBwYXJhbSB7U2V0fSBzZWVuXG4gKi9cblxuY29uc3Qgc2Vlbk9iamVjdHMgPSBjcmVhdGVOZXdTZXQoKSAvLyBuZXcgU2V0KClcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiB0cmF2ZXJzZSAodmFsLCBzZWVuKSB7XG4gIGxldCBpLCBrZXlzLCBpc0EsIGlzT1xuICBpZiAoIXNlZW4pIHtcbiAgICBzZWVuID0gc2Vlbk9iamVjdHNcbiAgICBzZWVuLmNsZWFyKClcbiAgfVxuICBpc0EgPSBBcnJheS5pc0FycmF5KHZhbClcbiAgaXNPID0gaXNPYmplY3QodmFsKVxuICBpZiAoaXNBIHx8IGlzTykge1xuICAgIGlmICh2YWwuX19vYl9fKSB7XG4gICAgICBjb25zdCBkZXBJZCA9IHZhbC5fX29iX18uZGVwLmlkXG4gICAgICBpZiAoc2Vlbi5oYXMoZGVwSWQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Vlbi5hZGQoZGVwSWQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0EpIHtcbiAgICAgIGkgPSB2YWwubGVuZ3RoXG4gICAgICB3aGlsZSAoaS0tKSB0cmF2ZXJzZSh2YWxbaV0sIHNlZW4pXG4gICAgfSBlbHNlIGlmIChpc08pIHtcbiAgICAgIGtleXMgPSBPYmplY3Qua2V5cyh2YWwpXG4gICAgICBpID0ga2V5cy5sZW5ndGhcbiAgICAgIHdoaWxlIChpLS0pIHRyYXZlcnNlKHZhbFtrZXlzW2ldXSwgc2VlbilcbiAgICB9XG4gIH1cbn1cbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuaW1wb3J0IHsgZGVmIH0gZnJvbSAnLi4vdXRpbC9pbmRleCdcblxuY29uc3QgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZVxuZXhwb3J0IGNvbnN0IGFycmF5TWV0aG9kcyA9IE9iamVjdC5jcmVhdGUoYXJyYXlQcm90bylcblxuLyoqXG4gKiBJbnRlcmNlcHQgbXV0YXRpbmcgbWV0aG9kcyBhbmQgZW1pdCBldmVudHNcbiAqL1xuXG47W1xuICAncHVzaCcsXG4gICdwb3AnLFxuICAnc2hpZnQnLFxuICAndW5zaGlmdCcsXG4gICdzcGxpY2UnLFxuICAnc29ydCcsXG4gICdyZXZlcnNlJ1xuXVxuLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAvLyBjYWNoZSBvcmlnaW5hbCBtZXRob2RcbiAgY29uc3Qgb3JpZ2luYWwgPSBhcnJheVByb3RvW21ldGhvZF1cbiAgZGVmKGFycmF5TWV0aG9kcywgbWV0aG9kLCBmdW5jdGlvbiBtdXRhdG9yICgpIHtcbiAgICAvLyBhdm9pZCBsZWFraW5nIGFyZ3VtZW50czpcbiAgICAvLyBodHRwOi8vanNwZXJmLmNvbS9jbG9zdXJlLXdpdGgtYXJndW1lbnRzXG4gICAgbGV0IGkgPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgY29uc3QgYXJncyA9IG5ldyBBcnJheShpKVxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV1cbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWwuYXBwbHkodGhpcywgYXJncylcbiAgICBjb25zdCBvYiA9IHRoaXMuX19vYl9fXG4gICAgbGV0IGluc2VydGVkXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3B1c2gnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3NcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3Vuc2hpZnQnOlxuICAgICAgICBpbnNlcnRlZCA9IGFyZ3NcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3NwbGljZSc6XG4gICAgICAgIGluc2VydGVkID0gYXJncy5zbGljZSgyKVxuICAgICAgICBicmVha1xuICAgIH1cbiAgICBpZiAoaW5zZXJ0ZWQpIG9iLm9ic2VydmVBcnJheShpbnNlcnRlZClcbiAgICAvLyBub3RpZnkgY2hhbmdlXG4gICAgb2IuZGVwLm5vdGlmeSgpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9KVxufSlcblxuLyoqXG4gKiBTd2FwIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleCB3aXRoIGEgbmV3IHZhbHVlXG4gKiBhbmQgZW1pdHMgY29ycmVzcG9uZGluZyBldmVudC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcmV0dXJuIHsqfSAtIHJlcGxhY2VkIGVsZW1lbnRcbiAqL1xuXG5kZWYoXG4gIGFycmF5UHJvdG8sXG4gICckc2V0JyxcbiAgZnVuY3Rpb24gJHNldCAoaW5kZXgsIHZhbCkge1xuICAgIGNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gXCJBcnJheS5wcm90b3R5cGUuJHNldFwiIGlzIG5vdCBhIHN0YW5kYXJkIEFQSSxgXG4gICAgICArIGAgaXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHZlcnNpb24uYClcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGVuZ3RoID0gaW5kZXggKyAxXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNwbGljZShpbmRleCwgMSwgdmFsKVswXVxuICB9XG4pXG5cbi8qKlxuICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBhdCBnaXZlbiBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKi9cblxuZGVmKFxuICBhcnJheVByb3RvLFxuICAnJHJlbW92ZScsXG4gIGZ1bmN0aW9uICRyZW1vdmUgKGluZGV4KSB7XG4gICAgY29uc29sZS53YXJuKGBbSlMgRnJhbWV3b3JrXSBcIkFycmF5LnByb3RvdHlwZS4kcmVtb3ZlXCIgaXMgbm90IGEgc3RhbmRhcmQgQVBJLGBcbiAgICAgICsgYCBpdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgdmVyc2lvbi5gKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmICghdGhpcy5sZW5ndGgpIHJldHVyblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHtcbiAgICAgIGluZGV4ID0gdGhpcy5pbmRleE9mKGluZGV4KVxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLnNwbGljZShpbmRleCwgMSlcbiAgICB9XG4gIH1cbilcbiIsIi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuaW1wb3J0IERlcCBmcm9tICcuL2RlcCdcbmltcG9ydCB7IGFycmF5TWV0aG9kcyB9IGZyb20gJy4vYXJyYXknXG5pbXBvcnQge1xuICBkZWYsXG4gIHJlbW92ZSxcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGhhc1Byb3RvLFxuICBoYXNPd24sXG4gIGlzUmVzZXJ2ZWRcbn0gZnJvbSAnLi4vdXRpbC9pbmRleCdcblxuY29uc3QgYXJyYXlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJyYXlNZXRob2RzKVxuXG4vKipcbiAqIE9ic2VydmVyIGNsYXNzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIGVhY2ggb2JzZXJ2ZWRcbiAqIG9iamVjdC4gT25jZSBhdHRhY2hlZCwgdGhlIG9ic2VydmVyIGNvbnZlcnRzIHRhcmdldFxuICogb2JqZWN0J3MgcHJvcGVydHkga2V5cyBpbnRvIGdldHRlci9zZXR0ZXJzIHRoYXRcbiAqIGNvbGxlY3QgZGVwZW5kZW5jaWVzIGFuZCBkaXNwYXRjaGVzIHVwZGF0ZXMuXG4gKlxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IHZhbHVlXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gT2JzZXJ2ZXIgKHZhbHVlKSB7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZVxuICB0aGlzLmRlcCA9IG5ldyBEZXAoKVxuICBkZWYodmFsdWUsICdfX29iX18nLCB0aGlzKVxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBhdWdtZW50ID0gaGFzUHJvdG9cbiAgICAgID8gcHJvdG9BdWdtZW50XG4gICAgICA6IGNvcHlBdWdtZW50XG4gICAgYXVnbWVudCh2YWx1ZSwgYXJyYXlNZXRob2RzLCBhcnJheUtleXMpXG4gICAgdGhpcy5vYnNlcnZlQXJyYXkodmFsdWUpXG4gIH0gZWxzZSB7XG4gICAgdGhpcy53YWxrKHZhbHVlKVxuICB9XG59XG5cbi8vIEluc3RhbmNlIG1ldGhvZHNcblxuLyoqXG4gKiBXYWxrIHRocm91Z2ggZWFjaCBwcm9wZXJ0eSBhbmQgY29udmVydCB0aGVtIGludG9cbiAqIGdldHRlci9zZXR0ZXJzLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlblxuICogdmFsdWUgdHlwZSBpcyBPYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICovXG5cbk9ic2VydmVyLnByb3RvdHlwZS53YWxrID0gZnVuY3Rpb24gKG9iaikge1xuICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgdGhpcy5jb252ZXJ0KGtleSwgb2JqW2tleV0pXG4gIH1cbn1cblxuLyoqXG4gKiBPYnNlcnZlIGEgbGlzdCBvZiBBcnJheSBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtc1xuICovXG5cbk9ic2VydmVyLnByb3RvdHlwZS5vYnNlcnZlQXJyYXkgPSBmdW5jdGlvbiAoaXRlbXMpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBvYnNlcnZlKGl0ZW1zW2ldKVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIHByb3BlcnR5IGludG8gZ2V0dGVyL3NldHRlciBzbyB3ZSBjYW4gZW1pdFxuICogdGhlIGV2ZW50cyB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBhY2Nlc3NlZC9jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKi9cblxuT2JzZXJ2ZXIucHJvdG90eXBlLmNvbnZlcnQgPSBmdW5jdGlvbiAoa2V5LCB2YWwpIHtcbiAgZGVmaW5lUmVhY3RpdmUodGhpcy52YWx1ZSwga2V5LCB2YWwpXG59XG5cbi8qKlxuICogQWRkIGFuIG93bmVyIHZtLCBzbyB0aGF0IHdoZW4gJHNldC8kZGVsZXRlIG11dGF0aW9uc1xuICogaGFwcGVuIHdlIGNhbiBub3RpZnkgb3duZXIgdm1zIHRvIHByb3h5IHRoZSBrZXlzIGFuZFxuICogZGlnZXN0IHRoZSB3YXRjaGVycy4gVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBvYmplY3RcbiAqIGlzIG9ic2VydmVkIGFzIGFuIGluc3RhbmNlJ3Mgcm9vdCAkZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1Z1ZX0gdm1cbiAqL1xuXG5PYnNlcnZlci5wcm90b3R5cGUuYWRkVm0gPSBmdW5jdGlvbiAodm0pIHtcbiAgKHRoaXMudm1zIHx8ICh0aGlzLnZtcyA9IFtdKSkucHVzaCh2bSlcbn1cblxuLyoqXG4gKiBSZW1vdmUgYW4gb3duZXIgdm0uIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpc1xuICogc3dhcHBlZCBvdXQgYXMgYW4gaW5zdGFuY2UncyAkZGF0YSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtWdWV9IHZtXG4gKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbk9ic2VydmVyLnByb3RvdHlwZS5yZW1vdmVWbSA9IGZ1bmN0aW9uICh2bSkge1xuICByZW1vdmUodGhpcy52bXMsIHZtKVxufVxuXG4vLyBoZWxwZXJzXG5cbi8qKlxuICogQXVnbWVudCBhbiB0YXJnZXQgT2JqZWN0IG9yIEFycmF5IGJ5IGludGVyY2VwdGluZ1xuICogdGhlIHByb3RvdHlwZSBjaGFpbiB1c2luZyBfX3Byb3RvX19cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gdGFyZ2V0XG4gKiBAcGFyYW0ge09iamVjdH0gc3JjXG4gKi9cblxuZnVuY3Rpb24gcHJvdG9BdWdtZW50ICh0YXJnZXQsIHNyYykge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuICB0YXJnZXQuX19wcm90b19fID0gc3JjXG4gIC8qIGVzbGludC1lbmFibGUgbm8tcHJvdG8gKi9cbn1cblxuLyoqXG4gKiBBdWdtZW50IGFuIHRhcmdldCBPYmplY3Qgb3IgQXJyYXkgYnkgZGVmaW5pbmdcbiAqIGhpZGRlbiBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSB0YXJnZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b1xuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBjb3B5QXVnbWVudCAodGFyZ2V0LCBzcmMsIGtleXMpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cbiAgICBkZWYodGFyZ2V0LCBrZXksIHNyY1trZXldKVxuICB9XG59XG5cbi8qKlxuICogQXR0ZW1wdCB0byBjcmVhdGUgYW4gb2JzZXJ2ZXIgaW5zdGFuY2UgZm9yIGEgdmFsdWUsXG4gKiByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgaWYgc3VjY2Vzc2Z1bGx5IG9ic2VydmVkLFxuICogb3IgdGhlIGV4aXN0aW5nIG9ic2VydmVyIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGhhcyBvbmUuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtWdWV9IFt2bV1cbiAqIEByZXR1cm4ge09ic2VydmVyfHVuZGVmaW5lZH1cbiAqIEBzdGF0aWNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZSAodmFsdWUsIHZtKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGV0IG9iXG4gIGlmIChoYXNPd24odmFsdWUsICdfX29iX18nKSAmJiB2YWx1ZS5fX29iX18gaW5zdGFuY2VvZiBPYnNlcnZlcikge1xuICAgIG9iID0gdmFsdWUuX19vYl9fXG4gIH0gZWxzZSBpZiAoXG4gICAgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IGlzUGxhaW5PYmplY3QodmFsdWUpKSAmJlxuICAgIE9iamVjdC5pc0V4dGVuc2libGUodmFsdWUpICYmXG4gICAgIXZhbHVlLl9pc1Z1ZVxuICApIHtcbiAgICBvYiA9IG5ldyBPYnNlcnZlcih2YWx1ZSlcbiAgfVxuICBpZiAob2IgJiYgdm0pIHtcbiAgICBvYi5hZGRWbSh2bSlcbiAgfVxuICByZXR1cm4gb2Jcbn1cblxuLyoqXG4gKiBEZWZpbmUgYSByZWFjdGl2ZSBwcm9wZXJ0eSBvbiBhbiBPYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWxcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVhY3RpdmUgKG9iaiwga2V5LCB2YWwpIHtcbiAgY29uc3QgZGVwID0gbmV3IERlcCgpXG5cbiAgY29uc3QgcHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KVxuICBpZiAocHJvcGVydHkgJiYgcHJvcGVydHkuY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gY2F0ZXIgZm9yIHByZS1kZWZpbmVkIGdldHRlci9zZXR0ZXJzXG4gIGNvbnN0IGdldHRlciA9IHByb3BlcnR5ICYmIHByb3BlcnR5LmdldFxuICBjb25zdCBzZXR0ZXIgPSBwcm9wZXJ0eSAmJiBwcm9wZXJ0eS5zZXRcblxuICBsZXQgY2hpbGRPYiA9IG9ic2VydmUodmFsKVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlR2V0dGVyICgpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKERlcC50YXJnZXQpIHtcbiAgICAgICAgZGVwLmRlcGVuZCgpXG4gICAgICAgIGlmIChjaGlsZE9iKSB7XG4gICAgICAgICAgY2hpbGRPYi5kZXAuZGVwZW5kKClcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICBmb3IgKGxldCBlLCBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgZSA9IHZhbHVlW2ldXG4gICAgICAgICAgICBlICYmIGUuX19vYl9fICYmIGUuX19vYl9fLmRlcC5kZXBlbmQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHJlYWN0aXZlU2V0dGVyIChuZXdWYWwpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0dGVyID8gZ2V0dGVyLmNhbGwob2JqKSA6IHZhbFxuICAgICAgaWYgKG5ld1ZhbCA9PT0gdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoc2V0dGVyKSB7XG4gICAgICAgIHNldHRlci5jYWxsKG9iaiwgbmV3VmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsID0gbmV3VmFsXG4gICAgICB9XG4gICAgICBjaGlsZE9iID0gb2JzZXJ2ZShuZXdWYWwpXG4gICAgICBkZXAubm90aWZ5KClcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgb24gYW4gb2JqZWN0LiBBZGRzIHRoZSBuZXcgcHJvcGVydHkgYW5kXG4gKiB0cmlnZ2VycyBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlmIHRoZSBwcm9wZXJ0eSBkb2Vzbid0XG4gKiBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7U3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Kn0gdmFsXG4gKiBAcHVibGljXG4gKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXQgKG9iaiwga2V5LCB2YWwpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmouc3BsaWNlKGtleSwgMSwgdmFsKVxuICB9XG4gIGlmIChoYXNPd24ob2JqLCBrZXkpKSB7XG4gICAgb2JqW2tleV0gPSB2YWxcbiAgICByZXR1cm5cbiAgfVxuICBpZiAob2JqLl9pc1Z1ZSkge1xuICAgIHNldChvYmouX2RhdGEsIGtleSwgdmFsKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IG9iID0gb2JqLl9fb2JfX1xuICBpZiAoIW9iKSB7XG4gICAgb2JqW2tleV0gPSB2YWxcbiAgICByZXR1cm5cbiAgfVxuICBvYi5jb252ZXJ0KGtleSwgdmFsKVxuICBvYi5kZXAubm90aWZ5KClcbiAgaWYgKG9iLnZtcykge1xuICAgIGxldCBpID0gb2Iudm1zLmxlbmd0aFxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IHZtID0gb2Iudm1zW2ldXG4gICAgICBwcm94eSh2bSwga2V5KVxuICAgICAgLy8gdm0uJGZvcmNlVXBkYXRlKClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbFxufVxuXG4vKipcbiAqIERlbGV0ZSBhIHByb3BlcnR5IGFuZCB0cmlnZ2VyIGNoYW5nZSBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICovXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5leHBvcnQgZnVuY3Rpb24gZGVsIChvYmosIGtleSkge1xuICBpZiAoIWhhc093bihvYmosIGtleSkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBkZWxldGUgb2JqW2tleV1cbiAgY29uc3Qgb2IgPSBvYmouX19vYl9fXG5cbiAgaWYgKCFvYikge1xuICAgIGlmIChvYmouX2lzVnVlKSB7XG4gICAgICBkZWxldGUgb2JqLl9kYXRhW2tleV1cbiAgICAgIC8vIG9iai4kZm9yY2VVcGRhdGUoKVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBvYi5kZXAubm90aWZ5KClcbiAgaWYgKG9iLnZtcykge1xuICAgIGxldCBpID0gb2Iudm1zLmxlbmd0aFxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGNvbnN0IHZtID0gb2Iudm1zW2ldXG4gICAgICB1bnByb3h5KHZtLCBrZXkpXG4gICAgICAvLyB2bS4kZm9yY2VVcGRhdGUoKVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBLRVlfV09SRFMgPSBbJyRpbmRleCcsICckdmFsdWUnLCAnJGV2ZW50J11cbmV4cG9ydCBmdW5jdGlvbiBwcm94eSAodm0sIGtleSkge1xuICBpZiAoS0VZX1dPUkRTLmluZGV4T2Yoa2V5KSA+IC0xIHx8ICFpc1Jlc2VydmVkKGtleSkpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodm0sIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gcHJveHlHZXR0ZXIgKCkge1xuICAgICAgICByZXR1cm4gdm0uX2RhdGFba2V5XVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gcHJveHlTZXR0ZXIgKHZhbCkge1xuICAgICAgICB2bS5fZGF0YVtrZXldID0gdmFsXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucHJveHkgKHZtLCBrZXkpIHtcbiAgaWYgKCFpc1Jlc2VydmVkKGtleSkpIHtcbiAgICBkZWxldGUgdm1ba2V5XVxuICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5cbmltcG9ydCBXYXRjaGVyIGZyb20gJy4vd2F0Y2hlcidcbmltcG9ydCBEZXAgZnJvbSAnLi9kZXAnXG5pbXBvcnQge1xuICBvYnNlcnZlLFxuICBwcm94eSxcbiAgdW5wcm94eVxufSBmcm9tICcuL29ic2VydmVyJ1xuaW1wb3J0IHtcbiAgaXNQbGFpbk9iamVjdCxcbiAgYmluZFxufSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG5leHBvcnQgZnVuY3Rpb24gaW5pdFN0YXRlICh2bSkge1xuICB2bS5fd2F0Y2hlcnMgPSBbXVxuICBpbml0RGF0YSh2bSlcbiAgaW5pdENvbXB1dGVkKHZtKVxuICBpbml0TWV0aG9kcyh2bSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXREYXRhICh2bSkge1xuICBsZXQgZGF0YSA9IHZtLl9kYXRhXG5cbiAgaWYgKCFpc1BsYWluT2JqZWN0KGRhdGEpKSB7XG4gICAgZGF0YSA9IHt9XG4gIH1cbiAgLy8gcHJveHkgZGF0YSBvbiBpbnN0YW5jZVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgcHJveHkodm0sIGtleXNbaV0pXG4gIH1cbiAgLy8gb2JzZXJ2ZSBkYXRhXG4gIG9ic2VydmUoZGF0YSwgdm0pXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBub29wICgpIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRDb21wdXRlZCAodm0pIHtcbiAgY29uc3QgY29tcHV0ZWQgPSB2bS5fY29tcHV0ZWRcbiAgaWYgKGNvbXB1dGVkKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGNvbXB1dGVkKSB7XG4gICAgICBjb25zdCB1c2VyRGVmID0gY29tcHV0ZWRba2V5XVxuICAgICAgY29uc3QgZGVmID0ge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdXNlckRlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkZWYuZ2V0ID0gbWFrZUNvbXB1dGVkR2V0dGVyKHVzZXJEZWYsIHZtKVxuICAgICAgICBkZWYuc2V0ID0gbm9vcFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmLmdldCA9IHVzZXJEZWYuZ2V0XG4gICAgICAgICAgPyB1c2VyRGVmLmNhY2hlICE9PSBmYWxzZVxuICAgICAgICAgICAgPyBtYWtlQ29tcHV0ZWRHZXR0ZXIodXNlckRlZi5nZXQsIHZtKVxuICAgICAgICAgICAgOiBiaW5kKHVzZXJEZWYuZ2V0LCB2bSlcbiAgICAgICAgICA6IG5vb3BcbiAgICAgICAgZGVmLnNldCA9IHVzZXJEZWYuc2V0XG4gICAgICAgICAgPyBiaW5kKHVzZXJEZWYuc2V0LCB2bSlcbiAgICAgICAgICA6IG5vb3BcbiAgICAgIH1cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2bSwga2V5LCBkZWYpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VDb21wdXRlZEdldHRlciAoZ2V0dGVyLCBvd25lcikge1xuICBjb25zdCB3YXRjaGVyID0gbmV3IFdhdGNoZXIob3duZXIsIGdldHRlciwgbnVsbCwge1xuICAgIGxhenk6IHRydWVcbiAgfSlcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVkR2V0dGVyICgpIHtcbiAgICBpZiAod2F0Y2hlci5kaXJ0eSkge1xuICAgICAgd2F0Y2hlci5ldmFsdWF0ZSgpXG4gICAgfVxuICAgIGlmIChEZXAudGFyZ2V0KSB7XG4gICAgICB3YXRjaGVyLmRlcGVuZCgpXG4gICAgfVxuICAgIHJldHVybiB3YXRjaGVyLnZhbHVlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRNZXRob2RzICh2bSkge1xuICBjb25zdCBtZXRob2RzID0gdm0uX21ldGhvZHNcbiAgaWYgKG1ldGhvZHMpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gbWV0aG9kcykge1xuICAgICAgdm1ba2V5XSA9IG1ldGhvZHNba2V5XVxuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vLyBAdG9kbzogSXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYnkgbmF0aXZlIGZyb20gYHJlZ2lzdGVyQ29tcG9uZW50cygpYC5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYXRpdmVDb21wb25lbnRNYXA6IHtcbiAgICB0ZXh0OiB0cnVlLFxuICAgIGltYWdlOiB0cnVlLFxuICAgIGNvbnRhaW5lcjogdHJ1ZSxcbiAgICBzbGlkZXI6IHtcbiAgICAgIHR5cGU6ICdzbGlkZXInLFxuICAgICAgYXBwZW5kOiAndHJlZSdcbiAgICB9LFxuICAgIGNlbGw6IHtcbiAgICAgIHR5cGU6ICdjZWxsJyxcbiAgICAgIGFwcGVuZDogJ3RyZWUnXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVPdmVydmlld1xuICogRGlyZWN0aXZlIFBhcnNlclxuICovXG5cbmltcG9ydCB7IGJpbmQsIHR5cG9mIH0gZnJvbSAnLi4vdXRpbC9pbmRleCdcbmltcG9ydCBXYXRjaGVyIGZyb20gJy4uL2NvcmUvd2F0Y2hlcidcbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJ1xuXG5jb25zdCB7IG5hdGl2ZUNvbXBvbmVudE1hcCB9ID0gY29uZmlnXG5cbmNvbnN0IFNFVFRFUlMgPSB7XG4gIGF0dHI6ICdzZXRBdHRyJyxcbiAgc3R5bGU6ICdzZXRTdHlsZScsXG4gIGV2ZW50OiAnYWRkRXZlbnQnXG59XG5cbi8qKlxuICogYXBwbHkgdGhlIG5hdGl2ZSBjb21wb25lbnQncyBvcHRpb25zKHNwZWNpZmllZCBieSB0ZW1wbGF0ZS50eXBlKVxuICogdG8gdGhlIHRlbXBsYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU5haXR2ZUNvbXBvbmVudE9wdGlvbnMgKHRlbXBsYXRlKSB7XG4gIGNvbnN0IHsgdHlwZSB9ID0gdGVtcGxhdGVcbiAgY29uc3Qgb3B0aW9ucyA9IG5hdGl2ZUNvbXBvbmVudE1hcFt0eXBlXVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAodGVtcGxhdGVba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIHRlbXBsYXRlW2tleV0gPSBvcHRpb25zW2tleV1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cG9mKHRlbXBsYXRlW2tleV0pID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB0eXBvZihvcHRpb25zW2tleV0pID09PSAnb2JqZWN0Jykge1xuICAgICAgICBmb3IgKGNvbnN0IHN1YmtleSBpbiBvcHRpb25zW2tleV0pIHtcbiAgICAgICAgICBpZiAodGVtcGxhdGVba2V5XVtzdWJrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlW2tleV1bc3Via2V5XSA9IG9wdGlvbnNba2V5XVtzdWJrZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogYmluZCBhbGwgaWQsIGF0dHIsIGNsYXNzbmFtZXMsIHN0eWxlLCBldmVudHMgdG8gYW4gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZEVsZW1lbnQgKHZtLCBlbCwgdGVtcGxhdGUpIHtcbiAgc2V0SWQodm0sIGVsLCB0ZW1wbGF0ZS5pZCwgdm0pXG4gIHNldEF0dHIodm0sIGVsLCB0ZW1wbGF0ZS5hdHRyKVxuICBzZXRDbGFzcyh2bSwgZWwsIHRlbXBsYXRlLmNsYXNzTGlzdClcbiAgc2V0U3R5bGUodm0sIGVsLCB0ZW1wbGF0ZS5zdHlsZSlcbiAgYmluZEV2ZW50cyh2bSwgZWwsIHRlbXBsYXRlLmV2ZW50cylcbn1cblxuLyoqXG4gKiBiaW5kIGFsbCBwcm9wcyB0byBzdWIgdm0gYW5kIGJpbmQgYWxsIHN0eWxlLCBldmVudHMgdG8gdGhlIHJvb3QgZWxlbWVudFxuICogb2YgdGhlIHN1YiB2bSBpZiBpdCBkb2Vzbid0IGhhdmUgYSByZXBsYWNlZCBtdWx0aS1ub2RlIGZyYWdtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kU3ViVm0gKHZtLCBzdWJWbSwgdGVtcGxhdGUsIHJlcGVhdEl0ZW0pIHtcbiAgc3ViVm0gPSBzdWJWbSB8fCB7fVxuICB0ZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IHt9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHN1YlZtLl9vcHRpb25zIHx8IHt9XG5cbiAgLy8gYmluZCBwcm9wc1xuICBsZXQgcHJvcHMgPSBvcHRpb25zLnByb3BzXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocHJvcHMpKSB7XG4gICAgcHJvcHMgPSBwcm9wcy5yZWR1Y2UoKHJlc3VsdCwgdmFsdWUpID0+IHtcbiAgICAgIHJlc3VsdFt2YWx1ZV0gPSB0cnVlXG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfSwge30pXG4gIH1cblxuICBtZXJnZVByb3BzKHJlcGVhdEl0ZW0sIHByb3BzLCB2bSwgc3ViVm0pXG4gIG1lcmdlUHJvcHModGVtcGxhdGUuYXR0ciwgcHJvcHMsIHZtLCBzdWJWbSlcbn1cblxuLyoqXG4gKiBtZXJnZSBjbGFzcyBhbmQgc3R5bGVzIGZyb20gdm0gdG8gc3ViIHZtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZFN1YlZtQWZ0ZXJJbml0aWFsaXplZCAodm0sIHN1YlZtLCB0ZW1wbGF0ZSwgdGFyZ2V0ID0ge30pIHtcbiAgbWVyZ2VDbGFzc1N0eWxlKHRlbXBsYXRlLmNsYXNzTGlzdCwgdm0sIHN1YlZtKVxuICBtZXJnZVN0eWxlKHRlbXBsYXRlLnN0eWxlLCB2bSwgc3ViVm0pXG5cbiAgLy8gYmluZCBzdWJWbSB0byB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgaWYgKHRhcmdldC5jaGlsZHJlbikge1xuICAgIHRhcmdldC5jaGlsZHJlblt0YXJnZXQuY2hpbGRyZW4ubGVuZ3RoIC0gMV0uX3ZtID0gc3ViVm1cbiAgfVxuICBlbHNlIHtcbiAgICB0YXJnZXQuX3ZtID0gc3ViVm1cbiAgfVxufVxuXG4vKipcbiAqIEJpbmQgcHJvcHMgZnJvbSB2bSB0byBzdWIgdm0gYW5kIHdhdGNoIHRoZWlyIHVwZGF0ZXMuXG4gKi9cbmZ1bmN0aW9uIG1lcmdlUHJvcHMgKHRhcmdldCwgcHJvcHMsIHZtLCBzdWJWbSkge1xuICBpZiAoIXRhcmdldCkge1xuICAgIHJldHVyblxuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xuICAgIGlmICghcHJvcHMgfHwgcHJvcHNba2V5XSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0YXJnZXRba2V5XVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHdhdGNoKHZtLCB2YWx1ZSwgZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICBzdWJWbVtrZXldID0gdlxuICAgICAgICB9KVxuICAgICAgICBzdWJWbVtrZXldID0gcmV0dXJuVmFsdWVcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdWJWbVtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBCaW5kIHN0eWxlIGZyb20gdm0gdG8gc3ViIHZtIGFuZCB3YXRjaCB0aGVpciB1cGRhdGVzLlxuICovXG5mdW5jdGlvbiBtZXJnZVN0eWxlICh0YXJnZXQsIHZtLCBzdWJWbSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRhcmdldFtrZXldXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSB3YXRjaCh2bSwgdmFsdWUsIGZ1bmN0aW9uICh2KSB7XG4gICAgICAgIGlmIChzdWJWbS5fcm9vdEVsKSB7XG4gICAgICAgICAgc3ViVm0uX3Jvb3RFbC5zZXRTdHlsZShrZXksIHYpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBzdWJWbS5fcm9vdEVsLnNldFN0eWxlKGtleSwgcmV0dXJuVmFsdWUpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKHN1YlZtLl9yb290RWwpIHtcbiAgICAgICAgc3ViVm0uX3Jvb3RFbC5zZXRTdHlsZShrZXksIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEJpbmQgY2xhc3MgJiBzdHlsZSBmcm9tIHZtIHRvIHN1YiB2bSBhbmQgd2F0Y2ggdGhlaXIgdXBkYXRlcy5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VDbGFzc1N0eWxlICh0YXJnZXQsIHZtLCBzdWJWbSkge1xuICBjb25zdCBjc3MgPSB2bS5fb3B0aW9ucyAmJiB2bS5fb3B0aW9ucy5zdHlsZSB8fCB7fVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAoIXN1YlZtLl9yb290RWwpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGNsYXNzTmFtZSA9ICdAb3JpZ2luYWxSb290RWwnXG4gIGNzc1tjbGFzc05hbWVdID0gc3ViVm0uX3Jvb3RFbC5jbGFzc1N0eWxlXG5cbiAgZnVuY3Rpb24gYWRkQ2xhc3NOYW1lIChsaXN0LCBuYW1lKSB7XG4gICAgaWYgKHR5cG9mKGxpc3QpID09PSAnYXJyYXknKSB7XG4gICAgICBsaXN0LnVuc2hpZnQobmFtZSlcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHZhbHVlID0gd2F0Y2godm0sIHRhcmdldCwgdiA9PiB7XG4gICAgICBhZGRDbGFzc05hbWUodiwgY2xhc3NOYW1lKVxuICAgICAgc2V0Q2xhc3NTdHlsZShzdWJWbS5fcm9vdEVsLCBjc3MsIHYpXG4gICAgfSlcbiAgICBhZGRDbGFzc05hbWUodmFsdWUsIGNsYXNzTmFtZSlcbiAgICBzZXRDbGFzc1N0eWxlKHN1YlZtLl9yb290RWwsIGNzcywgdmFsdWUpXG4gIH1cbiAgZWxzZSBpZiAodGFyZ2V0ICE9IG51bGwpIHtcbiAgICBhZGRDbGFzc05hbWUodGFyZ2V0LCBjbGFzc05hbWUpXG4gICAgc2V0Q2xhc3NTdHlsZShzdWJWbS5fcm9vdEVsLCBjc3MsIHRhcmdldClcbiAgfVxufVxuXG4vKipcbiAqIGJpbmQgaWQgdG8gYW4gZWxlbWVudFxuICogZWFjaCBpZCBpcyB1bmlxdWUgaW4gYSB3aG9sZSB2bVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SWQgKHZtLCBlbCwgaWQsIHRhcmdldCkge1xuICBjb25zdCBtYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobWFwLCB7XG4gICAgdm06IHtcbiAgICAgIHZhbHVlOiB0YXJnZXQsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gICAgfSxcbiAgICBlbDoge1xuICAgICAgZ2V0OiAoKSA9PiBlbCB8fCB0YXJnZXQuX3Jvb3RFbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2VcbiAgICB9XG4gIH0pXG5cbiAgaWYgKHR5cGVvZiBpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBpZFxuICAgIGlkID0gaGFuZGxlci5jYWxsKHZtKVxuICAgIGlmIChpZCB8fCBpZCA9PT0gMCkge1xuICAgICAgdm0uX2lkc1tpZF0gPSBtYXBcbiAgICB9XG4gICAgd2F0Y2godm0sIGhhbmRsZXIsIChuZXdJZCkgPT4ge1xuICAgICAgaWYgKG5ld0lkKSB7XG4gICAgICAgIHZtLl9pZHNbbmV3SWRdID0gbWFwXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBlbHNlIGlmIChpZCAmJiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgdm0uX2lkc1tpZF0gPSBtYXBcbiAgfVxufVxuXG4vKipcbiAqIGJpbmQgYXR0ciB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldEF0dHIgKHZtLCBlbCwgYXR0cikge1xuICBiaW5kRGlyKHZtLCBlbCwgJ2F0dHInLCBhdHRyKVxufVxuXG5mdW5jdGlvbiBzZXRDbGFzc1N0eWxlIChlbCwgY3NzLCBjbGFzc0xpc3QpIHtcbiAgaWYgKHR5cGVvZiBjbGFzc0xpc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgY2xhc3NMaXN0ID0gY2xhc3NMaXN0LnNwbGl0KC9cXHMrLylcbiAgfVxuICBjbGFzc0xpc3QuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgIGNsYXNzTGlzdC5zcGxpY2UoaSwgMSwgLi4ubmFtZS5zcGxpdCgvXFxzKy8pKVxuICB9KVxuICBjb25zdCBjbGFzc1N0eWxlID0ge31cbiAgY29uc3QgbGVuZ3RoID0gY2xhc3NMaXN0Lmxlbmd0aFxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdHlsZSA9IGNzc1tjbGFzc0xpc3RbaV1dXG4gICAgaWYgKHN0eWxlKSB7XG4gICAgICBPYmplY3Qua2V5cyhzdHlsZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNsYXNzU3R5bGVba2V5XSA9IHN0eWxlW2tleV1cbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIGVsLnNldENsYXNzU3R5bGUoY2xhc3NTdHlsZSlcbn1cblxuLyoqXG4gKiBiaW5kIGNsYXNzbmFtZXMgdG8gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBzZXRDbGFzcyAodm0sIGVsLCBjbGFzc0xpc3QpIHtcbiAgaWYgKHR5cGVvZiBjbGFzc0xpc3QgIT09ICdmdW5jdGlvbicgJiYgIUFycmF5LmlzQXJyYXkoY2xhc3NMaXN0KSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGNsYXNzTGlzdCkgJiYgIWNsYXNzTGlzdC5sZW5ndGgpIHtcbiAgICBlbC5zZXRDbGFzc1N0eWxlKHt9KVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3R5bGUgPSB2bS5fb3B0aW9ucyAmJiB2bS5fb3B0aW9ucy5zdHlsZSB8fCB7fVxuICBpZiAodHlwZW9mIGNsYXNzTGlzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0IHZhbHVlID0gd2F0Y2godm0sIGNsYXNzTGlzdCwgdiA9PiB7XG4gICAgICBzZXRDbGFzc1N0eWxlKGVsLCBzdHlsZSwgdilcbiAgICB9KVxuICAgIHNldENsYXNzU3R5bGUoZWwsIHN0eWxlLCB2YWx1ZSlcbiAgfVxuICBlbHNlIHtcbiAgICBzZXRDbGFzc1N0eWxlKGVsLCBzdHlsZSwgY2xhc3NMaXN0KVxuICB9XG59XG5cbi8qKlxuICogYmluZCBzdHlsZSB0byBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIHNldFN0eWxlICh2bSwgZWwsIHN0eWxlKSB7XG4gIGJpbmREaXIodm0sIGVsLCAnc3R5bGUnLCBzdHlsZSlcbn1cblxuLyoqXG4gKiBhZGQgYW4gZXZlbnQgdHlwZSBhbmQgaGFuZGxlciB0byBhbiBlbGVtZW50IGFuZCBnZW5lcmF0ZSBhIGRvbSB1cGRhdGVcbiAqL1xuZnVuY3Rpb24gc2V0RXZlbnQgKHZtLCBlbCwgdHlwZSwgaGFuZGxlcikge1xuICBlbC5hZGRFdmVudCh0eXBlLCBiaW5kKGhhbmRsZXIsIHZtKSlcbn1cblxuLyoqXG4gKiBhZGQgYWxsIGV2ZW50cyBvZiBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGJpbmRFdmVudHMgKHZtLCBlbCwgZXZlbnRzKSB7XG4gIGlmICghZXZlbnRzKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cylcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgIGxldCBoYW5kbGVyID0gZXZlbnRzW2tleV1cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICBoYW5kbGVyID0gdm1baGFuZGxlcl1cbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW0pTIEZyYW1ld29ya10gVGhlIGV2ZW50IGhhbmRsZXIgXCIke2hhbmRsZXJ9XCIgaXMgbm90IGRlZmluZWQuYClcbiAgICAgIH1cbiAgICB9XG4gICAgc2V0RXZlbnQodm0sIGVsLCBrZXksIGhhbmRsZXIpXG4gIH1cbn1cblxuLyoqXG4gKiBzZXQgYSBzZXJpZXMgb2YgbWVtYmVycyBhcyBhIGtpbmQgb2YgYW4gZWxlbWVudFxuICogZm9yIGV4YW1wbGU6IHN0eWxlLCBhdHRyLCAuLi5cbiAqIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uIHRoZW4gYmluZCB0aGUgZGF0YSBjaGFuZ2VzXG4gKi9cbmZ1bmN0aW9uIGJpbmREaXIgKHZtLCBlbCwgbmFtZSwgZGF0YSkge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSlcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aFxuICB3aGlsZSAoaS0tKSB7XG4gICAgY29uc3Qga2V5ID0ga2V5c1tpXVxuICAgIGNvbnN0IHZhbHVlID0gZGF0YVtrZXldXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYmluZEtleSh2bSwgZWwsIG5hbWUsIGtleSwgdmFsdWUpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZWxbU0VUVEVSU1tuYW1lXV0oa2V5LCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBiaW5kIGRhdGEgY2hhbmdlcyB0byBhIGNlcnRhaW4ga2V5IHRvIGEgbmFtZSBzZXJpZXMgaW4gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBiaW5kS2V5ICh2bSwgZWwsIG5hbWUsIGtleSwgY2FsYykge1xuICBjb25zdCBtZXRob2ROYW1lID0gU0VUVEVSU1tuYW1lXVxuICAvLyB3YXRjaCB0aGUgY2FsYywgYW5kIHJldHVybnMgYSB2YWx1ZSBieSBjYWxjLmNhbGwoKVxuICBjb25zdCB2YWx1ZSA9IHdhdGNoKHZtLCBjYWxjLCAodmFsdWUpID0+IHtcbiAgICBmdW5jdGlvbiBoYW5kbGVyICgpIHtcbiAgICAgIGVsW21ldGhvZE5hbWVdKGtleSwgdmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IGRpZmZlciA9IHZtICYmIHZtLl9hcHAgJiYgdm0uX2FwcC5kaWZmZXJcbiAgICBpZiAoZGlmZmVyKSB7XG4gICAgICBkaWZmZXIuYXBwZW5kKCdlbGVtZW50JywgZWwuZGVwdGgsIGVsLnJlZiwgaGFuZGxlcilcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoYW5kbGVyKClcbiAgICB9XG4gIH0pXG5cbiAgZWxbbWV0aG9kTmFtZV0oa2V5LCB2YWx1ZSlcbn1cblxuLyoqXG4gKiB3YXRjaCBhIGNhbGMgZnVuY3Rpb24gYW5kIGNhbGxiYWNrIGlmIHRoZSBjYWxjIHZhbHVlIGNoYW5nZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoICh2bSwgY2FsYywgY2FsbGJhY2spIHtcbiAgaWYgKHZtLl9zdGF0aWMpIHtcbiAgICByZXR1cm4gY2FsYy5jYWxsKHZtLCB2bSlcbiAgfVxuICBjb25zdCB3YXRjaGVyID0gbmV3IFdhdGNoZXIodm0sIGNhbGMsIGZ1bmN0aW9uICh2YWx1ZSwgb2xkVmFsdWUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB2YWx1ZSA9PT0gb2xkVmFsdWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjYWxsYmFjayh2YWx1ZSlcbiAgfSlcblxuICByZXR1cm4gd2F0Y2hlci52YWx1ZVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgRG9jdW1lbnQgJiBFbGVtZW50IEhlbHBlcnMuXG4gKlxuICogcmVxdWlyZWQ6XG4gKiBEb2N1bWVudCM6IGNyZWF0ZUVsZW1lbnQsIGNyZWF0ZUNvbW1lbnQsIGdldFJlZlxuICogRWxlbWVudCM6IGFwcGVuZENoaWxkLCBpbnNlcnRCZWZvcmUsIHJlbW92ZUNoaWxkLCBuZXh0U2libGluZ1xuICovXG5cbi8qKlxuICogQ3JlYXRlIGEgYm9keSBieSB0eXBlXG4gKiBVc2luZyB0aGlzLl9hcHAuZG9jXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCb2R5ICh2bSwgdHlwZSkge1xuICBjb25zdCBkb2MgPSB2bS5fYXBwLmRvY1xuICByZXR1cm4gZG9jLmNyZWF0ZUJvZHkodHlwZSlcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gZWxlbWVudCBieSB0eXBlXG4gKiBVc2luZyB0aGlzLl9hcHAuZG9jXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50ICh2bSwgdHlwZSkge1xuICBjb25zdCBkb2MgPSB2bS5fYXBwLmRvY1xuICByZXR1cm4gZG9jLmNyZWF0ZUVsZW1lbnQodHlwZSlcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIGZyYWcgYmxvY2sgZm9yIGFuIGVsZW1lbnQuXG4gKiBUaGUgZnJhZyBibG9jayBoYXMgYSBzdGFydGVyLCBlbmRlciBhbmQgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQmxvY2sgKHZtLCBlbGVtZW50KSB7XG4gIGNvbnN0IHN0YXJ0ID0gY3JlYXRlQmxvY2tTdGFydCh2bSlcbiAgY29uc3QgZW5kID0gY3JlYXRlQmxvY2tFbmQodm0pXG4gIGNvbnN0IGJsb2NrSWQgPSBsYXN0ZXN0QmxvY2tJZCsrXG4gIGlmIChlbGVtZW50LmVsZW1lbnQpIHtcbiAgICBsZXQgdXBkYXRlTWFyayA9IGVsZW1lbnQudXBkYXRlTWFya1xuICAgIGlmICh1cGRhdGVNYXJrKSB7XG4gICAgICBpZiAodXBkYXRlTWFyay5lbGVtZW50KSB7XG4gICAgICAgIHVwZGF0ZU1hcmsgPSB1cGRhdGVNYXJrLmVuZFxuICAgICAgfVxuICAgICAgZWxlbWVudC5lbGVtZW50Lmluc2VydEFmdGVyKGVuZCwgdXBkYXRlTWFyaylcbiAgICAgIGVsZW1lbnQuZWxlbWVudC5pbnNlcnRBZnRlcihzdGFydCwgdXBkYXRlTWFyaylcbiAgICAgIGVsZW1lbnQudXBkYXRlTWFyayA9IGVuZFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGVsZW1lbnQuZWxlbWVudC5pbnNlcnRCZWZvcmUoc3RhcnQsIGVsZW1lbnQuZW5kKVxuICAgICAgZWxlbWVudC5lbGVtZW50Lmluc2VydEJlZm9yZShlbmQsIGVsZW1lbnQuZW5kKVxuICAgIH1cbiAgICBlbGVtZW50ID0gZWxlbWVudC5lbGVtZW50XG4gIH1cbiAgZWxzZSB7XG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZChzdGFydClcbiAgICBlbGVtZW50LmFwcGVuZENoaWxkKGVuZClcbiAgfVxuICByZXR1cm4geyBzdGFydCwgZW5kLCBlbGVtZW50LCBibG9ja0lkIH1cbn1cblxubGV0IGxhc3Rlc3RCbG9ja0lkID0gMVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgYmxvY2sgc3RhcnRlci5cbiAqIFVzaW5nIHRoaXMuX2FwcC5kb2NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmxvY2tTdGFydCAodm0pIHtcbiAgY29uc3QgZG9jID0gdm0uX2FwcC5kb2NcbiAgY29uc3QgYW5jaG9yID0gZG9jLmNyZWF0ZUNvbW1lbnQoJ3N0YXJ0JylcbiAgcmV0dXJuIGFuY2hvclxufVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgYmxvY2sgZW5kZXIuXG4gKiBVc2luZyB0aGlzLl9hcHAuZG9jXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJsb2NrRW5kICh2bSkge1xuICBjb25zdCBkb2MgPSB2bS5fYXBwLmRvY1xuICBjb25zdCBhbmNob3IgPSBkb2MuY3JlYXRlQ29tbWVudCgnZW5kJylcbiAgcmV0dXJuIGFuY2hvclxufVxuXG4vKipcbiAqIEF0dGFjaCB0YXJnZXQgdG8gYSBjZXJ0YWluIGRlc3QgdXNpbmcgYXBwZW5kQ2hpbGQgYnkgZGVmYXVsdC5cbiAqIElmIHRoZSBkZXN0IGlzIGEgZnJhZyBibG9jayB0aGVuIGluc2VydCBiZWZvcmUgdGhlIGVuZGVyLlxuICogSWYgdGhlIHRhcmdldCBpcyBhIGZyYWcgYmxvY2sgdGhlbiBhdHRhY2ggdGhlIHN0YXJ0ZXIgYW5kIGVuZGVyIGluIG9yZGVyLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0gIHtvYmplY3R9IGRlc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaFRhcmdldCAodm0sIHRhcmdldCwgZGVzdCkge1xuICBpZiAoZGVzdC5lbGVtZW50KSB7XG4gICAgY29uc3QgYmVmb3JlID0gZGVzdC5lbmRcbiAgICBjb25zdCBhZnRlciA9IGRlc3QudXBkYXRlTWFya1xuICAgIC8vIHB1c2ggbmV3IHRhcmdldCBmb3Igd2F0Y2ggbGlzdCB1cGRhdGUgbGF0ZXJcbiAgICBpZiAoZGVzdC5jaGlsZHJlbikge1xuICAgICAgZGVzdC5jaGlsZHJlbi5wdXNoKHRhcmdldClcbiAgICB9XG4gICAgLy8gZm9yIGNoZWNrIHJlcGVhdCBjYXNlXG4gICAgaWYgKGFmdGVyKSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBtb3ZlVGFyZ2V0KHZtLCB0YXJnZXQsIGFmdGVyKVxuICAgICAgZGVzdC51cGRhdGVNYXJrID0gdGFyZ2V0LmVsZW1lbnQgPyB0YXJnZXQuZW5kIDogdGFyZ2V0XG4gICAgICByZXR1cm4gc2lnbmFsXG4gICAgfVxuICAgIGVsc2UgaWYgKHRhcmdldC5lbGVtZW50KSB7XG4gICAgICBkZXN0LmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRhcmdldC5zdGFydCwgYmVmb3JlKVxuICAgICAgZGVzdC5lbGVtZW50Lmluc2VydEJlZm9yZSh0YXJnZXQuZW5kLCBiZWZvcmUpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGRlc3QuZWxlbWVudC5pbnNlcnRCZWZvcmUodGFyZ2V0LCBiZWZvcmUpXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGlmICh0YXJnZXQuZWxlbWVudCkge1xuICAgICAgZGVzdC5hcHBlbmRDaGlsZCh0YXJnZXQuc3RhcnQpXG4gICAgICBkZXN0LmFwcGVuZENoaWxkKHRhcmdldC5lbmQpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGRlc3QuYXBwZW5kQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIE1vdmUgdGFyZ2V0IGJlZm9yZSBhIGNlcnRhaW4gZWxlbWVudC4gVGhlIHRhcmdldCBtYXliZSBibG9jayBvciBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0gIHtvYmplY3R9IGJlZm9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbW92ZVRhcmdldCAodm0sIHRhcmdldCwgYWZ0ZXIpIHtcbiAgaWYgKHRhcmdldC5lbGVtZW50KSB7XG4gICAgcmV0dXJuIG1vdmVCbG9jayh0YXJnZXQsIGFmdGVyKVxuICB9XG4gIHJldHVybiBtb3ZlRWxlbWVudCh0YXJnZXQsIGFmdGVyKVxufVxuXG4vKipcbiAqIE1vdmUgZWxlbWVudCBiZWZvcmUgYSBjZXJ0YWluIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBlbGVtZW50XG4gKiBAcGFyYW0gIHtvYmplY3R9IGJlZm9yZVxuICovXG5mdW5jdGlvbiBtb3ZlRWxlbWVudCAoZWxlbWVudCwgYWZ0ZXIpIHtcbiAgY29uc3QgcGFyZW50ID0gYWZ0ZXIucGFyZW50Tm9kZVxuICBpZiAocGFyZW50KSB7XG4gICAgcmV0dXJuIHBhcmVudC5pbnNlcnRBZnRlcihlbGVtZW50LCBhZnRlcilcbiAgfVxufVxuXG4vKipcbiAqIE1vdmUgYWxsIGVsZW1lbnRzIG9mIHRoZSBibG9jayBiZWZvcmUgYSBjZXJ0YWluIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSBmcmFnQmxvY2tcbiAqIEBwYXJhbSAge29iamVjdH0gYmVmb3JlXG4gKi9cbmZ1bmN0aW9uIG1vdmVCbG9jayAoZnJhZ0Jsb2NrLCBhZnRlcikge1xuICBjb25zdCBwYXJlbnQgPSBhZnRlci5wYXJlbnROb2RlXG5cbiAgaWYgKHBhcmVudCkge1xuICAgIGxldCBlbCA9IGZyYWdCbG9jay5zdGFydFxuICAgIGxldCBzaWduYWxcbiAgICBjb25zdCBncm91cCA9IFtlbF1cblxuICAgIHdoaWxlIChlbCAmJiBlbCAhPT0gZnJhZ0Jsb2NrLmVuZCkge1xuICAgICAgZWwgPSBlbC5uZXh0U2libGluZ1xuICAgICAgZ3JvdXAucHVzaChlbClcbiAgICB9XG5cbiAgICBsZXQgdGVtcCA9IGFmdGVyXG4gICAgZ3JvdXAuZXZlcnkoKGVsKSA9PiB7XG4gICAgICBzaWduYWwgPSBwYXJlbnQuaW5zZXJ0QWZ0ZXIoZWwsIHRlbXApXG4gICAgICB0ZW1wID0gZWxcbiAgICAgIHJldHVybiBzaWduYWwgIT09IC0xXG4gICAgfSlcblxuICAgIHJldHVybiBzaWduYWxcbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSB0YXJnZXQgZnJvbSBET00gdHJlZS5cbiAqIElmIHRoZSB0YXJnZXQgaXMgYSBmcmFnIGJsb2NrIHRoZW4gY2FsbCBfcmVtb3ZlQmxvY2tcbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IHRhcmdldFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVGFyZ2V0ICh2bSwgdGFyZ2V0LCBwcmVzZXJ2ZUJsb2NrID0gZmFsc2UpIHtcbiAgaWYgKHRhcmdldC5lbGVtZW50KSB7XG4gICAgcmVtb3ZlQmxvY2sodGFyZ2V0LCBwcmVzZXJ2ZUJsb2NrKVxuICB9XG4gIGVsc2Uge1xuICAgIHJlbW92ZUVsZW1lbnQodGFyZ2V0KVxuICB9XG4gIGlmICh0YXJnZXQuX3ZtKSB7XG4gICAgdGFyZ2V0Ll92bS4kZW1pdCgnaG9vazpkZXN0cm95ZWQnKVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgY2VydGFpbiBlbGVtZW50LlxuICogVXNpbmcgdGhpcy5fYXBwLmRvY1xuICpcbiAqIEBwYXJhbSAge29iamVjdH0gdGFyZ2V0XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQgKHRhcmdldCkge1xuICBjb25zdCBwYXJlbnQgPSB0YXJnZXQucGFyZW50Tm9kZVxuXG4gIGlmIChwYXJlbnQpIHtcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgZnJhZyBibG9jay5cbiAqIFRoZSBzZWNvbmQgcGFyYW0gZGVjaWRlcyB3aGV0aGVyIHRoZSBibG9jayBzZWxmIHNob3VsZCBiZSByZW1vdmVkIHRvby5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9ICBmcmFnQmxvY2tcbiAqIEBwYXJhbSAge0Jvb2xlYW59IHByZXNlcnZlQmxvY2s9ZmFsc2VcbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQmxvY2sgKGZyYWdCbG9jaywgcHJlc2VydmVCbG9jayA9IGZhbHNlKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdXG4gIGxldCBlbCA9IGZyYWdCbG9jay5zdGFydC5uZXh0U2libGluZ1xuXG4gIHdoaWxlIChlbCAmJiBlbCAhPT0gZnJhZ0Jsb2NrLmVuZCkge1xuICAgIHJlc3VsdC5wdXNoKGVsKVxuICAgIGVsID0gZWwubmV4dFNpYmxpbmdcbiAgfVxuXG4gIGlmICghcHJlc2VydmVCbG9jaykge1xuICAgIHJlbW92ZUVsZW1lbnQoZnJhZ0Jsb2NrLnN0YXJ0KVxuICB9XG4gIHJlc3VsdC5mb3JFYWNoKChlbCkgPT4ge1xuICAgIHJlbW92ZUVsZW1lbnQoZWwpXG4gIH0pXG4gIGlmICghcHJlc2VydmVCbG9jaykge1xuICAgIHJlbW92ZUVsZW1lbnQoZnJhZ0Jsb2NrLmVuZClcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIFZpZXdNb2RlbCB0ZW1wbGF0ZSBwYXJzZXIgJiBkYXRhLWJpbmRpbmcgcHJvY2Vzc1xuICovXG5cbmltcG9ydCB7XG4gIGV4dGVuZCxcbiAgaXNPYmplY3QsXG4gIGJpbmRcbn0gZnJvbSAnLi4vdXRpbC9pbmRleCdcbmltcG9ydCB7XG4gIGluaXREYXRhLFxuICBpbml0Q29tcHV0ZWRcbn0gZnJvbSAnLi4vY29yZS9zdGF0ZSdcbmltcG9ydCB7XG4gIGJpbmRFbGVtZW50LFxuICBzZXRJZCxcbiAgYmluZFN1YlZtLFxuICBiaW5kU3ViVm1BZnRlckluaXRpYWxpemVkLFxuICBhcHBseU5haXR2ZUNvbXBvbmVudE9wdGlvbnMsXG4gIHdhdGNoXG59IGZyb20gJy4vZGlyZWN0aXZlJ1xuaW1wb3J0IHtcbiAgY3JlYXRlQmxvY2ssXG4gIGNyZWF0ZUJvZHksXG4gIGNyZWF0ZUVsZW1lbnQsXG4gIGF0dGFjaFRhcmdldCxcbiAgbW92ZVRhcmdldCxcbiAgcmVtb3ZlVGFyZ2V0XG59IGZyb20gJy4vZG9tLWhlbHBlcidcblxuLyoqXG4gKiBidWlsZCgpXG4gKiAgIGNvbXBpbGUodGVtcGxhdGUsIHBhcmVudE5vZGUpXG4gKiAgICAgaWYgKHR5cGUgaXMgY29udGVudCkgY3JlYXRlIGNvbnRlbnROb2RlXG4gKiAgICAgZWxzZSBpZiAoZGlycyBoYXZlIHYtZm9yKSBmb3JlYWNoIC0+IGNyZWF0ZSBjb250ZXh0XG4gKiAgICAgICAtPiBjb21waWxlKHRlbXBsYXRlV2l0aG91dEZvciwgcGFyZW50Tm9kZSk6IGRpZmYobGlzdCkgb25jaGFuZ2VcbiAqICAgICBlbHNlIGlmIChkaXJzIGhhdmUgdi1pZikgYXNzZXJ0XG4gKiAgICAgICAtPiBjb21waWxlKHRlbXBsYXRlV2l0aG91dElmLCBwYXJlbnROb2RlKTogdG9nZ2xlKHNob3duKSBvbmNoYW5nZVxuICogICAgIGVsc2UgaWYgKHR5cGUgaXMgZHluYW1pYylcbiAqICAgICAgIC0+IGNvbXBpbGUodGVtcGxhdGVXaXRob3V0RHluYW1pY1R5cGUsIHBhcmVudE5vZGUpOiB3YXRjaCh0eXBlKSBvbmNoYW5nZVxuICogICAgIGVsc2UgaWYgKHR5cGUgaXMgY3VzdG9tKVxuICogICAgICAgYWRkQ2hpbGRWbSh2bSwgcGFyZW50Vm0pXG4gKiAgICAgICBidWlsZChleHRlcm5hbERpcnMpXG4gKiAgICAgICBmb3JlYWNoIGNoaWxkTm9kZXMgLT4gY29tcGlsZShjaGlsZE5vZGUsIHRlbXBsYXRlKVxuICogICAgIGVsc2UgaWYgKHR5cGUgaXMgbmF0aXZlKVxuICogICAgICAgc2V0KGRpcnMpOiB1cGRhdGUoaWQvYXR0ci9zdHlsZS9jbGFzcykgb25jaGFuZ2VcbiAqICAgICAgIGFwcGVuZCh0ZW1wbGF0ZSwgcGFyZW50Tm9kZSlcbiAqICAgICAgIGZvcmVhY2ggY2hpbGROb2RlcyAtPiBjb21waWxlKGNoaWxkTm9kZSwgdGVtcGxhdGUpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZCAodm0pIHtcbiAgY29uc3Qgb3B0ID0gdm0uX29wdGlvbnMgfHwge31cbiAgY29uc3QgdGVtcGxhdGUgPSBvcHQudGVtcGxhdGUgfHwge31cblxuICBpZiAob3B0LnJlcGxhY2UpIHtcbiAgICBpZiAodGVtcGxhdGUuY2hpbGRyZW4gJiYgdGVtcGxhdGUuY2hpbGRyZW4ubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb21waWxlKHZtLCB0ZW1wbGF0ZS5jaGlsZHJlblswXSwgdm0uX3BhcmVudEVsKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbXBpbGUodm0sIHRlbXBsYXRlLmNoaWxkcmVuLCB2bS5fcGFyZW50RWwpXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIGNvbXBpbGUodm0sIHRlbXBsYXRlLCB2bS5fcGFyZW50RWwpXG4gIH1cblxuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBcInJlYWR5XCIgbGlmZWN5Y2xlIGluIFZtKCR7dm0uX3R5cGV9KWApXG4gIHZtLiRlbWl0KCdob29rOnJlYWR5JylcbiAgdm0uX3JlYWR5ID0gdHJ1ZVxufVxuXG4vKipcbiAqIEdlbmVyYXRlIGVsZW1lbnRzIGJ5IGNoaWxkIG9yIGNoaWxkcmVuIGFuZCBhcHBlbmQgdG8gcGFyZW50IGVsZW1lbnRzLlxuICogUm9vdCBlbGVtZW50IGluZm8gd291bGQgYmUgbWVyZ2VkIGlmIGhhcy4gVGhlIGZpcnN0IGFyZ3VtZW50IG1heSBiZSBhbiBhcnJheVxuICogaWYgdGhlIHJvb3QgZWxlbWVudCB3aXRoIG9wdGlvbnMucmVwbGFjZSBoYXMgbm90IG9ubHkgb25lIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGFycmF5fSB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSAgICAgICBkZXN0XG4gKiBAcGFyYW0ge29iamVjdH0gICAgICAgbWV0YVxuICovXG5mdW5jdGlvbiBjb21waWxlICh2bSwgdGFyZ2V0LCBkZXN0LCBtZXRhKSB7XG4gIGNvbnN0IGFwcCA9IHZtLl9hcHAgfHwge31cblxuICBpZiAoYXBwLmxhc3RTaWduYWwgPT09IC0xKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGFyZ2V0LmF0dHIgJiYgdGFyZ2V0LmF0dHIuaGFzT3duUHJvcGVydHkoJ3N0YXRpYycpKSB7XG4gICAgdm0uX3N0YXRpYyA9IHRydWVcbiAgfVxuXG4gIGlmICh0YXJnZXRJc0ZyYWdtZW50KHRhcmdldCkpIHtcbiAgICBjb21waWxlRnJhZ21lbnQodm0sIHRhcmdldCwgZGVzdCwgbWV0YSlcbiAgICByZXR1cm5cbiAgfVxuICBtZXRhID0gbWV0YSB8fCB7fVxuICBpZiAodGFyZ2V0SXNDb250ZW50KHRhcmdldCkpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbSlMgRnJhbWV3b3JrXSBjb21waWxlIFwiY29udGVudFwiIGJsb2NrIGJ5JywgdGFyZ2V0KVxuICAgIHZtLl9jb250ZW50ID0gY3JlYXRlQmxvY2sodm0sIGRlc3QpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAodGFyZ2V0TmVlZENoZWNrUmVwZWF0KHRhcmdldCwgbWV0YSkpIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbSlMgRnJhbWV3b3JrXSBjb21waWxlIFwicmVwZWF0XCIgbG9naWMgYnknLCB0YXJnZXQpXG4gICAgaWYgKGRlc3QudHlwZSA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBUaGUgcm9vdCBlbGVtZW50IGRvZXNcXCd0IHN1cHBvcnQgYHJlcGVhdGAgZGlyZWN0aXZlIScpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29tcGlsZVJlcGVhdCh2bSwgdGFyZ2V0LCBkZXN0KVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuICBpZiAodGFyZ2V0TmVlZENoZWNrU2hvd24odGFyZ2V0LCBtZXRhKSkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIGNvbXBpbGUgXCJpZlwiIGxvZ2ljIGJ5JywgdGFyZ2V0KVxuICAgIGlmIChkZXN0LnR5cGUgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignW0pTIEZyYW1ld29ya10gVGhlIHJvb3QgZWxlbWVudCBkb2VzXFwndCBzdXBwb3J0IGBpZmAgZGlyZWN0aXZlIScpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29tcGlsZVNob3duKHZtLCB0YXJnZXQsIGRlc3QsIG1ldGEpXG4gICAgfVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHR5cGVHZXR0ZXIgPSBtZXRhLnR5cGUgfHwgdGFyZ2V0LnR5cGVcbiAgaWYgKHRhcmdldE5lZWRDaGVja1R5cGUodHlwZUdldHRlciwgbWV0YSkpIHtcbiAgICBjb21waWxlVHlwZSh2bSwgdGFyZ2V0LCBkZXN0LCB0eXBlR2V0dGVyLCBtZXRhKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHR5cGUgPSB0eXBlR2V0dGVyXG4gIGNvbnN0IGNvbXBvbmVudCA9IHRhcmdldElzQ29tcG9zZWQodm0sIHRhcmdldCwgdHlwZSlcbiAgaWYgKGNvbXBvbmVudCkge1xuICAgIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIGNvbXBpbGUgY29tcG9zZWQgY29tcG9uZW50IGJ5JywgdGFyZ2V0KVxuICAgIGNvbXBpbGVDdXN0b21Db21wb25lbnQodm0sIGNvbXBvbmVudCwgdGFyZ2V0LCBkZXN0LCB0eXBlLCBtZXRhKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIGNvbXBpbGUgbmF0aXZlIGNvbXBvbmVudCBieScsIHRhcmdldClcbiAgY29tcGlsZU5hdGl2ZUNvbXBvbmVudCh2bSwgdGFyZ2V0LCBkZXN0LCB0eXBlKVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRhcmdldCBpcyBhIGZyYWdtZW50IChhbiBhcnJheSkuXG4gKlxuICogQHBhcmFtICB7b2JqZWN0fSAgdGFyZ2V0XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiB0YXJnZXRJc0ZyYWdtZW50ICh0YXJnZXQpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KVxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRhcmdldCB0eXBlIGlzIGNvbnRlbnQvc2xvdC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9ICB0YXJnZXRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRhcmdldElzQ29udGVudCAodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQudHlwZSA9PT0gJ2NvbnRlbnQnIHx8IHRhcmdldC50eXBlID09PSAnc2xvdCdcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0YXJnZXQgbmVlZCB0byBjb21waWxlIGJ5IGEgbGlzdC5cbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9ICB0YXJnZXRcbiAqIEBwYXJhbSAge29iamVjdH0gIG1ldGFcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHRhcmdldE5lZWRDaGVja1JlcGVhdCAodGFyZ2V0LCBtZXRhKSB7XG4gIHJldHVybiAhbWV0YS5oYXNPd25Qcm9wZXJ0eSgncmVwZWF0JykgJiYgdGFyZ2V0LnJlcGVhdFxufVxuXG4vKipcbiAqIENoZWNrIGlmIHRhcmdldCBuZWVkIHRvIGNvbXBpbGUgYnkgYSBib29sZWFuIHZhbHVlLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gIHRhcmdldFxuICogQHBhcmFtICB7b2JqZWN0fSAgbWV0YVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0TmVlZENoZWNrU2hvd24gKHRhcmdldCwgbWV0YSkge1xuICByZXR1cm4gIW1ldGEuaGFzT3duUHJvcGVydHkoJ3Nob3duJykgJiYgdGFyZ2V0LnNob3duXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGFyZ2V0IG5lZWQgdG8gY29tcGlsZSBieSBhIGR5bmFtaWMgdHlwZS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd8ZnVuY3Rpb259IHR5cGVHZXR0ZXJcbiAqIEBwYXJhbSAge29iamVjdH0gICAgICAgICAgbWV0YVxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gdGFyZ2V0TmVlZENoZWNrVHlwZSAodHlwZUdldHRlciwgbWV0YSkge1xuICByZXR1cm4gKHR5cGVvZiB0eXBlR2V0dGVyID09PSAnZnVuY3Rpb24nKSAmJiAhbWV0YS5oYXNPd25Qcm9wZXJ0eSgndHlwZScpXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBraW5kIG9mIGNvbXBvbmVudCBpcyBjb21wb3NlZC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICB0eXBlXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiB0YXJnZXRJc0NvbXBvc2VkICh2bSwgdGFyZ2V0LCB0eXBlKSB7XG4gIGxldCBjb21wb25lbnRcbiAgaWYgKHZtLl9hcHAgJiYgdm0uX2FwcC5jdXN0b21Db21wb25lbnRNYXApIHtcbiAgICBjb21wb25lbnQgPSB2bS5fYXBwLmN1c3RvbUNvbXBvbmVudE1hcFt0eXBlXVxuICB9XG4gIGlmICh2bS5fb3B0aW9ucyAmJiB2bS5fb3B0aW9ucy5jb21wb25lbnRzKSB7XG4gICAgY29tcG9uZW50ID0gdm0uX29wdGlvbnMuY29tcG9uZW50c1t0eXBlXVxuICB9XG4gIGlmICh0YXJnZXQuY29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gY29tcG9uZW50IHx8IHt9XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudFxufVxuXG4vKipcbiAqIENvbXBpbGUgYSBsaXN0IG9mIHRhcmdldHMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRhcmdldFxuICogQHBhcmFtIHtvYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhXG4gKi9cbmZ1bmN0aW9uIGNvbXBpbGVGcmFnbWVudCAodm0sIHRhcmdldCwgZGVzdCwgbWV0YSkge1xuICBjb25zdCBmcmFnQmxvY2sgPSBjcmVhdGVCbG9jayh2bSwgZGVzdClcbiAgdGFyZ2V0LmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgY29tcGlsZSh2bSwgY2hpbGQsIGZyYWdCbG9jaywgbWV0YSlcbiAgfSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgdGFyZ2V0IHdpdGggcmVwZWF0IGRpcmVjdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge29iamVjdH0gZGVzdFxuICovXG5mdW5jdGlvbiBjb21waWxlUmVwZWF0ICh2bSwgdGFyZ2V0LCBkZXN0KSB7XG4gIGNvbnN0IHJlcGVhdCA9IHRhcmdldC5yZXBlYXRcbiAgY29uc3Qgb2xkU3R5bGUgPSB0eXBlb2YgcmVwZWF0ID09PSAnZnVuY3Rpb24nXG4gIGxldCBnZXR0ZXIgPSByZXBlYXQuZ2V0dGVyIHx8IHJlcGVhdC5leHByZXNzaW9uIHx8IHJlcGVhdFxuICBpZiAodHlwZW9mIGdldHRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGdldHRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdIH1cbiAgfVxuICBjb25zdCBrZXkgPSByZXBlYXQua2V5IHx8ICckaW5kZXgnXG4gIGNvbnN0IHZhbHVlID0gcmVwZWF0LnZhbHVlIHx8ICckdmFsdWUnXG4gIGNvbnN0IHRyYWNrQnkgPSByZXBlYXQudHJhY2tCeSB8fCB0YXJnZXQudHJhY2tCeSB8fFxuICAgICh0YXJnZXQuYXR0ciAmJiB0YXJnZXQuYXR0ci50cmFja0J5KVxuXG4gIGNvbnN0IGZyYWdCbG9jayA9IGNyZWF0ZUJsb2NrKHZtLCBkZXN0KVxuICBmcmFnQmxvY2suY2hpbGRyZW4gPSBbXVxuICBmcmFnQmxvY2suZGF0YSA9IFtdXG4gIGZyYWdCbG9jay52bXMgPSBbXVxuXG4gIGJpbmRSZXBlYXQodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCB7IGdldHRlciwga2V5LCB2YWx1ZSwgdHJhY2tCeSwgb2xkU3R5bGUgfSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgdGFyZ2V0IHdpdGggaWYgZGlyZWN0aXZlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge29iamVjdH0gbWV0YVxuICovXG5mdW5jdGlvbiBjb21waWxlU2hvd24gKHZtLCB0YXJnZXQsIGRlc3QsIG1ldGEpIHtcbiAgY29uc3QgbmV3TWV0YSA9IHsgc2hvd246IHRydWUgfVxuICBjb25zdCBmcmFnQmxvY2sgPSBjcmVhdGVCbG9jayh2bSwgZGVzdClcblxuICBpZiAoZGVzdC5lbGVtZW50ICYmIGRlc3QuY2hpbGRyZW4pIHtcbiAgICBkZXN0LmNoaWxkcmVuLnB1c2goZnJhZ0Jsb2NrKVxuICB9XG5cbiAgaWYgKG1ldGEucmVwZWF0KSB7XG4gICAgbmV3TWV0YS5yZXBlYXQgPSBtZXRhLnJlcGVhdFxuICB9XG5cbiAgYmluZFNob3duKHZtLCB0YXJnZXQsIGZyYWdCbG9jaywgbmV3TWV0YSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgdGFyZ2V0IHdpdGggZHluYW1pYyBjb21wb25lbnQgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gICB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSAgIGRlc3RcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHR5cGVHZXR0ZXJcbiAqL1xuZnVuY3Rpb24gY29tcGlsZVR5cGUgKHZtLCB0YXJnZXQsIGRlc3QsIHR5cGVHZXR0ZXIsIG1ldGEpIHtcbiAgY29uc3QgdHlwZSA9IHR5cGVHZXR0ZXIuY2FsbCh2bSlcbiAgY29uc3QgbmV3TWV0YSA9IGV4dGVuZCh7IHR5cGUgfSwgbWV0YSlcbiAgY29uc3QgZnJhZ0Jsb2NrID0gY3JlYXRlQmxvY2sodm0sIGRlc3QpXG5cbiAgaWYgKGRlc3QuZWxlbWVudCAmJiBkZXN0LmNoaWxkcmVuKSB7XG4gICAgZGVzdC5jaGlsZHJlbi5wdXNoKGZyYWdCbG9jaylcbiAgfVxuXG4gIHdhdGNoKHZtLCB0eXBlR2V0dGVyLCAodmFsdWUpID0+IHtcbiAgICBjb25zdCBuZXdNZXRhID0gZXh0ZW5kKHsgdHlwZTogdmFsdWUgfSwgbWV0YSlcbiAgICByZW1vdmVUYXJnZXQodm0sIGZyYWdCbG9jaywgdHJ1ZSlcbiAgICBjb21waWxlKHZtLCB0YXJnZXQsIGZyYWdCbG9jaywgbmV3TWV0YSlcbiAgfSlcblxuICBjb21waWxlKHZtLCB0YXJnZXQsIGZyYWdCbG9jaywgbmV3TWV0YSlcbn1cblxuLyoqXG4gKiBDb21waWxlIGEgY29tcG9zZWQgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0YXJnZXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZXN0XG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjb21waWxlQ3VzdG9tQ29tcG9uZW50ICh2bSwgY29tcG9uZW50LCB0YXJnZXQsIGRlc3QsIHR5cGUsIG1ldGEpIHtcbiAgY29uc3QgQ3RvciA9IHZtLmNvbnN0cnVjdG9yXG4gIGNvbnN0IHN1YlZtID0gbmV3IEN0b3IodHlwZSwgY29tcG9uZW50LCB2bSwgZGVzdCwgdW5kZWZpbmVkLCB7XG4gICAgJ2hvb2s6aW5pdCc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh2bS5fc3RhdGljKSB7XG4gICAgICAgIHRoaXMuX3N0YXRpYyA9IHZtLl9zdGF0aWNcbiAgICAgIH1cbiAgICAgIHNldElkKHZtLCBudWxsLCB0YXJnZXQuaWQsIHRoaXMpXG4gICAgICAvLyBiaW5kIHRlbXBsYXRlIGVhcmxpZXIgYmVjYXVzZSBvZiBsaWZlY3ljbGUgaXNzdWVzXG4gICAgICB0aGlzLl9leHRlcm5hbEJpbmRpbmcgPSB7XG4gICAgICAgIHBhcmVudDogdm0sXG4gICAgICAgIHRlbXBsYXRlOiB0YXJnZXRcbiAgICAgIH1cbiAgICB9LFxuICAgICdob29rOmNyZWF0ZWQnOiBmdW5jdGlvbiAoKSB7XG4gICAgICBiaW5kU3ViVm0odm0sIHRoaXMsIHRhcmdldCwgbWV0YS5yZXBlYXQpXG4gICAgfSxcbiAgICAnaG9vazpyZWFkeSc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0aGlzLl9jb250ZW50KSB7XG4gICAgICAgIGNvbXBpbGVDaGlsZHJlbih2bSwgdGFyZ2V0LCB0aGlzLl9jb250ZW50KVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgYmluZFN1YlZtQWZ0ZXJJbml0aWFsaXplZCh2bSwgc3ViVm0sIHRhcmdldCwgZGVzdClcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBlbGVtZW50IGZyb20gdGVtcGxhdGUgYW5kIGF0dGFjaCB0byB0aGUgZGVzdCBpZiBuZWVkZWQuXG4gKiBUaGUgdGltZSB0byBhdHRhY2ggZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBtb2RlIHN0YXR1cyBpcyBub2RlIG9yIHRyZWUuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge29iamVjdH0gZGVzdFxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY29tcGlsZU5hdGl2ZUNvbXBvbmVudCAodm0sIHRlbXBsYXRlLCBkZXN0LCB0eXBlKSB7XG4gIGFwcGx5TmFpdHZlQ29tcG9uZW50T3B0aW9ucyh0ZW1wbGF0ZSlcblxuICBsZXQgZWxlbWVudFxuICBpZiAoZGVzdC5yZWYgPT09ICdfZG9jdW1lbnRFbGVtZW50Jykge1xuICAgIC8vIGlmIGl0cyBwYXJlbnQgaXMgZG9jdW1lbnRFbGVtZW50IHRoZW4gaXQncyBhIGJvZHlcbiAgICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBjb21waWxlIHRvIGNyZWF0ZSBib2R5IGZvciAke3R5cGV9YClcbiAgICBlbGVtZW50ID0gY3JlYXRlQm9keSh2bSwgdHlwZSlcbiAgfVxuICBlbHNlIHtcbiAgICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBjb21waWxlIHRvIGNyZWF0ZSBlbGVtZW50IGZvciAke3R5cGV9YClcbiAgICBlbGVtZW50ID0gY3JlYXRlRWxlbWVudCh2bSwgdHlwZSlcbiAgfVxuXG4gIGlmICghdm0uX3Jvb3RFbCkge1xuICAgIHZtLl9yb290RWwgPSBlbGVtZW50XG4gICAgLy8gYmluZCBldmVudCBlYXJsaWVyIGJlY2F1c2Ugb2YgbGlmZWN5Y2xlIGlzc3Vlc1xuICAgIGNvbnN0IGJpbmRpbmcgPSB2bS5fZXh0ZXJuYWxCaW5kaW5nIHx8IHt9XG4gICAgY29uc3QgdGFyZ2V0ID0gYmluZGluZy50ZW1wbGF0ZVxuICAgIGNvbnN0IHBhcmVudFZtID0gYmluZGluZy5wYXJlbnRcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5ldmVudHMgJiYgcGFyZW50Vm0gJiYgZWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCB0eXBlIGluIHRhcmdldC5ldmVudHMpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHBhcmVudFZtW3RhcmdldC5ldmVudHNbdHlwZV1dXG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgZWxlbWVudC5hZGRFdmVudCh0eXBlLCBiaW5kKGhhbmRsZXIsIHBhcmVudFZtKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJpbmRFbGVtZW50KHZtLCBlbGVtZW50LCB0ZW1wbGF0ZSlcblxuICBpZiAodGVtcGxhdGUuYXR0ciAmJiB0ZW1wbGF0ZS5hdHRyLmFwcGVuZCkgeyAvLyBiYWNrd2FyZCwgYXBwZW5kIHByb3AgaW4gYXR0clxuICAgIHRlbXBsYXRlLmFwcGVuZCA9IHRlbXBsYXRlLmF0dHIuYXBwZW5kXG4gIH1cblxuICBpZiAodGVtcGxhdGUuYXBwZW5kKSB7IC8vIGdpdmUgdGhlIGFwcGVuZCBhdHRyaWJ1dGUgZm9yIGlvcyBhZGFwdGF0aW9uXG4gICAgZWxlbWVudC5hdHRyID0gZWxlbWVudC5hdHRyIHx8IHt9XG4gICAgZWxlbWVudC5hdHRyLmFwcGVuZCA9IHRlbXBsYXRlLmFwcGVuZFxuICB9XG5cbiAgY29uc3QgdHJlZU1vZGUgPSB0ZW1wbGF0ZS5hcHBlbmQgPT09ICd0cmVlJ1xuICBjb25zdCBhcHAgPSB2bS5fYXBwIHx8IHt9XG4gIGlmIChhcHAubGFzdFNpZ25hbCAhPT0gLTEgJiYgIXRyZWVNb2RlKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gY29tcGlsZSB0byBhcHBlbmQgc2luZ2xlIG5vZGUgZm9yJywgZWxlbWVudClcbiAgICBhcHAubGFzdFNpZ25hbCA9IGF0dGFjaFRhcmdldCh2bSwgZWxlbWVudCwgZGVzdClcbiAgfVxuICBpZiAoYXBwLmxhc3RTaWduYWwgIT09IC0xKSB7XG4gICAgY29tcGlsZUNoaWxkcmVuKHZtLCB0ZW1wbGF0ZSwgZWxlbWVudClcbiAgfVxuICBpZiAoYXBwLmxhc3RTaWduYWwgIT09IC0xICYmIHRyZWVNb2RlKSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gY29tcGlsZSB0byBhcHBlbmQgd2hvbGUgdHJlZSBmb3InLCBlbGVtZW50KVxuICAgIGFwcC5sYXN0U2lnbmFsID0gYXR0YWNoVGFyZ2V0KHZtLCBlbGVtZW50LCBkZXN0KVxuICB9XG59XG5cbi8qKlxuICogU2V0IGFsbCBjaGlsZHJlbiB0byBhIGNlcnRhaW4gcGFyZW50IGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge29iamVjdH0gZGVzdFxuICovXG5mdW5jdGlvbiBjb21waWxlQ2hpbGRyZW4gKHZtLCB0ZW1wbGF0ZSwgZGVzdCkge1xuICBjb25zdCBhcHAgPSB2bS5fYXBwIHx8IHt9XG4gIGNvbnN0IGNoaWxkcmVuID0gdGVtcGxhdGUuY2hpbGRyZW5cbiAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4ge1xuICAgICAgY29tcGlsZSh2bSwgY2hpbGQsIGRlc3QpXG4gICAgICByZXR1cm4gYXBwLmxhc3RTaWduYWwgIT09IC0xXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIFdhdGNoIHRoZSBsaXN0IHVwZGF0ZSBhbmQgcmVmcmVzaCB0aGUgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0ge29iamVjdH0gZnJhZ0Jsb2NrIHt2bXMsIGRhdGEsIGNoaWxkcmVufVxuICogQHBhcmFtIHtvYmplY3R9IGluZm8gICAgICB7Z2V0dGVyLCBrZXksIHZhbHVlLCB0cmFja0J5LCBvbGRTdHlsZX1cbiAqL1xuZnVuY3Rpb24gYmluZFJlcGVhdCAodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCBpbmZvKSB7XG4gIGNvbnN0IHZtcyA9IGZyYWdCbG9jay52bXNcbiAgY29uc3QgY2hpbGRyZW4gPSBmcmFnQmxvY2suY2hpbGRyZW5cbiAgY29uc3QgeyBnZXR0ZXIsIHRyYWNrQnksIG9sZFN0eWxlIH0gPSBpbmZvXG4gIGNvbnN0IGtleU5hbWUgPSBpbmZvLmtleVxuICBjb25zdCB2YWx1ZU5hbWUgPSBpbmZvLnZhbHVlXG5cbiAgZnVuY3Rpb24gY29tcGlsZUl0ZW0gKGl0ZW0sIGluZGV4LCBjb250ZXh0KSB7XG4gICAgbGV0IG1lcmdlZERhdGFcbiAgICBpZiAob2xkU3R5bGUpIHtcbiAgICAgIG1lcmdlZERhdGEgPSBpdGVtXG4gICAgICBpZiAoaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgICAgbWVyZ2VkRGF0YVtrZXlOYW1lXSA9IGluZGV4XG4gICAgICAgIGlmICghbWVyZ2VkRGF0YS5oYXNPd25Qcm9wZXJ0eSgnSU5ERVgnKSkge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtZXJnZWREYXRhLCAnSU5ERVgnLCB7XG4gICAgICAgICAgICB2YWx1ZTogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tKUyBGcmFtZXdvcmtdIFwiSU5ERVhcIiBpbiByZXBlYXQgaXMgZGVwcmVjYXRlZCwgJyArXG4gICAgICAgICAgICAgICAgJ3BsZWFzZSB1c2UgXCIkaW5kZXhcIiBpbnN0ZWFkJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBFYWNoIGxpc3QgaXRlbSBtdXN0IGJlIGFuIG9iamVjdCBpbiBvbGQtc3R5bGUgcmVwZWF0LCAnXG4gICAgICAgICAgKyAncGxlYXNlIHVzZSBgcmVwZWF0PXt7diBpbiBsaXN0fX1gIGluc3RlYWQuJylcbiAgICAgICAgbWVyZ2VkRGF0YSA9IHt9XG4gICAgICAgIG1lcmdlZERhdGFba2V5TmFtZV0gPSBpbmRleFxuICAgICAgICBtZXJnZWREYXRhW3ZhbHVlTmFtZV0gPSBpdGVtXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgbWVyZ2VkRGF0YSA9IHt9XG4gICAgICBtZXJnZWREYXRhW2tleU5hbWVdID0gaW5kZXhcbiAgICAgIG1lcmdlZERhdGFbdmFsdWVOYW1lXSA9IGl0ZW1cbiAgICB9XG4gICAgY29uc3QgbmV3Q29udGV4dCA9IG1lcmdlQ29udGV4dChjb250ZXh0LCBtZXJnZWREYXRhKVxuICAgIHZtcy5wdXNoKG5ld0NvbnRleHQpXG4gICAgY29tcGlsZShuZXdDb250ZXh0LCB0YXJnZXQsIGZyYWdCbG9jaywgeyByZXBlYXQ6IGl0ZW0gfSlcbiAgfVxuXG4gIGNvbnN0IGxpc3QgPSB3YXRjaEJsb2NrKHZtLCBmcmFnQmxvY2ssIGdldHRlciwgJ3JlcGVhdCcsXG4gICAgKGRhdGEpID0+IHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tKUyBGcmFtZXdvcmtdIHRoZSBcInJlcGVhdFwiIGl0ZW0gaGFzIGNoYW5nZWQnLCBkYXRhKVxuICAgICAgaWYgKCFmcmFnQmxvY2sgfHwgIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9sZENoaWxkcmVuID0gY2hpbGRyZW4uc2xpY2UoKVxuICAgICAgY29uc3Qgb2xkVm1zID0gdm1zLnNsaWNlKClcbiAgICAgIGNvbnN0IG9sZERhdGEgPSBmcmFnQmxvY2suZGF0YS5zbGljZSgpXG4gICAgICAvLyAxLiBjb2xsZWN0IGFsbCBuZXcgcmVmcyB0cmFjayBieVxuICAgICAgY29uc3QgdHJhY2tNYXAgPSB7fVxuICAgICAgY29uc3QgcmV1c2VkTWFwID0ge31cbiAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJhY2tCeSA/IGl0ZW1bdHJhY2tCeV0gOiAob2xkU3R5bGUgPyBpdGVtW2tleU5hbWVdIDogaW5kZXgpXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5ID09PSAnJykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRyYWNrTWFwW2tleV0gPSBpdGVtXG4gICAgICB9KVxuXG4gICAgICAvLyAyLiByZW1vdmUgdW51c2VkIGVsZW1lbnQgZm9yZWFjaCBvbGQgaXRlbVxuICAgICAgY29uc3QgcmV1c2VkTGlzdCA9IFtdXG4gICAgICBvbGREYXRhLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRyYWNrQnkgPyBpdGVtW3RyYWNrQnldIDogKG9sZFN0eWxlID8gaXRlbVtrZXlOYW1lXSA6IGluZGV4KVxuICAgICAgICBpZiAodHJhY2tNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHJldXNlZE1hcFtrZXldID0ge1xuICAgICAgICAgICAgaXRlbSwgaW5kZXgsIGtleSxcbiAgICAgICAgICAgIHRhcmdldDogb2xkQ2hpbGRyZW5baW5kZXhdLFxuICAgICAgICAgICAgdm06IG9sZFZtc1tpbmRleF1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV1c2VkTGlzdC5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcmVtb3ZlVGFyZ2V0KHZtLCBvbGRDaGlsZHJlbltpbmRleF0pXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIDMuIGNyZWF0ZSBuZXcgZWxlbWVudCBmb3JlYWNoIG5ldyBpdGVtXG4gICAgICBjaGlsZHJlbi5sZW5ndGggPSAwXG4gICAgICB2bXMubGVuZ3RoID0gMFxuICAgICAgZnJhZ0Jsb2NrLmRhdGEgPSBkYXRhLnNsaWNlKClcbiAgICAgIGZyYWdCbG9jay51cGRhdGVNYXJrID0gZnJhZ0Jsb2NrLnN0YXJ0XG5cbiAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJhY2tCeSA/IGl0ZW1bdHJhY2tCeV0gOiAob2xkU3R5bGUgPyBpdGVtW2tleU5hbWVdIDogaW5kZXgpXG4gICAgICAgIGNvbnN0IHJldXNlZCA9IHJldXNlZE1hcFtrZXldXG4gICAgICAgIGlmIChyZXVzZWQpIHtcbiAgICAgICAgICBpZiAocmV1c2VkLml0ZW0gPT09IHJldXNlZExpc3RbMF0pIHtcbiAgICAgICAgICAgIHJldXNlZExpc3Quc2hpZnQoKVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldXNlZExpc3QuJHJlbW92ZShyZXVzZWQuaXRlbSlcbiAgICAgICAgICAgIG1vdmVUYXJnZXQodm0sIHJldXNlZC50YXJnZXQsIGZyYWdCbG9jay51cGRhdGVNYXJrLCB0cnVlKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZHJlbi5wdXNoKHJldXNlZC50YXJnZXQpXG4gICAgICAgICAgdm1zLnB1c2gocmV1c2VkLnZtKVxuICAgICAgICAgIGlmIChvbGRTdHlsZSkge1xuICAgICAgICAgICAgcmV1c2VkLnZtID0gaXRlbVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldXNlZC52bVt2YWx1ZU5hbWVdID0gaXRlbVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXVzZWQudm1ba2V5TmFtZV0gPSBpbmRleFxuICAgICAgICAgIGZyYWdCbG9jay51cGRhdGVNYXJrID0gcmV1c2VkLnRhcmdldFxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbXBpbGVJdGVtKGl0ZW0sIGluZGV4LCB2bSlcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgZGVsZXRlIGZyYWdCbG9jay51cGRhdGVNYXJrXG4gICAgfVxuICApXG5cbiAgZnJhZ0Jsb2NrLmRhdGEgPSBsaXN0LnNsaWNlKDApXG4gIGxpc3QuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICBjb21waWxlSXRlbShpdGVtLCBpbmRleCwgdm0pXG4gIH0pXG59XG5cbi8qKlxuICogV2F0Y2ggdGhlIGRpc3BsYXkgdXBkYXRlIGFuZCBhZGQvcmVtb3ZlIHRoZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gdGFyZ2V0XG4gKiBAcGFyYW0gIHtvYmplY3R9IGZyYWdCbG9ja1xuICogQHBhcmFtICB7b2JqZWN0fSBjb250ZXh0XG4gKi9cbmZ1bmN0aW9uIGJpbmRTaG93biAodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCBtZXRhKSB7XG4gIGNvbnN0IGRpc3BsYXkgPSB3YXRjaEJsb2NrKHZtLCBmcmFnQmxvY2ssIHRhcmdldC5zaG93biwgJ3Nob3duJyxcbiAgICAoZGlzcGxheSkgPT4ge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gdGhlIFwiaWZcIiBpdGVtIHdhcyBjaGFuZ2VkJywgZGlzcGxheSlcblxuICAgICAgaWYgKCFmcmFnQmxvY2sgfHwgISFmcmFnQmxvY2suZGlzcGxheSA9PT0gISFkaXNwbGF5KSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZnJhZ0Jsb2NrLmRpc3BsYXkgPSAhIWRpc3BsYXlcbiAgICAgIGlmIChkaXNwbGF5KSB7XG4gICAgICAgIGNvbXBpbGUodm0sIHRhcmdldCwgZnJhZ0Jsb2NrLCBtZXRhKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJlbW92ZVRhcmdldCh2bSwgZnJhZ0Jsb2NrLCB0cnVlKVxuICAgICAgfVxuICAgIH1cbiAgKVxuXG4gIGZyYWdCbG9jay5kaXNwbGF5ID0gISFkaXNwbGF5XG4gIGlmIChkaXNwbGF5KSB7XG4gICAgY29tcGlsZSh2bSwgdGFyZ2V0LCBmcmFnQmxvY2ssIG1ldGEpXG4gIH1cbn1cblxuLyoqXG4gKiBXYXRjaCBjYWxjIHZhbHVlIGNoYW5nZXMgYW5kIGFwcGVuZCBjZXJ0YWluIHR5cGUgYWN0aW9uIHRvIGRpZmZlci5cbiAqIEl0IGlzIHVzZWQgZm9yIGlmIG9yIHJlcGVhdCBkYXRhLWJpbmRpbmcgZ2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gICBmcmFnQmxvY2tcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBjYWxjXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZVxuICogQHBhcmFtICB7ZnVuY3Rpb259IGhhbmRsZXJcbiAqIEByZXR1cm4ge2FueX0gICAgICBpbml0IHZhbHVlIG9mIGNhbGNcbiAqL1xuZnVuY3Rpb24gd2F0Y2hCbG9jayAodm0sIGZyYWdCbG9jaywgY2FsYywgdHlwZSwgaGFuZGxlcikge1xuICBjb25zdCBkaWZmZXIgPSB2bSAmJiB2bS5fYXBwICYmIHZtLl9hcHAuZGlmZmVyXG4gIGNvbnN0IGNvbmZpZyA9IHt9XG4gIGNvbnN0IGRlcHRoID0gKGZyYWdCbG9jay5lbGVtZW50LmRlcHRoIHx8IDApICsgMVxuXG4gIHJldHVybiB3YXRjaCh2bSwgY2FsYywgKHZhbHVlKSA9PiB7XG4gICAgY29uZmlnLmxhdGVzdFZhbHVlID0gdmFsdWVcbiAgICBpZiAoZGlmZmVyICYmICFjb25maWcucmVjb3JkZWQpIHtcbiAgICAgIGRpZmZlci5hcHBlbmQodHlwZSwgZGVwdGgsIGZyYWdCbG9jay5ibG9ja0lkLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxhdGVzdFZhbHVlID0gY29uZmlnLmxhdGVzdFZhbHVlXG4gICAgICAgIGhhbmRsZXIobGF0ZXN0VmFsdWUpXG4gICAgICAgIGNvbmZpZy5yZWNvcmRlZCA9IGZhbHNlXG4gICAgICAgIGNvbmZpZy5sYXRlc3RWYWx1ZSA9IHVuZGVmaW5lZFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uZmlnLnJlY29yZGVkID0gdHJ1ZVxuICB9KVxufVxuXG4vKipcbiAqIENsb25lIGEgY29udGV4dCBhbmQgbWVyZ2UgY2VydGFpbiBkYXRhLlxuICpcbiAqIEBwYXJhbSAge29iamVjdH0gbWVyZ2VkRGF0YVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBtZXJnZUNvbnRleHQgKGNvbnRleHQsIG1lcmdlZERhdGEpIHtcbiAgY29uc3QgbmV3Q29udGV4dCA9IE9iamVjdC5jcmVhdGUoY29udGV4dClcbiAgbmV3Q29udGV4dC5fZGF0YSA9IG1lcmdlZERhdGFcbiAgaW5pdERhdGEobmV3Q29udGV4dClcbiAgaW5pdENvbXB1dGVkKG5ld0NvbnRleHQpXG4gIG5ld0NvbnRleHQuX3JlYWxQYXJlbnQgPSBjb250ZXh0XG4gIGlmIChjb250ZXh0Ll9zdGF0aWMpIHtcbiAgICBuZXdDb250ZXh0Ll9zdGF0aWMgPSBjb250ZXh0Ll9zdGF0aWNcbiAgfVxuICByZXR1cm4gbmV3Q29udGV4dFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIEV2ZXJ5dGhpbmcgYWJvdXQgY29tcG9uZW50IGV2ZW50IHdoaWNoIGluY2x1ZGVzIGV2ZW50IG9iamVjdCwgZXZlbnQgbGlzdGVuZXIsXG4gKiBldmVudCBlbWl0dGVyIGFuZCBsaWZlY3ljbGUgaG9va3MuXG4gKi9cblxuLyoqXG4gKiBFdmVudCBvYmplY3QgZGVmaW5pdGlvbi4gQW4gZXZlbnQgb2JqZWN0IGhhcyBgdHlwZWAsIGB0aW1lc3RhbXBgIGFuZFxuICogYGRldGFpbGAgZnJvbSB3aGljaCBhIGNvbXBvbmVudCBlbWl0LiBUaGUgZXZlbnQgb2JqZWN0IGNvdWxkIGJlIGRpc3BhdGNoZWQgdG9cbiAqIHBhcmVudHMgb3IgYnJvYWRjYXN0ZWQgdG8gY2hpbGRyZW4gZXhjZXB0IGB0aGlzLnN0b3AoKWAgaXMgY2FsbGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7YW55fSAgICBkZXRhaWxcbiAqL1xuZnVuY3Rpb24gRXZ0ICh0eXBlLCBkZXRhaWwpIHtcbiAgaWYgKGRldGFpbCBpbnN0YW5jZW9mIEV2dCkge1xuICAgIHJldHVybiBkZXRhaWxcbiAgfVxuXG4gIHRoaXMudGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICB0aGlzLmRldGFpbCA9IGRldGFpbFxuICB0aGlzLnR5cGUgPSB0eXBlXG5cbiAgbGV0IHNob3VsZFN0b3AgPSBmYWxzZVxuXG4gIC8qKlxuICAgKiBzdG9wIGRpc3BhdGNoIGFuZCBicm9hZGNhc3RcbiAgICovXG4gIHRoaXMuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBzaG91bGRTdG9wID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrIGlmIGl0IGNhbid0IGJlIGRpc3BhdGNoZWQgb3IgYnJvYWRjYXN0ZWRcbiAgICovXG4gIHRoaXMuaGFzU3RvcHBlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2hvdWxkU3RvcFxuICB9XG59XG5cbi8qKlxuICogRW1pdCBhbiBldmVudCBidXQgbm90IGJyb2FkY2FzdCBkb3duIG9yIGRpc3BhdGNoIHVwLlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHthbnl9ICAgIGRldGFpbFxuICovXG5leHBvcnQgZnVuY3Rpb24gJGVtaXQgKHR5cGUsIGRldGFpbCkge1xuICBjb25zdCBldmVudHMgPSB0aGlzLl92bUV2ZW50c1xuICBjb25zdCBoYW5kbGVyTGlzdCA9IGV2ZW50c1t0eXBlXVxuICBpZiAoaGFuZGxlckxpc3QpIHtcbiAgICBjb25zdCBldnQgPSBuZXcgRXZ0KHR5cGUsIGRldGFpbClcbiAgICBoYW5kbGVyTGlzdC5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZ0KVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBFbWl0IGFuIGV2ZW50IGFuZCBkaXNwYXRjaCBpdCB1cC5cbiAqIEBwYXJhbSAge3N0cmluZ30gdHlwZVxuICogQHBhcmFtICB7YW55fSAgICBkZXRhaWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRkaXNwYXRjaCAodHlwZSwgZGV0YWlsKSB7XG4gIGNvbnN0IGV2dCA9IG5ldyBFdnQodHlwZSwgZGV0YWlsKVxuICB0aGlzLiRlbWl0KHR5cGUsIGV2dClcblxuICBpZiAoIWV2dC5oYXNTdG9wcGVkKCkgJiYgdGhpcy5fcGFyZW50ICYmIHRoaXMuX3BhcmVudC4kZGlzcGF0Y2gpIHtcbiAgICB0aGlzLl9wYXJlbnQuJGRpc3BhdGNoKHR5cGUsIGV2dClcbiAgfVxufVxuXG4vKipcbiAqIEVtaXQgYW4gZXZlbnQgYW5kIGJyb2FkY2FzdCBpdCBkb3duLlxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlXG4gKiBAcGFyYW0gIHthbnl9ICAgIGRldGFpbFxuICovXG5leHBvcnQgZnVuY3Rpb24gJGJyb2FkY2FzdCAodHlwZSwgZGV0YWlsKSB7XG4gIGNvbnN0IGV2dCA9IG5ldyBFdnQodHlwZSwgZGV0YWlsKVxuICB0aGlzLiRlbWl0KHR5cGUsIGV2dClcblxuICBpZiAoIWV2dC5oYXNTdG9wcGVkKCkgJiYgdGhpcy5fY2hpbGRyZW5WbXMpIHtcbiAgICB0aGlzLl9jaGlsZHJlblZtcy5mb3JFYWNoKChzdWJWbSkgPT4ge1xuICAgICAgc3ViVm0uJGJyb2FkY2FzdCh0eXBlLCBldnQpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIEFkZCBldmVudCBsaXN0ZW5lci5cbiAqIEBwYXJhbSAge3N0cmluZ30gICB0eXBlXG4gKiBAcGFyYW0gIHtmdW5jdGlvbn0gaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gJG9uICh0eXBlLCBoYW5kbGVyKSB7XG4gIGlmICghdHlwZSB8fCB0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGV2ZW50cyA9IHRoaXMuX3ZtRXZlbnRzXG4gIGNvbnN0IGhhbmRsZXJMaXN0ID0gZXZlbnRzW3R5cGVdIHx8IFtdXG4gIGhhbmRsZXJMaXN0LnB1c2goaGFuZGxlcilcbiAgZXZlbnRzW3R5cGVdID0gaGFuZGxlckxpc3RcblxuICAvLyBmaXhlZCBvbGQgdmVyc2lvbiBsaWZlY3ljbGUgZGVzaWduXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICBpZiAodHlwZSA9PT0gJ2hvb2s6cmVhZHknICYmIHRoaXMuX3JlYWR5KSB7XG4gICAgdGhpcy4kZW1pdCgnaG9vazpyZWFkeScpXG4gIH1cbn1cblxuLyoqXG4gKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXIuXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgdHlwZVxuICogQHBhcmFtICB7ZnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uICRvZmYgKHR5cGUsIGhhbmRsZXIpIHtcbiAgaWYgKCF0eXBlKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3QgZXZlbnRzID0gdGhpcy5fdm1FdmVudHNcbiAgaWYgKCFoYW5kbGVyKSB7XG4gICAgZGVsZXRlIGV2ZW50c1t0eXBlXVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGhhbmRsZXJMaXN0ID0gZXZlbnRzW3R5cGVdXG4gIGlmICghaGFuZGxlckxpc3QpIHtcbiAgICByZXR1cm5cbiAgfVxuICBoYW5kbGVyTGlzdC4kcmVtb3ZlKGhhbmRsZXIpXG59XG5cbmNvbnN0IExJRkVfQ1lDTEVfVFlQRVMgPSBbJ2luaXQnLCAnY3JlYXRlZCcsICdyZWFkeScsICdkZXN0cm95ZWQnXVxuXG4vKipcbiAqIEluaXQgZXZlbnRzOlxuICogMS4gbGlzdGVuIGBldmVudHNgIGluIGNvbXBvbmVudCBvcHRpb25zICYgYGV4dGVybmFsRXZlbnRzYC5cbiAqIDIuIGJpbmQgbGlmZWN5Y2xlIGhvb2tzLlxuICogQHBhcmFtICB7Vm19ICAgICB2bVxuICogQHBhcmFtICB7b2JqZWN0fSBleHRlcm5hbEV2ZW50c1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEV2ZW50cyAodm0sIGV4dGVybmFsRXZlbnRzKSB7XG4gIGNvbnN0IG9wdGlvbnMgPSB2bS5fb3B0aW9ucyB8fCB7fVxuICBjb25zdCBldmVudHMgPSBvcHRpb25zLmV2ZW50cyB8fCB7fVxuICBmb3IgKGNvbnN0IHR5cGUxIGluIGV2ZW50cykge1xuICAgIHZtLiRvbih0eXBlMSwgZXZlbnRzW3R5cGUxXSlcbiAgfVxuICBmb3IgKGNvbnN0IHR5cGUyIGluIGV4dGVybmFsRXZlbnRzKSB7XG4gICAgdm0uJG9uKHR5cGUyLCBleHRlcm5hbEV2ZW50c1t0eXBlMl0pXG4gIH1cbiAgTElGRV9DWUNMRV9UWVBFUy5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgdm0uJG9uKGBob29rOiR7dHlwZX1gLCBvcHRpb25zW3R5cGVdKVxuICB9KVxufVxuXG4vKipcbiAqIEJpbmQgZXZlbnQgcmVsYXRlZCBtZXRob2RzIHRvIFZpZXdNb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSAge1ZtfSB2bVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWl4aW5FdmVudHMgKHZtKSB7XG4gIHZtLiRlbWl0ID0gJGVtaXRcbiAgdm0uJGRpc3BhdGNoID0gJGRpc3BhdGNoXG4gIHZtLiRicm9hZGNhc3QgPSAkYnJvYWRjYXN0XG4gIHZtLiRvbiA9ICRvblxuICB2bS4kb2ZmID0gJG9mZlxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIFZpZXdNb2RlbCBDb25zdHJ1Y3RvciAmIGRlZmluaXRpb25cbiAqL1xuXG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuaW1wb3J0IHtcbiAgaW5pdFN0YXRlXG59IGZyb20gJy4uL2NvcmUvc3RhdGUnXG5pbXBvcnQge1xuICBidWlsZFxufSBmcm9tICcuL2NvbXBpbGVyJ1xuaW1wb3J0IHtcbiAgc2V0LFxuICBkZWxcbn0gZnJvbSAnLi4vY29yZS9vYnNlcnZlcidcbmltcG9ydCB7XG4gIHdhdGNoXG59IGZyb20gJy4vZGlyZWN0aXZlJ1xuaW1wb3J0IHtcbiAgaW5pdEV2ZW50cyxcbiAgbWl4aW5FdmVudHNcbn0gZnJvbSAnLi9ldmVudHMnXG5cbi8qKlxuICogVmlld01vZGVsIGNvbnN0cnVjdG9yXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zICAgIGNvbXBvbmVudCBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyZW50Vm0gICB3aGljaCBjb250YWlucyBfYXBwXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyZW50RWwgICByb290IGVsZW1lbnQgb3IgZnJhZyBibG9ja1xuICogQHBhcmFtIHtvYmplY3R9IG1lcmdlZERhdGEgZXh0ZXJuYWwgZGF0YVxuICogQHBhcmFtIHtvYmplY3R9IGV4dGVybmFsRXZlbnRzIGV4dGVybmFsIGV2ZW50c1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBWbSAoXG4gIHR5cGUsXG4gIG9wdGlvbnMsXG4gIHBhcmVudFZtLFxuICBwYXJlbnRFbCxcbiAgbWVyZ2VkRGF0YSxcbiAgZXh0ZXJuYWxFdmVudHNcbikge1xuICBwYXJlbnRWbSA9IHBhcmVudFZtIHx8IHt9XG4gIHRoaXMuX3BhcmVudCA9IHBhcmVudFZtLl9yZWFsUGFyZW50ID8gcGFyZW50Vm0uX3JlYWxQYXJlbnQgOiBwYXJlbnRWbVxuICB0aGlzLl9hcHAgPSBwYXJlbnRWbS5fYXBwIHx8IHt9XG4gIHBhcmVudFZtLl9jaGlsZHJlblZtcyAmJiBwYXJlbnRWbS5fY2hpbGRyZW5WbXMucHVzaCh0aGlzKVxuXG4gIGlmICghb3B0aW9ucyAmJiB0aGlzLl9hcHAuY3VzdG9tQ29tcG9uZW50TWFwKSB7XG4gICAgb3B0aW9ucyA9IHRoaXMuX2FwcC5jdXN0b21Db21wb25lbnRNYXBbdHlwZV1cbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGNvbnN0IGRhdGEgPSBvcHRpb25zLmRhdGEgfHwge31cblxuICB0aGlzLl9vcHRpb25zID0gb3B0aW9uc1xuICB0aGlzLl9tZXRob2RzID0gb3B0aW9ucy5tZXRob2RzIHx8IHt9XG4gIHRoaXMuX2NvbXB1dGVkID0gb3B0aW9ucy5jb21wdXRlZCB8fCB7fVxuICB0aGlzLl9jc3MgPSBvcHRpb25zLnN0eWxlIHx8IHt9XG4gIHRoaXMuX2lkcyA9IHt9XG4gIHRoaXMuX3ZtRXZlbnRzID0ge31cbiAgdGhpcy5fY2hpbGRyZW5WbXMgPSBbXVxuICB0aGlzLl90eXBlID0gdHlwZVxuXG4gIC8vIGJpbmQgZXZlbnRzIGFuZCBsaWZlY3ljbGVzXG4gIGluaXRFdmVudHModGhpcywgZXh0ZXJuYWxFdmVudHMpXG5cbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gXCJpbml0XCIgbGlmZWN5Y2xlIGluIFZtKCR7dGhpcy5fdHlwZX0pYClcbiAgdGhpcy4kZW1pdCgnaG9vazppbml0JylcbiAgdGhpcy5faW5pdGVkID0gdHJ1ZVxuXG4gIC8vIHByb3h5IGRhdGEgYW5kIG1ldGhvZHNcbiAgLy8gb2JzZXJ2ZSBkYXRhIGFuZCBhZGQgdGhpcyB0byB2bXNcbiAgdGhpcy5fZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnZnVuY3Rpb24nID8gZGF0YSgpIDogZGF0YVxuICBpZiAobWVyZ2VkRGF0YSkge1xuICAgIGV4dGVuZCh0aGlzLl9kYXRhLCBtZXJnZWREYXRhKVxuICB9XG4gIGluaXRTdGF0ZSh0aGlzKVxuXG4gIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIFwiY3JlYXRlZFwiIGxpZmVjeWNsZSBpbiBWbSgke3RoaXMuX3R5cGV9KWApXG4gIHRoaXMuJGVtaXQoJ2hvb2s6Y3JlYXRlZCcpXG4gIHRoaXMuX2NyZWF0ZWQgPSB0cnVlXG5cbiAgLy8gYmFja3dhcmQgb2xkIHJlYWR5IGVudHJ5XG4gIGlmIChvcHRpb25zLm1ldGhvZHMgJiYgb3B0aW9ucy5tZXRob2RzLnJlYWR5KSB7XG4gICAgY29uc29sZS53YXJuKCdcImV4cG9ydHMubWV0aG9kcy5yZWFkeVwiIGlzIGRlcHJlY2F0ZWQsICcgK1xuICAgICAgJ3BsZWFzZSB1c2UgXCJleHBvcnRzLmNyZWF0ZWRcIiBpbnN0ZWFkJylcbiAgICBvcHRpb25zLm1ldGhvZHMucmVhZHkuY2FsbCh0aGlzKVxuICB9XG5cbiAgaWYgKCF0aGlzLl9hcHAuZG9jKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBpZiBubyBwYXJlbnRFbGVtZW50IHRoZW4gc3BlY2lmeSB0aGUgZG9jdW1lbnRFbGVtZW50XG4gIHRoaXMuX3BhcmVudEVsID0gcGFyZW50RWwgfHwgdGhpcy5fYXBwLmRvYy5kb2N1bWVudEVsZW1lbnRcbiAgYnVpbGQodGhpcylcbn1cblxubWl4aW5FdmVudHMoVm0ucHJvdG90eXBlKVxuXG4vKipcbiAqIFdhdGNoIGFuIGZ1bmN0aW9uIGFuZCBiaW5kIGFsbCB0aGUgZGF0YSBhcHBlYXJlZCBpbiBpdC4gV2hlbiB0aGUgcmVsYXRlZFxuICogZGF0YSBjaGFuZ2VzLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCBuZXcgdmFsdWUgYXMgMXN0IHBhcmFtLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICovXG5WbS5wcm90b3R5cGUuJHdhdGNoID0gZnVuY3Rpb24gKGZuLCBjYWxsYmFjaykge1xuICB3YXRjaCh0aGlzLCBmbiwgY2FsbGJhY2spXG59XG5cblZtLnNldCA9IHNldFxuVm0uZGVsZXRlID0gZGVsXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmxldCBuYXRpdmVNb2R1bGVzID0ge31cblxuLy8gZm9yIHRlc3RpbmdcblxuLyoqXG4gKiBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlIChtb2R1bGVOYW1lKSB7XG4gIHJldHVybiBuYXRpdmVNb2R1bGVzW21vZHVsZU5hbWVdXG59XG5cbi8qKlxuICogZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyTW9kdWxlcyAoKSB7XG4gIG5hdGl2ZU1vZHVsZXMgPSB7fVxufVxuXG4vLyBmb3IgZnJhbWV3b3JrXG5cbi8qKlxuICogaW5pdCBtb2R1bGVzIGZvciBhbiBhcHAgaW5zdGFuY2VcbiAqIHRoZSBzZWNvbmQgcGFyYW0gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHJlcGxhY2UgYW4gZXhpc3RlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRNb2R1bGVzIChtb2R1bGVzLCBpZlJlcGxhY2UpIHtcbiAgZm9yIChjb25zdCBtb2R1bGVOYW1lIGluIG1vZHVsZXMpIHtcbiAgICAvLyBpbml0IGBtb2R1bGVzW21vZHVsZU5hbWVdW11gXG4gICAgbGV0IG1ldGhvZHMgPSBuYXRpdmVNb2R1bGVzW21vZHVsZU5hbWVdXG4gICAgaWYgKCFtZXRob2RzKSB7XG4gICAgICBtZXRob2RzID0ge31cbiAgICAgIG5hdGl2ZU1vZHVsZXNbbW9kdWxlTmFtZV0gPSBtZXRob2RzXG4gICAgfVxuXG4gICAgLy8gcHVzaCBlYWNoIG5vbi1leGlzdGVkIG5ldyBtZXRob2RcbiAgICBtb2R1bGVzW21vZHVsZU5hbWVdLmZvckVhY2goZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1ldGhvZCA9IHtcbiAgICAgICAgICBuYW1lOiBtZXRob2RcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIW1ldGhvZHNbbWV0aG9kLm5hbWVdIHx8IGlmUmVwbGFjZSkge1xuICAgICAgICBtZXRob2RzW21ldGhvZC5uYW1lXSA9IG1ldGhvZFxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBpbml0IGFwcCBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0TWV0aG9kcyAoVm0sIGFwaXMpIHtcbiAgY29uc3QgcCA9IFZtLnByb3RvdHlwZVxuXG4gIGZvciAoY29uc3QgYXBpTmFtZSBpbiBhcGlzKSB7XG4gICAgaWYgKCFwLmhhc093blByb3BlcnR5KGFwaU5hbWUpKSB7XG4gICAgICBwW2FwaU5hbWVdID0gYXBpc1thcGlOYW1lXVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIGdldCBhIG1vZHVsZSBvZiBtZXRob2RzIGZvciBhbiBhcHAgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVNb2R1bGUgKGFwcCwgbmFtZSkge1xuICBjb25zdCBtZXRob2RzID0gbmF0aXZlTW9kdWxlc1tuYW1lXVxuICBjb25zdCB0YXJnZXQgPSB7fVxuICBmb3IgKGNvbnN0IG1ldGhvZE5hbWUgaW4gbWV0aG9kcykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIG1vZHVsZUdldHRlciAoKSB7XG4gICAgICAgIHJldHVybiAoLi4uYXJncykgPT4gYXBwLmNhbGxUYXNrcyh7XG4gICAgICAgICAgbW9kdWxlOiBuYW1lLFxuICAgICAgICAgIG1ldGhvZDogbWV0aG9kTmFtZSxcbiAgICAgICAgICBhcmdzOiBhcmdzXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiBtb2R1bGVTZXR0ZXIgKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gYXBwLmNhbGxUYXNrcyh7XG4gICAgICAgICAgICBtb2R1bGU6IG5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWUsXG4gICAgICAgICAgICBhcmdzOiBbdmFsdWVdXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuXG4vKipcbiAqIGdldCBhIGN1c3RvbSBjb21wb25lbnQgb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUN1c3RvbUNvbXBvbmVudCAoYXBwLCBuYW1lKSB7XG4gIGNvbnN0IHsgY3VzdG9tQ29tcG9uZW50TWFwIH0gPSBhcHBcbiAgcmV0dXJuIGN1c3RvbUNvbXBvbmVudE1hcFtuYW1lXVxufVxuXG4vKipcbiAqIHJlZ2lzdGVyIGEgY3VzdG9tIGNvbXBvbmVudCBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckN1c3RvbUNvbXBvbmVudCAoYXBwLCBuYW1lLCBkZWYpIHtcbiAgY29uc3QgeyBjdXN0b21Db21wb25lbnRNYXAgfSA9IGFwcFxuXG4gIGlmIChjdXN0b21Db21wb25lbnRNYXBbbmFtZV0pIHtcbiAgICBjb25zb2xlLmVycm9yKGBbSlMgRnJhbWV3b3JrXSBkZWZpbmUgYSBjb21wb25lbnQoJHtuYW1lfSkgdGhhdCBhbHJlYWR5IGV4aXN0c2ApXG4gICAgcmV0dXJuXG4gIH1cblxuICBjdXN0b21Db21wb25lbnRNYXBbbmFtZV0gPSBkZWZcbn1cbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IFNlbVZlcjtcblxuLy8gVGhlIGRlYnVnIGZ1bmN0aW9uIGlzIGV4Y2x1ZGVkIGVudGlyZWx5IGZyb20gdGhlIG1pbmlmaWVkIHZlcnNpb24uXG4vKiBub21pbiAqLyB2YXIgZGVidWc7XG4vKiBub21pbiAqLyBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmXG4gICAgLyogbm9taW4gKi8gcHJvY2Vzcy5lbnYgJiZcbiAgICAvKiBub21pbiAqLyBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gICAgLyogbm9taW4gKi8gL1xcYnNlbXZlclxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRykpXG4gIC8qIG5vbWluICovIGRlYnVnID0gZnVuY3Rpb24oKSB7XG4gICAgLyogbm9taW4gKi8gdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuICAgIC8qIG5vbWluICovIGFyZ3MudW5zaGlmdCgnU0VNVkVSJyk7XG4gICAgLyogbm9taW4gKi8gY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSwgYXJncyk7XG4gICAgLyogbm9taW4gKi8gfTtcbi8qIG5vbWluICovIGVsc2VcbiAgLyogbm9taW4gKi8gZGVidWcgPSBmdW5jdGlvbigpIHt9O1xuXG4vLyBOb3RlOiB0aGlzIGlzIHRoZSBzZW12ZXIub3JnIHZlcnNpb24gb2YgdGhlIHNwZWMgdGhhdCBpdCBpbXBsZW1lbnRzXG4vLyBOb3QgbmVjZXNzYXJpbHkgdGhlIHBhY2thZ2UgdmVyc2lvbiBvZiB0aGlzIGNvZGUuXG5leHBvcnRzLlNFTVZFUl9TUEVDX1ZFUlNJT04gPSAnMi4wLjAnO1xuXG52YXIgTUFYX0xFTkdUSCA9IDI1NjtcbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHwgOTAwNzE5OTI1NDc0MDk5MTtcblxuLy8gVGhlIGFjdHVhbCByZWdleHBzIGdvIG9uIGV4cG9ydHMucmVcbnZhciByZSA9IGV4cG9ydHMucmUgPSBbXTtcbnZhciBzcmMgPSBleHBvcnRzLnNyYyA9IFtdO1xudmFyIFIgPSAwO1xuXG4vLyBUaGUgZm9sbG93aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgZm9yIHRva2VuaXppbmcsXG4vLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuXG4vLyAjIyBOdW1lcmljIElkZW50aWZpZXJcbi8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG52YXIgTlVNRVJJQ0lERU5USUZJRVIgPSBSKys7XG5zcmNbTlVNRVJJQ0lERU5USUZJRVJdID0gJzB8WzEtOV1cXFxcZConO1xudmFyIE5VTUVSSUNJREVOVElGSUVSTE9PU0UgPSBSKys7XG5zcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gPSAnWzAtOV0rJztcblxuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG52YXIgTk9OTlVNRVJJQ0lERU5USUZJRVIgPSBSKys7XG5zcmNbTk9OTlVNRVJJQ0lERU5USUZJRVJdID0gJ1xcXFxkKlthLXpBLVotXVthLXpBLVowLTktXSonO1xuXG5cbi8vICMjIE1haW4gVmVyc2lvblxuLy8gVGhyZWUgZG90LXNlcGFyYXRlZCBudW1lcmljIGlkZW50aWZpZXJzLlxuXG52YXIgTUFJTlZFUlNJT04gPSBSKys7XG5zcmNbTUFJTlZFUlNJT05dID0gJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSXSArICcpXFxcXC4nICtcbiAgICAgICAgICAgICAgICAgICAnKCcgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1tOVU1FUklDSURFTlRJRklFUl0gKyAnKSc7XG5cbnZhciBNQUlOVkVSU0lPTkxPT1NFID0gUisrO1xuc3JjW01BSU5WRVJTSU9OTE9PU0VdID0gJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJygnICsgc3JjW05VTUVSSUNJREVOVElGSUVSTE9PU0VdICsgJyknO1xuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbi8vIEEgbnVtZXJpYyBpZGVudGlmaWVyLCBvciBhIG5vbi1udW1lcmljIGlkZW50aWZpZXIuXG5cbnZhciBQUkVSRUxFQVNFSURFTlRJRklFUiA9IFIrKztcbnNyY1tQUkVSRUxFQVNFSURFTlRJRklFUl0gPSAnKD86JyArIHNyY1tOVU1FUklDSURFTlRJRklFUl0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd8JyArIHNyY1tOT05OVU1FUklDSURFTlRJRklFUl0gKyAnKSc7XG5cbnZhciBQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFID0gUisrO1xuc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdID0gJyg/OicgKyBzcmNbTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnICsgc3JjW05PTk5VTUVSSUNJREVOVElGSUVSXSArICcpJztcblxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uXG4vLyBIeXBoZW4sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGRvdC1zZXBhcmF0ZWQgcHJlLXJlbGVhc2UgdmVyc2lvblxuLy8gaWRlbnRpZmllcnMuXG5cbnZhciBQUkVSRUxFQVNFID0gUisrO1xuc3JjW1BSRVJFTEVBU0VdID0gJyg/Oi0oJyArIHNyY1tQUkVSRUxFQVNFSURFTlRJRklFUl0gK1xuICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuJyArIHNyY1tQUkVSRUxFQVNFSURFTlRJRklFUl0gKyAnKSopKSc7XG5cbnZhciBQUkVSRUxFQVNFTE9PU0UgPSBSKys7XG5zcmNbUFJFUkVMRUFTRUxPT1NFXSA9ICcoPzotPygnICsgc3JjW1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdICtcbiAgICAgICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuJyArIHNyY1tQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXSArICcpKikpJztcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGEgSWRlbnRpZmllclxuLy8gQW55IGNvbWJpbmF0aW9uIG9mIGRpZ2l0cywgbGV0dGVycywgb3IgaHlwaGVucy5cblxudmFyIEJVSUxESURFTlRJRklFUiA9IFIrKztcbnNyY1tCVUlMRElERU5USUZJRVJdID0gJ1swLTlBLVphLXotXSsnO1xuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YVxuLy8gUGx1cyBzaWduLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwZXJpb2Qtc2VwYXJhdGVkIGJ1aWxkIG1ldGFkYXRhXG4vLyBpZGVudGlmaWVycy5cblxudmFyIEJVSUxEID0gUisrO1xuc3JjW0JVSUxEXSA9ICcoPzpcXFxcKygnICsgc3JjW0JVSUxESURFTlRJRklFUl0gK1xuICAgICAgICAgICAgICcoPzpcXFxcLicgKyBzcmNbQlVJTERJREVOVElGSUVSXSArICcpKikpJztcblxuXG4vLyAjIyBGdWxsIFZlcnNpb24gU3RyaW5nXG4vLyBBIG1haW4gdmVyc2lvbiwgZm9sbG93ZWQgb3B0aW9uYWxseSBieSBhIHByZS1yZWxlYXNlIHZlcnNpb24gYW5kXG4vLyBidWlsZCBtZXRhZGF0YS5cblxuLy8gTm90ZSB0aGF0IHRoZSBvbmx5IG1ham9yLCBtaW5vciwgcGF0Y2gsIGFuZCBwcmUtcmVsZWFzZSBzZWN0aW9ucyBvZlxuLy8gdGhlIHZlcnNpb24gc3RyaW5nIGFyZSBjYXB0dXJpbmcgZ3JvdXBzLiAgVGhlIGJ1aWxkIG1ldGFkYXRhIGlzIG5vdCBhXG4vLyBjYXB0dXJpbmcgZ3JvdXAsIGJlY2F1c2UgaXQgc2hvdWxkIG5vdCBldmVyIGJlIHVzZWQgaW4gdmVyc2lvblxuLy8gY29tcGFyaXNvbi5cblxudmFyIEZVTEwgPSBSKys7XG52YXIgRlVMTFBMQUlOID0gJ3Y/JyArIHNyY1tNQUlOVkVSU0lPTl0gK1xuICAgICAgICAgICAgICAgIHNyY1tQUkVSRUxFQVNFXSArICc/JyArXG4gICAgICAgICAgICAgICAgc3JjW0JVSUxEXSArICc/Jztcblxuc3JjW0ZVTExdID0gJ14nICsgRlVMTFBMQUlOICsgJyQnO1xuXG4vLyBsaWtlIGZ1bGwsIGJ1dCBhbGxvd3MgdjEuMi4zIGFuZCA9MS4yLjMsIHdoaWNoIHBlb3BsZSBkbyBzb21ldGltZXMuXG4vLyBhbHNvLCAxLjAuMGFscGhhMSAocHJlcmVsZWFzZSB3aXRob3V0IHRoZSBoeXBoZW4pIHdoaWNoIGlzIHByZXR0eVxuLy8gY29tbW9uIGluIHRoZSBucG0gcmVnaXN0cnkuXG52YXIgTE9PU0VQTEFJTiA9ICdbdj1cXFxcc10qJyArIHNyY1tNQUlOVkVSU0lPTkxPT1NFXSArXG4gICAgICAgICAgICAgICAgIHNyY1tQUkVSRUxFQVNFTE9PU0VdICsgJz8nICtcbiAgICAgICAgICAgICAgICAgc3JjW0JVSUxEXSArICc/JztcblxudmFyIExPT1NFID0gUisrO1xuc3JjW0xPT1NFXSA9ICdeJyArIExPT1NFUExBSU4gKyAnJCc7XG5cbnZhciBHVExUID0gUisrO1xuc3JjW0dUTFRdID0gJygoPzo8fD4pPz0/KSc7XG5cbi8vIFNvbWV0aGluZyBsaWtlIFwiMi4qXCIgb3IgXCIxLjIueFwiLlxuLy8gTm90ZSB0aGF0IFwieC54XCIgaXMgYSB2YWxpZCB4UmFuZ2UgaWRlbnRpZmVyLCBtZWFuaW5nIFwiYW55IHZlcnNpb25cIlxuLy8gT25seSB0aGUgZmlyc3QgaXRlbSBpcyBzdHJpY3RseSByZXF1aXJlZC5cbnZhciBYUkFOR0VJREVOVElGSUVSTE9PU0UgPSBSKys7XG5zcmNbWFJBTkdFSURFTlRJRklFUkxPT1NFXSA9IHNyY1tOVU1FUklDSURFTlRJRklFUkxPT1NFXSArICd8eHxYfFxcXFwqJztcbnZhciBYUkFOR0VJREVOVElGSUVSID0gUisrO1xuc3JjW1hSQU5HRUlERU5USUZJRVJdID0gc3JjW05VTUVSSUNJREVOVElGSUVSXSArICd8eHxYfFxcXFwqJztcblxudmFyIFhSQU5HRVBMQUlOID0gUisrO1xuc3JjW1hSQU5HRVBMQUlOXSA9ICdbdj1cXFxcc10qKCcgKyBzcmNbWFJBTkdFSURFTlRJRklFUl0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICcoPzpcXFxcLignICsgc3JjW1hSQU5HRUlERU5USUZJRVJdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnKD86XFxcXC4oJyArIHNyY1tYUkFOR0VJREVOVElGSUVSXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgJyg/OicgKyBzcmNbUFJFUkVMRUFTRV0gKyAnKT8nICtcbiAgICAgICAgICAgICAgICAgICBzcmNbQlVJTERdICsgJz8nICtcbiAgICAgICAgICAgICAgICAgICAnKT8pPyc7XG5cbnZhciBYUkFOR0VQTEFJTkxPT1NFID0gUisrO1xuc3JjW1hSQU5HRVBMQUlOTE9PU0VdID0gJ1t2PVxcXFxzXSooJyArIHNyY1tYUkFOR0VJREVOVElGSUVSTE9PU0VdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcoPzpcXFxcLignICsgc3JjW1hSQU5HRUlERU5USUZJRVJMT09TRV0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuKCcgKyBzcmNbWFJBTkdFSURFTlRJRklFUkxPT1NFXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKD86JyArIHNyY1tQUkVSRUxFQVNFTE9PU0VdICsgJyk/JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmNbQlVJTERdICsgJz8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcpPyk/JztcblxudmFyIFhSQU5HRSA9IFIrKztcbnNyY1tYUkFOR0VdID0gJ14nICsgc3JjW0dUTFRdICsgJ1xcXFxzKicgKyBzcmNbWFJBTkdFUExBSU5dICsgJyQnO1xudmFyIFhSQU5HRUxPT1NFID0gUisrO1xuc3JjW1hSQU5HRUxPT1NFXSA9ICdeJyArIHNyY1tHVExUXSArICdcXFxccyonICsgc3JjW1hSQU5HRVBMQUlOTE9PU0VdICsgJyQnO1xuXG4vLyBUaWxkZSByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwicmVhc29uYWJseSBhdCBvciBncmVhdGVyIHRoYW5cIlxudmFyIExPTkVUSUxERSA9IFIrKztcbnNyY1tMT05FVElMREVdID0gJyg/On4+PyknO1xuXG52YXIgVElMREVUUklNID0gUisrO1xuc3JjW1RJTERFVFJJTV0gPSAnKFxcXFxzKiknICsgc3JjW0xPTkVUSUxERV0gKyAnXFxcXHMrJztcbnJlW1RJTERFVFJJTV0gPSBuZXcgUmVnRXhwKHNyY1tUSUxERVRSSU1dLCAnZycpO1xudmFyIHRpbGRlVHJpbVJlcGxhY2UgPSAnJDF+JztcblxudmFyIFRJTERFID0gUisrO1xuc3JjW1RJTERFXSA9ICdeJyArIHNyY1tMT05FVElMREVdICsgc3JjW1hSQU5HRVBMQUlOXSArICckJztcbnZhciBUSUxERUxPT1NFID0gUisrO1xuc3JjW1RJTERFTE9PU0VdID0gJ14nICsgc3JjW0xPTkVUSUxERV0gKyBzcmNbWFJBTkdFUExBSU5MT09TRV0gKyAnJCc7XG5cbi8vIENhcmV0IHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJhdCBsZWFzdCBhbmQgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aFwiXG52YXIgTE9ORUNBUkVUID0gUisrO1xuc3JjW0xPTkVDQVJFVF0gPSAnKD86XFxcXF4pJztcblxudmFyIENBUkVUVFJJTSA9IFIrKztcbnNyY1tDQVJFVFRSSU1dID0gJyhcXFxccyopJyArIHNyY1tMT05FQ0FSRVRdICsgJ1xcXFxzKyc7XG5yZVtDQVJFVFRSSU1dID0gbmV3IFJlZ0V4cChzcmNbQ0FSRVRUUklNXSwgJ2cnKTtcbnZhciBjYXJldFRyaW1SZXBsYWNlID0gJyQxXic7XG5cbnZhciBDQVJFVCA9IFIrKztcbnNyY1tDQVJFVF0gPSAnXicgKyBzcmNbTE9ORUNBUkVUXSArIHNyY1tYUkFOR0VQTEFJTl0gKyAnJCc7XG52YXIgQ0FSRVRMT09TRSA9IFIrKztcbnNyY1tDQVJFVExPT1NFXSA9ICdeJyArIHNyY1tMT05FQ0FSRVRdICsgc3JjW1hSQU5HRVBMQUlOTE9PU0VdICsgJyQnO1xuXG4vLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxudmFyIENPTVBBUkFUT1JMT09TRSA9IFIrKztcbnNyY1tDT01QQVJBVE9STE9PU0VdID0gJ14nICsgc3JjW0dUTFRdICsgJ1xcXFxzKignICsgTE9PU0VQTEFJTiArICcpJHxeJCc7XG52YXIgQ09NUEFSQVRPUiA9IFIrKztcbnNyY1tDT01QQVJBVE9SXSA9ICdeJyArIHNyY1tHVExUXSArICdcXFxccyooJyArIEZVTExQTEFJTiArICcpJHxeJCc7XG5cblxuLy8gQW4gZXhwcmVzc2lvbiB0byBzdHJpcCBhbnkgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBndGx0IGFuZCB0aGUgdGhpbmdcbi8vIGl0IG1vZGlmaWVzLCBzbyB0aGF0IGA+IDEuMi4zYCA9PT4gYD4xLjIuM2BcbnZhciBDT01QQVJBVE9SVFJJTSA9IFIrKztcbnNyY1tDT01QQVJBVE9SVFJJTV0gPSAnKFxcXFxzKiknICsgc3JjW0dUTFRdICtcbiAgICAgICAgICAgICAgICAgICAgICAnXFxcXHMqKCcgKyBMT09TRVBMQUlOICsgJ3wnICsgc3JjW1hSQU5HRVBMQUlOXSArICcpJztcblxuLy8gdGhpcyBvbmUgaGFzIHRvIHVzZSB0aGUgL2cgZmxhZ1xucmVbQ09NUEFSQVRPUlRSSU1dID0gbmV3IFJlZ0V4cChzcmNbQ09NUEFSQVRPUlRSSU1dLCAnZycpO1xudmFyIGNvbXBhcmF0b3JUcmltUmVwbGFjZSA9ICckMSQyJDMnO1xuXG5cbi8vIFNvbWV0aGluZyBsaWtlIGAxLjIuMyAtIDEuMi40YFxuLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuLy8gY2hlY2tlZCBhZ2FpbnN0IGVpdGhlciB0aGUgc3RyaWN0IG9yIGxvb3NlIGNvbXBhcmF0b3IgZm9ybVxuLy8gbGF0ZXIuXG52YXIgSFlQSEVOUkFOR0UgPSBSKys7XG5zcmNbSFlQSEVOUkFOR0VdID0gJ15cXFxccyooJyArIHNyY1tYUkFOR0VQTEFJTl0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICdcXFxccystXFxcXHMrJyArXG4gICAgICAgICAgICAgICAgICAgJygnICsgc3JjW1hSQU5HRVBMQUlOXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgJ1xcXFxzKiQnO1xuXG52YXIgSFlQSEVOUkFOR0VMT09TRSA9IFIrKztcbnNyY1tIWVBIRU5SQU5HRUxPT1NFXSA9ICdeXFxcXHMqKCcgKyBzcmNbWFJBTkdFUExBSU5MT09TRV0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFxzKy1cXFxccysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1tYUkFOR0VQTEFJTkxPT1NFXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxcXHMqJCc7XG5cbi8vIFN0YXIgcmFuZ2VzIGJhc2ljYWxseSBqdXN0IGFsbG93IGFueXRoaW5nIGF0IGFsbC5cbnZhciBTVEFSID0gUisrO1xuc3JjW1NUQVJdID0gJyg8fD4pPz0/XFxcXHMqXFxcXConO1xuXG4vLyBDb21waWxlIHRvIGFjdHVhbCByZWdleHAgb2JqZWN0cy5cbi8vIEFsbCBhcmUgZmxhZy1mcmVlLCB1bmxlc3MgdGhleSB3ZXJlIGNyZWF0ZWQgYWJvdmUgd2l0aCBhIGZsYWcuXG5mb3IgKHZhciBpID0gMDsgaSA8IFI7IGkrKykge1xuICBkZWJ1ZyhpLCBzcmNbaV0pO1xuICBpZiAoIXJlW2ldKVxuICAgIHJlW2ldID0gbmV3IFJlZ0V4cChzcmNbaV0pO1xufVxuXG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5mdW5jdGlvbiBwYXJzZSh2ZXJzaW9uLCBsb29zZSkge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcilcbiAgICByZXR1cm4gdmVyc2lvbjtcblxuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKVxuICAgIHJldHVybiBudWxsO1xuXG4gIGlmICh2ZXJzaW9uLmxlbmd0aCA+IE1BWF9MRU5HVEgpXG4gICAgcmV0dXJuIG51bGw7XG5cbiAgdmFyIHIgPSBsb29zZSA/IHJlW0xPT1NFXSA6IHJlW0ZVTExdO1xuICBpZiAoIXIudGVzdCh2ZXJzaW9uKSlcbiAgICByZXR1cm4gbnVsbDtcblxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIGxvb3NlKTtcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnRzLnZhbGlkID0gdmFsaWQ7XG5mdW5jdGlvbiB2YWxpZCh2ZXJzaW9uLCBsb29zZSkge1xuICB2YXIgdiA9IHBhcnNlKHZlcnNpb24sIGxvb3NlKTtcbiAgcmV0dXJuIHYgPyB2LnZlcnNpb24gOiBudWxsO1xufVxuXG5cbmV4cG9ydHMuY2xlYW4gPSBjbGVhbjtcbmZ1bmN0aW9uIGNsZWFuKHZlcnNpb24sIGxvb3NlKSB7XG4gIHZhciBzID0gcGFyc2UodmVyc2lvbi50cmltKCkucmVwbGFjZSgvXls9dl0rLywgJycpLCBsb29zZSk7XG4gIHJldHVybiBzID8gcy52ZXJzaW9uIDogbnVsbDtcbn1cblxuZXhwb3J0cy5TZW1WZXIgPSBTZW1WZXI7XG5cbmZ1bmN0aW9uIFNlbVZlcih2ZXJzaW9uLCBsb29zZSkge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIGlmICh2ZXJzaW9uLmxvb3NlID09PSBsb29zZSlcbiAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgIGVsc2VcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnZlcnNpb247XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBWZXJzaW9uOiAnICsgdmVyc2lvbik7XG4gIH1cblxuICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJyArIE1BWF9MRU5HVEggKyAnIGNoYXJhY3RlcnMnKVxuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZW1WZXIpKVxuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIGxvb3NlKTtcblxuICBkZWJ1ZygnU2VtVmVyJywgdmVyc2lvbiwgbG9vc2UpO1xuICB0aGlzLmxvb3NlID0gbG9vc2U7XG4gIHZhciBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gobG9vc2UgPyByZVtMT09TRV0gOiByZVtGVUxMXSk7XG5cbiAgaWYgKCFtKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgVmVyc2lvbjogJyArIHZlcnNpb24pO1xuXG4gIHRoaXMucmF3ID0gdmVyc2lvbjtcblxuICAvLyB0aGVzZSBhcmUgYWN0dWFsbHkgbnVtYmVyc1xuICB0aGlzLm1ham9yID0gK21bMV07XG4gIHRoaXMubWlub3IgPSArbVsyXTtcbiAgdGhpcy5wYXRjaCA9ICttWzNdO1xuXG4gIGlmICh0aGlzLm1ham9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1ham9yIDwgMClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1ham9yIHZlcnNpb24nKVxuXG4gIGlmICh0aGlzLm1pbm9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1pbm9yIDwgMClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuXG4gIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMClcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHBhdGNoIHZlcnNpb24nKVxuXG4gIC8vIG51bWJlcmlmeSBhbnkgcHJlcmVsZWFzZSBudW1lcmljIGlkc1xuICBpZiAoIW1bNF0pXG4gICAgdGhpcy5wcmVyZWxlYXNlID0gW107XG4gIGVsc2VcbiAgICB0aGlzLnByZXJlbGVhc2UgPSBtWzRdLnNwbGl0KCcuJykubWFwKGZ1bmN0aW9uKGlkKSB7XG4gICAgICBpZiAoL15bMC05XSskLy50ZXN0KGlkKSkge1xuICAgICAgICB2YXIgbnVtID0gK2lkO1xuICAgICAgICBpZiAobnVtID49IDAgJiYgbnVtIDwgTUFYX1NBRkVfSU5URUdFUilcbiAgICAgICAgICByZXR1cm4gbnVtO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkO1xuICAgIH0pO1xuXG4gIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW107XG4gIHRoaXMuZm9ybWF0KCk7XG59XG5cblNlbVZlci5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMudmVyc2lvbiA9IHRoaXMubWFqb3IgKyAnLicgKyB0aGlzLm1pbm9yICsgJy4nICsgdGhpcy5wYXRjaDtcbiAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGgpXG4gICAgdGhpcy52ZXJzaW9uICs9ICctJyArIHRoaXMucHJlcmVsZWFzZS5qb2luKCcuJyk7XG4gIHJldHVybiB0aGlzLnZlcnNpb247XG59O1xuXG5TZW1WZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnZlcnNpb247XG59O1xuXG5TZW1WZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbihvdGhlcikge1xuICBkZWJ1ZygnU2VtVmVyLmNvbXBhcmUnLCB0aGlzLnZlcnNpb24sIHRoaXMubG9vc2UsIG90aGVyKTtcbiAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKVxuICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5sb29zZSk7XG5cbiAgcmV0dXJuIHRoaXMuY29tcGFyZU1haW4ob3RoZXIpIHx8IHRoaXMuY29tcGFyZVByZShvdGhlcik7XG59O1xuXG5TZW1WZXIucHJvdG90eXBlLmNvbXBhcmVNYWluID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKVxuICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5sb29zZSk7XG5cbiAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1ham9yLCBvdGhlci5tYWpvcikgfHxcbiAgICAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLm1pbm9yLCBvdGhlci5taW5vcikgfHxcbiAgICAgICAgIGNvbXBhcmVJZGVudGlmaWVycyh0aGlzLnBhdGNoLCBvdGhlci5wYXRjaCk7XG59O1xuXG5TZW1WZXIucHJvdG90eXBlLmNvbXBhcmVQcmUgPSBmdW5jdGlvbihvdGhlcikge1xuICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpXG4gICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLmxvb3NlKTtcblxuICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKVxuICAgIHJldHVybiAtMTtcbiAgZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpXG4gICAgcmV0dXJuIDE7XG4gIGVsc2UgaWYgKCF0aGlzLnByZXJlbGVhc2UubGVuZ3RoICYmICFvdGhlci5wcmVyZWxlYXNlLmxlbmd0aClcbiAgICByZXR1cm4gMDtcblxuICB2YXIgaSA9IDA7XG4gIGRvIHtcbiAgICB2YXIgYSA9IHRoaXMucHJlcmVsZWFzZVtpXTtcbiAgICB2YXIgYiA9IG90aGVyLnByZXJlbGVhc2VbaV07XG4gICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpO1xuICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIDA7XG4gICAgZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoYSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIGVsc2UgaWYgKGEgPT09IGIpXG4gICAgICBjb250aW51ZTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpO1xuICB9IHdoaWxlICgrK2kpO1xufTtcblxuLy8gcHJlbWlub3Igd2lsbCBidW1wIHRoZSB2ZXJzaW9uIHVwIHRvIHRoZSBuZXh0IG1pbm9yIHJlbGVhc2UsIGFuZCBpbW1lZGlhdGVseVxuLy8gZG93biB0byBwcmUtcmVsZWFzZS4gcHJlbWFqb3IgYW5kIHByZXBhdGNoIHdvcmsgdGhlIHNhbWUgd2F5LlxuU2VtVmVyLnByb3RvdHlwZS5pbmMgPSBmdW5jdGlvbihyZWxlYXNlLCBpZGVudGlmaWVyKSB7XG4gIHN3aXRjaCAocmVsZWFzZSkge1xuICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwO1xuICAgICAgdGhpcy5wYXRjaCA9IDA7XG4gICAgICB0aGlzLm1pbm9yID0gMDtcbiAgICAgIHRoaXMubWFqb3IrKztcbiAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwO1xuICAgICAgdGhpcy5wYXRjaCA9IDA7XG4gICAgICB0aGlzLm1pbm9yKys7XG4gICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllcik7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwcmVwYXRjaCc6XG4gICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwcmVyZWxlYXNlLCBpdCB3aWxsIGJ1bXAgdG8gdGhlIG5leHQgdmVyc2lvblxuICAgICAgLy8gZHJvcCBhbnkgcHJlcmVsZWFzZXMgdGhhdCBtaWdodCBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGV5IGFyZSBub3RcbiAgICAgIC8vIHJlbGV2YW50IGF0IHRoaXMgcG9pbnQuXG4gICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMDtcbiAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIpO1xuICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpO1xuICAgICAgYnJlYWs7XG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbm9uLXByZXJlbGVhc2UgdmVyc2lvbiwgdGhpcyBhY3RzIHRoZSBzYW1lIGFzXG4gICAgLy8gcHJlcGF0Y2guXG4gICAgY2FzZSAncHJlcmVsZWFzZSc6XG4gICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllcik7XG4gICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllcik7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21ham9yJzpcbiAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWFqb3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtYWpvci5cbiAgICAgIC8vIDEuMC4wLTUgYnVtcHMgdG8gMS4wLjBcbiAgICAgIC8vIDEuMS4wIGJ1bXBzIHRvIDIuMC4wXG4gICAgICBpZiAodGhpcy5taW5vciAhPT0gMCB8fCB0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApXG4gICAgICAgIHRoaXMubWFqb3IrKztcbiAgICAgIHRoaXMubWlub3IgPSAwO1xuICAgICAgdGhpcy5wYXRjaCA9IDA7XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWlub3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtaW5vciB2ZXJzaW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtaW5vci5cbiAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgIC8vIDEuMi4xIGJ1bXBzIHRvIDEuMy4wXG4gICAgICBpZiAodGhpcy5wYXRjaCAhPT0gMCB8fCB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKVxuICAgICAgICB0aGlzLm1pbm9yKys7XG4gICAgICB0aGlzLnBhdGNoID0gMDtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncGF0Y2gnOlxuICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLCBpdCB3aWxsIGluY3JlbWVudCB0aGUgcGF0Y2guXG4gICAgICAvLyBJZiBpdCBpcyBhIHByZS1yZWxlYXNlIGl0IHdpbGwgYnVtcCB1cCB0byB0aGUgc2FtZSBwYXRjaCB2ZXJzaW9uLlxuICAgICAgLy8gMS4yLjAtNSBwYXRjaGVzIHRvIDEuMi4wXG4gICAgICAvLyAxLjIuMCBwYXRjaGVzIHRvIDEuMi4xXG4gICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgdGhpcy5wYXRjaCsrO1xuICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW107XG4gICAgICBicmVhaztcbiAgICAvLyBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSB1c2VkIHB1YmxpY2x5LlxuICAgIC8vIDEuMC4wIFwicHJlXCIgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cbiAgICBjYXNlICdwcmUnOlxuICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFswXTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgaSA9IHRoaXMucHJlcmVsZWFzZS5sZW5ndGg7XG4gICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVyZWxlYXNlW2ldID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlW2ldKys7XG4gICAgICAgICAgICBpID0gLTI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSAtMSkgLy8gZGlkbid0IGluY3JlbWVudCBhbnl0aGluZ1xuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5wdXNoKDApO1xuICAgICAgfVxuICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgLy8gMS4yLjAtYmV0YS4xIGJ1bXBzIHRvIDEuMi4wLWJldGEuMixcbiAgICAgICAgLy8gMS4yLjAtYmV0YS5mb29ibHogb3IgMS4yLjAtYmV0YSBidW1wcyB0byAxLjIuMC1iZXRhLjBcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZVswXSA9PT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIGlmIChpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKVxuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIDBdO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgMF07XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAnICsgcmVsZWFzZSk7XG4gIH1cbiAgdGhpcy5mb3JtYXQoKTtcbiAgdGhpcy5yYXcgPSB0aGlzLnZlcnNpb247XG4gIHJldHVybiB0aGlzO1xufTtcblxuZXhwb3J0cy5pbmMgPSBpbmM7XG5mdW5jdGlvbiBpbmModmVyc2lvbiwgcmVsZWFzZSwgbG9vc2UsIGlkZW50aWZpZXIpIHtcbiAgaWYgKHR5cGVvZihsb29zZSkgPT09ICdzdHJpbmcnKSB7XG4gICAgaWRlbnRpZmllciA9IGxvb3NlO1xuICAgIGxvb3NlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBsb29zZSkuaW5jKHJlbGVhc2UsIGlkZW50aWZpZXIpLnZlcnNpb247XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0cy5kaWZmID0gZGlmZjtcbmZ1bmN0aW9uIGRpZmYodmVyc2lvbjEsIHZlcnNpb24yKSB7XG4gIGlmIChlcSh2ZXJzaW9uMSwgdmVyc2lvbjIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHYxID0gcGFyc2UodmVyc2lvbjEpO1xuICAgIHZhciB2MiA9IHBhcnNlKHZlcnNpb24yKTtcbiAgICBpZiAodjEucHJlcmVsZWFzZS5sZW5ndGggfHwgdjIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB2MSkge1xuICAgICAgICBpZiAoa2V5ID09PSAnbWFqb3InIHx8IGtleSA9PT0gJ21pbm9yJyB8fCBrZXkgPT09ICdwYXRjaCcpIHtcbiAgICAgICAgICBpZiAodjFba2V5XSAhPT0gdjJba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuICdwcmUnK2tleTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAncHJlcmVsZWFzZSc7XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiB2MSkge1xuICAgICAgaWYgKGtleSA9PT0gJ21ham9yJyB8fCBrZXkgPT09ICdtaW5vcicgfHwga2V5ID09PSAncGF0Y2gnKSB7XG4gICAgICAgIGlmICh2MVtrZXldICE9PSB2MltrZXldKSB7XG4gICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLmNvbXBhcmVJZGVudGlmaWVycyA9IGNvbXBhcmVJZGVudGlmaWVycztcblxudmFyIG51bWVyaWMgPSAvXlswLTldKyQvO1xuZnVuY3Rpb24gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpIHtcbiAgdmFyIGFudW0gPSBudW1lcmljLnRlc3QoYSk7XG4gIHZhciBibnVtID0gbnVtZXJpYy50ZXN0KGIpO1xuXG4gIGlmIChhbnVtICYmIGJudW0pIHtcbiAgICBhID0gK2E7XG4gICAgYiA9ICtiO1xuICB9XG5cbiAgcmV0dXJuIChhbnVtICYmICFibnVtKSA/IC0xIDpcbiAgICAgICAgIChibnVtICYmICFhbnVtKSA/IDEgOlxuICAgICAgICAgYSA8IGIgPyAtMSA6XG4gICAgICAgICBhID4gYiA/IDEgOlxuICAgICAgICAgMDtcbn1cblxuZXhwb3J0cy5yY29tcGFyZUlkZW50aWZpZXJzID0gcmNvbXBhcmVJZGVudGlmaWVycztcbmZ1bmN0aW9uIHJjb21wYXJlSWRlbnRpZmllcnMoYSwgYikge1xuICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGIsIGEpO1xufVxuXG5leHBvcnRzLm1ham9yID0gbWFqb3I7XG5mdW5jdGlvbiBtYWpvcihhLCBsb29zZSkge1xuICByZXR1cm4gbmV3IFNlbVZlcihhLCBsb29zZSkubWFqb3I7XG59XG5cbmV4cG9ydHMubWlub3IgPSBtaW5vcjtcbmZ1bmN0aW9uIG1pbm9yKGEsIGxvb3NlKSB7XG4gIHJldHVybiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vcjtcbn1cblxuZXhwb3J0cy5wYXRjaCA9IHBhdGNoO1xuZnVuY3Rpb24gcGF0Y2goYSwgbG9vc2UpIHtcbiAgcmV0dXJuIG5ldyBTZW1WZXIoYSwgbG9vc2UpLnBhdGNoO1xufVxuXG5leHBvcnRzLmNvbXBhcmUgPSBjb21wYXJlO1xuZnVuY3Rpb24gY29tcGFyZShhLCBiLCBsb29zZSkge1xuICByZXR1cm4gbmV3IFNlbVZlcihhLCBsb29zZSkuY29tcGFyZShuZXcgU2VtVmVyKGIsIGxvb3NlKSk7XG59XG5cbmV4cG9ydHMuY29tcGFyZUxvb3NlID0gY29tcGFyZUxvb3NlO1xuZnVuY3Rpb24gY29tcGFyZUxvb3NlKGEsIGIpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgdHJ1ZSk7XG59XG5cbmV4cG9ydHMucmNvbXBhcmUgPSByY29tcGFyZTtcbmZ1bmN0aW9uIHJjb21wYXJlKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGIsIGEsIGxvb3NlKTtcbn1cblxuZXhwb3J0cy5zb3J0ID0gc29ydDtcbmZ1bmN0aW9uIHNvcnQobGlzdCwgbG9vc2UpIHtcbiAgcmV0dXJuIGxpc3Quc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuY29tcGFyZShhLCBiLCBsb29zZSk7XG4gIH0pO1xufVxuXG5leHBvcnRzLnJzb3J0ID0gcnNvcnQ7XG5mdW5jdGlvbiByc29ydChsaXN0LCBsb29zZSkge1xuICByZXR1cm4gbGlzdC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5yY29tcGFyZShhLCBiLCBsb29zZSk7XG4gIH0pO1xufVxuXG5leHBvcnRzLmd0ID0gZ3Q7XG5mdW5jdGlvbiBndChhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgPiAwO1xufVxuXG5leHBvcnRzLmx0ID0gbHQ7XG5mdW5jdGlvbiBsdChhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgPCAwO1xufVxuXG5leHBvcnRzLmVxID0gZXE7XG5mdW5jdGlvbiBlcShhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgPT09IDA7XG59XG5cbmV4cG9ydHMubmVxID0gbmVxO1xuZnVuY3Rpb24gbmVxKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSAhPT0gMDtcbn1cblxuZXhwb3J0cy5ndGUgPSBndGU7XG5mdW5jdGlvbiBndGUoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgbG9vc2UpID49IDA7XG59XG5cbmV4cG9ydHMubHRlID0gbHRlO1xuZnVuY3Rpb24gbHRlKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8PSAwO1xufVxuXG5leHBvcnRzLmNtcCA9IGNtcDtcbmZ1bmN0aW9uIGNtcChhLCBvcCwgYiwgbG9vc2UpIHtcbiAgdmFyIHJldDtcbiAgc3dpdGNoIChvcCkge1xuICAgIGNhc2UgJz09PSc6XG4gICAgICBpZiAodHlwZW9mIGEgPT09ICdvYmplY3QnKSBhID0gYS52ZXJzaW9uO1xuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0JykgYiA9IGIudmVyc2lvbjtcbiAgICAgIHJldCA9IGEgPT09IGI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICchPT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JykgYSA9IGEudmVyc2lvbjtcbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpIGIgPSBiLnZlcnNpb247XG4gICAgICByZXQgPSBhICE9PSBiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnJzogY2FzZSAnPSc6IGNhc2UgJz09JzogcmV0ID0gZXEoYSwgYiwgbG9vc2UpOyBicmVhaztcbiAgICBjYXNlICchPSc6IHJldCA9IG5lcShhLCBiLCBsb29zZSk7IGJyZWFrO1xuICAgIGNhc2UgJz4nOiByZXQgPSBndChhLCBiLCBsb29zZSk7IGJyZWFrO1xuICAgIGNhc2UgJz49JzogcmV0ID0gZ3RlKGEsIGIsIGxvb3NlKTsgYnJlYWs7XG4gICAgY2FzZSAnPCc6IHJldCA9IGx0KGEsIGIsIGxvb3NlKTsgYnJlYWs7XG4gICAgY2FzZSAnPD0nOiByZXQgPSBsdGUoYSwgYiwgbG9vc2UpOyBicmVhaztcbiAgICBkZWZhdWx0OiB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG9wZXJhdG9yOiAnICsgb3ApO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydHMuQ29tcGFyYXRvciA9IENvbXBhcmF0b3I7XG5mdW5jdGlvbiBDb21wYXJhdG9yKGNvbXAsIGxvb3NlKSB7XG4gIGlmIChjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgIGlmIChjb21wLmxvb3NlID09PSBsb29zZSlcbiAgICAgIHJldHVybiBjb21wO1xuICAgIGVsc2VcbiAgICAgIGNvbXAgPSBjb21wLnZhbHVlO1xuICB9XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbXBhcmF0b3IpKVxuICAgIHJldHVybiBuZXcgQ29tcGFyYXRvcihjb21wLCBsb29zZSk7XG5cbiAgZGVidWcoJ2NvbXBhcmF0b3InLCBjb21wLCBsb29zZSk7XG4gIHRoaXMubG9vc2UgPSBsb29zZTtcbiAgdGhpcy5wYXJzZShjb21wKTtcblxuICBpZiAodGhpcy5zZW12ZXIgPT09IEFOWSlcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gIGVsc2VcbiAgICB0aGlzLnZhbHVlID0gdGhpcy5vcGVyYXRvciArIHRoaXMuc2VtdmVyLnZlcnNpb247XG5cbiAgZGVidWcoJ2NvbXAnLCB0aGlzKTtcbn1cblxudmFyIEFOWSA9IHt9O1xuQ29tcGFyYXRvci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihjb21wKSB7XG4gIHZhciByID0gdGhpcy5sb29zZSA/IHJlW0NPTVBBUkFUT1JMT09TRV0gOiByZVtDT01QQVJBVE9SXTtcbiAgdmFyIG0gPSBjb21wLm1hdGNoKHIpO1xuXG4gIGlmICghbSlcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNvbXBhcmF0b3I6ICcgKyBjb21wKTtcblxuICB0aGlzLm9wZXJhdG9yID0gbVsxXTtcbiAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICc9JylcbiAgICB0aGlzLm9wZXJhdG9yID0gJyc7XG5cbiAgLy8gaWYgaXQgbGl0ZXJhbGx5IGlzIGp1c3QgJz4nIG9yICcnIHRoZW4gYWxsb3cgYW55dGhpbmcuXG4gIGlmICghbVsyXSlcbiAgICB0aGlzLnNlbXZlciA9IEFOWTtcbiAgZWxzZVxuICAgIHRoaXMuc2VtdmVyID0gbmV3IFNlbVZlcihtWzJdLCB0aGlzLmxvb3NlKTtcbn07XG5cbkNvbXBhcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlO1xufTtcblxuQ29tcGFyYXRvci5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uKHZlcnNpb24pIHtcbiAgZGVidWcoJ0NvbXBhcmF0b3IudGVzdCcsIHZlcnNpb24sIHRoaXMubG9vc2UpO1xuXG4gIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpXG4gICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5sb29zZSk7XG5cbiAgcmV0dXJuIGNtcCh2ZXJzaW9uLCB0aGlzLm9wZXJhdG9yLCB0aGlzLnNlbXZlciwgdGhpcy5sb29zZSk7XG59O1xuXG5Db21wYXJhdG9yLnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24oY29tcCwgbG9vc2UpIHtcbiAgaWYgKCEoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBDb21wYXJhdG9yIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICB2YXIgcmFuZ2VUbXA7XG5cbiAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgcmFuZ2VUbXAgPSBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgbG9vc2UpO1xuICAgIHJldHVybiBzYXRpc2ZpZXModGhpcy52YWx1ZSwgcmFuZ2VUbXAsIGxvb3NlKTtcbiAgfSBlbHNlIGlmIChjb21wLm9wZXJhdG9yID09PSAnJykge1xuICAgIHJhbmdlVG1wID0gbmV3IFJhbmdlKHRoaXMudmFsdWUsIGxvb3NlKTtcbiAgICByZXR1cm4gc2F0aXNmaWVzKGNvbXAuc2VtdmVyLCByYW5nZVRtcCwgbG9vc2UpO1xuICB9XG5cbiAgdmFyIHNhbWVEaXJlY3Rpb25JbmNyZWFzaW5nID1cbiAgICAodGhpcy5vcGVyYXRvciA9PT0gJz49JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPicpICYmXG4gICAgKGNvbXAub3BlcmF0b3IgPT09ICc+PScgfHwgY29tcC5vcGVyYXRvciA9PT0gJz4nKTtcbiAgdmFyIHNhbWVEaXJlY3Rpb25EZWNyZWFzaW5nID1cbiAgICAodGhpcy5vcGVyYXRvciA9PT0gJzw9JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPCcpICYmXG4gICAgKGNvbXAub3BlcmF0b3IgPT09ICc8PScgfHwgY29tcC5vcGVyYXRvciA9PT0gJzwnKTtcbiAgdmFyIHNhbWVTZW1WZXIgPSB0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uO1xuICB2YXIgZGlmZmVyZW50RGlyZWN0aW9uc0luY2x1c2l2ZSA9XG4gICAgKHRoaXMub3BlcmF0b3IgPT09ICc+PScgfHwgdGhpcy5vcGVyYXRvciA9PT0gJzw9JykgJiZcbiAgICAoY29tcC5vcGVyYXRvciA9PT0gJz49JyB8fCBjb21wLm9wZXJhdG9yID09PSAnPD0nKTtcbiAgdmFyIG9wcG9zaXRlRGlyZWN0aW9uc0xlc3NUaGFuID1cbiAgICBjbXAodGhpcy5zZW12ZXIsICc8JywgY29tcC5zZW12ZXIsIGxvb3NlKSAmJlxuICAgICgodGhpcy5vcGVyYXRvciA9PT0gJz49JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPicpICYmXG4gICAgKGNvbXAub3BlcmF0b3IgPT09ICc8PScgfHwgY29tcC5vcGVyYXRvciA9PT0gJzwnKSk7XG4gIHZhciBvcHBvc2l0ZURpcmVjdGlvbnNHcmVhdGVyVGhhbiA9XG4gICAgY21wKHRoaXMuc2VtdmVyLCAnPicsIGNvbXAuc2VtdmVyLCBsb29zZSkgJiZcbiAgICAoKHRoaXMub3BlcmF0b3IgPT09ICc8PScgfHwgdGhpcy5vcGVyYXRvciA9PT0gJzwnKSAmJlxuICAgIChjb21wLm9wZXJhdG9yID09PSAnPj0nIHx8IGNvbXAub3BlcmF0b3IgPT09ICc+JykpO1xuXG4gIHJldHVybiBzYW1lRGlyZWN0aW9uSW5jcmVhc2luZyB8fCBzYW1lRGlyZWN0aW9uRGVjcmVhc2luZyB8fFxuICAgIChzYW1lU2VtVmVyICYmIGRpZmZlcmVudERpcmVjdGlvbnNJbmNsdXNpdmUpIHx8XG4gICAgb3Bwb3NpdGVEaXJlY3Rpb25zTGVzc1RoYW4gfHwgb3Bwb3NpdGVEaXJlY3Rpb25zR3JlYXRlclRoYW47XG59O1xuXG5cbmV4cG9ydHMuUmFuZ2UgPSBSYW5nZTtcbmZ1bmN0aW9uIFJhbmdlKHJhbmdlLCBsb29zZSkge1xuICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkge1xuICAgIGlmIChyYW5nZS5sb29zZSA9PT0gbG9vc2UpIHtcbiAgICAgIHJldHVybiByYW5nZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS5yYXcsIGxvb3NlKTtcbiAgICB9XG4gIH1cblxuICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS52YWx1ZSwgbG9vc2UpO1xuICB9XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJhbmdlKSlcbiAgICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSk7XG5cbiAgdGhpcy5sb29zZSA9IGxvb3NlO1xuXG4gIC8vIEZpcnN0LCBzcGxpdCBiYXNlZCBvbiBib29sZWFuIG9yIHx8XG4gIHRoaXMucmF3ID0gcmFuZ2U7XG4gIHRoaXMuc2V0ID0gcmFuZ2Uuc3BsaXQoL1xccypcXHxcXHxcXHMqLykubWFwKGZ1bmN0aW9uKHJhbmdlKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VSYW5nZShyYW5nZS50cmltKCkpO1xuICB9LCB0aGlzKS5maWx0ZXIoZnVuY3Rpb24oYykge1xuICAgIC8vIHRocm93IG91dCBhbnkgdGhhdCBhcmUgbm90IHJlbGV2YW50IGZvciB3aGF0ZXZlciByZWFzb25cbiAgICByZXR1cm4gYy5sZW5ndGg7XG4gIH0pO1xuXG4gIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBTZW1WZXIgUmFuZ2U6ICcgKyByYW5nZSk7XG4gIH1cblxuICB0aGlzLmZvcm1hdCgpO1xufVxuXG5SYW5nZS5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmFuZ2UgPSB0aGlzLnNldC5tYXAoZnVuY3Rpb24oY29tcHMpIHtcbiAgICByZXR1cm4gY29tcHMuam9pbignICcpLnRyaW0oKTtcbiAgfSkuam9pbignfHwnKS50cmltKCk7XG4gIHJldHVybiB0aGlzLnJhbmdlO1xufTtcblxuUmFuZ2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnJhbmdlO1xufTtcblxuUmFuZ2UucHJvdG90eXBlLnBhcnNlUmFuZ2UgPSBmdW5jdGlvbihyYW5nZSkge1xuICB2YXIgbG9vc2UgPSB0aGlzLmxvb3NlO1xuICByYW5nZSA9IHJhbmdlLnRyaW0oKTtcbiAgZGVidWcoJ3JhbmdlJywgcmFuZ2UsIGxvb3NlKTtcbiAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gIHZhciBociA9IGxvb3NlID8gcmVbSFlQSEVOUkFOR0VMT09TRV0gOiByZVtIWVBIRU5SQU5HRV07XG4gIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSk7XG4gIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKTtcbiAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVtDT01QQVJBVE9SVFJJTV0sIGNvbXBhcmF0b3JUcmltUmVwbGFjZSk7XG4gIGRlYnVnKCdjb21wYXJhdG9yIHRyaW0nLCByYW5nZSwgcmVbQ09NUEFSQVRPUlRSSU1dKTtcblxuICAvLyBgfiAxLjIuM2AgPT4gYH4xLjIuM2BcbiAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW1RJTERFVFJJTV0sIHRpbGRlVHJpbVJlcGxhY2UpO1xuXG4gIC8vIGBeIDEuMi4zYCA9PiBgXjEuMi4zYFxuICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSk7XG5cbiAgLy8gbm9ybWFsaXplIHNwYWNlc1xuICByYW5nZSA9IHJhbmdlLnNwbGl0KC9cXHMrLykuam9pbignICcpO1xuXG4gIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWx5IHRyaW1tZWQgYW5kXG4gIC8vIHJlYWR5IHRvIGJlIHNwbGl0IGludG8gY29tcGFyYXRvcnMuXG5cbiAgdmFyIGNvbXBSZSA9IGxvb3NlID8gcmVbQ09NUEFSQVRPUkxPT1NFXSA6IHJlW0NPTVBBUkFUT1JdO1xuICB2YXIgc2V0ID0gcmFuZ2Uuc3BsaXQoJyAnKS5tYXAoZnVuY3Rpb24oY29tcCkge1xuICAgIHJldHVybiBwYXJzZUNvbXBhcmF0b3IoY29tcCwgbG9vc2UpO1xuICB9KS5qb2luKCcgJykuc3BsaXQoL1xccysvKTtcbiAgaWYgKHRoaXMubG9vc2UpIHtcbiAgICAvLyBpbiBsb29zZSBtb2RlLCB0aHJvdyBvdXQgYW55IHRoYXQgYXJlIG5vdCB2YWxpZCBjb21wYXJhdG9yc1xuICAgIHNldCA9IHNldC5maWx0ZXIoZnVuY3Rpb24oY29tcCkge1xuICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChjb21wUmUpO1xuICAgIH0pO1xuICB9XG4gIHNldCA9IHNldC5tYXAoZnVuY3Rpb24oY29tcCkge1xuICAgIHJldHVybiBuZXcgQ29tcGFyYXRvcihjb21wLCBsb29zZSk7XG4gIH0pO1xuXG4gIHJldHVybiBzZXQ7XG59O1xuXG5SYW5nZS5wcm90b3R5cGUuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uKHJhbmdlLCBsb29zZSkge1xuICBpZiAoIShyYW5nZSBpbnN0YW5jZW9mIFJhbmdlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLnNldC5zb21lKGZ1bmN0aW9uKHRoaXNDb21wYXJhdG9ycykge1xuICAgIHJldHVybiB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoZnVuY3Rpb24odGhpc0NvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiByYW5nZS5zZXQuc29tZShmdW5jdGlvbihyYW5nZUNvbXBhcmF0b3JzKSB7XG4gICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KGZ1bmN0aW9uKHJhbmdlQ29tcGFyYXRvcikge1xuICAgICAgICAgIHJldHVybiB0aGlzQ29tcGFyYXRvci5pbnRlcnNlY3RzKHJhbmdlQ29tcGFyYXRvciwgbG9vc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8vIE1vc3RseSBqdXN0IGZvciB0ZXN0aW5nIGFuZCBsZWdhY3kgQVBJIHJlYXNvbnNcbmV4cG9ydHMudG9Db21wYXJhdG9ycyA9IHRvQ29tcGFyYXRvcnM7XG5mdW5jdGlvbiB0b0NvbXBhcmF0b3JzKHJhbmdlLCBsb29zZSkge1xuICByZXR1cm4gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSkuc2V0Lm1hcChmdW5jdGlvbihjb21wKSB7XG4gICAgcmV0dXJuIGNvbXAubWFwKGZ1bmN0aW9uKGMpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlO1xuICAgIH0pLmpvaW4oJyAnKS50cmltKCkuc3BsaXQoJyAnKTtcbiAgfSk7XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmZ1bmN0aW9uIHBhcnNlQ29tcGFyYXRvcihjb21wLCBsb29zZSkge1xuICBkZWJ1ZygnY29tcCcsIGNvbXApO1xuICBjb21wID0gcmVwbGFjZUNhcmV0cyhjb21wLCBsb29zZSk7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXApO1xuICBjb21wID0gcmVwbGFjZVRpbGRlcyhjb21wLCBsb29zZSk7XG4gIGRlYnVnKCd0aWxkZXMnLCBjb21wKTtcbiAgY29tcCA9IHJlcGxhY2VYUmFuZ2VzKGNvbXAsIGxvb3NlKTtcbiAgZGVidWcoJ3hyYW5nZScsIGNvbXApO1xuICBjb21wID0gcmVwbGFjZVN0YXJzKGNvbXAsIGxvb3NlKTtcbiAgZGVidWcoJ3N0YXJzJywgY29tcCk7XG4gIHJldHVybiBjb21wO1xufVxuXG5mdW5jdGlvbiBpc1goaWQpIHtcbiAgcmV0dXJuICFpZCB8fCBpZC50b0xvd2VyQ2FzZSgpID09PSAneCcgfHwgaWQgPT09ICcqJztcbn1cblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wXG4vLyB+Mi4wLCB+Mi4wLngsIH4+Mi4wLCB+PjIuMC54IC0tPiA+PTIuMC4wIDwyLjEuMFxuLy8gfjEuMiwgfjEuMi54LCB+PjEuMiwgfj4xLjIueCAtLT4gPj0xLjIuMCA8MS4zLjBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjBcbi8vIH4xLjIuMCwgfj4xLjIuMCAtLT4gPj0xLjIuMCA8MS4zLjBcbmZ1bmN0aW9uIHJlcGxhY2VUaWxkZXMoY29tcCwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXAudHJpbSgpLnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uKGNvbXApIHtcbiAgICByZXR1cm4gcmVwbGFjZVRpbGRlKGNvbXAsIGxvb3NlKTtcbiAgfSkuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlVGlsZGUoY29tcCwgbG9vc2UpIHtcbiAgdmFyIHIgPSBsb29zZSA/IHJlW1RJTERFTE9PU0VdIDogcmVbVElMREVdO1xuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIGZ1bmN0aW9uKF8sIE0sIG0sIHAsIHByKSB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpO1xuICAgIHZhciByZXQ7XG5cbiAgICBpZiAoaXNYKE0pKVxuICAgICAgcmV0ID0gJyc7XG4gICAgZWxzZSBpZiAoaXNYKG0pKVxuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLjAuMCA8JyArICgrTSArIDEpICsgJy4wLjAnO1xuICAgIGVsc2UgaWYgKGlzWChwKSlcbiAgICAgIC8vIH4xLjIgPT0gPj0xLjIuMCA8MS4zLjBcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuMCA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcik7XG4gICAgICBpZiAocHIuY2hhckF0KDApICE9PSAnLScpXG4gICAgICAgIHByID0gJy0nICsgcHI7XG4gICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICsgcHIgK1xuICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgfSBlbHNlXG4gICAgICAvLyB+MS4yLjMgPT0gPj0xLjIuMyA8MS4zLjBcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgK1xuICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KTtcbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wXG4vLyBeMi4wLCBeMi4wLnggLS0+ID49Mi4wLjAgPDMuMC4wXG4vLyBeMS4yLCBeMS4yLnggLS0+ID49MS4yLjAgPDIuMC4wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wXG4vLyBeMS4yLjAgLS0+ID49MS4yLjAgPDIuMC4wXG5mdW5jdGlvbiByZXBsYWNlQ2FyZXRzKGNvbXAsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbihjb21wKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VDYXJldChjb21wLCBsb29zZSk7XG4gIH0pLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNhcmV0KGNvbXAsIGxvb3NlKSB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIGxvb3NlKTtcbiAgdmFyIHIgPSBsb29zZSA/IHJlW0NBUkVUTE9PU0VdIDogcmVbQ0FSRVRdO1xuICByZXR1cm4gY29tcC5yZXBsYWNlKHIsIGZ1bmN0aW9uKF8sIE0sIG0sIHAsIHByKSB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpO1xuICAgIHZhciByZXQ7XG5cbiAgICBpZiAoaXNYKE0pKVxuICAgICAgcmV0ID0gJyc7XG4gICAgZWxzZSBpZiAoaXNYKG0pKVxuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLjAuMCA8JyArICgrTSArIDEpICsgJy4wLjAnO1xuICAgIGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgaWYgKE0gPT09ICcwJylcbiAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4wIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJztcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4wIDwnICsgKCtNICsgMSkgKyAnLjAuMCc7XG4gICAgfSBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VDYXJldCBwcicsIHByKTtcbiAgICAgIGlmIChwci5jaGFyQXQoMCkgIT09ICctJylcbiAgICAgICAgcHIgPSAnLScgKyBwcjtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJylcbiAgICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICsgcHIgK1xuICAgICAgICAgICAgICAgICcgPCcgKyBNICsgJy4nICsgbSArICcuJyArICgrcCArIDEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArIHByICtcbiAgICAgICAgICAgICAgICAnIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJztcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICsgcHIgK1xuICAgICAgICAgICAgICAnIDwnICsgKCtNICsgMSkgKyAnLjAuMCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdubyBwcicpO1xuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKVxuICAgICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgK1xuICAgICAgICAgICAgICAgICcgPCcgKyBNICsgJy4nICsgbSArICcuJyArICgrcCArIDEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArXG4gICAgICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArXG4gICAgICAgICAgICAgICcgPCcgKyAoK00gKyAxKSArICcuMC4wJztcbiAgICB9XG5cbiAgICBkZWJ1ZygnY2FyZXQgcmV0dXJuJywgcmV0KTtcbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVhSYW5nZXMoY29tcCwgbG9vc2UpIHtcbiAgZGVidWcoJ3JlcGxhY2VYUmFuZ2VzJywgY29tcCwgbG9vc2UpO1xuICByZXR1cm4gY29tcC5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbihjb21wKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VYUmFuZ2UoY29tcCwgbG9vc2UpO1xuICB9KS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VYUmFuZ2UoY29tcCwgbG9vc2UpIHtcbiAgY29tcCA9IGNvbXAudHJpbSgpO1xuICB2YXIgciA9IGxvb3NlID8gcmVbWFJBTkdFTE9PU0VdIDogcmVbWFJBTkdFXTtcbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCBmdW5jdGlvbihyZXQsIGd0bHQsIE0sIG0sIHAsIHByKSB7XG4gICAgZGVidWcoJ3hSYW5nZScsIGNvbXAsIHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpO1xuICAgIHZhciB4TSA9IGlzWChNKTtcbiAgICB2YXIgeG0gPSB4TSB8fCBpc1gobSk7XG4gICAgdmFyIHhwID0geG0gfHwgaXNYKHApO1xuICAgIHZhciBhbnlYID0geHA7XG5cbiAgICBpZiAoZ3RsdCA9PT0gJz0nICYmIGFueVgpXG4gICAgICBndGx0ID0gJyc7XG5cbiAgICBpZiAoeE0pIHtcbiAgICAgIGlmIChndGx0ID09PSAnPicgfHwgZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgYWxsb3dlZFxuICAgICAgICByZXQgPSAnPDAuMC4wJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgZm9yYmlkZGVuXG4gICAgICAgIHJldCA9ICcqJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGd0bHQgJiYgYW55WCkge1xuICAgICAgLy8gcmVwbGFjZSBYIHdpdGggMFxuICAgICAgaWYgKHhtKVxuICAgICAgICBtID0gMDtcbiAgICAgIGlmICh4cClcbiAgICAgICAgcCA9IDA7XG5cbiAgICAgIGlmIChndGx0ID09PSAnPicpIHtcbiAgICAgICAgLy8gPjEgPT4gPj0yLjAuMFxuICAgICAgICAvLyA+MS4yID0+ID49MS4zLjBcbiAgICAgICAgLy8gPjEuMi4zID0+ID49IDEuMi40XG4gICAgICAgIGd0bHQgPSAnPj0nO1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxO1xuICAgICAgICAgIG0gPSAwO1xuICAgICAgICAgIHAgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHhwKSB7XG4gICAgICAgICAgbSA9ICttICsgMTtcbiAgICAgICAgICBwID0gMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChndGx0ID09PSAnPD0nKSB7XG4gICAgICAgIC8vIDw9MC43LnggaXMgYWN0dWFsbHkgPDAuOC4wLCBzaW5jZSBhbnkgMC43Lnggc2hvdWxkXG4gICAgICAgIC8vIHBhc3MuICBTaW1pbGFybHksIDw9Ny54IGlzIGFjdHVhbGx5IDw4LjAuMCwgZXRjLlxuICAgICAgICBndGx0ID0gJzwnO1xuICAgICAgICBpZiAoeG0pXG4gICAgICAgICAgTSA9ICtNICsgMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIG0gPSArbSArIDE7XG4gICAgICB9XG5cbiAgICAgIHJldCA9IGd0bHQgKyBNICsgJy4nICsgbSArICcuJyArIHA7XG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLjAuMCA8JyArICgrTSArIDEpICsgJy4wLjAnO1xuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuMCA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCc7XG4gICAgfVxuXG4gICAgZGVidWcoJ3hSYW5nZSByZXR1cm4nLCByZXQpO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG5cbi8vIEJlY2F1c2UgKiBpcyBBTkQtZWQgd2l0aCBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIGNvbXBhcmF0b3IsXG4vLyBhbmQgJycgbWVhbnMgXCJhbnkgdmVyc2lvblwiLCBqdXN0IHJlbW92ZSB0aGUgKnMgZW50aXJlbHkuXG5mdW5jdGlvbiByZXBsYWNlU3RhcnMoY29tcCwgbG9vc2UpIHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIGxvb3NlKTtcbiAgLy8gTG9vc2VuZXNzIGlzIGlnbm9yZWQgaGVyZS4gIHN0YXIgaXMgYWx3YXlzIGFzIGxvb3NlIGFzIGl0IGdldHMhXG4gIHJldHVybiBjb21wLnRyaW0oKS5yZXBsYWNlKHJlW1NUQVJdLCAnJyk7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW0hZUEhFTlJBTkdFXSlcbi8vIE0sIG0sIHBhdGNoLCBwcmVyZWxlYXNlLCBidWlsZFxuLy8gMS4yIC0gMy40LjUgPT4gPj0xLjIuMCA8PTMuNC41XG4vLyAxLjIuMyAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMCBBbnkgMy40Lnggd2lsbCBkb1xuLy8gMS4yIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wXG5mdW5jdGlvbiBoeXBoZW5SZXBsYWNlKCQwLFxuICAgICAgICAgICAgICAgICAgICAgICBmcm9tLCBmTSwgZm0sIGZwLCBmcHIsIGZiLFxuICAgICAgICAgICAgICAgICAgICAgICB0bywgdE0sIHRtLCB0cCwgdHByLCB0Yikge1xuXG4gIGlmIChpc1goZk0pKVxuICAgIGZyb20gPSAnJztcbiAgZWxzZSBpZiAoaXNYKGZtKSlcbiAgICBmcm9tID0gJz49JyArIGZNICsgJy4wLjAnO1xuICBlbHNlIGlmIChpc1goZnApKVxuICAgIGZyb20gPSAnPj0nICsgZk0gKyAnLicgKyBmbSArICcuMCc7XG4gIGVsc2VcbiAgICBmcm9tID0gJz49JyArIGZyb207XG5cbiAgaWYgKGlzWCh0TSkpXG4gICAgdG8gPSAnJztcbiAgZWxzZSBpZiAoaXNYKHRtKSlcbiAgICB0byA9ICc8JyArICgrdE0gKyAxKSArICcuMC4wJztcbiAgZWxzZSBpZiAoaXNYKHRwKSlcbiAgICB0byA9ICc8JyArIHRNICsgJy4nICsgKCt0bSArIDEpICsgJy4wJztcbiAgZWxzZSBpZiAodHByKVxuICAgIHRvID0gJzw9JyArIHRNICsgJy4nICsgdG0gKyAnLicgKyB0cCArICctJyArIHRwcjtcbiAgZWxzZVxuICAgIHRvID0gJzw9JyArIHRvO1xuXG4gIHJldHVybiAoZnJvbSArICcgJyArIHRvKS50cmltKCk7XG59XG5cblxuLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuUmFuZ2UucHJvdG90eXBlLnRlc3QgPSBmdW5jdGlvbih2ZXJzaW9uKSB7XG4gIGlmICghdmVyc2lvbilcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJylcbiAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLmxvb3NlKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHRlc3RTZXQodGhpcy5zZXRbaV0sIHZlcnNpb24pKVxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZnVuY3Rpb24gdGVzdFNldChzZXQsIHZlcnNpb24pIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHZlcnNpb24ucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAvLyBGaW5kIHRoZSBzZXQgb2YgdmVyc2lvbnMgdGhhdCBhcmUgYWxsb3dlZCB0byBoYXZlIHByZXJlbGVhc2VzXG4gICAgLy8gRm9yIGV4YW1wbGUsIF4xLjIuMy1wci4xIGRlc3VnYXJzIHRvID49MS4yLjMtcHIuMSA8Mi4wLjBcbiAgICAvLyBUaGF0IHNob3VsZCBhbGxvdyBgMS4yLjMtcHIuMmAgdG8gcGFzcy5cbiAgICAvLyBIb3dldmVyLCBgMS4yLjQtYWxwaGEubm90cmVhZHlgIHNob3VsZCBOT1QgYmUgYWxsb3dlZCxcbiAgICAvLyBldmVuIHRob3VnaCBpdCdzIHdpdGhpbiB0aGUgcmFuZ2Ugc2V0IGJ5IHRoZSBjb21wYXJhdG9ycy5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgZGVidWcoc2V0W2ldLnNlbXZlcik7XG4gICAgICBpZiAoc2V0W2ldLnNlbXZlciA9PT0gQU5ZKVxuICAgICAgICBjb250aW51ZTtcblxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBhbGxvd2VkID0gc2V0W2ldLnNlbXZlcjtcbiAgICAgICAgaWYgKGFsbG93ZWQubWFqb3IgPT09IHZlcnNpb24ubWFqb3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQubWlub3IgPT09IHZlcnNpb24ubWlub3IgJiZcbiAgICAgICAgICAgIGFsbG93ZWQucGF0Y2ggPT09IHZlcnNpb24ucGF0Y2gpXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmVyc2lvbiBoYXMgYSAtcHJlLCBidXQgaXQncyBub3Qgb25lIG9mIHRoZSBvbmVzIHdlIGxpa2UuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydHMuc2F0aXNmaWVzID0gc2F0aXNmaWVzO1xuZnVuY3Rpb24gc2F0aXNmaWVzKHZlcnNpb24sIHJhbmdlLCBsb29zZSkge1xuICB0cnkge1xuICAgIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSk7XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiByYW5nZS50ZXN0KHZlcnNpb24pO1xufVxuXG5leHBvcnRzLm1heFNhdGlzZnlpbmcgPSBtYXhTYXRpc2Z5aW5nO1xuZnVuY3Rpb24gbWF4U2F0aXNmeWluZyh2ZXJzaW9ucywgcmFuZ2UsIGxvb3NlKSB7XG4gIHZhciBtYXggPSBudWxsO1xuICB2YXIgbWF4U1YgPSBudWxsO1xuICB0cnkge1xuICAgIHZhciByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpO1xuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZlcnNpb25zLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkgeyAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIGxvb3NlKVxuICAgICAgaWYgKCFtYXggfHwgbWF4U1YuY29tcGFyZSh2KSA9PT0gLTEpIHsgLy8gY29tcGFyZShtYXgsIHYsIHRydWUpXG4gICAgICAgIG1heCA9IHY7XG4gICAgICAgIG1heFNWID0gbmV3IFNlbVZlcihtYXgsIGxvb3NlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBtYXg7XG59XG5cbmV4cG9ydHMubWluU2F0aXNmeWluZyA9IG1pblNhdGlzZnlpbmc7XG5mdW5jdGlvbiBtaW5TYXRpc2Z5aW5nKHZlcnNpb25zLCByYW5nZSwgbG9vc2UpIHtcbiAgdmFyIG1pbiA9IG51bGw7XG4gIHZhciBtaW5TViA9IG51bGw7XG4gIHRyeSB7XG4gICAgdmFyIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSk7XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7IC8vIHNhdGlzZmllcyh2LCByYW5nZSwgbG9vc2UpXG4gICAgICBpZiAoIW1pbiB8fCBtaW5TVi5jb21wYXJlKHYpID09PSAxKSB7IC8vIGNvbXBhcmUobWluLCB2LCB0cnVlKVxuICAgICAgICBtaW4gPSB2O1xuICAgICAgICBtaW5TViA9IG5ldyBTZW1WZXIobWluLCBsb29zZSk7XG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWluO1xufVxuXG5leHBvcnRzLnZhbGlkUmFuZ2UgPSB2YWxpZFJhbmdlO1xuZnVuY3Rpb24gdmFsaWRSYW5nZShyYW5nZSwgbG9vc2UpIHtcbiAgdHJ5IHtcbiAgICAvLyBSZXR1cm4gJyonIGluc3RlYWQgb2YgJycgc28gdGhhdCB0cnV0aGluZXNzIHdvcmtzLlxuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiBpdCdzIGludmFsaWQgYW55d2F5XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpLnJhbmdlIHx8ICcqJztcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBsZXNzIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2VcbmV4cG9ydHMubHRyID0gbHRyO1xuZnVuY3Rpb24gbHRyKHZlcnNpb24sIHJhbmdlLCBsb29zZSkge1xuICByZXR1cm4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJzwnLCBsb29zZSk7XG59XG5cbi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZS5cbmV4cG9ydHMuZ3RyID0gZ3RyO1xuZnVuY3Rpb24gZ3RyKHZlcnNpb24sIHJhbmdlLCBsb29zZSkge1xuICByZXR1cm4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJz4nLCBsb29zZSk7XG59XG5cbmV4cG9ydHMub3V0c2lkZSA9IG91dHNpZGU7XG5mdW5jdGlvbiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCBoaWxvLCBsb29zZSkge1xuICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCBsb29zZSk7XG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSk7XG5cbiAgdmFyIGd0Zm4sIGx0ZWZuLCBsdGZuLCBjb21wLCBlY29tcDtcbiAgc3dpdGNoIChoaWxvKSB7XG4gICAgY2FzZSAnPic6XG4gICAgICBndGZuID0gZ3Q7XG4gICAgICBsdGVmbiA9IGx0ZTtcbiAgICAgIGx0Zm4gPSBsdDtcbiAgICAgIGNvbXAgPSAnPic7XG4gICAgICBlY29tcCA9ICc+PSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICc8JzpcbiAgICAgIGd0Zm4gPSBsdDtcbiAgICAgIGx0ZWZuID0gZ3RlO1xuICAgICAgbHRmbiA9IGd0O1xuICAgICAgY29tcCA9ICc8JztcbiAgICAgIGVjb21wID0gJzw9JztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYSBoaWxvIHZhbCBvZiBcIjxcIiBvciBcIj5cIicpO1xuICB9XG5cbiAgLy8gSWYgaXQgc2F0aXNpZmVzIHRoZSByYW5nZSBpdCBpcyBub3Qgb3V0c2lkZVxuICBpZiAoc2F0aXNmaWVzKHZlcnNpb24sIHJhbmdlLCBsb29zZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGcm9tIG5vdyBvbiwgdmFyaWFibGUgdGVybXMgYXJlIGFzIGlmIHdlJ3JlIGluIFwiZ3RyXCIgbW9kZS5cbiAgLy8gYnV0IG5vdGUgdGhhdCBldmVyeXRoaW5nIGlzIGZsaXBwZWQgZm9yIHRoZSBcImx0clwiIGZ1bmN0aW9uLlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGNvbXBhcmF0b3JzID0gcmFuZ2Uuc2V0W2ldO1xuXG4gICAgdmFyIGhpZ2ggPSBudWxsO1xuICAgIHZhciBsb3cgPSBudWxsO1xuXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaChmdW5jdGlvbihjb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcGFyYXRvci5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgICBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKVxuICAgICAgfVxuICAgICAgaGlnaCA9IGhpZ2ggfHwgY29tcGFyYXRvcjtcbiAgICAgIGxvdyA9IGxvdyB8fCBjb21wYXJhdG9yO1xuICAgICAgaWYgKGd0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGhpZ2guc2VtdmVyLCBsb29zZSkpIHtcbiAgICAgICAgaGlnaCA9IGNvbXBhcmF0b3I7XG4gICAgICB9IGVsc2UgaWYgKGx0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGxvdy5zZW12ZXIsIGxvb3NlKSkge1xuICAgICAgICBsb3cgPSBjb21wYXJhdG9yO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSWYgdGhlIGVkZ2UgdmVyc2lvbiBjb21wYXJhdG9yIGhhcyBhIG9wZXJhdG9yIHRoZW4gb3VyIHZlcnNpb25cbiAgICAvLyBpc24ndCBvdXRzaWRlIGl0XG4gICAgaWYgKGhpZ2gub3BlcmF0b3IgPT09IGNvbXAgfHwgaGlnaC5vcGVyYXRvciA9PT0gZWNvbXApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbG93ZXN0IHZlcnNpb24gY29tcGFyYXRvciBoYXMgYW4gb3BlcmF0b3IgYW5kIG91ciB2ZXJzaW9uXG4gICAgLy8gaXMgbGVzcyB0aGFuIGl0IHRoZW4gaXQgaXNuJ3QgaGlnaGVyIHRoYW4gdGhlIHJhbmdlXG4gICAgaWYgKCghbG93Lm9wZXJhdG9yIHx8IGxvdy5vcGVyYXRvciA9PT0gY29tcCkgJiZcbiAgICAgICAgbHRlZm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGxvdy5vcGVyYXRvciA9PT0gZWNvbXAgJiYgbHRmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0cy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZTtcbmZ1bmN0aW9uIHByZXJlbGVhc2UodmVyc2lvbiwgbG9vc2UpIHtcbiAgdmFyIHBhcnNlZCA9IHBhcnNlKHZlcnNpb24sIGxvb3NlKTtcbiAgcmV0dXJuIChwYXJzZWQgJiYgcGFyc2VkLnByZXJlbGVhc2UubGVuZ3RoKSA/IHBhcnNlZC5wcmVyZWxlYXNlIDogbnVsbDtcbn1cblxuZXhwb3J0cy5pbnRlcnNlY3RzID0gaW50ZXJzZWN0cztcbmZ1bmN0aW9uIGludGVyc2VjdHMocjEsIHIyLCBsb29zZSkge1xuICByMSA9IG5ldyBSYW5nZShyMSwgbG9vc2UpXG4gIHIyID0gbmV3IFJhbmdlKHIyLCBsb29zZSlcbiAgcmV0dXJuIHIxLmludGVyc2VjdHMocjIpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJ1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCwgdHlwb2YgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlcnNpb24gc3RyaW5nLlxuICogQHBhcmFtICB7U3RyaW5nfSBWZXJzaW9uLiBpZTogMSwgMS4wLCAxLjAuMFxuICogQHJldHVybiB7U3RyaW5nfSBWZXJzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVWZXJzaW9uICh2KSB7XG4gIGNvbnN0IGlzVmFsaWQgPSBzZW12ZXIudmFsaWQodilcbiAgaWYgKGlzVmFsaWQpIHtcbiAgICByZXR1cm4gdlxuICB9XG5cbiAgdiA9IHR5cGVvZiAodikgPT09ICdzdHJpbmcnID8gdiA6ICcnXG4gIGNvbnN0IHNwbGl0ID0gdi5zcGxpdCgnLicpXG4gIGxldCBpID0gMFxuICBjb25zdCByZXN1bHQgPSBbXVxuXG4gIHdoaWxlIChpIDwgMykge1xuICAgIGNvbnN0IHMgPSB0eXBlb2YgKHNwbGl0W2ldKSA9PT0gJ3N0cmluZycgJiYgc3BsaXRbaV0gPyBzcGxpdFtpXSA6ICcwJ1xuICAgIHJlc3VsdC5wdXNoKHMpXG4gICAgaSsrXG4gIH1cblxuICByZXR1cm4gcmVzdWx0LmpvaW4oJy4nKVxufVxuXG4vKipcbiAqIEdldCBpbmZvcm1hdGlvbnMgZnJvbSBkaWZmZXJlbnQgZXJyb3Iga2V5LiBMaWtlOlxuICogLSBjb2RlXG4gKiAtIGVycm9yTWVzc2FnZVxuICogLSBlcnJvclR5cGVcbiAqIC0gaXNEb3duZ3JhZGVcbiAqIEBwYXJhbSAge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZhbFxuICogQHBhcmFtICB7c3RyaW5nfSBjcml0ZXJpYVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3IgKGtleSwgdmFsLCBjcml0ZXJpYSkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgaXNEb3duZ3JhZGU6IHRydWUsXG4gICAgZXJyb3JUeXBlOiAxLFxuICAgIGNvZGU6IDEwMDBcbiAgfVxuICBjb25zdCBnZXRNc2cgPSBmdW5jdGlvbiAoa2V5LCB2YWwsIGNyaXRlcmlhKSB7XG4gICAgcmV0dXJuICdEb3duZ3JhZGVbJyArIGtleSArICddIDo6IGRldmljZUluZm8gJ1xuICAgICAgKyB2YWwgKyAnIG1hdGNoZWQgY3JpdGVyaWEgJyArIGNyaXRlcmlhXG4gIH1cbiAgY29uc3QgX2tleSA9IGtleS50b0xvd2VyQ2FzZSgpXG5cbiAgcmVzdWx0LmVycm9yTWVzc2FnZSA9IGdldE1zZyhrZXksIHZhbCwgY3JpdGVyaWEpXG5cbiAgaWYgKF9rZXkuaW5kZXhPZignb3N2ZXJzaW9uJykgPj0gMCkge1xuICAgIHJlc3VsdC5jb2RlID0gMTAwMVxuICB9XG4gIGVsc2UgaWYgKF9rZXkuaW5kZXhPZignYXBwdmVyc2lvbicpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDJcbiAgfVxuICBlbHNlIGlmIChfa2V5LmluZGV4T2YoJ3dlZXh2ZXJzaW9uJykgPj0gMCkge1xuICAgIHJlc3VsdC5jb2RlID0gMTAwM1xuICB9XG4gIGVsc2UgaWYgKF9rZXkuaW5kZXhPZignZGV2aWNlbW9kZWwnKSA+PSAwKSB7XG4gICAgcmVzdWx0LmNvZGUgPSAxMDA0XG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogV0VFWCBmcmFtZXdvcmsgaW5wdXQoZGV2aWNlSW5mbylcbiAqIHtcbiAqICAgcGxhdGZvcm06ICdpT1MnIG9yICdhbmRyb2lkJ1xuICogICBvc1ZlcnNpb246ICcxLjAuMCcgb3IgJzEuMCcgb3IgJzEnXG4gKiAgIGFwcFZlcnNpb246ICcxLjAuMCcgb3IgJzEuMCcgb3IgJzEnXG4gKiAgIHdlZXhWZXJzaW9uOiAnMS4wLjAnIG9yICcxLjAnIG9yICcxJ1xuICogICBkRGV2aWNlTW9kZWw6ICdNT0RFTF9OQU1FJ1xuICogfVxuICpcbiAqIGRvd25ncmFkZSBjb25maWcoY29uZmlnKVxuICoge1xuICogICBpb3M6IHtcbiAqICAgICBvc1ZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIGFwcFZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIHdlZXhWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBkZXZpY2VNb2RlbDogWydtb2RlbEEnLCAnbW9kZWxCJywgLi4uXVxuICogICB9LFxuICogICBhbmRyb2lkOiB7XG4gKiAgICAgb3NWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBhcHBWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICB3ZWV4VmVyc2lvbjogJz4xLjAuMCcgb3IgJz49MS4wLjAnIG9yICc8MS4wLjAnIG9yICc8PTEuMC4wJyBvciAnMS4wLjAnXG4gKiAgICAgZGV2aWNlTW9kZWw6IFsnbW9kZWxBJywgJ21vZGVsQicsIC4uLl1cbiAqICAgfVxuICogfVxuICpcbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRldmljZUluZm8gV2VleCBTREsgZnJhbWV3b3JrIGlucHV0XG4gKiBAcGFyYW0gIHtvYmplY3R9IGNvbmZpZyAgICAgdXNlciBpbnB1dFxuICogQHJldHVybiB7T2JqZWN0fSAgICAgICAgICAgIHsgaXNEb3duZ3JhZGU6IHRydWUvZmFsc2UsIGVycm9yTWVzc2FnZS4uLiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVjayAoY29uZmlnLCBkZXZpY2VJbmZvKSB7XG4gIGRldmljZUluZm8gPSBkZXZpY2VJbmZvIHx8IGdsb2JhbC5XWEVudmlyb25tZW50XG4gIGRldmljZUluZm8gPSBpc1BsYWluT2JqZWN0KGRldmljZUluZm8pID8gZGV2aWNlSW5mbyA6IHt9XG5cbiAgbGV0IHJlc3VsdCA9IHtcbiAgICBpc0Rvd25ncmFkZTogZmFsc2UgLy8gZGVmYXV0bCBpcyBwYXNzXG4gIH1cblxuICBpZiAodHlwb2YoY29uZmlnKSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxldCBjdXN0b21Eb3duZ3JhZGUgPSBjb25maWcuY2FsbCh0aGlzLCBkZXZpY2VJbmZvLCB7XG4gICAgICBzZW12ZXI6IHNlbXZlcixcbiAgICAgIG5vcm1hbGl6ZVZlcnNpb25cbiAgICB9KVxuXG4gICAgY3VzdG9tRG93bmdyYWRlID0gISFjdXN0b21Eb3duZ3JhZGVcblxuICAgIHJlc3VsdCA9IGN1c3RvbURvd25ncmFkZSA/IGdldEVycm9yKCdjdXN0b20nLCAnJywgJ2N1c3RvbSBwYXJhbXMnKSA6IHJlc3VsdFxuICB9XG4gIGVsc2Uge1xuICAgIGNvbmZpZyA9IGlzUGxhaW5PYmplY3QoY29uZmlnKSA/IGNvbmZpZyA6IHt9XG5cbiAgICBjb25zdCBwbGF0Zm9ybSA9IGRldmljZUluZm8ucGxhdGZvcm0gfHwgJ3Vua25vdydcbiAgICBjb25zdCBkUGxhdGZvcm0gPSBwbGF0Zm9ybS50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgY09iaiA9IGNvbmZpZ1tkUGxhdGZvcm1dIHx8IHt9XG5cbiAgICBmb3IgKGNvbnN0IGkgaW4gZGV2aWNlSW5mbykge1xuICAgICAgY29uc3Qga2V5ID0gaVxuICAgICAgY29uc3Qga2V5TG93ZXIgPSBrZXkudG9Mb3dlckNhc2UoKVxuICAgICAgY29uc3QgdmFsID0gZGV2aWNlSW5mb1tpXVxuICAgICAgY29uc3QgaXNWZXJzaW9uID0ga2V5TG93ZXIuaW5kZXhPZigndmVyc2lvbicpID49IDBcbiAgICAgIGNvbnN0IGlzRGV2aWNlTW9kZWwgPSBrZXlMb3dlci5pbmRleE9mKCdkZXZpY2Vtb2RlbCcpID49IDBcbiAgICAgIGNvbnN0IGNyaXRlcmlhID0gY09ialtpXVxuXG4gICAgICBpZiAoY3JpdGVyaWEgJiYgaXNWZXJzaW9uKSB7XG4gICAgICAgIGNvbnN0IGMgPSBub3JtYWxpemVWZXJzaW9uKGNyaXRlcmlhKVxuICAgICAgICBjb25zdCBkID0gbm9ybWFsaXplVmVyc2lvbihkZXZpY2VJbmZvW2ldKVxuXG4gICAgICAgIGlmIChzZW12ZXIuc2F0aXNmaWVzKGQsIGMpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZ2V0RXJyb3Ioa2V5LCB2YWwsIGNyaXRlcmlhKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGlzRGV2aWNlTW9kZWwpIHtcbiAgICAgICAgY29uc3QgX2NyaXRlcmlhID0gdHlwb2YoY3JpdGVyaWEpID09PSAnYXJyYXknID8gY3JpdGVyaWEgOiBbY3JpdGVyaWFdXG4gICAgICAgIGlmIChfY3JpdGVyaWEuaW5kZXhPZih2YWwpID49IDApIHtcbiAgICAgICAgICByZXN1bHQgPSBnZXRFcnJvcihrZXksIHZhbCwgY3JpdGVyaWEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFZpZXdwb3J0IChhcHAsIGNvbmZpZ3MgPSB7fSkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gU2V0IHZpZXdwb3J0ICh3aWR0aDogJHtjb25maWdzLndpZHRofSkgZm9yIGFwcCMke2FwcC5pZH0uYClcbiAgICB2YWxpZGF0ZVZpZXdwb3J0KGNvbmZpZ3MpXG4gIH1cblxuICAvLyBTZW5kIHZpZXdwb3J0IGNvbmZpZ3MgdG8gbmF0aXZlXG4gIGlmIChhcHAgJiYgYXBwLmNhbGxUYXNrcykge1xuICAgIHJldHVybiBhcHAuY2FsbFRhc2tzKFt7XG4gICAgICBtb2R1bGU6ICdtZXRhJyxcbiAgICAgIG1ldGhvZDogJ3NldFZpZXdwb3J0JyxcbiAgICAgIGFyZ3M6IFtjb25maWdzXVxuICAgIH1dKVxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIENhbid0IGZpbmQgXCJjYWxsVGFza3NcIiBtZXRob2Qgb24gY3VycmVudCBhcHAuYClcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoZSB2aWV3cG9ydCBjb25maWcuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVWaWV3cG9ydCAoY29uZmlncyA9IHt9KSB7XG4gIGNvbnN0IHsgd2lkdGggfSA9IGNvbmZpZ3NcbiAgaWYgKHdpZHRoKSB7XG4gICAgaWYgKHR5cGVvZiB3aWR0aCAhPT0gJ251bWJlcicgJiYgd2lkdGggIT09ICdkZXZpY2Utd2lkdGgnKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtKUyBGcmFtZXdvcmtdIE5vdCBzdXBwb3J0IHRvIHVzZSAke3dpZHRofSBhcyB2aWV3cG9ydCB3aWR0aC5gKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSB0aGUgdmlld3BvcnQgY29uZmlnIHNob3VsZCBjb250YWluIHRoZSBcIndpZHRoXCIgcHJvcGVydHkuJylcbiAgcmV0dXJuIGZhbHNlXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJ1xuaW1wb3J0IFZtIGZyb20gJy4uLy4uL3ZtL2luZGV4J1xuaW1wb3J0ICogYXMgZG93bmdyYWRlIGZyb20gJy4uL2Rvd25ncmFkZSdcbmltcG9ydCB7IHNldFZpZXdwb3J0IH0gZnJvbSAnLi4vdmlld3BvcnQnXG5pbXBvcnQge1xuICByZXF1aXJlQ3VzdG9tQ29tcG9uZW50XG59IGZyb20gJy4uL3JlZ2lzdGVyJ1xuaW1wb3J0IHtcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNXZWV4Q29tcG9uZW50LFxuICBpc05wbU1vZHVsZSxcbiAgcmVtb3ZlV2VleFByZWZpeCxcbiAgcmVtb3ZlSlNTdXJmaXhcbn0gZnJvbSAnLi4vLi4vdXRpbC9pbmRleCdcblxuLyoqXG4gKiBib290c3RyYXAgYXBwIGZyb20gYSBjZXJ0YWluIGN1c3RvbSBjb21wb25lbnQgd2l0aCBjb25maWcgJiBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXAgKGFwcCwgbmFtZSwgY29uZmlnLCBkYXRhKSB7XG4gIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIGJvb3RzdHJhcCBmb3IgJHtuYW1lfWApXG5cbiAgLy8gMS4gdmFsaWRhdGUgY3VzdG9tIGNvbXBvbmVudCBuYW1lIGZpcnN0XG4gIGxldCBjbGVhbk5hbWVcbiAgaWYgKGlzV2VleENvbXBvbmVudChuYW1lKSkge1xuICAgIGNsZWFuTmFtZSA9IHJlbW92ZVdlZXhQcmVmaXgobmFtZSlcbiAgfVxuICBlbHNlIGlmIChpc05wbU1vZHVsZShuYW1lKSkge1xuICAgIGNsZWFuTmFtZSA9IHJlbW92ZUpTU3VyZml4KG5hbWUpXG4gICAgLy8gY2hlY2sgaWYgZGVmaW5lIGJ5IG9sZCAnZGVmaW5lJyBtZXRob2RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoIXJlcXVpcmVDdXN0b21Db21wb25lbnQoYXBwLCBjbGVhbk5hbWUpKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKGBJdCdzIG5vdCBhIGNvbXBvbmVudDogJHtuYW1lfWApXG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYFdyb25nIGNvbXBvbmVudCBuYW1lOiAke25hbWV9YClcbiAgfVxuXG4gIC8vIDIuIHZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cbiAgY29uZmlnID0gaXNQbGFpbk9iamVjdChjb25maWcpID8gY29uZmlnIDoge31cbiAgLy8gMi4xIHRyYW5zZm9ybWVyIHZlcnNpb24gY2hlY2tcbiAgaWYgKHR5cGVvZiBjb25maWcudHJhbnNmb3JtZXJWZXJzaW9uID09PSAnc3RyaW5nJyAmJlxuICAgIHR5cGVvZiBnbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9uID09PSAnc3RyaW5nJyAmJlxuICAgICFzZW12ZXIuc2F0aXNmaWVzKGNvbmZpZy50cmFuc2Zvcm1lclZlcnNpb24sXG4gICAgICBnbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9uKSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoYEpTIEJ1bmRsZSB2ZXJzaW9uOiAke2NvbmZpZy50cmFuc2Zvcm1lclZlcnNpb259IGAgK1xuICAgICAgYG5vdCBjb21wYXRpYmxlIHdpdGggJHtnbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9ufWApXG4gIH1cbiAgLy8gMi4yIGRvd25ncmFkZSB2ZXJzaW9uIGNoZWNrXG4gIGNvbnN0IGRvd25ncmFkZVJlc3VsdCA9IGRvd25ncmFkZS5jaGVjayhjb25maWcuZG93bmdyYWRlKVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgaWYgKGRvd25ncmFkZVJlc3VsdC5pc0Rvd25ncmFkZSkge1xuICAgIGFwcC5jYWxsVGFza3MoW3tcbiAgICAgIG1vZHVsZTogJ2luc3RhbmNlV3JhcCcsXG4gICAgICBtZXRob2Q6ICdlcnJvcicsXG4gICAgICBhcmdzOiBbXG4gICAgICAgIGRvd25ncmFkZVJlc3VsdC5lcnJvclR5cGUsXG4gICAgICAgIGRvd25ncmFkZVJlc3VsdC5jb2RlLFxuICAgICAgICBkb3duZ3JhZGVSZXN1bHQuZXJyb3JNZXNzYWdlXG4gICAgICBdXG4gICAgfV0pXG4gICAgcmV0dXJuIG5ldyBFcnJvcihgRG93bmdyYWRlWyR7ZG93bmdyYWRlUmVzdWx0LmNvZGV9XTogJHtkb3duZ3JhZGVSZXN1bHQuZXJyb3JNZXNzYWdlfWApXG4gIH1cblxuICAvLyBzZXQgdmlld3BvcnRcbiAgaWYgKGNvbmZpZy52aWV3cG9ydCkge1xuICAgIHNldFZpZXdwb3J0KGFwcCwgY29uZmlnLnZpZXdwb3J0KVxuICB9XG5cbiAgLy8gMy4gY3JlYXRlIGEgbmV3IFZtIHdpdGggY3VzdG9tIGNvbXBvbmVudCBuYW1lIGFuZCBkYXRhXG4gIGFwcC52bSA9IG5ldyBWbShjbGVhbk5hbWUsIG51bGwsIHsgX2FwcDogYXBwIH0sIG51bGwsIGRhdGEpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIGlzV2VleENvbXBvbmVudCxcbiAgaXNXZWV4TW9kdWxlLFxuICBpc05vcm1hbE1vZHVsZSxcbiAgaXNOcG1Nb2R1bGUsXG4gIHJlbW92ZVdlZXhQcmVmaXgsXG4gIHJlbW92ZUpTU3VyZml4XG59IGZyb20gJy4uLy4uL3V0aWwvaW5kZXgnXG5pbXBvcnQge1xuICByZWdpc3RlckN1c3RvbUNvbXBvbmVudCxcbiAgcmVxdWlyZUN1c3RvbUNvbXBvbmVudCxcbiAgaW5pdE1vZHVsZXNcbn0gZnJvbSAnLi4vcmVnaXN0ZXInXG5cbi8qKlxuICogZGVmaW5lKG5hbWUsIGZhY3RvcnkpIGZvciBwcmltYXJ5IHVzYWdlXG4gKiBvclxuICogZGVmaW5lKG5hbWUsIGRlcHMsIGZhY3RvcnkpIGZvciBjb21wYXRpYmlsaXR5XG4gKiBOb3RpY2U6IERPIE5PVCB1c2UgZnVuY3Rpb24gZGVmaW5lKCkge30sXG4gKiBpdCB3aWxsIGNhdXNlIGVycm9yIGFmdGVyIGJ1aWxkZWQgYnkgd2VicGFja1xuICovXG5leHBvcnQgY29uc3QgZGVmaW5lRm4gPSBmdW5jdGlvbiAoYXBwLCBuYW1lLCAuLi5hcmdzKSB7XG4gIGNvbnNvbGUuZGVidWcoYFtKUyBGcmFtZXdvcmtdIGRlZmluZSBhIGNvbXBvbmVudCAke25hbWV9YClcblxuICAvLyBhZGFwdCBhcmdzOlxuICAvLyAxLiBuYW1lLCBkZXBzW10sIGZhY3RvcnkoKVxuICAvLyAyLiBuYW1lLCBmYWN0b3J5KClcbiAgLy8gMy4gbmFtZSwgZGVmaW5pdGlvbnt9XG4gIGxldCBmYWN0b3J5LCBkZWZpbml0aW9uXG4gIGlmIChhcmdzLmxlbmd0aCA+IDEpIHtcbiAgICBkZWZpbml0aW9uID0gYXJnc1sxXVxuICB9XG4gIGVsc2Uge1xuICAgIGRlZmluaXRpb24gPSBhcmdzWzBdXG4gIH1cbiAgaWYgKHR5cGVvZiBkZWZpbml0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZmFjdG9yeSA9IGRlZmluaXRpb25cbiAgICBkZWZpbml0aW9uID0gbnVsbFxuICB9XG5cbiAgLy8gcmVzb2x2ZSBkZWZpbml0aW9uIGZyb20gZmFjdG9yeVxuICBpZiAoZmFjdG9yeSkge1xuICAgIGNvbnN0IHIgPSAobmFtZSkgPT4ge1xuICAgICAgaWYgKGlzV2VleENvbXBvbmVudChuYW1lKSkge1xuICAgICAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVXZWV4UHJlZml4KG5hbWUpXG4gICAgICAgIHJldHVybiByZXF1aXJlQ3VzdG9tQ29tcG9uZW50KGFwcCwgY2xlYW5OYW1lKVxuICAgICAgfVxuICAgICAgaWYgKGlzV2VleE1vZHVsZShuYW1lKSkge1xuICAgICAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVXZWV4UHJlZml4KG5hbWUpXG4gICAgICAgIHJldHVybiBhcHAucmVxdWlyZU1vZHVsZShjbGVhbk5hbWUpXG4gICAgICB9XG4gICAgICBpZiAoaXNOb3JtYWxNb2R1bGUobmFtZSkgfHwgaXNOcG1Nb2R1bGUobmFtZSkpIHtcbiAgICAgICAgY29uc3QgY2xlYW5OYW1lID0gcmVtb3ZlSlNTdXJmaXgobmFtZSlcbiAgICAgICAgcmV0dXJuIGFwcC5jb21tb25Nb2R1bGVzW2NsZWFuTmFtZV1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbSA9IHsgZXhwb3J0czoge319XG4gICAgZmFjdG9yeShyLCBtLmV4cG9ydHMsIG0pXG4gICAgZGVmaW5pdGlvbiA9IG0uZXhwb3J0c1xuICB9XG5cbiAgLy8gYXBwbHkgZGVmaW5pdGlvblxuICBpZiAoaXNXZWV4Q29tcG9uZW50KG5hbWUpKSB7XG4gICAgY29uc3QgY2xlYW5OYW1lID0gcmVtb3ZlV2VleFByZWZpeChuYW1lKVxuICAgIHJlZ2lzdGVyQ3VzdG9tQ29tcG9uZW50KGFwcCwgY2xlYW5OYW1lLCBkZWZpbml0aW9uKVxuICB9XG4gIGVsc2UgaWYgKGlzV2VleE1vZHVsZShuYW1lKSkge1xuICAgIGNvbnN0IGNsZWFuTmFtZSA9IHJlbW92ZVdlZXhQcmVmaXgobmFtZSlcbiAgICBpbml0TW9kdWxlcyh7IFtjbGVhbk5hbWVdOiBkZWZpbml0aW9uIH0pXG4gIH1cbiAgZWxzZSBpZiAoaXNOb3JtYWxNb2R1bGUobmFtZSkpIHtcbiAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVKU1N1cmZpeChuYW1lKVxuICAgIGFwcC5jb21tb25Nb2R1bGVzW2NsZWFuTmFtZV0gPSBkZWZpbml0aW9uXG4gIH1cbiAgZWxzZSBpZiAoaXNOcG1Nb2R1bGUobmFtZSkpIHtcbiAgICBjb25zdCBjbGVhbk5hbWUgPSByZW1vdmVKU1N1cmZpeChuYW1lKVxuICAgIGlmIChkZWZpbml0aW9uLnRlbXBsYXRlIHx8XG4gICAgICAgIGRlZmluaXRpb24uc3R5bGUgfHxcbiAgICAgICAgZGVmaW5pdGlvbi5tZXRob2RzKSB7XG4gICAgICAvLyBkb3duZ3JhZGUgdG8gb2xkIGRlZmluZSBtZXRob2QgKGRlZmluZSgnY29tcG9uZW50TmFtZScsIGZhY3RvcnkpKVxuICAgICAgLy8gdGhlIGV4cG9ydHMgY29udGFpbiBvbmUga2V5IG9mIHRlbXBsYXRlLCBzdHlsZSBvciBtZXRob2RzXG4gICAgICAvLyBidXQgaXQgaGFzIHJpc2shISFcbiAgICAgIHJlZ2lzdGVyQ3VzdG9tQ29tcG9uZW50KGFwcCwgY2xlYW5OYW1lLCBkZWZpbml0aW9uKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGFwcC5jb21tb25Nb2R1bGVzW2NsZWFuTmFtZV0gPSBkZWZpbml0aW9uXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyIChhcHAsIHR5cGUsIG9wdGlvbnMpIHtcbiAgY29uc29sZS53YXJuKCdbSlMgRnJhbWV3b3JrXSBSZWdpc3RlciBpcyBkZXByZWNhdGVkLCBwbGVhc2UgaW5zdGFsbCBsYXN0ZXN0IHRyYW5zZm9ybWVyLicpXG4gIHJlZ2lzdGVyQ3VzdG9tQ29tcG9uZW50KGFwcCwgdHlwZSwgb3B0aW9ucylcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBhcGkgdGhhdCBpbnZva2VkIGJ5IGpzIGJ1bmRsZSBjb2RlXG4gKlxuICogLSBkZWZpbmUobmFtZSwgZmFjdG9yeSk6IGRlZmluZSBhIG5ldyBjb21wb3NlZCBjb21wb25lbnQgdHlwZVxuICogLSBib290c3RyYXAodHlwZSwgY29uZmlnLCBkYXRhKTogcmVxdWlyZSBhIGNlcnRhaW4gdHlwZSAmXG4gKiAgICAgICAgIHJlbmRlciB3aXRoIChvcHRpb25hbCkgZGF0YVxuICpcbiAqIGRlcHJlY2F0ZWQ6XG4gKiAtIHJlZ2lzdGVyKHR5cGUsIG9wdGlvbnMpOiByZWdpc3RlciBhIG5ldyBjb21wb3NlZCBjb21wb25lbnQgdHlwZVxuICogLSByZW5kZXIodHlwZSwgZGF0YSk6IHJlbmRlciBieSBhIGNlcnRhaW4gdHlwZSB3aXRoIChvcHRpb25hbCkgZGF0YVxuICogLSByZXF1aXJlKHR5cGUpKGRhdGEpOiByZXF1aXJlIGEgdHlwZSB0aGVuIHJlbmRlciB3aXRoIGRhdGFcbiAqL1xuXG5leHBvcnQgeyBib290c3RyYXAgfSBmcm9tICcuL2Jvb3RzdHJhcCdcbmV4cG9ydCB7IGRlZmluZUZuLCByZWdpc3RlciB9IGZyb20gJy4vZGVmaW5lJ1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIGluc3RhbmNlIGNvbnRyb2xzIGZyb20gbmF0aXZlXG4gKlxuICogLSBmaXJlIGV2ZW50XG4gKiAtIGNhbGxiYWNrXG4gKiAtIHJlZnJlc2hcbiAqIC0gZGVzdHJveVxuICpcbiAqIGNvcnJlc3BvbmRlZCB3aXRoIHRoZSBBUEkgb2YgaW5zdGFuY2UgbWFuYWdlciAoZnJhbWV3b3JrLmpzKVxuICovXG5pbXBvcnQgeyBleHRlbmQsIHR5cG9mIH0gZnJvbSAnLi4vLi4vdXRpbC9pbmRleCdcblxuLyoqXG4gKiBSZWZyZXNoIGFuIGFwcCB3aXRoIGRhdGEgdG8gaXRzIHJvb3QgY29tcG9uZW50IG9wdGlvbnMuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwcFxuICogQHBhcmFtICB7YW55fSAgICBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoIChhcHAsIGRhdGEpIHtcbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gUmVmcmVzaCB3aXRoYCwgZGF0YSxcbiAgICAgICAgICAgIGBpbiBpbnN0YW5jZVske2FwcC5pZH1dYClcbiAgY29uc3Qgdm0gPSBhcHAudm1cbiAgaWYgKHZtICYmIGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIHZtLnJlZnJlc2hEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2bS5yZWZyZXNoRGF0YShkYXRhKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGV4dGVuZCh2bSwgZGF0YSlcbiAgICB9XG4gICAgYXBwLmRpZmZlci5mbHVzaCgpXG4gICAgYXBwLmRvYy50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAncmVmcmVzaEZpbmlzaCcgfSwgW10pXG4gICAgcmV0dXJuXG4gIH1cbiAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBkYXRhIFwiJHtkYXRhfVwiYClcbn1cblxuLyoqXG4gKiBEZXN0cm95IGFuIGFwcC5cbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95IChhcHApIHtcbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gRGVzdG9yeSBhbiBpbnN0YW5jZSgke2FwcC5pZH0pYClcblxuICBpZiAoYXBwLnZtKSB7XG4gICAgZGVzdHJveVZtKGFwcC52bSlcbiAgfVxuXG4gIGFwcC5pZCA9ICcnXG4gIGFwcC5vcHRpb25zID0gbnVsbFxuICBhcHAuYmxvY2tzID0gbnVsbFxuICBhcHAudm0gPSBudWxsXG4gIGFwcC5kb2MudGFza0NlbnRlci5kZXN0cm95Q2FsbGJhY2soKVxuICBhcHAuZG9jLmRlc3Ryb3koKVxuICBhcHAuZG9jID0gbnVsbFxuICBhcHAuY3VzdG9tQ29tcG9uZW50TWFwID0gbnVsbFxuICBhcHAuY29tbW9uTW9kdWxlcyA9IG51bGxcbn1cblxuLyoqXG4gKiBEZXN0cm95IGFuIFZtLlxuICogQHBhcmFtIHtvYmplY3R9IHZtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95Vm0gKHZtKSB7XG4gIGRlbGV0ZSB2bS5fYXBwXG4gIGRlbGV0ZSB2bS5fY29tcHV0ZWRcbiAgZGVsZXRlIHZtLl9jc3NcbiAgZGVsZXRlIHZtLl9kYXRhXG4gIGRlbGV0ZSB2bS5faWRzXG4gIGRlbGV0ZSB2bS5fbWV0aG9kc1xuICBkZWxldGUgdm0uX29wdGlvbnNcbiAgZGVsZXRlIHZtLl9wYXJlbnRcbiAgZGVsZXRlIHZtLl9wYXJlbnRFbFxuICBkZWxldGUgdm0uX3Jvb3RFbFxuXG4gIC8vIHJlbW92ZSBhbGwgd2F0Y2hlcnNcbiAgaWYgKHZtLl93YXRjaGVycykge1xuICAgIGxldCB3YXRjaGVyQ291bnQgPSB2bS5fd2F0Y2hlcnMubGVuZ3RoXG4gICAgd2hpbGUgKHdhdGNoZXJDb3VudC0tKSB7XG4gICAgICB2bS5fd2F0Y2hlcnNbd2F0Y2hlckNvdW50XS50ZWFyZG93bigpXG4gICAgfVxuICAgIGRlbGV0ZSB2bS5fd2F0Y2hlcnNcbiAgfVxuXG4gIC8vIGRlc3Ryb3kgY2hpbGQgdm1zIHJlY3Vyc2l2ZWx5XG4gIGlmICh2bS5fY2hpbGRyZW5WbXMpIHtcbiAgICBsZXQgdm1Db3VudCA9IHZtLl9jaGlsZHJlblZtcy5sZW5ndGhcbiAgICB3aGlsZSAodm1Db3VudC0tKSB7XG4gICAgICBkZXN0cm95Vm0odm0uX2NoaWxkcmVuVm1zW3ZtQ291bnRdKVxuICAgIH1cbiAgICBkZWxldGUgdm0uX2NoaWxkcmVuVm1zXG4gIH1cblxuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBcImRlc3Ryb3llZFwiIGxpZmVjeWNsZSBpbiBWbSgke3ZtLl90eXBlfSlgKVxuICB2bS4kZW1pdCgnaG9vazpkZXN0cm95ZWQnKVxuXG4gIGRlbGV0ZSB2bS5fdHlwZVxuICBkZWxldGUgdm0uX3ZtRXZlbnRzXG59XG5cbi8qKlxuICogR2V0IGEgSlNPTiBvYmplY3QgdG8gZGVzY3JpYmUgdGhlIGRvY3VtZW50IGJvZHkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwcFxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9vdEVsZW1lbnQgKGFwcCkge1xuICBjb25zdCBkb2MgPSBhcHAuZG9jIHx8IHt9XG4gIGNvbnN0IGJvZHkgPSBkb2MuYm9keSB8fCB7fVxuICByZXR1cm4gYm9keS50b0pTT04gPyBib2R5LnRvSlNPTigpIDoge31cbn1cblxuLyoqXG4gKiBGaXJlIGFuIGV2ZW50IGZyb20gcmVuZGVyZXIuIFRoZSBldmVudCBoYXMgdHlwZSwgYW4gZXZlbnQgb2JqZWN0IGFuZCBhblxuICogZWxlbWVudCByZWYuIElmIHRoZSBldmVudCBjb21lcyB3aXRoIHNvbWUgdmlydHVhbC1ET00gY2hhbmdlcywgaXQgc2hvdWxkXG4gKiBoYXZlIG9uZSBtb3JlIHBhcmFtZXRlciB0byBkZXNjcmliZSB0aGUgY2hhbmdlcy5cbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHJlZlxuICogQHBhcmFtICB7dHlwZX0gICB0eXBlXG4gKiBAcGFyYW0gIHtvYmplY3R9IGVcbiAqIEBwYXJhbSAge29iamVjdH0gZG9tQ2hhbmdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmlyZUV2ZW50IChhcHAsIHJlZiwgdHlwZSwgZSwgZG9tQ2hhbmdlcykge1xuICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBGaXJlIGEgXCIke3R5cGV9XCIgZXZlbnQgb24gYW4gZWxlbWVudCgke3JlZn0pIGluIGluc3RhbmNlKCR7YXBwLmlkfSlgKVxuICBpZiAoQXJyYXkuaXNBcnJheShyZWYpKSB7XG4gICAgcmVmLnNvbWUoKHJlZikgPT4ge1xuICAgICAgcmV0dXJuIGZpcmVFdmVudChhcHAsIHJlZiwgdHlwZSwgZSkgIT09IGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBlbCA9IGFwcC5kb2MuZ2V0UmVmKHJlZilcbiAgaWYgKGVsKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXBwLmRvYy5maXJlRXZlbnQoZWwsIHR5cGUsIGUsIGRvbUNoYW5nZXMpXG4gICAgYXBwLmRpZmZlci5mbHVzaCgpXG4gICAgYXBwLmRvYy50YXNrQ2VudGVyLnNlbmQoJ2RvbScsIHsgYWN0aW9uOiAndXBkYXRlRmluaXNoJyB9LCBbXSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBlbGVtZW50IHJlZmVyZW5jZSBcIiR7cmVmfVwiYClcbn1cblxuLyoqXG4gKiBNYWtlIGEgY2FsbGJhY2sgZm9yIGEgY2VydGFpbiBhcHAuXG4gKiBAcGFyYW0gIHtvYmplY3R9ICAgYXBwXG4gKiBAcGFyYW0gIHtudW1iZXJ9ICAgY2FsbGJhY2tJZFxuICogQHBhcmFtICB7YW55fSAgICAgIGRhdGFcbiAqIEBwYXJhbSAge2Jvb2xlYW59ICBpZktlZXBBbGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsbGJhY2sgKGFwcCwgY2FsbGJhY2tJZCwgZGF0YSwgaWZLZWVwQWxpdmUpIHtcbiAgY29uc29sZS5kZWJ1ZyhgW0pTIEZyYW1ld29ya10gSW52b2tlIGEgY2FsbGJhY2soJHtjYWxsYmFja0lkfSkgd2l0aGAsIGRhdGEsXG4gICAgICAgICAgICBgaW4gaW5zdGFuY2UoJHthcHAuaWR9KWApXG4gIGNvbnN0IHJlc3VsdCA9IGFwcC5kb2MudGFza0NlbnRlci5jYWxsYmFjayhjYWxsYmFja0lkLCBkYXRhLCBpZktlZXBBbGl2ZSlcbiAgdXBkYXRlQWN0aW9ucyhhcHApXG4gIGFwcC5kb2MudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ3VwZGF0ZUZpbmlzaCcgfSwgW10pXG4gIHJldHVybiByZXN1bHRcbn1cblxuLyoqXG4gKiBDb2xsZWN0IGFsbCB2aXJ0dWFsLURPTSBtdXRhdGlvbnMgdG9nZXRoZXIgYW5kIHNlbmQgdGhlbSB0byByZW5kZXJlci5cbiAqIEBwYXJhbSAge29iamVjdH0gYXBwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBY3Rpb25zIChhcHApIHtcbiAgYXBwLmRpZmZlci5mbHVzaCgpXG59XG5cbi8qKlxuICogQ2FsbCBhbGwgdGFza3MgZnJvbSBhbiBhcHAgdG8gcmVuZGVyZXIgKG5hdGl2ZSkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwcFxuICogQHBhcmFtICB7YXJyYXl9ICB0YXNrc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsbFRhc2tzIChhcHAsIHRhc2tzKSB7XG4gIGxldCByZXN1bHRcblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAodHlwb2YodGFza3MpICE9PSAnYXJyYXknKSB7XG4gICAgdGFza3MgPSBbdGFza3NdXG4gIH1cblxuICB0YXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgIHJlc3VsdCA9IGFwcC5kb2MudGFza0NlbnRlci5zZW5kKFxuICAgICAgJ21vZHVsZScsXG4gICAgICB7XG4gICAgICAgIG1vZHVsZTogdGFzay5tb2R1bGUsXG4gICAgICAgIG1ldGhvZDogdGFzay5tZXRob2RcbiAgICAgIH0sXG4gICAgICB0YXNrLmFyZ3NcbiAgICApXG4gIH0pXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIGluc3RhbmNlIGNvbnRyb2xzIGZyb20gbmF0aXZlXG4gKlxuICogLSBpbml0IGJ1bmRsZVxuICpcbiAqIGNvcnJlc3BvbmRlZCB3aXRoIHRoZSBBUEkgb2YgaW5zdGFuY2UgbWFuYWdlciAoZnJhbWV3b3JrLmpzKVxuICovXG5cbmltcG9ydCBWbSBmcm9tICcuLi8uLi92bS9pbmRleCdcbmltcG9ydCB7IHJlbW92ZVdlZXhQcmVmaXggfSBmcm9tICcuLi8uLi91dGlsL2luZGV4J1xuaW1wb3J0IHtcbiAgZGVmaW5lRm4sXG4gIGJvb3RzdHJhcCxcbiAgcmVnaXN0ZXJcbn0gZnJvbSAnLi4vYnVuZGxlL2luZGV4J1xuaW1wb3J0IHsgdXBkYXRlQWN0aW9ucyB9IGZyb20gJy4vbWlzYydcblxuLyoqXG4gKiBJbml0IGFuIGFwcCBieSBydW4gY29kZSB3aXRnaCBkYXRhXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwcFxuICogQHBhcmFtICB7c3RyaW5nfSBjb2RlXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXQgKGFwcCwgY29kZSwgZGF0YSwgc2VydmljZXMpIHtcbiAgY29uc29sZS5kZWJ1ZygnW0pTIEZyYW1ld29ya10gSW50aWFsaXplIGFuIGluc3RhbmNlIHdpdGg6XFxuJywgZGF0YSlcbiAgbGV0IHJlc3VsdFxuXG4gIC8vIHByZXBhcmUgYXBwIGVudiBtZXRob2RzXG4gIGNvbnN0IGJ1bmRsZURlZmluZSA9ICguLi5hcmdzKSA9PiBkZWZpbmVGbihhcHAsIC4uLmFyZ3MpXG4gIGNvbnN0IGJ1bmRsZUJvb3RzdHJhcCA9IChuYW1lLCBjb25maWcsIF9kYXRhKSA9PiB7XG4gICAgcmVzdWx0ID0gYm9vdHN0cmFwKGFwcCwgbmFtZSwgY29uZmlnLCBfZGF0YSB8fCBkYXRhKVxuICAgIHVwZGF0ZUFjdGlvbnMoYXBwKVxuICAgIGFwcC5kb2MubGlzdGVuZXIuY3JlYXRlRmluaXNoKClcbiAgICBjb25zb2xlLmRlYnVnKGBbSlMgRnJhbWV3b3JrXSBBZnRlciBpbnRpYWxpemVkIGFuIGluc3RhbmNlKCR7YXBwLmlkfSlgKVxuICB9XG4gIGNvbnN0IGJ1bmRsZVZtID0gVm1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgY29uc3QgYnVuZGxlUmVnaXN0ZXIgPSAoLi4uYXJncykgPT4gcmVnaXN0ZXIoYXBwLCAuLi5hcmdzKVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBjb25zdCBidW5kbGVSZW5kZXIgPSAobmFtZSwgX2RhdGEpID0+IHtcbiAgICByZXN1bHQgPSBib290c3RyYXAoYXBwLCBuYW1lLCB7fSwgX2RhdGEpXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgY29uc3QgYnVuZGxlUmVxdWlyZSA9IG5hbWUgPT4gX2RhdGEgPT4ge1xuICAgIHJlc3VsdCA9IGJvb3RzdHJhcChhcHAsIG5hbWUsIHt9LCBfZGF0YSlcbiAgfVxuICBjb25zdCBidW5kbGVEb2N1bWVudCA9IGFwcC5kb2NcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgY29uc3QgYnVuZGxlUmVxdWlyZU1vZHVsZSA9IG5hbWUgPT4gYXBwLnJlcXVpcmVNb2R1bGUocmVtb3ZlV2VleFByZWZpeChuYW1lKSlcblxuICBjb25zdCB3ZWV4R2xvYmFsT2JqZWN0ID0ge1xuICAgIGNvbmZpZzogYXBwLm9wdGlvbnMsXG4gICAgZGVmaW5lOiBidW5kbGVEZWZpbmUsXG4gICAgYm9vdHN0cmFwOiBidW5kbGVCb290c3RyYXAsXG4gICAgcmVxdWlyZU1vZHVsZTogYnVuZGxlUmVxdWlyZU1vZHVsZSxcbiAgICBkb2N1bWVudDogYnVuZGxlRG9jdW1lbnQsXG4gICAgVm06IGJ1bmRsZVZtXG4gIH1cblxuICBPYmplY3QuZnJlZXplKHdlZXhHbG9iYWxPYmplY3QpXG5cbiAgLy8gcHJlcGFyZSBjb2RlXG4gIGxldCBmdW5jdGlvbkJvZHlcbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmICh0eXBlb2YgY29kZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIGBmdW5jdGlvbiAoKSB7Li4ufWAgLT4gYHsuLi59YFxuICAgIC8vIG5vdCB2ZXJ5IHN0cmljdFxuICAgIGZ1bmN0aW9uQm9keSA9IGNvZGUudG9TdHJpbmcoKS5zdWJzdHIoMTIpXG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgZWxzZSBpZiAoY29kZSkge1xuICAgIGZ1bmN0aW9uQm9keSA9IGNvZGUudG9TdHJpbmcoKVxuICB9XG4gIC8vIHdyYXAgSUZGRSBhbmQgdXNlIHN0cmljdCBtb2RlXG4gIGZ1bmN0aW9uQm9keSA9IGAoZnVuY3Rpb24oZ2xvYmFsKXtcXG5cXG5cInVzZSBzdHJpY3RcIjtcXG5cXG4gJHtmdW5jdGlvbkJvZHl9IFxcblxcbn0pKE9iamVjdC5jcmVhdGUodGhpcykpYFxuXG4gIC8vIHJ1biBjb2RlIGFuZCBnZXQgcmVzdWx0XG4gIGNvbnN0IHsgV1hFbnZpcm9ubWVudCB9ID0gZ2xvYmFsXG4gIGNvbnN0IHRpbWVyQVBJcyA9IHt9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gIGlmIChXWEVudmlyb25tZW50ICYmIFdYRW52aXJvbm1lbnQucGxhdGZvcm0gIT09ICdXZWInKSB7XG4gICAgLy8gdGltZXIgQVBJcyBwb2x5ZmlsbCBpbiBuYXRpdmVcbiAgICBjb25zdCB0aW1lciA9IGFwcC5yZXF1aXJlTW9kdWxlKCd0aW1lcicpXG4gICAgT2JqZWN0LmFzc2lnbih0aW1lckFQSXMsIHtcbiAgICAgIHNldFRpbWVvdXQ6ICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYXJnc1swXSguLi5hcmdzLnNsaWNlKDIpKVxuICAgICAgICB9XG4gICAgICAgIHRpbWVyLnNldFRpbWVvdXQoaGFuZGxlciwgYXJnc1sxXSlcbiAgICAgICAgcmV0dXJuIGFwcC5kb2MudGFza0NlbnRlci5jYWxsYmFja01hbmFnZXIubGFzdENhbGxiYWNrSWQudG9TdHJpbmcoKVxuICAgICAgfSxcbiAgICAgIHNldEludGVydmFsOiAoLi4uYXJncykgPT4ge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGFyZ3NbMF0oLi4uYXJncy5zbGljZSgyKSlcbiAgICAgICAgfVxuICAgICAgICB0aW1lci5zZXRJbnRlcnZhbChoYW5kbGVyLCBhcmdzWzFdKVxuICAgICAgICByZXR1cm4gYXBwLmRvYy50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpXG4gICAgICB9LFxuICAgICAgY2xlYXJUaW1lb3V0OiAobikgPT4ge1xuICAgICAgICB0aW1lci5jbGVhclRpbWVvdXQobilcbiAgICAgIH0sXG4gICAgICBjbGVhckludGVydmFsOiAobikgPT4ge1xuICAgICAgICB0aW1lci5jbGVhckludGVydmFsKG4pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvLyBydW4gY29kZSBhbmQgZ2V0IHJlc3VsdFxuICBjb25zdCBnbG9iYWxPYmplY3RzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgZGVmaW5lOiBidW5kbGVEZWZpbmUsXG4gICAgcmVxdWlyZTogYnVuZGxlUmVxdWlyZSxcbiAgICBib290c3RyYXA6IGJ1bmRsZUJvb3RzdHJhcCxcbiAgICByZWdpc3RlcjogYnVuZGxlUmVnaXN0ZXIsXG4gICAgcmVuZGVyOiBidW5kbGVSZW5kZXIsXG4gICAgX193ZWV4X2RlZmluZV9fOiBidW5kbGVEZWZpbmUsIC8vIGFsaWFzIGZvciBkZWZpbmVcbiAgICBfX3dlZXhfYm9vdHN0cmFwX186IGJ1bmRsZUJvb3RzdHJhcCwgLy8gYWxpYXMgZm9yIGJvb3RzdHJhcFxuICAgIF9fd2VleF9kb2N1bWVudF9fOiBidW5kbGVEb2N1bWVudCxcbiAgICBfX3dlZXhfcmVxdWlyZV9fOiBidW5kbGVSZXF1aXJlTW9kdWxlLFxuICAgIF9fd2VleF92aWV3bW9kZWxfXzogYnVuZGxlVm0sXG4gICAgd2VleDogd2VleEdsb2JhbE9iamVjdFxuICB9LCB0aW1lckFQSXMsIHNlcnZpY2VzKVxuICBpZiAoIWNhbGxGdW5jdGlvbk5hdGl2ZShnbG9iYWxPYmplY3RzLCBmdW5jdGlvbkJvZHkpKSB7XG4gICAgLy8gSWYgZmFpbGVkIHRvIGNvbXBpbGUgZnVuY3Rpb25Cb2R5IG9uIG5hdGl2ZSBzaWRlLFxuICAgIC8vIGZhbGxiYWNrIHRvIGNhbGxGdW5jdGlvbi5cbiAgICBjYWxsRnVuY3Rpb24oZ2xvYmFsT2JqZWN0cywgZnVuY3Rpb25Cb2R5KVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIENhbGwgYSBuZXcgZnVuY3Rpb24gYm9keSB3aXRoIHNvbWUgZ2xvYmFsIG9iamVjdHMuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGdsb2JhbE9iamVjdHNcbiAqIEBwYXJhbSAge3N0cmluZ30gY29kZVxuICogQHJldHVybiB7YW55fVxuICovXG5mdW5jdGlvbiBjYWxsRnVuY3Rpb24gKGdsb2JhbE9iamVjdHMsIGJvZHkpIHtcbiAgY29uc3QgZ2xvYmFsS2V5cyA9IFtdXG4gIGNvbnN0IGdsb2JhbFZhbHVlcyA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIGdsb2JhbE9iamVjdHMpIHtcbiAgICBnbG9iYWxLZXlzLnB1c2goa2V5KVxuICAgIGdsb2JhbFZhbHVlcy5wdXNoKGdsb2JhbE9iamVjdHNba2V5XSlcbiAgfVxuICBnbG9iYWxLZXlzLnB1c2goYm9keSlcblxuICBjb25zdCByZXN1bHQgPSBuZXcgRnVuY3Rpb24oLi4uZ2xvYmFsS2V5cylcbiAgcmV0dXJuIHJlc3VsdCguLi5nbG9iYWxWYWx1ZXMpXG59XG5cbi8qKlxuICogQ2FsbCBhIG5ldyBmdW5jdGlvbiBnZW5lcmF0ZWQgb24gdGhlIFY4IG5hdGl2ZSBzaWRlLlxuICogQHBhcmFtICB7b2JqZWN0fSBnbG9iYWxPYmplY3RzXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGJvZHlcbiAqIEByZXR1cm4ge2Jvb2xlYW59IHJldHVybiB0cnVlIGlmIG5vIGVycm9yIG9jY3VycmVkLlxuICovXG5mdW5jdGlvbiBjYWxsRnVuY3Rpb25OYXRpdmUgKGdsb2JhbE9iamVjdHMsIGJvZHkpIHtcbiAgaWYgKHR5cGVvZiBjb21waWxlQW5kUnVuQnVuZGxlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBsZXQgZm4gPSB2b2lkIDBcbiAgbGV0IGlzTmF0aXZlQ29tcGlsZU9rID0gZmFsc2VcbiAgbGV0IHNjcmlwdCA9ICcoZnVuY3Rpb24gKCdcbiAgY29uc3QgZ2xvYmFsS2V5cyA9IFtdXG4gIGNvbnN0IGdsb2JhbFZhbHVlcyA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIGdsb2JhbE9iamVjdHMpIHtcbiAgICBnbG9iYWxLZXlzLnB1c2goa2V5KVxuICAgIGdsb2JhbFZhbHVlcy5wdXNoKGdsb2JhbE9iamVjdHNba2V5XSlcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGdsb2JhbEtleXMubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgc2NyaXB0ICs9IGdsb2JhbEtleXNbaV1cbiAgICBzY3JpcHQgKz0gJywnXG4gIH1cbiAgc2NyaXB0ICs9IGdsb2JhbEtleXNbZ2xvYmFsS2V5cy5sZW5ndGggLSAxXVxuICBzY3JpcHQgKz0gJykgeydcbiAgc2NyaXB0ICs9IGJvZHlcbiAgc2NyaXB0ICs9ICd9ICknXG5cbiAgdHJ5IHtcbiAgICBjb25zdCB3ZWV4ID0gZ2xvYmFsT2JqZWN0cy53ZWV4IHx8IHt9XG4gICAgY29uc3QgY29uZmlnID0gd2VleC5jb25maWcgfHwge31cbiAgICBmbiA9IGNvbXBpbGVBbmRSdW5CdW5kbGUoc2NyaXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYnVuZGxlVXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuYnVuZGxlRGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuY29kZUNhY2hlUGF0aClcbiAgICBpZiAoZm4gJiYgdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBmbiguLi5nbG9iYWxWYWx1ZXMpXG4gICAgICBpc05hdGl2ZUNvbXBpbGVPayA9IHRydWVcbiAgICB9XG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKGUpXG4gIH1cblxuICByZXR1cm4gaXNOYXRpdmVDb21waWxlT2tcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBpbnN0YW5jZSBjb250cm9scyBmcm9tIG5hdGl2ZVxuICpcbiAqIC0gaW5pdCBidW5kbGVcbiAqIC0gZmlyZSBldmVudFxuICogLSBjYWxsYmFja1xuICogLSBkZXN0cm95XG4gKlxuICogY29ycmVzcG9uZGVkIHdpdGggdGhlIEFQSSBvZiBpbnN0YW5jZSBtYW5hZ2VyIChmcmFtZXdvcmsuanMpXG4gKi9cbmV4cG9ydCB7IGluaXQgfSBmcm9tICcuL2luaXQnXG5cbmV4cG9ydCB7XG4gIHJlZnJlc2gsXG4gIGRlc3Ryb3ksXG4gIGdldFJvb3RFbGVtZW50LFxuICBmaXJlRXZlbnQsXG4gIGNhbGxiYWNrLFxuICB1cGRhdGVBY3Rpb25zLFxuICBjYWxsVGFza3Ncbn0gZnJvbSAnLi9taXNjJ1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEaWZmZXIge1xuICBjb25zdHJ1Y3RvciAoaWQpIHtcbiAgICB0aGlzLmlkID0gaWRcbiAgICB0aGlzLm1hcCA9IFtdXG4gICAgdGhpcy5ob29rcyA9IFtdXG4gIH1cbiAgaXNFbXB0eSAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmxlbmd0aCA9PT0gMFxuICB9XG4gIGFwcGVuZCAodHlwZSwgZGVwdGgsIHJlZiwgaGFuZGxlcikge1xuICAgIGlmICghdGhpcy5oYXNUaW1lcikge1xuICAgICAgdGhpcy5oYXNUaW1lciA9IHRydWVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmhhc1RpbWVyID0gZmFsc2VcbiAgICAgICAgdGhpcy5mbHVzaCh0cnVlKVxuICAgICAgfSwgMClcbiAgICB9XG4gICAgY29uc3QgbWFwID0gdGhpcy5tYXBcbiAgICBpZiAoIW1hcFtkZXB0aF0pIHtcbiAgICAgIG1hcFtkZXB0aF0gPSB7fVxuICAgIH1cbiAgICBjb25zdCBncm91cCA9IG1hcFtkZXB0aF1cbiAgICBpZiAoIWdyb3VwW3R5cGVdKSB7XG4gICAgICBncm91cFt0eXBlXSA9IHt9XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnZWxlbWVudCcpIHtcbiAgICAgIGlmICghZ3JvdXBbdHlwZV1bcmVmXSkge1xuICAgICAgICBncm91cFt0eXBlXVtyZWZdID0gW11cbiAgICAgIH1cbiAgICAgIGdyb3VwW3R5cGVdW3JlZl0ucHVzaChoYW5kbGVyKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGdyb3VwW3R5cGVdW3JlZl0gPSBoYW5kbGVyXG4gICAgfVxuICB9XG4gIGZsdXNoIChpc1RpbWVvdXQpIHtcbiAgICBjb25zdCBtYXAgPSB0aGlzLm1hcC5zbGljZSgpXG4gICAgdGhpcy5tYXAubGVuZ3RoID0gMFxuICAgIG1hcC5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgY2FsbFR5cGVNYXAoZ3JvdXAsICdyZXBlYXQnKVxuICAgICAgY2FsbFR5cGVNYXAoZ3JvdXAsICdzaG93bicpXG4gICAgICBjYWxsVHlwZUxpc3QoZ3JvdXAsICdlbGVtZW50JylcbiAgICB9KVxuXG4gICAgY29uc3QgaG9va3MgPSB0aGlzLmhvb2tzLnNsaWNlKClcbiAgICB0aGlzLmhvb2tzLmxlbmd0aCA9IDBcbiAgICBob29rcy5mb3JFYWNoKChmbikgPT4ge1xuICAgICAgZm4oKVxuICAgIH0pXG5cbiAgICBpZiAoIXRoaXMuaXNFbXB0eSgpKSB7XG4gICAgICB0aGlzLmZsdXNoKClcbiAgICB9XG4gIH1cbiAgdGhlbiAoZm4pIHtcbiAgICB0aGlzLmhvb2tzLnB1c2goZm4pXG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbFR5cGVNYXAgKGdyb3VwLCB0eXBlKSB7XG4gIGNvbnN0IG1hcCA9IGdyb3VwW3R5cGVdXG4gIGZvciAoY29uc3QgcmVmIGluIG1hcCkge1xuICAgIG1hcFtyZWZdKClcbiAgfVxufVxuXG5mdW5jdGlvbiBjYWxsVHlwZUxpc3QgKGdyb3VwLCB0eXBlKSB7XG4gIGNvbnN0IG1hcCA9IGdyb3VwW3R5cGVdXG4gIGZvciAoY29uc3QgcmVmIGluIG1hcCkge1xuICAgIGNvbnN0IGxpc3QgPSBtYXBbcmVmXVxuICAgIGxpc3QuZm9yRWFjaCgoaGFuZGxlcikgPT4geyBoYW5kbGVyKCkgfSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXdcbiAqIFdlZXggQXBwIGNvbnN0cnVjdG9yICYgZGVmaW5pdGlvblxuICovXG5cbmltcG9ydCBEaWZmZXIgZnJvbSAnLi9kaWZmZXInXG5pbXBvcnQgcmVuZGVyZXIgZnJvbSAnLi4vY29uZmlnJ1xuXG4vKipcbiAqIEFwcCBjb25zdHJ1Y3RvciBmb3IgV2VleCBmcmFtZXdvcmsuXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEFwcCAoaWQsIG9wdGlvbnMpIHtcbiAgdGhpcy5pZCA9IGlkXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy52bSA9IG51bGxcbiAgdGhpcy5jdXN0b21Db21wb25lbnRNYXAgPSB7fVxuICB0aGlzLmNvbW1vbk1vZHVsZXMgPSB7fVxuXG4gIC8vIGRvY3VtZW50XG4gIHRoaXMuZG9jID0gbmV3IHJlbmRlcmVyLkRvY3VtZW50KFxuICAgIGlkLFxuICAgIHRoaXMub3B0aW9ucy5idW5kbGVVcmwsXG4gICAgbnVsbCxcbiAgICByZW5kZXJlci5MaXN0ZW5lclxuICApXG4gIHRoaXMuZGlmZmVyID0gbmV3IERpZmZlcihpZClcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBXZWV4IGluc3RhbmNlIGNvbnN0cnVjdG9yICYgZGVmaW5pdGlvblxuICovXG5cbmltcG9ydCB7IHJlcXVpcmVNb2R1bGUgfSBmcm9tICcuL3JlZ2lzdGVyJ1xuaW1wb3J0IHsgdXBkYXRlQWN0aW9ucywgY2FsbFRhc2tzIH0gZnJvbSAnLi9jdHJsL2luZGV4J1xuaW1wb3J0IEFwcCBmcm9tICcuL2luc3RhbmNlJ1xuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbkFwcC5wcm90b3R5cGUucmVxdWlyZU1vZHVsZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiByZXF1aXJlTW9kdWxlKHRoaXMsIG5hbWUpXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuQXBwLnByb3RvdHlwZS51cGRhdGVBY3Rpb25zID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdXBkYXRlQWN0aW9ucyh0aGlzKVxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKi9cbkFwcC5wcm90b3R5cGUuY2FsbFRhc2tzID0gZnVuY3Rpb24gKHRhc2tzKSB7XG4gIHJldHVybiBjYWxsVGFza3ModGhpcywgdGFza3MpXG59XG5cbi8qKlxuICogUHJldmVudCBtb2RpZmljYXRpb24gb2YgQXBwIGFuZCBBcHAucHJvdG90eXBlXG4gKi9cbk9iamVjdC5mcmVlemUoQXBwKVxuT2JqZWN0LmZyZWV6ZShBcHAucHJvdG90eXBlKVxuXG5leHBvcnQgZGVmYXVsdCBBcHBcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGluc3RhbmNlTWFwID0ge31cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IEFwcCBmcm9tICcuLi9hcHAvaW5kZXgnXG5pbXBvcnQgeyBpbnN0YW5jZU1hcCB9IGZyb20gJy4vbWFwJ1xuaW1wb3J0IHsgaW5pdCBhcyBpbml0QXBwIH0gZnJvbSAnLi4vYXBwL2N0cmwvaW5kZXgnXG5pbXBvcnQgeyByZXNldFRhcmdldCB9IGZyb20gJy4uL2NvcmUvZGVwJ1xuXG4vKipcbiAqIENyZWF0ZSBhIFdlZXggaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHBhcmFtICB7c3RyaW5nfSBjb2RlXG4gKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnNcbiAqICAgICAgICAgb3B0aW9uIGBIQVNfTE9HYCBlbmFibGUgcHJpbnQgbG9nXG4gKiBAcGFyYW0gIHtvYmplY3R9IGRhdGFcbiAqIEBwYXJhbSAge29iamVjdH0gaW5mbyB7IGNyZWF0ZWQsIC4uLiBzZXJ2aWNlcyB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZSAoaWQsIGNvZGUsIG9wdGlvbnMsIGRhdGEsIGluZm8pIHtcbiAgY29uc3QgeyBzZXJ2aWNlcyB9ID0gaW5mbyB8fCB7fVxuICByZXNldFRhcmdldCgpXG4gIGxldCBpbnN0YW5jZSA9IGluc3RhbmNlTWFwW2lkXVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICBsZXQgcmVzdWx0XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICghaW5zdGFuY2UpIHtcbiAgICBpbnN0YW5jZSA9IG5ldyBBcHAoaWQsIG9wdGlvbnMpXG4gICAgaW5zdGFuY2VNYXBbaWRdID0gaW5zdGFuY2VcbiAgICByZXN1bHQgPSBpbml0QXBwKGluc3RhbmNlLCBjb2RlLCBkYXRhLCBzZXJ2aWNlcylcbiAgfVxuICBlbHNlIHtcbiAgICByZXN1bHQgPSBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxuICByZXR1cm4gKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSA/IHJlc3VsdCA6IGluc3RhbmNlXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCBjb25maWcgZnJvbSAnLi4vY29uZmlnJ1xuaW1wb3J0IHtcbiAgcmVmcmVzaCxcbiAgZGVzdHJveVxufSBmcm9tICcuLi9hcHAvY3RybC9pbmRleCdcbmltcG9ydCB7IGluc3RhbmNlTWFwIH0gZnJvbSAnLi9tYXAnXG5pbXBvcnQgeyByZXNldFRhcmdldCB9IGZyb20gJy4uL2NvcmUvZGVwJ1xuXG4vKipcbiAqIEluaXQgY29uZmlnIGluZm9ybWF0aW9ucyBmb3IgV2VleCBmcmFtZXdvcmtcbiAqIEBwYXJhbSAge29iamVjdH0gY2ZnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0IChjZmcpIHtcbiAgY29uZmlnLkRvY3VtZW50ID0gY2ZnLkRvY3VtZW50XG4gIGNvbmZpZy5FbGVtZW50ID0gY2ZnLkVsZW1lbnRcbiAgY29uZmlnLkNvbW1lbnQgPSBjZmcuQ29tbWVudFxuICBjb25maWcuc2VuZFRhc2tzID0gY2ZnLnNlbmRUYXNrc1xuICBjb25maWcuTGlzdGVuZXIgPSBjZmcuTGlzdGVuZXJcbn1cblxuLyoqXG4gKiBSZWZyZXNoIGEgV2VleCBpbnN0YW5jZSB3aXRoIGRhdGEuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHBhcmFtICB7b2JqZWN0fSBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZyZXNoSW5zdGFuY2UgKGlkLCBkYXRhKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VNYXBbaWRdXG4gIGxldCByZXN1bHRcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmVzdWx0ID0gcmVmcmVzaChpbnN0YW5jZSwgZGF0YSlcbiAgfVxuICBlbHNlIHtcbiAgICByZXN1bHQgPSBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiYClcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogRGVzdHJveSBhIFdlZXggaW5zdGFuY2UuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXN0cm95SW5zdGFuY2UgKGlkKSB7XG4gIC8vIE1hcmt1cCBzb21lIGdsb2JhbCBzdGF0ZSBpbiBuYXRpdmUgc2lkZVxuICBpZiAodHlwZW9mIG1hcmt1cFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbWFya3VwU3RhdGUoKVxuICB9XG5cbiAgcmVzZXRUYXJnZXQoKVxuICBjb25zdCBpbnN0YW5jZSA9IGluc3RhbmNlTWFwW2lkXVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoIWluc3RhbmNlKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgaW52YWxpZCBpbnN0YW5jZSBpZCBcIiR7aWR9XCJgKVxuICB9XG4gIGRlc3Ryb3koaW5zdGFuY2UpXG4gIGRlbGV0ZSBpbnN0YW5jZU1hcFtpZF1cbiAgLy8gbm90aWZ5Q29udGV4dERpc3Bvc2VkIGlzIHVzZWQgdG8gdGVsbCB2OCB0byBkbyBhIGZ1bGwgR0MsXG4gIC8vIGJ1dCB0aGlzIHdvdWxkIGhhdmUgYSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gd2VleCxcbiAgLy8gYmVjYXVzZSBhbGwgdGhlIGlubGluZSBjYWNoZSBpbiB2OCB3b3VsZCBnZXQgY2xlYXJlZFxuICAvLyBkdXJpbmcgYSBmdWxsIEdDLlxuICAvLyBUbyB0YWtlIGNhcmUgb2YgYm90aCBtZW1vcnkgYW5kIHBlcmZvcm1hbmNlLCBqdXN0IHRlbGwgdjhcbiAgLy8gdG8gZG8gYSBmdWxsIEdDIGV2ZXJ5IGVpZ2h0ZWVuIHRpbWVzLlxuICBjb25zdCBpZE51bSA9IE1hdGgucm91bmQoaWQpXG4gIGNvbnN0IHJvdW5kID0gMThcbiAgaWYgKGlkTnVtID4gMCkge1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IGlkTnVtICUgcm91bmRcbiAgICBpZiAoIXJlbWFpbmRlciAmJiB0eXBlb2Ygbm90aWZ5VHJpbU1lbW9yeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbm90aWZ5VHJpbU1lbW9yeSgpXG4gICAgfVxuICB9XG4gIHJldHVybiBpbnN0YW5jZU1hcFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgVm0gZnJvbSAnLi4vdm0vaW5kZXgnXG5pbXBvcnQgY29uZmlnIGZyb20gJy4uL2NvbmZpZydcbmltcG9ydCB7XG4gIGluaXRNb2R1bGVzLFxuICBpbml0TWV0aG9kc1xufSBmcm9tICcuLi9hcHAvcmVnaXN0ZXInXG5cbmNvbnN0IHtcbiAgbmF0aXZlQ29tcG9uZW50TWFwXG59ID0gY29uZmlnXG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIG5hbWUgb2YgZWFjaCBuYXRpdmUgY29tcG9uZW50LlxuICogQHBhcmFtICB7YXJyYXl9IGNvbXBvbmVudHMgYXJyYXkgb2YgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJDb21wb25lbnRzIChjb21wb25lbnRzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudHMpKSB7XG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIHJlZ2lzdGVyIChuYW1lKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICghbmFtZSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbmF0aXZlQ29tcG9uZW50TWFwW25hbWVdID0gdHJ1ZVxuICAgICAgfVxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBuYW1lID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbmFtZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBuYXRpdmVDb21wb25lbnRNYXBbbmFtZS50eXBlXSA9IG5hbWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBtb2R1bGUuXG4gKiBAcGFyYW0gIHtvYmplY3R9IG1vZHVsZXMgYSBvYmplY3Qgb2YgbW9kdWxlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVzIChtb2R1bGVzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gJ29iamVjdCcpIHtcbiAgICBpbml0TW9kdWxlcyhtb2R1bGVzKVxuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBhcGkuXG4gKiBAcGFyYW0gIHtvYmplY3R9IGFwaXMgYSBvYmplY3Qgb2YgYXBpc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNZXRob2RzIChtZXRob2RzKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmICh0eXBlb2YgbWV0aG9kcyA9PT0gJ29iamVjdCcpIHtcbiAgICBpbml0TWV0aG9kcyhWbSwgbWV0aG9kcylcbiAgfVxufVxuXG4vLyBAdG9kbzogSGFjayBmb3IgdGhpcyBmcmFtZXdvcmsgb25seS4gV2lsbCBiZSByZS1kZXNpZ25lZCBvciByZW1vdmVkIGxhdGVyLlxuZ2xvYmFsLnJlZ2lzdGVyTWV0aG9kcyA9IHJlZ2lzdGVyTWV0aG9kc1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBpbnN0YW5jZU1hcCB9IGZyb20gJy4vbWFwJ1xuaW1wb3J0IHtcbiAgZmlyZUV2ZW50LFxuICBjYWxsYmFja1xufSBmcm9tICcuLi9hcHAvY3RybC9pbmRleCdcblxuY29uc3QganNIYW5kbGVycyA9IHtcbiAgZmlyZUV2ZW50OiAoaWQsIC4uLmFyZ3MpID0+IHtcbiAgICByZXR1cm4gZmlyZUV2ZW50KGluc3RhbmNlTWFwW2lkXSwgLi4uYXJncylcbiAgfSxcbiAgY2FsbGJhY2s6IChpZCwgLi4uYXJncykgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhpbnN0YW5jZU1hcFtpZF0sIC4uLmFyZ3MpXG4gIH1cbn1cblxuLyoqXG4gKiBBY2NlcHQgY2FsbHMgZnJvbSBuYXRpdmUgKGV2ZW50IG9yIGNhbGxiYWNrKS5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGlkXG4gKiBAcGFyYW0gIHthcnJheX0gdGFza3MgbGlzdCB3aXRoIGBtZXRob2RgIGFuZCBgYXJnc2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY2VpdmVUYXNrcyAoaWQsIHRhc2tzKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VNYXBbaWRdXG4gIGlmIChpbnN0YW5jZSAmJiBBcnJheS5pc0FycmF5KHRhc2tzKSkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBbXVxuICAgIHRhc2tzLmZvckVhY2goKHRhc2spID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBqc0hhbmRsZXJzW3Rhc2subWV0aG9kXVxuICAgICAgY29uc3QgYXJncyA9IFsuLi50YXNrLmFyZ3NdXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChpZClcbiAgICAgICAgcmVzdWx0cy5wdXNoKGhhbmRsZXIoLi4uYXJncykpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gcmVzdWx0c1xuICB9XG4gIHJldHVybiBuZXcgRXJyb3IoYGludmFsaWQgaW5zdGFuY2UgaWQgXCIke2lkfVwiIG9yIHRhc2tzYClcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgaW5zdGFuY2VNYXAgfSBmcm9tICcuL21hcCdcbmltcG9ydCB7XG4gIGdldFJvb3RFbGVtZW50XG59IGZyb20gJy4uL2FwcC9jdHJsL2luZGV4J1xuXG4vKipcbiAqIEdldCBhIHdob2xlIGVsZW1lbnQgdHJlZSBvZiBhbiBpbnN0YW5jZSBmb3IgZGVidWdnaW5nLlxuICogQHBhcmFtICB7c3RyaW5nfSBpZFxuICogQHJldHVybiB7b2JqZWN0fSBhIHZpcnR1YWwgZG9tIHRyZWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3QgKGlkKSB7XG4gIGNvbnN0IGluc3RhbmNlID0gaW5zdGFuY2VNYXBbaWRdXG4gIGxldCByZXN1bHRcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKGluc3RhbmNlKSB7XG4gICAgcmVzdWx0ID0gZ2V0Um9vdEVsZW1lbnQoaW5zdGFuY2UpXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzdWx0ID0gbmV3IEVycm9yKGBpbnZhbGlkIGluc3RhbmNlIGlkIFwiJHtpZH1cImApXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgV2VleCBmcmFtZXdvcmsgZW50cnkuXG4gKi9cblxuaW1wb3J0ICogYXMgbWV0aG9kcyBmcm9tICcuL2FwaS9tZXRob2RzJ1xuXG5pbXBvcnQgVm0gZnJvbSAnLi92bSdcbmV4cG9ydCB7IGNyZWF0ZUluc3RhbmNlIH0gZnJvbSAnLi9zdGF0aWMvY3JlYXRlJ1xuZXhwb3J0IHsgaW5pdCwgcmVmcmVzaEluc3RhbmNlLCBkZXN0cm95SW5zdGFuY2UgfSBmcm9tICcuL3N0YXRpYy9saWZlJ1xuaW1wb3J0IHsgcmVnaXN0ZXJDb21wb25lbnRzLCByZWdpc3Rlck1vZHVsZXMsIHJlZ2lzdGVyTWV0aG9kcyB9IGZyb20gJy4vc3RhdGljL3JlZ2lzdGVyJ1xuZXhwb3J0IHsgcmVjZWl2ZVRhc2tzIH0gZnJvbSAnLi9zdGF0aWMvYnJpZGdlJ1xuZXhwb3J0IHsgZ2V0Um9vdCB9IGZyb20gJy4vc3RhdGljL21pc2MnXG5cbi8vIHJlZ2lzdGVyIHNwZWNpYWwgbWV0aG9kcyBmb3IgV2VleCBmcmFtZXdvcmtcbnJlZ2lzdGVyTWV0aG9kcyhtZXRob2RzKVxuXG4vKipcbiAqIFByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIFZtIGFuZCBWbS5wcm90b3R5cGVcbiAqL1xuT2JqZWN0LmZyZWV6ZShWbSlcblxuZXhwb3J0IHsgcmVnaXN0ZXJDb21wb25lbnRzLCByZWdpc3Rlck1vZHVsZXMsIHJlZ2lzdGVyTWV0aG9kcyB9XG4iLCJtb2R1bGUuZXhwb3J0cyA9IC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAzKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL25vZGVfbW9kdWxlcy9ldmVudC10YXJnZXQtc2hpbS9saWIvY29tbW9ucy5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hXG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cblxuXG4vKipcbiAqIENyZWF0ZXMgYSB1bmlxdWUga2V5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQSBuYW1lIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIHtzeW1ib2x8c3RyaW5nfSBHZW5lcmF0ZWQgdW5pcXVlIGtleS5cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBjcmVhdGVVbmlxdWVLZXkgPSBtb2R1bGUuZXhwb3J0cy5jcmVhdGVVbmlxdWVLZXkgPSAoXG4gICAgdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbCA6IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgIC8qIG90aGVyd2lzZSAqLyBmdW5jdGlvbiBjcmVhdGVVbmlxdWVLZXkobmFtZSkge1xuICAgICAgICByZXR1cm4gXCJbW1wiICsgbmFtZSArIFwiX1wiICsgTWF0aC5yYW5kb20oKS50b0ZpeGVkKDgpLnNsaWNlKDIpICsgXCJdXVwiXG4gICAgfVxuKVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdCBvciBub3QuXG4gKlxuICogQHBhcmFtIHthbnl9IHggLSBUaGUgdmFsdWUgdG8gYmUgY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhIG5vbi1udWxsIG9iamVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBpc09iamVjdCA9IG1vZHVsZS5leHBvcnRzLmlzT2JqZWN0ID0gZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiB4ICE9PSBudWxsXG59XG5cbi8qKlxuICogVGhlIGtleSBvZiBsaXN0ZW5lcnMuXG4gKlxuICogQHR5cGUge3N5bWJvbHxzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cy5MSVNURU5FUlMgPSBjcmVhdGVVbmlxdWVLZXkoXCJsaXN0ZW5lcnNcIilcblxuLyoqXG4gKiBBIHZhbHVlIG9mIGtpbmQgZm9yIGxpc3RlbmVycyB3aGljaCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgY2FwdHVyaW5nIHBoYXNlLlxuICpcbiAqIEB0eXBlIHtudW1iZXJ9XG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cy5DQVBUVVJFID0gMVxuXG4vKipcbiAqIEEgdmFsdWUgb2Yga2luZCBmb3IgbGlzdGVuZXJzIHdoaWNoIGFyZSByZWdpc3RlcmVkIGluIHRoZSBidWJibGluZyBwaGFzZS5cbiAqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMuQlVCQkxFID0gMlxuXG4vKipcbiAqIEEgdmFsdWUgb2Yga2luZCBmb3IgbGlzdGVuZXJzIHdoaWNoIGFyZSByZWdpc3RlcmVkIGFzIGFuIGF0dHJpYnV0ZS5cbiAqXG4gKiBAdHlwZSB7bnVtYmVyfVxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMuQVRUUklCVVRFID0gM1xuXG4vKipcbiAqIEB0eXBlZGVmIG9iamVjdCBMaXN0ZW5lck5vZGVcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGxpc3RlbmVyIC0gQSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBraW5kIC0gVGhlIGtpbmQgb2YgdGhlIGxpc3RlbmVyLlxuICogQHByb3BlcnR5IHtMaXN0ZW5lck5vZGV8bnVsbH0gbmV4dCAtIFRoZSBuZXh0IG5vZGUuXG4gKiAgICAgIElmIHRoaXMgbm9kZSBpcyB0aGUgbGFzdCwgdGhpcyBpcyBgbnVsbGAuXG4gKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgbm9kZSBvZiBzaW5nbHkgbGlua2VkIGxpc3QgZm9yIGEgbGlzdCBvZiBsaXN0ZW5lcnMuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgLSBBIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGtpbmQgLSBUaGUga2luZCBvZiB0aGUgbGlzdGVuZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm9uY2VdIC0gVGhlIGZsYWcgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBhdCB0aGUgZmlyc3QgY2FsbC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucGFzc2l2ZV0gLSBUaGUgZmxhZyB0byBpZ25vcmUgYGV2ZW50LnByZXZlbnREZWZhdWx0YCBtZXRob2QuXG4gKiBAcmV0dXJucyB7TGlzdGVuZXJOb2RlfSBUaGUgY3JlYXRlZCBsaXN0ZW5lciBub2RlLlxuICovXG5tb2R1bGUuZXhwb3J0cy5uZXdOb2RlID0gZnVuY3Rpb24gbmV3Tm9kZShsaXN0ZW5lciwga2luZCwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBpc09iamVjdChvcHRpb25zKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyLFxuICAgICAgICBraW5kOiBraW5kLFxuICAgICAgICBvbmNlOiBvYmogJiYgQm9vbGVhbihvcHRpb25zLm9uY2UpLFxuICAgICAgICBwYXNzaXZlOiBvYmogJiYgQm9vbGVhbihvcHRpb25zLnBhc3NpdmUpLFxuICAgICAgICBuZXh0OiBudWxsLFxuICAgIH1cbn1cblxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL2VtaXR0ZXIuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBFdmVudEVtaXR0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRFbWl0dGVyKTtcblxuICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2VcbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRFbWl0dGVyLCBbe1xuICAgIGtleTogXCJfYWRkTGlzdGVuZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2FkZExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvbmNlKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gfHwgW107XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0ucHVzaCh7IGxpc3RlbmVyOiBsaXN0ZW5lciwgb25jZTogb25jZSB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgaW5zdGFuY2Ugb2YgRXZlbnRFbWl0dGVyIGZvciBjaGFpbmluZy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwib25jZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbmNlKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkTGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmdW5jdGlvbiB0byB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgaW5zdGFuY2Ugb2YgRXZlbnRFbWl0dGVyIGZvciBjaGFpbmluZy5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9mZlwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvZmYodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIC8vIGFsaWFzXG4gICAgICBpZiAoIXRoaXMuX2xpc3RlbmVyc1t0eXBlXSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5fbGlzdGVuZXJzW3R5cGVdLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghbGlzdGVuZXIpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1t0eXBlXTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uZmlsdGVyKGZ1bmN0aW9uIChfbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuICEoX2xpc3RlbmVyLmxpc3RlbmVyID09PSBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIHNwZWNpZmllZCBldmVudC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGluc3RhbmNlIG9mIEV2ZW50RW1pdHRlciBmb3IgY2hhaW5pbmcuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJlbWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVtaXQodHlwZSwgcGF5bG9hZCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgaWYgKCF0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uZm9yRWFjaChmdW5jdGlvbiAoX2xpc3RlbmVyKSB7XG4gICAgICAgIF9saXN0ZW5lci5saXN0ZW5lci5hcHBseShfdGhpcywgW3BheWxvYWRdKTtcbiAgICAgICAgaWYgKF9saXN0ZW5lci5vbmNlKSB7XG4gICAgICAgICAgX3RoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgX2xpc3RlbmVyLmxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRXZlbnRFbWl0dGVyO1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvbm9kZV9tb2R1bGVzL2V2ZW50LXRhcmdldC1zaGltL2xpYi9ldmVudC10YXJnZXQuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hXG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cblxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVxdWlyZW1lbnRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKmdsb2JhbHMgd2luZG93ICovXG5cbnZhciBDb21tb25zID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9jb21tb25zICovIDApXG52YXIgQ3VzdG9tRXZlbnRUYXJnZXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2N1c3RvbS1ldmVudC10YXJnZXQgKi8gMTUpXG52YXIgRXZlbnRXcmFwcGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9ldmVudC13cmFwcGVyICovIDE2KVxudmFyIGlzT2JqZWN0ID0gQ29tbW9ucy5pc09iamVjdFxudmFyIExJU1RFTkVSUyA9IENvbW1vbnMuTElTVEVORVJTXG52YXIgQ0FQVFVSRSA9IENvbW1vbnMuQ0FQVFVSRVxudmFyIEJVQkJMRSA9IENvbW1vbnMuQlVCQkxFXG52YXIgQVRUUklCVVRFID0gQ29tbW9ucy5BVFRSSUJVVEVcbnZhciBuZXdOb2RlID0gQ29tbW9ucy5uZXdOb2RlXG52YXIgZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQgPSBDdXN0b21FdmVudFRhcmdldC5kZWZpbmVDdXN0b21FdmVudFRhcmdldFxudmFyIGNyZWF0ZUV2ZW50V3JhcHBlciA9IEV2ZW50V3JhcHBlci5jcmVhdGVFdmVudFdyYXBwZXJcbnZhciBTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHID0gRXZlbnRXcmFwcGVyLlNUT1BfSU1NRURJQVRFX1BST1BBR0FUSU9OX0ZMQUdcbnZhciBQQVNTSVZFX0xJU1RFTkVSX0ZMQUcgPSBFdmVudFdyYXBwZXIuUEFTU0lWRV9MSVNURU5FUl9GTEFHXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb25zdGFudHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQSBmbGFnIHdoaWNoIHNob3dzIHRoZXJlIGlzIHRoZSBuYXRpdmUgYEV2ZW50VGFyZ2V0YCBpbnRlcmZhY2Ugb2JqZWN0LlxuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xudmFyIEhBU19FVkVOVFRBUkdFVF9JTlRFUkZBQ0UgPSAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgIHR5cGVvZiB3aW5kb3cuRXZlbnRUYXJnZXQgIT09IFwidW5kZWZpbmVkXCJcbilcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBJbnRlcmZhY2Vcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gZm9yIGBFdmVudFRhcmdldGAgaW50ZXJmYWNlLlxuICpcbiAqIEBjb25zdHJ1Y3RvclxuICogQHB1YmxpY1xuICovXG52YXIgRXZlbnRUYXJnZXQgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgRXZlbnRUYXJnZXQpIHtcbiAgICAgICAgLy8gdGhpc1tMSVNURU5FUlNdIGlzIGEgTWFwLlxuICAgICAgICAvLyBJdHMga2V5IGlzIGV2ZW50IHR5cGUuXG4gICAgICAgIC8vIEl0cyB2YWx1ZSBpcyBMaXN0ZW5lck5vZGUgb2JqZWN0IG9yIG51bGwuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGludGVyZmFjZSBMaXN0ZW5lck5vZGUge1xuICAgICAgICAvLyAgICAgdmFyIGxpc3RlbmVyOiBGdW5jdGlvblxuICAgICAgICAvLyAgICAgdmFyIGtpbmQ6IENBUFRVUkV8QlVCQkxFfEFUVFJJQlVURVxuICAgICAgICAvLyAgICAgdmFyIG5leHQ6IExpc3RlbmVyTm9kZXxudWxsXG4gICAgICAgIC8vIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIExJU1RFTkVSUywge3ZhbHVlOiBPYmplY3QuY3JlYXRlKG51bGwpfSlcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1swXSkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUN1c3RvbUV2ZW50VGFyZ2V0KEV2ZW50VGFyZ2V0LCBhcmd1bWVudHNbMF0pXG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciB0eXBlcyA9IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICB0eXBlc1tpXSA9IGFyZ3VtZW50c1tpXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVG8gdXNlIHRvIGV4dGVuZCB3aXRoIGF0dHJpYnV0ZSBsaXN0ZW5lciBwcm9wZXJ0aWVzLlxuICAgICAgICAvLyBlLmcuXG4gICAgICAgIC8vICAgICBjbGFzcyBNeUN1c3RvbU9iamVjdCBleHRlbmRzIEV2ZW50VGFyZ2V0KFwibWVzc2FnZVwiLCBcImVycm9yXCIpIHtcbiAgICAgICAgLy8gICAgICAgICAvLy4uLlxuICAgICAgICAvLyAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lQ3VzdG9tRXZlbnRUYXJnZXQoRXZlbnRUYXJnZXQsIHR5cGVzKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKVxuICAgIH1cbn1cblxuRXZlbnRUYXJnZXQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShcbiAgICAoSEFTX0VWRU5UVEFSR0VUX0lOVEVSRkFDRSA/IHdpbmRvdy5FdmVudFRhcmdldCA6IE9iamVjdCkucHJvdG90eXBlLFxuICAgIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgbGlzdGVuZXIgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlxcXCJsaXN0ZW5lclxcXCIgaXMgbm90IGFuIG9iamVjdC5cIilcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgY2FwdHVyZSA9IGlzT2JqZWN0KG9wdGlvbnMpID8gQm9vbGVhbihvcHRpb25zLmNhcHR1cmUpIDogQm9vbGVhbihvcHRpb25zKVxuICAgICAgICAgICAgICAgIHZhciBraW5kID0gKGNhcHR1cmUgPyBDQVBUVVJFIDogQlVCQkxFKVxuICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGhpc1tMSVNURU5FUlNdW3R5cGVdXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzW0xJU1RFTkVSU11bdHlwZV0gPSBuZXdOb2RlKGxpc3RlbmVyLCBraW5kLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gbnVsbFxuICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmIG5vZGUua2luZCA9PT0ga2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGlnbm9yZSBhIGR1cGxpY2F0ZWQgbGlzdGVuZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcmV2ID0gbm9kZVxuICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV3Tm9kZShsaXN0ZW5lciwga2luZCwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGNhcHR1cmUgPSBpc09iamVjdChvcHRpb25zKSA/IEJvb2xlYW4ob3B0aW9ucy5jYXB0dXJlKSA6IEJvb2xlYW4ob3B0aW9ucylcbiAgICAgICAgICAgICAgICB2YXIga2luZCA9IChjYXB0dXJlID8gQ0FQVFVSRSA6IEJVQkJMRSlcbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IG51bGxcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXNbTElTVEVORVJTXVt0eXBlXVxuICAgICAgICAgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmIG5vZGUua2luZCA9PT0ga2luZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbTElTVEVORVJTXVt0eXBlXSA9IG5vZGUubmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbm9kZS5uZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcHJldiA9IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuXG4gICAgICAgIGRpc3BhdGNoRXZlbnQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbGlzdGVuZXJzIGFyZW4ndCByZWdpc3RlcmVkLCB0ZXJtaW5hdGUuXG4gICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBldmVudC50eXBlXG4gICAgICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzW0xJU1RFTkVSU11bdHlwZV1cbiAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgY2Fubm90IHJld3JpdGUgc2V2ZXJhbCBwcm9wZXJ0aWVzLCBzbyB3cmFwIG9iamVjdC5cbiAgICAgICAgICAgICAgICB2YXIgd3JhcHBlZCA9IGNyZWF0ZUV2ZW50V3JhcHBlcihldmVudCwgdGhpcylcblxuICAgICAgICAgICAgICAgIC8vIFRoaXMgZG9lc24ndCBwcm9jZXNzIGNhcHR1cmluZyBwaGFzZSBhbmQgYnViYmxpbmcgcGhhc2UuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBwYXJ0aWNpcGF0aW5nIGluIGEgdHJlZS5cbiAgICAgICAgICAgICAgICB2YXIgcHJldiA9IG51bGxcbiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGxpc3RlbmVyIGlmIGl0J3Mgb25jZVxuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5vbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tMSVNURU5FUlNdW3R5cGVdID0gbm9kZS5uZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Lm5leHQgPSBub2RlLm5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBub2RlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoaXMgbGlzdGVuZXJcbiAgICAgICAgICAgICAgICAgICAgd3JhcHBlZFtQQVNTSVZFX0xJU1RFTkVSX0ZMQUddID0gbm9kZS5wYXNzaXZlXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZS5saXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmNhbGwodGhpcywgd3JhcHBlZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLmtpbmQgIT09IEFUVFJJQlVURSAmJiB0eXBlb2Ygbm9kZS5saXN0ZW5lci5oYW5kbGVFdmVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmxpc3RlbmVyLmhhbmRsZUV2ZW50KHdyYXBwZWQpXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBCcmVhayBpZiBgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uYCB3YXMgY2FsbGVkLlxuICAgICAgICAgICAgICAgICAgICBpZiAod3JhcHBlZFtTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIXdyYXBwZWQuZGVmYXVsdFByZXZlbnRlZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH1cbilcblxuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9pbmRleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfc2xpY2VkVG9BcnJheSA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gc2xpY2VJdGVyYXRvcihhcnIsIGkpIHsgdmFyIF9hcnIgPSBbXTsgdmFyIF9uID0gdHJ1ZTsgdmFyIF9kID0gZmFsc2U7IHZhciBfZSA9IHVuZGVmaW5lZDsgdHJ5IHsgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkgeyBfYXJyLnB1c2goX3MudmFsdWUpOyBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7IH0gfSBjYXRjaCAoZXJyKSB7IF9kID0gdHJ1ZTsgX2UgPSBlcnI7IH0gZmluYWxseSB7IHRyeSB7IGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0pIF9pW1wicmV0dXJuXCJdKCk7IH0gZmluYWxseSB7IGlmIChfZCkgdGhyb3cgX2U7IH0gfSByZXR1cm4gX2FycjsgfSByZXR1cm4gZnVuY3Rpb24gKGFyciwgaSkgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IHJldHVybiBhcnI7IH0gZWxzZSBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSB7IHJldHVybiBzbGljZUl0ZXJhdG9yKGFyciwgaSk7IH0gZWxzZSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpOyB9IH07IH0oKTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnRzLmdldEluc3RhbmNlID0gZ2V0SW5zdGFuY2U7XG5leHBvcnRzLmluaXQgPSBpbml0O1xuZXhwb3J0cy5yZWdpc3RlckNvbXBvbmVudHMgPSByZWdpc3RlckNvbXBvbmVudHM7XG5leHBvcnRzLnJlZ2lzdGVyTWV0aG9kcyA9IHJlZ2lzdGVyTWV0aG9kcztcbmV4cG9ydHMucmVnaXN0ZXJNb2R1bGVzID0gcmVnaXN0ZXJNb2R1bGVzO1xuZXhwb3J0cy5jcmVhdGVJbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlO1xuZXhwb3J0cy5yZWZyZXNoSW5zdGFuY2UgPSByZWZyZXNoSW5zdGFuY2U7XG5leHBvcnRzLmRlc3Ryb3lJbnN0YW5jZSA9IGRlc3Ryb3lJbnN0YW5jZTtcbmV4cG9ydHMuZ2V0Um9vdCA9IGdldFJvb3Q7XG5leHBvcnRzLnJlY2VpdmVUYXNrcyA9IHJlY2VpdmVUYXNrcztcblxudmFyIF9idWlsdGluID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9idWlsdGluICovIDQpO1xuXG52YXIgX2VtaXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2VtaXR0ZXIgKi8gMSk7XG5cbnZhciBfZW1pdHRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbWl0dGVyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIE5hdGl2ZUNvbXBvbmVudHMgPSB7fTtcbnZhciBOYXRpdmVNb2R1bGVzID0ge307XG5cbnZhciBEb2N1bWVudCA9IHZvaWQgMDtcbnZhciBFbGVtZW50ID0gdm9pZCAwO1xudmFyIENvbW1lbnQgPSB2b2lkIDA7XG5cbnZhciBNT0RVTEVfTkFNRV9QUkVGSVggPSAnQHdlZXgtbW9kdWxlLyc7XG52YXIgTU9EQUxfTU9EVUxFID0gTU9EVUxFX05BTUVfUFJFRklYICsgJ21vZGFsJztcbnZhciBOQVZJR0FUT1JfTU9EVUxFID0gTU9EVUxFX05BTUVfUFJFRklYICsgJ25hdmlnYXRvcic7XG4vLyBJbnN0YW5jZSBodWJcbnZhciBpbnN0YW5jZXMgPSB7fTtcbi8vIEJ1bmRsZXMgaHViXG52YXIgYnVuZGxlcyA9IHt9O1xudmFyIG5vb3AgPSBmdW5jdGlvbiBub29wKCkge307XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRUb0luc3RhbmNlKGV2ZW50LCB0YXJnZXRPcmlnaW4pIHtcbiAgdmFyIGluc3RhbmNlO1xuICBmb3IgKHZhciBpIGluIGluc3RhbmNlcykge1xuICAgIGlmIChpbnN0YW5jZXMuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgIGluc3RhbmNlID0gaW5zdGFuY2VzW2ldO1xuICAgICAgaWYgKHRhcmdldE9yaWdpbiA9PT0gJyonIHx8IHRhcmdldE9yaWdpbiA9PT0gaW5zdGFuY2Uub3JpZ2luKSB7XG4gICAgICAgIGV2ZW50LnRhcmdldCA9IGluc3RhbmNlLndpbmRvdztcbiAgICAgICAgLy8gRklYTUU6IE5lZWQgYXN5bmM/XG4gICAgICAgIGluc3RhbmNlLndpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRmluaXNoKGRvYykge1xuICBkb2MudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ3VwZGF0ZUZpbmlzaCcgfSwgW10pO1xufVxuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZShpbnN0YW5jZUlkKSB7XG4gIHZhciBpbnN0YW5jZSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXTtcbiAgaWYgKCFpbnN0YW5jZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBpbnN0YW5jZSBpZCBcIicgKyBpbnN0YW5jZUlkICsgJ1wiJyk7XG4gIH1cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5mdW5jdGlvbiBpbml0KGNvbmZpZykge1xuICBEb2N1bWVudCA9IGNvbmZpZy5Eb2N1bWVudDtcbiAgRWxlbWVudCA9IGNvbmZpZy5FbGVtZW50O1xuICBDb21tZW50ID0gY29uZmlnLkNvbW1lbnQ7XG59XG5cbi8qKlxuICogcmVnaXN0ZXIgdGhlIG5hbWUgb2YgZWFjaCBuYXRpdmUgY29tcG9uZW50XG4gKiBAcGFyYW0gIHthcnJheX0gY29tcG9uZW50cyBhcnJheSBvZiBuYW1lXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyQ29tcG9uZW50cyhjb21wb25lbnRzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudHMpKSB7XG4gICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIHJlZ2lzdGVyKG5hbWUpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgTmF0aXZlQ29tcG9uZW50c1tuYW1lXSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmFtZSkpID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbmFtZS50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBOYXRpdmVDb21wb25lbnRzW25hbWUudHlwZV0gPSBuYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogcmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBhcGlcbiAqIEBwYXJhbSAge29iamVjdH0gYXBpcyBhIG9iamVjdCBvZiBhcGlzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyTWV0aG9kcyhhcGlzKSB7fVxuLy8gTm9vcFxuXG5cbi8qKlxuICogcmVnaXN0ZXIgdGhlIG5hbWUgYW5kIG1ldGhvZHMgb2YgZWFjaCBtb2R1bGVcbiAqIEBwYXJhbSAge29iamVjdH0gbW9kdWxlcyBhIG9iamVjdCBvZiBtb2R1bGVzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlcyhuZXdNb2R1bGVzKSB7XG4gIGlmICgodHlwZW9mIG5ld01vZHVsZXMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5ld01vZHVsZXMpKSA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIG5ld01vZHVsZXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobmV3TW9kdWxlcywgbmFtZSkpIHtcbiAgICAgICAgTmF0aXZlTW9kdWxlc1tuYW1lXSA9IG5ld01vZHVsZXNbbmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbkJ1aWx0aW5Nb2R1bGVzKG1vZHVsZXMsIG1vZHVsZUZhY3RvcmllcywgY29udGV4dCkge1xuICBmb3IgKHZhciBtb2R1bGVOYW1lIGluIG1vZHVsZUZhY3Rvcmllcykge1xuICAgIG1vZHVsZXNbbW9kdWxlTmFtZV0gPSB7XG4gICAgICBmYWN0b3J5OiBtb2R1bGVGYWN0b3JpZXNbbW9kdWxlTmFtZV0uYmluZChjb250ZXh0KSxcbiAgICAgIG1vZHVsZTogeyBleHBvcnRzOiB7fSB9LFxuICAgICAgaXNJbml0aWFsaXplZDogZmFsc2VcbiAgICB9O1xuICB9XG4gIHJldHVybiBtb2R1bGVzO1xufVxuXG5mdW5jdGlvbiBnZW5OYXRpdmVNb2R1bGVzKG1vZHVsZXMsIGRvY3VtZW50KSB7XG4gIGlmICgodHlwZW9mIE5hdGl2ZU1vZHVsZXMgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKE5hdGl2ZU1vZHVsZXMpKSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChuYW1lKSB7XG4gICAgICB2YXIgbW9kdWxlTmFtZSA9IE1PRFVMRV9OQU1FX1BSRUZJWCArIG5hbWU7XG4gICAgICBtb2R1bGVzW21vZHVsZU5hbWVdID0ge1xuICAgICAgICBtb2R1bGU6IHsgZXhwb3J0czoge30gfSxcbiAgICAgICAgaXNJbml0aWFsaXplZDogdHJ1ZVxuICAgICAgfTtcblxuICAgICAgTmF0aXZlTW9kdWxlc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uIChtZXRob2QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZXRob2QgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgbWV0aG9kID0ge1xuICAgICAgICAgICAgbmFtZTogbWV0aG9kXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IG1ldGhvZC5uYW1lO1xuXG4gICAgICAgIG1vZHVsZXNbbW9kdWxlTmFtZV0ubW9kdWxlLmV4cG9ydHNbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgICB2YXIgbGFzdEFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgICBpZiAobGFzdEFyZyAmJiAodHlwZW9mIGxhc3RBcmcgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGxhc3RBcmcpKSA9PT0gJ29iamVjdCcgJiYgbGFzdEFyZy5fX3dlZXhfb3B0aW9uc19fKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gbGFzdEFyZy5fX3dlZXhfb3B0aW9uc19fO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYXN0IGluIGFyZ3NcbiAgICAgICAgICAgIGFyZ3MucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGliYWJhL3dlZXgvaXNzdWVzLzE2NzdcbiAgICAgICAgICByZXR1cm4gZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdtb2R1bGUnLCB7XG4gICAgICAgICAgICBtb2R1bGU6IG5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZE5hbWVcbiAgICAgICAgICB9LCBhcmdzLCBvcHRpb25zKTtcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIE5hdGl2ZU1vZHVsZXMpIHtcbiAgICAgIF9sb29wKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb2R1bGVzO1xufVxuXG4vKipcbiAqIGNyZWF0ZSBhIFdlZXggaW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGluc3RhbmNlSWRcbiAqIEBwYXJhbSAge3N0cmluZ30gX193ZWV4X2NvZGVfX1xuICogQHBhcmFtICB7b2JqZWN0fSBbX193ZWV4X29wdGlvbnNfX10ge2J1bmRsZVVybCwgZGVidWd9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGluc3RhbmNlSWQsIF9fd2VleF9jb2RlX18sIF9fd2VleF9vcHRpb25zX18sIF9fd2VleF9kYXRhX18sIF9fd2VleF9jb25maWdfXykge1xuICB2YXIgaW5zdGFuY2UgPSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gIGlmIChpbnN0YW5jZSA9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBNYXJrIHN0YXJ0IHRpbWVcbiAgICB2YXIgcmVzcG9uc2VFbmQgPSBEYXRlLm5vdygpO1xuICAgIHZhciBfX3dlZXhfZW52X18gPSAodHlwZW9mIFdYRW52aXJvbm1lbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKFdYRW52aXJvbm1lbnQpKSA9PT0gJ29iamVjdCcgJiYgV1hFbnZpcm9ubWVudCB8fCB7fTtcbiAgICAvLyBGb3IgYmV0dGVyIHBlcmZvcm1hbmNlIHVzZSBidWlsdC1pbiBwcm9taXNlIGZpcnN0XG4gICAgdmFyIHNoYXJlZCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJ1bnRpbWUtc2hhcmVkL2Rpc3Qvc2hhcmVkLmZ1bmN0aW9uICovIDYpKCk7XG5cbiAgICB2YXIgX1Byb21pc2UgPSB0eXBlb2YgX1Byb21pc2UgPT09ICdmdW5jdGlvbicgPyBfUHJvbWlzZSA6IHNoYXJlZC5Qcm9taXNlO1xuICAgIHZhciBfU3ltYm9sID0gdHlwZW9mIF9TeW1ib2wgPT09ICdmdW5jdGlvbicgPyBfU3ltYm9sIDogc2hhcmVkLlN5bWJvbDtcbiAgICB2YXIgX1NldCA9IHR5cGVvZiBfU2V0ID09PSAnZnVuY3Rpb24nID8gX1NldCA6IHNoYXJlZC5TZXQ7XG4gICAgdmFyIF9NYXAgPSB0eXBlb2YgX01hcCA9PT0gJ2Z1bmN0aW9uJyA/IF9NYXAgOiBzaGFyZWQuTWFwO1xuICAgIHZhciBfV2Vha01hcCA9IHR5cGVvZiBfV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IF9XZWFrTWFwIDogc2hhcmVkLldlYWtNYXA7XG4gICAgdmFyIF9XZWFrU2V0ID0gdHlwZW9mIF9XZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gX1dlYWtTZXQgOiBzaGFyZWQuV2Vha1NldDtcbiAgICB2YXIgVVJMID0gc2hhcmVkLlVSTCxcbiAgICAgICAgVVJMU2VhcmNoUGFyYW1zID0gc2hhcmVkLlVSTFNlYXJjaFBhcmFtcyxcbiAgICAgICAgRm9udEZhY2UgPSBzaGFyZWQuRm9udEZhY2UsXG4gICAgICAgIG1hdGNoTWVkaWEgPSBzaGFyZWQubWF0Y2hNZWRpYTtcblxuICAgIHZhciBidW5kbGVVcmwgPSBfX3dlZXhfb3B0aW9uc19fLmJ1bmRsZVVybCB8fCAnYWJvdXQ6YmxhbmsnO1xuXG4gICAgaWYgKCFfX3dlZXhfb3B0aW9uc19fLmJ1bmRsZVVybCkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE11c3QgaGF2ZSBidW5kbGVVcmwgb3B0aW9uIHdoZW4gY3JlYXRlSW5zdGFuY2UsIGRvd25ncmFkZSB0byBcImFib3V0OmJsYW5rXCIuJyk7XG4gICAgfVxuXG4gICAgdmFyIGRvY3VtZW50ID0gbmV3IERvY3VtZW50KGluc3RhbmNlSWQsIGJ1bmRsZVVybCk7XG4gICAgdmFyIGRvY3VtZW50VVJMID0gbmV3IFVSTChidW5kbGVVcmwpO1xuICAgIHZhciBtb2R1bGVzID0ge307XG5cbiAgICBpbnN0YW5jZSA9IGluc3RhbmNlc1tpbnN0YW5jZUlkXSA9IHtcbiAgICAgIGRvY3VtZW50OiBkb2N1bWVudCxcbiAgICAgIGluc3RhbmNlSWQ6IGluc3RhbmNlSWQsXG4gICAgICBidW5kbGVVcmw6IGJ1bmRsZVVybCxcbiAgICAgIGJ1bmRsZUNvZGU6IF9fd2VleF9jb2RlX18sXG4gICAgICBtb2R1bGVzOiBtb2R1bGVzLFxuICAgICAgb3JpZ2luOiBkb2N1bWVudFVSTC5vcmlnaW4sXG4gICAgICB1aWQ6IDBcbiAgICB9O1xuXG4gICAgLy8gR2VuZXJhdGUgbmF0aXZlIG1vZHVsZXMgbWFwIGF0IGluc3RhbmNlIGluaXRcbiAgICBnZW5OYXRpdmVNb2R1bGVzKG1vZHVsZXMsIGRvY3VtZW50KTtcbiAgICB2YXIgX193ZWV4X2RlZmluZV9fID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9kZWZpbmUud2VleCAqLyA3KShtb2R1bGVzKTtcbiAgICB2YXIgX193ZWV4X3JlcXVpcmVfXyA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vcmVxdWlyZS53ZWV4ICovIDgpKG1vZHVsZXMpO1xuICAgIHZhciBfX3dlZXhfZG93bmdyYWRlX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2Rvd25ncmFkZS53ZWV4ICovIDkpKF9fd2VleF9yZXF1aXJlX18pO1xuICAgIC8vIEV4dGVuZCBkb2N1bWVudFxuICAgIF9fd2VicGFja19yZXF1aXJlX18oLyohIC4vZG9jdW1lbnQud2VleCAqLyAxMSkoX193ZWV4X3JlcXVpcmVfXywgZG9jdW1lbnQpO1xuXG4gICAgdmFyIGxvY2F0aW9uID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9sb2NhdGlvbi53ZWV4ICovIDEyKShfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudFVSTCk7XG5cbiAgICB2YXIgX3JlcXVpcmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2ZldGNoLndlZXggKi8gMTMpKF9fd2VleF9yZXF1aXJlX18sIF9Qcm9taXNlKSxcbiAgICAgICAgZmV0Y2ggPSBfcmVxdWlyZS5mZXRjaCxcbiAgICAgICAgSGVhZGVycyA9IF9yZXF1aXJlLkhlYWRlcnMsXG4gICAgICAgIFJlcXVlc3QgPSBfcmVxdWlyZS5SZXF1ZXN0LFxuICAgICAgICBSZXNwb25zZSA9IF9yZXF1aXJlLlJlc3BvbnNlO1xuXG4gICAgdmFyIFhNTEh0dHBSZXF1ZXN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi94bWxodHRwcmVxdWVzdC53ZWV4ICovIDE0KShfX3dlZXhfcmVxdWlyZV9fKTtcbiAgICB2YXIgV2ViU29ja2V0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi93ZWJzb2NrZXQud2VleCAqLyAxNykoX193ZWV4X3JlcXVpcmVfXyk7XG5cbiAgICB2YXIgX3JlcXVpcmUyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi90aW1lci53ZWV4ICovIDE4KShfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudCksXG4gICAgICAgIHNldFRpbWVvdXQgPSBfcmVxdWlyZTIuc2V0VGltZW91dCxcbiAgICAgICAgY2xlYXJUaW1lb3V0ID0gX3JlcXVpcmUyLmNsZWFyVGltZW91dCxcbiAgICAgICAgc2V0SW50ZXJ2YWwgPSBfcmVxdWlyZTIuc2V0SW50ZXJ2YWwsXG4gICAgICAgIGNsZWFySW50ZXJ2YWwgPSBfcmVxdWlyZTIuY2xlYXJJbnRlcnZhbCxcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gX3JlcXVpcmUyLnJlcXVlc3RBbmltYXRpb25GcmFtZSxcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBfcmVxdWlyZTIuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XG5cbiAgICB2YXIgX3JlcXVpcmUzID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9iYXNlNjQud2VleCAqLyAxOSkoKSxcbiAgICAgICAgYXRvYiA9IF9yZXF1aXJlMy5hdG9iLFxuICAgICAgICBidG9hID0gX3JlcXVpcmUzLmJ0b2E7XG5cbiAgICB2YXIgcGVyZm9ybWFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL3BlcmZvcm1hbmNlLndlZXggKi8gMjApKHJlc3BvbnNlRW5kKTtcblxuICAgIHZhciBfcmVxdWlyZTQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2V2ZW50LndlZXggKi8gMjEpKCksXG4gICAgICAgIEV2ZW50ID0gX3JlcXVpcmU0LkV2ZW50LFxuICAgICAgICBDdXN0b21FdmVudCA9IF9yZXF1aXJlNC5DdXN0b21FdmVudDtcblxuICAgIHZhciB3aW5kb3dFbWl0dGVyID0gbmV3IF9lbWl0dGVyMi5kZWZhdWx0KCk7XG5cbiAgICB2YXIgd2luZG93ID0ge1xuICAgICAgLy8gRVNcbiAgICAgIFByb21pc2U6IF9Qcm9taXNlLFxuICAgICAgU3ltYm9sOiBfU3ltYm9sLFxuICAgICAgTWFwOiBfTWFwLFxuICAgICAgU2V0OiBfU2V0LFxuICAgICAgV2Vha01hcDogX1dlYWtNYXAsXG4gICAgICBXZWFrU2V0OiBfV2Vha1NldCxcbiAgICAgIC8vIFczQzogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2Jyb3dzZXJzLmh0bWwjYnJvd3NpbmctY29udGV4dC1uYW1lXG4gICAgICBuYW1lOiAnJyxcbiAgICAgIC8vIFRoaXMgcmVhZC1vbmx5IHByb3BlcnR5IGluZGljYXRlcyB3aGV0aGVyIHRoZSByZWZlcmVuY2VkIHdpbmRvdyBpcyBjbG9zZWQgb3Igbm90LlxuICAgICAgY2xvc2VkOiBmYWxzZSxcbiAgICAgIGF0b2I6IGF0b2IsXG4gICAgICBidG9hOiBidG9hLFxuICAgICAgcGVyZm9ybWFuY2U6IHBlcmZvcm1hbmNlLFxuICAgICAgLy8gVzNDXG4gICAgICBkb2N1bWVudDogZG9jdW1lbnQsXG4gICAgICBsb2NhdGlvbjogbG9jYXRpb24sXG4gICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1odG1sNS0yMDA5MDQyMy9icm93c2Vycy5odG1sI2RvbS1uYXZpZ2F0b3JcbiAgICAgIG5hdmlnYXRvcjoge1xuICAgICAgICBwcm9kdWN0OiAnV2VleCcsXG4gICAgICAgIHBsYXRmb3JtOiBfX3dlZXhfZW52X18ucGxhdGZvcm0sXG4gICAgICAgIGFwcE5hbWU6IF9fd2VleF9lbnZfXy5hcHBOYW1lLFxuICAgICAgICBhcHBWZXJzaW9uOiBfX3dlZXhfZW52X18uYXBwVmVyc2lvbixcbiAgICAgICAgLy8gV2VleC8wLjEyIGlPUy85LjMgKGlQaG9uZTcsMikgQXBwTmFtZS8wLjEyXG4gICAgICAgIHVzZXJBZ2VudDogJ1dlZXgvJyArIF9fd2VleF9lbnZfXy53ZWV4VmVyc2lvbiArICcgJyArIF9fd2VleF9lbnZfXy5wbGF0Zm9ybSArICcvJyArIF9fd2VleF9lbnZfXy5vc1ZlcnNpb24gKyAnICgnICsgX193ZWV4X2Vudl9fLmRldmljZU1vZGVsICsgJykgJyArIF9fd2VleF9lbnZfXy5hcHBOYW1lICsgJy8nICsgX193ZWV4X2Vudl9fLmFwcFZlcnNpb25cbiAgICAgIH0sXG4gICAgICAvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20tdmlldy8jdGhlLXNjcmVlbi1pbnRlcmZhY2VcbiAgICAgIHNjcmVlbjoge1xuICAgICAgICB3aWR0aDogX193ZWV4X2Vudl9fLmRldmljZVdpZHRoLFxuICAgICAgICBoZWlnaHQ6IF9fd2VleF9lbnZfXy5kZXZpY2VIZWlnaHQsXG4gICAgICAgIGF2YWlsV2lkdGg6IF9fd2VleF9lbnZfXy5kZXZpY2VXaWR0aCxcbiAgICAgICAgYXZhaWxIZWlnaHQ6IF9fd2VleF9lbnZfXy5kZXZpY2VIZWlnaHQsXG4gICAgICAgIGNvbG9yRGVwdGg6IDI0LFxuICAgICAgICBwaXhlbERlcHRoOiAyNFxuICAgICAgfSxcbiAgICAgIGRldmljZVBpeGVsUmF0aW86IF9fd2VleF9lbnZfXy5zY2FsZSxcbiAgICAgIGZldGNoOiBmZXRjaCxcbiAgICAgIEhlYWRlcnM6IEhlYWRlcnMsXG4gICAgICBSZXNwb25zZTogUmVzcG9uc2UsXG4gICAgICBSZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgWE1MSHR0cFJlcXVlc3Q6IFhNTEh0dHBSZXF1ZXN0LFxuICAgICAgVVJMOiBVUkwsXG4gICAgICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtcyxcbiAgICAgIEZvbnRGYWNlOiBGb250RmFjZSxcbiAgICAgIFdlYlNvY2tldDogV2ViU29ja2V0LFxuICAgICAgRXZlbnQ6IEV2ZW50LFxuICAgICAgQ3VzdG9tRXZlbnQ6IEN1c3RvbUV2ZW50LFxuICAgICAgbWF0Y2hNZWRpYTogbWF0Y2hNZWRpYSxcbiAgICAgIHNldFRpbWVvdXQ6IHNldFRpbWVvdXQsXG4gICAgICBjbGVhclRpbWVvdXQ6IGNsZWFyVGltZW91dCxcbiAgICAgIHNldEludGVydmFsOiBzZXRJbnRlcnZhbCxcbiAgICAgIGNsZWFySW50ZXJ2YWw6IGNsZWFySW50ZXJ2YWwsXG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IHJlcXVlc3RBbmltYXRpb25GcmFtZSxcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lOiBjYW5jZWxBbmltYXRpb25GcmFtZSxcbiAgICAgIGFsZXJ0OiBmdW5jdGlvbiBhbGVydChtZXNzYWdlKSB7XG4gICAgICAgIHZhciBtb2RhbCA9IF9fd2VleF9yZXF1aXJlX18oTU9EQUxfTU9EVUxFKTtcbiAgICAgICAgbW9kYWwuYWxlcnQoe1xuICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge30pO1xuICAgICAgfSxcbiAgICAgIG9wZW46IGZ1bmN0aW9uIG9wZW4odXJsKSB7XG4gICAgICAgIHZhciB3ZWV4TmF2aWdhdG9yID0gX193ZWV4X3JlcXVpcmVfXyhOQVZJR0FUT1JfTU9EVUxFKTtcbiAgICAgICAgd2VleE5hdmlnYXRvci5wdXNoKHtcbiAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICBhbmltYXRlZDogdHJ1ZVxuICAgICAgICB9LCBub29wKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZTogZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgICAgIHZhciB3ZWV4TmF2aWdhdG9yID0gX193ZWV4X3JlcXVpcmVfXyhOQVZJR0FUT1JfTU9EVUxFKTtcbiAgICAgICAgd2VleE5hdmlnYXRvci5jbG9zZSh7XG4gICAgICAgICAgYW5pbWF0ZWQ6IHRydWVcbiAgICAgICAgfSwgbm9vcCwgbm9vcCk7XG4gICAgICB9LFxuICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uIHBvc3RNZXNzYWdlKG1lc3NhZ2UsIHRhcmdldE9yaWdpbikge1xuICAgICAgICB2YXIgZXZlbnQgPSB7XG4gICAgICAgICAgb3JpZ2luOiBsb2NhdGlvbi5vcmlnaW4sXG4gICAgICAgICAgZGF0YTogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtZXNzYWdlKSksXG4gICAgICAgICAgdHlwZTogJ21lc3NhZ2UnLFxuICAgICAgICAgIHNvdXJjZTogd2luZG93IC8vIEZJWE1FOiBtYXliZSBub3QgZXhwb3J0IHdpbmRvd1xuICAgICAgICB9O1xuICAgICAgICBkaXNwYXRjaEV2ZW50VG9JbnN0YW5jZShldmVudCwgdGFyZ2V0T3JpZ2luKTtcbiAgICAgIH0sXG4gICAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHdpbmRvd0VtaXR0ZXIub24odHlwZSwgbGlzdGVuZXIpO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgd2luZG93RW1pdHRlci5vZmYodHlwZSwgbGlzdGVuZXIpO1xuICAgICAgfSxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoZSkge1xuICAgICAgICB3aW5kb3dFbWl0dGVyLmVtaXQoZS50eXBlLCBlKTtcbiAgICAgIH0sXG4gICAgICAvLyBNb2R1bGVKU1xuICAgICAgZGVmaW5lOiBfX3dlZXhfZGVmaW5lX18sXG4gICAgICByZXF1aXJlOiBfX3dlZXhfcmVxdWlyZV9fLFxuICAgICAgLy8gV2VleFxuICAgICAgX193ZWV4X2RvY3VtZW50X186IGRvY3VtZW50LFxuICAgICAgX193ZWV4X2RlZmluZV9fOiBfX3dlZXhfZGVmaW5lX18sXG4gICAgICBfX3dlZXhfcmVxdWlyZV9fOiBfX3dlZXhfcmVxdWlyZV9fLFxuICAgICAgX193ZWV4X2Rvd25ncmFkZV9fOiBfX3dlZXhfZG93bmdyYWRlX18sXG4gICAgICBfX3dlZXhfZW52X186IF9fd2VleF9lbnZfXyxcbiAgICAgIF9fd2VleF9jb2RlX186IF9fd2VleF9jb2RlX18sXG4gICAgICBfX3dlZXhfb3B0aW9uc19fOiBfX3dlZXhfb3B0aW9uc19fLFxuICAgICAgX193ZWV4X2RhdGFfXzogX193ZWV4X2RhdGFfX1xuICAgIH07XG5cbiAgICBpbnN0YW5jZS53aW5kb3cgPSB3aW5kb3cuc2VsZiA9IHdpbmRvdy53aW5kb3cgPSB3aW5kb3c7XG5cbiAgICB2YXIgYnVpbHRpbkdsb2JhbHMgPSB7fTtcbiAgICB2YXIgYnVpbHRpbk1vZHVsZXMgPSB7fTtcbiAgICB0cnkge1xuICAgICAgYnVpbHRpbkdsb2JhbHMgPSBfX3dlZXhfY29uZmlnX18uc2VydmljZXMuYnVpbHRpbkdsb2JhbHM7XG4gICAgICAvLyBNb2R1bGVzIHNob3VsZCB3cmFwIGFzIG1vZHVsZSBmYWN0b3J5IGZvcm1hdFxuICAgICAgYnVpbHRpbk1vZHVsZXMgPSBfX3dlZXhfY29uZmlnX18uc2VydmljZXMuYnVpbHRpbk1vZHVsZXM7XG4gICAgfSBjYXRjaCAoZSkge31cblxuICAgIE9iamVjdC5hc3NpZ24od2luZG93LCBidWlsdGluR2xvYmFscyk7XG5cbiAgICB2YXIgbW9kdWxlRmFjdG9yaWVzID0gX2V4dGVuZHMoe30sIF9idWlsdGluLk1vZHVsZUZhY3RvcmllcywgYnVpbHRpbk1vZHVsZXMpO1xuICAgIGdlbkJ1aWx0aW5Nb2R1bGVzKG1vZHVsZXMsIG1vZHVsZUZhY3Rvcmllcywgd2luZG93KTtcbiAgICAvLyBJbiB3ZWV4IGlPUyBvciBBbmRyb2lkXG4gICAgaWYgKF9fd2VleF9lbnZfXy5wbGF0Zm9ybSAhPT0gJ1dlYicpIHtcbiAgICAgIHZhciB0aW1pbmcgPSBwZXJmb3JtYW5jZS50aW1pbmc7XG4gICAgICB0aW1pbmcuZG9tTG9hZGluZyA9IERhdGUubm93KCk7XG5cbiAgICAgIC8vIFVzZSB0aGUgY2FjaGVkIGluaXQgZnVuY3Rpb24sIGlmIGV4aXN0ZWQgaW4gYnVuZGxlc1xuICAgICAgdmFyIF9pbml0ID0gYnVuZGxlc1tfX3dlZXhfY29kZV9fXSA/IGJ1bmRsZXNbX193ZWV4X2NvZGVfX10gOiBuZXcgRnVuY3Rpb24oJ3dpdGgodGhpcyl7KGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7XFxuJyArIF9fd2VleF9jb2RlX18gKyAnXFxufSkuY2FsbCh0aGlzKX0nKTtcblxuICAgICAgX2luaXQuY2FsbChcbiAgICAgIC8vIENvbnRleHQgaXMgd2luZG93XG4gICAgICB3aW5kb3cpO1xuXG4gICAgICB0aW1pbmcuZG9tSW50ZXJhY3RpdmUgPSB0aW1pbmcuZG9tQ29tcGxldGUgPSB0aW1pbmcuZG9tSW50ZXJhY3RpdmUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYWNoZSB0aGUgaW5pdCBmdW5jdGlvblxuICAgICAgYnVuZGxlc1tfX3dlZXhfY29kZV9fXSA9IF9pbml0O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiB3ZWV4IGg1XG4gICAgICB2YXIgX2luaXQyID0gbmV3IEZ1bmN0aW9uKCdcInVzZSBzdHJpY3RcIjtcXG4nICsgX193ZWV4X2NvZGVfXyk7XG5cbiAgICAgIF9pbml0Mi5jYWxsKHdpbmRvdyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5zdGFuY2UgaWQgXCInICsgaW5zdGFuY2VJZCArICdcIiBleGlzdGVkIHdoZW4gY3JlYXRlIGluc3RhbmNlJyk7XG4gIH1cbn1cblxuLyoqXG4gKiByZWZyZXNoIGEgV2VleCBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gaW5zdGFuY2VJZFxuICogQHBhcmFtICB7b2JqZWN0fSBkYXRhXG4gKi9cbmZ1bmN0aW9uIHJlZnJlc2hJbnN0YW5jZShpbnN0YW5jZUlkLCBkYXRhKSB7XG4gIHZhciBpbnN0YW5jZSA9IGdldEluc3RhbmNlKGluc3RhbmNlSWQpO1xuICB2YXIgZG9jdW1lbnQgPSBpbnN0YW5jZS5kb2N1bWVudDtcbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmZpcmVFdmVudCgncmVmcmVzaCcsIHtcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgZGF0YTogZGF0YVxuICB9KTtcbiAgZG9jdW1lbnQudGFza0NlbnRlci5zZW5kKCdkb20nLCB7IGFjdGlvbjogJ3JlZnJlc2hGaW5pc2gnIH0sIFtdKTtcbn1cblxuLyoqXG4gKiBkZXN0cm95IGEgV2VleCBpbnN0YW5jZVxuICogQHBhcmFtICB7c3RyaW5nfSBpbnN0YW5jZUlkXG4gKi9cbmZ1bmN0aW9uIGRlc3Ryb3lJbnN0YW5jZShpbnN0YW5jZUlkKSB7XG4gIHZhciBpbnN0YW5jZSA9IGdldEluc3RhbmNlKGluc3RhbmNlSWQpO1xuICB2YXIgYnVuZGxlQ29kZSA9IGluc3RhbmNlLmJ1bmRsZUNvZGU7XG4gIGluc3RhbmNlLndpbmRvdy5jbG9zZWQgPSB0cnVlO1xuXG4gIHZhciBkb2N1bWVudCA9IGluc3RhbmNlLmRvY3VtZW50O1xuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZmlyZUV2ZW50KCdkZXN0b3J5Jywge1xuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9KTtcblxuICBpZiAoZG9jdW1lbnQuZGVzdHJveSkge1xuICAgIGRvY3VtZW50LmRlc3Ryb3koKTtcbiAgfVxuXG4gIGlmIChkb2N1bWVudC50YXNrQ2VudGVyICYmIGRvY3VtZW50LnRhc2tDZW50ZXIuZGVzdHJveUNhbGxiYWNrKSB7XG4gICAgZG9jdW1lbnQudGFza0NlbnRlci5kZXN0cm95Q2FsbGJhY2soKTtcbiAgfVxuXG4gIGRlbGV0ZSBpbnN0YW5jZXNbaW5zdGFuY2VJZF07XG4gIGRlbGV0ZSBidW5kbGVzW2J1bmRsZUNvZGVdO1xufVxuXG4vKipcbiAqIGdldCBhIHdob2xlIGVsZW1lbnQgdHJlZSBvZiBhbiBpbnN0YW5jZVxuICogZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtICB7c3RyaW5nfSBpbnN0YW5jZUlkXG4gKiBAcmV0dXJuIHtvYmplY3R9IGEgdmlydHVhbCBkb20gdHJlZVxuICovXG5mdW5jdGlvbiBnZXRSb290KGluc3RhbmNlSWQpIHtcbiAgdmFyIGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoaW5zdGFuY2VJZCk7XG4gIHZhciBkb2N1bWVudCA9IGluc3RhbmNlLmRvY3VtZW50O1xuICByZXR1cm4gZG9jdW1lbnQudG9KU09OID8gZG9jdW1lbnQudG9KU09OKCkgOiB7fTtcbn1cblxuZnVuY3Rpb24gZmlyZUV2ZW50KGRvYywgcmVmLCB0eXBlLCBlLCBkb21DaGFuZ2VzKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlZikpIHtcbiAgICByZWYuc29tZShmdW5jdGlvbiAocmVmKSB7XG4gICAgICByZXR1cm4gZmlyZUV2ZW50KGRvYywgcmVmLCB0eXBlLCBlKSAhPT0gZmFsc2U7XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGVsID0gZG9jLmdldFJlZihyZWYpO1xuXG4gIGlmIChlbCkge1xuICAgIHZhciByZXN1bHQgPSBkb2MuZmlyZUV2ZW50KGVsLCB0eXBlLCBlLCBkb21DaGFuZ2VzKTtcbiAgICB1cGRhdGVGaW5pc2goZG9jKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50IHJlZmVyZW5jZSBcIicgKyByZWYgKyAnXCInKTtcbn1cblxuLyoqXG4gKiBhY2NlcHQgY2FsbHMgZnJvbSBuYXRpdmUgKGV2ZW50IG9yIGNhbGxiYWNrKVxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gaW5zdGFuY2VJZFxuICogQHBhcmFtICB7YXJyYXl9IHRhc2tzIGxpc3Qgd2l0aCBgbWV0aG9kYCBhbmQgYGFyZ3NgXG4gKi9cbmZ1bmN0aW9uIHJlY2VpdmVUYXNrcyhpbnN0YW5jZUlkLCB0YXNrcykge1xuICB2YXIgaW5zdGFuY2UgPSBnZXRJbnN0YW5jZShpbnN0YW5jZUlkKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodGFza3MpKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gaW5zdGFuY2UuZG9jdW1lbnQ7XG5cbiAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgIHRhc2tzLmZvckVhY2goZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgIHZhciByZXN1bHQgPSB2b2lkIDA7XG4gICAgICBpZiAodGFzay5tZXRob2QgPT09ICdmaXJlRXZlbnQnKSB7XG4gICAgICAgIHZhciBfdGFzayRhcmdzID0gX3NsaWNlZFRvQXJyYXkodGFzay5hcmdzLCA0KSxcbiAgICAgICAgICAgIG5vZGVJZCA9IF90YXNrJGFyZ3NbMF0sXG4gICAgICAgICAgICB0eXBlID0gX3Rhc2skYXJnc1sxXSxcbiAgICAgICAgICAgIGRhdGEgPSBfdGFzayRhcmdzWzJdLFxuICAgICAgICAgICAgZG9tQ2hhbmdlcyA9IF90YXNrJGFyZ3NbM107XG5cbiAgICAgICAgcmVzdWx0ID0gZmlyZUV2ZW50KGRvY3VtZW50LCBub2RlSWQsIHR5cGUsIGRhdGEsIGRvbUNoYW5nZXMpO1xuICAgICAgfSBlbHNlIGlmICh0YXNrLm1ldGhvZCA9PT0gJ2NhbGxiYWNrJykge1xuICAgICAgICB2YXIgX3Rhc2skYXJnczIgPSBfc2xpY2VkVG9BcnJheSh0YXNrLmFyZ3MsIDMpLFxuICAgICAgICAgICAgdWlkID0gX3Rhc2skYXJnczJbMF0sXG4gICAgICAgICAgICBfZGF0YSA9IF90YXNrJGFyZ3MyWzFdLFxuICAgICAgICAgICAgaWZLZWVwQWxpdmUgPSBfdGFzayRhcmdzMlsyXTtcblxuICAgICAgICByZXN1bHQgPSBkb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrKHVpZCwgX2RhdGEsIGlmS2VlcEFsaXZlKTtcbiAgICAgICAgdXBkYXRlRmluaXNoKGRvY3VtZW50KTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG5cbi8vIEZJWE1FOiBIYWNrIGZvciByb2xsdXAgYnVpbGQgXCJpbXBvcnQgUmF4IGZyb20gJ3dlZXgtcmF4LWZyYW1ld29yaydcIiwgaW4gcm9sbHVwIGlmIGBtb2R1bGUuZXhwb3J0c2AgaGFzIGBfX2VzTW9kdWxlYCBrZXkgbXVzdCByZXR1cm4gYnkgZXhwb3J0IGRlZmF1bHRcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHM7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvYnVpbHRpbi5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbnZhciBNb2R1bGVGYWN0b3JpZXMgPSBleHBvcnRzLk1vZHVsZUZhY3RvcmllcyA9IHtcbiAgJ3JheCc6IF9fd2VicGFja19yZXF1aXJlX18oLyohIHJheC9kaXN0L3JheC5mYWN0b3J5ICovIDUpXG59O1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3JheC9kaXN0L3JheC5mYWN0b3J5LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7XG4gIHZhciBfX3dlZXhfZG9jdW1lbnRfXyA9IHRoaXNbXCJfX3dlZXhfZG9jdW1lbnRfX1wiXTtcbnZhciBkb2N1bWVudCA9IHRoaXNbXCJkb2N1bWVudFwiXTtcbiAgbW9kdWxlLmV4cG9ydHMgPSAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTUpO1xuLyoqKioqKi8gfSlcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyAoW1xuLyogMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLypcbiAqIFN0YXRlZnVsIHRoaW5ncyBpbiBydW50aW1lXG4gKi9cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgY29tcG9uZW50OiBudWxsLFxuICBtb3VudElEOiAxLFxuICBzYW5kYm94OiB0cnVlLFxuICAvLyBSb290c1xuICByb290Q29tcG9uZW50czoge30sXG4gIHJvb3RJbnN0YW5jZXM6IHt9LFxuICAvLyBJbmplY3RcbiAgaG9vazogbnVsbCxcbiAgZHJpdmVyOiBudWxsLFxuICBtb25pdG9yOiBudWxsXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxudmFyIF9lbGVtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg3KTtcblxudmFyIF91bm1vdW50Q29tcG9uZW50QXROb2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblxudmFyIF91bm1vdW50Q29tcG9uZW50QXROb2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3VubW91bnRDb21wb25lbnRBdE5vZGUpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW50aWF0ZUNvbXBvbmVudCk7XG5cbnZhciBfc2hvdWxkVXBkYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxudmFyIF9zaG91bGRVcGRhdGVDb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hvdWxkVXBkYXRlQ29tcG9uZW50KTtcblxudmFyIF9yb290ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxOCk7XG5cbnZhciBfcm9vdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yb290KTtcblxudmFyIF91bml2ZXJzYWxFbnYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuLyoqXG4gKiBJbnN0YW5jZSBtYW5hZ2VyXG4gKi9cbnZhciBLRVkgPSAnJCRpbnN0YW5jZSc7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgc2V0OiBmdW5jdGlvbiBzZXQobm9kZSwgaW5zdGFuY2UpIHtcbiAgICBpZiAoIW5vZGVbS0VZXSkge1xuICAgICAgbm9kZVtLRVldID0gaW5zdGFuY2U7XG4gICAgICAvLyBSZWNvcmQgcm9vdCBpbnN0YW5jZSB0byByb290cyBtYXBcbiAgICAgIGlmIChpbnN0YW5jZS5yb290SUQpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQucm9vdEluc3RhbmNlc1tpbnN0YW5jZS5yb290SURdID0gaW5zdGFuY2U7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LnJvb3RDb21wb25lbnRzW2luc3RhbmNlLnJvb3RJRF0gPSBpbnN0YW5jZS5faW50ZXJuYWw7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBnZXQ6IGZ1bmN0aW9uIGdldChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGVbS0VZXTtcbiAgfSxcbiAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUobm9kZSkge1xuICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuZ2V0KG5vZGUpO1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgbm9kZVtLRVldID0gbnVsbDtcbiAgICAgIGlmIChpbnN0YW5jZS5yb290SUQpIHtcbiAgICAgICAgZGVsZXRlIF9ob3N0Mi5kZWZhdWx0LnJvb3RDb21wb25lbnRzW2luc3RhbmNlLnJvb3RJRF07XG4gICAgICAgIGRlbGV0ZSBfaG9zdDIuZGVmYXVsdC5yb290SW5zdGFuY2VzW2luc3RhbmNlLnJvb3RJRF07XG4gICAgICB9XG4gICAgfVxuICB9LFxuICByZW5kZXI6IGZ1bmN0aW9uIHJlbmRlcihlbGVtZW50LCBjb250YWluZXIpIHtcbiAgICBpZiAoZmFsc2UpIHtcbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLmJlZm9yZVJlbmRlcigpO1xuICAgIH1cblxuICAgIC8vIEJlZm9yZSByZW5kZXIgY2FsbGJhY2tcbiAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYmVmb3JlUmVuZGVyICYmIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5iZWZvcmVSZW5kZXIoKTtcblxuICAgIC8vIFJlYWwgbmF0aXZlIHJvb3Qgbm9kZSBpcyBib2R5XG4gICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgICBjb250YWluZXIgPSBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuY3JlYXRlQm9keSgpO1xuICAgIH1cblxuICAgIHZhciBwcmV2Um9vdEluc3RhbmNlID0gdGhpcy5nZXQoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzUHJldlJvb3RJbnN0YW5jZSA9IHByZXZSb290SW5zdGFuY2UgJiYgcHJldlJvb3RJbnN0YW5jZS5pc1Jvb3RDb21wb25lbnQ7XG5cbiAgICBpZiAoaGFzUHJldlJvb3RJbnN0YW5jZSkge1xuICAgICAgdmFyIHByZXZSZW5kZXJlZENvbXBvbmVudCA9IHByZXZSb290SW5zdGFuY2UuZ2V0UmVuZGVyZWRDb21wb25lbnQoKTtcbiAgICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZSZW5kZXJlZENvbXBvbmVudC5fY3VycmVudEVsZW1lbnQ7XG4gICAgICBpZiAoKDAsIF9zaG91bGRVcGRhdGVDb21wb25lbnQyLmRlZmF1bHQpKHByZXZFbGVtZW50LCBlbGVtZW50KSkge1xuICAgICAgICB2YXIgcHJldlVubWFza2VkQ29udGV4dCA9IHByZXZSZW5kZXJlZENvbXBvbmVudC5fY29udGV4dDtcbiAgICAgICAgcHJldlJlbmRlcmVkQ29tcG9uZW50LnVwZGF0ZUNvbXBvbmVudChwcmV2RWxlbWVudCwgZWxlbWVudCwgcHJldlVubWFza2VkQ29udGV4dCwgcHJldlVubWFza2VkQ29udGV4dCk7XG5cbiAgICAgICAgcmV0dXJuIHByZXZSb290SW5zdGFuY2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChwcmV2Um9vdEluc3RhbmNlKTtcbiAgICAgICAgKDAsIF91bm1vdW50Q29tcG9uZW50QXROb2RlMi5kZWZhdWx0KShjb250YWluZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZXJ2ZXIgcmVuZGVyZWQgZWxlbWVudFxuICAgIGlmIChfdW5pdmVyc2FsRW52LmlzV2ViICYmIGNvbnRhaW5lci5jaGlsZE5vZGVzKSB7XG4gICAgICAvLyBDbG9uZSBjaGlsZE5vZGVzLCBCZWNhdXNlIHJlbW92ZUNoaWxkIHdpbGwgY2F1c2luZyBjaGFuZ2UgaW4gY2hpbGROb2RlcyBsZW5ndGhcbiAgICAgIHZhciBjaGlsZE5vZGVzID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShjb250YWluZXIuY2hpbGROb2RlcykpO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHJvb3RDaGlsZE5vZGUgPSBjaGlsZE5vZGVzW2ldO1xuICAgICAgICBpZiAocm9vdENoaWxkTm9kZS5oYXNBdHRyaWJ1dGUgJiYgcm9vdENoaWxkTm9kZS5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmVuZGVyZWQnKSkge1xuICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZChyb290Q2hpbGROb2RlLCBjb250YWluZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHdyYXBwZWRFbGVtZW50ID0gKDAsIF9lbGVtZW50LmNyZWF0ZUVsZW1lbnQpKF9yb290Mi5kZWZhdWx0LCBudWxsLCBlbGVtZW50KTtcbiAgICB2YXIgcmVuZGVyZWRDb21wb25lbnQgPSAoMCwgX2luc3RhbnRpYXRlQ29tcG9uZW50Mi5kZWZhdWx0KSh3cmFwcGVkRWxlbWVudCk7XG4gICAgdmFyIGRlZmF1bHRDb250ZXh0ID0ge307XG4gICAgdmFyIHJvb3RJbnN0YW5jZSA9IHJlbmRlcmVkQ29tcG9uZW50Lm1vdW50Q29tcG9uZW50KGNvbnRhaW5lciwgZGVmYXVsdENvbnRleHQpO1xuICAgIHRoaXMuc2V0KGNvbnRhaW5lciwgcm9vdEluc3RhbmNlKTtcblxuICAgIC8vIEFmdGVyIHJlbmRlciBjYWxsYmFja1xuICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5hZnRlclJlbmRlciAmJiBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYWZ0ZXJSZW5kZXIocm9vdEluc3RhbmNlKTtcblxuICAgIC8vIERldnRvb2wgcmVuZGVyIG5ldyByb290IGhvb2tcbiAgICBfaG9zdDIuZGVmYXVsdC5ob29rLk1vdW50Ll9yZW5kZXJOZXdSb290Q29tcG9uZW50KHJvb3RJbnN0YW5jZS5faW50ZXJuYWwpO1xuXG4gICAgaWYgKGZhbHNlKSB7XG4gICAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5hZnRlclJlbmRlcigpO1xuICAgIH1cblxuICAgIHJldHVybiByb290SW5zdGFuY2U7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBpbnN0YW50aWF0ZUNvbXBvbmVudChlbGVtZW50KSB7XG4gIHZhciBpbnN0YW5jZSA9IHZvaWQgMDtcblxuICBpZiAoZWxlbWVudCA9PT0gdW5kZWZpbmVkIHx8IGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gZmFsc2UgfHwgZWxlbWVudCA9PT0gdHJ1ZSkge1xuICAgIGluc3RhbmNlID0gbmV3IF9ob3N0Mi5kZWZhdWx0LkVtcHR5Q29tcG9uZW50KCk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50KSkge1xuICAgIGluc3RhbmNlID0gbmV3IF9ob3N0Mi5kZWZhdWx0LkZyYWdtZW50Q29tcG9uZW50KGVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKCh0eXBlb2YgZWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoZWxlbWVudCkpID09PSAnb2JqZWN0JyAmJiBlbGVtZW50LnR5cGUpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2Ugc3RyaW5nIHZhbHVlc1xuICAgIGlmICh0eXBlb2YgZWxlbWVudC50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgX2hvc3QyLmRlZmF1bHQuTmF0aXZlQ29tcG9uZW50KGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZSA9IG5ldyBfaG9zdDIuZGVmYXVsdC5Db21wb3NpdGVDb21wb25lbnQoZWxlbWVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxlbWVudCA9PT0gJ251bWJlcicpIHtcbiAgICBpbnN0YW5jZSA9IG5ldyBfaG9zdDIuZGVmYXVsdC5UZXh0Q29tcG9uZW50KGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQgdHlwZSAnICsgSlNPTi5zdHJpbmdpZnkoZWxlbWVudCkpO1xuICB9XG5cbiAgaW5zdGFuY2UuX21vdW50SW5kZXggPSAwO1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gaW5zdGFudGlhdGVDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mMiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcikgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YyKG9iaik7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mMihvYmopO1xufTtcblxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNkb20tbmF2aWdhdG9yLWFwcGNvZGVuYW1lXG52YXIgaXNXZWIgPSBleHBvcnRzLmlzV2ViID0gKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG5hdmlnYXRvcikpID09PSAnb2JqZWN0JyAmJiAobmF2aWdhdG9yLmFwcENvZGVOYW1lID09PSAnTW96aWxsYScgfHwgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdHZWNrbycpO1xudmFyIGlzTm9kZSA9IGV4cG9ydHMuaXNOb2RlID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICEhKHByb2Nlc3MudmVyc2lvbnMgJiYgcHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcbnZhciBpc1dlZXggPSBleHBvcnRzLmlzV2VleCA9IHR5cGVvZiBjYWxsTmF0aXZlID09PSAnZnVuY3Rpb24nO1xudmFyIGlzUmVhY3ROYXRpdmUgPSBleHBvcnRzLmlzUmVhY3ROYXRpdmUgPSB0eXBlb2YgX19mYkJhdGNoZWRCcmlkZ2VDb25maWcgIT09ICd1bmRlZmluZWQnO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSB7XG4gIC8vIFRPRE86IHByZXZFbGVtZW50IGFuZCBuZXh0RWxlbWVudCBjb3VsZCBiZSBhcnJheVxuICB2YXIgcHJldkVtcHR5ID0gcHJldkVsZW1lbnQgPT09IG51bGw7XG4gIHZhciBuZXh0RW1wdHkgPSBuZXh0RWxlbWVudCA9PT0gbnVsbDtcbiAgaWYgKHByZXZFbXB0eSB8fCBuZXh0RW1wdHkpIHtcbiAgICByZXR1cm4gcHJldkVtcHR5ID09PSBuZXh0RW1wdHk7XG4gIH1cblxuICB2YXIgcHJldlR5cGUgPSB0eXBlb2YgcHJldkVsZW1lbnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHByZXZFbGVtZW50KTtcbiAgdmFyIG5leHRUeXBlID0gdHlwZW9mIG5leHRFbGVtZW50ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihuZXh0RWxlbWVudCk7XG4gIGlmIChwcmV2VHlwZSA9PT0gJ3N0cmluZycgfHwgcHJldlR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG5leHRUeXBlID09PSAnc3RyaW5nJyB8fCBuZXh0VHlwZSA9PT0gJ251bWJlcic7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZUeXBlID09PSAnb2JqZWN0JyAmJiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgcHJldkVsZW1lbnQudHlwZSA9PT0gbmV4dEVsZW1lbnQudHlwZSAmJiBwcmV2RWxlbWVudC5rZXkgPT09IG5leHRFbGVtZW50LmtleTtcbiAgfVxufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBzaG91bGRVcGRhdGVDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qKlxuICogQmFzZSBjb21wb25lbnQgY2xhc3MuXG4gKi9cbnZhciBDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb25lbnQpO1xuXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5yZWZzID0ge307XG4gICAgdGhpcy51cGRhdGVyID0gdXBkYXRlcjtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhDb21wb25lbnQsIFt7XG4gICAga2V5OiBcImlzQ29tcG9uZW50Q2xhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaXNDb21wb25lbnRDbGFzcygpIHt9XG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U3RhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U3RhdGUocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLnNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmb3JjZVVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmb3JjZVVwZGF0ZShjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLmZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfaW5zdGFuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5zdGFuY2UpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgQ29tcG9uZW50VHJlZToge1xuICAgIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlOiBmdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7XG4gICAgICByZXR1cm4gX2luc3RhbmNlMi5kZWZhdWx0LmdldChub2RlKTtcbiAgICB9LFxuICAgIGdldE5vZGVGcm9tSW5zdGFuY2U6IGZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICAgICAgLy8gaW5zdCBpcyBhbiBpbnRlcm5hbCBpbnN0YW5jZSAoYnV0IGNvdWxkIGJlIGEgY29tcG9zaXRlKVxuICAgICAgd2hpbGUgKGluc3QuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICAgIGluc3QgPSBpbnN0Ll9yZW5kZXJlZENvbXBvbmVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3QpIHtcbiAgICAgICAgcmV0dXJuIGluc3QuX25hdGl2ZU5vZGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIE1vdW50OiB7XG4gICAgX2luc3RhbmNlc0J5UmVhY3RSb290SUQ6IF9ob3N0Mi5kZWZhdWx0LnJvb3RDb21wb25lbnRzLFxuXG4gICAgLy8gU3R1YiAtIFJlYWN0IERldlRvb2xzIGV4cGVjdHMgdG8gZmluZCB0aGlzIG1ldGhvZCBhbmQgcmVwbGFjZSBpdFxuICAgIC8vIHdpdGggYSB3cmFwcGVyIGluIG9yZGVyIHRvIG9ic2VydmUgbmV3IHJvb3QgY29tcG9uZW50cyBiZWluZyBhZGRlZFxuICAgIF9yZW5kZXJOZXdSb290Q29tcG9uZW50OiBmdW5jdGlvbiBfcmVuZGVyTmV3Um9vdENvbXBvbmVudCgpIHt9XG4gIH0sXG4gIFJlY29uY2lsZXI6IHtcbiAgICAvLyBTdHVicyAtIFJlYWN0IERldlRvb2xzIGV4cGVjdHMgdG8gZmluZCB0aGVzZSBtZXRob2RzIGFuZCByZXBsYWNlIHRoZW1cbiAgICAvLyB3aXRoIHdyYXBwZXJzIGluIG9yZGVyIHRvIG9ic2VydmUgY29tcG9uZW50cyBiZWluZyBtb3VudGVkLCB1cGRhdGVkIGFuZFxuICAgIC8vIHVubW91bnRlZFxuICAgIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiBtb3VudENvbXBvbmVudCgpIHt9LFxuICAgIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIHJlY2VpdmVDb21wb25lbnQoKSB7fSxcbiAgICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50KCkge31cbiAgfSxcbiAgLy8gbW9uaXRvciB0aGUgaW5mbyBvZiBhbGwgY29tcG9uZW50c1xuICBtb25pdG9yOiBudWxsXG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogNyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQ7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQ7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxudmFyIF9mbGF0dGVuQ2hpbGRyZW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE3KTtcblxudmFyIF9mbGF0dGVuQ2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmxhdHRlbkNoaWxkcmVuKTtcblxudmFyIF91bml2ZXJzYWxFbnYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBnZXRSZW5kZXJFcnJvckluZm8oKSB7XG4gIGlmIChfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQpIHtcbiAgICB2YXIgbmFtZSA9IF9ob3N0Mi5kZWZhdWx0LmNvbXBvbmVudC5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxudmFyIEVsZW1lbnQgPSBmdW5jdGlvbiBFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBwcm9wcywgb3duZXIpIHtcbiAgcHJvcHMgPSBmaWx0ZXJQcm9wcyh0eXBlLCBwcm9wcyk7XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBFbGVtZW50O1xuXG5cbmZ1bmN0aW9uIGZsYXR0ZW5TdHlsZShzdHlsZSkge1xuICBpZiAoIXN0eWxlKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShzdHlsZSkpIHtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBjb21wdXRlZFN0eWxlID0gZmxhdHRlblN0eWxlKHN0eWxlW2ldKTtcbiAgICAgIGlmIChjb21wdXRlZFN0eWxlKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjb21wdXRlZFN0eWxlKSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBjb21wdXRlZFN0eWxlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vLyBUT0RPOiBtb3ZlIHRvIHdlZXgtZHJ2aWVyXG5mdW5jdGlvbiBmaWx0ZXJQcm9wcyh0eXBlLCBwcm9wcykge1xuICAvLyBPbmx5IGZvciB3ZWV4IHRleHRcbiAgaWYgKF91bml2ZXJzYWxFbnYuaXNXZWV4ICYmIHR5cGUgPT09ICd0ZXh0Jykge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gICAgLy8gVmFsdWUgaXMgZmlyc3RcbiAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuam9pbignJyk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjaGlsZHJlbiAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGNoaWxkcmVuICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjaGlsZHJlbiA9ICcnO1xuICAgICAgfVxuXG4gICAgICBwcm9wcy52YWx1ZSA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZykge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgRXJyb3IoJ2NyZWF0ZUVsZW1lbnQ6IHR5cGUgc2hvdWxkIG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nICsgZ2V0UmVuZGVyRXJyb3JJbmZvKCkpO1xuICB9XG4gIC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBwcm9wTmFtZSA9IHZvaWQgMDtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciByZWYgPSBudWxsO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIHJlZiA9IGNvbmZpZy5yZWYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcucmVmO1xuICAgIGtleSA9IGNvbmZpZy5rZXkgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcoY29uZmlnLmtleSk7XG4gICAgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoY29uZmlnLmhhc093blByb3BlcnR5KHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGNoaWxkcmVuID0gQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGNoaWxkcmVuW19rZXkgLSAyXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9ICgwLCBfZmxhdHRlbkNoaWxkcmVuMi5kZWZhdWx0KShjaGlsZHJlbik7XG4gIH1cblxuICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5zdHlsZSAmJiAoQXJyYXkuaXNBcnJheShwcm9wcy5zdHlsZSkgfHwgX3R5cGVvZihwcm9wcy5zdHlsZSkgPT09ICdvYmplY3QnKSkge1xuICAgIHByb3BzLnN0eWxlID0gZmxhdHRlblN0eWxlKHByb3BzLnN0eWxlKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgRWxlbWVudCh0eXBlLCBrZXksIHJlZiwgcHJvcHMsIF9ob3N0Mi5kZWZhdWx0LmNvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnkodHlwZSkge1xuICB2YXIgZmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbiAgLy8gRXhwb3NlIHRoZSB0eXBlIG9uIHRoZSBmYWN0b3J5IGFuZCB0aGUgcHJvdG90eXBlIHNvIHRoYXQgaXQgY2FuIGJlXG4gIC8vIGVhc2lseSBhY2Nlc3NlZCBvbiBlbGVtZW50cy4gRS5nLiBgPEZvbyAvPi50eXBlID09PSBGb29gLlxuICAvLyBUaGlzIHNob3VsZCBub3QgYmUgbmFtZWQgYGNvbnN0cnVjdG9yYCBzaW5jZSB0aGlzIG1heSBub3QgYmUgdGhlIGZ1bmN0aW9uXG4gIC8vIHRoYXQgY3JlYXRlZCB0aGUgZWxlbWVudCwgYW5kIGl0IG1heSBub3QgZXZlbiBiZSBhIGNvbnN0cnVjdG9yLlxuICBmYWN0b3J5LnR5cGUgPSB0eXBlO1xuICByZXR1cm4gZmFjdG9yeTtcbn1cblxuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIGNvbmZpZykge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgdGhyb3cgRXJyb3IoJ2Nsb25lRWxlbWVudDogbm90IGEgdmFsaWQgZWxlbWVudC4nICsgZ2V0UmVuZGVyRXJyb3JJbmZvKCkpO1xuICB9XG5cbiAgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuICB2YXIgcHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTtcblxuICAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHJlZiA9IGVsZW1lbnQucmVmO1xuXG4gIC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZykge1xuICAgIC8vIFNob3VsZCByZXNldCByZWYgYW5kIG93bmVyIGlmIGhhcyBhIG5ldyByZWZcbiAgICBpZiAoY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5ID0gU3RyaW5nKGNvbmZpZy5rZXkpO1xuICAgIH1cblxuICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSB2b2lkIDA7XG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuICAgIHZhciBwcm9wTmFtZSA9IHZvaWQgMDtcbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGNvbmZpZy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBjaGlsZHJlbiA9IEFycmF5KF9sZW4yID4gMiA/IF9sZW4yIC0gMiA6IDApLCBfa2V5MiA9IDI7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBjaGlsZHJlbltfa2V5MiAtIDJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuXG4gIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9ICgwLCBfZmxhdHRlbkNoaWxkcmVuMi5kZWZhdWx0KShjaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gbmV3IEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgcHJvcHMsIG93bmVyKTtcbn07XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gKHR5cGVvZiBvYmplY3QgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9iamVjdCkpID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LnR5cGUgJiYgb2JqZWN0LnByb3BzO1xufVxuXG4vKioqLyB9KSxcbi8qIDggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHVubW91bnRDb21wb25lbnRBdE5vZGU7XG5cbnZhciBfaW5zdGFuY2UgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG52YXIgX2luc3RhbmNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luc3RhbmNlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudEF0Tm9kZShub2RlKSB7XG4gIHZhciBjb21wb25lbnQgPSBfaW5zdGFuY2UyLmRlZmF1bHQuZ2V0KG5vZGUpO1xuXG4gIGlmICghY29tcG9uZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2luc3RhbmNlMi5kZWZhdWx0LnJlbW92ZShub2RlKTtcbiAgY29tcG9uZW50Ll9pbnRlcm5hbC51bm1vdW50Q29tcG9uZW50KCk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbnZhciBfcmVmID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMCk7XG5cbnZhciBfcmVmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlZik7XG5cbnZhciBfaW5zdGFudGlhdGVDb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luc3RhbnRpYXRlQ29tcG9uZW50KTtcblxudmFyIF9zaG91bGRVcGRhdGVDb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXG52YXIgX3Nob3VsZFVwZGF0ZUNvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zaG91bGRVcGRhdGVDb21wb25lbnQpO1xuXG52YXIgX2dldEVsZW1lbnRLZXlOYW1lID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMSk7XG5cbnZhciBfZ2V0RWxlbWVudEtleU5hbWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0RWxlbWVudEtleU5hbWUpO1xuXG52YXIgX2luc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxudmFyIF9pbnN0YW5jZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW5jZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIFRSRUUgPSAndHJlZSc7XG52YXIgRVZFTlRfUFJFRklYX1JFR0VYUCA9IC9vbltBLVpdLztcblxuLyoqXG4gKiBOYXRpdmUgQ29tcG9uZW50XG4gKi9cblxudmFyIE5hdGl2ZUNvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTmF0aXZlQ29tcG9uZW50KGVsZW1lbnQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTmF0aXZlQ29tcG9uZW50KTtcblxuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhOYXRpdmVDb21wb25lbnQsIFt7XG4gICAga2V5OiAnbW91bnRDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENvbXBvbmVudChwYXJlbnQsIGNvbnRleHQsIGNoaWxkTW91bnRlcikge1xuICAgICAgLy8gUGFyZW50IG5hdGl2ZSBlbGVtZW50XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMuX21vdW50SUQgPSBfaG9zdDIuZGVmYXVsdC5tb3VudElEKys7XG5cbiAgICAgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgICAgdmFyIGluc3RhbmNlID0ge1xuICAgICAgICBfaW50ZXJuYWw6IHRoaXMsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIHByb3BzOiBwcm9wc1xuICAgICAgfTtcbiAgICAgIHZhciBhcHBlbmRUeXBlID0gcHJvcHMuYXBwZW5kOyAvLyBEZWZhdWx0IGlzIG5vZGVcblxuICAgICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgLy8gQ2xvbmUgYSBjb3B5IGZvciBzdHlsZSBkaWZmXG4gICAgICB0aGlzLl9wcmV2U3R5bGVDb3B5ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMuc3R5bGUpO1xuXG4gICAgICB2YXIgbmF0aXZlTm9kZSA9IHRoaXMuZ2V0TmF0aXZlTm9kZSgpO1xuXG4gICAgICBpZiAoYXBwZW5kVHlwZSAhPT0gVFJFRSkge1xuICAgICAgICBpZiAoY2hpbGRNb3VudGVyKSB7XG4gICAgICAgICAgY2hpbGRNb3VudGVyKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFwcGVuZENoaWxkKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFbGVtZW50ICYmIHRoaXMuX2N1cnJlbnRFbGVtZW50LnJlZikge1xuICAgICAgICBfcmVmMi5kZWZhdWx0LmF0dGFjaCh0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXIsIHRoaXMuX2N1cnJlbnRFbGVtZW50LnJlZiwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5tb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFwcGVuZFR5cGUgPT09IFRSRUUpIHtcbiAgICAgICAgaWYgKGNoaWxkTW91bnRlcikge1xuICAgICAgICAgIGNoaWxkTW91bnRlcihuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5hcHBlbmRDaGlsZChuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci5tb3VudENvbXBvbmVudCh0aGlzKTtcblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdW50Q2hpbGRyZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIGNoaWxkcmVuID0gW2NoaWxkcmVuXTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0ge307XG5cbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuSW1hZ2UgPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciByZW5kZXJlZENoaWxkID0gKDAsIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIuZGVmYXVsdCkoZWxlbWVudCk7XG4gICAgICAgIHZhciBuYW1lID0gKDAsIF9nZXRFbGVtZW50S2V5TmFtZTIuZGVmYXVsdCkocmVuZGVyZWRDaGlsZHJlbiwgZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICByZW5kZXJlZENoaWxkcmVuW25hbWVdID0gcmVuZGVyZWRDaGlsZDtcbiAgICAgICAgcmVuZGVyZWRDaGlsZC5fbW91bnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBNb3VudFxuICAgICAgICB2YXIgbW91bnRJbWFnZSA9IHJlbmRlcmVkQ2hpbGQubW91bnRDb21wb25lbnQoX3RoaXMuZ2V0TmF0aXZlTm9kZSgpLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIG1vdW50SW1hZ2U7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlbmRlcmVkQ2hpbGRyZW5JbWFnZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bm1vdW50Q2hpbGRyZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bm1vdW50Q2hpbGRyZW4obm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcblxuICAgICAgaWYgKHJlbmRlcmVkQ2hpbGRyZW4pIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiByZW5kZXJlZENoaWxkcmVuKSB7XG4gICAgICAgICAgdmFyIHJlbmRlcmVkQ2hpbGQgPSByZW5kZXJlZENoaWxkcmVuW25hbWVdO1xuICAgICAgICAgIHJlbmRlcmVkQ2hpbGQudW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5tb3VudENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubW91bnRDb21wb25lbnQobm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLl9uYXRpdmVOb2RlKSB7XG4gICAgICAgIHZhciByZWYgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5yZWY7XG4gICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICBfcmVmMi5kZWZhdWx0LmRldGFjaCh0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXIsIHJlZiwgdGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBfaW5zdGFuY2UyLmRlZmF1bHQucmVtb3ZlKHRoaXMuX25hdGl2ZU5vZGUpO1xuICAgICAgICBpZiAoIW5vdFJlbW92ZUNoaWxkKSB7XG4gICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUNoaWxkKHRoaXMuX25hdGl2ZU5vZGUsIHRoaXMuX3BhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKHRoaXMuX25hdGl2ZU5vZGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVubW91bnRDaGlsZHJlbihub3RSZW1vdmVDaGlsZCk7XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHRoaXMpO1xuXG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9uYXRpdmVOb2RlID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICAgIHRoaXMuX3ByZXZTdHlsZUNvcHkgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZUNvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIHByZXZDb250ZXh0LCBuZXh0Q29udGV4dCkge1xuICAgICAgLy8gUmVwbGFjZSBjdXJyZW50IGVsZW1lbnRcbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG5cbiAgICAgIF9yZWYyLmRlZmF1bHQudXBkYXRlKHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgdGhpcyk7XG5cbiAgICAgIHZhciBwcmV2UHJvcHMgPSBwcmV2RWxlbWVudC5wcm9wcztcbiAgICAgIHZhciBuZXh0UHJvcHMgPSBuZXh0RWxlbWVudC5wcm9wcztcblxuICAgICAgdGhpcy51cGRhdGVQcm9wZXJ0aWVzKHByZXZQcm9wcywgbmV4dFByb3BzKTtcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4obmV4dFByb3BzLmNoaWxkcmVuLCBuZXh0Q29udGV4dCk7XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZVByb3BlcnRpZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gICAgICB2YXIgcHJvcEtleSA9IHZvaWQgMDtcbiAgICAgIHZhciBzdHlsZU5hbWUgPSB2b2lkIDA7XG4gICAgICB2YXIgc3R5bGVVcGRhdGVzID0gdm9pZCAwO1xuICAgICAgZm9yIChwcm9wS2V5IGluIHByZXZQcm9wcykge1xuICAgICAgICBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4gfHwgbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFwcmV2UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgcHJldlByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgICB2YXIgbGFzdFN0eWxlID0gdGhpcy5fcHJldlN0eWxlQ29weTtcbiAgICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHtcbiAgICAgICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3ByZXZTdHlsZUNvcHkgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKEVWRU5UX1BSRUZJWF9SRUdFWFAudGVzdChwcm9wS2V5KSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcHJldlByb3BzW3Byb3BLZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLmdldE5hdGl2ZU5vZGUoKSwgcHJvcEtleS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBwcmV2UHJvcHNbcHJvcEtleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZ2V0TmF0aXZlTm9kZSgpLCBwcm9wS2V5LCBwcmV2UHJvcHNbcHJvcEtleV0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAocHJvcEtleSBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgICAgICB2YXIgcHJldlByb3AgPSBwcm9wS2V5ID09PSBTVFlMRSA/IHRoaXMuX3ByZXZTdHlsZUNvcHkgOiBwcmV2UHJvcHMgIT0gbnVsbCA/IHByZXZQcm9wc1twcm9wS2V5XSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHByb3BLZXkgPT09IENISUxEUkVOIHx8ICFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IHByZXZQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgcHJldlByb3AgPT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBzdHlsZVxuICAgICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICAgIC8vIENsb25lIHByb3BlcnR5XG4gICAgICAgICAgICBuZXh0UHJvcCA9IHRoaXMuX3ByZXZTdHlsZUNvcHkgPSBPYmplY3QuYXNzaWduKHt9LCBuZXh0UHJvcCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZTdHlsZUNvcHkgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcmV2UHJvcCAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBVbnNldCBzdHlsZXMgb24gYHByZXZQcm9wYCBidXQgbm90IG9uIGBuZXh0UHJvcGAuXG4gICAgICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBwcmV2UHJvcCkge1xuICAgICAgICAgICAgICBpZiAocHJldlByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHN0eWxlVXBkYXRlcyB8fCB7fTtcbiAgICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgcHJldlByb3BgLlxuICAgICAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHtcbiAgICAgICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgcHJldlByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHN0eWxlVXBkYXRlcyB8fCB7fTtcbiAgICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQXNzaWduIG5leHQgcHJvcCB3aGVuIHByZXYgc3R5bGUgaXMgbnVsbFxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVXBkYXRlIGV2ZW50IGJpbmRpbmdcbiAgICAgICAgfSBlbHNlIGlmIChFVkVOVF9QUkVGSVhfUkVHRVhQLnRlc3QocHJvcEtleSkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHByZXZQcm9wID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLmdldE5hdGl2ZU5vZGUoKSwgcHJvcEtleS5zbGljZSgyKS50b0xvd2VyQ2FzZSgpLCBwcmV2UHJvcCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5nZXROYXRpdmVOb2RlKCksIHByb3BLZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKSwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgb3RoZXIgcHJvcGVydHlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IHt9O1xuICAgICAgICAgIHBheWxvYWRbcHJvcEtleV0gPSBuZXh0UHJvcDtcbiAgICAgICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnNldEF0dHJpYnV0ZSh0aGlzLmdldE5hdGl2ZU5vZGUoKSwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlQXR0cmlidXRlKHRoaXMuZ2V0TmF0aXZlTm9kZSgpLCBwcm9wS2V5LCBwcmV2UHJvcHNbcHJvcEtleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLnJlY29yZE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHRoaXMuX21vdW50SUQsXG4gICAgICAgICAgICAgIHR5cGU6ICd1cGRhdGUgYXR0cmlidXRlJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIucmVjb3JkT3BlcmF0aW9uKHtcbiAgICAgICAgICAgIGluc3RhbmNlSUQ6IHRoaXMuX21vdW50SUQsXG4gICAgICAgICAgICB0eXBlOiAndXBkYXRlIHN0eWxlJyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHN0eWxlVXBkYXRlc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5zZXRTdHlsZXModGhpcy5nZXROYXRpdmVOb2RlKCksIHN0eWxlVXBkYXRlcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndXBkYXRlQ2hpbGRyZW4nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDaGlsZHJlbihuZXh0Q2hpbGRyZW5FbGVtZW50cywgY29udGV4dCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIC8vIHByZXYgcmVuZGVyZWQgY2hpbGRyZW5cbiAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuXG4gICAgICBpZiAobmV4dENoaWxkcmVuRWxlbWVudHMgPT0gbnVsbCAmJiBwcmV2Q2hpbGRyZW4gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0Q2hpbGRyZW4gPSB7fTtcbiAgICAgIHZhciBvbGROb2RlcyA9IHt9O1xuXG4gICAgICBpZiAobmV4dENoaWxkcmVuRWxlbWVudHMgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV4dENoaWxkcmVuRWxlbWVudHMpKSB7XG4gICAgICAgICAgbmV4dENoaWxkcmVuRWxlbWVudHMgPSBbbmV4dENoaWxkcmVuRWxlbWVudHNdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIG5leHQgY2hpbGRyZW4gZWxlbWVudHNcbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBuZXh0Q2hpbGRyZW5FbGVtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgdmFyIG5leHRFbGVtZW50ID0gbmV4dENoaWxkcmVuRWxlbWVudHNbaW5kZXhdO1xuICAgICAgICAgIHZhciBuYW1lID0gKDAsIF9nZXRFbGVtZW50S2V5TmFtZTIuZGVmYXVsdCkobmV4dENoaWxkcmVuLCBuZXh0RWxlbWVudCwgaW5kZXgpO1xuICAgICAgICAgIHZhciBwcmV2Q2hpbGQgPSBwcmV2Q2hpbGRyZW4gJiYgcHJldkNoaWxkcmVuW25hbWVdO1xuICAgICAgICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZDaGlsZCAmJiBwcmV2Q2hpbGQuX2N1cnJlbnRFbGVtZW50O1xuXG4gICAgICAgICAgaWYgKHByZXZDaGlsZCAhPSBudWxsICYmICgwLCBfc2hvdWxkVXBkYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAvLyBQYXNzIHRoZSBzYW1lIGNvbnRleHQgd2hlbiB1cGRhdGluZyBjaGlkcmVuXG4gICAgICAgICAgICBwcmV2Q2hpbGQudXBkYXRlQ29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCwgY29udGV4dCk7XG4gICAgICAgICAgICBuZXh0Q2hpbGRyZW5bbmFtZV0gPSBwcmV2Q2hpbGQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVubW91bnQgdGhlIHByZXZDaGlsZCB3aGVuIG5leHRDaGlsZCBpcyBkaWZmZXJlbnQgZWxlbWVudCB0eXBlLlxuICAgICAgICAgICAgaWYgKHByZXZDaGlsZCkge1xuICAgICAgICAgICAgICB2YXIgb2xkTmF0aXZlTm9kZSA9IHByZXZDaGlsZC5nZXROYXRpdmVOb2RlKCk7XG4gICAgICAgICAgICAgIC8vIERlbGF5IHJlbW92ZSBjaGlsZFxuICAgICAgICAgICAgICBwcmV2Q2hpbGQudW5tb3VudENvbXBvbmVudCh0cnVlKTtcbiAgICAgICAgICAgICAgb2xkTm9kZXNbbmFtZV0gPSBvbGROYXRpdmVOb2RlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGNoaWxkIG11c3QgYmUgaW5zdGFudGlhdGVkIGJlZm9yZSBpdCdzIG1vdW50ZWQuXG4gICAgICAgICAgICBuZXh0Q2hpbGRyZW5bbmFtZV0gPSAoMCwgX2luc3RhbnRpYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShuZXh0RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBmaXJzdFByZXZDaGlsZCA9IHZvaWQgMDtcbiAgICAgIHZhciBkZWxheVJlbW92ZUZpcnN0UHJldkNoaWxkID0gdm9pZCAwO1xuICAgICAgLy8gVW5tb3VudCBjaGlsZHJlbiB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudC5cbiAgICAgIGlmIChwcmV2Q2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBfbmFtZSBpbiBwcmV2Q2hpbGRyZW4pIHtcbiAgICAgICAgICBpZiAoIXByZXZDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShfbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfcHJldkNoaWxkID0gcHJldkNoaWxkcmVuW19uYW1lXTtcbiAgICAgICAgICB2YXIgc2hvdWxkUmVtb3ZlID0gIW5leHRDaGlsZHJlbltfbmFtZV07XG5cbiAgICAgICAgICAvLyBTdG9yZSBvbGQgZmlyc3QgY2hpbGQgcmVmIGZvciBhcHBlbmQgbm9kZSBhaGVhZCBhbmQgbWF5YmUgZGVsYXkgcmVtb3ZlIGl0XG4gICAgICAgICAgaWYgKCFmaXJzdFByZXZDaGlsZCkge1xuICAgICAgICAgICAgZmlyc3RQcmV2Q2hpbGQgPSBfcHJldkNoaWxkO1xuICAgICAgICAgICAgZGVsYXlSZW1vdmVGaXJzdFByZXZDaGlsZCA9IHNob3VsZFJlbW92ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNob3VsZFJlbW92ZSkge1xuICAgICAgICAgICAgX3ByZXZDaGlsZC51bm1vdW50Q29tcG9uZW50KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXh0Q2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIGBuZXh0SW5kZXhgIHdpbGwgaW5jcmVtZW50IGZvciBlYWNoIGNoaWxkIGluIGBuZXh0Q2hpbGRyZW5gLCBidXRcbiAgICAgICAgICAvLyBgbGFzdEluZGV4YCB3aWxsIGJlIHRoZSBsYXN0IGluZGV4IHZpc2l0ZWQgaW4gYHByZXZDaGlsZHJlbmAuXG4gICAgICAgICAgdmFyIGxhc3RJbmRleCA9IDA7XG4gICAgICAgICAgdmFyIG5leHRJbmRleCA9IDA7XG4gICAgICAgICAgdmFyIGxhc3RQbGFjZWROb2RlID0gbnVsbDtcbiAgICAgICAgICB2YXIgbmV4dE5hdGl2ZU5vZGUgPSBbXTtcblxuICAgICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9uYW1lMikge1xuICAgICAgICAgICAgaWYgKCFuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkoX25hbWUyKSkge1xuICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRpbnVlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5leHRDaGlsZCA9IG5leHRDaGlsZHJlbltfbmFtZTJdO1xuICAgICAgICAgICAgdmFyIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbiAmJiBwcmV2Q2hpbGRyZW5bX25hbWUyXTtcblxuICAgICAgICAgICAgaWYgKHByZXZDaGlsZCA9PT0gbmV4dENoaWxkKSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2Q2hpbGROYXRpdmVOb2RlID0gcHJldkNoaWxkLmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBhcnJheSB0eXBlXG4gICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcmV2Q2hpbGROYXRpdmVOb2RlKSkge1xuICAgICAgICAgICAgICAgIHByZXZDaGlsZE5hdGl2ZU5vZGUgPSBbcHJldkNoaWxkTmF0aXZlTm9kZV07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBJZiB0aGUgaW5kZXggb2YgYGNoaWxkYCBpcyBsZXNzIHRoYW4gYGxhc3RJbmRleGAsIHRoZW4gaXQgbmVlZHMgdG9cbiAgICAgICAgICAgICAgLy8gYmUgbW92ZWQuIE90aGVyd2lzZSwgd2UgZG8gbm90IG5lZWQgdG8gbW92ZSBpdCBiZWNhdXNlIGEgY2hpbGQgd2lsbCBiZVxuICAgICAgICAgICAgICAvLyBpbnNlcnRlZCBvciBtb3ZlZCBiZWZvcmUgYGNoaWxkYC5cbiAgICAgICAgICAgICAgaWYgKHByZXZDaGlsZC5fbW91bnRJbmRleCA8IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxhc3RQbGFjZWROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgbGFzdFBsYWNlZE5vZGUgPSBsYXN0UGxhY2VkTm9kZVtsYXN0UGxhY2VkTm9kZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IHByZXZDaGlsZE5hdGl2ZU5vZGUubGVuZ3RoIC0gMTsgX2kgPj0gMDsgX2ktLSkge1xuICAgICAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmluc2VydEFmdGVyKHByZXZDaGlsZE5hdGl2ZU5vZGVbX2ldLCBsYXN0UGxhY2VkTm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbmV4dE5hdGl2ZU5vZGUgPSBuZXh0TmF0aXZlTm9kZS5jb25jYXQocHJldkNoaWxkTmF0aXZlTm9kZSk7XG5cbiAgICAgICAgICAgICAgbGFzdEluZGV4ID0gTWF0aC5tYXgocHJldkNoaWxkLl9tb3VudEluZGV4LCBsYXN0SW5kZXgpO1xuICAgICAgICAgICAgICBwcmV2Q2hpbGQuX21vdW50SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocHJldkNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgYGxhc3RJbmRleGAgYmVmb3JlIGBfbW91bnRJbmRleGAgZ2V0cyB1bnNldCBieSB1bm1vdW50aW5nLlxuICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IE1hdGgubWF4KHByZXZDaGlsZC5fbW91bnRJbmRleCwgbGFzdEluZGV4KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBfdGhpczIuZ2V0TmF0aXZlTm9kZSgpO1xuICAgICAgICAgICAgICAvLyBGcmFnbWVudCBleHRlbmRlZCBuYXRpdmUgY29tcG9uZW50LCBzbyBpZiBwYXJlbnQgaXMgZnJhZ21lbnQgc2hvdWxkIGdldCB0aGlzLl9wYXJlbnRcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyZW50KSkge1xuICAgICAgICAgICAgICAgIHBhcmVudCA9IF90aGlzMi5fcGFyZW50O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgbmV4dENoaWxkLm1vdW50Q29tcG9uZW50KHBhcmVudCwgY29udGV4dCwgZnVuY3Rpb24gKG5ld0NoaWxkLCBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXdvcmsgdGhlIGR1cGxpY2F0ZSBjb2RlXG4gICAgICAgICAgICAgICAgdmFyIG9sZENoaWxkID0gb2xkTm9kZXNbX25hbWUyXTtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobmV3Q2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICBuZXdDaGlsZCA9IFtuZXdDaGlsZF07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9sZENoaWxkKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGUgb2xkQ2hpbGQgb3IgbmV3Q2hpbGQgYWxsIG1heWJlIGZyYWdtZW50XG4gICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2xkQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZENoaWxkID0gW29sZENoaWxkXTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gSWYgbmV3Q2hpbGQgY291bnQgbGFyZ2UgdGhlbiBvbGRDaGlsZFxuICAgICAgICAgICAgICAgICAgdmFyIGxhc3ROZXdDaGlsZCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IG5ld0NoaWxkLmxlbmd0aDsgX2kyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRbX2kyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZENoaWxkW19pMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVwbGFjZUNoaWxkKGNoaWxkLCBvbGRDaGlsZFtfaTJdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuaW5zZXJ0QWZ0ZXIoY2hpbGQsIGxhc3ROZXdDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdE5ld0NoaWxkID0gY2hpbGQ7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIG5ld0NoaWxkIGNvdW50IGxlc3MgdGhlbiBvbGRDaGlsZFxuICAgICAgICAgICAgICAgICAgaWYgKG5ld0NoaWxkLmxlbmd0aCA8IG9sZENoaWxkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTMgPSBuZXdDaGlsZC5sZW5ndGg7IF9pMyA8IG9sZENoaWxkLmxlbmd0aDsgX2kzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIucmVtb3ZlQ2hpbGQob2xkQ2hpbGRbX2kzXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IGNoaWxkIGF0IGEgc3BlY2lmaWMgaW5kZXhcblxuICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGNoaWxkXG4gICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXN0UGxhY2VkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdFBsYWNlZE5vZGUgPSBsYXN0UGxhY2VkTm9kZVtsYXN0UGxhY2VkTm9kZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgdmFyIHByZXZGaXJzdE5hdGl2ZU5vZGUgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFByZXZDaGlsZCAmJiAhbGFzdFBsYWNlZE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldkZpcnN0TmF0aXZlTm9kZSA9IGZpcnN0UHJldkNoaWxkLmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJldkZpcnN0TmF0aXZlTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2Rmlyc3ROYXRpdmVOb2RlID0gcHJldkZpcnN0TmF0aXZlTm9kZVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaTQgPSBuZXdDaGlsZC5sZW5ndGggLSAxOyBfaTQgPj0gMDsgX2k0LS0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9jaGlsZCA9IG5ld0NoaWxkW19pNF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGxhY2VkTm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5pbnNlcnRBZnRlcihfY2hpbGQsIGxhc3RQbGFjZWROb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2Rmlyc3ROYXRpdmVOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmluc2VydEJlZm9yZShfY2hpbGQsIHByZXZGaXJzdE5hdGl2ZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5hcHBlbmRDaGlsZChfY2hpbGQsIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBuZXh0TmF0aXZlTm9kZSA9IG5leHROYXRpdmVOb2RlLmNvbmNhdChuZXdDaGlsZCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBuZXh0Q2hpbGQuX21vdW50SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICAgICAgbGFzdFBsYWNlZE5vZGUgPSBuZXh0Q2hpbGQuZ2V0TmF0aXZlTm9kZSgpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBmb3IgKHZhciBfbmFtZTIgaW4gbmV4dENoaWxkcmVuKSB7XG4gICAgICAgICAgICB2YXIgX3JldDIgPSBfbG9vcChfbmFtZTIpO1xuXG4gICAgICAgICAgICBpZiAoX3JldDIgPT09ICdjb250aW51ZScpIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN5bmMgdXBkYXRlIG5hdGl2ZSByZWZzXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX3RoaXMyLl9uYXRpdmVOb2RlKSkge1xuICAgICAgICAgICAgLy8gQ2xlYXIgYWxsIGFuZCBwdXNoIHRoZSBuZXcgYXJyYXlcbiAgICAgICAgICAgIF90aGlzMi5fbmF0aXZlTm9kZS5zcGxpY2UoMCwgX3RoaXMyLl9uYXRpdmVOb2RlLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5leHROYXRpdmVOb2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIF90aGlzMi5fbmF0aXZlTm9kZS5wdXNoKG5leHROYXRpdmVOb2RlW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChkZWxheVJlbW92ZUZpcnN0UHJldkNoaWxkKSB7XG4gICAgICAgIGZpcnN0UHJldkNoaWxkLnVubW91bnRDb21wb25lbnQoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG5leHRDaGlsZHJlbjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXROYXRpdmVOb2RlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TmF0aXZlTm9kZSgpIHtcbiAgICAgIGlmICh0aGlzLl9uYXRpdmVOb2RlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbmF0aXZlTm9kZSA9IF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5jcmVhdGVFbGVtZW50KHRoaXMuX2luc3RhbmNlKTtcbiAgICAgICAgX2luc3RhbmNlMi5kZWZhdWx0LnNldCh0aGlzLl9uYXRpdmVOb2RlLCB0aGlzLl9pbnN0YW5jZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVOb2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFB1YmxpY0luc3RhbmNlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROYXRpdmVOb2RlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmFtZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hbWUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTmF0aXZlQ29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBOYXRpdmVDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuLypcbiAqIFJlZiBtYW5hZ2VyXG4gKi9cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZShwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIGNvbXBvbmVudCkge1xuICAgIHZhciBwcmV2UmVmID0gcHJldkVsZW1lbnQgIT0gbnVsbCAmJiBwcmV2RWxlbWVudC5yZWY7XG4gICAgdmFyIG5leHRSZWYgPSBuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnJlZjtcblxuICAgIC8vIFVwZGF0ZSByZWZzIGluIG93bmVyIGNvbXBvbmVudFxuICAgIGlmIChwcmV2UmVmICE9PSBuZXh0UmVmKSB7XG4gICAgICAvLyBEZXRhY2ggcHJldiBSZW5kZXJlZEVsZW1lbnQncyByZWZcbiAgICAgIHByZXZSZWYgIT0gbnVsbCAmJiB0aGlzLmRldGFjaChwcmV2RWxlbWVudC5fb3duZXIsIHByZXZSZWYsIGNvbXBvbmVudCk7XG4gICAgICAvLyBBdHRhY2ggbmV4dCBSZW5kZXJlZEVsZW1lbnQncyByZWZcbiAgICAgIG5leHRSZWYgIT0gbnVsbCAmJiB0aGlzLmF0dGFjaChuZXh0RWxlbWVudC5fb3duZXIsIG5leHRSZWYsIGNvbXBvbmVudCk7XG4gICAgfVxuICB9LFxuICBhdHRhY2g6IGZ1bmN0aW9uIGF0dGFjaChvd25lckNvbXBvbmVudCwgcmVmLCBjb21wb25lbnQpIHtcbiAgICBpZiAoIW93bmVyQ29tcG9uZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtaWdodCBiZSBhZGRpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50XFwncyAnICsgJ2ByZW5kZXJgIG1ldGhvZCwgb3IgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJheCBsb2FkZWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIGluc3RhbmNlID0gY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlZihpbnN0YW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bmVyQ29tcG9uZW50Ll9pbnN0YW5jZS5yZWZzW3JlZl0gPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0sXG4gIGRldGFjaDogZnVuY3Rpb24gZGV0YWNoKG93bmVyQ29tcG9uZW50LCByZWYsIGNvbXBvbmVudCkge1xuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBXaGVuIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgYW5kIHdoZW5ldmVyIHRoZSByZWYgY2hhbmdlcywgdGhlIG9sZCByZWYgd2lsbCBiZSBjYWxsZWQgd2l0aCBudWxsIGFzIGFuIGFyZ3VtZW50LlxuICAgICAgcmVmKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNdXN0IG1hdGNoIGNvbXBvbmVudCBhbmQgcmVmIGNvdWxkIGRldGFjaCB0aGUgcmVmIG9uIG93bmVyIHdoZW4gQSdzIGJlZm9yZSByZWYgaXMgQidzIGN1cnJlbnQgcmVmXG4gICAgICB2YXIgaW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICAgIGlmIChvd25lckNvbXBvbmVudC5faW5zdGFuY2UucmVmc1tyZWZdID09PSBpbnN0YW5jZSkge1xuICAgICAgICBkZWxldGUgb3duZXJDb21wb25lbnQuX2luc3RhbmNlLnJlZnNbcmVmXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoY2hpbGRyZW4sIGVsZW1lbnQsIGluZGV4KSB7XG4gIHZhciBlbGVtZW50S2V5ID0gZWxlbWVudCAmJiBlbGVtZW50LmtleTtcbiAgdmFyIGhhc0tleSA9IHR5cGVvZiBlbGVtZW50S2V5ID09PSAnc3RyaW5nJztcbiAgdmFyIGRlZmF1bHROYW1lID0gJy4nICsgaW5kZXgudG9TdHJpbmcoMzYpO1xuXG4gIGlmIChoYXNLZXkpIHtcbiAgICB2YXIga2V5TmFtZSA9ICckJyArIGVsZW1lbnRLZXk7XG4gICAgLy8gQ2hpbGQga2V5cyBtdXN0IGJlIHVuaXF1ZS5cbiAgICB2YXIga2V5VW5pcXVlID0gY2hpbGRyZW5ba2V5TmFtZV0gPT09IHVuZGVmaW5lZDtcbiAgICAvLyBPbmx5IHRoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIHVzZWQgd2hlbiBlbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXlcbiAgICBpZiAoIWtleVVuaXF1ZSkgY29uc29sZS53YXJuKCdFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXkgXCInICsgZWxlbWVudEtleSArICdcIi4nKTtcblxuICAgIHJldHVybiBrZXlVbmlxdWUgPyBrZXlOYW1lIDogZGVmYXVsdE5hbWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlZmF1bHROYW1lO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pc1JlbSA9IGlzUmVtO1xuZXhwb3J0cy5jYWxjUmVtID0gY2FsY1JlbTtcbmV4cG9ydHMuZ2V0UmVtID0gZ2V0UmVtO1xuZXhwb3J0cy5zZXRSZW0gPSBzZXRSZW07XG5leHBvcnRzLmlzVW5pdE51bWJlciA9IGlzVW5pdE51bWJlcjtcbmV4cG9ydHMuY29udmVydFVuaXQgPSBjb252ZXJ0VW5pdDtcbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG52YXIgVU5JVExFU1NfTlVNQkVSX1BST1BTID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgLy8gV2UgbWFrZSBsaW5lSGVpZ2h0IGRlZmF1bHQgaXMgcHggdGhhdCBpcyBkaWZmIHdpdGggdzNjIHNwZWNcbiAgLy8gbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBXZWV4IG9ubHlcbiAgbGluZXM6IHRydWVcbn07XG52YXIgU1VGRklYID0gJ3JlbSc7XG52YXIgUkVNX1JFRyA9IC9bLStdP1xcZCpcXC4/XFxkK3JlbS9nO1xuXG52YXIgZGVmYXVsdFJlbSA9IHZvaWQgMDtcblxuLyoqXG4gKiBJcyBzdHJpbmcgY29udGFpbnMgcmVtXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNSZW0oc3RyKSB7XG4gIHJldHVybiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIuaW5kZXhPZihTVUZGSVgpICE9PSAtMTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgcmVtIHRvIHBpeGVsczogJzEuMnJlbScgPT4gMS4yICogcmVtXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge051bWJlcn0gcmVtXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBjYWxjUmVtKHN0cikge1xuICB2YXIgcmVtID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBkZWZhdWx0UmVtO1xuXG4gIHJldHVybiBzdHIucmVwbGFjZShSRU1fUkVHLCBmdW5jdGlvbiAocmVtVmFsdWUpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChyZW1WYWx1ZSkgKiByZW0gKyAncHgnO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVtKCkge1xuICByZXR1cm4gZGVmYXVsdFJlbTtcbn1cblxuZnVuY3Rpb24gc2V0UmVtKHJlbSkge1xuICBkZWZhdWx0UmVtID0gcmVtO1xufVxuXG5mdW5jdGlvbiBpc1VuaXROdW1iZXIodmFsLCBwcm9wKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiAhVU5JVExFU1NfTlVNQkVSX1BST1BTW3Byb3BdO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VW5pdCh2YWwsIHByb3ApIHtcbiAgaWYgKHByb3AgJiYgaXNVbml0TnVtYmVyKHZhbCwgcHJvcCkpIHtcbiAgICByZXR1cm4gdmFsICogZGVmYXVsdFJlbSArICdweCc7XG4gIH0gZWxzZSBpZiAoaXNSZW0odmFsKSkge1xuICAgIHJldHVybiBjYWxjUmVtKHZhbCk7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufVxuXG4vKioqLyB9KSxcbi8qIDEzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRyYW5zZm9ybVByb3BzQXR0cnNUb1N0eWxlID0gdHJhbnNmb3JtUHJvcHNBdHRyc1RvU3R5bGU7XG5leHBvcnRzLnJlbmFtZVByb3BzQXR0ciA9IHJlbmFtZVByb3BzQXR0cjtcbi8qKlxuICogdHJhbnNmb3JtUHJvcEF0dHJzVG9TdHlsZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtBcnJheX0gYXR0cnNcbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtUHJvcHNBdHRyc1RvU3R5bGUocHJvcHMsIGF0dHJzKSB7XG4gIHByb3BzLnN0eWxlID0gcHJvcHMuc3R5bGUgfHwge307XG5cbiAgYXR0cnMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cikge1xuICAgIGlmIChwcm9wc1thdHRyXSAmJiAhcHJvcHMuc3R5bGVbYXR0cl0pIHtcbiAgICAgIHByb3BzLnN0eWxlW2F0dHJdID0gcHJvcHNbYXR0cl07XG4gICAgICBkZWxldGUgcHJvcHNbYXR0cl07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcHJvcHM7XG59O1xuXG4vKipcbiAqIHJlbmFtZVByb3BzQXR0clxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtTdHJpbmd9IG9yaWdpbmFsQXR0ck5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBuZXdBdHRyTmFtZVxuICovXG5mdW5jdGlvbiByZW5hbWVQcm9wc0F0dHIocHJvcHMsIG9yaWdpbmFsQXR0ck5hbWUsIG5ld0F0dHJOYW1lKSB7XG4gIGlmIChwcm9wc1tvcmlnaW5hbEF0dHJOYW1lXSAmJiAhcHJvcHNbbmV3QXR0ck5hbWVdKSB7XG4gICAgcHJvcHNbbmV3QXR0ck5hbWVdID0gcHJvcHNbb3JpZ2luYWxBdHRyTmFtZV07XG4gICAgZGVsZXRlIHByb3BzW29yaWdpbmFsQXR0ck5hbWVdO1xuICB9XG5cbiAgcmV0dXJuIHByb3BzO1xufVxuXG4vKioqLyB9KSxcbi8qIDE0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gZmluZERPTU5vZGUoaW5zdGFuY2UpIHtcbiAgaWYgKGluc3RhbmNlID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIElmIGEgbmF0aXZlIG5vZGUsIHdlZXggbWF5IG5vdCBleHBvcnQgb3duZXJEb2N1bWVudCBwcm9wZXJ0eVxuICBpZiAoaW5zdGFuY2Uub3duZXJEb2N1bWVudCB8fCBpbnN0YW5jZS5ub2RlVHlwZSkge1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8vIE5hdGl2ZSBjb21wb25lbnRcbiAgaWYgKGluc3RhbmNlLl9uYXRpdmVOb2RlKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLl9uYXRpdmVOb2RlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZSA9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuZ2V0RWxlbWVudEJ5SWQoaW5zdGFuY2UpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5yZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcGVhcnMgdG8gYmUgbmVpdGhlciBDb21wb25lbnQgbm9yIERPTU5vZGUuJyk7XG4gIH1cblxuICAvLyBDb21wb3NpdGUgY29tcG9uZW50XG4gIHZhciBpbnRlcm5hbCA9IGluc3RhbmNlLl9pbnRlcm5hbDtcblxuICBpZiAoaW50ZXJuYWwpIHtcbiAgICB3aGlsZSAoIWludGVybmFsLl9uYXRpdmVOb2RlKSB7XG4gICAgICBpbnRlcm5hbCA9IGludGVybmFsLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICAgIC8vIElmIG5vdCBtb3VudGVkXG4gICAgICBpZiAoaW50ZXJuYWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGludGVybmFsLl9uYXRpdmVOb2RlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignZmluZERPTU5vZGUgd2FzIGNhbGxlZCBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LicpO1xuICB9XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZpbmRET01Ob2RlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMudmVyc2lvbiA9IGV4cG9ydHMuc2V0TmF0aXZlUHJvcHMgPSBleHBvcnRzLmZpbmRDb21wb25lbnRJbnN0YW5jZSA9IGV4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IGV4cG9ydHMuZmluZERPTU5vZGUgPSBleHBvcnRzLnJlbmRlciA9IGV4cG9ydHMuUHJvcFR5cGVzID0gZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gZXhwb3J0cy5Db21wb25lbnQgPSBleHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBleHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBleHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbl9fd2VicGFja19yZXF1aXJlX18oMTYpO1xuXG52YXIgX2VsZW1lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDcpO1xuXG52YXIgX2NvbXBvbmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cbnZhciBfY29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudCk7XG5cbnZhciBfcHVyZWNvbXBvbmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpO1xuXG52YXIgX3B1cmVjb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHVyZWNvbXBvbmVudCk7XG5cbnZhciBfcHJvcHR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygyMCk7XG5cbnZhciBfcHJvcHR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3B0eXBlcyk7XG5cbnZhciBfcmVuZGVyMiA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpO1xuXG52YXIgX3JlbmRlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZW5kZXIyKTtcblxudmFyIF9maW5kRE9NTm9kZTIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KTtcblxudmFyIF9maW5kRE9NTm9kZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9maW5kRE9NTm9kZTIpO1xuXG52YXIgX3VubW91bnRDb21wb25lbnRBdE5vZGUyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcblxudmFyIF91bm1vdW50Q29tcG9uZW50QXROb2RlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3VubW91bnRDb21wb25lbnRBdE5vZGUyKTtcblxudmFyIF9maW5kQ29tcG9uZW50SW5zdGFuY2UyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0Mik7XG5cbnZhciBfZmluZENvbXBvbmVudEluc3RhbmNlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZpbmRDb21wb25lbnRJbnN0YW5jZTIpO1xuXG52YXIgX3NldE5hdGl2ZVByb3BzMiA9IF9fd2VicGFja19yZXF1aXJlX18oNDMpO1xuXG52YXIgX3NldE5hdGl2ZVByb3BzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NldE5hdGl2ZVByb3BzMik7XG5cbnZhciBfdmVyc2lvbjIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQ0KTtcblxudmFyIF92ZXJzaW9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ZlcnNpb24yKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gX2VsZW1lbnQuY3JlYXRlRWxlbWVudDtcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gX2VsZW1lbnQuY2xvbmVFbGVtZW50O1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IF9lbGVtZW50LmlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gX2VsZW1lbnQuY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuQ29tcG9uZW50ID0gX2NvbXBvbmVudDIuZGVmYXVsdDtcbmV4cG9ydHMuUHVyZUNvbXBvbmVudCA9IF9wdXJlY29tcG9uZW50Mi5kZWZhdWx0O1xuZXhwb3J0cy5Qcm9wVHlwZXMgPSBfcHJvcHR5cGVzMi5kZWZhdWx0O1xuZXhwb3J0cy5yZW5kZXIgPSBfcmVuZGVyMy5kZWZhdWx0O1xuZXhwb3J0cy5maW5kRE9NTm9kZSA9IF9maW5kRE9NTm9kZTMuZGVmYXVsdDtcbmV4cG9ydHMudW5tb3VudENvbXBvbmVudEF0Tm9kZSA9IF91bm1vdW50Q29tcG9uZW50QXROb2RlMy5kZWZhdWx0O1xuZXhwb3J0cy5maW5kQ29tcG9uZW50SW5zdGFuY2UgPSBfZmluZENvbXBvbmVudEluc3RhbmNlMy5kZWZhdWx0O1xuZXhwb3J0cy5zZXROYXRpdmVQcm9wcyA9IF9zZXROYXRpdmVQcm9wczMuZGVmYXVsdDtcbmV4cG9ydHMudmVyc2lvbiA9IF92ZXJzaW9uMy5kZWZhdWx0O1xuXG4vKioqLyB9KSxcbi8qIDE2ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfaG9vayA9IF9fd2VicGFja19yZXF1aXJlX18oNik7XG5cbnZhciBfaG9vazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob29rKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uaW5qZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5pbmplY3QoX2hvb2syLmRlZmF1bHQpO1xufVxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBmbGF0dGVuQ2hpbGRyZW47XG5mdW5jdGlvbiB0cmF2ZXJzZUNoaWxkcmVuKGNoaWxkcmVuLCByZXN1bHQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHRyYXZlcnNlQ2hpbGRyZW4oY2hpbGRyZW5baV0sIHJlc3VsdCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5wdXNoKGNoaWxkcmVuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB0cmF2ZXJzZUNoaWxkcmVuKGNoaWxkcmVuLCByZXN1bHQpO1xuXG4gIGlmIChyZXN1bHQubGVuZ3RoID09PSAxKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0WzBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0pLFxuLyogMTggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9jb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuXG52YXIgX2NvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21wb25lbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciByb290Q291bnRlciA9IDE7XG5cbnZhciBSb290ID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFJvb3QsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvb3QoKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgX3RlbXAsIF90aGlzLCBfcmV0O1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJvb3QpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX3JlZiA9IFJvb3QuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihSb290KSkuY2FsbC5hcHBseShfcmVmLCBbdGhpc10uY29uY2F0KGFyZ3MpKSksIF90aGlzKSwgX3RoaXMucm9vdElEID0gcm9vdENvdW50ZXIrKywgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUm9vdCwgW3tcbiAgICBrZXk6ICdpc1Jvb3RDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpc1Jvb3RDb21wb25lbnQoKSB7fVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0UHVibGljSW5zdGFuY2UnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRQdWJsaWNJbnN0YW5jZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFJlbmRlcmVkQ29tcG9uZW50KCkuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXRSZW5kZXJlZENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldFJlbmRlcmVkQ29tcG9uZW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ludGVybmFsLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUm9vdDtcbn0oX2NvbXBvbmVudDIuZGVmYXVsdCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFJvb3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2NvbXBvbmVudCA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cbnZhciBfY29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuLyoqXG4gKiBQdXJlIGNvbXBvbmVudCBjbGFzcy5cbiAqL1xudmFyIFB1cmVDb21wb25lbnQgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoUHVyZUNvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQdXJlQ29tcG9uZW50KTtcblxuICAgIHJldHVybiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoUHVyZUNvbXBvbmVudC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFB1cmVDb21wb25lbnQpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUHVyZUNvbXBvbmVudCwgW3tcbiAgICBrZXk6ICdpc1B1cmVDb21wb25lbnRDbGFzcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGlzUHVyZUNvbXBvbmVudENsYXNzKCkge31cbiAgfV0pO1xuXG4gIHJldHVybiBQdXJlQ29tcG9uZW50O1xufShfY29tcG9uZW50Mi5kZWZhdWx0KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gUHVyZUNvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDIwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG4vKlxuICogQ3VycmVudCBQcm9wVHlwZXMgb25seSBleHBvcnQgc29tZSBhcGkgd2l0aCByZWFjdCwgbm90IHZhbGlkYXRlIGluIHJ1bnRpbWUuXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHJldHVybiB0eXBlQ2hlY2tlcjtcbiAgfVxuXG4gIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIC8vIE5vb3BcbiAgfVxuICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xufVxuXG52YXIgdHlwZUNoZWNrZXIgPSBjcmVhdGVUeXBlQ2hlY2tlcigpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIGFycmF5OiB0eXBlQ2hlY2tlcixcbiAgYm9vbDogdHlwZUNoZWNrZXIsXG4gIGZ1bmM6IHR5cGVDaGVja2VyLFxuICBudW1iZXI6IHR5cGVDaGVja2VyLFxuICBvYmplY3Q6IHR5cGVDaGVja2VyLFxuICBzdHJpbmc6IHR5cGVDaGVja2VyLFxuICBzeW1ib2w6IHR5cGVDaGVja2VyLFxuICBlbGVtZW50OiB0eXBlQ2hlY2tlcixcbiAgbm9kZTogdHlwZUNoZWNrZXIsXG4gIGFueTogdHlwZUNoZWNrZXIsXG4gIGFycmF5T2Y6IHR5cGVDaGVja2VyLFxuICBpbnN0YW5jZU9mOiB0eXBlQ2hlY2tlcixcbiAgb2JqZWN0T2Y6IHR5cGVDaGVja2VyLFxuICBvbmVPZjogdHlwZUNoZWNrZXIsXG4gIG9uZU9mVHlwZTogdHlwZUNoZWNrZXIsXG4gIHNoYXBlOiB0eXBlQ2hlY2tlclxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07XG5cbi8qKiovIH0pLFxuLyogMjEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbmplY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIyKTtcblxudmFyIF9pbmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5qZWN0KTtcblxudmFyIF9pbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfaW5zdGFuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5zdGFuY2UpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHJlbmRlcihlbGVtZW50LCBjb250YWluZXIsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIC8vIENvbXBhdGlibGUgd2l0aCBgcmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spYFxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cblxuICAvLyBJbml0IGluamVjdFxuICAoMCwgX2luamVjdDIuZGVmYXVsdCkob3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIHJvb3RDb21wb25lbnQgPSBfaW5zdGFuY2UyLmRlZmF1bHQucmVuZGVyKGVsZW1lbnQsIGNvbnRhaW5lcik7XG4gIHZhciBjb21wb25lbnQgPSByb290Q29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7XG5cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2suY2FsbChjb21wb25lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gcmVuZGVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGluamVjdDtcblxudmFyIF91bml2ZXJzYWxFbnYgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbnZhciBfZW1wdHkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIzKTtcblxudmFyIF9lbXB0eTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbXB0eSk7XG5cbnZhciBfbmF0aXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcblxudmFyIF9uYXRpdmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbmF0aXZlKTtcblxudmFyIF90ZXh0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNCk7XG5cbnZhciBfdGV4dDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF90ZXh0KTtcblxudmFyIF9jb21wb3NpdGUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI1KTtcblxudmFyIF9jb21wb3NpdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcG9zaXRlKTtcblxudmFyIF9mcmFnbWVudCA9IF9fd2VicGFja19yZXF1aXJlX18oMjkpO1xuXG52YXIgX2ZyYWdtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZyYWdtZW50KTtcblxudmFyIF9kcml2ZXJXZWV4ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMCk7XG5cbnZhciBfZHJpdmVyV2VleDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kcml2ZXJXZWV4KTtcblxudmFyIF9kcml2ZXJCcm93c2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MCk7XG5cbnZhciBfZHJpdmVyQnJvd3NlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kcml2ZXJCcm93c2VyKTtcblxudmFyIF9ob29rID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblxudmFyIF9ob29rMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvb2spO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBpbmplY3QoX3JlZikge1xuICB2YXIgZHJpdmVyID0gX3JlZi5kcml2ZXIsXG4gICAgICBob29rID0gX3JlZi5ob29rLFxuICAgICAgbWVhc3VyZXIgPSBfcmVmLm1lYXN1cmVyO1xuXG4gIC8vIEluamVjdCBjb21wb25lbnQgY2xhc3NcbiAgX2hvc3QyLmRlZmF1bHQuRW1wdHlDb21wb25lbnQgPSBfZW1wdHkyLmRlZmF1bHQ7XG4gIF9ob3N0Mi5kZWZhdWx0Lk5hdGl2ZUNvbXBvbmVudCA9IF9uYXRpdmUyLmRlZmF1bHQ7XG4gIF9ob3N0Mi5kZWZhdWx0LlRleHRDb21wb25lbnQgPSBfdGV4dDIuZGVmYXVsdDtcbiAgX2hvc3QyLmRlZmF1bHQuRnJhZ21lbnRDb21wb25lbnQgPSBfZnJhZ21lbnQyLmRlZmF1bHQ7XG4gIF9ob3N0Mi5kZWZhdWx0LkNvbXBvc2l0ZUNvbXBvbmVudCA9IF9jb21wb3NpdGUyLmRlZmF1bHQ7XG4gIC8vIEluamVjdCBkZXZ0b29sIGhvb2tcbiAgX2hvc3QyLmRlZmF1bHQuaG9vayA9IGhvb2sgfHwgX2hvb2syLmRlZmF1bHQ7XG5cbiAgLy8gSW5qZWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVyXG4gIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyID0gbWVhc3VyZXI7XG5cbiAgLy8gSW5qZWN0IHJlbmRlciBkcml2ZXJcbiAgaWYgKCFfaG9zdDIuZGVmYXVsdC5kcml2ZXIpIHtcbiAgICBpZiAoIWRyaXZlcikge1xuICAgICAgaWYgKF91bml2ZXJzYWxFbnYuaXNXZWV4KSB7XG4gICAgICAgIGRyaXZlciA9IF9kcml2ZXJXZWV4Mi5kZWZhdWx0O1xuICAgICAgfSBlbHNlIGlmIChfdW5pdmVyc2FsRW52LmlzV2ViKSB7XG4gICAgICAgIGRyaXZlciA9IF9kcml2ZXJCcm93c2VyMi5kZWZhdWx0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ05vIGJ1aWx0aW4gZHJpdmVyIG1hdGNoZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIgPSBkcml2ZXI7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDIzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLyoqXG4gKiBFbXB0eSBDb21wb25lbnRcbiAqL1xudmFyIEVtcHR5Q29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbXB0eUNvbXBvbmVudCgpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW1wdHlDb21wb25lbnQpO1xuXG4gICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBudWxsO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEVtcHR5Q29tcG9uZW50LCBbe1xuICAgIGtleTogJ21vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDb21wb25lbnQocGFyZW50LCBjb250ZXh0LCBjaGlsZE1vdW50ZXIpIHtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgICAgIF9pbnRlcm5hbDogdGhpc1xuICAgICAgfTtcblxuICAgICAgdmFyIG5hdGl2ZU5vZGUgPSB0aGlzLmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgIGlmIChjaGlsZE1vdW50ZXIpIHtcbiAgICAgICAgY2hpbGRNb3VudGVyKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYXBwZW5kQ2hpbGQobmF0aXZlTm9kZSwgcGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VubW91bnRDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50KG5vdFJlbW92ZUNoaWxkKSB7XG4gICAgICBpZiAodGhpcy5fbmF0aXZlTm9kZSAmJiAhbm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlbW92ZUNoaWxkKHRoaXMuX25hdGl2ZU5vZGUsIHRoaXMuX3BhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBudWxsO1xuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZUNvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudCgpIHtcbiAgICAgIC8vIE5vb3BcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdnZXROYXRpdmVOb2RlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0TmF0aXZlTm9kZSgpIHtcbiAgICAgIC8vIFdlZXggbmF0aXZlIG5vZGVcbiAgICAgIGlmICh0aGlzLl9uYXRpdmVOb2RlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbmF0aXZlTm9kZSA9IF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5jcmVhdGVFbXB0eSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fbmF0aXZlTm9kZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRW1wdHlDb21wb25lbnQ7XG59KCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEVtcHR5Q29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vKipcbiAqIFRleHQgQ29tcG9uZW50XG4gKi9cbnZhciBUZXh0Q29tcG9uZW50ID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBUZXh0Q29tcG9uZW50KGVsZW1lbnQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dENvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgdGhpcy5fc3RyaW5nVGV4dCA9IFN0cmluZyhlbGVtZW50KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhUZXh0Q29tcG9uZW50LCBbe1xuICAgIGtleTogJ21vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDb21wb25lbnQocGFyZW50LCBjb250ZXh0LCBjaGlsZE1vdW50ZXIpIHtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5fbW91bnRJRCA9IF9ob3N0Mi5kZWZhdWx0Lm1vdW50SUQrKztcblxuICAgICAgLy8gV2VleCBkb20gb3BlcmF0aW9uXG4gICAgICB2YXIgbmF0aXZlTm9kZSA9IHRoaXMuZ2V0TmF0aXZlTm9kZSgpO1xuXG4gICAgICBpZiAoY2hpbGRNb3VudGVyKSB7XG4gICAgICAgIGNoaWxkTW91bnRlcihuYXRpdmVOb2RlLCBwYXJlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmFwcGVuZENoaWxkKG5hdGl2ZU5vZGUsIHBhcmVudCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgICAgX2ludGVybmFsOiB0aGlzXG4gICAgICB9O1xuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIubW91bnRDb21wb25lbnQodGhpcyk7XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1bm1vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCkge1xuICAgICAgaWYgKHRoaXMuX25hdGl2ZU5vZGUgJiYgIW5vdFJlbW92ZUNoaWxkKSB7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZCh0aGlzLl9uYXRpdmVOb2RlLCB0aGlzLl9wYXJlbnQpO1xuICAgICAgfVxuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzKTtcblxuICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fbmF0aXZlTm9kZSA9IG51bGw7XG4gICAgICB0aGlzLl9wYXJlbnQgPSBudWxsO1xuICAgICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG4gICAgICB0aGlzLl9zdHJpbmdUZXh0ID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1cGRhdGVDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBjb250ZXh0KSB7XG4gICAgICAvLyBJZiBzb21lIHRleHQgZG8gbm90aW5nXG4gICAgICBpZiAocHJldkVsZW1lbnQgIT09IG5leHRFbGVtZW50KSB7XG4gICAgICAgIC8vIFJlcGxhY2UgY3VycmVudCBlbGVtZW50XG4gICAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgICAgIC8vIERldnRvb2wgcmVhZCB0aGUgbGF0ZXN0IHN0cmluZ1RleHQgdmFsdWVcbiAgICAgICAgdGhpcy5fc3RyaW5nVGV4dCA9IFN0cmluZyhuZXh0RWxlbWVudCk7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci51cGRhdGVUZXh0KHRoaXMuZ2V0TmF0aXZlTm9kZSgpLCB0aGlzLl9zdHJpbmdUZXh0KTtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuaG9vay5SZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmF0aXZlTm9kZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hdGl2ZU5vZGUoKSB7XG4gICAgICBpZiAodGhpcy5fbmF0aXZlTm9kZSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZU5vZGUgPSBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuY3JlYXRlVGV4dCh0aGlzLl9zdHJpbmdUZXh0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVOb2RlO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUZXh0Q29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBUZXh0Q29tcG9uZW50O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMjUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9zdGF0ZWxlc3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI2KTtcblxudmFyIF9zdGF0ZWxlc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3RhdGVsZXNzKTtcblxudmFyIF91cGRhdGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygyNyk7XG5cbnZhciBfdXBkYXRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91cGRhdGVyKTtcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG52YXIgX3JlZiA9IF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuXG52YXIgX3JlZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWYpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW50aWF0ZUNvbXBvbmVudCk7XG5cbnZhciBfc2hvdWxkVXBkYXRlQ29tcG9uZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxudmFyIF9zaG91bGRVcGRhdGVDb21wb25lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hvdWxkVXBkYXRlQ29tcG9uZW50KTtcblxudmFyIF9zaGFsbG93RXF1YWwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDI4KTtcblxudmFyIF9zaGFsbG93RXF1YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2hhbGxvd0VxdWFsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gcGVyZm9ybUluU2FuZGJveChmbiwgaGFuZGxlRXJyb3IpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChoYW5kbGVFcnJvcikge1xuICAgICAgaGFuZGxlRXJyb3IoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChfaG9zdDIuZGVmYXVsdC5zYW5kYm94KSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0sIDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIG1lYXN1cmVMaWZlQ3ljbGUgPSB2b2lkIDA7XG5pZiAoZmFsc2UpIHtcbiAgbWVhc3VyZUxpZmVDeWNsZSA9IGZ1bmN0aW9uIG1lYXN1cmVMaWZlQ3ljbGUoY2FsbGJhY2ssIGluc3RhbmNlSUQsIHR5cGUpIHtcbiAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5iZWZvcmVMaWZlQ3ljbGUoaW5zdGFuY2VJRCwgdHlwZSk7XG4gICAgcGVyZm9ybUluU2FuZGJveChjYWxsYmFjayk7XG4gICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYWZ0ZXJMaWZlQ3ljbGUoaW5zdGFuY2VJRCwgdHlwZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29tcG9zaXRlIENvbXBvbmVudFxuICovXG5cbnZhciBDb21wb3NpdGVDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbXBvc2l0ZUNvbXBvbmVudChlbGVtZW50KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbXBvc2l0ZUNvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoQ29tcG9zaXRlQ29tcG9uZW50LCBbe1xuICAgIGtleTogJ2dldE5hbWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYW1lKCkge1xuICAgICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCBjb25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IubmFtZSB8fCBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ21vdW50Q29tcG9uZW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDb21wb25lbnQocGFyZW50LCBjb250ZXh0LCBjaGlsZE1vdW50ZXIpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5fbW91bnRJRCA9IF9ob3N0Mi5kZWZhdWx0Lm1vdW50SUQrKztcbiAgICAgIHRoaXMuX3VwZGF0ZUNvdW50ID0gMDtcblxuICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLmJlZm9yZU1vdW50Q29tcG9uZW50KHRoaXMuX21vdW50SUQsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICAgIHZhciBwdWJsaWNQcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICAgICAgdmFyIGlzQ2xhc3MgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICAgICAgdmFyIGlzQ29tcG9uZW50Q2xhc3MgPSBpc0NsYXNzICYmIENvbXBvbmVudC5wcm90b3R5cGUuaXNDb21wb25lbnRDbGFzcztcbiAgICAgIC8vIENsYXNzIHN0YXRlbGVzcyBjb21wb25lbnQgd2l0aG91dCBzdGF0ZSBidXQgaGF2ZSBsaWZlY3ljbGVzXG4gICAgICB2YXIgaXNTdGF0ZWxlc3NDbGFzcyA9IGlzQ2xhc3MgJiYgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXI7XG5cbiAgICAgIC8vIENvbnRleHQgcHJvY2Vzc1xuICAgICAgdmFyIHB1YmxpY0NvbnRleHQgPSB0aGlzLl9wcm9jZXNzQ29udGV4dChjb250ZXh0KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcHVibGljIGNsYXNzXG4gICAgICB2YXIgaW5zdGFuY2UgPSB2b2lkIDA7XG4gICAgICB2YXIgcmVuZGVyZWRFbGVtZW50ID0gdm9pZCAwO1xuXG4gICAgICBpZiAoaXNDb21wb25lbnRDbGFzcyB8fCBpc1N0YXRlbGVzc0NsYXNzKSB7XG4gICAgICAgIC8vIENvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICBpbnN0YW5jZSA9IG5ldyBDb21wb25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIF91cGRhdGVyMi5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBGdW5jdGlvbmFsIHN0YXRlbGVzcyBjb21wb25lbnQgd2l0aG91dCBzdGF0ZSBhbmQgbGlmZWN5Y2xlc1xuICAgICAgICBpbnN0YW5jZSA9IG5ldyBfc3RhdGVsZXNzMi5kZWZhdWx0KENvbXBvbmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBjb21wb25lbnQgdHlwZSAnICsgSlNPTi5zdHJpbmdpZnkoQ29tcG9uZW50KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBzZXQgdXAgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgYXMgYSBjb252ZW5pZW5jZSBmb3JcbiAgICAgIC8vIHNpbXBsZXIgY2xhc3MgYWJzdHJhY3Rpb25zLCB3ZSBzZXQgdGhlbSB1cCBhZnRlciB0aGUgZmFjdC5cbiAgICAgIGluc3RhbmNlLnByb3BzID0gcHVibGljUHJvcHM7XG4gICAgICBpbnN0YW5jZS5jb250ZXh0ID0gcHVibGljQ29udGV4dDtcbiAgICAgIGluc3RhbmNlLnJlZnMgPSB7fTtcblxuICAgICAgLy8gSW5qZWN0IHRoZSB1cGRhdGVyIGludG8gaW5zdGFuY2VcbiAgICAgIGluc3RhbmNlLnVwZGF0ZXIgPSBfdXBkYXRlcjIuZGVmYXVsdDtcbiAgICAgIGluc3RhbmNlLl9pbnRlcm5hbCA9IHRoaXM7XG4gICAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3RhbmNlO1xuXG4gICAgICAvLyBJbml0IHN0YXRlLCBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbFxuICAgICAgdmFyIGluaXRpYWxTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuICAgICAgaWYgKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRPRE8gY2xvbmUgdGhlIHN0YXRlP1xuICAgICAgICBpbnN0YW5jZS5zdGF0ZSA9IGluaXRpYWxTdGF0ZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHBlcmZvcm1JblNhbmRib3goZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KSB7XG4gICAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICAgICAgICB9LCBfdGhpcy5fbW91bnRJRCwgJ2NvbXBvbmVudFdpbGxNb3VudCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVuZGVyZWRFbGVtZW50ID09IG51bGwpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQuY29tcG9uZW50ID0gdGhpcztcbiAgICAgICAgLy8gUHJvY2VzcyBwZW5kaW5nIHN0YXRlIHdoZW4gY2FsbCBzZXRTdGF0ZSBpbiBjb21wb25lbnRXaWxsTW91bnRcbiAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSB0aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0KTtcblxuICAgICAgICAvLyBGSVhNRTogaGFuZGxlRXJyb3Igc2hvdWxkIG5hbWVkIGFzIGxpZmVjeWNsZXNcbiAgICAgICAgdmFyIGhhbmRsZUVycm9yID0gdm9pZCAwO1xuICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmhhbmRsZUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaGFuZGxlRXJyb3IgPSBmdW5jdGlvbiBoYW5kbGVFcnJvcihlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5oYW5kbGVFcnJvcihlKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgICAgICB9LCBfdGhpcy5fbW91bnRJRCwgJ3JlbmRlcicpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnQgPSBpbnN0YW5jZS5yZW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIGhhbmRsZUVycm9yKTtcblxuICAgICAgICBfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9ICgwLCBfaW5zdGFudGlhdGVDb21wb25lbnQyLmRlZmF1bHQpKHJlbmRlcmVkRWxlbWVudCk7XG4gICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudC5tb3VudENvbXBvbmVudCh0aGlzLl9wYXJlbnQsIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCksIGNoaWxkTW91bnRlcik7XG5cbiAgICAgIGlmICh0aGlzLl9jdXJyZW50RWxlbWVudCAmJiB0aGlzLl9jdXJyZW50RWxlbWVudC5yZWYpIHtcbiAgICAgICAgX3JlZjIuZGVmYXVsdC5hdHRhY2godGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyLCB0aGlzLl9jdXJyZW50RWxlbWVudC5yZWYsIHRoaXMpO1xuICAgICAgfVxuXG4gICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KSB7XG4gICAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICAgIH0sIF90aGlzLl9tb3VudElELCAnY29tcG9uZW50RGlkTW91bnQnKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5ob29rLlJlY29uY2lsZXIubW91bnRDb21wb25lbnQodGhpcyk7XG5cbiAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5hZnRlck1vdW50Q29tcG9uZW50KHRoaXMuX21vdW50SUQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5tb3VudENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubW91bnRDb21wb25lbnQobm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuXG4gICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KSB7XG4gICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHRoaXMpO1xuXG4gICAgICBpbnN0YW5jZS5faW50ZXJuYWwgPSBudWxsO1xuXG4gICAgICBpZiAodGhpcy5fcmVuZGVyZWRDb21wb25lbnQgIT0gbnVsbCkge1xuICAgICAgICB2YXIgcmVmID0gdGhpcy5fY3VycmVudEVsZW1lbnQucmVmO1xuICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgX3JlZjIuZGVmYXVsdC5kZXRhY2godGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyLCByZWYsIHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQudW5tb3VudENvbXBvbmVudChub3RSZW1vdmVDaGlsZCk7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gbnVsbDtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG51bGw7XG5cbiAgICAgIC8vIFJlc2V0IHBlbmRpbmcgZmllbGRzXG4gICAgICAvLyBFdmVuIGlmIHRoaXMgY29tcG9uZW50IGlzIHNjaGVkdWxlZCBmb3IgYW5vdGhlciB1cGRhdGUgaW4gUmVhY3RVcGRhdGVzLFxuICAgICAgLy8gaXQgd291bGQgc3RpbGwgYmUgaWdub3JlZCBiZWNhdXNlIHRoZXNlIGZpZWxkcyBhcmUgcmVzZXQuXG4gICAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG4gICAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgLy8gVGhlc2UgZmllbGRzIGRvIG5vdCByZWFsbHkgbmVlZCB0byBiZSByZXNldCBzaW5jZSB0aGlzIG9iamVjdCBpcyBub1xuICAgICAgLy8gbG9uZ2VyIGFjY2Vzc2libGUuXG4gICAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaWx0ZXJzIHRoZSBjb250ZXh0IG9iamVjdCB0byBvbmx5IGNvbnRhaW4ga2V5cyBzcGVjaWZpZWQgaW5cbiAgICAgKiBgY29udGV4dFR5cGVzYFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfcHJvY2Vzc0NvbnRleHQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfcHJvY2Vzc0NvbnRleHQoY29udGV4dCkge1xuICAgICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgICB2YXIgY29udGV4dFR5cGVzID0gQ29tcG9uZW50LmNvbnRleHRUeXBlcztcbiAgICAgIGlmICghY29udGV4dFR5cGVzKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIH1cbiAgICAgIHZhciBtYXNrZWRDb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBjb250ZXh0TmFtZSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgICAgbWFza2VkQ29udGV4dFtjb250ZXh0TmFtZV0gPSBjb250ZXh0W2NvbnRleHROYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXNrZWRDb250ZXh0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19wcm9jZXNzQ2hpbGRDb250ZXh0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Byb2Nlc3NDaGlsZENvbnRleHQoY3VycmVudENvbnRleHQpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgdmFyIGNoaWxkQ29udGV4dCA9IGluc3RhbmNlLmdldENoaWxkQ29udGV4dCAmJiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcbiAgICAgIGlmIChjaGlsZENvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGN1cnJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnRDb250ZXh0O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19wcm9jZXNzUGVuZGluZ1N0YXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3Byb2Nlc3NQZW5kaW5nU3RhdGUocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHRoaXMuX2luc3RhbmNlO1xuICAgICAgdmFyIHF1ZXVlID0gdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU7XG4gICAgICBpZiAoIXF1ZXVlKSB7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS5zdGF0ZTtcbiAgICAgIH1cbiAgICAgIC8vIFJlc2V0IHBlbmRpbmcgcXVldWVcbiAgICAgIHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gbnVsbDtcbiAgICAgIHZhciBuZXh0U3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBpbnN0YW5jZS5zdGF0ZSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJ0aWFsID0gcXVldWVbaV07XG4gICAgICAgIE9iamVjdC5hc3NpZ24obmV4dFN0YXRlLCB0eXBlb2YgcGFydGlhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcnRpYWwuY2FsbChpbnN0YW5jZSwgbmV4dFN0YXRlLCBwcm9wcywgY29udGV4dCkgOiBwYXJ0aWFsKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1cGRhdGVDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBwcmV2VW5tYXNrZWRDb250ZXh0LCBuZXh0VW5tYXNrZWRDb250ZXh0KSB7XG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcblxuICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLmJlZm9yZVVwZGF0ZUNvbXBvbmVudCh0aGlzLl9tb3VudElELCB0aGlzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVcGRhdGUgY29tcG9uZW50IFxcJycgKyB0aGlzLmdldE5hbWUoKSArICdcXCcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVubW91bnRlZCAob3IgZmFpbGVkIHRvIG1vdW50KS4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHdpbGxSZWNlaXZlID0gZmFsc2U7XG4gICAgICB2YXIgbmV4dENvbnRleHQgPSB2b2lkIDA7XG4gICAgICB2YXIgbmV4dFByb3BzID0gdm9pZCAwO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQgb3Igbm90XG4gICAgICBpZiAodGhpcy5fY29udGV4dCA9PT0gbmV4dFVubWFza2VkQ29udGV4dCkge1xuICAgICAgICBuZXh0Q29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0Q29udGV4dCA9IHRoaXMuX3Byb2Nlc3NDb250ZXh0KG5leHRVbm1hc2tlZENvbnRleHQpO1xuICAgICAgICB3aWxsUmVjZWl2ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERpc3Rpbmd1aXNoIGJldHdlZW4gYSBwcm9wcyB1cGRhdGUgdmVyc3VzIGEgc2ltcGxlIHN0YXRlIHVwZGF0ZVxuICAgICAgaWYgKHByZXZFbGVtZW50ID09PSBuZXh0RWxlbWVudCkge1xuICAgICAgICAvLyBTa2lwIGNoZWNraW5nIHByb3AgdHlwZXMgYWdhaW4gLS0gd2UgZG9uJ3QgcmVhZCBjb21wb25lbnQucHJvcHMgdG8gYXZvaWRcbiAgICAgICAgLy8gd2FybmluZyBmb3IgRE9NIGNvbXBvbmVudCBwcm9wcyBpbiB0aGlzIHVwZ3JhZGVcbiAgICAgICAgbmV4dFByb3BzID0gbmV4dEVsZW1lbnQucHJvcHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0UHJvcHMgPSBuZXh0RWxlbWVudC5wcm9wcztcbiAgICAgICAgd2lsbFJlY2VpdmUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaGFzUmVjZWl2ZWQgPSB3aWxsUmVjZWl2ZSAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzO1xuXG4gICAgICBpZiAoaGFzUmVjZWl2ZWQpIHtcbiAgICAgICAgLy8gQ2FsbGluZyB0aGlzLnNldFN0YXRlKCkgd2l0aGluIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgd2lsbCBub3QgdHJpZ2dlciBhbiBhZGRpdGlvbmFsIHJlbmRlci5cbiAgICAgICAgdGhpcy5fcGVuZGluZ1N0YXRlID0gdHJ1ZTtcbiAgICAgICAgcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdTdGF0ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcmVmc1xuICAgICAgX3JlZjIuZGVmYXVsdC51cGRhdGUocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCB0aGlzKTtcblxuICAgICAgLy8gU2hvdWQgdXBkYXRlIGFsd2F5cyBkZWZhdWx0XG4gICAgICB2YXIgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcbiAgICAgIHZhciBwcmV2UHJvcHMgPSBpbnN0YW5jZS5wcm9wcztcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZTtcbiAgICAgIC8vIFRPRE86IGNvdWxkIGRlbGF5IGV4ZWN1dGlvbiBwcm9jZXNzUGVuZGluZ1N0YXRlXG4gICAgICB2YXIgbmV4dFN0YXRlID0gdGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcblxuICAgICAgLy8gU2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIG5vdCBjYWxsZWQgd2hlbiBmb3JjZVVwZGF0ZSBpcyB1c2VkXG4gICAgICBpZiAoIXRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSkge1xuICAgICAgICBpZiAoaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKSB7XG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2Uuc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UuaXNQdXJlQ29tcG9uZW50Q2xhc3MpIHtcbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSAhKDAsIF9zaGFsbG93RXF1YWwyLmRlZmF1bHQpKHByZXZQcm9wcywgbmV4dFByb3BzKSB8fCAhKDAsIF9zaGFsbG93RXF1YWwyLmRlZmF1bHQpKHByZXZTdGF0ZSwgbmV4dFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAvLyBXaWxsIHNldCBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAuXG4gICAgICAgIHZhciBwcmV2Q29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG5cbiAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGlzLnNldFN0YXRlKCkgaW4gY29tcG9uZW50V2lsbFVwZGF0ZS5cbiAgICAgICAgLy8gSWYgbmVlZCB0byB1cGRhdGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gYSBwcm9wIGNoYW5nZSwgdXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaW5zdGVhZC5cbiAgICAgICAgcGVyZm9ybUluU2FuZGJveChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUpIHtcbiAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlcGxhY2Ugd2l0aCBuZXh0XG4gICAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2NvbnRleHQgPSBuZXh0VW5tYXNrZWRDb250ZXh0O1xuICAgICAgICBpbnN0YW5jZS5wcm9wcyA9IG5leHRQcm9wcztcbiAgICAgICAgaW5zdGFuY2Uuc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICAgIGluc3RhbmNlLmNvbnRleHQgPSBuZXh0Q29udGV4dDtcblxuICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJlZENvbXBvbmVudChuZXh0VW5tYXNrZWRDb250ZXh0KTtcblxuICAgICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIHByZXZDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvdW50Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBpdCdzIGRldGVybWluZWQgdGhhdCBhIGNvbXBvbmVudCBzaG91bGQgbm90IHVwZGF0ZSwgd2Ugc3RpbGwgd2FudFxuICAgICAgICAvLyB0byBzZXQgcHJvcHMgYW5kIHN0YXRlIGJ1dCB3ZSBzaG9ydGN1dCB0aGUgcmVzdCBvZiB0aGUgdXBkYXRlLlxuICAgICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgICAgICB0aGlzLl9jb250ZXh0ID0gbmV4dFVubWFza2VkQ29udGV4dDtcbiAgICAgICAgaW5zdGFuY2UucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgICAgIGluc3RhbmNlLnN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEZsdXNoIHNldFN0YXRlIGNhbGxiYWNrcyBzZXQgaW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1xuICAgICAgaWYgKGhhc1JlY2VpdmVkKSB7XG4gICAgICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzO1xuICAgICAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcbiAgICAgICAgX3VwZGF0ZXIyLmRlZmF1bHQucnVuQ2FsbGJhY2tzKGNhbGxiYWNrcywgaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmFsc2UpIHtcbiAgICAgICAgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIgJiYgX2hvc3QyLmRlZmF1bHQubWVhc3VyZXIuYWZ0ZXJVcGRhdGVDb21wb25lbnQodGhpcy5fbW91bnRJRCk7XG4gICAgICB9XG5cbiAgICAgIF9ob3N0Mi5kZWZhdWx0Lmhvb2suUmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGwgdGhlIGNvbXBvbmVudCdzIGByZW5kZXJgIG1ldGhvZCBhbmQgdXBkYXRlIHRoZSBET00gYWNjb3JkaW5nbHkuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ191cGRhdGVSZW5kZXJlZENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF91cGRhdGVSZW5kZXJlZENvbXBvbmVudChjb250ZXh0KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHByZXZSZW5kZXJlZENvbXBvbmVudCA9IHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgICAgdmFyIHByZXZSZW5kZXJlZEVsZW1lbnQgPSBwcmV2UmVuZGVyZWRDb21wb25lbnQuX2N1cnJlbnRFbGVtZW50O1xuXG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgIHZhciBuZXh0UmVuZGVyZWRFbGVtZW50ID0gdm9pZCAwO1xuXG4gICAgICBfaG9zdDIuZGVmYXVsdC5jb21wb25lbnQgPSB0aGlzO1xuXG4gICAgICBwZXJmb3JtSW5TYW5kYm94KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGZhbHNlKSB7XG4gICAgICAgICAgbWVhc3VyZUxpZmVDeWNsZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBuZXh0UmVuZGVyZWRFbGVtZW50ID0gaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgICAgfSwgX3RoaXMyLl9tb3VudElELCAncmVuZGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dFJlbmRlcmVkRWxlbWVudCA9IGluc3RhbmNlLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX2hvc3QyLmRlZmF1bHQuY29tcG9uZW50ID0gbnVsbDtcblxuICAgICAgaWYgKCgwLCBfc2hvdWxkVXBkYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShwcmV2UmVuZGVyZWRFbGVtZW50LCBuZXh0UmVuZGVyZWRFbGVtZW50KSkge1xuICAgICAgICBwcmV2UmVuZGVyZWRDb21wb25lbnQudXBkYXRlQ29tcG9uZW50KHByZXZSZW5kZXJlZEVsZW1lbnQsIG5leHRSZW5kZXJlZEVsZW1lbnQsIHByZXZSZW5kZXJlZENvbXBvbmVudC5fY29udGV4dCwgdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSk7XG4gICAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyICYmIF9ob3N0Mi5kZWZhdWx0Lm1lYXN1cmVyLnJlY29yZE9wZXJhdGlvbih7XG4gICAgICAgICAgICBpbnN0YW5jZUlEOiB0aGlzLl9tb3VudElELFxuICAgICAgICAgICAgdHlwZTogJ3VwZGF0ZSBjb21wb25lbnQnLFxuICAgICAgICAgICAgcGF5bG9hZDoge31cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG9sZENoaWxkID0gcHJldlJlbmRlcmVkQ29tcG9uZW50LmdldE5hdGl2ZU5vZGUoKTtcbiAgICAgICAgcHJldlJlbmRlcmVkQ29tcG9uZW50LnVubW91bnRDb21wb25lbnQodHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSAoMCwgX2luc3RhbnRpYXRlQ29tcG9uZW50Mi5kZWZhdWx0KShuZXh0UmVuZGVyZWRFbGVtZW50KTtcbiAgICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQubW91bnRDb21wb25lbnQodGhpcy5fcGFyZW50LCB0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpLCBmdW5jdGlvbiAobmV3Q2hpbGQsIHBhcmVudCkge1xuICAgICAgICAgIC8vIFRPRE86IER1cGxpY2F0ZSBjb2RlIGluIG5hdGl2ZSBjb21wb25lbnQgZmlsZVxuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShuZXdDaGlsZCkpIHtcbiAgICAgICAgICAgIG5ld0NoaWxkID0gW25ld0NoaWxkXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBvbGRDaGlsZCBvciBuZXdDaGlsZCBhbGwgbWF5YmUgZnJhZ21lbnRcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2xkQ2hpbGQpKSB7XG4gICAgICAgICAgICBvbGRDaGlsZCA9IFtvbGRDaGlsZF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgbmV3Q2hpbGQgY291bnQgbGFyZ2UgdGhlbiBvbGRDaGlsZFxuICAgICAgICAgIHZhciBsYXN0TmV3Q2hpbGQgPSB2b2lkIDA7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gbmV3Q2hpbGRbaV07XG4gICAgICAgICAgICBpZiAob2xkQ2hpbGRbaV0pIHtcbiAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLnJlcGxhY2VDaGlsZChjaGlsZCwgb2xkQ2hpbGRbaV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX2hvc3QyLmRlZmF1bHQuZHJpdmVyLmluc2VydEFmdGVyKGNoaWxkLCBsYXN0TmV3Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdE5ld0NoaWxkID0gY2hpbGQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgbmV3Q2hpbGQgY291bnQgbGVzcyB0aGVuIG9sZENoaWxkXG4gICAgICAgICAgaWYgKG5ld0NoaWxkLmxlbmd0aCA8IG9sZENoaWxkLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSBuZXdDaGlsZC5sZW5ndGg7IF9pIDwgb2xkQ2hpbGQubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZChvbGRDaGlsZFtfaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmF0aXZlTm9kZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hdGl2ZU5vZGUoKSB7XG4gICAgICB2YXIgcmVuZGVyZWRDb21wb25lbnQgPSB0aGlzLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICAgIGlmIChyZW5kZXJlZENvbXBvbmVudCkge1xuICAgICAgICByZXR1cm4gcmVuZGVyZWRDb21wb25lbnQuZ2V0TmF0aXZlTm9kZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFB1YmxpY0luc3RhbmNlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoKSB7XG4gICAgICB2YXIgaW5zdGFuY2UgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgIC8vIFRoZSBTdGF0ZWxlc3MgY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmc1xuICAgICAgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgX3N0YXRlbGVzczIuZGVmYXVsdCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ29tcG9zaXRlQ29tcG9uZW50O1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBDb21wb3NpdGVDb21wb25lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAyNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2hvc3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX2hvc3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9zdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qKlxuICogU3RhdGVsZXNzIENvbXBvbmVudCBDbGFzcyBXcmFwcGVyXG4gKi9cbnZhciBTdGF0ZWxlc3NDb21wb25lbnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN0YXRlbGVzc0NvbXBvbmVudChwdXJlUmVuZGVyKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXRlbGVzc0NvbXBvbmVudCk7XG5cbiAgICAvLyBBIHN0YXRlbGVzcyBmdW5jdGlvblxuICAgIHRoaXMucHVyZVJlbmRlciA9IHB1cmVSZW5kZXI7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoU3RhdGVsZXNzQ29tcG9uZW50LCBbe1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIGlmIChmYWxzZSkge1xuICAgICAgICBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlciAmJiBfaG9zdDIuZGVmYXVsdC5tZWFzdXJlci5iZWZvcmVSZW5kZXIoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucHVyZVJlbmRlcih0aGlzLnByb3BzLCB0aGlzLmNvbnRleHQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTdGF0ZWxlc3NDb21wb25lbnQ7XG59KCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFN0YXRlbGVzc0NvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDI3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5mdW5jdGlvbiBlbnF1ZXVlQ2FsbGJhY2soaW50ZXJuYWwsIGNhbGxiYWNrKSB7XG4gIGlmIChjYWxsYmFjaykge1xuICAgIHZhciBjYWxsYmFja1F1ZXVlID0gaW50ZXJuYWwuX3BlbmRpbmdDYWxsYmFja3MgfHwgKGludGVybmFsLl9wZW5kaW5nQ2FsbGJhY2tzID0gW10pO1xuICAgIGNhbGxiYWNrUXVldWUucHVzaChjYWxsYmFjayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVN0YXRlKGludGVybmFsLCBwYXJ0aWFsU3RhdGUpIHtcbiAgaWYgKHBhcnRpYWxTdGF0ZSkge1xuICAgIHZhciBzdGF0ZVF1ZXVlID0gaW50ZXJuYWwuX3BlbmRpbmdTdGF0ZVF1ZXVlIHx8IChpbnRlcm5hbC5fcGVuZGluZ1N0YXRlUXVldWUgPSBbXSk7XG4gICAgc3RhdGVRdWV1ZS5wdXNoKHBhcnRpYWxTdGF0ZSk7XG4gIH1cbn1cblxudmFyIFVwZGF0ZXIgPSB7XG4gIHNldFN0YXRlOiBmdW5jdGlvbiBzZXRTdGF0ZShjb21wb25lbnQsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW50ZXJuYWwgPSBjb21wb25lbnQuX2ludGVybmFsO1xuXG4gICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVucXVldWVTdGF0ZShpbnRlcm5hbCwgcGFydGlhbFN0YXRlKTtcbiAgICBlbnF1ZXVlQ2FsbGJhY2soaW50ZXJuYWwsIGNhbGxiYWNrKTtcblxuICAgIGlmICghaW50ZXJuYWwuX3BlbmRpbmdTdGF0ZSkge1xuICAgICAgdGhpcy5ydW5VcGRhdGUoY29tcG9uZW50KTtcbiAgICB9XG4gIH0sXG5cbiAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKGNvbXBvbmVudCwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW50ZXJuYWwgPSBjb21wb25lbnQuX2ludGVybmFsO1xuXG4gICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGludGVybmFsLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSB0cnVlO1xuXG4gICAgZW5xdWV1ZUNhbGxiYWNrKGludGVybmFsLCBjYWxsYmFjayk7XG4gICAgdGhpcy5ydW5VcGRhdGUoY29tcG9uZW50KTtcbiAgfSxcblxuICBydW5VcGRhdGU6IGZ1bmN0aW9uIHJ1blVwZGF0ZShjb21wb25lbnQpIHtcbiAgICB2YXIgaW50ZXJuYWwgPSBjb21wb25lbnQuX2ludGVybmFsO1xuXG4gICAgaWYgKCFpbnRlcm5hbCB8fCAhaW50ZXJuYWwuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdXBkYXRlQ29tcG9uZW50IGhhcHBlbnMgdG8gZW5xdWV1ZSBhbnkgbmV3IHVwZGF0ZXMsIHdlXG4gICAgLy8gc2hvdWxkbid0IGV4ZWN1dGUgdGhlIGNhbGxiYWNrcyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgaGFwcGVucywgc29cbiAgICAvLyBzdGFzaCB0aGUgY2FsbGJhY2tzIGZpcnN0XG4gICAgdmFyIGNhbGxiYWNrcyA9IGludGVybmFsLl9wZW5kaW5nQ2FsbGJhY2tzO1xuICAgIGludGVybmFsLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcblxuICAgIHZhciBwcmV2RWxlbWVudCA9IGludGVybmFsLl9jdXJyZW50RWxlbWVudDtcbiAgICB2YXIgcHJldlVubWFza2VkQ29udGV4dCA9IGludGVybmFsLl9jb250ZXh0O1xuXG4gICAgaWYgKGludGVybmFsLl9wZW5kaW5nU3RhdGVRdWV1ZSB8fCBpbnRlcm5hbC5fcGVuZGluZ0ZvcmNlVXBkYXRlKSB7XG4gICAgICBpbnRlcm5hbC51cGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIHByZXZFbGVtZW50LCBwcmV2VW5tYXNrZWRDb250ZXh0LCBwcmV2VW5tYXNrZWRDb250ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bkNhbGxiYWNrcyhjYWxsYmFja3MsIGNvbXBvbmVudCk7XG4gIH0sXG5cbiAgcnVuQ2FsbGJhY2tzOiBmdW5jdGlvbiBydW5DYWxsYmFja3MoY2FsbGJhY2tzLCBjb250ZXh0KSB7XG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldLmNhbGwoY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBVcGRhdGVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSksXG4vKiAyOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICBpZiAoeCA9PT0geSkge1xuICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKCh0eXBlb2Ygb2JqQSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqQSkpICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqQiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqQikpICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHNoYWxsb3dFcXVhbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDI5ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfaG9zdCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfaG9zdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ob3N0KTtcblxudmFyIF9uYXRpdmUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpO1xuXG52YXIgX25hdGl2ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9uYXRpdmUpO1xuXG52YXIgX2luc3RhbmNlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxudmFyIF9pbnN0YW5jZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnN0YW5jZSk7XG5cbnZhciBfaW5zdGFudGlhdGVDb21wb25lbnQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpO1xuXG52YXIgX2luc3RhbnRpYXRlQ29tcG9uZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luc3RhbnRpYXRlQ29tcG9uZW50KTtcblxudmFyIF9nZXRFbGVtZW50S2V5TmFtZSA9IF9fd2VicGFja19yZXF1aXJlX18oMTEpO1xuXG52YXIgX2dldEVsZW1lbnRLZXlOYW1lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldEVsZW1lbnRLZXlOYW1lKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vKipcbiAqIEZyYWdtZW50IENvbXBvbmVudFxuICovXG52YXIgRnJhZ21lbnRDb21wb25lbnQgPSBmdW5jdGlvbiAoX05hdGl2ZUNvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoRnJhZ21lbnRDb21wb25lbnQsIF9OYXRpdmVDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZyYWdtZW50Q29tcG9uZW50KGVsZW1lbnQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRnJhZ21lbnRDb21wb25lbnQpO1xuXG4gICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChGcmFnbWVudENvbXBvbmVudC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEZyYWdtZW50Q29tcG9uZW50KSkuY2FsbCh0aGlzLCBlbGVtZW50KSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRnJhZ21lbnRDb21wb25lbnQsIFt7XG4gICAga2V5OiAnbW91bnRDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb3VudENvbXBvbmVudChwYXJlbnQsIGNvbnRleHQsIGNoaWxkTW91bnRlcikge1xuICAgICAgLy8gUGFyZW50IG5hdGl2ZSBlbGVtZW50XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMuX21vdW50SUQgPSBfaG9zdDIuZGVmYXVsdC5tb3VudElEKys7XG5cbiAgICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgICAgX2ludGVybmFsOiB0aGlzXG4gICAgICB9O1xuICAgICAgdGhpcy5faW5zdGFuY2UgPSBpbnN0YW5jZTtcblxuICAgICAgdmFyIGZyYWdtZW50ID0gdGhpcy5nZXROYXRpdmVOb2RlKCk7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9jdXJyZW50RWxlbWVudDtcblxuICAgICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgICAgdGhpcy5tb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KTtcblxuICAgICAgaWYgKGNoaWxkTW91bnRlcikge1xuICAgICAgICBjaGlsZE1vdW50ZXIoZnJhZ21lbnQsIHBhcmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaXNGcmFnbWVudFBhcmVudCA9IEFycmF5LmlzQXJyYXkocGFyZW50KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcmFnbWVudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBjaGlsZCA9IGZyYWdtZW50W2ldO1xuICAgICAgICAgIC8vIFdoZW4gdGhlIHBhcmVudCBpcyBhbHNvIGEgZnJhZ21lbnRcbiAgICAgICAgICBpZiAoaXNGcmFnbWVudFBhcmVudCkge1xuICAgICAgICAgICAgcGFyZW50LnB1c2goY2hpbGQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfaG9zdDIuZGVmYXVsdC5kcml2ZXIuYXBwZW5kQ2hpbGQoY2hpbGQsIHBhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdtb3VudENoaWxkcmVuJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbW91bnRDaGlsZHJlbihjaGlsZHJlbiwgY29udGV4dCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IHt9O1xuICAgICAgdmFyIGZyYWdtZW50ID0gdGhpcy5nZXROYXRpdmVOb2RlKCk7XG5cbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuSW1hZ2UgPSBjaGlsZHJlbi5tYXAoZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciByZW5kZXJlZENoaWxkID0gKDAsIF9pbnN0YW50aWF0ZUNvbXBvbmVudDIuZGVmYXVsdCkoZWxlbWVudCk7XG4gICAgICAgIHZhciBuYW1lID0gKDAsIF9nZXRFbGVtZW50S2V5TmFtZTIuZGVmYXVsdCkocmVuZGVyZWRDaGlsZHJlbiwgZWxlbWVudCwgaW5kZXgpO1xuICAgICAgICByZW5kZXJlZENoaWxkcmVuW25hbWVdID0gcmVuZGVyZWRDaGlsZDtcbiAgICAgICAgcmVuZGVyZWRDaGlsZC5fbW91bnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBNb3VudFxuICAgICAgICB2YXIgbW91bnRJbWFnZSA9IHJlbmRlcmVkQ2hpbGQubW91bnRDb21wb25lbnQoX3RoaXMyLl9wYXJlbnQsIGNvbnRleHQsIGZ1bmN0aW9uIChuYXRpdmVOb2RlKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmF0aXZlTm9kZSkpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmF0aXZlTm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBmcmFnbWVudC5wdXNoKG5hdGl2ZU5vZGVbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmcmFnbWVudC5wdXNoKG5hdGl2ZU5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBtb3VudEltYWdlO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZW5kZXJlZENoaWxkcmVuSW1hZ2U7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndW5tb3VudENvbXBvbmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubW91bnRDb21wb25lbnQobm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLl9uYXRpdmVOb2RlKSB7XG4gICAgICAgIF9pbnN0YW5jZTIuZGVmYXVsdC5yZW1vdmUodGhpcy5fbmF0aXZlTm9kZSk7XG4gICAgICAgIGlmICghbm90UmVtb3ZlQ2hpbGQpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX25hdGl2ZU5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5yZW1vdmVDaGlsZCh0aGlzLl9uYXRpdmVOb2RlW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRG8gbm90IG5lZWQgcmVtb3ZlIGNoaWxkIHdoZW4gdGhlaXIgcGFyZW50IGlzIHJlbW92ZWRcbiAgICAgIHRoaXMudW5tb3VudENoaWxkcmVuKHRydWUpO1xuXG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9uYXRpdmVOb2RlID0gbnVsbDtcbiAgICAgIHRoaXMuX3BhcmVudCA9IG51bGw7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1cGRhdGVDb21wb25lbnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBwcmV2Q29udGV4dCwgbmV4dENvbnRleHQpIHtcbiAgICAgIC8vIFJlcGxhY2UgY3VycmVudCBlbGVtZW50XG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbih0aGlzLl9jdXJyZW50RWxlbWVudCwgbmV4dENvbnRleHQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldE5hdGl2ZU5vZGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXROYXRpdmVOb2RlKCkge1xuICAgICAgaWYgKHRoaXMuX25hdGl2ZU5vZGUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9uYXRpdmVOb2RlID0gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmVOb2RlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldFB1YmxpY0luc3RhbmNlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0UHVibGljSW5zdGFuY2UoKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXROYXRpdmVOb2RlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0TmFtZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldE5hbWUoKSB7XG4gICAgICByZXR1cm4gJ2ZyYWdtZW50JztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRnJhZ21lbnRDb21wb25lbnQ7XG59KF9uYXRpdmUyLmRlZmF1bHQpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBGcmFnbWVudENvbXBvbmVudDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDMwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mMiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcikgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YyKG9iaik7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mMihvYmopO1xufTsgLyoqXG4gICAgKiBXZWV4IGRyaXZlclxuICAgICovXG5cbnZhciBfc3R5bGVVbml0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMik7XG5cbnZhciBfZWxlbWVudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMxKTtcblxudmFyIF9lbGVtZW50czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50cyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9O1xufVxuXG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIElEID0gJ2lkJztcbnZhciBURVhUID0gJ3RleHQnO1xudmFyIENISUxEUkVOID0gJ2NoaWxkcmVuJztcbnZhciBFVkVOVF9QUkVGSVhfUkVHRVhQID0gL15vbltBLVpdLztcbnZhciBGVUxMX1dJRFRIX1JFTSA9IDc1MDtcbnZhciBBUklBX1BSRUZJWF9SRUdFWFAgPSAvXmFyaWEtLztcblxudmFyIG5vZGVNYXBzID0ge307XG4vKiBnbG9iYWwgX193ZWV4X2RvY3VtZW50X18gKi9cbnZhciBkb2N1bWVudCA9ICh0eXBlb2YgX193ZWV4X2RvY3VtZW50X18gPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKF9fd2VleF9kb2N1bWVudF9fKSkgPT09ICdvYmplY3QnID8gX193ZWV4X2RvY3VtZW50X18gOiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihkb2N1bWVudCkpID09PSAnb2JqZWN0JyA/IGRvY3VtZW50IDogbnVsbDtcblxudmFyIERyaXZlciA9IHtcbiAgZ2V0RWxlbWVudEJ5SWQ6IGZ1bmN0aW9uIGdldEVsZW1lbnRCeUlkKGlkKSB7XG4gICAgcmV0dXJuIG5vZGVNYXBzW2lkXTtcbiAgfSxcbiAgY3JlYXRlQm9keTogZnVuY3Rpb24gY3JlYXRlQm9keSgpIHtcbiAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgdmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgYm9keSA9IGRvY3VtZW50LmNyZWF0ZUJvZHkoKTtcbiAgICBkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoYm9keSk7XG5cbiAgICByZXR1cm4gYm9keTtcbiAgfSxcbiAgY3JlYXRlQ29tbWVudDogZnVuY3Rpb24gY3JlYXRlQ29tbWVudChjb250ZW50KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoY29udGVudCk7XG4gIH0sXG4gIGNyZWF0ZUVtcHR5OiBmdW5jdGlvbiBjcmVhdGVFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDb21tZW50KCcgZW1wdHkgJyk7XG4gIH0sXG4gIGNyZWF0ZVRleHQ6IGZ1bmN0aW9uIGNyZWF0ZVRleHQodGV4dCkge1xuICAgIHJldHVybiBEcml2ZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgICB0eXBlOiBURVhULFxuICAgICAgcHJvcHM6IHtcbiAgICAgICAgdmFsdWU6IHRleHRcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbiAgdXBkYXRlVGV4dDogZnVuY3Rpb24gdXBkYXRlVGV4dChub2RlLCBjb250ZW50KSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUobm9kZSwgJ3ZhbHVlJywgY29udGVudCk7XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoY29tcG9uZW50KSB7XG4gICAgdmFyIGh0bWxFbGVtZW50ID0gX2VsZW1lbnRzMi5kZWZhdWx0W2NvbXBvbmVudC50eXBlXTtcbiAgICBpZiAoaHRtbEVsZW1lbnQpIHtcbiAgICAgIGNvbXBvbmVudCA9IGh0bWxFbGVtZW50LnBhcnNlKGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgdmFyIHByb3BzID0gY29tcG9uZW50LnByb3BzO1xuICAgIHZhciBldmVudHMgPSBbXTtcbiAgICB2YXIgc3R5bGUgPSB7fTtcbiAgICB2YXIgb3JpZ2luU3R5bGUgPSBwcm9wc1tTVFlMRV07XG4gICAgZm9yICh2YXIgcHJvcCBpbiBvcmlnaW5TdHlsZSkge1xuICAgICAgc3R5bGVbcHJvcF0gPSAoMCwgX3N0eWxlVW5pdC5jb252ZXJ0VW5pdCkob3JpZ2luU3R5bGVbcHJvcF0sIHByb3ApO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjb21wb25lbnQudHlwZSwge1xuICAgICAgc3R5bGU6IHN0eWxlXG4gICAgfSk7XG5cbiAgICB0aGlzLnNldE5hdGl2ZVByb3BzKG5vZGUsIHByb3BzLCB0cnVlKTtcblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgcGFyZW50KSB7XG4gICAgcmV0dXJuIHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgfSxcbiAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIHJlbW92ZUNoaWxkKG5vZGUsIHBhcmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgdmFyIGlkID0gbm9kZS5hdHRyICYmIG5vZGUuYXR0cltJRF07XG4gICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgIG5vZGVNYXBzW2lkXSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7XG4gIH0sXG4gIHJlcGxhY2VDaGlsZDogZnVuY3Rpb24gcmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IG9sZENoaWxkLnBhcmVudE5vZGU7XG4gICAgdmFyIHByZXZpb3VzU2libGluZyA9IG9sZENoaWxkLnByZXZpb3VzU2libGluZztcbiAgICB2YXIgbmV4dFNpYmxpbmcgPSBvbGRDaGlsZC5uZXh0U2libGluZztcbiAgICB0aGlzLnJlbW92ZUNoaWxkKG9sZENoaWxkLCBwYXJlbnQpO1xuXG4gICAgaWYgKHByZXZpb3VzU2libGluZykge1xuICAgICAgdGhpcy5pbnNlcnRBZnRlcihuZXdDaGlsZCwgcHJldmlvdXNTaWJsaW5nLCBwYXJlbnQpO1xuICAgIH0gZWxzZSBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBuZXh0U2libGluZywgcGFyZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcHBlbmRDaGlsZChuZXdDaGlsZCwgcGFyZW50KTtcbiAgICB9XG4gIH0sXG4gIGluc2VydEFmdGVyOiBmdW5jdGlvbiBpbnNlcnRBZnRlcihub2RlLCBhZnRlciwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IGFmdGVyLnBhcmVudE5vZGU7XG4gICAgcmV0dXJuIHBhcmVudC5pbnNlcnRBZnRlcihub2RlLCBhZnRlcik7XG4gIH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IGJlZm9yZS5wYXJlbnROb2RlO1xuICAgIHJldHVybiBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIGJlZm9yZSk7XG4gIH0sXG4gIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudEhhbmRsZXIpIHtcbiAgICByZXR1cm4gbm9kZS5hZGRFdmVudChldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gIH0sXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudEhhbmRsZXIpIHtcbiAgICByZXR1cm4gbm9kZS5yZW1vdmVFdmVudChldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gIH0sXG4gIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxFdmVudExpc3RlbmVycyhub2RlKSB7XG4gICAgLy8gTm9vcFxuICB9LFxuICByZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZShub2RlLCBwcm9wS2V5LCBwcm9wVmFsdWUpIHtcbiAgICBpZiAocHJvcEtleSA9PSBJRCkge1xuICAgICAgbm9kZU1hcHNbcHJvcFZhbHVlXSA9IG51bGw7XG4gICAgfVxuICAgIC8vIFdlZXggbmF0aXZlIHdpbGwgY3Jhc2ggd2hlbiBwYXNzIG51bGwgdmFsdWVcbiAgICByZXR1cm4gbm9kZS5zZXRBdHRyKHByb3BLZXksIHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9LFxuICBzZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uIHNldEF0dHJpYnV0ZShub2RlLCBwcm9wS2V5LCBwcm9wVmFsdWUpIHtcbiAgICBpZiAocHJvcEtleSA9PSBJRCkge1xuICAgICAgbm9kZU1hcHNbcHJvcFZhbHVlXSA9IG5vZGU7XG4gICAgfVxuXG4gICAgLy8gV2VleCBvbmx5IHN1cHBvcnQgYGFyaWFMYWJlbGAgZm9ybWF0LCBjb252ZXJ0IGBhcmlhLWxhYmVsYCBmb3JtYXQgdG8gY2FtZWxjYXNlXG4gICAgaWYgKEFSSUFfUFJFRklYX1JFR0VYUC50ZXN0KHByb3BLZXkpKSB7XG4gICAgICBwcm9wS2V5ID0gcHJvcEtleS5yZXBsYWNlKC9cXC0oXFx3KS8sIGZ1bmN0aW9uIChtLCBwMSkge1xuICAgICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlLnNldEF0dHIocHJvcEtleSwgcHJvcFZhbHVlLCBmYWxzZSk7XG4gIH0sXG4gIHNldFN0eWxlczogZnVuY3Rpb24gc2V0U3R5bGVzKG5vZGUsIHN0eWxlcykge1xuICAgIC8vIFRPRE8gaWYgbW9yZSB0aGVuIG9uZSBzdHlsZSB1cGRhdGUsIGNhbGwgc2V0U3R5bGVzIHdpbGwgYmUgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgICAgdmFyIHZhbCA9IHN0eWxlc1trZXldO1xuICAgICAgdmFsID0gKDAsIF9zdHlsZVVuaXQuY29udmVydFVuaXQpKHZhbCwga2V5KTtcbiAgICAgIG5vZGUuc2V0U3R5bGUoa2V5LCB2YWwpO1xuICAgIH1cbiAgfSxcbiAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbiBiZWZvcmVSZW5kZXIoKSB7XG4gICAgLy8gVHVybiBvZmYgYmF0Y2hlZCB1cGRhdGVzXG4gICAgZG9jdW1lbnQub3BlbigpO1xuXG4gICAgLy8gSW5pdCByZW0gdW5pdFxuICAgICgwLCBfc3R5bGVVbml0LnNldFJlbSkodGhpcy5nZXRXaW5kb3dXaWR0aCgpIC8gRlVMTF9XSURUSF9SRU0pO1xuICB9LFxuICBhZnRlclJlbmRlcjogZnVuY3Rpb24gYWZ0ZXJSZW5kZXIoKSB7XG4gICAgaWYgKGRvY3VtZW50Lmxpc3RlbmVyICYmIGRvY3VtZW50Lmxpc3RlbmVyLmNyZWF0ZUZpbmlzaCkge1xuICAgICAgZG9jdW1lbnQubGlzdGVuZXIuY3JlYXRlRmluaXNoKCk7XG4gICAgfVxuXG4gICAgLy8gVHVybiBvbiBiYXRjaGVkIHVwZGF0ZXNcbiAgICBkb2N1bWVudC5jbG9zZSgpO1xuICB9LFxuICBnZXRXaW5kb3dXaWR0aDogZnVuY3Rpb24gZ2V0V2luZG93V2lkdGgoKSB7XG4gICAgcmV0dXJuIEZVTExfV0lEVEhfUkVNO1xuICB9LFxuICBzZXROYXRpdmVQcm9wczogZnVuY3Rpb24gc2V0TmF0aXZlUHJvcHMobm9kZSwgcHJvcHMsIHNraXBTZXRTdHlsZXMpIHtcbiAgICBmb3IgKHZhciBwcm9wIGluIHByb3BzKSB7XG4gICAgICB2YXIgdmFsdWUgPSBwcm9wc1twcm9wXTtcbiAgICAgIGlmIChwcm9wID09PSBDSElMRFJFTikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHByb3AgPT09IFNUWUxFKSB7XG4gICAgICAgICAgaWYgKHNraXBTZXRTdHlsZXMpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNldFN0eWxlcyhub2RlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoRVZFTlRfUFJFRklYX1JFR0VYUC50ZXN0KHByb3ApKSB7XG4gICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IHByb3Auc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobm9kZSwgcHJvcCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBEcml2ZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzMSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2ltZyA9IF9fd2VicGFja19yZXF1aXJlX18oMzIpO1xuXG52YXIgX2ltZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbWcpO1xuXG52YXIgX3ZpZGVvID0gX193ZWJwYWNrX3JlcXVpcmVfXygzMyk7XG5cbnZhciBfdmlkZW8yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmlkZW8pO1xuXG52YXIgX3RleHRhcmVhID0gX193ZWJwYWNrX3JlcXVpcmVfXygzNCk7XG5cbnZhciBfdGV4dGFyZWEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdGV4dGFyZWEpO1xuXG52YXIgX3NwYW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM1KTtcblxudmFyIF9zcGFuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NwYW4pO1xuXG52YXIgX3AgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM2KTtcblxudmFyIF9wMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ApO1xuXG52YXIgX2J1dHRvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMzcpO1xuXG52YXIgX2J1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9idXR0b24pO1xuXG52YXIgX2hlYWRpbmcgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDM4KTtcblxudmFyIF9oZWFkaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hlYWRpbmcpO1xuXG52YXIgX2Jsb2NrID0gX193ZWJwYWNrX3JlcXVpcmVfXygzOSk7XG5cbnZhciBfYmxvY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYmxvY2spO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBzcGFuOiBfc3BhbjIuZGVmYXVsdCxcbiAgcDogX3AyLmRlZmF1bHQsXG4gIGltZzogX2ltZzIuZGVmYXVsdCxcbiAgYnV0dG9uOiBfYnV0dG9uMi5kZWZhdWx0LFxuICB2aWRlbzogX3ZpZGVvMi5kZWZhdWx0LFxuICB0ZXh0YXJlYTogX3RleHRhcmVhMi5kZWZhdWx0LFxuICBoMTogX2hlYWRpbmcyLmRlZmF1bHQsXG4gIGgyOiBfaGVhZGluZzIuZGVmYXVsdCxcbiAgaDM6IF9oZWFkaW5nMi5kZWZhdWx0LFxuICBoNDogX2hlYWRpbmcyLmRlZmF1bHQsXG4gIGg1OiBfaGVhZGluZzIuZGVmYXVsdCxcbiAgaDY6IF9oZWFkaW5nMi5kZWZhdWx0LFxuICBuYXY6IF9ibG9jazIuZGVmYXVsdCxcbiAgYXJ0aWNsZTogX2Jsb2NrMi5kZWZhdWx0LFxuICBzZWN0aW9uOiBfYmxvY2syLmRlZmF1bHQsXG4gIC8vIENvbmZsaWN0IHdpdGggd2VleCBoZWFkZXIgdGFnXG4gIC8vIGhlYWRlcjogYmxvY2ssXG4gIGZvb3RlcjogX2Jsb2NrMi5kZWZhdWx0LFxuICBhc2lkZTogX2Jsb2NrMi5kZWZhdWx0LFxuICBtYWluOiBfYmxvY2syLmRlZmF1bHRcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzMiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3BhcnNlUHJvcHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuXG4gIC8qKlxuICAgKiBwYXJzZSB3M2MgYXR0cnMgdG8gd2VleCBtb2R1bGUgYXR0cnNcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHczYyBjb21wb25lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHdlZXggY29tcG9uZW50IGRhdGFcbiAgICovXG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICBjb21wb25lbnQudHlwZSA9ICdpbWFnZSc7XG5cbiAgICAvLyBtb2RpZnkgcHJvcHNcbiAgICBjb21wb25lbnQucHJvcHMgPSAoMCwgX3BhcnNlUHJvcHMudHJhbnNmb3JtUHJvcHNBdHRyc1RvU3R5bGUpKHByb3BzLCBbJ3dpZHRoJywgJ2hlaWdodCddKTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3BhcnNlUHJvcHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEzKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuXG4gIC8qKlxuICAgKiBwYXJzZSB3M2MgYXR0cnMgdG8gd2VleCBtb2R1bGUgYXR0cnNcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHczYyBjb21wb25lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtPYmplY3R9IHdlZXggY29tcG9uZW50IGRhdGFcbiAgICovXG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICAvLyBtb2RpZnkgcHJvcHNcblxuICAgIGNvbXBvbmVudC5wcm9wcyA9ICgwLCBfcGFyc2VQcm9wcy50cmFuc2Zvcm1Qcm9wc0F0dHJzVG9TdHlsZSkocHJvcHMsIFsnd2lkdGgnLCAnaGVpZ2h0J10pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDM0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG5cbiAgLyoqXG4gICAqIHBhcnNlIHczYyBhdHRycyB0byB3ZWV4IG1vZHVsZSBhdHRyc1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdzNjIGNvbXBvbmVudCBkYXRhXG4gICAqIEByZXR1cm4ge09iamVjdH0gd2VleCBjb21wb25lbnQgZGF0YVxuICAgKi9cbiAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGNvbXBvbmVudCkge1xuICAgIHZhciBwcm9wcyA9IGNvbXBvbmVudC5wcm9wcztcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnICYmICFwcm9wcy52YWx1ZSkge1xuICAgICAgcHJvcHMudmFsdWUgPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGNvbXBvbmVudCkge1xuICAgIHZhciBwcm9wcyA9IGNvbXBvbmVudC5wcm9wcztcblxuICAgIGNvbXBvbmVudC50eXBlID0gJ3RleHQnO1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgJiYgIXByb3BzLnZhbHVlKSB7XG4gICAgICBwcm9wcy52YWx1ZSA9IHByb3BzLmNoaWxkcmVuO1xuICAgICAgcHJvcHMuY2hpbGRyZW4gPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAzNiAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3R5cGVvZjIgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mMihTeW1ib2wuaXRlcmF0b3IpID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIiA/IFwidW5kZWZpbmVkXCIgOiBfdHlwZW9mMihvYmopO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZjIob2JqKTtcbn07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07Zm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1yZXR1cm4gdGFyZ2V0O1xufTtcblxudmFyIEJBU0VfRk9OVF9TSVpFID0gMjg7XG5cbnZhciBkZWZhdWx0UGFyYWdyYXBoU3R5bGUgPSB7XG4gIGZvbnRTaXplOiBCQVNFX0ZPTlRfU0laRSxcbiAgbWFyZ2luVG9wOiBCQVNFX0ZPTlRfU0laRSxcbiAgbWFyZ2luQm90dG9tOiBCQVNFX0ZPTlRfU0laRVxufTtcblxudmFyIFR5cG9ncmFwaHlFbGVtZW50cyA9IHtcbiAgdToge1xuICAgIHRleHREZWNvcmF0aW9uOiAndW5kZXJsaW5lJ1xuICB9LFxuICBzOiB7XG4gICAgdGV4dERlY29yYXRpb246ICdsaW5lLXRocm91Z2gnXG4gIH0sXG4gIGk6IHtcbiAgICBmb250U3R5bGU6ICdpdGFsaWMnXG4gIH0sXG4gIGI6IHtcbiAgICBmb250V2VpZ2h0OiAnYm9sZCdcbiAgfSxcbiAgZGVsOiB7XG4gICAgdGV4dERlY29yYXRpb246ICdsaW5lLXRocm91Z2gnXG4gIH0sXG4gIGVtOiB7XG4gICAgZm9udFN0eWxlOiAnaXRhbGljJ1xuICB9LFxuICBzdHJvbmc6IHtcbiAgICBmb250V2VpZ2h0OiAnYm9sZCdcbiAgfSxcbiAgYmlnOiB7XG4gICAgZm9udFNpemU6IEJBU0VfRk9OVF9TSVpFICogMS4yXG4gIH0sXG4gIHNtYWxsOiB7XG4gICAgZm9udFNpemU6IEJBU0VfRk9OVF9TSVpFICogMC44XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVN0cmluZyhzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnc3BhbicsXG4gICAgYXR0cjoge1xuICAgICAgdmFsdWU6IHN0cmluZ1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtQ2hpbGQoY2hpbGQpIHtcbiAgdmFyIHR5cGUgPSBjaGlsZC50eXBlO1xuICB2YXIgcHJvcHMgPSBjaGlsZC5wcm9wcztcbiAgdmFyIHN0eWxlID0gcHJvcHMuc3R5bGU7XG4gIHZhciBuZXN0ZWRDaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAvLyBBbGlhcyBpbWcgdGFnXG4gIGlmICh0eXBlID09PSAnaW1nJykge1xuICAgIHR5cGUgPSAnaW1hZ2UnO1xuICB9XG5cbiAgLy8gVHJhbnNmcm9tIHRvIHNwYW5cbiAgaWYgKFR5cG9ncmFwaHlFbGVtZW50c1t0eXBlXSkge1xuICAgIHN0eWxlID0gX2V4dGVuZHMoe30sIFR5cG9ncmFwaHlFbGVtZW50c1t0eXBlXSwgc3R5bGUpO1xuICAgIHR5cGUgPSAnc3Bhbic7XG4gIH1cblxuICBwcm9wcy5zdHlsZSA9IG51bGw7XG4gIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcblxuICB2YXIgZWxlbWVudCA9IHtcbiAgICB0eXBlOiB0eXBlLFxuICAgIHN0eWxlOiBzdHlsZSxcbiAgICBhdHRyOiBwcm9wcyB8fCB7fVxuICB9O1xuXG4gIGlmIChuZXN0ZWRDaGlsZHJlbikge1xuICAgIGlmICh0eXBlID09PSAnc3BhbicgJiYgdHlwZW9mIG5lc3RlZENoaWxkcmVuID09PSAnc3RyaW5nJykge1xuICAgICAgZWxlbWVudC5hdHRyLnZhbHVlID0gbmVzdGVkQ2hpbGRyZW47XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuY2hpbGRyZW4gPSB0cmFuc2Zvcm1DaGlsZHJlbihuZXN0ZWRDaGlsZHJlbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybUNoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBlbGVtZW50cyA9IFtdO1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgY2hpbGRyZW4gPSBbY2hpbGRyZW5dO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKHRyYW5zZm9ybVN0cmluZyhjaGlsZCkpO1xuICAgIH0gZWxzZSBpZiAoKHR5cGVvZiBjaGlsZCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoY2hpbGQpKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2godHJhbnNmb3JtQ2hpbGQoY2hpbGQpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudHM7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgcGFyc2U6IGZ1bmN0aW9uIHBhcnNlKGNvbXBvbmVudCkge1xuICAgIHZhciBwcm9wcyA9IGNvbXBvbmVudC5wcm9wcztcblxuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuXG4gICAgY29tcG9uZW50LnR5cGUgPSAncmljaHRleHQnO1xuXG4gICAgcHJvcHMuc3R5bGUgPSBfZXh0ZW5kcyh7fSwgZGVmYXVsdFBhcmFncmFwaFN0eWxlLCBwcm9wcy5zdHlsZSk7XG5cbiAgICBwcm9wcy52YWx1ZSA9IHRyYW5zZm9ybUNoaWxkcmVuKGNoaWxkcmVuKTs7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBudWxsO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDM3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07Zm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1yZXR1cm4gdGFyZ2V0O1xufTtcblxuLyoqXG4gKiB3ZWV4IGJ1dHRvblxuICpcbiAqIHByb3BzOiBkaXNhYmxlZCwgc3R5bGVcbiAqL1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICBjb21wb25lbnQudHlwZSA9ICd0ZXh0JztcblxuICAgIHZhciBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuXG4gICAgdmFyIHRleHRTdHlsZSA9IF9leHRlbmRzKHtcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICBmb250U2l6ZTogMjIsXG4gICAgICBwYWRkaW5nVG9wOiA0LFxuICAgICAgcGFkZGluZ1JpZ2h0OiAxMixcbiAgICAgIHBhZGRpbmdCb3R0b206IDYsXG4gICAgICBwYWRkaW5nTGVmdDogMTIsXG4gICAgICBib3JkZXJXaWR0aDogNCxcbiAgICAgIGJvcmRlclN0eWxlOiAnc29saWQnLFxuICAgICAgYm9yZGVyQ29sb3I6ICcjMDAwMDAwJyxcbiAgICAgIGJhY2tncm91ZENvbG9yOiAnI2MwYzBjMCdcbiAgICB9LCBzdHlsZSk7XG5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHByb3BzLm9uQ2xpY2sgPSBudWxsO1xuICAgICAgdGV4dFN0eWxlID0gX2V4dGVuZHMoe30sIHRleHRTdHlsZSwge1xuICAgICAgICBjb2xvcjogJyM3ZjdmN2YnLFxuICAgICAgICBib3JkZXJDb2xvcjogJyM3ZjdmN2YnXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJykge1xuICAgICAgcHJvcHMudmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzggKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfXJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgQkFTRV9GT05UX1NJWkUgPSAyODtcblxuZnVuY3Rpb24gZ2VuZXJhdGVIZWFkaW5nU3R5bGUoYmFzZUZvbnRTaXplLCBmb250TXVsdGlwbGllciwgbWFyZ2luTXVsdGlwbGllcikge1xuICByZXR1cm4ge1xuICAgIGZvbnRTaXplOiBiYXNlRm9udFNpemUgKiBmb250TXVsdGlwbGllcixcbiAgICBtYXJnaW5Ub3A6IGJhc2VGb250U2l6ZSAqIGZvbnRNdWx0aXBsaWVyICogbWFyZ2luTXVsdGlwbGllcixcbiAgICBtYXJnaW5Cb3R0b206IGJhc2VGb250U2l6ZSAqIGZvbnRNdWx0aXBsaWVyICogbWFyZ2luTXVsdGlwbGllcixcbiAgICBmb250V2VpZ2h0OiAnYm9sZCdcbiAgfTtcbn1cblxudmFyIEhlYWRpbmdFbGVtZW50cyA9IHtcbiAgaDE6IGdlbmVyYXRlSGVhZGluZ1N0eWxlKEJBU0VfRk9OVF9TSVpFLCAyLCAwLjY3KSxcbiAgaDI6IGdlbmVyYXRlSGVhZGluZ1N0eWxlKEJBU0VfRk9OVF9TSVpFLCAxLjUsIDAuODMpLFxuICBoMzogZ2VuZXJhdGVIZWFkaW5nU3R5bGUoQkFTRV9GT05UX1NJWkUsIDEuMTcsIDEpLFxuICBoNDogZ2VuZXJhdGVIZWFkaW5nU3R5bGUoQkFTRV9GT05UX1NJWkUsIDEsIDEuMzMpLFxuICBoNTogZ2VuZXJhdGVIZWFkaW5nU3R5bGUoQkFTRV9GT05UX1NJWkUsIDAuODMsIDEuNjcpLFxuICBoNjogZ2VuZXJhdGVIZWFkaW5nU3R5bGUoQkFTRV9GT05UX1NJWkUsIDAuNjcsIDIuMzMpXG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHBhcnNlOiBmdW5jdGlvbiBwYXJzZShjb21wb25lbnQpIHtcbiAgICB2YXIgdHlwZSA9IGNvbXBvbmVudC50eXBlLFxuICAgICAgICBwcm9wcyA9IGNvbXBvbmVudC5wcm9wcztcblxuICAgIGNvbXBvbmVudC50eXBlID0gJ3RleHQnO1xuICAgIHByb3BzLnN0eWxlID0gX2V4dGVuZHMoe30sIEhlYWRpbmdFbGVtZW50c1t0eXBlXSB8fCBIZWFkaW5nRWxlbWVudHMuaDYsIHByb3BzLnN0eWxlKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnICYmICFwcm9wcy52YWx1ZSkge1xuICAgICAgcHJvcHMudmFsdWUgPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIHByb3BzLmNoaWxkcmVuID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogMzkgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHtcblxuICAvKipcbiAgICogcGFyc2UgdzNjIGF0dHJzIHRvIHdlZXggbW9kdWxlIGF0dHJzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB3M2MgY29tcG9uZW50IGRhdGFcbiAgICogQHJldHVybiB7T2JqZWN0fSB3ZWV4IGNvbXBvbmVudCBkYXRhXG4gICAqL1xuICBwYXJzZTogZnVuY3Rpb24gcGFyc2UoY29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50LnR5cGUgPSAnZGl2JztcbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogNDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zdHlsZVVuaXQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKTtcblxudmFyIF9mbGV4Ym94ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0MSk7XG5cbnZhciBfZmxleGJveDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mbGV4Ym94KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07XG59XG5cbi8qKlxuICogV2ViIEJyb3dzZXIgZHJpdmVyXG4gKiovXG5cbnZhciBGVUxMX1dJRFRIX1JFTSA9IDc1MDtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgQ0xBU1NfTkFNRSA9ICdjbGFzc05hbWUnO1xudmFyIENMQVNTID0gJ2NsYXNzJztcbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgQ0hJTERSRU4gPSAnY2hpbGRyZW4nO1xudmFyIEVWRU5UX1BSRUZJWF9SRUdFWFAgPSAvb25bQS1aXS87XG5cbnZhciBEcml2ZXIgPSB7XG4gIGdldEVsZW1lbnRCeUlkOiBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZChpZCkge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIH0sXG4gIGNyZWF0ZUJvZHk6IGZ1bmN0aW9uIGNyZWF0ZUJvZHkoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gIH0sXG4gIGNyZWF0ZUNvbW1lbnQ6IGZ1bmN0aW9uIGNyZWF0ZUNvbW1lbnQoY29udGVudCkge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVDb21tZW50KGNvbnRlbnQpO1xuICB9LFxuICBjcmVhdGVFbXB0eTogZnVuY3Rpb24gY3JlYXRlRW1wdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29tbWVudCgnIGVtcHR5ICcpO1xuICB9LFxuICBjcmVhdGVUZXh0OiBmdW5jdGlvbiBjcmVhdGVUZXh0KHRleHQpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dCk7XG4gIH0sXG4gIHVwZGF0ZVRleHQ6IGZ1bmN0aW9uIHVwZGF0ZVRleHQobm9kZSwgdGV4dCkge1xuICAgIHZhciB0ZXh0Q29udGVudEF0dHIgPSAndGV4dENvbnRlbnQnIGluIGRvY3VtZW50ID8gJ3RleHRDb250ZW50JyA6ICdub2RlVmFsdWUnO1xuICAgIG5vZGVbdGV4dENvbnRlbnRBdHRyXSA9IHRleHQ7XG4gIH0sXG4gIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoY29tcG9uZW50KSB7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudC50eXBlKTtcbiAgICB2YXIgcHJvcHMgPSBjb21wb25lbnQucHJvcHM7XG5cbiAgICB0aGlzLnNldE5hdGl2ZVByb3BzKG5vZGUsIHByb3BzKTtcblxuICAgIHJldHVybiBub2RlO1xuICB9LFxuICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gYXBwZW5kQ2hpbGQobm9kZSwgcGFyZW50KSB7XG4gICAgcmV0dXJuIHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgfSxcbiAgcmVtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIHJlbW92ZUNoaWxkKG5vZGUsIHBhcmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudCB8fCBub2RlLnBhcmVudE5vZGU7XG4gICAgLy8gTWF5YmUgaGFzIGJlZW4gcmVtb3ZlZCB3aGVuIHJlbW92ZSBjaGlsZFxuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gIH0sXG4gIHJlcGxhY2VDaGlsZDogZnVuY3Rpb24gcmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IG9sZENoaWxkLnBhcmVudE5vZGU7XG4gICAgcGFyZW50LnJlcGxhY2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICB9LFxuICBpbnNlcnRBZnRlcjogZnVuY3Rpb24gaW5zZXJ0QWZ0ZXIobm9kZSwgYWZ0ZXIsIHBhcmVudCkge1xuICAgIHBhcmVudCA9IHBhcmVudCB8fCBhZnRlci5wYXJlbnROb2RlO1xuICAgIHZhciBuZXh0U2libGluZyA9IGFmdGVyLm5leHRTaWJsaW5nO1xuICAgIGlmIChuZXh0U2libGluZykge1xuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShub2RlLCBuZXh0U2libGluZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICB9XG4gIH0sXG4gIGluc2VydEJlZm9yZTogZnVuY3Rpb24gaW5zZXJ0QmVmb3JlKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gICAgcGFyZW50ID0gcGFyZW50IHx8IGJlZm9yZS5wYXJlbnROb2RlO1xuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobm9kZSwgYmVmb3JlKTtcbiAgfSxcbiAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50SGFuZGxlcikge1xuICAgIHJldHVybiBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICB9LFxuICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKSB7XG4gICAgcmV0dXJuIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50SGFuZGxlcik7XG4gIH0sXG4gIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbiByZW1vdmVBbGxFdmVudExpc3RlbmVycyhub2RlKSB7XG4gICAgLy8gbm9vcFxuICB9LFxuICByZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uIHJlbW92ZUF0dHJpYnV0ZShub2RlLCBwcm9wS2V5KSB7XG4gICAgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICByZXR1cm4gbm9kZS5pbm5lckhUTUwgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBDTEFTU19OQU1FKSB7XG4gICAgICBwcm9wS2V5ID0gQ0xBU1M7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgaW4gbm9kZSkge1xuICAgICAgbm9kZVtwcm9wS2V5XSA9IG51bGw7XG4gICAgfVxuXG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUocHJvcEtleSk7XG4gIH0sXG4gIHNldEF0dHJpYnV0ZTogZnVuY3Rpb24gc2V0QXR0cmlidXRlKG5vZGUsIHByb3BLZXksIHByb3BWYWx1ZSkge1xuICAgIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgcmV0dXJuIG5vZGUuaW5uZXJIVE1MID0gcHJvcFZhbHVlLl9faHRtbDtcbiAgICB9XG5cbiAgICBpZiAocHJvcEtleSA9PT0gQ0xBU1NfTkFNRSkge1xuICAgICAgcHJvcEtleSA9IENMQVNTO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5IGluIG5vZGUpIHtcbiAgICAgIG5vZGVbcHJvcEtleV0gPSBwcm9wVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKHByb3BLZXksIHByb3BWYWx1ZSk7XG4gICAgfVxuICB9LFxuICBzZXRTdHlsZXM6IGZ1bmN0aW9uIHNldFN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgICB2YXIgdHJhbmZvcm1lZFN0eWxlcyA9IHt9O1xuXG4gICAgZm9yICh2YXIgcHJvcCBpbiBzdHlsZXMpIHtcbiAgICAgIHZhciB2YWwgPSBzdHlsZXNbcHJvcF07XG4gICAgICBpZiAoX2ZsZXhib3gyLmRlZmF1bHQuaXNGbGV4UHJvcChwcm9wKSkge1xuICAgICAgICBfZmxleGJveDIuZGVmYXVsdFtwcm9wXSh2YWwsIHRyYW5mb3JtZWRTdHlsZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbmZvcm1lZFN0eWxlc1twcm9wXSA9ICgwLCBfc3R5bGVVbml0LmNvbnZlcnRVbml0KSh2YWwsIHByb3ApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIF9wcm9wIGluIHRyYW5mb3JtZWRTdHlsZXMpIHtcbiAgICAgIHZhciB0cmFuc2Zvcm1WYWx1ZSA9IHRyYW5mb3JtZWRTdHlsZXNbX3Byb3BdO1xuICAgICAgLy8gaGFjayBoYW5kbGUgY29tcGF0aWJpbGl0eSBpc3N1ZVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJhbnNmb3JtVmFsdWUpKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNmb3JtVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBub2RlLnN0eWxlW19wcm9wXSA9IHRyYW5zZm9ybVZhbHVlW2ldO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnN0eWxlW19wcm9wXSA9IHRyYW5zZm9ybVZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgYmVmb3JlUmVuZGVyOiBmdW5jdGlvbiBiZWZvcmVSZW5kZXIoKSB7XG4gICAgLy8gSW5pdCByZW0gdW5pdFxuICAgICgwLCBfc3R5bGVVbml0LnNldFJlbSkodGhpcy5nZXRXaW5kb3dXaWR0aCgpIC8gRlVMTF9XSURUSF9SRU0pO1xuICB9LFxuICBnZXRXaW5kb3dXaWR0aDogZnVuY3Rpb24gZ2V0V2luZG93V2lkdGgoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgfSxcbiAgc2V0TmF0aXZlUHJvcHM6IGZ1bmN0aW9uIHNldE5hdGl2ZVByb3BzKG5vZGUsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgcHJvcCBpbiBwcm9wcykge1xuICAgICAgdmFyIHZhbHVlID0gcHJvcHNbcHJvcF07XG4gICAgICBpZiAocHJvcCA9PT0gQ0hJTERSRU4pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChwcm9wID09PSBTVFlMRSkge1xuICAgICAgICAgIHRoaXMuc2V0U3R5bGVzKG5vZGUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChFVkVOVF9QUkVGSVhfUkVHRVhQLnRlc3QocHJvcCkpIHtcbiAgICAgICAgICB2YXIgZXZlbnROYW1lID0gcHJvcC5zbGljZSgyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShub2RlLCBwcm9wLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IERyaXZlcjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDQxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG52YXIgQk9YX0FMSUdOID0ge1xuICBzdHJldGNoOiAnc3RyZXRjaCcsXG4gICdmbGV4LXN0YXJ0JzogJ3N0YXJ0JyxcbiAgJ2ZsZXgtZW5kJzogJ2VuZCcsXG4gIGNlbnRlcjogJ2NlbnRlcidcbn07XG5cbnZhciBCT1hfT1JJRU5UID0ge1xuICByb3c6ICdob3Jpem9udGFsJyxcbiAgY29sdW1uOiAndmVydGljYWwnXG59O1xuXG52YXIgQk9YX1BBQ0sgPSB7XG4gICdmbGV4LXN0YXJ0JzogJ3N0YXJ0JyxcbiAgJ2ZsZXgtZW5kJzogJ2VuZCcsXG4gIGNlbnRlcjogJ2NlbnRlcicsXG4gICdzcGFjZS1iZXR3ZWVuJzogJ2p1c3RpZnknLFxuICAnc3BhY2UtYXJvdW5kJzogJ2p1c3RpZnknIC8vIEp1c3Qgc2FtZSBhcyBgc3BhY2UtYmV0d2VlbmBcbn07XG5cbnZhciBGTEVYX1BST1BTID0ge1xuICBkaXNwbGF5OiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBhbGlnbkl0ZW1zOiB0cnVlLFxuICBhbGlnblNlbGY6IHRydWUsXG4gIGZsZXhEaXJlY3Rpb246IHRydWUsXG4gIGp1c3RpZnlDb250ZW50OiB0cnVlLFxuICBmbGV4V3JhcDogdHJ1ZVxufTtcblxudmFyIEZsZXhib3ggPSB7XG4gIGlzRmxleFByb3A6IGZ1bmN0aW9uIGlzRmxleFByb3AocHJvcCkge1xuICAgIHJldHVybiBGTEVYX1BST1BTW3Byb3BdO1xuICB9LFxuICBkaXNwbGF5OiBmdW5jdGlvbiBkaXNwbGF5KHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIGlmICh2YWx1ZSA9PT0gJ2ZsZXgnKSB7XG4gICAgICBzdHlsZS5kaXNwbGF5ID0gWyctd2Via2l0LWJveCcsICctd2Via2l0LWZsZXgnLCAnZmxleCddO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHlsZS5kaXNwbGF5ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBmbGV4OiBmdW5jdGlvbiBmbGV4KHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHN0eWxlLndlYmtpdEJveEZsZXggPSB2YWx1ZTtcbiAgICBzdHlsZS53ZWJraXRGbGV4ID0gdmFsdWU7XG4gICAgc3R5bGUuZmxleCA9IHZhbHVlO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfSxcbiAgZmxleFdyYXA6IGZ1bmN0aW9uIGZsZXhXcmFwKHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHN0eWxlLmZsZXhXcmFwID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBhbGlnbkl0ZW1zOiBmdW5jdGlvbiBhbGlnbkl0ZW1zKHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHN0eWxlLndlYmtpdEJveEFsaWduID0gQk9YX0FMSUdOW3ZhbHVlXTtcbiAgICBzdHlsZS53ZWJraXRBbGlnbkl0ZW1zID0gdmFsdWU7XG4gICAgc3R5bGUuYWxpZ25JdGVtcyA9IHZhbHVlO1xuICAgIHJldHVybiBzdHlsZTtcbiAgfSxcbiAgYWxpZ25TZWxmOiBmdW5jdGlvbiBhbGlnblNlbGYodmFsdWUpIHtcbiAgICB2YXIgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgc3R5bGUud2Via2l0QWxpZ25TZWxmID0gdmFsdWU7XG4gICAgc3R5bGUuYWxpZ25TZWxmID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBmbGV4RGlyZWN0aW9uOiBmdW5jdGlvbiBmbGV4RGlyZWN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIHN0eWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIHN0eWxlLndlYmtpdEJveE9yaWVudCA9IEJPWF9PUklFTlRbdmFsdWVdO1xuICAgIHN0eWxlLndlYmtpdEZsZXhEaXJlY3Rpb24gPSB2YWx1ZTtcbiAgICBzdHlsZS5mbGV4RGlyZWN0aW9uID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBqdXN0aWZ5Q29udGVudDogZnVuY3Rpb24ganVzdGlmeUNvbnRlbnQodmFsdWUpIHtcbiAgICB2YXIgc3R5bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgc3R5bGUud2Via2l0Qm94UGFjayA9IEJPWF9QQUNLW3ZhbHVlXTtcbiAgICBzdHlsZS53ZWJraXRKdXN0aWZ5Q29udGVudCA9IHZhbHVlO1xuICAgIHN0eWxlLmp1c3RpZnlDb250ZW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBGbGV4Ym94O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cbi8qKiovIH0pLFxuLyogNDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbnN0YW5jZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciBfaW5zdGFuY2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5zdGFuY2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBmaW5kQ29tcG9uZW50SW5zdGFuY2Uobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIF9pbnN0YW5jZTIuZGVmYXVsdC5nZXQobm9kZSk7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZpbmRDb21wb25lbnRJbnN0YW5jZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KSxcbi8qIDQzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBzZXROYXRpdmVQcm9wcztcblxudmFyIF9ob3N0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxudmFyIF9ob3N0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvc3QpO1xuXG52YXIgX2ZpbmRET01Ob2RlID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCk7XG5cbnZhciBfZmluZERPTU5vZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmluZERPTU5vZGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBzZXROYXRpdmVQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlID0gKDAsIF9maW5kRE9NTm9kZTIuZGVmYXVsdCkobm9kZSk7XG4gIF9ob3N0Mi5kZWZhdWx0LmRyaXZlci5zZXROYXRpdmVQcm9wcyhub2RlLCBwcm9wcyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiA0NCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gJzAuNC43Jztcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSl9Oztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJheC5mYWN0b3J5Lm1hcFxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3J1bnRpbWUtc2hhcmVkL2Rpc3Qvc2hhcmVkLmZ1bmN0aW9uLmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuLyoqKioqKi8gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbi8qKioqKiovIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4vKioqKioqLyBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG4vKioqKioqLyBcdFx0XHRcdGdldDogZ2V0dGVyXG4vKioqKioqLyBcdFx0XHR9KTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbi8qKioqKiovIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4vKioqKioqLyBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuLyoqKioqKi8gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbi8qKioqKiovIFx0XHRyZXR1cm4gZ2V0dGVyO1xuLyoqKioqKi8gXHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMik7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuLyogZXNsaW50IG5vLWV4dGVuZC1uYXRpdmU6IFwib2ZmXCIsIG5ldy1jYXA6IFwib2ZmXCIgKi9cblxudmFyIGRlZmluZVByb3BlcnRpZXMgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyxcbiAgICBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSxcbiAgICBTeW1ib2xQb2x5ZmlsbCxcbiAgICBIaWRkZW5TeW1ib2wsXG4gICAgZ2xvYmFsU3ltYm9scyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKHgpIHtcbiAgaWYgKCF4KSByZXR1cm4gZmFsc2U7XG4gIGlmICgodHlwZW9mIHggPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHgpKSA9PT0gJ3N5bWJvbCcpIHJldHVybiB0cnVlO1xuICBpZiAoIXguY29uc3RydWN0b3IpIHJldHVybiBmYWxzZTtcbiAgaWYgKHguY29uc3RydWN0b3IubmFtZSAhPT0gJ1N5bWJvbCcpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHhbeC5jb25zdHJ1Y3Rvci50b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN5bWJvbCh2YWx1ZSkge1xuICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcih2YWx1ZSArICcgaXMgbm90IGEgc3ltYm9sJyk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIGdlbmVyYXRlTmFtZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNyZWF0ZWQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICByZXR1cm4gZnVuY3Rpb24gKGRlc2MpIHtcbiAgICB2YXIgcG9zdGZpeCA9IDAsXG4gICAgICAgIG5hbWU7XG4gICAgd2hpbGUgKGNyZWF0ZWRbZGVzYyArIChwb3N0Zml4IHx8ICcnKV0pIHtcbiAgICAgICsrcG9zdGZpeDtcbiAgICB9ZGVzYyArPSBwb3N0Zml4IHx8ICcnO1xuICAgIGNyZWF0ZWRbZGVzY10gPSB0cnVlO1xuICAgIG5hbWUgPSAnQEAnICsgZGVzYztcbiAgICByZXR1cm4gbmFtZTtcbiAgfTtcbn0oKTtcblxuLy8gSW50ZXJuYWwgY29uc3RydWN0b3IgKG5vdCBvbmUgZXhwb3NlZCkgZm9yIGNyZWF0aW5nIFN5bWJvbCBpbnN0YW5jZXMuXG4vLyBUaGlzIG9uZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGBzb21lU3ltYm9sIGluc3RhbmNlb2YgU3ltYm9sYCBhbHdheXMgcmV0dXJuIGZhbHNlXG5IaWRkZW5TeW1ib2wgPSBmdW5jdGlvbiBfU3ltYm9sKGRlc2NyaXB0aW9uKSB7XG4gIGlmICh0aGlzIGluc3RhbmNlb2YgSGlkZGVuU3ltYm9sKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3InKTtcbiAgcmV0dXJuIFN5bWJvbFBvbHlmaWxsKGRlc2NyaXB0aW9uKTtcbn07XG5cbi8vIEV4cG9zZWQgYFN5bWJvbGAgY29uc3RydWN0b3Jcbi8vIChyZXR1cm5zIGluc3RhbmNlcyBvZiBIaWRkZW5TeW1ib2wpXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbFBvbHlmaWxsID0gZnVuY3Rpb24gX1N5bWJvbDIoZGVzY3JpcHRpb24pIHtcbiAgdmFyIHN5bWJvbDtcbiAgaWYgKHRoaXMgaW5zdGFuY2VvZiBfU3ltYm9sMikgdGhyb3cgbmV3IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yJyk7XG4gIHN5bWJvbCA9IE9iamVjdC5jcmVhdGUoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSk7XG4gIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCA/ICcnIDogU3RyaW5nKGRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGRlZmluZVByb3BlcnRpZXMoc3ltYm9sLCB7XG4gICAgX19kZXNjcmlwdGlvbl9fOiB7IHZhbHVlOiBkZXNjcmlwdGlvbiB9LFxuICAgIF9fbmFtZV9fOiB7IHZhbHVlOiBnZW5lcmF0ZU5hbWUoZGVzY3JpcHRpb24pIH1cbiAgfSk7XG59O1xuZGVmaW5lUHJvcGVydGllcyhTeW1ib2xQb2x5ZmlsbCwge1xuICBmb3I6IHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKGtleSkge1xuICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSkgcmV0dXJuIGdsb2JhbFN5bWJvbHNba2V5XTtcbiAgICAgIHJldHVybiBnbG9iYWxTeW1ib2xzW2tleV0gPSBTeW1ib2xQb2x5ZmlsbChTdHJpbmcoa2V5KSk7XG4gICAgfSB9LFxuICBrZXlGb3I6IHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKHMpIHtcbiAgICAgIHZhciBrZXk7XG4gICAgICB2YWxpZGF0ZVN5bWJvbChzKTtcbiAgICAgIGZvciAoa2V5IGluIGdsb2JhbFN5bWJvbHMpIHtcbiAgICAgICAgaWYgKGdsb2JhbFN5bWJvbHNba2V5XSA9PT0gcykgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9IH0sXG5cbiAgLy8gVG8gZW5zdXJlIHByb3BlciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbmF0aXZlIGZ1bmN0aW9ucyAoZS5nLiBBcnJheS5mcm9tKVxuICAvLyBmYWxsYmFjayB0byBldmVudHVhbCBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ2l2ZW4gc3ltYm9sXG4gIGhhc0luc3RhbmNlOiB7IHZhbHVlOiBTeW1ib2xQb2x5ZmlsbCgnaGFzSW5zdGFuY2UnKSB9LFxuICBpc0NvbmNhdFNwcmVhZGFibGU6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCdpc0NvbmNhdFNwcmVhZGFibGUnKSB9LFxuICBpdGVyYXRvcjogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ2l0ZXJhdG9yJykgfSxcbiAgbWF0Y2g6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCdtYXRjaCcpIH0sXG4gIHJlcGxhY2U6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCdyZXBsYWNlJykgfSxcbiAgc2VhcmNoOiB7IHZhbHVlOiBTeW1ib2xQb2x5ZmlsbCgnc2VhcmNoJykgfSxcbiAgc3BlY2llczogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ3NwZWNpZXMnKSB9LFxuICBzcGxpdDogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ3NwbGl0JykgfSxcbiAgdG9QcmltaXRpdmU6IHsgdmFsdWU6IFN5bWJvbFBvbHlmaWxsKCd0b1ByaW1pdGl2ZScpIH0sXG4gIHRvU3RyaW5nVGFnOiB7IHZhbHVlOiBTeW1ib2xQb2x5ZmlsbCgndG9TdHJpbmdUYWcnKSB9LFxuICB1bnNjb3BhYmxlczogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwoJ3Vuc2NvcGFibGVzJykgfVxufSk7XG5cbi8vIEludGVybmFsIHR3ZWFrcyBmb3IgcmVhbCBzeW1ib2wgcHJvZHVjZXJcbmRlZmluZVByb3BlcnRpZXMoSGlkZGVuU3ltYm9sLnByb3RvdHlwZSwge1xuICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwgfSxcbiAgdG9TdHJpbmc6IHsgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19uYW1lX187XG4gICAgfSB9XG59KTtcblxuLy8gUHJvcGVyIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgZXhwb3NlZCBvbiBTeW1ib2wucHJvdG90eXBlXG4vLyBUaGV5IHdvbid0IGJlIGFjY2Vzc2libGUgb24gcHJvZHVjZWQgc3ltYm9sIGluc3RhbmNlcyBhcyB0aGV5IGRlcml2ZSBmcm9tIEhpZGRlblN5bWJvbC5wcm90b3R5cGVcbmRlZmluZVByb3BlcnRpZXMoU3ltYm9sUG9seWZpbGwucHJvdG90eXBlLCB7XG4gIHRvU3RyaW5nOiB7IHZhbHVlOiBmdW5jdGlvbiB2YWx1ZSgpIHtcbiAgICAgIHJldHVybiAnU3ltYm9sICgnICsgdmFsaWRhdGVTeW1ib2wodGhpcykuX19kZXNjcmlwdGlvbl9fICsgJyknO1xuICAgIH0gfSxcbiAgdmFsdWVPZjogeyB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoKSB7XG4gICAgICByZXR1cm4gdmFsaWRhdGVTeW1ib2wodGhpcyk7XG4gICAgfSB9XG59KTtcblxuZGVmaW5lUHJvcGVydHkoU3ltYm9sUG9seWZpbGwucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1ByaW1pdGl2ZSwge1xuICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUoKSB7XG4gICAgdmFyIHN5bWJvbCA9IHZhbGlkYXRlU3ltYm9sKHRoaXMpO1xuICAgIGlmICgodHlwZW9mIHN5bWJvbCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yoc3ltYm9sKSkgPT09ICdzeW1ib2wnKSByZXR1cm4gc3ltYm9sO1xuICAgIHJldHVybiBzeW1ib2wudG9TdHJpbmcoKTtcbiAgfVxufSk7XG5kZWZpbmVQcm9wZXJ0eShTeW1ib2xQb2x5ZmlsbC5wcm90b3R5cGUsIFN5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnU3ltYm9sJyB9KTtcblxuLy8gUHJvcGVyIGltcGxlbWVudGF0b24gb2YgdG9QcmltaXRpdmUgYW5kIHRvU3RyaW5nVGFnIGZvciByZXR1cm5lZCBzeW1ib2wgaW5zdGFuY2VzXG5kZWZpbmVQcm9wZXJ0eShIaWRkZW5TeW1ib2wucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvU3RyaW5nVGFnXSB9KTtcblxuLy8gTm90ZTogSXQncyBpbXBvcnRhbnQgdG8gZGVmaW5lIGB0b1ByaW1pdGl2ZWAgYXMgbGFzdCBvbmUsIGFzIHNvbWUgaW1wbGVtZW50YXRpb25zXG4vLyBpbXBsZW1lbnQgYHRvUHJpbWl0aXZlYCBuYXRpdmVseSB3aXRob3V0IGltcGxlbWVudGluZyBgdG9TdHJpbmdUYWdgIChvciBvdGhlciBzcGVjaWZpZWQgc3ltYm9scylcbi8vIEFuZCB0aGF0IG1heSBpbnZva2UgZXJyb3IgaW4gZGVmaW5pdGlvbiBmbG93OlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWVkaWtvby9lczYtc3ltYm9sL2lzc3Vlcy8xMyNpc3N1ZWNvbW1lbnQtMTY0MTQ2MTQ5XG5kZWZpbmVQcm9wZXJ0eShIaWRkZW5TeW1ib2wucHJvdG90eXBlLCBTeW1ib2xQb2x5ZmlsbC50b1ByaW1pdGl2ZSwgeyB2YWx1ZTogU3ltYm9sUG9seWZpbGwucHJvdG90eXBlW1N5bWJvbFBvbHlmaWxsLnRvUHJpbWl0aXZlXSB9KTtcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJSZWZsZWN0aW9uL3VybC1zZWFyY2gtcGFyYW1zXG5cblxudmFyIF9zeW1ib2wgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgZmluZCA9IC9bISdcXChcXCl+XXwlMjB8JTAwL2c7XG52YXIgcGx1cyA9IC9cXCsvZztcbnZhciByZXBsYWNlID0ge1xuICAnISc6ICclMjEnLFxuICBcIidcIjogJyUyNycsXG4gICcoJzogJyUyOCcsXG4gICcpJzogJyUyOScsXG4gICd+JzogJyU3RScsXG4gICclMjAnOiAnKycsXG4gICclMDAnOiAnXFx4MDAnXG59O1xudmFyIHJlcGxhY2VyID0gZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgcmV0dXJuIHJlcGxhY2VbbWF0Y2hdO1xufTtcbnZhciBzZWNyZXQgPSAnX19VUkxTZWFyY2hQYXJhbXNfXyc7XG5cbmZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoZmluZCwgcmVwbGFjZXIpO1xufVxuXG5mdW5jdGlvbiBkZWNvZGUoc3RyKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoc3RyLnJlcGxhY2UocGx1cywgJyAnKSk7XG59XG5cbnZhciBVUkxTZWFyY2hQYXJhbXMgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFVSTFNlYXJjaFBhcmFtcyhxdWVyeSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBVUkxTZWFyY2hQYXJhbXMpO1xuXG4gICAgdGhpc1tzZWNyZXRdID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm47XG4gICAgaWYgKHF1ZXJ5LmNoYXJBdCgwKSA9PT0gJz8nKSB7XG4gICAgICBxdWVyeSA9IHF1ZXJ5LnNsaWNlKDEpO1xuICAgIH1cbiAgICBmb3IgKHZhciBpbmRleCwgdmFsdWUsIHBhaXJzID0gKHF1ZXJ5IHx8ICcnKS5zcGxpdCgnJicpLCBpID0gMCwgbGVuZ3RoID0gcGFpcnMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gcGFpcnNbaV07XG4gICAgICBpbmRleCA9IHZhbHVlLmluZGV4T2YoJz0nKTtcbiAgICAgIGlmICgtMSA8IGluZGV4KSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGRlY29kZSh2YWx1ZS5zbGljZSgwLCBpbmRleCkpLCBkZWNvZGUodmFsdWUuc2xpY2UoaW5kZXggKyAxKSkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoZGVjb2RlKHZhbHVlKSwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhVUkxTZWFyY2hQYXJhbXMsIFt7XG4gICAga2V5OiAnYXBwZW5kJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwZW5kKG5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgZGljdCA9IHRoaXNbc2VjcmV0XTtcbiAgICAgIGlmIChuYW1lIGluIGRpY3QpIHtcbiAgICAgICAgZGljdFtuYW1lXS5wdXNoKCcnICsgdmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGljdFtuYW1lXSA9IFsnJyArIHZhbHVlXTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdkZWxldGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVsZXRlKG5hbWUpIHtcbiAgICAgIGRlbGV0ZSB0aGlzW3NlY3JldF1bbmFtZV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZ2V0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KG5hbWUpIHtcbiAgICAgIHZhciBkaWN0ID0gdGhpc1tzZWNyZXRdO1xuICAgICAgcmV0dXJuIG5hbWUgaW4gZGljdCA/IGRpY3RbbmFtZV1bMF0gOiBudWxsO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dldEFsbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEFsbChuYW1lKSB7XG4gICAgICB2YXIgZGljdCA9IHRoaXNbc2VjcmV0XTtcbiAgICAgIHJldHVybiBuYW1lIGluIGRpY3QgPyBkaWN0W25hbWVdLnNsaWNlKDApIDogW107XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnaGFzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gaGFzKG5hbWUpIHtcbiAgICAgIHJldHVybiBuYW1lIGluIHRoaXNbc2VjcmV0XTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdzZXQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQobmFtZSwgdmFsdWUpIHtcbiAgICAgIHRoaXNbc2VjcmV0XVtuYW1lXSA9IFsnJyArIHZhbHVlXTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdmb3JFYWNoJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZykge1xuICAgICAgdmFyIGRpY3QgPSB0aGlzW3NlY3JldF07XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhkaWN0KS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIGRpY3RbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHZhbHVlLCBuYW1lLCB0aGlzKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdrZXlzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgIHZhciBpdGVtcyA9IFtdO1xuICAgICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpdGVtcy5wdXNoKG5hbWUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgaXRlcmF0b3IgPSB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgdmFyIHZhbHVlID0gaXRlbXMuc2hpZnQoKTtcbiAgICAgICAgICByZXR1cm4geyBkb25lOiB2YWx1ZSA9PT0gdW5kZWZpbmVkLCB2YWx1ZTogdmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaXRlcmF0b3JbX3N5bWJvbDIuZGVmYXVsdC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd2YWx1ZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB2YWx1ZXMoKSB7XG4gICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaXRlbXMucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpdGVyYXRvcltfc3ltYm9sMi5kZWZhdWx0Lml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2VudHJpZXMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlbnRyaWVzKCkge1xuICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IHZhbHVlID09PSB1bmRlZmluZWQsIHZhbHVlOiB2YWx1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpdGVyYXRvcltfc3ltYm9sMi5kZWZhdWx0Lml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3RvU3RyaW5nJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICB2YXIgZGljdCA9IHRoaXNbc2VjcmV0XSxcbiAgICAgICAgICBxdWVyeSA9IFtdLFxuICAgICAgICAgIGksXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgdmFsdWU7XG4gICAgICBmb3IgKGtleSBpbiBkaWN0KSB7XG4gICAgICAgIG5hbWUgPSBlbmNvZGUoa2V5KTtcbiAgICAgICAgZm9yIChpID0gMCwgdmFsdWUgPSBkaWN0W2tleV07IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHF1ZXJ5LnB1c2gobmFtZSArICc9JyArIGVuY29kZSh2YWx1ZVtpXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcXVlcnkuam9pbignJicpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBVUkxTZWFyY2hQYXJhbXM7XG59KCk7XG5cblVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGVbX3N5bWJvbDIuZGVmYXVsdC5pdGVyYXRvcl0gPSBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmVudHJpZXM7XG5cbm1vZHVsZS5leHBvcnRzID0gVVJMU2VhcmNoUGFyYW1zO1xuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldCBQcm9taXNlKCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuICB9LFxuICBnZXQgU3ltYm9sKCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApO1xuICB9LFxuICBnZXQgTWFwKCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuICB9LFxuICBnZXQgU2V0KCkge1xuICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpO1xuICB9LFxuICBnZXQgV2Vha01hcCgpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcbiAgfSxcbiAgZ2V0IFdlYWtTZXQoKSB7XG4gICAgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oNyk7XG4gIH0sXG4gIGdldCBGb250RmFjZSgpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg4KTtcbiAgfSxcbiAgZ2V0IFVSTCgpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyg5KTtcbiAgfSxcbiAgZ2V0IFVSTFNlYXJjaFBhcmFtcygpIHtcbiAgICByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbiAgfSxcbiAgZ2V0IG1hdGNoTWVkaWEoKSB7XG4gICAgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMTApO1xuICB9XG59O1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4vKiBlc2xpbnQgbm8tZXh0ZW5kLW5hdGl2ZTogXCJvZmZcIiAqL1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuLy8gVXNlIHBvbHlmaWxsIGZvciBzZXRJbW1lZGlhdGUgZm9yIHBlcmZvcm1hbmNlIGdhaW5zXG52YXIgYXNhcCA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicgJiYgc2V0SW1tZWRpYXRlIHx8IGZ1bmN0aW9uIChmbikge1xuICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzZXRUaW1lb3V0KGZuLCAwKTtcbiAgfSBlbHNlIHtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgb25VbmhhbmRsZWRSZWplY3Rpb24gPSBmdW5jdGlvbiBvblVuaGFuZGxlZFJlamVjdGlvbihlcnIpIHtcbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlKSB7XG4gICAgY29uc29sZS5sb2coJ1Bvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjonLCBlcnIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgfVxufTtcblxuLy8gUG9seWZpbGwgZm9yIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kXG5mdW5jdGlvbiBiaW5kKGZuLCB0aGlzQXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gUHJvbWlzZShmbikge1xuICBpZiAoX3R5cGVvZih0aGlzKSAhPT0gJ29iamVjdCcpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlIHJlc29sdmVyIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIHRoaXMuX3N0YXRlID0gMDtcbiAgdGhpcy5faGFuZGxlZCA9IGZhbHNlO1xuICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fZGVmZXJyZWRzID0gW107XG5cbiAgZG9SZXNvbHZlKGZuLCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlKHNlbGYsIGRlZmVycmVkKSB7XG4gIHdoaWxlIChzZWxmLl9zdGF0ZSA9PT0gMykge1xuICAgIHNlbGYgPSBzZWxmLl92YWx1ZTtcbiAgfVxuICBpZiAoc2VsZi5fc3RhdGUgPT09IDApIHtcbiAgICBzZWxmLl9kZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuX2hhbmRsZWQgPSB0cnVlO1xuICBhc2FwKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2IgPSBzZWxmLl9zdGF0ZSA9PT0gMSA/IGRlZmVycmVkLm9uRnVsZmlsbGVkIDogZGVmZXJyZWQub25SZWplY3RlZDtcbiAgICBpZiAoY2IgPT09IG51bGwpIHtcbiAgICAgIChzZWxmLl9zdGF0ZSA9PT0gMSA/IHJlc29sdmUgOiByZWplY3QpKGRlZmVycmVkLnByb21pc2UsIHNlbGYuX3ZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJldDtcbiAgICB0cnkge1xuICAgICAgcmV0ID0gY2Ioc2VsZi5fdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChkZWZlcnJlZC5wcm9taXNlLCBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzb2x2ZShkZWZlcnJlZC5wcm9taXNlLCByZXQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZShzZWxmLCBuZXdWYWx1ZSkge1xuICB0cnkge1xuICAgIC8vIFByb21pc2UgUmVzb2x1dGlvbiBQcm9jZWR1cmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9taXNlcy1hcGx1cy9wcm9taXNlcy1zcGVjI3RoZS1wcm9taXNlLXJlc29sdXRpb24tcHJvY2VkdXJlXG4gICAgaWYgKG5ld1ZhbHVlID09PSBzZWxmKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLicpO1xuICAgIGlmIChuZXdWYWx1ZSAmJiAoKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YobmV3VmFsdWUpKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgdmFyIHRoZW4gPSBuZXdWYWx1ZS50aGVuO1xuICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBzZWxmLl9zdGF0ZSA9IDM7XG4gICAgICAgIHNlbGYuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGZpbmFsZShzZWxmKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkb1Jlc29sdmUoYmluZCh0aGVuLCBuZXdWYWx1ZSksIHNlbGYpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGYuX3N0YXRlID0gMTtcbiAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGZpbmFsZShzZWxmKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlamVjdChzZWxmLCBlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3Qoc2VsZiwgbmV3VmFsdWUpIHtcbiAgc2VsZi5fc3RhdGUgPSAyO1xuICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICBmaW5hbGUoc2VsZik7XG59XG5cbmZ1bmN0aW9uIGZpbmFsZShzZWxmKSB7XG4gIGlmIChzZWxmLl9zdGF0ZSA9PT0gMiAmJiBzZWxmLl9kZWZlcnJlZHMubGVuZ3RoID09PSAwKSB7XG4gICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIXNlbGYuX2hhbmRsZWQpIHtcbiAgICAgICAgb25VbmhhbmRsZWRSZWplY3Rpb24oc2VsZi5fdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNlbGYuX2RlZmVycmVkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGhhbmRsZShzZWxmLCBzZWxmLl9kZWZlcnJlZHNbaV0pO1xuICB9XG4gIHNlbGYuX2RlZmVycmVkcyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb21pc2UpIHtcbiAgdGhpcy5vbkZ1bGZpbGxlZCA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogbnVsbDtcbiAgdGhpcy5vblJlamVjdGVkID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbicgPyBvblJlamVjdGVkIDogbnVsbDtcbiAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgcG90ZW50aWFsbHkgbWlzYmVoYXZpbmcgcmVzb2x2ZXIgZnVuY3Rpb24gYW5kIG1ha2Ugc3VyZVxuICogb25GdWxmaWxsZWQgYW5kIG9uUmVqZWN0ZWQgYXJlIG9ubHkgY2FsbGVkIG9uY2UuXG4gKlxuICogTWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCBhc3luY2hyb255LlxuICovXG5mdW5jdGlvbiBkb1Jlc29sdmUoZm4sIHNlbGYpIHtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBmbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIHJlc29sdmUoc2VsZiwgdmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIHJlamVjdChzZWxmLCByZWFzb24pO1xuICAgIH0pO1xuICB9IGNhdGNoIChleCkge1xuICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgZG9uZSA9IHRydWU7XG4gICAgcmVqZWN0KHNlbGYsIGV4KTtcbiAgfVxufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5jYXRjaCA9IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3RlZCk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gIHZhciBwcm9tID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCk7XG5cbiAgaGFuZGxlKHRoaXMsIG5ldyBIYW5kbGVyKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBwcm9tKSk7XG4gIHJldHVybiBwcm9tO1xufTtcblxuUHJvbWlzZS5hbGwgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJlc29sdmUoW10pO1xuICAgIHZhciByZW1haW5pbmcgPSBhcmdzLmxlbmd0aDtcblxuICAgIGZ1bmN0aW9uIHJlcyhpLCB2YWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh2YWwgJiYgKCh0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZih2YWwpKSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICB2YXIgdGhlbiA9IHZhbC50aGVuO1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHZhbCwgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICByZXMoaSwgdmFsKTtcbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFyZ3NbaV0gPSB2YWw7XG4gICAgICAgIGlmICgtLXJlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIHJlamVjdChleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXMoaSwgYXJnc1tpXSk7XG4gICAgfVxuICB9KTtcbn07XG5cblByb21pc2UucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBpZiAodmFsdWUgJiYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodmFsdWUpKSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IFByb21pc2UpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSk7XG59O1xuXG5Qcm9taXNlLnJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlamVjdCh2YWx1ZSk7XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24gKHZhbHVlcykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB2YWx1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhbHVlc1tpXS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBpbW1lZGlhdGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBjYWxsYmFja3NcbiAqIEBwYXJhbSBmbiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEBwcml2YXRlXG4gKi9cblByb21pc2UuX3NldEltbWVkaWF0ZUZuID0gZnVuY3Rpb24gX3NldEltbWVkaWF0ZUZuKGZuKSB7XG4gIGFzYXAgPSBmbjtcbn07XG5cblByb21pc2UuX3NldFVuaGFuZGxlZFJlamVjdGlvbkZuID0gZnVuY3Rpb24gX3NldFVuaGFuZGxlZFJlamVjdGlvbkZuKGZuKSB7XG4gIG9uVW5oYW5kbGVkUmVqZWN0aW9uID0gZm47XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21pc2U7XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfc3ltYm9sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N5bWJvbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIERlbGV0ZWQgbWFwIGl0ZW1zIG1lc3Mgd2l0aCBpdGVyYXRvciBwb2ludGVycywgc28gcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbSBtYXJrIHRoZW0gYXMgZGVsZXRlZC4gQ2FuJ3QgdXNlIHVuZGVmaW5lZCBvciBudWxsIHNpbmNlIHRob3NlIGJvdGggdmFsaWQga2V5cyBzbyB1c2UgYSBwcml2YXRlIHN5bWJvbC5cbnZhciB1bmRlZk1hcmtlciA9ICgwLCBfc3ltYm9sMi5kZWZhdWx0KSgndW5kZWYnKTtcbi8vIE5hTiBjYW5ub3QgYmUgZm91bmQgaW4gYW4gYXJyYXkgdXNpbmcgaW5kZXhPZiwgc28gd2UgZW5jb2RlIE5hTnMgdXNpbmcgYSBwcml2YXRlIHN5bWJvbC5cbi8qIGVzbGludCBuby1leHRlbmQtbmF0aXZlOiBcIm9mZlwiICovXG52YXIgTmFOTWFya2VyID0gKDAsIF9zeW1ib2wyLmRlZmF1bHQpKCdOYU4nKTtcbnZhciBBQ0NFU1NPUl9TVVBQT1JUID0gdHJ1ZTtcblxuZnVuY3Rpb24gZW5jb2RlS2V5KGtleSkge1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGtleSkgPyBOYU5NYXJrZXIgOiBrZXk7XG59XG5cbmZ1bmN0aW9uIGRlY29kZUtleShlbmNvZGVkS2V5KSB7XG4gIHJldHVybiBlbmNvZGVkS2V5ID09PSBOYU5NYXJrZXIgPyBOYU4gOiBlbmNvZGVkS2V5O1xufVxuXG5mdW5jdGlvbiBtYWtlSXRlcmF0b3IobWFwSW5zdCwgZ2V0dGVyKSB7XG4gIHZhciBuZXh0SWR4ID0gMDtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0OiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgaWYgKG5leHRJZHggPT09IG1hcEluc3QuX2tleXMubGVuZ3RoKSBkb25lID0gdHJ1ZTtcbiAgICAgIGlmICghZG9uZSkge1xuICAgICAgICB3aGlsZSAobWFwSW5zdC5fa2V5c1tuZXh0SWR4XSA9PT0gdW5kZWZNYXJrZXIpIHtcbiAgICAgICAgICBuZXh0SWR4Kys7XG4gICAgICAgIH1yZXR1cm4geyB2YWx1ZTogZ2V0dGVyLmNhbGwobWFwSW5zdCwgbmV4dElkeCsrKSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbGNTaXplKG1hcEluc3QpIHtcbiAgdmFyIHNpemUgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgcyA9IG1hcEluc3QuX2tleXMubGVuZ3RoOyBpIDwgczsgaSsrKSB7XG4gICAgaWYgKG1hcEluc3QuX2tleXNbaV0gIT09IHVuZGVmTWFya2VyKSBzaXplKys7XG4gIH1cbiAgcmV0dXJuIHNpemU7XG59XG5cbmZ1bmN0aW9uIGhhc1Byb3RvTWV0aG9kKGluc3RhbmNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIHR5cGVvZiBpbnN0YW5jZVttZXRob2RdID09PSAnZnVuY3Rpb24nO1xufVxuXG52YXIgTWFwID0gZnVuY3Rpb24gTWFwKGRhdGEpIHtcbiAgdGhpcy5fa2V5cyA9IFtdO1xuICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgLy8gSWYgYGRhdGFgIGlzIGl0ZXJhYmxlIChpbmRpY2F0ZWQgYnkgcHJlc2VuY2Ugb2YgYSBmb3JFYWNoIG1ldGhvZCksIHByZS1wb3B1bGF0ZSB0aGUgbWFwXG4gIGlmIChkYXRhICYmIGhhc1Byb3RvTWV0aG9kKGRhdGEsICdmb3JFYWNoJykpIHtcbiAgICAvLyBGYXN0cGF0aDogSWYgYGRhdGFgIGlzIGEgTWFwLCBzaG9ydGNpcmN1aXQgYWxsIGZvbGxvd2luZyB0aGUgY2hlY2tzXG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNYXAgfHxcbiAgICAvLyBJZiBgZGF0YWAgaXMgbm90IGFuIGluc3RhbmNlIG9mIE1hcCwgaXQgY291bGQgYmUgYmVjYXVzZSB5b3UgaGF2ZSBhIE1hcCBmcm9tIGFuIGlmcmFtZSBvciBhIHdvcmtlciBvciBzb21ldGhpbmcuXG4gICAgLy8gQ2hlY2sgaWYgIGBkYXRhYCBoYXMgYWxsIHRoZSBgTWFwYCBtZXRob2RzIGFuZCBpZiBzbywgYXNzdW1lIGRhdGEgaXMgYW5vdGhlciBNYXBcbiAgICBoYXNQcm90b01ldGhvZChkYXRhLCAnY2xlYXInKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnZGVsZXRlJykgJiYgaGFzUHJvdG9NZXRob2QoZGF0YSwgJ2VudHJpZXMnKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnZm9yRWFjaCcpICYmIGhhc1Byb3RvTWV0aG9kKGRhdGEsICdnZXQnKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnaGFzJykgJiYgaGFzUHJvdG9NZXRob2QoZGF0YSwgJ2tleXMnKSAmJiBoYXNQcm90b01ldGhvZChkYXRhLCAnc2V0JykgJiYgaGFzUHJvdG9NZXRob2QoZGF0YSwgJ3ZhbHVlcycpKSB7XG4gICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgdGhpcy5zZXQuYXBwbHkodGhpcywgW2tleSwgdmFsdWVdKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgdGhpcy5zZXQuYXBwbHkodGhpcywgaXRlbSk7XG4gICAgICB9LCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xufTtcbk1hcC5wcm90b3R5cGUgPSB7fTtcblxuLy8gU29tZSBvbGQgZW5naW5lcyBkbyBub3Qgc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzLiAgU2luY2UgTWFwIG9ubHkgcmVxdWlyZXMgdGhlc2UgZm9yIHRoZSBzaXplIHByb3BlcnR5LCB3ZSBjYW4gZmFsbCBiYWNrIHRvIHNldHRpbmcgdGhlIHNpemUgcHJvcGVydHkgc3RhdGljYWxseSBlYWNoIHRpbWUgdGhlIHNpemUgb2YgdGhlIG1hcCBjaGFuZ2VzLlxudHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsICdzaXplJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGNhbGNTaXplKHRoaXMpO1xuICAgIH1cbiAgfSk7XG59IGNhdGNoIChlKSB7XG4gIEFDQ0VTU09SX1NVUFBPUlQgPSBmYWxzZTtcbn1cblxuTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBpZHggPSB0aGlzLl9rZXlzLmluZGV4T2YoZW5jb2RlS2V5KGtleSkpO1xuICByZXR1cm4gaWR4ICE9PSAtMSA/IHRoaXMuX3ZhbHVlc1tpZHhdIDogdW5kZWZpbmVkO1xufTtcbk1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgdmFyIGlkeCA9IHRoaXMuX2tleXMuaW5kZXhPZihlbmNvZGVLZXkoa2V5KSk7XG4gIGlmIChpZHggIT09IC0xKSB7XG4gICAgdGhpcy5fdmFsdWVzW2lkeF0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9rZXlzLnB1c2goZW5jb2RlS2V5KGtleSkpO1xuICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcbk1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gdGhpcy5fa2V5cy5pbmRleE9mKGVuY29kZUtleShrZXkpKSAhPT0gLTE7XG59O1xuTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBpZHggPSB0aGlzLl9rZXlzLmluZGV4T2YoZW5jb2RlS2V5KGtleSkpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICB0aGlzLl9rZXlzW2lkeF0gPSB1bmRlZk1hcmtlcjtcbiAgdGhpcy5fdmFsdWVzW2lkeF0gPSB1bmRlZk1hcmtlcjtcbiAgaWYgKCFBQ0NFU1NPUl9TVVBQT1JUKSB0aGlzLnNpemUgPSBjYWxjU2l6ZSh0aGlzKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5fa2V5cyA9IHRoaXMuX3ZhbHVlcyA9IFtdO1xuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IDA7XG59O1xuTWFwLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IodGhpcywgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzW2ldO1xuICB9KTtcbn07XG5NYXAucHJvdG90eXBlLmtleXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IodGhpcywgZnVuY3Rpb24gKGkpIHtcbiAgICByZXR1cm4gZGVjb2RlS2V5KHRoaXMuX2tleXNbaV0pO1xuICB9KTtcbn07XG5NYXAucHJvdG90eXBlLmVudHJpZXMgPSBNYXAucHJvdG90eXBlW19zeW1ib2wyLmRlZmF1bHQuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIFtkZWNvZGVLZXkodGhpcy5fa2V5c1tpXSksIHRoaXMuX3ZhbHVlc1tpXV07XG4gIH0pO1xufTtcbk1hcC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFja0ZuLCB0aGlzQXJnKSB7XG4gIHRoaXNBcmcgPSB0aGlzQXJnIHx8IGdsb2JhbDtcbiAgdmFyIGl0ZXJhdG9yID0gdGhpcy5lbnRyaWVzKCk7XG4gIHZhciByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIHdoaWxlIChyZXN1bHQuZG9uZSA9PT0gZmFsc2UpIHtcbiAgICBjYWxsYmFja0ZuLmNhbGwodGhpc0FyZywgcmVzdWx0LnZhbHVlWzFdLCByZXN1bHQudmFsdWVbMF0sIHRoaXMpO1xuICAgIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgfVxufTtcblxuTWFwLnByb3RvdHlwZVtfc3ltYm9sMi5kZWZhdWx0LnNwZWNpZXNdID0gTWFwO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLCAnY29uc3RydWN0b3InLCB7XG4gIHZhbHVlOiBNYXBcbn0pO1xuXG50cnkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTWFwLCAnbGVuZ3RoJywge1xuICAgIHZhbHVlOiAwXG4gIH0pO1xufSBjYXRjaCAoZSkge31cblxubW9kdWxlLmV4cG9ydHMgPSBNYXA7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX3N5bWJvbCA9IF9fd2VicGFja19yZXF1aXJlX18oMCk7XG5cbnZhciBfc3ltYm9sMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N5bWJvbCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vIERlbGV0ZWQgbWFwIGl0ZW1zIG1lc3Mgd2l0aCBpdGVyYXRvciBwb2ludGVycywgc28gcmF0aGVyIHRoYW4gcmVtb3ZpbmcgdGhlbSBtYXJrIHRoZW0gYXMgZGVsZXRlZC4gQ2FuJ3QgdXNlIHVuZGVmaW5lZCBvciBudWxsIHNpbmNlIHRob3NlIGJvdGggdmFsaWQga2V5cyBzbyB1c2UgYSBwcml2YXRlIHN5bWJvbC5cbnZhciB1bmRlZk1hcmtlciA9ICgwLCBfc3ltYm9sMi5kZWZhdWx0KSgndW5kZWYnKTtcblxuLy8gTmFOIGNhbm5vdCBiZSBmb3VuZCBpbiBhbiBhcnJheSB1c2luZyBpbmRleE9mLCBzbyB3ZSBlbmNvZGUgTmFOcyB1c2luZyBhIHByaXZhdGUgc3ltYm9sLlxuLyogZXNsaW50IG5vLWV4dGVuZC1uYXRpdmU6IFwib2ZmXCIgKi9cbnZhciBOYU5NYXJrZXIgPSAoMCwgX3N5bWJvbDIuZGVmYXVsdCkoJ05hTicpO1xuXG52YXIgQUNDRVNTT1JfU1VQUE9SVCA9IHRydWU7XG5cbmZ1bmN0aW9uIGVuY29kZVZhbChkYXRhKSB7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0YSkgPyBOYU5NYXJrZXIgOiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVWYWwoZW5jb2RlZERhdGEpIHtcbiAgcmV0dXJuIGVuY29kZWREYXRhID09PSBOYU5NYXJrZXIgPyBOYU4gOiBlbmNvZGVkRGF0YTtcbn1cblxuZnVuY3Rpb24gbWFrZUl0ZXJhdG9yKHNldEluc3QsIGdldHRlcikge1xuICB2YXIgbmV4dElkeCA9IDA7XG4gIHJldHVybiB7XG4gICAgbmV4dDogZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChzZXRJbnN0Ll92YWx1ZXNbbmV4dElkeF0gPT09IHVuZGVmTWFya2VyKSB7XG4gICAgICAgIG5leHRJZHgrKztcbiAgICAgIH1pZiAobmV4dElkeCA9PT0gc2V0SW5zdC5fdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogZ2V0dGVyLmNhbGwoc2V0SW5zdCwgbmV4dElkeCsrKSwgZG9uZTogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbGNTaXplKHNldEluc3QpIHtcbiAgdmFyIHNpemUgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgcyA9IHNldEluc3QuX3ZhbHVlcy5sZW5ndGg7IGkgPCBzOyBpKyspIHtcbiAgICBpZiAoc2V0SW5zdC5fdmFsdWVzW2ldICE9PSB1bmRlZk1hcmtlcikgc2l6ZSsrO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG52YXIgU2V0ID0gZnVuY3Rpb24gU2V0KGRhdGEpIHtcbiAgdGhpcy5fdmFsdWVzID0gW107XG5cbiAgLy8gSWYgYGRhdGFgIGlzIGl0ZXJhYmxlIChpbmRpY2F0ZWQgYnkgcHJlc2VuY2Ugb2YgYSBmb3JFYWNoIG1ldGhvZCksIHByZS1wb3B1bGF0ZSB0aGUgc2V0XG4gIGRhdGEgJiYgdHlwZW9mIGRhdGEuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJyAmJiBkYXRhLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB0aGlzLmFkZC5jYWxsKHRoaXMsIGl0ZW0pO1xuICB9LCB0aGlzKTtcblxuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xufTtcblxuLy8gU29tZSBvbGQgZW5naW5lcyBkbyBub3Qgc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzLiAgU2luY2UgU2V0IG9ubHkgcmVxdWlyZXMgdGhlc2UgZm9yIHRoZSBzaXplIHByb3BlcnR5LCB3ZSBjYW4gZmFsbCBiYWNrIHRvIHNldHRpbmcgdGhlIHNpemUgcHJvcGVydHkgc3RhdGljYWxseSBlYWNoIHRpbWUgdGhlIHNpemUgb2YgdGhlIHNldCBjaGFuZ2VzLlxudHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldC5wcm90b3R5cGUsICdzaXplJywge1xuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIGNhbGNTaXplKHRoaXMpO1xuICAgIH1cbiAgfSk7XG59IGNhdGNoIChlKSB7XG4gIEFDQ0VTU09SX1NVUFBPUlQgPSBmYWxzZTtcbn1cblxuU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFsdWUgPSBlbmNvZGVWYWwodmFsdWUpO1xuICBpZiAodGhpcy5fdmFsdWVzLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgIHRoaXMuX3ZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB0aGlzLl92YWx1ZXMuaW5kZXhPZihlbmNvZGVWYWwodmFsdWUpKSAhPT0gLTE7XG59O1xuU2V0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIGlkeCA9IHRoaXMuX3ZhbHVlcy5pbmRleE9mKGVuY29kZVZhbCh2YWx1ZSkpO1xuICBpZiAoaWR4ID09PSAtMSkgcmV0dXJuIGZhbHNlO1xuICB0aGlzLl92YWx1ZXNbaWR4XSA9IHVuZGVmTWFya2VyO1xuICBpZiAoIUFDQ0VTU09SX1NVUFBPUlQpIHRoaXMuc2l6ZSA9IGNhbGNTaXplKHRoaXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5TZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl92YWx1ZXMgPSBbXTtcbiAgaWYgKCFBQ0NFU1NPUl9TVVBQT1JUKSB0aGlzLnNpemUgPSAwO1xufTtcblNldC5wcm90b3R5cGUudmFsdWVzID0gU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIGRlY29kZVZhbCh0aGlzLl92YWx1ZXNbaV0pO1xuICB9KTtcbn07XG5TZXQucHJvdG90eXBlLmVudHJpZXMgPSBTZXQucHJvdG90eXBlW19zeW1ib2wyLmRlZmF1bHQuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChpKSB7XG4gICAgcmV0dXJuIFtkZWNvZGVWYWwodGhpcy5fdmFsdWVzW2ldKSwgZGVjb2RlVmFsKHRoaXMuX3ZhbHVlc1tpXSldO1xuICB9KTtcbn07XG5TZXQucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2tGbiwgdGhpc0FyZykge1xuICB0aGlzQXJnID0gdGhpc0FyZyB8fCBnbG9iYWw7XG4gIHZhciBpdGVyYXRvciA9IHRoaXMuZW50cmllcygpO1xuICB2YXIgcmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpO1xuICB3aGlsZSAocmVzdWx0LmRvbmUgPT09IGZhbHNlKSB7XG4gICAgY2FsbGJhY2tGbi5jYWxsKHRoaXNBcmcsIHJlc3VsdC52YWx1ZVsxXSwgcmVzdWx0LnZhbHVlWzBdLCB0aGlzKTtcbiAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7XG4gIH1cbn07XG5cblNldC5wcm90b3R5cGVbX3N5bWJvbDIuZGVmYXVsdC5zcGVjaWVzXSA9IFNldDtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCwgJ2NvbnN0cnVjdG9yJywge1xuICB2YWx1ZTogU2V0XG59KTtcblxudHJ5IHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFNldCwgJ2xlbmd0aCcsIHtcbiAgICB2YWx1ZTogMFxuICB9KTtcbn0gY2F0Y2ggKGUpIHt9XG5cbm1vZHVsZS5leHBvcnRzID0gU2V0O1xuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4vKiBlc2xpbnQgbm8tZXh0ZW5kLW5hdGl2ZTogXCJvZmZcIiAqL1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgY291bnRlciA9IERhdGUubm93KCkgJSAxZTk7XG5cbnZhciBXZWFrTWFwID0gZnVuY3Rpb24gV2Vha01hcChkYXRhKSB7XG4gIHRoaXMubmFtZSA9ICdfX3N0JyArIChNYXRoLnJhbmRvbSgpICogMWU5ID4+PiAwKSArIChjb3VudGVyKysgKyAnX18nKTtcblxuICAvLyBJZiBkYXRhIGlzIGl0ZXJhYmxlIChpbmRpY2F0ZWQgYnkgcHJlc2VuY2Ugb2YgYSBmb3JFYWNoIG1ldGhvZCksIHByZS1wb3B1bGF0ZSB0aGUgbWFwXG4gIGRhdGEgJiYgZGF0YS5mb3JFYWNoICYmIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgIHRoaXMuc2V0LmFwcGx5KHRoaXMsIGl0ZW0pO1xuICB9LCB0aGlzKTtcbn07XG5cbldlYWtNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIGlmICgodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yoa2V5KSkgIT09ICdvYmplY3QnICYmIHR5cGVvZiBrZXkgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgdmFsdWUgdXNlZCBhcyB3ZWFrIG1hcCBrZXknKTtcblxuICB2YXIgZW50cnkgPSBrZXlbdGhpcy5uYW1lXTtcbiAgaWYgKGVudHJ5ICYmIGVudHJ5WzBdID09PSBrZXkpIGVudHJ5WzFdID0gdmFsdWU7ZWxzZSBkZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMubmFtZSwgeyB2YWx1ZTogW2tleSwgdmFsdWVdLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5XZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBlbnRyeTtcbiAgcmV0dXJuIChlbnRyeSA9IGtleVt0aGlzLm5hbWVdKSAmJiBlbnRyeVswXSA9PT0ga2V5ID8gZW50cnlbMV0gOiB1bmRlZmluZWQ7XG59O1xuXG5XZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBlbnRyeSA9IGtleVt0aGlzLm5hbWVdO1xuICBpZiAoIWVudHJ5IHx8IGVudHJ5WzBdICE9PSBrZXkpIHJldHVybiBmYWxzZTtcbiAgZW50cnlbMF0gPSBlbnRyeVsxXSA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5XZWFrTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHZhciBlbnRyeSA9IGtleVt0aGlzLm5hbWVdO1xuICBpZiAoIWVudHJ5KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlbnRyeVswXSA9PT0ga2V5O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBXZWFrTWFwO1xuXG4vKioqLyB9KSxcbi8qIDcgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuLyogZXNsaW50IG5vLWV4dGVuZC1uYXRpdmU6IFwib2ZmXCIgKi9cblxudmFyIGNvdW50ZXIgPSBEYXRlLm5vdygpICUgMWU5O1xuXG52YXIgV2Vha1NldCA9IGZ1bmN0aW9uIFdlYWtTZXQoZGF0YSkge1xuICB0aGlzLm5hbWUgPSAnX19zdCcgKyAoTWF0aC5yYW5kb20oKSAqIDFlOSA+Pj4gMCkgKyAoY291bnRlcisrICsgJ19fJyk7XG4gIGRhdGEgJiYgZGF0YS5mb3JFYWNoICYmIGRhdGEuZm9yRWFjaCh0aGlzLmFkZCwgdGhpcyk7XG59O1xuXG5XZWFrU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuICBpZiAoIW9ialtuYW1lXSkgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgbmFtZSwgeyB2YWx1ZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuV2Vha1NldC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKG9iaikge1xuICBpZiAoIW9ialt0aGlzLm5hbWVdKSByZXR1cm4gZmFsc2U7XG4gIG9ialt0aGlzLm5hbWVdID0gdW5kZWZpbmVkO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbldlYWtTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuICEhb2JqW3RoaXMubmFtZV07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdlYWtTZXQ7XG5cbi8qKiovIH0pLFxuLyogOCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgRm9udEZhY2UgPSBmdW5jdGlvbiBGb250RmFjZShmYW1pbHksIHNvdXJjZSkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9udEZhY2UpO1xuXG4gIHRoaXMuZmFtaWx5ID0gZmFtaWx5O1xuICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRm9udEZhY2U7XG5cbi8qKiovIH0pLFxuLyogOSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9VUkxcblxudmFyIFVSTFNlYXJjaFBhcmFtcyA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbnZhciByZWxhdGl2ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5yZWxhdGl2ZS5mdHAgPSAyMTtcbnJlbGF0aXZlLmZpbGUgPSAwO1xucmVsYXRpdmUuZ29waGVyID0gNzA7XG5yZWxhdGl2ZS5odHRwID0gODA7XG5yZWxhdGl2ZS5odHRwcyA9IDQ0MztcbnJlbGF0aXZlLndzID0gODA7XG5yZWxhdGl2ZS53c3MgPSA0NDM7XG5cbnZhciByZWxhdGl2ZVBhdGhEb3RNYXBwaW5nID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbnJlbGF0aXZlUGF0aERvdE1hcHBpbmdbJyUyZSddID0gJy4nO1xucmVsYXRpdmVQYXRoRG90TWFwcGluZ1snLiUyZSddID0gJy4uJztcbnJlbGF0aXZlUGF0aERvdE1hcHBpbmdbJyUyZS4nXSA9ICcuLic7XG5yZWxhdGl2ZVBhdGhEb3RNYXBwaW5nWyclMmUlMmUnXSA9ICcuLic7XG5cbmZ1bmN0aW9uIGlzUmVsYXRpdmVTY2hlbWUoc2NoZW1lKSB7XG4gIHJldHVybiByZWxhdGl2ZVtzY2hlbWVdICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGludmFsaWQoKSB7XG4gIGNsZWFyLmNhbGwodGhpcyk7XG4gIHRoaXMuX2lzSW52YWxpZCA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIElETkFUb0FTQ0lJKGgpIHtcbiAgaWYgKCcnID09IGgpIHtcbiAgICBpbnZhbGlkLmNhbGwodGhpcyk7XG4gIH1cbiAgLy8gWFhYXG4gIHJldHVybiBoLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIHBlcmNlbnRFc2NhcGUoYykge1xuICB2YXIgdW5pY29kZSA9IGMuY2hhckNvZGVBdCgwKTtcbiAgaWYgKHVuaWNvZGUgPiAweDIwICYmIHVuaWNvZGUgPCAweDdGICYmXG4gIC8vIFwiICMgPCA+ID8gYFxuICBbMHgyMiwgMHgyMywgMHgzQywgMHgzRSwgMHgzRiwgMHg2MF0uaW5kZXhPZih1bmljb2RlKSA9PSAtMSkge1xuICAgIHJldHVybiBjO1xuICB9XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoYyk7XG59XG5cbmZ1bmN0aW9uIHBlcmNlbnRFc2NhcGVRdWVyeShjKSB7XG4gIC8vIFhYWCBUaGlzIGFjdHVhbGx5IG5lZWRzIHRvIGVuY29kZSBjIHVzaW5nIGVuY29kaW5nIGFuZCB0aGVuXG4gIC8vIGNvbnZlcnQgdGhlIGJ5dGVzIG9uZS1ieS1vbmUuXG5cbiAgdmFyIHVuaWNvZGUgPSBjLmNoYXJDb2RlQXQoMCk7XG4gIGlmICh1bmljb2RlID4gMHgyMCAmJiB1bmljb2RlIDwgMHg3RiAmJlxuICAvLyBcIiAjIDwgPiBgIChkbyBub3QgZXNjYXBlICc/JylcbiAgWzB4MjIsIDB4MjMsIDB4M0MsIDB4M0UsIDB4NjBdLmluZGV4T2YodW5pY29kZSkgPT0gLTEpIHtcbiAgICByZXR1cm4gYztcbiAgfVxuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGMpO1xufVxuXG52YXIgRU9GID0gdW5kZWZpbmVkLFxuICAgIEFMUEhBID0gL1thLXpBLVpdLyxcbiAgICBBTFBIQU5VTUVSSUMgPSAvW2EtekEtWjAtOVxcK1xcLVxcLl0vO1xuXG5mdW5jdGlvbiBwYXJzZShpbnB1dCwgc3RhdGVPdmVycmlkZSwgYmFzZSkge1xuICBmdW5jdGlvbiBlcnIobWVzc2FnZSkge1xuICAgIGVycm9ycy5wdXNoKG1lc3NhZ2UpO1xuICB9XG5cbiAgdmFyIHN0YXRlID0gc3RhdGVPdmVycmlkZSB8fCAnc2NoZW1lIHN0YXJ0JyxcbiAgICAgIGN1cnNvciA9IDAsXG4gICAgICBidWZmZXIgPSAnJyxcbiAgICAgIHNlZW5BdCA9IGZhbHNlLFxuICAgICAgc2VlbkJyYWNrZXQgPSBmYWxzZSxcbiAgICAgIGVycm9ycyA9IFtdO1xuXG4gIGxvb3A6IHdoaWxlICgoaW5wdXRbY3Vyc29yIC0gMV0gIT0gRU9GIHx8IGN1cnNvciA9PSAwKSAmJiAhdGhpcy5faXNJbnZhbGlkKSB7XG4gICAgdmFyIGMgPSBpbnB1dFtjdXJzb3JdO1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgJ3NjaGVtZSBzdGFydCc6XG4gICAgICAgIGlmIChjICYmIEFMUEhBLnRlc3QoYykpIHtcbiAgICAgICAgICBidWZmZXIgKz0gYy50b0xvd2VyQ2FzZSgpOyAvLyBBU0NJSS1zYWZlXG4gICAgICAgICAgc3RhdGUgPSAnc2NoZW1lJztcbiAgICAgICAgfSBlbHNlIGlmICghc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gJ25vIHNjaGVtZSc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyKCdJbnZhbGlkIHNjaGVtZS4nKTtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzY2hlbWUnOlxuICAgICAgICBpZiAoYyAmJiBBTFBIQU5VTUVSSUMudGVzdChjKSkge1xuICAgICAgICAgIGJ1ZmZlciArPSBjLnRvTG93ZXJDYXNlKCk7IC8vIEFTQ0lJLXNhZmVcbiAgICAgICAgfSBlbHNlIGlmICgnOicgPT0gYykge1xuICAgICAgICAgIHRoaXMuX3NjaGVtZSA9IGJ1ZmZlcjtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUmVsYXRpdmVTY2hlbWUodGhpcy5fc2NoZW1lKSkge1xuICAgICAgICAgICAgdGhpcy5faXNSZWxhdGl2ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnZmlsZScgPT0gdGhpcy5fc2NoZW1lKSB7XG4gICAgICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9pc1JlbGF0aXZlICYmIGJhc2UgJiYgYmFzZS5fc2NoZW1lID09IHRoaXMuX3NjaGVtZSkge1xuICAgICAgICAgICAgc3RhdGUgPSAncmVsYXRpdmUgb3IgYXV0aG9yaXR5JztcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lzUmVsYXRpdmUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ2F1dGhvcml0eSBmaXJzdCBzbGFzaCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ3NjaGVtZSBkYXRhJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoIXN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBjdXJzb3IgPSAwO1xuICAgICAgICAgIHN0YXRlID0gJ25vIHNjaGVtZSc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoRU9GID09IGMpIHtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVycignQ29kZSBwb2ludCBub3QgYWxsb3dlZCBpbiBzY2hlbWU6ICcgKyBjKTtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzY2hlbWUgZGF0YSc6XG4gICAgICAgIGlmICgnPycgPT0gYykge1xuICAgICAgICAgIHN0YXRlID0gJ3F1ZXJ5JztcbiAgICAgICAgfSBlbHNlIGlmICgnIycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgICAgICAgIHN0YXRlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBYWFggZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgICBpZiAoRU9GICE9IGMgJiYgJ1xcdCcgIT0gYyAmJiAnXFxuJyAhPSBjICYmICdcXHInICE9IGMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NjaGVtZURhdGEgKz0gcGVyY2VudEVzY2FwZShjKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ25vIHNjaGVtZSc6XG4gICAgICAgIGlmICghYmFzZSB8fCAhaXNSZWxhdGl2ZVNjaGVtZShiYXNlLl9zY2hlbWUpKSB7XG4gICAgICAgICAgZXJyKCdNaXNzaW5nIHNjaGVtZS4nKTtcbiAgICAgICAgICBpbnZhbGlkLmNhbGwodGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUgPSAncmVsYXRpdmUnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWxhdGl2ZSBvciBhdXRob3JpdHknOlxuICAgICAgICBpZiAoJy8nID09IGMgJiYgJy8nID09IGlucHV0W2N1cnNvciArIDFdKSB7XG4gICAgICAgICAgc3RhdGUgPSAnYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnIoJ0V4cGVjdGVkIC8sIGdvdDogJyArIGMpO1xuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlJztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVsYXRpdmUnOlxuICAgICAgICB0aGlzLl9pc1JlbGF0aXZlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCdmaWxlJyAhPSB0aGlzLl9zY2hlbWUpIHRoaXMuX3NjaGVtZSA9IGJhc2UuX3NjaGVtZTtcbiAgICAgICAgaWYgKEVPRiA9PSBjKSB7XG4gICAgICAgICAgdGhpcy5faG9zdCA9IGJhc2UuX2hvc3Q7XG4gICAgICAgICAgdGhpcy5fcG9ydCA9IGJhc2UuX3BvcnQ7XG4gICAgICAgICAgdGhpcy5fcGF0aCA9IGJhc2UuX3BhdGguc2xpY2UoKTtcbiAgICAgICAgICB0aGlzLl9xdWVyeSA9IGJhc2UuX3F1ZXJ5O1xuICAgICAgICAgIHRoaXMuX3VzZXJuYW1lID0gYmFzZS5fdXNlcm5hbWU7XG4gICAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSBiYXNlLl9wYXNzd29yZDtcbiAgICAgICAgICBicmVhayBsb29wO1xuICAgICAgICB9IGVsc2UgaWYgKCcvJyA9PSBjIHx8ICdcXFxcJyA9PSBjKSB7XG4gICAgICAgICAgaWYgKCdcXFxcJyA9PSBjKSBlcnIoJ1xcXFwgaXMgYW4gaW52YWxpZCBjb2RlIHBvaW50LicpO1xuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHNsYXNoJztcbiAgICAgICAgfSBlbHNlIGlmICgnPycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2hvc3QgPSBiYXNlLl9ob3N0O1xuICAgICAgICAgIHRoaXMuX3BvcnQgPSBiYXNlLl9wb3J0O1xuICAgICAgICAgIHRoaXMuX3BhdGggPSBiYXNlLl9wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdGhpcy5fcXVlcnkgPSAnPyc7XG4gICAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSBiYXNlLl91c2VybmFtZTtcbiAgICAgICAgICB0aGlzLl9wYXNzd29yZCA9IGJhc2UuX3Bhc3N3b3JkO1xuICAgICAgICAgIHN0YXRlID0gJ3F1ZXJ5JztcbiAgICAgICAgfSBlbHNlIGlmICgnIycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2hvc3QgPSBiYXNlLl9ob3N0O1xuICAgICAgICAgIHRoaXMuX3BvcnQgPSBiYXNlLl9wb3J0O1xuICAgICAgICAgIHRoaXMuX3BhdGggPSBiYXNlLl9wYXRoLnNsaWNlKCk7XG4gICAgICAgICAgdGhpcy5fcXVlcnkgPSBiYXNlLl9xdWVyeTtcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudCA9ICcjJztcbiAgICAgICAgICB0aGlzLl91c2VybmFtZSA9IGJhc2UuX3VzZXJuYW1lO1xuICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gYmFzZS5fcGFzc3dvcmQ7XG4gICAgICAgICAgc3RhdGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBuZXh0QyA9IGlucHV0W2N1cnNvciArIDFdO1xuICAgICAgICAgIHZhciBuZXh0TmV4dEMgPSBpbnB1dFtjdXJzb3IgKyAyXTtcbiAgICAgICAgICBpZiAoJ2ZpbGUnICE9IHRoaXMuX3NjaGVtZSB8fCAhQUxQSEEudGVzdChjKSB8fCBuZXh0QyAhPSAnOicgJiYgbmV4dEMgIT0gJ3wnIHx8IEVPRiAhPSBuZXh0TmV4dEMgJiYgJy8nICE9IG5leHROZXh0QyAmJiAnXFxcXCcgIT0gbmV4dE5leHRDICYmICc/JyAhPSBuZXh0TmV4dEMgJiYgJyMnICE9IG5leHROZXh0Qykge1xuICAgICAgICAgICAgdGhpcy5faG9zdCA9IGJhc2UuX2hvc3Q7XG4gICAgICAgICAgICB0aGlzLl9wb3J0ID0gYmFzZS5fcG9ydDtcbiAgICAgICAgICAgIHRoaXMuX3VzZXJuYW1lID0gYmFzZS5fdXNlcm5hbWU7XG4gICAgICAgICAgICB0aGlzLl9wYXNzd29yZCA9IGJhc2UuX3Bhc3N3b3JkO1xuICAgICAgICAgICAgdGhpcy5fcGF0aCA9IGJhc2UuX3BhdGguc2xpY2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3BhdGgucG9wKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGgnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdyZWxhdGl2ZSBzbGFzaCc6XG4gICAgICAgIGlmICgnLycgPT0gYyB8fCAnXFxcXCcgPT0gYykge1xuICAgICAgICAgIGlmICgnXFxcXCcgPT0gYykge1xuICAgICAgICAgICAgZXJyKCdcXFxcIGlzIGFuIGludmFsaWQgY29kZSBwb2ludC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdmaWxlJyA9PSB0aGlzLl9zY2hlbWUpIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ2ZpbGUgaG9zdCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ2F1dGhvcml0eSBpZ25vcmUgc2xhc2hlcyc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICgnZmlsZScgIT0gdGhpcy5fc2NoZW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9ob3N0ID0gYmFzZS5faG9zdDtcbiAgICAgICAgICAgIHRoaXMuX3BvcnQgPSBiYXNlLl9wb3J0O1xuICAgICAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSBiYXNlLl91c2VybmFtZTtcbiAgICAgICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gYmFzZS5fcGFzc3dvcmQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGgnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdXRob3JpdHkgZmlyc3Qgc2xhc2gnOlxuICAgICAgICBpZiAoJy8nID09IGMpIHtcbiAgICAgICAgICBzdGF0ZSA9ICdhdXRob3JpdHkgc2Vjb25kIHNsYXNoJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnIoXCJFeHBlY3RlZCAnLycsIGdvdDogXCIgKyBjKTtcbiAgICAgICAgICBzdGF0ZSA9ICdhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdXRob3JpdHkgc2Vjb25kIHNsYXNoJzpcbiAgICAgICAgc3RhdGUgPSAnYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzJztcbiAgICAgICAgaWYgKCcvJyAhPSBjKSB7XG4gICAgICAgICAgZXJyKFwiRXhwZWN0ZWQgJy8nLCBnb3Q6IFwiICsgYyk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2F1dGhvcml0eSBpZ25vcmUgc2xhc2hlcyc6XG4gICAgICAgIGlmICgnLycgIT0gYyAmJiAnXFxcXCcgIT0gYykge1xuICAgICAgICAgIHN0YXRlID0gJ2F1dGhvcml0eSc7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyKCdFeHBlY3RlZCBhdXRob3JpdHksIGdvdDogJyArIGMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhdXRob3JpdHknOlxuICAgICAgICBpZiAoJ0AnID09IGMpIHtcbiAgICAgICAgICBpZiAoc2VlbkF0KSB7XG4gICAgICAgICAgICBlcnIoJ0AgYWxyZWFkeSBzZWVuLicpO1xuICAgICAgICAgICAgYnVmZmVyICs9ICclNDAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWVuQXQgPSB0cnVlO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY3AgPSBidWZmZXJbaV07XG4gICAgICAgICAgICBpZiAoJ1xcdCcgPT0gY3AgfHwgJ1xcbicgPT0gY3AgfHwgJ1xccicgPT0gY3ApIHtcbiAgICAgICAgICAgICAgZXJyKCdJbnZhbGlkIHdoaXRlc3BhY2UgaW4gYXV0aG9yaXR5LicpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFhYWCBjaGVjayBVUkwgY29kZSBwb2ludHNcbiAgICAgICAgICAgIGlmICgnOicgPT0gY3AgJiYgbnVsbCA9PT0gdGhpcy5fcGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSAnJztcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdGVtcEMgPSBwZXJjZW50RXNjYXBlKGNwKTtcbiAgICAgICAgICAgIG51bGwgIT09IHRoaXMuX3Bhc3N3b3JkID8gdGhpcy5fcGFzc3dvcmQgKz0gdGVtcEMgOiB0aGlzLl91c2VybmFtZSArPSB0ZW1wQztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoRU9GID09IGMgfHwgJy8nID09IGMgfHwgJ1xcXFwnID09IGMgfHwgJz8nID09IGMgfHwgJyMnID09IGMpIHtcbiAgICAgICAgICBjdXJzb3IgLT0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9ICdob3N0JztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBidWZmZXIgKz0gYztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZmlsZSBob3N0JzpcbiAgICAgICAgaWYgKEVPRiA9PSBjIHx8ICcvJyA9PSBjIHx8ICdcXFxcJyA9PSBjIHx8ICc/JyA9PSBjIHx8ICcjJyA9PSBjKSB7XG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT0gMiAmJiBBTFBIQS50ZXN0KGJ1ZmZlclswXSkgJiYgKGJ1ZmZlclsxXSA9PSAnOicgfHwgYnVmZmVyWzFdID09ICd8JykpIHtcbiAgICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGgnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSBwYXRoIHN0YXJ0JztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faG9zdCA9IElETkFUb0FTQ0lJLmNhbGwodGhpcywgYnVmZmVyKTtcbiAgICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgICAgc3RhdGUgPSAncmVsYXRpdmUgcGF0aCBzdGFydCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCdcXHQnID09IGMgfHwgJ1xcbicgPT0gYyB8fCAnXFxyJyA9PSBjKSB7XG4gICAgICAgICAgZXJyKCdJbnZhbGlkIHdoaXRlc3BhY2UgaW4gZmlsZSBob3N0LicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1ZmZlciArPSBjO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdob3N0JzpcbiAgICAgIGNhc2UgJ2hvc3RuYW1lJzpcbiAgICAgICAgaWYgKCc6JyA9PSBjICYmICFzZWVuQnJhY2tldCkge1xuICAgICAgICAgIC8vIFhYWCBob3N0IHBhcnNpbmdcbiAgICAgICAgICB0aGlzLl9ob3N0ID0gSUROQVRvQVNDSUkuY2FsbCh0aGlzLCBidWZmZXIpO1xuICAgICAgICAgIGJ1ZmZlciA9ICcnO1xuICAgICAgICAgIHN0YXRlID0gJ3BvcnQnO1xuICAgICAgICAgIGlmICgnaG9zdG5hbWUnID09IHN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKEVPRiA9PSBjIHx8ICcvJyA9PSBjIHx8ICdcXFxcJyA9PSBjIHx8ICc/JyA9PSBjIHx8ICcjJyA9PSBjKSB7XG4gICAgICAgICAgdGhpcy5faG9zdCA9IElETkFUb0FTQ0lJLmNhbGwodGhpcywgYnVmZmVyKTtcbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSBwYXRoIHN0YXJ0JztcbiAgICAgICAgICBpZiAoc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgICAgYnJlYWsgbG9vcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSBpZiAoJ1xcdCcgIT0gYyAmJiAnXFxuJyAhPSBjICYmICdcXHInICE9IGMpIHtcbiAgICAgICAgICBpZiAoJ1snID09IGMpIHtcbiAgICAgICAgICAgIHNlZW5CcmFja2V0ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCddJyA9PSBjKSB7XG4gICAgICAgICAgICBzZWVuQnJhY2tldCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIgKz0gYztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnIoJ0ludmFsaWQgY29kZSBwb2ludCBpbiBob3N0L2hvc3RuYW1lOiAnICsgYyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3BvcnQnOlxuICAgICAgICBpZiAoL1swLTldLy50ZXN0KGMpKSB7XG4gICAgICAgICAgYnVmZmVyICs9IGM7XG4gICAgICAgIH0gZWxzZSBpZiAoRU9GID09IGMgfHwgJy8nID09IGMgfHwgJ1xcXFwnID09IGMgfHwgJz8nID09IGMgfHwgJyMnID09IGMgfHwgc3RhdGVPdmVycmlkZSkge1xuICAgICAgICAgIGlmICgnJyAhPSBidWZmZXIpIHtcbiAgICAgICAgICAgIHZhciB0ZW1wID0gcGFyc2VJbnQoYnVmZmVyLCAxMCk7XG4gICAgICAgICAgICBpZiAodGVtcCAhPSByZWxhdGl2ZVt0aGlzLl9zY2hlbWVdKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BvcnQgPSB0ZW1wICsgJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGJyZWFrIGxvb3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlID0gJ3JlbGF0aXZlIHBhdGggc3RhcnQnO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKCdcXHQnID09IGMgfHwgJ1xcbicgPT0gYyB8fCAnXFxyJyA9PSBjKSB7XG4gICAgICAgICAgZXJyKCdJbnZhbGlkIGNvZGUgcG9pbnQgaW4gcG9ydDogJyArIGMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGludmFsaWQuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAncmVsYXRpdmUgcGF0aCBzdGFydCc6XG4gICAgICAgIGlmICgnXFxcXCcgPT0gYykgZXJyKFwiJ1xcXFwnIG5vdCBhbGxvd2VkIGluIHBhdGguXCIpO1xuICAgICAgICBzdGF0ZSA9ICdyZWxhdGl2ZSBwYXRoJztcbiAgICAgICAgaWYgKCcvJyAhPSBjICYmICdcXFxcJyAhPSBjKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JlbGF0aXZlIHBhdGgnOlxuICAgICAgICBpZiAoRU9GID09IGMgfHwgJy8nID09IGMgfHwgJ1xcXFwnID09IGMgfHwgIXN0YXRlT3ZlcnJpZGUgJiYgKCc/JyA9PSBjIHx8ICcjJyA9PSBjKSkge1xuICAgICAgICAgIGlmICgnXFxcXCcgPT0gYykge1xuICAgICAgICAgICAgZXJyKCdcXFxcIG5vdCBhbGxvd2VkIGluIHJlbGF0aXZlIHBhdGguJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB0bXA7XG4gICAgICAgICAgaWYgKHRtcCA9IHJlbGF0aXZlUGF0aERvdE1hcHBpbmdbYnVmZmVyLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgICBidWZmZXIgPSB0bXA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgnLi4nID09IGJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5fcGF0aC5wb3AoKTtcbiAgICAgICAgICAgIGlmICgnLycgIT0gYyAmJiAnXFxcXCcgIT0gYykge1xuICAgICAgICAgICAgICB0aGlzLl9wYXRoLnB1c2goJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoJy4nID09IGJ1ZmZlciAmJiAnLycgIT0gYyAmJiAnXFxcXCcgIT0gYykge1xuICAgICAgICAgICAgdGhpcy5fcGF0aC5wdXNoKCcnKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCcuJyAhPSBidWZmZXIpIHtcbiAgICAgICAgICAgIGlmICgnZmlsZScgPT0gdGhpcy5fc2NoZW1lICYmIHRoaXMuX3BhdGgubGVuZ3RoID09IDAgJiYgYnVmZmVyLmxlbmd0aCA9PSAyICYmIEFMUEhBLnRlc3QoYnVmZmVyWzBdKSAmJiBidWZmZXJbMV0gPT0gJ3wnKSB7XG4gICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlclswXSArICc6JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3BhdGgucHVzaChidWZmZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBidWZmZXIgPSAnJztcbiAgICAgICAgICBpZiAoJz8nID09IGMpIHtcbiAgICAgICAgICAgIHRoaXMuX3F1ZXJ5ID0gJz8nO1xuICAgICAgICAgICAgc3RhdGUgPSAncXVlcnknO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJyMnID09IGMpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgICAgICAgICAgc3RhdGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgnXFx0JyAhPSBjICYmICdcXG4nICE9IGMgJiYgJ1xccicgIT0gYykge1xuICAgICAgICAgIGJ1ZmZlciArPSBwZXJjZW50RXNjYXBlKGMpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdxdWVyeSc6XG4gICAgICAgIGlmICghc3RhdGVPdmVycmlkZSAmJiAnIycgPT0gYykge1xuICAgICAgICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgICAgICAgIHN0YXRlID0gJ2ZyYWdtZW50JztcbiAgICAgICAgfSBlbHNlIGlmIChFT0YgIT0gYyAmJiAnXFx0JyAhPSBjICYmICdcXG4nICE9IGMgJiYgJ1xccicgIT0gYykge1xuICAgICAgICAgIHRoaXMuX3F1ZXJ5ICs9IHBlcmNlbnRFc2NhcGVRdWVyeShjKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZnJhZ21lbnQnOlxuICAgICAgICBpZiAoRU9GICE9IGMgJiYgJ1xcdCcgIT0gYyAmJiAnXFxuJyAhPSBjICYmICdcXHInICE9IGMpIHtcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudCArPSBjO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGN1cnNvcisrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFyKCkge1xuICB0aGlzLl9zY2hlbWUgPSAnJztcbiAgdGhpcy5fc2NoZW1lRGF0YSA9ICcnO1xuICB0aGlzLl91c2VybmFtZSA9ICcnO1xuICB0aGlzLl9wYXNzd29yZCA9IG51bGw7XG4gIHRoaXMuX2hvc3QgPSAnJztcbiAgdGhpcy5fcG9ydCA9ICcnO1xuICB0aGlzLl9wYXRoID0gW107XG4gIHRoaXMuX3F1ZXJ5ID0gJyc7XG4gIHRoaXMuX2ZyYWdtZW50ID0gJyc7XG4gIHRoaXMuX2lzSW52YWxpZCA9IGZhbHNlO1xuICB0aGlzLl9pc1JlbGF0aXZlID0gZmFsc2U7XG59XG5cbi8vIERvZXMgbm90IHByb2Nlc3MgZG9tYWluIG5hbWVzIG9yIElQIGFkZHJlc3Nlcy5cbi8vIERvZXMgbm90IGhhbmRsZSBlbmNvZGluZyBmb3IgdGhlIHF1ZXJ5IHBhcmFtZXRlci5cbmZ1bmN0aW9uIFVSTCh1cmwsIGJhc2UgLyogLCBlbmNvZGluZyAqLykge1xuICBpZiAoYmFzZSAhPT0gdW5kZWZpbmVkICYmICEoYmFzZSBpbnN0YW5jZW9mIFVSTCkpIGJhc2UgPSBuZXcgVVJMKFN0cmluZyhiYXNlKSk7XG5cbiAgdGhpcy5fdXJsID0gdXJsO1xuICBjbGVhci5jYWxsKHRoaXMpO1xuXG4gIHZhciBpbnB1dCA9IHVybC5yZXBsYWNlKC9eWyBcXHRcXHJcXG5cXGZdK3xbIFxcdFxcclxcblxcZl0rJC9nLCAnJyk7XG4gIC8vIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0Zi04J1xuXG4gIHBhcnNlLmNhbGwodGhpcywgaW5wdXQsIG51bGwsIGJhc2UpO1xufVxuXG5VUkwucHJvdG90eXBlID0ge1xuICB0b1N0cmluZzogZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHJlZjtcbiAgfSxcbiAgZ2V0IGhyZWYoKSB7XG4gICAgaWYgKHRoaXMuX2lzSW52YWxpZCkgcmV0dXJuIHRoaXMuX3VybDtcblxuICAgIHZhciBhdXRob3JpdHkgPSAnJztcbiAgICBpZiAoJycgIT0gdGhpcy5fdXNlcm5hbWUgfHwgbnVsbCAhPSB0aGlzLl9wYXNzd29yZCkge1xuICAgICAgYXV0aG9yaXR5ID0gdGhpcy5fdXNlcm5hbWUgKyAobnVsbCAhPSB0aGlzLl9wYXNzd29yZCA/ICc6JyArIHRoaXMuX3Bhc3N3b3JkIDogJycpICsgJ0AnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3RvY29sICsgKHRoaXMuX2lzUmVsYXRpdmUgPyAnLy8nICsgYXV0aG9yaXR5ICsgdGhpcy5ob3N0IDogJycpICsgdGhpcy5wYXRobmFtZSArIHRoaXMuX3F1ZXJ5ICsgdGhpcy5fZnJhZ21lbnQ7XG4gIH0sXG4gIHNldCBocmVmKGhyZWYpIHtcbiAgICBjbGVhci5jYWxsKHRoaXMpO1xuICAgIHBhcnNlLmNhbGwodGhpcywgaHJlZik7XG4gIH0sXG5cbiAgZ2V0IHByb3RvY29sKCkge1xuICAgIHJldHVybiB0aGlzLl9zY2hlbWUgKyAnOic7XG4gIH0sXG4gIHNldCBwcm90b2NvbChwcm90b2NvbCkge1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQpIHJldHVybjtcbiAgICBwYXJzZS5jYWxsKHRoaXMsIHByb3RvY29sICsgJzonLCAnc2NoZW1lIHN0YXJ0Jyk7XG4gIH0sXG5cbiAgZ2V0IGhvc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzSW52YWxpZCA/ICcnIDogdGhpcy5fcG9ydCA/IHRoaXMuX2hvc3QgKyAnOicgKyB0aGlzLl9wb3J0IDogdGhpcy5faG9zdDtcbiAgfSxcbiAgc2V0IGhvc3QoaG9zdCkge1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQgfHwgIXRoaXMuX2lzUmVsYXRpdmUpIHJldHVybjtcbiAgICBwYXJzZS5jYWxsKHRoaXMsIGhvc3QsICdob3N0Jyk7XG4gIH0sXG5cbiAgZ2V0IGhvc3RuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9ob3N0O1xuICB9LFxuICBzZXQgaG9zdG5hbWUoaG9zdG5hbWUpIHtcbiAgICBpZiAodGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9pc1JlbGF0aXZlKSByZXR1cm47XG4gICAgcGFyc2UuY2FsbCh0aGlzLCBob3N0bmFtZSwgJ2hvc3RuYW1lJyk7XG4gIH0sXG5cbiAgZ2V0IHBvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcnQ7XG4gIH0sXG4gIHNldCBwb3J0KHBvcnQpIHtcbiAgICBpZiAodGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9pc1JlbGF0aXZlKSByZXR1cm47XG4gICAgcGFyc2UuY2FsbCh0aGlzLCBwb3J0LCAncG9ydCcpO1xuICB9LFxuXG4gIGdldCBwYXRobmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnZhbGlkID8gJycgOiB0aGlzLl9pc1JlbGF0aXZlID8gJy8nICsgdGhpcy5fcGF0aC5qb2luKCcvJykgOiB0aGlzLl9zY2hlbWVEYXRhO1xuICB9LFxuICBzZXQgcGF0aG5hbWUocGF0aG5hbWUpIHtcbiAgICBpZiAodGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9pc1JlbGF0aXZlKSByZXR1cm47XG4gICAgdGhpcy5fcGF0aCA9IFtdO1xuICAgIHBhcnNlLmNhbGwodGhpcywgcGF0aG5hbWUsICdyZWxhdGl2ZSBwYXRoIHN0YXJ0Jyk7XG4gIH0sXG5cbiAgZ2V0IHNlYXJjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9xdWVyeSB8fCAnPycgPT0gdGhpcy5fcXVlcnkgPyAnJyA6IHRoaXMuX3F1ZXJ5O1xuICB9LFxuICBzZXQgc2VhcmNoKHNlYXJjaCkge1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQgfHwgIXRoaXMuX2lzUmVsYXRpdmUpIHJldHVybjtcbiAgICB0aGlzLl9xdWVyeSA9ICc/JztcbiAgICBpZiAoJz8nID09IHNlYXJjaFswXSkgc2VhcmNoID0gc2VhcmNoLnNsaWNlKDEpO1xuICAgIHBhcnNlLmNhbGwodGhpcywgc2VhcmNoLCAncXVlcnknKTtcbiAgfSxcblxuICBnZXQgc2VhcmNoUGFyYW1zKCkge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMuc2VhcmNoKTtcbiAgfSxcblxuICBnZXQgaGFzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNJbnZhbGlkIHx8ICF0aGlzLl9mcmFnbWVudCB8fCAnIycgPT0gdGhpcy5fZnJhZ21lbnQgPyAnJyA6IHRoaXMuX2ZyYWdtZW50O1xuICB9LFxuICBzZXQgaGFzaChoYXNoKSB7XG4gICAgaWYgKHRoaXMuX2lzSW52YWxpZCkgcmV0dXJuO1xuICAgIHRoaXMuX2ZyYWdtZW50ID0gJyMnO1xuICAgIGlmICgnIycgPT0gaGFzaFswXSkgaGFzaCA9IGhhc2guc2xpY2UoMSk7XG4gICAgcGFyc2UuY2FsbCh0aGlzLCBoYXNoLCAnZnJhZ21lbnQnKTtcbiAgfSxcblxuICBnZXQgb3JpZ2luKCkge1xuICAgIHZhciBob3N0O1xuICAgIGlmICh0aGlzLl9pc0ludmFsaWQgfHwgIXRoaXMuX3NjaGVtZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICAvLyBqYXZhc2NyaXB0OiBHZWNrbyByZXR1cm5zIFN0cmluZyhcIlwiKSwgV2ViS2l0L0JsaW5rIFN0cmluZyhcIm51bGxcIilcbiAgICAvLyBHZWNrbyB0aHJvd3MgZXJyb3IgZm9yIFwiZGF0YTovL1wiXG4gICAgLy8gZGF0YTogR2Vja28gcmV0dXJucyBcIlwiLCBCbGluayByZXR1cm5zIFwiZGF0YTovL1wiLCBXZWJLaXQgcmV0dXJucyBcIm51bGxcIlxuICAgIC8vIEdlY2tvIHJldHVybnMgU3RyaW5nKFwiXCIpIGZvciBmaWxlOiBtYWlsdG86XG4gICAgLy8gV2ViS2l0L0JsaW5rIHJldHVybnMgU3RyaW5nKFwiU0NIRU1FOi8vXCIpIGZvciBmaWxlOiBtYWlsdG86XG4gICAgc3dpdGNoICh0aGlzLl9zY2hlbWUpIHtcbiAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICBjYXNlICdqYXZhc2NyaXB0JzpcbiAgICAgIGNhc2UgJ21haWx0byc6XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgfVxuICAgIGhvc3QgPSB0aGlzLmhvc3Q7XG4gICAgaWYgKCFob3N0KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zY2hlbWUgKyAnOi8vJyArIGhvc3Q7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVVJMO1xuXG4vKioqLyB9KSxcbi8qIDEwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9lcmljZi9jc3MtbWVkaWFxdWVyeVxuXG52YXIgUkVfTUVESUFfUVVFUlkgPSAvXig/Oihvbmx5fG5vdCk/XFxzKihbX2Etel1bX2EtejAtOS1dKil8KFxcKFteXFwpXStcXCkpKSg/OlxccyphbmRcXHMqKC4qKSk/JC9pLFxuICAgIFJFX01RX0VYUFJFU1NJT04gPSAvXlxcKFxccyooW19hLXotXVtfYS16MC05LV0qKVxccyooPzpcXDpcXHMqKFteXFwpXSspKT9cXHMqXFwpJC8sXG4gICAgUkVfTVFfRkVBVFVSRSA9IC9eKD86KG1pbnxtYXgpLSk/KC4rKS87XG5cbmZ1bmN0aW9uIF9tYXRjaGVzKG1lZGlhLCB2YWx1ZXMpIHtcbiAgcmV0dXJuIF9wYXJzZVF1ZXJ5KG1lZGlhKS5zb21lKGZ1bmN0aW9uIChxdWVyeSkge1xuICAgIHZhciBpbnZlcnNlID0gcXVlcnkuaW52ZXJzZTtcblxuICAgIHZhciB0eXBlTWF0Y2ggPSBxdWVyeS50eXBlID09PSAnYWxsJyB8fCB2YWx1ZXMudHlwZSA9PT0gcXVlcnkudHlwZTtcblxuICAgIGlmICh0eXBlTWF0Y2ggJiYgaW52ZXJzZSB8fCAhKHR5cGVNYXRjaCB8fCBpbnZlcnNlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBleHByZXNzaW9uc01hdGNoID0gcXVlcnkuZXhwcmVzc2lvbnMuZXZlcnkoZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgIHZhciBmZWF0dXJlID0gZXhwcmVzc2lvbi5mZWF0dXJlLFxuICAgICAgICAgIG1vZGlmaWVyID0gZXhwcmVzc2lvbi5tb2RpZmllcixcbiAgICAgICAgICBleHBWYWx1ZSA9IGV4cHJlc3Npb24udmFsdWUsXG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbZmVhdHVyZV07XG5cbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGZlYXR1cmUpIHtcbiAgICAgICAgY2FzZSAnd2lkdGgnOlxuICAgICAgICBjYXNlICdoZWlnaHQnOlxuICAgICAgICAgIGV4cFZhbHVlID0gcGFyc2VGbG9hdChleHBWYWx1ZSk7XG4gICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdtaW4nOlxuICAgICAgICAgIHJldHVybiB2YWx1ZSA+PSBleHBWYWx1ZTtcbiAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPD0gZXhwVmFsdWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBleHBWYWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBleHByZXNzaW9uc01hdGNoICYmICFpbnZlcnNlIHx8ICFleHByZXNzaW9uc01hdGNoICYmIGludmVyc2U7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gX3BhcnNlUXVlcnkobWVkaWEpIHtcbiAgcmV0dXJuIG1lZGlhLnNwbGl0KCcsJykubWFwKGZ1bmN0aW9uIChxdWVyeSkge1xuICAgIHF1ZXJ5ID0gcXVlcnkudHJpbSgpO1xuXG4gICAgdmFyIGNhcHR1cmVzID0gcXVlcnkubWF0Y2goUkVfTUVESUFfUVVFUlkpO1xuXG4gICAgaWYgKCFjYXB0dXJlcykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIENTUyBtZWRpYSBxdWVyeTogXCInICsgcXVlcnkgKyAnXCInKTtcbiAgICB9XG5cbiAgICB2YXIgbW9kaWZpZXIgPSBjYXB0dXJlc1sxXSxcbiAgICAgICAgdHlwZSA9IGNhcHR1cmVzWzJdLFxuICAgICAgICBleHByZXNzaW9ucyA9ICgoY2FwdHVyZXNbM10gfHwgJycpICsgKGNhcHR1cmVzWzRdIHx8ICcnKSkudHJpbSgpLFxuICAgICAgICBwYXJzZWQgPSB7fTtcblxuICAgIHBhcnNlZC5pbnZlcnNlID0gISFtb2RpZmllciAmJiBtb2RpZmllci50b0xvd2VyQ2FzZSgpID09PSAnbm90JztcbiAgICBwYXJzZWQudHlwZSA9IHR5cGUgPyB0eXBlLnRvTG93ZXJDYXNlKCkgOiAnYWxsJztcblxuICAgIGlmICghZXhwcmVzc2lvbnMpIHtcbiAgICAgIHBhcnNlZC5leHByZXNzaW9ucyA9IFtdO1xuICAgICAgcmV0dXJuIHBhcnNlZDtcbiAgICB9XG5cbiAgICBleHByZXNzaW9ucyA9IGV4cHJlc3Npb25zLm1hdGNoKC9cXChbXlxcKV0rXFwpL2cpO1xuXG4gICAgaWYgKCFleHByZXNzaW9ucykge1xuICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIENTUyBtZWRpYSBxdWVyeTogXCInICsgcXVlcnkgKyAnXCInKTtcbiAgICB9XG5cbiAgICBwYXJzZWQuZXhwcmVzc2lvbnMgPSBleHByZXNzaW9ucy5tYXAoZnVuY3Rpb24gKGV4cHJlc3Npb24pIHtcbiAgICAgIHZhciBjYXB0dXJlcyA9IGV4cHJlc3Npb24ubWF0Y2goUkVfTVFfRVhQUkVTU0lPTik7XG5cbiAgICAgIGlmICghY2FwdHVyZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIENTUyBtZWRpYSBxdWVyeTogXCInICsgcXVlcnkgKyAnXCInKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZlYXR1cmUgPSBjYXB0dXJlc1sxXS50b0xvd2VyQ2FzZSgpLm1hdGNoKFJFX01RX0ZFQVRVUkUpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2RpZmllcjogZmVhdHVyZVsxXSxcbiAgICAgICAgZmVhdHVyZTogZmVhdHVyZVsyXSxcbiAgICAgICAgdmFsdWU6IGNhcHR1cmVzWzJdXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBtYXRjaE1lZGlhKG1lZGlhKSB7XG4gIHZhciBtcWwgPSB7XG4gICAgbWF0Y2hlczogZmFsc2UsXG4gICAgbWVkaWE6IG1lZGlhXG4gIH07XG5cbiAgaWYgKG1lZGlhID09PSAnJykge1xuICAgIG1xbC5tYXRjaGVzID0gdHJ1ZTtcbiAgICByZXR1cm4gbXFsO1xuICB9XG5cbiAgbXFsLm1hdGNoZXMgPSBfbWF0Y2hlcyhtZWRpYSwge1xuICAgIHR5cGU6ICdzY3JlZW4nLFxuICAgIHdpZHRoOiB3aW5kb3cuc2NyZWVuLndpZHRoLFxuICAgIGhlaWdodDogd2luZG93LnNjcmVlbi5oZWlnaHRcbiAgfSk7XG5cbiAgcmV0dXJuIG1xbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtYXRjaE1lZGlhO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSl9OztcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvZGVmaW5lLndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtb2R1bGVzKSB7XG4gIGZ1bmN0aW9uIGRlZmluZShuYW1lLCBkZXBzLCBmYWN0b3J5KSB7XG4gICAgaWYgKGRlcHMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgZmFjdG9yeSA9IGRlcHM7XG4gICAgICBkZXBzID0gW107XG4gICAgfVxuXG4gICAgbW9kdWxlc1tuYW1lXSA9IHtcbiAgICAgIGZhY3Rvcnk6IGZhY3RvcnksXG4gICAgICBkZXBzOiBkZXBzLFxuICAgICAgbW9kdWxlOiB7IGV4cG9ydHM6IHt9IH0sXG4gICAgICBpc0luaXRpYWxpemVkOiBmYWxzZSxcbiAgICAgIGhhc0Vycm9yOiBmYWxzZVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZGVmaW5lO1xufTtcblxuLyoqKi8gfSksXG4vKiA4ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL3JlcXVpcmUud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtb2R1bGVzKSB7XG4gIGZ1bmN0aW9uIHJlcXVpcmUobmFtZSkge1xuICAgIHZhciBtb2QgPSBtb2R1bGVzW25hbWVdO1xuXG4gICAgaWYgKG1vZCAmJiBtb2QuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuIG1vZC5tb2R1bGUuZXhwb3J0cztcbiAgICB9XG5cbiAgICBpZiAoIW1vZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJpbmcgdW5rbm93biBtb2R1bGUgXCInICsgbmFtZSArICdcIicpO1xuICAgIH1cblxuICAgIGlmIChtb2QuaGFzRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyaW5nIG1vZHVsZSBcIicgKyBuYW1lICsgJ1wiIHdoaWNoIHRocmV3IGFuIGV4Y2VwdGlvbicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBtb2QuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICBtb2QuZmFjdG9yeShyZXF1aXJlLCBtb2QubW9kdWxlLmV4cG9ydHMsIG1vZC5tb2R1bGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG1vZC5oYXNFcnJvciA9IHRydWU7XG4gICAgICBtb2QuaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbW9kLm1vZHVsZS5leHBvcnRzO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVpcmU7XG59O1xuXG4vKioqLyB9KSxcbi8qIDkgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9kb3duZ3JhZGUud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBfc2VtdmVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9zZW12ZXIgKi8gMTApO1xuXG52YXIgX3NlbXZlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zZW12ZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBub3JtYWxpemVWZXJzaW9uKHYpIHtcbiAgaWYgKHYgPT0gJyonKSB7XG4gICAgcmV0dXJuIHY7XG4gIH1cbiAgdiA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiAnJztcbiAgdmFyIHNwbGl0ID0gdi5zcGxpdCgnLicpO1xuICB2YXIgaSA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoaSA8IDMpIHtcbiAgICB2YXIgcyA9IHR5cGVvZiBzcGxpdFtpXSA9PT0gJ3N0cmluZycgJiYgc3BsaXRbaV0gPyBzcGxpdFtpXSA6ICcwJztcbiAgICByZXN1bHQucHVzaChzKTtcbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0LmpvaW4oJy4nKTtcbn0gLyogZ2xvYmFsIFdYRW52aXJvbm1lbnQgKi9cblxuZnVuY3Rpb24gZ2V0RXJyb3Ioa2V5LCB2YWwsIGNyaXRlcmlhKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgaXNEb3duZ3JhZGU6IHRydWUsXG4gICAgZXJyb3JUeXBlOiAxLFxuICAgIGNvZGU6IDEwMDBcbiAgfTtcbiAgdmFyIGdldE1zZyA9IGZ1bmN0aW9uIGdldE1zZyhrZXksIHZhbCwgY3JpdGVyaWEpIHtcbiAgICByZXR1cm4gJ0Rvd25ncmFkZVsnICsga2V5ICsgJ10gOjogZGV2aWNlSW5mbyAnICsgdmFsICsgJyBtYXRjaGVkIGNyaXRlcmlhICcgKyBjcml0ZXJpYTtcbiAgfTtcbiAgdmFyIF9rZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcblxuICBpZiAoX2tleS5pbmRleE9mKCdvc3ZlcnNpb24nKSA+PSAwKSB7XG4gICAgcmVzdWx0LmNvZGUgPSAxMDAxO1xuICB9IGVsc2UgaWYgKF9rZXkuaW5kZXhPZignYXBwdmVyc2lvbicpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDI7XG4gIH0gZWxzZSBpZiAoX2tleS5pbmRleE9mKCd3ZWV4dmVyc2lvbicpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDM7XG4gIH0gZWxzZSBpZiAoX2tleS5pbmRleE9mKCdkZXZpY2Vtb2RlbCcpID49IDApIHtcbiAgICByZXN1bHQuY29kZSA9IDEwMDQ7XG4gIH1cblxuICByZXN1bHQuZXJyb3JNZXNzYWdlID0gZ2V0TXNnKGtleSwgdmFsLCBjcml0ZXJpYSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogY29uZmlnXG4gKlxuICoge1xuICogICBpb3M6IHtcbiAqICAgICBvc1ZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIGFwcFZlcnNpb246ICc+MS4wLjAnIG9yICc+PTEuMC4wJyBvciAnPDEuMC4wJyBvciAnPD0xLjAuMCcgb3IgJzEuMC4wJ1xuICogICAgIHdlZXhWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBkZXZpY2VNb2RlbDogWydtb2RlbEEnLCAnbW9kZWxCJywgLi4uXVxuICogICB9LFxuICogICBhbmRyb2lkOiB7XG4gKiAgICAgb3NWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICBhcHBWZXJzaW9uOiAnPjEuMC4wJyBvciAnPj0xLjAuMCcgb3IgJzwxLjAuMCcgb3IgJzw9MS4wLjAnIG9yICcxLjAuMCdcbiAqICAgICB3ZWV4VmVyc2lvbjogJz4xLjAuMCcgb3IgJz49MS4wLjAnIG9yICc8MS4wLjAnIG9yICc8PTEuMC4wJyBvciAnMS4wLjAnXG4gKiAgICAgZGV2aWNlTW9kZWw6IFsnbW9kZWxBJywgJ21vZGVsQicsIC4uLl1cbiAqICAgfVxuICogfVxuICpcbiAqL1xuZnVuY3Rpb24gY2hlY2soY29uZmlnKSB7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgaXNEb3duZ3JhZGU6IGZhbHNlXG4gIH07XG5cbiAgdmFyIGRldmljZUluZm8gPSBXWEVudmlyb25tZW50O1xuXG4gIHZhciBwbGF0Zm9ybSA9IGRldmljZUluZm8ucGxhdGZvcm0gfHwgJ3Vua25vdyc7XG4gIHZhciBkUGxhdGZvcm0gPSBwbGF0Zm9ybS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgY09iaiA9IGNvbmZpZ1tkUGxhdGZvcm1dIHx8IHt9O1xuXG4gIGZvciAodmFyIGkgaW4gZGV2aWNlSW5mbykge1xuICAgIHZhciBrZXkgPSBpO1xuICAgIHZhciBrZXlMb3dlciA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciB2YWwgPSBkZXZpY2VJbmZvW2ldO1xuICAgIHZhciBpc1ZlcnNpb24gPSBrZXlMb3dlci5pbmRleE9mKCd2ZXJzaW9uJykgPj0gMDtcbiAgICB2YXIgaXNEZXZpY2VNb2RlbCA9IGtleUxvd2VyLmluZGV4T2YoJ2RldmljZW1vZGVsJykgPj0gMDtcbiAgICB2YXIgY3JpdGVyaWEgPSBjT2JqW2ldO1xuXG4gICAgaWYgKGNyaXRlcmlhICYmIGlzVmVyc2lvbikge1xuICAgICAgdmFyIGMgPSBub3JtYWxpemVWZXJzaW9uKGNyaXRlcmlhKTtcbiAgICAgIHZhciBkID0gbm9ybWFsaXplVmVyc2lvbihkZXZpY2VJbmZvW2ldKTtcblxuICAgICAgaWYgKF9zZW12ZXIyLmRlZmF1bHQuc2F0aXNmaWVzKGQsIGMpKSB7XG4gICAgICAgIHJlc3VsdCA9IGdldEVycm9yKGtleSwgdmFsLCBjcml0ZXJpYSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNEZXZpY2VNb2RlbCkge1xuICAgICAgdmFyIF9jcml0ZXJpYSA9IEFycmF5LmlzQXJyYXkoY3JpdGVyaWEpID8gY3JpdGVyaWEgOiBbY3JpdGVyaWFdO1xuXG4gICAgICBpZiAoX2NyaXRlcmlhLmluZGV4T2YodmFsKSA+PSAwKSB7XG4gICAgICAgIHJlc3VsdCA9IGdldEVycm9yKGtleSwgdmFsLCBjcml0ZXJpYSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKF9fd2VleF9yZXF1aXJlX18pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICB2YXIgbmF0aXZlSW5zdGFuY2VXcmFwID0gX193ZWV4X3JlcXVpcmVfXygnQHdlZXgtbW9kdWxlL2luc3RhbmNlV3JhcCcpO1xuICAgIHZhciByZXN1bHQgPSBjaGVjayhjb25maWcpO1xuICAgIGlmIChyZXN1bHQuaXNEb3duZ3JhZGUpIHtcbiAgICAgIG5hdGl2ZUluc3RhbmNlV3JhcC5lcnJvcihyZXN1bHQuZXJyb3JUeXBlLCByZXN1bHQuY29kZSwgcmVzdWx0LmVycm9yTWVzc2FnZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufTtcblxuLyoqKi8gfSksXG4vKiAxMCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9zZW12ZXIuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHNhdGlzZmllczogZnVuY3Rpb24gc2F0aXNmaWVzKGxlZnQsIHJpZ2h0KSB7XG4gICAgdmFyIHJlZ2V4ID0gLyhcXFcrKT8oW1xcZHwuXSspLztcblxuICAgIGlmICgodHlwZW9mIGxlZnQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGxlZnQpKSArICh0eXBlb2YgcmlnaHQgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHJpZ2h0KSkgIT0gJ3N0cmluZ3N0cmluZycpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChyaWdodCA9PSAnKicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBhcnIgPSByaWdodC5tYXRjaChyZWdleCk7XG4gICAgdmFyIGEgPSBsZWZ0LnNwbGl0KCcuJyksXG4gICAgICAgIGkgPSAwLFxuICAgICAgICBiID0gYXJyWzJdLnNwbGl0KCcuJyksXG4gICAgICAgIGxlbiA9IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7XG5cbiAgICB2YXIgZmxhZyA9IDA7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGxlbjsgX2krKykge1xuICAgICAgaWYgKGFbX2ldICYmICFiW19pXSAmJiBwYXJzZUludChhW19pXSkgPiAwIHx8IHBhcnNlSW50KGFbX2ldKSA+IHBhcnNlSW50KGJbX2ldKSkge1xuICAgICAgICBmbGFnID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2UgaWYgKGJbX2ldICYmICFhW19pXSAmJiBwYXJzZUludChiW19pXSkgPiAwIHx8IHBhcnNlSW50KGFbX2ldKSA8IHBhcnNlSW50KGJbX2ldKSkge1xuICAgICAgICBmbGFnID0gLTE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoYXJyWzFdKSB7XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgaWYgKGZsYWcgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc8PSc6XG4gICAgICAgIGlmIChmbGFnICE9PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc+JzpcbiAgICAgICAgaWYgKGZsYWcgPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJz49JzpcbiAgICAgICAgaWYgKGZsYWcgIT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoZmxhZyA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblxuLyoqKi8gfSksXG4vKiAxMSAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvZG9jdW1lbnQud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9lbWl0dGVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygvKiEgLi9lbWl0dGVyICovIDEpO1xuXG52YXIgX2VtaXR0ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW1pdHRlcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBET01fTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS9kb20nO1xudmFyIFZJU0lCTEUgPSAndmlzaWJsZSc7XG52YXIgSElEREVOID0gJ2hpZGRlbic7XG52YXIgVklTSUJJTElUWV9DSEFOR0VfRVZFTlQgPSAndmlzaWJpbGl0eWNoYW5nZSc7XG5cbmZ1bmN0aW9uIGFkZEJvZHlBcHBlYXJMaXN0ZW5lcihkb2N1bWVudCkge1xuICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50KCd2aWV3YXBwZWFyJywgZnVuY3Rpb24gKGUpIHtcbiAgICBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPSBWSVNJQkxFO1xuICAgIGUudHlwZSA9IFZJU0lCSUxJVFlfQ0hBTkdFX0VWRU5UO1xuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmJvZHkuYWRkRXZlbnQoJ3ZpZXdkaXNhcHBlYXInLCBmdW5jdGlvbiAoZSkge1xuICAgIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9IEhJRERFTjtcbiAgICBlLnR5cGUgPSBWSVNJQklMSVRZX0NIQU5HRV9FVkVOVDtcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQm9keUFwcGVhckxpc3RlbmVyKGRvY3VtZW50KSB7XG4gIGlmIChkb2N1bWVudC5ib2R5KSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudCgndmlld2FwcGVhcicpO1xuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnQoJ3ZpZXdkaXNhcHBlYXInKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudCkge1xuICAvLyBBZGQgdzNjIGV2ZW50c1xuICB2YXIgZG9jdW1lbnRFbWl0dGVyID0gbmV3IF9lbWl0dGVyMi5kZWZhdWx0KCk7XG4gIHZhciBoYXNWaXNpYmlsaXR5RXZlbnRQZW5kaW5nID0gZmFsc2U7XG5cbiAgLy8gV2VleCBmcmVlemVkIHRoZSBkb2N1bWVudCBtYXliZSB0aHJvdyBlcnJvclxuICB0cnkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGlmICh0eXBlID09PSBWSVNJQklMSVRZX0NIQU5HRV9FVkVOVCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgIGFkZEJvZHlBcHBlYXJMaXN0ZW5lcihkb2N1bWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzVmlzaWJpbGl0eUV2ZW50UGVuZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvY3VtZW50RW1pdHRlci5vbih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgIGlmICh0eXBlID09PSBWSVNJQklMSVRZX0NIQU5HRV9FVkVOVCkge1xuICAgICAgICByZW1vdmVCb2R5QXBwZWFyTGlzdGVuZXIoZG9jdW1lbnQpO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnRFbWl0dGVyLm9mZih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgZG9jdW1lbnRFbWl0dGVyLmVtaXQoZS50eXBlLCBlKTtcbiAgICB9O1xuXG4gICAgLy8gRm9udEZhY2VcbiAgICBkb2N1bWVudC5mb250cyA9IHtcbiAgICAgIGFkZDogZnVuY3Rpb24gYWRkKGZvbnRGYWNlKSB7XG4gICAgICAgIHZhciBkb21Nb2R1bGUgPSBfX3dlZXhfcmVxdWlyZV9fKERPTV9NT0RVTEUpO1xuICAgICAgICBkb21Nb2R1bGUuYWRkUnVsZSgnZm9udEZhY2UnLCB7XG4gICAgICAgICAgZm9udEZhbWlseTogZm9udEZhY2UuZmFtaWx5LFxuICAgICAgICAgIHNyYzogZm9udEZhY2Uuc291cmNlIC8vIHVybCgndXJpJykgOiBzaW5nbGUgcXVvdGVzIGFyZSByZXF1aXJlZCBhcm91bmQgdXJpLCBhbmQgZG91YmxlIHF1b3RlcyBjYW4gbm90IHdvcmsgaW4gd2VleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdCB2aXNpYmlsaXR5IHN0YXRlXG4gICAgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID0gVklTSUJMRTtcblxuICAgIC8vIEhpamFjayB0aGUgb3JpZ2luIGNyZWF0ZUJvZHlcbiAgICB2YXIgb3JpZ2luQ3JlYXRlQm9keSA9IGRvY3VtZW50LmNyZWF0ZUJvZHk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZG9jdW1lbnQsICdjcmVhdGVCb2R5Jywge1xuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHZhbHVlKCkge1xuICAgICAgICB2YXIgYm9keSA9IG9yaWdpbkNyZWF0ZUJvZHkuYXBwbHkoZG9jdW1lbnQsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgaWYgKGhhc1Zpc2liaWxpdHlFdmVudFBlbmRpbmcpIHtcbiAgICAgICAgICBhZGRCb2R5QXBwZWFyTGlzdGVuZXIoZG9jdW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBib2R5O1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gIH1cblxuICByZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG4vKioqLyB9KSxcbi8qIDEyICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9sb2NhdGlvbi53ZWV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgTE9DQVRJT05fTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS9sb2NhdGlvbic7XG52YXIgTkFWSUdBVE9SX01PRFVMRSA9ICdAd2VleC1tb2R1bGUvbmF2aWdhdG9yJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoX193ZWV4X3JlcXVpcmVfXywgbG9jYXRpb24pIHtcbiAgbG9jYXRpb24uYXNzaWduID0gZnVuY3Rpb24gKHVybCkge1xuICAgIHZhciB3ZWV4TmF2aWdhdG9yID0gX193ZWV4X3JlcXVpcmVfXyhOQVZJR0FUT1JfTU9EVUxFKTtcbiAgICB3ZWV4TmF2aWdhdG9yLnB1c2goe1xuICAgICAgdXJsOiB1cmwsXG4gICAgICBhbmltYXRlZDogJ3RydWUnXG4gICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9KTtcbiAgfTtcblxuICBsb2NhdGlvbi5yZXBsYWNlID0gZnVuY3Rpb24gKHVybCkge1xuICAgIHZhciB3ZWV4TG9jYXRpb24gPSBfX3dlZXhfcmVxdWlyZV9fKExPQ0FUSU9OX01PRFVMRSk7XG4gICAgd2VleExvY2F0aW9uLnJlcGxhY2UodXJsKTtcbiAgfTtcblxuICBsb2NhdGlvbi5yZWxvYWQgPSBmdW5jdGlvbiAoZm9yY2VSZWxvYWQpIHtcbiAgICB2YXIgd2VleExvY2F0aW9uID0gX193ZWV4X3JlcXVpcmVfXyhMT0NBVElPTl9NT0RVTEUpO1xuICAgIHdlZXhMb2NhdGlvbi5yZWxvYWQoZm9yY2VSZWxvYWQpO1xuICB9O1xuXG4gIHJldHVybiBsb2NhdGlvbjtcbn07XG5cbi8qKiovIH0pLFxuLyogMTMgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohKlxcXG4gICEqKiogLi9wYWNrYWdlcy93ZWV4LXJheC1mcmFtZXdvcmsvc3JjL2ZldGNoLndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBTVFJFQU1fTU9EVUxFID0gJ0B3ZWV4LW1vZHVsZS9zdHJlYW0nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfX3dlZXhfcmVxdWlyZV9fLCBQcm9taXNlKSB7XG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUobmFtZSkge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgfVxuICAgIC8vIEZJWE1FOiBJbiBzcGR5IHRoZSByZXNwb25zZSBoZWFkZXIgaGFzIG5hbWUgbGlrZSBcIjp2ZXJzaW9uXCIgdGhhdCBpcyBpbnZhbGlkXG4gICAgLy8gaWYgKC9bXmEtejAtOVxcLSMkJSYnKisuXFxeX2B8fl0vaS50ZXN0KG5hbWUpKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZScpO1xuICAgIC8vIH1cbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICB0aGlzLm9yaWdpbkhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIHRoaXMubWFwID0ge307XG5cbiAgICBpZiAoaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIG5hbWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKG5hbWUsIGhlYWRlcnNbbmFtZV0pO1xuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IG5vcm1hbGl6ZU5hbWUobmFtZSk7XG4gICAgdmFsdWUgPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV07XG4gICAgdGhpcy5tYXBbbmFtZV0gPSBvbGRWYWx1ZSA/IG9sZFZhbHVlICsgJywnICsgdmFsdWUgOiB2YWx1ZTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIG5hbWUgPSBub3JtYWxpemVOYW1lKG5hbWUpO1xuICAgIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbDtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKTtcbiAgfTtcblxuICBIZWFkZXJzLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IFtub3JtYWxpemVWYWx1ZSh2YWx1ZSldO1xuICB9O1xuXG4gIEhlYWRlcnMucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHRoaXNBcmcpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMubWFwKSB7XG4gICAgICBpZiAodGhpcy5tYXAuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbCh0aGlzQXJnLCB0aGlzLm1hcFtuYW1lXSwgbmFtZSwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIGNvbnN1bWVkKGJvZHkpIHtcbiAgICBpZiAoYm9keS5ib2R5VXNlZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpKTtcbiAgICB9XG4gICAgYm9keS5ib2R5VXNlZCA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBCb2R5KCkge1xuICAgIHRoaXMuYm9keVVzZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuX2luaXRCb2R5ID0gZnVuY3Rpb24gKGJvZHksIG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keTtcbiAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5fYm9keVRleHQgPSBib2R5O1xuICAgICAgfSBlbHNlIGlmICghYm9keSkge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCBCb2R5SW5pdCB0eXBlJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMudGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciByZWplY3RlZCA9IGNvbnN1bWVkKHRoaXMpO1xuICAgICAgcmV0dXJuIHJlamVjdGVkID8gcmVqZWN0ZWQgOiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpO1xuICAgIH07XG5cbiAgICB0aGlzLmpzb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBIVFRQIG1ldGhvZHMgd2hvc2UgY2FwaXRhbGl6YXRpb24gc2hvdWxkIGJlIG5vcm1hbGl6ZWRcbiAgdmFyIG1ldGhvZHMgPSBbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJywgJ1BPU1QnLCAnUFVUJ107XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplTWV0aG9kKG1ldGhvZCkge1xuICAgIHZhciB1cGNhc2VkID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgcmV0dXJuIG1ldGhvZHMuaW5kZXhPZih1cGNhc2VkKSA+IC0xID8gdXBjYXNlZCA6IG1ldGhvZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIFJlcXVlc3QoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keTtcbiAgICBpZiAoUmVxdWVzdC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihpbnB1dCkpIHtcbiAgICAgIGlmIChpbnB1dC5ib2R5VXNlZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHJlYWR5IHJlYWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXJsID0gaW5wdXQudXJsO1xuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgaWYgKCFvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5wdXQuaGVhZGVycyk7XG4gICAgICB9XG4gICAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZDtcbiAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICBpZiAoIWJvZHkpIHtcbiAgICAgICAgYm9keSA9IGlucHV0Ll9ib2R5SW5pdDtcbiAgICAgICAgaW5wdXQuYm9keVVzZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVybCA9IGlucHV0O1xuICAgIH1cblxuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMgfHwgJ29taXQnO1xuICAgIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKTtcbiAgICB9XG4gICAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2Qob3B0aW9ucy5tZXRob2QgfHwgdGhpcy5tZXRob2QgfHwgJ0dFVCcpO1xuICAgIHRoaXMubW9kZSA9IG9wdGlvbnMubW9kZSB8fCB0aGlzLm1vZGUgfHwgbnVsbDtcbiAgICB0aGlzLnJlZmVycmVyID0gbnVsbDtcblxuICAgIGlmICgodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpICYmIGJvZHkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzJyk7XG4gICAgfVxuICAgIHRoaXMuX2luaXRCb2R5KGJvZHksIG9wdGlvbnMpO1xuICB9XG5cbiAgUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0KHRoaXMpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGhlYWRlcnMoeGhyKSB7XG4gICAgdmFyIGhlYWQgPSBuZXcgSGVhZGVycygpO1xuICAgIHZhciBwYWlycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS50cmltKCkuc3BsaXQoJ1xcbicpO1xuICAgIHBhaXJzLmZvckVhY2goZnVuY3Rpb24gKGhlYWRlcikge1xuICAgICAgdmFyIHNwbGl0ID0gaGVhZGVyLnRyaW0oKS5zcGxpdCgnOicpO1xuICAgICAgdmFyIGtleSA9IHNwbGl0LnNoaWZ0KCkudHJpbSgpO1xuICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignOicpLnRyaW0oKTtcbiAgICAgIGhlYWQuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBoZWFkO1xuICB9XG5cbiAgQm9keS5jYWxsKFJlcXVlc3QucHJvdG90eXBlKTtcblxuICBmdW5jdGlvbiBSZXNwb25zZShib2R5SW5pdCwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0JztcbiAgICB0aGlzLnN0YXR1cyA9ICdzdGF0dXMnIGluIG9wdGlvbnMgPyBvcHRpb25zLnN0YXR1cyA6IDIwMDtcbiAgICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICdzdGF0dXNUZXh0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5zdGF0dXNUZXh0IDogJ09LJztcbiAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpO1xuICAgIHRoaXMudXJsID0gb3B0aW9ucy51cmwgfHwgJyc7XG4gICAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQsIG9wdGlvbnMpO1xuICB9XG5cbiAgQm9keS5jYWxsKFJlc3BvbnNlLnByb3RvdHlwZSk7XG5cbiAgUmVzcG9uc2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgdXJsOiB0aGlzLnVybFxuICAgIH0pO1xuICB9O1xuXG4gIFJlc3BvbnNlLmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogMCwgc3RhdHVzVGV4dDogJycgfSk7XG4gICAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcic7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9O1xuXG4gIHZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XTtcblxuICBSZXNwb25zZS5yZWRpcmVjdCA9IGZ1bmN0aW9uICh1cmwsIHN0YXR1cykge1xuICAgIGlmIChyZWRpcmVjdFN0YXR1c2VzLmluZGV4T2Yoc3RhdHVzKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhbGlkIHN0YXR1cyBjb2RlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogc3RhdHVzLCBoZWFkZXJzOiB7IGxvY2F0aW9uOiB1cmwgfSB9KTtcbiAgfTtcblxuICB2YXIgZmV0Y2ggPSBmdW5jdGlvbiBmZXRjaChpbnB1dCwgaW5pdCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVxdWVzdDtcbiAgICAgIGlmIChSZXF1ZXN0LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGlucHV0KSAmJiAhaW5pdCkge1xuICAgICAgICByZXF1ZXN0ID0gaW5wdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoaW5wdXQsIGluaXQpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMgJiYgcmVxdWVzdC5oZWFkZXJzLm9yaWdpbkhlYWRlcnNcbiAgICAgIH07XG5cbiAgICAgIGlmICh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHBhcmFtcy5ib2R5ID0gcmVxdWVzdC5fYm9keUluaXQ7XG4gICAgICB9XG5cbiAgICAgIHBhcmFtcy50eXBlID0gaW5pdCAmJiBpbml0LmRhdGFUeXBlID8gaW5pdC5kYXRhVHlwZSA6ICd0ZXh0JztcblxuICAgICAgdmFyIG5hdGl2ZUZldGNoID0gX193ZWV4X3JlcXVpcmVfXyhTVFJFQU1fTU9EVUxFKS5mZXRjaDtcbiAgICAgIG5hdGl2ZUZldGNoKHBhcmFtcywgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyAmJiAocmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKSk7XG4gICAgICAgICAgdmFyIGRhdGEgPSB0eXBlb2YgcmVzcG9uc2UuZGF0YSA9PT0gJ3N0cmluZycgPyByZXNwb25zZS5kYXRhIDogSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZGF0YSk7XG5cbiAgICAgICAgICB2YXIgcmVzID0gbmV3IFJlc3BvbnNlKGRhdGEsIHtcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKHByb2dyZXNzKSB7fSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBmZXRjaDogZmV0Y2gsXG4gICAgSGVhZGVyczogSGVhZGVycyxcbiAgICBSZXF1ZXN0OiBSZXF1ZXN0LFxuICAgIFJlc3BvbnNlOiBSZXNwb25zZVxuICB9O1xufTtcblxuLyoqKi8gfSksXG4vKiAxNCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMveG1saHR0cHJlcXVlc3Qud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgU1RSRUFNX01PRFVMRSA9ICdAd2VleC1tb2R1bGUvc3RyZWFtJztcbnZhciBldmVudFRhcmdldCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGV2ZW50LXRhcmdldC1zaGltICovIDIpO1xuXG52YXIgVU5TRU5UID0gMDtcbnZhciBPUEVORUQgPSAxO1xudmFyIEhFQURFUlNfUkVDRUlWRUQgPSAyO1xudmFyIExPQURJTkcgPSAzO1xudmFyIERPTkUgPSA0O1xuXG52YXIgWEhSX0VWRU5UUyA9IFsnYWJvcnQnLCAnZXJyb3InLCAnbG9hZCcsICdsb2Fkc3RhcnQnLCAncHJvZ3Jlc3MnLCAndGltZW91dCcsICdsb2FkZW5kJywgJ3JlYWR5c3RhdGVjaGFuZ2UnXTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoX193ZWV4X3JlcXVpcmVfXykge1xuICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICB2YXIgWE1MSHR0cFJlcXVlc3QgPSAoX3RlbXAgPSBfY2xhc3MgPSBmdW5jdGlvbiAoX2V2ZW50VGFyZ2V0KSB7XG4gICAgX2luaGVyaXRzKFhNTEh0dHBSZXF1ZXN0LCBfZXZlbnRUYXJnZXQpO1xuXG4gICAgLy8gRXZlbnRUYXJnZXQgYXV0b21hdGljYWxseSBpbml0aWFsaXplcyB0aGVzZSB0byBgbnVsbGAuXG4gICAgZnVuY3Rpb24gWE1MSHR0cFJlcXVlc3QoKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgWE1MSHR0cFJlcXVlc3QpO1xuXG4gICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoWE1MSHR0cFJlcXVlc3QuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihYTUxIdHRwUmVxdWVzdCkpLmNhbGwodGhpcykpO1xuXG4gICAgICBfdGhpcy5VTlNFTlQgPSBVTlNFTlQ7XG4gICAgICBfdGhpcy5PUEVORUQgPSBPUEVORUQ7XG4gICAgICBfdGhpcy5IRUFERVJTX1JFQ0VJVkVEID0gSEVBREVSU19SRUNFSVZFRDtcbiAgICAgIF90aGlzLkxPQURJTkcgPSBMT0FESU5HO1xuICAgICAgX3RoaXMuRE9ORSA9IERPTkU7XG4gICAgICBfdGhpcy5yZWFkeVN0YXRlID0gVU5TRU5UO1xuICAgICAgX3RoaXMuc3RhdHVzID0gMDtcbiAgICAgIF90aGlzLnN0YXR1c1RleHQgPSAnJztcbiAgICAgIF90aGlzLnRpbWVvdXQgPSAwO1xuICAgICAgX3RoaXMuX2Fib3J0ZWQgPSBmYWxzZTtcbiAgICAgIF90aGlzLl9oYXNFcnJvciA9IGZhbHNlO1xuICAgICAgX3RoaXMuX21ldGhvZCA9IG51bGw7XG4gICAgICBfdGhpcy5fcmVzcG9uc2UgPSAnJztcbiAgICAgIF90aGlzLl91cmwgPSBudWxsO1xuICAgICAgX3RoaXMuX3RpbWVkT3V0ID0gZmFsc2U7XG5cbiAgICAgIF90aGlzLl9yZXNldCgpO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhYTUxIdHRwUmVxdWVzdCwgW3tcbiAgICAgIGtleTogJ19yZXNldCcsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gX3Jlc2V0KCkge1xuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSB0aGlzLlVOU0VOVDtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gMDtcblxuICAgICAgICB0aGlzLl9oYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9oZWFkZXJzID0ge307XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlID0gJyc7XG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9ICcnO1xuICAgICAgICB0aGlzLl9zZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xvd2VyQ2FzZVJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMuX3RpbWVkT3V0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRBbGxSZXNwb25zZUhlYWRlcnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZXNwb25zZUhlYWRlcnMpIHtcbiAgICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHJldHVybiBudWxsIGlmIG5vIHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGhlYWRlcnMgPSB0aGlzLnJlc3BvbnNlSGVhZGVycyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGhlYWRlcnMpLm1hcChmdW5jdGlvbiAoaGVhZGVyTmFtZSkge1xuICAgICAgICAgIHJldHVybiBoZWFkZXJOYW1lICsgJzogJyArIGhlYWRlcnNbaGVhZGVyTmFtZV07XG4gICAgICAgIH0pLmpvaW4oJ1xcclxcbicpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2dldFJlc3BvbnNlSGVhZGVyJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gdGhpcy5fbG93ZXJDYXNlUmVzcG9uc2VIZWFkZXJzW2hlYWRlci50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IG51bGw7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnc2V0UmVxdWVzdEhlYWRlcicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgIT09IHRoaXMuT1BFTkVEKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1ZXN0IGhhcyBub3QgYmVlbiBvcGVuZWQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkZXJzW2hlYWRlci50b0xvd2VyQ2FzZSgpXSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnb3BlbicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb3BlbihtZXRob2QsIHVybCwgYXN5bmMpIHtcbiAgICAgICAgLyogT3RoZXIgb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCAqL1xuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSB0aGlzLlVOU0VOVCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG9wZW4sIGFscmVhZHkgc2VuZGluZycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc3luYyAhPT0gdW5kZWZpbmVkICYmICFhc3luYykge1xuICAgICAgICAgIC8vIGFzeW5jIGlzIGRlZmF1bHRcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N5bmNocm9ub3VzIGh0dHAgcmVxdWVzdHMgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxvYWQgYW4gZW1wdHkgdXJsJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWV0aG9kID0gbWV0aG9kLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIHRoaXMuX3VybCA9IHVybDtcbiAgICAgICAgdGhpcy5fYWJvcnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldFJlYWR5U3RhdGUodGhpcy5PUEVORUQpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3NlbmQnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmQoZGF0YSkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSB0aGlzLk9QRU5FRCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWVzdCBoYXMgbm90IGJlZW4gb3BlbmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NlbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVlc3QgaGFzIGFscmVhZHkgYmVlbiBzZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VudCA9IHRydWU7XG5cbiAgICAgICAgdmFyIG5hdGl2ZUZldGNoID0gX193ZWV4X3JlcXVpcmVfXyhTVFJFQU1fTU9EVUxFKS5mZXRjaDtcblxuICAgICAgICBuYXRpdmVGZXRjaCh7XG4gICAgICAgICAgbWV0aG9kOiB0aGlzLl9tZXRob2QsXG4gICAgICAgICAgdXJsOiB0aGlzLl91cmwsXG4gICAgICAgICAgaGVhZGVyczogdGhpcy5faGVhZGVycyxcbiAgICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICAgIHR5cGU6ICd0ZXh0J1xuICAgICAgICB9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHlwZW9mIHJlc3BvbnNlID09PSAnc3RyaW5nJyAmJiAocmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKSk7XG5cbiAgICAgICAgICAgIF90aGlzMi5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICBfdGhpczIuc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgICAgICBfdGhpczIuc2V0UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAgICAgX3RoaXMyLl9yZXNwb25zZSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoX3RoaXMyLl9yZXNwb25zZVR5cGUgPT09ICcnIHx8IF90aGlzMi5fcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICBfdGhpczIuX3Jlc3BvbnNlID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfdGhpczIuX2hhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG5cbiAgICAgICAgICBfdGhpczIuc2V0UmVhZHlTdGF0ZShfdGhpczIuRE9ORSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChwcm9ncmVzcykge1xuICAgICAgICAgIF90aGlzMi5zdGF0dXMgPSBwcm9ncmVzcy5zdGF0dXM7XG4gICAgICAgICAgX3RoaXMyLnN0YXR1c1RleHQgPSBwcm9ncmVzcy5zdGF0dXNUZXh0O1xuICAgICAgICAgIF90aGlzMi5zZXRSZXNwb25zZUhlYWRlcnMocHJvZ3Jlc3MuaGVhZGVycyk7XG4gICAgICAgICAgX3RoaXMyLnNldFJlYWR5U3RhdGUocHJvZ3Jlc3MucmVhZHlTdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2Fib3J0JyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5fYWJvcnRlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gVE9ETzogV2VleCBuYXRpdmUgbm90IHN1cHBvcnQgYWJvcnQgbm93XG5cbiAgICAgICAgLy8gb25seSBjYWxsIG9ucmVhZHlzdGF0ZWNoYW5nZSBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gYWJvcnQsXG4gICAgICAgIC8vIGJlbG93IGxvZ2ljIGlzIHBlciBzcGVjXG4gICAgICAgIGlmICghKHRoaXMucmVhZHlTdGF0ZSA9PT0gdGhpcy5VTlNFTlQgfHwgdGhpcy5yZWFkeVN0YXRlID09PSB0aGlzLk9QRU5FRCAmJiAhdGhpcy5fc2VudCB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IHRoaXMuRE9ORSkpIHtcbiAgICAgICAgICB0aGlzLl9yZXNldCgpO1xuICAgICAgICAgIHRoaXMuc2V0UmVhZHlTdGF0ZSh0aGlzLkRPTkUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc2V0IGFnYWluIGFmdGVyLCBpbiBjYXNlIG1vZGlmaWVkIGluIGhhbmRsZXJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdzZXRSZXNwb25zZUhlYWRlcnMnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNldFJlc3BvbnNlSGVhZGVycyhyZXNwb25zZUhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZUhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwgbnVsbDtcbiAgICAgICAgdmFyIGhlYWRlcnMgPSByZXNwb25zZUhlYWRlcnMgfHwge307XG4gICAgICAgIHRoaXMuX2xvd2VyQ2FzZVJlc3BvbnNlSGVhZGVycyA9IE9iamVjdC5rZXlzKGhlYWRlcnMpLnJlZHVjZShmdW5jdGlvbiAobGNhc2VIZWFkZXJzLCBoZWFkZXJOYW1lKSB7XG4gICAgICAgICAgbGNhc2VIZWFkZXJzW2hlYWRlck5hbWUudG9Mb3dlckNhc2UoKV0gPSBoZWFkZXJzW2hlYWRlck5hbWVdO1xuICAgICAgICAgIHJldHVybiBsY2FzZUhlYWRlcnM7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdzZXRSZWFkeVN0YXRlJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSZWFkeVN0YXRlKG5ld1N0YXRlKSB7XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoeyB0eXBlOiAncmVhZHlzdGF0ZWNoYW5nZScgfSk7XG4gICAgICAgIGlmIChuZXdTdGF0ZSA9PT0gdGhpcy5ET05FKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2Fib3J0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdhYm9ydCcgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oYXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWVkT3V0KSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICd0aW1lb3V0JyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdlcnJvcicgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdsb2FkJyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHsgdHlwZTogJ2xvYWRlbmQnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAncmVzcG9uc2VUeXBlJyxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2VUeXBlO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gc2V0KHJlc3BvbnNlVHlwZSkge1xuICAgICAgICBpZiAodGhpcy5fc2VudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNldCB0aGUgXFwncmVzcG9uc2VUeXBlXFwnIHByb3BlcnR5IG9uIFxcJ1hNTEh0dHBSZXF1ZXN0XFwnOiBUaGUgJyArICdyZXNwb25zZSB0eXBlIGNhbm5vdCBiZSBzZXQgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc2VudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdyZXNwb25zZVRleHQnLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZXNwb25zZVR5cGUgIT09ICcnICYmIHRoaXMuX3Jlc3BvbnNlVHlwZSAhPT0gJ3RleHQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlICdyZXNwb25zZVRleHQnIHByb3BlcnR5IGlzIG9ubHkgYXZhaWxhYmxlIGlmICdyZXNwb25zZVR5cGUnIFwiICsgKCdpcyBzZXQgdG8gXFwnXFwnIG9yIFxcJ3RleHRcXCcsIGJ1dCBpdCBpcyBcXCcnICsgdGhpcy5fcmVzcG9uc2VUeXBlICsgJ1xcJy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA8IExPQURJTkcpIHtcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3Jlc3BvbnNlJyxcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICB2YXIgcmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGU7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkeVN0YXRlIDwgTE9BRElORyB8fCB0aGlzLl9oYXNFcnJvciA/ICcnIDogdGhpcy5fcmVzcG9uc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlICE9PSBET05FKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gWE1MSHR0cFJlcXVlc3Q7XG4gIH0oZXZlbnRUYXJnZXQuYXBwbHkodW5kZWZpbmVkLCBYSFJfRVZFTlRTKSksIF9jbGFzcy5VTlNFTlQgPSBVTlNFTlQsIF9jbGFzcy5PUEVORUQgPSBPUEVORUQsIF9jbGFzcy5IRUFERVJTX1JFQ0VJVkVEID0gSEVBREVSU19SRUNFSVZFRCwgX2NsYXNzLkxPQURJTkcgPSBMT0FESU5HLCBfY2xhc3MuRE9ORSA9IERPTkUsIF90ZW1wKTtcblxuXG4gIHJldHVybiBYTUxIdHRwUmVxdWVzdDtcbn07XG5cbi8qKiovIH0pLFxuLyogMTUgKi9cbi8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL25vZGVfbW9kdWxlcy9ldmVudC10YXJnZXQtc2hpbS9saWIvY3VzdG9tLWV2ZW50LXRhcmdldC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKiEgbm8gc3RhdGljIGV4cG9ydHMgZm91bmQgKi9cbi8qISBhbGwgZXhwb3J0cyB1c2VkICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiBAYXV0aG9yIFRvcnUgTmFnYXNoaW1hXG4gKiBAY29weXJpZ2h0IDIwMTUgVG9ydSBOYWdhc2hpbWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBTZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZGlyZWN0b3J5IGZvciBmdWxsIGxpY2Vuc2UuXG4gKi9cblxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXF1aXJlbWVudHNcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIENvbW1vbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2NvbW1vbnMgKi8gMClcbnZhciBMSVNURU5FUlMgPSBDb21tb25zLkxJU1RFTkVSU1xudmFyIEFUVFJJQlVURSA9IENvbW1vbnMuQVRUUklCVVRFXG52YXIgbmV3Tm9kZSA9IENvbW1vbnMubmV3Tm9kZVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogR2V0cyBhIHNwZWNpZmllZCBhdHRyaWJ1dGUgbGlzdGVuZXIgZnJvbSBhIGdpdmVuIEV2ZW50VGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCAtIEFuIEV2ZW50VGFyZ2V0IG9iamVjdCB0byBnZXQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEFuIGV2ZW50IHR5cGUgdG8gZ2V0LlxuICogQHJldHVybnMge2Z1bmN0aW9ufG51bGx9IFRoZSBmb3VuZCBhdHRyaWJ1dGUgbGlzdGVuZXIuXG4gKi9cbmZ1bmN0aW9uIGdldEF0dHJpYnV0ZUxpc3RlbmVyKGV2ZW50VGFyZ2V0LCB0eXBlKSB7XG4gICAgdmFyIG5vZGUgPSBldmVudFRhcmdldFtMSVNURU5FUlNdW3R5cGVdXG4gICAgd2hpbGUgKG5vZGUgIT0gbnVsbCkge1xuICAgICAgICBpZiAobm9kZS5raW5kID09PSBBVFRSSUJVVEUpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmxpc3RlbmVyXG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dFxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIFNldHMgYSBzcGVjaWZpZWQgYXR0cmlidXRlIGxpc3RlbmVyIHRvIGEgZ2l2ZW4gRXZlbnRUYXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGV2ZW50VGFyZ2V0IC0gQW4gRXZlbnRUYXJnZXQgb2JqZWN0IHRvIHNldC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIC0gQW4gZXZlbnQgdHlwZSB0byBzZXQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufG51bGx9IGxpc3RlbmVyIC0gQSBsaXN0ZW5lciB0byBiZSBzZXQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gc2V0QXR0cmlidXRlTGlzdGVuZXIoZXZlbnRUYXJnZXQsIHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBsaXN0ZW5lciAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICBsaXN0ZW5lciA9IG51bGwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIH1cblxuICAgIHZhciBwcmV2ID0gbnVsbFxuICAgIHZhciBub2RlID0gZXZlbnRUYXJnZXRbTElTVEVORVJTXVt0eXBlXVxuICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUua2luZCA9PT0gQVRUUklCVVRFKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgb2xkIHZhbHVlLlxuICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV2ZW50VGFyZ2V0W0xJU1RFTkVSU11bdHlwZV0gPSBub2RlLm5leHRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5vZGUubmV4dFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldiA9IG5vZGVcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLm5leHRcbiAgICB9XG5cbiAgICAvLyBBZGQgbmV3IHZhbHVlLlxuICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChwcmV2ID09IG51bGwpIHtcbiAgICAgICAgICAgIGV2ZW50VGFyZ2V0W0xJU1RFTkVSU11bdHlwZV0gPSBuZXdOb2RlKGxpc3RlbmVyLCBBVFRSSUJVVEUpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmV2Lm5leHQgPSBuZXdOb2RlKGxpc3RlbmVyLCBBVFRSSUJVVEUpXG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBJbnRlcmZhY2Vcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBEZWZpbmVzIGFuIGBFdmVudFRhcmdldGAgaW1wbGVtZW50YXRpb24gd2hpY2ggaGFzIGBvbmZvb2JhcmAgYXR0cmlidXRlcy5cbiAqXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBFdmVudFRhcmdldEJhc2UgLSBBIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgRXZlbnRUYXJnZXQuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB0eXBlcyAtIEEgbGlzdCBvZiBldmVudCB0eXBlcyB3aGljaCBhcmUgZGVmaW5lZCBhcyBhdHRyaWJ1dGUgbGlzdGVuZXJzLlxuICogQHJldHVybnMge0V2ZW50VGFyZ2V0fSBUaGUgZGVmaW5lZCBgRXZlbnRUYXJnZXRgIGltcGxlbWVudGF0aW9uIHdoaWNoIGhhcyBhdHRyaWJ1dGUgbGlzdGVuZXJzLlxuICovXG5tb2R1bGUuZXhwb3J0cy5kZWZpbmVDdXN0b21FdmVudFRhcmdldCA9IGZ1bmN0aW9uKEV2ZW50VGFyZ2V0QmFzZSwgdHlwZXMpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgY3VzdG9tIGV2ZW50IHRhcmdldC5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBFdmVudFRhcmdldCgpIHtcbiAgICAgICAgRXZlbnRUYXJnZXRCYXNlLmNhbGwodGhpcylcbiAgICB9XG5cbiAgICB2YXIgZGVzY3JpcHRlciA9IHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICAgIHZhbHVlOiBFdmVudFRhcmdldCxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgIH1cblxuICAgIHR5cGVzLmZvckVhY2goZnVuY3Rpb24odHlwZSkge1xuICAgICAgICBkZXNjcmlwdGVyW1wib25cIiArIHR5cGVdID0ge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlTGlzdGVuZXIodGhpcywgdHlwZSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlTGlzdGVuZXIodGhpcywgdHlwZSwgbGlzdGVuZXIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBFdmVudFRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50VGFyZ2V0QmFzZS5wcm90b3R5cGUsIGRlc2NyaXB0ZXIpXG5cbiAgICByZXR1cm4gRXZlbnRUYXJnZXRcbn1cblxuXG4vKioqLyB9KSxcbi8qIDE2ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9ub2RlX21vZHVsZXMvZXZlbnQtdGFyZ2V0LXNoaW0vbGliL2V2ZW50LXdyYXBwZXIuanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcbi8qKlxuICogQGF1dGhvciBUb3J1IE5hZ2FzaGltYVxuICogQGNvcHlyaWdodCAyMDE1IFRvcnUgTmFnYXNoaW1hLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGRpcmVjdG9yeSBmb3IgZnVsbCBsaWNlbnNlLlxuICovXG5cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmVxdWlyZW1lbnRzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbnZhciBjcmVhdGVVbmlxdWVLZXkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKC8qISAuL2NvbW1vbnMgKi8gMCkuY3JlYXRlVW5pcXVlS2V5XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbnN0c250c1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBrZXkgb2YgdGhlIGZsYWcgd2hpY2ggaXMgdHVybmVkIG9uIGJ5IGBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb25gIG1ldGhvZC5cbiAqXG4gKiBAdHlwZSB7c3ltYm9sfHN0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHID1cbiAgICBjcmVhdGVVbmlxdWVLZXkoXCJzdG9wX2ltbWVkaWF0ZV9wcm9wYWdhdGlvbl9mbGFnXCIpXG5cbi8qKlxuICogVGhlIGtleSBvZiB0aGUgZmxhZyB3aGljaCBpcyB0dXJuZWQgb24gYnkgYHByZXZlbnREZWZhdWx0YCBtZXRob2QuXG4gKlxuICogQHR5cGUge3N5bWJvbHxzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG52YXIgQ0FOQ0VMRURfRkxBRyA9IGNyZWF0ZVVuaXF1ZUtleShcImNhbmNlbGVkX2ZsYWdcIilcblxuLyoqXG4gKiBUaGUga2V5IG9mIHRoZSBmbGFnIHRoYXQgaXQgY2Fubm90IHVzZSBgcHJldmVudERlZmF1bHRgIG1ldGhvZC5cbiAqXG4gKiBAdHlwZSB7c3ltYm9sfHN0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbnZhciBQQVNTSVZFX0xJU1RFTkVSX0ZMQUcgPSBjcmVhdGVVbmlxdWVLZXkoXCJwYXNzaXZlX2xpc3RlbmVyX2ZsYWdcIilcblxuLyoqXG4gKiBUaGUga2V5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QuXG4gKlxuICogQHR5cGUge3N5bWJvbHxzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG52YXIgT1JJR0lOQUxfRVZFTlQgPSBjcmVhdGVVbmlxdWVLZXkoXCJvcmlnaW5hbF9ldmVudFwiKVxuXG4vKipcbiAqIE1ldGhvZCBkZWZpbml0aW9ucyBmb3IgdGhlIGV2ZW50IHdyYXBwZXIuXG4gKlxuICogQHR5cGUge29iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cbnZhciB3cmFwcGVyUHJvdG90eXBlRGVmaW5pdGlvbiA9IE9iamVjdC5mcmVlemUoe1xuICAgIHN0b3BQcm9wYWdhdGlvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgICAgICAgICB2YXIgZSA9IHRoaXNbT1JJR0lOQUxfRVZFTlRdXG4gICAgICAgICAgICBpZiAodHlwZW9mIGUuc3RvcFByb3BhZ2F0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSksXG5cbiAgICBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IE9iamVjdC5mcmVlemUoe1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkge1xuICAgICAgICAgICAgdGhpc1tTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHXSA9IHRydWVcblxuICAgICAgICAgICAgdmFyIGUgPSB0aGlzW09SSUdJTkFMX0VWRU5UXVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pLFxuXG4gICAgcHJldmVudERlZmF1bHQ6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcHJldmVudERlZmF1bHQoKSB7XG4gICAgICAgICAgICBpZiAodGhpc1tQQVNTSVZFX0xJU1RFTkVSX0ZMQUddKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jYW5jZWxhYmxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpc1tDQU5DRUxFRF9GTEFHXSA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGUgPSB0aGlzW09SSUdJTkFMX0VWRU5UXVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnByZXZlbnREZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIGRlZmF1bHRQcmV2ZW50ZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1tDQU5DRUxFRF9GTEFHXVxuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSksXG59KVxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgSW50ZXJmYWNlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbm1vZHVsZS5leHBvcnRzLlNUT1BfSU1NRURJQVRFX1BST1BBR0FUSU9OX0ZMQUcgPSBTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHXG5tb2R1bGUuZXhwb3J0cy5QQVNTSVZFX0xJU1RFTkVSX0ZMQUcgPSBQQVNTSVZFX0xJU1RFTkVSX0ZMQUdcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGV2ZW50IHdyYXBwZXIuXG4gKlxuICogV2UgY2Fubm90IG1vZGlmeSBzZXZlcmFsIHByb3BlcnRpZXMgb2YgYEV2ZW50YCBvYmplY3QsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSB3cmFwcGVyLlxuICogUGx1cywgdGhpcyB3cmFwcGVyIHN1cHBvcnRzIG5vbiBgRXZlbnRgIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtFdmVudHx7dHlwZTogc3RyaW5nfX0gZXZlbnQgLSBBbiBvcmlnaW5hbCBldmVudCB0byBjcmVhdGUgdGhlIHdyYXBwZXIuXG4gKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBldmVudFRhcmdldCAtIFRoZSBldmVudCB0YXJnZXQgb2YgdGhlIGV2ZW50LlxuICogQHJldHVybnMge0V2ZW50fSBUaGUgY3JlYXRlZCB3cmFwcGVyLiBUaGlzIG9iamVjdCBpcyBpbXBsZW1lbnRlZCBgRXZlbnRgIGludGVyZmFjZS5cbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzLmNyZWF0ZUV2ZW50V3JhcHBlciA9IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50V3JhcHBlcihldmVudCwgZXZlbnRUYXJnZXQpIHtcbiAgICB2YXIgdGltZVN0YW1wID0gKFxuICAgICAgICB0eXBlb2YgZXZlbnQudGltZVN0YW1wID09PSBcIm51bWJlclwiID8gZXZlbnQudGltZVN0YW1wIDogRGF0ZS5ub3coKVxuICAgIClcbiAgICB2YXIgcHJvcGVydHlEZWZpbml0aW9uID0ge1xuICAgICAgICB0eXBlOiB7dmFsdWU6IGV2ZW50LnR5cGUsIGVudW1lcmFibGU6IHRydWV9LFxuICAgICAgICB0YXJnZXQ6IHt2YWx1ZTogZXZlbnRUYXJnZXQsIGVudW1lcmFibGU6IHRydWV9LFxuICAgICAgICBjdXJyZW50VGFyZ2V0OiB7dmFsdWU6IGV2ZW50VGFyZ2V0LCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgZXZlbnRQaGFzZToge3ZhbHVlOiAyLCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgYnViYmxlczoge3ZhbHVlOiBCb29sZWFuKGV2ZW50LmJ1YmJsZXMpLCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgY2FuY2VsYWJsZToge3ZhbHVlOiBCb29sZWFuKGV2ZW50LmNhbmNlbGFibGUpLCBlbnVtZXJhYmxlOiB0cnVlfSxcbiAgICAgICAgdGltZVN0YW1wOiB7dmFsdWU6IHRpbWVTdGFtcCwgZW51bWVyYWJsZTogdHJ1ZX0sXG4gICAgICAgIGlzVHJ1c3RlZDoge3ZhbHVlOiBmYWxzZSwgZW51bWVyYWJsZTogdHJ1ZX0sXG4gICAgfVxuICAgIHByb3BlcnR5RGVmaW5pdGlvbltTVE9QX0lNTUVESUFURV9QUk9QQUdBVElPTl9GTEFHXSA9IHt2YWx1ZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlfVxuICAgIHByb3BlcnR5RGVmaW5pdGlvbltDQU5DRUxFRF9GTEFHXSA9IHt2YWx1ZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlfVxuICAgIHByb3BlcnR5RGVmaW5pdGlvbltQQVNTSVZFX0xJU1RFTkVSX0ZMQUddID0ge3ZhbHVlOiBmYWxzZSwgd3JpdGFibGU6IHRydWV9XG4gICAgcHJvcGVydHlEZWZpbml0aW9uW09SSUdJTkFMX0VWRU5UXSA9IHt2YWx1ZTogZXZlbnR9XG5cbiAgICAvLyBGb3IgQ3VzdG9tRXZlbnQuXG4gICAgaWYgKHR5cGVvZiBldmVudC5kZXRhaWwgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgcHJvcGVydHlEZWZpbml0aW9uLmRldGFpbCA9IHt2YWx1ZTogZXZlbnQuZGV0YWlsLCBlbnVtZXJhYmxlOiB0cnVlfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuY3JlYXRlKFxuICAgICAgICBPYmplY3QuY3JlYXRlKGV2ZW50LCB3cmFwcGVyUHJvdG90eXBlRGVmaW5pdGlvbiksXG4gICAgICAgIHByb3BlcnR5RGVmaW5pdGlvblxuICAgIClcbn1cblxuXG4vKioqLyB9KSxcbi8qIDE3ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvd2Vic29ja2V0LndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBldmVudFRhcmdldCA9IF9fd2VicGFja19yZXF1aXJlX18oLyohIGV2ZW50LXRhcmdldC1zaGltICovIDIpO1xuXG52YXIgV0VCX1NPQ0tFVF9NT0RVTEUgPSAnQHdlZXgtbW9kdWxlL3dlYlNvY2tldCc7XG5cbnZhciBDT05ORUNUSU5HID0gMDtcbnZhciBPUEVOID0gMTtcbnZhciBDTE9TSU5HID0gMjtcbnZhciBDTE9TRUQgPSAzO1xuXG52YXIgQ0xPU0VfTk9STUFMID0gMTAwMDtcblxudmFyIFdFQlNPQ0tFVF9FVkVOVFMgPSBbJ2Nsb3NlJywgJ2Vycm9yJywgJ21lc3NhZ2UnLCAnb3BlbiddO1xuXG4vKipcbiAqIEV2ZW50IG9iamVjdCBwYXNzZWQgdG8gdGhlIGBvbm9wZW5gLCBgb25jbG9zZWAsIGBvbm1lc3NhZ2VgLCBgb25lcnJvcmBcbiAqIGNhbGxiYWNrcyBvZiBgV2ViU29ja2V0YC5cbiAqXG4gKiBUaGUgYHR5cGVgIHByb3BlcnR5IGlzIFwib3BlblwiLCBcImNsb3NlXCIsIFwibWVzc2FnZVwiLCBcImVycm9yXCIgcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEluIGNhc2Ugb2YgXCJtZXNzYWdlXCIsIHRoZSBgZGF0YWAgcHJvcGVydHkgY29udGFpbnMgdGhlIGluY29taW5nIGRhdGEuXG4gKi9cblxudmFyIFdlYlNvY2tldEV2ZW50ID0gZnVuY3Rpb24gV2ViU29ja2V0RXZlbnQodHlwZSwgZXZlbnRJbml0RGljdCkge1xuICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV2ViU29ja2V0RXZlbnQpO1xuXG4gIHRoaXMudHlwZSA9IHR5cGUudG9TdHJpbmcoKTtcbiAgT2JqZWN0LmFzc2lnbih0aGlzLCBldmVudEluaXREaWN0KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKF9fd2VleF9yZXF1aXJlX18pIHtcbiAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgLyoqXG4gICAqIEJyb3dzZXItY29tcGF0aWJsZSBXZWJTb2NrZXRzIGltcGxlbWVudGF0aW9uLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dlYlNvY2tldFxuICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYnNvY2tldHMvd3NcbiAgICovXG4gIHZhciBXZWJTb2NrZXQgPSAoX3RlbXAgPSBfY2xhc3MgPSBmdW5jdGlvbiAoX2V2ZW50VGFyZ2V0KSB7XG4gICAgX2luaGVyaXRzKFdlYlNvY2tldCwgX2V2ZW50VGFyZ2V0KTtcblxuICAgIGZ1bmN0aW9uIFdlYlNvY2tldCh1cmwsIHByb3RvY29scykge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdlYlNvY2tldCk7XG5cbiAgICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChXZWJTb2NrZXQuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihXZWJTb2NrZXQpKS5jYWxsKHRoaXMpKTtcblxuICAgICAgdmFyIHdlYnNvY2tldCA9IF9fd2VleF9yZXF1aXJlX18oV0VCX1NPQ0tFVF9NT0RVTEUpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgIHdlYnNvY2tldC5XZWJTb2NrZXQodXJsLCBwcm90b2NvbHMpO1xuICAgICAgX3RoaXMucmVhZHlTdGF0ZSA9IENPTk5FQ1RJTkc7XG4gICAgICBfdGhpcy53ZWJzb2NrZXQgPSB3ZWJzb2NrZXQ7XG5cbiAgICAgIHdlYnNvY2tldC5vbm1lc3NhZ2UoZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQobmV3IFdlYlNvY2tldEV2ZW50KCdtZXNzYWdlJywgZXYpKTtcbiAgICAgIH0pO1xuXG4gICAgICB3ZWJzb2NrZXQub25vcGVuKGZ1bmN0aW9uIChldikge1xuICAgICAgICBfdGhpcy5yZWFkeVN0YXRlID0gT1BFTjtcbiAgICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgV2ViU29ja2V0RXZlbnQoJ29wZW4nKSk7XG4gICAgICB9KTtcblxuICAgICAgd2Vic29ja2V0Lm9uY2xvc2UoZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIF90aGlzLnJlYWR5U3RhdGUgPSBDTE9TRUQ7XG4gICAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQobmV3IFdlYlNvY2tldEV2ZW50KCdjbG9zZScsIHtcbiAgICAgICAgICBjb2RlOiBldi5jb2RlLFxuICAgICAgICAgIHJlYXNvbjogZXYucmVhc29uXG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuXG4gICAgICB3ZWJzb2NrZXQub25lcnJvcihmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChuZXcgV2ViU29ja2V0RXZlbnQoJ2Vycm9yJywgZXYpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhXZWJTb2NrZXQsIFt7XG4gICAgICBrZXk6ICdjbG9zZScsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY2xvc2UoY29kZSwgcmVhc29uKSB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IENMT1NJTkcgfHwgdGhpcy5yZWFkeVN0YXRlID09PSBDTE9TRUQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlYWR5U3RhdGUgPSBDTE9TSU5HO1xuICAgICAgICB0aGlzLndlYnNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3NlbmQnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmQoZGF0YSkge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGRhdGEgdHlwZScpO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBXZWJTb2NrZXQ7XG4gIH0oZXZlbnRUYXJnZXQoV0VCU09DS0VUX0VWRU5UUykpLCBfY2xhc3MuQ09OTkVDVElORyA9IENPTk5FQ1RJTkcsIF9jbGFzcy5PUEVOID0gT1BFTiwgX2NsYXNzLkNMT1NJTkcgPSBDTE9TSU5HLCBfY2xhc3MuQ0xPU0VEID0gQ0xPU0VELCBfdGVtcCk7XG5cblxuICByZXR1cm4gV2ViU29ja2V0O1xufTtcblxuLyoqKi8gfSksXG4vKiAxOCAqL1xuLyohKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvdGltZXIud2VleC5qcyAqKiohXG4gIFxcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qISBubyBzdGF0aWMgZXhwb3J0cyBmb3VuZCAqL1xuLyohIGFsbCBleHBvcnRzIHVzZWQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxudmFyIFRJTUVSX01PRFVMRSA9ICdAd2VleC1tb2R1bGUvdGltZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfX3dlZXhfcmVxdWlyZV9fLCBkb2N1bWVudCkge1xuICB2YXIgc2V0VGltZW91dCA9IGZ1bmN0aW9uIHNldFRpbWVvdXQoaGFuZGxlciwgdGltZSkge1xuICAgIHZhciB0aW1lciA9IF9fd2VleF9yZXF1aXJlX18oVElNRVJfTU9EVUxFKTtcbiAgICB0aW1lci5zZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWUpO1xuICAgIHJldHVybiBkb2N1bWVudC50YXNrQ2VudGVyLmNhbGxiYWNrTWFuYWdlci5sYXN0Q2FsbGJhY2tJZC50b1N0cmluZygpO1xuICB9O1xuXG4gIHZhciBzZXRJbnRlcnZhbCA9IGZ1bmN0aW9uIHNldEludGVydmFsKGhhbmRsZXIsIHRpbWUpIHtcbiAgICB2YXIgdGltZXIgPSBfX3dlZXhfcmVxdWlyZV9fKFRJTUVSX01PRFVMRSk7XG4gICAgdGltZXIuc2V0SW50ZXJ2YWwoaGFuZGxlciwgdGltZSk7XG4gICAgcmV0dXJuIGRvY3VtZW50LnRhc2tDZW50ZXIuY2FsbGJhY2tNYW5hZ2VyLmxhc3RDYWxsYmFja0lkLnRvU3RyaW5nKCk7XG4gIH07XG5cbiAgdmFyIGNsZWFyVGltZW91dCA9IGZ1bmN0aW9uIGNsZWFyVGltZW91dChuKSB7XG4gICAgdmFyIHRpbWVyID0gX193ZWV4X3JlcXVpcmVfXyhUSU1FUl9NT0RVTEUpO1xuICAgIHRpbWVyLmNsZWFyVGltZW91dChuKTtcbiAgfTtcblxuICB2YXIgY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uIGNsZWFySW50ZXJ2YWwobikge1xuICAgIHZhciB0aW1lciA9IF9fd2VleF9yZXF1aXJlX18oVElNRVJfTU9EVUxFKTtcbiAgICB0aW1lci5jbGVhckludGVydmFsKG4pO1xuICB9O1xuXG4gIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spIHtcbiAgICB2YXIgdGltZXIgPSBfX3dlZXhfcmVxdWlyZV9fKFRJTUVSX01PRFVMRSk7XG4gICAgcmV0dXJuIHRpbWVyLnNldFRpbWVvdXQoY2FsbGJhY2ssIDE2KTtcbiAgfTtcblxuICB2YXIgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbiBjYW5jZWxBbmltYXRpb25GcmFtZShuKSB7XG4gICAgdmFyIHRpbWVyID0gX193ZWV4X3JlcXVpcmVfXyhUSU1FUl9NT0RVTEUpO1xuICAgIHRpbWVyLmNsZWFyVGltZW91dChuKTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHNldFRpbWVvdXQ6IHNldFRpbWVvdXQsXG4gICAgY2xlYXJUaW1lb3V0OiBjbGVhclRpbWVvdXQsXG4gICAgc2V0SW50ZXJ2YWw6IHNldEludGVydmFsLFxuICAgIGNsZWFySW50ZXJ2YWw6IGNsZWFySW50ZXJ2YWwsXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lOiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsXG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWU6IGNhbmNlbEFuaW1hdGlvbkZyYW1lXG4gIH07XG59O1xuXG4vKioqLyB9KSxcbi8qIDE5ICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiEqXFxcbiAgISoqKiAuL3BhY2thZ2VzL3dlZXgtcmF4LWZyYW1ld29yay9zcmMvYmFzZTY0LndlZXguanMgKioqIVxuICBcXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGJhc2U2NCA9IHt9O1xuICB2YXIgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xuXG4gIC8vIGVuY29kZXJcbiAgLy8gW2h0dHBzOi8vZ2lzdC5naXRodWIuY29tLzk5OTE2Nl0gYnkgW2h0dHBzOi8vZ2l0aHViLmNvbS9uaWduYWddXG4gIGJhc2U2NC5idG9hID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHN0ciA9IFN0cmluZyhpbnB1dCk7XG4gICAgZm9yIChcbiAgICAvLyBpbml0aWFsaXplIHJlc3VsdCBhbmQgY291bnRlclxuICAgIHZhciBibG9jaywgY2hhckNvZGUsIGlkeCA9IDAsIG1hcCA9IGNoYXJzLCBvdXRwdXQgPSAnJztcbiAgICAvLyBpZiB0aGUgbmV4dCBzdHIgaW5kZXggZG9lcyBub3QgZXhpc3Q6XG4gICAgLy8gICBjaGFuZ2UgdGhlIG1hcHBpbmcgdGFibGUgdG8gXCI9XCJcbiAgICAvLyAgIGNoZWNrIGlmIGQgaGFzIG5vIGZyYWN0aW9uYWwgZGlnaXRzXG4gICAgc3RyLmNoYXJBdChpZHggfCAwKSB8fCAobWFwID0gJz0nLCBpZHggJSAxKTtcbiAgICAvLyBcIjggLSBpZHggJSAxICogOFwiIGdlbmVyYXRlcyB0aGUgc2VxdWVuY2UgMiwgNCwgNiwgOFxuICAgIG91dHB1dCArPSBtYXAuY2hhckF0KDYzICYgYmxvY2sgPj4gOCAtIGlkeCAlIDEgKiA4KSkge1xuICAgICAgY2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChpZHggKz0gMyAvIDQpO1xuICAgICAgaWYgKGNoYXJDb2RlID4gMHhGRikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCInYnRvYScgZmFpbGVkOiBUaGUgc3RyaW5nIHRvIGJlIGVuY29kZWQgY29udGFpbnMgY2hhcmFjdGVycyBvdXRzaWRlIG9mIHRoZSBMYXRpbjEgcmFuZ2UuXCIpO1xuICAgICAgfVxuICAgICAgYmxvY2sgPSBibG9jayA8PCA4IHwgY2hhckNvZGU7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH07XG5cbiAgLy8gZGVjb2RlclxuICAvLyBbaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vMTAyMDM5Nl0gYnkgW2h0dHBzOi8vZ2l0aHViLmNvbS9hdGtdXG4gIGJhc2U2NC5hdG9iID0gZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHN0ciA9IFN0cmluZyhpbnB1dCkucmVwbGFjZSgvPSskLywgJycpO1xuICAgIGlmIChzdHIubGVuZ3RoICUgNCA9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXRvYicgZmFpbGVkOiBUaGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLlwiKTtcbiAgICB9XG4gICAgZm9yIChcbiAgICAvLyBpbml0aWFsaXplIHJlc3VsdCBhbmQgY291bnRlcnNcbiAgICB2YXIgYmMgPSAwLCBicywgYnVmZmVyLCBpZHggPSAwLCBvdXRwdXQgPSAnJztcbiAgICAvLyBnZXQgbmV4dCBjaGFyYWN0ZXJcbiAgICBidWZmZXIgPSBzdHIuY2hhckF0KGlkeCsrKTtcbiAgICAvLyBjaGFyYWN0ZXIgZm91bmQgaW4gdGFibGU/IGluaXRpYWxpemUgYml0IHN0b3JhZ2UgYW5kIGFkZCBpdHMgYXNjaWkgdmFsdWU7XG4gICAgfmJ1ZmZlciAmJiAoYnMgPSBiYyAlIDQgPyBicyAqIDY0ICsgYnVmZmVyIDogYnVmZmVyLFxuICAgIC8vIGFuZCBpZiBub3QgZmlyc3Qgb2YgZWFjaCA0IGNoYXJhY3RlcnMsXG4gICAgLy8gY29udmVydCB0aGUgZmlyc3QgOCBiaXRzIHRvIG9uZSBhc2NpaSBjaGFyYWN0ZXJcbiAgICBiYysrICUgNCkgPyBvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgyNTUgJiBicyA+PiAoLTIgKiBiYyAmIDYpKSA6IDApIHtcbiAgICAgIC8vIHRyeSB0byBmaW5kIGNoYXJhY3RlciBpbiB0YWJsZSAoMC02Mywgbm90IGZvdW5kID0+IC0xKVxuICAgICAgYnVmZmVyID0gY2hhcnMuaW5kZXhPZihidWZmZXIpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIHJldHVybiBiYXNlNjQ7XG59O1xuXG4vKioqLyB9KSxcbi8qIDIwICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9wZXJmb3JtYW5jZS53ZWV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7IGlmIChrZXkgaW4gb2JqKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgeyB2YWx1ZTogdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUgfSk7IH0gZWxzZSB7IG9ialtrZXldID0gdmFsdWU7IH0gcmV0dXJuIG9iajsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyZXNwb25zZUVuZCkge1xuICB2YXIgX3BlcmZvcm1hbmNlJHRpbWluZztcblxuICB2YXIgcGVyZm9ybWFuY2UgPSB7fTtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gbm90IGdldCBuYXZpZ2F0aW9uU3RhcnQgdGltZVxuICBwZXJmb3JtYW5jZS50aW1pbmcgPSAoX3BlcmZvcm1hbmNlJHRpbWluZyA9IHtcbiAgICB1bmxvYWRFdmVudFN0YXJ0OiAwLFxuICAgIHVubG9hZEV2ZW50RW5kOiAwLFxuICAgIG5hdmlnYXRpb25TdGFydDogcmVzcG9uc2VFbmQsXG4gICAgcmVkaXJlY3RTdGFydDogMCxcbiAgICByZWRpcmVjdEVuZDogMCxcbiAgICBmZXRjaFN0YXJ0OiByZXNwb25zZUVuZCxcbiAgICBkb21haW5Mb29rdXBTdGFydDogcmVzcG9uc2VFbmQsXG4gICAgZG9tYWluTG9va3VwRW5kOiByZXNwb25zZUVuZCxcbiAgICBjb25uZWN0U3RhcnQ6IHJlc3BvbnNlRW5kLFxuICAgIHNlY3VyZUNvbm5lY3Rpb25TdGFydDogcmVzcG9uc2VFbmRcbiAgfSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwiY29ubmVjdFN0YXJ0XCIsIHJlc3BvbnNlRW5kKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwicmVxdWVzdFN0YXJ0XCIsIHJlc3BvbnNlRW5kKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwicmVzcG9uc2VTdGFydFwiLCByZXNwb25zZUVuZCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcInJlc3BvbnNlRW5kXCIsIHJlc3BvbnNlRW5kKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwiZG9tTG9hZGluZ1wiLCAwKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwiZG9tSW50ZXJhY3RpdmVcIiwgMCksIF9kZWZpbmVQcm9wZXJ0eShfcGVyZm9ybWFuY2UkdGltaW5nLCBcImRvbUNvbXBsZXRlXCIsIDApLCBfZGVmaW5lUHJvcGVydHkoX3BlcmZvcm1hbmNlJHRpbWluZywgXCJkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydFwiLCAwKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwiZG9tQ29udGVudExvYWRlZEV2ZW50RW5kXCIsIDApLCBfZGVmaW5lUHJvcGVydHkoX3BlcmZvcm1hbmNlJHRpbWluZywgXCJsb2FkRXZlbnRTdGFydFwiLCAwKSwgX2RlZmluZVByb3BlcnR5KF9wZXJmb3JtYW5jZSR0aW1pbmcsIFwibG9hZEV2ZW50RW5kXCIsIDApLCBfcGVyZm9ybWFuY2UkdGltaW5nKTtcbiAgcGVyZm9ybWFuY2Uubm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBEYXRlLm5vdygpIC0gcGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydDtcbiAgfTtcblxuICByZXR1cm4gcGVyZm9ybWFuY2U7XG59O1xuXG4vKioqLyB9KSxcbi8qIDIxICovXG4vKiEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqISpcXFxuICAhKioqIC4vcGFja2FnZXMvd2VleC1yYXgtZnJhbWV3b3JrL3NyYy9ldmVudC53ZWV4LmpzICoqKiFcbiAgXFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyohIG5vIHN0YXRpYyBleHBvcnRzIGZvdW5kICovXG4vKiEgYWxsIGV4cG9ydHMgdXNlZCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgRXZlbnQgPSBmdW5jdGlvbiBFdmVudCh0eXBlKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnQpO1xuXG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmJ1YmJsZXMgPSBCb29sZWFuKHBhcmFtcy5idWJibGVzKTtcbiAgICB0aGlzLmNhbmNlbGFibGUgPSBCb29sZWFuKHBhcmFtcy5jYW5jZWxhYmxlKTtcbiAgfTtcblxuICB2YXIgQ3VzdG9tRXZlbnQgPSBmdW5jdGlvbiAoX0V2ZW50KSB7XG4gICAgX2luaGVyaXRzKEN1c3RvbUV2ZW50LCBfRXZlbnQpO1xuXG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQodHlwZSkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDdXN0b21FdmVudCk7XG5cbiAgICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChDdXN0b21FdmVudC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEN1c3RvbUV2ZW50KSkuY2FsbCh0aGlzLCB0eXBlLCBwYXJhbXMpKTtcblxuICAgICAgX3RoaXMuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gQ3VzdG9tRXZlbnQ7XG4gIH0oRXZlbnQpO1xuXG4gIHJldHVybiB7XG4gICAgRXZlbnQ6IEV2ZW50LFxuICAgIEN1c3RvbUV2ZW50OiBDdXN0b21FdmVudFxuICB9O1xufTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pOztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZyYW1ld29yay53ZWV4Lm1hcCIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0ICogYXMgVmFuaWxsYSBmcm9tICcuL3ZhbmlsbGEvaW5kZXgnXG5pbXBvcnQgKiBhcyBWdWUgZnJvbSAnd2VleC12dWUtZnJhbWV3b3JrJ1xuaW1wb3J0ICogYXMgV2VleCBmcm9tICcuL2xlZ2FjeS9pbmRleCdcbmltcG9ydCBSYXggZnJvbSAnd2VleC1yYXgtZnJhbWV3b3JrJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIFZhbmlsbGEsXG4gIFZ1ZSxcbiAgUmF4LFxuICBXZWV4XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgLy8gd2VleCBpbnN0YW5jZXNcbiAgX2luc3RhbmNlczoge30sXG5cbiAgLy8gYXBpIG1ldGEgaW5mb1xuICBfbWV0YToge30sXG5cbiAgLy8gV2VleC5yZWdpc3RlckFwaU1vZHVsZSB1c2VkIHRoaXMgdG8gcmVnaXN0ZXIgYW5kIGFjY2VzcyBhcGlNb2R1bGVzLlxuICBhcGlNb2R1bGU6IHt9LFxuXG4gIC8vIGdldCB0aGUgYXBpIG1ldGhvZCBtZXRhIGluZm8gYXJyYXkgZm9yIHRoZSBtb2R1bGUuXG4gIGdldEFwaU1vZHVsZU1ldGE6IGZ1bmN0aW9uIChtb2R1bGVOYW1lKSB7XG4gICAgY29uc3QgbWV0YU9iaiA9IHt9XG4gICAgbWV0YU9ialttb2R1bGVOYW1lXSA9IHRoaXMuX21ldGFbbW9kdWxlTmFtZV1cbiAgICByZXR1cm4gbWV0YU9ialxuICB9LFxuXG4gIC8vIFNldCBtZXRhIGluZm8gZm9yIGEgYXBpIG1vZHVsZS5cbiAgLy8gSWYgdGhlcmUgaXMgYSBzYW1lIG5hbWVkIGFwaSwganVzdCByZXBsYWNlIGl0LlxuICAvLyBvcHRzOlxuICAvLyAtIG1ldGFPYmo6IG1ldGEgb2JqZWN0IGxpa2VcbiAgLy8ge1xuICAvLyAgICBkb206IFt7XG4gIC8vICAgICAgbmFtZTogJ2FkZEVsZW1lbnQnLFxuICAvLyAgICAgIGFyZ3M6IFsnc3RyaW5nJywgJ29iamVjdCddXG4gIC8vICAgIH1dXG4gIC8vIH1cbiAgc2V0QXBpTW9kdWxlTWV0YTogZnVuY3Rpb24gKG1ldGFPYmopIHtcbiAgICBsZXQgbW9kdWxlTmFtZVxuICAgIGZvciAoY29uc3QgayBpbiBtZXRhT2JqKSB7XG4gICAgICBpZiAobWV0YU9iai5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICBtb2R1bGVOYW1lID0ga1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZXRhQXJyYXkgPSB0aGlzLl9tZXRhW21vZHVsZU5hbWVdXG4gICAgaWYgKCFtZXRhQXJyYXkpIHtcbiAgICAgIHRoaXMuX21ldGFbbW9kdWxlTmFtZV0gPSBtZXRhT2JqW21vZHVsZU5hbWVdXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc3QgbmFtZU9iaiA9IHt9XG4gICAgICBtZXRhT2JqW21vZHVsZU5hbWVdLmZvckVhY2goZnVuY3Rpb24gKGFwaSkge1xuICAgICAgICBuYW1lT2JqW2FwaS5uYW1lXSA9IGFwaVxuICAgICAgfSlcbiAgICAgIG1ldGFBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChhcGksIGkpIHtcbiAgICAgICAgaWYgKG5hbWVPYmpbYXBpLm5hbWVdKSB7XG4gICAgICAgICAgbWV0YUFycmF5W2ldID0gbmFtZU9ialthcGkubmFtZV1cbiAgICAgICAgICBkZWxldGUgbmFtZU9ialthcGkubmFtZV1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGZvciAoY29uc3QgayBpbiBtZXRhT2JqKSB7XG4gICAgICAgIGlmIChtZXRhT2JqLmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICAgICAgbWV0YUFycmF5LnB1c2gobWV0YU9ialtrXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9tZXRhW21vZHVsZU5hbWVdID0gbWV0YU9ialttb2R1bGVOYW1lXVxuICB9LFxuXG4gIC8vIFNldCBtZXRhIGluZm8gZm9yIGEgc2luZ2xlIGFwaS5cbiAgLy8gb3B0czpcbiAgLy8gIC0gbW9kdWxlTmFtZTogYXBpIG1vZHVsZSBuYW1lLlxuICAvLyAgLSBtZXRhOiBhIG1ldGEgb2JqZWN0IGxpa2U6XG4gIC8vICB7XG4gIC8vICAgIG5hbWU6ICdhZGRFbGVtZW50JyxcbiAgLy8gICAgYXJnczogWydzdHJpbmcnLCAnb2JqZWN0J11cbiAgLy8gIH1cbiAgc2V0QXBpTWV0YTogZnVuY3Rpb24gKG1vZHVsZU5hbWUsIG1ldGEpIHtcbiAgICBjb25zdCBtZXRhQXJyYXkgPSB0aGlzLl9tZXRhW21vZHVsZU5hbWVdXG4gICAgaWYgKCFtZXRhQXJyYXkpIHtcbiAgICAgIHRoaXMuX21ldGFbbW9kdWxlTmFtZV0gPSBbbWV0YV1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsZXQgbWV0YUlkeCA9IC0xXG4gICAgICBtZXRhQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoYXBpLCBpKSB7XG4gICAgICAgIGxldCBuYW1lIC8vIHRvZG9cbiAgICAgICAgaWYgKG1ldGEubmFtZSA9PT0gbmFtZSkge1xuICAgICAgICAgIG1ldGFJZHggPSBpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAobWV0YUlkeCAhPT0gLTEpIHtcbiAgICAgICAgbWV0YUFycmF5W21ldGFJZHhdID0gbWV0YVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG1ldGFBcnJheS5wdXNoKG1ldGEpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIF9yZWdpc3Rlck1vZHVsZXMoW3tcbi8vICAgbW9kYWw6IFt7XG4vLyAgICAgbmFtZTogJ3RvYXN0Jyxcbi8vICAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4vLyAgIH0sIHtcbi8vICAgICBuYW1lOiAnYWxlcnQnLFxuLy8gICAgIGFyZ3M6IFsnb2JqZWN0JywgJ2Z1bmN0aW9uJ11cbi8vICAgfSwge1xuLy8gICAgIG5hbWU6ICdjb25maXJtJyxcbi8vICAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4vLyAgIH0sIHtcbi8vICAgICBuYW1lOiAncHJvbXB0Jyxcbi8vICAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4vLyAgIH1dXG4vLyB9LCB7XG4vLyAgIGFuaW1hdGlvbjogW3tcbi8vICAgICBuYW1lOiAndHJhbnNpdGlvbicsXG4vLyAgICAgYXJnczogWydzdHJpbmcnLCAnb2JqZWN0JywgJ2Z1bmN0aW9uJ11cbi8vICAgfV1cbi8vIH1dKVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgY29uZmlnID0ge1xuICB3ZWV4VmVyc2lvbjogJzAuNS4wJyxcbiAgZGVidWc6IGZhbHNlLFxuICB2YWxpZFJvb3RzOiBbJ2RpdicsICdsaXN0JywgJ3ZsaXN0JywgJ3Njcm9sbGVyJ10sXG4gIGRvd25ncmFkZToge1xuICAgIC8vIHJvb3Q6IHRydWVcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjb25maWdcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FycmF5IChhcnIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXlcbiAgICA/IEFycmF5LmlzQXJyYXkoYXJyKVxuICAgIDogKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnIpID09PSAnW29iamVjdCBBcnJheV0nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xpY2UgKGFyciwgc3RhcnQsIGVuZCkge1xuICBpZiAoaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kKVxuICB9XG4gIGNvbnN0IHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gIHJldHVybiBzbGljZS5jYWxsKGFyciwgc3RhcnQsIGVuZClcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKiBnbG9iYWwgSW1hZ2UgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbi8vIGNvbnN0IFdFQVBQX1NUWUxFX0lEID0gJ3dlYXBwLXN0eWxlJ1xuXG5pbXBvcnQgJy4uLy4uLy4uL3NoYXJlZC9vYmplY3RBc3NpZ24nXG5cbmV4cG9ydCB7XG4gIGV4dGVuZCxcbiAgZGVmLFxuICByZW1vdmUsXG4gIGhhc093bixcbiAgYmluZCxcbiAgdG9BcnJheSxcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIHR5cG9mXG59IGZyb20gJy4uLy4uLy4uL2ZyYW1ld29ya3MvbGVnYWN5L3V0aWwnXG5cbmltcG9ydCB7IGlzQXJyYXksIHNsaWNlIH0gZnJvbSAnLi9hcnJheSdcbmV4cG9ydCB7IGlzQXJyYXksIHNsaWNlIH1cblxuZXhwb3J0IGNvbnN0IHZlbmRvcnMgPSBbJ21zJywgJ21veicsICd3ZWJraXQnLCAnbyddXG5cbmxldCBfaXNXZWJwU3VwcG9ydGVkID0gZmFsc2VcblxuOyAoZnVuY3Rpb24gaXNTdXBwb3J0V2VicCAoKSB7XG4gIHRyeSB7XG4gICAgY29uc3Qgd2ViUCA9IG5ldyBJbWFnZSgpXG4gICAgd2ViUC5zcmMgPSAnZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmpvQUFBQlhSVUpRVmxBNElDNEFBQUN5QWdDZEEnXG4gICAgICAgICAgICAgICsgJ1NvQ0FBSUFMbWswbWswaUlpSWlJZ0JvU3lnQUJjNldXZ0FBL3ZlZmYvMFBQOGJBLy9Md1lBQUEnXG4gICAgd2ViUC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAod2ViUC5oZWlnaHQgPT09IDIpIHtcbiAgICAgICAgX2lzV2VicFN1cHBvcnRlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY2F0Y2ggKGUpIHtcbiAgICAvLyBkbyBub3RoaW5nLlxuICB9XG59KSgpXG5cbmxldCBfaXNTdGlja3lTdXBwb3J0ZWQgPSBmYWxzZVxuXG47IChmdW5jdGlvbiBpc1N1cHBvcnRTdGlja3kgKCkge1xuICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgY29uc3QgZWxlbWVudFN0eWxlID0gZWxlbWVudC5zdHlsZVxuICBlbGVtZW50U3R5bGUuY3NzVGV4dCA9IHZlbmRvcnMuY29uY2F0KFsnJ10pLm1hcChmdW5jdGlvbiAodmVuZG9yKSB7XG4gICAgcmV0dXJuICdwb3NpdGlvbjonXG4gICAgICArICh2ZW5kb3IgPyAnLScgKyB2ZW5kb3IgKyAnLScgOiAnJylcbiAgICAgICsgJ3N0aWNreSdcbiAgfSkuam9pbignOycpICsgJzsnXG4gIF9pc1N0aWNreVN1cHBvcnRlZCA9IGVsZW1lbnRTdHlsZS5wb3NpdGlvbi5pbmRleE9mKCdzdGlja3knKSAhPT0gLTFcbn0pKClcblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZCAodG8sIGZyb20pIHtcbi8vICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xuLy8gICAgIHRvW2tleV0gPSBmcm9tW2tleV1cbi8vICAgfVxuLy8gICByZXR1cm4gdG9cbi8vIH1cblxuLy8gZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QgKG9iaikge1xuLy8gICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iailcbi8vICAgICAuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnXG4vLyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopXG4gICAgLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRTdHlsZSAoY3NzLCBzdHlsZUlkLCByZXBsYWNlKSB7XG4gIGxldCBzdHlsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0eWxlSWQpXG4gIGlmIChzdHlsZSAmJiByZXBsYWNlKSB7XG4gICAgc3R5bGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZSlcbiAgICBzdHlsZSA9IG51bGxcbiAgfVxuICBpZiAoIXN0eWxlKSB7XG4gICAgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpXG4gICAgc3R5bGUudHlwZSA9ICd0ZXh0L2NzcydcbiAgICBzdHlsZUlkICYmIChzdHlsZS5pZCA9IHN0eWxlSWQpXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZSlcbiAgfVxuICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlRnJvbUFycmF5IChhcnIpIHtcbiAgaWYgKCFpc0FycmF5KGFycikpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBjb25zdCByZXMgPSBbXVxuICBjb25zdCB1bmlxdWUgPSB7fVxuICBsZXQgdmFsXG4gIGZvciAobGV0IGkgPSAwLCBsID0gYXJyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIHZhbCA9IGFycltpXVxuICAgIGlmICh1bmlxdWVbdmFsXSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgdW5pcXVlW3ZhbF0gPSB0cnVlXG4gICAgcmVzLnB1c2godmFsKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFdlYnAgKCkge1xuICByZXR1cm4gX2lzV2VicFN1cHBvcnRlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0U3RpY2t5ICgpIHtcbiAgcmV0dXJuIF9pc1N0aWNreVN1cHBvcnRlZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmFuZG9tIChudW0pIHtcbiAgY29uc3QgX2RlZmF1bHROdW0gPSAxMFxuICBpZiAodHlwZW9mIG51bSAhPT0gJ251bWJlcicgfHwgbnVtIDw9IDApIHtcbiAgICBudW0gPSBfZGVmYXVsdE51bVxuICB9XG4gIGNvbnN0IF9tYXggPSBNYXRoLnBvdygxMCwgbnVtKVxuICByZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpICsgTWF0aC5yYW5kb20oKSAqIF9tYXgpICUgX21heFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmdiIChjb2xvcikge1xuICBsZXQgbWF0Y2hcbiAgY29sb3IgPSBjb2xvciArICcnXG4gIG1hdGNoID0gY29sb3IubWF0Y2goLyMoW1xcZGEtZkEtRl17Mn0pKFtcXGRhLWZBLUZdezJ9KShbXFxkYS1mQS1GXXsyfSkvKVxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogcGFyc2VJbnQobWF0Y2hbMV0sIDE2KSxcbiAgICAgIGc6IHBhcnNlSW50KG1hdGNoWzJdLCAxNiksXG4gICAgICBiOiBwYXJzZUludChtYXRjaFszXSwgMTYpXG4gICAgfVxuICB9XG4gIG1hdGNoID0gY29sb3IubWF0Y2goL3JnYlxcKChcXGQrKSxcXHMqKFxcZCspLFxccyooXFxkKylcXCkvKVxuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcjogcGFyc2VJbnQobWF0Y2hbMV0pLFxuICAgICAgZzogcGFyc2VJbnQobWF0Y2hbMl0pLFxuICAgICAgYjogcGFyc2VJbnQobWF0Y2hbM10pXG4gICAgfVxuICB9XG59XG5cbi8vIGRpcmVjdGlvbjogJ2wnIHwgJ3InLCBkZWZhdWx0IGlzICdyJ1xuLy8gbnVtOiBob3cgbWFueSB0aW1lcyB0byBsb29wLCBzaG91bGQgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyXG5leHBvcnQgZnVuY3Rpb24gbG9vcEFycmF5IChhcnIsIG51bSwgZGlyZWN0aW9uKSB7XG4gIGlmICghaXNBcnJheShhcnIpKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgbGV0IGlzTGVmdCA9IChkaXJlY3Rpb24gKyAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ2wnXG4gIGNvbnN0IGxlbiA9IGFyci5sZW5ndGhcbiAgbnVtID0gbnVtICUgbGVuXG4gIGlmIChudW0gPCAwKSB7XG4gICAgbnVtID0gLW51bVxuICAgIGlzTGVmdCA9ICFpc0xlZnRcbiAgfVxuICBpZiAobnVtID09PSAwKSB7XG4gICAgcmV0dXJuIGFyclxuICB9XG4gIGxldCBscCwgcnBcbiAgaWYgKGlzTGVmdCkge1xuICAgIGxwID0gYXJyLnNsaWNlKDAsIG51bSlcbiAgICBycCA9IGFyci5zbGljZShudW0pXG4gIH1cbiAgZWxzZSB7XG4gICAgbHAgPSBhcnIuc2xpY2UoMCwgbGVuIC0gbnVtKVxuICAgIHJwID0gYXJyLnNsaWNlKGxlbiAtIG51bSlcbiAgfVxuICByZXR1cm4gcnAuY29uY2F0KGxwKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGhyb3R0bGUgKGZ1bmMsIHdhaXQpIHtcbiAgbGV0IHJlc3VsdFxuICBsZXQgdGltZXJJZCA9IG51bGxcbiAgbGV0IHByZXZpb3VzID0gMFxuICBsZXQgY29udGV4dFxuICBsZXQgYXJnc1xuICBjb25zdCBsYXRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICBwcmV2aW91cyA9IERhdGUubm93KClcbiAgICB0aW1lcklkID0gbnVsbFxuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncylcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICBjb25zdCByZW1haW5pbmcgPSB3YWl0IC0gKG5vdyAtIHByZXZpb3VzKVxuICAgIGNvbnRleHQgPSB0aGlzXG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cylcbiAgICBpZiAocmVtYWluaW5nIDw9IDApIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKVxuICAgICAgdGltZXJJZCA9IG51bGxcbiAgICAgIHByZXZpb3VzID0gbm93XG4gICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpXG4gICAgfVxuICAgIGVsc2UgaWYgKCF0aW1lcklkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dChsYXRlciwgcmVtYWluaW5nKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsVG9LZWJhYiAobmFtZSkge1xuICBpZiAoIW5hbWUpIHsgcmV0dXJuICcnIH1cbiAgcmV0dXJuIG5hbWUucmVwbGFjZSgvKFtBLVpdKS9nLCBmdW5jdGlvbiAoZywgZzEpIHtcbiAgICByZXR1cm4gYC0ke2cxLnRvTG93ZXJDYXNlKCl9YFxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24ga2ViYWJUb0NhbWVsIChuYW1lKSB7XG4gIGlmICghbmFtZSkgeyByZXR1cm4gJycgfVxuICByZXR1cm4gbmFtZS5yZXBsYWNlKC8tKFthLXpdKS9nLCBmdW5jdGlvbiAoZywgZzEpIHtcbiAgICBjb25zb2xlLmxvZyhnMSlcbiAgICByZXR1cm4gYCR7ZzEudG9VcHBlckNhc2UoKX1gXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRW50ZXJLZXlUeXBlIChrZXkpIHtcbiAgY29uc3Qga2V5cyA9IFsnZGVmYXVsdCcsICdnbycsICduZXh0JywgJ3NlYXJjaCcsICdzZW5kJ11cbiAgaWYgKGtleXMuaW5kZXhPZihrZXkpID4gLTEpIHtcbiAgICByZXR1cm4ga2V5XG4gIH1cbiAgcmV0dXJuICdkb25lJ1xufVxuXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi91dGlscydcblxuY29uc3QgX3NlbmRlck1hcCA9IHt9XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFNlbmRlciAoaW5zdGFuY2UpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNlbmRlcikpIHtcbiAgICByZXR1cm4gbmV3IFNlbmRlcihpbnN0YW5jZSlcbiAgfVxuICB0aGlzLmluc3RhbmNlSWQgPSBpbnN0YW5jZS5pbnN0YW5jZUlkXG4gIHRoaXMud2VleEluc3RhbmNlID0gaW5zdGFuY2VcbiAgX3NlbmRlck1hcFt0aGlzLmluc3RhbmNlSWRdID0gdGhpc1xufVxuXG5mdW5jdGlvbiBfc2VuZCAoaW5zdGFuY2VJZCwgbXNnKSB7XG4gIGNhbGxKUyhpbnN0YW5jZUlkLCBbbXNnXSlcbn1cblxuU2VuZGVyLmdldFNlbmRlciA9IGZ1bmN0aW9uIChpbnN0YW5jZUlkKSB7XG4gIHJldHVybiBfc2VuZGVyTWFwW2luc3RhbmNlSWRdXG59XG5cblNlbmRlci5wcm90b3R5cGUgPSB7XG5cbiAgLy8gcGVyZm9ybSBhIGNhbGxiYWNrIHRvIGpzZnJhbWV3b3JrLlxuICBwZXJmb3JtQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFja0lkLCBkYXRhLCBrZWVwQWxpdmUpIHtcbiAgICBjb25zdCBhcmdzID0gW2NhbGxiYWNrSWRdXG4gICAgZGF0YSAmJiBhcmdzLnB1c2goZGF0YSlcbiAgICBrZWVwQWxpdmUgJiYgYXJncy5wdXNoKGtlZXBBbGl2ZSlcbiAgICBfc2VuZCh0aGlzLmluc3RhbmNlSWQsIHtcbiAgICAgIG1ldGhvZDogJ2NhbGxiYWNrJyxcbiAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KVxuICB9LFxuXG4gIGZpcmVFdmVudDogZnVuY3Rpb24gKHJlZiwgdHlwZSwgZnVuYywgZXZlbnQpIHtcbiAgICBmdW5jLmV4dHJhICYmIGV4dGVuZChldmVudCwgZnVuYy5leHRyYSgpKVxuICAgIF9zZW5kKHRoaXMuaW5zdGFuY2VJZCwge1xuICAgICAgbWV0aG9kOiAnZmlyZUV2ZW50JyxcbiAgICAgIGFyZ3M6IFtyZWYsIHR5cGUsIGV2ZW50LCBmdW5jLnVwZGF0b3IgJiYgZnVuYy51cGRhdG9yKCldXG4gICAgfSlcbiAgfVxuXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgY29uZmlnIGZyb20gJy4uL3JlbmRlci9jb25maWcnXG5pbXBvcnQgcHJvdG9jb2wgZnJvbSAnLi9wcm90b2NvbCdcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuLi91dGlscydcbmltcG9ydCBTZW5kZXIgZnJvbSAnLi9zZW5kZXInXG5cbi8vIHN5bmMgY2FsbCBuYXRpdmUgY29tcG9uZW50IG1ldGhvZC5cbmZ1bmN0aW9uIGNhbGxOYXRpdmVDb21wb25lbnQgKGluc3RhbmNlSWQsIHJlZiwgbWV0aG9kLCBhcmdzLCBvcHRpb25zKSB7XG4gIHJldHVybiBwcm9jZXNzQ2FsbChpbnN0YW5jZUlkLCB7XG4gICAgY29tcG9uZW50OiBvcHRpb25zLmNvbXBvbmVudCxcbiAgICByZWYsXG4gICAgbWV0aG9kLFxuICAgIGFyZ3NcbiAgfSlcbn1cblxuLy8gc3luYyBjYWxsIG5hdGl2ZSBtb2R1bGUgYXBpLlxuZnVuY3Rpb24gY2FsbE5hdGl2ZU1vZHVsZSAoaW5zdGFuY2VJZCwgbW9kdWxlLCBtZXRob2QsIGFyZ3MsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHByb2Nlc3NDYWxsKGluc3RhbmNlSWQsIHsgbW9kdWxlLCBtZXRob2QsIGFyZ3MgfSlcbn1cblxuLy8gY2FsbE5hdGl2ZToganNGcmFtZXdvcmsgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIHRhbGsgdG9cbi8vIHRoaXMgcmVuZGVyZXIuXG4vLyBwYXJhbXM6XG4vLyAgLSBpbnN0YW5jZUlkOiBzdHJpbmcuXG4vLyAgLSB0YXNrczogYXJyYXkgb2Ygb2JqZWN0LlxuLy8gIC0gY2FsbGJhY2tJZDogbnVtYmVyLlxuZnVuY3Rpb24gY2FsbE5hdGl2ZSAoaW5zdGFuY2VJZCwgdGFza3MsIGNhbGxiYWNrSWQpIHtcbiAgbGV0IGNhbGxzID0gW11cbiAgaWYgKHR5cGVvZiB0YXNrcyA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgY2FsbHMgPSBKU09OLnBhcnNlKHRhc2tzKVxuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignaW52YWxpZCB0YXNrczonLCB0YXNrcylcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAoaXNBcnJheSh0YXNrcykpIHtcbiAgICBjYWxscyA9IHRhc2tzXG4gIH1cbiAgY29uc3QgbGVuID0gY2FsbHMubGVuZ3RoXG4gIGNhbGxzW2xlbiAtIDFdLmNhbGxiYWNrSWQgPSAoIWNhbGxiYWNrSWQgJiYgY2FsbGJhY2tJZCAhPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2FsbGJhY2tJZFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgcHJvY2Vzc0NhbGwoaW5zdGFuY2VJZCwgY2FsbHNbaV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NhbGwgKGluc3RhbmNlSWQsIGNhbGwpIHtcbiAgY29uc3QgaXNDb21wb25lbnQgPSB0eXBlb2YgY2FsbC5tb2R1bGUgPT09ICd1bmRlZmluZWQnXG4gIGNvbnN0IHJlcyA9IGlzQ29tcG9uZW50ID8gY29tcG9uZW50Q2FsbChpbnN0YW5jZUlkLCBjYWxsKSA6IG1vZHVsZUNhbGwoaW5zdGFuY2VJZCwgY2FsbClcblxuICBjb25zdCBjYWxsYmFja0lkID0gY2FsbC5jYWxsYmFja0lkXG4gIGlmICgoY2FsbGJhY2tJZFxuICAgIHx8IGNhbGxiYWNrSWQgPT09IDBcbiAgICB8fCBjYWxsYmFja0lkID09PSAnMCcpXG4gICAgJiYgY2FsbGJhY2tJZCAhPT0gJy0xJ1xuICAgICYmIGNhbGxiYWNrSWQgIT09IC0xKSB7XG4gICAgcGVyZm9ybU5leHRUaWNrKGluc3RhbmNlSWQsIGNhbGxiYWNrSWQpXG4gIH1cblxuICAvLyBmb3Igc3luYyBjYWxsLlxuICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIG1vZHVsZUNhbGwgKGluc3RhbmNlSWQsIGNhbGwpIHtcbiAgY29uc3QgbW9kdWxlTmFtZSA9IGNhbGwubW9kdWxlXG4gIGNvbnN0IG1ldGhvZE5hbWUgPSBjYWxsLm1ldGhvZFxuICBsZXQgbW9kdWxlLCBtZXRob2RcbiAgY29uc3QgYXJncyA9IGNhbGwuYXJncyB8fCBjYWxsLmFyZ3VtZW50cyB8fCBbXVxuXG4gIGlmICghKG1vZHVsZSA9IHByb3RvY29sLmFwaU1vZHVsZVttb2R1bGVOYW1lXSkpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoIShtZXRob2QgPSBtb2R1bGVbbWV0aG9kTmFtZV0pKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICByZXR1cm4gbWV0aG9kLmFwcGx5KGdsb2JhbC53ZWV4LmdldEluc3RhbmNlKGluc3RhbmNlSWQpLCBhcmdzKVxufVxuXG5mdW5jdGlvbiBjb21wb25lbnRDYWxsIChpbnN0YW5jZUlkLCBjYWxsKSB7XG4gIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjYWxsLmNvbXBvbmVudFxuICBjb25zdCByZWYgPSBjYWxsLnJlZlxuICBjb25zdCBtZXRob2ROYW1lID0gY2FsbC5tZXRob2RcbiAgY29uc3QgYXJncyA9IGNhbGwuYXJncyB8fCBjYWxsLmFyZ3VtZW50cyB8fCBbXVxuXG4gIGNvbnN0IGVsZW0gPSBnbG9iYWwud2VleC5nZXRJbnN0YW5jZShpbnN0YW5jZUlkKS5nZXRDb21wb25lbnRNYW5hZ2VyKCkuZ2V0Q29tcG9uZW50KHJlZilcbiAgaWYgKCFlbGVtKSB7XG4gICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtoNS1yZW5kZXJdIGNvbXBvbmVudCBvZiByZWYgJHtyZWZ9IGRvZXNuJ3QgZXhpc3QuYClcbiAgfVxuXG4gIGxldCBtZXRob2RcblxuICBpZiAoIShtZXRob2QgPSBlbGVtW21ldGhvZE5hbWVdKSkge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgJHtjb21wb25lbnROYW1lfSBkb2Vzbid0IGhhdmUgYSBtZXRob2QgbmFtZWQgJHttZXRob2ROYW1lfS5gKVxuICB9XG5cbiAgcmV0dXJuIG1ldGhvZC5hcHBseShlbGVtLCBhcmdzKVxufVxuXG5mdW5jdGlvbiBwZXJmb3JtTmV4dFRpY2sgKGluc3RhbmNlSWQsIGNhbGxiYWNrSWQpIHtcbiAgU2VuZGVyLmdldFNlbmRlcihpbnN0YW5jZUlkKS5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZClcbn1cblxuZnVuY3Rpb24gbmF0aXZlTG9nICgpIHtcbiAgaWYgKGNvbmZpZy5kZWJ1Zykge1xuICAgIGlmIChhcmd1bWVudHNbMF0ubWF0Y2goL15wZXJmLykpIHtcbiAgICAgIGNvbnNvbGUuaW5mby5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5kZWJ1Zy5hcHBseShjb25zb2xlLCBhcmd1bWVudHMpXG4gIH1cbn1cblxuZnVuY3Rpb24gZXhwb3J0c0JyaWRnZU1ldGhvZHNUb0dsb2JhbCAoKSB7XG4gIGdsb2JhbC5jYWxsTmF0aXZlID0gY2FsbE5hdGl2ZVxuICBnbG9iYWwuY2FsbE5hdGl2ZUNvbXBvbmVudCA9IGNhbGxOYXRpdmVDb21wb25lbnRcbiAgZ2xvYmFsLmNhbGxOYXRpdmVNb2R1bGUgPSBjYWxsTmF0aXZlTW9kdWxlXG4gIGdsb2JhbC5uYXRpdmVMb2cgPSBuYXRpdmVMb2dcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXhwb3J0cyBtZXRob2RzIHRvIGdsb2JhbCh3aW5kb3cpLlxuICAgIGV4cG9ydHNCcmlkZ2VNZXRob2RzVG9HbG9iYWwoKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgcHJvdG9jb2wgZnJvbSAnLi9wcm90b2NvbCdcbmltcG9ydCByZWNlaXZlciBmcm9tICcuL3JlY2VpdmVyJ1xuaW1wb3J0IFNlbmRlciBmcm9tICcuL3NlbmRlcidcblxuZXhwb3J0IHsgcHJvdG9jb2wsIHJlY2VpdmVyLCBTZW5kZXIgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgdGhyb3R0bGUgfSBmcm9tICcuLi91dGlscydcblxuY29uc3Qgd2F0Y2hlZENvbXBvbmVudHMgPSBbXVxubGV0IGxpc3RlbmVkID0gZmFsc2VcbmxldCBzY3JvbGxZID0gMFxuXG5mdW5jdGlvbiBuZWVkV2F0Y2ggKGNvbXBvbmVudCkge1xuICBjb25zdCBldmVudHMgPSBjb21wb25lbnQuZGF0YS5ldmVudFxuICBpZiAoZXZlbnRzXG4gICAgICAmJiAoZXZlbnRzLmluZGV4T2YoJ2FwcGVhcicpICE9PSAtMVxuICAgICAgICB8fCBldmVudHMuaW5kZXhPZignZGlzYXBwZWFyJykgIT09IC0xKSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaElmTmVlZGVkIChjb21wb25lbnQpIHtcbiAgaWYgKG5lZWRXYXRjaChjb21wb25lbnQpKSB7XG4gICAgd2F0Y2hlZENvbXBvbmVudHMucHVzaChjb21wb25lbnQpXG4gICAgaWYgKCFsaXN0ZW5lZCkge1xuICAgICAgbGlzdGVuZWQgPSB0cnVlXG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhyb3R0bGUob25TY3JvbGwsIDEwMClcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVyLCBmYWxzZSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50SW5XaW5kb3cgKGNvbXBvbmVudCkge1xuICBjb25zdCByZWN0ID0gY29tcG9uZW50Lm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgcmV0dXJuIHJlY3QucmlnaHQgPiAwICYmIHJlY3QubGVmdCA8IHdpbmRvdy5pbm5lcldpZHRoICYmXG4gICAgICAgICByZWN0LmJvdHRvbSA+IDAgJiYgcmVjdC50b3AgPCB3aW5kb3cuaW5uZXJIZWlnaHRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludGVyc2VjdGlvbiAocmVjdCwgY3RSZWN0KSB7XG4gIHJldHVybiAocmVjdC5sZWZ0IDwgY3RSZWN0LnJpZ2h0ICYmIHJlY3QucmlnaHQgPiBjdFJlY3QubGVmdClcbiAgICAmJiAocmVjdC50b3AgPCBjdFJlY3QuYm90dG9tICYmIHJlY3QuYm90dG9tID4gY3RSZWN0LnRvcClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcG9uZW50QXBwZWFyIChjb21wb25lbnQpIHtcbiAgLy8gTk9URTogbm8gbW9yZSBzdXBwb3J0IGVtYmVkZWQgc2Nyb2xsZXJzLlxuICBjb25zdCBwYXJlbnRTY3JvbGxlciA9IGNvbXBvbmVudC5nZXRQYXJlbnRTY3JvbGxlcigpXG4gIGlmICghcGFyZW50U2Nyb2xsZXIpIHtcbiAgICByZXR1cm4gaXNDb21wb25lbnRJbldpbmRvdyhjb21wb25lbnQpXG4gIH1cbiAgcmV0dXJuIGlzQ29tcG9uZW50SW5XaW5kb3coY29tcG9uZW50KVxuICAgICYmIGhhc0ludGVyc2VjdGlvbihcbiAgICAgIGNvbXBvbmVudC5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgcGFyZW50U2Nyb2xsZXIubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbn1cblxuZnVuY3Rpb24gb25TY3JvbGwgKGUpIHtcbiAgbGV0IGRpcmVjdGlvblxuICAvLyBOT1RFOiB0aGlzIGNvbmRpdGlvbiBzdHJvbmdseSByZWxpZXMgb24gdGhlIHNjcm9sbGVyJ3MgaW1wbGVtZW50YXRpb24uXG4gIGlmIChlLm9yaWdpbmFsVHlwZSA9PT0gJ3Njcm9sbGluZycpIHtcbiAgICBkaXJlY3Rpb24gPSBlLmRpcmVjdGlvblxuICB9XG4gIGVsc2Uge1xuICAgIC8vIE5PVEU6IG9ubHkgVkVSVElDQUwgd2luZG93IHNjcm9sbCBjYW4gYmUgZGV0ZWN0ZWQuXG4gICAgY29uc3QgeSA9IHdpbmRvdy5zY3JvbGxZXG4gICAgZGlyZWN0aW9uID0geSA+PSBzY3JvbGxZID8gJ3VwJyA6ICdkb3duJ1xuICAgIHNjcm9sbFkgPSB5XG4gIH1cbiAgY29uc3QgbGVuID0gd2F0Y2hlZENvbXBvbmVudHMubGVuZ3RoXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB3YXRjaGVkQ29tcG9uZW50c1tpXVxuICAgIGNvbnN0IGFwcGVhciA9IGlzQ29tcG9uZW50QXBwZWFyKGNvbXBvbmVudClcbiAgICBpZiAoYXBwZWFyKSB7XG4gICAgICBjb21wb25lbnQuZGlzcGF0Y2hFdmVudCgnYXBwZWFyJywgeyBkaXJlY3Rpb24gfSlcbiAgICB9XG4gICAgZWxzZSBpZiAoIWFwcGVhcikge1xuICAgICAgY29tcG9uZW50LmRpc3BhdGNoRXZlbnQoJ2Rpc2FwcGVhcicsIHsgZGlyZWN0aW9uIH0pXG4gICAgfVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBFdmVudCAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgd2F0Y2hJZk5lZWRlZCB9IGZyb20gJy4vYXBwZWFyV2F0Y2hlcidcbmltcG9ydCB7IGlzQXJyYXkgfSBmcm9tICcuLi91dGlscydcbi8vIGNvbnN0IGxhenlsb2FkID0gcmVxdWlyZSgnLi9sYXp5bG9hZCcpXG4vLyBjb25zdCBhbmltYXRpb24gPSByZXF1aXJlKCcuL2FuaW1hdGlvbicpXG5cbmNvbnN0IFJFTkRFUklOR19JTkRFTlQgPSA4MDBcblxuY29uc3QgX2luc3RhbmNlTWFwID0ge31cbmNvbnN0IHR5cGVNYXAgPSB7fVxuY29uc3Qgc2Nyb2xsYWJsZVR5cGVzID0gW1xuICAnc2Nyb2xsZXInLFxuICAnaHNjcm9sbGVyJyxcbiAgJ3ZzY3JvbGxlcicsXG4gICdsaXN0JyxcbiAgJ2hsaXN0JyxcbiAgJ3ZsaXN0J1xuXVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDb21wb25lbnRNYW5hZ2VyIChpZCkge1xuICB0aGlzLmlkID0gaWRcbiAgdGhpcy5iYXRjaGVkID0gZmFsc2VcbiAgdGhpcy51cGRhdGVzID0gW11cbiAgdGhpcy5jb21wb25lbnRNYXAgPSB7fVxuICBfaW5zdGFuY2VNYXBbdGhpcy5pZF0gPSB0aGlzXG59XG5cbkNvbXBvbmVudE1hbmFnZXIuZ2V0SW5zdGFuY2UgPSBpbnN0YW5jZUlkID0+IF9pbnN0YW5jZU1hcFtpbnN0YW5jZUlkXVxuXG5Db21wb25lbnRNYW5hZ2VyLnJlZ2lzdGVyQ29tcG9uZW50ID0gKHR5cGUsIGRlZmluaXRpb24pID0+IHtcbiAgdHlwZU1hcFt0eXBlXSA9IGRlZmluaXRpb25cbn1cblxuQ29tcG9uZW50TWFuYWdlci5nZXRTY3JvbGxhYmxlVHlwZXMgPSAoKSA9PiBzY3JvbGxhYmxlVHlwZXNcblxuQ29tcG9uZW50TWFuYWdlci5wcm90b3R5cGUgPSB7XG5cbiAgZ2V0V2VleEluc3RhbmNlICgpIHtcbiAgICBpZiAoIXRoaXMuX3dlZXhJbnN0YW5jZSkge1xuICAgICAgdGhpcy5fd2VleEluc3RhbmNlID0gZ2xvYmFsLndlZXhcbiAgICAgICAgPyBnbG9iYWwud2VleC5nZXRJbnN0YW5jZSh0aGlzLmlkKVxuICAgICAgICA6IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3dlZXhJbnN0YW5jZVxuICB9LFxuXG4gIC8vIEZpcmUgYSBldmVudCAncmVuZGVyYmVnaW4nLydyZW5kZXJlbmQnIG9uIGJvZHkgZWxlbWVudC5cbiAgcmVuZGVyaW5nICgpIHtcbiAgICBmdW5jdGlvbiBfcmVuZGVyaW5nRW5kICgpIHtcbiAgICAgIC8vIGdldCB3ZWV4IGluc3RhbmNlIHJvb3RcbiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVuZGVyZW5kJykpXG4gICAgICB0aGlzLl9yZW5kZXJpbmdUaW1lciA9IG51bGxcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlbmRlcmluZ1RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVuZGVyaW5nVGltZXIpXG4gICAgICB0aGlzLl9yZW5kZXJpbmdUaW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgIF9yZW5kZXJpbmdFbmQuYmluZCh0aGlzKSxcbiAgICAgICAgUkVOREVSSU5HX0lOREVOVFxuICAgICAgKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVuZGVyYmVnaW4nKSlcbiAgICAgIHRoaXMuX3JlbmRlcmluZ1RpbWVyID0gc2V0VGltZW91dChcbiAgICAgICAgX3JlbmRlcmluZ0VuZC5iaW5kKHRoaXMpLFxuICAgICAgICBSRU5ERVJJTkdfSU5ERU5UXG4gICAgICApXG4gICAgfVxuICB9LFxuXG4gIGdldENvbXBvbmVudCAocmVmKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50TWFwW3JlZl1cbiAgfSxcblxuICByZW1vdmVDb21wb25lbnQgKHJlZikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgaWYgKCFyZWYgfHwgIXRoaXMuY29tcG9uZW50TWFwW3JlZl0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyByZW1vdmUgZnJvbSB0aGlzLmNvbXBvbmVudE1hcCBjdXJzaXZlbHlcbiAgICAoZnVuY3Rpb24gX3JlbW92ZUN1cnNpdmVseSAoX3JlZikge1xuICAgICAgY29uc3QgY2hpbGQgPSBzZWxmLmNvbXBvbmVudE1hcFtfcmVmXVxuICAgICAgY29uc3QgbGlzdGVuZXJzID0gY2hpbGQuX2xpc3RlbmVyc1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZC5kYXRhLmNoaWxkcmVuXG4gICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgX3JlbW92ZUN1cnNpdmVseShjaGlsZHJlbltpXS5yZWYpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSBldmVudHMgZnJvbSBfcmVmIGNvbXBvbmVudFxuICAgICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IHR5cGUgaW4gbGlzdGVuZXJzKSB7XG4gICAgICAgICAgY2hpbGQubm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1t0eXBlXSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZGVsZXRlIGNoaWxkLl9saXN0ZW5lcnNcbiAgICAgIGRlbGV0ZSBjaGlsZC5ub2RlLl9saXN0ZW5lcnNcbiAgICAgIC8vIHJlbW92ZSBfcmVmIGNvbXBvbmVudFxuICAgICAgZGVsZXRlIHNlbGYuY29tcG9uZW50TWFwW19yZWZdXG4gICAgfSkocmVmKVxuICB9LFxuXG4gIGNyZWF0ZUVsZW1lbnQgKGRhdGEsIG5vZGVUeXBlKSB7XG4gICAgbGV0IENvbXBvbmVudFR5cGUgPSB0eXBlTWFwW2RhdGEudHlwZV1cbiAgICBpZiAoIUNvbXBvbmVudFR5cGUpIHtcbiAgICAgIENvbXBvbmVudFR5cGUgPSB0eXBlTWFwWydkaXYnXVxuICAgIH1cblxuICAgIGRhdGEuaW5zdGFuY2VJZCA9IHRoaXMuaWRcbiAgICBjb25zdCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50VHlwZShkYXRhLCBub2RlVHlwZSlcbiAgICBjb25zdCByZWYgPSBkYXRhLnJlZlxuICAgIHRoaXMuY29tcG9uZW50TWFwW3JlZl0gPSBjb21wb25lbnRcbiAgICBjb21wb25lbnQubm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmJywgcmVmKVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudFxuICB9LFxuXG4gIC8qKlxuICAgKiBjcmVhdGVCb2R5OiBnZW5lcmF0ZSByb290IGNvbXBvbmVudFxuICAgKiBAcGFyYW0gIHtvYmplY3R9IGVsZW1lbnRcbiAgICovXG4gIGNyZWF0ZUJvZHkgKGVsZW1lbnQpIHtcbiAgICBjb25zb2xlLmxvZygnW2g1LXJlbmRlcl0gY3JlYXRlQm9keScsIGVsZW1lbnQpXG4gICAgaWYgKHRoaXMuY29tcG9uZW50TWFwWydfcm9vdCddKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBub2RlVHlwZSA9IGVsZW1lbnQudHlwZVxuICAgIGVsZW1lbnQudHlwZSA9ICdyb290J1xuICAgIGVsZW1lbnQucm9vdElkID0gdGhpcy5nZXRXZWV4SW5zdGFuY2UoKS5yb290SWRcbiAgICBlbGVtZW50LnJlZiA9ICdfcm9vdCdcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoZWxlbWVudCwgbm9kZVR5cGUpXG4gICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdGhpcy5nZXRXZWV4SW5zdGFuY2UoKS5yb290SWQpXG4gICAgICAgICAgfHwgZG9jdW1lbnQuYm9keVxuICAgIGJvZHkuYXBwZW5kQ2hpbGQocm9vdC5ub2RlKVxuICAgIHJvb3QuX2FwcGVuZGVkID0gdHJ1ZVxuXG4gICAgdGhpcy5oYW5kbGVBcHBlbmQocm9vdClcbiAgfSxcblxuICBhcHBlbmRDaGlsZCAocGFyZW50UmVmLCBkYXRhKSB7XG4gICAgbGV0IHBhcmVudCA9IHRoaXMuY29tcG9uZW50TWFwW3BhcmVudFJlZl1cblxuICAgIGlmICh0aGlzLmNvbXBvbmVudE1hcFtkYXRhLnJlZl0gfHwgIXBhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudFJlZiA9PT0gJ19yb290JyAmJiAhcGFyZW50KSB7XG4gICAgICBwYXJlbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQoe1xuICAgICAgICB0eXBlOiAncm9vdCcsXG4gICAgICAgIHJvb3RJZDogdGhpcy5nZXRXZWV4SW5zdGFuY2UoKS5yb290SWQsXG4gICAgICAgIHJlZjogJ19yb290J1xuICAgICAgfSlcbiAgICAgIHBhcmVudC5fYXBwZW5kZWQgPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgY2hpbGQgPSBwYXJlbnQuYXBwZW5kQ2hpbGQoZGF0YSlcblxuICAgIC8vIEluIHNvbWUgcGFyZW50IGNvbXBvbmVudCB0aGUgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kXG4gICAgLy8gYXBwZW5kQ2hpbGQgZGlkbid0IHJldHVybiB0aGUgY29tcG9uZW50IGF0IGFsbCwgdGhlcmVmb3JcbiAgICAvLyBjaGlsZCBtYXliZSBhIHVuZGVmaW5lZCBvYmplY3QuXG4gICAgaWYgKGNoaWxkKSB7XG4gICAgICBjaGlsZC5wYXJlbnRSZWYgPSBwYXJlbnRSZWZcbiAgICB9XG5cbiAgICBpZiAoY2hpbGQgJiYgcGFyZW50Ll9hcHBlbmRlZCkge1xuICAgICAgdGhpcy5oYW5kbGVBcHBlbmQoY2hpbGQpXG4gICAgfVxuICB9LFxuXG4gIC8vIGFwcGVuZENoaWxkcmVuIChyZWYsIGVsZW1lbnRzKSB7XG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAvLyAgICAgdGhpcy5hcHBlbmRDaGlsZChyZWYsIGVsZW1lbnRzW2ldKVxuICAvLyAgIH1cbiAgLy8gfSxcblxuICByZW1vdmVFbGVtZW50IChyZWYpIHtcbiAgICBpZiAoaXNBcnJheShyZWYpKSB7XG4gICAgICByZXR1cm4gcmVmLm1hcChyID0+IHRoaXMucmVtb3ZlRWxlbWVudChyKSlcbiAgICB9XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRNYXBbcmVmXVxuICAgIC8vIGZpcmUgZXZlbnQgZm9yIHJlbmRlcmluZyBkb20gb24gYm9keSBlbG1lbnQuXG4gICAgdGhpcy5yZW5kZXJpbmcoKVxuXG4gICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQucGFyZW50UmVmKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtjb21wb25lbnQucGFyZW50UmVmXVxuICAgICAgY29tcG9uZW50Lm9uUmVtb3ZlICYmIGNvbXBvbmVudC5vblJlbW92ZSgpXG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoY29tcG9uZW50KVxuICAgIH1cbiAgICBlbHNlIGlmICghY29tcG9uZW50KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgb2YgcmVmICcke3JlZn0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgW2g1LXJlbmRlcl0gcGFyZW50IGNvbXBvbmVudCAnJHtjb21wb25lbnQucGFyZW50UmVmfScgZG9lcyBub3QgZXhpc3QuYClcbiAgICB9XG4gIH0sXG5cbiAgbW92ZUVsZW1lbnQgKHJlZiwgcGFyZW50UmVmLCBpbmRleCkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50TWFwW3JlZl1cbiAgICBjb25zdCBuZXdQYXJlbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtwYXJlbnRSZWZdXG4gICAgY29uc3Qgb2xkUGFyZW50UmVmID0gY29tcG9uZW50LnBhcmVudFJlZlxuICAgIGxldCBjaGlsZHJlbiwgYmVmb3JlLCBpLCBsXG4gICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgb2YgcmVmICcke3JlZn0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgfVxuICAgIGlmICghbmV3UGFyZW50KSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtoNS1yZW5kZXJdIHBhcmVudCBjb21wb25lbnQgJyR7cGFyZW50UmVmfScgZG9lcyBub3QgZXhpc3QuYClcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPCAtMSkge1xuICAgICAgaW5kZXggPSAtMVxuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIGluZGV4IGNhbm5vdCBiZSBsZXNzIHRoYW4gLTEuJylcbiAgICB9XG5cbiAgICAvLyBmaXJlIGV2ZW50IGZvciByZW5kZXJpbmcuXG4gICAgdGhpcy5yZW5kZXJpbmcoKVxuXG4gICAgY2hpbGRyZW4gPSBuZXdQYXJlbnQuZGF0YS5jaGlsZHJlblxuICAgIGlmIChjaGlsZHJlblxuICAgICAgICAmJiBjaGlsZHJlbi5sZW5ndGhcbiAgICAgICAgJiYgaW5kZXggIT09IC0xXG4gICAgICAgICYmIGluZGV4IDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBiZWZvcmUgPSB0aGlzLmNvbXBvbmVudE1hcFtuZXdQYXJlbnQuZGF0YS5jaGlsZHJlbltpbmRleF0ucmVmXVxuICAgIH1cblxuICAgIC8vIHJlbW92ZSBmcm9tIG9sZFBhcmVudC5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKG9sZFBhcmVudFJlZiAmJiB0aGlzLmNvbXBvbmVudE1hcFtvbGRQYXJlbnRSZWZdKSB7XG4gICAgICBjaGlsZHJlbiA9IHRoaXMuY29tcG9uZW50TWFwW29sZFBhcmVudFJlZl0uZGF0YS5jaGlsZHJlblxuICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBmb3IgKGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gcmVmKSB7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobCA+IGkpIHtcbiAgICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIG5ld1BhcmVudC5pbnNlcnRCZWZvcmUoY29tcG9uZW50LCBiZWZvcmUpXG5cbiAgICBjb21wb25lbnQub25Nb3ZlICYmIGNvbXBvbmVudC5vbk1vdmUocGFyZW50UmVmLCBpbmRleClcbiAgfSxcblxuICBpbnNlcnRCZWZvcmUgKHJlZiwgZGF0YSkge1xuICAgIGxldCBjaGlsZCwgcGFyZW50XG4gICAgY29uc3QgYmVmb3JlID0gdGhpcy5jb21wb25lbnRNYXBbcmVmXVxuICAgIGNoaWxkID0gdGhpcy5jb21wb25lbnRNYXBbZGF0YS5yZWZdXG4gICAgYmVmb3JlICYmIChwYXJlbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtiZWZvcmUucGFyZW50UmVmXSlcbiAgICBpZiAoY2hpbGQgfHwgIXBhcmVudCB8fCAhYmVmb3JlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjaGlsZCA9IHRoaXMuY3JlYXRlRWxlbWVudChkYXRhKVxuICAgIGlmIChjaGlsZCkge1xuICAgICAgY2hpbGQucGFyZW50UmVmID0gYmVmb3JlLnBhcmVudFJlZlxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBvbmVudE1hcFtiZWZvcmUucGFyZW50UmVmXS5fYXBwZW5kZWQpIHtcbiAgICAgIHRoaXMuaGFuZGxlQXBwZW5kKGNoaWxkKVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogYWRkRWxlbWVudFxuICAgKiBJZiBpbmRleCBpcyBsYXJnZXQgdGhhbiBhbnkgY2hpbGQncyBpbmRleCwgdGhlXG4gICAqIGVsZW1lbnQgd2lsbCBiZSBhcHBlbmRlZCBiZWhpbmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJlbnRSZWZcbiAgICogQHBhcmFtIHtvYmp9IGVsZW1lbnQgKGRhdGEgb2YgdGhlIGNvbXBvbmVudClcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqL1xuICBhZGRFbGVtZW50IChwYXJlbnRSZWYsIGVsZW1lbnQsIGluZGV4KSB7XG4gICAgLy8gZmlyZSBldmVudCBmb3IgcmVuZGVyaW5nIGRvbSBvbiBib2R5IGVsbWVudC5cbiAgICB0aGlzLnJlbmRlcmluZygpXG5cbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtwYXJlbnRSZWZdXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5kYXRhLmNoaWxkcmVuXG4gICAgLy8gLTEgbWVhbnMgYXBwZW5kIGFzIHRoZSBsYXN0LlxuICAgIGlmIChpbmRleCA8IC0xKSB7XG4gICAgICBpbmRleCA9IC0xXG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gaW5kZXggY2Fubm90IGJlIGxlc3MgdGhhbiAtMS4nKVxuICAgIH1cbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgICYmIGNoaWxkcmVuLmxlbmd0aCA+IGluZGV4XG4gICAgICAgICYmIGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoY2hpbGRyZW5baW5kZXhdLnJlZiwgZWxlbWVudClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKHBhcmVudFJlZiwgZWxlbWVudClcbiAgICB9XG4gIH0sXG5cbiAgYWRkRXZlbnQgKHJlZiwgdHlwZSkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50TWFwW3JlZl1cbiAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtoNS1yZW5kZXJdIGNvbXBvbmVudCBvZiByZWYgJyR7cmVmfScgZG9lcyBub3QgZXhpc3QuYClcbiAgICB9XG4gICAgY29tcG9uZW50LmJpbmRFdmVudHMoW3R5cGVdKVxuICB9LFxuXG4gIHJlbW92ZUV2ZW50IChyZWYsIHR5cGUpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtyZWZdXG4gICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgb2YgcmVmICcke3JlZn0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgfVxuICAgIGNvbXBvbmVudC51bmJpbmRFdmVudHMoW3R5cGVdKVxuICB9LFxuXG4gIHVwZGF0ZUF0dHJzIChyZWYsIGF0dHJzKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRNYXBbcmVmXVxuICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihgW2g1LXJlbmRlcl0gY29tcG9uZW50IG9mIHJlZiAnJHtyZWZ9JyBkb2VzIG5vdCBleGlzdC5gKVxuICAgIH1cbiAgICBjb21wb25lbnQudXBkYXRlQXR0cnMoYXR0cnMpXG4gIH0sXG5cbiAgLy8gc2V0U3R5bGUgKHJlZiwga2V5LCB2YWx1ZSkge1xuICAvLyAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50TWFwW3JlZl1cbiAgLy8gICBpZiAoIWNvbXBvbmVudCkge1xuICAvLyAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoYFtoNS1yZW5kZXJdIGNvbXBvbmVudCBvZiByZWYgJyR7cmVmfScgZG9lcyBub3QgZXhpc3QuYClcbiAgLy8gICB9XG4gIC8vICAgY29tcG9uZW50LnVwZGF0ZVN0eWxlKHsgW2tleV06IHZhbHVlIH0pXG4gIC8vIH0sXG5cbiAgdXBkYXRlU3R5bGUgKHJlZiwgc3R5bGUpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudE1hcFtyZWZdXG4gICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGBbaDUtcmVuZGVyXSBjb21wb25lbnQgb2YgcmVmICcke3JlZn0nIGRvZXMgbm90IGV4aXN0LmApXG4gICAgfVxuICAgIGNvbXBvbmVudC51cGRhdGVTdHlsZShzdHlsZSlcbiAgfSxcblxuICBoYW5kbGVBcHBlbmQgKGNvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudC5fYXBwZW5kZWQgPSB0cnVlXG4gICAgY29tcG9uZW50Lm9uQXBwZW5kICYmIGNvbXBvbmVudC5vbkFwcGVuZCgpXG5cbiAgICAvLyBpbnZva2Ugb25BcHBlbmQgb24gY2hpbGRyZW4gcmVjdXJzaXZlbHlcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbXBvbmVudC5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5jb21wb25lbnRNYXBbY2hpbGRyZW5baV0ucmVmXVxuICAgICAgICBpZiAoY2hpbGQpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUFwcGVuZChjaGlsZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHdhdGNoIGFwcGVhci9kaXNhcHBlYXIgb2YgdGhlIGNvbXBvbmVudCBpZiBuZWVkZWRcbiAgICB3YXRjaElmTmVlZGVkKGNvbXBvbmVudClcblxuICAgIC8vIGRvIGxhenlsb2FkIGlmIG5lZWRlZFxuICAgIGNvbXBvbmVudC5maXJlTGF6eWxvYWQoKVxuICAgIC8vIGxhenlsb2FkLnN0YXJ0SWZOZWVkZWQoY29tcG9uZW50KTtcbiAgfSxcblxuICBjcmVhdGVGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCd3ZWV4OmNyZWF0ZWZpbmlzaCcpKVxuICB9LFxuXG4gIHVwZGF0ZUZpbmlzaCAoY2FsbGJhY2spIHtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3dlZXg6dXBkYXRlZmluaXNoJykpXG4gIH0sXG5cbiAgcmVmcmVzaEZpbmlzaCAoY2FsbGJhY2spIHtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3dlZXg6cmVmcmVzaGZpbmlzaCcpKVxuICB9XG5cbn1cblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qIGdsb2JhbCBYTUxIdHRwUmVxdWVzdCAqL1xuXG4ndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gbG9hZEJ5WEhSIChjb25maWcsIGNhbGxiYWNrKSB7XG4gIGlmICghY29uZmlnLnNvdXJjZSkge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcigneGhyIGxvYWRlcjogbWlzc2luZyBjb25maWcuc291cmNlLicpKVxuICB9XG4gIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gIHhoci5vcGVuKCdHRVQnLCBjb25maWcuc291cmNlKVxuICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgIGNhbGxiYWNrKG51bGwsIHRoaXMucmVzcG9uc2VUZXh0KVxuICB9XG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgY2FsbGJhY2soZXJyb3IpXG4gIH1cbiAgeGhyLnNlbmQoKVxufVxuXG5mdW5jdGlvbiBsb2FkQnlKc29ucCAoY29uZmlnLCBjYWxsYmFjaykge1xuICBpZiAoIWNvbmZpZy5zb3VyY2UpIHtcbiAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ2pzb25wIGxvYWRlcjogbWlzc2luZyBjb25maWcuc291cmNlLicpKVxuICB9XG4gIGNvbnN0IGNhbGxiYWNrTmFtZSA9IGNvbmZpZy5qc29ucENhbGxiYWNrIHx8ICd3ZWV4SnNvbnBDYWxsYmFjaydcbiAgd2luZG93W2NhbGxiYWNrTmFtZV0gPSBmdW5jdGlvbiAoY29kZSkge1xuICAgIGlmIChjb2RlKSB7XG4gICAgICBjYWxsYmFjayhudWxsLCBjb2RlKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKG5ldyBFcnJvcignbG9hZCBieSBqc29ucCBlcnJvcicpKVxuICAgIH1cbiAgfVxuICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICBzY3JpcHQuc3JjID0gZGVjb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5zb3VyY2UpXG4gIHNjcmlwdC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCdcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpXG59XG5cbmZ1bmN0aW9uIGxvYWRCeVNvdXJjZUNvZGUgKGNvbmZpZywgY2FsbGJhY2spIHtcbiAgLy8gc3JjIGlzIHRoZSBqc2J1bmRsZS5cbiAgLy8gbm8gbmVlZCB0byBmZXRjaCBmcm9tIGFueXdoZXJlLlxuICBpZiAoY29uZmlnLnNvdXJjZSkge1xuICAgIGNhbGxiYWNrKG51bGwsIGNvbmZpZy5zb3VyY2UpXG4gIH1cbiAgZWxzZSB7XG4gICAgY2FsbGJhY2sobmV3IEVycm9yKCdzb3VyY2UgY29kZSBsYW9kZXI6IG1pc3NpbmcgY29uZmlnLnNvdXJjZS4nKSlcbiAgfVxufVxuXG5jb25zdCBjYWxsYmFja01hcCA9IHtcbiAgeGhyOiBsb2FkQnlYSFIsXG4gIGpzb25wOiBsb2FkQnlKc29ucCxcbiAgc291cmNlOiBsb2FkQnlTb3VyY2VDb2RlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkIChvcHRpb25zLCBjYWxsYmFjaykge1xuICBjb25zdCBsb2FkRm4gPSBjYWxsYmFja01hcFtvcHRpb25zLmxvYWRlcl1cbiAgbG9hZEZuKG9wdGlvbnMsIGNhbGxiYWNrKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJMb2FkZXIgKG5hbWUsIGxvYWRlckZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBsb2FkZXJGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2tNYXBbbmFtZV0gPSBsb2FkZXJGdW5jXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBBIHNpbXBsZSB2aXJ0dWFsIGRvbSBpbXBsZW1lbnRhdGlvblxuICovXG5pbXBvcnQgQ29tcG9uZW50TWFuYWdlciBmcm9tICcuL2NvbXBvbmVudE1hbmFnZXInXG5cbmV4cG9ydCB7IENvbXBvbmVudE1hbmFnZXIgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgTk9UX1BYX05VTUJFUl9QUk9QRVJUSUVTID0gWydmbGV4JywgJ29wYWNpdHknLCAnekluZGV4JywgJ2ZvbnRXZWlnaHQnXVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyU3R5bGVzIChzdHlsZXMpIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdHlsZXNba2V5XVxuICAgIGNvbnN0IHBhcnNlciA9IHRoaXMuZ2V0RmlsdGVycyhrZXkpW3R5cGVvZiB2YWx1ZV1cbiAgICBpZiAodHlwZW9mIHBhcnNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgc3R5bGVzW2tleV0gPSBwYXJzZXIodmFsdWUpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWx0ZXJzIChrZXkpIHtcbiAgaWYgKE5PVF9QWF9OVU1CRVJfUFJPUEVSVElFUy5pbmRleE9mKGtleSkgIT09IC0xKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBudW1iZXI6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiB2YWwgKyAncHgnXG4gICAgfSxcbiAgICBzdHJpbmc6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIC8vIHN0cmluZyBvZiBhIG51bWJlciBzdWZmaXhlZCB3aXRoIGEgJ3B4JyBvciAnd3gnIHVuaXQuIG9yaWdpbmFsIFJlZ0V4cCBpcyAvXi0/XFxkKlxcLj9cXGQrKD86cHgpPyQvXG4gICAgICBjb25zdCBtYXRjaCA9IHZhbC5tYXRjaCgvXihbKy1dP1xcZC4qKSsoW3Asd114KSQvKVxuICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmxlbmd0aCA9PT0gMykge1xuICAgICAgICBpZiAobWF0Y2hbMl0gPT09ICdweCcpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXRjaFsxXSkgKyAncHgnXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWF0Y2hbMl0gPT09ICd3eCcpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXRjaFsxXSkgKiBnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VQaXhlbFJhdGlvICsgJ3B4J1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoa2V5Lm1hdGNoKC90cmFuc2Zvcm0vKSAmJiB2YWwubWF0Y2goL3RyYW5zbGF0ZS8pKSB7XG4gICAgICAgIGxldCByZXQgPSB2YWwucmVwbGFjZSgvXFxkKlxcLj9cXGQrcHgvZywgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHBhcnNlRmxvYXQobWF0Y2gpKSArICdweCdcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJldC5tYXRjaCgvd3gvKSkge1xuICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKC9cXGQqXFwuP1xcZCt3eC9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChwYXJzZUZsb2F0KG1hdGNoKSkgKiBnbG9iYWwuV1hFbnZpcm9ubWVudC5kZXZpY2VQaXhlbFJhdGlvICsgJ3B4J1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFxuICAgICAgfVxuICAgICAgaWYgKGtleS5tYXRjaCgvXmJvcmRlciQvKSAmJiB2YWwubWF0Y2goL15cXGQrKD86W3cscF14KT9cXHMrLykpIHtcbiAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoL14oXFxkKyg/Olt3LHBdeCk/KS8sIGZ1bmN0aW9uICgkMCwgJDEpIHtcbiAgICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdCgkMSkgKiAodmFsLm1hdGNoKC9eXFxkKyg/Ond4KSsvKSA/IGdsb2JhbC5XWEVudmlyb25tZW50LmRldmljZVBpeGVsUmF0aW8gOiAxKVxuICAgICAgICAgIHJldHVybiB2ICsgJ3B4J1xuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbFxuICAgIH1cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHsgZXh0ZW5kLCBjYW1lbFRvS2ViYWIgfSBmcm9tICcuLi8uLi91dGlscydcbmltcG9ydCB7IGdldEZpbHRlcnMgfSBmcm9tICcuL3ZhbHVlRmlsdGVyJ1xuXG5sZXQgcHNldWRvSWQgPSAwXG5mdW5jdGlvbiBnZXRQc2V1ZG9JZCAoKSB7XG4gIHJldHVybiAnJyArIChwc2V1ZG9JZCsrKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlIChub2RlVHlwZSkge1xuICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChub2RlVHlwZSB8fCAnZGl2Jylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoaWxkcmVuICgpIHtcbiAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgY29uc3QgcGFyZW50UmVmID0gdGhpcy5kYXRhLnJlZlxuICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgbGV0IGlzRmxleCA9IGZhbHNlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRyZW5baV0uaW5zdGFuY2VJZCA9IHRoaXMuZGF0YS5pbnN0YW5jZUlkXG4gICAgICBjb25zdCBjaGlsZCA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChjaGlsZHJlbltpXSlcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNoaWxkLm5vZGUpXG4gICAgICBjaGlsZC5wYXJlbnRSZWYgPSBwYXJlbnRSZWZcbiAgICAgIGlmICghaXNGbGV4XG4gICAgICAgICYmIGNoaWxkLmRhdGEuc3R5bGVcbiAgICAgICAgJiYgY2hpbGQuZGF0YS5zdHlsZS5oYXNPd25Qcm9wZXJ0eSgnZmxleCcpXG4gICAgICApIHtcbiAgICAgICAgaXNGbGV4ID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZENoaWxkIChkYXRhKSB7XG4gIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICBjb25zdCBjaGlsZCA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChkYXRhKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgLy8gdXBkYXRlIHRoaXMuZGF0YS5jaGlsZHJlblxuICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICB0aGlzLmRhdGEuY2hpbGRyZW4gPSBbZGF0YV1cbiAgfVxuICBlbHNlIHtcbiAgICBjaGlsZHJlbi5wdXNoKGRhdGEpXG4gIH1cbiAgcmV0dXJuIGNoaWxkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKGNoaWxkLCBiZWZvcmUpIHtcbiAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgbGV0IGkgPSAwXG4gIGxldCBsXG4gIGxldCBpc0FwcGVuZCA9IGZhbHNlXG5cbiAgLy8gdXBkYXRlIHRoaXMuZGF0YS5jaGlsZHJlblxuICBpZiAoIWNoaWxkcmVuIHx8ICFjaGlsZHJlbi5sZW5ndGggfHwgIWJlZm9yZSkge1xuICAgIGlzQXBwZW5kID0gdHJ1ZVxuICB9XG4gIGVsc2Uge1xuICAgIGZvciAobCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gYmVmb3JlLmRhdGEucmVmKSB7XG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpID09PSBsKSB7XG4gICAgICBpc0FwcGVuZCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBpZiAoaXNBcHBlbmQpIHtcbiAgICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgICBjaGlsZHJlbi5wdXNoKGNoaWxkLmRhdGEpXG4gIH1cbiAgZWxzZSB7XG4gICAgaWYgKGJlZm9yZS5maXhlZFBsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLm5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLm5vZGUsIGJlZm9yZS5maXhlZFBsYWNlaG9sZGVyKVxuICAgIH1cbiAgICBlbHNlIGlmIChiZWZvcmUuc3RpY2t5UGxhY2Vob2xkZXIpIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLnN0aWNreVBsYWNlaG9sZGVyKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLm5vZGUpXG4gICAgfVxuICAgIGNoaWxkcmVuLnNwbGljZShpLCAwLCBjaGlsZC5kYXRhKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDaGlsZCAoY2hpbGQpIHtcbiAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgLy8gcmVtb3ZlIGZyb20gdGhpcy5kYXRhLmNoaWxkcmVuXG4gIGxldCBpID0gMFxuICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGxldCBsXG4gICAgZm9yIChsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoY2hpbGRyZW5baV0ucmVmID09PSBjaGlsZC5kYXRhLnJlZikge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA8IGwpIHtcbiAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAxKVxuICAgIH1cbiAgfVxuICAvLyByZW1vdmUgZnJvbSBjb21wb25lbnRNYXAgcmVjdXJzaXZlbHlcbiAgY29tcG9uZW50TWFuYWdlci5yZW1vdmVDb21wb25lbnQoY2hpbGQuZGF0YS5yZWYpXG4gIGNoaWxkLnVuc2V0UG9zaXRpb24oKVxuICBjaGlsZC5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQubm9kZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUF0dHJzIChhdHRycykge1xuICAvLyBOb3Rl77yaYXR0ciBtdXN0IGJlIGluamVjdGVkIGludG8gdGhlIGRvbSBlbGVtZW50IGJlY2F1c2VcbiAgLy8gaXQgd2lsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBvdXRzaWRlIGRldmVsb3BlciBieSBldmVudC50YXJnZXQuYXR0ci5cbiAgaWYgKCF0aGlzLm5vZGUuYXR0cikge1xuICAgIHRoaXMubm9kZS5hdHRyID0ge31cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiBhdHRycykge1xuICAgIGNvbnN0IHZhbHVlID0gYXR0cnNba2V5XVxuICAgIGNvbnN0IGF0dHJTZXR0ZXIgPSB0aGlzLmF0dHJba2V5XVxuICAgIGlmICh0eXBlb2YgYXR0clNldHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXR0clNldHRlci5jYWxsKHRoaXMsIHZhbHVlKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgICAgICB0aGlzLm5vZGVba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZShrZXksIHZhbHVlKVxuICAgICAgfVxuICAgICAgdGhpcy5ub2RlLmF0dHJba2V5XSA9IHZhbHVlXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdHlsZSAoc3R5bGUpIHtcbiAgY29uc3QgcHNldWRvRGF0YSA9IHt9XG4gIGZvciAoY29uc3Qga2V5IGluIHN0eWxlKSB7XG4gICAgbGV0IHZhbHVlID0gc3R5bGVba2V5XVxuICAgIGNvbnN0IHBzZXVkb0NsYXNzUmVnID0gL14oW146XSspKCg/OjpbXjpdKykrKS9cbiAgICBjb25zdCBtYXRjaCA9IGtleS5tYXRjaChwc2V1ZG9DbGFzc1JlZylcbiAgICBsZXQgc3R5bGVOYW1lLCBwc2V1ZG9OYW1lXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBzdHlsZU5hbWUgPSBtYXRjaFsxXVxuICAgICAgcHNldWRvTmFtZSA9IG1hdGNoWzJdXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3R5bGVOYW1lID0ga2V5XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVTZXR0ZXIgPSB0aGlzLnN0eWxlW3N0eWxlTmFtZV1cbiAgICBpZiAodHlwZW9mIHN0eWxlU2V0dGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdHlsZVNldHRlci5jYWxsKHRoaXMsIHZhbHVlKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgcGFyc2VyID0gZ2V0RmlsdGVycyhzdHlsZU5hbWUpW3R5cGVvZiB2YWx1ZV1cbiAgICBpZiAodHlwZW9mIHBhcnNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFsdWUgPSBwYXJzZXIodmFsdWUpXG4gICAgfVxuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5ub2RlLnN0eWxlW3N0eWxlTmFtZV0gPSB2YWx1ZVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAocHNldWRvRGF0YVtwc2V1ZG9OYW1lXSkge1xuICAgICAgcHNldWRvRGF0YVtwc2V1ZG9OYW1lXVtzdHlsZU5hbWVdID0gdmFsdWVcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBwc2V1ZG9EYXRhW3BzZXVkb05hbWVdID0geyBbc3R5bGVOYW1lXTogdmFsdWUgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhwc2V1ZG9EYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgcHJvY2Vzc1BzZXVkb0NsYXNzKHRoaXMsICdkYXRhLXBzZXVkby1pZCcsIHBzZXVkb0RhdGEpXG4gIH1cbn1cblxuLy8gbW9kaWZ5IHN0eWxlcyBvZiBwc2V1ZG8gY2xhc3MuXG5mdW5jdGlvbiBwcm9jZXNzUHNldWRvQ2xhc3MgKGNvbXBvbmVudCwgaWROYW1lLCBwc2V1ZG9EYXRhKSB7XG4gIGxldCBwc2V1ZG9JZCA9IGNvbXBvbmVudC5ub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1wc2V1ZG8taWQnKVxuXG4gIGZ1bmN0aW9uIGdldENzc1RleHQgKHNlbGVjdG9yLCBydWxlc09iaikge1xuICAgIC8vIFRPRE86IG11c3QgcHJvY2VzcyB2ZW5kb3JzIGlmIG5lZWRlZC5cbiAgICAvLyAhaW1wb3J0YW50IGlzIG5lZWRlZCBzaW5jZSB0aGUgc3R5bGUgcnVsZXMgaXMgaW5saW5lIGZvciBtb3N0IGNvbXBvbmVudHMuXG4gICAgY29uc3QgcnVsZXNUZXh0ID0gT2JqZWN0LmtleXMocnVsZXNPYmopLm1hcChrZXkgPT4gYCR7Y2FtZWxUb0tlYmFiKGtleSl9OiR7cnVsZXNPYmpba2V5XX0haW1wb3J0YW50O2ApLmpvaW4oJycpXG4gICAgcmV0dXJuIGAke3NlbGVjdG9yfXske3J1bGVzVGV4dH19YFxuICB9XG5cbiAgaWYgKCFwc2V1ZG9JZCkge1xuICAgIHBzZXVkb0lkID0gZ2V0UHNldWRvSWQoKVxuICAgIGNvbXBvbmVudC5ub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1wc2V1ZG8taWQnLCBwc2V1ZG9JZClcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJ1xuICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgnZGF0YS1wc2V1ZG8taWQnLCBwc2V1ZG9JZClcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHN0eWxlKVxuICAgIGNvbnN0IGNzc1RleHQgPSBPYmplY3Qua2V5cyhwc2V1ZG9EYXRhKS5tYXAocHNldWRvID0+IHtcbiAgICAgIGNvbnN0IHJ1bGVzID0gcHNldWRvRGF0YVtwc2V1ZG9dXG4gICAgICByZXR1cm4gZ2V0Q3NzVGV4dChgW2RhdGEtcHNldWRvLWlkPVwiJHtwc2V1ZG9JZH1cIl0ke3BzZXVkb31gLCBydWxlcylcbiAgICB9KS5qb2luKCcnKVxuICAgIHJldHVybiBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3NUZXh0KSlcbiAgfVxuXG4gIGNvbnN0IHN0eWxlU2hlZXRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQuc3R5bGVTaGVldHMgfHwgW10pXG4gICAgLmZpbHRlcihzdHlsZSA9PiBzdHlsZS5vd25lck5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXBzZXVkby1pZCcpID09PSBwc2V1ZG9JZClcbiAgaWYgKCFzdHlsZVNoZWV0cyB8fCBzdHlsZVNoZWV0cy5sZW5ndGggPD0gMCkge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0WzBdXG4gIGNvbnN0IHJ1bGVzID0gc3R5bGVTaGVldC5jc3NSdWxlcyB8fCBzdHlsZVNoZWV0LnJ1bGVzXG4gIE9iamVjdC5rZXlzKHBzZXVkb0RhdGEpLmZvckVhY2gocHNldWRvID0+IHtcbiAgICBjb25zdCBkYXRhID0gcHNldWRvRGF0YVtwc2V1ZG9dXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgW2RhdGEtcHNldWRvLWlkPVwiJHtwc2V1ZG9JZH1cIl0ke3BzZXVkb31gXG4gICAgY29uc3QgcmVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocnVsZXMpLnJlZHVjZSgocmVzLCBydWxlLCBpZHgpID0+IHtcbiAgICAgIChydWxlLnNlbGVjdG9yVGV4dCA9PT0gc2VsZWN0b3IpICYmIChyZXMuaWR4ID0gaWR4KVxuICAgICAgcmV0dXJuIHJlc1xuICAgIH0sIHsgaWR4OiAtMSB9KVxuICAgIGNvbnN0IHsgaWR4IH0gPSByZXNcbiAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgY29uc3QgcHNldWRvUnVsZSA9IHJ1bGVzW2lkeF1cbiAgICAgIGNvbnN0IG1hdGNoID0gcHNldWRvUnVsZS5jc3NUZXh0Lm1hdGNoKC9eW157XStcXHsoW159XSspXFx9LylcbiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaFsxXSkge1xuICAgICAgICBjb25zdCBydWxlc0RhdGEgPSBtYXRjaFsxXS5zcGxpdCgnOycpLnJlZHVjZSgocmVzLCBzdHIpID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaCgvKFxcUyspXFxzKjpcXHMqKFxcUyspLylcbiAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0gJiYgbWF0Y2hbMl0pIHtcbiAgICAgICAgICAgIHJlc1ttYXRjaFsxXV0gPSBtYXRjaFsyXVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzXG4gICAgICAgIH0sIHt9KVxuICAgICAgICBleHRlbmQocnVsZXNEYXRhLCBkYXRhKVxuICAgICAgICBPYmplY3Qua2V5cyhydWxlc0RhdGEpLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgaWYgKCFydWxlc0RhdGFbcnVsZV0pIHsgZGVsZXRlIHJ1bGVzRGF0YVtydWxlXSB9XG4gICAgICAgIH0pXG4gICAgICAgIHN0eWxlU2hlZXQuZGVsZXRlUnVsZShpZHgpXG4gICAgICAgIHN0eWxlU2hlZXQuaW5zZXJ0UnVsZShnZXRDc3NUZXh0KHNlbGVjdG9yLCBydWxlc0RhdGEpLCBydWxlcy5sZW5ndGggLSAxKVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN0eWxlU2hlZXQuaW5zZXJ0UnVsZShnZXRDc3NUZXh0KHNlbGVjdG9yLCBkYXRhKSwgcnVsZXMubGVuZ3RoKVxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRFdmVudHMgKGV2dHMpIHtcbiAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgY29uc3Qgd2VleEluc3RhbmNlID0gdGhpcy5nZXRXZWV4SW5zdGFuY2UoKVxuICBldnRzLm1hcChmdW5jdGlvbiAoZXZ0KSB7XG4gICAgY29uc3QgZnVuYyA9IHNlbGYuZXZlbnRbZXZ0XSB8fCB7fVxuICAgIGNvbnN0IHNldHRlciA9IGZ1bmMuc2V0dGVyXG4gICAgaWYgKHNldHRlcikge1xuICAgICAgc2VsZi5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBzZXR0ZXIpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyID0gd2VleEluc3RhbmNlLnNlbmRlclxuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIGRvIHN0b3AgYnViYmxpbmcuXG4gICAgICAvLyBkbyBub3QgcHJldmVudCBkZWZhdWx0LCBvdGhlcndpc2UgdGhlIHRvdWNoc3RhcnRcbiAgICAgIC8vIGV2ZW50IHdpbGwgbm8gbG9uZ2VyIHRyaWdnZXIgYSBjbGljayBldmVudFxuICAgICAgaWYgKGUuX2FscmVhZHlUcmlnZ2VyZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBlLl9hbHJlYWR5VHJpZ2dlcmVkID0gdHJ1ZVxuICAgICAgY29uc3QgZXZlbnQgPSBleHRlbmQoe30sIGUpXG4gICAgICBldmVudC50YXJnZXQgPSBzZWxmLmRhdGFcbiAgICAgIHNlbmRlci5maXJlRXZlbnQoc2VsZi5kYXRhLnJlZiwgZXZ0LCB7XG4gICAgICAgIGV4dHJhOiBmdW5jLmV4dHJhICYmIGZ1bmMuZXh0cmEuYmluZChzZWxmKSxcbiAgICAgICAgdXBkYXRvcjogZnVuYy51cGRhdG9yICYmIGZ1bmMudXBkYXRvci5iaW5kKHNlbGYpXG4gICAgICB9LCBldmVudClcbiAgICB9XG4gICAgc2VsZi5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBsaXN0ZW5lciwgZmFsc2UsIGZhbHNlKVxuICAgIGxldCBsaXN0ZW5lcnMgPSBzZWxmLl9saXN0ZW5lcnNcbiAgICBpZiAoIWxpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXJzID0gc2VsZi5fbGlzdGVuZXJzID0ge31cbiAgICAgIHNlbGYubm9kZS5fbGlzdGVuZXJzID0ge31cbiAgICB9XG4gICAgbGlzdGVuZXJzW2V2dF0gPSBsaXN0ZW5lclxuICAgIHNlbGYubm9kZS5fbGlzdGVuZXJzW2V2dF0gPSBsaXN0ZW5lclxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5iaW5kRXZlbnRzIChldnRzKSB7XG4gIGNvbnN0IHNlbGYgPSB0aGlzXG4gIGV2dHMubWFwKGZ1bmN0aW9uIChldnQpIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuX2xpc3RlbmVyc1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgc2VsZi5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0LCBsaXN0ZW5lcilcbiAgICAgIHNlbGYuX2xpc3RlbmVyc1tldnRdID0gbnVsbFxuICAgICAgc2VsZi5ub2RlLl9saXN0ZW5lcnNbZXZ0XSA9IG51bGxcbiAgICB9XG4gIH0pXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBIVE1MRWxlbWVudCAqL1xuXG5pbXBvcnQgeyB0aHJvdHRsZSB9IGZyb20gJy4uLy4uL3V0aWxzJ1xuXG5jb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnRcbmNvbnN0IGlzRmlyZWZveCA9ICEhdWEubWF0Y2goL0ZpcmVmb3gvaSlcbmNvbnN0IGlzSUVNb2JpbGUgPSAhIXVhLm1hdGNoKC9JRU1vYmlsZS9pKVxuY29uc3QgY3NzUHJlZml4ID0gaXNGaXJlZm94ID8gJy1tb3otJyA6IGlzSUVNb2JpbGUgPyAnLW1zLScgOiAnLXdlYmtpdC0nXG5jb25zdCBzdHlsZVByZWZpeCA9IGlzRmlyZWZveCA/ICdNb3onIDogaXNJRU1vYmlsZSA/ICdtcycgOiAnd2Via2l0J1xuXG4vLyBldmVuIHN0aWNreSwgc3RpbGwgbm90IHdvcmsuIHNvLi4uXG4vLyBjb25zdCBzdXBwb3J0U3RpY2t5ID0gZGV0ZWN0U3RpY2t5KClcblxuZnVuY3Rpb24gYmluZFBhcmVudCAoc3RpY2t5KSB7XG4gIGlmICghc3RpY2t5IGluc3RhbmNlb2YgU3RpY2t5KSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgY29uc3Qgc2Nyb2xsZXIgPSBzdGlja3kuY29tcG9uZW50LmdldFBhcmVudFNjcm9sbGVyKClcbiAgbGV0IHB0XG4gIGlmIChzY3JvbGxlcikge1xuICAgIHB0ID0gc3RpY2t5LnBhcmVudCA9IHNjcm9sbGVyXG4gICAgc3RpY2t5LnBhcmVudEVsZW1lbnQgPSBwdC5ub2RlXG4gIH1cbiAgZWxzZSB7XG4gICAgcHQgPSBzdGlja3kucGFyZW50ID0gc3RpY2t5LmNvbXBvbmVudC5nZXRSb290Q29udGFpbmVyKClcbiAgICBzdGlja3kucGFyZW50RWxlbWVudCA9IHB0XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0U3RpY2t5IChzdGlja3kpIHtcbiAgY29uc3QgY29tcCA9IHN0aWNreS5jb21wb25lbnRcbiAgY29uc3QgZWxlbWVudCA9IHN0aWNreS5lbGVtZW50XG4gIGNvbXAuc3RpY2t5UGxhY2Vob2xkZXIgPSBzdGlja3kuZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgY29tcC5zdGlja3lQbGFjZWhvbGRlci5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtcmVmJylcbiAgY29tcC5zdGlja3lQbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCd3ZWV4LXN0aWNreS1wbGFjZWhvbGRlcicpXG4gIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnd2VleC1zdGlja3knKVxuICBzdGlja3kucHJlTWFyZ2luVG9wID0gZWxlbWVudC5zdHlsZS5tYXJnaW5Ub3BcbiAgc3RpY2t5LnByZVRvcCA9IGVsZW1lbnQuc3R5bGUudG9wXG4gIGVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gc3RpY2t5LnRvcCB8fCAnMCcgKyAncHgnXG5cbiAgZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShcbiAgICBjb21wLnN0aWNreVBsYWNlaG9sZGVyLCBlbGVtZW50KVxuICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJ1xuICBsZXQgdG9wXG4gIGlmIChzdGlja3kucGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICB0b3AgPSAwXG4gIH1cbiAgZWxzZSB7XG4gICAgdG9wID0gc3RpY2t5LnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXG4gIH1cbiAgZWxlbWVudC5zdHlsZS50b3AgPSB0b3AgKyAncHgnXG4gIHN0aWNreS5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpXG59XG5cbi8qKlxuICogdW5zZXRTdGlja3lcbiAqIEBwYXJhbSAge1N0aWNreX0gc3RpY2t5IDogYSBzdGlja3kgaW5zdGFuY2UuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHBvc2l0aW9uIDogcG9zaXRpb24gcmVwbGFjaW5nIHdpdGggKGRlZmF1bHQ6ICdyZWxhdGl2ZScpLlxuICovXG5mdW5jdGlvbiB1bnNldFN0aWNreSAoc3RpY2t5LCBwb3NpdGlvbikge1xuICBjb25zdCBjb21wID0gc3RpY2t5LmNvbXBvbmVudFxuICBjb25zdCBlbGVtZW50ID0gc3RpY2t5LmVsZW1lbnRcbiAgcG9zaXRpb24gPSBwb3NpdGlvbiA/IHBvc2l0aW9uICsgJycgOiBzdGlja3kucHJlUG9zaXRpb25cbiAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IHBvc2l0aW9uXG4gIGVsZW1lbnQuc3R5bGUubWFyZ2luVG9wID0gc3RpY2t5LnByZU1hcmdpblRvcCB8fCAnJ1xuICBlbGVtZW50LnN0eWxlLnRvcCA9IHN0aWNreS5wcmVUb3AgfHwgJydcbiAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd3ZWV4LXN0aWNreScpXG4gIGlmIChjb21wLnN0aWNreVBsYWNlaG9sZGVyKSB7XG4gICAgY29uc3QgcGFyZW50ID0gY29tcC5zdGlja3lQbGFjZWhvbGRlci5wYXJlbnROb2RlXG4gICAgcGFyZW50Lmluc2VydEJlZm9yZShlbGVtZW50LCBjb21wLnN0aWNreVBsYWNlaG9sZGVyKVxuICAgIHBhcmVudC5yZW1vdmVDaGlsZChjb21wLnN0aWNreVBsYWNlaG9sZGVyKVxuICAgIGNvbXAuc3RpY2t5UGxhY2Vob2xkZXIgPSBudWxsXG4gIH1cbn1cblxuLyoqXG4gKiBAY2xhc3MgIFN0aWNreVxuICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudDogYSB3ZWV4IGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIGNvbmZpZyBvcHRpb25zLlxuICogIC0gb3B0aW9ucy5jb21wb25lbnQgKG9wdGlvbmFsKSBpbmNhc2UgdGhlIGNvbXBvbmVudCBwYXJhbSBpcyBtaXNzaW5nLCBpdCBjYW5cbiAqICAgIGJlIHNwZWNpZmllZCBpbiB0aGlzIG9wdGlvbnMuXG4gKiAgLSBvcHRpb25zLndpdGhpblBhcmVudD1mYWxzZe+8iG9wdGlvbmFs77yMb25seSBmb3IgQW5kcm9pZO+8iXRoZSBzdGlja3kgZWZmZWN0IGlzXG4gKiAgICBsaW1pdGVkIHdpdGhpbiB0aGUgcGFyZW50IGVsZW1lbnQgb25seS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU3RpY2t5IChjb21wb25lbnQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnRcbiAgdGhpcy5lbGVtZW50ID0gY29tcG9uZW50Lm5vZGVcbiAgdGhpcy5wcmVQb3NpdGlvbiA9IHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvblxuICB0aGlzLndpdGhpblBhcmVudCA9IG9wdGlvbnMud2l0aGluUGFyZW50IHx8IGZhbHNlXG4gIHRoaXMucGFyZW50ID0gbnVsbFxuICB0aGlzLmluaXQoKVxufVxuXG5TdGlja3kucHJvdG90eXBlID0ge1xuXG4gIGNvbnN0cnVjdG9yOiBTdGlja3ksXG5cbiAgaW5pdCAoKSB7XG4gICAgY29uc3QgZWxlbWVudFN0eWxlID0gdGhpcy5lbGVtZW50LnN0eWxlXG4gICAgZWxlbWVudFN0eWxlW3N0eWxlUHJlZml4ICsgJ1RyYW5zZm9ybSddID0gJ3RyYW5zbGF0ZVooMCknIC8vIGZpeCBmbGlja2VyaW5nXG4gICAgZWxlbWVudFN0eWxlWyd0cmFuc2Zvcm0nXSA9ICd0cmFuc2xhdGVaKDApJ1xuICAgIGJpbmRQYXJlbnQodGhpcylcbiAgICAvLyBpZiAoc3VwcG9ydFN0aWNreSkge1xuICAgIC8vICAgZWxlbWVudFN0eWxlLnBvc2l0aW9uID0gY3NzUHJlZml4ICsgJ3N0aWNreSdcbiAgICAvLyB9XG4gICAgdGhpcy5fc2ltdWxhdGVTdGlja3koKVxuICAgIHRoaXMuX2JpbmRSZXNpemUoKVxuICB9LFxuXG4gIF9iaW5kUmVzaXplICgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgIGNvbnN0IGlzQW5kcm9pZCA9ICgvYW5kcm9pZC9naSkudGVzdChuYXZpZ2F0b3IuYXBwVmVyc2lvbilcbiAgICBjb25zdCByZXNpemVFdmVudCA9IHNlbGYuX3Jlc2l6ZUV2ZW50ID0gJ29ub3JpZW50YXRpb25jaGFuZ2UnIGluIHdpbmRvd1xuICAgICAgPyAnb3JpZW50YXRpb25jaGFuZ2UnXG4gICAgICA6ICdyZXNpemUnXG4gICAgY29uc3QgcmVzaXplSGFuZGxlciA9IHNlbGYuX3Jlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5yZWZyZXNoKClcbiAgICAgIH0sIGlzQW5kcm9pZCA/IDIwMCA6IDApXG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKHJlc2l6ZUV2ZW50LCByZXNpemVIYW5kbGVyLCBmYWxzZSlcbiAgfSxcblxuICAvKipcbiAgICogUmVmcmVzaCBhIGluc3RhbmNlLlxuICAgKiBJZiB3aXRoUGFyZW50IGlzIHRydWUgYW5kIHRoZSBwYXJlbnQnIGhlaWdodCBhbHRlcmVkLCB0aGlzXG4gICAqIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkLlxuICAgKi9cbiAgcmVmcmVzaCAoKSB7XG4gICAgLy8gaWYgKHN1cHBvcnRTdGlja3kpIHtcbiAgICAvLyAgIHJldHVyblxuICAgIC8vIH1cbiAgICB0aGlzLl9kZXRhY2goKVxuICAgIHRoaXMuX3NpbXVsYXRlU3RpY2t5KClcbiAgfSxcblxuICBfc2ltdWxhdGVTdGlja3kgKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgY29uc3QgaXNJblNjcm9sbGFibGUgPSB0aGlzLmlzSW5TY3JvbGxhYmxlKClcbiAgICAvLyB0aGUgaW5pdGlhbCB5IG9mZnNldC5cbiAgICB0aGlzLm9mZnNldCA9IChpc0luU2Nyb2xsYWJsZVxuICAgICAgPyB0aGlzLmdldFBhcmVudFNjcm9sbGVyKCkub2Zmc2V0XG4gICAgICA6IHdpbmRvdy5wYWdlWU9mZnNldClcbiAgICAgIHx8IDBcbiAgICBjb25zdCByZWN0VG9wID0gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxuICAgIGxldCB3cmFwcGVyVG9wID0gMFxuICAgIGlmIChpc0luU2Nyb2xsYWJsZSkge1xuICAgICAgd3JhcHBlclRvcCA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICB9XG4gICAgY29uc3Qgd2l0aGluUGFyZW50ID0gdGhpcy53aXRoaW5QYXJlbnRcbiAgICBjb25zdCB0aHJlc2hvbGRCYXNlID0gcmVjdFRvcCAtIHdyYXBwZXJUb3AgKyB0aGlzLm9mZnNldFxuICAgIC8qKlxuICAgICAqIGN1clN0YXRlOlxuICAgICAqICAgMSAtIG5vcm1hbFxuICAgICAqICAgMiAtIHN0aWNreVxuICAgICAqICAgMyAtIGV4Y2VlZCBwYXJlbnRcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxuICAgICAqL1xuICAgIHRoaXMuY3VyU3RhdGUgPSAxXG4gICAgY29uc3Qgc2Nyb2xsSGFuZGxlciA9IHRoaXMuX3Njcm9sbEhhbmRsZXIgPSB0aHJvdHRsZShmdW5jdGlvbiAoZSkge1xuICAgICAgY29uc3QgdGhyZXNob2xkVG9wID0gdGhyZXNob2xkQmFzZVxuICAgICAgY29uc3QgeXBvcyA9IHNlbGYuaXNJblNjcm9sbGFibGUoKSA/IGUub2Zmc2V0IDogd2luZG93LnBhZ2VZT2Zmc2V0XG4gICAgICBzZWxmLm9mZnNldCA9IHlwb3NcbiAgICAgIGlmICh5cG9zIDwgdGhyZXNob2xkVG9wKSB7XG4gICAgICAgIGlmIChzZWxmLmN1clN0YXRlICE9PSAxKSB7XG4gICAgICAgICAgdW5zZXRTdGlja3koc2VsZilcbiAgICAgICAgICBzZWxmLmN1clN0YXRlID0gMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgoIXdpdGhpblBhcmVudCAmJiB5cG9zID49IHRocmVzaG9sZFRvcCkgfHxcbiAgICAgICAgKHdpdGhpblBhcmVudCAmJiB5cG9zID49IHRocmVzaG9sZFRvcC8qICYmIHlwb3MgPCB0aHJlc2hvbGRCb3R0b20qLykpIHtcbiAgICAgICAgaWYgKHNlbGYuY3VyU3RhdGUgIT09IDIpIHtcbiAgICAgICAgICBzZXRTdGlja3koc2VsZilcbiAgICAgICAgICBzZWxmLmN1clN0YXRlID0gMlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMTAwKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyLCBmYWxzZSlcblxuICAgIC8vIHRha2UgZWZmZWN0IG9uY2UgaW5pdGVkIGFmdGVyIGEgZGVzdHJveW1lbnQuXG4gICAgaWYgKHRoaXMub2Zmc2V0ID49IHRocmVzaG9sZEJhc2UpIHtcbiAgICAgIGNvbnN0IGR1bW15RXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpXG4gICAgICBkdW1teUV2ZW50LmluaXRFdmVudCgnc2Nyb2xsJywgdHJ1ZSwgdHJ1ZSlcbiAgICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGR1bW15RXZlbnQpXG4gICAgfVxuICB9LFxuXG4gIF9kZXRhY2ggKHBvc2l0aW9uKSB7XG4gICAgcG9zaXRpb24gPSBwb3NpdGlvbiA/IHBvc2l0aW9uICsgJycgOiAncmVsYXRpdmUnXG4gICAgLy8gaWYgKHN1cHBvcnRTdGlja3kpIHtcbiAgICAvLyAgIHJldHVyblxuICAgIC8vIH1cbiAgICBpZiAodGhpcy5jdXJTdGF0ZSA9PT0gMikge1xuICAgICAgdW5zZXRTdGlja3kodGhpcylcbiAgICB9XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX3Njcm9sbEhhbmRsZXIsIGZhbHNlKVxuICB9LFxuXG4gIGlzSW5TY3JvbGxhYmxlICgpIHtcbiAgICBpZiAoIXRoaXMuX2lzSW5TY3JvbGxhYmxlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9pc0luU2Nyb2xsYWJsZSA9IHRoaXMuY29tcG9uZW50LmlzSW5TY3JvbGxhYmxlKClcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gVGhlIHBhcmVudFJlZiBpcyBub3QgaW4gY29tcG9uZW50TWFuYWdlcidzIGNvbXBvbmVudE1hcCB5ZXQsIHNvXG4gICAgICAgIC8vIGl0J3MgaW52YWxpZCB0byBnZXQgdGhlIHBhcmVudCBhbmQgdGVzdCBpZiBpdCdzIHNjcm9sbGFibGUuXG4gICAgICAgIC8vIFRoaXMgaXMgbW9zdCBsaWtlbHkgdG8gaGFwcGVuIGluIHRoZSBjYXNlIHRoYXQgdGhlIHBhcmVudFxuICAgICAgICAvLyBjb21wb25lbnQncyAnYXBwZW5kJyBhdHRyaWJ1dGUgaXMgc2V0IHRvICd0cmVlJy5cbiAgICAgICAgY29uc29sZS5lcnJvcignaXNJblNjcm9sbGFibGUgaXMgbm90IHlldCBhdmFpbGFibGUgdG8gY2FsbCcsIGVycilcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lzSW5TY3JvbGxhYmxlXG4gIH0sXG5cbiAgZ2V0UGFyZW50U2Nyb2xsZXIgKCkge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC5nZXRQYXJlbnRTY3JvbGxlcigpXG4gIH0sXG5cbiAgZGVzdHJveSAocG9zaXRpb24pIHtcbiAgICB0aGlzLl9kZXRhY2gocG9zaXRpb24pXG4gICAgY29uc3QgZWxlbWVudFN0eWxlID0gdGhpcy5lbGVtZW50LnN0eWxlXG4gICAgZWxlbWVudFN0eWxlLnJlbW92ZVByb3BlcnR5KGNzc1ByZWZpeCArICd0cmFuc2Zvcm0nKVxuICAgIGVsZW1lbnRTdHlsZS5yZW1vdmVQcm9wZXJ0eSgndHJhbnNmb3JtJylcbiAgICAvLyBpZiAoc3VwcG9ydFN0aWNreSkge1xuICAgIC8vICAgcmV0dXJuXG4gICAgLy8gfVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX3Jlc2l6ZUV2ZW50LCB0aGlzLl9yZXNpemVIYW5kbGVyLCBmYWxzZSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFN0aWNreSBmcm9tICcuL3N0aWNreSdcblxuLy8gU2V0IHBvc2l0b24gdG8gZml4ZWQsIHdpdGggYSBwbGFjZWhvbGRlciBpZiBpdCdzIGluIGFcbi8vIHNjcm9sbGFibGUgY29tcG9uZW50LlxuZXhwb3J0IGZ1bmN0aW9uIHNldEZpeGVkICgpIHtcbiAgLy8gZGVsYXkgcHJvY2Vzc2luZyBpbiBjYXNlIHRoZSBub2RlIGlzIG5vdCBhcHBlbmRlZCB5ZXQuXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCdcbiAgICBpZiAoIXRoaXMuaXNJblNjcm9sbGFibGUoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMubm9kZS5wYXJlbnROb2RlXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgLy8gRm9yIHRoZSBlbGVtZW50cyB3aG8gYXJlIGZpeGVkOiB0aGlzIGZpeGVkUGxhY2Vob2xkZXJcbiAgICAgIC8vIHNob3VkIGJlIGluc2VydGVkLCBhbmQgdGhlIGZpeGVkIGVsZW1lbnQgaXRzZWxmIHNob3VsZFxuICAgICAgLy8gYmUgbW92ZWQgdG8gdGhlIHJvb3QgY29udGFpbmVyLlxuICAgICAgdGhpcy5maXhlZFBsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIHRoaXMuZml4ZWRQbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCd3ZWV4LWZpeGVkLXBsYWNlaG9sZGVyJylcbiAgICAgIHRoaXMuZml4ZWRQbGFjZWhvbGRlci5zdHlsZS5jc3NUZXh0ID0gW1xuICAgICAgICAnZGlzcGxheTpub25lOycsXG4gICAgICAgICd3aWR0aDowcHg7JyxcbiAgICAgICAgJ2hlaWdodDowcHg7J1xuICAgICAgXS5qb2luKCcnKVxuICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLmZpeGVkUGxhY2Vob2xkZXIsIHRoaXMubm9kZSlcbiAgICAgIHRoaXMuZ2V0Um9vdENvbnRhaW5lcigpLmFwcGVuZENoaWxkKHRoaXMubm9kZSlcbiAgICB9XG4gIH0uYmluZCh0aGlzKSwgMClcbn1cblxuLy8gdW5zZXQgYSBmaXhlZCBub2RlIHRvIHRoZSBwZWNpZmllZCAncG9zaXRpb24nIG9yICdyZWxhdGl2ZScgYnkgZGVmYXVsdC5cbmV4cG9ydCBmdW5jdGlvbiB1bnNldEZpeGVkIChwb3NpdGlvbikge1xuICAvLyBGb3IgdGhlIGVsZW1lbnRzIHdobyBhcmUgZml4ZWQgZWxlbWVudHMgYmVmb3JlLCBub3dcbiAgLy8gYXJlIG5vdCBmaXhlZDogdGhlIGZpeGVkUGxhY2Vob2xkZXIgaGFzIHRvIGJlIHJlcGxhY2VkXG4gIC8vIGJ5IHRoaXMgZWxlbWVudC5cbiAgcG9zaXRpb24gPSBwb3NpdGlvbiA/IHBvc2l0aW9uICsgJycgOiAncmVsYXRpdmUnXG4gIGlmICh0aGlzLmZpeGVkUGxhY2Vob2xkZXIpIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmZpeGVkUGxhY2Vob2xkZXIucGFyZW50Tm9kZVxuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLCB0aGlzLmZpeGVkUGxhY2Vob2xkZXIpXG4gICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuZml4ZWRQbGFjZWhvbGRlcilcbiAgICB0aGlzLmZpeGVkUGxhY2Vob2xkZXIgPSBudWxsXG4gICAgdGhpcy5ub2RlLnN0eWxlLnBvc2l0aW9uID0gcG9zaXRpb25cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0U3RpY2t5ICgpIHtcbiAgdGhpcy5ub2RlLnN0eWxlLnpJbmRleCA9IDEwMFxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnN0aWNreSA9IG5ldyBTdGlja3kodGhpcylcbiAgfS5iaW5kKHRoaXMpLCAwKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRTdGlja3kgKCkge1xuICBpZiAodGhpcy5zdGlja3kpIHtcbiAgICB0aGlzLnN0aWNreS5kZXN0cm95KClcbiAgICB0aGlzLnN0aWNreSA9IG51bGxcbiAgfVxufVxuXG4vLyB1c2FsbHkgdXNlZCB0byB1bnNldCBzdGlja3kgYW5kIGZpeGVkXG5leHBvcnQgZnVuY3Rpb24gdW5zZXRQb3NpdGlvbiAocG9zaXRpb24pIHtcbiAgdGhpcy5zdHlsZS5wb3NpdGlvbi5jYWxsKHRoaXMsIHBvc2l0aW9uKVxufVxuXG5leHBvcnQgY29uc3Qgc3R5bGUgPSB7XG4gIHBvc2l0aW9uICh2YWx1ZSkge1xuICAgIC8vIFRoaXMgaXMgYSBwZWFjZSBvZiBoYWNraW5nIHRvIGZpeCB0aGUgcHJvYmxlbSBhYm91dFxuICAgIC8vIG1peGluZyBmaXhlZCBhbmQgdHJhbnNmb3JtLiBTZWUgJ2h0dHA6Ly9zdGFja292ZXJmbG9cbiAgICAvLyB3LmNvbS9xdWVzdGlvbnMvMTUxOTQzMTMvd2Via2l0LWNzcy10cmFuc2Zvcm0zZC1wb3NpXG4gICAgLy8gdGlvbi1maXhlZC1pc3N1ZScgZm9yIG1vcmUgaW5mby5cbiAgICB2YWx1ZSAhPT0gJ2ZpeGVkJyAmJiB0aGlzLnVuc2V0Rml4ZWQoKVxuICAgIHZhbHVlICE9PSAnc3RpY2t5JyAmJiB0aGlzLnVuc2V0U3RpY2t5KClcbiAgICBpZiAodmFsdWUgPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldEZpeGVkKClcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSAnc3RpY2t5Jykge1xuICAgICAgcmV0dXJuIHRoaXMuc2V0U3RpY2t5KClcbiAgICB9XG4gICAgdGhpcy5ub2RlLnN0eWxlLnBvc2l0aW9uID0gdmFsdWVcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgYm94QWxpZ25NYXAgPSB7XG4gIHN0cmV0Y2g6ICdzdHJldGNoJyxcbiAgJ2ZsZXgtc3RhcnQnOiAnc3RhcnQnLFxuICAnZmxleC1lbmQnOiAnZW5kJyxcbiAgY2VudGVyOiAnY2VudGVyJ1xufVxuXG5jb25zdCBib3hPcmllbnRNYXAgPSB7XG4gIHJvdzogJ2hvcml6b250YWwnLFxuICBjb2x1bW46ICd2ZXJ0aWNhbCdcbn1cblxuY29uc3QgYm94UGFja01hcCA9IHtcbiAgJ2ZsZXgtc3RhcnQnOiAnc3RhcnQnLFxuICAnZmxleC1lbmQnOiAnZW5kJyxcbiAgY2VudGVyOiAnY2VudGVyJyxcbiAgJ3NwYWNlLWJldHdlZW4nOiAnanVzdGlmeScsXG4gICdzcGFjZS1hcm91bmQnOiAnanVzdGlmeScgLy8gSnVzdCBzYW1lIGFzIGBzcGFjZS1iZXR3ZWVuYFxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN0eWxlOiB7XG4gICAgZmxleCAodmFsdWUpIHtcbiAgICAgIHRoaXMubm9kZS5zdHlsZS53ZWJraXRCb3hGbGV4ID0gdmFsdWVcbiAgICAgIHRoaXMubm9kZS5zdHlsZS53ZWJraXRGbGV4ID0gdmFsdWVcbiAgICAgIHRoaXMubm9kZS5zdHlsZS5mbGV4ID0gdmFsdWVcbiAgICB9LFxuXG4gICAgYWxpZ25JdGVtcyAodmFsdWUpIHtcbiAgICAgIHRoaXMubm9kZS5zdHlsZS53ZWJraXRCb3hBbGlnbiA9IGJveEFsaWduTWFwW3ZhbHVlXVxuICAgICAgdGhpcy5ub2RlLnN0eWxlLndlYmtpdEFsaWduSXRlbXMgPSB2YWx1ZVxuICAgICAgdGhpcy5ub2RlLnN0eWxlLmFsaWduSXRlbXMgPSB2YWx1ZVxuICAgIH0sXG5cbiAgICBhbGlnblNlbGYgKHZhbHVlKSB7XG4gICAgICB0aGlzLm5vZGUuc3R5bGUud2Via2l0QWxpZ25TZWxmID0gdmFsdWVcbiAgICAgIHRoaXMubm9kZS5zdHlsZS5hbGlnblNlbGYgPSB2YWx1ZVxuICAgIH0sXG5cbiAgICBmbGV4RGlyZWN0aW9uICh2YWx1ZSkge1xuICAgICAgdGhpcy5ub2RlLnN0eWxlLndlYmtpdEJveE9yaWVudCA9IGJveE9yaWVudE1hcFt2YWx1ZV1cbiAgICAgIHRoaXMubm9kZS5zdHlsZS53ZWJraXRGbGV4RGlyZWN0aW9uID0gdmFsdWVcbiAgICAgIHRoaXMubm9kZS5zdHlsZS5mbGV4RGlyZWN0aW9uID0gdmFsdWVcbiAgICB9LFxuXG4gICAganVzdGlmeUNvbnRlbnQgKHZhbHVlKSB7XG4gICAgICB0aGlzLm5vZGUuc3R5bGUud2Via2l0Qm94UGFjayA9IGJveFBhY2tNYXBbdmFsdWVdXG4gICAgICB0aGlzLm5vZGUuc3R5bGUud2Via2l0SnVzdGlmeUNvbnRlbnQgPSB2YWx1ZVxuICAgICAgdGhpcy5ub2RlLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gdmFsdWVcbiAgICB9XG4gIH1cbn1cblxuLyogZXNsaW50LWRpc2FibGUgKi9cbjtcbi8qIGVzbGludC1lbmFibGUgKi9cbiIsIjtcbihmdW5jdGlvbiAod2luLCBsaWIpIHtcbiAgdmFyIGRvYyA9IGRvY3VtZW50O1xuICB2YXIgYXBwZWFyRXZ0O1xuICB2YXIgZGlzYXBwZWFyRXZ0O1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUV2ZW50KCkge1xuICAgIGFwcGVhckV2dCA9IGRvYy5jcmVhdGVFdmVudChcIkhUTUxFdmVudHNcIik7Ly/liJvlu7roh6rlrprkuYnmmL7npLrkuovku7YgIFxuICAgIGRpc2FwcGVhckV2dCA9IGRvYy5jcmVhdGVFdmVudChcIkhUTUxFdmVudHNcIik7Ly/liJvlu7roh6rlrprkuYnmtojlpLHkuovku7YgIFxuICAgIGFwcGVhckV2dC5pbml0RXZlbnQoJ19hcHBlYXInLCBmYWxzZSwgdHJ1ZSk7ICAgICAgXG4gICAgZGlzYXBwZWFyRXZ0LmluaXRFdmVudCgnX2Rpc2FwcGVhcicsIGZhbHNlLCB0cnVlKTsgICAgICBcbiAgfVxuXG4gIC8qKlxuICAgKiBbdGhyb3R0bGUg6IqC5rWB5Ye95pWwXVxuICAgKiBAcGFyYW0gIHtbZnVuY3Rpb25dfSBmdW5jIFvmiafooYzlh73mlbBdXG4gICAqIEBwYXJhbSAge1tpbnRdfSB3YWl0IFvnrYnlvoXml7bplb9dXG4gICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0KSB7XG4gICAgdmFyIGxhdGVzdCA9IERhdGUubm93KCksXG4gICAgICBwcmV2aW91cyA9IDAsLy/kuIrmrKHmiafooYznmoTml7bpl7RcbiAgICAgIHRpbWVvdXQgPSBudWxsLC8vc2V0VGltb3V05Lu75YqhXG4gICAgICBjb250ZXh0LC8v5LiK5LiL5paHXG4gICAgICBhcmdzLC8v5Y+C5pWwXG4gICAgICByZXN1bHQ7Ly/nu5PmnpxcbiAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcmV2aW91cyA9IERhdGUubm93KCk7XG4gICAgICB0aW1lb3V0ID0gbnVsbDsvL+a4heepuuiuoeaXtuWZqFxuICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29udGV4dCA9IHRoaXM7XG4gICAgICBhcmdzID0gYXJndW1lbnRzO1xuXG4gICAgICB2YXIgcmVtYWluaW5nID0gd2FpdCAtIChub3cgLSBwcmV2aW91cyk7XG4gICAgICBpZiAocmVtYWluaW5nIDw9IDAgfHwgcmVtYWluaW5nID49IHdhaXQpIHtcbiAgICAgICAgLy/lpoLmnpzmsqHmnInliankvZnml7bpl7TvvIzmiJbogIXlrZjlnKjkv67mlLnov4fns7vnu5/ml7bpl7Tlr7zoh7TliankvZnml7bpl7Tlop7lpKfnmoTmg4XlhrXvvIzliJnmiafooYxcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgIH0gZWxzZSBpZiAodGltZW91dCA9PSBudWxsKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogW2dldE9mZnNldCDojrflj5bovrnot53lsLrlr7hdXG4gICAqIEBwYXJhbSAge1t0eXBlXX0gZWwgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAge1t0eXBlXX0gcGFyYW0gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIGZ1bmN0aW9uIGdldE9mZnNldChlbCwgcGFyYW0pIHtcbiAgICB2YXIgZWwsIGwsICByLCBiLCB0O1xuICAgIGlmICghZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFwYXJhbSkge1xuICAgICAgcGFyYW0gPSB7eDogMCwgeTogMH07XG4gICAgfVxuXG4gICAgaWYgKGVsICE9IHdpbmRvdykge1xuICAgICAgZWwgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGwgPSBlbC5sZWZ0O1xuICAgICAgdCA9IGVsLnRvcDtcbiAgICAgIHIgPSBlbC5yaWdodDtcbiAgICAgIGIgPSBlbC5ib3R0b207XG4gICAgfSBlbHNlIHtcbiAgICAgIGwgPSAwO1xuICAgICAgdCA9IDA7XG4gICAgICByID0gbCArIGVsLmlubmVyV2lkdGg7XG4gICAgICBiID0gdCArIGVsLmlubmVySGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgJ2xlZnQnOiBsLFxuICAgICAgJ3RvcCc6IHQsXG4gICAgICAncmlnaHQnOiByICsgcGFyYW0ueCxcbiAgICAgICdib3R0b20nOiBiICsgcGFyYW0ueVxuICAgIH07XG4gIH1cbiAgLy/lhYPntKDkvY3nva7mr5TovoNcbiAgZnVuY3Rpb24gY29tcGFyZU9mZnNldChkMSwgZDIpIHtcbiAgICB2YXIgbGVmdCA9IGQyLnJpZ2h0ID4gZDEubGVmdCAmJiBkMi5sZWZ0IDwgZDEucmlnaHQ7XG4gICAgdmFyIHRvcCA9IGQyLmJvdHRvbSA+IGQxLnRvcCAmJiBkMi50b3AgPCBkMS5ib3R0b207XG4gICAgcmV0dXJuIGxlZnQgJiYgdG9wO1xuICB9XG4gIC8v6I635Y+W56e75Yqo5pa55ZCRXG4gIGZ1bmN0aW9uIGdldERpcmVjdGlvbihiZWZvcmVPZmZzZXQsIG5vd09mZnNldCkge1xuICAgIHZhciBkaXJlY3Rpb24gPSAnbm9uZSc7XG4gICAgdmFyIGhvcml6ZW50YWwgPSBiZWZvcmVPZmZzZXQubGVmdCAtIG5vd09mZnNldC5sZWZ0O1xuICAgIHZhciB2ZXJ0aWNhbCA9IGJlZm9yZU9mZnNldC50b3AgLSBub3dPZmZzZXQudG9wO1xuICAgIGlmICh2ZXJ0aWNhbCA9PSAwKSB7XG4gICAgICBpZiAoaG9yaXplbnRhbCAhPSAwKSB7XG4gICAgICAgIGRpcmVjdGlvbiA9IGhvcml6ZW50YWwgPiAwID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpcmVjdGlvbiA9ICdub25lJ1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaG9yaXplbnRhbCA9PSAwKSB7XG4gICAgICBpZiAodmVydGljYWwgIT0gMCkge1xuICAgICAgICBkaXJlY3Rpb24gPSB2ZXJ0aWNhbCA+IDAgPyAndXAnIDogJ2Rvd24nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlyZWN0aW9uID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgZWwpIHtcbiAgICBmb3IgKHZhciBrIGluIGVsKSB7XG4gICAgICBpZiAoZWwuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgdGFyZ2V0W2tdID0gZWxba107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH1cblxuICAvKipcbiAgICogW19fYmluZEV2ZW50IOe7keWumuS6i+S7tu+8jOWMheaLrOa7muWKqOOAgXRvdWNobW92ZeOAgXRyYW5zZm9ybeOAgXJlc2l6ZeetiV1cbiAgICogQHJldHVybiB7W3R5cGVdfSAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIGZ1bmN0aW9uIF9fYmluZEV2ZW50KCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgaGFuZGxlID0gdGhyb3R0bGUoZnVuY3Rpb24gKCkge1xuICAgICAgX19maXJlLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgfSwgdGhpcy5vcHRpb25zLndhaXQpO1xuICAgIGlmICh0aGlzLl9faGFuZGxlKSB7XG4gICAgICAvL+mBv+WFjemHjeWkjee7keWumlxuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fX2hhbmRsZSk7XG4gICAgICB0aGlzLl9faGFuZGxlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5fX2hhbmRsZSA9IGhhbmRsZTtcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGUsIGZhbHNlKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbihldikge1xuICAgICAgX19maXJlLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgfSwgZmFsc2UpO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbkVuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgX19maXJlLmFwcGx5KHNlbGYsIGFyZ3VtZW50cyk7XG4gICAgfSwgZmFsc2UpO1xuICAgIC8vIGFuZHJvaWQ0LjDku6XkuItcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRBbmltYXRpb25FbmQnLCBmdW5jdGlvbigpIHtcbiAgICAgIF9fZmlyZS5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xuICAgIH0sIGZhbHNlKTtcbiAgICB0aGlzLmNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICBfX2ZpcmUuYXBwbHkoc2VsZiwgYXJndW1lbnRzKTtcbiAgICB9LCBmYWxzZSk7XG4gIH1cblxuICAvL+iOt+WPluWuueWZqOWGheaJgOacieeahOWKoOi9veWFg+e0oFxuICBmdW5jdGlvbiBfX2dldEVsZW1lbnRzKHNlbGVjdG9yKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIC8v6I635Y+W5a655ZmoXG4gICAgdmFyIGNvbnRhaW5lciA9IHRoaXMub3B0aW9ucy5jb250YWluZXI7XG4gICAgaWYgKHR5cGVvZiBjb250YWluZXIgPT0gJ3N0cmluZycpIHtcbiAgICAgIC8v5aaC5p6c5piv5a2X56ym5Liy77yM5YiZ6YCJ5oup5ZmoXG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGRvYy5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8v5a+56LGh5Lyg5YC8XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB9XG4gICAgLy/ojrflj5blrrnlmajlhoXnmoTmiYDmnInnm67moIflhYPntKBcbiAgICBpZiAodGhpcy5jb250YWluZXIgPT0gd2luZG93KSB7XG4gICAgICB2YXIgYXBwZWFyV2F0Y2hFbGVtZW50cyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgICAgICAgICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFwcGVhcldhdGNoRWxlbWVudHMgPSB0aGlzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICB9XG4gICAgdmFyIGFwcGVhcldhdGNoRWxlbWVudHMgPSBbXS5zbGljZS5jYWxsKGFwcGVhcldhdGNoRWxlbWVudHMsIG51bGwpO1xuXG4gICAgYXBwZWFyV2F0Y2hFbGVtZW50cyA9IGFwcGVhcldhdGNoRWxlbWVudHMuZmlsdGVyKGZ1bmN0aW9uKGVsZSkge1xuICAgICAgLy8g5aaC5p6c5bey57uP57uR5a6a6L+H77yM5riF6ZmkYXBwZWFy54q25oCB77yM5LiN5YaN5Yqg5YWl5Yiw5pWw57uE6YeMXG4gICAgICBpZiAoZWxlLmRhdGFzZXRbJ2JpbmQnXSA9PSAnMScpIHtcbiAgICAgICAgZGVsZXRlIGVsZS5faGFzQXBwZWFyO1xuICAgICAgICBkZWxldGUgZWxlLl9oYXNEaXNBcHBlYXI7XG4gICAgICAgIGRlbGV0ZSBlbGUuX2FwcGVhcjsgICAgICBcbiAgICAgICAgZWxlLmNsYXNzTGlzdC5yZW1vdmUoc2VsZi5vcHRpb25zLmNscyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFwcGVhcldhdGNoRWxlbWVudHM7XG4gIH1cblxuICBmdW5jdGlvbiBfX2luaXRCb3VuZGluZ1JlY3QoZWxlbWVudHMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKGVsZW1lbnRzICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIFtdLmZvckVhY2guY2FsbChlbGVtZW50cywgZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICBlbGUuX2VsZU9mZnNldCA9IGdldE9mZnNldChlbGUpOyBcbiAgICAgICAgLy/np7vpmaTnsbvlkI1cbiAgICAgICAgZWxlLmNsYXNzTGlzdC5yZW1vdmUoc2VsZi5vcHRpb25zLmNscyk7XG4gICAgICAgIC8vIOagh+W/l+W3sue7j+e7keWumlxuICAgICAgICBlbGUuZGF0YXNldFsnYmluZCddID0gMTtcbiAgICAgIH0pO1xuICAgIH0gICAgICAgIFxuICB9XG5cbiAgLy8g6Kem5Y+R5Yqg6L29XG4gIGZ1bmN0aW9uIF9fZmlyZSgpIHtcbiAgICB2YXIgY29udGFpbmVyID0gdGhpcy5jb250YWluZXIsXG4gICAgICBlbGVtZW50cyA9IHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cyxcbiAgICAgIGFwcGVhckNhbGxiYWNrID0gdGhpcy5vcHRpb25zLm9uQXBwZWFyLC8vYXBwZWFy55qE5omn6KGM5Ye95pWwXG4gICAgICBkaXNhcHBlYXJDYWxsYmFjayA9IHRoaXMub3B0aW9ucy5vbkRpc2FwcGVhciwvL2Rpc2FwcGVhcueahOaJp+ihjOWHveaVsFxuICAgICAgY29udGFpbmVyT2Zmc2V0ID0gZ2V0T2Zmc2V0KGNvbnRhaW5lciwge1xuICAgICAgICB4OiB0aGlzLm9wdGlvbnMueCxcbiAgICAgICAgeTogdGhpcy5vcHRpb25zLnlcbiAgICAgIH0pLFxuICAgICAgaXNPbmNlID0gdGhpcy5vcHRpb25zLm9uY2UsLy/mmK/lkKblj6rmiafooYzkuIDmrKFcbiAgICAgIGV2ID0gYXJndW1lbnRzWzBdIHx8IHt9O1xuICAgIGlmIChlbGVtZW50cyAmJiBlbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBbXS5mb3JFYWNoLmNhbGwoZWxlbWVudHMsIGZ1bmN0aW9uIChlbGUsIGkpIHtcbiAgICAgICAgLy/ojrflj5blt6blj7Pot53nprtcbiAgICAgICAgdmFyIGVsZU9mZnNldCA9IGdldE9mZnNldChlbGUpO1xuICAgICAgICB2YXIgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKGVsZS5fZWxlT2Zmc2V0LCBlbGVPZmZzZXQpO1xuICAgICAgICAvL+S/neWtmOS4iuS4quaXtuauteeahOS9jee9ruS/oeaBr1xuICAgICAgICBlbGUuX2VsZU9mZnNldCA9IGVsZU9mZnNldDtcbiAgICAgICAgLy/mn6XnnIvmmK/lkKblnKjlj6/op4bljLrln5/ojIPlm7TlhoVcbiAgICAgICAgdmFyIGlzSW5WaWV3ID0gY29tcGFyZU9mZnNldChjb250YWluZXJPZmZzZXQsIGVsZU9mZnNldCk7XG4gICAgICAgIHZhciBhcHBlYXIgPSBlbGUuX2FwcGVhcjtcbiAgICAgICAgdmFyIF9oYXNBcHBlYXIgPSBlbGUuX2hhc0FwcGVhcjtcbiAgICAgICAgdmFyIF9oYXNEaXNBcHBlYXIgPSBlbGUuX2hhc0Rpc0FwcGVhcjtcbiAgICAgICAgYXBwZWFyRXZ0LmRhdGEgPSB7XG4gICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgICAgfVxuICAgICAgICBkaXNhcHBlYXJFdnQuZGF0YSA9IHtcbiAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvblxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0luVmlldyAmJiAhYXBwZWFyKSB7XG4gICAgICAgICAgaWYgKChpc09uY2UgJiYgIV9oYXNBcHBlYXIpIHx8ICFpc09uY2UpIHtcbiAgICAgICAgICAgIC8v5aaC5p6c5Y+q6Kem5Y+R5LiA5qyh5bm25LiU5rKh5pyJ6Kem5Y+R6L+H5oiW6ICF5YWB6K646Kem5Y+R5aSa5qyhXG4gICAgICAgICAgICAvL+WmguaenOWcqOWPr+inhuWMuuWfn+WGhe+8jOW5tuS4lOaYr+S7jmRpc3BwZWFy6L+b5YWlYXBwZWFy77yM5YiZ5omn6KGM5Zue6LCDXG4gICAgICAgICAgICBhcHBlYXJDYWxsYmFjayAmJiBhcHBlYXJDYWxsYmFjay5jYWxsKGVsZSwgZXYpO1xuICAgICAgICAgICAgLy/op6blj5Hoh6rlrprkuYnkuovku7ZcbiAgICAgICAgICAgIGVsZS5kaXNwYXRjaEV2ZW50KGFwcGVhckV2dCk7XG4gICAgICAgICAgICBlbGUuX2hhc0FwcGVhciA9IHRydWU7XG4gICAgICAgICAgICBlbGUuX2FwcGVhciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFpc0luVmlldyAmJiBhcHBlYXIpIHtcbiAgICAgICAgICBpZiAoKGlzT25jZSAmJiAhX2hhc0Rpc0FwcGVhcikgfHwgIWlzT25jZSkge1xuICAgICAgICAgICAgLy/lpoLmnpzkuI3lnKjlj6/op4bljLrln5/lhoXvvIzlubbkuJTmmK/ku45hcHBlYXLov5vlhaVkaXNhcHBlYXLvvIzmiafooYxkaXNhcHBlYXLlm57osINcbiAgICAgICAgICAgIGRpc2FwcGVhckNhbGxiYWNrICYmIGRpc2FwcGVhckNhbGxiYWNrLmNhbGwoZWxlLCBldik7XG4gICAgICAgICAgICAvL+inpuWPkeiHquWumuS5ieS6i+S7tlxuICAgICAgICAgICAgZWxlLmRpc3BhdGNoRXZlbnQoZGlzYXBwZWFyRXZ0KTtcbiAgICAgICAgICAgIGVsZS5faGFzRGlzQXBwZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIGVsZS5fYXBwZWFyID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBwcm90byA9IGV4dGVuZChwcm90bywgbGlzdGVuZXIpO1xuXG4gIGZ1bmN0aW9uIF9faW5pdChvcHRzKSB7XG4gICAgLy/mianlsZXlj4LmlbBcbiAgICBleHRlbmQodGhpcy5vcHRpb25zLCBvcHRzIHx8IChvcHRzID0ge30pKTtcbiAgICAvL+iOt+WPluebruagh+WFg+e0oFxuICAgIHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cyA9IHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cyB8fCBfX2dldEVsZW1lbnRzLmNhbGwodGhpcywgJy4nICsgdGhpcy5vcHRpb25zLmNscyk7XG4gICAgLy/liJ3lp4vljJbkvY3nva7kv6Hmga9cbiAgICBfX2luaXRCb3VuZGluZ1JlY3QuY2FsbCh0aGlzLCB0aGlzLmFwcGVhcldhdGNoRWxlbWVudHMpO1xuICAgIC8v57uR5a6a5LqL5Lu2XG4gICAgX19iaW5kRXZlbnQuY2FsbCh0aGlzKTtcbiAgfVxuICBcbiAgdmFyIEFwcGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICBfX2luaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG5cbiAgdmFyIGFwcGVhciA9IHtcbiAgICBpbnN0YW5jZXM6IFtdLFxuICAgIGluaXQ6IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgICB2YXIgcHJvdG8gPSB7XG4gICAgICAgIC8v6buY6K6k5Y+C5pWwXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjb250YWluZXI6IHdpbmRvdyxcbiAgICAgICAgICB3YWl0OiAxMDAsXG4gICAgICAgICAgeDogMCxcbiAgICAgICAgICB5OiAwLFxuICAgICAgICAgIGNsczogJ2xpYi1hcHBlYXInLFxuICAgICAgICAgIG9uY2U6IGZhbHNlLFxuICAgICAgICAgIG9uUmVzZXQ6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAgIG9uQXBwZWFyOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgICBvbkRpc2FwcGVhcjogZnVuY3Rpb24gKCkge31cbiAgICAgICAgfSxcbiAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICBhcHBlYXJXYXRjaEVsZW1lbnRzOiBudWxsLFxuICAgICAgICBiaW5kOiBmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgIHZhciBjbHMgPSB0aGlzLm9wdGlvbnMuY2xzO1xuICAgICAgICAgIC8vIOa3u+WKoOmcgOimgee7keWumueahGFwcGVhcuWFg+e0oFxuICAgICAgICAgIGlmICh0eXBlb2Ygbm9kZSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gX19nZXRFbGVtZW50cy5jYWxsKHRoaXMsIG5vZGUpO1xuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGVsZW1lbnRzLCBmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgICAgICAgICAgIGlmICghZWxlLmNsYXNzTGlzdC5jb250YWlucyhjbHMpKSB7XG4gICAgICAgICAgICAgICAgZWxlLmNsYXNzTGlzdC5hZGQoY2xzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmNvbnRhaW5lci5jb250YWlucyhub2RlKSkge1xuICAgICAgICAgICAgLy/lpoLmnpzkvKDlhaXnmoTmmK/lhYPntKDlubbkuJTlnKjljIXlkKvlnKjlrrnlmajkuK3vvIznm7TmjqXmt7vliqDnsbvlkI1cbiAgICAgICAgICAgIGlmICghbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xzKSkge1xuICAgICAgICAgICAgICAvL+a3u+WKoOexu+WQjVxuICAgICAgICAgICAgICBub2RlLmNsYXNzTGlzdC5hZGQoY2xzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8v5paw5aKe55qE5a2Q5YWD57SgXG4gICAgICAgICAgdmFyIG5ld0VsZW1lbnRzID0gX19nZXRFbGVtZW50cy5jYWxsKHRoaXMsICcuJyArIHRoaXMub3B0aW9ucy5jbHMpO1xuICAgICAgICAgIC8v5a+557yT5a2Y55qE5a2Q5YWD57Sg5YGa5aKe6YePXG4gICAgICAgICAgdGhpcy5hcHBlYXJXYXRjaEVsZW1lbnRzID0gdGhpcy5hcHBlYXJXYXRjaEVsZW1lbnRzLmNvbmNhdChuZXdFbGVtZW50cyk7XG4gICAgICAgICAgLy/liJ3lp4vljJbmlrDlrZDlhYPntKDnmoTkvY3nva7kv6Hmga9cbiAgICAgICAgICBfX2luaXRCb3VuZGluZ1JlY3QuY2FsbCh0aGlzLCBuZXdFbGVtZW50cyk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIOmHjee9ruWHveaVsFxuICAgICAgICByZXNldDogZnVuY3Rpb24gKG9wdHMpIHtcbiAgICAgICAgICBfX2luaXQuY2FsbCh0aGlzLCBvcHRzKTtcbiAgICAgICAgICB0aGlzLmFwcGVhcldhdGNoRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGUpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBlbGUuX2hhc0FwcGVhcjtcbiAgICAgICAgICAgIGRlbGV0ZSBlbGUuX2hhc0Rpc0FwcGVhcjtcbiAgICAgICAgICAgIGRlbGV0ZSBlbGUuX2FwcGVhcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgZmlyZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghdGhpcy5hcHBlYXJXYXRjaEVsZW1lbnRzKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGVhcldhdGNoRWxlbWVudHMgPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIG5ld0VsZW1lbnRzID0gX19nZXRFbGVtZW50cy5jYWxsKHRoaXMsICcuJyArIHRoaXMub3B0aW9ucy5jbHMpO1xuICAgICAgICAgIHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cyA9IHRoaXMuYXBwZWFyV2F0Y2hFbGVtZW50cy5jb25jYXQobmV3RWxlbWVudHMpO1xuICAgICAgICAgIC8v5Yid5aeL5YyW5L2N572u5L+h5oGvXG4gICAgICAgICAgX19pbml0Qm91bmRpbmdSZWN0LmNhbGwodGhpcywgbmV3RWxlbWVudHMpO1xuICAgICAgICAgIF9fZmlyZS5jYWxsKHRoaXMpO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBBcHBlYXIucHJvdG90eXBlID0gcHJvdG87XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQXBwZWFyKG9wdHMpO1xuICAgICAgdGhpcy5pbnN0YW5jZXMucHVzaChpbnN0YW5jZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfSxcbiAgICBmaXJlQWxsOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgaW5zdGFuY2VzID0gdGhpcy5pbnN0YW5jZXM7XG4gICAgICBpbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgICAgaW5zdGFuY2UuZmlyZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8v5rOo5YaM5LqL5Lu2XG4gIGNyZWF0ZUV2ZW50KCk7XG5cbiAgbGliLmFwcGVhciA9IGFwcGVhcjtcblxufSkod2luZG93LCB3aW5kb3cubGliIHx8ICh3aW5kb3cubGliID0ge30pKTsiLCIvKlxuICAgIGxhenlpbWcgXG4gICAgQXV0aG9yOiBfZGFuelxuKi9cbjtcblxuKGZ1bmN0aW9uICh3aW4sIGxpYikge1xuICAgIHJlcXVpcmUoJ2FwcGVhcmpzJyk7XG5cbiAgICB2YXIgYWRhcHRlciA9IHt9O1xuICAgIHZhciBhcHBlYXJJbnN0YW5jZTtcbiAgICB2YXIgcnVudGltZUZsYWdzID0ge307XG5cbiAgICB2YXIgY29uZmlnID0ge1xuICAgICAgICAnZGF0YVNyYyc6ICdpbWctc3JjJywgLy/mjIflrprlm77niYflnLDlnYDnmoRhdHRyaWJ1dGXlkI0sIOWFvOWBmmxhenktY2xhc3PnmoTkvZznlKhcbiAgICAgICAgJ2xhenlIZWlnaHQnOiAwLCAvL+S7peatpOmrmOW6puaPkOWJjeinpuWPkeaHkuWKoOi9vVxuICAgICAgICAnbGF6eVdpZHRoJzogMCAvL+S7peatpOWuveW6puaPkOWJjeinpuWPkeaHkuWKoOi9vVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBleHRlbmRTdHJpY3QobWFpbiwgc3ViKSB7XG4gICAgICAgIHZhciByZXQgPSB7fTtcbiAgICAgICAgZm9yICh2YXIgayBpbiBtYWluKSB7XG4gICAgICAgICAgICBpZiAobWFpbi5oYXNPd25Qcm9wZXJ0eShrKSkge1xuICAgICAgICAgICAgICAgIHJldFtrXSA9IHN1Yi5oYXNPd25Qcm9wZXJ0eShrKSA/IHN1YltrXSA6IG1haW5ba107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwcmVMb2FkSW1nIChzcmMsIGxvYWRDYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgICAgICB2YXIgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5zcmMgPSBzcmNcbiAgICAgICAgaW1nLm9ubG9hZCA9IGxvYWRDYWxsYmFjayA/IGxvYWRDYWxsYmFjay5iaW5kKGltZykgOiBudWxsXG4gICAgICAgIGltZy5vbmVycm9yID0gZXJyb3JDYWxsYmFjayA/IGVycm9yQ2FsbGJhY2suYmluZChpbWcpIDogbnVsbFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQgKGl0ZW0sIHR5cGUsIGRhdGEpIHtcbiAgICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlLCBkYXRhKVxuICAgICAgICBpdGVtLmRpc3BhdGNoRXZlbnQoZXZ0KVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFwcGx5U3JjKGl0ZW0sIHByb2Nlc3NlZFNyYywgcGxhY2Vob2xkZXJTcmMpIHtcbiAgICAgICAgaWYgKCFwcm9jZXNzZWRTcmMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09ICdJTUcnKSB7XG4gICAgICAgICAgICBpdGVtLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLnNyYyA9IHBsYWNlaG9sZGVyU3JjXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZSgnc3JjJywgcHJvY2Vzc2VkU3JjKTtcbiAgICAgICAgICAgIGlmICghcGxhY2Vob2xkZXJTcmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHByZUxvYWRJbWcocHJvY2Vzc2VkU3JjLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKFwiJyArIHByb2Nlc3NlZFNyYyArICdcIiknO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hdHVyYWxXaWR0aCA9IHRoaXMud2lkdGhcbiAgICAgICAgICAgICAgICBjb25zdCBuYXR1cmFsSGVpZ2h0ID0gdGhpcy5oZWlnaHRcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50KGl0ZW0sICdsb2FkJywge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IG5hdHVyYWxXaWR0aCwgbmF0dXJhbEhlaWdodCB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50KGl0ZW0sICdsb2FkJywgeyBzdWNjZXNzOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgIHByZUxvYWRJbWcocGxhY2Vob2xkZXJTcmMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKFwiJyArIHBsYWNlaG9sZGVyU3JjICsgJ1wiKSc7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICBhcHBlYXJJbnN0YW5jZSA9IGxpYi5hcHBlYXIuaW5pdCh7XG4gICAgICAgICAgICBjbHM6ICdpbWd0bXAnLCAvL+WPr+mAie+8jOmcgOimgemBjeWOhueahOWFg+e0oFxuICAgICAgICAgICAgb25jZTogdHJ1ZSwgLy/lj6/pgInvvIzmmK/lkKblj6rop6blj5HkuIDmrKFcbiAgICAgICAgICAgIHg6IGNvbmZpZy5sYXp5V2lkdGgsIC8v5Y+v6YCJ77yM5a655Zmo5Y+z6L656Led56a7eOS7peWGheeahOWFg+e0oOWKoOi9ve+8jOm7mOiupOS4ujBcbiAgICAgICAgICAgIHk6IGNvbmZpZy5sYXp5SGVpZ2h0LCAvL+WPr+mAie+8jOWuueWZqOW6lemDqOi3neemu3nku6XlhoXnmoTlhYPntKDliqDovb3vvIzpu5jorqTkuLowXG4gICAgICAgICAgICBvbkFwcGVhcjogZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gdGhpcztcbiAgICAgICAgICAgICAgICBhcHBseVNyYyhpdGVtLCBpdGVtLmdldEF0dHJpYnV0ZSgnaS1sYXp5LXNyYycpLCBpdGVtLmRhdGFzZXQucGxhY2Vob2xkZXIpO1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdpLWxhenktc3JjJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkYXB0ZXIubG9nQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnbGliLWltZyBDb25maWdcXG4nLCBjb25maWcpO1xuICAgIH1cblxuICAgIGFkYXB0ZXIuZmlyZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBpZiAoIWFwcGVhckluc3RhbmNlKSB7XG4gICAgICAgICAgICBpbml0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbGFiZWwgPSAnaV8nICsgRGF0ZS5ub3coKSAlIDEwMDAwMDtcbiAgICAgICAgdmFyIGRvbUxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbJyArIGNvbmZpZy5kYXRhU3JjICsgJ10nKTtcblxuICAgICAgICBbXS5mb3JFYWNoLmNhbGwoZG9tTGlzdCwgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChpdGVtLmRhdGFzZXQubGF6eSA9PSAnZmFsc2UnICYmIGl0ZW0uZGF0YXNldC5sYXp5ICE9ICd0cnVlJykge1xuICAgICAgICAgICAgICAgIGFwcGx5U3JjKGl0ZW0sIGl0ZW0uZ2V0QXR0cmlidXRlKGNvbmZpZy5kYXRhU3JjKSwgaXRlbS5kYXRhc2V0LnBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGxhYmVsKTtcbiAgICAgICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZSgnaS1sYXp5LXNyYycsIGl0ZW0uZ2V0QXR0cmlidXRlKGNvbmZpZy5kYXRhU3JjKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtLnJlbW92ZUF0dHJpYnV0ZShjb25maWcuZGF0YVNyYyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFwcGVhckluc3RhbmNlLmJpbmQoJy4nICsgbGFiZWwpO1xuICAgICAgICBhcHBlYXJJbnN0YW5jZS5maXJlKCk7XG4gICAgfVxuXG4gICAgYWRhcHRlci5kZWZhdWx0U3JjID0gJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUFEVWxFUVZRSW1XTmdZR0JnQUFBQUJRQUJoNkZPMUFBQUFBQkpSVTVFcmtKZ2dnPT0nO1xuXG4gICAgbGliLmltZyA9IGFkYXB0ZXI7XG4gICAgXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBhZGFwdGVyO1xuXG59KSh3aW5kb3csIHdpbmRvd1snbGliJ10gfHwgKHdpbmRvd1snbGliJ10gPSB7fSkpO1xuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWwgbGliLCBIVE1MRWxlbWVudCAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICdsYXp5aW1nJ1xuXG5sZXQgbGF6eWxvYWRUaW1lclxuXG4vLyBmaXJlIGxhenlpbWcgb24gaW1hZ2VzLlxuZnVuY3Rpb24gZmlyZSAoKSB7XG4gIHNldFRpbWVvdXQoKCkgPT4gbGliLmltZy5maXJlKCksIDApXG59XG5cbi8vIHdlIGRvbid0IGtub3cgd2hlbiBhbGwgaW1hZ2VzIGFyZSBhcHBlbmRlZFxuLy8ganVzdCB1c2Ugc2V0VGltZW91dCB0byBkbyBkZWxheSBsYXp5bG9hZFxuLy9cbi8vIC0tIGFjdHVhbGx5IGV2ZXJ5dGltZSB3ZSBhZGQgYSBlbGVtZW50IG9yIHVwZGF0ZSBzdHlsZXMsXG4vLyB0aGUgY29tcG9uZW50IG1hbmFnZXIgd2lsbCBjYWxsIHN0YXJ0SWZOZWVkIHRvIGZpcmVcbi8vIGxhenlsb2FkIG9uY2UgYWdhaW4gaW4gdGhlIGhhbmRsZUFwcGVuZCBmdW5jdGlvbi4gc28gdGhlcmVcbi8vIGlzIG5vIHdheSB0aGF0IGFueSBpbWFnZSBlbGVtZW50IGNhbiBtaXNzIGl0LiBTZWUgc291cmNlXG4vLyBjb2RlIGluIGNvbXBvbmVudE1hbmdhZ2VyLmpzLlxuXG4vLyBqdXN0IGZvciB0aGUgaW1hZ2UgY29tcG9uZW50IHRvIHN0YXJ0IGxhenlsb2FkLlxuZnVuY3Rpb24gc3RhcnRJZk5lZWRlZCAodGFyZ2V0KSB7XG4gIGlmICghbGF6eWxvYWRUaW1lcikge1xuICAgIGxhenlsb2FkVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGZpcmUoKVxuICAgICAgY2xlYXJUaW1lb3V0KGxhenlsb2FkVGltZXIpXG4gICAgICBsYXp5bG9hZFRpbWVyID0gbnVsbFxuICAgIH0sIDE2KVxuICB9XG59XG5cbi8vIGZvciBhIHNjb3BlIG9mIGVsZW1lbnQsIG5vdCBmb3IgYSBpbWFnZS5cbmZ1bmN0aW9uIGxvYWRJZk5lZWRlZCAoZWxlbWVudFNjb3BlKSB7XG4gIGNvbnN0IG5vdFByZVByb2Nlc3NlZCA9IGVsZW1lbnRTY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdbaW1nLXNyY10nKVxuICAvLyBpbWFnZSBlbGVtZW50cyB3aGljaCBoYXZlIGF0dHJpYnV0ZSAnaS1sYXp5LXNyYycgd2VyZSBlbGVtZW50c1xuICAvLyB0aGF0IGhhZCBiZWVuIHByZXByb2Nlc3NlZCBieSBsaWItaW1nLWNvcmUsIGJ1dCBub3QgbG9hZGVkIHlldCwgYW5kXG4gIC8vIG11c3QgYmUgbG9hZGVkIHdoZW4gJ2FwcGVhcicgZXZlbnRzIHdlcmUgZmlyZWQuIEl0IHR1cm5zIG91dCB0aGVcbiAgLy8gJ2FwcGVhcicgZXZlbnQgd2FzIG5vdCBmaXJlZCBjb3JyZWN0bHkgaW4gdGhlIGNzcy10cmFuc2xhdGUtdHJhbnNpdGlvblxuICAvLyBzaXR1YXRpb24sIHNvICdpLWxhenktc3JjJyBtdXN0IGJlIGNoZWNrZWQgYW5kIGxhenlsb2FkIG11c3QgYmVcbiAgLy8gZmlyZWQgbWFudWFsbHkuXG4gIGNvbnN0IHByZVByb2Nlc3NlZCA9IGVsZW1lbnRTY29wZS5xdWVyeVNlbGVjdG9yQWxsKCdbaS1sYXp5LXNyY10nKVxuICBpZiAobm90UHJlUHJvY2Vzc2VkLmxlbmd0aCA+IDAgfHwgcHJlUHJvY2Vzc2VkLmxlbmd0aCA+IDApIHtcbiAgICBmaXJlKClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUltYWdlTGF6eSAoaW1hZ2UsIHNyYykge1xuICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ2ltZy1zcmMnKVxuICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ2ktbGF6eS1zcmMnKVxuICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpXG4gIGltYWdlLnNldEF0dHJpYnV0ZSgnaW1nLXNyYycsIHNyYylcbiAgZmlyZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXJlTGF6eWxvYWQgKHRhcmdldCkge1xuICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiYgISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQubm9kZVxuICB9XG4gIGlmICghdGFyZ2V0KSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbWFnZScpIHtcbiAgICByZXR1cm4gc3RhcnRJZk5lZWRlZCh0YXJnZXQpXG4gIH1cbiAgcmV0dXJuIGxvYWRJZk5lZWRlZCh0YXJnZXQpXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgeyBleHRlbmQgfSBmcm9tICcuLi8uLi91dGlscydcbmltcG9ydCB7IENvbXBvbmVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi9kb20nXG5pbXBvcnQgeyBpc0NvbXBvbmVudEFwcGVhciB9IGZyb20gJy4uLy4uL2RvbS9hcHBlYXJXYXRjaGVyJ1xuaW1wb3J0ICogYXMgb3BlcmF0ZSBmcm9tICcuL29wZXJhdGUnXG5pbXBvcnQgKiBhcyBwb3NpdGlvbiBmcm9tICcuL3Bvc2l0aW9uJ1xuaW1wb3J0IGZsZXhib3ggZnJvbSAnLi9mbGV4Ym94J1xuaW1wb3J0IHsgbWFrZUltYWdlTGF6eSwgZmlyZUxhenlsb2FkIH0gZnJvbSAnLi9sYXp5bG9hZCdcblxuY29uc3QgYXBwZWFyRXZ0cyA9IFsnYXBwZWFyJywgJ2Rpc2FwcGVhciddXG5cbi8qKlxuICogY2hlY2sgd2hldGhlciBhIGV2ZW50IGlzIHZhbGlkIHRvIGRpc3BhdGNoLlxuICogQHBhcmFtICB7Q29tcG9uZW50fSAgICAgIGNvbXAgIHRoZSBjb21wb25lbnQgdGhhdCB0aGlzIGV2ZW50IGlzIHRvIHRyaWdnZXIgb24uXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICB0eXBlICAgdGhlIGV2ZW50IHR5cGUuXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgaXMgaXQgdmFsaWQgdG8gZGlzcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIGlzRXZlbnRWYWxpZCAoY29tcCwgdHlwZSkge1xuICAvLyBpZiBhIGNvbXBvbmVudCBoYXMgYWxlYXJ5IHRyaWdnZXJlZCAnYXBwZWFyJyBldmVudCwgdGhlblxuICAvLyB0aGUgJ2FwcGVhcicgZXZlbuKAoCBjYW4ndCBiZSB0cmlnZ2VyZWQgYWdhaW4gdXRpbGwgdGhlXG4gIC8vICdkaXNhcHBlYXInIGV2ZW50IHRyaWdnZXJlZC5cbiAgaWYgKGFwcGVhckV2dHMuaW5kZXhPZih0eXBlKSA8PSAtMSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgaWYgKGNvbXAuX2FwcGVhciA9PT0gdW5kZWZpbmVkICYmIHR5cGUgPT09ICdkaXNhcHBlYXInKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgbGV0IHJlc1xuICBpZiAoY29tcC5fYXBwZWFyID09PSB1bmRlZmluZWQgJiYgdHlwZSA9PT0gJ2FwcGVhcicpIHtcbiAgICByZXMgPSB0cnVlXG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzID0gdHlwZSAhPT0gY29tcC5fYXBwZWFyXG4gIH1cbiAgcmVzICYmIChjb21wLl9hcHBlYXIgPSB0eXBlKVxuICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbXBvbmVudCAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgdGhpcy5kYXRhID0gZGF0YVxuICB0aGlzLm5vZGUgPSB0aGlzLmNyZWF0ZShub2RlVHlwZSlcbiAgdGhpcy5jcmVhdGVDaGlsZHJlbigpXG4gIHRoaXMudXBkYXRlQXR0cnModGhpcy5kYXRhLmF0dHIgfHwge30pXG4gIC8vIGlzc3VlOiB3aGVuIGFkZCBlbGVtZW50IHRvIGEgbGlzdCBpbiBsaWZldGltZSBob29rICdyZWFkeScsIHRoZVxuICAvLyBzdHlsZXMgaXMgc2V0IHRvIHRoZSBjbGFzc1N0eWxlLCBub3Qgc3R5bGUuIFRoaXMgaXMgYSBpc3N1ZVxuICAvLyB0aGF0IGpzZnJhbWV3b3JrIHNob3VsZCBkbyBzb21ldGhpbmcgYWJvdXQuXG4gIGNvbnN0IGNsYXNzU3R5bGUgPSB0aGlzLmRhdGEuY2xhc3NTdHlsZVxuICBjbGFzc1N0eWxlICYmIHRoaXMudXBkYXRlU3R5bGUodGhpcy5kYXRhLmNsYXNzU3R5bGUpXG4gIHRoaXMudXBkYXRlU3R5bGUodGhpcy5kYXRhLnN0eWxlIHx8IHt9KVxuICB0aGlzLmJpbmRFdmVudHModGhpcy5kYXRhLmV2ZW50IHx8IFtdKVxufVxuXG5Db21wb25lbnQucHJvdG90eXBlID0ge1xuXG4gIGdldENvbXBvbmVudE1hbmFnZXIgKCkge1xuICAgIHJldHVybiBDb21wb25lbnRNYW5hZ2VyLmdldEluc3RhbmNlKHRoaXMuZGF0YS5pbnN0YW5jZUlkKVxuICB9LFxuXG4gIGdldFdlZXhJbnN0YW5jZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmdldFdlZXhJbnN0YW5jZSgpXG4gIH0sXG5cbiAgZ2V0UGFyZW50ICgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKCkuY29tcG9uZW50TWFwW3RoaXMucGFyZW50UmVmXVxuICB9LFxuXG4gIGdldFBhcmVudFNjcm9sbGVyICgpIHtcbiAgICBpZiAodGhpcy5pc0luU2Nyb2xsYWJsZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFyZW50U2Nyb2xsZXJcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICBnZXRSb290U2Nyb2xsZXIgKCkge1xuICAgIGlmICh0aGlzLmlzSW5TY3JvbGxhYmxlKCkpIHtcbiAgICAgIGxldCBzY3JvbGxlciA9IHRoaXMuX3BhcmVudFNjcm9sbGVyXG4gICAgICBsZXQgcGFyZW50ID0gc2Nyb2xsZXIuX3BhcmVudFNjcm9sbGVyXG4gICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgIHNjcm9sbGVyID0gcGFyZW50XG4gICAgICAgIHBhcmVudCA9IHNjcm9sbGVyLl9wYXJlbnRTY3JvbGxlclxuICAgICAgfVxuICAgICAgcmV0dXJuIHNjcm9sbGVyXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH0sXG5cbiAgZ2V0Um9vdENvbnRhaW5lciAoKSB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuZ2V0V2VleEluc3RhbmNlKCkuZ2V0Um9vdCgpXG4gICAgICB8fCBkb2N1bWVudC5ib2R5XG4gICAgcmV0dXJuIHJvb3RcbiAgfSxcblxuICBpc1Njcm9sbGFibGUgKCkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEudHlwZVxuICAgIHJldHVybiBDb21wb25lbnRNYW5hZ2VyLmdldFNjcm9sbGFibGVUeXBlcygpLmluZGV4T2YodCkgIT09IC0xXG4gIH0sXG5cbiAgaXNJblNjcm9sbGFibGUgKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5faXNJblNjcm9sbGFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHRoaXMuX2lzSW5TY3JvbGxhYmxlXG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KClcbiAgICBpZiAocGFyZW50XG4gICAgICAgICYmICh0eXBlb2YgcGFyZW50Ll9pc0luU2Nyb2xsYWJsZSAhPT0gJ2Jvb2xlYW4nKVxuICAgICAgICAmJiAhcGFyZW50LmlzU2Nyb2xsYWJsZSgpKSB7XG4gICAgICBpZiAocGFyZW50LmRhdGEucmVmID09PSAnX3Jvb3QnKSB7XG4gICAgICAgIHRoaXMuX2lzSW5TY3JvbGxhYmxlID0gZmFsc2VcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICB0aGlzLl9pc0luU2Nyb2xsYWJsZSA9IHBhcmVudC5pc0luU2Nyb2xsYWJsZSgpXG4gICAgICB0aGlzLl9wYXJlbnRTY3JvbGxlciA9IHBhcmVudC5fcGFyZW50U2Nyb2xsZXJcbiAgICAgIHJldHVybiB0aGlzLl9pc0luU2Nyb2xsYWJsZVxuICAgIH1cbiAgICBpZiAocGFyZW50ICYmIHR5cGVvZiBwYXJlbnQuX2lzSW5TY3JvbGxhYmxlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuX2lzSW5TY3JvbGxhYmxlID0gcGFyZW50Ll9pc0luU2Nyb2xsYWJsZVxuICAgICAgdGhpcy5fcGFyZW50U2Nyb2xsZXIgPSBwYXJlbnQuX3BhcmVudFNjcm9sbGVyXG4gICAgICByZXR1cm4gdGhpcy5faXNJblNjcm9sbGFibGVcbiAgICB9XG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuaXNTY3JvbGxhYmxlKCkpIHtcbiAgICAgIHRoaXMuX2lzSW5TY3JvbGxhYmxlID0gdHJ1ZVxuICAgICAgdGhpcy5fcGFyZW50U2Nyb2xsZXIgPSBwYXJlbnRcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIC8vIGRpc3BhdGNoIGEgc3BlY2lmaWVkIGV2ZW50IG9uIHRoaXMubm9kZVxuICAvLyAgLSB0eXBlOiBldmVudCB0eXBlXG4gIC8vICAtIGRhdGE6IGV2ZW50IGRhdGFcbiAgLy8gIC0gY29uZmlnOiBldmVudCBjb25maWcgb2JqZWN0XG4gIC8vICAgICAtIGJ1YmJsZXNcbiAgLy8gICAgIC0gY2FuY2VsYWJsZVxuICBkaXNwYXRjaEV2ZW50ICh0eXBlLCBkYXRhLCBjb25maWcpIHtcbiAgICBpZiAoIWlzRXZlbnRWYWxpZCh0aGlzLCB0eXBlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKVxuICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fVxuICAgIGV2ZW50LmluaXRFdmVudCh0eXBlLCBjb25maWcuYnViYmxlcyB8fCBmYWxzZSwgY29uZmlnLmNhbmNlbGFibGUgfHwgZmFsc2UpXG4gICAgIWRhdGEgJiYgKGRhdGEgPSB7fSlcbiAgICBldmVudC5kYXRhID0gZXh0ZW5kKHt9LCBkYXRhKVxuICAgIGV4dGVuZChldmVudCwgZGF0YSlcbiAgICB0aGlzLm5vZGUuZGlzcGF0Y2hFdmVudChldmVudClcbiAgfSxcblxuICBvbkFwcGVuZDogZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGV2dHMgPSB0aGlzLmRhdGEuZXZlbnRcbiAgICBpZiAoIWV2dHMgfHwgIWV2dHMubGVuZ3RoKSB7IHJldHVybiB9XG4gICAgbGV0IGZsYWcgPSBmYWxzZVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gZXZ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChldnRzW2ldID09PSAnYXBwZWFyJykge1xuICAgICAgICBmbGFnID0gdHJ1ZVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWZsYWcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyB0cmlnZ2VyICdhcHBlYXInIGV2ZW50IGluIHRoZSBuZXh0IHRpY2suXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoaXNDb21wb25lbnRBcHBlYXIodGhpcykpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdhcHBlYXInLCB7IGRpcmVjdGlvbjogJycgfSlcbiAgICAgIH1cbiAgICB9LCAwKVxuICB9LFxuXG4gIGFkZEFwcGVuZEhhbmRsZXIgKGNiKSB7XG4gICAgbGV0IHByZVxuICAgIGlmICh0aGlzLm9uQXBwZW5kKSB7XG4gICAgICBwcmUgPSB0aGlzLm9uQXBwZW5kLmJpbmQodGhpcylcbiAgICB9XG4gICAgdGhpcy5vbkFwcGVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByZSAmJiBwcmUuY2FsbCh0aGlzKVxuICAgICAgY2IgJiYgY2IuY2FsbCh0aGlzKVxuICAgIH0uYmluZCh0aGlzKVxuICB9LFxuXG4gIC8vIGNoYW5nZSBzcmMgdG8gaW1nLXNyYyBmb3IgbGliLmltZyB0byBmaXJlIGxhenlsb2FkIGxhdGVyLlxuICBlbmFibGVMYXp5bG9hZCAoc3JjKSB7XG4gICAgaWYgKHRoaXMubm9kZSkge1xuICAgICAgbWFrZUltYWdlTGF6eSh0aGlzLm5vZGUsIHNyYylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSB0aGlzLm5vZGUgZG9lcyBub3QgZXhpc3QuJylcbiAgICB9XG4gIH0sXG5cbiAgLy8gdGFyZ2V0IGNhbiBiZSBib3RoIHdlZXggY29tcG9uZW50IGFuZCBkb20gZWxlbWVudC5cbiAgZmlyZUxhenlsb2FkICh0YXJnZXQpIHtcbiAgICAhdGFyZ2V0ICYmICh0YXJnZXQgPSB0aGlzKVxuICAgIGZpcmVMYXp5bG9hZCh0YXJnZXQpXG4gIH0sXG5cbiAgYXR0cjoge30sIC8vIGF0dHIgc2V0dGVyc1xuXG4gIHN0eWxlOiB7fSwgLy8gc3R5bGUgc2V0dGVyc1xuXG4gIC8vIGV2ZW50IGZ1bmNzXG4gIC8vICAtIDEuICd1cGRhdG9yJyBmb3IgdXBkYXRpbmcgYXR0cnMgb3Igc3R5bGVzIHdpdGggb3V0IHRyaWdnZXJpbmcgbWVzc2FnZXMuXG4gIC8vICAtIDIuICdleHRyYScgZm9yIGJpbmRpbmcgZXh0cmEgZGF0YS5cbiAgLy8gIC0gMy4gJ3NldHRlcicgc2V0IGEgc3BlY2lmaWVkIGV2ZW50IGhhbmRsZXIuXG4gIC8vIGZ1bmNzIHNob3VsZCBiZSBmdW5jdGlvbnMgbGlrZSB0aGlzOiAodGFrZSAnY2hhbmdlJyBldmVudCBhcyBhIGV4YW1wbGUpXG4gIC8vIHtcbiAgLy8gICBjaGFuZ2U6IHtcbiAgLy8gICAgIHVwZGF0b3IgKCkge1xuICAvLyAgICAgICByZXR1cm4ge1xuICAvLyAgICAgICAgIGF0dHJzOiB7XG4gIC8vICAgICAgICAgICBjaGVja2VkOiB0aGlzLmNoZWNrZWRcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH0sXG4gIC8vICAgICBleHRyYSAoKSB7XG4gIC8vICAgICAgIHJldHVybiB7XG4gIC8vICAgICAgICAgdmFsdWU6IHRoaXMuY2hlY2tlZFxuICAvLyAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG4gIGV2ZW50OiB7fSxcblxuICBjbGVhckF0dHIgKCkge1xuICB9LFxuXG4gIGNsZWFyU3R5bGUgKCkge1xuICAgIHRoaXMubm9kZS5jc3NUZXh0ID0gJydcbiAgfVxufVxuXG4vLyBleHRlbmQgb3BlcmF0aW9ucy5cbmV4dGVuZChDb21wb25lbnQucHJvdG90eXBlLCBvcGVyYXRlKVxuXG4vLyBleHRlbmQgYXR0ciBhbmQgc3R5bGUgc2V0dGVycyBmcm9tICdwb3NpdGlvbicgYW5kICdmbGV4Ym94Jy5cbmV4dGVuZChDb21wb25lbnQucHJvdG90eXBlLCBwb3NpdGlvbilcbmV4dGVuZChDb21wb25lbnQucHJvdG90eXBlLnN0eWxlLCBmbGV4Ym94LnN0eWxlKVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL2NvbXBvbmVudCdcblxuLy8gQ29tcG9uZW50IHdoaWNoIGNhbiBoYXZlIG5vIHN1YmNvbXBvbmVudHMuXG4vLyBUaGlzIGNvbXBvbmVudCBzaG91bGQgbm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseSwgc2luY2Vcbi8vIGl0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIHRvIGV4dGVuZCBmcm9tLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXRvbWljIChkYXRhKSB7XG4gIENvbXBvbmVudC5jYWxsKHRoaXMsIGRhdGEpXG59XG5cbkF0b21pYy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG5cbkF0b21pYy5wcm90b3R5cGUuY3JlYXRlQ2hpbGRyZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAvLyBkbyBub250aGluZ1xuICByZXR1cm5cbn1cblxuQXRvbWljLnByb3RvdHlwZS5hcHBlbmRDaGlsZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gIC8vIGRvIG5vdGhpbmdcbiAgcmV0dXJuXG59XG5cbkF0b21pYy5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlID0gZnVuY3Rpb24gKGNoaWxkLCBiZWZvcmUpIHtcbiAgLy8gZG8gbm90aGluZ1xuICByZXR1cm5cbn1cblxuQXRvbWljLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uIChjaGlsZCkge1xuICAvLyBkbyBub3RoaW5nXG4gIHJldHVyblxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogc2F2ZSB0aGUgb3JpZ2luYWwgbGlzdGVuZXIgZm9yICdhZGRFdmVudExpc3RlbmVyJy5cbiAqIHRoaXMgaXMgdGhlIGRpcGFjaGluZyBsaXN0ZW5lciB3aGljaCBpcyB3YWl0aW5nIGZvciBmZWVkLlxuICogbWFwIHN0cnVjdHVyZTogbW9kdWxlTmFtZSAtPiBldmVudE5hbWUgLT4gW2hhbmRsZXJzXS5cbiAqL1xuY29uc3QgaGFuZGxlck1hcCA9IHt9XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb2R1bGVldmVudCcsIGV2ZW50ID0+IHtcbiAgY29uc3QgZHQgPSBldmVudC5kZXRhaWwgfHwge31cbiAgY29uc3QgbW9kdWxlID0gZHQubW9kdWxlXG4gIGNvbnN0IHR5cGUgPSBkdC50eXBlXG4gIHRyeSB7XG4gICAgaGFuZGxlck1hcFttb2R1bGVdW3R5cGVdLmZvckVhY2goaGFuZGxlciA9PiBoYW5kbGVyKGR0KSlcbiAgfVxuICBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gbm8gc3VjaCBldmVudCAke3R5cGV9IGZvciBtb2R1bGUgJHttb2R1bGV9LmApXG4gIH1cbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyIChtb2R1bGUsIGV2dCwgY2FsbGJhY2tJZCwgb3B0aW9ucykge1xuICBjb25zdCBvbmNlID0gb3B0aW9ucyAmJiAhIW9wdGlvbnMub25jZVxuICBsZXQgbW9kdWxlTWFwID0gaGFuZGxlck1hcFttb2R1bGVdXG4gIGlmICghbW9kdWxlTWFwKSB7XG4gICAgbW9kdWxlTWFwID0gaGFuZGxlck1hcFttb2R1bGVdID0ge31cbiAgfVxuICBsZXQgaGFuZGxlcnMgPSBtb2R1bGVNYXBbZXZ0XVxuICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgaGFuZGxlcnMgPSBtb2R1bGVNYXBbZXZ0XSA9IFtdXG4gIH1cbiAgaGFuZGxlcnMucHVzaCgoZGF0YSkgPT4gdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIGRhdGEsICFvbmNlKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzIChtb2R1bGUsIGV2dCkge1xuICB0cnkge1xuICAgIGRlbGV0ZSBoYW5kbGVyTWFwW21vZHVsZV1bZXZ0XVxuICB9XG4gIGNhdGNoIChlKSB7XG4gICAgLy8gZG8gbm90aGluZy5cbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgQ29tcG9uZW50TWFuYWdlciBmcm9tICcuLi9kb20vY29tcG9uZW50TWFuYWdlcidcbmltcG9ydCB7IHJlZ2lzdGVyTG9hZGVyIH0gZnJvbSAnLi9sb2FkZXInXG5pbXBvcnQgeyBwcm90b2NvbCB9IGZyb20gJy4uL2JyaWRnZSdcbmltcG9ydCB7IGV4dGVuZCB9IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgYWRkRXZlbnRMaXN0ZW5lciwgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMgfSBmcm9tICcuLi9iYXNlL21vZHVsZUV2ZW50J1xuXG4vKipcbiAqIHJlZ2lzdGVyIG1vZHVsZSBldmVudCBsaXN0ZW5lciBmb3IgZXZlcnkgYXBpIG1vZHVsZSBleGNlcHQgJ2dsb2JhbEV2ZW50Jy5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJNb2R1bGVFdmVudExpc3RlbmVyIChuYW1lLCBtb2R1bGUsIG1ldGEpIHtcbiAgaWYgKG5hbWUgIT09ICdnbG9iYWxFdmVudCcpIHtcbiAgICBtb2R1bGVbJ2FkZEV2ZW50TGlzdGVuZXInXSA9IGZ1bmN0aW9uIChldnQsIGNhbGxiYWNrSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhZGRFdmVudExpc3RlbmVyLmNhbGwodGhpcywgbmFtZSwgZXZ0LCBjYWxsYmFja0lkLCBvcHRpb25zKVxuICAgIH1cbiAgICBtb2R1bGVbJ3JlbW92ZUFsbEV2ZW50TGlzdGVuZXJzJ10gPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICByZXR1cm4gcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMuY2FsbCh0aGlzLCBuYW1lLCBldnQpXG4gICAgfVxuICAgIDsgW3tcbiAgICAgIG5hbWU6ICdhZGRFdmVudExpc3RlbmVyJyxcbiAgICAgIGFyZ3M6IFsnc3RyaW5nJywgJ2Z1bmN0aW9uJywgJ29iamVjdCddXG4gICAgfSwge1xuICAgICAgbmFtZTogJ3JlbW92ZUFsbEV2ZW50TGlzdGVuZXJzJyxcbiAgICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgICB9XS5mb3JFYWNoKGluZm8gPT4gbWV0YVtuYW1lXS5wdXNoKGluZm8pKVxuICB9XG59XG5cbmNvbnN0IG1ldGhvZHMgPSB7XG4gIC8vIFJlZ2lzdGVyIGEgbmV3IGNvbXBvbmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgcmVnaXN0ZXJDb21wb25lbnQgKG5hbWUsIGNvbXApIHtcbiAgICBDb21wb25lbnRNYW5hZ2VyLnJlZ2lzdGVyQ29tcG9uZW50KG5hbWUsIGNvbXApXG4gIH0sXG5cbiAgLy8gUmVnaXN0ZXIgYSBuZXcgYXBpIG1vZHVsZS5cbiAgLy8gSWYgdGhlIG1vZHVsZSBhbHJlYWR5IGV4aXN0cywganVzdCBhZGQgbWV0aG9kcyBmcm9tIHRoZVxuICAvLyBuZXcgbW9kdWxlIHRvIHRoZSBvbGQgb25lLlxuICByZWdpc3RlckFwaU1vZHVsZSAobmFtZSwgbW9kdWxlLCBtZXRhKSB7XG4gICAgcmVnaXN0ZXJNb2R1bGVFdmVudExpc3RlbmVyKG5hbWUsIG1vZHVsZSwgbWV0YSlcbiAgICBpZiAoIXByb3RvY29sLmFwaU1vZHVsZVtuYW1lXSkge1xuICAgICAgcHJvdG9jb2wuYXBpTW9kdWxlW25hbWVdID0gbW9kdWxlXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbW9kdWxlKSB7XG4gICAgICAgIGlmIChtb2R1bGUuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIHByb3RvY29sLmFwaU1vZHVsZVtuYW1lXVtrZXldID0gbW9kdWxlW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyByZWdpc3RlciBBUEkgbW9kdWxlJ3MgbWV0YSBpbmZvIHRvIGpzZnJhbWV3b3JrXG4gICAgaWYgKG1ldGEpIHtcbiAgICAgIHByb3RvY29sLnNldEFwaU1vZHVsZU1ldGEobWV0YSlcbiAgICAgIGdsb2JhbC5yZWdpc3Rlck1vZHVsZXMocHJvdG9jb2wuZ2V0QXBpTW9kdWxlTWV0YShuYW1lKSwgdHJ1ZSlcbiAgICB9XG4gIH0sXG5cbiAgLy8gUmVnaXN0ZXIgYSBuZXcgYXBpIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuXG4gIC8vIG9wdHM6XG4gIC8vICAtIGFyZ3M6IHR5cGUgb2YgYXJndW1lbnRzIHRoZSBBUEkgbWV0aG9kIHRha2VzIHN1Y2hcbiAgLy8gICAgYXMgWydzdHJpbmcnLCAnZnVuY3Rpb24nXVxuICByZWdpc3RlckFwaSAobW9kdWxlTmFtZSwgbmFtZSwgbWV0aG9kLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBtZXRob2QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoIXByb3RvY29sLmFwaU1vZHVsZVttb2R1bGVOYW1lXSkge1xuICAgICAgcHJvdG9jb2wuYXBpTW9kdWxlW21vZHVsZU5hbWVdID0ge31cbiAgICAgIHByb3RvY29sLl9tZXRhW21vZHVsZU5hbWVdID0gW11cbiAgICB9XG4gICAgcHJvdG9jb2wuYXBpTW9kdWxlW21vZHVsZU5hbWVdW25hbWVdID0gbWV0aG9kXG4gICAgaWYgKCFhcmdzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcmVnaXN0ZXIgQVBJIG1ldGEgaW5mbyB0byBqc2ZyYW1ld29ya1xuICAgIHByb3RvY29sLnNldEFwaU1ldGEobW9kdWxlTmFtZSwge1xuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIGFyZ3M6IGFyZ3NcbiAgICB9KVxuICAgIGdsb2JhbC5yZWdpc3Rlck1vZHVsZXMocHJvdG9jb2wuZ2V0QXBpTW9kdWxlTWV0YShtb2R1bGVOYW1lKSwgdHJ1ZSlcbiAgfSxcblxuICAvLyBSZWdpc3RlciBhIG5ldyB3ZWV4LWJ1bmRsZS1sb2FkZXIuXG4gIHJlZ2lzdGVyTG9hZGVyIChuYW1lLCBsb2FkZXJGdW5jKSB7XG4gICAgcmVnaXN0ZXJMb2FkZXIobmFtZSwgbG9hZGVyRnVuYylcbiAgfVxuXG59XG5cbi8vIFRvIGluc3RhbGwgY29tcG9uZW50cyBhbmQgcGx1Z2lucy5cbmZ1bmN0aW9uIGluc3RhbGwgKG1vZCkge1xuICBtb2QuaW5pdCh0aGlzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZCAoV2VleCkge1xuICBXZWV4Lmluc3RhbGwgPSBpbnN0YWxsLmJpbmQoV2VleClcbiAgZXh0ZW5kKFdlZXgsIG1ldGhvZHMpXG59XG4iLCIodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpICYmICh3aW5kb3cgPSB7Y3RybDoge30sIGxpYjoge319KTshd2luZG93LmN0cmwgJiYgKHdpbmRvdy5jdHJsID0ge30pOyF3aW5kb3cubGliICYmICh3aW5kb3cubGliID0ge30pOyFmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJ2YWxcIix7dmFsdWU6YS50b1N0cmluZygpLGVudW1lcmFibGU6ITB9KSx0aGlzLmd0PWZ1bmN0aW9uKGEpe3JldHVybiBjLmNvbXBhcmUodGhpcyxhKT4wfSx0aGlzLmd0ZT1mdW5jdGlvbihhKXtyZXR1cm4gYy5jb21wYXJlKHRoaXMsYSk+PTB9LHRoaXMubHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuY29tcGFyZSh0aGlzLGEpPDB9LHRoaXMubHRlPWZ1bmN0aW9uKGEpe3JldHVybiBjLmNvbXBhcmUodGhpcyxhKTw9MH0sdGhpcy5lcT1mdW5jdGlvbihhKXtyZXR1cm4gMD09PWMuY29tcGFyZSh0aGlzLGEpfX1iLmVudj1iLmVudnx8e30sYy5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx9LGMucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy52YWwuc3BsaXQoXCIuXCIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1wYXJzZUludChhW2NdLDEwKTtpc05hTihkKSYmKGQ9MCk7dmFyIGU9ZC50b1N0cmluZygpO2UubGVuZ3RoPDUmJihlPUFycmF5KDYtZS5sZW5ndGgpLmpvaW4oXCIwXCIpK2UpLGIucHVzaChlKSwxPT09Yi5sZW5ndGgmJmIucHVzaChcIi5cIil9cmV0dXJuIHBhcnNlRmxvYXQoYi5qb2luKFwiXCIpKX0sYy5jb21wYXJlPWZ1bmN0aW9uKGEsYil7YT1hLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpLGI9Yi50b1N0cmluZygpLnNwbGl0KFwiLlwiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RofHxjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9cGFyc2VJbnQoYVtjXSwxMCksZT1wYXJzZUludChiW2NdLDEwKTtpZih3aW5kb3cuaXNOYU4oZCkmJihkPTApLHdpbmRvdy5pc05hTihlKSYmKGU9MCksZT5kKXJldHVybi0xO2lmKGQ+ZSlyZXR1cm4gMX1yZXR1cm4gMH0sYi52ZXJzaW9uPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgYyhhKX19KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpLGZ1bmN0aW9uKGEsYil7Yi5lbnY9Yi5lbnZ8fHt9O3ZhciBjPWEubG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoL15cXD8vLFwiXCIpO2lmKGIuZW52LnBhcmFtcz17fSxjKWZvcih2YXIgZD1jLnNwbGl0KFwiJlwiKSxlPTA7ZTxkLmxlbmd0aDtlKyspe2RbZV09ZFtlXS5zcGxpdChcIj1cIik7dHJ5e2IuZW52LnBhcmFtc1tkW2VdWzBdXT1kZWNvZGVVUklDb21wb25lbnQoZFtlXVsxXSl9Y2F0Y2goZil7Yi5lbnYucGFyYW1zW2RbZV1bMF1dPWRbZV1bMV19fX0od2luZG93LHdpbmRvdy5saWJ8fCh3aW5kb3cubGliPXt9KSksZnVuY3Rpb24oYSxiKXtiLmVudj1iLmVudnx8e307dmFyIGMsZD1hLm5hdmlnYXRvci51c2VyQWdlbnQ7aWYoYz1kLm1hdGNoKC9XaW5kb3dzXFxzUGhvbmVcXHMoPzpPU1xccyk/KFtcXGRcXC5dKykvKSliLmVudi5vcz17bmFtZTpcIldpbmRvd3MgUGhvbmVcIixpc1dpbmRvd3NQaG9uZTohMCx2ZXJzaW9uOmNbMV19O2Vsc2UgaWYoZC5tYXRjaCgvU2FmYXJpLykmJihjPWQubWF0Y2goL0FuZHJvaWRbXFxzXFwvXShbXFxkXFwuXSspLykpKWIuZW52Lm9zPXt2ZXJzaW9uOmNbMV19LGQubWF0Y2goL01vYmlsZVxccytTYWZhcmkvKT8oYi5lbnYub3MubmFtZT1cIkFuZHJvaWRcIixiLmVudi5vcy5pc0FuZHJvaWQ9ITApOihiLmVudi5vcy5uYW1lPVwiQW5kcm9pZFBhZFwiLGIuZW52Lm9zLmlzQW5kcm9pZFBhZD0hMCk7ZWxzZSBpZihjPWQubWF0Y2goLyhpUGhvbmV8aVBhZHxpUG9kKS8pKXt2YXIgZT1jWzFdO2M9ZC5tYXRjaCgvT1MgKFtcXGRfXFwuXSspIGxpa2UgTWFjIE9TIFgvKSxiLmVudi5vcz17bmFtZTplLGlzSVBob25lOlwiaVBob25lXCI9PT1lfHxcImlQb2RcIj09PWUsaXNJUGFkOlwiaVBhZFwiPT09ZSxpc0lPUzohMCx2ZXJzaW9uOmNbMV0uc3BsaXQoXCJfXCIpLmpvaW4oXCIuXCIpfX1lbHNlIGIuZW52Lm9zPXtuYW1lOlwidW5rbm93blwiLHZlcnNpb246XCIwLjAuMFwifTtiLnZlcnNpb24mJihiLmVudi5vcy52ZXJzaW9uPWIudmVyc2lvbihiLmVudi5vcy52ZXJzaW9uKSl9KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpLGZ1bmN0aW9uKGEsYil7Yi5lbnY9Yi5lbnZ8fHt9O3ZhciBjLGQ9YS5uYXZpZ2F0b3IudXNlckFnZW50OyhjPWQubWF0Y2goLyg/OlVDV0VCfFVDQnJvd3NlclxcLykoW1xcZFxcLl0rKS8pKT9iLmVudi5icm93c2VyPXtuYW1lOlwiVUNcIixpc1VDOiEwLHZlcnNpb246Y1sxXX06KGM9ZC5tYXRjaCgvTVFRQnJvd3NlclxcLyhbXFxkXFwuXSspLykpP2IuZW52LmJyb3dzZXI9e25hbWU6XCJRUVwiLGlzUVE6ITAsdmVyc2lvbjpjWzFdfTooYz1kLm1hdGNoKC9GaXJlZm94XFwvKFtcXGRcXC5dKykvKSk/Yi5lbnYuYnJvd3Nlcj17bmFtZTpcIkZpcmVmb3hcIixpc0ZpcmVmb3g6ITAsdmVyc2lvbjpjWzFdfTooYz1kLm1hdGNoKC9NU0lFXFxzKFtcXGRcXC5dKykvKSl8fChjPWQubWF0Y2goL0lFTW9iaWxlXFwvKFtcXGRcXC5dKykvKSk/KGIuZW52LmJyb3dzZXI9e3ZlcnNpb246Y1sxXX0sZC5tYXRjaCgvSUVNb2JpbGUvKT8oYi5lbnYuYnJvd3Nlci5uYW1lPVwiSUVNb2JpbGVcIixiLmVudi5icm93c2VyLmlzSUVNb2JpbGU9ITApOihiLmVudi5icm93c2VyLm5hbWU9XCJJRVwiLGIuZW52LmJyb3dzZXIuaXNJRT0hMCksZC5tYXRjaCgvQW5kcm9pZHxpUGhvbmUvKSYmKGIuZW52LmJyb3dzZXIuaXNJRUxpa2VXZWJraXQ9ITApKTooYz1kLm1hdGNoKC8oPzpDaHJvbWV8Q3JpT1MpXFwvKFtcXGRcXC5dKykvKSk/KGIuZW52LmJyb3dzZXI9e25hbWU6XCJDaHJvbWVcIixpc0Nocm9tZTohMCx2ZXJzaW9uOmNbMV19LGQubWF0Y2goL1ZlcnNpb25cXC9bXFxkK1xcLl0rXFxzKkNocm9tZS8pJiYoYi5lbnYuYnJvd3Nlci5uYW1lPVwiQ2hyb21lIFdlYnZpZXdcIixiLmVudi5icm93c2VyLmlzV2Vidmlldz0hMCkpOmQubWF0Y2goL1NhZmFyaS8pJiYoYz1kLm1hdGNoKC9BbmRyb2lkW1xcc1xcL10oW1xcZFxcLl0rKS8pKT9iLmVudi5icm93c2VyPXtuYW1lOlwiQW5kcm9pZFwiLGlzQW5kcm9pZDohMCx2ZXJzaW9uOmNbMV19OmQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvKT9kLm1hdGNoKC9TYWZhcmkvKT8oYz1kLm1hdGNoKC9WZXJzaW9uXFwvKFtcXGRcXC5dKykvKSxiLmVudi5icm93c2VyPXtuYW1lOlwiU2FmYXJpXCIsaXNTYWZhcmk6ITAsdmVyc2lvbjpjWzFdfSk6KGM9ZC5tYXRjaCgvT1MgKFtcXGRfXFwuXSspIGxpa2UgTWFjIE9TIFgvKSxiLmVudi5icm93c2VyPXtuYW1lOlwiaU9TIFdlYnZpZXdcIixpc1dlYnZpZXc6ITAsdmVyc2lvbjpjWzFdLnJlcGxhY2UoL1xcXy9nLFwiLlwiKX0pOmIuZW52LmJyb3dzZXI9e25hbWU6XCJ1bmtub3duXCIsdmVyc2lvbjpcIjAuMC4wXCJ9LGIudmVyc2lvbiYmKGIuZW52LmJyb3dzZXIudmVyc2lvbj1iLnZlcnNpb24oYi5lbnYuYnJvd3Nlci52ZXJzaW9uKSl9KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpLGZ1bmN0aW9uKGEsYil7Yi5lbnY9Yi5lbnZ8fHt9O3ZhciBjPWEubmF2aWdhdG9yLnVzZXJBZ2VudDtjLm1hdGNoKC9XZWliby9pKT9iLmVudi50aGlyZGFwcD17YXBwbmFtZTpcIldlaWJvXCIsaXNXZWlibzohMH06Yy5tYXRjaCgvTWljcm9NZXNzZW5nZXIvaSk/Yi5lbnYudGhpcmRhcHA9e2FwcG5hbWU6XCJXZWl4aW5cIixpc1dlaXhpbjohMH06Yi5lbnYudGhpcmRhcHA9ITF9KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpLGZ1bmN0aW9uKGEsYil7Yi5lbnY9Yi5lbnZ8fHt9O3ZhciBjLGQsZT1hLm5hdmlnYXRvci51c2VyQWdlbnQ7KGQ9ZS5tYXRjaCgvV2luZFZhbmVbXFwvXFxzXShbXFxkXFwuXFxfXSspLykpJiYoYz1kWzFdKTt2YXIgZj0hMSxnPVwiXCIsaD1cIlwiLGk9XCJcIjsoZD1lLm1hdGNoKC9BbGlBcHBcXCgoW0EtWlxcLV0rKVxcLyhbXFxkXFwuXSspXFwpL2kpKSYmKGY9ITAsZz1kWzFdLGk9ZFsyXSxoPWcuaW5kZXhPZihcIi1QRFwiKT4wP2IuZW52Lm9zLmlzSU9TP1wiaVBhZFwiOmIuZW52Lm9zLmlzQW5kcm9pZD9cIkFuZHJvaWRQYWRcIjpiLmVudi5vcy5uYW1lOmIuZW52Lm9zLm5hbWUpLCFnJiZlLmluZGV4T2YoXCJUQklPU1wiKT4wJiYoZz1cIlRCXCIpLGY/Yi5lbnYuYWxpYXBwPXt3aW5kdmFuZTpiLnZlcnNpb24oY3x8XCIwLjAuMFwiKSxhcHBuYW1lOmd8fFwidW5rb3duXCIsdmVyc2lvbjpiLnZlcnNpb24oaXx8XCIwLjAuMFwiKSxwbGF0Zm9ybTpofHxiLmVudi5vcy5uYW1lfTpiLmVudi5hbGlhcHA9ITEsYi5lbnYudGFvYmFvQXBwPWIuZW52LmFsaWFwcH0od2luZG93LHdpbmRvdy5saWJ8fCh3aW5kb3cubGliPXt9KSk7O21vZHVsZS5leHBvcnRzID0gd2luZG93LmxpYlsnZW52J107IiwiKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSAmJiAod2luZG93ID0ge2N0cmw6IHt9LCBsaWI6IHt9fSk7IXdpbmRvdy5jdHJsICYmICh3aW5kb3cuY3RybCA9IHt9KTshd2luZG93LmxpYiAmJiAod2luZG93LmxpYiA9IHt9KTshZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3ZhciBiPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwicGFyYW1zXCIse3NldDpmdW5jdGlvbihhKXtpZihcIm9iamVjdFwiPT10eXBlb2YgYSl7Zm9yKHZhciBjIGluIGIpZGVsZXRlIGJbY107Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdfX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGJ9LGVudW1lcmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcInNlYXJjaFwiLHtzZXQ6ZnVuY3Rpb24oYSl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEpezA9PT1hLmluZGV4T2YoXCI/XCIpJiYoYT1hLnN1YnN0cigxKSk7dmFyIGM9YS5zcGxpdChcIiZcIik7Zm9yKHZhciBkIGluIGIpZGVsZXRlIGJbZF07Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWNbZV0uc3BsaXQoXCI9XCIpO2lmKHZvaWQgMCE9PWZbMV0mJihmWzFdPWZbMV0udG9TdHJpbmcoKSksZlswXSl0cnl7YltkZWNvZGVVUklDb21wb25lbnQoZlswXSldPWRlY29kZVVSSUNvbXBvbmVudChmWzFdKX1jYXRjaChnKXtiW2ZbMF1dPWZbMV19fX19LGdldDpmdW5jdGlvbigpe3ZhciBhPVtdO2Zvcih2YXIgYyBpbiBiKWlmKHZvaWQgMCE9PWJbY10paWYoXCJcIiE9PWJbY10pdHJ5e2EucHVzaChlbmNvZGVVUklDb21wb25lbnQoYykrXCI9XCIrZW5jb2RlVVJJQ29tcG9uZW50KGJbY10pKX1jYXRjaChkKXthLnB1c2goYytcIj1cIitiW2NdKX1lbHNlIHRyeXthLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGMpKX1jYXRjaChkKXthLnB1c2goYyl9cmV0dXJuIGEubGVuZ3RoP1wiP1wiK2Euam9pbihcIiZcIik6XCJcIn0sZW51bWVyYWJsZTohMH0pO3ZhciBjO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiaGFzaFwiLHtzZXQ6ZnVuY3Rpb24oYSl7XCJzdHJpbmdcIj09dHlwZW9mIGEmJihhJiZhLmluZGV4T2YoXCIjXCIpPDAmJihhPVwiI1wiK2EpLGM9YXx8XCJcIil9LGdldDpmdW5jdGlvbigpe3JldHVybiBjfSxlbnVtZXJhYmxlOiEwfSksdGhpcy5zZXQ9ZnVuY3Rpb24oYSl7YT1hfHxcIlwiO3ZhciBiO2lmKCEoYj1hLm1hdGNoKG5ldyBSZWdFeHAoXCJeKFthLXowLTktXSs6KT9bL117Mn0oPzooW15ALzo/XSspKD86OihbXkAvOl0rKSk/QCk/KFteOi8/I10rKSg/Ols6XShbMC05XSspKT8oWy9dW14/IztdKik/KD86Wz9dKFteI10qKSk/KFsjXVteP10qKT8kXCIsXCJpXCIpKSkpdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgdXJpIHNjaGVtZS5cIik7dGhpcy5wcm90b2NvbD1iWzFdfHwoXCJvYmplY3RcIj09dHlwZW9mIGxvY2F0aW9uP2xvY2F0aW9uLnByb3RvY29sOlwiXCIpLHRoaXMudXNlcm5hbWU9YlsyXXx8XCJcIix0aGlzLnBhc3N3b3JkPWJbM118fFwiXCIsdGhpcy5ob3N0bmFtZT10aGlzLmhvc3Q9Yls0XSx0aGlzLnBvcnQ9Yls1XXx8XCJcIix0aGlzLnBhdGhuYW1lPWJbNl18fFwiL1wiLHRoaXMuc2VhcmNoPWJbN118fFwiXCIsdGhpcy5oYXNoPWJbOF18fFwiXCIsdGhpcy5vcmlnaW49dGhpcy5wcm90b2NvbCtcIi8vXCIrdGhpcy5ob3N0bmFtZX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucHJvdG9jb2wrXCIvL1wiO3JldHVybiB0aGlzLnVzZXJuYW1lJiYoYSs9dGhpcy51c2VybmFtZSx0aGlzLnBhc3N3b3JkJiYoYSs9XCI6XCIrdGhpcy5wYXNzd29yZCksYSs9XCJAXCIpLGErPXRoaXMuaG9zdCx0aGlzLnBvcnQmJlwiODBcIiE9PXRoaXMucG9ydCYmKGErPVwiOlwiK3RoaXMucG9ydCksdGhpcy5wYXRobmFtZSYmKGErPXRoaXMucGF0aG5hbWUpLHRoaXMuc2VhcmNoJiYoYSs9dGhpcy5zZWFyY2gpLHRoaXMuaGFzaCYmKGErPXRoaXMuaGFzaCksYX0sYSYmdGhpcy5zZXQoYS50b1N0cmluZygpKX1iLmh0dHB1cmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBjKGEpfX0od2luZG93LHdpbmRvdy5saWJ8fCh3aW5kb3cubGliPXt9KSk7O21vZHVsZS5leHBvcnRzID0gd2luZG93LmxpYlsnaHR0cHVybCddOyIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbnZhciBpc0luaXRpYWxpemVkID0gZmFsc2VcblxuLy8gbWFqb3IgZXZlbnRzIHN1cHBvcnRlZDpcbi8vICAgcGFuc3RhcnRcbi8vICAgcGFubW92ZVxuLy8gICBwYW5lbmRcbi8vICAgc3dpcGVcbi8vICAgbG9uZ3ByZXNzXG4vLyBleHRyYSBldmVudHMgc3VwcG9ydGVkOlxuLy8gICBkdWFsdG91Y2hzdGFydFxuLy8gICBkdWFsdG91Y2hcbi8vICAgZHVhbHRvdWNoZW5kXG4vLyAgIHRhcFxuLy8gICBkb3VibGV0YXBcbi8vICAgcHJlc3NlbmRcblxudmFyIGRvYyA9IHdpbmRvdy5kb2N1bWVudFxudmFyIGRvY0VsID0gZG9jLmRvY3VtZW50RWxlbWVudFxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG52YXIgZ2VzdHVyZXMgPSB7fVxudmFyIGxhc3RUYXAgPSBudWxsXG5cbi8qKlxuICogZmluZCB0aGUgY2xvc2VzdCBjb21tb24gYW5jZXN0b3JcbiAqIGlmIHRoZXJlJ3Mgbm8gb25lLCByZXR1cm4gbnVsbFxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsMSBmaXJzdCBlbGVtZW50XG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbDIgc2Vjb25kIGVsZW1lbnRcbiAqIEByZXR1cm4ge0VsZW1lbnR9ICAgICBjb21tb24gYW5jZXN0b3JcbiAqL1xuZnVuY3Rpb24gZ2V0Q29tbW9uQW5jZXN0b3IoZWwxLCBlbDIpIHtcbiAgdmFyIGVsID0gZWwxXG4gIHdoaWxlIChlbCkge1xuICAgIGlmIChlbC5jb250YWlucyhlbDIpIHx8IGVsID09IGVsMikge1xuICAgICAgcmV0dXJuIGVsXG4gICAgfVxuICAgIGVsID0gZWwucGFyZW50Tm9kZVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogZmlyZSBhIEhUTUxFdmVudFxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsZW1lbnQgd2hpY2ggZWxlbWVudCB0byBmaXJlIGEgZXZlbnQgb25cbiAqIEBwYXJhbSAge3N0cmluZ30gIHR5cGUgICAgdHlwZSBvZiBldmVudFxuICogQHBhcmFtICB7b2JqZWN0fSAgZXh0cmEgICBleHRyYSBkYXRhIGZvciB0aGUgZXZlbnQgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGZpcmVFdmVudChlbGVtZW50LCB0eXBlLCBleHRyYSkge1xuICB2YXIgZXZlbnQgPSBkb2MuY3JlYXRlRXZlbnQoJ0hUTUxFdmVudHMnKVxuICBldmVudC5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSlcblxuICBpZiAodHlwZW9mIGV4dHJhID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIHAgaW4gZXh0cmEpIHtcbiAgICAgIGV2ZW50W3BdID0gZXh0cmFbcF1cbiAgICB9XG4gIH1cblxuICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG59XG5cbi8qKlxuICogY2FsYyB0aGUgdHJhbnNmb3JtXG4gKiBhc3N1bWUgNCBwb2ludHMgQUJDRCBvbiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW1cbiAqID4gcm90YXRl77yaYW5nbGUgcm90YXRpbmcgZnJvbSBBQiB0byBDRFxuICogPiBzY2FsZe+8mnNjYWxlIHJhdGlvIGZyb20gQUIgdG8gQ0RcbiAqID4gdHJhbnNsYXRl77yadHJhbnNsYXRlIHNoaWZ0IGZyb20gQSB0byBDXG4gKlxuICogQHBhcmFtICB7bnVtYmVyfSB4MSBhYnNjaXNzYSBvZiBBXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHkxIG9yZGluYXRlIG9mIEFcbiAqIEBwYXJhbSAge251bWJlcn0geDIgYWJzY2lzc2Egb2YgQlxuICogQHBhcmFtICB7bnVtYmVyfSB5MiBvcmRpbmF0ZSBvZiBCXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHgzIGFic2Npc3NhIG9mIENcbiAqIEBwYXJhbSAge251bWJlcn0geTMgb3JkaW5hdGUgb2YgQ1xuICogQHBhcmFtICB7bnVtYmVyfSB4NCBhYnNjaXNzYSBvZiBEXG4gKiBAcGFyYW0gIHtudW1iZXJ9IHk0IG9yZGluYXRlIG9mIERcbiAqIEByZXR1cm4ge29iamVjdH0gICAgdHJhbnNmb3JtIG9iamVjdCBsaWtlXG4gKiAgIHtyb3RhdGUsIHNjYWxlLCB0cmFuc2xhdGVbMl0sIG1hdHJpeFszXVszXX1cbiAqL1xuZnVuY3Rpb24gY2FsYyh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTQpIHtcbiAgdmFyIHJvdGF0ZSA9IE1hdGguYXRhbjIoeTQgLSB5MywgeDQgLSB4MykgLSBNYXRoLmF0YW4yKHkyIC0geTEsIHgyIC0geDEpXG4gIHZhciBzY2FsZSA9IE1hdGguc3FydCgoTWF0aC5wb3coeTQgLSB5MywgMilcbiAgICArIE1hdGgucG93KHg0IC0geDMsIDIpKSAvIChNYXRoLnBvdyh5MiAtIHkxLCAyKVxuICAgICsgTWF0aC5wb3coeDIgLSB4MSwgMikpKVxuICB2YXIgdHJhbnNsYXRlID0gW1xuICAgIHgzXG4gICAgLSBzY2FsZSAqIHgxICogTWF0aC5jb3Mocm90YXRlKVxuICAgICsgc2NhbGUgKiB5MSAqIE1hdGguc2luKHJvdGF0ZSksXG4gICAgeTNcbiAgICAtIHNjYWxlICogeTEgKiBNYXRoLmNvcyhyb3RhdGUpXG4gICAgLSBzY2FsZSAqIHgxICogTWF0aC5zaW4ocm90YXRlKV1cblxuICByZXR1cm4ge1xuICAgIHJvdGF0ZTogcm90YXRlLFxuICAgIHNjYWxlOiBzY2FsZSxcbiAgICB0cmFuc2xhdGU6IHRyYW5zbGF0ZSxcbiAgICBtYXRyaXg6IFtcbiAgICAgIFtzY2FsZSAqIE1hdGguY29zKHJvdGF0ZSksIC1zY2FsZSAqIE1hdGguc2luKHJvdGF0ZSksIHRyYW5zbGF0ZVswXV0sXG4gICAgICBbc2NhbGUgKiBNYXRoLnNpbihyb3RhdGUpLCBzY2FsZSAqIE1hdGguY29zKHJvdGF0ZSksIHRyYW5zbGF0ZVsxXV0sXG4gICAgICBbMCwgMCwgMV1cbiAgICBdXG4gIH1cbn1cblxuLyoqXG4gKiB0YWtlIG92ZXIgdGhlIHRvdWNoc3RhcnQgZXZlbnRzLiBBZGQgbmV3IHRvdWNoZXMgdG8gdGhlIGdlc3R1cmVzLlxuICogSWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgcmVjb3JkcywgdGhlbiBiaW5kIHRvdWNobW92ZSwgdG9jaGVuZFxuICogYW5kIHRvdWNoY2FuY2VsIGV2ZW50cy5cbiAqIG5ldyB0b3VjaGVzIGluaXRpYWxpemVkIHdpdGggc3RhdGUgJ3RhcHBpbmcnLCBhbmQgd2l0aGluIDUwMCBtaWxsaXNlY29uZHNcbiAqIGlmIHRoZSBzdGF0ZSBpcyBzdGlsbCB0YXBwaW5nLCB0aGVuIHRyaWdnZXIgZ2VzdHVyZSAncHJlc3MnLlxuICogSWYgdGhlcmUgYXJlIHR3byB0b3VjaGUgcG9pbnRzLCB0aGVuIHRoZSAnZHVhbHRvdWNoc3RhcnQnIGlzIHRyaWdnZXJkLiBUaGVcbiAqIG5vZGUgb2YgdGhlIHRvdWNoIGdlc3R1cmUgaXMgdGhlaXIgY2xvZXN0IGNvbW1vbiBhbmNlc3Rvci5cbiAqXG4gKiBAZXZlbnRcbiAqIEBwYXJhbSAge2V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiB0b3VjaHN0YXJ0SGFuZGxlcihldmVudCkge1xuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09PSAwKSB7XG4gICAgZG9jRWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdG91Y2htb3ZlSGFuZGxlciwgZmFsc2UpXG4gICAgZG9jRWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaGVuZEhhbmRsZXIsIGZhbHNlKVxuICAgIGRvY0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdG91Y2hjYW5jZWxIYW5kbGVyLCBmYWxzZSlcbiAgfVxuXG4gIC8vIHJlY29yZCBldmVyeSB0b3VjaFxuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV1cbiAgICB2YXIgdG91Y2hSZWNvcmQgPSB7fVxuXG4gICAgZm9yICh2YXIgcCBpbiB0b3VjaCkge1xuICAgICAgdG91Y2hSZWNvcmRbcF0gPSB0b3VjaFtwXVxuICAgIH1cblxuICAgIHZhciBnZXN0dXJlID0ge1xuICAgICAgc3RhcnRUb3VjaDogdG91Y2hSZWNvcmQsXG4gICAgICBzdGFydFRpbWU6IERhdGUubm93KCksXG4gICAgICBzdGF0dXM6ICd0YXBwaW5nJyxcbiAgICAgIGVsZW1lbnQ6IGV2ZW50LnNyY0VsZW1lbnQgfHwgZXZlbnQudGFyZ2V0LFxuICAgICAgcHJlc3NpbmdIYW5kbGVyOiBzZXRUaW1lb3V0KGZ1bmN0aW9uIChlbGVtZW50LCB0b3VjaCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3RhcHBpbmcnKSB7XG4gICAgICAgICAgICBnZXN0dXJlLnN0YXR1cyA9ICdwcmVzc2luZydcblxuICAgICAgICAgICAgZmlyZUV2ZW50KGVsZW1lbnQsICdsb25ncHJlc3MnLCB7XG4gICAgICAgICAgICAgIC8vIGFkZCB0b3VjaCBkYXRhIGZvciB3ZWV4XG4gICAgICAgICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgICAgICAgICAgY2hhbmdlZFRvdWNoZXM6IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICAgICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjbGVhclRpbWVvdXQoZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIpXG4gICAgICAgICAgZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH0oZXZlbnQuc3JjRWxlbWVudCB8fCBldmVudC50YXJnZXQsIGV2ZW50LmNoYW5nZWRUb3VjaGVzW2ldKSwgNTAwKVxuICAgIH1cbiAgICBnZXN0dXJlc1t0b3VjaC5pZGVudGlmaWVyXSA9IGdlc3R1cmVcbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09IDIpIHtcbiAgICB2YXIgZWxlbWVudHMgPSBbXVxuXG4gICAgZm9yICh2YXIgcCBpbiBnZXN0dXJlcykge1xuICAgICAgZWxlbWVudHMucHVzaChnZXN0dXJlc1twXS5lbGVtZW50KVxuICAgIH1cblxuICAgIGZpcmVFdmVudChnZXRDb21tb25BbmNlc3RvcihlbGVtZW50c1swXSwgZWxlbWVudHNbMV0pLCAnZHVhbHRvdWNoc3RhcnQnLCB7XG4gICAgICB0b3VjaGVzOiBzbGljZS5jYWxsKGV2ZW50LnRvdWNoZXMpLFxuICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogdGFrZSBvdmVyIHRvdWNobW92ZSBldmVudHMsIGFuZCBoYW5kbGUgcGFuIGFuZCBkdWFsIHJlbGF0ZWQgZ2VzdHVyZXMuXG4gKlxuICogMS4gdHJhdmVyc2UgZXZlcnkgdG91Y2ggcG9pbnTvvJpcbiAqID4gaWYgJ3RhcHBpbmcnIGFuZCB0aGUgc2hpZnQgaXMgb3ZlciAxMCBwaXhsZXMsIHRoZW4gaXQncyBhICdwYW5uaW5nJy5cbiAqIDIuIGlmIHRoZXJlIGFyZSB0d28gdG91Y2ggcG9pbnRzLCB0aGVuIGNhbGMgdGhlIHRyYW5mb3JtIGFuZCB0cmlnZ2VyXG4gKiAgICdkdWFsdG91Y2gnLlxuICpcbiAqIEBldmVudFxuICogQHBhcmFtICB7ZXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHRvdWNobW92ZUhhbmRsZXIoZXZlbnQpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0b3VjaCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzW2ldXG4gICAgdmFyIGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaC5pZGVudGlmaWVyXVxuXG4gICAgaWYgKCFnZXN0dXJlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIWdlc3R1cmUubGFzdFRvdWNoKSB7XG4gICAgICBnZXN0dXJlLmxhc3RUb3VjaCA9IGdlc3R1cmUuc3RhcnRUb3VjaFxuICAgIH1cbiAgICBpZiAoIWdlc3R1cmUubGFzdFRpbWUpIHtcbiAgICAgIGdlc3R1cmUubGFzdFRpbWUgPSBnZXN0dXJlLnN0YXJ0VGltZVxuICAgIH1cbiAgICBpZiAoIWdlc3R1cmUudmVsb2NpdHlYKSB7XG4gICAgICBnZXN0dXJlLnZlbG9jaXR5WCA9IDBcbiAgICB9XG4gICAgaWYgKCFnZXN0dXJlLnZlbG9jaXR5WSkge1xuICAgICAgZ2VzdHVyZS52ZWxvY2l0eVkgPSAwXG4gICAgfVxuICAgIGlmICghZ2VzdHVyZS5kdXJhdGlvbikge1xuICAgICAgZ2VzdHVyZS5kdXJhdGlvbiA9IDBcbiAgICB9XG5cbiAgICB2YXIgdGltZSA9ICBEYXRlLm5vdygpIC0gZ2VzdHVyZS5sYXN0VGltZVxuICAgIHZhciB2eCA9ICh0b3VjaC5jbGllbnRYIC0gZ2VzdHVyZS5sYXN0VG91Y2guY2xpZW50WCkgLyB0aW1lXG4gICAgdmFyIHZ5ID0gKHRvdWNoLmNsaWVudFkgLSBnZXN0dXJlLmxhc3RUb3VjaC5jbGllbnRZKSAvIHRpbWVcblxuICAgIHZhciBSRUNPUkRfRFVSQVRJT04gPSA3MFxuICAgIGlmICh0aW1lID4gUkVDT1JEX0RVUkFUSU9OKSB7XG4gICAgICB0aW1lID0gUkVDT1JEX0RVUkFUSU9OXG4gICAgfVxuICAgIGlmIChnZXN0dXJlLmR1cmF0aW9uICsgdGltZSA+IFJFQ09SRF9EVVJBVElPTikge1xuICAgICAgZ2VzdHVyZS5kdXJhdGlvbiA9IFJFQ09SRF9EVVJBVElPTiAtIHRpbWVcbiAgICB9XG5cbiAgICBnZXN0dXJlLnZlbG9jaXR5WCA9IChnZXN0dXJlLnZlbG9jaXR5WCAqIGdlc3R1cmUuZHVyYXRpb24gKyB2eCAqIHRpbWUpXG4gICAgICAvIChnZXN0dXJlLmR1cmF0aW9uICsgdGltZSlcbiAgICBnZXN0dXJlLnZlbG9jaXR5WSA9IChnZXN0dXJlLnZlbG9jaXR5WSAqIGdlc3R1cmUuZHVyYXRpb24gKyB2eSAqIHRpbWUpXG4gICAgICAvIChnZXN0dXJlLmR1cmF0aW9uICsgdGltZSlcbiAgICBnZXN0dXJlLmR1cmF0aW9uICs9IHRpbWVcblxuICAgIGdlc3R1cmUubGFzdFRvdWNoID0ge31cblxuICAgIGZvciAodmFyIHAgaW4gdG91Y2gpIHtcbiAgICAgIGdlc3R1cmUubGFzdFRvdWNoW3BdID0gdG91Y2hbcF1cbiAgICB9XG4gICAgZ2VzdHVyZS5sYXN0VGltZSA9IERhdGUubm93KClcblxuICAgIHZhciBkaXNwbGFjZW1lbnRYID0gdG91Y2guY2xpZW50WCAtIGdlc3R1cmUuc3RhcnRUb3VjaC5jbGllbnRYXG4gICAgdmFyIGRpc3BsYWNlbWVudFkgPSB0b3VjaC5jbGllbnRZIC0gZ2VzdHVyZS5zdGFydFRvdWNoLmNsaWVudFlcbiAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoTWF0aC5wb3coZGlzcGxhY2VtZW50WCwgMilcbiAgICAgICsgTWF0aC5wb3coZGlzcGxhY2VtZW50WSwgMikpXG4gICAgdmFyIGlzVmVydGljYWwgPSAhKE1hdGguYWJzKGRpc3BsYWNlbWVudFgpID4gTWF0aC5hYnMoZGlzcGxhY2VtZW50WSkpXG4gICAgdmFyIGRpcmVjdGlvbiA9IGlzVmVydGljYWxcbiAgICAgID8gZGlzcGxhY2VtZW50WSA+PSAwID8gJ2Rvd24nIDogJ3VwJ1xuICAgICAgOiBkaXNwbGFjZW1lbnRYID49IDAgPyAncmlnaHQnIDogJ2xlZnQnXG5cbiAgICAvLyBtYWdpYyBudW1iZXIgMTA6IG1vdmluZyAxMHB4IG1lYW5zIHBhbiwgbm90IHRhcFxuICAgIGlmICgoZ2VzdHVyZS5zdGF0dXMgPT09ICd0YXBwaW5nJyB8fCBnZXN0dXJlLnN0YXR1cyA9PT0gJ3ByZXNzaW5nJylcbiAgICAgICAgJiYgZGlzdGFuY2UgPiAxMCkge1xuICAgICAgZ2VzdHVyZS5zdGF0dXMgPSAncGFubmluZydcbiAgICAgIGdlc3R1cmUuaXNWZXJ0aWNhbCA9IGlzVmVydGljYWxcbiAgICAgIGdlc3R1cmUuZGlyZWN0aW9uID0gZGlyZWN0aW9uXG5cbiAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdwYW5zdGFydCcsIHtcbiAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICB0b3VjaGVzOiBldmVudC50b3VjaGVzLFxuICAgICAgICBjaGFuZ2VkVG91Y2hlczogZXZlbnQuY2hhbmdlZFRvdWNoZXMsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50LFxuICAgICAgICBpc1ZlcnRpY2FsOiBnZXN0dXJlLmlzVmVydGljYWwsXG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3Bhbm5pbmcnKSB7XG4gICAgICBnZXN0dXJlLnBhblRpbWUgPSBEYXRlLm5vdygpXG5cbiAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdwYW5tb3ZlJywge1xuICAgICAgICBkaXNwbGFjZW1lbnRYOiBkaXNwbGFjZW1lbnRYLFxuICAgICAgICBkaXNwbGFjZW1lbnRZOiBkaXNwbGFjZW1lbnRZLFxuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoZXM6IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzOiBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgdG91Y2hFdmVudDogZXZlbnQsXG4gICAgICAgIGlzVmVydGljYWw6IGdlc3R1cmUuaXNWZXJ0aWNhbCxcbiAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGdlc3R1cmVzKS5sZW5ndGggPT0gMikge1xuICAgIHZhciBwb3NpdGlvbiA9IFtdXG4gICAgdmFyIGN1cnJlbnQgPSBbXVxuICAgIHZhciBlbGVtZW50cyA9IFtdXG4gICAgdmFyIHRyYW5zZm9ybVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudC50b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdG91Y2ggPSBldmVudC50b3VjaGVzW2ldXG4gICAgICB2YXIgZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoLmlkZW50aWZpZXJdXG4gICAgICBwb3NpdGlvbi5wdXNoKFtnZXN0dXJlLnN0YXJ0VG91Y2guY2xpZW50WCwgZ2VzdHVyZS5zdGFydFRvdWNoLmNsaWVudFldKVxuICAgICAgY3VycmVudC5wdXNoKFt0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZXSlcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIGdlc3R1cmVzKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGdlc3R1cmVzW3BdLmVsZW1lbnQpXG4gICAgfVxuXG4gICAgdHJhbnNmb3JtID0gY2FsYyhcbiAgICAgIHBvc2l0aW9uWzBdWzBdLFxuICAgICAgcG9zaXRpb25bMF1bMV0sXG4gICAgICBwb3NpdGlvblsxXVswXSxcbiAgICAgIHBvc2l0aW9uWzFdWzFdLFxuICAgICAgY3VycmVudFswXVswXSxcbiAgICAgIGN1cnJlbnRbMF1bMV0sXG4gICAgICBjdXJyZW50WzFdWzBdLFxuICAgICAgY3VycmVudFsxXVsxXVxuICAgIClcbiAgICBmaXJlRXZlbnQoZ2V0Q29tbW9uQW5jZXN0b3IoZWxlbWVudHNbMF0sIGVsZW1lbnRzWzFdKSwgJ2R1YWx0b3VjaCcsIHtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIGhhbmRsZSB0b3VjaGVuZCBldmVudFxuICpcbiAqIDEuIGlmIHRoZXJlIGFyZSB0b3cgdG91Y2ggcG9pbnRzLCB0aGVuIHRyaWdnZXIgJ2R1YWx0b3VjaGVuZCflpoJcbiAqXG4gKiAyLiB0cmF2ZXJzZSBldmVyeSB0b3VjaCBwaW9udO+8mlxuICogPiBpZiB0YXBwaW5nLCB0aGVuIHRyaWdnZXIgJ3RhcCcuXG4gKiBJZiB0aGVyZSBpcyBhIHRhcCAzMDAgbWlsbGlzZWNvbmRzIGJlZm9yZSwgdGhlbiBpdCdzIGEgJ2RvdWJsZXRhcCcuXG4gKiA+IGlmIHBhZGRpbmcsIHRoZW4gZGVjaWRlIHRvIHRyaWdnZXIgJ3BhbmVuZCcgb3IgJ3N3aXBlJ1xuICogPiBpZiBwcmVzc2luZywgdGhlbiB0cmlnZ2VyICdwcmVzc2VuZCcuXG4gKlxuICogMy4gcmVtb3ZlIGxpc3RlbmVycy5cbiAqXG4gKiBAZXZlbnRcbiAqIEBwYXJhbSAge2V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiB0b3VjaGVuZEhhbmRsZXIoZXZlbnQpIHtcblxuICBpZiAoT2JqZWN0LmtleXMoZ2VzdHVyZXMpLmxlbmd0aCA9PSAyKSB7XG4gICAgdmFyIGVsZW1lbnRzID0gW11cbiAgICBmb3IgKHZhciBwIGluIGdlc3R1cmVzKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGdlc3R1cmVzW3BdLmVsZW1lbnQpXG4gICAgfVxuICAgIGZpcmVFdmVudChnZXRDb21tb25BbmNlc3RvcihlbGVtZW50c1swXSwgZWxlbWVudHNbMV0pLCAnZHVhbHRvdWNoZW5kJywge1xuICAgICAgdG91Y2hlczogc2xpY2UuY2FsbChldmVudC50b3VjaGVzKSxcbiAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgfSlcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdG91Y2ggPSBldmVudC5jaGFuZ2VkVG91Y2hlc1tpXVxuICAgIHZhciBpZCA9IHRvdWNoLmlkZW50aWZpZXJcbiAgICB2YXIgZ2VzdHVyZSA9IGdlc3R1cmVzW2lkXVxuXG4gICAgaWYgKCFnZXN0dXJlKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnByZXNzaW5nSGFuZGxlcikge1xuICAgICAgY2xlYXJUaW1lb3V0KGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyKVxuICAgICAgZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKGdlc3R1cmUuc3RhdHVzID09PSAndGFwcGluZycpIHtcbiAgICAgIGdlc3R1cmUudGltZXN0YW1wID0gRGF0ZS5ub3coKVxuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3RhcCcsIHtcbiAgICAgICAgdG91Y2g6IHRvdWNoLFxuICAgICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgICAgfSlcblxuICAgICAgaWYgKGxhc3RUYXAgJiYgZ2VzdHVyZS50aW1lc3RhbXAgLSBsYXN0VGFwLnRpbWVzdGFtcCA8IDMwMCkge1xuICAgICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAnZG91YmxldGFwJywge1xuICAgICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBsYXN0VGFwID0gZ2VzdHVyZVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3Bhbm5pbmcnKSB7XG4gICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKVxuICAgICAgdmFyIGR1cmF0aW9uID0gbm93IC0gZ2VzdHVyZS5zdGFydFRpbWVcbiAgICAgIHZhciBkaXNwbGFjZW1lbnRYID0gdG91Y2guY2xpZW50WCAtIGdlc3R1cmUuc3RhcnRUb3VjaC5jbGllbnRYXG4gICAgICB2YXIgZGlzcGxhY2VtZW50WSA9IHRvdWNoLmNsaWVudFkgLSBnZXN0dXJlLnN0YXJ0VG91Y2guY2xpZW50WVxuXG4gICAgICB2YXIgdmVsb2NpdHkgPSBNYXRoLnNxcnQoZ2VzdHVyZS52ZWxvY2l0eVkgKiBnZXN0dXJlLnZlbG9jaXR5WVxuICAgICAgICArIGdlc3R1cmUudmVsb2NpdHlYICogZ2VzdHVyZS52ZWxvY2l0eVgpXG4gICAgICB2YXIgaXNTd2lwZSA9IHZlbG9jaXR5ID4gMC41ICYmIChub3cgLSBnZXN0dXJlLmxhc3RUaW1lKSA8IDEwMFxuICAgICAgdmFyIGV4dHJhID0ge1xuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgIGlzU3dpcGU6IGlzU3dpcGUsXG4gICAgICAgIHZlbG9jaXR5WDogZ2VzdHVyZS52ZWxvY2l0eVgsXG4gICAgICAgIHZlbG9jaXR5WTogZ2VzdHVyZS52ZWxvY2l0eVksXG4gICAgICAgIGRpc3BsYWNlbWVudFg6IGRpc3BsYWNlbWVudFgsXG4gICAgICAgIGRpc3BsYWNlbWVudFk6IGRpc3BsYWNlbWVudFksXG4gICAgICAgIHRvdWNoOiB0b3VjaCxcbiAgICAgICAgdG91Y2hlczogZXZlbnQudG91Y2hlcyxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXM6IGV2ZW50LmNoYW5nZWRUb3VjaGVzLFxuICAgICAgICB0b3VjaEV2ZW50OiBldmVudCxcbiAgICAgICAgaXNWZXJ0aWNhbDogZ2VzdHVyZS5pc1ZlcnRpY2FsLFxuICAgICAgICBkaXJlY3Rpb246IGdlc3R1cmUuZGlyZWN0aW9uXG4gICAgICB9XG5cbiAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdwYW5lbmQnLCBleHRyYSlcbiAgICAgIGlmIChpc1N3aXBlKSB7XG4gICAgICAgIGZpcmVFdmVudChnZXN0dXJlLmVsZW1lbnQsICdzd2lwZScsIGV4dHJhKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3ByZXNzaW5nJykge1xuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3ByZXNzZW5kJywge1xuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgICB9KVxuICAgIH1cblxuICAgIGRlbGV0ZSBnZXN0dXJlc1tpZF1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhnZXN0dXJlcykubGVuZ3RoID09PSAwKSB7XG4gICAgZG9jRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdG91Y2htb3ZlSGFuZGxlciwgZmFsc2UpXG4gICAgZG9jRWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0b3VjaGVuZEhhbmRsZXIsIGZhbHNlKVxuICAgIGRvY0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdG91Y2hjYW5jZWxIYW5kbGVyLCBmYWxzZSlcbiAgfVxufVxuXG4vKipcbiAqIGhhbmRsZSB0b3VjaGNhbmNlbFxuICpcbiAqIDEuIGlmIHRoZXJlIGFyZSB0d28gdG91Y2ggcG9pbnRzLCB0aGVuIHRyaWdnZXIgJ2R1YWx0b3VjaGVuZCdcbiAqXG4gKiAyLiB0cmF2ZXJzZSBldmVydHkgdG91Y2ggcG9pbnQ6XG4gKiA+IGlmIHBhbm5uaWcsIHRoZW4gdHJpZ2dlciAncGFuZW5kJ1xuICogPiBpZiBwcmVzc2luZywgdGhlbiB0cmlnZ2VyICdwcmVzc2VuZCdcbiAqXG4gKiAzLiByZW1vdmUgbGlzdGVuZXJzXG4gKlxuICogQGV2ZW50XG4gKiBAcGFyYW0gIHtldmVudH0gZXZlbnRcbiAqL1xuZnVuY3Rpb24gdG91Y2hjYW5jZWxIYW5kbGVyKGV2ZW50KSB7XG5cbiAgaWYgKE9iamVjdC5rZXlzKGdlc3R1cmVzKS5sZW5ndGggPT0gMikge1xuICAgIHZhciBlbGVtZW50cyA9IFtdXG4gICAgZm9yICh2YXIgcCBpbiBnZXN0dXJlcykge1xuICAgICAgZWxlbWVudHMucHVzaChnZXN0dXJlc1twXS5lbGVtZW50KVxuICAgIH1cbiAgICBmaXJlRXZlbnQoZ2V0Q29tbW9uQW5jZXN0b3IoZWxlbWVudHNbMF0sIGVsZW1lbnRzWzFdKSwgJ2R1YWx0b3VjaGVuZCcsIHtcbiAgICAgIHRvdWNoZXM6IHNsaWNlLmNhbGwoZXZlbnQudG91Y2hlcyksXG4gICAgICB0b3VjaEV2ZW50OiBldmVudFxuICAgIH0pXG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRvdWNoID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbaV1cbiAgICB2YXIgaWQgPSB0b3VjaC5pZGVudGlmaWVyXG4gICAgdmFyIGdlc3R1cmUgPSBnZXN0dXJlc1tpZF1cblxuICAgIGlmICghZ2VzdHVyZSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpZiAoZ2VzdHVyZS5wcmVzc2luZ0hhbmRsZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChnZXN0dXJlLnByZXNzaW5nSGFuZGxlcilcbiAgICAgIGdlc3R1cmUucHJlc3NpbmdIYW5kbGVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3Bhbm5pbmcnKSB7XG4gICAgICBmaXJlRXZlbnQoZ2VzdHVyZS5lbGVtZW50LCAncGFuZW5kJywge1xuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoZXM6IGV2ZW50LnRvdWNoZXMsXG4gICAgICAgIGNoYW5nZWRUb3VjaGVzOiBldmVudC5jaGFuZ2VkVG91Y2hlcyxcbiAgICAgICAgdG91Y2hFdmVudDogZXZlbnRcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChnZXN0dXJlLnN0YXR1cyA9PT0gJ3ByZXNzaW5nJykge1xuICAgICAgZmlyZUV2ZW50KGdlc3R1cmUuZWxlbWVudCwgJ3ByZXNzZW5kJywge1xuICAgICAgICB0b3VjaDogdG91Y2gsXG4gICAgICAgIHRvdWNoRXZlbnQ6IGV2ZW50XG4gICAgICB9KVxuICAgIH1cbiAgICBkZWxldGUgZ2VzdHVyZXNbaWRdXG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoZ2VzdHVyZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIGRvY0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRvdWNobW92ZUhhbmRsZXIsIGZhbHNlKVxuICAgIGRvY0VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hlbmRIYW5kbGVyLCBmYWxzZSlcbiAgICBkb2NFbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRvdWNoY2FuY2VsSGFuZGxlciwgZmFsc2UpXG4gIH1cbn1cblxuaWYgKCFpc0luaXRpYWxpemVkKSB7XG4gIGRvY0VsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0b3VjaHN0YXJ0SGFuZGxlciwgZmFsc2UpXG4gIGlzSW5pdGlhbGl6ZWQgPSB0cnVlXG59XG5cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKiBnbG9iYWwgbGliLCBXZWJTb2NrZXQgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCAnLi9zdHlsZS9iYXNlLmNzcydcblxuaW1wb3J0IHsgc3VidmVyc2lvbiB9IGZyb20gJy4uLy4uLy4uLy4uL3BhY2thZ2UuanNvbidcbmltcG9ydCBydW50aW1lIGZyb20gJy4uLy4uLy4uL3J1bnRpbWUnXG5pbXBvcnQgZnJhbWV3b3JrcyBmcm9tICcuLi8uLi8uLi9mcmFtZXdvcmtzJ1xuXG5ydW50aW1lLmNvbmZpZy5mcmFtZXdvcmtzID0gZnJhbWV3b3Jrc1xuY29uc3QgeyBmcmFtZXdvcmssIHRyYW5zZm9ybWVyIH0gPSBzdWJ2ZXJzaW9uXG5cbi8vIHJlZ2lzdGVyIGZyYW1ld29yayBtZXRhIGluZm9cbmdsb2JhbC5mcmFtZXdvcmtWZXJzaW9uID0gZnJhbWV3b3JrXG5nbG9iYWwudHJhbnNmb3JtZXJWZXJzaW9uID0gdHJhbnNmb3JtZXJcblxuLy8gaW5pdCBicmlkZ2UuXG5pbXBvcnQgeyBTZW5kZXIsIHJlY2VpdmVyIH0gZnJvbSAnLi4vYnJpZGdlJ1xucmVjZWl2ZXIuaW5pdCgpXG5cbi8vIGluaXQgZnJhbWV3b3Jrc1xuaW1wb3J0IExpc3RlbmVyIGZyb20gJy4uL2RvbS9jb21wb25lbnRNYW5hZ2VyJ1xucnVudGltZS5jb25maWcuRG9jdW1lbnQuTGlzdGVuZXIgPSBMaXN0ZW5lclxuY29uc3QgZ2xvYmFsTWV0aG9kcyA9IHJ1bnRpbWUuaW5pdChydW50aW1lLmNvbmZpZylcblxuLy8gc2V0IGdsb2JhbCBtZXRob2RzXG5mb3IgKGNvbnN0IG1ldGhvZE5hbWUgaW4gZ2xvYmFsTWV0aG9kcykge1xuICBnbG9iYWxbbWV0aG9kTmFtZV0gPSAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IHJldCA9IGdsb2JhbE1ldGhvZHNbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICBpZiAocmV0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocmV0LnRvU3RyaW5nKCkpXG4gICAgfVxuICAgIHJldHVybiByZXRcbiAgfVxufVxuXG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgbG9hZCB9IGZyb20gJy4vbG9hZGVyJ1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2Jhc2UvY29tcG9uZW50J1xuaW1wb3J0IEF0b21pYyBmcm9tICcuLi9iYXNlL2F0b21pYydcbmltcG9ydCBDb21wb25lbnRNYW5hZ2VyIGZyb20gJy4uL2RvbS9jb21wb25lbnRNYW5hZ2VyJ1xuaW1wb3J0IHsgYmluZCBhcyBiaW5kUmVnaXN0ZXIgfSBmcm9tICcuL3JlZ2lzdGVyJ1xuXG5pbXBvcnQgJ2VudmQnXG5pbXBvcnQgJ2h0dHB1cmwnXG5cbi8vIGdlc3R1cmVcbmltcG9ydCAnLi9nZXN0dXJlJ1xuXG5jb25zdCBERUZBVUxUX0RFU0lHTl9XSURUSCA9IDc1MFxuY29uc3QgREVGQVVMVF9ST09UX0lEID0gJ3dlZXgnXG5jb25zdCBERUZBVUxUX0pTT05QX0NBTExCQUNLX05BTUUgPSAnd2VleEpzb25wQ2FsbGJhY2snXG5cbmdsb2JhbC5XWEVudmlyb25tZW50ID0ge1xuICB3ZWV4VmVyc2lvbjogY29uZmlnLndlZXhWZXJzaW9uLFxuICBhcHBOYW1lOiBsaWIuZW52LmFsaWFwcCA/IGxpYi5lbnYuYWxpYXBwLmFwcG5hbWUgOiBudWxsLFxuICBhcHBWZXJzaW9uOiBsaWIuZW52LmFsaWFwcCA/IGxpYi5lbnYuYWxpYXBwLnZlcnNpb24udmFsIDogbnVsbCxcbiAgcGxhdGZvcm06ICdXZWInLFxuICBvc05hbWU6IGxpYi5lbnYuYnJvd3NlciA/IGxpYi5lbnYuYnJvd3Nlci5uYW1lIDogbnVsbCxcbiAgb3NWZXJzaW9uOiBsaWIuZW52LmJyb3dzZXIgPyBsaWIuZW52LmJyb3dzZXIudmVyc2lvbi52YWwgOiBudWxsLFxuICBkZXZpY2VXaWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gIGRldmljZUhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICBkZXZpY2VQaXhlbFJhdGlvOiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyA/IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDogKHdpbmRvdy5zY3JlZW4ud2lkdGggPj0gMTQ0MCA/IDMuNSA6ICh3aW5kb3cuc2NyZWVuLndpZHRoID49IDEwODAgPyAzIDogKHdpbmRvdy5zY3JlZW4ud2lkdGggPj0gODAwID8gMi41IDogKHdpbmRvdy5zY3JlZW4ud2lkdGggPj0gNjQwID8gMiA6ICh3aW5kb3cuc2NyZWVuLndpZHRoID49IDQ4MCA/IDEuNSA6IDEpKSkpKVxufVxuXG5jb25zdCBfd2VleEluc3RhbmNlID0ge31cblxuZnVuY3Rpb24gbm9vcCAoKSB7fVxuXG5mdW5jdGlvbiBzZXR1cFZpZXdwb3J0ICh3aWR0aCkge1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9dmlld3BvcnRdJykuc2V0QXR0cmlidXRlKCdjb250ZW50JywgYHdpZHRoPSR7d2lkdGh9LCB1c2VyLXNjYWxhYmxlPW5vYClcbn1cblxuOyAoZnVuY3Rpb24gaW5pdGlhbGl6ZVdpdGhVcmxQYXJhbXMgKCkge1xuICAvLyBpbiBjYXNwZXJqcyB0aGUgcHJvdG9jb2wgaXMgZmlsZS5cbiAgaWYgKGxvY2F0aW9uLnByb3RvY29sLm1hdGNoKC9maWxlLykpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHBhcmFtcyA9IGxpYi5odHRwdXJsKGxvY2F0aW9uLmhyZWYpLnBhcmFtc1xuXG4gIC8vIHNldCBnbG9iYWwgJ2RlYnVnJyBjb25maWcgdG8gdHJ1ZSBpZiB0aGVyZSdzIGEgZGVidWcgZmxhZyBpbiBjdXJyZW50IHVybC5cbiAgY29uc3QgZGVidWcgPSBwYXJhbXNbJ2RlYnVnJ11cbiAgY29uZmlnLmRlYnVnID0gZGVidWcgPT09IHRydWUgfHwgZGVidWcgPT09ICd0cnVlJ1xuXG4gICFjb25maWcuZGVidWcgJiYgKGNvbnNvbGUuZGVidWcgPSBub29wKVxuXG4gIC8vIGNvbmZpZyBmb3IgdGhlICdkb3duZ3JhZGUnLlxuICBmb3IgKGNvbnN0IGtleSBpbiBwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0ga2V5Lm1hdGNoKC9eZG93bmdyYWRlXyhcXHcrKSQvKVxuICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2hbMV0pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRrID0gbWF0Y2hbMV1cbiAgICAgIC8vIGRvd25ncmFkZSBpbiB0aGUgY29uZmlnIGZpbGUgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LlxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuZG93bmdyYWRlW2RrXSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkciA9IHBhcmFtc1tgZG93bmdyYWRlXyR7ZGt9YF1cbiAgICAgIGNvbmZpZy5kb3duZ3JhZGVbZGtdID0gZHIgPT09IHRydWUgfHwgZHIgPT09ICd0cnVlJ1xuICAgIH1cbiAgfVxufSkoKVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBXZWV4IChvcHRpb25zKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXZWV4KSkge1xuICAgIHJldHVybiBuZXcgV2VleChvcHRpb25zKVxuICB9XG5cbiAgLy8gV2lkdGggb2YgdGhlIHJvb3QgY29udGFpbmVyLiBEZWZhdWx0IGlzIHdpbmRvdy5pbm5lcldpZHRoLlxuICB0aGlzLndpZHRoID0gb3B0aW9ucy53aWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aFxuICB0aGlzLmJ1bmRsZVVybCA9IG9wdGlvbnMuYnVuZGxlVXJsIHx8IGxvY2F0aW9uLmhyZWZcbiAgdGhpcy5pbnN0YW5jZUlkID0gb3B0aW9ucy5hcHBJZFxuICB0aGlzLnJvb3RJZCA9IG9wdGlvbnMucm9vdElkIHx8IChERUZBVUxUX1JPT1RfSUQgKyB1dGlscy5nZXRSYW5kb20oMTApKVxuICB0aGlzLmpzb25wQ2FsbGJhY2sgPSBvcHRpb25zLmpzb25wQ2FsbGJhY2sgfHwgREVGQVVMVF9KU09OUF9DQUxMQkFDS19OQU1FXG4gIHRoaXMuc291cmNlID0gb3B0aW9ucy5zb3VyY2VcbiAgdGhpcy5sb2FkZXIgPSBvcHRpb25zLmxvYWRlclxuICB0aGlzLmVtYmVkID0gb3B0aW9ucy5lbWJlZFxuXG4gIC8vIGluaXQgdmlld3BvcnRcbiAgc2V0dXBWaWV3cG9ydChERUZBVUxUX0RFU0lHTl9XSURUSClcblxuICAvLyBkb3duZ3JhZGUgb3B0aW9ucy5cbiAgY29uc3QgZGcgPSBvcHRpb25zLmRvd25ncmFkZSB8fCBbXVxuICBkZy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wKSB7XG4gICAgY29uZmlnLmRvd25ncmFkZVtjb21wXSA9IHRydWVcbiAgfSlcblxuICB0aGlzLmRhdGEgPSBvcHRpb25zLmRhdGFcbiAgdGhpcy5zZW5kZXIgPSBuZXcgU2VuZGVyKHRoaXMpXG5cbiAgX3dlZXhJbnN0YW5jZVt0aGlzLmluc3RhbmNlSWRdID0gdGhpc1xuXG4gIC8vIGxvYWQgYnVuZGxlLlxuICBsb2FkKHtcbiAgICBqc29ucENhbGxiYWNrOiB0aGlzLmpzb25wQ2FsbGJhY2ssXG4gICAgc291cmNlOiB0aGlzLnNvdXJjZSxcbiAgICBsb2FkZXI6IHRoaXMubG9hZGVyXG4gIH0sIGZ1bmN0aW9uIChlcnIsIGFwcENvZGUpIHtcbiAgICBpZiAoIWVycikge1xuICAgICAgdGhpcy5jcmVhdGVBcHAoY29uZmlnLCBhcHBDb2RlKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2xvYWQgYnVuZGxlIGVycjonLCBlcnIpXG4gICAgfVxuICB9LmJpbmQodGhpcykpXG59XG5cbldlZXguaW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmICh1dGlscy5pc0FycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgIG5ldyBXZWV4KGNvbmZpZylcbiAgICB9KVxuICB9XG4gIGVsc2UgaWYgKHV0aWxzLmdldFR5cGUob3B0aW9ucykgPT09ICdvYmplY3QnKSB7XG4gICAgbmV3IFdlZXgob3B0aW9ucylcbiAgfVxufVxuXG5XZWV4LmdldEluc3RhbmNlID0gZnVuY3Rpb24gKGluc3RhbmNlSWQpIHtcbiAgcmV0dXJuIF93ZWV4SW5zdGFuY2VbaW5zdGFuY2VJZF1cbn1cblxuV2VleC5wcm90b3R5cGUgPSB7XG5cbiAgY3JlYXRlQXBwOiBmdW5jdGlvbiAoY29uZmlnLCBhcHBDb2RlKSB7XG4gICAgbGV0IHJvb3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMucm9vdElkKVxuICAgIGlmICghcm9vdCkge1xuICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICByb290LmlkID0gdGhpcy5yb290SWRcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocm9vdClcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHdpbmRvdy5jcmVhdGVJbnN0YW5jZShcbiAgICAgIHRoaXMuaW5zdGFuY2VJZCxcbiAgICAgIGFwcENvZGUsXG4gICAgICB7XG4gICAgICAgIGJ1bmRsZVVybDogdGhpcy5idW5kbGVVcmwsXG4gICAgICAgIGRlYnVnOiBjb25maWcuZGVidWdcbiAgICAgIH0sXG4gICAgICB0aGlzLmRhdGFcbiAgICApXG5cbiAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdJywgaW5zdGFuY2UpXG4gICAgfVxuXG4gICAgLy8gRG8gbm90IGRlc3Ryb3kgaW5zdGFuY2UgYmVmb3JlIHVubG9hZCwgYmVjYXVzZSBpbiBtb3N0IGJyb3dzZXJcbiAgICAvLyBwcmVzcyBiYWNrIGJ1dHRvbiB0byBiYWNrIHRvIHRoaXMgcGFnZSB3aWxsIG5vdCByZWZyZXNoXG4gICAgLy8gdGhlIHdpbmRvdyBhbmQgdGhlIGluc3RhbmNlIHdpbGwgbm90IGJlIHJlY3JlYXRlZCB0aGVuLlxuICAgIC8vIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbiAoZSkge1xuICAgIC8vIH0pXG4gIH0sXG5cbiAgZ2V0Q29tcG9uZW50TWFuYWdlcjogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fY29tcG9uZW50TWFuYWdlcikge1xuICAgICAgdGhpcy5fY29tcG9uZW50TWFuYWdlciA9IENvbXBvbmVudE1hbmFnZXIuZ2V0SW5zdGFuY2UodGhpcy5pbnN0YW5jZUlkKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50TWFuYWdlclxuICB9LFxuXG4gIGdldFJvb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycgKyB0aGlzLnJvb3RJZClcbiAgfVxufVxuXG5XZWV4LnN0b3BUaGVXb3JsZCA9IGZ1bmN0aW9uIChpbnN0YW5jZUlkKSB7XG4gIGlmICghaW5zdGFuY2VJZCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhfd2VleEluc3RhbmNlKS5tYXAoZnVuY3Rpb24gKGluc3RhbmNlSWQpIHtcbiAgICAgIFdlZXguc3RvcFRoZVdvcmxkKGluc3RhbmNlSWQpXG4gICAgfSlcbiAgfVxuICB3aW5kb3cuZGVzdHJveUluc3RhbmNlKGluc3RhbmNlSWQpXG59XG5cbi8vIGZvciB3ZWV4LXRvb2xraXQuXG47IChmdW5jdGlvbiBzdGFydFJlZnJlc2hDb250cm9sbGVyICgpIHtcbiAgaWYgKGxvY2F0aW9uLnByb3RvY29sLm1hdGNoKC9maWxlLykpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobG9jYXRpb24uc2VhcmNoLmluZGV4T2YoJ2hvdC1yZWxvYWRfY29udHJvbGxlcicpID09PSAtMSkge1xuICAgIHJldHVyblxuICB9XG4gIGlmICh0eXBlb2YgV2ViU29ja2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnNvbGUuaW5mbygnYXV0byByZWZyZXNoIG5lZWQgV2ViU29ja2V0IHN1cHBvcnQnKVxuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IGhvc3QgPSBsb2NhdGlvbi5ob3N0bmFtZVxuICBjb25zdCBwb3J0ID0gODA4MlxuICBjb25zdCBjbGllbnQgPSBuZXcgV2ViU29ja2V0KCd3czovLycgKyBob3N0ICsgJzonICsgcG9ydCArICcvJyxcbiAgICAnZWNoby1wcm90b2NvbCdcbiAgKVxuICBjbGllbnQub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZygncmVmcmVzaCBjb250cm9sbGVyIHdlYnNvY2tldCBjb25uZWN0aW9uIGVycm9yJylcbiAgfVxuICBjbGllbnQub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICBjb25zb2xlLmxvZygnUmVjZWl2ZWQ6IFxcJycgKyBlLmRhdGEgKyAnXFwnJylcbiAgICBpZiAoZS5kYXRhID09PSAncmVmcmVzaCcpIHtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgfVxuICB9XG59KSgpXG5cbmJpbmRSZWdpc3RlcihXZWV4KVxuXG51dGlscy5leHRlbmQoV2VleCwge1xuICBDb21wb25lbnQsXG4gIEF0b21pYyxcbiAgQ29tcG9uZW50TWFuYWdlcixcbiAgdXRpbHMsXG4gIGNvbmZpZ1xufSlcblxuZ2xvYmFsLndlZXggPSBXZWV4XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgQ29tcG9uZW50TWFuYWdlciBmcm9tICcuLi9kb20vY29tcG9uZW50TWFuYWdlcidcbmltcG9ydCBjb25maWcgZnJvbSAnLi4vcmVuZGVyL2NvbmZpZydcblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBDb21wb25lbnQgPSBXZWV4LkNvbXBvbmVudFxuXG4gIGZ1bmN0aW9uIFJvb3RDb21wb25lbnQgKGRhdGEsIG5vZGVUeXBlKSB7XG4gICAgY29uc3QgaWQgPSBkYXRhLnJvb3RJZCArICctcm9vdCdcbiAgICBjb25zdCBjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2RhdGEucm9vdElkfWApXG4gICAgY29uc3QgY20gPSBDb21wb25lbnRNYW5hZ2VyLmdldEluc3RhbmNlKGRhdGEuaW5zdGFuY2VJZClcblxuICAgIHRoaXMuZGF0YSA9IGRhdGFcblxuICAgIGN0LmNsYXNzTGlzdC5hZGQoJ3dlZXgtY29udGFpbmVyJylcbiAgICBpZiAoIWRhdGEuc3R5bGUuaGVpZ2h0ICYmICFkYXRhLnN0eWxlLmZsZXgpIHtcbiAgICAgIC8vIGlmIG5vIHNwZWNpZmljYXRpb24gb24gcm9vdCdzIGhlaWdodCwgdGhlblxuICAgICAgLy8gZmlsbCByb290IGNvbnRhaW5lciB3aXRoIHRoZSByb290IGVsZW1lbnQgYnkgZnVsbCBzY2FsZS5cbiAgICAgIGRhdGEuc3R5bGUuZmxleCA9IDFcbiAgICB9XG5cbiAgICAvLyBUaGUgcm9vdCBjb21wb25lbnQgc2hvdWxkIGJlIGltcGxlbWVudGVkIGFzIGEgZGl2IGNvbXBvbmVudCwgYXMgdGhlIHNjcm9sbGFibGVcbiAgICAvLyBjb21wb25lbnRzIGhhdmUgcGVyZm9ybWFuY2UgaXNzdWUgY29tcGFyZSB0byB0aGUgb3JpZ2luYWwgYm9keSBzY3JvbGwuXG4gICAgaWYgKCFub2RlVHlwZSkge1xuICAgICAgY29uc29sZS53YXJuKGBbaDUtcmVuZGVyXSBubyBub2RlVHlwZSBpcyBzcGVjaWZpZWQsIGNvbnN0cnVjdCBSb290IHVzZSAnZHJvb3QnIGJ5IGRlZmF1bHQuYClcbiAgICAgIG5vZGVUeXBlID0gJ2Ryb290J1xuICAgIH1cbiAgICBlbHNlIGlmIChjb25maWcudmFsaWRSb290cy5pbmRleE9mKG5vZGVUeXBlKSA9PT0gLTEpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gdGhlIHJvb3QgY29tcG9uZW50IHR5cGUgJyR7bm9kZVR5cGV9JyBpcyBub3Qgb25lIG9mXG50aGUgdHlwZXMgaW4gWyR7Y29uZmlnLnZhbGlkUm9vdHN9XSBsaXN0LiBJdCBpcyBhdXRvIGRvd25ncmFkZWRcbnRvICdkcm9vdCcuYClcbiAgICAgIG5vZGVUeXBlID0gJ2Ryb290J1xuICAgIH1cbiAgICBlbHNlIGlmIChjb25maWcuZG93bmdyYWRlLnJvb3QpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gdGhlIHJvb3QgaXMgZG93bmdyYWRlIHRvICdkcm9vdCcgZHVlIHRvIHRoZSBkb3duZ3JhZGVcbmNvbmZpZ3VyYXRpb24gb2Ygd2VleC5gKVxuICAgICAgbm9kZVR5cGUgPSAnZHJvb3QnXG4gICAgfVxuXG4gICAgZGF0YS50eXBlID0gbm9kZVR5cGVcbiAgICBjb25zdCBjbXAgPSBjbS5jcmVhdGVFbGVtZW50KGRhdGEpXG4gICAgY21wLm5vZGUuaWQgPSBpZFxuICAgIHJldHVybiBjbXBcbiAgfVxuXG4gIFJvb3RDb21wb25lbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDb21wb25lbnQucHJvdG90eXBlKVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3Jvb3QnLCBSb290Q29tcG9uZW50KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBDb21wb25lbnQgPSBXZWV4LkNvbXBvbmVudFxuXG4gIGZ1bmN0aW9uIERpdiAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBDb21wb25lbnQuY2FsbCh0aGlzLCBkYXRhLCBub2RlVHlwZSlcbiAgICB0aGlzLm5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1jb250YWluZXInKVxuICB9XG4gIERpdi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnZGl2JywgRGl2KVxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdjb250YWluZXInLCBEaXYpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBERUZBVUxUX0xPQURfTU9SRV9PRkZTRVQgPSAwXG5sZXQgQ29tcG9uZW50XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKG5vZGVUeXBlKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobm9kZVR5cGUgfHwgJ2RpdicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWRyb290JylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtY29udGFpbmVyJylcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIGJpbmRFdmVudHMgKGV2dHMpIHtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzLCBldnRzKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gZmlyZSBsb2FkbW9yZSBldmVudC5cbiAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5XG4gICAgICBjb25zdCBsZWZ0RGlzdCA9IGJvZHkuc2Nyb2xsSGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0IC0gYm9keS5zY3JvbGxUb3BcbiAgICAgIGlmIChsZWZ0RGlzdCA8PSB0aGlzLmxvYWRtb3Jlb2Zmc2V0ICYmIHRoaXMuaXNBdmFpbGFibGVUb0ZpcmVsb2FkbW9yZSkge1xuICAgICAgICB0aGlzLmlzQXZhaWxhYmxlVG9GaXJlbG9hZG1vcmUgPSBmYWxzZVxuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ2xvYWRtb3JlJylcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlZnREaXN0ID4gdGhpcy5sb2FkbW9yZW9mZnNldCAmJiAhdGhpcy5pc0F2YWlsYWJsZVRvRmlyZWxvYWRtb3JlKSB7XG4gICAgICAgIHRoaXMuaXNBdmFpbGFibGVUb0ZpcmVsb2FkbW9yZSA9IHRydWVcbiAgICAgIH1cbiAgICB9LmJpbmQodGhpcykpXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgbG9hZG1vcmVvZmZzZXQgKHZhbCkge1xuICAgIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKHZhbHVlIDwgMCB8fCBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gaW52YWxpZCBsb2FkbW9yZW9mZnNldDogJHt2YWx9YClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLmxvYWRtb3Jlb2Zmc2V0ID0gdmFsdWVcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIENvbXBvbmVudCA9IFdlZXguQ29tcG9uZW50XG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgZnVuY3Rpb24gRHJvb3QgKGRhdGEsIG5vZGVUeXBlKSB7XG4gICAgaWYgKGRhdGEucmVmICE9PSAnX3Jvb3QnKSB7XG4gICAgICByZXR1cm4gY29uc29sZS53YXJuKCdbaDUtcmVuZGVyXSBkcm9vdCBjYW4gb25seSBiZSB1c2VkIGFzIGEgZG93bmdyYWRlZCByb290LicpXG4gICAgfVxuICAgIHRoaXMubG9hZG1vcmVvZmZzZXQgPSBERUZBVUxUX0xPQURfTU9SRV9PRkZTRVRcbiAgICB0aGlzLmlzQXZhaWxhYmxlVG9GaXJlbG9hZG1vcmUgPSB0cnVlXG4gICAgQ29tcG9uZW50LmNhbGwodGhpcywgZGF0YSwgbm9kZVR5cGUpXG4gIH1cbiAgRHJvb3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDb21wb25lbnQucHJvdG90eXBlKVxuICBleHRlbmQoRHJvb3QucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKERyb290LnByb3RvdHlwZSwgeyBhdHRyIH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnZHJvb3QnLCBEcm9vdClcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICcuL2ltYWdlLmNzcydcblxuY29uc3QgREVGQVVMVF9TSVpFID0gMjAwXG5jb25zdCBSRVNJWkVfTU9ERVMgPSBbJ3N0cmV0Y2gnLCAnY292ZXInLCAnY29udGFpbiddXG5jb25zdCBERUZBVUxUX1JFU0laRV9NT0RFID0gJ3N0cmV0Y2gnXG5cbmxldCBBdG9taWNcblxuLyoqXG4gKiByZXNpemU6ICdjb3ZlcicgfCAnY29udGFpbicgfCAnc3RyZXRjaCcsIGRlZmF1bHQgaXMgJ3N0cmV0Y2gnXG4gKiBzcmM6IHVybFxuICogcGxhY2Vob2xkZXIgLyBwbGFjZS1ob2xkZXI6IHVybFxuICovXG5jb25zdCBwcm90byA9IHtcbiAgY3JlYXRlICgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtaW1nJylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtZWxlbWVudCcpXG4gICAgcmV0dXJuIG5vZGVcbiAgfSxcblxuICBjbGVhckF0dHIgKCkge1xuICAgIHRoaXMuc3JjID0gJydcbiAgICB0aGlzLm5vZGUuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJydcbiAgfVxufVxuXG5jb25zdCBhdHRyID0ge1xuICBzcmM6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAoIXRoaXMuc3JjKSB7XG4gICAgICB0aGlzLnNyYyA9IGxpYi5pbWcuZGVmYXVsdFNyY1xuICAgICAgdGhpcy5ub2RlLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoJyArIHRoaXMuc3JjICsgJyknXG4gICAgfVxuICAgIHRoaXMuZW5hYmxlTGF6eWxvYWQodmFsKVxuICB9LFxuXG4gIHBsYWNlaG9sZGVyOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGhpcy5ub2RlLmRhdGFzZXQucGxhY2Vob2xkZXIgPSB2YWxcbiAgfSxcblxuICAvLyBhbGlhcyBmb3IgcGxhY2Vob2xkZXIgKHBsYWNlLWhvbGRlcilcbiAgcGxhY2VIb2xkZXI6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyLnBsYWNlaG9sZGVyLmNhbGwodGhpcywgdmFsKVxuICB9LFxuXG4gIHJlc2l6ZTogZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmIChSRVNJWkVfTU9ERVMuaW5kZXhPZih2YWwpID09PSAtMSkge1xuICAgICAgdmFsID0gJ3N0cmV0Y2gnXG4gICAgfVxuICAgIHRoaXMubm9kZS5zdHlsZS5iYWNrZ3JvdW5kU2l6ZSA9IHZhbCA9PT0gJ3N0cmV0Y2gnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICcxMDAlIDEwMCUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbFxuICB9XG59XG5cbmNvbnN0IHN0eWxlID0ge1xuICB3aWR0aDogZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhbCA9IHBhcnNlRmxvYXQodmFsKVxuICAgIGlmICh2YWwgPCAwIHx8IGlzTmFOKHZhbCkpIHtcbiAgICAgIHZhbCA9IERFRkFVTFRfU0laRVxuICAgIH1cbiAgICB0aGlzLm5vZGUuc3R5bGUud2lkdGggPSB2YWwgKyAncHgnXG4gIH0sXG5cbiAgaGVpZ2h0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKHZhbCA8IDAgfHwgaXNOYU4odmFsKSkge1xuICAgICAgdmFsID0gREVGQVVMVF9TSVpFXG4gICAgfVxuICAgIHRoaXMubm9kZS5zdHlsZS5oZWlnaHQgPSB2YWwgKyAncHgnXG4gIH1cbn1cblxuY29uc3QgZXZlbnQgPSB7XG4gIGxvYWQ6IHtcbiAgICBleHRyYTogZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyBuYXR1cmFsV2lkdGgsIG5hdHVyYWxIZWlnaHQgfSA9IHRoaXMubm9kZVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmF0dXJhbFdpZHRoLCBuYXR1cmFsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgQXRvbWljID0gV2VleC5BdG9taWNcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICBmdW5jdGlvbiBJbWFnZSAoZGF0YSkge1xuICAgIHRoaXMucmVzaXplID0gREVGQVVMVF9SRVNJWkVfTU9ERVxuICAgIEF0b21pYy5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgSW1hZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBdG9taWMucHJvdG90eXBlKVxuICBleHRlbmQoSW1hZ2UucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKEltYWdlLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIGV4dGVuZChJbWFnZS5wcm90b3R5cGUsIHtcbiAgICBzdHlsZTogZXh0ZW5kKE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZS5zdHlsZSksIHN0eWxlKVxuICB9KVxuICBleHRlbmQoSW1hZ2UucHJvdG90eXBlLCB7IGV2ZW50IH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnaW1hZ2UnLCBJbWFnZSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IERFRkFVTFRfRk9OVF9TSVpFID0gMzJcbmNvbnN0IERFRkFVTFRfVEVYVF9PVkVSRkxPVyA9ICdlbGxpcHNpcydcblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgbm9kZS5zdHlsZS5mb250U2l6ZSA9IERFRkFVTFRfRk9OVF9TSVpFICsgJ3B4J1xuICAgIHRoaXMudGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcbiAgICAvLyBHaXZlIHRoZSBkZXZlbG9wZXJzIHRoZSBhYmlsaXR5IHRvIGNvbnRyb2wgc3BhY2VcbiAgICAvLyBhbmQgbGluZS1icmVha2Vycy5cbiAgICB0aGlzLnRleHROb2RlLnN0eWxlLndoaXRlU3BhY2UgPSAncHJlLXdyYXAnXG4gICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS53b3JkV3JhcCA9ICdicmVhay13b3JkJ1xuICAgIHRoaXMudGV4dE5vZGUuc3R5bGUuZGlzcGxheSA9ICctd2Via2l0LWJveCdcbiAgICB0aGlzLnRleHROb2RlLnN0eWxlLndlYmtpdEJveE9yaWVudCA9ICd2ZXJ0aWNhbCdcbiAgICB0aGlzLnN0eWxlLmxpbmVzLmNhbGwodGhpcywgKHRoaXMuZGF0YS5zdHlsZSB8fCB7fSkubGluZXMpXG4gICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLnRleHROb2RlKVxuICAgIHJldHVybiBub2RlXG4gIH0sXG5cbiAgY2xlYXJBdHRyICgpIHtcbiAgICB0aGlzLm5vZGUuZmlyc3RDaGlsZC50ZXh0Q29udGVudCA9ICcnXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgdmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGNvbnN0IHNwYW4gPSB0aGlzLm5vZGUuZmlyc3RDaGlsZFxuICAgIHNwYW4uaW5uZXJIVE1MID0gJydcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBzcGFuLnRleHRDb250ZW50ID0gdmFsdWVcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXJzIGFyZSBzdXBwb3NlZCB0byBoYXZlIHRoZSBhYmlsaXR5IHRvIGJyZWFrIHRleHRcbiAgICAgKiBsaW5lcyBtYW51YWxseS4gVXNpbmcgYGAmbmJzcDtgYCB0byByZXBsYWNlIHRleHQgc3BhY2UgaXNcbiAgICAgKiBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBgYC13ZWJraXQtbGluZS1jbGFtcGBgLiBUaGVyZWZvclxuICAgICAqIHdlIHVzZSBgYHdoaXRlLXNwYWNlOiBuby13cmFwYGAgaW5zdGVhZCAoaW5zdGVhZCBvZiB0aGVcbiAgICAgKiBjb2RlIGJlbGxvdykuXG5cbiAgICAgIGNvbnN0IGZyYWcgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgdGV4dC5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgICAgY29uc3QgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHIpXG4gICAgICAgICAgY29uc3Qgc3BhY2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJylcbiAgICAgICAgICBzcGFjZS5pbm5lckhUTUwgPSAnJm5ic3A7J1xuICAgICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoc3BhY2UpXG4gICAgICAgICAgZnJhZy5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZy5yZW1vdmVDaGlsZChmcmFnLmZpcnN0Q2hpbGQpXG4gICAgICAgIHNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnInKSlcbiAgICAgICAgc3Bhbi5hcHBlbmRDaGlsZChmcmFnKVxuICAgICAgfSlcbiAgICAgIHNwYW4ucmVtb3ZlQ2hpbGQoc3Bhbi5maXJzdENoaWxkKVxuICAgICAqL1xuICB9XG59XG5cbmNvbnN0IHN0eWxlID0ge1xuICBsaW5lczogZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhbCA9IHBhcnNlSW50KHZhbClcbiAgICBpZiAoaXNOYU4odmFsKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh2YWwgPD0gMCkge1xuICAgICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS50ZXh0T3ZlcmZsb3cgPSAnJ1xuICAgICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJ1xuICAgICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS53ZWJraXRMaW5lQ2xhbXAgPSAnJ1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5kYXRhID8gdGhpcy5kYXRhLnN0eWxlIDogbnVsbFxuICAgICAgdGhpcy50ZXh0Tm9kZS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gICAgICB0aGlzLnRleHROb2RlLnN0eWxlLnRleHRPdmVyZmxvdyA9IHN0eWxlXG4gICAgICAgID8gc3R5bGUudGV4dE92ZXJmbG93XG4gICAgICAgIDogREVGQVVMVF9URVhUX09WRVJGTE9XXG4gICAgICB0aGlzLnRleHROb2RlLnN0eWxlLndlYmtpdExpbmVDbGFtcCA9IHZhbFxuICAgIH1cbiAgfSxcblxuICB0ZXh0T3ZlcmZsb3c6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB0aGlzLnRleHROb2RlLnN0eWxlLnRleHRPdmVyZmxvdyA9IHZhbFxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQXRvbWljID0gV2VleC5BdG9taWNcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyXG4gIC8vICAtIHZhbHVlOiB0ZXh0IGNvbnRlbnQuXG4gIC8vIHN0eWxlXG4gIC8vICAtIGxpbmVzOiBtYXhpbXVtIGxpbmVzIG9mIHRoZSB0ZXh0LlxuICBmdW5jdGlvbiBUZXh0IChkYXRhKSB7XG4gICAgQXRvbWljLmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBUZXh0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFRleHQucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKFRleHQucHJvdG90eXBlLCB7IGF0dHIgfSlcbiAgZXh0ZW5kKFRleHQucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd0ZXh0JywgVGV4dClcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYjogdHJ1ZSAqL1xuXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiB0cmFuc2ZlciBRdWFkcmF0aWMgQmV6aWVyIEN1cnZlIHRvIEN1YmljIEJlemllciBDdXJ2ZVxuICpcbiAqIEBwYXJhbSAge251bWJlcn0gYSBhYnNjaXNzYSBvZiBwMVxuICogQHBhcmFtICB7bnVtYmVyfSBiIG9yZGluYXRlIG9mIHAxXG4gKiBAcmV0dXJuIHtBcnJheX0gcGFyYW1ldGVyIG1hdHJpeCBmb3IgY3ViaWMgYmV6aWVyIGN1cnZlXG4gKiAgIGxpa2UgW1twMXgsIHAxeV0sIFtwMngsIHAyeV1dXG4gKi9cbmZ1bmN0aW9uIHF1YWRyYXRpYzJjdWJpY0JlemllciAoYSwgYikge1xuICByZXR1cm4gW1xuICAgIFtcbiAgICAgIChhIC8gMyArIChhICsgYikgLyAzIC0gYSkgLyAoYiAtIGEpLFxuICAgICAgKGEgKiBhIC8gMyArIGEgKiBiICogMiAvIDMgLSBhICogYSkgLyAoYiAqIGIgLSBhICogYSlcbiAgICBdLCBbXG4gICAgICAoYiAvIDMgKyAoYSArIGIpIC8gMyAtIGEpIC8gKGIgLSBhKSxcbiAgICAgIChiICogYiAvIDMgKyBhICogYiAqIDIgLyAzIC0gYSAqIGEpIC8gKGIgKiBiIC0gYSAqIGEpXG4gICAgXVxuICBdXG59XG5cbi8qKlxuICogZGVyaXZlIHBvc2l0aW9uIGRhdGEgZnJvbSBrbm93aW5nIG1vdGlvbiBwYXJhbWV0ZXJzXG4gKiBiYXNlIG9uIE5ld3RvbidzIHNlY29uZCBsYXc6IHMgPSB2dCArIGF0XjIvMlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgb2JqZWN0IG9mIHsgdiwgYSwgcywgdCB9XG4gKiAgIC0gdjogaW5pdGlhbCB2ZWxvY2l0eVxuICogICAtIGE6IGFjY2VsZXJhdGUgc3BlZWRcbiAqICAgLSB0OiB0aW1lXG4gKiAgIC0gczogc2hpZnRpbmdcbiAqL1xuZnVuY3Rpb24gTW90aW9uIChjb25maWcpIHtcbiAgdGhpcy52ID0gY29uZmlnLnYgfHwgMFxuICB0aGlzLmEgPSBjb25maWcuYSB8fCAwXG5cbiAgaWYgKHR5cGVvZiBjb25maWcudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aGlzLnQgPSBjb25maWcudFxuICB9XG5cbiAgaWYgKHR5cGVvZiBjb25maWcucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0aGlzLnMgPSBjb25maWcuc1xuICB9XG5cbiAgLy8gZGVyaXZlIHRpbWUgZnJvbSBzaGlmdGluZ1xuICBpZiAodHlwZW9mIHRoaXMudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMudCA9IC10aGlzLnYgLyB0aGlzLmFcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB0MSA9IChNYXRoLnNxcnQodGhpcy52ICogdGhpcy52ICsgMiAqIHRoaXMuYSAqIHRoaXMucykgLSB0aGlzLnYpXG4gICAgICAgIC8gdGhpcy5hXG4gICAgICBjb25zdCB0MiA9ICgtTWF0aC5zcXJ0KHRoaXMudiAqIHRoaXMudiArIDIgKiB0aGlzLmEgKiB0aGlzLnMpIC0gdGhpcy52KVxuICAgICAgICAvIHRoaXMuYVxuICAgICAgdGhpcy50ID0gTWF0aC5taW4odDEsIHQyKVxuICAgIH1cbiAgfVxuXG4gIC8vIGRlcml2ZSBzaGlmdGluZyBmcm9tIHRpbWVcbiAgaWYgKHR5cGVvZiB0aGlzLnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhpcy5zID0gdGhpcy5hICogdGhpcy50ICogdGhpcy50IC8gMiArIHRoaXMudiAqIHRoaXMudFxuICB9XG59XG5cbi8qKlxuICogZGVyaXZlIGN1YmljIGJlemllciBwYXJhbWV0ZXJzIGZyb20gbW90aW9uIHBhcmFtZXRlcnNcbiAqIEByZXR1cm4ge0FycmF5fSBwYXJhbWV0ZXIgbWF0cml4IGZvciBjdWJpYyBiZXppZXIgY3VydmVcbiAqICAgbGlrZSBbW3AxeCwgcDF5XSwgW3AyeCwgcDJ5XV1cbiAqL1xuTW90aW9uLnByb3RvdHlwZS5nZW5lcmF0ZUN1YmljQmV6aWVyID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcXVhZHJhdGljMmN1YmljQmV6aWVyKFxuICAgIHRoaXMudiAvIHRoaXMuYSwgdGhpcy50ICsgdGhpcy52IC8gdGhpcy5hXG4gIClcbn1cblxuIWxpYiAmJiAobGliID0ge30pXG5saWIubW90aW9uID0gTW90aW9uXG5cbm1vZHVsZS5leHBvcnRzID0gTW90aW9uXG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuaW1wb3J0ICcuL21vdGlvbidcblxudmFyIGRvYyA9IHdpbmRvdy5kb2N1bWVudFxudmFyIHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnRcbnZhciBzY3JvbGxPYmpzID0ge31cbnZhciBwbHVnaW5zID0ge31cbnZhciBkcHIgPSB3aW5kb3cuZHByXG4gIHx8ICghIXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kLylcbiAgICA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCAvIHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aFxuICAgIDogMSlcbnZhciBpbmVydGlhQ29lZmZpY2llbnQgPSB7XG4gIG5vcm1hbDogWzIgKiBkcHIsIDAuMDAxNSAqIGRwcl0sXG4gIHNsb3c6IFsxLjUgKiBkcHIsIDAuMDAzICogZHByXSxcbiAgdmVyeXNsb3c6IFsxLjUgKiBkcHIsIDAuMDA1ICogZHByXVxufVxudmFyIHRpbWVGdW5jdGlvbiA9IHtcbiAgZWFzZTogWy4yNSwuMSwuMjUsMV0sXG4gIGxpbmVyOiBbMCwwLDEsMV0sXG4gICdlYXNlLWluJzogWy40MiwwLDEsMV0sXG4gICdlYXNlLW91dCc6IFswLDAsLjU4LDFdLFxuICAnZWFzZS1pbi1vdXQnOiBbLjQyLDAsLjU4LDFdXG59XG52YXIgRmlyZWZveCA9ICEhdWEubWF0Y2goL0ZpcmVmb3gvaSlcbnZhciBJRU1vYmlsZSA9ICEhdWEubWF0Y2goL0lFTW9iaWxlL2kpXG52YXIgY3NzUHJlZml4ID0gRmlyZWZveCA/ICctbW96LScgOiBJRU1vYmlsZSA/ICctbXMtJyA6ICctd2Via2l0LSdcbnZhciBzdHlsZVByZWZpeCA9IEZpcmVmb3ggPyAnTW96JyA6IElFTW9iaWxlID8gJ21zJyA6ICd3ZWJraXQnXG5cbmZ1bmN0aW9uIGRlYnVnTG9nKCkge1xuICBpZiAobGliLnNjcm9sbC5vdXRwdXREZWJ1Z0xvZykge1xuICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cylcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWwpIHtcbiAgdmFyIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICBpZiAoIXJlY3QpIHtcbiAgICByZWN0ID0ge31cbiAgICByZWN0LndpZHRoID0gZWwub2Zmc2V0V2lkdGhcbiAgICByZWN0LmhlaWdodCA9IGVsLm9mZnNldEhlaWdodFxuXG4gICAgcmVjdC5sZWZ0ID0gZWwub2Zmc2V0TGVmdFxuICAgIHJlY3QudG9wID0gZWwub2Zmc2V0VG9wXG4gICAgdmFyIHBhcmVudCA9IGVsLm9mZnNldFBhcmVudFxuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIHJlY3QubGVmdCArPSBwYXJlbnQub2Zmc2V0TGVmdFxuICAgICAgcmVjdC50b3AgKz0gcGFyZW50Lm9mZnNldFRvcFxuICAgICAgcGFyZW50ID0gcGFyZW50Lm9mZnNldFBhcmVudFxuICAgIH1cblxuICAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyByZWN0LndpZHRoXG4gICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0XG4gIH1cbiAgcmV0dXJuIHJlY3Rcbn1cblxuZnVuY3Rpb24gZ2V0TWluU2Nyb2xsT2Zmc2V0KHNjcm9sbE9iaikge1xuICByZXR1cm4gMCAtIHNjcm9sbE9iai5vcHRpb25zW3Njcm9sbE9iai5heGlzICsgJ1BhZGRpbmdUb3AnXVxufVxuXG5mdW5jdGlvbiBnZXRNYXhTY3JvbGxPZmZzZXQoc2Nyb2xsT2JqKSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHNjcm9sbE9iai5lbGVtZW50KVxuICB2YXIgcFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qoc2Nyb2xsT2JqLnZpZXdwb3J0KVxuICB2YXIgbWluID0gZ2V0TWluU2Nyb2xsT2Zmc2V0KHNjcm9sbE9iailcbiAgaWYgKHNjcm9sbE9iai5heGlzID09PSAneScpIHtcbiAgICB2YXIgbWF4ID0gMCAtIHJlY3QuaGVpZ2h0ICsgcFJlY3QuaGVpZ2h0XG4gIH0gZWxzZSB7XG4gICAgdmFyIG1heCA9IDAgLSByZWN0LndpZHRoICsgcFJlY3Qud2lkdGhcbiAgfVxuICByZXR1cm4gTWF0aC5taW4oXG4gICAgbWF4ICsgc2Nyb2xsT2JqLm9wdGlvbnNbc2Nyb2xsT2JqLmF4aXMgKyAnUGFkZGluZ0JvdHRvbSddLFxuICAgIG1pblxuICApXG59XG5cbmZ1bmN0aW9uIGdldEJvdW5kYXJ5T2Zmc2V0KHNjcm9sbE9iaiwgb2Zmc2V0KSB7XG4gIGlmIChvZmZzZXQgPiBzY3JvbGxPYmoubWluU2Nyb2xsT2Zmc2V0KSB7XG4gICAgcmV0dXJuIG9mZnNldCAtIHNjcm9sbE9iai5taW5TY3JvbGxPZmZzZXRcbiAgfVxuICBpZiAob2Zmc2V0IDwgc2Nyb2xsT2JqLm1heFNjcm9sbE9mZnNldCkge1xuICAgIHJldHVybiBvZmZzZXQgLSBzY3JvbGxPYmoubWF4U2Nyb2xsT2Zmc2V0XG4gIH1cbn1cblxuZnVuY3Rpb24gdG91Y2hCb3VuZGFyeShzY3JvbGxPYmosIG9mZnNldCkge1xuICBpZiAob2Zmc2V0ID4gc2Nyb2xsT2JqLm1pblNjcm9sbE9mZnNldCkge1xuICAgIG9mZnNldCA9IHNjcm9sbE9iai5taW5TY3JvbGxPZmZzZXRcbiAgfSBlbHNlIGlmIChvZmZzZXQgPCBzY3JvbGxPYmoubWF4U2Nyb2xsT2Zmc2V0KSB7XG4gICAgb2Zmc2V0ID0gc2Nyb2xsT2JqLm1heFNjcm9sbE9mZnNldFxuICB9XG4gIHJldHVybiBvZmZzZXRcbn1cblxuZnVuY3Rpb24gZmlyZUV2ZW50KHNjcm9sbE9iaiwgZXZlbnROYW1lLCBleHRyYSkge1xuICBkZWJ1Z0xvZyhzY3JvbGxPYmouZWxlbWVudC5zY3JvbGxJZCwgZXZlbnROYW1lLCBleHRyYSlcbiAgdmFyIGV2ZW50ID0gZG9jLmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJylcbiAgZXZlbnQuaW5pdEV2ZW50KGV2ZW50TmFtZSwgZmFsc2UsIHRydWUpXG4gIGV2ZW50LnNjcm9sbE9iaiA9IHNjcm9sbE9ialxuICBpZiAoZXh0cmEpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gZXh0cmEpIHtcbiAgICAgIGV2ZW50W2tleV0gPSBleHRyYVtrZXldXG4gICAgfVxuICB9XG4gIHNjcm9sbE9iai5lbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gIHNjcm9sbE9iai52aWV3cG9ydC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2Zvcm1PZmZzZXQoc2Nyb2xsT2JqKSB7XG4gIHZhciBvZmZzZXQgPSB7eDogMCwgeTogMH1cbiAgdmFyIHRyYW5zZm9ybSA9IGdldENvbXB1dGVkU3R5bGUoc2Nyb2xsT2JqLmVsZW1lbnQpXG4gICAgW3N0eWxlUHJlZml4ICsgJ1RyYW5zZm9ybSddXG4gIHZhciBtYXRjaGVkXG4gIHZhciByZWcxID0gbmV3IFJlZ0V4cCgnXm1hdHJpeDNkJ1xuICAgICsgJ1xcXFwoKD86Wy1cXFxcZC5dKyxcXFxccyopezEyfShbLVxcXFxkLl0rKSwnXG4gICAgKyAnXFxcXHMqKFstXFxcXGQuXSspKD86LFxcXFxzKlstXFxcXGQuXSspezJ9XFxcXCknKVxuICB2YXIgcmVnMiA9IG5ldyBSZWdFeHAoJ15tYXRyaXgnXG4gICAgKyAnXFxcXCgoPzpbLVxcXFxkLl0rLFxcXFxzKil7NH0oWy1cXFxcZC5dKyksXFxcXHMqKFstXFxcXGQuXSspXFxcXCkkJylcbiAgaWYgKHRyYW5zZm9ybSAhPT0gJ25vbmUnKSB7XG4gICAgaWYgKChtYXRjaGVkID0gdHJhbnNmb3JtLm1hdGNoKHJlZzEpIHx8XG4gICAgICAgIHRyYW5zZm9ybS5tYXRjaChyZWcyKSkpIHtcbiAgICAgIG9mZnNldC54ID0gcGFyc2VGbG9hdChtYXRjaGVkWzFdKSB8fCAwXG4gICAgICBvZmZzZXQueSA9IHBhcnNlRmxvYXQobWF0Y2hlZFsyXSkgfHwgMFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxudmFyIENTU01hdHJpeCA9IElFTW9iaWxlID8gJ01TQ1NTTWF0cml4JyA6ICdXZWJLaXRDU1NNYXRyaXgnXG52YXIgaGFzM2QgPSAhIUZpcmVmb3hcbiAgfHwgQ1NTTWF0cml4IGluIHdpbmRvd1xuICAmJiAnbTExJyBpbiBuZXcgd2luZG93W0NTU01hdHJpeF0oKVxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRlKHgsIHkpIHtcbiAgeCA9IHBhcnNlRmxvYXQoeClcbiAgeSA9IHBhcnNlRmxvYXQoeSlcblxuICBpZiAoeCAhPSAwKSB7XG4gICAgeCArPSAncHgnXG4gIH1cblxuICBpZiAoeSAhPSAwKSB7XG4gICAgeSArPSAncHgnXG4gIH1cblxuICBpZiAoaGFzM2QpIHtcbiAgICByZXR1cm4gJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJywgJyArIHkgKyAnLCAwKSdcbiAgfVxuICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgeCArICcsICcgKyB5ICsgJyknXG59XG5cbmZ1bmN0aW9uIHNldFRyYW5zaXRpb25TdHlsZShzY3JvbGxPYmosIGR1cmF0aW9uLCB0aW1pbmdGdW5jdGlvbikge1xuICBpZiAoZHVyYXRpb24gPT09ICcnICYmIHRpbWluZ0Z1bmN0aW9uID09PSAnJykge1xuICAgIHNjcm9sbE9iai5lbGVtZW50LnN0eWxlW3N0eWxlUHJlZml4ICsgJ1RyYW5zaXRpb24nXSA9ICcnXG4gIH0gZWxzZSB7XG4gICAgc2Nyb2xsT2JqLmVsZW1lbnQuc3R5bGVbc3R5bGVQcmVmaXggKyAnVHJhbnNpdGlvbiddXG4gICAgICA9IGNzc1ByZWZpeCArICd0cmFuc2Zvcm0gJyArIGR1cmF0aW9uICsgJyAnICsgdGltaW5nRnVuY3Rpb24gKyAnIDBzJ1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFRyYW5zZm9ybVN0eWxlKHNjcm9sbE9iaiwgb2Zmc2V0KSB7XG4gIHZhciB4ID0gMFxuICB2YXIgeSA9IDBcbiAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdvYmplY3QnKSB7XG4gICAgeCA9IG9mZnNldC54XG4gICAgeSA9IG9mZnNldC55XG4gIH0gZWxzZSB7XG4gICAgaWYgKHNjcm9sbE9iai5heGlzID09PSAneScpIHtcbiAgICAgIHkgPSBvZmZzZXRcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IG9mZnNldFxuICAgIH1cbiAgfVxuICBzY3JvbGxPYmouZWxlbWVudC5zdHlsZVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXSA9IGdldFRyYW5zbGF0ZSh4LCB5KVxufVxuXG52YXIgcGFubmluZyA9IGZhbHNlXG5kb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgZnVuY3Rpb24gKGUpIHtcbiAgaWYgKHBhbm5pbmcpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufSwgZmFsc2UpXG5cbmZ1bmN0aW9uIFNjcm9sbChlbGVtZW50LCBvcHRpb25zKSB7XG4gIHZhciB0aGF0ID0gdGhpc1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIG9wdGlvbnMubm9Cb3VuY2UgPSAhIW9wdGlvbnMubm9Cb3VuY2VcbiAgb3B0aW9ucy5wYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nIHx8IHt9XG5cbiAgaWYgKG9wdGlvbnMuaXNQcmV2ZW50ID09IG51bGwpIHtcbiAgICBvcHRpb25zLmlzUHJldmVudCA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLmlzUHJldmVudCA9ICEhb3B0aW9ucy5pc1ByZXZlbnRcbiAgfVxuXG4gIGlmIChvcHRpb25zLmlzRml4U2Nyb2xsZW5kQ2xpY2sgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMuaXNGaXhTY3JvbGxlbmRDbGljayA9IHRydWVcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLmlzRml4U2Nyb2xsZW5kQ2xpY2sgPSAhIW9wdGlvbnMuaXNGaXhTY3JvbGxlbmRDbGlja1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucGFkZGluZykge1xuICAgIG9wdGlvbnMueVBhZGRpbmdUb3AgPSAtb3B0aW9ucy5wYWRkaW5nLnRvcCB8fCAwXG4gICAgb3B0aW9ucy55UGFkZGluZ0JvdHRvbSA9IC1vcHRpb25zLnBhZGRpbmcuYm90dG9tIHx8IDBcbiAgICBvcHRpb25zLnhQYWRkaW5nVG9wID0gLW9wdGlvbnMucGFkZGluZy5sZWZ0IHx8IDBcbiAgICBvcHRpb25zLnhQYWRkaW5nQm90dG9tID0gLW9wdGlvbnMucGFkZGluZy5yaWdodCB8fCAwXG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucy55UGFkZGluZ1RvcCA9IDBcbiAgICBvcHRpb25zLnlQYWRkaW5nQm90dG9tID0gMFxuICAgIG9wdGlvbnMueFBhZGRpbmdUb3AgPSAwXG4gICAgb3B0aW9ucy54UGFkZGluZ0JvdHRvbSA9IDBcbiAgfVxuXG4gIG9wdGlvbnMuZGlyZWN0aW9uID0gb3B0aW9ucy5kaXJlY3Rpb24gfHwgJ3knXG4gIG9wdGlvbnMuaW5lcnRpYSA9IG9wdGlvbnMuaW5lcnRpYSB8fCAnbm9ybWFsJ1xuXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgdGhhdC5heGlzID0gb3B0aW9ucy5kaXJlY3Rpb25cbiAgdGhpcy5lbGVtZW50ID0gZWxlbWVudFxuICB0aGlzLnZpZXdwb3J0ID0gZWxlbWVudC5wYXJlbnROb2RlXG4gIHRoaXMucGx1Z2lucyA9IHt9XG5cbiAgdGhpcy5lbGVtZW50LnNjcm9sbElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgc2Nyb2xsT2Jqc1t0aGF0LmVsZW1lbnQuc2Nyb2xsSWQgKyAnJ10gPSB0aGF0XG4gIH0sIDEpXG5cbiAgdGhpcy52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdG91Y2hzdGFydEhhbmRsZXIsIGZhbHNlKVxuICB0aGlzLnZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdG91Y2hlbmRIYW5kbGVyLCBmYWxzZSlcbiAgdGhpcy52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRvdWNoZW5kSGFuZGxlciwgZmFsc2UpXG4gIHRoaXMudmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigncGFuc3RhcnQnLCBwYW5zdGFydEhhbmRsZXIsIGZhbHNlKVxuICB0aGlzLnZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhbm1vdmUnLCBwYW5IYW5kbGVyLCBmYWxzZSlcbiAgdGhpcy52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCdwYW5lbmQnLCBwYW5lbmRIYW5kbGVyLCBmYWxzZSlcblxuICBpZiAob3B0aW9ucy5pc1ByZXZlbnQpIHtcbiAgICB0aGlzLnZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgcGFubmluZyA9IHRydWVcbiAgICB9LCBmYWxzZSlcbiAgICB0aGF0LnZpZXdwb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIHBhbm5pbmcgPSBmYWxzZVxuICAgIH0sIGZhbHNlKVxuICB9XG5cbiAgLy8gaWYgKG9wdGlvbnMuaXNQcmV2ZW50KSB7XG4gIC8vICAgdmFyIGQgPSB0aGlzLmF4aXMgPT09ICd5Jz8ndmVydGljYWwnOidob3Jpem9udGFsJ1xuICAvLyAgIHRoaXMudmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcihkICsgJ3BhbnN0YXJ0JywgZnVuY3Rpb24gKGUpIHtcbiAgLy8gICAgIHBhbm5pbmcgPSB0cnVlXG4gIC8vICAgfSwgZmFsc2UpXG4gIC8vICAgdGhhdC52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCdwYW5lbmQnLCBmdW5jdGlvbiAoZSkge1xuICAvLyAgICAgcGFubmluZyA9IGZhbHNlXG4gIC8vICAgfSwgZmFsc2UpXG4gIC8vIH1cblxuICBpZiAob3B0aW9ucy5pc0ZpeFNjcm9sbGVuZENsaWNrKSB7XG4gICAgdmFyIHByZXZlbnRTY3JvbGxlbmRDbGlja1xuICAgIHZhciBmaXhTY3JvbGxlbmRDbGlja1RpbWVvdXRJZFxuXG4gICAgdGhpcy52aWV3cG9ydC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGxpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBwcmV2ZW50U2Nyb2xsZW5kQ2xpY2sgPSB0cnVlXG4gICAgICBmaXhTY3JvbGxlbmRDbGlja1RpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQoZml4U2Nyb2xsZW5kQ2xpY2tUaW1lb3V0SWQpXG4gICAgICBmaXhTY3JvbGxlbmRDbGlja1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcHJldmVudFNjcm9sbGVuZENsaWNrID0gZmFsc2VcbiAgICAgIH0sIDQwMClcbiAgICB9LCBmYWxzZSlcblxuICAgIGZ1bmN0aW9uIHByZXZlbnRTY3JvbGxlbmRDbGlja0hhbmRsZXIoZSkge1xuICAgICAgaWYgKHByZXZlbnRTY3JvbGxlbmRDbGljayB8fCBpc1Njcm9sbGluZykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmlyZU5pY2VUYXBFdmVudEhhbmRsZXIoZSkge1xuICAgICAgaWYgKCFwcmV2ZW50U2Nyb2xsZW5kQ2xpY2sgJiYgIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBuaWNlVGFwRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnSFRNTEV2ZW50cycpXG4gICAgICAgICAgbmljZVRhcEV2ZW50LmluaXRFdmVudCgnbmljZWNsaWNrJywgdHJ1ZSwgdHJ1ZSlcbiAgICAgICAgICBlLnRhcmdldC5kaXNwYXRjaEV2ZW50KG5pY2VUYXBFdmVudClcbiAgICAgICAgfSwgMzAwKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBwcmV2ZW50U2Nyb2xsZW5kQ2xpY2tIYW5kbGVyKVxuICAgIHRoaXMudmlld3BvcnQuYWRkRXZlbnRMaXN0ZW5lcigndGFwJywgZmlyZU5pY2VUYXBFdmVudEhhbmRsZXIpXG4gIH1cblxuICBmdW5jdGlvbiBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihoLCB0KSB7XG4gICAgaWYgKG9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0cmFuc2l0aW9uRW5kSGFuZGxlciA9IG51bGxcbiAgICBjbGVhclRpbWVvdXQodHJhbnNpdGlvbkVuZFRpbWVvdXRJZClcblxuICAgIHRyYW5zaXRpb25FbmRUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICh0cmFuc2l0aW9uRW5kSGFuZGxlcikge1xuICAgICAgICB0cmFuc2l0aW9uRW5kSGFuZGxlciA9IG51bGxcbiAgICAgICAgbGliLmFuaW1hdGlvbi5yZXF1ZXN0RnJhbWUoaClcbiAgICAgIH1cbiAgICB9LCAodCB8fCA0MDApKVxuXG4gICAgdHJhbnNpdGlvbkVuZEhhbmRsZXIgPSBoXG4gIH1cblxuICBpZiAob3B0aW9ucy51c2VGcmFtZUFuaW1hdGlvbikge1xuICAgIHZhciBzY3JvbGxBbmltYXRpb25cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYW5pbWF0aW9uJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzY3JvbGxBbmltYXRpb25cbiAgICAgIH1cbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHZhciB0cmFuc2l0aW9uRW5kSGFuZGxlclxuICAgIHZhciB0cmFuc2l0aW9uRW5kVGltZW91dElkID0gMFxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICBGaXJlZm94XG4gICAgICAgICAgPyAndHJhbnNpdGlvbmVuZCdcbiAgICAgICAgICA6IChzdHlsZVByZWZpeCArICdUcmFuc2l0aW9uRW5kJyksIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAodHJhbnNpdGlvbkVuZEhhbmRsZXIpIHtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSB0cmFuc2l0aW9uRW5kSGFuZGxlclxuXG4gICAgICAgIHRyYW5zaXRpb25FbmRIYW5kbGVyID0gbnVsbFxuICAgICAgICBjbGVhclRpbWVvdXQodHJhbnNpdGlvbkVuZFRpbWVvdXRJZClcblxuICAgICAgICBsaWIuYW5pbWF0aW9uLnJlcXVlc3RGcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaGFuZGxlcihlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0sIGZhbHNlKVxuICB9XG5cbiAgdmFyIHBhbkZpeFJhdGlvXG4gIHZhciBpc1Njcm9sbGluZ1xuICB2YXIgaXNGbGlja1Njcm9sbGluZ1xuICB2YXIgY2FuY2VsU2Nyb2xsRW5kXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdpc1Njcm9sbGluZycsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAhIWlzU2Nyb2xsaW5nXG4gICAgfVxuICB9KVxuXG4gIGZ1bmN0aW9uIGlzRW5hYmxlZChlKSB7XG4gICAgaWYgKCF0aGF0LmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZS5pc1ZlcnRpY2FsICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhhdC5heGlzID09PSAneScgJiYgZS5pc1ZlcnRpY2FsXG4gICAgICAgICAgfHwgdGhhdC5heGlzID09PSAneCcgJiYgIWUuaXNWZXJ0aWNhbCkge1xuICAgICAgICAvLyBnZXN0dXJlIGluIHNhbWUgZGlyZWN0aW9uLCBzdG9wIGJ1YmJsaW5nIHVwXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdlc3R1cmUgaW4gZGlmZmVyZW50IGRpcmVjdGlvbiwgYnViYmxpbmcgdXBcbiAgICAgICAgLy8gdG8gdGhlIHRvcCwgd2l0aG91dCBhbnkgb3RoZXIgcHJvY2Vzc1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gdG91Y2hzdGFydEhhbmRsZXIoZSkge1xuICAgIGlmICghaXNFbmFibGVkKGUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXNTY3JvbGxpbmcpIHtcbiAgICAgIHNjcm9sbEVuZCgpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgIHNjcm9sbEFuaW1hdGlvbiAmJiBzY3JvbGxBbmltYXRpb24uc3RvcCgpXG4gICAgICBzY3JvbGxBbmltYXRpb24gPSBudWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0cmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1PZmZzZXQodGhhdClcbiAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIHRyYW5zZm9ybSlcbiAgICAgIHNldFRyYW5zaXRpb25TdHlsZSh0aGF0LCAnJywgJycpXG4gICAgICB0cmFuc2l0aW9uRW5kSGFuZGxlciA9IG51bGxcbiAgICAgIGNsZWFyVGltZW91dCh0cmFuc2l0aW9uRW5kVGltZW91dElkKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHRvdWNoZW5kSGFuZGxlcihlKSB7XG4gICAgaWYgKCFpc0VuYWJsZWQoZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBzMCA9IGdldFRyYW5zZm9ybU9mZnNldCh0aGF0KVt0aGF0LmF4aXNdXG4gICAgdmFyIGJvdW5kYXJ5T2Zmc2V0ID0gZ2V0Qm91bmRhcnlPZmZzZXQodGhhdCwgczApXG5cbiAgICBpZiAoYm91bmRhcnlPZmZzZXQpIHtcbiAgICAgIC8vIGRyYWdnaW5nIG91dCBvZiBib3VuZHJheSwgYm91bmNlIGlzIG5lZWRlZFxuICAgICAgdmFyIHMxID0gdG91Y2hCb3VuZGFyeSh0aGF0LCBzMClcblxuICAgICAgaWYgKG9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgLy8gZnJhbWVcbiAgICAgICAgdmFyIF9zID0gczEgLSBzMFxuICAgICAgICBzY3JvbGxBbmltYXRpb24gPSBuZXcgbGliLmFuaW1hdGlvbihcbiAgICAgICAgICAgIDQwMCxcbiAgICAgICAgICAgIGxpYi5jdWJpY2Jlemllci5lYXNlLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gKHMwICsgX3MgKiBpMikudG9GaXhlZCgyKVxuICAgICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycpXG4gICAgICAgIH0pXG4gICAgICAgIHNjcm9sbEFuaW1hdGlvbi5vbmVuZChzY3JvbGxFbmQpXG4gICAgICAgIHNjcm9sbEFuaW1hdGlvbi5wbGF5KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNzc1xuICAgICAgICB2YXIgb2Zmc2V0ID0gIHMxLnRvRml4ZWQoMClcbiAgICAgICAgc2V0VHJhbnNpdGlvbkVuZEhhbmRsZXIoc2Nyb2xsRW5kLCA0MDApXG4gICAgICAgIHNldFRyYW5zaXRpb25TdHlsZSh0aGF0LCAnMC40cycsICdlYXNlJylcbiAgICAgICAgc2V0VHJhbnNmb3JtU3R5bGUodGhhdCwgb2Zmc2V0KVxuXG4gICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKGZ1bmN0aW9uIGRvU2Nyb2xsKCkge1xuICAgICAgICAgIGlmIChpc1Njcm9sbGluZyAmJiB0aGF0LmVuYWJsZWQpIHtcbiAgICAgICAgICAgIGZpcmVFdmVudCh0aGF0LCAnc2Nyb2xsaW5nJylcbiAgICAgICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKGRvU2Nyb2xsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGJvdW5kYXJ5T2Zmc2V0ID4gMCkge1xuICAgICAgICBmaXJlRXZlbnQodGhhdCwgdGhhdC5heGlzID09PSAneScgPyAncHVsbGRvd25lbmQnIDogJ3B1bGxyaWdodGVuZCcpXG4gICAgICB9IGVsc2UgaWYgKGJvdW5kYXJ5T2Zmc2V0IDwgMCkge1xuICAgICAgICBmaXJlRXZlbnQodGhhdCwgdGhhdC5heGlzID09PSAneScgPyAncHVsbHVwZW5kJyA6ICdwdWxsbGVmdGVuZCcpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1Njcm9sbGluZykge1xuICAgICAgLy8gd2l0aG91dCBleGNlZWRpbmcgdGhlIGJvdW5kYXJ5LCBqdXN0IGVuZCBpdFxuICAgICAgc2Nyb2xsRW5kKClcbiAgICB9XG4gIH1cblxuICB2YXIgbGFzdERpc3BsYWNlbWVudFxuICBmdW5jdGlvbiBwYW5zdGFydEhhbmRsZXIoZSkge1xuICAgIGlmICghaXNFbmFibGVkKGUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGF0LnRyYW5zZm9ybU9mZnNldCA9IGdldFRyYW5zZm9ybU9mZnNldCh0aGF0KVxuICAgIHRoYXQubWluU2Nyb2xsT2Zmc2V0ID0gZ2V0TWluU2Nyb2xsT2Zmc2V0KHRoYXQpXG4gICAgdGhhdC5tYXhTY3JvbGxPZmZzZXQgPSBnZXRNYXhTY3JvbGxPZmZzZXQodGhhdClcbiAgICBwYW5GaXhSYXRpbyA9IDIuNVxuICAgIGNhbmNlbFNjcm9sbEVuZCA9IHRydWVcbiAgICBpc1Njcm9sbGluZyA9IHRydWVcbiAgICBpc0ZsaWNrU2Nyb2xsaW5nID0gZmFsc2VcbiAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbHN0YXJ0JylcblxuICAgIGxhc3REaXNwbGFjZW1lbnQgPSBlWydkaXNwbGFjZW1lbnQnICsgdGhhdC5heGlzLnRvVXBwZXJDYXNlKCldXG4gIH1cblxuXG4gIGZ1bmN0aW9uIHBhbkhhbmRsZXIoZSkge1xuICAgIGlmICghaXNFbmFibGVkKGUpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBmaW5nZXIgbW92ZSBsZXNzIHRoYW4gNSBweC4ganVzdCBpZ25vcmUgdGhhdC5cbiAgICB2YXIgZGlzcGxhY2VtZW50ID0gZVsnZGlzcGxhY2VtZW50JyArIHRoYXQuYXhpcy50b1VwcGVyQ2FzZSgpXVxuICAgIGlmIChNYXRoLmFicyhkaXNwbGFjZW1lbnQgLSBsYXN0RGlzcGxhY2VtZW50KSA8IDUpIHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBsYXN0RGlzcGxhY2VtZW50ID0gZGlzcGxhY2VtZW50XG5cbiAgICB2YXIgb2Zmc2V0ID0gdGhhdC50cmFuc2Zvcm1PZmZzZXRbdGhhdC5heGlzXSArIGRpc3BsYWNlbWVudFxuICAgIGlmIChvZmZzZXQgPiB0aGF0Lm1pblNjcm9sbE9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gdGhhdC5taW5TY3JvbGxPZmZzZXRcbiAgICAgICAgKyAob2Zmc2V0IC0gdGhhdC5taW5TY3JvbGxPZmZzZXQpIC8gcGFuRml4UmF0aW9cbiAgICAgIHBhbkZpeFJhdGlvICo9IDEuMDAzXG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPCB0aGF0Lm1heFNjcm9sbE9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gdGhhdC5tYXhTY3JvbGxPZmZzZXRcbiAgICAgICAgLSAodGhhdC5tYXhTY3JvbGxPZmZzZXQgLSBvZmZzZXQpIC8gcGFuRml4UmF0aW9cbiAgICAgIHBhbkZpeFJhdGlvICo9IDEuMDAzXG4gICAgfVxuICAgIGlmIChwYW5GaXhSYXRpbyA+IDQpIHtcbiAgICAgIHBhbkZpeFJhdGlvID0gNFxuICAgIH1cblxuICAgIC8vIHRlbGwgd2hldGhlciBvciBub3QgcmVhY2ggdGhlIGZyaW5nZVxuICAgIHZhciBib3VuZGFyeU9mZnNldCA9IGdldEJvdW5kYXJ5T2Zmc2V0KHRoYXQsIG9mZnNldClcbiAgICBpZiAoYm91bmRhcnlPZmZzZXQpIHtcbiAgICAgIGZpcmVFdmVudChcbiAgICAgICAgICB0aGF0LFxuICAgICAgICAgIGJvdW5kYXJ5T2Zmc2V0ID4gMFxuICAgICAgICAgID8gKHRoYXQuYXhpcyA9PT0gJ3knID8gJ3B1bGxkb3duJyA6ICdwdWxscmlnaHQnKVxuICAgICAgICAgIDogKHRoYXQuYXhpcyA9PT0gJ3knID8gJ3B1bGx1cCcgOiAncHVsbGxlZnQnKSwge1xuICAgICAgICBib3VuZGFyeU9mZnNldDogTWF0aC5hYnMoYm91bmRhcnlPZmZzZXQpXG4gICAgICB9KVxuICAgICAgaWYgKHRoYXQub3B0aW9ucy5ub0JvdW5jZSkge1xuICAgICAgICBvZmZzZXQgPSB0b3VjaEJvdW5kYXJ5KHRoYXQsIG9mZnNldClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQudG9GaXhlZCgyKSlcbiAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycpXG4gIH1cblxuICBmdW5jdGlvbiBwYW5lbmRIYW5kbGVyKGUpIHtcbiAgICBpZiAoIWlzRW5hYmxlZChlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGUuaXNTd2lwZSkge1xuICAgICAgZmxpY2tIYW5kbGVyKGUpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZmxpY2tIYW5kbGVyKGUpIHtcbiAgICBjYW5jZWxTY3JvbGxFbmQgPSB0cnVlXG5cbiAgICB2YXIgdjAsIGEwLCB0MCwgczAsIHMsIG1vdGlvbjBcbiAgICB2YXIgdjEsIGExLCB0MSwgczEsIG1vdGlvbjEsc2lnblxuICAgIHZhciB2MiwgYTIsIHQyLCBzMiwgbW90aW9uMiwgZnRcblxuICAgIHMwID0gZ2V0VHJhbnNmb3JtT2Zmc2V0KHRoYXQpW3RoYXQuYXhpc11cbiAgICB2YXIgYm91bmRhcnlPZmZzZXQwID0gZ2V0Qm91bmRhcnlPZmZzZXQodGhhdCwgczApXG4gICAgaWYgKCFib3VuZGFyeU9mZnNldDApIHtcbiAgICAgIC8vIHdoZW4gZmluZ2VycyBsZWZ0IHRoZSByYW5nZSBvZiBzY3JlZW4sIGxldCB0b3VjaCBlbmQgaGFuZGxlclxuICAgICAgLy8gdG8gZGVhbCB3aXRoIGl0LlxuICAgICAgLy8gd2hlbiBmaW5nZXJzIGxlZnQgdGhlIHNjcmVlbiwgYnV0IHN0aWxsIGluIHRoZSByYW5nZSBvZlxuICAgICAgLy8gc2NyZWVuLCBjYWxjdWxhdGUgdGhlIGludGVydGlhLlxuICAgICAgdjAgPSBlWyd2ZWxvY2l0eScgKyB0aGF0LmF4aXMudG9VcHBlckNhc2UoKV1cblxuICAgICAgdmFyIG1heFYgPSAyXG4gICAgICB2YXIgZnJpY3Rpb24gPSAwLjAwMTVcbiAgICAgIGlmIChvcHRpb25zLmluZXJ0aWEgJiYgaW5lcnRpYUNvZWZmaWNpZW50W29wdGlvbnMuaW5lcnRpYV0pIHtcbiAgICAgICAgbWF4ViA9IGluZXJ0aWFDb2VmZmljaWVudFtvcHRpb25zLmluZXJ0aWFdWzBdXG4gICAgICAgIGZyaWN0aW9uID0gaW5lcnRpYUNvZWZmaWNpZW50W29wdGlvbnMuaW5lcnRpYV1bMV1cbiAgICAgIH1cblxuICAgICAgaWYgKHYwID4gbWF4Vikge1xuICAgICAgICB2MCA9IG1heFZcbiAgICAgIH1cbiAgICAgIGlmICh2MCA8IC1tYXhWKSB7XG4gICAgICAgIHYwID0gLW1heFZcbiAgICAgIH1cbiAgICAgIGEwID0gZnJpY3Rpb24gKiAodjAgLyBNYXRoLmFicyh2MCkpXG4gICAgICBtb3Rpb24wID0gbmV3IGxpYi5tb3Rpb24oe1xuICAgICAgICB2OiB2MCxcbiAgICAgICAgYTogLWEwXG4gICAgICB9KVxuICAgICAgdDAgPSBtb3Rpb24wLnRcbiAgICAgIHMgPSBzMCArIG1vdGlvbjAuc1xuXG4gICAgICB2YXIgYm91bmRhcnlPZmZzZXQxID0gZ2V0Qm91bmRhcnlPZmZzZXQodGhhdCwgcylcbiAgICAgIGlmIChib3VuZGFyeU9mZnNldDEpIHtcbiAgICAgICAgZGVidWdMb2coJ2luZXJ0aWFsIGNhbGN1bGF0aW9uIGhhcyBleGNlZWRlZCB0aGUgYm91bmRhcnknLFxuICAgICAgICAgIGJvdW5kYXJ5T2Zmc2V0MSlcblxuICAgICAgICB2MSA9IHYwXG4gICAgICAgIGExID0gYTBcbiAgICAgICAgaWYgKGJvdW5kYXJ5T2Zmc2V0MSA+IDApIHtcbiAgICAgICAgICBzMSA9IHRoYXQubWluU2Nyb2xsT2Zmc2V0XG4gICAgICAgICAgc2lnbiA9IDFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHRoYXQubWF4U2Nyb2xsT2Zmc2V0XG4gICAgICAgICAgc2lnbiA9IC0xXG4gICAgICAgIH1cbiAgICAgICAgbW90aW9uMSA9IG5ldyBsaWIubW90aW9uKHtcbiAgICAgICAgICB2OiBzaWduICogdjEsXG4gICAgICAgICAgYTogLXNpZ24gKiBhMSxcbiAgICAgICAgICBzOiBNYXRoLmFicyhzMSAtIHMwKVxuICAgICAgICB9KVxuICAgICAgICB0MSA9IG1vdGlvbjEudFxuICAgICAgICB2YXIgdGltZUZ1bmN0aW9uMSA9IG1vdGlvbjEuZ2VuZXJhdGVDdWJpY0JlemllcigpXG5cbiAgICAgICAgdjIgPSB2MSAtIGExICogdDFcbiAgICAgICAgYTIgPSAwLjAzICogKHYyIC8gTWF0aC5hYnModjIpKVxuICAgICAgICBtb3Rpb24yID0gbmV3IGxpYi5tb3Rpb24oe1xuICAgICAgICAgIHY6IHYyLFxuICAgICAgICAgIGE6IC1hMlxuICAgICAgICB9KVxuICAgICAgICB0MiA9IG1vdGlvbjIudFxuICAgICAgICBzMiA9IHMxICsgbW90aW9uMi5zXG4gICAgICAgIHZhciB0aW1lRnVuY3Rpb24yID0gbW90aW9uMi5nZW5lcmF0ZUN1YmljQmV6aWVyKClcblxuICAgICAgICBpZiAob3B0aW9ucy5ub0JvdW5jZSkge1xuICAgICAgICAgIGRlYnVnTG9nKCdubyBib3VuY2UgZWZmZWN0JylcblxuICAgICAgICAgIGlmIChzMCAhPT0gczEpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnVzZUZyYW1lQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgIC8vIGZyYW1lXG4gICAgICAgICAgICAgIHZhciBfcyA9IHMxIC0gczBcbiAgICAgICAgICAgICAgdmFyIGJlemllciA9IGxpYi5jdWJpY2JlemllcihcbiAgICAgICAgICAgICAgICB0aW1lRnVuY3Rpb24xWzBdWzBdLFxuICAgICAgICAgICAgICAgIHRpbWVGdW5jdGlvbjFbMF1bMV0sXG4gICAgICAgICAgICAgICAgdGltZUZ1bmN0aW9uMVsxXVswXSxcbiAgICAgICAgICAgICAgICB0aW1lRnVuY3Rpb24xWzFdWzFdXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc2Nyb2xsQW5pbWF0aW9uID0gbmV3IGxpYi5hbmltYXRpb24oXG4gICAgICAgICAgICAgICAgICB0MS50b0ZpeGVkKDApLFxuICAgICAgICAgICAgICAgICAgYmV6aWVyLFxuICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gKHMwICsgX3MgKiBpMilcbiAgICAgICAgICAgICAgICBnZXRUcmFuc2Zvcm1PZmZzZXQodGhhdCwgb2Zmc2V0LnRvRml4ZWQoMikpXG4gICAgICAgICAgICAgICAgZmlyZUV2ZW50KHRoYXQsICdzY3JvbGxpbmcnLCB7XG4gICAgICAgICAgICAgICAgICBhZnRlckZsaWNrOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBzY3JvbGxBbmltYXRpb24ub25lbmQoc2Nyb2xsRW5kKVxuXG4gICAgICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbi5wbGF5KClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGNzc1xuICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gczEudG9GaXhlZCgwKVxuICAgICAgICAgICAgICBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihcbiAgICAgICAgICAgICAgICBzY3JvbGxFbmQsXG4gICAgICAgICAgICAgICAgKHQxIC8gMTAwMCkudG9GaXhlZCgyKSAqIDEwMDBcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRUcmFuc2l0aW9uU3R5bGUoXG4gICAgICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgICAgICAodDEgLyAxMDAwKS50b0ZpeGVkKDIpICsgJ3MnLFxuICAgICAgICAgICAgICAgICdjdWJpYy1iZXppZXIoJyArIHRpbWVGdW5jdGlvbjEgKyAnKSdcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjcm9sbEVuZCgpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHMwICE9PSBzMikge1xuICAgICAgICAgIGRlYnVnTG9nKFxuICAgICAgICAgICAgJ3Njcm9sbCBmb3IgaW5lcnRpYScsXG4gICAgICAgICAgICAncz0nICsgczIudG9GaXhlZCgwKSxcbiAgICAgICAgICAgICd0PScgKyAoKHQxICsgdDIpIC8gMTAwMCkudG9GaXhlZCgyKVxuICAgICAgICAgIClcblxuICAgICAgICAgIGlmIChvcHRpb25zLnVzZUZyYW1lQW5pbWF0aW9uKSB7XG4gICAgICAgICAgICB2YXIgX3MgPSBzMiAtIHMwXG4gICAgICAgICAgICB2YXIgYmV6aWVyID0gbGliLmN1YmljYmV6aWVyLmVhc2VPdXRcbiAgICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbiA9IG5ldyBsaWIuYW5pbWF0aW9uKFxuICAgICAgICAgICAgICAgICh0MSArIHQyKS50b0ZpeGVkKDApLFxuICAgICAgICAgICAgICAgIGJlemllcixcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHMwICsgX3MgKiBpMlxuICAgICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQudG9GaXhlZCgyKSlcbiAgICAgICAgICAgICAgZmlyZUV2ZW50KHRoYXQsICdzY3JvbGxpbmcnLHtcbiAgICAgICAgICAgICAgICBhZnRlckZsaWNrOiB0cnVlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBzY3JvbGxBbmltYXRpb24ub25lbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBpZiAoIXRoYXQuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIF9zID0gczEgLSBzMlxuICAgICAgICAgICAgICB2YXIgYmV6aWVyID0gbGliLmN1YmljYmV6aWVyLmVhc2VcbiAgICAgICAgICAgICAgc2Nyb2xsQW5pbWF0aW9uID0gbmV3IGxpYi5hbmltYXRpb24oXG4gICAgICAgICAgICAgICAgICA0MDAsXG4gICAgICAgICAgICAgICAgICBiZXppZXIsXG4gICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGkxLCBpMikge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBzMiArIF9zICogaTJcbiAgICAgICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQudG9GaXhlZCgyKSlcbiAgICAgICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycse1xuICAgICAgICAgICAgICAgICAgYWZ0ZXJGbGljazogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgc2Nyb2xsQW5pbWF0aW9uLm9uZW5kKHNjcm9sbEVuZClcblxuICAgICAgICAgICAgICBzY3JvbGxBbmltYXRpb24ucGxheSgpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBzY3JvbGxBbmltYXRpb24ucGxheSgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSBzMi50b0ZpeGVkKDApXG4gICAgICAgICAgICBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICBpZiAoIXRoYXQuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZGVidWdMb2coJ2luZXJ0aWFsIGJvdW5jZScsXG4gICAgICAgICAgICAgICAgJ3M9JyArIHMxLnRvRml4ZWQoMCksXG4gICAgICAgICAgICAgICAgJ3Q9NDAwJ1xuICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgaWYgKHMyICE9PSBzMSkge1xuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBzMS50b0ZpeGVkKDApXG4gICAgICAgICAgICAgICAgc2V0VHJhbnNpdGlvblN0eWxlKHRoYXQsICcwLjRzJywgJ2Vhc2UnKVxuICAgICAgICAgICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgICAgICAgICBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihzY3JvbGxFbmQsIDQwMClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY3JvbGxFbmQoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAoKHQxICsgdDIpIC8gMTAwMCkudG9GaXhlZCgyKSAqIDEwMDApXG5cbiAgICAgICAgICAgIHNldFRyYW5zaXRpb25TdHlsZShcbiAgICAgICAgICAgICAgdGhhdCxcbiAgICAgICAgICAgICAgKCh0MSArIHQyKSAvIDEwMDApLnRvRml4ZWQoMikgKyAncycsXG4gICAgICAgICAgICAgICdlYXNlLW91dCdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2Nyb2xsRW5kKClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVidWdMb2coJ2luZXJ0aWFsIGNhbGN1bGF0aW9uIGhhc25cXCd0IGV4Y2VlZGVkIHRoZSBib3VuZGFyeScpXG4gICAgICAgIHZhciB0aW1lRnVuY3Rpb24gPSBtb3Rpb24wLmdlbmVyYXRlQ3ViaWNCZXppZXIoKVxuXG4gICAgICAgIGlmIChvcHRpb25zLnVzZUZyYW1lQW5pbWF0aW9uKSB7XG4gICAgICAgICAgLy8gZnJhbWVcbiAgICAgICAgICB2YXIgX3MgPSBzIC0gczBcbiAgICAgICAgICB2YXIgYmV6aWVyID0gbGliLmN1YmljYmV6aWVyKFxuICAgICAgICAgICAgdGltZUZ1bmN0aW9uWzBdWzBdLFxuICAgICAgICAgICAgdGltZUZ1bmN0aW9uWzBdWzFdLFxuICAgICAgICAgICAgdGltZUZ1bmN0aW9uWzFdWzBdLFxuICAgICAgICAgICAgdGltZUZ1bmN0aW9uWzFdWzFdXG4gICAgICAgICAgKVxuICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbiA9IG5ldyBsaWIuYW5pbWF0aW9uKFxuICAgICAgICAgICAgICB0MC50b0ZpeGVkKDApLFxuICAgICAgICAgICAgICBiZXppZXIsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAoczAgKyBfcyAqIGkyKS50b0ZpeGVkKDIpXG4gICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQpXG4gICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycse1xuICAgICAgICAgICAgICBhZnRlckZsaWNrOiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBzY3JvbGxBbmltYXRpb24ub25lbmQoc2Nyb2xsRW5kKVxuXG4gICAgICAgICAgc2Nyb2xsQW5pbWF0aW9uLnBsYXkoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNzc1xuICAgICAgICAgIHZhciBvZmZzZXQgPSBzLnRvRml4ZWQoMClcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uRW5kSGFuZGxlcihzY3JvbGxFbmQsICh0MCAvIDEwMDApLnRvRml4ZWQoMikgKiAxMDAwKVxuICAgICAgICAgIHNldFRyYW5zaXRpb25TdHlsZShcbiAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAodDAgLyAxMDAwKS50b0ZpeGVkKDIpICsgJ3MnLFxuICAgICAgICAgICAgJ2N1YmljLWJlemllcignICsgdGltZUZ1bmN0aW9uICsgJyknXG4gICAgICAgICAgKVxuICAgICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgfVxuICAgICAgfVxuXG5cbiAgICAgIGlzRmxpY2tTY3JvbGxpbmcgPSB0cnVlXG4gICAgICBpZiAoIW9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgbGliLmFuaW1hdGlvbi5yZXF1ZXN0RnJhbWUoZnVuY3Rpb24gZG9TY3JvbGwoKSB7XG4gICAgICAgICAgaWYgKGlzU2Nyb2xsaW5nICYmIGlzRmxpY2tTY3JvbGxpbmcgJiYgdGhhdC5lbmFibGVkKSB7XG4gICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycsIHtcbiAgICAgICAgICAgICAgYWZ0ZXJGbGljazogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKGRvU2Nyb2xsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY3JvbGxFbmQoKSB7XG4gICAgaWYgKCF0aGF0LmVuYWJsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNhbmNlbFNjcm9sbEVuZCA9IGZhbHNlXG5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghY2FuY2VsU2Nyb2xsRW5kICYmIGlzU2Nyb2xsaW5nKSB7XG4gICAgICAgIGlzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgaXNGbGlja1Njcm9sbGluZyA9IGZhbHNlXG5cbiAgICAgICAgaWYgKG9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgICBzY3JvbGxBbmltYXRpb24gJiYgc2Nyb2xsQW5pbWF0aW9uLnN0b3AoKVxuICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbiA9IG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uU3R5bGUodGhhdCwgJycsICcnKVxuICAgICAgICB9XG4gICAgICAgIGZpcmVFdmVudCh0aGF0LCAnc2Nyb2xsZW5kJylcbiAgICAgIH1cbiAgICB9LCA1MClcbiAgfVxuXG4gIHZhciBwcm90byA9IHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmVuYWJsZSgpXG4gICAgICB0aGlzLnJlZnJlc2goKVxuICAgICAgdGhpcy5zY3JvbGxUbygwKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgc2Nyb2xsQW5pbWF0aW9uICYmIHNjcm9sbEFuaW1hdGlvbi5zdG9wKClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBlbC5zdHlsZVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXVxuICAgICAgICAgICAgPSBnZXRDb21wdXRlZFN0eWxlKGVsKVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBnZXRTY3JvbGxXaWR0aDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLmVsZW1lbnQpLndpZHRoXG4gICAgfSxcblxuICAgIGdldFNjcm9sbEhlaWdodDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLmVsZW1lbnQpLmhlaWdodFxuICAgIH0sXG5cbiAgICBnZXRTY3JvbGxMZWZ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gLWdldFRyYW5zZm9ybU9mZnNldCh0aGlzKS54IC0gdGhpcy5vcHRpb25zLnhQYWRkaW5nVG9wXG4gICAgfSxcblxuICAgIGdldFNjcm9sbFRvcDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIC1nZXRUcmFuc2Zvcm1PZmZzZXQodGhpcykueSAtIHRoaXMub3B0aW9ucy55UGFkZGluZ1RvcFxuICAgIH0sXG5cbiAgICBnZXRNYXhTY3JvbGxMZWZ0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gLXRoYXQubWF4U2Nyb2xsT2Zmc2V0IC0gdGhpcy5vcHRpb25zLnhQYWRkaW5nVG9wXG4gICAgfSxcblxuICAgIGdldE1heFNjcm9sbFRvcDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIC10aGF0Lm1heFNjcm9sbE9mZnNldCAtIHRoaXMub3B0aW9ucy55UGFkZGluZ1RvcFxuICAgIH0sXG5cbiAgICBnZXRCb3VuZGFyeU9mZnNldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIE1hdGguYWJzKFxuICAgICAgICBnZXRCb3VuZGFyeU9mZnNldCh0aGlzLCBnZXRUcmFuc2Zvcm1PZmZzZXQodGhpcylbdGhpcy5heGlzXSkgfHwgMFxuICAgICAgKVxuICAgIH0sXG5cbiAgICByZWZyZXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZWwgPSB0aGlzLmVsZW1lbnRcbiAgICAgIHZhciBpc1ZlcnRpY2FsID0gKHRoaXMuYXhpcyA9PT0gJ3knKVxuICAgICAgdmFyIHR5cGUgPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnXG4gICAgICB2YXIgc2l6ZSwgcmVjdCwgZXh0cmFTaXplXG5cbiAgICAgIGZ1bmN0aW9uIGdldEV4dHJhU2l6ZShlbCwgaXNWZXJ0aWNhbCkge1xuICAgICAgICB2YXIgZXh0cmFUeXBlID0gaXNWZXJ0aWNhbCA/IFsndG9wJywgJ2JvdHRvbSddIDogWydsZWZ0JywgJ3JpZ2h0J11cbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoXG4gICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShlbC5maXJzdEVsZW1lbnRDaGlsZClbJ21hcmdpbi0nICsgZXh0cmFUeXBlWzBdXVxuICAgICAgICApICsgcGFyc2VGbG9hdChcbiAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGVsLmxhc3RFbGVtZW50Q2hpbGQpWydtYXJnaW4tJyArIGV4dHJhVHlwZVsxXV1cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zW3R5cGVdICE9IG51bGwpIHtcbiAgICAgICAgLy8gdXNlIG9wdGlvbnNcbiAgICAgICAgc2l6ZSA9IHRoaXMub3B0aW9uc1t0eXBlXVxuICAgICAgfSBlbHNlIGlmIChlbC5jaGlsZEVsZW1lbnRDb3VudCA8PSAwKSB7XG4gICAgICAgIGVsLnN0eWxlW3R5cGVdID0gJ2F1dG8nXG4gICAgICAgIHNpemUgPSBudWxsXG4gICAgICB9IGVsc2UgaWYgKCEhdGhpcy5vcHRpb25zLnVzZUVsZW1lbnRSZWN0KSB7XG4gICAgICAgIGVsLnN0eWxlW3R5cGVdID0gJ2F1dG8nXG4gICAgICAgIHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWwpXG4gICAgICAgIHNpemUgPSByZWN0W3R5cGVdXG4gICAgICAgIHNpemUgKz0gZ2V0RXh0cmFTaXplKGVsLCBpc1ZlcnRpY2FsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJhbmdlLCByZWN0XG4gICAgICAgIHZhciBmaXJzdEVsID0gZWwuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgdmFyIGxhc3RFbCA9IGVsLmxhc3RFbGVtZW50Q2hpbGRcblxuICAgICAgICBpZiAoZG9jdW1lbnQuY3JlYXRlUmFuZ2UgJiYgIXRoaXMub3B0aW9ucy5pZ25vcmVPdmVyZmxvdykge1xuICAgICAgICAgIC8vIHVzZSByYW5nZVxuICAgICAgICAgIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKVxuICAgICAgICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbClcbiAgICAgICAgICByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHJhbmdlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlY3QpIHtcbiAgICAgICAgICBzaXplID0gcmVjdFt0eXBlXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHVzZSBjaGlsZCBvZmZzZXRzXG4gICAgICAgICAgd2hpbGUgKGZpcnN0RWwpIHtcbiAgICAgICAgICAgIGlmIChnZXRCb3VuZGluZ0NsaWVudFJlY3QoZmlyc3RFbClbdHlwZV0gPT09IDBcbiAgICAgICAgICAgICAgICAmJiBmaXJzdEVsLm5leHRFbGVtZW50U2libGluZykge1xuICAgICAgICAgICAgICBmaXJzdEVsID0gZmlyc3RFbC5uZXh0RWxlbWVudFNpYmxpbmdcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgd2hpbGUgKGxhc3RFbCAmJiBsYXN0RWwgIT09IGZpcnN0RWwpIHtcbiAgICAgICAgICAgIGlmIChnZXRCb3VuZGluZ0NsaWVudFJlY3QobGFzdEVsKVt0eXBlXSA9PT0gMFxuICAgICAgICAgICAgICAgICYmIGxhc3RFbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgIGxhc3RFbCA9IGxhc3RFbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHNpemUgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QobGFzdEVsKVtcbiAgICAgICAgICAgICAgaXNWZXJ0aWNhbCA/ICdib3R0b20nIDogJ3JpZ2h0J11cbiAgICAgICAgICAgIC0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGZpcnN0RWwpW1xuICAgICAgICAgICAgICBpc1ZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCddXG4gICAgICAgIH1cblxuICAgICAgICBzaXplICs9IGdldEV4dHJhU2l6ZShlbCwgaXNWZXJ0aWNhbClcblxuICAgICAgfVxuXG4gICAgICBlbC5zdHlsZVt0eXBlXSA9IHNpemUgPyBzaXplICsgJ3B4JyA6ICdhdXRvJ1xuXG4gICAgICB0aGlzLnRyYW5zZm9ybU9mZnNldCA9IGdldFRyYW5zZm9ybU9mZnNldCh0aGlzKVxuICAgICAgdGhpcy5taW5TY3JvbGxPZmZzZXQgPSBnZXRNaW5TY3JvbGxPZmZzZXQodGhpcylcbiAgICAgIHRoaXMubWF4U2Nyb2xsT2Zmc2V0ID0gZ2V0TWF4U2Nyb2xsT2Zmc2V0KHRoaXMpXG5cbiAgICAgIHRoaXMuc2Nyb2xsVG8oXG4gICAgICAgIC10aGlzLnRyYW5zZm9ybU9mZnNldFt0aGlzLmF4aXNdXG4gICAgICAgIC0gdGhpcy5vcHRpb25zW3RoaXMuYXhpcyArICdQYWRkaW5nVG9wJ11cbiAgICAgIClcbiAgICAgIGZpcmVFdmVudCh0aGlzLCAnY29udGVudHJlZnJlc2gnKVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBvZmZzZXQ6IGZ1bmN0aW9uIChjaGlsZEVsKSB7XG4gICAgICB2YXIgZWxSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRoaXMuZWxlbWVudClcbiAgICAgIHZhciBjaGlsZFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoY2hpbGRFbClcbiAgICAgIGlmICh0aGlzLmF4aXMgPT09ICd5Jykge1xuICAgICAgICB2YXIgb2Zmc2V0UmVjdCA9IHtcbiAgICAgICAgICB0b3A6IGNoaWxkUmVjdC50b3AgLSBlbFJlY3QudG9wIC0gdGhpcy5vcHRpb25zLnlQYWRkaW5nVG9wLFxuICAgICAgICAgIGxlZnQ6IGNoaWxkUmVjdC5sZWZ0IC0gZWxSZWN0LmxlZnQsXG4gICAgICAgICAgcmlnaHQ6IGVsUmVjdC5yaWdodCAtIGNoaWxkUmVjdC5yaWdodCxcbiAgICAgICAgICB3aWR0aDogY2hpbGRSZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2hpbGRSZWN0LmhlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0UmVjdC5ib3R0b20gPSBvZmZzZXRSZWN0LnRvcCArIG9mZnNldFJlY3QuaGVpZ2h0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb2Zmc2V0UmVjdCA9IHtcbiAgICAgICAgICB0b3A6IGNoaWxkUmVjdC50b3AgLSBlbFJlY3QudG9wLFxuICAgICAgICAgIGJvdHRvbTogZWxSZWN0LmJvdHRvbSAtIGNoaWxkUmVjdC5ib3R0b20sXG4gICAgICAgICAgbGVmdDogY2hpbGRSZWN0LmxlZnQgLSBlbFJlY3QubGVmdCAtIHRoaXMub3B0aW9ucy54UGFkZGluZ1RvcCxcbiAgICAgICAgICB3aWR0aDogY2hpbGRSZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2hpbGRSZWN0LmhlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0UmVjdC5yaWdodCA9IG9mZnNldFJlY3QubGVmdCArIG9mZnNldFJlY3Qud2lkdGhcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZmZzZXRSZWN0XG4gICAgfSxcblxuICAgIGdldFJlY3Q6IGZ1bmN0aW9uIChjaGlsZEVsKSB7XG4gICAgICB2YXIgdmlld1JlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGhpcy52aWV3cG9ydClcbiAgICAgIHZhciBjaGlsZFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoY2hpbGRFbClcbiAgICAgIGlmICh0aGlzLmF4aXMgPT09ICd5Jykge1xuICAgICAgICB2YXIgb2Zmc2V0UmVjdCA9IHtcbiAgICAgICAgICB0b3A6IGNoaWxkUmVjdC50b3AgLSB2aWV3UmVjdC50b3AsXG4gICAgICAgICAgbGVmdDogY2hpbGRSZWN0LmxlZnQgLSB2aWV3UmVjdC5sZWZ0LFxuICAgICAgICAgIHJpZ2h0OiB2aWV3UmVjdC5yaWdodCAtIGNoaWxkUmVjdC5yaWdodCxcbiAgICAgICAgICB3aWR0aDogY2hpbGRSZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2hpbGRSZWN0LmhlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0UmVjdC5ib3R0b20gPSBvZmZzZXRSZWN0LnRvcCArIG9mZnNldFJlY3QuaGVpZ2h0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb2Zmc2V0UmVjdCA9IHtcbiAgICAgICAgICB0b3A6IGNoaWxkUmVjdC50b3AgLSB2aWV3UmVjdC50b3AsXG4gICAgICAgICAgYm90dG9tOiB2aWV3UmVjdC5ib3R0b20gLSBjaGlsZFJlY3QuYm90dG9tLFxuICAgICAgICAgIGxlZnQ6IGNoaWxkUmVjdC5sZWZ0IC0gdmlld1JlY3QubGVmdCxcbiAgICAgICAgICB3aWR0aDogY2hpbGRSZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2hpbGRSZWN0LmhlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgb2Zmc2V0UmVjdC5yaWdodCA9IG9mZnNldFJlY3QubGVmdCArIG9mZnNldFJlY3Qud2lkdGhcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZmZzZXRSZWN0XG4gICAgfSxcblxuICAgIGlzSW5WaWV3OiBmdW5jdGlvbiAoY2hpbGRFbCkge1xuICAgICAgdmFyIHZpZXdSZWN0ID0gdGhpcy5nZXRSZWN0KHRoaXMudmlld3BvcnQpXG4gICAgICB2YXIgY2hpbGRSZWN0ID0gdGhpcy5nZXRSZWN0KGNoaWxkRWwpXG4gICAgICBpZiAodGhpcy5heGlzID09PSAneScpIHtcbiAgICAgICAgcmV0dXJuIHZpZXdSZWN0LnRvcCA8IGNoaWxkUmVjdC5ib3R0b21cbiAgICAgICAgICAmJiB2aWV3UmVjdC5ib3R0b20gPiBjaGlsZFJlY3QudG9wXG4gICAgICB9XG4gICAgICByZXR1cm4gdmlld1JlY3QubGVmdCA8IGNoaWxkUmVjdC5yaWdodFxuICAgICAgICAmJiB2aWV3UmVjdC5yaWdodCA+IGNoaWxkUmVjdC5sZWZ0XG4gICAgfSxcblxuICAgIHNjcm9sbFRvOiBmdW5jdGlvbiAob2Zmc2V0LCBpc1Ntb290aCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZWxlbWVudFxuXG4gICAgICBvZmZzZXQgPSAtb2Zmc2V0IC0gdGhpcy5vcHRpb25zW3RoaXMuYXhpcyArICdQYWRkaW5nVG9wJ11cbiAgICAgIG9mZnNldCA9IHRvdWNoQm91bmRhcnkodGhpcywgb2Zmc2V0KVxuXG4gICAgICBpc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIGlmIChpc1Ntb290aCA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnVzZUZyYW1lQW5pbWF0aW9uKSB7XG4gICAgICAgICAgdmFyIHMwID0gZ2V0VHJhbnNmb3JtT2Zmc2V0KHRoYXQpW3RoaXMuYXhpc11cbiAgICAgICAgICB2YXIgX3MgPSBvZmZzZXQgLSBzMFxuICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbiA9IG5ldyBsaWIuYW5pbWF0aW9uKFxuICAgICAgICAgICAgICA0MDAsXG4gICAgICAgICAgICAgIGxpYi5jdWJpY2Jlemllci5lYXNlSW5PdXQsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAoczAgKyBfcyAqIGkyKS50b0ZpeGVkKDIpXG4gICAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQpXG4gICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycpXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHNjcm9sbEFuaW1hdGlvbi5vbmVuZChzY3JvbGxFbmQpXG5cbiAgICAgICAgICBzY3JvbGxBbmltYXRpb24ucGxheSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VHJhbnNpdGlvbkVuZEhhbmRsZXIoc2Nyb2xsRW5kLCA0MDApXG4gICAgICAgICAgc2V0VHJhbnNpdGlvblN0eWxlKHRoYXQsICcwLjRzJywgJ2Vhc2UtaW4tb3V0JylcbiAgICAgICAgICBzZXRUcmFuc2Zvcm1TdHlsZSh0aGF0LCBvZmZzZXQpXG5cbiAgICAgICAgICBmdW5jdGlvbiBfY2FuY2VsU2Nyb2xsKCkge1xuICAgICAgICAgICAgaWYgKGlzU2Nyb2xsaW5nICYmIHRoYXQuZW5hYmxlZCkge1xuICAgICAgICAgICAgICBmaXJlRXZlbnQodGhhdCwgJ3Njcm9sbGluZycpXG4gICAgICAgICAgICAgIGxpYi5hbmltYXRpb24ucmVxdWVzdEZyYW1lKF9jYW5jZWxTY3JvbGwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGliLmFuaW1hdGlvbi5yZXF1ZXN0RnJhbWUoX2NhbmNlbFNjcm9sbClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudXNlRnJhbWVBbmltYXRpb24pIHtcbiAgICAgICAgICBzZXRUcmFuc2l0aW9uU3R5bGUodGhhdCwgJycsICcnKVxuICAgICAgICB9XG4gICAgICAgIHNldFRyYW5zZm9ybVN0eWxlKHRoYXQsIG9mZnNldClcbiAgICAgICAgc2Nyb2xsRW5kKClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgc2Nyb2xsVG9FbGVtZW50OiBmdW5jdGlvbiAoY2hpbGRFbCwgaXNTbW9vdGgsIHRvcE9mZnNldCkge1xuICAgICAgdmFyIG9mZnNldCA9IHRoaXMub2Zmc2V0KGNoaWxkRWwpXG4gICAgICBvZmZzZXQgPSBvZmZzZXRbdGhpcy5heGlzID09PSAneSc/J3RvcCc6J2xlZnQnXVxuICAgICAgdG9wT2Zmc2V0ICYmIChvZmZzZXQgKz0gdG9wT2Zmc2V0KVxuICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG8ob2Zmc2V0LCBpc1Ntb290aClcbiAgICB9LFxuXG4gICAgZ2V0Vmlld1dpZHRoOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHRoaXMudmlld3BvcnQpLndpZHRoXG4gICAgfSxcblxuICAgIGdldFZpZXdIZWlnaHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGhpcy52aWV3cG9ydCkuaGVpZ2h0XG4gICAgfSxcblxuICAgIGFkZFB1bGxkb3duSGFuZGxlcjogZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xuICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3B1bGxkb3duZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5kaXNhYmxlKClcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoYXQsIGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGF0LnNjcm9sbFRvKDAsIHRydWUpXG4gICAgICAgICAgdGhhdC5yZWZyZXNoKClcbiAgICAgICAgICB0aGF0LmVuYWJsZSgpXG4gICAgICAgIH0pXG4gICAgICB9LCBmYWxzZSlcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgYWRkUHVsbHVwSGFuZGxlcjogZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xuXG4gICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncHVsbHVwZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5kaXNhYmxlKClcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoYXQsIGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGF0LnNjcm9sbFRvKHRoYXQuZ2V0U2Nyb2xsSGVpZ2h0KCksIHRydWUpXG4gICAgICAgICAgdGhhdC5yZWZyZXNoKClcbiAgICAgICAgICB0aGF0LmVuYWJsZSgpXG4gICAgICAgIH0pXG4gICAgICB9LCBmYWxzZSlcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgYWRkU2Nyb2xsc3RhcnRIYW5kbGVyOiBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsc3RhcnQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBoYW5kbGVyLmNhbGwodGhhdCwgZSlcbiAgICAgIH0sIGZhbHNlKVxuXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG5cbiAgICBhZGRTY3JvbGxpbmdIYW5kbGVyOiBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsaW5nJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoYXQsIGUpXG4gICAgICB9LCBmYWxzZSlcblxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuXG4gICAgYWRkU2Nyb2xsZW5kSGFuZGxlcjogZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xuICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbGVuZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGF0LCBlKVxuICAgICAgfSwgZmFsc2UpXG5cbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcblxuICAgIGFkZENvbnRlbnRyZW5mcmVzaEhhbmRsZXI6IGZ1bmN0aW9uIChoYW5kbGVyKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjb250ZW50cmVmcmVzaCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGF0LCBlKVxuICAgICAgfSwgZmFsc2UpXG4gICAgfSxcblxuICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIChuYW1lLCBoYW5kbGVyLCB1c2VDYXB0dXJlKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXNcbiAgICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGF0LCBlKVxuICAgICAgfSwgISF1c2VDYXB0dXJlKVxuICAgIH0sXG5cbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBoYW5kbGVyLmNhbGwodGhhdCwgZSlcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGVuYWJsZVBsdWdpbjogZnVuY3Rpb24gKG5hbWUsIG9wdGlvbnMpIHtcbiAgICAgIHZhciBwbHVnaW4gPSBwbHVnaW5zW25hbWVdXG4gICAgICBpZiAocGx1Z2luICYmICF0aGlzLnBsdWdpbnNbbmFtZV0pIHtcbiAgICAgICAgdGhpcy5wbHVnaW5zW25hbWVdID0gdHJ1ZVxuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuICAgICAgICBwbHVnaW4uY2FsbCh0aGlzLCBuYW1lLCBvcHRpb25zKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBrIGluIHByb3RvKSB7XG4gICAgdGhpc1trXSA9IHByb3RvW2tdXG4gIH1cbiAgLy8gZGVsZXRlIHByb3RvXG59XG5cbmxpYi5zY3JvbGwgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEgJiYgIShhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICBvcHRpb25zID0gYXJndW1lbnRzWzBdXG4gICAgaWYgKG9wdGlvbnMuc2Nyb2xsRWxlbWVudCkge1xuICAgICAgZWwgPSBvcHRpb25zLnNjcm9sbEVsZW1lbnRcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuc2Nyb2xsV3JhcCkge1xuICAgICAgZWwgPSBvcHRpb25zLnNjcm9sbFdyYXAuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBzY3JvbGwgZWxlbWVudCcpXG4gICAgfVxuICB9XG5cbiAgaWYgKCFlbC5wYXJlbnROb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd3cm9uZyBkb20gdHJlZScpXG4gIH1cbiAgaWYgKG9wdGlvbnNcbiAgICAgICYmIG9wdGlvbnMuZGlyZWN0aW9uXG4gICAgICAmJiBbJ3gnLCAneSddLmluZGV4T2Yob3B0aW9ucy5kaXJlY3Rpb24pIDwgMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignd3JvbmcgZGlyZWN0aW9uJylcbiAgfVxuXG4gIHZhciBzY3JvbGxcbiAgaWYgKG9wdGlvbnMuZG93bmdyYWRlID09PSB0cnVlXG4gICAgICAmJiBsaWIuc2Nyb2xsLmRvd25ncmFkZSkge1xuICAgIHNjcm9sbCA9IGxpYi5zY3JvbGwuZG93bmdyYWRlKGVsLCBvcHRpb25zKVxuICB9IGVsc2Uge1xuICAgIGlmIChlbC5zY3JvbGxJZCkge1xuICAgICAgc2Nyb2xsID0gc2Nyb2xsT2Jqc1tlbC5zY3JvbGxJZF1cbiAgICB9IGVsc2Uge1xuICAgICAgc2Nyb2xsID0gbmV3IFNjcm9sbChlbCwgb3B0aW9ucylcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNjcm9sbFxufVxuXG5saWIuc2Nyb2xsLnBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lLCBjb25zdHJ1Y3Rvcikge1xuICBpZiAoY29uc3RydWN0b3IpIHtcbiAgICBuYW1lID0gbmFtZS5zcGxpdCgnLCcpXG4gICAgbmFtZS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICBwbHVnaW5zW25dID0gY29uc3RydWN0b3JcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBwbHVnaW5zW25hbWVdXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICcuL3Njcm9sbGFibGUuY3NzJ1xuaW1wb3J0ICcuL3Njcm9sbCdcblxuLy8gbGliLnNjcm9sbCBldmVudHM6XG4vLyAgLSBzY3JvbGxzdGFydFxuLy8gIC0gc2Nyb2xsaW5nXG4vLyAgLSBwdWxsZG93bmVuZFxuLy8gIC0gcHVsbHVwZW5kXG4vLyAgLSBwdWxsbGVmdGVuZFxuLy8gIC0gcHVsbHJpZ2h0ZW5kXG4vLyAgLSBwdWxsZG93blxuLy8gIC0gcHVsbHVwXG4vLyAgLSBwdWxsbGVmdFxuLy8gIC0gcHVsbHJpZ2h0XG4vLyAgLSBjb250ZW50cmVmcmVzaFxuXG5jb25zdCBkaXJlY3Rpb25NYXAgPSB7XG4gIGg6IFsncm93JywgJ2hvcml6b250YWwnLCAnaCcsICd4J10sXG4gIHY6IFsnY29sdW1uJywgJ3ZlcnRpY2FsJywgJ3YnLCAneSddXG59XG5cbmNvbnN0IERFRkFVTFRfRElSRUNUSU9OID0gJ2NvbHVtbidcbmNvbnN0IERFRkFVTFRfTE9BRF9NT1JFX09GRlNFVCA9IDBcblxuZnVuY3Rpb24gcmVmcmVzaFdoZW5Eb21SZW5kZXJlbmQgKGNvbXApIHtcbiAgaWYgKCFjb21wLnJlbmRlcmVuZEhhbmRsZXIpIHtcbiAgICBjb21wLnJlbmRlcmVuZEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjb21wLnNjcm9sbGVyLnJlZnJlc2goKVxuICAgIH1cbiAgfVxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVuZGVyZW5kJywgY29tcC5yZW5kZXJlbmRIYW5kbGVyKVxufVxuXG5mdW5jdGlvbiByZW1vdmVFdmVudHMgKGNvbXApIHtcbiAgaWYgKGNvbXAucmVuZGVyZW5kSGFuZGxlcikge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCBjb21wLnJlbmRlcmVuZEhhbmRsZXIpXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHJvdG8gKFdlZXgpIHtcbiAgY29uc3QgQ29tcG9uZW50ID0gV2VleC5Db21wb25lbnRcblxuICBmdW5jdGlvbiBjcmVhdGUgKG5vZGVUeXBlKSB7XG4gICAgY29uc3QgU2Nyb2xsID0gbGliLnNjcm9sbFxuICAgIGNvbnN0IG5vZGUgPSBDb21wb25lbnQucHJvdG90eXBlLmNyZWF0ZS5jYWxsKHRoaXMsIG5vZGVUeXBlKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1jb250YWluZXInKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnc2Nyb2xsYWJsZS13cmFwJylcbiAgICB0aGlzLnNjcm9sbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgdGhpcy5zY3JvbGxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Njcm9sbGFibGUtZWxlbWVudCcpXG4gICAgdGhpcy5zY3JvbGxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Rpci0nICsgdGhpcy5kaXJlY3Rpb24pXG5cbiAgICB0aGlzLnNjcm9sbEVsZW1lbnQuc3R5bGUud2Via2l0Qm94T3JpZW50ID0gZGlyZWN0aW9uTWFwW3RoaXMuZGlyZWN0aW9uXVsxXVxuICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5zdHlsZS53ZWJraXRGbGV4RGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW3RoaXMuZGlyZWN0aW9uXVswXVxuICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5zdHlsZS5mbGV4RGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwW3RoaXMuZGlyZWN0aW9uXVswXVxuXG4gICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLnNjcm9sbEVsZW1lbnQpXG4gICAgdGhpcy5zY3JvbGxlciA9IG5ldyBTY3JvbGwoe1xuICAgICAgLy8gaWYgdGhlIGRpcmVjdGlvbiBpcyB4LCB0aGVuIHRoZSBib3VuZGluZyByZWN0IG9mIHRoZSBzY3JvbGwgZWxlbWVudFxuICAgICAgLy8gc2hvdWxkIGJlIGdvdCBieSB0aGUgJ1JhbmdlJyBBUEkgb3RoZXIgdGhhbiB0aGUgJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCdcbiAgICAgIC8vIEFQSSwgYmVjYXVzZSB0aGUgd2lkdGggb3V0c2lkZSB0aGUgdmlld3BvcnQgd29uJ3QgYmUgY291bnQgaW4gYnlcbiAgICAgIC8vICdnZXRCb3VuZGluZ0NsaWVudFJlY3QnLlxuICAgICAgLy8gT3RoZXJ3aXNlIHNob3VsZCB1c2UgdGhlIGVsZW1lbnQgcmVjdCBpbiBjYXNlIHRoZXJlIGlzIGEgY2hpbGQgc2Nyb2xsZXJcbiAgICAgIC8vIG9yIGxpc3QgaW4gdGhpcyBzY3JvbGxlci4gSWYgdXNpbmcgJ1JhbmdlJywgdGhlIHdob2xlIHNjcm9sbCBlbGVtZW50XG4gICAgICAvLyBpbmNsdWRpbmcgdGhlIGhpZGluZyBwYXJ0IHdpbGwgYmUgY291bnQgaW4gdGhlIHJlY3QuXG4gICAgICB1c2VFbGVtZW50UmVjdDogdGhpcy5kaXJlY3Rpb24gPT09ICd2JyxcbiAgICAgIHNjcm9sbEVsZW1lbnQ6IHRoaXMuc2Nyb2xsRWxlbWVudCxcbiAgICAgIGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24gPT09ICdoJyA/ICd4JyA6ICd5J1xuICAgIH0pXG4gICAgdGhpcy5zY3JvbGxlci5pbml0KClcbiAgICB0aGlzLm9mZnNldCA9IDBcbiAgICByZXR1cm4gbm9kZVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGRyZW4gKCkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgY29uc3QgcGFyZW50UmVmID0gdGhpcy5kYXRhLnJlZlxuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICBsZXQgaXNGbGV4ID0gZmFsc2VcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2hpbGRyZW5baV0uaW5zdGFuY2VJZCA9IHRoaXMuZGF0YS5pbnN0YW5jZUlkXG4gICAgICAgIGNvbnN0IGNoaWxkID0gY29tcG9uZW50TWFuYWdlci5jcmVhdGVFbGVtZW50KGNoaWxkcmVuW2ldKVxuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjaGlsZC5ub2RlKVxuICAgICAgICBjaGlsZC5wYXJlbnRSZWYgPSBwYXJlbnRSZWZcbiAgICAgICAgaWYgKCFpc0ZsZXhcbiAgICAgICAgICAgICYmIGNoaWxkLmRhdGEuc3R5bGVcbiAgICAgICAgICAgICYmIGNoaWxkLmRhdGEuc3R5bGUuaGFzT3duUHJvcGVydHkoJ2ZsZXgnKVxuICAgICAgICAgICkge1xuICAgICAgICAgIGlzRmxleCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zY3JvbGxFbGVtZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KVxuICAgIH1cbiAgICAvLyB3YWl0IGZvciBmcmFnbWVudCB0byBhcHBlbmRlZCBvbiBzY3JvbGxFbGVtZW50IG9uIFVJIHRocmVhZC5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuc2Nyb2xsZXIucmVmcmVzaCgpXG4gICAgfS5iaW5kKHRoaXMpLCAwKVxuICB9XG5cbiAgZnVuY3Rpb24gYXBwZW5kQ2hpbGQgKGRhdGEpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIGNvbnN0IGNoaWxkID0gY29tcG9uZW50TWFuYWdlci5jcmVhdGVFbGVtZW50KGRhdGEpXG4gICAgdGhpcy5zY3JvbGxFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkLm5vZGUpXG5cbiAgICAvLyB3YWl0IGZvciBVSSB0aHJlYWQgdG8gdXBkYXRlLlxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zY3JvbGxlci5yZWZyZXNoKClcbiAgICB9LmJpbmQodGhpcyksIDApXG5cbiAgICAvLyB1cGRhdGUgdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRhdGEuY2hpbGRyZW4gPSBbZGF0YV1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGRhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkXG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRCZWZvcmUgKGNoaWxkLCBiZWZvcmUpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGxldCBpID0gMFxuICAgIGxldCBpc0FwcGVuZCA9IGZhbHNlXG5cbiAgICAvLyB1cGRhdGUgdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8ICFiZWZvcmUpIHtcbiAgICAgIGlzQXBwZW5kID0gdHJ1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxldCBsXG4gICAgICBmb3IgKGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gYmVmb3JlLmRhdGEucmVmKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT09IGwpIHtcbiAgICAgICAgaXNBcHBlbmQgPSB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQXBwZW5kKSB7XG4gICAgICB0aGlzLnNjcm9sbEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQuZGF0YSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCByZWZyZXNoTG9hZGluZ1BsYWNlaG9sZGVyID0gYmVmb3JlLnJlZnJlc2hQbGFjZWhvbGRlclxuICAgICAgICB8fCBiZWZvcmUubG9hZGluZ1BsYWNlaG9sZGVyXG4gICAgICBpZiAocmVmcmVzaExvYWRpbmdQbGFjZWhvbGRlcikge1xuICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLm5vZGUsIHJlZnJlc2hMb2FkaW5nUGxhY2Vob2xkZXIpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChiZWZvcmUuZml4ZWRQbGFjZWhvbGRlcikge1xuICAgICAgICB0aGlzLnNjcm9sbEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLm5vZGUsIGJlZm9yZS5maXhlZFBsYWNlaG9sZGVyKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoYmVmb3JlLnN0aWNreVBsYWNlaG9sZGVyKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLnN0aWNreVBsYWNlaG9sZGVyKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLm5vZGUpXG4gICAgICB9XG4gICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMCwgY2hpbGQuZGF0YSlcbiAgICB9XG5cbiAgICAvLyB3YWl0IGZvciBVSSB0aHJlYWQgdG8gdXBkYXRlLlxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zY3JvbGxlci5yZWZyZXNoKClcbiAgICB9LmJpbmQodGhpcyksIDApXG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVDaGlsZCAoY2hpbGQpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIC8vIHJlbW92ZSBmcm9tIHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGxldCBpID0gMFxuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGxldCBsXG4gICAgICBmb3IgKGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gY2hpbGQuZGF0YS5yZWYpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA8IGwpIHtcbiAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudE1hcCByZWN1cnNpdmVseVxuICAgIGNvbXBvbmVudE1hbmFnZXIucmVtb3ZlQ29tcG9uZW50KGNoaWxkLmRhdGEucmVmKVxuICAgIGNvbnN0IHJlZnJlc2hMb2FkaW5nUGxhY2Vob2xkZXIgPSBjaGlsZC5yZWZyZXNoUGxhY2Vob2xkZXJcbiAgICAgIHx8IGNoaWxkLmxvYWRpbmdQbGFjZWhvbGRlclxuICAgIGNoaWxkLnVuc2V0UG9zaXRpb24oKVxuICAgIGlmIChyZWZyZXNoTG9hZGluZ1BsYWNlaG9sZGVyKSB7XG4gICAgICB0aGlzLnNjcm9sbEVsZW1lbnQucmVtb3ZlQ2hpbGQocmVmcmVzaExvYWRpbmdQbGFjZWhvbGRlcilcbiAgICB9XG4gICAgY2hpbGQubm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkLm5vZGUpXG5cbiAgICAvLyB3YWl0IGZvciBVSSB0aHJlYWQgdG8gdXBkYXRlLlxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5zY3JvbGxlci5yZWZyZXNoKClcbiAgICB9LmJpbmQodGhpcyksIDApXG4gIH1cblxuICBmdW5jdGlvbiBiaW5kRXZlbnRzIChldnRzKSB7XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5iaW5kRXZlbnRzLmNhbGwodGhpcywgZXZ0cylcbiAgICAvLyB0byBlbmFibGUgbGF6eWxvYWQgZm9yIEltYWdlc1xuICAgIHRoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsaW5nJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNvbnN0IHNvID0gZS5zY3JvbGxPYmpcbiAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHNvLmdldFNjcm9sbFRvcCgpXG4gICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gc28uZ2V0U2Nyb2xsTGVmdCgpXG4gICAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmRpcmVjdGlvbiA9PT0gJ3YnID8gc2Nyb2xsVG9wIDogc2Nyb2xsTGVmdFxuICAgICAgY29uc3QgZGlmZiA9IG9mZnNldCAtIHRoaXMub2Zmc2V0XG4gICAgICBsZXQgZGlyXG4gICAgICBpZiAoZGlmZiA+PSAwKSB7XG4gICAgICAgIGRpciA9IHRoaXMuZGlyZWN0aW9uID09PSAndicgPyAndXAnIDogJ2xlZnQnXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgZGlyID0gdGhpcy5kaXJlY3Rpb24gPT09ICd2JyA/ICdkb3duJyA6ICdyaWdodCdcbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnc2Nyb2xsJywge1xuICAgICAgICBvcmlnaW5hbFR5cGU6ICdzY3JvbGxpbmcnLFxuICAgICAgICBzY3JvbGxUb3A6IHNvLmdldFNjcm9sbFRvcCgpLFxuICAgICAgICBzY3JvbGxMZWZ0OiBzby5nZXRTY3JvbGxMZWZ0KCksXG4gICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICBkaXJlY3Rpb246IGRpclxuICAgICAgfSwge1xuICAgICAgICBidWJibGVzOiB0cnVlXG4gICAgICB9KVxuICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXRcblxuICAgICAgLy8gZmlyZSBsb2FkbW9yZSBldmVudC5cbiAgICAgIGNvbnN0IGxlZnREaXN0ID0gTWF0aC5hYnMoc28ubWF4U2Nyb2xsT2Zmc2V0KSAtIHRoaXMub2Zmc2V0XG4gICAgICBpZiAobGVmdERpc3QgPD0gdGhpcy5sb2FkbW9yZW9mZnNldCAmJiB0aGlzLmlzQXZhaWxhYmxlVG9GaXJlbG9hZG1vcmUpIHtcbiAgICAgICAgdGhpcy5pc0F2YWlsYWJsZVRvRmlyZWxvYWRtb3JlID0gZmFsc2VcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdsb2FkbW9yZScpXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZWZ0RGlzdCA+IHRoaXMubG9hZG1vcmVvZmZzZXQgJiYgIXRoaXMuaXNBdmFpbGFibGVUb0ZpcmVsb2FkbW9yZSkge1xuICAgICAgICB0aGlzLmlzQXZhaWxhYmxlVG9GaXJlbG9hZG1vcmUgPSB0cnVlXG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpKVxuICB9XG5cbiAgZnVuY3Rpb24gb25BcHBlbmQgKCkge1xuICAgIHJlZnJlc2hXaGVuRG9tUmVuZGVyZW5kKHRoaXMpXG4gIH1cblxuICBmdW5jdGlvbiBvblJlbW92ZSAoKSB7XG4gICAgcmVtb3ZlRXZlbnRzKHRoaXMpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0ZSxcbiAgICBjcmVhdGVDaGlsZHJlbixcbiAgICBhcHBlbmRDaGlsZCxcbiAgICBpbnNlcnRCZWZvcmUsXG4gICAgcmVtb3ZlQ2hpbGQsXG4gICAgYmluZEV2ZW50cyxcbiAgICBvbkFwcGVuZCxcbiAgICBvblJlbW92ZVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIGxvYWRtb3Jlb2Zmc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKHZhbCA8IDAgfHwgaXNOYU4odmFsKSkge1xuICAgICAgY29uc29sZS53YXJuKCdbaDUtcmVuZGVyXSBpbnZhbGlkYScpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5sb2FkbW9yZW9mZnNldCA9IHZhbFxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQ29tcG9uZW50ID0gV2VleC5Db21wb25lbnRcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyczpcbiAgLy8gIC0gbG9hZG1vcmVvZmZzZXQ6IHVwZGF0YWJsZVxuICAvLyAgLSBzY3JvbGwtZGlyZWNpdG9uOiBub25lfHZlcnRpY2FsfGhvcml6b250YWwgKGRlZmF1bHQgaXMgdmVydGljYWwpXG4gIC8vICAtIHNob3ctc2Nyb2xsYmFyOiB0cnVlfGZhbHNlIChkZWZhdWx0IGlzIHRydWUpXG4gIGZ1bmN0aW9uIFNjcm9sbGFibGUgKGRhdGEsIG5vZGVUeXBlKSB7XG4gICAgdGhpcy5sb2FkbW9yZW9mZnNldCA9IERFRkFVTFRfTE9BRF9NT1JFX09GRlNFVFxuICAgIHRoaXMuaXNBdmFpbGFibGVUb0ZpcmVsb2FkbW9yZSA9IHRydWVcbiAgICBjb25zdCBhdHRycyA9IGRhdGEuYXR0ciB8fCB7fVxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGF0dHJzLnNjcm9sbERpcmVjdGlvblxuICAgICAgfHwgYXR0cnMuZGlyZWN0aW9uXG4gICAgICB8fCBERUZBVUxUX0RJUkVDVElPTlxuICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uTWFwLmguaW5kZXhPZihkaXJlY3Rpb24pID09PSAtMVxuICAgICAgPyAndidcbiAgICAgIDogJ2gnXG4gICAgdGhpcy5zaG93U2Nyb2xsYmFyID0gYXR0cnMuc2hvd1Njcm9sbGJhciB8fCB0cnVlXG4gICAgQ29tcG9uZW50LmNhbGwodGhpcywgZGF0YSwgbm9kZVR5cGUpXG4gIH1cbiAgU2Nyb2xsYWJsZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG4gIGV4dGVuZChTY3JvbGxhYmxlLnByb3RvdHlwZSwgZ2V0UHJvdG8oV2VleCkpXG4gIGV4dGVuZChTY3JvbGxhYmxlLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIHJldHVybiBTY3JvbGxhYmxlXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgc2Nyb2xsYWJsZU1vZHVsZSBmcm9tICcuLi9zY3JvbGxhYmxlJ1xuXG5jb25zdCBhdmFpbGFibGVDaGlsZHJlblR5cGVzID0gWydjZWxsJywgJ2xvYWRpbmcnLCAncmVmcmVzaCddXG5cbmZ1bmN0aW9uIGdldFByb3RvIChTY3JvbGxhYmxlKSB7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlICgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBTY3JvbGxhYmxlLnByb3RvdHlwZS5jcmVhdGUuY2FsbCh0aGlzKVxuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdsaXN0LXdyYXAnKVxuICAgICAgdGhpcy5zY3JvbGxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpc3QtZWxlbWVudCcpXG4gICAgICByZXR1cm4gbm9kZVxuICAgIH0sXG5cbiAgICBjcmVhdGVDaGlsZHJlbiAoKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlbiB8fCBbXVxuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBjb25zdCB0eXBlID0gZGF0YS50eXBlXG4gICAgICAgIGlmIChhdmFpbGFibGVDaGlsZHJlblR5cGVzLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG4gICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKCdbaDUtcmVuZGVyXSBpbnZhbGlkIGNoaWxkIHR5cGUgXCInXG4gICAgICAgICAgLy8gICArIHR5cGUgKyAnXCIgZm9yIGxpc3QuJylcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1toNS1yZW5kZXJdIGludmFsaWQgY2hpbGQgdHlwZSBcIidcbiAgICAgICAgICAgICsgdHlwZSArICdcIiBmb3IgbGlzdC4nKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIFNjcm9sbGFibGUucHJvdG90eXBlLmNyZWF0ZUNoaWxkcmVuLmNhbGwodGhpcylcbiAgICB9LFxuXG4gICAgYXBwZW5kQ2hpbGQgKGRhdGEpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBkYXRhLnR5cGVcbiAgICAgIGlmIChhdmFpbGFibGVDaGlsZHJlblR5cGVzLmluZGV4T2YodHlwZSkgPT09IC0xKSB7XG4gICAgICAgIC8vIHRocm93IG5ldyBFcnJvcignW2g1LXJlbmRlcl0gaW52YWxpZCBjaGlsZCB0eXBlIFwiJ1xuICAgICAgICAvLyAgICsgdHlwZSArICdcIiBmb3IgbGlzdC4nKVxuICAgICAgICBjb25zb2xlLndhcm4oJ1toNS1yZW5kZXJdIGludmFsaWQgY2hpbGQgdHlwZSBcIidcbiAgICAgICAgICArIHR5cGUgKyAnXCIgZm9yIGxpc3QuJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBTY3JvbGxhYmxlLnByb3RvdHlwZS5hcHBlbmRDaGlsZC5jYWxsKHRoaXMsIGRhdGEpXG4gICAgfSxcblxuICAgIGluc2VydEJlZm9yZSAoY2hpbGQsIGJlZm9yZSkge1xuICAgICAgY29uc3QgdHlwZSA9IGNoaWxkLmRhdGEudHlwZVxuICAgICAgaWYgKGF2YWlsYWJsZUNoaWxkcmVuVHlwZXMuaW5kZXhPZih0eXBlKSA9PT0gLTEpIHtcbiAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKCdbaDUtcmVuZGVyXSBpbnZhbGlkIGNoaWxkIHR5cGUgXCInXG4gICAgICAgIC8vICAgKyB0eXBlICsgJ1wiIGZvciBsaXN0LicpXG4gICAgICAgIGNvbnNvbGUud2FybignW2g1LXJlbmRlcl0gaW52YWxpZCBjaGlsZCB0eXBlIFwiJ1xuICAgICAgICAgICsgdHlwZSArICdcIiBmb3IgbGlzdC4nKVxuICAgICAgfVxuICAgICAgcmV0dXJuIFNjcm9sbGFibGUucHJvdG90eXBlLmluc2VydEJlZm9yZS5jYWxsKHRoaXMsIGNoaWxkLCBiZWZvcmUpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgU2Nyb2xsYWJsZSA9IHNjcm9sbGFibGVNb2R1bGUuaW5pdChXZWV4KVxuICBmdW5jdGlvbiBMaXN0IChkYXRhLCBub2RlVHlwZSkge1xuICAgIFNjcm9sbGFibGUuY2FsbCh0aGlzLCBkYXRhLCBub2RlVHlwZSlcbiAgfVxuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuXG4gIExpc3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTY3JvbGxhYmxlLnByb3RvdHlwZSlcbiAgZXh0ZW5kKExpc3QucHJvdG90eXBlLCBnZXRQcm90byhTY3JvbGxhYmxlKSlcblxuICByZXR1cm4gTGlzdFxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IGxpc3RNb2R1bGUgZnJvbSAnLi9saXN0J1xuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IExpc3QgPSBsaXN0TW9kdWxlLmluaXQoV2VleClcblxuICBmdW5jdGlvbiBWbGlzdCAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBkYXRhLmF0dHIuZGlyZWN0aW9uID0gJ3YnXG4gICAgTGlzdC5jYWxsKHRoaXMsIGRhdGEsIG5vZGVUeXBlKVxuICB9XG4gIFZsaXN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTGlzdC5wcm90b3R5cGUpXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnbGlzdCcsIFZsaXN0KVxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd2bGlzdCcsIFZsaXN0KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IGxpc3RNb2R1bGUgZnJvbSAnLi9saXN0J1xuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IExpc3QgPSBsaXN0TW9kdWxlLmluaXQoV2VleClcblxuICBmdW5jdGlvbiBIbGlzdCAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBkYXRhLmF0dHIuZGlyZWN0aW9uID0gJ2gnXG4gICAgTGlzdC5jYWxsKHRoaXMsIGRhdGEsIG5vZGVUeXBlKVxuICB9XG5cbiAgSGxpc3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShMaXN0LnByb3RvdHlwZSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdobGlzdCcsIEhsaXN0KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFZsaXN0IGZyb20gJy4vdmxpc3QnXG5pbXBvcnQgSGxpc3QgZnJvbSAnLi9obGlzdCdcblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBXZWV4Lmluc3RhbGwoVmxpc3QpXG4gIFdlZXguaW5zdGFsbChIbGlzdClcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBzY3JvbGxhYmxlTW9kdWxlIGZyb20gJy4uL3Njcm9sbGFibGUnXG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgU2Nyb2xsYWJsZSA9IHNjcm9sbGFibGVNb2R1bGUuaW5pdChXZWV4KVxuICBmdW5jdGlvbiBTY3JvbGxlciAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBTY3JvbGxhYmxlLmNhbGwodGhpcywgZGF0YSwgbm9kZVR5cGUpXG4gIH1cbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICBTY3JvbGxlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNjcm9sbGFibGUucHJvdG90eXBlKVxuICBleHRlbmQoU2Nyb2xsZXIucHJvdG90eXBlLCB7XG4gICAgY3JlYXRlICgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBTY3JvbGxhYmxlLnByb3RvdHlwZS5jcmVhdGUuY2FsbCh0aGlzKVxuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCdzY3JvbGxlci13cmFwJylcbiAgICAgIHRoaXMuc2Nyb2xsRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzY3JvbGxlci1lbGVtZW50JylcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuICB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3Njcm9sbGVyJywgU2Nyb2xsZXIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgJy4vcmVmcmVzaC5jc3MnXG5cbmNvbnN0IHBhcmVudHMgPSBbJ3Njcm9sbGVyJywgJ2xpc3QnLCAndmxpc3QnXVxuXG4vLyBPbmx5IGlmIHB1bGxkb3duIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlIGNhbiB0aGlzXG4vLyBjb21wb25lbnQgdHJpZ2dlciB0aGUgJ3JlZnJlc2gnIGV2ZW50LCBvdGhlcndpc2UganVzdCByZWNvdmVyXG4vLyB0byB0aGUgc3RhcnQgcG9pbnQuXG5jb25zdCBERUZBVUxUX0NMQU1QID0gMTMwXG5jb25zdCBERUZBVUxUX0FMSUdOX0lURU1TID0gJ2NlbnRlcidcbmNvbnN0IERFRkFVTFRfSlVTVElGWV9DT05URU5UID0gJ2NlbnRlcidcblxuZnVuY3Rpb24gYWRqdXN0SGVpZ2h0IChyZWZyZXNoLCB2YWwpIHtcbiAgcmVmcmVzaC5ub2RlLnN0eWxlLmhlaWdodCA9IHZhbCArICdweCdcbn1cblxuLy8gZnVuY3Rpb24gYWRKdXN0UG9zaXRpb24gKHJlZnJlc2gsIHZhbCkge1xuLy8gICByZWZyZXNoLm5vZGUuc3R5bGUudG9wID0gLXZhbCArICdweCdcbi8vIH1cblxuZnVuY3Rpb24gaGFuZGxlUmVmcmVzaCAocmVmcmVzaCwgZSkge1xuICByZWZyZXNoLm5vZGUuc3R5bGUuaGVpZ2h0ID0gcmVmcmVzaC5jbGFtcCArICdweCdcbiAgcmVmcmVzaC5kaXNwYXRjaEV2ZW50KCdyZWZyZXNoJylcbiAgcmVmcmVzaC5pc1JlZnJlc2hpbmcgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIHNob3cgKHJlZnJlc2gpIHtcbiAgcmVmcmVzaC5kaXNwbGF5ID0gdHJ1ZVxuICByZWZyZXNoLm5vZGUuc3R5bGUuZGlzcGxheSA9ICctd2Via2l0LWJveCdcbiAgcmVmcmVzaC5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnLXdlYmtpdC1mbGV4J1xuICByZWZyZXNoLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdmbGV4J1xufVxuXG5mdW5jdGlvbiBoaWRlIChyZWZyZXNoKSB7XG4gIHJlZnJlc2guZGlzcGxheSA9IGZhbHNlXG4gIHJlZnJlc2gubm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gIHJlZnJlc2guaXNSZWZyZXNoaW5nID0gZmFsc2Vcbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LXJlZnJlc2gnKVxuICAgIHJldHVybiBub2RlXG4gIH0sXG5cbiAgb25BcHBlbmQgKCkge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KClcbiAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgIGlmIChwYXJlbnRzLmluZGV4T2YocGFyZW50LmRhdGEudHlwZSkgPT09IC0xKSB7XG4gICAgICAvLyBub3QgaW4gYSBzY3JvbGxlciBvciBhIGxpc3RcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB0aGlzLnJlZnJlc2hQbGFjZWhvbGRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGhpcy5yZWZyZXNoUGxhY2Vob2xkZXIuY2xhc3NMaXN0LmFkZCgnd2VleC1yZWZyZXNoLXBsYWNlaG9sZGVyJylcbiAgICB0aGlzLnJlZnJlc2hQbGFjZWhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgdGhpcy5yZWZyZXNoUGxhY2Vob2xkZXIuc3R5bGUud2lkdGggPSAnMHB4J1xuICAgIHRoaXMucmVmcmVzaFBsYWNlaG9sZGVyLnN0eWxlLmhlaWdodCA9ICcwcHgnXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IHBhcmVudC5zY3JvbGxFbGVtZW50IHx8IHBhcmVudC5saXN0RWxlbWVudFxuICAgIHNjcm9sbEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMucmVmcmVzaFBsYWNlaG9sZGVyLCB0aGlzLm5vZGUpXG4gICAgcGFyZW50Lm5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKVxuICAgIHBhcmVudC5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCdwdWxsZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoc2VsZi5pc1JlZnJlc2hpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBhZGp1c3RIZWlnaHQoc2VsZiwgTWF0aC5hYnMoZS5zY3JvbGxPYmouZ2V0U2Nyb2xsVG9wKCkpKVxuICAgICAgaWYgKCFzZWxmLmRpc3BsYXkpIHtcbiAgICAgICAgc2hvdyhzZWxmKVxuICAgICAgfVxuICAgIH0pXG4gICAgcGFyZW50LnNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3B1bGxkb3duZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChzZWxmLmlzUmVmcmVzaGluZykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvcCA9IE1hdGguYWJzKGUuc2Nyb2xsT2JqLmdldFNjcm9sbFRvcCgpKVxuICAgICAgaWYgKHRvcCA+IHNlbGYuY2xhbXApIHtcbiAgICAgICAgaGFuZGxlUmVmcmVzaChzZWxmLCBlKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGhpZGUoc2VsZilcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIGRpc3BsYXk6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAodmFsID09PSAnc2hvdycpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzaG93KHRoaXMpXG4gICAgICB9LmJpbmQodGhpcyksIDApXG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbCA9PT0gJ2hpZGUnKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaGlkZSh0aGlzKVxuICAgICAgfS5iaW5kKHRoaXMpLCAwKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIGF0dHIgXFwnZGlzcGxheVxcJyBvZiA8cmVmcmVzaD5cXCc6IHZhbHVlICdcbiAgICAgICAgKyB2YWxcbiAgICAgICAgKyAnIGlzIGludmFsaWQuIFNob3VsZCBiZSBcXCdzaG93XFwnIG9yIFxcJ2hpZGVcXCcnKVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBzdHlsZSA9IHtcbiAgaGVpZ2h0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdmFsID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKGlzTmFOKHZhbCkgfHwgdmFsIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignW2g1LXJlbmRlcl0gPHJlZnJlc2g+XFwncyBoZWlnaHQgKCcgKyB2YWwgKyAnKSBpcyBpbnZhbGlkLicpXG4gICAgfVxuICAgIHRoaXMuY2xhbXAgPSB2YWxcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IFdlZXguQ29tcG9uZW50XG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgZnVuY3Rpb24gUmVmcmVzaCAoZGF0YSkge1xuICAgIHRoaXMuaXNSZWZyZXNoaW5nID0gZmFsc2VcbiAgICB0aGlzLmNsYW1wID0gZGF0YS5zdHlsZS5oZWlnaHQgfHwgREVGQVVMVF9DTEFNUFxuICAgICFkYXRhLnN0eWxlLmFsaWduSXRlbXMgJiYgKGRhdGEuc3R5bGUuYWxpZ25JdGVtcyA9IERFRkFVTFRfQUxJR05fSVRFTVMpXG4gICAgIWRhdGEuc3R5bGUuanVzdGlmeUNvbnRlbnRcbiAgICAgICYmIChkYXRhLnN0eWxlLmp1c3RpZnlDb250ZW50ID0gREVGQVVMVF9KVVNUSUZZX0NPTlRFTlQpXG4gICAgQ29tcG9uZW50LmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBSZWZyZXNoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tcG9uZW50LnByb3RvdHlwZSlcbiAgZXh0ZW5kKFJlZnJlc2gucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKFJlZnJlc2gucHJvdG90eXBlLCB7IGF0dHIgfSlcbiAgZXh0ZW5kKFJlZnJlc2gucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdyZWZyZXNoJywgUmVmcmVzaClcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICcuL2xvYWRpbmcuY3NzJ1xuXG5jb25zdCBwYXJlbnRzID0gWydzY3JvbGxlcicsICdsaXN0JywgJ3ZsaXN0J11cblxuY29uc3QgREVGQVVMVF9DTEFNUCA9IDEzMFxuY29uc3QgREVGQVVMVF9BTElHTl9JVEVNUyA9ICdjZW50ZXInXG5jb25zdCBERUZBVUxUX0pVU1RJRllfQ09OVEVOVCA9ICdjZW50ZXInXG5cbmZ1bmN0aW9uIGFkanVzdEhlaWdodCAobG9hZGluZywgdmFsKSB7XG4gIGxvYWRpbmcubm9kZS5zdHlsZS5oZWlnaHQgPSB2YWwgKyAncHgnXG59XG5cbmZ1bmN0aW9uIGhhbmRsZUxvYWRpbmcgKGxvYWRpbmcsIGUpIHtcbiAgbG9hZGluZy5ub2RlLnN0eWxlLmhlaWdodCA9IGxvYWRpbmcuY2xhbXAgKyAncHgnXG4gIGxvYWRpbmcuZGlzcGF0Y2hFdmVudCgnbG9hZGluZycpXG4gIGxvYWRpbmcuaXNMb2FkaW5nID0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBzaG93IChsb2FkaW5nKSB7XG4gIGxvYWRpbmcuZGlzcGxheSA9IHRydWVcbiAgbG9hZGluZy5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnLXdlYmtpdC1ib3gnXG4gIGxvYWRpbmcubm9kZS5zdHlsZS5kaXNwbGF5ID0gJy13ZWJraXQtZmxleCdcbiAgbG9hZGluZy5ub2RlLnN0eWxlLmRpc3BsYXkgPSAnZmxleCdcbn1cblxuZnVuY3Rpb24gaGlkZSAobG9hZGluZykge1xuICBsb2FkaW5nLmRpc3BsYXkgPSBmYWxzZVxuICBsb2FkaW5nLm5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICBsb2FkaW5nLmlzTG9hZGluZyA9IGZhbHNlXG59XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1jb250YWluZXInKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1sb2FkaW5nJylcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIG9uQXBwZW5kICgpIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpXG4gICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICBjb25zdCBzY3JvbGxXcmFwSGVpZ2h0ID0gcGFyZW50Lm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0XG4gICAgaWYgKHBhcmVudHMuaW5kZXhPZihwYXJlbnQuZGF0YS50eXBlKSA9PT0gLTEpIHtcbiAgICAgIC8vIG5vdCBpbiBhIHNjcm9sbGVyIG9yIGEgbGlzdFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMubG9hZGluZ1BsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0aGlzLmxvYWRpbmdQbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKCd3ZWV4LWxvYWRpbmctcGxhY2Vob2xkZXInKVxuICAgIHRoaXMubG9hZGluZ1BsYWNlaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICB0aGlzLmxvYWRpbmdQbGFjZWhvbGRlci5zdHlsZS53aWR0aCA9ICcwcHgnXG4gICAgdGhpcy5sb2FkaW5nUGxhY2Vob2xkZXIuc3R5bGUuaGVpZ2h0ID0gJzBweCdcbiAgICBjb25zdCBzY3JvbGxFbGVtZW50ID0gcGFyZW50LnNjcm9sbEVsZW1lbnQgfHwgcGFyZW50Lmxpc3RFbGVtZW50XG4gICAgc2Nyb2xsRWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5sb2FkaW5nUGxhY2Vob2xkZXIsIHRoaXMubm9kZSlcbiAgICBwYXJlbnQubm9kZS5hcHBlbmRDaGlsZCh0aGlzLm5vZGUpXG4gICAgcGFyZW50LnNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3B1bGx1cCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoc2VsZi5pc0xvYWRpbmcpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjb25zdCBvYmogPSBlLnNjcm9sbE9ialxuICAgICAgYWRqdXN0SGVpZ2h0KHNlbGYsIE1hdGguYWJzKFxuICAgICAgICBvYmouZ2V0U2Nyb2xsSGVpZ2h0KCkgLSBvYmouZ2V0U2Nyb2xsVG9wKCkgLSBzY3JvbGxXcmFwSGVpZ2h0KSlcbiAgICAgIGlmICghc2VsZi5kaXNwbGF5KSB7XG4gICAgICAgIHNob3coc2VsZilcbiAgICAgIH1cbiAgICB9KVxuICAgIHBhcmVudC5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCdwdWxsdXBlbmQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKHNlbGYuaXNMb2FkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaGFuZGxlTG9hZGluZyhzZWxmLCBlKVxuICAgIH0pXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgZGlzcGxheTogZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmICh2YWwgPT09ICdzaG93Jykge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNob3codGhpcylcbiAgICAgIH0uYmluZCh0aGlzKSwgMClcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsID09PSAnaGlkZScpIHtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBoaWRlKHRoaXMpXG4gICAgICB9LmJpbmQodGhpcyksIDApXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gYXR0ciBcXCdkaXNwbGF5XFwnIG9mIDxyZWZyZXNoPlxcJzogdmFsdWUgJ1xuICAgICAgICArIHZhbFxuICAgICAgICArICcgaXMgaW52YWxpZC4gU2hvdWxkIGJlIFxcJ3Nob3dcXCcgb3IgXFwnaGlkZVxcJycpXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHN0eWxlID0ge1xuICBoZWlnaHQ6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbCkgfHwgdmFsIDwgMCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignW2g1LXJlbmRlcl0gPGxvYWRpbmc+XFwncyBoZWlnaHQgKCcgKyB2YWwgKyAnKSBpcyBpbnZhbGlkLicpXG4gICAgfVxuICAgIHRoaXMuY2xhbXAgPSB2YWxcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IENvbXBvbmVudCA9IFdlZXguQ29tcG9uZW50XG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgZnVuY3Rpb24gTG9hZGluZyAoZGF0YSkge1xuICAgIHRoaXMuY2xhbXAgPSAoZGF0YS5zdHlsZS5oZWlnaHQgfHwgREVGQVVMVF9DTEFNUClcbiAgICAhZGF0YS5zdHlsZS5hbGlnbkl0ZW1zICYmIChkYXRhLnN0eWxlLmFsaWduSXRlbXMgPSBERUZBVUxUX0FMSUdOX0lURU1TKVxuICAgICFkYXRhLnN0eWxlLmp1c3RpZnlDb250ZW50XG4gICAgICAmJiAoZGF0YS5zdHlsZS5qdXN0aWZ5Q29udGVudCA9IERFRkFVTFRfSlVTVElGWV9DT05URU5UKVxuICAgIENvbXBvbmVudC5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgTG9hZGluZy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG4gIGV4dGVuZChMb2FkaW5nLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChMb2FkaW5nLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIGV4dGVuZChMb2FkaW5nLnByb3RvdHlwZSwge1xuICAgIHN0eWxlOiBleHRlbmQoT2JqZWN0LmNyZWF0ZShDb21wb25lbnQucHJvdG90eXBlLnN0eWxlKSwgc3R5bGUpXG4gIH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnbG9hZGluZycsIExvYWRpbmcpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgbGlzdCBmcm9tICcuL2xpc3QnXG5pbXBvcnQgc2Nyb2xsZXIgZnJvbSAnLi9zY3JvbGxlcidcbmltcG9ydCByZWZyZXNoIGZyb20gJy4vcmVmcmVzaCdcbmltcG9ydCBsb2FkaW5nIGZyb20gJy4vbG9hZGluZydcblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXguaW5zdGFsbChsaXN0KVxuICAgIFdlZXguaW5zdGFsbChzY3JvbGxlcilcbiAgICBXZWV4Lmluc3RhbGwocmVmcmVzaClcbiAgICBXZWV4Lmluc3RhbGwobG9hZGluZylcbiAgfVxufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuO1xuLyogZXNsaW50LWVuYWJsZSAqL1xuIiwiKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSAmJiAod2luZG93ID0ge2N0cmw6IHt9LCBsaWI6IHt9fSk7IXdpbmRvdy5jdHJsICYmICh3aW5kb3cuY3RybCA9IHt9KTshd2luZG93LmxpYiAmJiAod2luZG93LmxpYiA9IHt9KTshZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYixjLGQpe2Z1bmN0aW9uIGUoYSl7cmV0dXJuKDMqayphKzIqbCkqYSttfWZ1bmN0aW9uIGYoYSl7cmV0dXJuKChrKmErbCkqYSttKSphfWZ1bmN0aW9uIGcoYSl7cmV0dXJuKChuKmErbykqYStwKSphfWZ1bmN0aW9uIGgoYSl7Zm9yKHZhciBiLGMsZD1hLGc9MDs4Pmc7ZysrKXtpZihjPWYoZCktYSxNYXRoLmFicyhjKTxqKXJldHVybiBkO2lmKGI9ZShkKSxNYXRoLmFicyhiKTxqKWJyZWFrO2QtPWMvYn12YXIgaD0xLGk9MDtmb3IoZD1hO2g+aTspe2lmKGM9ZihkKS1hLE1hdGguYWJzKGMpPGopcmV0dXJuIGQ7Yz4wP2g9ZDppPWQsZD0oaCtpKS8yfXJldHVybiBkfWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGcoaChhKSl9dmFyIGo9MWUtNixrPTMqYS0zKmMrMSxsPTMqYy02KmEsbT0zKmEsbj0zKmItMypkKzEsbz0zKmQtNipiLHA9MypiO3JldHVybiBpfWIuY3ViaWNiZXppZXI9YyxiLmN1YmljYmV6aWVyLmxpbmVhcj1jKDAsMCwxLDEpLGIuY3ViaWNiZXppZXIuZWFzZT1jKC4yNSwuMSwuMjUsMSksYi5jdWJpY2Jlemllci5lYXNlSW49YyguNDIsMCwxLDEpLGIuY3ViaWNiZXppZXIuZWFzZU91dD1jKDAsMCwuNTgsMSksYi5jdWJpY2Jlemllci5lYXNlSW5PdXQ9YyguNDIsMCwuNTgsMSl9KHdpbmRvdyx3aW5kb3cubGlifHwod2luZG93LmxpYj17fSkpOzttb2R1bGUuZXhwb3J0cyA9IHdpbmRvdy5saWJbJ2N1YmljYmV6aWVyJ107IiwiKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSAmJiAod2luZG93ID0ge2N0cmw6IHt9LCBsaWI6IHt9fSk7IXdpbmRvdy5jdHJsICYmICh3aW5kb3cuY3RybCA9IHt9KTshd2luZG93LmxpYiAmJiAod2luZG93LmxpYiA9IHt9KTshZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBzZXRUaW1lb3V0KGEsbCl9ZnVuY3Rpb24gZChhKXtjbGVhclRpbWVvdXQoYSl9ZnVuY3Rpb24gZSgpe3ZhciBhPXt9LGI9bmV3IG0oZnVuY3Rpb24oYixjKXthLnJlc29sdmU9YixhLnJlamVjdD1jfSk7cmV0dXJuIGEucHJvbWlzZT1iLGF9ZnVuY3Rpb24gZihhLGIpe3JldHVybltcInRoZW5cIixcImNhdGNoXCJdLmZvckVhY2goZnVuY3Rpb24oYyl7YltjXT1mdW5jdGlvbigpe3JldHVybiBhW2NdLmFwcGx5KGEsYXJndW1lbnRzKX19KSxifWZ1bmN0aW9uIGcoYil7dmFyIGMsZCxoPSExO3RoaXMucmVxdWVzdD1mdW5jdGlvbigpe2g9ITE7dmFyIGc9YXJndW1lbnRzO3JldHVybiBjPWUoKSxmKGMucHJvbWlzZSx0aGlzKSxkPW4oZnVuY3Rpb24oKXtofHxjJiZjLnJlc29sdmUoYi5hcHBseShhLGcpKX0pLHRoaXN9LHRoaXMuY2FuY2VsPWZ1bmN0aW9uKCl7cmV0dXJuIGQmJihoPSEwLG8oZCksYyYmYy5yZWplY3QoXCJDQU5DRUxcIikpLHRoaXN9LHRoaXMuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGcoYil9fWZ1bmN0aW9uIGgoYSxiKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBiJiYoYj17MDpifSk7Zm9yKHZhciBjPWEvbCxkPTEvYyxlPVtdLGY9T2JqZWN0LmtleXMoYikubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBwYXJzZUludChhKX0pLGg9MDtjPmg7aCsrKXt2YXIgaT1mWzBdLGo9ZCpoO2lmKG51bGwhPWkmJjEwMCpqPj1pKXt2YXIgaz1iW1wiXCIraV07ayBpbnN0YW5jZW9mIGd8fChrPW5ldyBnKGspKSxlLnB1c2goayksZi5zaGlmdCgpfWVsc2UgZS5sZW5ndGgmJmUucHVzaChlW2UubGVuZ3RoLTFdLmNsb25lKCkpfXJldHVybiBlfWZ1bmN0aW9uIGkoYSl7dmFyIGM7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGF8fGEgaW5zdGFuY2VvZiBBcnJheT9iLmN1YmljYmV6aWVyP1wic3RyaW5nXCI9PXR5cGVvZiBhP2IuY3ViaWNiZXppZXJbYV0mJihjPWIuY3ViaWNiZXppZXJbYV0pOmEgaW5zdGFuY2VvZiBBcnJheSYmND09PWEubGVuZ3RoJiYoYz1iLmN1YmljYmV6aWVyLmFwcGx5KGIuY3ViaWNiZXppZXIsYSkpOmNvbnNvbGUuZXJyb3IoXCJyZXF1aXJlIGxpYi5jdWJpY2JlemllclwiKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiYoYz1hKSxjfWZ1bmN0aW9uIGooYSxiLGMpe3ZhciBkLGc9aChhLGMpLGo9MS8oYS9sKSxrPTAsbT1pKGIpO2lmKCFtKXRocm93IG5ldyBFcnJvcihcInVuZXhjZXB0IHRpbWluZyBmdW5jdGlvblwiKTt2YXIgbj0hMTt0aGlzLnBsYXk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIGM9aiooaysxKS50b0ZpeGVkKDEwKSxlPWdba107ZS5yZXF1ZXN0KGMudG9GaXhlZCgxMCksYihjKS50b0ZpeGVkKDEwKSkudGhlbihmdW5jdGlvbigpe24mJihrPT09Zy5sZW5ndGgtMT8obj0hMSxkJiZkLnJlc29sdmUoXCJGSU5JU0hcIiksZD1udWxsKTooaysrLGEoKSkpfSxmdW5jdGlvbigpe30pfWlmKCFuKXJldHVybiBuPSEwLGR8fChkPWUoKSxmKGQucHJvbWlzZSx0aGlzKSksYSgpLHRoaXN9LHRoaXMuc3RvcD1mdW5jdGlvbigpe3JldHVybiBuPyhuPSExLGdba10mJmdba10uY2FuY2VsKCksdGhpcyk6dm9pZCAwfX12YXIgaz02MCxsPTFlMy9rLG09YS5Qcm9taXNlfHxiLnByb21pc2UmJmIucHJvbWlzZS5FUzZQcm9taXNlLG49d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxjLG89d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNDYW5jZWxBbmltYXRpb25GcmFtZXx8d2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWV8fGQ7KG49PT1jfHxvPT09ZCkmJihuPWMsbz1kKSxiLmFuaW1hdGlvbj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBqKGEsYixjKX0sYi5hbmltYXRpb24uZnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBnKGEpfSxiLmFuaW1hdGlvbi5yZXF1ZXN0RnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGcoYSk7cmV0dXJuIGIucmVxdWVzdCgpfX0od2luZG93LHdpbmRvdy5saWJ8fCh3aW5kb3cubGliPXt9KSk7O21vZHVsZS5leHBvcnRzID0gd2luZG93LmxpYlsnYW5pbWF0aW9uJ107IiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgX2ZhbGxiYWNrID0gZmFsc2VcblxudmFyIHJhZiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgfHwgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZVxuaWYgKCFyYWYpIHtcbiAgX2ZhbGxiYWNrID0gdHJ1ZVxuICByYWYgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gc2V0VGltZW91dChjYWxsYmFjaywgMTYpXG4gIH1cbn1cbnZhciBjYWYgPSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWVcbiAgfHwgd2luZG93LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lXG5pZiAoIWNhZiAmJiBfZmFsbGJhY2spIHtcbiAgY2FmID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIGNsZWFyVGltZW91dChpZClcbiAgfVxufSBlbHNlIGlmICghY2FmKSB7XG4gIGNhZiA9IGZ1bmN0aW9uKCkge31cbn1cblxudmFyIE1BWCA9IChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCBNYXRoLnBvdygyLCA1MykgLSAxKSAtIDFcblxudmFyIF9pZE1hcCA9IHt9XG52YXIgX2dsb2JhbElkID0gMFxuXG5mdW5jdGlvbiBfZ2V0R2xvYmFsSWQoKSB7XG4gIF9nbG9iYWxJZCA9IChfZ2xvYmFsSWQgKyAxKSAlIE1BWFxuICBpZiAoX2lkTWFwW19nbG9iYWxJZF0pIHtcbiAgICByZXR1cm4gX2dldEdsb2JhbElkKClcbiAgfVxuICByZXR1cm4gX2dsb2JhbElkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRUaW1lb3V0IChjYiwgbXMpIHtcbiAgdmFyIGlkID0gX2dldEdsb2JhbElkKClcbiAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKVxuICBfaWRNYXBbaWRdID0gcmFmKGZ1bmN0aW9uIGxvb3AoKSB7XG4gICAgaWYgKCFfaWRNYXBbaWRdICYmIF9pZE1hcFtpZF0gIT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YXIgaW5kID0gRGF0ZS5ub3coKSAtIHN0YXJ0XG4gICAgaWYgKGluZCA8IG1zKSB7XG4gICAgICBfaWRNYXBbaWRdID0gcmFmKGxvb3ApXG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSBfaWRNYXBbaWRdXG4gICAgICBjYigpXG4gICAgfVxuICB9KVxuICByZXR1cm4gaWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyVGltZW91dCAoaWQpIHtcbiAgdmFyIHRpZCA9IF9pZE1hcFtpZF1cbiAgdGlkICYmIGNhZih0aWQpXG4gIGRlbGV0ZSBfaWRNYXBbaWRdXG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5cblxuJ3VzZSBzdHJpY3QnXG5cbi8vIHJlcXVpcmUoJy4vZ2VzdHVyZScpXG5pbXBvcnQgJ2N1YmljYmV6aWVyJ1xuaW1wb3J0ICdhbmltYXRpb25qcydcbmltcG9ydCAnLi9jYXJyb3VzZWwuY3NzJ1xuXG52YXIgZG9jID0gd2luZG93LmRvY3VtZW50XG52YXIgdWEgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudFxudmFyIEZpcmVmb3ggPSAhIXVhLm1hdGNoKC9GaXJlZm94L2kpXG52YXIgSUVNb2JpbGUgPSAhIXVhLm1hdGNoKC9JRU1vYmlsZS9pKVxudmFyIGNzc1ByZWZpeCA9IEZpcmVmb3ggPyAnLW1vei0nIDogSUVNb2JpbGUgPyAnLW1zLScgOiAnLXdlYmtpdC0nXG52YXIgc3R5bGVQcmVmaXggPSBGaXJlZm94ID8gJ01veicgOiBJRU1vYmlsZSA/ICdtcycgOiAnd2Via2l0J1xuXG5pbXBvcnQgKiBhcyB0aW1lciBmcm9tICcuL3RpbWVyJ1xudmFyIHNldFRpbWVvdXQgPSB0aW1lci5zZXRUaW1lb3V0XG52YXIgY2xlYXJUaW1lb3V0ID0gdGltZXIuY2xlYXJUaW1lb3V0XG5cbmZ1bmN0aW9uIGdldFRyYW5zZm9ybU9mZnNldChlbGVtZW50KSB7XG4gIHZhciBvZmZzZXQgPSB7IHg6IDAsIHk6IDAgfVxuICB2YXIgdHJhbnNmb3JtID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXVxuICB2YXIgcmVnTWF0cml4M2QgPSBuZXcgUmVnRXhwKCdebWF0cml4M2RcXFxcKCg/OlstXFxcXGQuXSssXFxcXHMqKXsxMn0oWy1cXFxcZC5dKyksJ1xuICAgICsgJ1xcXFxzKihbLVxcXFxkLl0rKSg/OixcXFxccypbLVxcXFxkLl0rKXsyfVxcXFwpJylcbiAgdmFyIHJlZ01hdHJpeCA9IC9ebWF0cml4XFwoKD86Wy1cXGQuXSssXFxzKil7NH0oWy1cXGQuXSspLFxccyooWy1cXGQuXSspXFwpJC9cbiAgdmFyIG1hdGNoZWRcblxuICBpZiAodHJhbnNmb3JtICE9PSAnbm9uZScpIHtcbiAgICBpZiAoKG1hdGNoZWQgPSB0cmFuc2Zvcm0ubWF0Y2gocmVnTWF0cml4M2QpXG4gICAgICB8fCB0cmFuc2Zvcm0ubWF0Y2gocmVnTWF0cml4KSkpIHtcbiAgICAgIG9mZnNldC54ID0gcGFyc2VGbG9hdChtYXRjaGVkWzFdKSB8fCAwXG4gICAgICBvZmZzZXQueSA9IHBhcnNlRmxvYXQobWF0Y2hlZFsyXSkgfHwgMFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRcbn1cblxudmFyIENTU01hdHJpeCA9IElFTW9iaWxlID8gJ01TQ1NTTWF0cml4JyA6ICdXZWJLaXRDU1NNYXRyaXgnXG52YXIgaGFzM2QgPSAhIUZpcmVmb3ggfHwgQ1NTTWF0cml4IGluIHdpbmRvdyAmJiAnbTExJyBpbiBuZXcgd2luZG93W0NTU01hdHJpeF0oKVxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRlKHgsIHkpIHtcbiAgeCA9IHBhcnNlRmxvYXQoeClcbiAgeSA9IHBhcnNlRmxvYXQoeSlcblxuICBpZiAoeCAhPSAwKSB7XG4gICAgeCArPSAncHgnXG4gIH1cblxuICBpZiAoeSAhPSAwKSB7XG4gICAgeSArPSAncHgnXG4gIH1cblxuICBpZiAoaGFzM2QpIHtcbiAgICByZXR1cm4gJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJywgJyArIHkgKyAnLCAwKSdcbiAgfVxuXG4gIHJldHVybiAndHJhbnNsYXRlKCcgKyB4ICsgJywgJyArIHkgKyAnKSdcbn1cblxudmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG5mdW5jdGlvbiBBcnJheUZyb20oYSkge1xuICByZXR1cm4gc2xpY2UuY2FsbChhKVxufVxuXG52YXIgaW5jSWQgPSAwXG5mdW5jdGlvbiBDYXJyb3VzZWwoZWxlbWVudCwgb3B0aW9ucykge1xuICB2YXIgdGhhdCA9IHRoaXNcbiAgdmFyIHZpZXdzID0gW11cbiAgdmFyIHBhZ2VzID0ge31cbiAgdmFyIGlkID0gRGF0ZS5ub3coKSArICctJyArICgrK2luY0lkKVxuICB2YXIgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxICYmICEoYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgb3B0aW9ucyA9IGFyZ3VtZW50c1swXVxuICAgIGVsZW1lbnQgPSBudWxsXG4gIH1cblxuICBpZiAoIWVsZW1lbnQpIHtcbiAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKVxuICAgIHJvb3QuYXBwZW5kQ2hpbGQoZWxlbWVudClcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fVxuXG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWN0cmwtbmFtZScsICdjYXJyb3VzZWwnKVxuICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1jdHJsLWlkJywgaWQpXG5cbiAgZnVuY3Rpb24gZmlyZUV2ZW50KG5hbWUsIGV4dHJhKSB7XG4gICAgdmFyIGV2ID0gZG9jLmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJylcbiAgICBldi5pbml0RXZlbnQobmFtZSwgZmFsc2UsIGZhbHNlKVxuICAgIGlmIChleHRyYSkge1xuICAgICAgZm9yICh2YXIga2V5IGluIGV4dHJhKSB7XG4gICAgICAgIGV2W2tleV0gPSBleHRyYVtrZXldXG4gICAgICB9XG4gICAgfVxuICAgIHJvb3QuZGlzcGF0Y2hFdmVudChldilcbiAgfVxuXG4gIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnXG4gIGVsZW1lbnQuc3R5bGVbc3R5bGVQcmVmaXggKyAnVHJhbnNmb3JtJ10gPSBnZXRUcmFuc2xhdGUoMCwgMClcblxuICB2YXIgdHJhbnNmb3JtT2Zmc2V0ID0gMFxuICB2YXIgaXRlbXMgPSB7fVxuICB2YXIgaXRlbUxlbmd0aCA9IDBcbiAgdmFyIGl0ZW1TdGVwID0gb3B0aW9ucy5zdGVwIHx8IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGhcbiAgdmFyIGl0ZW1JbmRleCA9IDBcblxuICBpdGVtcy5hZGQgPSBmdW5jdGlvbiAoaHRtbCkge1xuICAgIHZhciBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJylcbiAgICBsaS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgbGkuc3R5bGUuZmxvYXQgPSAnbGVmdCdcbiAgICBsaS5pbmRleCA9IGl0ZW1MZW5ndGhcbiAgICBpZiAodHlwZW9mIGh0bWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsaS5pbm5lckhUTUwgPSBodG1sXG4gICAgfSBlbHNlIGlmIChodG1sIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgIGxpLmFwcGVuZENoaWxkKGh0bWwpXG4gICAgfVxuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaXRlbXMsIGl0ZW1MZW5ndGggKyAnJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBsaVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpdGVtTGVuZ3RoKytcbiAgICByZXR1cm4gbGlcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUluZGV4KGluZGV4KSB7XG4gICAgd2hpbGUgKGluZGV4IDwgMCkge1xuICAgICAgaW5kZXggKz0gaXRlbUxlbmd0aFxuICAgIH1cblxuICAgIHdoaWxlIChpbmRleCA+PSBpdGVtTGVuZ3RoKSB7XG4gICAgICBpbmRleCAtPSBpdGVtTGVuZ3RoXG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4XG4gIH1cblxuICBpdGVtcy5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICByZXR1cm4gaXRlbXNbbm9ybWFsaXplSW5kZXgoaW5kZXgpXVxuICB9XG5cbiAgaXRlbXMuZ2V0Q2xvbmVkID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gbm9ybWFsaXplSW5kZXgoaW5kZXgpXG4gICAgdmFyIGl0ZW0gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjbG9uZWQ9XCJjbG9uZWQtJyArIGluZGV4ICsgJ1wiXScpXG4gICAgdmFyIG9yaWdpbmFsSXRlbSA9IGl0ZW1zW2luZGV4XVxuXG4gICAgLy8gSWYgdGhlcmUgYSBfbGlzdGVuZXJzIGF0dHJpYnV0ZSBvbiB0aGUgZG9tIGVsZW1lbnRcbiAgICAvLyB0aGVuIGNsb25lIHRoZSBfbGlzdGVuZXJzIGFzIHdlbGwgZm9yIHRoZSBldmVudHMnIGJpbmRpbmdcbiAgICBmdW5jdGlvbiBjbG9uZUV2ZW50cyhvcmlnaW4sIGNsb25lLCBkZWVwKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gb3JpZ2luLl9saXN0ZW5lcnNcbiAgICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgY2xvbmUuX2xpc3RlbmVycyA9IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKHZhciB0eXBlIGluIGxpc3RlbmVycykge1xuICAgICAgICAgIGNsb25lLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW3R5cGVdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGVlcCAmJiBvcmlnaW4uY2hpbGRyZW4gJiYgb3JpZ2luLmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9yaWdpbi5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBjbG9uZUV2ZW50cyhvcmlnaW4uY2hpbGRyZW5baV0sIGNsb25lLmNoaWxkcmVuW2ldLCBkZWVwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpdGVtKSB7XG4gICAgICBpdGVtID0gb3JpZ2luYWxJdGVtLmNsb25lTm9kZSh0cnVlKVxuICAgICAgY2xvbmVFdmVudHMob3JpZ2luYWxJdGVtLCBpdGVtLCB0cnVlKVxuXG4gICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGl0ZW0pXG4gICAgICBpdGVtLnNldEF0dHJpYnV0ZSgnY2xvbmVkJywgJ2Nsb25lZC0nICsgaW5kZXgpXG4gICAgICBpdGVtLmluZGV4ID0gaW5kZXhcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbVxuICB9XG5cbiAgZnVuY3Rpb24gYWN0aXZhdGUoaW5kZXgpIHtcbiAgICBpZiAoaXRlbUxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdmFyIGN1ckl0ZW0gPSBpdGVtcy5nZXQoaW5kZXgpXG4gICAgdmFyIHByZXZJdGVtXG4gICAgdmFyIG5leHRJdGVtXG5cbiAgICBpZiAoaXRlbUxlbmd0aCA+IDEpIHtcbiAgICAgIHByZXZJdGVtID0gaXRlbXMuZ2V0KGluZGV4IC0gMSlcblxuICAgICAgaWYgKGl0ZW1MZW5ndGggPT09IDIpIHtcbiAgICAgICAgbmV4dEl0ZW0gPSBpdGVtcy5nZXRDbG9uZWQoaW5kZXggKyAxKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEl0ZW0gPSBpdGVtcy5nZXQoaW5kZXggKyAxKVxuICAgICAgfVxuXG4gICAgICBjdXJJdGVtLnN0eWxlLmxlZnQgPSAtdHJhbnNmb3JtT2Zmc2V0ICsgJ3B4J1xuICAgICAgcHJldkl0ZW0uc3R5bGUubGVmdCA9ICgtdHJhbnNmb3JtT2Zmc2V0IC0gaXRlbVN0ZXApICsgJ3B4J1xuICAgICAgbmV4dEl0ZW0uc3R5bGUubGVmdCA9ICgtdHJhbnNmb3JtT2Zmc2V0ICsgaXRlbVN0ZXApICsgJ3B4J1xuICAgIH1cblxuICAgIGl0ZW1JbmRleCA9IGN1ckl0ZW0uaW5kZXhcblxuICAgIGZpcmVFdmVudCgnY2hhbmdlJywge1xuICAgICAgcHJldkl0ZW06IHByZXZJdGVtLFxuICAgICAgY3VySXRlbTogY3VySXRlbSxcbiAgICAgIG5leHRJdGVtOiBuZXh0SXRlbVxuICAgIH0pXG4gIH1cblxuICBpdGVtcy5zbGlkZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgIGlmIChpdGVtTGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaXRlbUxlbmd0aCA9PT0gMSkge1xuICAgICAgaW5kZXggPSAwXG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0T2Zmc2V0ID0gZ2V0VHJhbnNmb3JtT2Zmc2V0KGVsZW1lbnQpLnhcbiAgICB2YXIgZW5kT2Zmc2V0ID0gdHJhbnNmb3JtT2Zmc2V0ICsgaXRlbVN0ZXAgKiAoLWluZGV4KVxuICAgIHZhciBpbnRlck9mZnNldCA9IGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0XG5cbiAgICBpZiAoaW50ZXJPZmZzZXQgPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHZhciBhbmltID0gbmV3IGxpYi5hbmltYXRpb24oXG4gICAgICA0MDAsXG4gICAgICBsaWIuY3ViaWNiZXppZXIuZWFzZSxcbiAgICAgIGZ1bmN0aW9uIChpMSwgaTIpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZVtzdHlsZVByZWZpeCArICdUcmFuc2Zvcm0nXVxuICAgICAgICAgID0gZ2V0VHJhbnNsYXRlKHN0YXJ0T2Zmc2V0ICsgaW50ZXJPZmZzZXQgKiBpMiwgMClcbiAgICAgIH0pLnBsYXkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJhbnNmb3JtT2Zmc2V0ID0gZW5kT2Zmc2V0XG4gICAgICAgIGVsZW1lbnQuc3R5bGVbc3R5bGVQcmVmaXggKyAnVHJhbnNmb3JtJ10gPSBnZXRUcmFuc2xhdGUoZW5kT2Zmc2V0LCAwKVxuICAgICAgICBpbmRleCAmJiBhY3RpdmF0ZShpdGVtSW5kZXggKyBpbmRleClcbiAgICAgIH0pXG4gIH1cblxuICBpdGVtcy5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgIGl0ZW1zLnNsaWRlKDEpXG4gIH1cblxuICBpdGVtcy5wcmV2ID0gZnVuY3Rpb24gKCkge1xuICAgIGl0ZW1zLnNsaWRlKC0xKVxuICB9XG5cbiAgQXJyYXlGcm9tKGVsZW1lbnQuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgZWwuc3R5bGUudG9wID0gJzAnXG4gICAgZWwuc3R5bGUubGVmdCA9IGl0ZW1MZW5ndGggKiBpdGVtU3RlcCArICdweCdcbiAgICBlbC5zdHlsZS5mbG9hdCA9ICdsZWZ0J1xuICAgIGVsLmluZGV4ID0gaXRlbUxlbmd0aFxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdGVtcywgaXRlbUxlbmd0aCArICcnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGVsXG4gICAgICB9XG4gICAgfSlcblxuICAgIGl0ZW1MZW5ndGgrK1xuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaXRlbXMnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0ZW1zLCAnbGVuZ3RoJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGl0ZW1MZW5ndGhcbiAgICB9XG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGl0ZW1zLCAnaW5kZXgnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaXRlbUluZGV4XG4gICAgfVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdGVtcywgJ3N0ZXAnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaXRlbVN0ZXBcbiAgICB9LFxuXG4gICAgc2V0OiBmdW5jdGlvbiAodikge1xuICAgICAgaXRlbVN0ZXAgPSB2XG4gICAgfVxuICB9KVxuXG4gIHZhciBzdGFydGluZyA9IGZhbHNlXG4gIHZhciBwbGF5aW5nID0gZmFsc2VcbiAgdmFyIGlzU2xpZGluZyA9IGZhbHNlXG4gIHRoaXMucGxheSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXN0YXJ0aW5nKSB7XG4gICAgICBzdGFydGluZyA9IHRydWVcbiAgICAgIHJldHVybiBhY3RpdmF0ZSgwKVxuICAgIH1cblxuICAgIGlmICghIXBsYXlpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHBsYXlpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgICBpc1NsaWRpbmcgPSB0cnVlXG4gICAgICBpdGVtcy5uZXh0KClcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpc1NsaWRpbmcgPSBmYWxzZVxuICAgICAgfSwgNTAwKVxuICAgICAgcGxheWluZyA9IHNldFRpbWVvdXQocGxheSwgNDAwICsgcGxheUludGVydmFsKVxuICAgIH0sIDQwMCArIHBsYXlJbnRlcnZhbClcbiAgfVxuXG4gIHRoaXMuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBsYXlpbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjbGVhclRpbWVvdXQocGxheWluZylcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsYXlpbmcgPSBmYWxzZVxuICAgIH0sIDUwMClcbiAgfVxuXG4gIHZhciBhdXRvcGxheSA9IGZhbHNlXG4gIHZhciByZWFkeVRvUGxheSA9IGZhbHNlXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnYXV0b3BsYXknLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXV0b3BsYXlcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgIGF1dG9wbGF5ID0gISF2XG4gICAgICBpZiAocmVhZHlUb1BsYXkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlYWR5VG9QbGF5KVxuICAgICAgICByZWFkeVRvUGxheSA9IGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAoYXV0b3BsYXkpIHtcbiAgICAgICAgcmVhZHlUb1BsYXkgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aGF0LnBsYXkoKVxuICAgICAgICB9LCAyMDAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhhdC5zdG9wKClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG4gIHRoaXMuYXV0b3BsYXkgPSAhIW9wdGlvbnMuYXV0b3BsYXlcblxuICB2YXIgcGxheUludGVydmFsID0gMTUwMFxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3BsYXlJbnRlcnZhbCcsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBwbGF5SW50ZXJ2YWxcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gKG4pIHtcbiAgICAgIHBsYXlJbnRlcnZhbCA9IG5cbiAgICB9XG4gIH0pXG4gIHRoaXMucGxheUludGVydmFsID0gISFvcHRpb25zLnBsYXlJbnRlcnZhbCB8fCAxNTAwXG5cbiAgaWYgKG9wdGlvbnMudXNlR2VzdHVyZSkge1xuICAgIHZhciBwYW5uaW5nID0gZmFsc2VcbiAgICB2YXIgZGlzcGxhY2VtZW50XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwYW5zdGFydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCAmJiAhKHBhbm5pbmcgJiYgaXNTbGlkaW5nKSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuXG4gICAgICAgIGlmIChhdXRvcGxheSkge1xuICAgICAgICAgIHRoYXQuc3RvcCgpXG4gICAgICAgIH1cblxuICAgICAgICBkaXNwbGFjZW1lbnQgPSAwXG4gICAgICAgIHBhbm5pbmcgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGFubW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCAmJiBwYW5uaW5nKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIGRpc3BsYWNlbWVudCA9IGUuZGlzcGxhY2VtZW50WFxuICAgICAgICBlbGVtZW50LnN0eWxlW3N0eWxlUHJlZml4ICsgJ1RyYW5zZm9ybSddXG4gICAgICAgICAgPSBnZXRUcmFuc2xhdGUodHJhbnNmb3JtT2Zmc2V0ICsgZGlzcGxhY2VtZW50LCAwKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhbmVuZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCAmJiBwYW5uaW5nKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIHBhbm5pbmcgPSBmYWxzZVxuICAgICAgICBpZiAoZS5pc1N3aXBlKSB7XG4gICAgICAgICAgaWYgKGRpc3BsYWNlbWVudCA8IDApIHtcbiAgICAgICAgICAgIGl0ZW1zLm5leHQoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVtcy5wcmV2KClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKE1hdGguYWJzKGRpc3BsYWNlbWVudCkgPCBpdGVtU3RlcCAvIDIpIHtcbiAgICAgICAgICAgIGl0ZW1zLnNsaWRlKDApXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl0ZW1zLnNsaWRlKGRpc3BsYWNlbWVudCA8IDA/MTotMSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXV0b3BsYXkpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoYXQucGxheSgpXG4gICAgICAgICAgfSwgMjAwMClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGZhbHNlKVxuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzd2lwZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAobmFtZSwgaGFuZGxlcikge1xuICAgIHRoaXMucm9vdC5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIsIGZhbHNlKVxuICB9XG5cbiAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKG5hbWUsIGhhbmRsZXIpIHtcbiAgICB0aGlzLnJvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyLCBmYWxzZSlcbiAgfVxuXG4gIHRoaXMucm9vdCA9IHJvb3RcbiAgdGhpcy5lbGVtZW50ID0gZWxlbWVudFxufVxuXG4hbGliICYmIChsaWIgPSB7fSlcbmxpYi5jYXJyb3VzZWwgPSBDYXJyb3VzZWxcblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWwgbGliICovXG5cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgJy4vY2Fycm91c2VsJ1xuaW1wb3J0ICcuL3NsaWRlci5jc3MnXG5cbmNvbnN0IERFRkFVTFRfSU5URVJWQUwgPSAzMDAwXG5cbmxldCBleHRlbmQsIENvbXBvbmVudFxuXG5mdW5jdGlvbiBpZGxlV2hlblBhZ2VEaXNhcHBlYXIgKHNsaWRlcikge1xuICBmdW5jdGlvbiBoYW5kbGVQYWdlU2hvdyAoKSB7XG4gICAgc2xpZGVyLmlzUGFnZVNob3cgPSB0cnVlXG4gICAgc2xpZGVyLmF1dG9QbGF5ICYmICFzbGlkZXIuaXNEb21SZW5kZXJpbmcgJiYgc2xpZGVyLnBsYXkoKVxuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZVBhZ2VIaWRlICgpIHtcbiAgICBzbGlkZXIuaXNQYWdlU2hvdyA9IGZhbHNlXG4gICAgc2xpZGVyLnN0b3AoKVxuICB9XG4gIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdwYWdlc2hvdycsIGhhbmRsZVBhZ2VTaG93KVxuICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCBoYW5kbGVQYWdlSGlkZSlcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHtcbiAgICAgIGhhbmRsZVBhZ2VTaG93KClcbiAgICB9XG4gICAgZWxzZSBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAnaGlkZGVuJykge1xuICAgICAgaGFuZGxlUGFnZUhpZGUoKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gaWRsZVdoZW5Eb21SZW5kZXJpbmcgKHNsaWRlcikge1xuICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigncmVuZGVyZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIHNsaWRlci5pc0RvbVJlbmRlcmluZyA9IGZhbHNlXG4gICAgc2xpZGVyLmF1dG9QbGF5ICYmIHNsaWRlci5pc1BhZ2VTaG93ICYmIHNsaWRlci5wbGF5KClcbiAgfSlcbiAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ3JlbmRlcmJlZ2luJywgZnVuY3Rpb24gKCkge1xuICAgIHNsaWRlci5pc0RvbVJlbmRlcmluZyA9IHRydWVcbiAgICBzbGlkZXIuc3RvcCgpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUluZGljYXRvcnMgKHNsaWRlcikge1xuICBzbGlkZXIuaW5kaWNhdG9yICYmIHNsaWRlci5pbmRpY2F0b3Iuc2V0SW5kZXgoc2xpZGVyLmN1cnJlbnRJbmRleClcbn1cblxuZnVuY3Rpb24gZ2V0U2xpZGVyQ2hhbmdlSGFuZGxlciAoc2xpZGVyKSB7XG4gIGlmICghc2xpZGVyLl9zbGlkZXJDaGFuZ2VIYW5kbGVyKSB7XG4gICAgc2xpZGVyLl9zbGlkZXJDaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jYXJyb3VzZWwuaXRlbXMuaW5kZXhcbiAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gaW5kZXhcbiAgICAgIHVwZGF0ZUluZGljYXRvcnModGhpcylcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnY2hhbmdlJywgeyBpbmRleDogaW5kZXggfSlcbiAgICB9LmJpbmQoc2xpZGVyKVxuICB9XG4gIHJldHVybiBzbGlkZXIuX3NsaWRlckNoYW5nZUhhbmRsZXJcbn1cblxuZnVuY3Rpb24gZG9SZW5kZXIgKHNsaWRlcikge1xuICBzbGlkZXIuY3JlYXRlQ2hpbGRyZW4oKVxuICBzbGlkZXIub25BcHBlbmQoKVxufVxuXG5jb25zdCBwcm90byA9IHtcbiAgY3JlYXRlICgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3NsaWRlcicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSdcbiAgICBub2RlLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbidcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIGNyZWF0ZUNoaWxkcmVuICgpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcblxuICAgIC8vIHJlY3JlYXRlIHNsaWRlciBjb250YWluZXIuXG4gICAgaWYgKHRoaXMuc2xpZGVyQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLm5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zbGlkZXJDb250YWluZXIpXG4gICAgfVxuICAgIGlmICh0aGlzLmluZGljYXRvcikge1xuICAgICAgdGhpcy5pbmRpY2F0b3Iubm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuaW5kaWNhdG9yLm5vZGUpXG4gICAgfVxuICAgIHRoaXMuY2hpbGRyZW4gPSBbXVxuXG4gICAgY29uc3Qgc2xpZGVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndWwnKVxuICAgIHNsaWRlckNvbnRhaW5lci5zdHlsZS5saXN0U3R5bGUgPSAnbm9uZSdcbiAgICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoc2xpZGVyQ29udGFpbmVyKVxuICAgIHRoaXMuc2xpZGVyQ29udGFpbmVyID0gc2xpZGVyQ29udGFpbmVyXG5cbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgbGV0IGluZGljYXRvckRhdGEsIHdpZHRoLCBoZWlnaHRcbiAgICBsZXQgY2hpbGRXaWR0aCA9IDBcbiAgICBsZXQgY2hpbGRIZWlnaHQgPSAwXG5cbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBjaGlsZFxuICAgICAgICBjaGlsZHJlbltpXS5pbnN0YW5jZUlkID0gdGhpcy5kYXRhLmluc3RhbmNlSWRcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnR5cGUgPT09ICdpbmRpY2F0b3InKSB7XG4gICAgICAgICAgaW5kaWNhdG9yRGF0YSA9IGV4dGVuZChjaGlsZHJlbltpXSwge1xuICAgICAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgICAgYW1vdW50OiBjaGlsZHJlbi5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICBpbmRleDogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY2hpbGQgPSBjb21wb25lbnRNYW5hZ2VyLmNyZWF0ZUVsZW1lbnQoY2hpbGRyZW5baV0sICdsaScpXG4gICAgICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNoaWxkLm5vZGUpXG4gICAgICAgICAgd2lkdGggPSBjaGlsZC5kYXRhLnN0eWxlLndpZHRoIHx8IDBcbiAgICAgICAgICBoZWlnaHQgPSBjaGlsZC5kYXRhLnN0eWxlLmhlaWdodCB8fCAwXG4gICAgICAgICAgd2lkdGggPiBjaGlsZFdpZHRoICYmIChjaGlsZFdpZHRoID0gd2lkdGgpXG4gICAgICAgICAgaGVpZ2h0ID4gY2hpbGRIZWlnaHQgJiYgKGNoaWxkSGVpZ2h0ID0gaGVpZ2h0KVxuICAgICAgICAgIGNoaWxkLnBhcmVudFJlZiA9IHRoaXMuZGF0YS5yZWZcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gYXBwZW5kIGluZGljYXRvclxuICAgICAgaWYgKGluZGljYXRvckRhdGEpIHtcbiAgICAgICAgaW5kaWNhdG9yRGF0YS5leHRyYS53aWR0aCA9IHRoaXMuZGF0YS5zdHlsZS53aWR0aCB8fCBjaGlsZFdpZHRoXG4gICAgICAgIGluZGljYXRvckRhdGEuZXh0cmEuaGVpZ2h0ID0gdGhpcy5kYXRhLnN0eWxlLmhlaWdodCB8fCBjaGlsZEhlaWdodFxuICAgICAgICB0aGlzLmluZGljYXRvciA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChpbmRpY2F0b3JEYXRhKVxuICAgICAgICB0aGlzLmluZGljYXRvci5wYXJlbnRSZWYgPSB0aGlzLmRhdGEucmVmXG4gICAgICAgIHRoaXMuaW5kaWNhdG9yLnNsaWRlciA9IHRoaXNcbiAgICAgICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKHRoaXMuaW5kaWNhdG9yLm5vZGUpXG4gICAgICB9XG5cbiAgICAgIHNsaWRlckNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB0aGlzLmRhdGEuc3R5bGUuaGVpZ2h0ICsgJ3B4J1xuICAgICAgc2xpZGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KVxuICAgIH1cbiAgfSxcblxuICBhcHBlbmRDaGlsZCAoZGF0YSkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuIHx8ICh0aGlzLmRhdGEuY2hpbGRyZW4gPSBbXSlcbiAgICBjaGlsZHJlbi5wdXNoKGRhdGEpXG4gICAgZG9SZW5kZXIodGhpcylcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgfVxuICB9LFxuXG4gIGluc2VydEJlZm9yZSAoY2hpbGQsIGJlZm9yZSkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgbGV0IGNoaWxkSW5kZXggPSAtMVxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoY2hpbGRyZW5baV0ucmVmID09PSBiZWZvcmUuZGF0YS5yZWYpIHtcbiAgICAgICAgY2hpbGRJbmRleCA9IGlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgY2hpbGRyZW4uc3BsaWNlKGNoaWxkSW5kZXgsIDAsIGNoaWxkLmRhdGEpXG4gICAgZG9SZW5kZXIodGhpcylcbiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDFdXG4gICAgfVxuICB9LFxuXG4gIHJlbW92ZUNoaWxkIChjaGlsZCkge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChjaGlsZC5kYXRhLnJlZiA9PT0gY2hpbGRyZW5baV0ucmVmKSB7XG4gICAgICAgICAgY2hpbGRyZW4uc3BsaWNlKGksIDEpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkb1JlbmRlcih0aGlzKVxuICB9LFxuXG4gIG9uQXBwZW5kICgpIHtcbiAgICBpZiAodGhpcy5jYXJyb3VzZWwpIHtcbiAgICAgIHRoaXMuY2Fycm91c2VsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGdldFNsaWRlckNoYW5nZUhhbmRsZXIodGhpcykpXG4gICAgICB0aGlzLmNhcnJvdXNlbC5zdG9wKClcbiAgICAgIHRoaXMuY2Fycm91c2VsID0gbnVsbFxuICAgIH1cbiAgICBjb25zdCBDYXJyb3VzZWwgPSBsaWIuY2Fycm91c2VsXG4gICAgdGhpcy5jYXJyb3VzZWwgPSBuZXcgQ2Fycm91c2VsKHRoaXMuc2xpZGVyQ29udGFpbmVyLCB7XG4gICAgICBhdXRvcGxheTogdGhpcy5hdXRvUGxheSxcbiAgICAgIHVzZUdlc3R1cmU6IHRydWVcbiAgICB9KVxuXG4gICAgdGhpcy5jYXJyb3VzZWwucGxheUludGVydmFsID0gdGhpcy5pbnRlcnZhbFxuICAgIHRoaXMuY2Fycm91c2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGdldFNsaWRlckNoYW5nZUhhbmRsZXIodGhpcykpXG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSAwXG5cbiAgICAvLyBwcmVsb2FkIGFsbCBpbWFnZXMgZm9yIHNsaWRlclxuICAgIC8vIGJlY2F1c2U6XG4gICAgLy8gMS4gbGliLWltZyBkb2Vzbid0IGxpc3RlbiB0byBldmVudCB0cmFuc2l0aW9uZW5kXG4gICAgLy8gMi4gZXZlbiBpZiB3ZSBmaXJlIGxhenkgbG9hZCBpbiBzbGlkZXIncyBjaGFuZ2UgZXZlbnQgaGFuZGxlcixcbiAgICAvLyAgICB0aGUgbmV4dCBpbWFnZSBzdGlsbCB3b24ndCBiZSBwcmVsb2FkZWQgdXRpbGwgdGhlIG1vbWVudCBpdFxuICAgIC8vICAgIHNsaWRlcyBpbnRvIHRoZSB2aWV3LCB3aGljaCBpcyB0b28gbGF0ZS5cbiAgICBpZiAodGhpcy5wcmVsb2FkSW1nc1RpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5wcmVsb2FkSW1nc1RpbWVyKVxuICAgIH1cbiAgICAvLyBUaGUgdGltZSBqdXN0IGJlZm9yZSB0aGUgc2Vjb25kIHNsaWRlIGFwcGVhciBhbmQgZW5vdWdoXG4gICAgLy8gZm9yIGFsbCBjaGlsZCBlbGVtZW50cyB0byBhcHBlbmQgaXMgb2suXG4gICAgY29uc3QgcHJlbG9hZFRpbWUgPSAwLjhcbiAgICB0aGlzLnByZWxvYWRJbWdzVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGltZ3MgPSB0aGlzLmNhcnJvdXNlbC5lbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53ZWV4LWltZycpXG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGltZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGltZyA9IGltZ3NbaV1cbiAgICAgICAgY29uc3QgaUxhenlTcmMgPSBpbWcuZ2V0QXR0cmlidXRlKCdpLWxhenktc3JjJylcbiAgICAgICAgY29uc3QgaW1nU3JjID0gaW1nLmdldEF0dHJpYnV0ZSgnaW1nLXNyYycpXG4gICAgICAgIGlmIChpTGF6eVNyYykge1xuICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKCcgKyBpTGF6eVNyYyArICcpJ1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGltZ1NyYykge1xuICAgICAgICAgIGltZy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKCcgKyBpbWdTcmMgKyAnKSdcbiAgICAgICAgfVxuICAgICAgICBpbWcucmVtb3ZlQXR0cmlidXRlKCdpLWxhenktc3JjJylcbiAgICAgICAgaW1nLnJlbW92ZUF0dHJpYnV0ZSgnaW1nLXNyYycpXG4gICAgICB9XG4gICAgfS5iaW5kKHRoaXMpLCBwcmVsb2FkVGltZSAqIDEwMDApXG5cbiAgICAvLyBhdm9pZCBwYWdlIHNjcm9sbCB3aGVuIHBhbm5pbmdcbiAgICBsZXQgcGFubmluZyA9IGZhbHNlXG4gICAgdGhpcy5jYXJyb3VzZWwuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwYW5zdGFydCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIWUuaXNWZXJ0aWNhbCkge1xuICAgICAgICBwYW5uaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5jYXJyb3VzZWwuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwYW5lbmQnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFlLmlzVmVydGljYWwpIHtcbiAgICAgICAgcGFubmluZyA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAocGFubmluZykge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pXG5cbiAgICBDb21wb25lbnQucHJvdG90eXBlLm9uQXBwZW5kLmNhbGwodGhpcylcbiAgfSxcblxuICBwbGF5ICgpIHtcbiAgICB0aGlzLmNhcnJvdXNlbC5wbGF5KClcbiAgfSxcblxuICBzdG9wICgpIHtcbiAgICB0aGlzLmNhcnJvdXNlbC5zdG9wKClcbiAgfSxcblxuICBzbGlkZVRvIChpbmRleCkge1xuICAgIGNvbnN0IG9mZnNldCA9IGluZGV4IC0gdGhpcy5jdXJyZW50SW5kZXhcbiAgICB0aGlzLmNhcnJvdXNlbC5pdGVtcy5zbGlkZShvZmZzZXQpXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgaW50ZXJ2YWw6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB0aGlzLmludGVydmFsID0gcGFyc2VJbnQodmFsKSB8fCBERUZBVUxUX0lOVEVSVkFMXG4gICAgaWYgKHRoaXMuY2Fycm91c2VsKSB7XG4gICAgICB0aGlzLmNhcnJvdXNlbC5wbGF5SW50ZXJ2YWwgPSB0aGlzLmludGVydmFsXG4gICAgfVxuICB9LFxuXG4gIGluZGV4OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgY29uc3QgX3RoaXMgPSB0aGlzXG4gICAgZnVuY3Rpb24gZG9TbGlkZSAoaW5kZXgpIHtcbiAgICAgIGluZGV4ID0gcGFyc2VJbnQoaW5kZXgpXG4gICAgICBpZiAoaW5kZXggPCAwIHx8IGlzTmFOKGluZGV4KSkge1xuICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gaW52YWxpZCBpbmRleCAnLCBpbmRleClcbiAgICAgIH1cbiAgICAgIF90aGlzLnNsaWRlVG8oaW5kZXgpXG4gICAgICBpZiAoX3RoaXMuX3VwZGF0ZUluZGV4KSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCBfdGhpcy5fdXBkYXRlSW5kZXgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRG9tUmVuZGVyaW5nKSB7XG4gICAgICBjb25zdCBwcmUgPSAhIXRoaXMuX3VwZGF0ZUluZGV4XG4gICAgICB0aGlzLl91cGRhdGVJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMuYXV0b1BsYXkgJiYgX3RoaXMuaXNQYWdlU2hvdyAmJiBfdGhpcy5wbGF5KClcbiAgICAgICAgZG9TbGlkZSh2YWwpXG4gICAgICB9XG4gICAgICAhcHJlICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCB0aGlzLl91cGRhdGVJbmRleClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkb1NsaWRlKHZhbClcbiAgICB9XG4gIH0sXG5cbiAgcGxheXN0YXR1czogZnVuY3Rpb24gKHZhbCkge1xuICAgIHRoaXMucGxheXN0YXR1cyA9IHZhbCAmJiB2YWwgIT09ICdmYWxzZSdcbiAgICB0aGlzLmF1dG9QbGF5ID0gdGhpcy5wbGF5c3RhdHVzXG4gICAgaWYgKHRoaXMuY2Fycm91c2VsKSB7XG4gICAgICBpZiAodGhpcy5wbGF5c3RhdHVzKSB7XG4gICAgICAgIHRoaXMucGxheSgpXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9wKClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLy8gc3VwcG9ydCBwbGF5c3RhdHVzJyBhbGlhcyBhdXRvLXBsYXkgZm9yIGNvbXBhdGliaWxpdHlcbiAgYXV0b1BsYXk6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB0aGlzLmF0dHIucGxheXN0YXR1cy5jYWxsKHRoaXMsIHZhbClcbiAgfVxufVxuXG5jb25zdCBldmVudCA9IHtcbiAgY2hhbmdlOiB7XG4gICAgdXBkYXRvcjogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICBpbmRleDogdGhpcy5jdXJyZW50SW5kZXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIENvbXBvbmVudCA9IFdlZXguQ29tcG9uZW50XG4gIGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgZnVuY3Rpb24gU2xpZGVyIChkYXRhKSB7XG4gICAgdGhpcy5hdXRvUGxheSA9IGZhbHNlICAvLyBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLlxuICAgIHRoaXMuaW50ZXJ2YWwgPSBERUZBVUxUX0lOVEVSVkFMXG4gICAgdGhpcy5kaXJlY3Rpb24gPSAncm93JyAvLyAnY29sdW1uJyBpcyBub3QgdGVtcG9yYXJpbHkgc3VwcG9ydGVkLlxuICAgIHRoaXMuY2hpbGRyZW4gPSBbXVxuICAgIHRoaXMuaXNQYWdlU2hvdyA9IHRydWVcbiAgICB0aGlzLmlzRG9tUmVuZGVyaW5nID0gdHJ1ZVxuXG4gICAgLy8gYmluZCBldmVudCAncGFnZXNob3cnLCAncGFnZWhpZGUnIGFuZCAndmlzaWJpbGl0eWNoYW5nZScgb24gd2luZG93LlxuICAgIGlkbGVXaGVuUGFnZURpc2FwcGVhcih0aGlzKVxuICAgIC8vIGJpbmQgZXZlbnQgJ3JlbmRlckJlZ2luJyBhbmQgJ3JlbmRlckVuZCcgb24gd2luZG93LlxuICAgIGlkbGVXaGVuRG9tUmVuZGVyaW5nKHRoaXMpXG5cbiAgICBDb21wb25lbnQuY2FsbCh0aGlzLCBkYXRhKVxuICB9XG4gIFNsaWRlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG4gIGV4dGVuZChTbGlkZXIucHJvdG90eXBlLCBwcm90bylcbiAgZXh0ZW5kKFNsaWRlci5wcm90b3R5cGUsIHsgYXR0ciB9KVxuICBleHRlbmQoU2xpZGVyLnByb3RvdHlwZSwgeyBldmVudCB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3NsaWRlcicsIFNsaWRlcilcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCAnLi9pbmRpY2F0b3IuY3NzJ1xuXG5jb25zdCBERUZBVUxUX0lURU1fQ09MT1IgPSAnIzk5OSdcbmNvbnN0IERFRkFVTFRfSVRFTV9TRUxFQ1RFRF9DT0xPUiA9ICcjMDAwMGZmJ1xuY29uc3QgREVGQVVMVF9JVEVNX1NJWkUgPSAyMFxuY29uc3QgREVGQVVMVF9NQVJHSU5fU0laRSA9IDEwXG5cbmZ1bmN0aW9uIHJlc2V0Q29sb3IgKGluZGljYXRvcikge1xuICBjb25zdCBsZW4gPSBpbmRpY2F0b3IuaXRlbXMubGVuZ3RoXG4gIGlmICh0eXBlb2YgaW5kaWNhdG9yLmluZGV4ICE9PSAndW5kZWZpbmVkJyAmJiBsZW4gPiBpbmRpY2F0b3IuaW5kZXgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gaW5kaWNhdG9yLml0ZW1zW2ldXG4gICAgICBpZiAoaW5kaWNhdG9yLmluZGV4ID09PSBpKSB7XG4gICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJylcbiAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBpbmRpY2F0b3IuaXRlbVNlbGVjdGVkQ29sb3JcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpdGVtLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGluZGljYXRvci5pdGVtQ29sb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ2xpY2sgKGluZGljYXRvciwgaWR4LCBlKSB7XG4gIGluZGljYXRvci5zbGlkZXIuc2xpZGVUbyhpZHgpXG59XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1pbmRpY2F0b3JzJylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtZWxlbWVudCcpXG4gICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICB0aGlzLm5vZGUgPSBub2RlXG4gICAgdGhpcy5zdHlsZS5pdGVtU2l6ZS5jYWxsKHRoaXMsIDApXG4gICAgdGhpcy51cGRhdGVTdHlsZSh7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgaXRlbVNpemU6IDBcbiAgICB9KVxuICAgIHJldHVybiBub2RlXG4gIH0sXG5cbiAgY3JlYXRlQ2hpbGRyZW4gKCkge1xuICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYW1vdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGluZGljYXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICBpbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnd2VleC1pbmRpY2F0b3InKVxuICAgICAgaW5kaWNhdG9yLnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94J1xuICAgICAgaW5kaWNhdG9yLnN0eWxlLm1hcmdpbiA9ICcwICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgREVGQVVMVF9NQVJHSU5fU0laRVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAncHgnXG4gICAgICBpbmRpY2F0b3Iuc3R5bGUud2lkdGggPSB0aGlzLml0ZW1TaXplICsgJ3B4J1xuICAgICAgaW5kaWNhdG9yLnN0eWxlLmhlaWdodCA9IHRoaXMuaXRlbVNpemUgKyAncHgnXG4gICAgICBpbmRpY2F0b3Iuc2V0QXR0cmlidXRlKCdpbmRleCcsIGkpXG4gICAgICBpZiAodGhpcy5pbmRleCA9PT0gaSkge1xuICAgICAgICBpbmRpY2F0b3IuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJylcbiAgICAgICAgaW5kaWNhdG9yLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaXRlbVNlbGVjdGVkQ29sb3JcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpbmRpY2F0b3Iuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5pdGVtQ29sb3JcbiAgICAgIH1cbiAgICAgIGluZGljYXRvci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZUNsaWNrLmJpbmQobnVsbCwgdGhpcywgaSkpXG4gICAgICB0aGlzLml0ZW1zW2ldID0gaW5kaWNhdG9yXG4gICAgICByb290LmFwcGVuZENoaWxkKGluZGljYXRvcilcbiAgICB9XG4gICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKHJvb3QpXG4gIH0sXG5cbiAgc2V0SW5kZXggKGlkeCkge1xuICAgIGlmIChpZHggPj0gdGhpcy5hbW91bnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBwcmV2ID0gdGhpcy5pdGVtc1t0aGlzLmluZGV4XVxuICAgIGNvbnN0IGN1ciA9IHRoaXMuaXRlbXNbaWR4XVxuICAgIHByZXYuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJylcbiAgICBwcmV2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaXRlbUNvbG9yXG4gICAgY3VyLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpXG4gICAgY3VyLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaXRlbVNlbGVjdGVkQ29sb3JcbiAgICB0aGlzLmluZGV4ID0gaWR4XG4gIH1cbn1cblxuY29uc3Qgc3R5bGUgPSB7XG4gIGl0ZW1Db2xvciAodmFsKSB7XG4gICAgdGhpcy5pdGVtQ29sb3IgPSB2YWwgfHwgREVGQVVMVF9JVEVNX0NPTE9SXG4gICAgcmVzZXRDb2xvcih0aGlzKVxuICB9LFxuXG4gIGl0ZW1TZWxlY3RlZENvbG9yICh2YWwpIHtcbiAgICB0aGlzLml0ZW1TZWxlY3RlZENvbG9yID0gdmFsIHx8IERFRkFVTFRfSVRFTV9TRUxFQ1RFRF9DT0xPUlxuICAgIHJlc2V0Q29sb3IodGhpcylcbiAgfSxcblxuICBpdGVtU2l6ZSAodmFsKSB7XG4gICAgdmFsID0gcGFyc2VJbnQodmFsKSB8fCBERUZBVUxUX0lURU1fU0laRVxuICAgIHRoaXMuaXRlbVNpemUgPSB2YWxcbiAgICB0aGlzLm5vZGUuc3R5bGUuaGVpZ2h0ID0gdmFsICsgJ3B4J1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5pdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHRoaXMuaXRlbXNbaV0uc3R5bGUud2lkdGggPSB2YWwgKyAncHgnXG4gICAgICB0aGlzLml0ZW1zW2ldLnN0eWxlLmhlaWdodCA9IHZhbCArICdweCdcbiAgICB9XG4gIH0sXG5cbiAgd2lkdGggKHZhbCkge1xuICAgIHZhbCA9IHBhcnNlSW50KHZhbCkgfHwgcGFyc2VJbnQodGhpcy5zbGlkZXJXaWR0aClcbiAgICB0aGlzLnZpcnR1YWxXcmFwcGVyV2lkdGggPSB2YWxcbiAgfSxcblxuICBoZWlnaHQgKHZhbCkge1xuICAgIHZhbCA9IHBhcnNlSW50KHZhbCkgfHwgcGFyc2VJbnQodGhpcy5zbGlkZXJIZWlnaHQpXG4gICAgdGhpcy52aXJ0dWFsV3JhcHBlckhlaWdodCA9IHZhbFxuICB9LFxuXG4gIHRvcCAodmFsKSB7XG4gICAgdmFsID0gdGhpcy52aXJ0dWFsV3JhcHBlckhlaWdodCAvIDIgLSB0aGlzLml0ZW1TaXplIC8gMiArIHZhbFxuICAgIHRoaXMubm9kZS5zdHlsZS5ib3R0b20gPSAnJ1xuICAgIHRoaXMubm9kZS5zdHlsZS50b3AgPSB2YWwgKyAncHgnXG4gIH0sXG5cbiAgYm90dG9tICh2YWwpIHtcbiAgICB2YWwgPSB0aGlzLnZpcnR1YWxXcmFwcGVySGVpZ2h0IC8gMiAtIHRoaXMuaXRlbVNpemUgLyAyICsgdmFsXG4gICAgdGhpcy5ub2RlLnN0eWxlLnRvcCA9ICcnXG4gICAgdGhpcy5ub2RlLnN0eWxlLmJvdHRvbSA9IHZhbCArICdweCdcbiAgfSxcblxuICBsZWZ0ICh2YWwpIHtcbiAgICB2YWwgPSB0aGlzLnZpcnR1YWxXcmFwcGVyV2lkdGggLyAyXG4gICAgICAgICAgLSAodGhpcy5pdGVtU2l6ZSArIDIgKiBERUZBVUxUX01BUkdJTl9TSVpFKSAqIHRoaXMuYW1vdW50IC8gMiArIHZhbFxuICAgIHRoaXMubm9kZS5zdHlsZS5yaWdodCA9ICcnXG4gICAgdGhpcy5ub2RlLnN0eWxlLmxlZnQgPSB2YWwgKyAncHgnXG4gIH0sXG5cbiAgcmlnaHQgKHZhbCkge1xuICAgIHZhbCA9IHRoaXMudmlydHVhbFdyYXBwZXJXaWR0aCAvIDJcbiAgICAgICAgICAtICh0aGlzLml0ZW1TaXplICsgMiAqIERFRkFVTFRfTUFSR0lOX1NJWkUpICogdGhpcy5hbW91bnQgLyAyICsgdmFsXG4gICAgdGhpcy5ub2RlLnN0eWxlLmxlZnQgPSAnJ1xuICAgIHRoaXMubm9kZS5zdHlsZS5yaWdodCA9IHZhbCArICdweCdcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IEF0b21pYyA9IFdlZXguQXRvbWljXG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgLy8gU3R5bGUgc3VwcG9ydGVkOlxuICAvLyAgIHBvc2l0aW9uOiAoZGVmYXVsdCAtIGFic29sdXRlKVxuICAvLyAgIGl0ZW1Db2xvcjogY29sb3Igb2YgaW5kaWNhdG9yIGRvdHNcbiAgLy8gICBpdGVtU2VsZWN0ZWRDb2xvcjogY29sb3Igb2YgdGhlIHNlbGVjdGVkIGluZGljYXRvciBkb3RcbiAgLy8gICBpdGVtU2l6ZTogc2l6ZSBvZiBpbmRpY2F0b3JzXG4gIC8vICAgb3RoZXIgbGF5b3V0IHN0eWxlc1xuICBmdW5jdGlvbiBJbmRpY2F0b3IgKGRhdGEpIHtcbiAgICB0aGlzLmRpcmVjdGlvbiA9ICdyb3cnIC8vICdjb2x1bW4nIGlzIG5vdCB0ZW1wb3JhcmlseSBzdXBwb3J0ZWQuXG4gICAgdGhpcy5hbW91bnQgPSBkYXRhLmV4dHJhLmFtb3VudFxuICAgIHRoaXMuaW5kZXggPSBkYXRhLmV4dHJhLmluZGV4XG4gICAgdGhpcy5zbGlkZXJXaWR0aCA9IGRhdGEuZXh0cmEud2lkdGhcbiAgICB0aGlzLnNsaWRlckhlaWdodCA9IGRhdGEuZXh0cmEuaGVpZ2h0XG4gICAgY29uc3Qgc3R5bGVzID0gZGF0YS5zdHlsZSB8fCB7fVxuICAgIHRoaXMuZGF0YSA9IGRhdGFcbiAgICB0aGlzLnN0eWxlLndpZHRoLmNhbGwodGhpcywgc3R5bGVzLndpZHRoKVxuICAgIHRoaXMuc3R5bGUuaGVpZ2h0LmNhbGwodGhpcywgc3R5bGVzLmhlaWdodClcbiAgICB0aGlzLml0ZW1Db2xvciA9IHN0eWxlcy5pdGVtQ29sb3IgfHwgREVGQVVMVF9JVEVNX0NPTE9SXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWRDb2xvciA9IHN0eWxlcy5pdGVtU2VsZWN0ZWRDb2xvclxuICAgICAgfHwgREVGQVVMVF9JVEVNX1NFTEVDVEVEX0NPTE9SXG4gICAgdGhpcy5pdGVtcyA9IFtdXG4gICAgQXRvbWljLmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBJbmRpY2F0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBdG9taWMucHJvdG90eXBlKVxuICBleHRlbmQoSW5kaWNhdG9yLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChJbmRpY2F0b3IucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdpbmRpY2F0b3InLCBJbmRpY2F0b3IpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG4vLyBUT0RPOiByZWZhY3RvciB0aGlzIHNjc3MgY29kZSBzaW5jZSB0aGlzIGlzIHN0cm9uZ2x5XG4vLyBkZXBlbmRlbnQgb24gbGliLmZsZXhpYmxlIG90aGVyIHRoYW4gdGhlIHZhbHVlIG9mXG4vLyBzY2FsZS5cbmltcG9ydCAnLi90YWJoZWFkZXIuY3NzJ1xuXG5mdW5jdGlvbiBpbml0Rm9sZEJ0biAodGFiaGVhZGVyKSB7XG4gIGNvbnN0IG5vZGUgPSB0YWJoZWFkZXIubm9kZVxuICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcbiAgYnRuLmNsYXNzTmFtZSA9ICdmb2xkLXRvZ2dsZSBpY29uZm9udCdcbiAgYnRuLmlubmVySFRNTCA9ICcmI3hlNjYxOydcbiAgbm9kZS5hcHBlbmRDaGlsZChidG4pXG5cbiAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGlmICh0YWJoZWFkZXIudW5mb2xkaW5nKSB7XG4gICAgICBmb2xkaW5nKHRhYmhlYWRlcilcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB1bmZvbGRpbmcodGFiaGVhZGVyKVxuICAgIH1cbiAgfSlcbn1cblxuZnVuY3Rpb24gaW5pdE1hc2sgKHRhYmhlYWRlcikge1xuICBjb25zdCBtYXNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgbWFzay5jbGFzc05hbWUgPSAndGFiaGVhZGVyLW1hc2snXG4gIHRhYmhlYWRlci5tYXNrID0gbWFza1xuICAvLyBzdG9wIGRlZmF1bHQgYmVoYXZpb3I6IHBhZ2UgbW92aW5nLlxuICBtYXNrLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChldnQpIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKVxuICB9KVxuICAvLyBjbGljayB0byB1bmZvbGQuXG4gIG1hc2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9sZGluZyh0YWJoZWFkZXIpXG4gIH0pXG5cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtYXNrKVxufVxuXG5mdW5jdGlvbiB1bmZvbGRpbmcgKHRhYmhlYWRlcikge1xuICAvLyBtYXJrIHRoZSBpbml0aWFsIHBvc2lpdG9uIG9mIHRhYmhlYWRlclxuICBpZiAoIXRhYmhlYWRlci5mbGFnKSB7XG4gICAgY29uc3QgZmxhZyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ3RhYmhlYWRlcicpXG4gICAgdGFiaGVhZGVyLmZsYWcgPSBmbGFnXG4gICAgdGFiaGVhZGVyLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZmxhZywgdGFiaGVhZGVyLm5vZGUpXG4gIH1cbiAgaWYgKCF0YWJoZWFkZXIubWFzaykge1xuICAgIGluaXRNYXNrKHRhYmhlYWRlcilcbiAgfVxuXG4gIC8vIHJlY29yZCB0aGUgc2Nyb2xsIHBvc2l0aW9uLlxuICB0YWJoZWFkZXIuX3Njcm9sbFZhbCA9IHRhYmhlYWRlci5fYm9keS5zY3JvbGxMZWZ0XG4gIC8vIHJlY29yZCB0aGUgcG9zaXRpb24gaW4gZG9jdW1lbnQuXG4gIHRhYmhlYWRlci5fdG9wVmFsID0gdGFiaGVhZGVyLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXG4gIHRhYmhlYWRlci5fc3R5bGVUb3AgPSB0YWJoZWFkZXIubm9kZS5zdHlsZS50b3BcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRhYmhlYWRlci5ub2RlKVxuICB0YWJoZWFkZXIubm9kZS5jbGFzc0xpc3QuYWRkKCd1bmZvbGQtaGVhZGVyJylcbiAgdGFiaGVhZGVyLm5vZGUuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nXG4gIC8vIHJlY2FsYyB0aGUgcG9zaXRpb24gd2hlbiBpdCBpcyB1bmZvbGRlZC5cbiAgY29uc3QgdGhIZWlnaHQgPSB0YWJoZWFkZXIubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgaWYgKHRoSGVpZ2h0ICsgdGFiaGVhZGVyLl90b3BWYWwgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICB0YWJoZWFkZXIuX3RvcFZhbCA9IHRhYmhlYWRlci5fdG9wVmFsXG4gICAgICAgICsgKHdpbmRvdy5pbm5lckhlaWdodCAtIHRoSGVpZ2h0IC0gdGFiaGVhZGVyLl90b3BWYWwpXG4gIH1cblxuICB0YWJoZWFkZXIubm9kZS5zdHlsZS50b3AgPSB0YWJoZWFkZXIuX3RvcFZhbCArICdweCdcbiAgLy8gcHJvY2VzcyBtYXNrIHN0eWxlXG4gIHRhYmhlYWRlci5tYXNrLmNsYXNzTGlzdC5hZGQoJ3VuZm9sZC1oZWFkZXInKVxuICB0YWJoZWFkZXIubWFzay5zdHlsZS5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKyAncHgnXG4gIHRhYmhlYWRlci51bmZvbGRpbmcgPSB0cnVlXG59XG5cbmZ1bmN0aW9uIGZvbGRpbmcgKHRhYmhlYWRlcikge1xuICBpZiAodGFiaGVhZGVyLnVuZm9sZGluZyAhPT0gdHJ1ZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgdGFiaGVhZGVyLm1hc2suY2xhc3NMaXN0LnJlbW92ZSgndW5mb2xkLWhlYWRlcicpXG4gIHRhYmhlYWRlci5ub2RlLmNsYXNzTGlzdC5yZW1vdmUoJ3VuZm9sZC1oZWFkZXInKVxuXG4gIHRhYmhlYWRlci5ub2RlLnN0eWxlLmhlaWdodCA9ICcnXG4gIHRhYmhlYWRlci5ub2RlLnN0eWxlLnRvcCA9IHRhYmhlYWRlci5fc3R5bGVUb3BcblxuICAvLyByZWNvdmVyIHRoZSBwb3NpdGlvbiBvZiB0YWJoZWFkZXIuXG4gIHRhYmhlYWRlci5mbGFnLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRhYmhlYWRlci5ub2RlLCB0YWJoZWFkZXIuZmxhZylcbiAgLy8gcmVjb3ZlciB0aGUgcG9zaXRpb24gb2Ygc2NvbGxlci5cbiAgdGFiaGVhZGVyLl9ib2R5LnNjcm9sbExlZnQgPSB0YWJoZWFkZXIuX3Njcm9sbFZhbFxuXG4gIHNjcm9sbFRvVmlldyh0YWJoZWFkZXIpXG4gIHRhYmhlYWRlci51bmZvbGRpbmcgPSBmYWxzZVxufVxuXG5mdW5jdGlvbiBpbml0RXZlbnQgKHRhYmhlYWRlcikge1xuICBpbml0Q2xpY2tFdmVudCh0YWJoZWFkZXIpXG4gIGluaXRTZWxlY3RFdmVudCh0YWJoZWFkZXIpXG59XG5cbi8vIGluaXQgZXZlbnRzLlxuZnVuY3Rpb24gaW5pdENsaWNrRXZlbnQgKHRhYmhlYWRlcikge1xuICBjb25zdCBib3ggPSB0YWJoZWFkZXIuYm94XG5cbiAgYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGxldCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgaWYgKHRhcmdldC5ub2RlTmFtZSA9PT0gJ1VMJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRhcmdldC5wYXJlbnROb2RlLm5vZGVOYW1lID09PSAnTEknKSB7XG4gICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZVxuICAgIH1cblxuICAgIGNvbnN0IGZsb29yID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1mbG9vcicpXG4gICAgLyogZXNsaW50LWRpc2FibGUgZXFlcWVxICovXG4gICAgaWYgKHRhYmhlYWRlci5kYXRhLmF0dHIuc2VsZWN0ZWRJbmRleCA9PSBmbG9vcikge1xuICAgICAgLy8gRHVwbGljYXRlZCBjbGlja2luZywgbm90IHRvIHRyaWdnZXIgc2VsZWN0IGV2ZW50LlxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG5cbiAgICBmaXJlRXZlbnQodGFyZ2V0LCAnc2VsZWN0JywgeyBpbmRleDogZmxvb3IgfSlcbiAgfSlcbn1cblxuZnVuY3Rpb24gaW5pdFNlbGVjdEV2ZW50ICh0YWJoZWFkZXIpIHtcbiAgY29uc3Qgbm9kZSA9IHRhYmhlYWRlci5ub2RlXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0JywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGxldCBpbmRleFxuICAgIGlmIChldnQuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kZXggPSBldnQuaW5kZXhcbiAgICB9XG4gICAgZWxzZSBpZiAoZXZ0LmRhdGEgJiYgZXZ0LmRhdGEuaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kZXggPSBldnQuZGF0YS5pbmRleFxuICAgIH1cblxuICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0YWJoZWFkZXIuYXR0ci5zZWxlY3RlZEluZGV4LmNhbGwodGFiaGVhZGVyLCBpbmRleClcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2Nyb2xsVG9WaWV3ICh0YWJoZWFkZXIsIG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgY29uc3QgYXR0ciA9IHRhYmhlYWRlci5kYXRhLmF0dHJcbiAgICBub2RlID0gdGFiaGVhZGVyLm5vZGUucXVlcnlTZWxlY3RvcignW2RhdGEtZmxvb3I9XCInICsgYXR0ci5zZWxlY3RlZEluZGV4ICsgJ1wiXScpXG4gIH1cbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBjb25zdCBkZWZhdWx0VmFsID0gdGFiaGVhZGVyLl9ib2R5LnNjcm9sbExlZnRcbiAgLy8gY29uc3QgbGVmdFZhbCA9IGRlZmF1bHRWYWwgLSBub2RlLm9mZnNldExlZnQgKyAzMDBcblxuICBjb25zdCBzY3JvbGxWYWwgPSBnZXRTY3JvbGxWYWwodGFiaGVhZGVyLl9ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBub2RlKVxuICBkb1Njcm9sbCh0YWJoZWFkZXIuX2JvZHksIHNjcm9sbFZhbClcbn1cblxuLy8gc2Nyb2xsIHRoZSB0YWJoZWFkZXIuXG4vLyBwb3NpdGl2ZSB2YWwgbWVhbnMgdG8gc2Nyb2xsIHJpZ2h0LlxuLy8gbmVnYXRpdmUgdmFsIG1lYW5zIHRvIHNjcm9sbCBsZWZ0LlxuZnVuY3Rpb24gZG9TY3JvbGwgKG5vZGUsIHZhbCwgZmluaXNoKSB7XG4gIGlmICghdmFsKSB7XG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGZpbmlzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZmluaXNoID0gTWF0aC5hYnModmFsKVxuICB9XG5cbiAgaWYgKGZpbmlzaCA8PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodmFsID4gMCkge1xuICAgICAgbm9kZS5zY3JvbGxMZWZ0ICs9IDJcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBub2RlLnNjcm9sbExlZnQgLT0gMlxuICAgIH1cbiAgICBmaW5pc2ggLT0gMlxuXG4gICAgZG9TY3JvbGwobm9kZSwgdmFsLCBmaW5pc2gpXG4gIH0pXG59XG5cbi8vIGdldCBzY3JvbGwgZGlzdGFuY2UuXG5mdW5jdGlvbiBnZXRTY3JvbGxWYWwgKHJlY3QsIG5vZGUpIHtcbiAgY29uc3QgbGVmdCA9IG5vZGUucHJldmlvdXNTaWJsaW5nXG4gIGNvbnN0IHJpZ2h0ID0gbm9kZS5uZXh0U2libGluZ1xuICBsZXQgc2Nyb2xsVmFsXG5cbiAgLy8gcHJvY2VzcyBsZWZ0LXNpZGUgZWxlbWVudCBmaXJzdC5cbiAgaWYgKGxlZnQpIHtcbiAgICBjb25zdCBsZWZ0UmVjdCA9IGxlZnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICAvLyBvbmx5IG5lZWQgdG8gY29tcGFyZSB0aGUgdmFsdWUgb2YgbGVmdC5cbiAgICBpZiAobGVmdFJlY3QubGVmdCA8IHJlY3QubGVmdCkge1xuICAgICAgc2Nyb2xsVmFsID0gbGVmdFJlY3QubGVmdFxuICAgICAgcmV0dXJuIHNjcm9sbFZhbFxuICAgIH1cbiAgfVxuXG4gIGlmIChyaWdodCkge1xuICAgIGNvbnN0IHJpZ2h0UmVjdCA9IHJpZ2h0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgLy8gY29tcGFyZSB0aGUgdmFsdWUgb2YgcmlnaHQuXG4gICAgaWYgKHJpZ2h0UmVjdC5yaWdodCA+IHJlY3QucmlnaHQpIHtcbiAgICAgIHNjcm9sbFZhbCA9IHJpZ2h0UmVjdC5yaWdodCAtIHJlY3QucmlnaHRcbiAgICAgIHJldHVybiBzY3JvbGxWYWxcbiAgICB9XG4gIH1cblxuICAvLyBwcm9jZXNzIGN1cnJlbnQgbm9kZSwgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICBjb25zdCBub2RlUmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgaWYgKG5vZGVSZWN0LmxlZnQgPCByZWN0LmxlZnQpIHtcbiAgICBzY3JvbGxWYWwgPSBub2RlUmVjdC5sZWZ0XG4gIH1cbiAgZWxzZSBpZiAobm9kZVJlY3QucmlnaHQgPiByZWN0LnJpZ2h0KSB7XG4gICAgc2Nyb2xsVmFsID0gbm9kZVJlY3QucmlnaHQgLSByZWN0LnJpZ2h0XG4gIH1cblxuICByZXR1cm4gc2Nyb2xsVmFsXG59XG5cbi8vIHRyaWdnZXIgYW5kIGJyb2FkY2FzdCBldmVudHMuXG5mdW5jdGlvbiBmaXJlRXZlbnQgKGVsZW1lbnQsIHR5cGUsIGRhdGEpIHtcbiAgY29uc3QgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50JylcbiAgZXZ0LmRhdGEgPSBkYXRhXG4gIGZvciAoY29uc3QgayBpbiBkYXRhKSB7XG4gICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgIGV2dFtrXSA9IGRhdGFba11cbiAgICB9XG4gIH1cbiAgLy8gbmVlZCBidWJibGUuXG4gIGV2dC5pbml0RXZlbnQodHlwZSwgdHJ1ZSwgdHJ1ZSlcblxuICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVIaWdobGlnaHRJY29uIChjb2RlKSB7XG4gIGNvbnN0IGh0bWwgPSAnPGkgY2xhc3M9XCJobC1pY29uIGljb25mb250XCI+JyArICcmI3hlNjUwJyArICc8L2k+J1xuICByZXR1cm4gaHRtbFxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkQ29sb3IgKGNvbG9yKSB7XG4gIGlmICghY29sb3IpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChjb2xvci5jaGFyQXQoMCkgIT09ICcjJykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKGNvbG9yLmxlbmd0aCAhPT0gNykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgLy8gb3V0c2lkZSBjb250YWluZXIuXG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5jbGFzc05hbWUgPSAndGFiLWhlYWRlcidcbiAgICAvLyB0aXAgb24gdGhlIHRvcC5cbiAgICBjb25zdCBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIGJhci5jbGFzc05hbWUgPSAnaGVhZGVyLWJhcidcbiAgICBiYXIudGV4dENvbnRlbnQgPSAnQ0hBTkdFIEZMT09SJ1xuICAgIC8vIG1pZGRsZSBsYXllci5cbiAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICBib2R5LmNsYXNzTmFtZSA9ICdoZWFkZXItYm9keSdcbiAgICBjb25zdCBib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpXG4gICAgYm94LmNsYXNzTmFtZSA9ICd0YWJoZWFkZXInXG5cbiAgICBib2R5LmFwcGVuZENoaWxkKGJveClcbiAgICBub2RlLmFwcGVuZENoaWxkKGJhcilcbiAgICBub2RlLmFwcGVuZENoaWxkKGJvZHkpXG4gICAgdGhpcy5fYmFyID0gYmFyXG4gICAgdGhpcy5fYm9keSA9IGJvZHlcbiAgICB0aGlzLmJveCA9IGJveFxuICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICAvLyBpbml0IGV2ZW50cy5cbiAgICBpbml0Rm9sZEJ0bih0aGlzKVxuICAgIGluaXRFdmVudCh0aGlzKVxuICAgIHJldHVybiBub2RlXG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgaGlnaGxpZ2h0SWNvbiAoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhpZ2hsaWdodEljb24oKVxuICB9LFxuXG4gIGRhdGEgKCkge1xuICAgIGNvbnN0IGF0dHIgPSB0aGlzLmRhdGEuYXR0clxuICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBhIGRlZmF1bHQgc2VsZWN0ZWQgdmFsdWUuXG4gICAgaWYgKGF0dHIuc2VsZWN0ZWRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhdHRyLnNlbGVjdGVkSW5kZXggPSAwXG4gICAgfVxuXG4gICAgY29uc3QgbGlzdCA9IGF0dHIuZGF0YSB8fCBbXVxuICAgIGNvbnN0IGN1ckl0ZW0gPSBhdHRyLnNlbGVjdGVkSW5kZXhcblxuICAgIGNvbnN0IHJldCA9IFtdXG4gICAgY29uc3QgaXRlbVRtcGwgPSAnPGxpIGNsYXNzPVwidGgtaXRlbVwiIGRhdGEtZmxvb3I9XCJ7e2Zsb29yfX1cIj4nXG4gICAgICAgICsgJ3t7aGxJY29ufX17e2Zsb29yTmFtZX19PC9saT4nXG5cbiAgICBsaXN0LmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGlkeCkge1xuICAgICAgbGV0IGh0bWwgPSBpdGVtVG1wbC5yZXBsYWNlKCd7e2Zsb29yfX0nLCBpZHgpXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cbiAgICAgIGlmIChjdXJJdGVtID09IGlkeCkge1xuICAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCd7e2hsSWNvbn19JywgY3JlYXRlSGlnaGxpZ2h0SWNvbigpKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoJ3t7aGxJY29ufX0nLCAnJylcbiAgICAgIH1cbiAgICAgIC8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG5cbiAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoJ3t7Zmxvb3JOYW1lfX0nLCBpdGVtKVxuXG4gICAgICByZXQucHVzaChodG1sKVxuICAgIH0sIHRoaXMpXG5cbiAgICB0aGlzLmJveC5pbm5lckhUTUwgPSByZXQuam9pbignJylcbiAgfSxcblxuICBzZWxlY3RlZEluZGV4ICh2YWwpIHtcbiAgICBjb25zdCBhdHRyID0gdGhpcy5kYXRhLmF0dHJcblxuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsID0gMFxuICAgIH1cblxuICAgIC8vIGlmICh2YWwgPT0gYXR0ci5zZWxlY3RlZEluZGV4KSB7XG4gICAgLy8gICByZXR1cm5cbiAgICAvLyB9XG5cbiAgICBhdHRyLnNlbGVjdGVkSW5kZXggPSB2YWxcblxuICAgIHRoaXMuYXR0ci5kYXRhLmNhbGwodGhpcylcblxuICAgIGZvbGRpbmcodGhpcylcbiAgICB0aGlzLnN0eWxlLnRleHRIaWdobGlnaHRDb2xvci5jYWxsKHRoaXMsIHRoaXMudGV4dEhpZ2hsaWdodENvbG9yKVxuICB9XG59XG5cbmNvbnN0IHN0eWxlID0ge1xuICBvcGFjaXR5ICh2YWwpIHtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdmFsIDwgMCB8fCB2YWwgPiAxKSB7XG4gICAgICB2YWwgPSAxXG4gICAgfVxuXG4gICAgdGhpcy5ub2RlLnN0eWxlLm9wYWNpdHkgPSB2YWxcbiAgfSxcblxuICB0ZXh0Q29sb3IgKHZhbCkge1xuICAgIGlmICghaXNWYWxpZENvbG9yKHZhbCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMubm9kZS5zdHlsZS5jb2xvciA9IHZhbFxuICB9LFxuXG4gIHRleHRIaWdobGlnaHRDb2xvciAodmFsKSB7XG4gICAgaWYgKCFpc1ZhbGlkQ29sb3IodmFsKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMudGV4dEhpZ2hsaWdodENvbG9yID0gdmFsXG4gICAgY29uc3QgYXR0ciA9IHRoaXMuZGF0YS5hdHRyXG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWZsb29yPVwiJ1xuICAgICAgICArIGF0dHIuc2VsZWN0ZWRJbmRleCArICdcIl0nKVxuICAgIGlmIChub2RlKSB7XG4gICAgICBub2RlLnN0eWxlLmNvbG9yID0gdmFsXG4gICAgICBzY3JvbGxUb1ZpZXcodGhpcywgbm9kZSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBBdG9taWMgPSBXZWV4LkF0b21pY1xuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuXG4gIGZ1bmN0aW9uIFRhYkhlYWRlciAoZGF0YSkge1xuICAgIEF0b21pYy5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgVGFiSGVhZGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFRhYkhlYWRlci5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoVGFiSGVhZGVyLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIGV4dGVuZChUYWJIZWFkZXIucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCd0YWJoZWFkZXInLCBUYWJIZWFkZXIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuaW1wb3J0IHsgZmluZEVudGVyS2V5VHlwZSB9IGZyb20gJy4uLy4uL3V0aWxzL2luZGV4J1xuXG5sZXQgYXBwZW5kU3R5bGVcblxuY29uc3QgYXZhaWxhYmxlVHlwZXMgPSBbJ3RleHQnLCAncGFzc3dvcmQnLCAndGVsJywgJ2VtYWlsJywgJ3VybCcsICdkYXRlJywgJ3RpbWUnXVxuY29uc3QgREVGQVVMVF9UWVBFID0gJ3RleHQnXG5cbmZ1bmN0aW9uIHNldFBsYWNlaG9sZGVyQ29sb3IgKGlucHV0LCBwbGFjZWhvbGRlckNvbG9yKSB7XG4gIGlmICghcGxhY2Vob2xkZXJDb2xvcikge1xuICAgIHJldHVyblxuICB9XG4gIGNvbnN0IHZlbmRvcnMgPSBbXG4gICAgJzo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcicsXG4gICAgJzotbW96LXBsYWNlaG9sZGVyJyxcbiAgICAnOjotbW96LXBsYWNlaG9sZGVyJyxcbiAgICAnOi1tcy1pbnB1dC1wbGFjZWhvbGRlcicsXG4gICAgJzpwbGFjZWhvbGRlci1zaG93bidcbiAgXVxuICBsZXQgY3NzID0gJydcbiAgY29uc3QgY3NzUnVsZSA9ICdjb2xvcjogJyArIHBsYWNlaG9sZGVyQ29sb3IgKyAnOydcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSB2ZW5kb3JzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNzcyArPSAnLicgKyBpbnB1dC5jbGFzc05hbWUgKyB2ZW5kb3JzW2ldICsgJ3snXG4gICAgICAgICAgICsgY3NzUnVsZSArICd9J1xuICB9XG4gIGFwcGVuZFN0eWxlKGNzcywgaW5wdXQuc3R5bGVJZCwgdHJ1ZSlcbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcbiAgICBjb25zdCB1dWlkID0gTWF0aC5mbG9vcigxMDAwMDAwMDAwMDAwMCAqIE1hdGgucmFuZG9tKCkpICsgRGF0ZS5ub3coKVxuICAgIHRoaXMuY2xhc3NOYW1lID0gJ3dlZXgtaXB0LScgKyB1dWlkXG4gICAgdGhpcy5zdHlsZUlkID0gJ3dlZXgtc3R5bGUtJyArIHV1aWRcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQodGhpcy5jbGFzc05hbWUpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWVsZW1lbnQnKVxuICAgIHRoaXMucGxhY2Vob2xkZXIgJiYgKG5vZGUucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyKVxuICAgIHRoaXMuY3JlYXRlS2V5Ym9yZEV2ZW50KG5vZGUpXG4gICAgcmV0dXJuIG5vZGVcbiAgfSxcblxuICAvLyBzdXBwb3J0IGVudGVyIGtleSBlbnZlbnRcbiAgY3JlYXRlS2V5Ym9yZEV2ZW50IChub2RlKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhLmV2ZW50KSAmJiB0aGlzLmRhdGEuZXZlbnQuaW5kZXhPZigncmV0dXJuJykgPiAtMSkge1xuICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldikgPT4ge1xuICAgICAgICBjb25zdCBjb2RlID0gZXYua2V5Q29kZVxuICAgICAgICBsZXQga2V5ID0gZXYua2V5XG4gICAgICAgIGlmIChjb2RlID09PSAxMykge1xuICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3RhYicpIHtcbiAgICAgICAgICAgIGtleSA9ICduZXh0J1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByaWdodEtleVR5cGUgPSBmaW5kRW50ZXJLZXlUeXBlKHRoaXMuZGF0YS5hdHRyWydyZXR1cm5LZXlUeXBlJ10pXG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZXR1cm4nLCB7IHJldHVybktleVR5cGU6IHJpZ2h0S2V5VHlwZSB9KVxuICAgICAgICB9XG4gICAgICB9LCBmYWxzZSlcbiAgICB9XG4gIH0sXG5cbiAgZm9jdXMgKCkge1xuICAgIHRoaXMubm9kZS5mb2N1cygpXG4gIH0sXG5cbiAgYmx1ciAoKSB7XG4gICAgdGhpcy5ub2RlLmJsdXIoKVxuICB9XG59XG5cbi8vIHVwZGF0YWJsZSBhdHRyaWJ1dGVzXG5jb25zdCBhdHRyID0ge1xuICBkaXNhYmxlZCAodmFsKSB7XG4gICAgdGhpcy5ub2RlLmRpc2FibGVkID0gISF2YWxcbiAgfSxcblxuICBwbGFjZWhvbGRlciAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnBsYWNlaG9sZGVyID0gdmFsIHx8ICcnXG4gIH0sXG5cbiAgdmFsdWUgKHZhbCkge1xuICAgIHRoaXMubm9kZS52YWx1ZSA9IHZhbCB8fCAnJ1xuICB9LFxuXG4gIGF1dG9mb2N1cyAodmFsKSB7XG4gICAgdGhpcy5ub2RlLmF1dG9mb2N1cyA9ICEhdmFsXG4gIH0sXG5cbiAgdHlwZSAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnR5cGUgPSBhdmFpbGFibGVUeXBlcy5pbmRleE9mKHZhbCkgIT09IC0xXG4gICAgICA/IHZhbFxuICAgICAgOiBERUZBVUxUX1RZUEVcbiAgfSxcblxuICByZXR1cm5LZXlUeXBlICh2YWwpIHtcbiAgICB0aGlzLm5vZGUucmV0dXJuS2V5VHlwZSA9IHZhbCB8fCAnJ1xuICB9XG59XG5cbi8vIHVwZGF0YWJsZSBzdHlsZXNcbmNvbnN0IHN0eWxlID0ge1xuICBwbGFjZWhvbGRlckNvbG9yOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgc2V0UGxhY2Vob2xkZXJDb2xvcih0aGlzLCB2YWwpXG4gIH1cbn1cblxuLy8gZXZlbnRzIGNvbmZpZ3VyYXRpb25zXG5jb25zdCBldmVudCA9IHtcbiAgaW5wdXQ6IHtcbiAgICB1cGRhdG9yICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMubm9kZS52YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBleHRyYSAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgY2hhbmdlOiB7XG4gICAgdXBkYXRvcjogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGV4dHJhOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KClcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcmV0dXJuOiB7XG4gICAgdXBkYXRvcjogZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBBdG9taWMgPSBXZWV4LkF0b21pY1xuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuICBhcHBlbmRTdHlsZSA9IFdlZXgudXRpbHMuYXBwZW5kU3R5bGVcblxuICAvLyBhdHRyczpcbiAgLy8gICAtIHR5cGU6IHRleHR8cGFzc3dvcmR8dGVsfGVtYWlsfHVybFxuICAvLyAgIC0gdmFsdWVcbiAgLy8gICAtIHBsYWNlaG9sZGVyXG4gIC8vICAgLSBkaXNhYmxlZFxuICAvLyAgIC0gYXV0b2ZvY3VzXG4gIGZ1bmN0aW9uIElucHV0IChkYXRhKSB7XG4gICAgQXRvbWljLmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBJbnB1dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUpXG4gIGV4dGVuZChJbnB1dC5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoSW5wdXQucHJvdG90eXBlLCB7IGF0dHIgfSlcbiAgZXh0ZW5kKElucHV0LnByb3RvdHlwZSwge1xuICAgIHN0eWxlOiBleHRlbmQoT2JqZWN0LmNyZWF0ZShBdG9taWMucHJvdG90eXBlLnN0eWxlKSwgc3R5bGUpXG4gIH0pXG4gIGV4dGVuZChJbnB1dC5wcm90b3R5cGUsIHsgZXZlbnQgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdpbnB1dCcsIElucHV0KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcbmltcG9ydCB7IGZpbmRFbnRlcktleVR5cGUgfSBmcm9tICcuLi8uLi91dGlscy9pbmRleCdcblxuY29uc3QgREVGQVVMVF9ST1dTID0gMlxuXG4vKipcbiAqIGF0dHI6XG4gKiByb3dzOiBkZWZhdWx0IGlzIDIuXG4gKiBkaXNhYmxlZFxuICogcGxhY2Vob2xkZXJcbiAqL1xuXG5jb25zdCBwcm90byA9IHtcbiAgY3JlYXRlICgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1lbGVtZW50JylcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtdGV4dGFyZWEnKVxuICAgIHRoaXMuY3JlYXRlS2V5Ym9hcmRFdmVudChub2RlKVxuICAgIHJldHVybiBub2RlXG4gIH0sXG5cbiAgLy8gc3VwcG9ydCBlbnRlciBrZXkgZW52ZW50XG4gIGNyZWF0ZUtleWJvYXJkRXZlbnQgKG5vZGUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmRhdGEuZXZlbnQpICYmIHRoaXMuZGF0YS5ldmVudC5pbmRleE9mKCdyZXR1cm4nKSA+IC0xKSB7XG4gICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvZGUgPSBldi5rZXlDb2RlXG4gICAgICAgIGxldCBrZXkgPSBldi5rZXlcbiAgICAgICAgaWYgKGNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSAndGFiJykge1xuICAgICAgICAgICAga2V5ID0gJ25leHQnXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJpZ2h0S2V5VHlwZSA9IGZpbmRFbnRlcktleVR5cGUodGhpcy5kYXRhLmF0dHJbJ3JldHVybktleVR5cGUnXSlcbiAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3JldHVybicsIHsgcmV0dXJuS2V5VHlwZTogcmlnaHRLZXlUeXBlIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIGZhbHNlKVxuICAgIH1cbiAgfVxufVxuXG4vLyB1cGRhdGFibGUgYXR0cmlidXRlc1xuY29uc3QgYXR0ciA9IHtcbiAgcm93cyAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnJvd3MgPSB2YWwgfHwgREVGQVVMVF9ST1dTXG4gIH0sXG4gIGRpc2FibGVkICh2YWwpIHtcbiAgICB0aGlzLm5vZGUuZGlzYWJsZWQgPSAhIXZhbFxuICB9LFxuICBwbGFjZWhvbGRlciAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnBsYWNlaG9sZGVyID0gdmFsIHx8ICcnXG4gIH0sXG4gIHZhbHVlICh2YWwpIHtcbiAgICB0aGlzLm5vZGUudmFsdWUgPSB2YWwgfHwgJydcbiAgfSxcbiAgYXV0b2ZvY3VzICh2YWwpIHtcbiAgICB0aGlzLm5vZGUuYXV0b2ZvY3VzID0gISF2YWxcbiAgfSxcbiAgcmV0dXJuS2V5VHlwZSAodmFsKSB7XG4gICAgdGhpcy5ub2RlLnJldHVybktleVR5cGUgPSB2YWwgfHwgJydcbiAgfVxufVxuXG4vLyBldmVudHMgY29uZmlndXJhdGlvbnNcbmNvbnN0IGV2ZW50ID0ge1xuICBpbnB1dDoge1xuICAgIHVwZGF0b3IgKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICB2YWx1ZTogdGhpcy5ub2RlLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGV4dHJhICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB0aGlzLm5vZGUudmFsdWUsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBjaGFuZ2U6IHtcbiAgICB1cGRhdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLm5vZGUudmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgZXh0cmE6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB0aGlzLm5vZGUudmFsdWUsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICByZXR1cm46IHtcbiAgICB1cGRhdG9yOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLm5vZGUudmFsdWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IEF0b21pYyA9IFdlZXguQXRvbWljXG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG5cbiAgLy8gYXR0cnM6XG4gIC8vICAgLSByb3dzXG4gIC8vICAgLSBkaXNhYmxlZFxuICAvLyAgIC0gcGxhY2Vob2xkZXJcbiAgZnVuY3Rpb24gVGV4dGFyZWEgKGRhdGEpIHtcbiAgICBBdG9taWMuY2FsbCh0aGlzLCBkYXRhKVxuICB9XG4gIFRleHRhcmVhLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFRleHRhcmVhLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChUZXh0YXJlYS5wcm90b3R5cGUsIHsgYXR0ciB9KVxuICBleHRlbmQoVGV4dGFyZWEucHJvdG90eXBlLCB7IGV2ZW50IH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgndGV4dGFyZWEnLCBUZXh0YXJlYSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCAnLi92aWRlby5jc3MnXG5cbmZ1bmN0aW9uIGdldFByb3RvIChXZWV4KSB7XG4gIGNvbnN0IEF0b21pYyA9IFdlZXguQXRvbWljXG4gIHJldHVybiB7XG4gICAgY3JlYXRlICgpIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpXG4gICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtdmlkZW8nKVxuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWVsZW1lbnQnKVxuICAgICAgbm9kZS5jb250cm9scyA9IHRydWVcbiAgICAgIG5vZGUuYXV0b3BsYXkgPSB0aGlzLmF1dG9QbGF5XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAnJylcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCd3ZWJraXQtcGxheXNpbmxpbmUnLCAnJylcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCdwbGF5LXN0YXR1cycsIHRoaXMucGxheVN0YXR1cylcbiAgICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICAgIGlmICh0aGlzLmF1dG9QbGF5ICYmIHRoaXMucGxheVN0YXR1cyA9PT0gJ3BsYXknKSB7XG4gICAgICAgIC8vIHNldCB0aW1lciB0byBhdm9pZCBlcnJvcjogdW5jYXVnaHQgRE9NIGV4Y2VwdGlvbjogdGhlIHBsYXkoKSByZXF1ZXN0XG4gICAgICAgIC8vIHdhcyBpbnRlcnJ1cHRlZCBieSBhIG5ldyBsb2FkIHJlcXVlc3QuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGxheSgpXG4gICAgICAgIH0sIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZVxuICAgIH0sXG5cbiAgICBiaW5kRXZlbnRzIChldnRzKSB7XG4gICAgICBBdG9taWMucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzLCBldnRzKVxuXG4gICAgICAvLyBjb252ZXJ0IHczYy12aWRlbyBldmVudHMgdG8gd2VleC12aWRlbyBldmVudHMuXG4gICAgICBjb25zdCBldnRzTWFwID0ge1xuICAgICAgICBzdGFydDogJ3BsYXknLFxuICAgICAgICBmaW5pc2g6ICdlbmRlZCcsXG4gICAgICAgIGZhaWw6ICdlcnJvcidcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZXZ0TmFtZSBpbiBldnRzTWFwKSB7XG4gICAgICAgIHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dHNNYXBbZXZ0TmFtZV0sIGZ1bmN0aW9uICh0eXBlLCBlKSB7XG4gICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KHR5cGUsIGUuZGF0YSlcbiAgICAgICAgfS5iaW5kKHRoaXMsIGV2dE5hbWUpKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwbGF5ICgpIHtcbiAgICAgIGxldCBzcmMgPSB0aGlzLm5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKVxuICAgICAgaWYgKCFzcmMpIHtcbiAgICAgICAgc3JjID0gdGhpcy5ub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1zcmMnKVxuICAgICAgICBzcmMgJiYgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnc3JjJywgc3JjKVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5ub2RlLnBsYXkoKVxuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBETyBOT1RISU5HLlxuICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXVzZSAoKSB7XG4gICAgICB0aGlzLm5vZGUucGF1c2UoKVxuICAgIH0sXG5cbiAgICBzdG9wICgpIHtcbiAgICAgIHRoaXMubm9kZS5wYXVzZSgpXG4gICAgICB0aGlzLm5vZGUuYXV0b3BsYXkgPSBmYWxzZVxuICAgICAgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1zcmMnLCB0aGlzLm5vZGUuc3JjKVxuICAgICAgdGhpcy5ub2RlLnNyYyA9ICcnXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIHBsYXlTdGF0dXMgKHZhbCkge1xuICAgIGlmICh2YWwgIT09ICdwbGF5JyAmJiB2YWwgIT09ICdzdG9wJyAmJiB2YWwgIT09ICdwYXVzZScpIHtcbiAgICAgIHZhbCA9ICdwYXVzZSdcbiAgICB9XG4gICAgaWYgKHRoaXMucGxheVN0YXR1cyA9PT0gdmFsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5wbGF5U3RhdHVzID0gdmFsXG4gICAgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgncGxheS1zdGF0dXMnLCB2YWwpXG4gICAgdGhpc1t0aGlzLnBsYXlTdGF0dXNdKClcbiAgfSxcblxuICBhdXRvUGxheSAodmFsKSB7XG4gICAgLy8gRE8gTk9USElOR1xuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQXRvbWljID0gV2VleC5BdG9taWNcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyczpcbiAgLy8gICAtIGF1dG9QbGF5OiB0cnVlIHwgZmFsc2UgKGRlZmF1bHQ6IGZhbHNlKVxuICAvLyAgIC0gcGxheVN0YXR1czogcGxheSB8IHBhdXNlIHwgc3RvcFxuICAvLyAgIC0gc3JjOiB7c3RyaW5nfVxuICAvLyAgIC0gcG9zdGVyOiB7c3RyaW5nfVxuICAvLyAgIC0gbG9vcDogdHJ1ZSB8IGZhbHNlIChkZWZhdWx0OiBmYWxzZSlcbiAgLy8gICAtIG11dGVkOiB0cnVlIHwgZmFsc2UgKGRlZmF1bHQ6IGZhbHNlKVxuICAvLyBldmVudHM6XG4gIC8vICAgLSBzdGFydFxuICAvLyAgIC0gcGF1c2VcbiAgLy8gICAtIGZpbmlzaFxuICAvLyAgIC0gZmFpbFxuICBmdW5jdGlvbiBWaWRlbyAoZGF0YSkge1xuICAgIGNvbnN0IGF1dG9QbGF5ID0gZGF0YS5hdHRyLmF1dG9QbGF5XG4gICAgY29uc3QgcGxheVN0YXR1cyA9IGRhdGEuYXR0ci5wbGF5U3RhdHVzXG4gICAgdGhpcy5hdXRvUGxheSA9IGF1dG9QbGF5ID09PSB0cnVlIHx8IGF1dG9QbGF5ID09PSAndHJ1ZSdcbiAgICBpZiAocGxheVN0YXR1cyAhPT0gJ3BsYXknXG4gICAgICAgICYmIHBsYXlTdGF0dXMgIT09ICdzdG9wJ1xuICAgICAgICAmJiBwbGF5U3RhdHVzICE9PSAncGF1c2UnKSB7XG4gICAgICB0aGlzLnBsYXlTdGF0dXMgPSAncGF1c2UnXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5wbGF5U3RhdHVzID0gcGxheVN0YXR1c1xuICAgIH1cbiAgICBBdG9taWMuY2FsbCh0aGlzLCBkYXRhKVxuICB9XG4gIFZpZGVvLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFZpZGVvLnByb3RvdHlwZSwgZ2V0UHJvdG8oV2VleCkpXG4gIGV4dGVuZChWaWRlby5wcm90b3R5cGUsIHsgYXR0ciB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3ZpZGVvJywgVmlkZW8pXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG5cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCAnLi9zd2l0Y2guY3NzJ1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgY29sb3I6ICcjNjRiZDYzJyxcbiAgc2Vjb25kYXJ5Q29sb3I6ICcjZGZkZmRmJyxcbiAgamFja0NvbG9yOiAnI2ZmZicsXG4gIGphY2tTZWNvbmRhcnlDb2xvcjogbnVsbCxcbiAgY2xhc3NOYW1lOiAnd2VleC1zd2l0Y2gnLFxuICBkaXNhYmxlZE9wYWNpdHk6IDAuNSxcbiAgc3BlZWQ6ICcwLjRzJyxcbiAgd2lkdGg6IDEwMCxcbiAgaGVpZ2h0OiA2MCxcbiAgLy8gaXMgd2lkdGggYW5kIGhlaWdodCBzY2FsYWJsZSA/XG4gIHNjYWxhYmxlOiBmYWxzZVxufVxuXG5mdW5jdGlvbiB0cmFuc2l0aW9uaXplIChlbGVtZW50LCBwcm9wcykge1xuICBjb25zdCB0cmFuc2l0aW9ucyA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIHByb3BzKSB7XG4gICAgdHJhbnNpdGlvbnMucHVzaChrZXkgKyAnICcgKyBwcm9wc1trZXldKVxuICB9XG4gIGVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25zLmpvaW4oJywgJylcbiAgZWxlbWVudC5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gdHJhbnNpdGlvbnMuam9pbignLCAnKVxufVxuXG5mdW5jdGlvbiBzZXRTaXplIChjb21wKSB7XG4gIGNvbnN0IG1pbiA9IE1hdGgubWluKGNvbXAud2lkdGgsIGNvbXAuaGVpZ2h0KVxuICBjb25zdCBtYXggPSBNYXRoLm1heChjb21wLndpZHRoLCBjb21wLmhlaWdodClcbiAgY29tcC5ub2RlLnN0eWxlLndpZHRoID0gbWF4ICsgJ3B4J1xuICBjb21wLm5vZGUuc3R5bGUuaGVpZ2h0ID0gbWluICsgJ3B4J1xuICBjb21wLm5vZGUuc3R5bGUuYm9yZGVyUmFkaXVzID0gbWluIC8gMiArICdweCdcbiAgY29tcC5qYWNrLnN0eWxlLndpZHRoXG4gICAgICA9IGNvbXAuamFjay5zdHlsZS5oZWlnaHRcbiAgICAgID0gbWluICsgJ3B4J1xufVxuXG5mdW5jdGlvbiBzZXRQb3NpdGlvbiAoY29tcCwgY2xpY2tlZCkge1xuICBsZXQgY2hlY2tlZCA9IGNvbXAuY2hlY2tlZFxuICBjb25zdCBub2RlID0gY29tcC5ub2RlXG4gIGNvbnN0IGphY2sgPSBjb21wLmphY2tcblxuICBpZiAoY2xpY2tlZCAmJiBjaGVja2VkKSB7XG4gICAgY2hlY2tlZCA9IGZhbHNlXG4gIH1cbiAgZWxzZSBpZiAoY2xpY2tlZCAmJiAhY2hlY2tlZCkge1xuICAgIGNoZWNrZWQgPSB0cnVlXG4gIH1cblxuICBpZiAoY2hlY2tlZCA9PT0gdHJ1ZSkge1xuICAgIGNvbXAuY2hlY2tlZCA9IHRydWVcblxuICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkge1xuICAgICAgamFjay5zdHlsZS5sZWZ0ID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSkud2lkdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAtIHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGphY2spLndpZHRoKSArICdweCdcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBqYWNrLnN0eWxlLmxlZnQgPSBwYXJzZUludChub2RlLmN1cnJlbnRTdHlsZVsnd2lkdGgnXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC0gcGFyc2VJbnQoamFjay5jdXJyZW50U3R5bGVbJ3dpZHRoJ10pICsgJ3B4J1xuICAgIH1cblxuICAgIGNvbXAub3B0aW9ucy5jb2xvciAmJiBjb2xvcml6ZShjb21wKVxuICAgIHNldFNwZWVkKGNvbXApXG4gIH1cbiAgZWxzZSB7XG4gICAgY29tcC5jaGVja2VkID0gZmFsc2VcbiAgICBqYWNrLnN0eWxlLmxlZnQgPSAwXG4gICAgbm9kZS5zdHlsZS5ib3hTaGFkb3cgPSAnaW5zZXQgMCAwIDAgMCAnICsgY29tcC5vcHRpb25zLnNlY29uZGFyeUNvbG9yXG4gICAgbm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IGNvbXAub3B0aW9ucy5zZWNvbmRhcnlDb2xvclxuICAgIG5vZGUuc3R5bGUuYmFja2dyb3VuZENvbG9yXG4gICAgICAgID0gKGNvbXAub3B0aW9ucy5zZWNvbmRhcnlDb2xvciAhPT0gZGVmYXVsdHMuc2Vjb25kYXJ5Q29sb3IpXG4gICAgICAgICAgPyBjb21wLm9wdGlvbnMuc2Vjb25kYXJ5Q29sb3JcbiAgICAgICAgICA6ICcjZmZmJ1xuICAgIGphY2suc3R5bGUuYmFja2dyb3VuZENvbG9yXG4gICAgICAgID0gKGNvbXAub3B0aW9ucy5qYWNrU2Vjb25kYXJ5Q29sb3IgIT09IGNvbXAub3B0aW9ucy5qYWNrQ29sb3IpXG4gICAgICAgICAgPyBjb21wLm9wdGlvbnMuamFja1NlY29uZGFyeUNvbG9yXG4gICAgICAgICAgOiBjb21wLm9wdGlvbnMuamFja0NvbG9yXG4gICAgc2V0U3BlZWQoY29tcClcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRTcGVlZCAoY29tcCkge1xuICBsZXQgc3dpdGNoZXJQcm9wID0ge31cbiAgY29uc3QgamFja1Byb3AgPSB7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiBjb21wLm9wdGlvbnMuc3BlZWQsXG4gICAgbGVmdDogY29tcC5vcHRpb25zLnNwZWVkLnJlcGxhY2UoL1thLXpdLywgJycpIC8gMiArICdzJ1xuICB9XG5cbiAgaWYgKGNvbXAuY2hlY2tlZCkge1xuICAgIHN3aXRjaGVyUHJvcCA9IHtcbiAgICAgIGJvcmRlcjogY29tcC5vcHRpb25zLnNwZWVkLFxuICAgICAgJ2JveC1zaGFkb3cnOiBjb21wLm9wdGlvbnMuc3BlZWQsXG4gICAgICAnYmFja2dyb3VuZC1jb2xvcic6IGNvbXAub3B0aW9ucy5zcGVlZC5yZXBsYWNlKC9bYS16XS8sICcnKSAqIDMgKyAncydcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgc3dpdGNoZXJQcm9wID0ge1xuICAgICAgYm9yZGVyOiBjb21wLm9wdGlvbnMuc3BlZWQsXG4gICAgICAnYm94LXNoYWRvdyc6IGNvbXAub3B0aW9ucy5zcGVlZFxuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRpb25pemUoY29tcC5ub2RlLCBzd2l0Y2hlclByb3ApXG4gIHRyYW5zaXRpb25pemUoY29tcC5qYWNrLCBqYWNrUHJvcClcbn1cblxuZnVuY3Rpb24gY29sb3JpemUgKGNvbXApIHtcbiAgY29uc3Qgbm9kZUhlaWdodCA9IGNvbXAubm9kZS5vZmZzZXRIZWlnaHQgLyAyXG5cbiAgY29tcC5ub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbXAub3B0aW9ucy5jb2xvclxuICBjb21wLm5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBjb21wLm9wdGlvbnMuY29sb3JcbiAgY29tcC5ub2RlLnN0eWxlLmJveFNoYWRvdyA9ICdpbnNldCAwIDAgMCAnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5vZGVIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ3B4ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29tcC5vcHRpb25zLmNvbG9yXG4gIGNvbXAuamFjay5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb21wLm9wdGlvbnMuamFja0NvbG9yXG59XG5cbmZ1bmN0aW9uIGdldENsaWNrSGFuZGxlciAoY29tcCkge1xuICBpZiAoIWNvbXAuX2NsaWNrSGFuZGxlcikge1xuICAgIGNvbXAuX2NsaWNrSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldFBvc2l0aW9uKGNvbXAsIHRydWUpXG4gICAgICBjb21wLmRpc3BhdGNoRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgdmFsdWU6IGNvbXAuY2hlY2tlZFxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbXAuX2NsaWNrSGFuZGxlclxufVxuXG5jb25zdCBwcm90byA9IHtcbiAgY3JlYXRlICgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpXG4gICAgdGhpcy5qYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc21hbGwnKVxuICAgIG5vZGUuYXBwZW5kQ2hpbGQodGhpcy5qYWNrKVxuICAgIG5vZGUuY2xhc3NOYW1lID0gdGhpcy5vcHRpb25zLmNsYXNzTmFtZVxuICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICB0aGlzLmF0dHIuZGlzYWJsZWQuY2FsbCh0aGlzLCB0aGlzLmRhdGEuYXR0ci5kaXNhYmxlZClcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIG9uQXBwZW5kICgpIHtcbiAgICBzZXRTaXplKHRoaXMpXG4gICAgc2V0UG9zaXRpb24odGhpcylcbiAgfSxcblxuICBlbmFibGUgKCkge1xuICAgIHRoaXMuZGlzYWJsZWQgJiYgKHRoaXMuZGlzYWJsZWQgPSBmYWxzZSlcbiAgICB0aGlzLm5vZGUuc3R5bGUub3BhY2l0eSA9IDFcbiAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBnZXRDbGlja0hhbmRsZXIodGhpcykpXG4gIH0sXG5cbiAgZGlzYWJsZSAoKSB7XG4gICAgIXRoaXMuZGlzYWJsZWQgJiYgKHRoaXMuZGlzYWJsZWQgPSB0cnVlKVxuICAgIHRoaXMubm9kZS5zdHlsZS5vcGFjaXR5ID0gZGVmYXVsdHMuZGlzYWJsZWRPcGFjaXR5XG4gICAgdGhpcy5ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2V0Q2xpY2tIYW5kbGVyKHRoaXMpKVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIGRpc2FibGVkOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IHZhbCAmJiB2YWwgIT09ICdmYWxzZSdcbiAgICB0aGlzLmRpc2FibGVkID8gdGhpcy5kaXNhYmxlKCkgOiB0aGlzLmVuYWJsZSgpXG4gIH1cbn1cblxuY29uc3Qgc3R5bGUgPSB7XG4gIHdpZHRoOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2NhbGFibGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICBpZiAoaXNOYU4odmFsKSB8fCB2YWwgPCAwKSB7XG4gICAgICB2YWwgPSB0aGlzLm9wdGlvbnMud2lkdGhcbiAgICB9XG4gICAgdGhpcy53aWR0aCA9IHZhbFxuICAgIHRoaXMuc2V0U2l6ZSgpXG4gIH0sXG5cbiAgaGVpZ2h0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2NhbGFibGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB2YWwgPSBwYXJzZUZsb2F0KHZhbClcbiAgICBpZiAoaXNOYU4odmFsKSB8fCB2YWwgPCAwKSB7XG4gICAgICB2YWwgPSB0aGlzLm9wdGlvbnMuaGVpZ2h0XG4gICAgfVxuICAgIHRoaXMuaGVpZ2h0ID0gdmFsXG4gICAgdGhpcy5zZXRTaXplKClcbiAgfVxufVxuXG5jb25zdCBldmVudCA9IHtcbiAgY2hhbmdlOiB7XG4gICAgdXBkYXRvciAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhdHRyczoge1xuICAgICAgICAgIGNoZWNrZWQ6IHRoaXMuY2hlY2tlZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBleHRyYSAoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdGhpcy5jaGVja2VkXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQXRvbWljID0gV2VleC5BdG9taWNcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyczpcbiAgLy8gICAtIGNoZWNrZWQ6IGlmIGlzIGNoZWNrZWQuXG4gIC8vICAgLSBkaXNhYmxlZDogaWYgdHJ1ZSwgdGhpcyBjb21wb25lbnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgaW50ZXJhY3Rpb24uXG4gIGZ1bmN0aW9uIFN3aXRjaCAoZGF0YSkge1xuICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMpXG4gICAgdGhpcy5jaGVja2VkID0gZGF0YS5hdHRyLmNoZWNrZWRcbiAgICAgICAgJiYgZGF0YS5hdHRyLmNoZWNrZWQgIT09ICdmYWxzZSdcbiAgICB0aGlzLmRhdGEgPSBkYXRhXG4gICAgdGhpcy53aWR0aCA9IHRoaXMub3B0aW9ucy53aWR0aFxuICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmhlaWdodFxuICAgIEF0b21pYy5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgU3dpdGNoLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQXRvbWljLnByb3RvdHlwZSlcbiAgZXh0ZW5kKFN3aXRjaC5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoU3dpdGNoLnByb3RvdHlwZSwgeyBhdHRyIH0pXG4gIGV4dGVuZChTd2l0Y2gucHJvdG90eXBlLCB7XG4gICAgc3R5bGU6IGV4dGVuZChPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUuc3R5bGUpLCBzdHlsZSlcbiAgfSlcbiAgZXh0ZW5kKFN3aXRjaC5wcm90b3R5cGUsIHsgZXZlbnQgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdzd2l0Y2gnLCBTd2l0Y2gpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5mdW5jdGlvbiBnZXRQcm90byAoV2VleCkge1xuICBjb25zdCBDb21wb25lbnQgPSBXZWV4LkNvbXBvbmVudFxuICByZXR1cm4ge1xuICAgIGNyZWF0ZSAoKSB7XG4gICAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtY29udGFpbmVyJylcbiAgICAgIG5vZGUuc3R5bGUudGV4dERlY29yYXRpb24gPSAnbm9uZSdcbiAgICAgIHJldHVybiBub2RlXG4gICAgfSxcblxuICAgIGJpbmRFdmVudHMgKGV2dHMpIHtcbiAgICAgIC8vIGV2ZW50IGhhbmRsZXIgZm9yIGNsaWNrIGV2ZW50IHdpbGwgYmUgcHJvY2Vzc2VkXG4gICAgICAvLyBiZWZvcmUgdGhlIHVybCByZWRpcmVjdGlvbi5cbiAgICAgIENvbXBvbmVudC5wcm90b3R5cGUuYmluZEV2ZW50cy5jYWxsKHRoaXMsIGV2dHMpXG4gICAgICB0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIGlmIChldnQuX2FscmVhZHlGaXJlZCAmJiBldnQudGFyZ2V0ICE9PSB0aGlzLm5vZGUpIHtcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnQgdGFyZ2V0IGlzIHRoaXMubm9kZSwgdGhlbiB0aGlzIGlzXG4gICAgICAgICAgLy8ganVzdCBhbm90aGVyIGNsaWNrIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBzYW1lXG4gICAgICAgICAgLy8gdGFyZ2V0LCBub3QgYSBoYW5kbGVyIGZvciBhIGJ1YmJsaW5nIHVwIGV2ZW50LFxuICAgICAgICAgIC8vIG90aGVyd2lzZSBpdCBpcyBhIGJ1YmJsaW5nIHVwIGV2ZW50LCBhbmQgaXRcbiAgICAgICAgICAvLyBzaG91bGQgYmUgZGlzcmVnYXJkZWQuXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZXZ0Ll9hbHJlYWR5RmlyZWQgPSB0cnVlXG4gICAgICAgIGxvY2F0aW9uLmhyZWYgPSB0aGlzLmhyZWZcbiAgICAgIH0uYmluZCh0aGlzKSlcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgaHJlZjogZnVuY3Rpb24gKHZhbCkge1xuICAgIGlmICghdmFsKSB7XG4gICAgICByZXR1cm4gY29uc29sZS53YXJuKCdbd2ViLXJlbmRlcl0gaHJlZiBvZiA8YT4gc2hvdWxkIG5vdCBiZSBhIG51bGwgdmFsdWUuJylcbiAgICB9XG4gICAgdGhpcy5ocmVmID0gdmFsXG4gICAgdGhpcy5ub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1ocmVmJywgdmFsKVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQ29tcG9uZW50ID0gV2VleC5Db21wb25lbnRcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcblxuICAvLyBhdHRyczpcbiAgLy8gICAtIGhyZWZcbiAgZnVuY3Rpb24gQSAoZGF0YSkge1xuICAgIENvbXBvbmVudC5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cblxuICBBLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tcG9uZW50LnByb3RvdHlwZSlcbiAgZXh0ZW5kKEEucHJvdG90eXBlLCBnZXRQcm90byhXZWV4KSlcbiAgZXh0ZW5kKEEucHJvdG90eXBlLCB7IGF0dHIgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdhJywgQSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cblxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgSURfUFJFRklYID0gJ3dlZXhfZW1iZWRfJ1xuXG5sZXQgZ2V0UmFuZG9tXG5cbmZ1bmN0aW9uIF9nZW5lcmF0ZUlkICgpIHtcbiAgcmV0dXJuIElEX1BSRUZJWCArIGdldFJhbmRvbSgxMClcbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5pZCA9IHRoaXMuaWRcbiAgICBub2RlLnN0eWxlLm92ZXJmbG93ID0gJ3Njcm9sbCdcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIGluaXRXZWV4ICgpIHtcbiAgICB0aGlzLmlkID0gX2dlbmVyYXRlSWQoKVxuICAgIHRoaXMubm9kZS5pZCA9IHRoaXMuaWRcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBhcHBJZDogdGhpcy5pZCxcbiAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICBidW5kbGVVcmw6IHRoaXMuc291cmNlLFxuICAgICAgbG9hZGVyOiB0aGlzLmxvYWRlcixcbiAgICAgIGpzb25wQ2FsbGJhY2s6IHRoaXMuanNvbnBDYWxsYmFjayxcbiAgICAgIHdpZHRoOiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsXG4gICAgICByb290SWQ6IHRoaXMuaWQsXG4gICAgICBlbWJlZDogdHJ1ZVxuICAgIH1cbiAgICB3aW5kb3cud2VleC5pbml0KGNvbmZpZylcbiAgfSxcblxuICBkZXN0cm95V2VleCAoKSB7XG4gICAgdGhpcy5pZCAmJiB3aW5kb3cuZGVzdHJveUluc3RhbmNlKHRoaXMuaWQpXG4gICAgLy8gVE9ETzogdW5iaW5kIGV2ZW50cyBhbmQgY2xlYXIgZG9tcy5cbiAgICB0aGlzLm5vZGUuaW5uZXJIVE1MID0gJydcbiAgfSxcblxuICByZWxvYWRXZWV4ICgpIHtcbiAgICBpZiAodGhpcy5pZCkge1xuICAgICAgdGhpcy5kZXN0cm95V2VleCgpXG4gICAgICB0aGlzLmlkID0gbnVsbFxuICAgICAgdGhpcy5ub2RlLmlkID0gbnVsbFxuICAgICAgdGhpcy5ub2RlLmlubmVySFRNTCA9ICcnXG4gICAgfVxuICAgIHRoaXMuaW5pdFdlZXgoKVxuICB9XG59XG5cbi8vIG5vdCByZWNvbW1lbmRlZCwgYmVjYXVzZSBvZiB0aGUgbGVhayBvZiBtZW1vcnkuXG5jb25zdCBhdHRyID0ge1xuICBzcmM6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHRoaXMuc291cmNlID0gdmFsdWVcbiAgICB0aGlzLnJlbG9hZFdlZXgoKVxuICB9XG59XG5cbmZ1bmN0aW9uIGluaXQgKFdlZXgpIHtcbiAgY29uc3QgQ29tcG9uZW50ID0gV2VleC5Db21wb25lbnRcbiAgY29uc3QgZXh0ZW5kID0gV2VleC51dGlscy5leHRlbmRcbiAgZ2V0UmFuZG9tID0gV2VleC51dGlscy5nZXRSYW5kb21cblxuICBmdW5jdGlvbiBFbWJlZCAoZGF0YSwgbm9kZVR5cGUpIHtcbiAgICBjb25zdCBhdHRyID0gZGF0YS5hdHRyXG4gICAgaWYgKGF0dHIpIHtcbiAgICAgIHRoaXMuc291cmNlID0gYXR0ci5zcmNcbiAgICAgIHRoaXMubG9hZGVyID0gYXR0ci5sb2FkZXIgfHwgJ3hocidcbiAgICAgIHRoaXMuanNvbnBDYWxsYmFjayA9IGF0dHIuanNvbnBDYWxsYmFja1xuICAgIH1cbiAgICBDb21wb25lbnQuY2FsbCh0aGlzLCBkYXRhLCBub2RlVHlwZSlcbiAgfVxuXG4gIEVtYmVkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoQ29tcG9uZW50LnByb3RvdHlwZSlcbiAgZXh0ZW5kKEVtYmVkLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChFbWJlZC5wcm90b3R5cGUsIHsgYXR0ciB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2VtYmVkJywgRW1iZWQpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHsgaW5pdCB9XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBDU1NSdWxlICovXG5cbid1c2Ugc3RyaWN0J1xuXG5pbXBvcnQgJy4vc3Bpbm5lci5jc3MnXG5cbmxldCBsb29wQXJyYXksIGdldFJnYlxuXG5mdW5jdGlvbiBnZXRTdHlsZVNoZWV0IChzcGlubmVyKSB7XG4gIGlmIChzcGlubmVyLnN0eWxlU2hlZXQpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5zdHlsZVNoZWV0c1xuICBsZXQgaSwgbCwgaiwgbVxuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sYWJlbHMgKi9cbiAgb3V0ZXI6IGZvciAoaSA9IDAsIGwgPSBzdHlsZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgcnVsZXMgPSBzdHlsZXNbaV0ucnVsZXNcbiAgICBpZiAoIXJ1bGVzKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBmb3IgKGogPSAwLCBtID0gcnVsZXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7XG4gICAgICBjb25zdCBpdGVtID0gcnVsZXMuaXRlbShqKVxuICAgICAgaWYgKFxuICAgICAgICAoaXRlbS50eXBlID09PSBDU1NSdWxlLktFWUZSQU1FU19SVUxFXG4gICAgICAgICAgfHwgaXRlbS50eXBlID09PSBDU1NSdWxlLldFQktJVF9LRVlGUkFNRVNfUlVMRSlcbiAgICAgICAgJiYgaXRlbS5uYW1lID09PSAnd2VleC1zcGlubmVyJykge1xuICAgICAgICBicmVhayBvdXRlclxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWxhYmVscyAqL1xuICBzcGlubmVyLnN0eWxlU2hlZXQgPSBzdHlsZXNbaV1cbn1cblxuZnVuY3Rpb24gc2V0S2V5ZnJhbWVDb2xvciAoc3Bpbm5lciwgdmFsKSB7XG4gIGdldFN0eWxlU2hlZXQoc3Bpbm5lcilcbiAgY29uc3Qga2V5ZnJhbWVSdWxlcyA9IGNvbXB1dGVLZXlGcmFtZVJ1bGVzKHZhbClcbiAgY29uc3QgcnVsZXMgPSBzcGlubmVyLnN0eWxlU2hlZXQucnVsZXNcbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBydWxlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gcnVsZXMuaXRlbShpKVxuICAgIGlmICgoaXRlbS50eXBlID09PSBDU1NSdWxlLktFWUZSQU1FU19SVUxFXG4gICAgICAgICAgfHwgaXRlbS50eXBlID09PSBDU1NSdWxlLldFQktJVF9LRVlGUkFNRVNfUlVMRSlcbiAgICAgICAgJiYgaXRlbS5uYW1lID09PSAnd2VleC1zcGlubmVyJykge1xuICAgICAgY29uc3QgY3NzUnVsZXMgPSBpdGVtLmNzc1J1bGVzXG4gICAgICBmb3IgKGxldCBqID0gMCwgbSA9IGNzc1J1bGVzLmxlbmd0aDsgaiA8IG07IGorKykge1xuICAgICAgICBjb25zdCBrZXlmcmFtZSA9IGNzc1J1bGVzW2pdXG4gICAgICAgIGlmIChrZXlmcmFtZS50eXBlID09PSBDU1NSdWxlLktFWUZSQU1FX1JVTEVcbiAgICAgICAgICB8fCBrZXlmcmFtZS50eXBlID09PSBDU1NSdWxlLldFQktJVF9LRVlGUkFNRV9SVUxFKSB7XG4gICAgICAgICAga2V5ZnJhbWUuc3R5bGUuYm94U2hhZG93ID0ga2V5ZnJhbWVSdWxlc1tqXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVLZXlGcmFtZVJ1bGVzIChyZ2IpIHtcbiAgaWYgKCFyZ2IpIHtcbiAgICByZXR1cm5cbiAgfVxuICBjb25zdCBzY2FsZUFyciA9IFtcbiAgICAnMGVtIC0yLjZlbSAwZW0gMGVtJyxcbiAgICAnMS44ZW0gLTEuOGVtIDAgMGVtJyxcbiAgICAnMi41ZW0gMGVtIDAgMGVtJyxcbiAgICAnMS43NWVtIDEuNzVlbSAwIDBlbScsXG4gICAgJzBlbSAyLjVlbSAwIDBlbScsXG4gICAgJy0xLjhlbSAxLjhlbSAwIDBlbScsXG4gICAgJy0yLjZlbSAwZW0gMCAwZW0nLFxuICAgICctMS44ZW0gLTEuOGVtIDAgMGVtJ11cbiAgY29uc3QgY29sb3JBcnIgPSBbXG4gICAgJzEnLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjInLFxuICAgICcwLjUnLFxuICAgICcwLjcnXS5tYXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiAncmdiYSgnICsgcmdiLnIgKyAnLCcgKyByZ2IuZyArICcsJyArIHJnYi5iICsgJywnICsgZSArICcpJ1xuICAgIH0pXG4gIGNvbnN0IHJ1bGVzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2FsZUFyci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRtcENvbG9yQXJyID0gbG9vcEFycmF5KGNvbG9yQXJyLCBpLCAncicpXG4gICAgcnVsZXMucHVzaChzY2FsZUFyci5tYXAoZnVuY3Rpb24gKHNjYWxlU3RyLCBpKSB7XG4gICAgICByZXR1cm4gc2NhbGVTdHIgKyAnICcgKyB0bXBDb2xvckFycltpXVxuICAgIH0pLmpvaW4oJywgJykpXG4gIH1cbiAgcmV0dXJuIHJ1bGVzXG59XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1jb250YWluZXInKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1zcGlubmVyLXdyYXAnKVxuICAgIHRoaXMuc3Bpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgdGhpcy5zcGlubmVyLmNsYXNzTGlzdC5hZGQoJ3dlZXgtZWxlbWVudCcpXG4gICAgdGhpcy5zcGlubmVyLmNsYXNzTGlzdC5hZGQoJ3dlZXgtc3Bpbm5lcicpXG4gICAgbm9kZS5hcHBlbmRDaGlsZCh0aGlzLnNwaW5uZXIpXG4gICAgcmV0dXJuIG5vZGVcbiAgfVxufVxuXG5jb25zdCBzdHlsZSA9IHtcbiAgY29sb3I6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBjb25zdCByZ2IgPSBnZXRSZ2IodmFsKVxuICAgIGlmICghcmdiKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW3dlYi1yZW5kZXJdIGludmFsaWQgY29sb3IgdmFsdWU6JywgdmFsKVxuICAgIH1cbiAgICBzZXRLZXlmcmFtZUNvbG9yKHRoaXMsIHJnYilcbiAgfVxufVxuXG4vLyBTcGlubmVyLnByb3RvdHlwZS51cGRhdGVTdHlsZSA9IGZ1bmN0aW9uIChzdHlsZSkge1xuLy8gICBBdG9taWMucHJvdG90eXBlLnVwZGF0ZVN0eWxlLmNhbGwodGhpcywgc3R5bGUpXG4vLyAgIGlmIChzdHlsZSAmJiBzdHlsZS5jb2xvcikge1xuLy8gICAgIHRoaXMuc2V0S2V5ZnJhbWVDb2xvcihnbG9iYWwud2VleC51dGlscy5nZXRSZ2IodGhpcy5ub2RlLnN0eWxlLmNvbG9yKSlcbi8vICAgfVxuLy8gfVxuXG5mdW5jdGlvbiBpbml0IChXZWV4KSB7XG4gIGNvbnN0IEF0b21pYyA9IFdlZXguQXRvbWljXG4gIGNvbnN0IGV4dGVuZCA9IFdlZXgudXRpbHMuZXh0ZW5kXG4gIGdldFJnYiA9IFdlZXgudXRpbHMuZ2V0UmdiXG4gIGxvb3BBcnJheSA9IFdlZXgudXRpbHMubG9vcEFycmF5XG5cbiAgZnVuY3Rpb24gU3Bpbm5lciAoZGF0YSkge1xuICAgIEF0b21pYy5jYWxsKHRoaXMsIGRhdGEpXG4gIH1cbiAgU3Bpbm5lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUpXG4gIGV4dGVuZChTcGlubmVyLnByb3RvdHlwZSwgcHJvdG8pXG4gIGV4dGVuZChTcGlubmVyLnByb3RvdHlwZSwge1xuICAgIHN0eWxlOiBleHRlbmQoT2JqZWN0LmNyZWF0ZShBdG9taWMucHJvdG90eXBlLnN0eWxlKSwgc3R5bGUpXG4gIH0pXG5cbiAgV2VleC5yZWdpc3RlckNvbXBvbmVudCgnc3Bpbm5lcicsIFNwaW5uZXIpXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ2xvYWRpbmctaW5kaWNhdG9yJywgU3Bpbm5lcilcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmxldCBpc0FycmF5XG5cbmZ1bmN0aW9uIGhhbmRsZU1zZyAod2ViLCBldnQpIHtcbiAgbGV0IG1zZyA9IGV2dC5kYXRhXG4gIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICBtc2cgPSBKU09OLnBhcnNlKG1zZylcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHt9XG4gIH1cbiAgaWYgKCFtc2cpIHtcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobXNnLnR5cGUgPT09ICd3ZWV4Jykge1xuICAgIGlmICghaXNBcnJheShtc2cuY29udGVudCkpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSB3ZWV4IG1zZyByZWNlaXZlZCBieSB3ZWIgY29tcG9uZW50LidcbiAgICAgICAgKyAnIG1zZy5jb250ZW50IHNob3VsZCBiZSBhIGFycmF5OicsIG1zZy5jb250ZW50KVxuICAgIH1cbiAgICBjYWxsTmF0aXZlKHdlYi5nZXRDb21wb25lbnRNYW5hZ2VyKCkuaW5zdGFuY2VJZCwgbXNnLmNvbnRlbnQpXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UHJvdG8gKFdlZXgpIHtcbiAgY29uc3QgQXRvbWljID0gV2VleC5BdG9taWNcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGUgKCkge1xuICAgICAgLy8gSWZyYW1lJ3MgZGVmZWN0OiBjYW4ndCB1c2UgcG9zaXRpb246YWJzb2x1dGUgYW5kIHRvcCwgbGVmdCwgcmlnaHQsXG4gICAgICAvLyBib3R0b20gYWxsIHNldHRpbmcgdG8gemVybyBhbmQgdXNlIG1hcmdpbiB0byBsZWF2ZSBzcGVjaWZpZWRcbiAgICAgIC8vIGhlaWdodCBmb3IgYSBibGFuayBhcmVhLCBhbmQgaGF2ZSB0byB1c2UgMTAwJSB0byBmaWxsIHRoZSBwYXJlbnRcbiAgICAgIC8vIGNvbnRhaW5lciwgb3RoZXJ3aXNlIGl0IHdpbGwgdXNlIGEgdW53YW50ZWQgZGVmYXVsdCBzaXplIGluc3RlYWQuXG4gICAgICAvLyBUaGVyZWZvcmUgYSBkaXYgYXMgYSBpZnJhbWUgd3JhcHBlciBpcyBuZWVkZWQgaGVyZS5cbiAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgICB0aGlzLndlYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpXG4gICAgICBub2RlLmFwcGVuZENoaWxkKHRoaXMud2ViKVxuICAgICAgdGhpcy53ZWIuY2xhc3NMaXN0LmFkZCgnd2VleC1lbGVtZW50JylcbiAgICAgIHRoaXMud2ViLnN0eWxlLndpZHRoID0gJzEwMCUnXG4gICAgICB0aGlzLndlYi5zdHlsZS5oZWlnaHQgPSAnMTAwJSdcbiAgICAgIHRoaXMud2ViLnN0eWxlLmJvcmRlciA9ICdub25lJ1xuICAgICAgcmV0dXJuIG5vZGVcbiAgICB9LFxuXG4gICAgYmluZEV2ZW50cyAoZXZ0cykge1xuICAgICAgQXRvbWljLnByb3RvdHlwZS5iaW5kRXZlbnRzLmNhbGwodGhpcywgZXZ0cylcbiAgICAgIGNvbnN0IHRoYXQgPSB0aGlzXG4gICAgICB0aGlzLndlYi5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhhdC5kaXNwYXRjaEV2ZW50KCdwYWdlZmluaXNoJywge1xuICAgICAgICAgIHVybDogdGhhdC53ZWIuc3JjXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVNc2cuYmluZChudWxsLCB0aGlzKSlcbiAgICB9LFxuXG4gICAgZ29CYWNrICgpIHtcbiAgICAgIHRoaXMud2ViLmNvbnRlbnRXaW5kb3cuaGlzdG9yeS5iYWNrKClcbiAgICB9LFxuXG4gICAgZ29Gb3J3YXJkICgpIHtcbiAgICAgIHRoaXMud2ViLmNvbnRlbnRXaW5kb3cuaGlzdG9yeS5mb3J3YXJkKClcbiAgICB9LFxuXG4gICAgcmVsb2FkICgpIHtcbiAgICAgIHRoaXMud2ViLmNvbnRlbnRXaW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgYXR0ciA9IHtcbiAgc3JjOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGhpcy53ZWIuc3JjID0gdmFsXG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3BhZ2VzdGFydCcsIHsgdXJsOiB2YWwgfSlcbiAgICB9LmJpbmQodGhpcyksIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBBdG9taWMgPSBXZWV4LkF0b21pY1xuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuICBpc0FycmF5ID0gV2VleC51dGlscy5pc0FycmF5XG5cbiAgLy8gQSBjb21wb25lbnQgdG8gaW1wb3J0IHdlYiBwYWdlcywgd2hpY2ggd29ya3MgbGlrZVxuICAvLyBhIGlmcmFtZSBlbGVtZW50IG9yIGEgd2Vidmlldy5cbiAgLy8gYXR0cnM6XG4gIC8vICAgLSBzcmNcbiAgLy8gZXZlbnRzOlxuICAvLyAgIC0gcGFnZXN0YXJ0XG4gIC8vICAgLSBwYWdlZmluaXNoXG4gIC8vICAgLSBlcnJvclxuICBmdW5jdGlvbiBXZWIgKGRhdGEpIHtcbiAgICBBdG9taWMuY2FsbCh0aGlzLCBkYXRhKVxuICB9XG4gIFdlYi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUpXG4gIGV4dGVuZChXZWIucHJvdG90eXBlLCBnZXRQcm90byhXZWV4KSlcbiAgZXh0ZW5kKFdlYi5wcm90b3R5cGUsIHsgYXR0ciB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3dlYicsIFdlYilcbn1cblxuZXhwb3J0IGRlZmF1bHQgeyBpbml0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0ICcuL25laWdoYm9yLmNzcydcblxuY29uc3QgREVGQVVMVF9JTlRFUlZBTCA9IDMwMDBcbmNvbnN0IERFRkFVTFRfTkVJR0hCT1JfU1BBQ0UgPSAyMFxuY29uc3QgREVGQVVMVF9ORUlHSEJPUl9BTFBIQSA9IDAuNlxuY29uc3QgREVGQVVMVF9ORUlHSEJPUl9TQ0FMRSA9IDAuOFxuXG5jb25zdCBUUkFOU0lUSU9OX0RVUkFUSU9OID0gNDAwXG5cbmNvbnN0IE1BSU5fU0xJREVfU0NBTEUgPSAwLjlcbmNvbnN0IE1BSU5fU0xJREVfT1BBQ0lUWSA9IDFcblxubGV0IGV4dGVuZCwgQ29tcG9uZW50XG5cbmZ1bmN0aW9uIGlkbGVXaGVuUGFnZURpc2FwcGVhciAoc2xpZGVyKSB7XG4gIGZ1bmN0aW9uIGhhbmRsZVBhZ2VTaG93ICgpIHtcbiAgICBzbGlkZXIuaXNQYWdlU2hvdyA9IHRydWVcbiAgICBzbGlkZXIuYXV0b1BsYXkgJiYgIXNsaWRlci5pc0RvbVJlbmRlcmluZyAmJiBzbGlkZXIucGxheSgpXG4gIH1cbiAgZnVuY3Rpb24gaGFuZGxlUGFnZUhpZGUgKCkge1xuICAgIHNsaWRlci5pc1BhZ2VTaG93ID0gZmFsc2VcbiAgICBzbGlkZXIuc3RvcCgpXG4gIH1cbiAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgaGFuZGxlUGFnZVNob3cpXG4gIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIGhhbmRsZVBhZ2VIaWRlKVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICd2aXNpYmxlJykge1xuICAgICAgaGFuZGxlUGFnZVNob3coKVxuICAgIH1cbiAgICBlbHNlIGlmIChkb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICBoYW5kbGVQYWdlSGlkZSgpXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBpZGxlV2hlbkRvbVJlbmRlcmluZyAoc2xpZGVyKSB7XG4gIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgc2xpZGVyLmlzRG9tUmVuZGVyaW5nID0gZmFsc2VcbiAgICBzbGlkZXIuYXV0b1BsYXkgJiYgc2xpZGVyLmlzUGFnZVNob3cgJiYgc2xpZGVyLnBsYXkoKVxuICB9KVxuICBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcigncmVuZGVyYmVnaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgc2xpZGVyLmlzRG9tUmVuZGVyaW5nID0gdHJ1ZVxuICAgIHNsaWRlci5zdG9wKClcbiAgfSlcbn1cblxuZnVuY3Rpb24gX3JlbmRlckluZGljYXRvcnMgKHNsaWRlciwgY3QsIGRhdGEpIHtcbiAgZGF0YS5leHRyYS53aWR0aCA9IGRhdGEuc3R5bGUud2lkdGggfHwgc2xpZGVyLndpZHRoXG4gIGRhdGEuZXh0cmEuaGVpZ2h0ID0gZGF0YS5zdHlsZS5oZWlnaHQgfHwgc2xpZGVyLmhlaWdodFxuICBjb25zdCBpbmRpY2F0b3IgPSBzbGlkZXIuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmNyZWF0ZUVsZW1lbnQoZGF0YSlcbiAgaW5kaWNhdG9yLnBhcmVudFJlZiA9IHNsaWRlci5kYXRhLnJlZlxuICBpbmRpY2F0b3Iuc2xpZGVyID0gc2xpZGVyXG4gIHNsaWRlci5pbmRpY2F0b3IgPSBpbmRpY2F0b3JcbiAgY3QuYXBwZW5kQ2hpbGQoaW5kaWNhdG9yLm5vZGUpXG59XG5cbmZ1bmN0aW9uIHJlbmRlckluZGljYXRvcnMgKHNsaWRlciwgY3QsIGRhdGEpIHtcbiAgc2V0VGltZW91dCgoKSA9PiBfcmVuZGVySW5kaWNhdG9ycyhzbGlkZXIsIGN0LCBkYXRhKSwgMClcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW5kaWNhdG9ycyAoc2xpZGVyKSB7XG4gIHNsaWRlci5pbmRpY2F0b3IgJiYgc2xpZGVyLmluZGljYXRvci5zZXRJbmRleChzbGlkZXIuY3VycmVudEluZGV4KVxufVxuXG5mdW5jdGlvbiB0cmFuc2l0aW9uT25jZSAobm9kZSwgZHVyYXRpb24sIHRpbWluZ0Z1bmMpIHtcbiAgY29uc3QgdHJhbnNpdGlvblN0ciA9IGBhbGwgJHtkdXJhdGlvbn1tcyAke3RpbWluZ0Z1bmN9YFxuICBub2RlLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSB0cmFuc2l0aW9uU3RyXG4gIG5vZGUuc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25TdHJcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgbm9kZS5zdHlsZS53ZWJraXRUcmFuc2l0aW9uID0gJydcbiAgICBub2RlLnN0eWxlLnRyYW5zaXRpb24gPSAnJ1xuICB9LCBkdXJhdGlvbilcbn1cblxuZnVuY3Rpb24gYW5pbWF0ZVRyYW5zZm9ybSAobm9kZSwgc3R5bGUsIGR1cmF0aW9uLCB0aW1lRnVuY3Rpb24pIHtcbiAgdHJhbnNpdGlvbk9uY2Uobm9kZSwgZHVyYXRpb24gfHwgVFJBTlNJVElPTl9EVVJBVElPTiwgdGltZUZ1bmN0aW9uIHx8ICdlYXNlJylcbiAgZm9yIChjb25zdCBrIGluIHN0eWxlKSB7XG4gICAgbm9kZS5zdHlsZVtrXSA9IHN0eWxlW2tdXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJhbnNmb3JtU2xpZGUgKHNsaWRlciwgaW5kZXgpIHtcbiAgY29uc3Qgbm9kZSA9IHNsaWRlci5zbGlkZXNbaW5kZXhdLm5vZGVcbiAgbm9kZS5zdHlsZS5vcGFjaXR5ID0gc2xpZGVyLm5laWdoYm9yQWxwaGFcbiAgY29uc3QgdHJhbnNmb3JtU3RyID0gYHNjYWxlKCR7c2xpZGVyLm5laWdoYm9yU2NhbGV9KWBcbiAgbm9kZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm1TdHJcbiAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1TdHJcbiAgbm9kZS5zdHlsZS53aWR0aCA9IHNsaWRlci53aWR0aCArICdweCdcbiAgbm9kZS5zdHlsZS5oZWlnaHQgPSBzbGlkZXIuaGVpZ2h0ICsgJ3B4J1xuICBub2RlLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICBub2RlLnN0eWxlLnRvcCA9ICcwcHgnXG4gIG5vZGUuc3R5bGUubGVmdCA9ICcwcHgnXG59XG5cbmZ1bmN0aW9uIGxvYWRJbWcgKHNsaWRlcikge1xuICBjb25zdCBpbWdzMSA9IHNsaWRlci5ub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpbWctc3JjXScpIHx8IFtdXG4gIGNvbnN0IGltZ3MyID0gc2xpZGVyLm5vZGUucXVlcnlTZWxlY3RvckFsbCgnW2ktbGF6eS1zcmNdJykgfHwgW11cbiAgZnVuY3Rpb24gbG9hZCAobm9kZSkge1xuICAgIGNvbnN0IHNyYyA9IG5vZGUuZ2V0QXR0cmlidXRlKCdpbWctc3JjJykgfHwgbm9kZS5nZXRBdHRyaWJ1dGUoJ2ktbGF6eS1zcmMnKVxuICAgIGxpYi5pbWcuYXBwbHlTcmMobm9kZSwgc3JjLCBub2RlLmRhdGFzZXQucGxhY2Vob2xkZXIpXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWdzMS5sZW5ndGg7IGkrKykge1xuICAgIGxvYWQoaW1nczFbaV0pXG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWdzMi5sZW5ndGg7IGkrKykge1xuICAgIGxvYWQoaW1nczJbaV0pXG4gIH1cbn1cblxuZnVuY3Rpb24gX2RvUmVuZGVyIChzbGlkZXIpIHtcbiAgbG9hZEltZyhzbGlkZXIpXG4gIHNsaWRlci50b3RhbCA9IHNsaWRlci5zbGlkZXMubGVuZ3RoXG4gIHNsaWRlci5jdXJyZW50SW5kZXggPSAwXG4gIGNvbnN0IHdpZHRoID0gc2xpZGVyLmRhdGEuc3R5bGUud2lkdGggfHwgMFxuICBjb25zdCBoZWlnaHQgPSBzbGlkZXIuZGF0YS5zdHlsZS5oZWlnaHQgfHwgMFxuICBzbGlkZXIud2lkdGggPSBwYXJzZUZsb2F0KHdpZHRoKSB8fCBzbGlkZXIubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICBzbGlkZXIuaGVpZ2h0ID0gcGFyc2VGbG9hdChoZWlnaHQpIHx8IHNsaWRlci5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodFxuXG4gIGNvbnN0IGwgPSBzbGlkZXIuc2xpZGVzLmxlbmd0aFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgIHRyYW5zZm9ybVNsaWRlKHNsaWRlciwgaSlcbiAgfVxuXG4gIHNldFRpbWVvdXQoKCkgPT4gc2xpZGVyLnNsaWRlVG8oMCksIDApXG59XG5cbmZ1bmN0aW9uIGRvUmVuZGVyIChzbGlkZXIpIHtcbiAgc2V0VGltZW91dChfZG9SZW5kZXIuYmluZChudWxsLCBzbGlkZXIpLCAwKVxufVxuXG5mdW5jdGlvbiBsb29wSW5kZXggKGlkeCwgdG90YWwpIHtcbiAgaWYgKHRvdGFsID09PSAwKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICByZXR1cm4gKHRvdGFsICsgaWR4KSAlIHRvdGFsXG59XG5cbmZ1bmN0aW9uIGF1dG9QbGF5IChzbGlkZXIpIHtcbiAgY29uc3QgbmV4dCA9IHNsaWRlci5jdXJyZW50SW5kZXggKyAxXG4gIHNldFRpbWVvdXQoKCkgPT4gc2xpZGVyLnNsaWRlVG8obmV4dCksIDApXG4gIHNsaWRlci5wbGF5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGF1dG9QbGF5KHNsaWRlciksIHNsaWRlci5pbnRlcnZhbCArIFRSQU5TSVRJT05fRFVSQVRJT04pXG59XG5cbmZ1bmN0aW9uIHVzZUdlc3R1cmUgKHNsaWRlcikge1xuICBjb25zdCBub2RlID0gc2xpZGVyLm5vZGVcbiAgbGV0IGRpc3BsYWNlbWVudCwgcGFubmluZ1xuXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncGFuc3RhcnQnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghZS5pc1ZlcnRpY2FsKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIHNsaWRlci5zdG9wKClcbiAgICAgIHBhbm5pbmcgPSB0cnVlXG4gICAgICBkaXNwbGFjZW1lbnQgPSAwXG4gICAgfVxuICB9KVxuXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncGFubW92ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKCFlLmlzVmVydGljYWwgJiYgcGFubmluZykge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICBjb25zdCBkaXNwbGFjZW1lbnQgPSBlLmRpc3BsYWNlbWVudFhcbiAgICAgIG1vdmVTbGlkZXMoc2xpZGVyLCBkaXNwbGFjZW1lbnQpXG4gICAgfVxuICB9KVxuXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigncGFuZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoIWUuaXNWZXJ0aWNhbCAmJiBwYW5uaW5nKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgIGRpc3BsYWNlbWVudCA9IGUuZGlzcGxhY2VtZW50WFxuICAgICAgaWYgKGUuaXNTd2lwZSkge1xuICAgICAgICBpZiAoZGlzcGxhY2VtZW50IDwgMCkge1xuICAgICAgICAgIHNsaWRlci5zbGlkZVRvTmV4dCgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc2xpZGVyLnNsaWRlVG9QcmV2KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChNYXRoLmFicyhkaXNwbGFjZW1lbnQpIDwgc2xpZGVyLndpZHRoIC8gMikge1xuICAgICAgICAgIHNsaWRlci5zbGlkZVRvKHNsaWRlci5jdXJyZW50SW5kZXgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZGlzcGxhY2VtZW50IDwgMCkge1xuICAgICAgICAgIHNsaWRlci5zbGlkZVRvTmV4dCgpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc2xpZGVyLnNsaWRlVG9QcmV2KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFubmluZyA9IGZhbHNlXG4gICAgICBzbGlkZXIucGxheSgpXG4gICAgfVxuICB9KVxuXG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignc3dpcGUnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICghZS5pc1ZlcnRpY2FsKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIG1vdmVTbGlkZXMgKHNsaWRlciwgb2Zmc2V0KSB7XG4gIGNvbnN0IG1haW5UcmFuc2Zvcm1TdHIgPSBgdHJhbnNsYXRlKCR7b2Zmc2V0fXB4LCAwcHgpIHNjYWxlKCR7TUFJTl9TTElERV9TQ0FMRX0pYFxuICBjb25zdCBtYWluTm9kZSA9IHNsaWRlci5tYWluU2xpZGUubm9kZVxuICBtYWluTm9kZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSBtYWluVHJhbnNmb3JtU3RyXG4gIG1haW5Ob2RlLnN0eWxlLnRyYW5zZm9ybSA9IG1haW5UcmFuc2Zvcm1TdHJcblxuICBjb25zdCBsZWZ0VHJhbnNmb3JtU3RyID0gYHRyYW5zbGF0ZSgke3NsaWRlci5sZWZ0VHJhbnNsYXRlICsgb2Zmc2V0fXB4LCAwcHgpIHNjYWxlKCR7c2xpZGVyLm5laWdoYm9yU2NhbGV9KWBcbiAgY29uc3QgbGVmdE5vZGUgPSBzbGlkZXIubGVmdFNsaWRlLm5vZGVcbiAgbGVmdE5vZGUuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gbGVmdFRyYW5zZm9ybVN0clxuICBsZWZ0Tm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBsZWZ0VHJhbnNmb3JtU3RyXG5cbiAgY29uc3QgcmlnaHRUcmFuc2Zvcm1TdHIgPSBgdHJhbnNsYXRlKCR7c2xpZGVyLnJpZ2h0VHJhbnNsYXRlICsgb2Zmc2V0fXB4LCAwcHgpIHNjYWxlKCR7c2xpZGVyLm5laWdoYm9yU2NhbGV9KWBcbiAgY29uc3QgcmlnaHROb2RlID0gc2xpZGVyLnJpZ2h0U2xpZGUubm9kZVxuICByaWdodE5vZGUuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gcmlnaHRUcmFuc2Zvcm1TdHJcbiAgcmlnaHROb2RlLnN0eWxlLnRyYW5zZm9ybSA9IHJpZ2h0VHJhbnNmb3JtU3RyXG59XG5cbmZ1bmN0aW9uIHJlc2V0U2lkZVNsaWRlUG9zIChzbGlkZXIsIHNpZGUpIHtcbiAgY29uc3Qgc2lnbk1hcCA9IHsgbGVmdDogJy0nLCByaWdodDogJycgfVxuICBjb25zdCB0cmFuc2Zvcm1TdHIgPSBgdHJhbnNsYXRlKCR7c2lnbk1hcFtzaWRlXSArIHNsaWRlci53aWR0aH1weCwgMHB4KWBcbiAgY29uc3Qgbm9kZSA9IHNsaWRlcltzaWRlICsgJ1NsaWRlJ10ubm9kZVxuICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVN0clxuICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVN0clxufVxuXG5mdW5jdGlvbiByZXNldE91dHNpZGVTbGlkZXMgKHNsaWRlciwgaW5kZXhBcnIpIHtcbiAgaW5kZXhBcnIgPSBpbmRleEFyciB8fCBbXVxuICBjb25zdCBsID0gc2xpZGVyLnNsaWRlcy5sZW5ndGhcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsOyBpKyspIHtcbiAgICBpZiAoaW5kZXhBcnIuaW5kZXhPZihpKSA8PSAtMSkge1xuICAgICAgc2xpZGVyLnNsaWRlc1tpXS5ub2RlLnN0eWxlLm9wYWNpdHkgPSAwXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHByb3RvID0ge1xuICBjcmVhdGUgKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHRoaXMubm9kZSA9IG5vZGVcbiAgICBub2RlLmNsYXNzTGlzdC5hZGQoJ3NsaWRlci1uZWlnaGJvcicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWNvbnRhaW5lcicpXG4gICAgdGhpcy5zdHlsZS5mbGV4RGlyZWN0aW9uLmNhbGwodGhpcywgJ3JvdycpXG4gICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSdcbiAgICBub2RlLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbidcbiAgICByZXR1cm4gbm9kZVxuICB9LFxuXG4gIGNyZWF0ZUNoaWxkcmVuICgpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5kYXRhLmNoaWxkcmVuXG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcblxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGNoaWxkXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjaGlsZHJlbltpXVxuICAgICAgICBkYXRhLmluc3RhbmNlSWQgPSB0aGlzLmRhdGEuaW5zdGFuY2VJZFxuICAgICAgICAvLyAnaW5kaWNhdG9yJyBtYXliZSB0aGUgbGFzdCBjaGlsZCBvZiB0aGlzIGNvbXBvbmVudC5cbiAgICAgICAgaWYgKGRhdGEudHlwZSAhPT0gJ2luZGljYXRvcicpIHtcbiAgICAgICAgICBjaGlsZCA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChkYXRhKVxuICAgICAgICAgIGNoaWxkLm5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1uZWlnaGJvci1pdGVtJylcbiAgICAgICAgICBjb25zdCB3aWR0aCA9IChkYXRhLnN0eWxlIHx8IHt9KS53aWR0aCB8fCB0aGlzLmRhdGEuc3R5bGUud2lkdGhcbiAgICAgICAgICBjb25zdCBoZWlnaHQgPSAoZGF0YS5zdHlsZSB8fCB7fSkuaGVpZ2h0IHx8IHRoaXMuZGF0YS5zdHlsZS5oZWlnaHRcbiAgICAgICAgICBjaGlsZC5ub2RlLnN0eWxlLm1hcmdpblRvcCA9IC0oaGVpZ2h0IC8gMikgKyAncHgnXG4gICAgICAgICAgY2hpbGQubm9kZS5zdHlsZS5tYXJnaW5MZWZ0ID0gLSh3aWR0aCAvIDIpICsgJ3B4J1xuICAgICAgICAgIHRoaXMuc2xpZGVzLnB1c2goY2hpbGQpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgICAgICAgICBjaGlsZC5wYXJlbnRSZWYgPSB0aGlzLmRhdGEucmVmXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgcmVuZGVySW5kaWNhdG9ycyh0aGlzLCBmcmFnbWVudCwgZXh0ZW5kKGRhdGEsIHtcbiAgICAgICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICAgIGFtb3VudDogY2hpbGRyZW4ubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgaW5kZXg6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzZXRPdXRzaWRlU2xpZGVzKHRoaXMsIFtdKVxuICAgICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGZyYWdtZW50KVxuICAgICAgZG9SZW5kZXIodGhpcylcbiAgICB9XG4gIH0sXG5cbiAgYXBwZW5kQ2hpbGQgKGRhdGEpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZGF0YS5jaGlsZHJlblxuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIGxldCBjaGlsZFxuXG4gICAgaWYgKGRhdGEudHlwZSA9PT0gJ2luZGljYXRvcicpIHtcbiAgICAgIHJlbmRlckluZGljYXRvcnModGhpcywgdGhpcy5ub2RlLCBleHRlbmQoZGF0YSwge1xuICAgICAgICBleHRyYToge1xuICAgICAgICAgIGFtb3VudDogY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgICAgIGluZGV4OiB0aGlzLmN1cnJlbnRJbmRleFxuICAgICAgICB9XG4gICAgICB9KSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjaGlsZCA9IGNvbXBvbmVudE1hbmFnZXIuY3JlYXRlRWxlbWVudChkYXRhKVxuICAgICAgY2hpbGQubm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LW5laWdoYm9yLWl0ZW0nKVxuICAgICAgY29uc3Qgd2lkdGggPSAoZGF0YS5zdHlsZSB8fCB7fSkud2lkdGggfHwgdGhpcy5kYXRhLnN0eWxlLndpZHRoXG4gICAgICBjb25zdCBoZWlnaHQgPSAoZGF0YS5zdHlsZSB8fCB7fSkuaGVpZ2h0IHx8IHRoaXMuZGF0YS5zdHlsZS5oZWlnaHRcbiAgICAgIGNoaWxkLm5vZGUuc3R5bGUubWFyZ2luVG9wID0gLShoZWlnaHQgLyAyKSArICdweCdcbiAgICAgIGNoaWxkLm5vZGUuc3R5bGUubWFyZ2luTGVmdCA9IC0od2lkdGggLyAyKSArICdweCdcbiAgICAgIHRoaXMuc2xpZGVzLnB1c2goY2hpbGQpXG4gICAgICByZXNldE91dHNpZGVTbGlkZXModGhpcywgW10pXG4gICAgICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY2hpbGQubm9kZSlcbiAgICB9XG5cbiAgICBkb1JlbmRlcih0aGlzKVxuXG4gICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmRhdGEuY2hpbGRyZW4gPSBbZGF0YV1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjaGlsZHJlbi5wdXNoKGRhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkIHx8IHRoaXMuaW5kaWNhdG9yXG4gIH0sXG5cbiAgaW5zZXJ0QmVmb3JlIChjaGlsZCwgYmVmb3JlKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgICBsZXQgaSA9IDBcbiAgICBsZXQgc2xpZGVzSWR4ID0gMFxuICAgIGxldCBpc0FwcGVuZCA9IGZhbHNlXG4gICAgaWYgKCFjaGlsZHJlbiB8fCAhY2hpbGRyZW4ubGVuZ3RoIHx8ICFiZWZvcmUpIHtcbiAgICAgIGlzQXBwZW5kID0gdHJ1ZVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxldCBsXG4gICAgICBmb3IgKGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gYmVmb3JlLmRhdGEucmVmKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGRyZW5baV0udHlwZSAhPT0gJ2luZGljYXRvcicpIHtcbiAgICAgICAgICBzbGlkZXNJZHgrK1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA9PT0gbCkge1xuICAgICAgICBpc0FwcGVuZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGlsZC5ub2RlLmNsYXNzTGlzdC5hZGQoJ3dlZXgtbmVpZ2hib3ItaXRlbScpXG4gICAgY29uc3QgZGF0YSA9IGNoaWxkLmRhdGFcbiAgICBjb25zdCB3aWR0aCA9IChkYXRhLnN0eWxlIHx8IHt9KS53aWR0aCB8fCB0aGlzLmRhdGEuc3R5bGUud2lkdGhcbiAgICBjb25zdCBoZWlnaHQgPSAoZGF0YS5zdHlsZSB8fCB7fSkuaGVpZ2h0IHx8IHRoaXMuZGF0YS5zdHlsZS5oZWlnaHRcbiAgICBjaGlsZC5ub2RlLnN0eWxlLm1hcmdpblRvcCA9IC0oaGVpZ2h0IC8gMikgKyAncHgnXG4gICAgY2hpbGQubm9kZS5zdHlsZS5tYXJnaW5MZWZ0ID0gLSh3aWR0aCAvIDIpICsgJ3B4J1xuICAgIGlmIChpc0FwcGVuZCkge1xuICAgICAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGNoaWxkLm5vZGUpXG4gICAgICB0aGlzLnNsaWRlcy5wdXNoKGNoaWxkKVxuICAgICAgcmVzZXRPdXRzaWRlU2xpZGVzKHRoaXMsIFtdKVxuICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZC5kYXRhKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMubm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQubm9kZSwgYmVmb3JlLm5vZGUpXG4gICAgICB0aGlzLnNsaWRlcy5zcGxpY2Uoc2xpZGVzSWR4LCAwLCBjaGlsZClcbiAgICAgIGNoaWxkcmVuLnNwbGljZShpLCAwLCBjaGlsZC5kYXRhKVxuICAgIH1cblxuICAgIGRvUmVuZGVyKHRoaXMpXG4gIH0sXG5cbiAgcmVtb3ZlQ2hpbGQgKGNoaWxkKSB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmRhdGEuY2hpbGRyZW5cbiAgICBsZXQgaSA9IDBcbiAgICBsZXQgc2xpZGVzSWR4ID0gMFxuICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIGxldCBsXG4gICAgICBmb3IgKGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkcmVuW2ldLnJlZiA9PT0gY2hpbGQuZGF0YS5yZWYpIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZHJlbltpXS50eXBlICE9PSAnaW5kaWNhdG9yJykge1xuICAgICAgICAgIHNsaWRlc0lkeCsrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpIDwgbCkge1xuICAgICAgICBjaGlsZHJlbi5zcGxpY2UoaSwgMSlcbiAgICAgICAgdGhpcy5zbGlkZXMuc3BsaWNlKHNsaWRlc0lkeCwgMSlcbiAgICAgICAgcmVzZXRPdXRzaWRlU2xpZGVzKHRoaXMsIFtdKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLnJlbW92ZUNvbXBvbmVudChjaGlsZC5kYXRhLnJlZilcbiAgICBjaGlsZC5ub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQubm9kZSlcblxuICAgIGRvUmVuZGVyKHRoaXMpXG4gIH0sXG5cbiAgb25BcHBlbmQgKCkge1xuICAgIHRoaXMuc2xpZGVUbygwKVxuICAgIHVzZUdlc3R1cmUodGhpcylcbiAgICBDb21wb25lbnQucHJvdG90eXBlLm9uQXBwZW5kLmNhbGwodGhpcylcbiAgfSxcblxuICBwbGF5ICgpIHtcbiAgICAvLyBzdGFydCBwbGF5aW5nXG4gICAgdGhpcy5wbGF5VGltZXIgJiYgY2xlYXJUaW1lb3V0KHRoaXMucGxheVRpbWVyKVxuICAgIGlmICh0aGlzLnBsYXlzdGF0dXMvKiAmJiAhdGhpcy50b2dnbGVPZmYqLykge1xuICAgICAgdGhpcy5wbGF5VGltZXIgPSBzZXRUaW1lb3V0KGF1dG9QbGF5LmJpbmQobnVsbCwgdGhpcyksIHRoaXMuaW50ZXJ2YWwpXG4gICAgfVxuICB9LFxuXG4gIHN0b3AgKCkge1xuICAgIC8vIHN0b3AgcGxheWluZ1xuICAgIHRoaXMucGxheVRpbWVyICYmIGNsZWFyVGltZW91dCh0aGlzLnBsYXlUaW1lcilcbiAgfSxcblxuICBzbGlkZVRvIChpbmRleCwgcmVzdGFydEF1dG9wbGF5KSB7XG4gICAgY29uc3QgdG90YWwgPSB0aGlzLnNsaWRlcy5sZW5ndGhcbiAgICBpZiAodG90YWwgPT09IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAocmVzdGFydEF1dG9wbGF5KSB7XG4gICAgICB0aGlzLnN0b3AoKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnBsYXkoKSwgMTAwKVxuICAgIH1cbiAgICBjb25zdCBvcmlnSWR4ID0gaW5kZXhcbiAgICBpbmRleCA9IGxvb3BJbmRleChvcmlnSWR4LCB0b3RhbClcbiAgICBjb25zdCBsZWZ0SW5kZXggPSBsb29wSW5kZXgoaW5kZXggLSAxLCB0b3RhbClcbiAgICBjb25zdCByaWdodEluZGV4ID0gbG9vcEluZGV4KGluZGV4ICsgMSwgdG90YWwpXG5cbiAgICB0aGlzLm1haW5TbGlkZSA9IHRoaXMuc2xpZGVzW2luZGV4XVxuICAgIHRoaXMubGVmdFNsaWRlID0gdGhpcy5zbGlkZXNbbG9vcEluZGV4KGluZGV4IC0gMSwgdG90YWwpXVxuICAgIHRoaXMucmlnaHRTbGlkZSA9IHRoaXMuc2xpZGVzW2xvb3BJbmRleChpbmRleCArIDEsIHRvdGFsKV1cblxuICAgIGNvbnN0IG1haW5UcmFuc2Zvcm1TdHIgPSBgdHJhbnNsYXRlKDBweCwgMHB4KSBzY2FsZSgke01BSU5fU0xJREVfU0NBTEV9KWBcbiAgICBzZXRUaW1lb3V0KCgpID0+IGFuaW1hdGVUcmFuc2Zvcm0odGhpcy5tYWluU2xpZGUubm9kZSwge1xuICAgICAgd2Via2l0VHJhbnNmb3JtOiBtYWluVHJhbnNmb3JtU3RyLFxuICAgICAgdHJhbnNmb3JtOiBtYWluVHJhbnNmb3JtU3RyLFxuICAgICAgb3BhY2l0eTogTUFJTl9TTElERV9PUEFDSVRZLFxuICAgICAgekluZGV4OiA5OVxuICAgIH0pLCAxMDApXG5cbiAgICBjb25zdCB0cmFuc2xhdGVYID0gdGhpcy53aWR0aFxuICAgICAgLSB0aGlzLndpZHRoICogKDEgLSB0aGlzLm5laWdoYm9yU2NhbGUpIC8gMlxuICAgICAgLSB0aGlzLm5laWdoYm9yU3BhY2VcbiAgICB0aGlzLmxlZnRUcmFuc2xhdGUgPSAtdHJhbnNsYXRlWFxuICAgIHRoaXMucmlnaHRUcmFuc2xhdGUgPSB0cmFuc2xhdGVYXG5cbiAgICBpZiAob3JpZ0lkeCA+IHRoaXMuY3VycmVudEluZGV4KSB7XG4gICAgICByZXNldFNpZGVTbGlkZVBvcyh0aGlzLCAncmlnaHQnKVxuICAgIH1cbiAgICBlbHNlIGlmIChvcmlnSWR4IDwgdGhpcy5jdXJyZW50SW5kZXgpIHtcbiAgICAgIHJlc2V0U2lkZVNsaWRlUG9zKHRoaXMsICdsZWZ0JylcbiAgICB9XG5cbiAgICBjb25zdCBsZWZ0VHJhbnNmb3JtU3RyID0gYHRyYW5zbGF0ZSgkey10cmFuc2xhdGVYICsgJ3B4J30sIDBweCkgc2NhbGUoJHt0aGlzLm5laWdoYm9yU2NhbGV9KWBcbiAgICBzZXRUaW1lb3V0KCgpID0+IGFuaW1hdGVUcmFuc2Zvcm0odGhpcy5sZWZ0U2xpZGUubm9kZSwge1xuICAgICAgd2Via2l0VHJhbnNmb3JtOiBsZWZ0VHJhbnNmb3JtU3RyLFxuICAgICAgdHJhbnNmb3JtOiBsZWZ0VHJhbnNmb3JtU3RyLFxuICAgICAgb3BhY2l0eTogdGhpcy5uZWlnaGJvckFscGhhLFxuICAgICAgekluZGV4OiAxXG4gICAgfSksIDEwMClcblxuICAgIGNvbnN0IHJpZ2h0VHJhbnNmb3JtU3RyID0gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVggKyAncHgnfSwgMHB4KSBzY2FsZSgke3RoaXMubmVpZ2hib3JTY2FsZX0pYFxuICAgIHNldFRpbWVvdXQoKCkgPT4gYW5pbWF0ZVRyYW5zZm9ybSh0aGlzLnJpZ2h0U2xpZGUubm9kZSwge1xuICAgICAgd2Via2l0VHJhbnNmb3JtOiByaWdodFRyYW5zZm9ybVN0cixcbiAgICAgIHRyYW5zZm9ybTogcmlnaHRUcmFuc2Zvcm1TdHIsXG4gICAgICBvcGFjaXR5OiB0aGlzLm5laWdoYm9yQWxwaGEsXG4gICAgICB6SW5kZXg6IDFcbiAgICB9KSwgMTAwKVxuXG4gICAgcmVzZXRPdXRzaWRlU2xpZGVzKHRoaXMsIFtpbmRleCwgbGVmdEluZGV4LCByaWdodEluZGV4XSlcblxuICAgIHRoaXMuY3VycmVudEluZGV4ID0gaW5kZXhcbiAgICB1cGRhdGVJbmRpY2F0b3JzKHRoaXMpXG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdjaGFuZ2UnLCB7IGluZGV4OiB0aGlzLmN1cnJlbnRJbmRleCB9KVxuICB9LFxuXG4gIHNsaWRlVG9QcmV2ICgpIHtcbiAgICB0aGlzLnNsaWRlVG8odGhpcy5jdXJyZW50SW5kZXggLSAxKVxuICB9LFxuXG4gIHNsaWRlVG9OZXh0ICgpIHtcbiAgICB0aGlzLnNsaWRlVG8odGhpcy5jdXJyZW50SW5kZXggKyAxKVxuICB9XG59XG5cbmNvbnN0IGF0dHIgPSB7XG4gIGludGVydmFsOiBmdW5jdGlvbiAodmFsKSB7XG4gICAgdGhpcy5pbnRlcnZhbCA9IHBhcnNlSW50KHZhbCkgfHwgREVGQVVMVF9JTlRFUlZBTFxuICB9LFxuXG4gIGluZGV4OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgY29uc3QgX3RoaXMgPSB0aGlzXG4gICAgZnVuY3Rpb24gZG9TbGlkZSAoaW5kZXgpIHtcbiAgICAgIGluZGV4ID0gcGFyc2VJbnQoaW5kZXgpXG4gICAgICBpZiAoaW5kZXggPCAwIHx8IGlzTmFOKGluZGV4KSkge1xuICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gaW52YWxpZCBpbmRleCAnLCBpbmRleClcbiAgICAgIH1cbiAgICAgIF90aGlzLnN0b3AoKVxuICAgICAgX3RoaXMuc2xpZGVUbyhpbmRleClcbiAgICAgIF90aGlzLmF1dG9QbGF5ICYmIF90aGlzLmlzUGFnZVNob3cgJiYgX3RoaXMucGxheSgpXG4gICAgICBpZiAoX3RoaXMuX3VwZGF0ZUluZGV4KSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCBfdGhpcy5fdXBkYXRlSW5kZXgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmlzRG9tUmVuZGVyaW5nKSB7XG4gICAgICBjb25zdCBwcmUgPSAhIXRoaXMuX3VwZGF0ZUluZGV4XG4gICAgICB0aGlzLl91cGRhdGVJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZG9TbGlkZSh2YWwpXG4gICAgICB9XG4gICAgICAhcHJlICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCB0aGlzLl91cGRhdGVJbmRleClcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkb1NsaWRlKHZhbClcbiAgICB9XG4gIH0sXG5cbiAgcGxheXN0YXR1czogZnVuY3Rpb24gKHZhbCkge1xuICAgIGNvbnN0IF90aGlzID0gdGhpc1xuICAgIHRoaXMucGxheXN0YXR1cyA9IHZhbCAmJiB2YWwgIT09ICdmYWxzZSdcbiAgICB0aGlzLmF1dG9QbGF5ID0gdGhpcy5wbGF5c3RhdHVzXG5cbiAgICBmdW5jdGlvbiBkb1BsYXkgKCkge1xuICAgICAgX3RoaXMuaXNQYWdlU2hvdyAmJiBfdGhpcy5wbGF5KClcbiAgICAgIGlmIChfdGhpcy5fdXBkYXRlUGxheXN0YXR1cykge1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVuZGVyZW5kJywgX3RoaXMuX3VwZGF0ZVBsYXlzdGF0dXMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGxheXN0YXR1cykge1xuICAgICAgaWYgKHRoaXMuaXNEb21SZW5kZXJpbmcpIHtcbiAgICAgICAgY29uc3QgcHJlID0gISF0aGlzLl91cGRhdGVQbGF5c3RhdHVzXG4gICAgICAgIHRoaXMuX3VwZGF0ZVBsYXlzdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZG9QbGF5KClcbiAgICAgICAgfVxuICAgICAgICAhcHJlICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZW5kZXJlbmQnLCB0aGlzLl91cGRhdGVQbGF5c3RhdHVzKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGRvUGxheSgpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5zdG9wKClcbiAgICB9XG4gIH0sXG5cbiAgLy8gc3VwcG9ydCBwbGF5c3RhdHVzJyBhbGlhcyBhdXRvLXBsYXkgZm9yIGNvbXBhdGliaWxpdHlcbiAgYXV0b1BsYXk6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICB0aGlzLmF0dHIucGxheXN0YXR1cy5jYWxsKHRoaXMsIHZhbClcbiAgfSxcblxuICBuZWlnaGJvclNwYWNlICh2YWwpIHtcbiAgICBjb25zdCBucyA9IHBhcnNlRmxvYXQodmFsKVxuICAgIGlmICghaXNOYU4obnMpICYmIG5zID49IDApIHtcbiAgICAgIHRoaXMubmVpZ2hib3JTcGFjZSA9IG5zXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBbaDUtcmVuZGVyXSBpbnZhbGlkIHZhbHVlIGZvciAnbmVpZ2hib3Itc3BhY2UnIG9mIHNsaWRlci1uZWlnaGJvcjogJHt2YWx9LmApXG4gICAgfVxuICB9LFxuXG4gIG5laWdoYm9yQWxwaGEgKHZhbCkge1xuICAgIGNvbnN0IG5hID0gcGFyc2VGbG9hdCh2YWwpXG4gICAgaWYgKCFpc05hTihuYSkgJiYgbmEgPj0gMCAmJiBuYSA8PSAxKSB7XG4gICAgICB0aGlzLm5laWdoYm9yQWxwaGEgPSBuYVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2g1LXJlbmRlcl0gaW52YWxpZCB2YWx1ZSBmb3IgJ25laWdoYm9yLWFscGhhJyBvZiBzbGlkZXItbmVpZ2hib3I6ICR7dmFsfS5gKVxuICAgIH1cbiAgfSxcblxuICBuZWlnaGJvclNjYWxlICh2YWwpIHtcbiAgICBjb25zdCBucyA9IHBhcnNlRmxvYXQodmFsKVxuICAgIGlmICghaXNOYU4obnMpICYmIG5zID49IDAgJiYgbnMgPD0gMSkge1xuICAgICAgdGhpcy5uZWlnaGJvclNjYWxlID0gbnNcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtoNS1yZW5kZXJdIGludmFsaWQgdmFsdWUgZm9yICduZWlnaGJvci1zY2FsZScgb2Ygc2xpZGVyLW5laWdoYm9yOiAke3ZhbH0uYClcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgZXZlbnQgPSB7XG4gIGNoYW5nZToge1xuICAgIHVwZGF0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgaW5kZXg6IHRoaXMuY3VycmVudEluZGV4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBDb21wb25lbnQgPSBXZWV4LkNvbXBvbmVudFxuICBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuXG4gIC8qKlxuICAgKiBkYXRhLmF0dHJcbiAgICogc3VwcG9ydCBzbGlkZXIncyBhdHRyaWJ1dGVzIGFuZCB0aHJlZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbmVpZ2hib3Itc3BhY2UgMCAtIDM3NSwgdGhlIGV4cG9zaW5nIHdpZHRoIG9mIHNsaWRlcyBvbiBib3RoIG90aGVyIHNpZGVzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmVpZ2hib3ItYWxwaGEgMCAtIDEsIG9wYWNpdHkgb2YgYm90aCBvdGhlciBzaWRlcyBvZiBzbGlkZXMsIGRlZmF1bHQgaXMgMC42LlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmVpZ2hib3Itc2NhbGUgMCAtIDEsIHRoZSBzY2FsZSBvZiBib3RoIG90aGVyIHNpZGVzIG9mIHNsaWRlcywgZGVmYXVsdCBpcyAwLjguXG4gICAqL1xuICBmdW5jdGlvbiBTbGlkZXJOZWlnaGJvciAoZGF0YSkge1xuICAgIHRoaXMuYXV0b1BsYXkgPSBmYWxzZSAgLy8gZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS5cbiAgICB0aGlzLmludGVydmFsID0gREVGQVVMVF9JTlRFUlZBTFxuICAgIHRoaXMuZGlyZWN0aW9uID0gJ3JvdycgLy8gJ2NvbHVtbicgaXMgbm90IHRlbXBvcmFyaWx5IHN1cHBvcnRlZC5cbiAgICB0aGlzLnNsaWRlcyA9IFtdXG4gICAgdGhpcy5pc1BhZ2VTaG93ID0gdHJ1ZVxuICAgIHRoaXMuaXNEb21SZW5kZXJpbmcgPSB0cnVlXG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSAwXG5cbiAgICB0aGlzLm5laWdoYm9yU3BhY2UgPSBERUZBVUxUX05FSUdIQk9SX1NQQUNFXG4gICAgdGhpcy5uZWlnaGJvckFscGhhID0gREVGQVVMVF9ORUlHSEJPUl9BTFBIQVxuICAgIHRoaXMubmVpZ2hib3JTY2FsZSA9IERFRkFVTFRfTkVJR0hCT1JfU0NBTEVcblxuICAgIC8vIGJpbmQgZXZlbnQgJ3BhZ2VzaG93JywgJ3BhZ2VoaWRlJyBhbmQgJ3Zpc2liaWxpdHljaGFuZ2UnIG9uIHdpbmRvdy5cbiAgICBpZGxlV2hlblBhZ2VEaXNhcHBlYXIodGhpcylcbiAgICAvLyBiaW5kIGV2ZW50ICdyZW5kZXJCZWdpbicgYW5kICdyZW5kZXJFbmQnIG9uIHdpbmRvdy5cbiAgICBpZGxlV2hlbkRvbVJlbmRlcmluZyh0aGlzKVxuXG4gICAgQ29tcG9uZW50LmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBTbGlkZXJOZWlnaGJvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENvbXBvbmVudC5wcm90b3R5cGUpXG4gIGV4dGVuZChTbGlkZXJOZWlnaGJvci5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoU2xpZGVyTmVpZ2hib3IucHJvdG90eXBlLCB7IGF0dHIgfSlcbiAgZXh0ZW5kKFNsaWRlck5laWdoYm9yLnByb3RvdHlwZSwgeyBldmVudCB9KVxuXG4gIFdlZXgucmVnaXN0ZXJDb21wb25lbnQoJ3NsaWRlci1uZWlnaGJvcicsIFNsaWRlck5laWdoYm9yKVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3QgZGlzcGxheU1hcCA9IHtcbiAgYTogJ2lubGluZScsXG4gIGltYWdlOiAnaW5saW5lLWJsb2NrJyxcbiAgc3BhbjogJ2lubGluZS1ibG9jaydcbn1cblxuY29uc3QgdHlwZU1hcCA9IHtcbiAgYTogJ2EnLFxuICBpbWFnZTogJ2ltYWdlJyxcbiAgc3BhbjogJ3RleHQnXG59XG5cbmxldCBfcmljaFRleHROb2RlUmVmID0gMFxuY29uc3QgZ2V0UmljaFRleHROb2RlUmVmID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gYHJ0bi0ke19yaWNoVGV4dE5vZGVSZWYrK31gXG59XG5cbmZ1bmN0aW9uIF9pc0FycmF5IChhcnIpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnIpLnNsaWNlKDgsIC0xKSA9PT0gJ0FycmF5J1xufVxuXG5mdW5jdGlvbiBfaXNQbGFpbk9iamVjdCAob2JqKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5zbGljZSg4LCAtMSkgPT09ICdPYmplY3QnXG59XG5cbmZ1bmN0aW9uIF9wYXJzZSAocGFyZW50LCBwYXJlbnROb2RlLCB2YWx1ZSkge1xuICBpZiAoX2lzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLmZvckVhY2goKG5vZGUpID0+IF9wYXJzZShwYXJlbnQsIHBhcmVudE5vZGUsIG5vZGUpKVxuICB9XG4gIGlmIChfaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBjb25zdCB7IHR5cGUsIGF0dHIsIHN0eWxlLCBjaGlsZHJlbiB9ID0gdmFsdWVcbiAgICAvLyBkb24ndCBwYXNzIGNoaWxkcmVuIHRvIGNvbXBvbm5lbnQncyBvd24gYGNyZWF0ZUNoaWxkcmVuYCBtZXRob2QuXG4gICAgLy8gb3RoZXJ3aXNlIHRoZXJlJ3Mgbm8gY2hhbmNlIHRvIHNldCBjaGlsZHJlbidzIGRpc3BsYXkgdG8gYGlubGluZWAuXG4gICAgZGVsZXRlIHZhbHVlLmNoaWxkcmVuXG4gICAgY29uc3QgY29tcCA9IHBhcmVudC5nZXRDb21wb25lbnRNYW5hZ2VyKCkuY3JlYXRlRWxlbWVudCh7XG4gICAgICB0eXBlOiB0eXBlTWFwW3R5cGVdLFxuICAgICAgcmVmOiBnZXRSaWNoVGV4dE5vZGVSZWYoKSxcbiAgICAgIGF0dHIsXG4gICAgICBzdHlsZVxuICAgIH0pXG4gICAgY29tcC5ub2RlLnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5TWFwW3R5cGVdXG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjb21wLm5vZGUpXG4gICAgaWYgKF9pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IF9wYXJzZShjb21wLCBjb21wLm5vZGUsIGNoaWxkKSlcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcHJvdG8gPSB7XG4gIGNyZWF0ZSAoKSB7XG4gICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgbm9kZS5jbGFzc0xpc3QuYWRkKCd3ZWV4LWVsZW1lbnQnKVxuICAgIG5vZGUuY2xhc3NMaXN0LmFkZCgnd2VleC1yaWNodGV4dCcpXG4gICAgcmV0dXJuIG5vZGVcbiAgfSxcblxuICBwYXJzZSAoKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5ub2RlLmNoaWxkcmVuKVxuICAgICAgLmZvckVhY2goKGNoaWxkKSA9PiB0aGlzLm5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpKVxuICAgIGlmICghdGhpcy52YWx1ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIF9wYXJzZSh0aGlzLCB0aGlzLm5vZGUsIHRoaXMudmFsdWUpXG4gIH1cbn1cblxuLy8gdXBkYXRhYmxlIGF0dHJpYnV0ZXNcbmNvbnN0IGF0dHIgPSB7XG4gIHZhbHVlICh2YWwpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsXG4gICAgdGhpcy5wYXJzZSgpXG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdCAoV2VleCkge1xuICBjb25zdCBBdG9taWMgPSBXZWV4LkF0b21pY1xuICBjb25zdCBleHRlbmQgPSBXZWV4LnV0aWxzLmV4dGVuZFxuXG4gIC8qKlxuICAgKiBhdHRyczpcbiAgICogIC0gdmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIFJpY2hUZXh0IChkYXRhKSB7XG4gICAgQXRvbWljLmNhbGwodGhpcywgZGF0YSlcbiAgfVxuICBSaWNoVGV4dC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEF0b21pYy5wcm90b3R5cGUpXG4gIGV4dGVuZChSaWNoVGV4dC5wcm90b3R5cGUsIHByb3RvKVxuICBleHRlbmQoUmljaFRleHQucHJvdG90eXBlLCB7IGF0dHIgfSlcblxuICBXZWV4LnJlZ2lzdGVyQ29tcG9uZW50KCdyaWNodGV4dCcsIFJpY2hUZXh0KVxufVxuXG5leHBvcnQgZGVmYXVsdCB7IGluaXQgfVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuLyoqXG4gKiBjb25maWc6XG4gKiAgIC0gc3R5bGVzXG4gKiAgIC0gZHVyYXRpb24gW051bWJlcl0gbWlsbGlzZWNvbmRzKG1zKVxuICogICAtIHRpbWluZ0Z1bmN0aW9uIFtzdHJpbmddXG4gKiAgIC0gZGVhbHkgW051bWJlcl0gbWlsbGlzZWNvbmRzKG1zKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNpdGlvbk9uY2UgKGNvbXAsIGNvbmZpZywgY2FsbGJhY2spIHtcbiAgY29uc3Qgc3R5bGVzID0gY29uZmlnLnN0eWxlcyB8fCB7fVxuICBjb25zdCBkdXJhdGlvbiA9IGNvbmZpZy5kdXJhdGlvbiB8fCAxMDAwIC8vIG1zXG4gIGNvbnN0IHRpbWluZ0Z1bmN0aW9uID0gY29uZmlnLnRpbWluZ0Z1bmN0aW9uIHx8ICdlYXNlJ1xuICBjb25zdCBkZWxheSA9IGNvbmZpZy5kZWxheSB8fCAwICAvLyBtc1xuICBjb25zdCB0cmFuc2l0aW9uVmFsdWUgPSAnYWxsICcgKyBkdXJhdGlvbiArICdtcyAnXG4gICAgICArIHRpbWluZ0Z1bmN0aW9uICsgJyAnICsgZGVsYXkgKyAnbXMnXG4gIGNvbnN0IGRvbSA9IGNvbXAubm9kZVxuICBjb25zdCB0cmFuc2l0aW9uRW5kSGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgdHJhbnNpdGlvbkVuZEhhbmRsZXIpXG4gICAgZG9tLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0cmFuc2l0aW9uRW5kSGFuZGxlcilcbiAgICBkb20uc3R5bGUudHJhbnNpdGlvbiA9ICcnXG4gICAgZG9tLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSAnJ1xuICAgIGNhbGxiYWNrKClcbiAgfVxuICBkb20uc3R5bGUudHJhbnNpdGlvbiA9IHRyYW5zaXRpb25WYWx1ZVxuICBkb20uc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9IHRyYW5zaXRpb25WYWx1ZVxuICBkb20uYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0VHJhbnNpdGlvbkVuZCcsIHRyYW5zaXRpb25FbmRIYW5kbGVyKVxuICBkb20uYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRyYW5zaXRpb25FbmRIYW5kbGVyKVxuICBjb21wLnVwZGF0ZVN0eWxlKHN0eWxlcylcbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCB7IHRyYW5zaXRpb25PbmNlIH0gZnJvbSAnLi9saWInXG5cbmNvbnN0IF9kYXRhID0ge31cblxuY29uc3QgYW5pbWF0aW9uID0ge1xuXG4gIC8qKlxuICAgKiB0cmFuc2l0aW9uXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcmVmICAgICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAge29ian0gY29uZmlnICAgICBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAge3N0cmluZ30gY2FsbGJhY2tJZCBbZGVzY3JpcHRpb25dXG4gICAqL1xuICB0cmFuc2l0aW9uOiBmdW5jdGlvbiAocmVmLCBjb25maWcsIGNhbGxiYWNrSWQpIHtcbiAgICBsZXQgcmVmRGF0YSA9IF9kYXRhW3JlZl1cbiAgICBjb25zdCBzdHlsZXNLZXkgPSBKU09OLnN0cmluZ2lmeShjb25maWcuc3R5bGVzKVxuICAgIGNvbnN0IHdlZXhJbnN0YW5jZSA9IHRoaXNcbiAgICAvLyBJZiB0aGUgc2FtZSBjb21wb25lbnQgcGVyZm9ybSBhIGFuaW1hdGlvbiB3aXRoIGV4YWN0bHkgdGhlIHNhbWVcbiAgICAvLyBzdHlsZXMgaW4gYSBzZXF1ZW5jZSB3aXRoIHNvIHNob3J0IGludGVydmFsIHRoYXQgdGhlIHByZXYgYW5pbWF0aW9uXG4gICAgLy8gaXMgc3RpbGwgaW4gcGxheWluZywgdGhlbiB0aGUgbmV4dCBhbmltYXRpb24gc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgaWYgKHJlZkRhdGEgJiYgcmVmRGF0YVtzdHlsZXNLZXldKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKCFyZWZEYXRhKSB7XG4gICAgICByZWZEYXRhID0gX2RhdGFbcmVmXSA9IHt9XG4gICAgfVxuICAgIHJlZkRhdGFbc3R5bGVzS2V5XSA9IHRydWVcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmdldENvbXBvbmVudChyZWYpXG4gICAgcmV0dXJuIHRyYW5zaXRpb25PbmNlKGNvbXBvbmVudCwgY29uZmlnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIHN0eWxlc0tleSBpbiByZWZEYXRhIHNvIHRoYXQgdGhlIHNhbWUgYW5pbWF0aW9uXG4gICAgICAvLyBjYW4gYmUgcGxheWVkIGFnYWluIGFmdGVyIGN1cnJlbnQgYW5pbWF0aW9uIGlzIGFscmVhZHkgZmluaXNoZWQuXG4gICAgICBkZWxldGUgcmVmRGF0YVtzdHlsZXNLZXldXG4gICAgICB3ZWV4SW5zdGFuY2Uuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkKVxuICAgIH0pXG4gIH1cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgYW5pbWF0aW9uOiBbe1xuICAgIG5hbWU6ICd0cmFuc2l0aW9uJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdvYmplY3QnLCAnZnVuY3Rpb24nXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnYW5pbWF0aW9uJywgYW5pbWF0aW9uLCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG4vKipcblxuQVVDVElPTjpcbnRhc2tRdWV1ZVxuQ2xpcGJvYXJkLnNldFN0cmluZygpICBOT1cgbm90IHdvcmtzLCBmYWNpbmcgdG8gdXNlci1hY3QgbG9zZSBvZiB0YXNrUXVldWUuXG5cbndvcmtzIGluIENocm9tZSBGaXJlZm94IE9wZXJhLiBidXQgbm90IGluIFNhZmFyaS5cbkBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L2V4ZWNDb21tYW5kI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuXG5DbGlwYm9hcmQuZ2V0U3RyaW5nKCkgdW5pbXBsZW1lbnRlZC4gVGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gZG8gcGFzdGUgZnJvbSBjbGlwYm9hcmQgdG8ganMgdmFyaWFibGUuXG5cblNvIGxvb2sgb3V0IHlvdXIgYXBwIGJlaGF2aW9yLCB3aGVuIGRvd25ncmFkZSB0byBodG1sNSByZW5kZXIuXG5BbnkgaWRlYSBpcyB3ZWxjb21lLlxuKiovXG5cbmNvbnN0IFdFRVhfQ0xJUEJPQVJEX0lEID0gJ19fd2VleF9jbGlwYm9hcmRfaWRfXydcblxuY29uc3QgY2xpcGJvYXJkID0ge1xuXG4gIGdldFN0cmluZzogZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHtcbiAgICAvLyBub3Qgc3VwcG9ydGVkIGluIGh0bWw1XG4gICAgY29uc29sZS5sb2coJ2NsaXBib2FyZC5nZXRTdHJpbmcoKSBpcyBub3Qgc3VwcG9ydGVkIG5vdy4nKVxuICB9LFxuXG4gIHNldFN0cmluZzogZnVuY3Rpb24gKHRleHQpIHtcbiAgICAvLyBub3Qgc3VwcG9ydCBzYWZhcmlcbiAgICBpZiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnICYmIHRleHQgIT09ICcnICYmIGRvY3VtZW50LmV4ZWNDb21tYW5kKSB7XG4gICAgICBjb25zdCB0ZW1wSW5wdXQgPSBlbGVtZW50KClcbiAgICAgIHRlbXBJbnB1dC52YWx1ZSA9IHRleHRcblxuICAgICAgdGVtcElucHV0LnNlbGVjdCgpXG4gICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpXG4gICAgICAvLyB2YXIgb3V0ID0gZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXhlY0NvbW1hbmQgb3V0IGlzIFwiICsgb3V0KTtcbiAgICAgIHRlbXBJbnB1dC52YWx1ZSA9ICcnXG4gICAgICB0ZW1wSW5wdXQuYmx1cigpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ29ubHkgc3VwcG9ydCBzdHJpbmcgaW5wdXQgbm93JylcbiAgICB9XG4gIH1cblxufVxuXG5mdW5jdGlvbiBlbGVtZW50ICgpIHtcbiAgbGV0IHRlbXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFdFRVhfQ0xJUEJPQVJEX0lEKVxuICBpZiAoIXRlbXBJbnB1dCkge1xuICAgIHRlbXBJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JylcbiAgICB0ZW1wSW5wdXQuc2V0QXR0cmlidXRlKCdpZCcsIFdFRVhfQ0xJUEJPQVJEX0lEKVxuICAgIHRlbXBJbnB1dC5zdHlsZS5jc3NUZXh0ID0gJ2hlaWdodDoxcHg7d2lkdGg6MXB4O2JvcmRlcjpub25lOydcbiAgICAvLyB0ZW1wSW5wdXQuc3R5bGUuY3NzVGV4dCA9IFwiaGVpZ2h0OjQwcHg7d2lkdGg6MzAwcHg7Ym9yZGVyOnNvbGlkO1wiXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wSW5wdXQpXG4gIH1cbiAgcmV0dXJuIHRlbXBJbnB1dFxufVxuXG5jb25zdCBtZXRhID0ge1xuICBjbGlwYm9hcmQ6IFt7XG4gICAgbmFtZTogJ2dldFN0cmluZycsXG4gICAgYXJnczogWydmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnc2V0U3RyaW5nJyxcbiAgICBhcmdzOiBbJ3N0cmluZyddXG4gIH1dXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdjbGlwYm9hcmQnLCBjbGlwYm9hcmQsIG1ldGEpXG4gIH1cbn1cbiIsIlxuLyoqXG4gKiBFeHBvc2UgYEVtaXR0ZXJgLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBFbWl0dGVyYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XG4gIGlmIChvYmopIHJldHVybiBtaXhpbihvYmopO1xufTtcblxuLyoqXG4gKiBNaXhpbiB0aGUgZW1pdHRlciBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIG1peGluKG9iaikge1xuICBmb3IgKHZhciBrZXkgaW4gRW1pdHRlci5wcm90b3R5cGUpIHtcbiAgICBvYmpba2V5XSA9IEVtaXR0ZXIucHJvdG90eXBlW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBMaXN0ZW4gb24gdGhlIGdpdmVuIGBldmVudGAgd2l0aCBgZm5gLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLm9uID1cbkVtaXR0ZXIucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gICh0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XSB8fCBbXSlcbiAgICAucHVzaChmbik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGRzIGFuIGBldmVudGAgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgYSBzaW5nbGVcbiAqIHRpbWUgdGhlbiBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RW1pdHRlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XG4gIGZ1bmN0aW9uIG9uKCkge1xuICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uLmZuID0gZm47XG4gIHRoaXMub24oZXZlbnQsIG9uKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2FsbGJhY2sgZm9yIGBldmVudGAgb3IgYWxsXG4gKiByZWdpc3RlcmVkIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5vZmYgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCwgZm4pe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG5cbiAgLy8gYWxsXG4gIGlmICgwID09IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIHNwZWNpZmljIGV2ZW50XG4gIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xuICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuIHRoaXM7XG5cbiAgLy8gcmVtb3ZlIGFsbCBoYW5kbGVyc1xuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyByZW1vdmUgc3BlY2lmaWMgaGFuZGxlclxuICB2YXIgY2I7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgY2IgPSBjYWxsYmFja3NbaV07XG4gICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcbiAgICAgIGNhbGxiYWNrcy5zcGxpY2UoaSwgMSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtNaXhlZH0gLi4uXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxuICovXG5cbkVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihldmVudCl7XG4gIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCB7fTtcbiAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSlcbiAgICAsIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF07XG5cbiAgaWYgKGNhbGxiYWNrcykge1xuICAgIGNhbGxiYWNrcyA9IGNhbGxiYWNrcy5zbGljZSgwKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICBjYWxsYmFja3NbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhcnJheSBvZiBjYWxsYmFja3MgZm9yIGBldmVudGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuRW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XG4gIHJldHVybiB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGlzIGVtaXR0ZXIgaGFzIGBldmVudGAgaGFuZGxlcnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5FbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XG4gIHJldHVybiAhISB0aGlzLmxpc3RlbmVycyhldmVudCkubGVuZ3RoO1xufTtcbiIsIi8qKlxuICogdG9TdHJpbmcgcmVmLlxuICovXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogUmV0dXJuIHRoZSB0eXBlIG9mIGB2YWxgLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCl7XG4gIHN3aXRjaCAodG9TdHJpbmcuY2FsbCh2YWwpKSB7XG4gICAgY2FzZSAnW29iamVjdCBEYXRlXSc6IHJldHVybiAnZGF0ZSc7XG4gICAgY2FzZSAnW29iamVjdCBSZWdFeHBdJzogcmV0dXJuICdyZWdleHAnO1xuICAgIGNhc2UgJ1tvYmplY3QgQXJndW1lbnRzXSc6IHJldHVybiAnYXJndW1lbnRzJztcbiAgICBjYXNlICdbb2JqZWN0IEFycmF5XSc6IHJldHVybiAnYXJyYXknO1xuICAgIGNhc2UgJ1tvYmplY3QgRXJyb3JdJzogcmV0dXJuICdlcnJvcic7XG4gIH1cblxuICBpZiAodmFsID09PSBudWxsKSByZXR1cm4gJ251bGwnO1xuICBpZiAodmFsID09PSB1bmRlZmluZWQpIHJldHVybiAndW5kZWZpbmVkJztcbiAgaWYgKHZhbCAhPT0gdmFsKSByZXR1cm4gJ25hbic7XG4gIGlmICh2YWwgJiYgdmFsLm5vZGVUeXBlID09PSAxKSByZXR1cm4gJ2VsZW1lbnQnO1xuXG4gIHZhbCA9IHZhbC52YWx1ZU9mXG4gICAgPyB2YWwudmFsdWVPZigpXG4gICAgOiBPYmplY3QucHJvdG90eXBlLnZhbHVlT2YuYXBwbHkodmFsKVxuXG4gIHJldHVybiB0eXBlb2YgdmFsO1xufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgdHlwZTtcbnRyeSB7XG4gIHR5cGUgPSByZXF1aXJlKCdjb21wb25lbnQtdHlwZScpO1xufSBjYXRjaCAoXykge1xuICB0eXBlID0gcmVxdWlyZSgndHlwZScpO1xufVxuXG4vKipcbiAqIE1vZHVsZSBleHBvcnRzLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gY2xvbmU7XG5cbi8qKlxuICogQ2xvbmVzIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gYW55IG9iamVjdFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZShvYmope1xuICBzd2l0Y2ggKHR5cGUob2JqKSkge1xuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICB2YXIgY29weSA9IHt9O1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBjb3B5W2tleV0gPSBjbG9uZShvYmpba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjb3B5O1xuXG4gICAgY2FzZSAnYXJyYXknOlxuICAgICAgdmFyIGNvcHkgPSBuZXcgQXJyYXkob2JqLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29weVtpXSA9IGNsb25lKG9ialtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29weTtcblxuICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAvLyBmcm9tIG1pbGxlcm1lZGVpcm9zL2FtZC11dGlscyAtIE1JVFxuICAgICAgdmFyIGZsYWdzID0gJyc7XG4gICAgICBmbGFncyArPSBvYmoubXVsdGlsaW5lID8gJ20nIDogJyc7XG4gICAgICBmbGFncyArPSBvYmouZ2xvYmFsID8gJ2cnIDogJyc7XG4gICAgICBmbGFncyArPSBvYmouaWdub3JlQ2FzZSA/ICdpJyA6ICcnO1xuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAob2JqLnNvdXJjZSwgZmxhZ3MpO1xuXG4gICAgY2FzZSAnZGF0ZSc6XG4gICAgICByZXR1cm4gbmV3IERhdGUob2JqLmdldFRpbWUoKSk7XG5cbiAgICBkZWZhdWx0OiAvLyBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiwg4oCmXG4gICAgICByZXR1cm4gb2JqO1xuICB9XG59XG4iLCJcbi8vIGVhc2luZyBmdW5jdGlvbnMgZnJvbSBcIlR3ZWVuLmpzXCJcblxuZXhwb3J0cy5saW5lYXIgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIG47XG59O1xuXG5leHBvcnRzLmluUXVhZCA9IGZ1bmN0aW9uKG4pe1xuICByZXR1cm4gbiAqIG47XG59O1xuXG5leHBvcnRzLm91dFF1YWQgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIG4gKiAoMiAtIG4pO1xufTtcblxuZXhwb3J0cy5pbk91dFF1YWQgPSBmdW5jdGlvbihuKXtcbiAgbiAqPSAyO1xuICBpZiAobiA8IDEpIHJldHVybiAwLjUgKiBuICogbjtcbiAgcmV0dXJuIC0gMC41ICogKC0tbiAqIChuIC0gMikgLSAxKTtcbn07XG5cbmV4cG9ydHMuaW5DdWJlID0gZnVuY3Rpb24obil7XG4gIHJldHVybiBuICogbiAqIG47XG59O1xuXG5leHBvcnRzLm91dEN1YmUgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIC0tbiAqIG4gKiBuICsgMTtcbn07XG5cbmV4cG9ydHMuaW5PdXRDdWJlID0gZnVuY3Rpb24obil7XG4gIG4gKj0gMjtcbiAgaWYgKG4gPCAxKSByZXR1cm4gMC41ICogbiAqIG4gKiBuO1xuICByZXR1cm4gMC41ICogKChuIC09IDIgKSAqIG4gKiBuICsgMik7XG59O1xuXG5leHBvcnRzLmluUXVhcnQgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIG4gKiBuICogbiAqIG47XG59O1xuXG5leHBvcnRzLm91dFF1YXJ0ID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAxIC0gKC0tbiAqIG4gKiBuICogbik7XG59O1xuXG5leHBvcnRzLmluT3V0UXVhcnQgPSBmdW5jdGlvbihuKXtcbiAgbiAqPSAyO1xuICBpZiAobiA8IDEpIHJldHVybiAwLjUgKiBuICogbiAqIG4gKiBuO1xuICByZXR1cm4gLTAuNSAqICgobiAtPSAyKSAqIG4gKiBuICogbiAtIDIpO1xufTtcblxuZXhwb3J0cy5pblF1aW50ID0gZnVuY3Rpb24obil7XG4gIHJldHVybiBuICogbiAqIG4gKiBuICogbjtcbn1cblxuZXhwb3J0cy5vdXRRdWludCA9IGZ1bmN0aW9uKG4pe1xuICByZXR1cm4gLS1uICogbiAqIG4gKiBuICogbiArIDE7XG59XG5cbmV4cG9ydHMuaW5PdXRRdWludCA9IGZ1bmN0aW9uKG4pe1xuICBuICo9IDI7XG4gIGlmIChuIDwgMSkgcmV0dXJuIDAuNSAqIG4gKiBuICogbiAqIG4gKiBuO1xuICByZXR1cm4gMC41ICogKChuIC09IDIpICogbiAqIG4gKiBuICogbiArIDIpO1xufTtcblxuZXhwb3J0cy5pblNpbmUgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIDEgLSBNYXRoLmNvcyhuICogTWF0aC5QSSAvIDIgKTtcbn07XG5cbmV4cG9ydHMub3V0U2luZSA9IGZ1bmN0aW9uKG4pe1xuICByZXR1cm4gTWF0aC5zaW4obiAqIE1hdGguUEkgLyAyKTtcbn07XG5cbmV4cG9ydHMuaW5PdXRTaW5lID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAuNSAqICgxIC0gTWF0aC5jb3MoTWF0aC5QSSAqIG4pKTtcbn07XG5cbmV4cG9ydHMuaW5FeHBvID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAwID09IG4gPyAwIDogTWF0aC5wb3coMTAyNCwgbiAtIDEpO1xufTtcblxuZXhwb3J0cy5vdXRFeHBvID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAxID09IG4gPyBuIDogMSAtIE1hdGgucG93KDIsIC0xMCAqIG4pO1xufTtcblxuZXhwb3J0cy5pbk91dEV4cG8gPSBmdW5jdGlvbihuKXtcbiAgaWYgKDAgPT0gbikgcmV0dXJuIDA7XG4gIGlmICgxID09IG4pIHJldHVybiAxO1xuICBpZiAoKG4gKj0gMikgPCAxKSByZXR1cm4gLjUgKiBNYXRoLnBvdygxMDI0LCBuIC0gMSk7XG4gIHJldHVybiAuNSAqICgtTWF0aC5wb3coMiwgLTEwICogKG4gLSAxKSkgKyAyKTtcbn07XG5cbmV4cG9ydHMuaW5DaXJjID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSBuICogbik7XG59O1xuXG5leHBvcnRzLm91dENpcmMgPSBmdW5jdGlvbihuKXtcbiAgcmV0dXJuIE1hdGguc3FydCgxIC0gKC0tbiAqIG4pKTtcbn07XG5cbmV4cG9ydHMuaW5PdXRDaXJjID0gZnVuY3Rpb24obil7XG4gIG4gKj0gMlxuICBpZiAobiA8IDEpIHJldHVybiAtMC41ICogKE1hdGguc3FydCgxIC0gbiAqIG4pIC0gMSk7XG4gIHJldHVybiAwLjUgKiAoTWF0aC5zcXJ0KDEgLSAobiAtPSAyKSAqIG4pICsgMSk7XG59O1xuXG5leHBvcnRzLmluQmFjayA9IGZ1bmN0aW9uKG4pe1xuICB2YXIgcyA9IDEuNzAxNTg7XG4gIHJldHVybiBuICogbiAqICgoIHMgKyAxICkgKiBuIC0gcyk7XG59O1xuXG5leHBvcnRzLm91dEJhY2sgPSBmdW5jdGlvbihuKXtcbiAgdmFyIHMgPSAxLjcwMTU4O1xuICByZXR1cm4gLS1uICogbiAqICgocyArIDEpICogbiArIHMpICsgMTtcbn07XG5cbmV4cG9ydHMuaW5PdXRCYWNrID0gZnVuY3Rpb24obil7XG4gIHZhciBzID0gMS43MDE1OCAqIDEuNTI1O1xuICBpZiAoICggbiAqPSAyICkgPCAxICkgcmV0dXJuIDAuNSAqICggbiAqIG4gKiAoICggcyArIDEgKSAqIG4gLSBzICkgKTtcbiAgcmV0dXJuIDAuNSAqICggKCBuIC09IDIgKSAqIG4gKiAoICggcyArIDEgKSAqIG4gKyBzICkgKyAyICk7XG59O1xuXG5leHBvcnRzLmluQm91bmNlID0gZnVuY3Rpb24obil7XG4gIHJldHVybiAxIC0gZXhwb3J0cy5vdXRCb3VuY2UoMSAtIG4pO1xufTtcblxuZXhwb3J0cy5vdXRCb3VuY2UgPSBmdW5jdGlvbihuKXtcbiAgaWYgKCBuIDwgKCAxIC8gMi43NSApICkge1xuICAgIHJldHVybiA3LjU2MjUgKiBuICogbjtcbiAgfSBlbHNlIGlmICggbiA8ICggMiAvIDIuNzUgKSApIHtcbiAgICByZXR1cm4gNy41NjI1ICogKCBuIC09ICggMS41IC8gMi43NSApICkgKiBuICsgMC43NTtcbiAgfSBlbHNlIGlmICggbiA8ICggMi41IC8gMi43NSApICkge1xuICAgIHJldHVybiA3LjU2MjUgKiAoIG4gLT0gKCAyLjI1IC8gMi43NSApICkgKiBuICsgMC45Mzc1O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiA3LjU2MjUgKiAoIG4gLT0gKCAyLjYyNSAvIDIuNzUgKSApICogbiArIDAuOTg0Mzc1O1xuICB9XG59O1xuXG5leHBvcnRzLmluT3V0Qm91bmNlID0gZnVuY3Rpb24obil7XG4gIGlmIChuIDwgLjUpIHJldHVybiBleHBvcnRzLmluQm91bmNlKG4gKiAyKSAqIC41O1xuICByZXR1cm4gZXhwb3J0cy5vdXRCb3VuY2UobiAqIDIgLSAxKSAqIC41ICsgLjU7XG59O1xuXG4vLyBhbGlhc2VzXG5cbmV4cG9ydHNbJ2luLXF1YWQnXSA9IGV4cG9ydHMuaW5RdWFkO1xuZXhwb3J0c1snb3V0LXF1YWQnXSA9IGV4cG9ydHMub3V0UXVhZDtcbmV4cG9ydHNbJ2luLW91dC1xdWFkJ10gPSBleHBvcnRzLmluT3V0UXVhZDtcbmV4cG9ydHNbJ2luLWN1YmUnXSA9IGV4cG9ydHMuaW5DdWJlO1xuZXhwb3J0c1snb3V0LWN1YmUnXSA9IGV4cG9ydHMub3V0Q3ViZTtcbmV4cG9ydHNbJ2luLW91dC1jdWJlJ10gPSBleHBvcnRzLmluT3V0Q3ViZTtcbmV4cG9ydHNbJ2luLXF1YXJ0J10gPSBleHBvcnRzLmluUXVhcnQ7XG5leHBvcnRzWydvdXQtcXVhcnQnXSA9IGV4cG9ydHMub3V0UXVhcnQ7XG5leHBvcnRzWydpbi1vdXQtcXVhcnQnXSA9IGV4cG9ydHMuaW5PdXRRdWFydDtcbmV4cG9ydHNbJ2luLXF1aW50J10gPSBleHBvcnRzLmluUXVpbnQ7XG5leHBvcnRzWydvdXQtcXVpbnQnXSA9IGV4cG9ydHMub3V0UXVpbnQ7XG5leHBvcnRzWydpbi1vdXQtcXVpbnQnXSA9IGV4cG9ydHMuaW5PdXRRdWludDtcbmV4cG9ydHNbJ2luLXNpbmUnXSA9IGV4cG9ydHMuaW5TaW5lO1xuZXhwb3J0c1snb3V0LXNpbmUnXSA9IGV4cG9ydHMub3V0U2luZTtcbmV4cG9ydHNbJ2luLW91dC1zaW5lJ10gPSBleHBvcnRzLmluT3V0U2luZTtcbmV4cG9ydHNbJ2luLWV4cG8nXSA9IGV4cG9ydHMuaW5FeHBvO1xuZXhwb3J0c1snb3V0LWV4cG8nXSA9IGV4cG9ydHMub3V0RXhwbztcbmV4cG9ydHNbJ2luLW91dC1leHBvJ10gPSBleHBvcnRzLmluT3V0RXhwbztcbmV4cG9ydHNbJ2luLWNpcmMnXSA9IGV4cG9ydHMuaW5DaXJjO1xuZXhwb3J0c1snb3V0LWNpcmMnXSA9IGV4cG9ydHMub3V0Q2lyYztcbmV4cG9ydHNbJ2luLW91dC1jaXJjJ10gPSBleHBvcnRzLmluT3V0Q2lyYztcbmV4cG9ydHNbJ2luLWJhY2snXSA9IGV4cG9ydHMuaW5CYWNrO1xuZXhwb3J0c1snb3V0LWJhY2snXSA9IGV4cG9ydHMub3V0QmFjaztcbmV4cG9ydHNbJ2luLW91dC1iYWNrJ10gPSBleHBvcnRzLmluT3V0QmFjaztcbmV4cG9ydHNbJ2luLWJvdW5jZSddID0gZXhwb3J0cy5pbkJvdW5jZTtcbmV4cG9ydHNbJ291dC1ib3VuY2UnXSA9IGV4cG9ydHMub3V0Qm91bmNlO1xuZXhwb3J0c1snaW4tb3V0LWJvdW5jZSddID0gZXhwb3J0cy5pbk91dEJvdW5jZTtcbiIsIlxuLyoqXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzLlxuICovXG5cbnZhciBFbWl0dGVyID0gcmVxdWlyZSgnZW1pdHRlcicpO1xudmFyIGNsb25lID0gcmVxdWlyZSgnY2xvbmUnKTtcbnZhciB0eXBlID0gcmVxdWlyZSgndHlwZScpO1xudmFyIGVhc2UgPSByZXF1aXJlKCdlYXNlJyk7XG5cbi8qKlxuICogRXhwb3NlIGBUd2VlbmAuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBUd2VlbjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBUd2VlbmAgd2l0aCBgb2JqYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIFR3ZWVuKG9iaikge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHdlZW4pKSByZXR1cm4gbmV3IFR3ZWVuKG9iaik7XG4gIHRoaXMuX2Zyb20gPSBvYmo7XG4gIHRoaXMuZWFzZSgnbGluZWFyJyk7XG4gIHRoaXMuZHVyYXRpb24oNTAwKTtcbn1cblxuLyoqXG4gKiBNaXhpbiBlbWl0dGVyLlxuICovXG5cbkVtaXR0ZXIoVHdlZW4ucHJvdG90eXBlKTtcblxuLyoqXG4gKiBSZXNldCB0aGUgdHdlZW4uXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Ud2Vlbi5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpe1xuICB0aGlzLmlzQXJyYXkgPSAnYXJyYXknID09PSB0eXBlKHRoaXMuX2Zyb20pO1xuICB0aGlzLl9jdXJyID0gY2xvbmUodGhpcy5fZnJvbSk7XG4gIHRoaXMuX2RvbmUgPSBmYWxzZTtcbiAgdGhpcy5fc3RhcnQgPSBEYXRlLm5vdygpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogVHdlZW4gdG8gYG9iamAgYW5kIHJlc2V0IGludGVybmFsIHN0YXRlLlxuICpcbiAqICAgIHR3ZWVuLnRvKHsgeDogNTAsIHk6IDEwMCB9KVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmpcbiAqIEByZXR1cm4ge1R3ZWVufSBzZWxmXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblR3ZWVuLnByb3RvdHlwZS50byA9IGZ1bmN0aW9uKG9iail7XG4gIHRoaXMucmVzZXQoKTtcbiAgdGhpcy5fdG8gPSBvYmo7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgZHVyYXRpb24gdG8gYG1zYCBbNTAwXS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1R3ZWVufSBzZWxmXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cblR3ZWVuLnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uKG1zKXtcbiAgdGhpcy5fZHVyYXRpb24gPSBtcztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCBlYXNpbmcgZnVuY3Rpb24gdG8gYGZuYC5cbiAqXG4gKiAgICB0d2Vlbi5lYXNlKCdpbi1vdXQtc2luZScpXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtUd2Vlbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuVHdlZW4ucHJvdG90eXBlLmVhc2UgPSBmdW5jdGlvbihmbil7XG4gIGZuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZm4gPyBmbiA6IGVhc2VbZm5dO1xuICBpZiAoIWZuKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpbnZhbGlkIGVhc2luZyBmdW5jdGlvbicpO1xuICB0aGlzLl9lYXNlID0gZm47XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTdG9wIHRoZSB0d2VlbiBhbmQgaW1tZWRpYXRlbHkgZW1pdCBcInN0b3BcIiBhbmQgXCJlbmRcIi5cbiAqXG4gKiBAcmV0dXJuIHtUd2Vlbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuVHdlZW4ucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpe1xuICB0aGlzLnN0b3BwZWQgPSB0cnVlO1xuICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgdGhpcy5lbWl0KCdzdG9wJyk7XG4gIHRoaXMuZW1pdCgnZW5kJyk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtIGEgc3RlcC5cbiAqXG4gKiBAcmV0dXJuIHtUd2Vlbn0gc2VsZlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuVHdlZW4ucHJvdG90eXBlLnN0ZXAgPSBmdW5jdGlvbigpe1xuICBpZiAodGhpcy5fZG9uZSkgcmV0dXJuO1xuXG4gIC8vIGR1cmF0aW9uXG4gIHZhciBkdXJhdGlvbiA9IHRoaXMuX2R1cmF0aW9uO1xuICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgdmFyIGRlbHRhID0gbm93IC0gdGhpcy5fc3RhcnQ7XG4gIHZhciBkb25lID0gZGVsdGEgPj0gZHVyYXRpb247XG5cbiAgLy8gY29tcGxldGVcbiAgaWYgKGRvbmUpIHtcbiAgICB0aGlzLl9mcm9tID0gdGhpcy5fdG87XG4gICAgdGhpcy5fdXBkYXRlKHRoaXMuX3RvKTtcbiAgICB0aGlzLl9kb25lID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHdlZW5cbiAgdmFyIGZyb20gPSB0aGlzLl9mcm9tO1xuICB2YXIgdG8gPSB0aGlzLl90bztcbiAgdmFyIGN1cnIgPSB0aGlzLl9jdXJyO1xuICB2YXIgZm4gPSB0aGlzLl9lYXNlO1xuICB2YXIgcCA9IChub3cgLSB0aGlzLl9zdGFydCkgLyBkdXJhdGlvbjtcbiAgdmFyIG4gPSBmbihwKTtcblxuICAvLyBhcnJheVxuICBpZiAodGhpcy5pc0FycmF5KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcm9tLmxlbmd0aDsgKytpKSB7XG4gICAgICBjdXJyW2ldID0gZnJvbVtpXSArICh0b1tpXSAtIGZyb21baV0pICogbjtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGUoY3Vycik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBvYmplY2hcbiAgZm9yICh2YXIgayBpbiBmcm9tKSB7XG4gICAgY3VycltrXSA9IGZyb21ba10gKyAodG9ba10gLSBmcm9tW2tdKSAqIG47XG4gIH1cblxuICB0aGlzLl91cGRhdGUoY3Vycik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdXBkYXRlIGZ1bmN0aW9uIHRvIGBmbmAgb3JcbiAqIHdoZW4gbm8gYXJndW1lbnQgaXMgZ2l2ZW4gdGhpcyBwZXJmb3Jtc1xuICogYSBcInN0ZXBcIi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7VHdlZW59IHNlbGZcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuVHdlZW4ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGZuKXtcbiAgaWYgKDAgPT0gYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRoaXMuc3RlcCgpO1xuICB0aGlzLl91cGRhdGUgPSBmbjtcbiAgcmV0dXJuIHRoaXM7XG59OyIsIi8qKlxuICogRXhwb3NlIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKWAuXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZVxuICB8fCB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgfHwgZmFsbGJhY2s7XG5cbi8qKlxuICogRmFsbGJhY2sgaW1wbGVtZW50YXRpb24uXG4gKi9cblxudmFyIHByZXYgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbmZ1bmN0aW9uIGZhbGxiYWNrKGZuKSB7XG4gIHZhciBjdXJyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIHZhciBtcyA9IE1hdGgubWF4KDAsIDE2IC0gKGN1cnIgLSBwcmV2KSk7XG4gIHZhciByZXEgPSBzZXRUaW1lb3V0KGZuLCBtcyk7XG4gIHByZXYgPSBjdXJyO1xuICByZXR1cm4gcmVxO1xufVxuXG4vKipcbiAqIENhbmNlbC5cbiAqL1xuXG52YXIgY2FuY2VsID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lXG4gIHx8IHdpbmRvdy53ZWJraXRDYW5jZWxBbmltYXRpb25GcmFtZVxuICB8fCB3aW5kb3cubW96Q2FuY2VsQW5pbWF0aW9uRnJhbWVcbiAgfHwgd2luZG93LmNsZWFyVGltZW91dDtcblxuZXhwb3J0cy5jYW5jZWwgPSBmdW5jdGlvbihpZCl7XG4gIGNhbmNlbC5jYWxsKHdpbmRvdywgaWQpO1xufTtcbiIsIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgVHdlZW4gPSByZXF1aXJlKCd0d2VlbicpO1xudmFyIHJhZiA9IHJlcXVpcmUoJ3JhZicpO1xuXG4vKipcbiAqIEV4cG9zZSBgc2Nyb2xsVG9gLlxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gc2Nyb2xsVG87XG5cbi8qKlxuICogU2Nyb2xsIHRvIGAoeCwgeSlgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzY3JvbGxUbyh4LCB5LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHN0YXJ0IHBvc2l0aW9uXG4gIHZhciBzdGFydCA9IHNjcm9sbCgpO1xuXG4gIC8vIHNldHVwIHR3ZWVuXG4gIHZhciB0d2VlbiA9IFR3ZWVuKHN0YXJ0KVxuICAgIC5lYXNlKG9wdGlvbnMuZWFzZSB8fCAnb3V0LWNpcmMnKVxuICAgIC50byh7IHRvcDogeSwgbGVmdDogeCB9KVxuICAgIC5kdXJhdGlvbihvcHRpb25zLmR1cmF0aW9uIHx8IDEwMDApO1xuXG4gIC8vIHNjcm9sbFxuICB0d2Vlbi51cGRhdGUoZnVuY3Rpb24obyl7XG4gICAgd2luZG93LnNjcm9sbFRvKG8ubGVmdCB8IDAsIG8udG9wIHwgMCk7XG4gIH0pO1xuXG4gIC8vIGhhbmRsZSBlbmRcbiAgdHdlZW4ub24oJ2VuZCcsIGZ1bmN0aW9uKCl7XG4gICAgYW5pbWF0ZSA9IGZ1bmN0aW9uKCl7fTtcbiAgfSk7XG5cbiAgLy8gYW5pbWF0ZVxuICBmdW5jdGlvbiBhbmltYXRlKCkge1xuICAgIHJhZihhbmltYXRlKTtcbiAgICB0d2Vlbi51cGRhdGUoKTtcbiAgfVxuXG4gIGFuaW1hdGUoKTtcbiAgXG4gIHJldHVybiB0d2Vlbjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gc2Nyb2xsIHBvc2l0aW9uLlxuICpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNjcm9sbCgpIHtcbiAgdmFyIHkgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgdmFyIHggPSB3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gIHJldHVybiB7IHRvcDogeSwgbGVmdDogeCB9O1xufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IHNjcm9sbCBmcm9tICdzY3JvbGwtdG8nXG5cbmxldCBjYW1lbFRvS2ViYWIsIGFwcGVuZFN0eWxlXG5cbmNvbnN0IGRvbSA9IHtcblxuICAvKipcbiAgICogY3JlYXRlQm9keTogY3JlYXRlIHJvb3QgY29tcG9uZW50XG4gICAqIEBwYXJhbSAge29iamVjdH0gZWxlbWVudFxuICAgKiAgICBjb250YWluZXJ8bGlzdHZpZXd8c2Nyb2xsdmlld1xuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgY3JlYXRlQm9keTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgICBlbGVtZW50Lmluc3RhbmNlSWQgPSBjb21wb25lbnRNYW5hZ2VyLmluc3RhbmNlSWRcbiAgICByZXR1cm4gY29tcG9uZW50TWFuYWdlci5jcmVhdGVCb2R5KGVsZW1lbnQpXG4gIH0sXG5cbiAgYWRkRWxlbWVudDogZnVuY3Rpb24gKHBhcmVudFJlZiwgZWxlbWVudCwgaW5kZXgpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgICBlbGVtZW50Lmluc3RhbmNlSWQgPSBjb21wb25lbnRNYW5hZ2VyLmluc3RhbmNlSWRcbiAgICByZXR1cm4gY29tcG9uZW50TWFuYWdlci5hZGRFbGVtZW50KHBhcmVudFJlZiwgZWxlbWVudCwgaW5kZXgpXG4gIH0sXG5cbiAgcmVtb3ZlRWxlbWVudDogZnVuY3Rpb24gKHJlZikge1xuICAgIGNvbnN0IGNvbXBvbmVudE1hbmFnZXIgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKVxuICAgIHJldHVybiBjb21wb25lbnRNYW5hZ2VyLnJlbW92ZUVsZW1lbnQocmVmKVxuICB9LFxuXG4gIG1vdmVFbGVtZW50OiBmdW5jdGlvbiAocmVmLCBwYXJlbnRSZWYsIGluZGV4KSB7XG4gICAgY29uc3QgY29tcG9uZW50TWFuYWdlciA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpXG4gICAgcmV0dXJuIGNvbXBvbmVudE1hbmFnZXIubW92ZUVsZW1lbnQocmVmLCBwYXJlbnRSZWYsIGluZGV4KVxuICB9LFxuXG4gIGFkZEV2ZW50OiBmdW5jdGlvbiAocmVmLCB0eXBlKSB7XG4gICAgY29uc3QgY29tcG9uZW50TWFuYWdlciA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpXG4gICAgcmV0dXJuIGNvbXBvbmVudE1hbmFnZXIuYWRkRXZlbnQocmVmLCB0eXBlKVxuICB9LFxuXG4gIHJlbW92ZUV2ZW50OiBmdW5jdGlvbiAocmVmLCB0eXBlKSB7XG4gICAgY29uc3QgY29tcG9uZW50TWFuYWdlciA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpXG4gICAgcmV0dXJuIGNvbXBvbmVudE1hbmFnZXIucmVtb3ZlRXZlbnQocmVmLCB0eXBlKVxuICB9LFxuXG4gIC8qKlxuICAgKiB1cGRhdGVBdHRyczogdXBkYXRlIGF0dHJpYnV0ZXMgb2YgY29tcG9uZW50XG4gICAqIEBwYXJhbSAge3N0cmluZ30gcmVmXG4gICAqIEBwYXJhbSAge29ian0gYXR0clxuICAgKi9cbiAgdXBkYXRlQXR0cnM6IGZ1bmN0aW9uIChyZWYsIGF0dHIpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgICByZXR1cm4gY29tcG9uZW50TWFuYWdlci51cGRhdGVBdHRycyhyZWYsIGF0dHIpXG4gIH0sXG5cbiAgLyoqXG4gICAqIHVwZGF0ZVN0eWxlOiB1ZHBhdGUgc3R5bGUgb2YgY29tcG9uZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZcbiAgICogQHBhcmFtIHtvYmp9IHN0eWxlXG4gICAqL1xuICB1cGRhdGVTdHlsZTogZnVuY3Rpb24gKHJlZiwgc3R5bGUpIHtcbiAgICBjb25zdCBjb21wb25lbnRNYW5hZ2VyID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKClcbiAgICByZXR1cm4gY29tcG9uZW50TWFuYWdlci51cGRhdGVTdHlsZShyZWYsIHN0eWxlKVxuICB9LFxuXG4gIC8qKlxuICAgKiBzY3JvbGxUb0VsZW1lbnRcbiAgICogQHBhcmFtICB7c3RyaW5nfSByZWZcbiAgICogQHBhcmFtICB7b2JqfSBvcHRpb25zIHtvZmZzZXQ6TnVtYmVyfVxuICAgKiAgIHBzOiBzY3JvbGwtdG8gaGFzICdlYXNlJyBhbmQgJ2R1cmF0aW9uJyhtcykgYXMgb3B0aW9ucy5cbiAgICovXG4gIHNjcm9sbFRvRWxlbWVudDogZnVuY3Rpb24gKHJlZiwgb3B0aW9ucykge1xuICAgICFvcHRpb25zICYmIChvcHRpb25zID0ge30pXG4gICAgY29uc3Qgb2Zmc2V0ID0gTnVtYmVyKG9wdGlvbnMub2Zmc2V0KSB8fCAwXG4gICAgY29uc3QgZWxlbSA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmdldENvbXBvbmVudChyZWYpXG4gICAgaWYgKCFlbGVtKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihgW2g1LXJlbmRlcl0gY29tcG9uZW50IG9mIHJlZiAke3JlZn0gZG9lc24ndCBleGlzdC5gKVxuICAgIH1cbiAgICBjb25zdCBwYXJlbnRTY3JvbGxlciA9IGVsZW0uZ2V0UGFyZW50U2Nyb2xsZXIoKVxuICAgIGlmIChwYXJlbnRTY3JvbGxlcikge1xuICAgICAgcGFyZW50U2Nyb2xsZXIuc2Nyb2xsZXIuc2Nyb2xsVG9FbGVtZW50KGVsZW0ubm9kZSwgdHJ1ZSwgb2Zmc2V0KVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IG9mZnNldFRvcCA9IGVsZW0ubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICAgICAgICArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wXG4gICAgICBjb25zdCB0d2VlbiA9IHNjcm9sbCgwLCBvZmZzZXRUb3AgKyBvZmZzZXQsIG9wdGlvbnMpXG4gICAgICB0d2Vlbi5vbignZW5kJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnc2Nyb2xsIGVuZC4nKVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIGdldENvbXBvbmVudFJlY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBnZXRDb21wb25lbnRSZWN0OiBmdW5jdGlvbiAocmVmLCBjYWxsYmFja0lkKSB7XG4gICAgY29uc3QgaW5mbyA9IHsgcmVzdWx0OiBmYWxzZSB9XG5cbiAgICBpZiAocmVmICYmIHJlZiA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgaW5mby5yZXN1bHQgPSB0cnVlXG4gICAgICBpbmZvLnNpemUgPSB7XG4gICAgICAgIHdpZHRoOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgICAgIGhlaWdodDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICByaWdodDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgICBib3R0b206IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBlbGVtID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKCkuZ2V0Q29tcG9uZW50KHJlZilcbiAgICAgIGlmIChlbGVtICYmIGVsZW0ubm9kZSkge1xuICAgICAgICBpbmZvLnJlc3VsdCA9IHRydWVcbiAgICAgICAgaW5mby5zaXplID0gZWxlbS5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGluZm8ucmVzdWx0ID8gaW5mbyA6IHtcbiAgICAgIHJlc3VsdDogZmFsc2UsXG4gICAgICBlcnJNc2c6ICdJbGxlZ2FsIHBhcmFtZXRlcidcbiAgICB9XG4gICAgdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIG1lc3NhZ2UpXG4gICAgcmV0dXJuIG1lc3NhZ2VcbiAgfSxcblxuICAvKipcbiAgICogZm9yIGFkZGluZyBmb250RmFjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IGZvbnRGYWNlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXMgcnVsZXNcbiAgICovXG4gIGFkZFJ1bGU6IGZ1bmN0aW9uIChrZXksIHN0eWxlcykge1xuICAgIGtleSA9IGNhbWVsVG9LZWJhYihrZXkpXG4gICAgbGV0IHN0eWxlc1RleHQgPSAnJ1xuICAgIGZvciAoY29uc3QgayBpbiBzdHlsZXMpIHtcbiAgICAgIGlmIChzdHlsZXMuaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgc3R5bGVzVGV4dCArPSBjYW1lbFRvS2ViYWIoaykgKyAnOicgKyBzdHlsZXNba10gKyAnOydcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc3R5bGVUZXh0ID0gYEAke2tleX17JHtzdHlsZXNUZXh0fX1gXG4gICAgYXBwZW5kU3R5bGUoc3R5bGVUZXh0LCAnZG9tLWFkZGVkLXJ1bGVzJylcbiAgfSxcblxuICBjcmVhdGVGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmNyZWF0ZUZpbmlzaCgpXG4gIH0sXG5cbiAgdXBkYXRlRmluaXNoIChjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKS51cGRhdGVGaW5pc2goKVxuICB9LFxuXG4gIHJlZnJlc2hGaW5pc2ggKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLnJlZnJlc2hGaW5pc2goKVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIGRvbTogW3tcbiAgICBuYW1lOiAnY3JlYXRlQm9keScsXG4gICAgYXJnczogWydvYmplY3QnXVxuICB9LCB7XG4gICAgbmFtZTogJ2FkZEVsZW1lbnQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ29iamVjdCcsICdudW1iZXInXVxuICB9LCB7XG4gICAgbmFtZTogJ3JlbW92ZUVsZW1lbnQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfSwge1xuICAgIG5hbWU6ICdtb3ZlRWxlbWVudCcsXG4gICAgYXJnczogWydzdHJpbmcnLCAnc3RyaW5nJywgJ251bWJlciddXG4gIH0sIHtcbiAgICBuYW1lOiAnYWRkRXZlbnQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ3N0cmluZyddXG4gIH0sIHtcbiAgICBuYW1lOiAncmVtb3ZlRXZlbnQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ3N0cmluZyddXG4gIH0sIHtcbiAgICBuYW1lOiAndXBkYXRlQXR0cnMnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ29iamVjdCddXG4gIH0sIHtcbiAgICBuYW1lOiAndXBkYXRlU3R5bGUnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ29iamVjdCddXG4gIH0sIHtcbiAgICBuYW1lOiAnY3JlYXRlRmluaXNoJyxcbiAgICBhcmdzOiBbXVxuICB9LCB7XG4gICAgbmFtZTogJ3VwZGF0ZUZpbmlzaCcsXG4gICAgYXJnczogW11cbiAgfSwge1xuICAgIG5hbWU6ICdyZWZyZXNoRmluaXNoJyxcbiAgICBhcmdzOiBbXVxuICB9LCB7XG4gICAgbmFtZTogJ3Njcm9sbFRvRWxlbWVudCcsXG4gICAgYXJnczogWydzdHJpbmcnLCAnb2JqZWN0J11cbiAgfSwge1xuICAgIG5hbWU6ICdnZXRDb21wb25lbnRSZWN0JyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnYWRkUnVsZScsXG4gICAgYXJnczogWydzdHJpbmcnLCAnb2JqZWN0J11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIGNhbWVsVG9LZWJhYiA9IFdlZXgudXRpbHMuY2FtZWxUb0tlYmFiXG4gICAgYXBwZW5kU3R5bGUgPSBXZWV4LnV0aWxzLmFwcGVuZFN0eWxlXG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnZG9tJywgZG9tLCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBldmVudCA9IHtcbiAgLyoqXG4gICAqIG9wZW5VcmxcbiAgICogQHBhcmFtICB7c3RyaW5nfSB1cmxcbiAgICovXG4gIG9wZW5VUkw6IGZ1bmN0aW9uICh1cmwpIHtcbiAgICBsb2NhdGlvbi5ocmVmID0gdXJsXG4gIH1cblxufVxuXG5jb25zdCBtZXRhID0ge1xuICBldmVudDogW3tcbiAgICBuYW1lOiAnb3BlblVSTCcsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnZXZlbnQnLCBldmVudCwgbWV0YSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuY29uc3Qgc3VwcG9ydEdlb2xvY2F0aW9uID0gJ2dlb2xvY2F0aW9uJyBpbiBuYXZpZ2F0b3JcbmNvbnN0IGVycm9yTXNnID0gYFtoNS1yZW5kZXJdOiBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBnZW9sb2NhdGlvbi5gXG5cbmNvbnN0IGdlb2xvY2F0aW9uID0ge1xuICAvLyBvcHRpb25zOlxuICAvLyAgIC0gZW5hYmxlSGlnaEFjY3VyYWN5IG9wdGlvbmFsLCB2YWx1ZSBpcyB0cnVlIG9yIGZhbHNlLCBmYWxzZSBieSBkZWZhdWx0LlxuICAvLyAgIC0gdGltZW91dCBbbm9uZS1uYXRpdmVdIG9wdGlvbmFsLCB2YWx1ZSBpcyBhIG51bWJlciAobWlsbGlzZWNvbmRzKSwgZGVmYXVsdCB2YXVsZSBpcyBGSU5GSU5JVFkuXG4gIC8vICAgLSBtYXhpbXVtQWdlIFtub25lLW5hdGl2ZV0gb3B0aW9uYWwsIHZhbHVlIGlzIGEgbnVtYmVyIChtaWxsaXNlY29uZHMpLCBkZWZhdWx0IHZhbHVlIGlzIDAuXG4gIGdldEN1cnJlbnRQb3NpdGlvbiAoc3VjY2Vzc0NiSWQsIGVycm9yQ2JJZCwgb3B0aW9ucykge1xuICAgIGNvbnN0IHN1Y2Nlc3NDYiA9IHBvcyA9PiB0aGlzLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soc3VjY2Vzc0NiSWQsIHBvcylcbiAgICBjb25zdCBlcnJvckNiID0gZXJyID0+IHRoaXMuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhlcnJvckNiSWQsIGVycilcbiAgICBpZiAoc3VwcG9ydEdlb2xvY2F0aW9uKSB7XG4gICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKHN1Y2Nlc3NDYiwgZXJyb3JDYiwgb3B0aW9ucylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oZXJyb3JNc2cpXG4gICAgICBlcnJvckNiKG5ldyBFcnJvcihlcnJvck1zZykpXG4gICAgfVxuICB9LFxuXG4gIC8vIG9wdGlvbnM6IHRoZSBzYW1lIHdpdGggYGdldEN1cnJlbnRQb3NpdGlvbmAuXG4gIHdhdGNoUG9zaXRpb24gKHN1Y2Nlc3NDYklkLCBlcnJvckNiSWQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBzdWNjZXNzQ2IgPSBwb3MgPT4gdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKHN1Y2Nlc3NDYklkLCBwb3MsIHRydWUpXG4gICAgY29uc3QgZXJyb3JDYiA9IGVyciA9PiB0aGlzLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soZXJyb3JDYklkLCBlcnIpXG4gICAgaWYgKHN1cHBvcnRHZW9sb2NhdGlvbikge1xuICAgICAgY29uc3QgaWQgPSBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24ud2F0Y2hQb3NpdGlvbihwb3MgPT4ge1xuICAgICAgICBwb3Mud2F0Y2hJZCA9IGlkXG4gICAgICAgIHN1Y2Nlc3NDYihwb3MpXG4gICAgICB9LCBlcnJvckNiLCBvcHRpb25zKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnJvck1zZylcbiAgICAgIGVycm9yQ2IobmV3IEVycm9yKGVycm9yTXNnKSlcbiAgICB9XG4gIH0sXG5cbiAgY2xlYXJXYXRjaCAod2F0Y2hJZCkge1xuICAgIGlmIChzdXBwb3J0R2VvbG9jYXRpb24pIHtcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKHdhdGNoSWQpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGVycm9yTXNnKVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBtZXRhID0ge1xuICBnZW9sb2NhdGlvbjogW3tcbiAgICBuYW1lOiAnZ2V0Q3VycmVudFBvc2l0aW9uJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJywgJ2Z1bmN0aW9uJywgJ29iamVjdCddXG4gIH0sIHtcbiAgICBuYW1lOiAnd2F0Y2hQb3NpdGlvbicsXG4gICAgYXJnczogWydmdW5jdGlvbicsICdmdW5jdGlvbicsICdvYmplY3QnXVxuICB9LCB7XG4gICAgbmFtZTogJ2NsZWFyV2F0Y2gnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0IChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnZ2VvbG9jYXRpb24nLCBnZW9sb2NhdGlvbiwgbWV0YSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuLy8gdHJhY2sgdmFyaWVzIGtpbmRzIG9mIGV2ZW50cyBhbmQgbGlzdGVuZXJzLlxuY29uc3QgaGFuZGxlclRyYWtlciA9IHt9XG5cbmNvbnN0IGdsb2JhbEV2ZW50ID0ge1xuXG4gIC8qKlxuICAgKiBhZGRFdmVudExpc3RlbmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldnQgLSB0aGUgZXZlbnQgbmFtZSB0byBhZGQgYSBsaXN0ZW5lciBvbi5cbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIgKGV2dCwgY2FsbGJhY2tJZCkge1xuICAgIGNvbnN0IGNiID0gZSA9PiB0aGlzLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwgZSwgdHJ1ZSlcbiAgICBpZiAoIWhhbmRsZXJUcmFrZXJbZXZ0XSkge1xuICAgICAgaGFuZGxlclRyYWtlcltldnRdID0gW2NiXVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGhhbmRsZXJUcmFrZXJbZXZ0XS5wdXNoKGNiKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGV2dCwgY2IpXG4gIH0sXG5cbiAgLyoqXG4gICAqIHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2dCAtIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSBhIGxpc3RlbmVyIGZyb20uXG4gICAqL1xuICByZW1vdmVFdmVudExpc3RlbmVyIChldnQpIHtcbiAgICBoYW5kbGVyVHJha2VyW2V2dF0uZm9yRWFjaChjYiA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2dCwgY2IpKVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIGdsb2JhbEV2ZW50OiBbe1xuICAgIG5hbWU6ICdhZGRFdmVudExpc3RlbmVyJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQgKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdnbG9iYWxFdmVudCcsIGdsb2JhbEV2ZW50LCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBtZXRhTW9kdWxlID0ge1xuXG4gIC8qKlxuICAgKiBzZXRWaWV3cG9ydFxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gICAqICAgICAgICAtIHdpZHRoOiBudW1iZXIgfCAnZGV2aWNlLXdpZHRoJ1xuICAgKi9cbiAgc2V0Vmlld3BvcnQ6IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9dmlld3BvcnRdJykuc2V0QXR0cmlidXRlKCdjb250ZW50JywgYHdpZHRoPSR7Y29uZmlnLndpZHRofSwgdXNlci1zY2FsYWJsZT1ub2ApXG4gIH1cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgbWV0YTogW3tcbiAgICBuYW1lOiAnc2V0Vmlld3BvcnQnLFxuICAgIGFyZ3M6IFsnb2JqZWN0J11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ21ldGEnLCBtZXRhTW9kdWxlLCBtZXRhKVxuICB9XG59XG4iLCIndXNlIHN0cmljdCdcblxucmVxdWlyZSgnLi4vc3R5bGVzL21vZGFsLmNzcycpXG5cbi8vIHRoZXJlIHdpbGwgYmUgb25seSBvbmUgaW5zdGFuY2Ugb2YgbW9kYWwuXG52YXIgTU9EQUxfV1JBUF9DTEFTUyA9ICdhbWZlLW1vZGFsLXdyYXAnXG52YXIgTU9EQUxfTk9ERV9DTEFTUyA9ICdhbWZlLW1vZGFsLW5vZGUnXG5cbmZ1bmN0aW9uIE1vZGFsKCkge1xuICB0aGlzLndyYXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKE1PREFMX1dSQVBfQ0xBU1MpXG4gIHRoaXMubm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoTU9EQUxfTk9ERV9DTEFTUylcbiAgaWYgKCF0aGlzLndyYXApIHtcbiAgICB0aGlzLmNyZWF0ZVdyYXAoKVxuICB9XG4gIGlmICghdGhpcy5ub2RlKSB7XG4gICAgdGhpcy5jcmVhdGVOb2RlKClcbiAgfVxuICB0aGlzLmNsZWFyTm9kZSgpXG4gIHRoaXMuY3JlYXRlTm9kZUNvbnRlbnQoKVxuICB0aGlzLmJpbmRFdmVudHMoKVxufVxuXG5Nb2RhbC5wcm90b3R5cGUgPSB7XG5cbiAgc2hvdzogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMud3JhcC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuICAgIHRoaXMubm9kZS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlJylcbiAgfSxcblxuICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLndyYXApXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0aGlzLm5vZGUpXG4gICAgdGhpcy53cmFwID0gbnVsbFxuICAgIHRoaXMubm9kZSA9IG51bGxcbiAgfSxcblxuICBjcmVhdGVXcmFwOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy53cmFwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0aGlzLndyYXAuY2xhc3NOYW1lID0gTU9EQUxfV1JBUF9DTEFTU1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy53cmFwKVxuICB9LFxuXG4gIGNyZWF0ZU5vZGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKE1PREFMX05PREVfQ0xBU1MsICdoaWRlJylcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMubm9kZSlcbiAgfSxcblxuICBjbGVhck5vZGU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm5vZGUuaW5uZXJIVE1MID0gJydcbiAgfSxcblxuICBjcmVhdGVOb2RlQ29udGVudDogZnVuY3Rpb24gKCkge1xuXG4gICAgLy8gZG8gbm90aGluZy5cbiAgICAvLyBjaGlsZCBjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC5cbiAgfSxcblxuICBiaW5kRXZlbnRzOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy53cmFwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIH0pXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBNb2RhbFxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBNb2RhbCA9IHJlcXVpcmUoJy4vbW9kYWwnKVxucmVxdWlyZSgnLi4vc3R5bGVzL2FsZXJ0LmNzcycpXG5cbnZhciBDT05URU5UX0NMQVNTID0gJ2NvbnRlbnQnXG52YXIgTVNHX0NMQVNTID0gJ2NvbnRlbnQtbXNnJ1xudmFyIEJVVFRPTl9HUk9VUF9DTEFTUyA9ICdidG4tZ3JvdXAnXG52YXIgQlVUVE9OX0NMQVNTID0gJ2J0bidcblxuZnVuY3Rpb24gQWxlcnQoY29uZmlnKSB7XG4gIHRoaXMubXNnID0gY29uZmlnLm1lc3NhZ2UgfHwgJydcbiAgdGhpcy5jYWxsYmFjayA9IGNvbmZpZy5jYWxsYmFja1xuICB0aGlzLm9rVGl0bGUgPSBjb25maWcub2tUaXRsZSB8fCAnT0snXG4gIE1vZGFsLmNhbGwodGhpcylcbiAgdGhpcy5ub2RlLmNsYXNzTGlzdC5hZGQoJ2FtZmUtYWxlcnQnKVxufVxuXG5BbGVydC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE1vZGFsLnByb3RvdHlwZSlcblxuQWxlcnQucHJvdG90eXBlLmNyZWF0ZU5vZGVDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGNvbnRlbnQuY2xhc3NMaXN0LmFkZChDT05URU5UX0NMQVNTKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoY29udGVudClcblxuICB2YXIgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgbXNnLmNsYXNzTGlzdC5hZGQoTVNHX0NMQVNTKVxuICBtc2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5tc2cpKVxuICBjb250ZW50LmFwcGVuZENoaWxkKG1zZylcblxuICB2YXIgYnV0dG9uR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBidXR0b25Hcm91cC5jbGFzc0xpc3QuYWRkKEJVVFRPTl9HUk9VUF9DTEFTUylcbiAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGJ1dHRvbkdyb3VwKVxuICB2YXIgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnV0dG9uLmNsYXNzTGlzdC5hZGQoQlVUVE9OX0NMQVNTLCAnYWxlcnQtb2snKVxuICBidXR0b24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5va1RpdGxlKSlcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnV0dG9uKVxufVxuXG5BbGVydC5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgTW9kYWwucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzKVxuICB2YXIgYnV0dG9uID0gdGhpcy5ub2RlLnF1ZXJ5U2VsZWN0b3IoJy4nICsgQlVUVE9OX0NMQVNTKVxuICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kZXN0cm95KClcbiAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2soKVxuICB9LmJpbmQodGhpcykpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWxlcnRcbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgTW9kYWwgPSByZXF1aXJlKCcuL21vZGFsJylcbnJlcXVpcmUoJy4uL3N0eWxlcy9jb25maXJtLmNzcycpXG5cbnZhciBDT05URU5UX0NMQVNTID0gJ2NvbnRlbnQnXG52YXIgTVNHX0NMQVNTID0gJ2NvbnRlbnQtbXNnJ1xudmFyIEJVVFRPTl9HUk9VUF9DTEFTUyA9ICdidG4tZ3JvdXAnXG52YXIgQlVUVE9OX0NMQVNTID0gJ2J0bidcblxuZnVuY3Rpb24gQ29uZmlybShjb25maWcpIHtcbiAgdGhpcy5tc2cgPSBjb25maWcubWVzc2FnZSB8fCAnJ1xuICB0aGlzLmNhbGxiYWNrID0gY29uZmlnLmNhbGxiYWNrXG4gIHRoaXMub2tUaXRsZSA9IGNvbmZpZy5va1RpdGxlIHx8ICdPSydcbiAgdGhpcy5jYW5jZWxUaXRsZSA9IGNvbmZpZy5jYW5jZWxUaXRsZSB8fCAnQ2FuY2VsJ1xuICBNb2RhbC5jYWxsKHRoaXMpXG4gIHRoaXMubm9kZS5jbGFzc0xpc3QuYWRkKCdhbWZlLWNvbmZpcm0nKVxufVxuXG5Db25maXJtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9kYWwucHJvdG90eXBlKVxuXG5Db25maXJtLnByb3RvdHlwZS5jcmVhdGVOb2RlQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBjb250ZW50LmNsYXNzTGlzdC5hZGQoQ09OVEVOVF9DTEFTUylcbiAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGNvbnRlbnQpXG5cbiAgdmFyIG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIG1zZy5jbGFzc0xpc3QuYWRkKE1TR19DTEFTUylcbiAgbXNnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMubXNnKSlcbiAgY29udGVudC5hcHBlbmRDaGlsZChtc2cpXG5cbiAgdmFyIGJ1dHRvbkdyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnV0dG9uR3JvdXAuY2xhc3NMaXN0LmFkZChCVVRUT05fR1JPVVBfQ0xBU1MpXG4gIHRoaXMubm9kZS5hcHBlbmRDaGlsZChidXR0b25Hcm91cClcbiAgdmFyIGJ0bk9rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnRuT2suYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5va1RpdGxlKSlcbiAgYnRuT2suY2xhc3NMaXN0LmFkZCgnYnRuLW9rJywgQlVUVE9OX0NMQVNTKVxuICB2YXIgYnRuQ2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgYnRuQ2FuY2VsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRoaXMuY2FuY2VsVGl0bGUpKVxuICBidG5DYW5jZWwuY2xhc3NMaXN0LmFkZCgnYnRuLWNhbmNlbCcsIEJVVFRPTl9DTEFTUylcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnRuT2spXG4gIGJ1dHRvbkdyb3VwLmFwcGVuZENoaWxkKGJ0bkNhbmNlbClcbiAgdGhpcy5ub2RlLmFwcGVuZENoaWxkKGJ1dHRvbkdyb3VwKVxufVxuXG5Db25maXJtLnByb3RvdHlwZS5iaW5kRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICBNb2RhbC5wcm90b3R5cGUuYmluZEV2ZW50cy5jYWxsKHRoaXMpXG4gIHZhciBidG5PayA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yKCcuJyArIEJVVFRPTl9DTEFTUyArICcuYnRuLW9rJylcbiAgdmFyIGJ0bkNhbmNlbCA9IHRoaXMubm9kZS5xdWVyeVNlbGVjdG9yKCcuJyArIEJVVFRPTl9DTEFTUyArICcuYnRuLWNhbmNlbCcpXG4gIGJ0bk9rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGVzdHJveSgpXG4gICAgdGhpcy5jYWxsYmFjayAmJiB0aGlzLmNhbGxiYWNrKHRoaXMub2tUaXRsZSlcbiAgfS5iaW5kKHRoaXMpKVxuICBidG5DYW5jZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kZXN0cm95KClcbiAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2sodGhpcy5jYW5jZWxUaXRsZSlcbiAgfS5iaW5kKHRoaXMpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbmZpcm1cbiIsIid1c2Ugc3RyaWN0J1xuXG52YXIgTW9kYWwgPSByZXF1aXJlKCcuL21vZGFsJylcbnJlcXVpcmUoJy4uL3N0eWxlcy9wcm9tcHQuY3NzJylcblxudmFyIENPTlRFTlRfQ0xBU1MgPSAnY29udGVudCdcbnZhciBNU0dfQ0xBU1MgPSAnY29udGVudC1tc2cnXG52YXIgQlVUVE9OX0dST1VQX0NMQVNTID0gJ2J0bi1ncm91cCdcbnZhciBCVVRUT05fQ0xBU1MgPSAnYnRuJ1xudmFyIElOUFVUX1dSQVBfQ0xBU1MgPSAnaW5wdXQtd3JhcCdcbnZhciBJTlBVVF9DTEFTUyA9ICdpbnB1dCdcblxuZnVuY3Rpb24gUHJvbXB0KGNvbmZpZykge1xuICB0aGlzLm1zZyA9IGNvbmZpZy5tZXNzYWdlIHx8ICcnXG4gIHRoaXMuZGVmYXVsdE1zZyA9IGNvbmZpZy5kZWZhdWx0IHx8ICcnXG4gIHRoaXMuY2FsbGJhY2sgPSBjb25maWcuY2FsbGJhY2tcbiAgdGhpcy5va1RpdGxlID0gY29uZmlnLm9rVGl0bGUgfHwgJ09LJ1xuICB0aGlzLmNhbmNlbFRpdGxlID0gY29uZmlnLmNhbmNlbFRpdGxlIHx8ICdDYW5jZWwnXG4gIE1vZGFsLmNhbGwodGhpcylcbiAgdGhpcy5ub2RlLmNsYXNzTGlzdC5hZGQoJ2FtZmUtcHJvbXB0Jylcbn1cblxuUHJvbXB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9kYWwucHJvdG90eXBlKVxuXG5Qcm9tcHQucHJvdG90eXBlLmNyZWF0ZU5vZGVDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuXG4gIHZhciBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgY29udGVudC5jbGFzc0xpc3QuYWRkKENPTlRFTlRfQ0xBU1MpXG4gIHRoaXMubm9kZS5hcHBlbmRDaGlsZChjb250ZW50KVxuXG4gIHZhciBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBtc2cuY2xhc3NMaXN0LmFkZChNU0dfQ0xBU1MpXG4gIG1zZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm1zZykpXG4gIGNvbnRlbnQuYXBwZW5kQ2hpbGQobXNnKVxuXG4gIHZhciBpbnB1dFdyYXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBpbnB1dFdyYXAuY2xhc3NMaXN0LmFkZChJTlBVVF9XUkFQX0NMQVNTKVxuICBjb250ZW50LmFwcGVuZENoaWxkKGlucHV0V3JhcClcbiAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuICBpbnB1dC5jbGFzc0xpc3QuYWRkKElOUFVUX0NMQVNTKVxuICBpbnB1dC50eXBlID0gJ3RleHQnXG4gIGlucHV0LmF1dG9mb2N1cyA9IHRydWVcbiAgaW5wdXQucGxhY2Vob2xkZXIgPSB0aGlzLmRlZmF1bHRNc2dcbiAgaW5wdXRXcmFwLmFwcGVuZENoaWxkKGlucHV0KVxuXG4gIHZhciBidXR0b25Hcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGJ1dHRvbkdyb3VwLmNsYXNzTGlzdC5hZGQoQlVUVE9OX0dST1VQX0NMQVNTKVxuICB2YXIgYnRuT2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBidG5Pay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLm9rVGl0bGUpKVxuICBidG5Pay5jbGFzc0xpc3QuYWRkKCdidG4tb2snLCBCVVRUT05fQ0xBU1MpXG4gIHZhciBidG5DYW5jZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBidG5DYW5jZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jYW5jZWxUaXRsZSkpXG4gIGJ0bkNhbmNlbC5jbGFzc0xpc3QuYWRkKCdidG4tY2FuY2VsJywgQlVUVE9OX0NMQVNTKVxuICBidXR0b25Hcm91cC5hcHBlbmRDaGlsZChidG5PaylcbiAgYnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQoYnRuQ2FuY2VsKVxuICB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoYnV0dG9uR3JvdXApXG59XG5cblByb21wdC5wcm90b3R5cGUuYmluZEV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcbiAgTW9kYWwucHJvdG90eXBlLmJpbmRFdmVudHMuY2FsbCh0aGlzKVxuICB2YXIgYnRuT2sgPSB0aGlzLm5vZGUucXVlcnlTZWxlY3RvcignLicgKyBCVVRUT05fQ0xBU1MgKyAnLmJ0bi1vaycpXG4gIHZhciBidG5DYW5jZWwgPSB0aGlzLm5vZGUucXVlcnlTZWxlY3RvcignLicgKyBCVVRUT05fQ0xBU1MgKyAnLmJ0bi1jYW5jZWwnKVxuICB2YXIgdGhhdCA9IHRoaXNcbiAgYnRuT2suYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykudmFsdWVcbiAgICB0aGlzLmRlc3Ryb3koKVxuICAgIHRoaXMuY2FsbGJhY2sgJiYgdGhpcy5jYWxsYmFjayh7XG4gICAgICByZXN1bHQ6IHRoYXQub2tUaXRsZSxcbiAgICAgIGRhdGE6IHZhbFxuICAgIH0pXG4gIH0uYmluZCh0aGlzKSlcbiAgYnRuQ2FuY2VsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLnZhbHVlXG4gICAgdGhpcy5kZXN0cm95KClcbiAgICB0aGlzLmNhbGxiYWNrICYmIHRoaXMuY2FsbGJhY2soe1xuICAgICAgcmVzdWx0OiB0aGF0LmNhbmNlbFRpdGxlLFxuICAgICAgZGF0YTogdmFsXG4gICAgfSlcbiAgfS5iaW5kKHRoaXMpKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFByb21wdFxuIiwiJ3VzZSBzdHJpY3QnXG5cbnJlcXVpcmUoJy4uL3N0eWxlcy90b2FzdC5jc3MnKVxuXG52YXIgcXVldWUgPSBbXVxudmFyIHRpbWVyXG52YXIgaXNQcm9jZXNzaW5nID0gZmFsc2VcbnZhciB0b2FzdFdpblxudmFyIFRPQVNUX1dJTl9DTEFTU19OQU1FID0gJ2FtZmUtdG9hc3QnXG5cbnZhciBERUZBVUxUX0RVUkFUSU9OID0gMC44XG5cbmZ1bmN0aW9uIHNob3dUb2FzdFdpbmRvdyhtc2csIGNhbGxiYWNrKSB7XG4gIHZhciBoYW5kbGVUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24gKCkge1xuICAgIHRvYXN0V2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBoYW5kbGVUcmFuc2l0aW9uRW5kKVxuICAgIHRvYXN0V2luLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCBoYW5kbGVUcmFuc2l0aW9uRW5kKVxuICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgfVxuICBpZiAoIXRvYXN0V2luKSB7XG4gICAgdG9hc3RXaW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgIHRvYXN0V2luLmNsYXNzTGlzdC5hZGQoVE9BU1RfV0lOX0NMQVNTX05BTUUsICdoaWRlJylcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvYXN0V2luKVxuICB9XG4gIHRvYXN0V2luLnRleHRDb250ZW50ID0gbXNnXG4gIHRvYXN0V2luLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBoYW5kbGVUcmFuc2l0aW9uRW5kKVxuICB0b2FzdFdpbi5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgaGFuZGxlVHJhbnNpdGlvbkVuZClcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdG9hc3RXaW4uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpXG4gIH0sIDApXG59XG5cbmZ1bmN0aW9uIGhpZGVUb2FzdFdpbmRvdyhjYWxsYmFjaykge1xuICB2YXIgaGFuZGxlVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0b2FzdFdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgaGFuZGxlVHJhbnNpdGlvbkVuZClcbiAgICB0b2FzdFdpbi5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgaGFuZGxlVHJhbnNpdGlvbkVuZClcbiAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXG4gIH1cbiAgaWYgKCF0b2FzdFdpbikge1xuICAgIHJldHVyblxuICB9XG4gIHRvYXN0V2luLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBoYW5kbGVUcmFuc2l0aW9uRW5kKVxuICB0b2FzdFdpbi5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgaGFuZGxlVHJhbnNpdGlvbkVuZClcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdG9hc3RXaW4uY2xhc3NMaXN0LmFkZCgnaGlkZScpXG4gIH0sIDApXG59XG5cbnZhciB0b2FzdCA9IHtcblxuICBwdXNoOiBmdW5jdGlvbiAobXNnLCBkdXJhdGlvbikge1xuICAgIHF1ZXVlLnB1c2goe1xuICAgICAgbXNnOiBtc2csXG4gICAgICBkdXJhdGlvbjogZHVyYXRpb24gfHwgREVGQVVMVF9EVVJBVElPTlxuICAgIH0pXG4gICAgdGhpcy5zaG93KClcbiAgfSxcblxuICBzaG93OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG5cbiAgICAvLyBBbGwgbWVzc2FnZXMgaGFkIGJlZW4gdG9hc3RlZCBhbHJlYWR5LCBzbyByZW1vdmUgdGhlIHRvYXN0IHdpbmRvdyxcbiAgICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgICAgdG9hc3RXaW4gJiYgdG9hc3RXaW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0b2FzdFdpbilcbiAgICAgIHRvYXN0V2luID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdGhlIHByZXZpb3VzIHRvYXN0IGlzIG5vdCBlbmRlZCB5ZXQuXG4gICAgaWYgKGlzUHJvY2Vzc2luZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlzUHJvY2Vzc2luZyA9IHRydWVcblxuICAgIHZhciB0b2FzdEluZm8gPSBxdWV1ZS5zaGlmdCgpXG4gICAgc2hvd1RvYXN0V2luZG93KHRvYXN0SW5mby5tc2csIGZ1bmN0aW9uICgpIHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRpbWVyID0gbnVsbFxuICAgICAgICBoaWRlVG9hc3RXaW5kb3coZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlzUHJvY2Vzc2luZyA9IGZhbHNlXG4gICAgICAgICAgdGhhdC5zaG93KClcbiAgICAgICAgfSlcbiAgICAgIH0sIHRvYXN0SW5mby5kdXJhdGlvbiAqIDEwMDApXG4gICAgfSlcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcHVzaDogdG9hc3QucHVzaC5iaW5kKHRvYXN0KVxufVxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBBbGVydCA9IHJlcXVpcmUoJy4vYWxlcnQnKVxudmFyIENvbmZpcm0gPSByZXF1aXJlKCcuL2NvbmZpcm0nKVxudmFyIFByb21wdCA9IHJlcXVpcmUoJy4vcHJvbXB0JylcbnZhciB0b2FzdCA9IHJlcXVpcmUoJy4vdG9hc3QnKVxuXG52YXIgbW9kYWwgPSB7XG5cbiAgdG9hc3Q6IGZ1bmN0aW9uIChtc2csIGR1cmF0aW9uKSB7XG4gICAgdG9hc3QucHVzaChtc2csIGR1cmF0aW9uKVxuICB9LFxuXG4gIGFsZXJ0OiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgbmV3IEFsZXJ0KGNvbmZpZykuc2hvdygpXG4gIH0sXG5cbiAgcHJvbXB0OiBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgbmV3IFByb21wdChjb25maWcpLnNob3coKVxuICB9LFxuXG4gIGNvbmZpcm06IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICBuZXcgQ29uZmlybShjb25maWcpLnNob3coKVxuICB9XG5cbn1cblxuIXdpbmRvdy5saWIgJiYgKHdpbmRvdy5saWIgPSB7fSlcbndpbmRvdy5saWIubW9kYWwgPSBtb2RhbFxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vZGFsIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IG1vZGFsIGZyb20gJ21vZGFscydcblxuY29uc3QgbXNnID0ge1xuXG4gIC8vIGR1cmF0aW9uOiBkZWZhdWx0IGlzIDAuOCBzZWNvbmRzLlxuICB0b2FzdDogZnVuY3Rpb24gKGNvbmZpZykge1xuICAgIG1vZGFsLnRvYXN0KGNvbmZpZy5tZXNzYWdlLCBjb25maWcuZHVyYXRpb24pXG4gIH0sXG5cbiAgLy8gY29uZmlnOlxuICAvLyAgLSBtZXNzYWdlOiBzdHJpbmdcbiAgLy8gIC0gb2tUaXRsZTogdGl0bGUgb2Ygb2sgYnV0dG9uXG4gIC8vICAtIGNhbGxiYWNrXG4gIGFsZXJ0OiBmdW5jdGlvbiAoY29uZmlnLCBjYWxsYmFja0lkKSB7XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBjb25maWcuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQpXG4gICAgfVxuICAgIG1vZGFsLmFsZXJ0KGNvbmZpZylcbiAgfSxcblxuICAvLyBjb25maWc6XG4gIC8vICAtIG1lc3NhZ2U6IHN0cmluZ1xuICAvLyAgLSBva1RpdGxlOiB0aXRsZSBvZiBvayBidXR0b25cbiAgLy8gIC0gY2FuY2VsVGl0bGU6IHRpdGxlIG9mIGNhbmNlbCBidXR0b25cbiAgLy8gIC0gY2FsbGJhY2tcbiAgY29uZmlybTogZnVuY3Rpb24gKGNvbmZpZywgY2FsbGJhY2tJZCkge1xuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG4gICAgY29uZmlnLmNhbGxiYWNrID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB2YWwpXG4gICAgfVxuICAgIG1vZGFsLmNvbmZpcm0oY29uZmlnKVxuICB9LFxuXG4gIC8vIGNvbmZpZzpcbiAgLy8gIC0gbWVzc2FnZTogc3RyaW5nXG4gIC8vICAtIG9rVGl0bGU6IHRpdGxlIG9mIG9rIGJ1dHRvblxuICAvLyAgLSBjYW5jZWxUaXRsZTogdGl0bGUgb2YgY2FuY2VsIGJ1dHRvblxuICAvLyAgLSBjYWxsYmFja1xuICBwcm9tcHQ6IGZ1bmN0aW9uIChjb25maWcsIGNhbGxiYWNrSWQpIHtcbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGNvbmZpZy5jYWxsYmFjayA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwgdmFsKVxuICAgIH1cbiAgICBtb2RhbC5wcm9tcHQoY29uZmlnKVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIG1vZGFsOiBbe1xuICAgIG5hbWU6ICd0b2FzdCcsXG4gICAgYXJnczogWydvYmplY3QnXVxuICB9LCB7XG4gICAgbmFtZTogJ2FsZXJ0JyxcbiAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnY29uZmlybScsXG4gICAgYXJnczogWydvYmplY3QnLCAnZnVuY3Rpb24nXVxuICB9LCB7XG4gICAgbmFtZTogJ3Byb21wdCcsXG4gICAgYXJnczogWydvYmplY3QnLCAnZnVuY3Rpb24nXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgnbW9kYWwnLCBtc2csIG1ldGEpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IG5hdmlnYXRvciA9IHtcblxuICAvLyBjb25maWdcbiAgLy8gIC0gdXJsOiB0aGUgdXJsIHRvIHB1c2hcbiAgLy8gIC0gYW5pbWF0ZWQ6IHRoaXMgY29uZmlndXJhdGlvbiBpdGVtIGlzIG5hdGl2ZSBvbmx5XG4gIC8vICBjYWxsYmFjayBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZFxuICBwdXNoOiBmdW5jdGlvbiAoY29uZmlnLCBjYWxsYmFja0lkKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBjb25maWcudXJsXG4gICAgdGhpcy5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQpXG4gIH0sXG5cbiAgLy8gY29uZmlnXG4gIC8vICAtIGFuaW1hdGVkOiB0aGlzIGNvbmZpZ3VyYXRpb24gaXRlbSBpcyBuYXRpdmUgb25seVxuICAvLyAgY2FsbGJhY2sgaXMgbm90ZSBjdXJyZW50bHkgc3VwcG9ydGVkXG4gIHBvcDogZnVuY3Rpb24gKGNvbmZpZywgY2FsbGJhY2tJZCkge1xuICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKVxuICAgIHRoaXMuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkKVxuICB9XG5cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgbmF2aWdhdG9yOiBbe1xuICAgIG5hbWU6ICdwdXNoJyxcbiAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAncG9wJyxcbiAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbiddXG4gIH1dXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCduYXZpZ2F0b3InLCBuYXZpZ2F0b3IsIG1ldGEpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHBhZ2VJbmZvID0ge1xuXG4gIHNldFRpdGxlOiBmdW5jdGlvbiAodGl0bGUpIHtcbiAgICB0aXRsZSA9IHRpdGxlIHx8ICdXZWV4IEhUTUw1J1xuICAgIHRyeSB7XG4gICAgICB0aXRsZSA9IGRlY29kZVVSSUNvbXBvbmVudCh0aXRsZSlcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHt9XG4gICAgZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICB9XG59XG5cbmNvbnN0IG1ldGEgPSB7XG4gIHBhZ2VJbmZvOiBbe1xuICAgIG5hbWU6ICdzZXRUaXRsZScsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9XVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGluaXQ6IGZ1bmN0aW9uIChXZWV4KSB7XG4gICAgV2VleC5yZWdpc3RlckFwaU1vZHVsZSgncGFnZUluZm8nLCBwYWdlSW5mbywgbWV0YSlcbiAgfVxufVxuIiwiLypcbiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZVxuICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGVcbiAqIFwiTGljZW5zZVwiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxuICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW5cbiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcbiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnNcbiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKiBnbG9iYWwgbG9jYWxTdG9yYWdlICovXG5cbid1c2Ugc3RyaWN0J1xuXG5jb25zdCBzdXBwb3J0TG9jYWxTdG9yYWdlID0gdHlwZW9mIGxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCdcbmNvbnN0IFNVQ0NFU1MgPSAnc3VjY2VzcydcbmNvbnN0IEZBSUxFRCA9ICdmYWlsZWQnXG5jb25zdCBJTlZBTElEX1BBUkFNID0gJ2ludmFsaWRfcGFyYW0nXG5jb25zdCBVTkRFRklORUQgPSAndW5kZWZpbmVkJ1xuXG5jb25zdCBzdG9yYWdlID0ge1xuXG4gIC8qKlxuICAgKiBXaGVuIHBhc3NlZCBhIGtleSBuYW1lIGFuZCB2YWx1ZSwgd2lsbCBhZGQgdGhhdCBrZXkgdG8gdGhlIHN0b3JhZ2UsXG4gICAqIG9yIHVwZGF0ZSB0aGF0IGtleSdzIHZhbHVlIGlmIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBzZXRJdGVtOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgY2FsbGJhY2tJZCkge1xuICAgIGlmICghc3VwcG9ydExvY2FsU3RvcmFnZSkge1xuICAgICAgY29uc29sZS5lcnJvcigneW91ciBicm93c2VyIGlzIG5vdCBzdXBwb3J0IGxvY2FsU3RvcmFnZSB5ZXQuJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGlmICgha2V5IHx8ICF2YWx1ZSkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgIGRhdGE6IElOVkFMSURfUEFSQU1cbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpXG4gICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHtcbiAgICAgICAgcmVzdWx0OiBTVUNDRVNTLFxuICAgICAgICBkYXRhOiBVTkRFRklORURcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAvLyBhY2NlcHQgYW55IGV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIGEgc3RvcmFnZSBhdHRlbXB0IGFzIGEgcXVvdGEgZXJyb3JcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgICAgICByZXN1bHQ6IEZBSUxFRCxcbiAgICAgICAgZGF0YTogVU5ERUZJTkVEXG4gICAgICB9KVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogV2hlbiBwYXNzZWQgYSBrZXkgbmFtZSwgd2lsbCByZXR1cm4gdGhhdCBrZXkncyB2YWx1ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBnZXRJdGVtOiBmdW5jdGlvbiAoa2V5LCBjYWxsYmFja0lkKSB7XG4gICAgaWYgKCFzdXBwb3J0TG9jYWxTdG9yYWdlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd5b3VyIGJyb3dzZXIgaXMgbm90IHN1cHBvcnQgbG9jYWxTdG9yYWdlIHlldC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHNlbmRlciA9IHRoaXMuc2VuZGVyXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwge1xuICAgICAgICByZXN1bHQ6IEZBSUxFRCxcbiAgICAgICAgZGF0YTogSU5WQUxJRF9QQVJBTVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCB2YWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpXG4gICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICByZXN1bHQ6IHZhbCA/IFNVQ0NFU1MgOiBGQUlMRUQsXG4gICAgICBkYXRhOiB2YWwgfHwgVU5ERUZJTkVEXG4gICAgfSlcbiAgfSxcblxuICAvKipcbiAgICpXaGVuIHBhc3NlZCBhIGtleSBuYW1lLCB3aWxsIHJlbW92ZSB0aGF0IGtleSBmcm9tIHRoZSBzdG9yYWdlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrSWRcbiAgICovXG4gIHJlbW92ZUl0ZW06IGZ1bmN0aW9uIChrZXksIGNhbGxiYWNrSWQpIHtcbiAgICBpZiAoIXN1cHBvcnRMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydCBsb2NhbFN0b3JhZ2UgeWV0LicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBpZiAoIWtleSkge1xuICAgICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICAgIHJlc3VsdDogRkFJTEVELFxuICAgICAgICBkYXRhOiBJTlZBTElEX1BBUkFNXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSlcbiAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrSWQsIHtcbiAgICAgIHJlc3VsdDogU1VDQ0VTUyxcbiAgICAgIGRhdGE6IFVOREVGSU5FRFxuICAgIH0pXG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBkYXRhIGl0ZW1zIHN0b3JlZCBpbiB0aGUgU3RvcmFnZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrSWRcbiAgICovXG4gIGxlbmd0aDogZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHtcbiAgICBpZiAoIXN1cHBvcnRMb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3lvdXIgYnJvd3NlciBpcyBub3Qgc3VwcG9ydCBsb2NhbFN0b3JhZ2UgeWV0LicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy5zZW5kZXJcbiAgICBjb25zdCBsZW4gPSBsb2NhbFN0b3JhZ2UubGVuZ3RoXG4gICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICByZXN1bHQ6IFNVQ0NFU1MsXG4gICAgICBkYXRhOiBsZW5cbiAgICB9KVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IHRoYXQgY29udGFpbnMgYWxsIGtleXMgc3RvcmVkIGluIFN0b3JhZ2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja0lkXG4gICAqL1xuICBnZXRBbGxLZXlzOiBmdW5jdGlvbiAoY2FsbGJhY2tJZCkge1xuICAgIGlmICghc3VwcG9ydExvY2FsU3RvcmFnZSkge1xuICAgICAgY29uc29sZS5lcnJvcigneW91ciBicm93c2VyIGlzIG5vdCBzdXBwb3J0IGxvY2FsU3RvcmFnZSB5ZXQuJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGNvbnN0IF9hcnIgPSBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBfYXJyLnB1c2gobG9jYWxTdG9yYWdlLmtleShpKSlcbiAgICB9XG4gICAgc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFja0lkLCB7XG4gICAgICByZXN1bHQ6IFNVQ0NFU1MsXG4gICAgICBkYXRhOiBfYXJyXG4gICAgfSlcbiAgfVxufVxuXG5jb25zdCBtZXRhID0ge1xuICBzdG9yYWdlOiBbe1xuICAgIG5hbWU6ICdzZXRJdGVtJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdzdHJpbmcnLCAnZnVuY3Rpb24nXVxuICB9LCB7XG4gICAgbmFtZTogJ2dldEl0ZW0nLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdyZW1vdmVJdGVtJyxcbiAgICBhcmdzOiBbJ3N0cmluZycsICdmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnbGVuZ3RoJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdnZXRBbGxLZXlzJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ3N0b3JhZ2UnLCBzdG9yYWdlLCBtZXRhKVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIpIHtcblx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24gKGMpIHtcblx0XHRyZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHR9KTtcbn07XG4iLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cmljdFVyaUVuY29kZSA9IHJlcXVpcmUoJ3N0cmljdC11cmktZW5jb2RlJyk7XG52YXIgb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG5mdW5jdGlvbiBlbmNvZGVyRm9yQXJyYXlGb3JtYXQob3B0cykge1xuXHRzd2l0Y2ggKG9wdHMuYXJyYXlGb3JtYXQpIHtcblx0XHRjYXNlICdpbmRleCc6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUsIGluZGV4KSB7XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IFtcblx0XHRcdFx0XHRlbmNvZGUoa2V5LCBvcHRzKSxcblx0XHRcdFx0XHQnWycsXG5cdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0J10nXG5cdFx0XHRcdF0uam9pbignJykgOiBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0J1snLFxuXHRcdFx0XHRcdGVuY29kZShpbmRleCwgb3B0cyksXG5cdFx0XHRcdFx0J109Jyxcblx0XHRcdFx0XHRlbmNvZGUodmFsdWUsIG9wdHMpXG5cdFx0XHRcdF0uam9pbignJyk7XG5cdFx0XHR9O1xuXG5cdFx0Y2FzZSAnYnJhY2tldCc6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSBudWxsID8gZW5jb2RlKGtleSwgb3B0cykgOiBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0J1tdPScsXG5cdFx0XHRcdFx0ZW5jb2RlKHZhbHVlLCBvcHRzKVxuXHRcdFx0XHRdLmpvaW4oJycpO1xuXHRcdFx0fTtcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSBudWxsID8gZW5jb2RlKGtleSwgb3B0cykgOiBbXG5cdFx0XHRcdFx0ZW5jb2RlKGtleSwgb3B0cyksXG5cdFx0XHRcdFx0Jz0nLFxuXHRcdFx0XHRcdGVuY29kZSh2YWx1ZSwgb3B0cylcblx0XHRcdFx0XS5qb2luKCcnKTtcblx0XHRcdH07XG5cdH1cbn1cblxuZnVuY3Rpb24gcGFyc2VyRm9yQXJyYXlGb3JtYXQob3B0cykge1xuXHR2YXIgcmVzdWx0O1xuXG5cdHN3aXRjaCAob3B0cy5hcnJheUZvcm1hdCkge1xuXHRcdGNhc2UgJ2luZGV4Jzpcblx0XHRcdHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgYWNjdW11bGF0b3IpIHtcblx0XHRcdFx0cmVzdWx0ID0gL1xcWyhcXGQqKVxcXSQvLmV4ZWMoa2V5KTtcblxuXHRcdFx0XHRrZXkgPSBrZXkucmVwbGFjZSgvXFxbXFxkKlxcXSQvLCAnJyk7XG5cblx0XHRcdFx0aWYgKCFyZXN1bHQpIHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gdmFsdWU7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGFjY3VtdWxhdG9yW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjY3VtdWxhdG9yW2tleV1bcmVzdWx0WzFdXSA9IHZhbHVlO1xuXHRcdFx0fTtcblxuXHRcdGNhc2UgJ2JyYWNrZXQnOlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikge1xuXHRcdFx0XHRyZXN1bHQgPSAvKFxcW1xcXSkkLy5leGVjKGtleSk7XG5cdFx0XHRcdGtleSA9IGtleS5yZXBsYWNlKC9cXFtcXF0kLywgJycpO1xuXG5cdFx0XHRcdGlmICghcmVzdWx0KSB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fSBlbHNlIGlmIChhY2N1bXVsYXRvcltrZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gW3ZhbHVlXTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhY2N1bXVsYXRvcltrZXldID0gW10uY29uY2F0KGFjY3VtdWxhdG9yW2tleV0sIHZhbHVlKTtcblx0XHRcdH07XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIChrZXksIHZhbHVlLCBhY2N1bXVsYXRvcikge1xuXHRcdFx0XHRpZiAoYWNjdW11bGF0b3Jba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IHZhbHVlO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSBbXS5jb25jYXQoYWNjdW11bGF0b3Jba2V5XSwgdmFsdWUpO1xuXHRcdFx0fTtcblx0fVxufVxuXG5mdW5jdGlvbiBlbmNvZGUodmFsdWUsIG9wdHMpIHtcblx0aWYgKG9wdHMuZW5jb2RlKSB7XG5cdFx0cmV0dXJuIG9wdHMuc3RyaWN0ID8gc3RyaWN0VXJpRW5jb2RlKHZhbHVlKSA6IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG5cdH1cblxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGtleXNTb3J0ZXIoaW5wdXQpIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG5cdFx0cmV0dXJuIGlucHV0LnNvcnQoKTtcblx0fSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIGtleXNTb3J0ZXIoT2JqZWN0LmtleXMoaW5wdXQpKS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG5cdFx0XHRyZXR1cm4gTnVtYmVyKGEpIC0gTnVtYmVyKGIpO1xuXHRcdH0pLm1hcChmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gaW5wdXRba2V5XTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiBpbnB1dDtcbn1cblxuZXhwb3J0cy5leHRyYWN0ID0gZnVuY3Rpb24gKHN0cikge1xuXHRyZXR1cm4gc3RyLnNwbGl0KCc/JylbMV0gfHwgJyc7XG59O1xuXG5leHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKHN0ciwgb3B0cykge1xuXHRvcHRzID0gb2JqZWN0QXNzaWduKHthcnJheUZvcm1hdDogJ25vbmUnfSwgb3B0cyk7XG5cblx0dmFyIGZvcm1hdHRlciA9IHBhcnNlckZvckFycmF5Rm9ybWF0KG9wdHMpO1xuXG5cdC8vIENyZWF0ZSBhbiBvYmplY3Qgd2l0aCBubyBwcm90b3R5cGVcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9xdWVyeS1zdHJpbmcvaXNzdWVzLzQ3XG5cdHZhciByZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG5cdGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiByZXQ7XG5cdH1cblxuXHRzdHIgPSBzdHIudHJpbSgpLnJlcGxhY2UoL14oXFw/fCN8JikvLCAnJyk7XG5cblx0aWYgKCFzdHIpIHtcblx0XHRyZXR1cm4gcmV0O1xuXHR9XG5cblx0c3RyLnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcblx0XHR2YXIgcGFydHMgPSBwYXJhbS5yZXBsYWNlKC9cXCsvZywgJyAnKS5zcGxpdCgnPScpO1xuXHRcdC8vIEZpcmVmb3ggKHByZSA0MCkgZGVjb2RlcyBgJTNEYCB0byBgPWBcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZy9wdWxsLzM3XG5cdFx0dmFyIGtleSA9IHBhcnRzLnNoaWZ0KCk7XG5cdFx0dmFyIHZhbCA9IHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0cy5qb2luKCc9JykgOiB1bmRlZmluZWQ7XG5cblx0XHQvLyBtaXNzaW5nIGA9YCBzaG91bGQgYmUgYG51bGxgOlxuXHRcdC8vIGh0dHA6Ly93My5vcmcvVFIvMjAxMi9XRC11cmwtMjAxMjA1MjQvI2NvbGxlY3QtdXJsLXBhcmFtZXRlcnNcblx0XHR2YWwgPSB2YWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQodmFsKTtcblxuXHRcdGZvcm1hdHRlcihkZWNvZGVVUklDb21wb25lbnQoa2V5KSwgdmFsLCByZXQpO1xuXHR9KTtcblxuXHRyZXR1cm4gT2JqZWN0LmtleXMocmV0KS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uIChyZXN1bHQsIGtleSkge1xuXHRcdHZhciB2YWwgPSByZXRba2V5XTtcblx0XHRpZiAoQm9vbGVhbih2YWwpICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRcdC8vIFNvcnQgb2JqZWN0IGtleXMsIG5vdCB2YWx1ZXNcblx0XHRcdHJlc3VsdFtrZXldID0ga2V5c1NvcnRlcih2YWwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHRba2V5XSA9IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn07XG5cbmV4cG9ydHMuc3RyaW5naWZ5ID0gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuXHR2YXIgZGVmYXVsdHMgPSB7XG5cdFx0ZW5jb2RlOiB0cnVlLFxuXHRcdHN0cmljdDogdHJ1ZSxcblx0XHRhcnJheUZvcm1hdDogJ25vbmUnXG5cdH07XG5cblx0b3B0cyA9IG9iamVjdEFzc2lnbihkZWZhdWx0cywgb3B0cyk7XG5cblx0dmFyIGZvcm1hdHRlciA9IGVuY29kZXJGb3JBcnJheUZvcm1hdChvcHRzKTtcblxuXHRyZXR1cm4gb2JqID8gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0XHR2YXIgdmFsID0gb2JqW2tleV07XG5cblx0XHRpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0XHRpZiAodmFsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZW5jb2RlKGtleSwgb3B0cyk7XG5cdFx0fVxuXG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuXHRcdFx0dmFyIHJlc3VsdCA9IFtdO1xuXG5cdFx0XHR2YWwuc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uICh2YWwyKSB7XG5cdFx0XHRcdGlmICh2YWwyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQucHVzaChmb3JtYXR0ZXIoa2V5LCB2YWwyLCByZXN1bHQubGVuZ3RoKSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdC5qb2luKCcmJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVuY29kZShrZXksIG9wdHMpICsgJz0nICsgZW5jb2RlKHZhbCwgb3B0cyk7XG5cdH0pLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuXHRcdHJldHVybiB4Lmxlbmd0aCA+IDA7XG5cdH0pLmpvaW4oJyYnKSA6ICcnO1xufTtcbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZ2xvYmFsIGxpYiwgWE1MSHR0cFJlcXVlc3QgKi9cbi8qIGRlcHM6IGh0dHB1cmwgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmxldCB1dGlsc1xuXG5pbXBvcnQgJ2h0dHB1cmwnXG5pbXBvcnQgcXMgZnJvbSAncXVlcnktc3RyaW5nJ1xuXG5sZXQganNvbnBDbnQgPSAwXG5jb25zdCBFUlJPUl9TVEFURSA9IC0xXG5cbmZ1bmN0aW9uIF9qc29ucCAoY29uZmlnLCBjYWxsYmFjaywgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICBjb25zdCBjYk5hbWUgPSAnanNvbnBfJyArICgrK2pzb25wQ250KVxuICBsZXQgdXJsXG5cbiAgaWYgKCFjb25maWcudXJsKSB7XG4gICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gY29uZmlnLnVybCBzaG91bGQgYmUgc2V0IGluIF9qc29ucCBmb3IgXFwnZmV0Y2hcXCcgQVBJLicpXG4gIH1cblxuICBnbG9iYWxbY2JOYW1lXSA9IChmdW5jdGlvbiAoY2IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBjYWxsYmFjayh7XG4gICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgc3RhdHVzVGV4dDogJ09LJyxcbiAgICAgICAgZGF0YTogcmVzcG9uc2VcbiAgICAgIH0pXG4gICAgICBkZWxldGUgZ2xvYmFsW2NiXVxuICAgIH1cbiAgfSkoY2JOYW1lKVxuXG4gIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gIHRyeSB7XG4gICAgdXJsID0gbGliLmh0dHB1cmwoY29uZmlnLnVybClcbiAgfVxuICBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gaW52YWxpZCBjb25maWcudXJsIGluIF9qc29ucCBmb3IgXFwnZmV0Y2hcXCcgQVBJOiAnXG4gICAgICArIGNvbmZpZy51cmwpXG4gIH1cbiAgdXJsLnBhcmFtcy5jYWxsYmFjayA9IGNiTmFtZVxuICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnXG4gIHNjcmlwdC5zcmMgPSB1cmwudG9TdHJpbmcoKVxuICAvLyBzY3JpcHQub25lcnJvciBpcyBub3Qgd29ya2luZyBvbiBJRSBvciBzYWZhcmkuXG4gIC8vIGJ1dCB0aGV5IGFyZSBub3QgY29uc2lkZXJlZCBoZXJlLlxuICBzY3JpcHQub25lcnJvciA9IChmdW5jdGlvbiAoY2IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gdW5leHBlY3RlZCBlcnJvciBpbiBfanNvbnAgZm9yIFxcJ2ZldGNoXFwnIEFQSScsIGVycilcbiAgICAgIGNhbGxiYWNrKHtcbiAgICAgICAgc3RhdHVzOiBFUlJPUl9TVEFURSxcbiAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAgICAgZGF0YTogJydcbiAgICAgIH0pXG4gICAgICBkZWxldGUgZ2xvYmFsW2NiXVxuICAgIH1cbiAgfSkoY2JOYW1lKVxuICBjb25zdCBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXVxuICBoZWFkLmluc2VydEJlZm9yZShzY3JpcHQsIG51bGwpXG59XG5cbmZ1bmN0aW9uIF94aHIgKGNvbmZpZywgY2FsbGJhY2ssIHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgeGhyLnJlc3BvbnNlVHlwZSA9IGNvbmZpZy50eXBlXG4gIHhoci5vcGVuKGNvbmZpZy5tZXRob2QsIGNvbmZpZy51cmwsIHRydWUpXG5cbiAgLy8gY29ycyBjb29raWUgc3VwcG9ydFxuICBpZiAoY29uZmlnLndpdGhDcmVkZW50aWFscyA9PT0gdHJ1ZSkge1xuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge31cbiAgZm9yIChjb25zdCBrIGluIGhlYWRlcnMpIHtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihrLCBoZWFkZXJzW2tdKVxuICB9XG5cbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uIChyZXMpIHtcbiAgICBjYWxsYmFjayh7XG4gICAgICBzdGF0dXM6IHhoci5zdGF0dXMsXG4gICAgICBvazogeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCxcbiAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgZGF0YTogeGhyLnJlc3BvbnNlLFxuICAgICAgaGVhZGVyczogeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLnNwbGl0KCdcXG4nKVxuICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChvYmosIGhlYWRlclN0cikge1xuICAgICAgICAgIGNvbnN0IGhlYWRlckFyciA9IGhlYWRlclN0ci5tYXRjaCgvKC4rKTogKC4rKS8pXG4gICAgICAgICAgaWYgKGhlYWRlckFycikge1xuICAgICAgICAgICAgb2JqW2hlYWRlckFyclsxXV0gPSBoZWFkZXJBcnJbMl1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9ialxuICAgICAgICB9LCB7fSlcbiAgICB9KVxuICB9XG5cbiAgaWYgKHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgICB4aHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBwcm9ncmVzc0NhbGxiYWNrKHtcbiAgICAgICAgcmVhZHlTdGF0ZTogeGhyLnJlYWR5U3RhdGUsXG4gICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgbGVuZ3RoOiBlLmxvYWRlZCxcbiAgICAgICAgdG90YWw6IGUudG90YWwsXG4gICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAob2JqLCBoZWFkZXJTdHIpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlckFyciA9IGhlYWRlclN0ci5tYXRjaCgvKC4rKTogKC4rKS8pXG4gICAgICAgICAgICBpZiAoaGVhZGVyQXJyKSB7XG4gICAgICAgICAgICAgIG9ialtoZWFkZXJBcnJbMV1dID0gaGVhZGVyQXJyWzJdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgfSwge30pXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIHVuZXhwZWN0ZWQgZXJyb3IgaW4gX3hociBmb3IgXFwnZmV0Y2hcXCcgQVBJJywgZXJyKVxuICAgIGNhbGxiYWNrKHtcbiAgICAgIHN0YXR1czogRVJST1JfU1RBVEUsXG4gICAgICBvazogZmFsc2UsXG4gICAgICBzdGF0dXNUZXh0OiAnJyxcbiAgICAgIGRhdGE6ICcnXG4gICAgfSlcbiAgfVxuXG4gIHhoci5zZW5kKGNvbmZpZy5ib2R5IHx8IG51bGwpXG59XG5cbmNvbnN0IHN0cmVhbSA9IHtcblxuICAvKipcbiAgICogc2VuZEh0dHBcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogTm90ZTogVGhpcyBBUEkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBzdHJlYW0uZmV0Y2ggaW5zdGVhZC5cbiAgICogc2VuZCBhIGh0dHAgcmVxdWVzdCB0aHJvdWdoIFhIUi5cbiAgICogQHBhcmFtICB7b2JqfSBwYXJhbXNcbiAgICogIC0gbWV0aG9kOiAnR0VUJyB8ICdQT1NUJyB8ICdQVVQnIHwgJ0RFTEVURScgfCAnSEVBRCcgfCAnUEFUQ0gnLFxuICAgKiAgLSB1cmw6IHVybCByZXF1ZXN0ZWRcbiAgICogQHBhcmFtICB7c3RyaW5nfSBjYWxsYmFja0lkXG4gICAqL1xuICBzZW5kSHR0cDogZnVuY3Rpb24gKHBhcmFtLCBjYWxsYmFja0lkKSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcmFtID0gSlNPTi5wYXJzZShwYXJhbSlcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtICE9PSAnb2JqZWN0JyB8fCAhcGFyYW0udXJsKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihcbiAgICAgICAgJ1toNS1yZW5kZXJdIGludmFsaWQgY29uZmlnIG9yIGludmFsaWQgY29uZmlnLnVybCBmb3Igc2VuZEh0dHAgQVBJJylcbiAgICB9XG5cbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuICAgIGNvbnN0IG1ldGhvZCA9IHBhcmFtLm1ldGhvZCB8fCAnR0VUJ1xuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgeGhyLm9wZW4obWV0aG9kLCBwYXJhbS51cmwsIHRydWUpXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwgdGhpcy5yZXNwb25zZVRleHQpXG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gdW5leHBlY3RlZCBlcnJvciBpbiBzZW5kSHR0cCBBUEknLCBlcnJvcilcbiAgICAgIC8vIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soXG4gICAgICAvLyAgIGNhbGxiYWNrSWQsXG4gICAgICAvLyAgIG5ldyBFcnJvcigndW5leHBlY3RlZCBlcnJvciBpbiBzZW5kSHR0cCBBUEknKVxuICAgICAgLy8gKVxuICAgIH1cbiAgICB4aHIuc2VuZCgpXG4gIH0sXG5cbiAgLyoqXG4gICAqIGZldGNoXG4gICAqIHVzZSBzdHJlYW0uZmV0Y2ggdG8gcmVxdWVzdCBmb3IgYSBqc29uIGZpbGUsIGEgcGxhaW4gdGV4dCBmaWxlIG9yXG4gICAqIGEgYXJyYXlidWZmZXIgZm9yIGEgZmlsZSBzdHJlYW0uIChZb3UgY2FuIHVzZSBCbG9iIGFuZCBGaWxlUmVhZGVyXG4gICAqIEFQSSBpbXBsZW1lbnRlZCBieSBtb3N0IG1vZGVybiBicm93c2VycyB0byByZWFkIGEgYXJyYXlidWZmZXIuKVxuICAgKiBAcGFyYW0gIHtvYmplY3R9IG9wdGlvbnMgY29uZmlnIG9wdGlvbnNcbiAgICogICAtIG1ldGhvZDogJ0dFVCcgfCAnUE9TVCcgfCAnUFVUJyB8ICdERUxFVEUnIHwgJ0hFQUQnIHwgJ1BBVENIJ1xuICAgKiAgIC0gaGVhZGVycyB7b2JqfVxuICAgKiAgIC0gdXJsIHtzdHJpbmd9XG4gICAqICAgLSBtb2RlIHtzdHJpbmd9ICdjb3JzJyB8ICduby1jb3JzJyB8ICdzYW1lLW9yaWdpbicgfCAnbmF2aWdhdGUnXG4gICAqICAgLSB3aXRoQ3JlZGVudGlhbHMge2Jvb2xlYW59XG4gICAqICAgLSBib2R5XG4gICAqICAgLSB0eXBlIHtzdHJpbmd9ICdqc29uJyB8ICdqc29ucCcgfCAndGV4dCdcbiAgICogQHBhcmFtICB7c3RyaW5nfSBjYWxsYmFja0lkXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcHJvZ3Jlc3NDYWxsYmFja0lkXG4gICAqL1xuICBmZXRjaDogZnVuY3Rpb24gKG9wdGlvbnMsIGNhbGxiYWNrSWQsIHByb2dyZXNzQ2FsbGJhY2tJZCkge1xuICAgIGNvbnN0IERFRkFVTFRfTUVUSE9EID0gJ0dFVCdcbiAgICBjb25zdCBERUZBVUxUX01PREUgPSAnY29ycydcbiAgICBjb25zdCBERUZBVUxUX1RZUEUgPSAndGV4dCdcblxuICAgIGNvbnN0IG1ldGhvZE9wdGlvbnMgPSBbJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnLCAnSEVBRCcsICdQQVRDSCddXG4gICAgY29uc3QgbW9kZU9wdGlvbnMgPSBbJ2NvcnMnLCAnbm8tY29ycycsICdzYW1lLW9yaWdpbicsICduYXZpZ2F0ZSddXG4gICAgY29uc3QgdHlwZU9wdGlvbnMgPSBbJ3RleHQnLCAnanNvbicsICdqc29ucCcsICdhcnJheWJ1ZmZlciddXG5cbiAgICAvLyBjb25zdCBmYWxsYmFjayA9IGZhbHNlICAvLyBmYWxsYmFjayBmcm9tICdmZXRjaCcgQVBJIHRvIFhIUi5cbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnNlbmRlclxuXG4gICAgY29uc3QgY29uZmlnID0gdXRpbHMuZXh0ZW5kKHt9LCBvcHRpb25zKVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy5tZXRob2RcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5tZXRob2QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWcubWV0aG9kID0gREVGQVVMVF9NRVRIT0RcbiAgICAgIGNvbnNvbGUud2FybignW2g1LXJlbmRlcl0gb3B0aW9ucy5tZXRob2QgZm9yIFxcJ2ZldGNoXFwnIEFQSSBoYXMgYmVlbiBzZXQgdG8gJ1xuICAgICAgICArICdkZWZhdWx0IHZhbHVlIFxcJycgKyBjb25maWcubWV0aG9kICsgJ1xcJycpXG4gICAgfVxuICAgIGVsc2UgaWYgKG1ldGhvZE9wdGlvbnMuaW5kZXhPZigoY29uZmlnLm1ldGhvZCArICcnKVxuICAgICAgICAudG9VcHBlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gb3B0aW9ucy5tZXRob2QgXFwnJ1xuICAgICAgICArIGNvbmZpZy5tZXRob2RcbiAgICAgICAgKyAnXFwnIGZvciBcXCdmZXRjaFxcJyBBUEkgc2hvdWxkIGJlIG9uZSBvZiAnXG4gICAgICAgICsgbWV0aG9kT3B0aW9ucyArICcuJylcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBvcHRpb25zLnVybFxuICAgIGlmICghY29uZmlnLnVybCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIG9wdGlvbnMudXJsIHNob3VsZCBiZSBzZXQgZm9yIFxcJ2ZldGNoXFwnIEFQSS4nKVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGJvZHkgY29udGVudCBmb3IgbWV0aG9kICdHRVQnLlxuICAgIGlmIChjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCkgPT09ICdHRVQnKSB7XG4gICAgICBsZXQgYm9keSA9IGNvbmZpZy5ib2R5XG4gICAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChib2R5KSkge1xuICAgICAgICBib2R5ID0gcXMuc3RyaW5naWZ5KGJvZHkpXG4gICAgICB9XG4gICAgICBsZXQgdXJsID0gY29uZmlnLnVybFxuICAgICAgbGV0IGhhc2hJZHggPSB1cmwuaW5kZXhPZignIycpXG4gICAgICBoYXNoSWR4IDw9IC0xICYmIChoYXNoSWR4ID0gdXJsLmxlbmd0aClcbiAgICAgIGxldCBoYXNoID0gdXJsLnN1YnN0cihoYXNoSWR4KVxuICAgICAgaGFzaCAmJiAoaGFzaCA9ICcjJyArIGhhc2gpXG4gICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGhhc2hJZHgpXG4gICAgICB1cmwgKz0gKGNvbmZpZy51cmwuaW5kZXhPZignPycpIDw9IC0xID8gJz8nIDogJyYnKSArIGJvZHkgKyBoYXNoXG4gICAgICBjb25maWcudXJsID0gdXJsXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy5tb2RlXG4gICAgaWYgKHR5cGVvZiBjb25maWcubW9kZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZy5tb2RlID0gREVGQVVMVF9NT0RFXG4gICAgfVxuICAgIGVsc2UgaWYgKG1vZGVPcHRpb25zLmluZGV4T2YoKGNvbmZpZy5tb2RlICsgJycpLnRvTG93ZXJDYXNlKCkpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1toNS1yZW5kZXJdIG9wdGlvbnMubW9kZSBcXCcnXG4gICAgICAgICsgY29uZmlnLm1vZGVcbiAgICAgICAgKyAnXFwnIGZvciBcXCdmZXRjaFxcJyBBUEkgc2hvdWxkIGJlIG9uZSBvZiAnXG4gICAgICAgICsgbW9kZU9wdGlvbnMgKyAnLicpXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy50eXBlXG4gICAgaWYgKHR5cGVvZiBjb25maWcudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZy50eXBlID0gREVGQVVMVF9UWVBFXG4gICAgICBjb25zb2xlLndhcm4oJ1toNS1yZW5kZXJdIG9wdGlvbnMudHlwZSBmb3IgXFwnZmV0Y2hcXCcgQVBJIGhhcyBiZWVuIHNldCB0byAnXG4gICAgICAgICsgJ2RlZmF1bHQgdmFsdWUgXFwnJyArIGNvbmZpZy50eXBlICsgJ1xcJy4nKVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlT3B0aW9ucy5pbmRleE9mKChjb25maWcudHlwZSArICcnKS50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKCdbaDUtcmVuZGVyXSBvcHRpb25zLnR5cGUgXFwnJ1xuICAgICAgICAgICsgY29uZmlnLnR5cGVcbiAgICAgICAgICArICdcXCcgZm9yIFxcJ2ZldGNoXFwnIEFQSSBzaG91bGQgYmUgb25lIG9mICdcbiAgICAgICAgICArIHR5cGVPcHRpb25zICsgJy4nKVxuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIG9wdGlvbnMuaGVhZGVyc1xuICAgIGNvbmZpZy5oZWFkZXJzID0gY29uZmlnLmhlYWRlcnMgfHwge31cbiAgICBpZiAoIXV0aWxzLmlzUGxhaW5PYmplY3QoY29uZmlnLmhlYWRlcnMpKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcignW2g1LXJlbmRlcl0gb3B0aW9ucy5oZWFkZXJzIHNob3VsZCBiZSBhIHBsYWluIG9iamVjdCcpXG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgb3B0aW9ucy50aW1lb3V0XG4gICAgY29uZmlnLnRpbWVvdXQgPSBwYXJzZUludChjb25maWcudGltZW91dCwgMTApIHx8IDI1MDBcblxuICAgIGNvbnN0IF9jYWxsQXJncyA9IFtjb25maWcsIGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2tJZCwgcmVzKVxuICAgIH1dXG4gICAgaWYgKHByb2dyZXNzQ2FsbGJhY2tJZCkge1xuICAgICAgX2NhbGxBcmdzLnB1c2goZnVuY3Rpb24gKHJlcykge1xuICAgICAgICAvLyBTZXQgJ2tlZXBBbGl2ZScgdG8gdHJ1ZSBmb3Igc2VuZGluZyBjb250aW51b3VzIGNhbGxiYWNrc1xuICAgICAgICBzZW5kZXIucGVyZm9ybUNhbGxiYWNrKHByb2dyZXNzQ2FsbGJhY2tJZCwgcmVzLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnR5cGUgPT09ICdqc29ucCcpIHtcbiAgICAgIF9qc29ucC5hcHBseSh0aGlzLCBfY2FsbEFyZ3MpXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgX3hoci5hcHBseSh0aGlzLCBfY2FsbEFyZ3MpXG4gICAgfVxuICB9XG5cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgc3RyZWFtOiBbe1xuICAgIG5hbWU6ICdzZW5kSHR0cCcsXG4gICAgYXJnczogWydvYmplY3QnLCAnZnVuY3Rpb24nXVxuICB9LCB7XG4gICAgbmFtZTogJ2ZldGNoJyxcbiAgICBhcmdzOiBbJ29iamVjdCcsICdmdW5jdGlvbicsICdmdW5jdGlvbiddXG4gIH1dXG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdDogZnVuY3Rpb24gKFdlZXgpIHtcbiAgICB1dGlscyA9IFdlZXgudXRpbHNcbiAgICBXZWV4LnJlZ2lzdGVyQXBpTW9kdWxlKCdzdHJlYW0nLCBzdHJlYW0sIG1ldGEpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IHdlYnZpZXcgPSB7XG5cbiAgLy8gcmVmOiByZWYgb2YgdGhlIHdlYiBjb21wb25lbnQuXG4gIGdvQmFjazogZnVuY3Rpb24gKHJlZikge1xuICAgIGNvbnN0IHdlYkNvbXAgPSB0aGlzLmdldENvbXBvbmVudE1hbmFnZXIoKS5nZXRDb21wb25lbnQocmVmKVxuICAgIGlmICghd2ViQ29tcC5nb0JhY2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yOiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBoYXMgbm8gbWV0aG9kIG9mJ1xuICAgICAgICAgICsgJyBnb0JhY2suIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgYSB3ZWJ2aWV3IGNvbXBvbmVudC4nKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHdlYkNvbXAuZ29CYWNrKClcbiAgfSxcblxuICAvLyByZWY6IHJlZiBvZiB0aGUgd2ViIGNvbXBvbmVudC5cbiAgZ29Gb3J3YXJkOiBmdW5jdGlvbiAocmVmKSB7XG4gICAgY29uc3Qgd2ViQ29tcCA9IHRoaXMuZ2V0Q29tcG9uZW50TWFuYWdlcigpLmdldENvbXBvbmVudChyZWYpXG4gICAgaWYgKCF3ZWJDb21wLmdvRm9yd2FyZCkge1xuICAgICAgY29uc29sZS5lcnJvcignZXJyb3I6IHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IGhhcyBubyBtZXRob2Qgb2YnXG4gICAgICAgICAgKyAnIGdvRm9yd2FyZC4gUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBhIHdlYnZpZXcgY29tcG9uZW50LicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgd2ViQ29tcC5nb0ZvcndhcmQoKVxuICB9LFxuXG4gIC8vIHJlZjogcmVmIG9mIHRoZSB3ZWIgY29tcG9uZW50LlxuICByZWxvYWQ6IGZ1bmN0aW9uIChyZWYpIHtcbiAgICBjb25zdCB3ZWJDb21wID0gdGhpcy5nZXRDb21wb25lbnRNYW5hZ2VyKCkuZ2V0Q29tcG9uZW50KHJlZilcbiAgICBpZiAoIXdlYkNvbXAucmVsb2FkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdlcnJvcjogdGhlIHNwZWNpZmllZCBjb21wb25lbnQgaGFzIG5vIG1ldGhvZCBvZidcbiAgICAgICAgICArICcgcmVsb2FkLiBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGEgd2VidmlldyBjb21wb25lbnQuJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICB3ZWJDb21wLnJlbG9hZCgpXG4gIH1cblxufVxuXG5jb25zdCBtZXRhID0ge1xuICB3ZWJ2aWV3OiBbe1xuICAgIG5hbWU6ICdnb0JhY2snLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfSwge1xuICAgIG5hbWU6ICdnb0ZvcndhcmQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfSwge1xuICAgIG5hbWU6ICdyZWxvYWQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ3dlYnZpZXcnLCB3ZWJ2aWV3LCBtZXRhKVxuICB9XG59XG4iLCIvKlxuICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZVxuICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlXG4gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZVxuICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZVxuICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsXG4gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuICogXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcbiAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZVxuICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuICogdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGdsb2JhbCBXZWJTb2NrZXQgKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmxldCBpbnN0YW5jZVxubGV0IGNhbGxiYWNrID0geyB9XG5cbmNvbnN0IHdlYlNvY2tldElucyA9IHtcblxuICBXZWJTb2NrZXQ6IGZ1bmN0aW9uICh1cmwsIHByb3RvY29sKSB7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZS5jbG9zZSgpXG4gICAgICBpbnN0YW5jZSA9IHVuZGVmaW5lZFxuICAgICAgY2FsbGJhY2sgPSB7IH1cbiAgICB9XG4gICAgaWYgKHByb3RvY29sID09PSAnJykge1xuICAgICAgcHJvdG9jb2wgPSB1bmRlZmluZWRcbiAgICB9XG4gICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICBpbnN0YW5jZSA9IG5ldyBXZWJTb2NrZXQodXJsLCBwcm90b2NvbClcbiAgICBpbnN0YW5jZS5vbm9wZW4gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGNhbGxiYWNrLm9ub3Blbikge1xuICAgICAgICBzZWxmLnNlbmRlci5wZXJmb3JtQ2FsbGJhY2soY2FsbGJhY2sub25vcGVuLCB7IHR5cGU6IGUudHlwZSB9LCB0cnVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoY2FsbGJhY2sub25tZXNzYWdlKSB7XG4gICAgICAgIHNlbGYuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFjay5vbm1lc3NhZ2UsIHsgb3JpZ2luOiBlLm9yaWdpbiwgZGF0YTogZS5kYXRhLCBzb3VyY2U6IGUuZGF0YSB9LCB0cnVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RhbmNlLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGNhbGxiYWNrLm9uZXJyb3IpIHtcbiAgICAgICAgc2VsZi5zZW5kZXIucGVyZm9ybUNhbGxiYWNrKGNhbGxiYWNrLm9uZXJyb3IsIHsgY29kZTogZS5jb2RlLCBkYXRhOiBlLmRhdGEgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0YW5jZS5vbmNsb3NlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChjYWxsYmFjay5vbmNsb3NlKSB7XG4gICAgICAgIHNlbGYuc2VuZGVyLnBlcmZvcm1DYWxsYmFjayhjYWxsYmFjay5vbmNsb3NlLCB7IGRhdGE6IGUuZGF0YSwgY29kZTogZS5jb2RlLCByZWFzb246IGUucmVhc29uIH0pXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIGNsb3NlOiBmdW5jdGlvbiAoY29kZSwgc2lnbmFsKSB7XG4gICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICBpbnN0YW5jZS5jbG9zZShjb2RlLCBzaWduYWwpXG4gICAgICBpbnN0YW5jZSA9IHVuZGVmaW5lZFxuICAgICAgY2FsbGJhY2sgPSB7IH1cbiAgICB9XG4gIH0sXG5cbiAgc2VuZDogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGluc3RhbmNlLnNlbmQoZGF0YSlcbiAgICB9XG4gIH0sXG5cbiAgb25vcGVuOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FsbGJhY2sub25vcGVuID0gZnVuY1xuICAgIH1cbiAgfSxcblxuICBvbmVycm9yOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FsbGJhY2sub25lcnJvciA9IGZ1bmNcbiAgICB9XG4gIH0sXG5cbiAgb25tZXNzYWdlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FsbGJhY2sub25tZXNzYWdlID0gZnVuY1xuICAgIH1cbiAgfSxcblxuICBvbmNsb3NlOiBmdW5jdGlvbiAoZnVuYykge1xuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FsbGJhY2sub25jbG9zZSA9IGZ1bmNcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbWV0YSA9IHtcbiAgd2ViU29ja2V0OiBbe1xuICAgIG5hbWU6ICdXZWJTb2NrZXQnLFxuICAgIGFyZ3M6IFsnc3RyaW5nJywgJ3N0cmluZyddXG4gIH0sIHtcbiAgICBuYW1lOiAnY2xvc2UnLFxuICAgIGFyZ3M6IFsnbnVtYmxlJywgJ3N0cmluZyddXG4gIH0sIHtcbiAgICBuYW1lOiAnc2VuZCcsXG4gICAgYXJnczogWydzdHJpbmcnXVxuICB9LCB7XG4gICAgbmFtZTogJ29ub3BlbicsXG4gICAgYXJnczogWydmdW5jdGlvbiddXG4gIH0sIHtcbiAgICBuYW1lOiAnb25tZXNzYWdlJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdvbmNsb3NlJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfSwge1xuICAgIG5hbWU6ICdvbmVycm9yJyxcbiAgICBhcmdzOiBbJ2Z1bmN0aW9uJ11cbiAgfV1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0OiBmdW5jdGlvbiAoV2VleCkge1xuICAgIFdlZXgucmVnaXN0ZXJBcGlNb2R1bGUoJ3dlYlNvY2tldCcsIHdlYlNvY2tldElucywgbWV0YSlcbiAgfVxufVxuIiwiLy8gaW1wb3J0IGNvbXBvbmVudHMuXG5pbXBvcnQgSW1hZ2UgZnJvbSAnLi9jb21wb25lbnRzL2ltYWdlJ1xuaW1wb3J0IFRleHQgZnJvbSAnLi9jb21wb25lbnRzL3RleHQnXG5pbXBvcnQgU2Nyb2xsYWJsZSBmcm9tICcuL2NvbXBvbmVudHMvc2Nyb2xsYWJsZSdcbmltcG9ydCBTbGlkZXIgZnJvbSAnLi9jb21wb25lbnRzL3NsaWRlcidcbmltcG9ydCBJbmRpY2F0b3IgZnJvbSAnLi9jb21wb25lbnRzL2luZGljYXRvcidcbmltcG9ydCBUYWJoZWFkZXIgZnJvbSAnLi9jb21wb25lbnRzL3RhYmhlYWRlcidcbmltcG9ydCBJbnB1dCBmcm9tICcuL2NvbXBvbmVudHMvaW5wdXQnXG5pbXBvcnQgVGV4dGFyZWEgZnJvbSAnLi9jb21wb25lbnRzL3RleHRhcmVhJ1xuaW1wb3J0IFZpZGVvIGZyb20gJy4vY29tcG9uZW50cy92aWRlbydcbmltcG9ydCBTd2l0Y2ggZnJvbSAnLi9jb21wb25lbnRzL3N3aXRjaCdcbmltcG9ydCBBIGZyb20gJy4vY29tcG9uZW50cy9hJ1xuaW1wb3J0IEVtYmVkIGZyb20gJy4vY29tcG9uZW50cy9lbWJlZCdcbmltcG9ydCBTcGlubmVyIGZyb20gJy4vY29tcG9uZW50cy9zcGlubmVyJ1xuaW1wb3J0IFdlYiBmcm9tICcuL2NvbXBvbmVudHMvd2ViJ1xuaW1wb3J0IE5laWdoYm9yIGZyb20gJy4vY29tcG9uZW50cy9uZWlnaGJvcidcbmltcG9ydCBSaWNodGV4dCBmcm9tICcuL2NvbXBvbmVudHMvcmljaHRleHQnXG5cbi8vIGltcG9ydCBhcGlzLlxuaW1wb3J0IEFuaW1hdGlvbiBmcm9tICcuL2FwaS9hbmltYXRpb24nXG5pbXBvcnQgQ2xpcGJvYXJkIGZyb20gJy4vYXBpL2NsaXBib2FyZCdcbmltcG9ydCBEb20gZnJvbSAnLi9hcGkvZG9tJ1xuaW1wb3J0IEV2ZW50IGZyb20gJy4vYXBpL2V2ZW50J1xuaW1wb3J0IEdlb2xvY2F0aW9uIGZyb20gJy4vYXBpL2dlb2xvY2F0aW9uJ1xuaW1wb3J0IEdsb2JhbEV2ZW50IGZyb20gJy4vYXBpL2dsb2JhbEV2ZW50J1xuaW1wb3J0IE1ldGEgZnJvbSAnLi9hcGkvbWV0YSdcbmltcG9ydCBNb2RhbCBmcm9tICcuL2FwaS9tb2RhbCdcbmltcG9ydCBOYXZpZ2F0b3IgZnJvbSAnLi9hcGkvbmF2aWdhdG9yJ1xuaW1wb3J0IFBhZ2VJbmZvIGZyb20gJy4vYXBpL3BhZ2VJbmZvJ1xuaW1wb3J0IFN0b3JhZ2UgZnJvbSAnLi9hcGkvc3RvcmFnZSdcbmltcG9ydCBTdHJlYW0gZnJvbSAnLi9hcGkvc3RyZWFtJ1xuaW1wb3J0IFdlYnZpZXcgZnJvbSAnLi9hcGkvd2VidmlldydcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnLi9hcGkvd2ViU29ja2V0J1xuXG5leHBvcnQgZGVmYXVsdCB7IEltYWdlLCBUZXh0LCBTY3JvbGxhYmxlLCBTbGlkZXIsIEluZGljYXRvciwgVGFiaGVhZGVyLCBJbnB1dCwgVGV4dGFyZWEsIFZpZGVvLCBTd2l0Y2gsIEEsIEVtYmVkLCBTcGlubmVyLCBXZWIsIE5laWdoYm9yLCBSaWNodGV4dCwgQW5pbWF0aW9uLCBDbGlwYm9hcmQsIERvbSwgRXZlbnQsIEdlb2xvY2F0aW9uLCBHbG9iYWxFdmVudCwgTWV0YSwgTW9kYWwsIE5hdmlnYXRvciwgUGFnZUluZm8sIFN0b3JhZ2UsIFN0cmVhbSwgV2VidmlldywgV2ViU29ja2V0IH1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHBhY2thZ2VzIGZyb20gJy4vcGFja2VyJ1xuXG4vLyBpbnN0YWxsIHRoZSBhcGlzIGFuZCBjb21wb25lbnRzIGFzIHBhY2thZ2VzLlxuZXhwb3J0IGRlZmF1bHQge1xuICBpbml0IChXZWV4KSB7XG4gICAgaWYgKHR5cGVvZiBwYWNrYWdlcyAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGsgaW4gcGFja2FnZXMpIHtcbiAgICAgIFdlZXguaW5zdGFsbChwYWNrYWdlc1trXSlcbiAgICB9XG4gICAgLy8gcGFja2FnZXMuZm9yRWFjaChwa2cgPT4gV2VleC5pbnN0YWxsKHBrZykpXG4gIH1cbn1cbiIsIi8qXG4gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lXG4gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlXG4gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4gKiBcIkxpY2Vuc2VcIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXG4gKiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWVxuICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXG4gKiB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuJ3VzZSBzdHJpY3QnXG5cbmltcG9ydCBXZWV4IGZyb20gJy4vcmVuZGVyL2luZGV4J1xuXG5pbXBvcnQgcm9vdCBmcm9tICcuL2Jhc2Uvcm9vdCdcbmltcG9ydCBkaXYgZnJvbSAnLi9iYXNlL2RpdidcbmltcG9ydCBkcm9vdCBmcm9tICcuL2Jhc2UvZHJvb3QnXG5cbi8vIGluc3RhbGwgdGhlIGV4dGVuZGVkIGFwaXMgYW5kIGNvbXBvbmVudHMuXG5pbXBvcnQgZXh0ZW5zaW9ucyBmcm9tICcuL2V4dGVuZCdcblxuV2VleC5pbnN0YWxsKHJvb3QpXG5XZWV4Lmluc3RhbGwoZGl2KVxuV2VleC5pbnN0YWxsKGRyb290KVxuXG5XZWV4Lmluc3RhbGwoZXh0ZW5zaW9ucylcblxuZ2xvYmFsLnJlZ2lzdGVyQ29tcG9uZW50cyhbXG4gIHsgdHlwZTogJ2lucHV0JywgbWV0aG9kczogWydmb2N1cycsICdibHVyJ10gfVxuXSlcblxuZXhwb3J0IGRlZmF1bHQgV2VleFxuIl0sIm5hbWVzIjpbInJlcXVpcmUkJDAiLCJpc09iamVjdCIsInJlcXVpcmUkJDEiLCJkb2N1bWVudCIsInJlcXVpcmUkJDIiLCJyZXF1aXJlJCQzIiwiZFAiLCJyZXF1aXJlJCQ0IiwiZ2xvYmFsIiwiJGV4cG9ydCIsInRvU3RyaW5nIiwiSU9iamVjdCIsInRvSW50ZWdlciIsIm1pbiIsInRvSU9iamVjdCIsImhhcyIsImRlZmluZWQiLCJyZXF1aXJlJCQ1IiwiYXJndW1lbnRzIiwiV1hFbnZpcm9ubWVudCIsImNvZiIsImFuT2JqZWN0IiwiZ2V0S2V5cyIsImVudW1CdWdLZXlzIiwiSUVfUFJPVE8iLCJQUk9UT1RZUEUiLCJUQUciLCJjcmVhdGUiLCJzZXRUb1N0cmluZ1RhZyIsInRvT2JqZWN0IiwicmVxdWlyZSQkOSIsInJlcXVpcmUkJDgiLCJyZWRlZmluZSIsInJlcXVpcmUkJDciLCJoaWRlIiwicmVxdWlyZSQkNiIsIkl0ZXJhdG9ycyIsIklURVJBVE9SIiwiQXJyYXlQcm90byIsImNsYXNzb2YiLCJhRnVuY3Rpb24iLCJjdHgiLCJwcm9jZXNzIiwicnVuIiwiUHJvbWlzZSIsImlzTm9kZSIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwiU1BFQ0lFUyIsIkxJQlJBUlkiLCJyZXF1aXJlJCQyMCIsInJlcXVpcmUkJDE5IiwicmVxdWlyZSQkMTgiLCJyZXF1aXJlJCQxNyIsInJlcXVpcmUkJDE2IiwicmVxdWlyZSQkMTUiLCJyZXF1aXJlJCQxNCIsInJlcXVpcmUkJDEzIiwicmVxdWlyZSQkMTIiLCJyZXF1aXJlJCQxMSIsInJlcXVpcmUkJDEwIiwiVHlwZUVycm9yIiwibm90aWZ5IiwiY29uc3QiLCJsZXQiLCJmcmVlemVQcm90b3R5cGUiLCJFbGVtZW50Iiwic3VwZXIiLCJ0YXNrQ2VudGVyIiwicHVyZUJlZm9yZSIsImluZGV4IiwidGhpcyIsImluaXQiLCJyZWdpc3RlciIsImluaXRUYXNrSGFuZGxlciIsIm5hbWUiLCJzaGFyZWQuZnJlZXplUHJvdG90eXBlIiwic2hhcmVkLnNldE5hdGl2ZUNvbnNvbGUiLCJzaGFyZWQucmVzZXROYXRpdmVDb25zb2xlIiwic2hhcmVkLnNldE5hdGl2ZVRpbWVyIiwic2hhcmVkLnJlc2V0TmF0aXZlVGltZXIiLCJjb25maWciLCJpbnN0YW5jZU1hcCIsImNyZWF0ZUluc3RhbmNlIiwiZGVmIiwicmVtb3ZlIiwiaGFzT3duUHJvcGVydHkiLCJ0eXBvZiIsInVpZCIsIk9ic2VydmVyIiwic2V0Iiwibm9vcCIsInNldEF0dHIiLCJzZXRTdHlsZSIsImJpbmRFdmVudHMiLCJzZXRDbGFzc1N0eWxlIiwiaSIsImNyZWF0ZUJvZHkiLCJjcmVhdGVFbGVtZW50IiwibW92ZUVsZW1lbnQiLCJyZW1vdmVFbGVtZW50IiwidHlwZSIsImluaXRNZXRob2RzIiwiZG93bmdyYWRlLmNoZWNrIiwiY2xlYW5OYW1lIiwicmVmcmVzaCIsImRlc3Ryb3kiLCJmaXJlRXZlbnQiLCJjYWxsYmFjayIsIkFwcCIsInJlbmRlcmVyIiwiaW5pdEFwcCIsInJlZnJlc2hJbnN0YW5jZSIsImRlc3Ryb3lJbnN0YW5jZSIsIm5hdGl2ZUNvbXBvbmVudE1hcCIsInJlZ2lzdGVyQ29tcG9uZW50cyIsInJlZ2lzdGVyTW9kdWxlcyIsInJlY2VpdmVUYXNrcyIsImdldFJvb3QiLCJtZXRob2RzIiwiV2VleCIsImsiLCJjYWxsTmF0aXZlIiwiY3JlYXRlQ2hpbGRyZW4iLCJhcHBlbmRDaGlsZCIsImluc2VydEJlZm9yZSIsInJlbW92ZUNoaWxkIiwidXBkYXRlQXR0cnMiLCJ1cGRhdGVTdHlsZSIsInNldFN0aWNreSIsInVuc2V0U3RpY2t5IiwicG9zaXRpb24iLCJoYW5kbGVyTWFwIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzIiwiYmluZCIsInNsaWNlIiwiZnJhbWV3b3JrcyIsIkxpc3RlbmVyIiwibG9vcCIsInV0aWxzLmdldFJhbmRvbSIsInV0aWxzLmlzQXJyYXkiLCJ1dGlscy5nZXRUeXBlIiwiYmluZFJlZ2lzdGVyIiwidXRpbHMuZXh0ZW5kIiwiQ29tcG9uZW50IiwicHJvdG8iLCJBdG9taWMiLCJhdHRyIiwic3R5bGUiLCJkb2MiLCJ1YSIsImNzc1ByZWZpeCIsInN0eWxlUHJlZml4IiwiREVGQVVMVF9MT0FEX01PUkVfT0ZGU0VUIiwiZ2V0UHJvdG8iLCJwYXJlbnRzIiwiREVGQVVMVF9DTEFNUCIsIkRFRkFVTFRfQUxJR05fSVRFTVMiLCJERUZBVUxUX0pVU1RJRllfQ09OVEVOVCIsImFkanVzdEhlaWdodCIsInNob3ciLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiRmlyZWZveCIsIklFTW9iaWxlIiwidGltZXIuc2V0VGltZW91dCIsInRpbWVyLmNsZWFyVGltZW91dCIsImdldFRyYW5zZm9ybU9mZnNldCIsIkNTU01hdHJpeCIsImhhczNkIiwiZ2V0VHJhbnNsYXRlIiwiZXh0ZW5kIiwiZXZlbnQiLCJkb1Njcm9sbCIsImFwcGVuZFN0eWxlIiwidmVuZG9ycyIsImdldFJhbmRvbSIsImxvb3BBcnJheSIsImdldFJnYiIsImlzQXJyYXkiLCJERUZBVUxUX0lOVEVSVkFMIiwiaWRsZVdoZW5QYWdlRGlzYXBwZWFyIiwiaWRsZVdoZW5Eb21SZW5kZXJpbmciLCJ1cGRhdGVJbmRpY2F0b3JzIiwiZG9SZW5kZXIiLCJhdXRvUGxheSIsInR5cGVNYXAiLCJ0cmFuc2l0aW9uT25jZSIsIm1ldGEiLCJFbWl0dGVyIiwiY2xvbmUiLCJUd2VlbiIsInJhZiIsImNhbWVsVG9LZWJhYiIsInNjcm9sbCIsIk1vZGFsIiwiQWxlcnQiLCJDT05URU5UX0NMQVNTIiwiTVNHX0NMQVNTIiwiQlVUVE9OX0dST1VQX0NMQVNTIiwiQlVUVE9OX0NMQVNTIiwiQ29uZmlybSIsIlByb21wdCIsInF1ZXVlIiwidG9hc3QiLCJtb2RhbCIsIm5hdmlnYXRvciIsInV0aWxzIiwicXMiLCJJbWFnZSIsIkV2ZW50IiwiV2ViU29ja2V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7RUFDZixLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVztJQUN2QixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztJQUN0QyxJQUFJLFVBQVUsR0FBRyxTQUFTLEVBQUUsRUFBRTtNQUM1QixPQUFPLE9BQU8sRUFBRSxLQUFLLFVBQVUsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLG1CQUFtQixDQUFDO0tBQzNFLENBQUM7SUFDRixJQUFJLFNBQVMsR0FBRyxTQUFT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QUFJLENBQUMsTUFBTTtJQUNqQixLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEVBQUU7d0JBQ0osRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNYLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3QixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdELEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFB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QUFDLENBQUM7SUFDNUIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDdEMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDNUI7R0FDRixNQUFNLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFO0lBQ2xDLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDM0I7R0FDRixNQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ3hCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7TUFDdkMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNkLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNuQztHQUNGO0VBQ0QsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDZCxDQUFDLEdBQUcsRUFBRSxRQUFRLEdBQUcsSUFBSSxDQUFDO0dBQ3ZCO0VBQ0QsT0FB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TSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEUsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDdEIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7OztBQUkxRSxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNwQixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDOztBQUUzQixJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNwQixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsUUFBUSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUM7QUFDcEQsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNoRCxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7QUFFN0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDaEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUMzRCxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQztBQUNyQixHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxHQUFHLENBQUM7Ozs7QUFJckUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFDcEIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQzs7QUFFM0IsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7QUFD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QzVCLE1BQU07SUFDUixLQUFLLFVBQVU7Ozs7TUFJYixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7TUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7TUFDNUIsTUFBTTs7O0lBR1IsS0FBSyxZQUFZO01BQ2YsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQzlCLEVBQUEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBQTtNQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztNQUM1QixNQUFNOztJQUVSLEtBQUssT0FBTzs7Ozs7TUFLVixJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDdEUsRUFBQSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBQTtNQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO01BQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7TUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztNQUNyQixNQUFNO0lBQ1IsS0FBSyxPQUFPOzs7OztNQUtWLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUNsRCxFQUFBLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFBO01BQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7TUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztNQUNyQixNQUFNO0lBQ1IsS0FBSyxPQUFPOzs7OztNQUtWLElBQUksSUFB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RUFBRSxDQUFDLEVBQUEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBQSxNQUFNLEVBQUUsQ0FBQyxFQUFBLEVBQUUsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsc0RBQXNELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7QUFFeHBCLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksVUFBVSxNQUFNLEVBQUU7O0NBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLE1BQU0sR0FBR3BELFdBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxHQUFHLElBQUksTUFBTSxFQUFFLEVBQUUsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQzs7QUFFalEsSUFBSSxPQUFPLEdBQUcsT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUUsRUFBRSxPQUFPLE9BQU8s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RTs7QUFFL0YsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsRUFBRSxFQUFFOztBQUV6SixTQUFTLDBCQUEwQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLGNBQWMsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksS0FBSyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLEtBQUssVUFBVSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFOztBQUVoUCxTQUFTLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEVBQUUsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsMERBQTBELEdBQUcsT0FBTyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxFQUFFLEVBQUEsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxFQUFBLEVBQUU7O0FBRTllLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQzs7QUFFcEIsSUFBSSxJQUFJLEdBQUcsVUFBVSxVQUFVLEVBQUU7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QUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDOztBQUUvQixJQUFJLE9BQU8sR0FBRyxTQUFTLE9BQU8sQ0FBQyxJQUFJLEVBQUU7RUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztFQUN0RSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDdEQsQ0FBQzs7QUFFRixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFVLEdBQUcsRUFBRTtFQUNyQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBQSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUE7RUFDbEYsT0FBTyxJQUFJLENBQUM7Q0FDYixDQUFDOztBQUVGLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxFQUFFO0VBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUEsT0FBTyxLQUFLLENBQUMsRUFBQTtFQUNsQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQztFQUMzQixPQUFPLElBQUksQ0FBQztDQUNiLENBQUM7O0FBRUYsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxHQUFHLEVBQUU7RUFDckMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztDQUN6QixDQUFDOztBQUVGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDOztPQUVsQjs7T0FFQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsRUFBRSxFQUFFOztBQUV6SixJQUFJLFFBQVEsR0FBRyxTQUFTLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO0VBQy9DLGVBQWUsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7O0VBRWhDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0VBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0NBQ3RCLENBQUM7O0FBRUYsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7O09BRW5COztPQUVBLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7OztBQUtiLElBQUksZUFBZSxHQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUU3QyxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25DLFFBQVEsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3JCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ25CLFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pCLFFBQVEsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDOztBQUVuQixJQUFJLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakQsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3BDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztBQUN0QyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDdEMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDOztBQUV4QyxTQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtFQUNoQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLENBQUM7Q0FDdkM7O0FBRUQsU0FBUyxPQUFPLEdBQUc7RUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztDQUN4Qjs7QUFFRCxTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQUU7RUFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO0lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUNwQjs7RUFFRCxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztDQUN4Qjs7QUFFRCxTQUFTLGFBQWEsQ0FBQyxDQUFDLEVBQUU7RUFDeEIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksT0FBTyxHQUFHLElBQUk7O0VBRXBDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7SUFDM0QsT0FBTyxDQUFDLENBQUM7R0FDVjtFQUNELE9BQU8sa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDOUI7O0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUU7Ozs7RUFJN0IsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUM5QixJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksT0FBTyxHQUFHLElBQUk7O0VBRXBDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtJQUNyRCxPQUFPLENBQUMsQ0FBQztHQUNWO0VBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM5Qjs7QUFFRCxJQUFJLEdBQUcsR0FBRyxTQUFTO0lBQ2YsS0FBSyxHQUFHLFVBQVU7SUFDbEIsWUFBWSxHQUFHLG1CQUFtQixDQUFDOztBQUV2QyxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRTs7O0VBQ3pDLFNBQVMsR0FBRyxDQUFDLE9BQU8sRUFBRTtJQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0dBQ3RCOztFQUVELElBQUksS0FBSyxHQUFHLGFBQWEsSUFBSSxjQUFjO01BQ3ZDLE1BQU0sR0FBRyxDQUFDO01BQ1YsTUFBTSxHQUFHLEVBQUU7TUFDWCxNQUFNLEdBQUcsS0FBSztNQUNkLFdBQVcsR0FBRyxLQUFLO01BQ25CLE1BQU0sR0FBRyxFQUFFLENBQUM7O0VBRWhCLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7SUFDMUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLFFBQVEsS0FBSztNQUNYLEtBQUssY0FBYztRQUNqQixJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1VBQ3RCLE1BQU0sSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7VUFDMUIsS0FBSyxHQUFHLFFBQVEsQ0FBQztTQUNsQixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUU7VUFDekIsTUFBTSxHQUFHLEVBQUUsQ0FBQztVQUNaLEtBQUssR0FBRyxXQUFXLENBQUM7VUFDcEIsU0FBUztTQUNWLE1BQU07VUFDTCxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztVQUN2QixNQUFNLElBQUksQ0FBQztTQUNaO1FBQ0QsTUFBTTs7TUFFUixLQUFLLFFBQVE7UUFDWCxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1VBQzdCLE1BQU0sSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7VUFDbkJBLE1BQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1VBQ3RCLE1BQU0sR0FBRyxFQUFFLENBQUM7VUFDWixJQUFJLGFBQWEsRUFBRTtZQUNqQixNQUFNLElBQUksQ0FBQztXQUNaO1VBQ0QsSUFBSSxnQkFBZ0IsQ0FBQ0EsTUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDQSxNQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztXQUN6QjtVQUNELElBQUksTUFBTSxJQUFJQSxNQUFJLENBQUMsT0FBTyxFQUFFO1lBQzFCLEtBQUssR0FBRyxVQUFVLENBQUM7V0FDcEIsTUFBTSxJQUFJQSxNQUFJLENBQUMsV0FBVyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJQSxNQUFJLENBQUMsT0FBTyxFQUFFO1lBQ25FLEtBQUssR0FBRyx1QkFBdUIsQ0FBQztXQUNqQyxNQUFNLElBQUlBLE1BQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0IsS0FBSyxHQUFHLHVCQUF1QixDQUFDO1dBQ2pDLE1BQU07WUFDTCxLQUFLLEdBQUcsYUFBYSxDQUFDO1dBQ3ZCO1NBQ0YsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFO1VBQ3pCLE1BQU0sR0FBRyxFQUFFLENBQUM7VUFDWixNQUFNLEdBQUcsQ0FBQyxDQUFDO1VBQ1gsS0FBSyxHQUFHLFdBQVcsQ0FBQztVQUNwQixTQUFTO1NBQ1YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7VUFDbkIsTUFBTSxJQUFJLENBQUM7U0FDWixNQUFNO1VBQ0wsR0FBRyxDQUFDLG9DQUFvQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1VBQzlDLE1BQU0sSUFBSSxDQUFDO1NBQ1o7UUFDRCxNQUFNOztNQUVSLEtBQUssYUFBYTtRQUNoQixJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7VUFDWixLQUFLLEdBQUcsT0FBTyxDQUFDO1NBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1VBQ25CQSxNQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztVQUNyQixLQUFLLEdBQUcsVUFBVSxDQUFDO1NBQ3BCLE1BQU07O1VBRUwsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQ25EQSxNQUFJLENBQUMsV0FBVyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztXQUN0QztTQUNGO1FBQ0QsTUFBTTs7TUFFUixLQUFLLFdBQVc7UUFDZCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1VBQzVDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1VBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUNBLE1BQUksQ0FBQyxDQUFDO1NBQ3BCLE1BQU07VUFDTCxLQUFLLEdBQUcsVUFBVSxDQUFDO1VBQ25CLFNBQVM7U0FDVjtRQUNELE1BQU07O01BRVIsS0FBSyx1QkFBdUI7UUFDMUIsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO1VBQ3hDLEtBQUssR0FBRywwQkFBMEIsQ0FBQztTQUNwQyxNQUFNO1VBQ0wsR0FBRyxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxDQUFDO1VBQzdCLEtBQUssR0FBRyxVQUFVLENBQUM7VUFDbkIsU0FBUztTQUNWO1FBQ0QsTUFBTTs7TUFFUixLQUFLLFVBQVU7UUFDYkEsTUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxNQUFNLElBQUlBLE1BQUksQ0FBQyxPQUFPLEVBQUUsRUFBQUEsTUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUE7UUFDeEQsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1VBQ1pBLE1BQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztVQUN4QkEsTUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1VBQ3hCQSxNQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7VUFDaENBLE1BQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztVQUMxQkEsTUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1VBQ2hDQSxNQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7VUFDaEMsTUFBTSxJQUFJLENBQUM7U0FDWixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1VBQ2hDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFBLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLEVBQUE7VUFDbkQsS0FBSyxHQUFHLGdCQUFnQixDQUFDO1NBQzFCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1VBQ25CQSxNQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7VUFDeEJBLE1BQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztVQUN4QkEsTUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1VBQ2hDQSxNQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztVQUNsQkEsTUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1VBQ2hDQSxNQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7VUFDaEMsS0FBSyxHQUFHLE9BQU8sQ0FBQztTQUNqQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtVQUNuQkEsTUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1VBQ3hCQSxNQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7VUFDeEJBLE1BQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztVQUNoQ0EsTUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1VBQzFCQSxNQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztVQUNyQkEsTUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1VBQ2hDQSxNQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7VUFDaEMsS0FBSyxHQUFHLFVBQVUsQ0FBQztTQUNwQixNQUFNO1VBQ0wsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztVQUM5QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1VBQ2xDLElBQUksTUFBTSxJQUFJQSxNQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLFNBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxFQUFFO1lBQ2pMQSxNQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDeEJBLE1BQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN4QkEsTUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2hDQSxNQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDaENBLE1BQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQ0EsTUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztXQUNsQjtVQUNELEtBQUssR0FBRyxlQUFlLENBQUM7VUFDeEIsU0FBUztTQUNWO1FBQ0QsTUFBTTs7TUFFUixLQUFLLGdCQUFnQjtRQUNuQixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtVQUN6QixJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDYixHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztXQUNyQztVQUNELElBQUksTUFBTSxJQUFJQSxNQUFJLENBQUMsT0FBTyxFQUFFO1lBQzFCLEtBQUssR0FBRyxXQUFXLENBQUM7V0FDckIsTUFBTTtZQUNMLEtBQUssR0FBRywwQkFBMEIsQ0FBQztXQUNwQztTQUNGLE1BQU07VUFDTCxJQUFJLE1BQU0sSUFBSUEsTUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMxQkEsTUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3hCQSxNQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDeEJBLE1BQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNoQ0EsTUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1dBQ2pDO1VBQ0QsS0FBSyxHQUFHLGVBQWUsQ0FBQztVQUN4QixTQUFTO1NBQ1Y7UUFDRCxNQUFNOztNQUVSLEtBQUssdUJBQXVCO1FBQzFCLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtVQUNaLEtBQUssR0FBRyx3QkFBd0IsQ0FBQztTQUNsQyxNQUFNO1VBQ0wsR0FBRyxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxDQUFDO1VBQy9CLEtBQUssR0FBRywwQkFBMEIsQ0FBQztVQUNuQyxTQUFTO1NBQ1Y7UUFDRCxNQUFNOztNQUVSLEtBQUssd0JBQXdCO1FBQzNCLEtBQUssR0FBRywwQkFBMEIsQ0FBQztRQUNuQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7VUFDWixHQUFHLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLENBQUM7VUFDL0IsU0FBUztTQUNWO1FBQ0QsTUFBTTs7TUFFUixLQUFLLDBCQUEwQjtRQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtVQUN6QixLQUFLLEdBQUcsV0FBVyxDQUFDO1VBQ3BCLFNBQVM7U0FDVixNQUFNO1VBQ0wsR0FBRyxDQUFDLDJCQUEyQixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0QsTUFBTTs7TUFFUixLQUFLLFdBQVc7UUFDZCxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7VUFDWixJQUFJLE1BQU0sRUFBRTtZQUNWLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUM7V0FDakI7VUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDO1VBQ2QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLEVBQUU7Y0FDMUMsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Y0FDeEMsU0FBUzthQUNWOztZQUVELElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxJQUFJLEtBQUtBLE1BQUksQ0FBQyxTQUFTLEVBQUU7Y0FDeENBLE1BQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2NBQ3BCLFNBQVM7YUFDVjtZQUNELElBQUksS0FBSyxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5QixJQUFJLEtBQUtBLE1BQUksQ0FBQyxTQUFTLEdBQUdBLE1BQUksQ0FBQyxTQUFTLElBQUksS0FBSyxHQUFHQSxNQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztXQUM3RTtVQUNELE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1VBQ3BFLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDO1VBQ3hCLE1BQU0sR0FBRyxFQUFFLENBQUM7VUFDWixLQUFLLEdBQUcsTUFBTSxDQUFDO1VBQ2YsU0FBUztTQUNWLE1BQU07VUFDTCxNQUFNLElBQUksQ0FBQyxDQUFDO1NBQ2I7UUFDRCxNQUFNOztNQUVSLEtBQUssV0FBVztRQUNkLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1VBQzdELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUN6RixLQUFLLEdBQUcsZUFBZSxDQUFDO1dBQ3pCLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUM3QixLQUFLLEdBQUcscUJBQXFCLENBQUM7V0FDL0IsTUFBTTtZQUNMQSxNQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUNBLE1BQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QyxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ1osS0FBSyxHQUFHLHFCQUFxQixDQUFDO1dBQy9CO1VBQ0QsU0FBUztTQUNWLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtVQUM5QyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUN6QyxNQUFNO1VBQ0wsTUFBTSxJQUFJLENBQUMsQ0FBQztTQUNiO1FBQ0QsTUFBTTs7TUFFUixLQUFLLE1BQU0sQ0FBQztNQUNaLEtBQUssVUFBVTtRQUNiLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTs7VUFFNUJBLE1BQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQ0EsTUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1VBQzVDLE1BQU0sR0FBRyxFQUFFLENBQUM7VUFDWixLQUFLLEdBQUcsTUFBTSxDQUFDO1VBQ2YsSUFBSSxVQUFVLElBQUksYUFBYSxFQUFFO1lBQy9CLE1BQU0sSUFBSSxDQUFDO1dBQ1o7U0FDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1VBQ3BFQSxNQUFJLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUNBLE1BQUksRUFBRSxNQUFNLENBQUMsQ0FBQztVQUM1QyxNQUFNLEdBQUcsRUFBRSxDQUFDO1VBQ1osS0FBSyxHQUFHLHFCQUFxQixDQUFDO1VBQzlCLElBQUksYUFBYSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxDQUFDO1dBQ1o7VUFDRCxTQUFTO1NBQ1YsTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1VBQzlDLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtZQUNaLFdBQVcsR0FBRyxJQUFJLENBQUM7V0FDcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7WUFDbkIsV0FBVyxHQUFHLEtBQUssQ0FBQztXQUNyQjtVQUNELE1BQU0sSUFBSSxDQUFDLENBQUM7U0FDYixNQUFNO1VBQ0wsR0FBRyxDQUFDLHVDQUF1QyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTTs7TUFFUixLQUFLLE1BQU07UUFDVCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7VUFDbkIsTUFBTSxJQUFJLENBQUMsQ0FBQztTQUNiLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksYUFBYSxFQUFFO1VBQ3JGLElBQUksRUFBRSxJQUFJLE1BQU0sRUFBRTtZQUNoQixJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQ0EsTUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2NBQ2xDQSxNQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7YUFDeEI7WUFDRCxNQUFNLEdBQUcsRUFBRSxDQUFDO1dBQ2I7VUFDRCxJQUFJLGFBQWEsRUFBRTtZQUNqQixNQUFNLElBQUksQ0FBQztXQUNaO1VBQ0QsS0FBSyxHQUFHLHFCQUFxQixDQUFDO1VBQzlCLFNBQVM7U0FDVixNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7VUFDOUMsR0FBRyxDQUFDLDhCQUE4QixHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3pDLE1BQU07VUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDQSxNQUFJLENBQUMsQ0FBQztTQUNwQjtRQUNELE1BQU07O01BRVIsS0FBSyxxQkFBcUI7UUFDeEIsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUEsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUMsRUFBQTtRQUNoRCxLQUFLLEdBQUcsZUFBZSxDQUFDO1FBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1VBQ3pCLFNBQVM7U0FDVjtRQUNELE1BQU07O01BRVIsS0FBSyxlQUFlO1FBQ2xCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUU7VUFDakYsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1lBQ2IsR0FBRyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7V0FDekM7VUFDRCxJQUFJLEdBQUcsQ0FBQztVQUNSLElBQUksR0FBRyxHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFO1lBQ3RELE1BQU0sR0FBRyxHQUFHLENBQUM7V0FDZDtVQUNELElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRTtZQUNsQkEsTUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqQixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtjQUN6QkEsTUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDckI7V0FDRixNQUFNLElBQUksR0FBRyxJQUFJLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUU7WUFDakRBLE1BQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1dBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxFQUFFO1lBQ3hCLElBQUksTUFBTSxJQUFJQSxNQUFJLENBQUMsT0FBTyxJQUFJQSxNQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFO2NBQ3ZILE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2FBQzFCO1lBQ0RBLE1BQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1dBQ3pCO1VBQ0QsTUFBTSxHQUFHLEVBQUUsQ0FBQztVQUNaLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtZQUNaQSxNQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNsQixLQUFLLEdBQUcsT0FBTyxDQUFDO1dBQ2pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO1lBQ25CQSxNQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztZQUNyQixLQUFLLEdBQUcsVUFBVSxDQUFDO1dBQ3BCO1NBQ0YsTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1VBQzlDLE1BQU0sSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUI7UUFDRCxNQUFNOztNQUVSLEtBQUssT0FBTztRQUNWLElBQUksQ0FBQyxhQUFhLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTtVQUM5QkEsTUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7VUFDckIsS0FBSyxHQUFHLFVBQVUsQ0FBQztTQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRTtVQUMxREEsTUFBSSxDQUFDLE1BQU0sSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QztRQUNELE1BQU07O01BRVIsS0FBSyxVQUFVO1FBQ2IsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1VBQ25EQSxNQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztTQUNyQjtRQUNELE1BQU07S0FDVDs7SUFFRCxNQUFNLEVBQUUsQ0FBQztHQUNWO0NBQ0Y7O0FBRUQsU0FBUyxLQUFLLEdBQUc7RUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztFQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztFQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztFQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztFQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztFQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztFQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztFQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztDQUMxQjs7OztBQUlELFNBQVMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLG1CQUFtQjtFQUN2QyxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksRUFBRSxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUUsRUFBQSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQTs7RUFFL0UsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7RUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7RUFFakIsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLENBQUMsQ0FBQzs7O0VBRzVELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Q0FDckM7O0FBRUQsR0FBRyxDQUFDLFNBQVMsR0FBRztFQUNkLFFBQVEsRUFBRSxTQUFTLFFBQVEsR0FBRztJQUM1QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7R0FDbEI7RUFDRCxJQUFJLElBQUksR0FBRztJQUNULElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFBLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFBOztJQUV0QyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDbkIsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtNQUNsRCxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDekY7O0lBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0dBQzlIO0VBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO0lBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztHQUN4Qjs7RUFFRCxJQUFJLFFBQVEsR0FBRztJQUNiLE9BQU8sSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7R0FDM0I7RUFDRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7SUFDckIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUEsT0FBTyxFQUFBO0lBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsR0FBRyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7R0FDbEQ7O0VBRUQsSUFBSSxJQUFJLEdBQUc7SUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0dBQ3ZGO0VBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO0lBQ2IsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFBLE9BQU8sRUFBQTtJQUNqRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7R0FDaEM7O0VBRUQsSUFBSSxRQUFRLEdBQUc7SUFDYixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7R0FDbkI7RUFDRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7SUFDckIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFBLE9BQU8sRUFBQTtJQUNqRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7R0FDeEM7O0VBRUQsSUFBSSxJQUFJLEdBQUc7SUFDVCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7R0FDbkI7RUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7SUFDYixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUEsT0FBTyxFQUFBO0lBQ2pELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztHQUNoQzs7RUFFRCxJQUFJLFFBQVEsR0FBRztJQUNiLE9BQU8sSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztHQUNoRztFQUNELElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTtJQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUEsT0FBTyxFQUFBO0lBQ2pELElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0dBQ25EOztFQUVELElBQUksTUFBTSxHQUFHO0lBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztHQUNqRjtFQUNELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtJQUNqQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUEsT0FBTyxFQUFBO0lBQ2pELElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFBLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUE7SUFDL0MsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ25DOztFQUVELElBQUksWUFBWSxHQUFHO0lBQ2pCLE9BQU8sSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0dBQ3pDOztFQUVELElBQUksSUFBSSxHQUFHO0lBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztHQUMxRjtFQUNELElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtJQUNiLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFBLE9BQU8sRUFBQTtJQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztJQUNyQixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBO0lBQ3pDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztHQUNwQzs7RUFFRCxJQUFJLE1BQU0sR0FBRztJQUNYLElBQUksSUFBSSxDQUFDO0lBQ1QsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtNQUNwQyxPQUFPLEVBQUUsQ0FBQztLQUNYOzs7Ozs7SUFNRCxRQUFRLElBQUksQ0FBQyxPQUFPO01BQ2xCLEtBQUssTUFBTSxDQUFDO01BQ1osS0FBSyxNQUFNLENBQUM7TUFDWixLQUFLLFlBQVksQ0FBQztNQUNsQixLQUFLLFFBQVE7UUFDWCxPQUFPLE1BQU0sQ0FBQztLQUNqQjtJQUNELElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ2pCLElBQUksQ0FBQyxJQUFJLEVBQUU7TUFDVCxPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7R0FDcEM7Q0FDRixDQUFDOztBQUVGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDOztPQUVkOztPQUVBLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7OztBQUtiLElBQUksY0FBYyxHQUFHLHlFQUF5RTtJQUMxRixnQkFBZ0IsR0FBRyx1REFBdUQ7SUFDMUUsYUFBYSxHQUFHLHNCQUFzQixDQUFDOztBQUUzQyxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFO0VBQy9CLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRTtJQUM5QyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDOztJQUU1QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUM7O0lBRW5FLElBQUksU0FBUyxJQUFJLE9BQU8sSUFBSSxFQUFFLFNBQVMsSUFBSSxPQUFPLENBQUMsRUFBRTtNQUNuRCxPQUFPLEtBQUssQ0FBQztLQUNkOztJQUVELElBQUksZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxVQUFVLEVBQUU7TUFDbkUsSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU87VUFDNUIsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRO1VBQzlCLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSztVQUMzQixLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztNQUU1QixJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsT0FBTyxLQUFLLENBQUM7T0FDZDs7TUFFRCxRQUFRLE9BQU87UUFDYixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssUUFBUTtVQUNYLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7VUFDaEMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztVQUMxQixNQUFNO09BQ1Q7O01BRUQsUUFBUSxRQUFRO1FBQ2QsS0FBSyxLQUFLO1VBQ1IsT0FBTyxLQUFLLElBQUksUUFBUSxDQUFDO1FBQzNCLEtBQUssS0FBSztVQUNSLE9BQU8sS0FBSyxJQUFJLFFBQVEsQ0FBQztRQUMzQjtVQUNFLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztPQUM3QjtLQUNGLENBQUMsQ0FBQzs7SUFFSCxPQUFPLGdCQUFnQixJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLElBQUksT0FBTyxDQUFDO0dBQ3JFLENBQUMsQ0FBQztDQUNKLEFBQUM7O0FBRUYsU0FBUyxXQUFXLENBQUMsS0FBSyxFQUFFO0VBQzFCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLEVBQUU7SUFDM0MsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7SUFFckIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQzs7SUFFM0MsSUFBSSxDQUFDLFFBQVEsRUFBRTtNQUNiLE1BQU0sSUFBSSxXQUFXLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQ25FOztJQUVELElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEIsV0FBVyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUU7UUFDaEUsTUFBTSxHQUFHLEVBQUUsQ0FBQzs7SUFFaEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUM7SUFDaEUsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQzs7SUFFaEQsSUFBSSxDQUFDLFdBQVcsRUFBRTtNQUNoQixNQUFNLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztNQUN4QixPQUFPLE1BQU0sQ0FBQztLQUNmOztJQUVELFdBQVcsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDOztJQUUvQyxJQUFJLENBQUMsV0FBVyxFQUFFO01BQ2hCLE1BQU0sSUFBSSxXQUFXLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQ25FOztJQUVELE1BQU0sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLFVBQVUsRUFBRTtNQUN6RCxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7O01BRWxELElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDYixNQUFNLElBQUksV0FBVyxDQUFDLDRCQUE0QixHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztPQUNuRTs7TUFFRCxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDOztNQUU3RCxPQUFPO1FBQ0wsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDcEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7T0FDbkIsQ0FBQztLQUNILENBQUMsQ0FBQzs7SUFFSCxPQUFPLE1BQU0sQ0FBQztHQUNmLENBQUMsQ0FBQztDQUNKLEFBQUM7O0FBRUYsU0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFO0VBQ3pCLElBQUksR0FBRyxHQUFHO0lBQ1IsT0FBTyxFQUFFLEtBQUs7SUFDZCxLQUFLLEVBQUUsS0FBSztHQUNiLENBQUM7O0VBRUYsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFO0lBQ2hCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ25CLE9BQU8sR0FBRyxDQUFDO0dBQ1o7O0VBRUQsR0FBRyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFO0lBQzVCLElBQUksRUFBRSxRQUFRO0lBQ2QsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSztJQUMxQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNO0dBQzdCLENBQUMsQ0FBQzs7RUFFSCxPQUFPLEdBQUcsQ0FBQztDQUNaOztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDOztPQUVyQjtVQUNHLENBQUMsQ0FBQyxDQUFDLEFBQUM7O09BRVA7Ozs7Ozs7T0FPQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsTUFBTSxDQUFDLE9BQU8sR0FBRyxVQUFVLE9BQU8sRUFBRTtFQUNsQyxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtJQUNuQyxJQUFJLElBQUksWUFBWSxRQUFRLEVBQUU7TUFDNUIsT0FBTyxHQUFHLElBQUksQ0FBQztNQUNmLElBQUksR0FBRyxFQUFFLENBQUM7S0FDWDs7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUc7TUFDZCxPQUFPLEVBQUUsT0FBTztNQUNoQixJQUFJLEVBQUUsSUFBSTtNQUNWLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7TUFDdkIsYUFBYSxFQUFFLEtBQUs7TUFDcEIsUUFBUSxFQUFFLEtBQUs7S0FDaEIsQ0FBQztHQUNIOztFQUVELE9BQU8sTUFBTSxDQUFDO0NBQ2YsQ0FBQzs7T0FFSzs7Ozs7OztPQU9BLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7QUFHYixNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsT0FBTyxFQUFFO0VBQ2xDLFNBQVMsT0FBTyxDQUFDLElBQUksRUFBRTtJQUNyQixJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7O0lBRXhCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLEVBQUU7TUFDNUIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztLQUMzQjs7SUFFRCxJQUFJLENBQUMsR0FBRyxFQUFFO01BQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDNUQ7O0lBRUQsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFO01BQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxHQUFHLDRCQUE0QixDQUFDLENBQUM7S0FDN0U7O0lBRUQsSUFBSTtNQUNGLEdBQUcsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO01BQ3pCLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUN0RCxDQUFDLE9BQU8sQ0FBQyxFQUFFO01BQ1YsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7TUFDcEIsR0FBRyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7TUFDMUIsTUFBTSxDQUFDLENBQUM7S0FDVDs7SUFFRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0dBQzNCOztFQUVELE9BQU8sT0FBTyxDQUFDO0NBQ2hCLENBQUM7O09BRUs7Ozs7Ozs7T0FPQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsSUFBSSxPQUFPLEdBQUcsbUJBQW1CLGlCQUFpQixFQUFFLENBQUMsQ0FBQzs7QUFFdEQsSUFBSSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7O0FBRS9DLFNBQVMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTs7QUFFL0YsU0FBUyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUU7RUFDM0IsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFO0lBQ1osT0FBTyxDQUFDLENBQUM7R0FDVjtFQUNELENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUNuQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNWLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQzs7RUFFaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ1osSUFBSSxDQUFDLEdBQUcsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2xFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixDQUFDLEVBQUUsQ0FBQztHQUNMOztFQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUN6Qjs7QUFFRCxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRTtFQUNwQyxJQUFJLE1BQU0sR0FBRztJQUNYLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFNBQVMsRUFBRSxDQUFDO0lBQ1osSUFBSSxFQUFFLElBQUk7R0FDWCxDQUFDO0VBQ0YsSUFBSSxNQUFNLEdBQUcsU0FBUyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUU7SUFDL0MsT0FBTyxZQUFZLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixHQUFHLEdBQUcsR0FBRyxvQkFBb0IsR0FBRyxRQUFRLENBQUM7R0FDeEYsQ0FBQztFQUNGLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUNsQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztHQUNwQixNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7SUFDMUMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7R0FDcEIsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFO0lBQzNDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0dBQ3BCLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRTtJQUMzQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztHQUNwQjs7RUFFRCxNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0VBQ2pELE9BQU8sTUFBTSxDQUFDO0NBQ2Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCRCxTQUFTLEtBQUssQ0FBQyxNQUFNLEVBQUU7RUFDckIsSUFBSSxNQUFNLEdBQUc7SUFDWCxXQUFXLEVBQUUsS0FBSztHQUNuQixDQUFDOztFQUVGLElBQUksVUFBVSxHQUFHLGFBQWEsQ0FBQzs7RUFFL0IsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUM7RUFDL0MsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQ3ZDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7O0VBRW5DLEtBQUssSUFBSSxDQUFDLElBQUksVUFBVSxFQUFFO0lBQ3hCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNaLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNqQyxJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsSUFBSSxTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsSUFBSSxhQUFhLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztJQUV2QixJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUU7TUFDekIsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7TUFDbkMsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O01BRXhDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN0QyxNQUFNO09BQ1A7S0FDRixNQUFNLElBQUksYUFBYSxFQUFFO01BQ3hCLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7O01BRWhFLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0IsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLE1BQU07T0FDUDtLQUNGO0dBQ0Y7O0VBRUQsT0FBTyxNQUFNLENBQUM7Q0FDZjs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsZ0JBQWdCLEVBQUU7RUFDM0MsT0FBTyxVQUFVLE1BQU0sRUFBRTtJQUN2QixJQUFJLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDdkUsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNCLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtNQUN0QixrQkFBa0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztNQUM3RSxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsT0FBTyxLQUFLLENBQUM7R0FDZCxDQUFDO0NBQ0gsQ0FBQzs7T0FFSzs7Ozs7OztPQU9BLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7QUFHYixNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUU7RUFDM0MsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDLENBQUM7O0FBRUgsSUFBSSxPQUFPLEdBQUcsT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLEdBQUcsVUFBVSxHQUFHLEVBQUUsRUFBRSxPQUFPLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxVQUFVLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVUsSUFBSSxHQUFHLENBQUMsV0FBVyxLQUFLLE1BQU0sSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLEdBQUcsT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDOztBQUU3USxPQUFPLENBQUMsT0FBTyxHQUFHO0VBQ2hCLFNBQVMsRUFBRSxTQUFTLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO0lBQ3pDLElBQUksS0FBSyxHQUFHLGlCQUFpQixDQUFDOztJQUU5QixJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTyxLQUFLLEtBQUssV0FBVyxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxjQUFjLEVBQUUsRUFBQSxPQUFPLEtBQUssQ0FBQyxFQUFBOztJQUVoSyxJQUFJLEtBQUssSUFBSSxHQUFHLEVBQUU7TUFDaEIsT0FBTyxJQUFJLENBQUM7S0FDYjs7SUFFRCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ25CLENBQUMsR0FBRyxDQUFDO1FBQ0wsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQ3JCLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDOztJQUV2QyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFO01BQy9CLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtRQUMvRSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsTUFBTTtPQUNQLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ3RGLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNWLE1BQU07T0FDUDtLQUNGOztJQUVELFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUNaLEtBQUssR0FBRztRQUNOLElBQUksSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFO1VBQ2YsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU07TUFDUixLQUFLLElBQUk7UUFDUCxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7VUFDZCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTTtNQUNSLEtBQUssR0FBRztRQUNOLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtVQUNkLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxNQUFNO01BQ1IsS0FBSyxJQUFJO1FBQ1AsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUU7VUFDZixPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsTUFBTTtNQUNSO1FBQ0UsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1VBQ2QsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE1BQU07S0FDVDtJQUNELE9BQU8sS0FBSyxDQUFDO0dBQ2Q7Q0FDRixDQUFDO0FBQ0YsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7O09BRTdCOzs7Ozs7O09BT0EsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLElBQUksUUFBUSxHQUFHLG1CQUFtQixrQkFBa0IsQ0FBQyxDQUFDLENBQUM7O0FBRXZELElBQUksU0FBUyxHQUFHLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDOztBQUVqRCxTQUFTLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7O0FBRS9GLElBQUksVUFBVSxHQUFHLGtCQUFrQixDQUFDO0FBQ3BDLElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUN4QixJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7QUFDdEIsSUFBSSx1QkFBdUIsR0FBRyxrQkFBa0IsQ0FBQzs7QUFFakQsU0FBUyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUU7RUFDdkMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxFQUFFO0lBQ2hELFFBQVEsQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO0lBQ25DLENBQUMsQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUM7SUFDakMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUMzQixDQUFDLENBQUM7O0VBRUgsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxFQUFFO0lBQ25ELFFBQVEsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLENBQUM7SUFDakMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUMzQixDQUFDLENBQUM7Q0FDSjs7QUFFRCxTQUFTLHdCQUF3QixDQUFDLFFBQVEsRUFBRTtFQUMxQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7SUFDakIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7R0FDNUM7Q0FDRjs7QUFFRCxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFOztFQUVyRCxJQUFJLGVBQWUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztFQUM5QyxJQUFJLHlCQUF5QixHQUFHLEtBQUssQ0FBQzs7O0VBR3RDLElBQUk7SUFDRixRQUFRLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxJQUFJLEVBQUUsUUFBUSxFQUFFO01BQ3BELElBQUksSUFBSSxLQUFLLHVCQUF1QixFQUFFO1FBQ3BDLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtVQUNqQixxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNqQyxNQUFNO1VBQ0wseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO09BQ0Y7TUFDRCxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUNwQyxDQUFDOztJQUVGLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLElBQUksRUFBRSxRQUFRLEVBQUU7TUFDdkQsSUFBSSxJQUFJLEtBQUssdUJBQXVCLEVBQUU7UUFDcEMsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7T0FDcEM7TUFDRCxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUNyQyxDQUFDOztJQUVGLFFBQVEsQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLEVBQUU7TUFDcEMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ2pDLENBQUM7OztJQUdGLFFBQVEsQ0FBQyxLQUFLLEdBQUc7TUFDZixHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsUUFBUSxFQUFFO1FBQzFCLElBQUksU0FBUyxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1VBQzVCLFVBQVUsRUFBRSxRQUFRLENBQUMsTUFBTTtVQUMzQixHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU07U0FDckIsQ0FBQyxDQUFDO09BQ0o7S0FDRixDQUFDOzs7SUFHRixRQUFRLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQzs7O0lBR25DLElBQUksZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQzs7SUFFM0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFO01BQzVDLEtBQUssRUFBRSxTQUFTLEtBQUssR0FBRztRQUN0QixJQUFJLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDOztRQUV2RCxJQUFJLHlCQUF5QixFQUFFO1VBQzdCLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsT0FBTyxJQUFJLENBQUM7T0FDYjtLQUNGLENBQUMsQ0FBQztHQUNKLENBQUMsT0FBTyxDQUFDLEVBQUU7SUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2hCOztFQUVELE9BQU8sUUFBUSxDQUFDO0NBQ2pCLENBQUM7O09BRUs7Ozs7Ozs7T0FPQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsSUFBSSxlQUFlLEdBQUcsdUJBQXVCLENBQUM7QUFDOUMsSUFBSSxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQzs7QUFFaEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxVQUFVLGdCQUFnQixFQUFFLFFBQVEsRUFBRTtFQUNyRCxRQUFRLENBQUMsTUFBTSxHQUFHLFVBQVUsR0FBRyxFQUFFO0lBQy9CLElBQUksYUFBYSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkQsYUFBYSxDQUFDLElBQUksQ0FBQztNQUNqQixHQUFHLEVBQUUsR0FBRztNQUNSLFFBQVEsRUFBRSxNQUFNO0tBQ2pCLEVBQUUsVUFBVSxDQUFDLEVBQUU7O0tBRWYsQ0FBQyxDQUFDO0dBQ0osQ0FBQzs7RUFFRixRQUFRLENBQUMsT0FBTyxHQUFHLFVBQVUsR0FBRyxFQUFFO0lBQ2hDLElBQUksWUFBWSxHQUFHLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JELFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDM0IsQ0FBQzs7RUFFRixRQUFRLENBQUMsTUFBTSxHQUFHLFVBQVUsV0FBVyxFQUFFO0lBQ3ZDLElBQUksWUFBWSxHQUFHLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3JELFlBQVksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7R0FDbEMsQ0FBQzs7RUFFRixPQUFPLFFBQVEsQ0FBQztDQUNqQixDQUFDOztPQUVLOzs7Ozs7O09BT0EsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLElBQUksYUFBYSxHQUFHLHFCQUFxQixDQUFDOztBQUUxQyxNQUFNLENBQUMsT0FBTyxHQUFHLFVBQVUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFO0VBQ3BELFNBQVMsYUFBYSxDQUFDLElBQUksRUFBRTtJQUMzQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUM1QixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JCOzs7OztJQUtELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0dBQzNCOztFQUVELFNBQVMsY0FBYyxDQUFDLEtBQUssRUFBRTtJQUM3QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtNQUM3QixLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3ZCO0lBQ0QsT0FBTyxLQUFLLENBQUM7R0FDZDs7RUFFRCxTQUFTLE9BQU8sQ0FBQyxPQUFPLEVBQUU7SUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7SUFDN0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7O0lBRWQsSUFBSSxPQUFPLFlBQVksT0FBTyxFQUFFO01BQzlCLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLEVBQUUsSUFBSSxFQUFFO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO09BQzFCLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDVixNQUFNLElBQUksT0FBTyxFQUFFO01BQ2xCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxJQUFJLEVBQUU7UUFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7T0FDbEMsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNWO0dBQ0Y7O0VBRUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxJQUFJLEVBQUUsS0FBSyxFQUFFO0lBQ2hELElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztHQUM1RCxDQUFDOztFQUVGLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsSUFBSSxFQUFFO0lBQ3pDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztHQUN0QyxDQUFDOztFQUVGLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFVBQVUsSUFBSSxFQUFFO0lBQ3RDLElBQUksR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0dBQy9DLENBQUM7O0VBRUYsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxJQUFJLEVBQUU7SUFDdEMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztHQUNyRCxDQUFDOztFQUVGLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFVBQVUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUM3QyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7R0FDekQsQ0FBQzs7RUFFRixPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLFFBQVEsRUFBRSxPQUFPLEVBQUU7OztJQUN2RCxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7TUFDekIsSUFBSUEsTUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDakMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUVBLE1BQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFQSxNQUFJLENBQUMsQ0FBQztPQUNwRDtLQUNGO0dBQ0YsQ0FBQzs7RUFFRixTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUU7SUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO01BQ2pCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0tBQ3REO0lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7R0FDdEI7O0VBRUQsU0FBUyxJQUFJLEdBQUc7SUFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzs7SUFFdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLElBQUksRUFBRSxPQUFPLEVBQUU7TUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7TUFDdEIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7T0FDdkIsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ2hCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO09BQ3JCLE1BQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7T0FDOUM7S0FDRixDQUFDOztJQUVGLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWTtNQUN0QixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDOUIsT0FBTyxRQUFRLEdBQUcsUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQzlELENBQUM7O0lBRUYsSUFBSSxDQUFDLElBQUksR0FBRyxZQUFZO01BQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDckMsQ0FBQzs7SUFFRixPQUFPLElBQUksQ0FBQztHQUNiOzs7RUFHRCxJQUFJLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7O0VBRWxFLFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRTtJQUMvQixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxNQUFNLENBQUM7R0FDekQ7O0VBRUQsU0FBUyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRTtJQUMvQixPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUN4QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3hCLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7TUFDMUMsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQ2xCLE1BQU0sSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7T0FDckM7TUFDRCxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7TUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO01BQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO09BQzNDO01BQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO01BQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztNQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ1QsSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDdkIsS0FBSyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7T0FDdkI7S0FDRixNQUFNO01BQ0wsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7S0FDbEI7O0lBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDO0lBQ3JFLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7TUFDcEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDN0M7SUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO0lBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOztJQUVyQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxNQUFNLEtBQUssSUFBSSxFQUFFO01BQzdELE1BQU0sSUFBSSxTQUFTLENBQUMsMkNBQTJDLENBQUMsQ0FBQztLQUNsRTtJQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQy9COztFQUVELE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFlBQVk7SUFDcEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUMxQixDQUFDOztFQUVGLFNBQVMsT0FBTyxDQUFDLEdBQUcsRUFBRTtJQUNwQixJQUFJLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ3pCLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsTUFBTSxFQUFFO01BQzlCLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDckMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO01BQy9CLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7TUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDekIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxJQUFJLENBQUM7R0FDYjs7RUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQzs7RUFFN0IsU0FBUyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRTtJQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFO01BQ1osT0FBTyxHQUFHLEVBQUUsQ0FBQztLQUNkOztJQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO0lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUN6RCxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztJQUN0RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ25DOztFQUVELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDOztFQUU5QixRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxZQUFZO0lBQ3JDLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtNQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07TUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO01BQzNCLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO01BQ2xDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztLQUNkLENBQUMsQ0FBQztHQUNKLENBQUM7O0VBRUYsUUFBUSxDQUFDLEtBQUssR0FBRyxZQUFZO0lBQzNCLElBQUksUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakUsUUFBUSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7SUFDeEIsT0FBTyxRQUFRLENBQUM7R0FDakIsQ0FBQzs7RUFFRixJQUFJLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVqRCxRQUFRLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxFQUFFLE1BQU0sRUFBRTtJQUN6QyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtNQUMzQyxNQUFNLElBQUksVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUM7S0FDN0M7O0lBRUQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDM0UsQ0FBQzs7RUFFRixJQUFJLEtBQUssR0FBRyxTQUFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFO0lBQ3RDLE9BQU8sSUFBSSxPQUFPLENBQUMsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO01BQzVDLElBQUksT0FBTyxDQUFDO01BQ1osSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNuRCxPQUFPLEdBQUcsS0FBSyxDQUFDO09BQ2pCLE1BQU07UUFDTCxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ3BDOztNQUVELElBQUksTUFBTSxHQUFHO1FBQ1gsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1FBQ2hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtRQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWE7T0FDMUQsQ0FBQzs7TUFFRixJQUFJLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxXQUFXLEVBQUU7UUFDNUMsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO09BQ2pDOztNQUVELE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7O01BRTdELElBQUksV0FBVyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQztNQUN4RCxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsUUFBUSxFQUFFO1FBQ3RDLElBQUk7VUFDRixPQUFPLFFBQVEsS0FBSyxRQUFRLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztVQUNsRSxJQUFJLElBQUksR0FBRyxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7O1VBRTdGLElBQUksR0FBRyxHQUFHLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtZQUMzQixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7V0FDakIsQ0FBQyxDQUFDO1VBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2QsQ0FBQyxPQUFPLEdBQUcsRUFBRTtVQUNaLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNiO09BQ0YsRUFBRSxVQUFVLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM1QixDQUFDLENBQUM7R0FDSixDQUFDOztFQUVGLE9BQU87SUFDTCxLQUFLLEVBQUUsS0FBSztJQUNaLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFFBQVEsRUFBRSxRQUFRO0dBQ25CLENBQUM7Q0FDSCxDQUFDOztPQUVLOzs7Ozs7O09BT0EsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLElBQUksWUFBWSxHQUFHLFlBQVksRUFBRSxTQUFTLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksT0FBTyxJQUFJLFVBQVUsRUFBRSxFQUFBLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sVUFBVSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksVUFBVSxFQUFFLEVBQUEsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFBLENBQUMsSUFBSSxXQUFXLEVBQUUsRUFBQSxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBQSxDQUFDLE9BQU8sV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7QUFFcGpCLFNBQVMsZUFBZSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxZQUFZLFdBQVcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTs7QUFFekosU0FBUywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsMkRBQTJELENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTs7QUFFaFAsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDBEQUEwRCxHQUFHLE9BQU8sVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRSxFQUFBLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsRUFBQSxFQUFFOztBQUU5ZSxJQUFJLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQztBQUMxQyxJQUFJLFdBQVcsR0FBRyxtQkFBbUIsMEJBQTBCLENBQUMsQ0FBQyxDQUFDOztBQUVsRSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDZixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUN6QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDOztBQUViLElBQUksVUFBVSxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixDQUFDLENBQUM7O0FBRS9HLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxnQkFBZ0IsRUFBRTtFQUMzQyxJQUFJLE1BQU0sRUFBRSxLQUFLLENBQUM7O0VBRWxCLElBQUksY0FBYyxJQUFJLEtBQUssR0FBRyxNQUFNLEdBQUcsVUFBVSxZQUFZLEVBQUU7SUFDN0QsU0FBUyxDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQzs7O0lBR3hDLFNBQVMsY0FBYyxHQUFHO01BQ3hCLGVBQWUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7O01BRXRDLElBQUksS0FBSyxHQUFHLDBCQUEwQixDQUFDLElBQUksRUFBRSxDQUFDLGNBQWMsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs7TUFFN0gsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7TUFDdEIsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7TUFDdEIsS0FBSyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO01BQzFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO01BQ3hCLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO01BQ2xCLEtBQUssQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO01BQzFCLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO01BQ2pCLEtBQUssQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO01BQ3RCLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO01BQ2xCLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO01BQ3ZCLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO01BQ3hCLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO01BQ3JCLEtBQUssQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO01BQ3JCLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO01BQ2xCLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOztNQUV4QixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7TUFDZixPQUFPLEtBQUssQ0FBQztLQUNkOztJQUVELFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztNQUM1QixHQUFHLEVBQUUsUUFBUTtNQUNiLEtBQUssRUFBRSxTQUFTLE1BQU0sR0FBRztRQUN2QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O1FBRWhCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUM7O1FBRXBDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO09BQ3hCO0tBQ0YsRUFBRTtNQUNELEdBQUcsRUFBRSx1QkFBdUI7TUFDNUIsS0FBSyxFQUFFLFNBQVMscUJBQXFCLEdBQUc7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7O1VBRXpCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsVUFBVSxFQUFFO1VBQ3BELE9BQU8sVUFBVSxHQUFHLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztPQUNqQjtLQUNGLEVBQUU7TUFDRCxHQUFHLEVBQUUsbUJBQW1CO01BQ3hCLEtBQUssRUFBRSxTQUFTLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtRQUN4QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDakUsT0FBTyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7T0FDM0M7S0FDRixFQUFFO01BQ0QsR0FBRyxFQUFFLGtCQUFrQjtNQUN2QixLQUFLLEVBQUUsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO1FBQzlDLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO1VBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNoRDtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO09BQ3JEO0tBQ0YsRUFBRTtNQUNELEdBQUcsRUFBRSxNQUFNO01BQ1gsS0FBSyxFQUFFLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFOztRQUV2QyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtVQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7U0FDakQ7UUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUU7O1VBRWpDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztTQUNoRTtRQUNELElBQUksQ0FBQyxHQUFHLEVBQUU7VUFDUixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7U0FDN0M7UUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztPQUNqQztLQUNGLEVBQUU7TUFDRCxHQUFHLEVBQUUsTUFBTTtNQUNYLEtBQUssRUFBRSxTQUFTLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDekIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDOztRQUVsQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtVQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7U0FDaEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7VUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzs7UUFFbEIsSUFBSSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDOztRQUV4RCxXQUFXLENBQUM7VUFDVixNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87VUFDcEIsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJO1VBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1VBQ3RCLElBQUksRUFBRSxJQUFJO1VBQ1YsSUFBSSxFQUFFLE1BQU07U0FDYixFQUFFLFVBQVUsUUFBUSxFQUFFO1VBQ3JCLElBQUk7WUFDRixPQUFPLFFBQVEsS0FBSyxRQUFRLEtBQUssUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzs7WUFFbEUsTUFBTSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUN4QyxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztZQUU1QyxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUU7Y0FDZixNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7YUFDbEMsTUFBTTtjQUNMLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxFQUFFLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxNQUFNLEVBQUU7Z0JBQ2xFLE1BQU0sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztlQUNsQztjQUNELE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQ3pCO1dBQ0YsQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFOztVQUVoQixNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQyxFQUFFLFVBQVUsUUFBUSxFQUFFO1VBQ3JCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztVQUNoQyxNQUFNLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7VUFDeEMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztVQUM1QyxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUMzQyxDQUFDLENBQUM7T0FDSjtLQUNGLEVBQUU7TUFDRCxHQUFHLEVBQUUsT0FBTztNQUNaLEtBQUssRUFBRSxTQUFTLEtBQUssR0FBRztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzs7Ozs7O1FBTXJCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtVQUN6SCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7VUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMvQjs7UUFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7T0FDZjtLQUNGLEVBQUU7TUFDRCxHQUFHLEVBQUUsb0JBQW9CO01BQ3pCLEtBQUssRUFBRSxTQUFTLGtCQUFrQixDQUFDLGVBQWUsRUFBRTtRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsSUFBSSxJQUFJLENBQUM7UUFDL0MsSUFBSSxPQUFPLEdBQUcsZUFBZSxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxZQUFZLEVBQUUsVUFBVSxFQUFFO1VBQy9GLFlBQVksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7VUFDN0QsT0FBTyxZQUFZLENBQUM7U0FDckIsRUFBRSxFQUFFLENBQUMsQ0FBQztPQUNSO0tBQ0YsRUFBRTtNQUNELEdBQUcsRUFBRSxlQUFlO01BQ3BCLEtBQUssRUFBRSxTQUFTLGFBQWEsQ0FBQyxRQUFRLEVBQUU7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDakQsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRTtVQUMxQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1dBQ3ZDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtjQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7YUFDekMsTUFBTTtjQUNMLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUN2QztXQUNGLE1BQU07WUFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7V0FDdEM7VUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7U0FDekM7T0FDRjtLQUNGLEVBQUU7TUFDRCxHQUFHLEVBQUUsY0FBYztNQUNuQixHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7UUFDbEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO09BQzNCO01BQ0QsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLFlBQVksRUFBRTtRQUM5QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7VUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxHQUFHLDhEQUE4RCxDQUFDLENBQUM7U0FDN0o7O1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7T0FDbkM7S0FDRixFQUFFO01BQ0QsR0FBRyxFQUFFLGNBQWM7TUFDbkIsR0FBRyxFQUFFLFNBQVMsR0FBRyxHQUFHO1FBQ2xCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxNQUFNLEVBQUU7VUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsSUFBSSwwQ0FBMEMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDaks7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxFQUFFO1VBQzdCLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7T0FDdkI7S0FDRixFQUFFO01BQ0QsR0FBRyxFQUFFLFVBQVU7TUFDZixHQUFHLEVBQUUsU0FBUyxHQUFHLEdBQUc7UUFDbEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQzs7UUFFckMsSUFBSSxZQUFZLEtBQUssRUFBRSxJQUFJLFlBQVksS0FBSyxNQUFNLEVBQUU7VUFDbEQsT0FBTyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQzFFOztRQUVELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7VUFDNUIsT0FBTyxJQUFJLENBQUM7U0FDYjtPQUNGO0tBQ0YsQ0FBQyxDQUFDLENBQUM7O0lBRUosT0FBTyxjQUFjLENBQUM7R0FDdkIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzs7O0VBRzlMLE9BQU8sY0FBYyxDQUFDO0NBQ3ZCLENBQUM7O09BRUs7Ozs7Ozs7T0FPQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7O0FBWWIsSUFBSSxPQUFPLEdBQUcsbUJBQW1CLGtCQUFrQixDQUFDLENBQUMsQ0FBQTtBQUNyRCxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFBO0FBQ2pDLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUE7QUFDakMsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQTs7Ozs7Ozs7Ozs7OztBQWE3QixTQUFTLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUU7SUFDN0MsSUFBSSxJQUFJLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3ZDLE9BQU8sSUFBSSxJQUFJLElBQUksRUFBRTtRQUNqQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLFFBQVE7U0FDdkI7UUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtLQUNuQjtJQUNELE9BQU8sSUFBSTtDQUNkOzs7Ozs7Ozs7O0FBVUQsU0FBUyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtJQUN2RCxJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFDaEUsUUFBUSxHQUFHLElBQUksQ0FBQTtLQUNsQjs7SUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUE7SUFDZixJQUFJLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdkMsT0FBTyxJQUFJLElBQUksSUFBSSxFQUFFO1FBQ2pCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7O1lBRXpCLElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtnQkFDZCxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTthQUMzQztpQkFDSTtnQkFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7YUFDeEI7U0FDSjthQUNJO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQTtTQUNkOztRQUVELElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFBO0tBQ25COzs7SUFHRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7UUFDbEIsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2QsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUE7U0FDOUQ7YUFDSTtZQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQTtTQUMzQztLQUNKO0NBQ0o7Ozs7Ozs7Ozs7Ozs7QUFhRCxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUF1QixHQUFHLFNBQVMsZUFBZSxFQUFFLEtBQUssRUFBRTs7Ozs7SUFLdEUsU0FBUyxXQUFXLEdBQUc7UUFDbkIsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtLQUM3Qjs7SUFFRCxJQUFJLFVBQVUsR0FBRztRQUNiLFdBQVcsRUFBRTtZQUNULEtBQUssRUFBRSxXQUFXO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxJQUFJO1NBQ2pCO0tBQ0osQ0FBQTs7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFO1FBQ3pCLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUc7WUFDdEIsR0FBRyxFQUFFLFdBQVc7Z0JBQ1osT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO2FBQzFDO1lBQ0QsR0FBRyxFQUFFLFNBQVMsUUFBUSxFQUFFO2dCQUNwQixvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO2FBQzdDO1lBQ0QsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7U0FDbkIsQ0FBQTtLQUNKLENBQUMsQ0FBQTs7SUFFRixXQUFXLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQTs7SUFFNUUsT0FBTyxXQUFXO0NBQ3JCLENBQUE7OztPQUdNOzs7Ozs7O09BT0EsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7Ozs7Ozs7Ozs7OztBQVliLElBQUksZUFBZSxHQUFHLG1CQUFtQixrQkFBa0IsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFBOzs7Ozs7Ozs7Ozs7QUFZN0UsSUFBSSwrQkFBK0I7SUFDL0IsZUFBZSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7Ozs7Ozs7O0FBUXRELElBQUksYUFBYSxHQUFHLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQTs7Ozs7Ozs7QUFRcEQsSUFBSSxxQkFBcUIsR0FBRyxlQUFlLENBQUMsdUJBQXVCLENBQUMsQ0FBQTs7Ozs7Ozs7QUFRcEUsSUFBSSxjQUFjLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUE7Ozs7Ozs7O0FBUXRELElBQUksMEJBQTBCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUMzQyxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMzQixLQUFLLEVBQUUsU0FBUyxlQUFlLEdBQUc7WUFDOUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQzVCLElBQUksT0FBTyxDQUFDLENBQUMsZUFBZSxLQUFLLFVBQVUsRUFBRTtnQkFDekMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFBO2FBQ3RCO1NBQ0o7UUFDRCxRQUFRLEVBQUUsSUFBSTtRQUNkLFlBQVksRUFBRSxJQUFJO0tBQ3JCLENBQUM7O0lBRUYsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxLQUFLLEVBQUUsU0FBUyx3QkFBd0IsR0FBRztZQUN2QyxJQUFJLENBQUMsK0JBQStCLENBQUMsR0FBRyxJQUFJLENBQUE7O1lBRTVDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUM1QixJQUFJLE9BQU8sQ0FBQyxDQUFDLHdCQUF3QixLQUFLLFVBQVUsRUFBRTtnQkFDbEQsQ0FBQyxDQUFDLHdCQUF3QixFQUFFLENBQUE7YUFDL0I7U0FDSjtRQUNELFFBQVEsRUFBRSxJQUFJO1FBQ2QsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQzs7SUFFRixjQUFjLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMxQixLQUFLLEVBQUUsU0FBUyxjQUFjLEdBQUc7WUFDN0IsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsRUFBRTtnQkFDN0IsTUFBTTthQUNUO1lBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLElBQUksQ0FBQTthQUM3Qjs7WUFFRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDNUIsSUFBSSxPQUFPLENBQUMsQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUFFO2dCQUN4QyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUE7YUFDckI7U0FDSjtRQUNELFFBQVEsRUFBRSxJQUFJO1FBQ2QsWUFBWSxFQUFFLElBQUk7S0FDckIsQ0FBQzs7SUFFRixnQkFBZ0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzVCLEdBQUcsRUFBRSxTQUFTLGdCQUFnQixHQUFHO1lBQzdCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUM3QjtRQUNELFVBQVUsRUFBRSxJQUFJO1FBQ2hCLFlBQVksRUFBRSxJQUFJO0tBQ3JCLENBQUM7Q0FDTCxDQUFDLENBQUE7Ozs7OztBQU1GLE1BQU0sQ0FBQyxPQUFPLENBQUMsK0JBQStCLEdBQUcsK0JBQStCLENBQUE7QUFDaEYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQTs7Ozs7Ozs7Ozs7OztBQWE1RCxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixHQUFHLFNBQVMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRTtJQUNoRixJQUFJLFNBQVM7UUFDVCxPQUFPLEtBQUssQ0FBQyxTQUFTLEtBQUssUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtLQUNyRSxDQUFBO0lBQ0QsSUFBSSxrQkFBa0IsR0FBRztRQUNyQixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDO1FBQzNDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQztRQUM5QyxhQUFhLEVBQUUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUM7UUFDckQsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDO1FBQ3hDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUM7UUFDMUQsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQztRQUNoRSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUM7UUFDL0MsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDO0tBQzlDLENBQUE7SUFDRCxrQkFBa0IsQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDcEYsa0JBQWtCLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNsRSxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDMUUsa0JBQWtCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUE7OztJQUduRCxJQUFJLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxXQUFXLEVBQUU7UUFDckMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBO0tBQ3RFOztJQUVELE9BQU8sTUFBTSxDQUFDLE1BQU07UUFDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsMEJBQTBCLENBQUM7UUFDaEQsa0JBQWtCO0tBQ3JCO0NBQ0osQ0FBQTs7O09BR007Ozs7Ozs7T0FPQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsSUFBSSxZQUFZLEdBQUcsWUFBWSxFQUFFLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFLEVBQUEsVUFBVSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxVQUFVLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEVBQUUsSUFBSSxVQUFVLEVBQUUsRUFBQSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEVBQUEsQ0FBQyxJQUFJLFdBQVcsRUFBRSxFQUFBLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFBLENBQUMsT0FBTyxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztBQUVwakIsU0FBUywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sSUFBSSxjQUFjLENBQUMsMkRBQTJELENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLEtBQUssT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsRUFBRTs7QUFFaFAsU0FBUyxTQUFTLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLDBEQUEwRCxHQUFHLE9BQU8sVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRSxFQUFBLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsRUFBQSxFQUFFOztBQUU5ZSxTQUFTLGVBQWUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsWUFBWSxXQUFXLENBQUMsRUFBRSxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxFQUFFLEVBQUU7O0FBRXpKLElBQUksV0FBVyxHQUFHLG1CQUFtQiwwQkFBMEIsQ0FBQyxDQUFDLENBQUM7O0FBRWxFLElBQUksaUJBQWlCLEdBQUcsd0JBQXdCLENBQUM7O0FBRWpELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztBQUNuQixJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7QUFDYixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDaEIsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDOztBQUVmLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQzs7QUFFeEIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDOzs7Ozs7Ozs7OztBQVc3RCxJQUFJLGNBQWMsR0FBRyxTQUFTLGNBQWMsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFO0VBQ2hFLGVBQWUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7O0VBRXRDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0VBQzVCLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0NBQ3BDLENBQUM7O0FBRUYsTUFBTSxDQUFDLE9BQU8sR0FBRyxVQUFVLGdCQUFnQixFQUFFO0VBQzNDLElBQUksTUFBTSxFQUFFLEtBQUssQ0FBQzs7Ozs7Ozs7RUFRbEIsSUFBSSxTQUFTLElBQUksS0FBSyxHQUFHLE1BQU0sR0FBRyxVQUFVLFlBQVksRUFBRTtJQUN4RCxTQUFTLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDOztJQUVuQyxTQUFTLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFO01BQ2pDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7O01BRWpDLElBQUksS0FBSyxHQUFHLDBCQUEwQixDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs7TUFFbkgsSUFBSSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs7TUFFcEQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7TUFDcEMsS0FBSyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7TUFDOUIsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7O01BRTVCLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDaEMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztPQUN4RCxDQUFDLENBQUM7O01BRUgsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsRUFBRTtRQUM3QixLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN4QixLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7T0FDakQsQ0FBQyxDQUFDOztNQUVILFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDOUIsS0FBSyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDMUIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUU7VUFDOUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJO1VBQ2IsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNO1NBQ2xCLENBQUMsQ0FBQyxDQUFDO09BQ0wsQ0FBQyxDQUFDOztNQUVILFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUU7UUFDOUIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztPQUN0RCxDQUFDLENBQUM7TUFDSCxPQUFPLEtBQUssQ0FBQztLQUNkOztJQUVELFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztNQUN2QixHQUFHLEVBQUUsT0FBTztNQUNaLEtBQUssRUFBRSxTQUFTLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO1FBQ2xDLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxPQUFPLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUU7VUFDN0QsT0FBTztTQUNSOztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDO1FBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztPQUNwQztLQUNGLEVBQUU7TUFDRCxHQUFHLEVBQUUsTUFBTTtNQUNYLEtBQUssRUFBRSxTQUFTLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDekIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7VUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7VUFDMUIsT0FBTztTQUNSOztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztPQUMxQztLQUNGLENBQUMsQ0FBQyxDQUFDOztJQUVKLE9BQU8sU0FBUyxDQUFDO0dBQ2xCLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQzs7O0VBRy9JLE9BQU8sU0FBUyxDQUFDO0NBQ2xCLENBQUM7O09BRUs7Ozs7Ozs7T0FPQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsSUFBSSxZQUFZLEdBQUcsb0JBQW9CLENBQUM7O0FBRXhDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUU7RUFDckQsSUFBSSxVQUFVLEdBQUcsU0FBUyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtJQUNsRCxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztHQUN0RSxDQUFDOztFQUVGLElBQUksV0FBVyxHQUFHLFNBQVMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDcEQsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7R0FDdEUsQ0FBQzs7RUFFRixJQUFJLFlBQVksR0FBRyxTQUFTLFlBQVksQ0FBQyxDQUFDLEVBQUU7SUFDMUMsSUFBSSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDM0MsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUN2QixDQUFDOztFQUVGLElBQUksYUFBYSxHQUFHLFNBQVMsYUFBYSxDQUFDLENBQUMsRUFBRTtJQUM1QyxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ3hCLENBQUM7O0VBRUYsSUFBSSxxQkFBcUIsR0FBRyxTQUFTLHFCQUFxQixDQUFDLFFBQVEsRUFBRTtJQUNuRSxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQyxPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0dBQ3ZDLENBQUM7O0VBRUYsSUFBSSxvQkFBb0IsR0FBRyxTQUFTLG9CQUFvQixDQUFDLENBQUMsRUFBRTtJQUMxRCxJQUFJLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ3ZCLENBQUM7O0VBRUYsT0FBTztJQUNMLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFlBQVksRUFBRSxZQUFZO0lBQzFCLFdBQVcsRUFBRSxXQUFXO0lBQ3hCLGFBQWEsRUFBRSxhQUFhO0lBQzVCLHFCQUFxQixFQUFFLHFCQUFxQjtJQUM1QyxvQkFBb0IsRUFBRSxvQkFBb0I7R0FDM0MsQ0FBQztDQUNILENBQUM7O09BRUs7Ozs7Ozs7T0FPQSxTQUFTLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUU7O0FBRXRELFlBQVksQ0FBQzs7O0FBR2IsTUFBTSxDQUFDLE9BQU8sR0FBRyxZQUFZO0VBQzNCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztFQUNoQixJQUFJLEtBQUssR0FBRyxtRUFBbUUsQ0FBQzs7OztFQUloRixNQUFNLENBQUMsSUFBSSxHQUFHLFVBQVUsS0FBSyxFQUFFO0lBQzdCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4Qjs7SUFFQSxJQUFJLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFOzs7O0lBSXRELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQzs7SUFFM0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtNQUNuRCxRQUFRLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO01BQ3hDLElBQUksUUFBUSxHQUFHLElBQUksRUFBRTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLDBGQUEwRixDQUFDLENBQUM7T0FDN0c7TUFDRCxLQUFLLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7S0FDL0I7SUFDRCxPQUFPLE1BQU0sQ0FBQztHQUNmLENBQUM7Ozs7RUFJRixNQUFNLENBQUMsSUFBSSxHQUFHLFVBQVUsS0FBSyxFQUFFO0lBQzdCLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO01BQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUVBQW1FLENBQUMsQ0FBQztLQUN0RjtJQUNEOztJQUVBLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUU7O0lBRTVDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDOztJQUUxQixDQUFDLE1BQU0sS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0sR0FBRyxNQUFNOzs7SUFHbkQsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7O01BRXhFLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ2hDO0lBQ0QsT0FBTyxNQUFNLENBQUM7R0FDZixDQUFDOztFQUVGLE9BQU8sTUFBTSxDQUFDO0NBQ2YsQ0FBQzs7T0FFSzs7Ozs7OztPQU9BLFNBQVMsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRTs7QUFFdEQsWUFBWSxDQUFDOzs7QUFHYixTQUFTLGVBQWUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUU7O0FBRWpOLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxXQUFXLEVBQUU7RUFDdEMsSUFBSSxtQkFBbUIsQ0FBQzs7RUFFeEIsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDOztFQUVyQixXQUFXLENBQUMsTUFBTSxJQUFJLG1CQUFtQixHQUFHO0lBQzFDLGdCQUFnQixFQUFFLENBQUM7SUFDbkIsY0FBYyxFQUFFLENBQUM7SUFDakIsZUFBZSxFQUFFLFdBQVc7SUFDNUIsYUFBYSxFQUFFLENBQUM7SUFDaEIsV0FBVyxFQUFFLENBQUM7SUFDZCxVQUFVLEVBQUUsV0FBVztJQUN2QixpQkFBaUIsRUFBRSxXQUFXO0lBQzlCLGVBQWUsRUFBRSxXQUFXO0lBQzVCLFlBQVksRUFBRSxXQUFXO0lBQ3pCLHFCQUFxQixFQUFFLFdBQVc7R0FDbkMsRUFBRSxlQUFlLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLFdBQVcsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLEVBQUUsZUFBZSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUMsRUFBRSxlQUFlLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLG1CQUFtQixFQUFFLDRCQUE0QixFQUFFLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBRSxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0VBQzlzQixXQUFXLENBQUMsR0FBRyxHQUFHLFlBQVk7SUFDNUIsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7R0FDeEQsQ0FBQzs7RUFFRixPQUFPLFdBQVcsQ0FBQztDQUNwQixDQUFDOztPQUVLOzs7Ozs7O09BT0EsU0FBUyxNQUFNLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFOztBQUV0RCxZQUFZLENBQUM7OztBQUdiLFNBQVMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksY0FBYyxDQUFDLDJEQUEyRCxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxLQUFLLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksS0FBSyxVQUFVLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7O0FBRWhQLFNBQVMsU0FBUyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsRUFBRSxJQUFJLE9BQU8sVUFBVSxLQUFLLFVBQVUsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQywwREFBMEQsR0FBRyxPQUFPLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLEVBQUUsRUFBQSxNQUFNLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEVBQUEsRUFBRTs7QUFFOWUsU0FBUyxlQUFlLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLFlBQVksV0FBVyxDQUFDLEVBQUUsRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLG1DQUFtQyxDQUFDLENBQUMsRUFBRSxFQUFFOztBQUV6SixNQUFNLENBQUMsT0FBTyxHQUFHLFlBQVk7RUFDM0IsSUFBSSxLQUFLLEdBQUcsU0FBUyxLQUFLLENBQUMsSUFBSSxFQUFFO0lBQy9CLElBQUksTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7SUFFcEYsZUFBZSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzs7SUFFN0IsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztHQUM5QyxDQUFDOztFQUVGLElBQUksV0FBVyxHQUFHLFVBQVUsTUFBTSxFQUFFO0lBQ2xDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7O0lBRS9CLFNBQVMsV0FBVyxDQUFDLElBQUksRUFBRTtNQUN6QixJQUFJLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7O01BRXBGLGVBQWUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7O01BRW5DLElBQUksS0FBSyxHQUFHLDBCQUEwQixDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDOztNQUVySSxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7TUFDN0IsT0FBTyxLQUFLLENBQUM7S0FDZDs7SUFFRCxPQUFPLFdBQVcsQ0FBQztHQUNwQixDQUFDLEtBQUssQ0FBQyxDQUFDOztFQUVULE9BQU87SUFDTCxLQUFLLEVBQUUsS0FBSztJQUNaLFdBQVcsRUFBRSxXQUFXO0dBQ3pCLENBQUM7Q0FDSCxDQUFDOztPQUVLO1VBQ0csQ0FBQyxDQUFDLEFBQUM7Ozs7O0FDcDFRYjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLEFBQ0EsQUFDQSxBQUNBLEFBRUEsbUJBQWU7RUFDYixTQUFBLE9BQU87RUFDUCxLQUFBLEdBQUc7RUFDSCxLQUFBLEdBQUc7RUFDSCxNQUFBaUQsTUFBSTtDQUNMLENBQUE7O0FDNUJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsQUFFQSxlQUFlOzs7RUFHYixVQUFVLEVBQUUsRUFBRTs7O0VBR2QsS0FBSyxFQUFFLEVBQUU7OztFQUdULFNBQVMsRUFBRSxFQUFFOzs7RUFHYixnQkFBZ0IsRUFBRSxVQUFVLFVBQVUsRUFBRTtJQUN0Q3pELElBQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUNsQixPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM1QyxPQUFPLE9BQU87R0FDZjs7Ozs7Ozs7Ozs7O0VBWUQsZ0JBQWdCLEVBQUUsVUFBVSxPQUFPLEVBQUU7SUFDbkNDLElBQUksVUFBVSxDQUFBO0lBQ2QsS0FBS0QsSUFBTSxDQUFDLElBQUksT0FBTyxFQUFFO01BQ3ZCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM3QixVQUFVLEdBQUcsQ0FBQyxDQUFBO09BQ2Y7S0FDRjtJQUNEQSxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3hDLElBQUksQ0FBQyxTQUFTLEVBQUU7TUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtLQUM3QztTQUNJO01BQ0hBLElBQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtNQUNsQixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFBO09BQ3hCLENBQUMsQ0FBQTtNQUNGLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1FBQ2xDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtVQUNyQixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtVQUNoQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDekI7T0FDRixDQUFDLENBQUE7TUFDRixLQUFLQSxJQUFNMEQsR0FBQyxJQUFJLE9BQU8sRUFBRTtRQUN2QixJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUNBLEdBQUMsQ0FBQyxFQUFFO1VBQzdCLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDQSxHQUFDLENBQUMsQ0FBQyxDQUFBO1NBQzNCO09BQ0Y7S0FDRjtJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0dBQzdDOzs7Ozs7Ozs7O0VBVUQsVUFBVSxFQUFFLFVBQVUsVUFBVSxFQUFFLElBQUksRUFBRTtJQUN0QzFELElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDeEMsSUFBSSxDQUFDLFNBQVMsRUFBRTtNQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtLQUNoQztTQUNJO01BQ0hDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFBO01BQ2hCLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFO1FBQ2xDQSxJQUFJLElBQUksQ0FBQTtRQUNSLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7VUFDdEIsT0FBTyxHQUFHLENBQUMsQ0FBQTtTQUNaO09BQ0YsQ0FBQyxDQUFBO01BQ0YsSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDbEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQTtPQUMxQjtXQUNJO1FBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtPQUNyQjtLQUNGO0dBQ0Y7Q0FDRixDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVHRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLEFBRUFELElBQU1rQixRQUFNLEdBQUc7RUFDYixXQUFXLEVBQUUsT0FBTztFQUNwQixLQUFLLEVBQUUsS0FBSztFQUNaLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQztFQUNoRCxTQUFTLEVBQUU7O0dBRVY7Q0FDRixDQUFBLEFBRUQsQUFBcUI7O0FDN0JyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLEFBRUEsQUFBTyxTQUFTLE9BQU8sRUFBRSxHQUFHLEVBQUU7RUFDNUIsT0FBTyxLQUFLLENBQUMsT0FBTztNQUNoQixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztNQUNsQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQztDQUMvRDs7QUFFRCxBQUFPLFNBQVMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFO0VBQ3RDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ2hCLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO0dBQzdCO0VBQ0RsQixJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQTtFQUNuQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7Q0FDbkM7O0FDaENEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQkE7O0FBSUEsQUFFQSxBQVlBLEFBQ0EsQUFFQSxBQUFPQSxJQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFBOztBQUVuREMsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBRTNCLENBQUMsQ0FBQyxTQUFTLGFBQWEsSUFBSTtFQUMzQixJQUFJO0lBQ0ZELElBQU0sSUFBSSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUE7SUFDeEIsSUFBSSxDQUFDLEdBQUcsR0FBRywwREFBMEQ7Z0JBQ3pELHlEQUF5RCxDQUFBO0lBQ3JFLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWTtNQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLGdCQUFnQixHQUFHLElBQUksQ0FBQTtPQUN4QjtLQUNGLENBQUE7R0FDRjtFQUNELE9BQU8sQ0FBQyxFQUFFOztHQUVUO0NBQ0YsQ0FBQyxFQUFFLENBQUE7O0FBRUpDLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUU3QixDQUFDLENBQUMsU0FBUyxlQUFlLElBQUk7RUFDN0JELElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7RUFDN0NBLElBQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUE7RUFDbEMsWUFBWSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxNQUFNLEVBQUU7SUFDaEUsT0FBTyxXQUFXO1FBQ2QsQ0FBQyxNQUFNLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLFFBQVE7R0FDYixDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtFQUNsQixrQkFBa0IsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtDQUNwRSxDQUFDLEVBQUUsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7QUFjSixBQUFPLFNBQVMsT0FBTyxFQUFFLEdBQUcsRUFBRTtFQUM1QixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDdkMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtDQUM5Qjs7QUFFRCxBQUFPLFNBQVMsV0FBVyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFO0VBQ2xEQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0VBQzVDLElBQUksS0FBSyxJQUFJLE9BQU8sRUFBRTtJQUNwQixLQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuQyxLQUFLLEdBQUcsSUFBSSxDQUFBO0dBQ2I7RUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFO0lBQ1YsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDdkMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUE7SUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQTtJQUMvQixRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO0dBQzVEO0VBQ0QsS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7Q0FDaEQ7O0FBRUQsQUFBTyxTQUFTLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtFQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0lBQ2pCLE9BQU8sRUFBRTtHQUNWO0VBQ0RELElBQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQTtFQUNkQSxJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUE7RUFDakJDLElBQUksR0FBRyxDQUFBO0VBQ1AsS0FBS0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDMUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNaLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO01BQ2YsUUFBUTtLQUNUO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQTtJQUNsQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0dBQ2Q7RUFDRCxPQUFPLEdBQUc7Q0FDWDs7QUFFRCxBQUFPLFNBQVMsVUFBVSxJQUFJO0VBQzVCLE9BQU8sZ0JBQWdCO0NBQ3hCOztBQUVELEFBQU8sU0FBUyxZQUFZLElBQUk7RUFDOUIsT0FBTyxrQkFBa0I7Q0FDMUI7O0FBRUQsQUFBTyxTQUFTLFNBQVMsRUFBRSxHQUFHLEVBQUU7RUFDOUJELElBQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQTtFQUN0QixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO0lBQ3ZDLEdBQUcsR0FBRyxXQUFXLENBQUE7R0FDbEI7RUFDREEsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUE7RUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSTtDQUM1RDs7QUFFRCxBQUFPLFNBQVMsTUFBTSxFQUFFLEtBQUssRUFBRTtFQUM3QkMsSUFBSSxLQUFLLENBQUE7RUFDVCxLQUFLLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQTtFQUNsQixLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO0VBQ3JFLElBQUksS0FBSyxFQUFFO0lBQ1QsT0FBTztNQUNMLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztNQUN6QixDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7TUFDekIsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQzFCO0dBQ0Y7RUFDRCxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO0VBQ3JELElBQUksS0FBSyxFQUFFO0lBQ1QsT0FBTztNQUNMLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3JCLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3JCLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3RCO0dBQ0Y7Q0FDRjs7OztBQUlELEFBQU8sU0FBUyxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUU7RUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUNqQixNQUFNO0dBQ1A7RUFDREEsSUFBSSxNQUFNLEdBQUcsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFBO0VBQ25ERCxJQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO0VBQ3RCLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFBO0VBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO0lBQ1gsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFBO0lBQ1YsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFBO0dBQ2pCO0VBQ0QsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0lBQ2IsT0FBTyxHQUFHO0dBQ1g7RUFDREMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFBO0VBQ1YsSUFBSSxNQUFNLEVBQUU7SUFDVixFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDdEIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7R0FDcEI7T0FDSTtJQUNILEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUE7SUFDNUIsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFBO0dBQzFCO0VBQ0QsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztDQUNyQjs7QUFFRCxBQUFPLFNBQVMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7RUFDcENBLElBQUksTUFBTSxDQUFBO0VBQ1ZBLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQTtFQUNsQkEsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFBO0VBQ2hCQSxJQUFJLE9BQU8sQ0FBQTtFQUNYQSxJQUFJLElBQUksQ0FBQTtFQUNSRCxJQUFNLEtBQUssR0FBRyxZQUFZO0lBQ3hCLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDckIsT0FBTyxHQUFHLElBQUksQ0FBQTtJQUNkLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtHQUNuQyxDQUFBO0VBQ0QsT0FBTyxZQUFZO0lBQ2pCQSxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDdEJBLElBQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQTtJQUN6QyxPQUFPLEdBQUcsSUFBSSxDQUFBO0lBQ2QsSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUM1QyxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUU7TUFDbEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO01BQ3JCLE9BQU8sR0FBRyxJQUFJLENBQUE7TUFDZCxRQUFRLEdBQUcsR0FBRyxDQUFBO01BQ2QsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO0tBQ25DO1NBQ0ksSUFBSSxDQUFDLE9BQU8sRUFBRTtNQUNqQixPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQTtLQUN2QztJQUNELE9BQU8sTUFBTTtHQUNkO0NBQ0Y7O0FBRUQsQUFBTyxTQUFTLFlBQVksRUFBRSxJQUFJLEVBQUU7RUFDbEMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFO0VBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxFQUFFO0lBQy9DLE9BQU8sQ0FBQSxHQUFFLElBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFBLENBQUU7R0FDOUIsQ0FBQztDQUNIOztBQUVELEFBQU8sU0FBUyxZQUFZLEVBQUUsSUFBSSxFQUFFO0VBQ2xDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRTtFQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtJQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2YsT0FBTyxDQUFBLEVBQUMsSUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUEsQ0FBRTtHQUM3QixDQUFDO0NBQ0g7O0FBRUQsQUFBTyxTQUFTLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtFQUNyQ0EsSUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUE7RUFDeEQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQzFCLE9BQU8sR0FBRztHQUNYO0VBQ0QsT0FBTyxNQUFNO0NBQ2Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqUEQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxBQUVBLEFBRUFBLElBQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQTs7QUFFckIsQUFBZSxTQUFTLE1BQU0sRUFBRSxRQUFRLEVBQUU7RUFDeEMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLE1BQU0sQ0FBQyxFQUFFO0lBQzdCLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDO0dBQzVCO0VBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFBO0VBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFBO0VBQzVCLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFBO0NBQ25DOztBQUVELFNBQVMsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUU7RUFDL0IsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7Q0FDMUI7O0FBRUQsTUFBTSxDQUFDLFNBQVMsR0FBRyxVQUFVLFVBQVUsRUFBRTtFQUN2QyxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUM7Q0FDOUIsQ0FBQTs7QUFFRCxNQUFNLENBQUMsU0FBUyxHQUFHOzs7RUFHakIsZUFBZSxFQUFFLFVBQVUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7SUFDdERBLElBQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7SUFDekIsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdkIsU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDakMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7TUFDckIsTUFBTSxFQUFFLFVBQVU7TUFDbEIsSUFBSSxFQUFFLElBQUk7S0FDWCxDQUFDLENBQUE7R0FDSDs7RUFFRCxTQUFTLEVBQUUsVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7SUFDM0MsSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3pDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO01BQ3JCLE1BQU0sRUFBRSxXQUFXO01BQ25CLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3pELENBQUMsQ0FBQTtHQUNIOztDQUVGLENBQUE7O0FDOUREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsQUFFQSxBQUNBLEFBQ0EsQUFDQTtBQUdBLFNBQVMsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtFQUNwRSxPQUFPLFdBQVcsQ0FBQyxVQUFVLEVBQUU7SUFDN0IsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO0lBQzVCLEtBQUEsR0FBRztJQUNILFFBQUEsTUFBTTtJQUNOLE1BQUEsSUFBSTtHQUNMLENBQUM7Q0FDSDs7O0FBR0QsU0FBUyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO0VBQ3BFLE9BQU8sV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQUEsTUFBTSxFQUFFLFFBQUEsTUFBTSxFQUFFLE1BQUEsSUFBSSxFQUFFLENBQUM7Q0FDekQ7Ozs7Ozs7O0FBUUQsU0FBUzJELFlBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtFQUNsRDFELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQTtFQUNkLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0lBQzdCLElBQUk7TUFDRixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtLQUMxQjtJQUNELE9BQU8sQ0FBQyxFQUFFO01BQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQTtLQUN2QztHQUNGO09BQ0ksSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7SUFDdkIsS0FBSyxHQUFHLEtBQUssQ0FBQTtHQUNkO0VBQ0RELElBQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7RUFDeEIsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDO2dDQUMvQixDQUFDLENBQUM7Z0NBQ0YsVUFBVSxDQUFBO0VBQ3hDLEtBQUtDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQzVCLFdBQVcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7R0FDbEM7Q0FDRjs7QUFFRCxTQUFTLFdBQVcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO0VBQ3RDRCxJQUFNLFdBQVcsR0FBRyxPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFBO0VBQ3REQSxJQUFNLEdBQUcsR0FBRyxXQUFXLEdBQUcsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFBOztFQUV4RkEsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQTtFQUNsQyxJQUFJLENBQUMsVUFBVTtPQUNWLFVBQVUsS0FBSyxDQUFDO09BQ2hCLFVBQVUsS0FBSyxHQUFHLENBQUM7T0FDbkIsVUFBVSxLQUFLLElBQUk7T0FDbkIsVUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFO0lBQ3RCLGVBQWUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUE7R0FDeEM7OztFQUdELE9BQU8sR0FBRztDQUNYOztBQUVELFNBQVMsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUU7RUFDckNBLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7RUFDOUJBLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7RUFDOUJDLElBQUksTUFBTSxFQUFFLE1BQU0sQ0FBQTtFQUNsQkQsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQTs7RUFFOUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRTtJQUM5QyxNQUFNO0dBQ1A7RUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUU7SUFDbEMsTUFBTTtHQUNQOztFQUVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJLENBQUM7Q0FDL0Q7O0FBRUQsU0FBUyxhQUFhLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRTtFQUN4Q0EsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtFQUNwQ0EsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQTtFQUNwQkEsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtFQUM5QkEsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQTs7RUFFOUNBLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLG1CQUFtQixFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0VBQ3hGLElBQUksQ0FBQyxJQUFJLEVBQUU7SUFDVCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSwrQkFBOEIsR0FBRSxHQUFHLG9CQUFnQixDQUFDLENBQUM7R0FDM0U7O0VBRURDLElBQUksTUFBTSxDQUFBOztFQUVWLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRTtJQUNoQyxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSx3QkFBdUIsR0FBRSxhQUFhLGtDQUE4QixHQUFFLFVBQVUsTUFBRSxDQUFDLENBQUM7R0FDMUc7O0VBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7Q0FDaEM7O0FBRUQsU0FBUyxlQUFlLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRTtFQUNoRCxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtDQUN6RDs7QUFFRCxTQUFTLFNBQVMsSUFBSTtFQUNwQixJQUFJaUIsUUFBTSxDQUFDLEtBQUssRUFBRTtJQUNoQixJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7TUFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO01BQ3RDLE1BQU07S0FDUDtJQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQTtHQUN4QztDQUNGOztBQUVELFNBQVMsNEJBQTRCLElBQUk7RUFDdkMsTUFBTSxDQUFDLFVBQVUsR0FBR3lDLFlBQVUsQ0FBQTtFQUM5QixNQUFNLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUE7RUFDaEQsTUFBTSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFBO0VBQzFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO0NBQzdCOztBQUVELGVBQWU7RUFDYixJQUFJLEVBQUUsWUFBWTs7SUFFaEIsNEJBQTRCLEVBQUUsQ0FBQTtHQUMvQjtDQUNGLENBQUE7O0FDbkpEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWtCQSxBQUVBLEFBQ0EsQUFDQSxBQUVBLEFBQXFDOztBQ3hCckM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxBQUVBLEFBRUEzRCxJQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQTtBQUM1QkMsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFBO0FBQ3BCQSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUE7O0FBRWYsU0FBUyxTQUFTLEVBQUUsU0FBUyxFQUFFO0VBQzdCRCxJQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQTtFQUNuQyxJQUFJLE1BQU07U0FDSCxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1dBQzlCLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUM1QyxPQUFPLElBQUk7R0FDWjtFQUNELE9BQU8sS0FBSztDQUNiOztBQUVELEFBQU8sU0FBUyxhQUFhLEVBQUUsU0FBUyxFQUFFO0VBQ3hDLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO0lBQ3hCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNqQyxJQUFJLENBQUMsUUFBUSxFQUFFO01BQ2IsUUFBUSxHQUFHLElBQUksQ0FBQTtNQUNmQSxJQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFBO01BQ3ZDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFBO0tBQ2xEO0dBQ0Y7Q0FDRjs7QUFFRCxBQUFPLFNBQVMsbUJBQW1CLEVBQUUsU0FBUyxFQUFFO0VBQzlDQSxJQUFNLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUE7RUFDbkQsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVO1NBQy9DLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVc7Q0FDeEQ7O0FBRUQsQUFBTyxTQUFTLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0VBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO09BQ3hELENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztDQUM1RDs7QUFFRCxBQUFPLFNBQVMsaUJBQWlCLEVBQUUsU0FBUyxFQUFFOztFQUU1Q0EsSUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUE7RUFDcEQsSUFBSSxDQUFDLGNBQWMsRUFBRTtJQUNuQixPQUFPLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztHQUN0QztFQUNELE9BQU8sbUJBQW1CLENBQUMsU0FBUyxDQUFDO09BQ2hDLGVBQWU7TUFDaEIsU0FBUyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtNQUN0QyxjQUFjLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Q0FDakQ7O0FBRUQsU0FBUyxRQUFRLEVBQUUsQ0FBQyxFQUFFO0VBQ3BCQyxJQUFJLFNBQVMsQ0FBQTs7RUFFYixJQUFJLENBQUMsQ0FBQyxZQUFZLEtBQUssV0FBVyxFQUFFO0lBQ2xDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFBO0dBQ3hCO09BQ0k7O0lBRUhELElBQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUE7SUFDeEIsU0FBUyxHQUFHLENBQUMsSUFBSSxPQUFPLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQTtJQUN4QyxPQUFPLEdBQUcsQ0FBQyxDQUFBO0dBQ1o7RUFDREEsSUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFBO0VBQ3BDLEtBQUtDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0lBQzVCRCxJQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN0Q0EsSUFBTSxNQUFNLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDM0MsSUFBSSxNQUFNLEVBQUU7TUFDVixTQUFTLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLFdBQUEsU0FBUyxFQUFFLENBQUMsQ0FBQTtLQUNqRDtTQUNJLElBQUksQ0FBQyxNQUFNLEVBQUU7TUFDaEIsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxXQUFBLFNBQVMsRUFBRSxDQUFDLENBQUE7S0FDcEQ7R0FDRjtDQUNGOztBQzdGRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsQUFFQSxBQUNBOzs7QUFJQUEsSUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUE7O0FBRTVCQSxJQUFNLFlBQVksR0FBRyxFQUFFLENBQUE7QUFDdkJBLElBQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQTtBQUNsQkEsSUFBTSxlQUFlLEdBQUc7RUFDdEIsVUFBVTtFQUNWLFdBQVc7RUFDWCxXQUFXO0VBQ1gsTUFBTTtFQUNOLE9BQU87RUFDUCxPQUFPO0NBQ1IsQ0FBQTs7QUFFRCxBQUFlLFNBQVMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFO0VBQzVDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFBO0VBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7RUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUE7RUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUE7RUFDdEIsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUE7Q0FDN0I7O0FBRUQsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLFVBQUEsVUFBVSxFQUFDLFNBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxHQUFBLENBQUE7O0FBRXJFLGdCQUFnQixDQUFDLGlCQUFpQixHQUFHLFVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtFQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFBO0NBQzNCLENBQUE7O0FBRUQsZ0JBQWdCLENBQUMsa0JBQWtCLEdBQUcsWUFBRyxTQUFHLGVBQWUsR0FBQSxDQUFBOztBQUUzRCxnQkFBZ0IsQ0FBQyxTQUFTLEdBQUc7O0VBRTNCLGVBQWUsMEJBQUEsSUFBSTtJQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtNQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJO1VBQzVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7VUFDaEMsSUFBSSxDQUFBO0tBQ1Q7SUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhO0dBQzFCOzs7RUFHRCxTQUFTLG9CQUFBLElBQUk7SUFDWCxTQUFTLGFBQWEsSUFBSTs7TUFFeEIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO01BQzVDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO0tBQzVCO0lBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO01BQ3hCLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUE7TUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVO1FBQy9CLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hCLGdCQUFnQjtPQUNqQixDQUFBO0tBQ0Y7U0FDSTtNQUNILE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQTtNQUM5QyxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVU7UUFDL0IsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEIsZ0JBQWdCO09BQ2pCLENBQUE7S0FDRjtHQUNGOztFQUVELFlBQVksdUJBQUEsRUFBRSxHQUFHLEVBQUU7SUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztHQUM5Qjs7RUFFRCxlQUFlLDBCQUFBLEVBQUUsR0FBRyxFQUFFO0lBQ3BCQSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUE7SUFDakIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDbkMsTUFBTTtLQUNQOztJQUVELENBQUMsU0FBUyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUU7TUFDaENBLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7TUFDckNBLElBQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUE7TUFDbENBLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFBO01BQ3BDLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDL0IsS0FBS0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7VUFDL0MsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQ2xDO09BQ0Y7O01BRUQsSUFBSSxTQUFTLEVBQUU7UUFDYixLQUFLRCxJQUFNLElBQUksSUFBSSxTQUFTLEVBQUU7VUFDNUIsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7U0FDdEQ7T0FDRjtNQUNELE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQTtNQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFBOztNQUU1QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7S0FDL0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0dBQ1I7O0VBRUQsYUFBYSx3QkFBQSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7SUFDN0JDLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEMsSUFBSSxDQUFDLGFBQWEsRUFBRTtNQUNsQixhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0tBQy9COztJQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQTtJQUN6QkQsSUFBTSxTQUFTLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ25EQSxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFBO0lBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFBO0lBQ2xDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQTs7SUFFNUMsT0FBTyxTQUFTO0dBQ2pCOzs7Ozs7RUFNRCxVQUFVLHFCQUFBLEVBQUUsT0FBTyxFQUFFO0lBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDOUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFO01BQzlCLE1BQU07S0FDUDs7SUFFREEsSUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQTtJQUM3QixPQUFPLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQTtJQUNyQixPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUE7SUFDOUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUE7O0lBRXJCQSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNsREEsSUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQzthQUMvRCxRQUFRLENBQUMsSUFBSSxDQUFBO0lBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBOztJQUVyQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFBO0dBQ3hCOztFQUVELFdBQVcsc0JBQUEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0lBQzVCQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBOztJQUV6QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO01BQzFDLE1BQU07S0FDUDs7SUFFRCxJQUFJLFNBQVMsS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUU7TUFDcEMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDMUIsSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU07UUFDckMsR0FBRyxFQUFFLE9BQU87T0FDYixDQUFDLENBQUE7TUFDRixNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtLQUN4Qjs7SUFFREQsSUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTs7Ozs7SUFLdEMsSUFBSSxLQUFLLEVBQUU7TUFDVCxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtLQUM1Qjs7SUFFRCxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO01BQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7S0FDekI7R0FDRjs7Ozs7Ozs7RUFRRCxhQUFhLHdCQUFBLEVBQUUsR0FBRyxFQUFFOzs7SUFDbEIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7TUFDaEIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxFQUFDLFNBQUdRLE1BQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUEsQ0FBQztLQUMzQztJQUNEUixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBOztJQUV4QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7O0lBRWhCLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUU7TUFDcENBLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO01BQ3JELFNBQVMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFBO01BQzFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUE7S0FDOUI7U0FDSSxJQUFJLENBQUMsU0FBUyxFQUFFO01BQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSxnQ0FBK0IsR0FBRSxHQUFHLHNCQUFrQixDQUFDLENBQUMsQ0FBQTtLQUN2RTtTQUNJO01BQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBLGdDQUErQixJQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUEsc0JBQWtCLENBQUMsQ0FBQyxDQUFBO0tBQ3ZGO0dBQ0Y7O0VBRUQsV0FBVyxzQkFBQSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO0lBQ2xDQSxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3hDQSxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzlDQSxJQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFBO0lBQ3hDQyxJQUFJLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMxQixJQUFJLENBQUMsU0FBUyxFQUFFO01BQ2QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUEsZ0NBQStCLEdBQUUsR0FBRyxzQkFBa0IsQ0FBQyxDQUFDO0tBQzlFO0lBQ0QsSUFBSSxDQUFDLFNBQVMsRUFBRTtNQUNkLE9BQU8sT0FBTyxDQUFDLEtBQUs7UUFDbEIsQ0FBQSxnQ0FBK0IsR0FBRSxTQUFTLHNCQUFrQixDQUFDLENBQUM7S0FDakU7O0lBRUQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUU7TUFDZCxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUE7TUFDVixPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUM7S0FDbEU7OztJQUdELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTs7SUFFaEIsUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFBO0lBQ2xDLElBQUksUUFBUTtXQUNMLFFBQVEsQ0FBQyxNQUFNO1dBQ2YsS0FBSyxLQUFLLENBQUMsQ0FBQztXQUNaLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFO01BQzlCLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0tBQy9EOzs7SUFHRCxJQUFJLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFO01BQ25ELFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUE7TUFDeEQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUMvQixLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtVQUMzQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxFQUFFO1lBQzNCLEtBQUs7V0FDTjtTQUNGO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1VBQ1QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7U0FDdEI7T0FDRjtLQUNGOztJQUVELFNBQVMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFBOztJQUV6QyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFBO0dBQ3ZEOztFQUVELFlBQVksdUJBQUEsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0lBQ3ZCQSxJQUFJLEtBQUssRUFBRSxNQUFNLENBQUE7SUFDakJELElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDckMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ25DLE1BQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQ3hELElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO01BQy9CLE1BQU07S0FDUDs7SUFFRCxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNoQyxJQUFJLEtBQUssRUFBRTtNQUNULEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQTtNQUNsQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtLQUNuQztTQUNJO01BQ0gsTUFBTTtLQUNQOztJQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFO01BQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7S0FDekI7R0FDRjs7Ozs7Ozs7OztFQVVELFVBQVUscUJBQUEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTs7SUFFckMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBOztJQUVoQkEsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUMzQyxJQUFJLENBQUMsTUFBTSxFQUFFO01BQ1gsTUFBTTtLQUNQO0lBQ0RBLElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFBOztJQUVyQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRTtNQUNkLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQTtNQUNWLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQztLQUNsRTtJQUNELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNO1dBQ3hCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSztXQUN2QixLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7TUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0tBQ2hEO1NBQ0k7TUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQTtLQUNyQztHQUNGOztFQUVELFFBQVEsbUJBQUEsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFO0lBQ25CQSxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3hDLElBQUksQ0FBQyxTQUFTLEVBQUU7TUFDZCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSxnQ0FBK0IsR0FBRSxHQUFHLHNCQUFrQixDQUFDLENBQUM7S0FDOUU7SUFDRCxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtHQUM3Qjs7RUFFRCxXQUFXLHNCQUFBLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtJQUN0QkEsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4QyxJQUFJLENBQUMsU0FBUyxFQUFFO01BQ2QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUEsZ0NBQStCLEdBQUUsR0FBRyxzQkFBa0IsQ0FBQyxDQUFDO0tBQzlFO0lBQ0QsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7R0FDL0I7O0VBRUQsV0FBVyxzQkFBQSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7SUFDdkJBLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDeEMsSUFBSSxDQUFDLFNBQVMsRUFBRTtNQUNkLE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBLGdDQUErQixHQUFFLEdBQUcsc0JBQWtCLENBQUMsQ0FBQztLQUM5RTtJQUNELFNBQVMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7R0FDN0I7Ozs7Ozs7Ozs7RUFVRCxXQUFXLHNCQUFBLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRTtJQUN2QkEsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4QyxJQUFJLENBQUMsU0FBUyxFQUFFO01BQ2QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUEsZ0NBQStCLEdBQUUsR0FBRyxzQkFBa0IsQ0FBQyxDQUFDO0tBQzlFO0lBQ0QsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtHQUM3Qjs7RUFFRCxZQUFZLHVCQUFBLEVBQUUsU0FBUyxFQUFFOzs7SUFDdkIsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7SUFDMUIsU0FBUyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUE7OztJQUcxQ0EsSUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUE7SUFDeEMsSUFBSSxRQUFRLEVBQUU7TUFDWixLQUFLQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeENELElBQU0sS0FBSyxHQUFHUSxNQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNoRCxJQUFJLEtBQUssRUFBRTtVQUNUQSxNQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQ3pCO09BQ0Y7S0FDRjs7O0lBR0QsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFBOzs7SUFHeEIsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFBOztHQUV6Qjs7RUFFRCxZQUFZLHVCQUFBLEVBQUUsUUFBUSxFQUFFO0lBQ3RCLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFBO0dBQ3JEOztFQUVELFlBQVksdUJBQUEsRUFBRSxRQUFRLEVBQUU7SUFDdEIsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUE7R0FDckQ7O0VBRUQsYUFBYSx3QkFBQSxFQUFFLFFBQVEsRUFBRTtJQUN2QixNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQTtHQUN0RDs7Q0FFRixDQUFBOztBQzdZRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLEFBRUEsU0FBUyxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtFQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtJQUNsQixRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFBO0dBQzFEO0VBQ0RSLElBQU0sR0FBRyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUE7RUFDaEMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0VBQzlCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsWUFBWTtJQUN2QixRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtHQUNsQyxDQUFBO0VBQ0QsR0FBRyxDQUFDLE9BQU8sR0FBRyxVQUFVLEtBQUssRUFBRTtJQUM3QixRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7R0FDaEIsQ0FBQTtFQUNELEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtDQUNYOztBQUVELFNBQVMsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7RUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7SUFDbEIsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsQ0FBQTtHQUM1RDtFQUNEQSxJQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsYUFBYSxJQUFJLG1CQUFtQixDQUFBO0VBQ2hFLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxVQUFVLElBQUksRUFBRTtJQUNyQyxJQUFJLElBQUksRUFBRTtNQUNSLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7S0FDckI7U0FDSTtNQUNILFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUE7S0FDM0M7R0FDRixDQUFBO0VBQ0RBLElBQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUE7RUFDL0MsTUFBTSxDQUFDLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7RUFDOUMsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQTtFQUMvQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtDQUNsQzs7QUFFRCxTQUFTLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7OztFQUczQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7SUFDakIsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7R0FDOUI7T0FDSTtJQUNILFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDLENBQUE7R0FDbEU7Q0FDRjs7QUFFREEsSUFBTSxXQUFXLEdBQUc7RUFDbEIsR0FBRyxFQUFFLFNBQVM7RUFDZCxLQUFLLEVBQUUsV0FBVztFQUNsQixNQUFNLEVBQUUsZ0JBQWdCO0NBQ3pCLENBQUE7O0FBRUQsQUFBTyxTQUFTLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFO0VBQ3ZDQSxJQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0VBQzFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUE7Q0FDMUI7O0FBRUQsQUFBTyxTQUFTLGNBQWMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO0VBQ2hELElBQUksT0FBTyxVQUFVLEtBQUssVUFBVSxFQUFFO0lBQ3BDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUE7R0FDL0I7Q0FDRjs7QUNuRkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCQSxBQUVBLEFBQTJCOztBQ3hCM0I7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxBQUVBQSxJQUFNLHdCQUF3QixHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUE7O0FBRTVFLEFBQU8sQUFRTjs7QUFFRCxBQUFPLFNBQVMsVUFBVSxFQUFFLEdBQUcsRUFBRTtFQUMvQixJQUFJLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtJQUNoRCxPQUFPLEVBQUU7R0FDVjtFQUNELE9BQU87SUFDTCxNQUFNLEVBQUUsVUFBVSxHQUFHLEVBQUU7TUFDckIsT0FBTyxHQUFHLEdBQUcsSUFBSTtLQUNsQjtJQUNELE1BQU0sRUFBRSxVQUFVLEdBQUcsRUFBRTs7TUFFckJBLElBQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtNQUNqRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMvQixJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7VUFDckIsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSTtTQUNuQzthQUNJLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtVQUMxQixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLElBQUk7U0FDM0U7T0FDRjtNQUNELElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQ3BEQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLEtBQUssRUFBRTtVQUNyRCxPQUFPLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJO1NBQzFDLENBQUMsQ0FBQTtRQUNGLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtVQUNuQixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBVSxLQUFLLEVBQUU7WUFDakQsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJO1dBQ2xGLENBQUMsQ0FBQTtTQUNIO1FBQ0QsT0FBTyxHQUFHO09BQ1g7TUFDRCxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1FBQzVELEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRTtVQUN2REQsSUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFBO1VBQ2pHLE9BQU8sQ0FBQyxHQUFHLElBQUk7U0FDaEIsQ0FBQyxDQUFBO09BQ0g7TUFDRCxPQUFPLEdBQUc7S0FDWDtHQUNGO0NBQ0Y7O0FDdkVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsQUFFQSxBQUNBLEFBRUFDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQTtBQUNoQixTQUFTLFdBQVcsSUFBSTtFQUN0QixPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0NBQ3pCOztBQUVELEFBQU8sU0FBU3BDLFFBQU0sRUFBRSxRQUFRLEVBQUU7RUFDaEMsT0FBTyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7Q0FDakQ7O0FBRUQsQUFBTyxTQUFTK0YsZ0JBQWMsSUFBSTs7O0VBQ2hDNUQsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUE7RUFDbkNBLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFBO0VBQy9CQSxJQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO0VBQ25ELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7SUFDL0JBLElBQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO0lBQ2xEQyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUE7SUFDbEIsS0FBS0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ3hDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUdPLE1BQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFBO01BQzdDUixJQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7TUFDekQsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7TUFDaEMsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7TUFDM0IsSUFBSSxDQUFDLE1BQU07V0FDTixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUs7V0FDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUMxQztRQUNBLE1BQU0sR0FBRyxJQUFJLENBQUE7T0FDZDtLQUNGO0lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUE7R0FDaEM7Q0FDRjs7QUFFRCxBQUFPLFNBQVM2RCxhQUFXLEVBQUUsSUFBSSxFQUFFO0VBQ2pDN0QsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUE7RUFDbkNBLElBQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7RUFDbkRBLElBQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtFQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7O0VBRWpDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7R0FDNUI7T0FDSTtJQUNILFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7R0FDcEI7RUFDRCxPQUFPLEtBQUs7Q0FDYjs7QUFFRCxBQUFPLFNBQVM4RCxjQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtFQUMzQzlELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFBO0VBQ25DQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7RUFDVEEsSUFBSSxDQUFDLENBQUE7RUFDTEEsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFBOzs7RUFHcEIsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUU7SUFDNUMsUUFBUSxHQUFHLElBQUksQ0FBQTtHQUNoQjtPQUNJO0lBQ0gsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ3BDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUN2QyxLQUFLO09BQ047S0FDRjtJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtNQUNYLFFBQVEsR0FBRyxJQUFJLENBQUE7S0FDaEI7R0FDRjs7RUFFRCxJQUFJLFFBQVEsRUFBRTtJQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNqQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtHQUMxQjtPQUNJO0lBQ0gsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7TUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtLQUM1RDtTQUNJLElBQUksTUFBTSxDQUFDLGlCQUFpQixFQUFFO01BQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUE7S0FDN0Q7U0FDSTtNQUNILElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0tBQ2hEO0lBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtHQUNsQztDQUNGOztBQUVELEFBQU8sU0FBUzhELGFBQVcsRUFBRSxLQUFLLEVBQUU7RUFDbEMvRCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQTs7RUFFbkNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtFQUNURCxJQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO0VBQ25ELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7SUFDL0JDLElBQUksQ0FBQyxDQUFBO0lBQ0wsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO01BQ3BDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUN0QyxLQUFLO09BQ047S0FDRjtJQUNELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtNQUNULFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0tBQ3RCO0dBQ0Y7O0VBRUQsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7RUFDaEQsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFBO0VBQ3JCLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7Q0FDOUM7O0FBRUQsQUFBTyxTQUFTK0QsYUFBVyxFQUFFLEtBQUssRUFBRTs7Ozs7RUFHbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO0lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQTtHQUNwQjtFQUNELEtBQUtoRSxJQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUU7SUFDdkJBLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUN4QkEsSUFBTSxVQUFVLEdBQUdRLE1BQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDakMsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLEVBQUU7TUFDcEMsVUFBVSxDQUFDLElBQUksQ0FBQ0EsTUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO0tBQzdCO1NBQ0k7TUFDSCxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRTtRQUM5QkEsTUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUE7T0FDdkI7V0FDSTtRQUNIQSxNQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7T0FDbkM7TUFDREEsTUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFBO0tBQzVCO0dBQ0Y7Q0FDRjs7QUFFRCxBQUFPLFNBQVN5RCxhQUFXLEVBQUUsS0FBSyxFQUFFOzs7RUFDbENqRSxJQUFNLFVBQVUsR0FBRyxFQUFFLENBQUE7RUFDckIsS0FBS0EsSUFBTSxHQUFHLElBQUksS0FBSyxFQUFFO0lBQ3ZCQyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDdEJELElBQU0sY0FBYyxHQUFHLHVCQUF1QixDQUFBO0lBQzlDQSxJQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3ZDQyxJQUFJLFNBQVMsV0FBQSxFQUFFLFVBQVUsV0FBQSxDQUFBO0lBQ3pCLElBQUksS0FBSyxFQUFFO01BQ1QsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtNQUNwQixVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0tBQ3RCO1NBQ0k7TUFDSCxTQUFTLEdBQUcsR0FBRyxDQUFBO0tBQ2hCOztJQUVERCxJQUFNLFdBQVcsR0FBR1EsTUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUN6QyxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRTtNQUNyQyxXQUFXLENBQUMsSUFBSSxDQUFDQSxNQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7TUFDN0IsUUFBUTtLQUNUO0lBQ0RSLElBQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxDQUFBO0lBQ2xELElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFO01BQ2hDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7S0FDdEI7O0lBRUQsSUFBSSxDQUFDLEtBQUssRUFBRTtNQUNWUSxNQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUE7TUFDbEMsUUFBUTtLQUNUOztJQUVELElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO01BQzFCLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUE7S0FDMUM7U0FDSTtNQUNIO01BQUEsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQUEsRUFBQyxLQUFDLENBQUMsU0FBUyxDQUFDLEdBQUEsS0FBTyxPQUFFLENBQUE7S0FDaEQ7R0FDRjs7RUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtJQUN0QyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLENBQUE7R0FDdkQ7Q0FDRjs7O0FBR0QsU0FBUyxrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRTtFQUMxRFAsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTs7RUFFNUQsU0FBUyxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRTs7O0lBR3ZDRCxJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEdBQUcsRUFBQyxTQUFHLENBQUEsQ0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUEsTUFBRSxJQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQSxnQkFBWSxDQUFDLEdBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUMvRyxPQUFPLENBQUEsUUFBVyxNQUFFLEdBQUUsU0FBUyxNQUFFLENBQUM7R0FDbkM7O0VBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRTtJQUNiLFFBQVEsR0FBRyxXQUFXLEVBQUUsQ0FBQTtJQUN4QixTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUN2REEsSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUM3QyxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQTtJQUN2QixLQUFLLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQzlDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDM0RBLElBQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsTUFBTSxFQUFDO01BQ2pEQSxJQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7TUFDaEMsT0FBTyxVQUFVLENBQUMsQ0FBQSxvQkFBa0IsR0FBRSxRQUFRLFFBQUcsR0FBRSxNQUFNLENBQUUsRUFBRSxLQUFLLENBQUM7S0FDcEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNYLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0dBQzNEOztFQUVEQSxJQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7S0FDdkUsTUFBTSxDQUFDLFVBQUEsS0FBSyxFQUFDLFNBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxRQUFRLEdBQUEsQ0FBQyxDQUFBO0VBQy9FLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7SUFDM0MsTUFBTTtHQUNQO0VBQ0RBLElBQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtFQUNoQ0EsSUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFBO0VBQ3JELE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsTUFBTSxFQUFDO0lBQ3JDQSxJQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDL0JBLElBQU0sUUFBUSxHQUFHLG9CQUFrQixHQUFFLFFBQVEsUUFBRyxHQUFFLE1BQU0sQ0FBQTtJQUN4REEsSUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO01BQ3BFLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUE7TUFDbkQsT0FBTyxHQUFHO0tBQ1gsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZixJQUFRLEdBQUcsV0FBTDtJQUNOLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO01BQ2RBLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtNQUM3QkEsSUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtNQUMzRCxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckJBLElBQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtVQUN0REEsSUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1VBQzVDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDakMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtXQUN6QjtVQUNELE9BQU8sR0FBRztTQUNYLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDTixNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsSUFBSSxFQUFDO1VBQ2xDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQSxFQUFFO1NBQ2pELENBQUMsQ0FBQTtRQUNGLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDMUIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7T0FDekU7S0FDRjtTQUNJO01BQ0gsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQTtLQUNoRTtHQUNGLENBQUMsQ0FBQTtDQUNIOztBQUVELEFBQU8sU0FBUytCLFlBQVUsRUFBRSxJQUFJLEVBQUU7RUFDaEMvQixJQUFNLElBQUksR0FBRyxJQUFJLENBQUE7RUFDakJBLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtFQUMzQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxFQUFFO0lBQ3RCQSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNsQ0EsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUMxQixJQUFJLE1BQU0sRUFBRTtNQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFBO01BQ3ZDLE1BQU07S0FDUDtJQUNEQSxJQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFBO0lBQ2xDQSxJQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsRUFBRTs7OztNQUk1QixJQUFJLENBQUMsQ0FBQyxpQkFBaUIsRUFBRTtRQUN2QixNQUFNO09BQ1A7TUFDRCxDQUFDLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO01BQzFCQSxJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFBO01BQzNCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtNQUN4QixNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtRQUNuQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDMUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO09BQ2pELEVBQUUsS0FBSyxDQUFDLENBQUE7S0FDVixDQUFBO0lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUN2REMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQTtJQUMvQixJQUFJLENBQUMsU0FBUyxFQUFFO01BQ2QsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFBO01BQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQTtLQUMxQjtJQUNELFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUE7SUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFBO0dBQ3JDLENBQUMsQ0FBQTtDQUNIOztBQUVELEFBQU8sU0FBUyxZQUFZLEVBQUUsSUFBSSxFQUFFO0VBQ2xDRCxJQUFNLElBQUksR0FBRyxJQUFJLENBQUE7RUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsRUFBRTtJQUN0QkEsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQTtJQUNoQyxJQUFJLFFBQVEsRUFBRTtNQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFBO01BQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFBO01BQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQTtLQUNqQztHQUNGLENBQUMsQ0FBQTtDQUNIOzs7Ozs7Ozs7Ozs7Ozs7QUN0VEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLEFBRUFBLElBQU0sRUFBRSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUE7QUFDOUJBLElBQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBQ3hDQSxJQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUMxQ0EsSUFBTSxTQUFTLEdBQUcsU0FBUyxHQUFHLE9BQU8sR0FBRyxVQUFVLEdBQUcsTUFBTSxHQUFHLFVBQVUsQ0FBQTtBQUN4RUEsSUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLEtBQUssR0FBRyxVQUFVLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQTs7Ozs7QUFLcEUsU0FBUyxVQUFVLEVBQUUsTUFBTSxFQUFFO0VBQzNCLElBQUksQ0FBQyxNQUFNLFlBQVksTUFBTSxFQUFFO0lBQzdCLE1BQU07R0FDUDtFQUNEQSxJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUE7RUFDckRDLElBQUksRUFBRSxDQUFBO0VBQ04sSUFBSSxRQUFRLEVBQUU7SUFDWixFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUE7SUFDN0IsTUFBTSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBO0dBQy9CO09BQ0k7SUFDSCxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUE7SUFDeEQsTUFBTSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7R0FDMUI7Q0FDRjs7QUFFRCxTQUFTaUUsV0FBUyxFQUFFLE1BQU0sRUFBRTtFQUMxQmxFLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUE7RUFDN0JBLElBQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUE7RUFDOUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0VBQ3ZELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUE7RUFDbEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQTtFQUMvRCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtFQUNwQyxNQUFNLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFBO0VBQzdDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUE7RUFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFBOztFQUVsRCxPQUFPLENBQUMsVUFBVSxDQUFDLFlBQVk7SUFDN0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFBO0VBQ2xDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtFQUNoQ0MsSUFBSSxHQUFHLENBQUE7RUFDUCxJQUFJLE1BQU0sQ0FBQyxNQUFNLFlBQVksV0FBVyxFQUFFO0lBQ3hDLEdBQUcsR0FBRyxDQUFDLENBQUE7R0FDUjtPQUNJO0lBQ0gsR0FBRyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLENBQUE7R0FDdkQ7RUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFBO0VBQzlCLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0NBQzFDOzs7Ozs7O0FBT0QsU0FBU2tFLGFBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0VBQ3RDbkUsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQTtFQUM3QkEsSUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQTtFQUM5QixRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQTtFQUN4RCxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7RUFDakMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUE7RUFDbkQsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUE7RUFDdkMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUE7RUFDdkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7SUFDMUJBLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUE7SUFDaEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDcEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUMxQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFBO0dBQzlCO0NBQ0Y7Ozs7Ozs7Ozs7O0FBV0QsQUFBZSxTQUFTLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0VBQ2xELE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFBO0VBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO0VBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQTtFQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQTtFQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFBO0VBQ2pELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO0VBQ2xCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQTtDQUNaOztBQUVELE1BQU0sQ0FBQyxTQUFTLEdBQUc7O0VBRWpCLFdBQVcsRUFBRSxNQUFNOztFQUVuQixJQUFJLGVBQUEsSUFBSTtJQUNOQSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQTtJQUN2QyxZQUFZLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxHQUFHLGVBQWUsQ0FBQTtJQUN6RCxZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsZUFBZSxDQUFBO0lBQzNDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTs7OztJQUloQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7SUFDdEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0dBQ25COztFQUVELFdBQVcsc0JBQUEsSUFBSTtJQUNiQSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUE7SUFDakJBLElBQU0sU0FBUyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUMxREEsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxxQkFBcUIsSUFBSSxNQUFNO1FBQ25FLG1CQUFtQjtRQUNuQixRQUFRLENBQUE7SUFDWkEsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxZQUFZO01BQ3RELFVBQVUsQ0FBQyxZQUFZO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtPQUNmLEVBQUUsU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQTtLQUN4QixDQUFBO0lBQ0QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUE7R0FDM0Q7Ozs7Ozs7RUFPRCxPQUFPLGtCQUFBLElBQUk7Ozs7SUFJVCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7R0FDdkI7O0VBRUQsZUFBZSwwQkFBQSxJQUFJO0lBQ2pCQSxJQUFNLElBQUksR0FBRyxJQUFJLENBQUE7SUFDakJBLElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTs7SUFFNUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLGNBQWM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsTUFBTTtRQUMvQixNQUFNLENBQUMsV0FBVyxDQUFDO1NBQ2xCLENBQUMsQ0FBQTtJQUNOQSxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxDQUFBO0lBQ3hEQyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUE7SUFDbEIsSUFBSSxjQUFjLEVBQUU7TUFDbEIsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxHQUFHLENBQUE7S0FDNUQ7SUFDREQsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQTtJQUN0Q0EsSUFBTSxhQUFhLEdBQUcsT0FBTyxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBOzs7Ozs7OztJQVF4RCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQTtJQUNqQkEsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7TUFDaEVBLElBQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQTtNQUNsQ0EsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQTtNQUNsRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQTtNQUNsQixJQUFJLElBQUksR0FBRyxZQUFZLEVBQUU7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtVQUN2Qm1FLGFBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtVQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQTtTQUNsQjtPQUNGO1dBQ0ksSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxZQUFZLENBQUM7UUFDOUMsQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLFlBQVksK0JBQStCLEVBQUU7UUFDdEUsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtVQUN2QkQsV0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO1VBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUE7U0FDbEI7T0FDRjtLQUNGLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDUCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQTs7O0lBR3ZELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxhQUFhLEVBQUU7TUFDaENsRSxJQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFBO01BQ3JELFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtNQUMxQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0tBQ2pDO0dBQ0Y7O0VBRUQsT0FBTyxrQkFBQSxFQUFFLFFBQVEsRUFBRTtJQUNqQixRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFBOzs7O0lBSWhELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7TUFDdkJtRSxhQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7S0FDbEI7SUFDRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUE7R0FDakU7O0VBRUQsY0FBYyx5QkFBQSxJQUFJO0lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFO01BQ3pCLElBQUk7UUFDRixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUE7T0FDdkQ7TUFDRCxPQUFPLEdBQUcsRUFBRTs7Ozs7UUFLVixPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsQ0FBQyxDQUFBO09BQ2xFO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlO0dBQzVCOztFQUVELGlCQUFpQiw0QkFBQSxJQUFJO0lBQ25CLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRTtHQUMxQzs7RUFFRCxPQUFPLGtCQUFBLEVBQUUsUUFBUSxFQUFFO0lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDdEJuRSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQTtJQUN2QyxZQUFZLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQTtJQUNwRCxZQUFZLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBOzs7O0lBSXhDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUE7R0FDMUU7Q0FDRixDQUFBOztBQ3ZQRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLEFBRUE7O0FBSUEsQUFBTyxTQUFTLFFBQVEsSUFBSTs7RUFFMUIsVUFBVSxDQUFDLFlBQVk7SUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtJQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFO01BQzFCLE1BQU07S0FDUDtJQUNEQSxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQTtJQUNuQyxJQUFJLE1BQU0sRUFBRTs7OztNQUlWLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO01BQ3JELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUE7TUFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUc7UUFDcEMsZUFBZTtRQUNmLFlBQVk7UUFDWixhQUFhO09BQ2QsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7TUFDVixNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7TUFDckQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtLQUMvQztHQUNGLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0NBQ2pCOzs7QUFHRCxBQUFPLFNBQVMsVUFBVSxFQUFFLFFBQVEsRUFBRTs7OztFQUlwQyxRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxFQUFFLEdBQUcsVUFBVSxDQUFBO0VBQ2hELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCQSxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFBO0lBQy9DLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUNyRCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUE7SUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtHQUNwQztDQUNGOztBQUVELEFBQU8sU0FBUyxTQUFTLElBQUk7RUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQTtFQUM1QixVQUFVLENBQUMsWUFBWTtJQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0dBQy9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0NBQ2pCOztBQUVELEFBQU8sU0FBUyxXQUFXLElBQUk7RUFDN0IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO0lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQTtHQUNuQjtDQUNGOzs7QUFHRCxBQUFPLFNBQVMsYUFBYSxFQUFFLFFBQVEsRUFBRTtFQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0NBQ3pDOztBQUVELEFBQU9BLElBQU0sS0FBSyxHQUFHO0VBQ25CLFFBQVEsbUJBQUEsRUFBRSxLQUFLLEVBQUU7Ozs7O0lBS2YsS0FBSyxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7SUFDdEMsS0FBSyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDeEMsSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFO01BQ3JCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRTtLQUN2QjtJQUNELElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtNQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUU7S0FDeEI7SUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO0dBQ2pDO0NBQ0YsQ0FBQTs7Ozs7Ozs7Ozs7O0FDbkdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsQUFFQUEsSUFBTSxXQUFXLEdBQUc7RUFDbEIsT0FBTyxFQUFFLFNBQVM7RUFDbEIsWUFBWSxFQUFFLE9BQU87RUFDckIsVUFBVSxFQUFFLEtBQUs7RUFDakIsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQTs7QUFFREEsSUFBTSxZQUFZLEdBQUc7RUFDbkIsR0FBRyxFQUFFLFlBQVk7RUFDakIsTUFBTSxFQUFFLFVBQVU7Q0FDbkIsQ0FBQTs7QUFFREEsSUFBTSxVQUFVLEdBQUc7RUFDakIsWUFBWSxFQUFFLE9BQU87RUFDckIsVUFBVSxFQUFFLEtBQUs7RUFDakIsTUFBTSxFQUFFLFFBQVE7RUFDaEIsZUFBZSxFQUFFLFNBQVM7RUFDMUIsY0FBYyxFQUFFLFNBQVM7Q0FDMUIsQ0FBQTs7QUFFRCxjQUFlO0VBQ2IsS0FBSyxFQUFFO0lBQ0wsSUFBSSxlQUFBLEVBQUUsS0FBSyxFQUFFO01BQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtNQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO01BQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUE7S0FDN0I7O0lBRUQsVUFBVSxxQkFBQSxFQUFFLEtBQUssRUFBRTtNQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO01BQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQTtNQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFBO0tBQ25DOztJQUVELFNBQVMsb0JBQUEsRUFBRSxLQUFLLEVBQUU7TUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQTtNQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO0tBQ2xDOztJQUVELGFBQWEsd0JBQUEsRUFBRSxLQUFLLEVBQUU7TUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtNQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7TUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtLQUN0Qzs7SUFFRCxjQUFjLHlCQUFBLEVBQUUsS0FBSyxFQUFFO01BQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUE7TUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFBO01BQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUE7S0FDdkM7R0FDRjtDQUNGOzs7Q0FHQTs7O0FDekVELENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRyxFQUFFO0VBQ25CLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQztFQUNuQixJQUFJLFNBQVMsQ0FBQztFQUNkLElBQUksWUFBWSxDQUFDOztFQUVqQixTQUFTLFdBQVcsR0FBRztJQUNyQixTQUFTLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3QyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0dBQ25EOzs7Ozs7OztFQVFELFNBQVMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7SUFDNUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtNQUNyQixRQUFRLEdBQUcsQ0FBQztNQUNaLE9BQU8sR0FBRyxJQUFJO01BQ2QsT0FBTztNQUNQLElBQUk7TUFDSixNQUFNLENBQUM7SUFDVCxJQUFJLEtBQUssR0FBRyxZQUFZO01BQ3RCLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7TUFDdEIsT0FBTyxHQUFHLElBQUksQ0FBQztNQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzNCLENBQUE7SUFDRCxPQUFPLFlBQVk7TUFDakIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO01BQ3JCLE9BQU8sR0FBRyxJQUFJLENBQUM7TUFDZixJQUFJLEdBQUcsU0FBUyxDQUFDOztNQUVqQixJQUFJLFNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUM7TUFDeEMsSUFBSSxTQUFTLElBQUksQ0FBQyxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7O1FBRXZDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QixPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ2YsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO09BQ3BDLE1BQU0sSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQzFCLE9BQU8sR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO09BQ3hDO01BQ0QsT0FBTyxNQUFNLENBQUM7S0FDZjtHQUNGOzs7Ozs7OztFQVFELFNBQVMsU0FBUyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUU7SUFDNUIsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLElBQUksQ0FBQyxFQUFFLEVBQUU7TUFDUCxPQUFPO0tBQ1I7SUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFO01BQ1YsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDdEI7O0lBRUQsSUFBSSxFQUFFLElBQUksTUFBTSxFQUFFO01BQ2hCLEVBQUUsR0FBRyxFQUFFLENBQUMscUJBQXFCLEVBQUUsQ0FBQztNQUNoQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztNQUNaLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO01BQ1gsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7TUFDYixDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztLQUNmLE1BQU07TUFDTCxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BQ04sQ0FBQyxHQUFHLENBQUMsQ0FBQztNQUNOLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQztNQUN0QixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7S0FDeEI7SUFDRCxPQUFPO01BQ0wsTUFBTSxFQUFFLENBQUM7TUFDVCxLQUFLLEVBQUUsQ0FBQztNQUNSLE9BQU8sRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7TUFDcEIsUUFBUSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztLQUN0QixDQUFDO0dBQ0g7O0VBRUQsU0FBUyxhQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUM3QixJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ3BELElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDbkQsT0FBTyxJQUFJLElBQUksR0FBRyxDQUFDO0dBQ3BCOztFQUVELFNBQVMsWUFBWSxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUU7SUFDN0MsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLElBQUksVUFBVSxHQUFHLFlBQVksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztJQUNwRCxJQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUM7SUFDaEQsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO01BQ2pCLElBQUksVUFBVSxJQUFJLENBQUMsRUFBRTtRQUNuQixTQUFTLEdBQUcsVUFBVSxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO09BQy9DLE1BQU07UUFDTCxTQUFTLEdBQUcsTUFBTSxDQUFBO09BQ25CO0tBQ0Y7SUFDRCxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUU7TUFDbkIsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO1FBQ2pCLFNBQVMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUM7T0FDMUMsTUFBTTtRQUNMLFNBQVMsR0FBRyxNQUFNLENBQUM7T0FDcEI7S0FDRjtJQUNELE9BQU8sU0FBUyxDQUFDO0dBQ2xCOztFQUVELFNBQVMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUU7SUFDMUIsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUU7TUFDaEIsSUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDbkI7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0dBQ2Y7Ozs7OztFQU1ELFNBQVMsV0FBVyxHQUFHO0lBQ3JCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztJQUNoQixJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsWUFBWTtNQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztLQUMvQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFOztNQUVqQixJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7TUFDNUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7S0FDdEI7SUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztJQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUU7TUFDckQsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDL0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLFdBQVc7TUFDekQsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDL0IsRUFBRSxLQUFLLENBQUMsQ0FBQzs7SUFFVixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixFQUFFLFdBQVc7TUFDL0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDL0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNWLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLFdBQVc7TUFDMUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDL0IsRUFBRSxLQUFLLENBQUMsQ0FBQztHQUNYOzs7RUFHRCxTQUFTLGFBQWEsQ0FBQyxRQUFRLEVBQUU7SUFDL0IsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDOztJQUVoQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUN2QyxJQUFJLE9BQU8sU0FBUyxJQUFJLFFBQVEsRUFBRTs7TUFFaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQy9DLE1BQU07O01BRUwsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7S0FDNUI7O0lBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sRUFBRTtNQUM1QixJQUFJLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUMxRCxNQUFNO01BQ0wsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ3JFO0lBQ0QsSUFBSSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQzs7SUFFbkUsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxFQUFFOztNQUU3RCxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFO1FBQzlCLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFDekIsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDO1FBQ25CLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsT0FBTyxLQUFLLENBQUM7T0FDZCxNQUFNO1FBQ0wsT0FBTyxJQUFJLENBQUM7T0FDYjtLQUNGLENBQUMsQ0FBQzs7SUFFSCxPQUFPLG1CQUFtQixDQUFDO0dBQzVCOztFQUVELFNBQVMsa0JBQWtCLENBQUMsUUFBUSxFQUFFO0lBQ3BDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztJQUNoQixJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNuQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxHQUFHLEVBQUU7UUFDdkMsR0FBRyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7O1FBRWhDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7O1FBRXZDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO09BQ3pCLENBQUMsQ0FBQztLQUNKO0dBQ0Y7OztFQUdELFNBQVMsTUFBTSxHQUFHO0lBQ2hCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTO01BQzVCLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CO01BQ25DLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7TUFDdEMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO01BQzVDLGVBQWUsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFO1FBQ3JDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakIsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztPQUNsQixDQUFDO01BQ0YsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtNQUMxQixFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUNuQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFOztRQUUxQyxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsSUFBSSxTQUFTLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7O1FBRXhELEdBQUcsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDOztRQUUzQixJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDekIsSUFBSSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNoQyxJQUFJLGFBQWEsR0FBRyxHQUFHLENBQUMsYUFBYSxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxJQUFJLEdBQUc7VUFDZixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFBO1FBQ0QsWUFBWSxDQUFDLElBQUksR0FBRztVQUNsQixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFBO1FBQ0QsSUFBSSxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUU7VUFDdkIsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFOzs7WUFHdEMsY0FBYyxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDOztZQUUvQyxHQUFHLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1dBQ3BCO1NBQ0YsTUFBTSxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sRUFBRTtVQUM5QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7O1lBRXpDLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7O1lBRXJELEdBQUcsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEMsR0FBRyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDekIsR0FBRyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7V0FDckI7U0FDRjtPQUNGLENBQUMsQ0FBQztLQUNKO0dBQ0Y7Ozs7RUFJRCxTQUFTLE1BQU0sQ0FBQyxJQUFJLEVBQUU7O0lBRXBCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOztJQUUxQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztJQUV4RyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDOztJQUV4RCxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQ3hCOztFQUVELElBQUksTUFBTSxHQUFHLFlBQVk7SUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDL0IsQ0FBQTs7O0VBR0QsSUFBSSxNQUFNLEdBQUc7SUFDWCxTQUFTLEVBQUUsRUFBRTtJQUNiLElBQUksRUFBRSxVQUFVLElBQUksRUFBRTtNQUNwQixJQUFJLEtBQUssR0FBRzs7UUFFVixPQUFPLEVBQUU7VUFDUCxTQUFTLEVBQUUsTUFBTTtVQUNqQixJQUFJLEVBQUUsR0FBRztVQUNULENBQUMsRUFBRSxDQUFDO1VBQ0osQ0FBQyxFQUFFLENBQUM7VUFDSixHQUFHLEVBQUUsWUFBWTtVQUNqQixJQUFJLEVBQUUsS0FBSztVQUNYLE9BQU8sRUFBRSxZQUFZLEVBQUU7VUFDdkIsUUFBUSxFQUFFLFlBQVksRUFBRTtVQUN4QixXQUFXLEVBQUUsWUFBWSxFQUFFO1NBQzVCO1FBQ0QsU0FBUyxFQUFFLElBQUk7UUFDZixtQkFBbUIsRUFBRSxJQUFJO1FBQ3pCLElBQUksRUFBRSxVQUFVLElBQUksRUFBRTtVQUNwQixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7VUFFM0IsSUFBSSxPQUFPLElBQUksSUFBSSxRQUFRLEVBQUU7WUFDM0IsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRTtjQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hDLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2VBQ3hCO2FBQ0YsQ0FBQyxDQUFDOztXQUVKLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTs7WUFFOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFOztjQUVqQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN6QjtXQUNGLE1BQU07WUFDTCxPQUFPLElBQUksQ0FBQztXQUNiOztVQUVELElBQUksV0FBVyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztVQUVuRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQzs7VUFFeEUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztVQUMzQyxPQUFPLElBQUksQ0FBQztTQUNiOztRQUVELEtBQUssRUFBRSxVQUFVLElBQUksRUFBRTtVQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztVQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFO1lBQzdDLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQztZQUN0QixPQUFPLEdBQUcsQ0FBQyxhQUFhLENBQUM7WUFDekIsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDO1dBQ3BCLENBQUMsQ0FBQztVQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLEVBQUUsWUFBWTtVQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzdCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7V0FDL0I7VUFDRCxJQUFJLFdBQVcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztVQUNuRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQzs7VUFFeEUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztVQUMzQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1VBQ2xCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7T0FDRixDQUFBO01BQ0QsTUFBTSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7TUFDekIsSUFBSSxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7TUFDOUIsT0FBTyxRQUFRLENBQUM7S0FDakI7SUFDRCxPQUFPLEVBQUUsWUFBWTtNQUNuQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO01BQy9CLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxRQUFRLEVBQUU7UUFDcEMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO09BQ2pCLENBQUMsQ0FBQztLQUNKO0dBQ0YsQ0FBQTs7RUFFRCxXQUFXLEVBQUUsQ0FBQzs7RUFFZCxHQUFHLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7Q0FFckIsQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQzs7Ozs7OztBQ2pXM0MsQUFBQzs7QUFFRCxDQUFDLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRTs7O0lBR2pCLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNqQixJQUFJLGNBQWMsQ0FBQztJQUNuQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7O0lBRXRCLElBQUksTUFBTSxHQUFHO1FBQ1QsU0FBUyxFQUFFLFNBQVM7UUFDcEIsWUFBWSxFQUFFLENBQUM7UUFDZixXQUFXLEVBQUUsQ0FBQztLQUNqQixDQUFDOztJQUVGLFNBQVMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7UUFDN0IsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDaEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JEO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztLQUNkOztJQUVELFNBQVMsVUFBVSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFO1FBQ25ELElBQUksR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFDdEIsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUE7UUFDYixHQUFHLENBQUMsTUFBTSxHQUFHLFlBQVksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQTtRQUN6RCxHQUFHLENBQUMsT0FBTyxHQUFHLGFBQWEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQTtLQUMvRDs7SUFFRCxTQUFTLGFBQWEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtRQUN0QyxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzdDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtLQUMxQjs7SUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRTtRQUNsRCxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2YsT0FBTztTQUNWO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVk7Z0JBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQTthQUM1QixDQUFBO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDakIsTUFBTTthQUNUO1NBQ0osTUFBTTtZQUNILFVBQVUsQ0FBQyxZQUFZLEVBQUUsWUFBWTtnQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsT0FBTyxHQUFHLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQzNEQSxJQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBO2dCQUMvQkEsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtnQkFDakMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUU7b0JBQ3hCLE9BQU8sRUFBRSxJQUFJO29CQUNiLElBQUksRUFBRSxFQUFFLGNBQUEsWUFBWSxFQUFFLGVBQUEsYUFBYSxFQUFFO2lCQUN4QyxDQUFDLENBQUE7YUFDTCxFQUFFLFlBQVk7Z0JBQ1gsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtnQkFDL0MsVUFBVSxDQUFDLGNBQWMsRUFBRSxZQUFZO29CQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxPQUFPLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQztpQkFDaEUsQ0FBQyxDQUFBO2FBQ0wsQ0FBQyxDQUFBO1NBQ0w7S0FDSjs7SUFFRCxTQUFTLElBQUksR0FBRztRQUNaLGNBQWMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUM3QixHQUFHLEVBQUUsUUFBUTtZQUNiLElBQUksRUFBRSxJQUFJO1lBQ1YsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1lBQ25CLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUNwQixRQUFRLEVBQUUsVUFBVSxHQUFHLEVBQUU7Z0JBQ3JCLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDaEIsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzFFLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDdEM7U0FDSixDQUFDLENBQUM7S0FDTjs7SUFFRCxPQUFPLENBQUMsU0FBUyxHQUFHLFlBQVk7UUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUMzQyxDQUFBOztJQUVELE9BQU8sQ0FBQyxJQUFJLEdBQUcsWUFBWTs7UUFFdkIsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNqQixJQUFJLEVBQUUsQ0FBQztTQUNWOztRQUVELElBQUksS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3ZDLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQzs7UUFFcEUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsSUFBSSxFQUFFO1lBQ3JDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE1BQU0sRUFBRTtnQkFDN0QsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQy9FLE1BQU07Z0JBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7YUFDdEU7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN4QyxDQUFDLENBQUM7O1FBRUgsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDakMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ3pCLENBQUE7O0lBRUQsT0FBTyxDQUFDLFVBQVUsR0FBRyx3SEFBd0gsQ0FBQzs7SUFFOUksR0FBRyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7O0lBRWxCLGNBQWMsR0FBRyxPQUFPLENBQUM7O0NBRTVCLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs7O0FDeEhsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsQUFFQSxBQUVBQyxJQUFJLGFBQWEsQ0FBQTs7O0FBR2pCLFNBQVMsSUFBSSxJQUFJO0VBQ2YsVUFBVSxDQUFDLFlBQUcsU0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFBLEVBQUUsQ0FBQyxDQUFDLENBQUE7Q0FDcEM7Ozs7Ozs7Ozs7OztBQVlELFNBQVMsYUFBYSxFQUFFLE1BQU0sRUFBRTtFQUM5QixJQUFJLENBQUMsYUFBYSxFQUFFO0lBQ2xCLGFBQWEsR0FBRyxVQUFVLENBQUMsWUFBWTtNQUNyQyxJQUFJLEVBQUUsQ0FBQTtNQUNOLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQTtNQUMzQixhQUFhLEdBQUcsSUFBSSxDQUFBO0tBQ3JCLEVBQUUsRUFBRSxDQUFDLENBQUE7R0FDUDtDQUNGOzs7QUFHRCxTQUFTLFlBQVksRUFBRSxZQUFZLEVBQUU7RUFDbkNELElBQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTs7Ozs7OztFQU9sRUEsSUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFBO0VBQ2xFLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7SUFDekQsSUFBSSxFQUFFLENBQUE7R0FDUDtDQUNGOztBQUVELEFBQU8sU0FBUyxhQUFhLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtFQUN6QyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0VBQ2hDLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUE7RUFDbkMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtFQUM1QixLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQTtFQUNsQyxJQUFJLEVBQUUsQ0FBQTtDQUNQOztBQUVELEFBQU8sU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFO0VBQ3BDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLFlBQVksV0FBVyxDQUFDLEVBQUU7SUFDbEUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUE7R0FDckI7RUFDRCxJQUFJLENBQUMsTUFBTSxFQUFFO0lBQ1gsTUFBTTtHQUNQO0VBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sRUFBRTtJQUM1QyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUM7R0FDN0I7RUFDRCxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUM7Q0FDNUI7O0FDckZEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsQUFFQSxBQUNBLEFBQ0EsQUFDQSxBQUNBLEFBQ0EsQUFDQSxBQUVBQSxJQUFNLFVBQVUsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQTs7Ozs7Ozs7QUFRMUMsU0FBUyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTs7OztFQUlqQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUU7SUFDbEMsT0FBTyxJQUFJO0dBQ1o7RUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxXQUFXLEVBQUU7SUFDdEQsT0FBTyxLQUFLO0dBQ2I7RUFDREMsSUFBSSxHQUFHLENBQUE7RUFDUCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7SUFDbkQsR0FBRyxHQUFHLElBQUksQ0FBQTtHQUNYO09BQ0k7SUFDSCxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUE7R0FDNUI7RUFDRCxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFBO0VBQzVCLE9BQU8sR0FBRztDQUNYOztBQUVELEFBQWUsU0FBUyxTQUFTLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtFQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtFQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7RUFDakMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO0VBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUE7Ozs7RUFJdENELElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFBO0VBQ3ZDLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7RUFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQTtFQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFBO0NBQ3ZDOztBQUVELFNBQVMsQ0FBQyxTQUFTLEdBQUc7O0VBRXBCLG1CQUFtQiw4QkFBQSxJQUFJO0lBQ3JCLE9BQU8sZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0dBQzFEOztFQUVELGVBQWUsMEJBQUEsSUFBSTtJQUNqQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLGVBQWUsRUFBRTtHQUNwRDs7RUFFRCxTQUFTLG9CQUFBLElBQUk7SUFDWCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0dBQy9EOztFQUVELGlCQUFpQiw0QkFBQSxJQUFJO0lBQ25CLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFO01BQ3pCLE9BQU8sSUFBSSxDQUFDLGVBQWU7S0FDNUI7SUFDRCxPQUFPLElBQUk7R0FDWjs7RUFFRCxlQUFlLDBCQUFBLElBQUk7SUFDakIsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUU7TUFDekJDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUE7TUFDbkNBLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUE7TUFDckMsT0FBTyxNQUFNLEVBQUU7UUFDYixRQUFRLEdBQUcsTUFBTSxDQUFBO1FBQ2pCLE1BQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFBO09BQ2xDO01BQ0QsT0FBTyxRQUFRO0tBQ2hCO0lBQ0QsT0FBTyxJQUFJO0dBQ1o7O0VBRUQsZ0JBQWdCLDJCQUFBLElBQUk7SUFDbEJELElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxPQUFPLEVBQUU7U0FDeEMsUUFBUSxDQUFDLElBQUksQ0FBQTtJQUNsQixPQUFPLElBQUk7R0FDWjs7RUFFRCxZQUFZLHVCQUFBLElBQUk7SUFDZEEsSUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUE7SUFDeEIsT0FBTyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7R0FDL0Q7O0VBRUQsY0FBYyx5QkFBQSxJQUFJO0lBQ2hCLElBQUksT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtNQUM3QyxPQUFPLElBQUksQ0FBQyxlQUFlO0tBQzVCO0lBQ0RBLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUMvQixJQUFJLE1BQU07V0FDSCxDQUFDLE9BQU8sTUFBTSxDQUFDLGVBQWUsS0FBSyxTQUFTLENBQUM7V0FDN0MsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUU7TUFDN0IsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUU7UUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUE7UUFDNUIsT0FBTyxLQUFLO09BQ2I7TUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQTtNQUM5QyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUE7TUFDN0MsT0FBTyxJQUFJLENBQUMsZUFBZTtLQUM1QjtJQUNELElBQUksTUFBTSxJQUFJLE9BQU8sTUFBTSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7TUFDekQsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFBO01BQzdDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQTtNQUM3QyxPQUFPLElBQUksQ0FBQyxlQUFlO0tBQzVCO0lBQ0QsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxFQUFFO01BQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO01BQzNCLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFBO01BQzdCLE9BQU8sSUFBSTtLQUNaO0dBQ0Y7Ozs7Ozs7O0VBUUQsYUFBYSx3QkFBQSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0lBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO01BQzdCLE1BQU07S0FDUDtJQUNEQSxJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFBO0lBQ2hELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFBO0lBQ3JCLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLENBQUE7SUFDMUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUE7SUFDcEIsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzdCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7R0FDL0I7O0VBRUQsUUFBUSxFQUFFLFlBQVk7OztJQUNwQkEsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUE7SUFDNUIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUU7SUFDckNDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQTtJQUNoQixLQUFLQSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtNQUMzQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNYLEtBQUs7T0FDTjtLQUNGO0lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRTtNQUNULE1BQU07S0FDUDs7SUFFRCxVQUFVLENBQUMsWUFBRztNQUNaLElBQUksaUJBQWlCLENBQUNPLE1BQUksQ0FBQyxFQUFFO1FBQzNCQSxNQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFBO09BQ2hEO0tBQ0YsRUFBRSxDQUFDLENBQUMsQ0FBQTtHQUNOOztFQUVELGdCQUFnQiwyQkFBQSxFQUFFLEVBQUUsRUFBRTtJQUNwQlAsSUFBSSxHQUFHLENBQUE7SUFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7TUFDakIsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0tBQy9CO0lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxZQUFZO01BQzFCLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO01BQ3JCLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0tBQ3BCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0dBQ2I7OztFQUdELGNBQWMseUJBQUEsRUFBRSxHQUFHLEVBQUU7SUFDbkIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO01BQ2IsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUE7S0FDOUI7U0FDSTtNQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtLQUN2RDtHQUNGOzs7RUFHRCxZQUFZLHlCQUFBLEVBQUUsTUFBTSxFQUFFO0lBQ3BCLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQzFCLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQTtHQUNyQjs7RUFFRCxJQUFJLEVBQUUsRUFBRTs7RUFFUixLQUFLLEVBQUUsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF1QlQsS0FBSyxFQUFFLEVBQUU7O0VBRVQsU0FBUyxvQkFBQSxJQUFJO0dBQ1o7O0VBRUQsVUFBVSxxQkFBQSxJQUFJO0lBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO0dBQ3ZCO0NBQ0YsQ0FBQTs7O0FBR0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUE7OztBQUdwQyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRW1FLFVBQVEsQ0FBQyxDQUFBO0FBQ3JDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7O0FDM1BoRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLEFBRUE7OztBQUtBLEFBQWUsU0FBUyxNQUFNLEVBQUUsSUFBSSxFQUFFO0VBQ3BDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO0NBQzNCOztBQUVELE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7O0FBRXJELE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHLFVBQVUsSUFBSSxFQUFFOztFQUVoRCxNQUFNO0NBQ1AsQ0FBQTs7QUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLElBQUksRUFBRTs7RUFFN0MsTUFBTTtDQUNQLENBQUE7O0FBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFOztFQUV2RCxNQUFNO0NBQ1AsQ0FBQTs7QUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLEtBQUssRUFBRTs7RUFFOUMsTUFBTTtDQUNQLENBQUE7O0FDakREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkFwRSxJQUFNcUUsWUFBVSxHQUFHLEVBQUUsQ0FBQTs7QUFFckIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxVQUFBLEtBQUssRUFBQztFQUMzQ3JFLElBQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFBO0VBQzdCQSxJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFBO0VBQ3hCQSxJQUFNLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBO0VBQ3BCLElBQUk7SUFDRnFFLFlBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxPQUFPLEVBQUMsU0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUEsQ0FBQyxDQUFBO0dBQ3pEO0VBQ0QsT0FBTyxDQUFDLEVBQUU7SUFDUixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUEsNEJBQTJCLEdBQUUsSUFBSSxpQkFBYSxHQUFFLE1BQU0sTUFBRSxDQUFDLENBQUMsQ0FBQTtHQUN4RTtDQUNGLENBQUMsQ0FBQTs7QUFFRixBQUFPLFNBQVNDLGtCQUFnQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRTs7O0VBQ2xFdEUsSUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBO0VBQ3RDQyxJQUFJLFNBQVMsR0FBR29FLFlBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtFQUNsQyxJQUFJLENBQUMsU0FBUyxFQUFFO0lBQ2QsU0FBUyxHQUFHQSxZQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFBO0dBQ3BDO0VBQ0RwRSxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUE7RUFDN0IsSUFBSSxDQUFDLFFBQVEsRUFBRTtJQUNiLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFBO0dBQy9CO0VBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFDLElBQUksRUFBRSxTQUFHTyxNQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUEsQ0FBQyxDQUFBO0NBQzlFOztBQUVELEFBQU8sU0FBUytELHlCQUF1QixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7RUFDcEQsSUFBSTtJQUNGLE9BQU9GLFlBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQTtHQUMvQjtFQUNELE9BQU8sQ0FBQyxFQUFFOztHQUVUO0NBQ0Y7O0FDMUREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsQUFDQSxBQUNBLEFBQ0EsQUFDQTs7O0FBS0EsU0FBUywyQkFBMkIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtFQUN4RCxJQUFJLElBQUksS0FBSyxhQUFhLEVBQUU7SUFDMUIsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsVUFBVSxHQUFHLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRTtNQUMvRCxPQUFPQyxrQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQztLQUNuRSxDQUFBO0lBQ0QsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsVUFBVSxHQUFHLEVBQUU7TUFDakQsT0FBT0MseUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDO0tBQ3JEO0tBQ0EsQ0FBQyxDQUFDO01BQ0QsSUFBSSxFQUFFLGtCQUFrQjtNQUN4QixJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQztLQUN2QyxFQUFFO01BQ0QsSUFBSSxFQUFFLHlCQUF5QjtNQUMvQixJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUM7S0FDakIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLElBQUksRUFBQyxTQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUEsQ0FBQyxDQUFBO0dBQzFDO0NBQ0Y7O0FBRUR2RSxJQUFNd0QsU0FBTyxHQUFHOztFQUVkLGlCQUFpQiw0QkFBQSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7SUFDN0IsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO0dBQy9DOzs7OztFQUtELGlCQUFpQiw0QkFBQSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0lBQ3JDLDJCQUEyQixDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDN0IsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUE7S0FDbEM7U0FDSTtNQUNILEtBQUt4RCxJQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUU7UUFDeEIsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1VBQzlCLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1NBQzVDO09BQ0Y7S0FDRjs7SUFFRCxJQUFJLElBQUksRUFBRTtNQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtNQUMvQixNQUFNLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtLQUM5RDtHQUNGOzs7Ozs7RUFNRCxXQUFXLHNCQUFBLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0lBQzNDLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFO01BQ2hDLE1BQU07S0FDUDtJQUNELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFO01BQ25DLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFBO01BQ25DLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFBO0tBQ2hDO0lBQ0QsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUE7SUFDN0MsSUFBSSxDQUFDLElBQUksRUFBRTtNQUNULE1BQU07S0FDUDs7SUFFRCxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRTtNQUM5QixJQUFJLEVBQUUsSUFBSTtNQUNWLElBQUksRUFBRSxJQUFJO0tBQ1gsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7R0FDcEU7OztFQUdELGNBQWMsMkJBQUEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO0lBQ2hDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7R0FDakM7O0NBRUYsQ0FBQTs7O0FBR0QsU0FBUyxPQUFPLEVBQUUsR0FBRyxFQUFFO0VBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7Q0FDZjs7QUFFRCxBQUFPLFNBQVN3RSxNQUFJLEVBQUUsSUFBSSxFQUFFO0VBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtFQUNqQyxNQUFNLENBQUMsSUFBSSxFQUFFaEIsU0FBTyxDQUFDLENBQUE7Q0FDdEI7O0FDaEhELENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBLENBQUMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFBLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLE9BQU8sQ0FBQyxFQUFBLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFBLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxDQUFDLEVBQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsRUFBQSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUEsQ0FBQyxLQUFLLEVBQUEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFBLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEFBQUM7O0FDQXpzSSxDQUFDLE9BQU8sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxFQUFBLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUEsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFBLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLEVBQUEsS0FBSyxFQUFBLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxNQUFBLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLHdIQUF3SCxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFD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QU8sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDaUMsU0FBTyxDQUFDLENBQUE7SUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtHQUN0QjtDQUNGOzs7Q0FHQTs7O0FDbkNELENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFBLE9BQU8sQ0FBQyxDQUFDLEVBQUEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsTUFBTSxFQUFBLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUEsT0FBTyxDQUFDLENBQUMsRUFBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEFBQUM7O0FDQWx6QixDQUFDLE9BQU8sTUFBTSxLQUFLLFdBQVcsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBLENBQUMsS0FBSyxFQUFBLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBLEVBQUEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsRUFBQSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFBLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUks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QUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUN4QyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUM3QyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUN4QyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUM3QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNwQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUN0QyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsT0FBTyxDQUFD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