From 99b040d9ec1b6cb6267e1c8a38cef6a2297fd8c5 Mon Sep 17 00:00:00 2001 From: krk Date: Wed, 5 Apr 2017 11:55:07 +0300 Subject: [PATCH] Use CSS.escape if available. --- dist/optimal-select.js | 449 ++++++++++++++++----------------- dist/optimal-select.min.js | 2 +- dist/optimal-select.min.js.map | 2 +- src/utilities.js | 11 +- 4 files changed, 222 insertions(+), 242 deletions(-) diff --git a/dist/optimal-select.js b/dist/optimal-select.js index f9b1625..049f8e1 100644 --- a/dist/optimal-select.js +++ b/dist/optimal-select.js @@ -73,12 +73,12 @@ return /******/ (function(modules) { // webpackBootstrap /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 6); +/******/ return __webpack_require__(__webpack_require__.s = 5); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -119,12 +119,17 @@ function convertNodeList(nodes) { * @return {String} - [description] */ function escapeValue(value) { + + if (CSS.escape) { + return value && CSS.escape(value); + } + return value && value.replace(/['"`\\/:\?&!#$%^()[\]{|}*+;,.<=>@~]/g, '\\$&').replace(/\n/g, '\A'); } -/***/ }, +/***/ }), /* 1 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -243,43 +248,41 @@ function getCommonProperties(elements) { // ~ attributes if (commonAttributes !== undefined) { - (function () { - var elementAttributes = element.attributes; - var attributes = Object.keys(elementAttributes).reduce(function (attributes, key) { - var attribute = elementAttributes[key]; - var attributeName = attribute.name; - // NOTE: workaround detection for non-standard phantomjs NamedNodeMap behaviour - // (issue: https://github.com/ariya/phantomjs/issues/14634) - if (attribute && attributeName !== 'class') { - attributes[attributeName] = attribute.value; - } - return attributes; - }, {}); + var elementAttributes = element.attributes; + var attributes = Object.keys(elementAttributes).reduce(function (attributes, key) { + var attribute = elementAttributes[key]; + var attributeName = attribute.name; + // NOTE: workaround detection for non-standard phantomjs NamedNodeMap behaviour + // (issue: https://github.com/ariya/phantomjs/issues/14634) + if (attribute && attributeName !== 'class') { + attributes[attributeName] = attribute.value; + } + return attributes; + }, {}); - var attributesNames = Object.keys(attributes); - var commonAttributesNames = Object.keys(commonAttributes); + var attributesNames = Object.keys(attributes); + var commonAttributesNames = Object.keys(commonAttributes); - if (attributesNames.length) { - if (!commonAttributesNames.length) { - commonProperties.attributes = attributes; - } else { - commonAttributes = commonAttributesNames.reduce(function (nextCommonAttributes, name) { - var value = commonAttributes[name]; - if (value === attributes[name]) { - nextCommonAttributes[name] = value; - } - return nextCommonAttributes; - }, {}); - if (Object.keys(commonAttributes).length) { - commonProperties.attributes = commonAttributes; - } else { - delete commonProperties.attributes; + if (attributesNames.length) { + if (!commonAttributesNames.length) { + commonProperties.attributes = attributes; + } else { + commonAttributes = commonAttributesNames.reduce(function (nextCommonAttributes, name) { + var value = commonAttributes[name]; + if (value === attributes[name]) { + nextCommonAttributes[name] = value; } + return nextCommonAttributes; + }, {}); + if (Object.keys(commonAttributes).length) { + commonProperties.attributes = commonAttributes; + } else { + delete commonProperties.attributes; } - } else { - delete commonProperties.attributes; } - })(); + } else { + delete commonProperties.attributes; + } } // ~ tag @@ -296,9 +299,9 @@ function getCommonProperties(elements) { return commonProperties; } -/***/ }, +/***/ }), /* 2 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -463,7 +466,7 @@ function optimizePart(prePart, current, postPart, elements) { while (names.length) { var partial = current.replace(names.shift(), '').trim(); var pattern = ('' + prePart + partial + postPart).trim(); - if (!pattern.length || pattern.charAt(0) === '>') { + if (!pattern.length || pattern.charAt(0) === '>' || pattern.charAt(pattern.length - 1) === '>') { break; } var matches = document.querySelectorAll(pattern); @@ -471,8 +474,10 @@ function optimizePart(prePart, current, postPart, elements) { current = partial; } } + // robustness: degrade complex classname (heuristic) - if (current && current.match(/\./g).length > 2) { + names = current && current.match(/\./g); + if (names && names.length > 2) { var _references = document.querySelectorAll('' + prePart + current); var _loop2 = function _loop2() { @@ -528,9 +533,9 @@ function compareResults(matches, elements) { } module.exports = exports['default']; -/***/ }, +/***/ }), /* 3 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -539,8 +544,6 @@ 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 _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"); } }; }(); exports.default = adapt; @@ -717,147 +720,121 @@ function getInstructions(selectors) { var validate = null; var instruction = null; - (function () { - switch (true) { + switch (true) { - // child: '>' - case />/.test(type): - instruction = function checkParent(node) { - return function (validate) { - return validate(node.parent) && node.parent; - }; - }; - break; - - // class: '.' - case /^\./.test(type): - var names = type.substr(1).split('.'); - validate = function validate(node) { - var nodeClassName = node.attribs.class; - return nodeClassName && names.every(function (name) { - return nodeClassName.indexOf(name) > -1; - }); + // child: '>' + case />/.test(type): + instruction = function checkParent(node) { + return function (validate) { + return validate(node.parent) && node.parent; }; - instruction = function checkClass(node, root) { - if (discover) { - return node.getElementsByClassName(names.join(' ')); + }; + break; + + // class: '.' + case /^\./.test(type): + var names = type.substr(1).split('.'); + validate = function validate(node) { + var nodeClassName = node.attribs.class; + return nodeClassName && names.every(function (name) { + return nodeClassName.indexOf(name) > -1; + }); + }; + instruction = function checkClass(node, root) { + if (discover) { + return node.getElementsByClassName(names.join(' ')); + } + return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); + }; + break; + + // attribute: '[key="value"]' + case /^\[/.test(type): + var _type$replace$split = type.replace(/\[|\]|"/g, '').split('='), + _type$replace$split2 = _slicedToArray(_type$replace$split, 2), + attributeKey = _type$replace$split2[0], + attributeValue = _type$replace$split2[1]; + + validate = function validate(node) { + var hasAttribute = Object.keys(node.attribs).indexOf(attributeKey) > -1; + if (hasAttribute) { + // regard optional attributeValue + if (!attributeValue || node.attribs[attributeKey] === attributeValue) { + return true; } - return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); - }; - break; - - // attribute: '[key="value"]' - case /^\[/.test(type): - var _type$replace$split = type.replace(/\[|\]|"/g, '').split('='), - _type$replace$split2 = _slicedToArray(_type$replace$split, 2), - attributeKey = _type$replace$split2[0], - attributeValue = _type$replace$split2[1]; - - validate = function validate(node) { - var hasAttribute = Object.keys(node.attribs).indexOf(attributeKey) > -1; - if (hasAttribute) { - // regard optional attributeValue - if (!attributeValue || node.attribs[attributeKey] === attributeValue) { - return true; + } + return false; + }; + instruction = function checkAttribute(node, root) { + if (discover) { + var NodeList = []; + traverseDescendants([node], function (descendant) { + if (validate(descendant)) { + NodeList.push(descendant); } - } - return false; - }; - instruction = function checkAttribute(node, root) { - if (discover) { - var _ret2 = function () { - var NodeList = []; - traverseDescendants([node], function (descendant) { - if (validate(descendant)) { - NodeList.push(descendant); - } - }); - return { - v: NodeList - }; - }(); - - if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === "object") return _ret2.v; - } - return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); - }; - break; + }); + return NodeList; + } + return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); + }; + break; - // id: '#' - case /^#/.test(type): - var id = type.substr(1); - validate = function validate(node) { - return node.attribs.id === id; - }; - instruction = function checkId(node, root) { - if (discover) { - var _ret3 = function () { - var NodeList = []; - traverseDescendants([node], function (descendant, done) { - if (validate(descendant)) { - NodeList.push(descendant); - done(); - } - }); - return { - v: NodeList - }; - }(); - - if ((typeof _ret3 === 'undefined' ? 'undefined' : _typeof(_ret3)) === "object") return _ret3.v; - } - return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); - }; - break; + // id: '#' + case /^#/.test(type): + var id = type.substr(1); + validate = function validate(node) { + return node.attribs.id === id; + }; + instruction = function checkId(node, root) { + if (discover) { + var NodeList = []; + traverseDescendants([node], function (descendant, done) { + if (validate(descendant)) { + NodeList.push(descendant); + done(); + } + }); + return NodeList; + } + return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); + }; + break; - // universal: '*' - case /\*/.test(type): - validate = function validate(node) { - return true; - }; - instruction = function checkUniversal(node, root) { - if (discover) { - var _ret4 = function () { - var NodeList = []; - traverseDescendants([node], function (descendant) { - return NodeList.push(descendant); - }); - return { - v: NodeList - }; - }(); - - if ((typeof _ret4 === 'undefined' ? 'undefined' : _typeof(_ret4)) === "object") return _ret4.v; - } - return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); - }; - break; + // universal: '*' + case /\*/.test(type): + validate = function validate(node) { + return true; + }; + instruction = function checkUniversal(node, root) { + if (discover) { + var NodeList = []; + traverseDescendants([node], function (descendant) { + return NodeList.push(descendant); + }); + return NodeList; + } + return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); + }; + break; - // tag: '...' - default: - validate = function validate(node) { - return node.name === type; - }; - instruction = function checkTag(node, root) { - if (discover) { - var _ret5 = function () { - var NodeList = []; - traverseDescendants([node], function (descendant) { - if (validate(descendant)) { - NodeList.push(descendant); - } - }); - return { - v: NodeList - }; - }(); - - if ((typeof _ret5 === 'undefined' ? 'undefined' : _typeof(_ret5)) === "object") return _ret5.v; - } - return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); - }; - } - })(); + // tag: '...' + default: + validate = function validate(node) { + return node.name === type; + }; + instruction = function checkTag(node, root) { + if (discover) { + var NodeList = []; + traverseDescendants([node], function (descendant) { + if (validate(descendant)) { + NodeList.push(descendant); + } + }); + return NodeList; + } + return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate); + }; + } if (!pseudo) { return instruction; @@ -938,9 +915,9 @@ function getAncestor(node, root, validate) { } module.exports = exports['default']; -/***/ }, +/***/ }), /* 4 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -964,7 +941,7 @@ var _adapt = __webpack_require__(3); var _adapt2 = _interopRequireDefault(_adapt); -var _match = __webpack_require__(5); +var _match = __webpack_require__(6); var _match2 = _interopRequireDefault(_match); @@ -1122,9 +1099,55 @@ function getQuerySelector(input) { return getSingleSelector(input, options); } -/***/ }, +/***/ }), /* 5 */ -/***/ function(module, exports, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = exports.common = exports.optimize = exports.getMultiSelector = exports.getSingleSelector = exports.select = undefined; + +var _select2 = __webpack_require__(4); + +Object.defineProperty(exports, 'getSingleSelector', { + enumerable: true, + get: function get() { + return _select2.getSingleSelector; + } +}); +Object.defineProperty(exports, 'getMultiSelector', { + enumerable: true, + get: function get() { + return _select2.getMultiSelector; + } +}); + +var _select3 = _interopRequireDefault(_select2); + +var _optimize2 = __webpack_require__(2); + +var _optimize3 = _interopRequireDefault(_optimize2); + +var _common2 = __webpack_require__(1); + +var _common = _interopRequireWildcard(_common2); + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.select = _select3.default; +exports.optimize = _optimize3.default; +exports.common = _common; +exports.default = _select3.default; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1208,12 +1231,10 @@ function match(node, options) { }); if (ignoreClass) { - (function () { - var ignoreAttribute = ignore.attribute; - ignore.attribute = function (name, value, defaultPredicate) { - return ignore.class(value) || ignoreAttribute && ignoreAttribute(name, value, defaultPredicate); - }; - })(); + var ignoreAttribute = ignore.attribute; + ignore.attribute = function (name, value, defaultPredicate) { + return ignore.class(value) || ignoreAttribute && ignoreAttribute(name, value, defaultPredicate); + }; } while (element !== root) { @@ -1426,53 +1447,7 @@ function checkIgnore(predicate, name, value, defaultPredicate) { } module.exports = exports['default']; -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = exports.common = exports.optimize = exports.getMultiSelector = exports.getSingleSelector = exports.select = undefined; - -var _select2 = __webpack_require__(4); - -Object.defineProperty(exports, 'getSingleSelector', { - enumerable: true, - get: function get() { - return _select2.getSingleSelector; - } -}); -Object.defineProperty(exports, 'getMultiSelector', { - enumerable: true, - get: function get() { - return _select2.getMultiSelector; - } -}); - -var _select3 = _interopRequireDefault(_select2); - -var _optimize2 = __webpack_require__(2); - -var _optimize3 = _interopRequireDefault(_optimize2); - -var _common2 = __webpack_require__(1); - -var _common = _interopRequireWildcard(_common2); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.select = _select3.default; -exports.optimize = _optimize3.default; -exports.common = _common; -exports.default = _select3.default; - -/***/ } +/***/ }) /******/ ]); }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCA4MDRkOWYyNDdlZGYwNGNlZDYxNyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbGl0aWVzLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL29wdGltaXplLmpzIiwid2VicGFjazovLy8uL3NyYy9hZGFwdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2VsZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9tYXRjaC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanMiXSwibmFtZXMiOlsiY29udmVydE5vZGVMaXN0IiwiZXNjYXBlVmFsdWUiLCJub2RlcyIsImxlbmd0aCIsImFyciIsIkFycmF5IiwiaSIsInZhbHVlIiwicmVwbGFjZSIsImdldENvbW1vbkFuY2VzdG9yIiwiZ2V0Q29tbW9uUHJvcGVydGllcyIsImVsZW1lbnRzIiwib3B0aW9ucyIsInJvb3QiLCJkb2N1bWVudCIsImFuY2VzdG9ycyIsImZvckVhY2giLCJlbGVtZW50IiwiaW5kZXgiLCJwYXJlbnRzIiwicGFyZW50Tm9kZSIsInVuc2hpZnQiLCJzb3J0IiwiY3VyciIsIm5leHQiLCJzaGFsbG93QW5jZXN0b3IiLCJzaGlmdCIsImFuY2VzdG9yIiwicGFyZW50IiwibWlzc2luZyIsInNvbWUiLCJvdGhlclBhcmVudHMiLCJvdGhlclBhcmVudCIsImwiLCJjb21tb25Qcm9wZXJ0aWVzIiwiY2xhc3NlcyIsImF0dHJpYnV0ZXMiLCJ0YWciLCJjb21tb25DbGFzc2VzIiwiY29tbW9uQXR0cmlidXRlcyIsImNvbW1vblRhZyIsInVuZGVmaW5lZCIsImdldEF0dHJpYnV0ZSIsInRyaW0iLCJzcGxpdCIsImZpbHRlciIsImVudHJ5IiwibmFtZSIsImVsZW1lbnRBdHRyaWJ1dGVzIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImtleSIsImF0dHJpYnV0ZSIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVzTmFtZXMiLCJjb21tb25BdHRyaWJ1dGVzTmFtZXMiLCJuZXh0Q29tbW9uQXR0cmlidXRlcyIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsIm9wdGltaXplIiwic2VsZWN0b3IiLCJpc0FycmF5Iiwibm9kZVR5cGUiLCJFcnJvciIsImdsb2JhbE1vZGlmaWVkIiwicGF0aCIsIm9wdGltaXplUGFydCIsInNob3J0ZW5lZCIsInBvcCIsImN1cnJlbnQiLCJwcmVQYXJ0Iiwiam9pbiIsInBvc3RQYXJ0IiwicGF0dGVybiIsIm1hdGNoZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwic2xpY2UiLCJ0ZXN0IiwiY29tcGFyZVJlc3VsdHMiLCJyZWZlcmVuY2VzIiwicmVmZXJlbmNlIiwiY29udGFpbnMiLCJkZXNjcmlwdGlvbiIsImRlc2NlbmRhbnQiLCJ0eXBlIiwibmFtZXMiLCJtYXAiLCJwYXJ0aWFsIiwiY2hhckF0IiwibWF0Y2giLCJldmVyeSIsImFkYXB0IiwiZ2xvYmFsIiwiY29udGV4dCIsIkVsZW1lbnRQcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsImNoaWxkcmVuIiwibm9kZSIsImF0dHJpYnMiLCJOYW1lZE5vZGVNYXAiLCJjb25maWd1cmFibGUiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIkhUTUxDb2xsZWN0aW9uIiwidHJhdmVyc2VEZXNjZW5kYW50cyIsImNoaWxkVGFncyIsInB1c2giLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiY2xhc3NOYW1lIiwiZGVzY2VuZGFudENsYXNzTmFtZSIsImNsYXNzIiwiaW5kZXhPZiIsInNlbGVjdG9ycyIsImluc3RydWN0aW9ucyIsImdldEluc3RydWN0aW9ucyIsImRpc2NvdmVyIiwidG90YWwiLCJzdGVwIiwiaW5jbHVzaXZlIiwiZG9uZSIsInJldmVyc2UiLCJwc2V1ZG8iLCJ2YWxpZGF0ZSIsImluc3RydWN0aW9uIiwiY2hlY2tQYXJlbnQiLCJzdWJzdHIiLCJub2RlQ2xhc3NOYW1lIiwiY2hlY2tDbGFzcyIsImdldEFuY2VzdG9yIiwiYXR0cmlidXRlS2V5IiwiYXR0cmlidXRlVmFsdWUiLCJoYXNBdHRyaWJ1dGUiLCJjaGVja0F0dHJpYnV0ZSIsIk5vZGVMaXN0IiwiaWQiLCJjaGVja0lkIiwiY2hlY2tVbml2ZXJzYWwiLCJjaGVja1RhZyIsInJ1bGUiLCJraW5kIiwicGFyc2VJbnQiLCJ2YWxpZGF0ZVBzZXVkbyIsImNvbXBhcmVTZXQiLCJub2RlSW5kZXgiLCJmaW5kSW5kZXgiLCJjaGlsZCIsImVuaGFuY2VJbnN0cnVjdGlvbiIsIm1hdGNoZWROb2RlIiwiaGFuZGxlciIsInByb2dyZXNzIiwiZ2V0U2luZ2xlU2VsZWN0b3IiLCJnZXRNdWx0aVNlbGVjdG9yIiwiZ2V0UXVlcnlTZWxlY3RvciIsIm9wdGltaXplZCIsImFuY2VzdG9yU2VsZWN0b3IiLCJjb21tb25TZWxlY3RvcnMiLCJnZXRDb21tb25TZWxlY3RvcnMiLCJkZXNjZW5kYW50U2VsZWN0b3IiLCJzZWxlY3Rvck1hdGNoZXMiLCJjb25zb2xlIiwid2FybiIsInNlbGVjdG9yUGF0aCIsImNsYXNzU2VsZWN0b3IiLCJhdHRyaWJ1dGVTZWxlY3RvciIsInBhcnRzIiwiaW5wdXQiLCJkZWZhdWx0SWdub3JlIiwic2tpcCIsInByaW9yaXR5IiwiaWdub3JlIiwiaWdub3JlQ2xhc3MiLCJza2lwQ29tcGFyZSIsInNraXBDaGVja3MiLCJjb21wYXJlIiwicHJlZGljYXRlIiwidG9TdHJpbmciLCJSZWdFeHAiLCJpZ25vcmVBdHRyaWJ1dGUiLCJkZWZhdWx0UHJlZGljYXRlIiwiY2hlY2tBdHRyaWJ1dGVzIiwiY2hlY2tDaGlsZHMiLCJmaW5kUGF0dGVybiIsImZpbmRBdHRyaWJ1dGVzUGF0dGVybiIsInNvcnRlZEtleXMiLCJjdXJyUG9zIiwibmV4dFBvcyIsImN1cnJlbnRJZ25vcmUiLCJjdXJyZW50RGVmYXVsdElnbm9yZSIsImNoZWNrSWdub3JlIiwiZmluZFRhZ1BhdHRlcm4iLCJjaGlsZFBhdHRlcm4iLCJjaGVjayIsInNlbGVjdCIsImNvbW1vbiIsImRlZmF1bHQiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbURBQTJDLGNBQWM7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7OztRQ3BEZ0JBLGUsR0FBQUEsZTtRQWlCQUMsVyxHQUFBQSxXO0FBN0JoQjs7Ozs7O0FBTUE7Ozs7OztBQU1PLFNBQVNELGVBQVQsQ0FBMEJFLEtBQTFCLEVBQWlDO0FBQUEsTUFDOUJDLE1BRDhCLEdBQ25CRCxLQURtQixDQUM5QkMsTUFEOEI7O0FBRXRDLE1BQU1DLE1BQU0sSUFBSUMsS0FBSixDQUFVRixNQUFWLENBQVo7QUFDQSxPQUFLLElBQUlHLElBQUksQ0FBYixFQUFnQkEsSUFBSUgsTUFBcEIsRUFBNEJHLEdBQTVCLEVBQWlDO0FBQy9CRixRQUFJRSxDQUFKLElBQVNKLE1BQU1JLENBQU4sQ0FBVDtBQUNEO0FBQ0QsU0FBT0YsR0FBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFPLFNBQVNILFdBQVQsQ0FBc0JNLEtBQXRCLEVBQTZCO0FBQ2xDLFNBQU9BLFNBQVNBLE1BQU1DLE9BQU4sQ0FBYyxzQ0FBZCxFQUFzRCxNQUF0RCxFQUNNQSxPQUROLENBQ2MsS0FEZCxFQUNxQixJQURyQixDQUFoQjtBQUVELEM7Ozs7Ozs7Ozs7OztRQ3BCZUMsaUIsR0FBQUEsaUI7UUE4Q0FDLG1CLEdBQUFBLG1CO0FBMURoQjs7Ozs7O0FBTUE7Ozs7OztBQU1PLFNBQVNELGlCQUFULENBQTRCRSxRQUE1QixFQUFvRDtBQUFBLE1BQWRDLE9BQWMsdUVBQUosRUFBSTtBQUFBLHNCQUlyREEsT0FKcUQsQ0FHdkRDLElBSHVEO0FBQUEsTUFHdkRBLElBSHVELGlDQUdoREMsUUFIZ0Q7OztBQU16RCxNQUFNQyxZQUFZLEVBQWxCOztBQUVBSixXQUFTSyxPQUFULENBQWlCLFVBQUNDLE9BQUQsRUFBVUMsS0FBVixFQUFvQjtBQUNuQyxRQUFNQyxVQUFVLEVBQWhCO0FBQ0EsV0FBT0YsWUFBWUosSUFBbkIsRUFBeUI7QUFDdkJJLGdCQUFVQSxRQUFRRyxVQUFsQjtBQUNBRCxjQUFRRSxPQUFSLENBQWdCSixPQUFoQjtBQUNEO0FBQ0RGLGNBQVVHLEtBQVYsSUFBbUJDLE9BQW5CO0FBQ0QsR0FQRDs7QUFTQUosWUFBVU8sSUFBVixDQUFlLFVBQUNDLElBQUQsRUFBT0MsSUFBUDtBQUFBLFdBQWdCRCxLQUFLcEIsTUFBTCxHQUFjcUIsS0FBS3JCLE1BQW5DO0FBQUEsR0FBZjs7QUFFQSxNQUFNc0Isa0JBQWtCVixVQUFVVyxLQUFWLEVBQXhCOztBQUVBLE1BQUlDLFdBQVcsSUFBZjs7QUFyQnlEO0FBd0J2RCxRQUFNQyxTQUFTSCxnQkFBZ0JuQixDQUFoQixDQUFmO0FBQ0EsUUFBTXVCLFVBQVVkLFVBQVVlLElBQVYsQ0FBZSxVQUFDQyxZQUFELEVBQWtCO0FBQy9DLGFBQU8sQ0FBQ0EsYUFBYUQsSUFBYixDQUFrQixVQUFDRSxXQUFEO0FBQUEsZUFBaUJBLGdCQUFnQkosTUFBakM7QUFBQSxPQUFsQixDQUFSO0FBQ0QsS0FGZSxDQUFoQjs7QUFJQSxRQUFJQyxPQUFKLEVBQWE7QUFDWDtBQUNBO0FBQ0Q7O0FBRURGLGVBQVdDLE1BQVg7QUFsQ3VEOztBQXVCekQsT0FBSyxJQUFJdEIsSUFBSSxDQUFSLEVBQVcyQixJQUFJUixnQkFBZ0J0QixNQUFwQyxFQUE0Q0csSUFBSTJCLENBQWhELEVBQW1EM0IsR0FBbkQsRUFBd0Q7QUFBQTs7QUFBQSwwQkFRcEQ7QUFJSDs7QUFFRCxTQUFPcUIsUUFBUDtBQUNEOztBQUVEOzs7Ozs7QUFNTyxTQUFTakIsbUJBQVQsQ0FBOEJDLFFBQTlCLEVBQXdDOztBQUU3QyxNQUFNdUIsbUJBQW1CO0FBQ3ZCQyxhQUFTLEVBRGM7QUFFdkJDLGdCQUFZLEVBRlc7QUFHdkJDLFNBQUs7QUFIa0IsR0FBekI7O0FBTUExQixXQUFTSyxPQUFULENBQWlCLFVBQUNDLE9BQUQsRUFBYTtBQUFBLFFBR2pCcUIsYUFIaUIsR0FNeEJKLGdCQU53QixDQUcxQkMsT0FIMEI7QUFBQSxRQUlkSSxnQkFKYyxHQU14QkwsZ0JBTndCLENBSTFCRSxVQUowQjtBQUFBLFFBS3JCSSxTQUxxQixHQU14Qk4sZ0JBTndCLENBSzFCRyxHQUwwQjs7QUFRNUI7O0FBQ0EsUUFBSUMsa0JBQWtCRyxTQUF0QixFQUFpQztBQUMvQixVQUFJTixVQUFVbEIsUUFBUXlCLFlBQVIsQ0FBcUIsT0FBckIsQ0FBZDtBQUNBLFVBQUlQLE9BQUosRUFBYTtBQUNYQSxrQkFBVUEsUUFBUVEsSUFBUixHQUFlQyxLQUFmLENBQXFCLEdBQXJCLENBQVY7QUFDQSxZQUFJLENBQUNOLGNBQWNuQyxNQUFuQixFQUEyQjtBQUN6QitCLDJCQUFpQkMsT0FBakIsR0FBMkJBLE9BQTNCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xHLDBCQUFnQkEsY0FBY08sTUFBZCxDQUFxQixVQUFDQyxLQUFEO0FBQUEsbUJBQVdYLFFBQVFMLElBQVIsQ0FBYSxVQUFDaUIsSUFBRDtBQUFBLHFCQUFVQSxTQUFTRCxLQUFuQjtBQUFBLGFBQWIsQ0FBWDtBQUFBLFdBQXJCLENBQWhCO0FBQ0EsY0FBSVIsY0FBY25DLE1BQWxCLEVBQTBCO0FBQ3hCK0IsNkJBQWlCQyxPQUFqQixHQUEyQkcsYUFBM0I7QUFDRCxXQUZELE1BRU87QUFDTCxtQkFBT0osaUJBQWlCQyxPQUF4QjtBQUNEO0FBQ0Y7QUFDRixPQVpELE1BWU87QUFDTDtBQUNBLGVBQU9ELGlCQUFpQkMsT0FBeEI7QUFDRDtBQUNGOztBQUVEO0FBQ0EsUUFBSUkscUJBQXFCRSxTQUF6QixFQUFvQztBQUFBO0FBQ2xDLFlBQU1PLG9CQUFvQi9CLFFBQVFtQixVQUFsQztBQUNBLFlBQU1BLGFBQWFhLE9BQU9DLElBQVAsQ0FBWUYsaUJBQVosRUFBK0JHLE1BQS9CLENBQXNDLFVBQUNmLFVBQUQsRUFBYWdCLEdBQWIsRUFBcUI7QUFDNUUsY0FBTUMsWUFBWUwsa0JBQWtCSSxHQUFsQixDQUFsQjtBQUNBLGNBQU1FLGdCQUFnQkQsVUFBVU4sSUFBaEM7QUFDQTtBQUNBO0FBQ0EsY0FBSU0sYUFBYUMsa0JBQWtCLE9BQW5DLEVBQTRDO0FBQzFDbEIsdUJBQVdrQixhQUFYLElBQTRCRCxVQUFVOUMsS0FBdEM7QUFDRDtBQUNELGlCQUFPNkIsVUFBUDtBQUNELFNBVGtCLEVBU2hCLEVBVGdCLENBQW5COztBQVdBLFlBQU1tQixrQkFBa0JOLE9BQU9DLElBQVAsQ0FBWWQsVUFBWixDQUF4QjtBQUNBLFlBQU1vQix3QkFBd0JQLE9BQU9DLElBQVAsQ0FBWVgsZ0JBQVosQ0FBOUI7O0FBRUEsWUFBSWdCLGdCQUFnQnBELE1BQXBCLEVBQTRCO0FBQzFCLGNBQUksQ0FBQ3FELHNCQUFzQnJELE1BQTNCLEVBQW1DO0FBQ2pDK0IsNkJBQWlCRSxVQUFqQixHQUE4QkEsVUFBOUI7QUFDRCxXQUZELE1BRU87QUFDTEcsK0JBQW1CaUIsc0JBQXNCTCxNQUF0QixDQUE2QixVQUFDTSxvQkFBRCxFQUF1QlYsSUFBdkIsRUFBZ0M7QUFDOUUsa0JBQU14QyxRQUFRZ0MsaUJBQWlCUSxJQUFqQixDQUFkO0FBQ0Esa0JBQUl4QyxVQUFVNkIsV0FBV1csSUFBWCxDQUFkLEVBQWdDO0FBQzlCVSxxQ0FBcUJWLElBQXJCLElBQTZCeEMsS0FBN0I7QUFDRDtBQUNELHFCQUFPa0Qsb0JBQVA7QUFDRCxhQU5rQixFQU1oQixFQU5nQixDQUFuQjtBQU9BLGdCQUFJUixPQUFPQyxJQUFQLENBQVlYLGdCQUFaLEVBQThCcEMsTUFBbEMsRUFBMEM7QUFDeEMrQiwrQkFBaUJFLFVBQWpCLEdBQThCRyxnQkFBOUI7QUFDRCxhQUZELE1BRU87QUFDTCxxQkFBT0wsaUJBQWlCRSxVQUF4QjtBQUNEO0FBQ0Y7QUFDRixTQWpCRCxNQWlCTztBQUNMLGlCQUFPRixpQkFBaUJFLFVBQXhCO0FBQ0Q7QUFuQ2lDO0FBb0NuQzs7QUFFRDtBQUNBLFFBQUlJLGNBQWNDLFNBQWxCLEVBQTZCO0FBQzNCLFVBQU1KLE1BQU1wQixRQUFReUMsT0FBUixDQUFnQkMsV0FBaEIsRUFBWjtBQUNBLFVBQUksQ0FBQ25CLFNBQUwsRUFBZ0I7QUFDZE4seUJBQWlCRyxHQUFqQixHQUF1QkEsR0FBdkI7QUFDRCxPQUZELE1BRU8sSUFBSUEsUUFBUUcsU0FBWixFQUF1QjtBQUM1QixlQUFPTixpQkFBaUJHLEdBQXhCO0FBQ0Q7QUFDRjtBQUNGLEdBN0VEOztBQStFQSxTQUFPSCxnQkFBUDtBQUNELEM7Ozs7Ozs7Ozs7OztrQkNoSXVCMEIsUTs7QUFYeEI7Ozs7QUFDQTs7OztBQUVBOzs7Ozs7OztBQVZBOzs7Ozs7O0FBa0JlLFNBQVNBLFFBQVQsQ0FBbUJDLFFBQW5CLEVBQTZCbEQsUUFBN0IsRUFBcUQ7QUFBQSxNQUFkQyxPQUFjLHVFQUFKLEVBQUk7OztBQUVsRTtBQUNBLE1BQUksQ0FBQ1AsTUFBTXlELE9BQU4sQ0FBY25ELFFBQWQsQ0FBTCxFQUE4QjtBQUM1QkEsZUFBVyxDQUFDQSxTQUFTUixNQUFWLEdBQW1CLENBQUNRLFFBQUQsQ0FBbkIsR0FBZ0MsZ0NBQWdCQSxRQUFoQixDQUEzQztBQUNEOztBQUVELE1BQUksQ0FBQ0EsU0FBU1IsTUFBVixJQUFvQlEsU0FBU21CLElBQVQsQ0FBYyxVQUFDYixPQUFEO0FBQUEsV0FBYUEsUUFBUThDLFFBQVIsS0FBcUIsQ0FBbEM7QUFBQSxHQUFkLENBQXhCLEVBQTRFO0FBQzFFLFVBQU0sSUFBSUMsS0FBSiw4SEFBTjtBQUNEOztBQUVELE1BQU1DLGlCQUFpQixxQkFBTXRELFNBQVMsQ0FBVCxDQUFOLEVBQW1CQyxPQUFuQixDQUF2Qjs7QUFFQTtBQUNBLE1BQUlzRCxPQUFPTCxTQUFTckQsT0FBVCxDQUFpQixLQUFqQixFQUF3QixHQUF4QixFQUE2Qm9DLEtBQTdCLENBQW1DLGlDQUFuQyxDQUFYOztBQUVBLE1BQUlzQixLQUFLL0QsTUFBTCxHQUFjLENBQWxCLEVBQXFCO0FBQ25CLFdBQU9nRSxhQUFhLEVBQWIsRUFBaUJOLFFBQWpCLEVBQTJCLEVBQTNCLEVBQStCbEQsUUFBL0IsQ0FBUDtBQUNEOztBQUVELE1BQU15RCxZQUFZLENBQUNGLEtBQUtHLEdBQUwsRUFBRCxDQUFsQjtBQUNBLFNBQU9ILEtBQUsvRCxNQUFMLEdBQWMsQ0FBckIsRUFBeUI7QUFDdkIsUUFBTW1FLFVBQVVKLEtBQUtHLEdBQUwsRUFBaEI7QUFDQSxRQUFNRSxVQUFVTCxLQUFLTSxJQUFMLENBQVUsR0FBVixDQUFoQjtBQUNBLFFBQU1DLFdBQVdMLFVBQVVJLElBQVYsQ0FBZSxHQUFmLENBQWpCOztBQUVBLFFBQU1FLFVBQWFILE9BQWIsU0FBd0JFLFFBQTlCO0FBQ0EsUUFBTUUsVUFBVTdELFNBQVM4RCxnQkFBVCxDQUEwQkYsT0FBMUIsQ0FBaEI7QUFDQSxRQUFJQyxRQUFReEUsTUFBUixLQUFtQlEsU0FBU1IsTUFBaEMsRUFBd0M7QUFDdENpRSxnQkFBVS9DLE9BQVYsQ0FBa0I4QyxhQUFhSSxPQUFiLEVBQXNCRCxPQUF0QixFQUErQkcsUUFBL0IsRUFBeUM5RCxRQUF6QyxDQUFsQjtBQUNEO0FBQ0Y7QUFDRHlELFlBQVUvQyxPQUFWLENBQWtCNkMsS0FBSyxDQUFMLENBQWxCO0FBQ0FBLFNBQU9FLFNBQVA7O0FBRUE7QUFDQUYsT0FBSyxDQUFMLElBQVVDLGFBQWEsRUFBYixFQUFpQkQsS0FBSyxDQUFMLENBQWpCLEVBQTBCQSxLQUFLVyxLQUFMLENBQVcsQ0FBWCxFQUFjTCxJQUFkLENBQW1CLEdBQW5CLENBQTFCLEVBQW1EN0QsUUFBbkQsQ0FBVjtBQUNBdUQsT0FBS0EsS0FBSy9ELE1BQUwsR0FBWSxDQUFqQixJQUFzQmdFLGFBQWFELEtBQUtXLEtBQUwsQ0FBVyxDQUFYLEVBQWMsQ0FBQyxDQUFmLEVBQWtCTCxJQUFsQixDQUF1QixHQUF2QixDQUFiLEVBQTBDTixLQUFLQSxLQUFLL0QsTUFBTCxHQUFZLENBQWpCLENBQTFDLEVBQStELEVBQS9ELEVBQW1FUSxRQUFuRSxDQUF0Qjs7QUFFQSxNQUFJc0QsY0FBSixFQUFvQjtBQUNsQixXQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFPQyxLQUFLTSxJQUFMLENBQVUsR0FBVixFQUFlaEUsT0FBZixDQUF1QixJQUF2QixFQUE2QixJQUE3QixFQUFtQ21DLElBQW5DLEVBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O0FBU0EsU0FBU3dCLFlBQVQsQ0FBdUJJLE9BQXZCLEVBQWdDRCxPQUFoQyxFQUF5Q0csUUFBekMsRUFBbUQ5RCxRQUFuRCxFQUE2RDtBQUMzRCxNQUFJNEQsUUFBUXBFLE1BQVosRUFBb0JvRSxVQUFhQSxPQUFiO0FBQ3BCLE1BQUlFLFNBQVN0RSxNQUFiLEVBQXFCc0UsaUJBQWVBLFFBQWY7O0FBRXJCO0FBQ0EsTUFBSSxRQUFRSyxJQUFSLENBQWFSLE9BQWIsQ0FBSixFQUEyQjtBQUN6QixRQUFNbEIsTUFBTWtCLFFBQVE5RCxPQUFSLENBQWdCLE1BQWhCLEVBQXdCLEdBQXhCLENBQVo7QUFDQSxRQUFJa0UsZUFBYUgsT0FBYixHQUF1Qm5CLEdBQXZCLEdBQTZCcUIsUUFBakM7QUFDQSxRQUFJRSxVQUFVN0QsU0FBUzhELGdCQUFULENBQTBCRixPQUExQixDQUFkO0FBQ0EsUUFBSUssZUFBZUosT0FBZixFQUF3QmhFLFFBQXhCLENBQUosRUFBdUM7QUFDckMyRCxnQkFBVWxCLEdBQVY7QUFDRCxLQUZELE1BRU87QUFDTDtBQUNBLFVBQU00QixhQUFhbEUsU0FBUzhELGdCQUFULE1BQTZCTCxPQUE3QixHQUF1Q25CLEdBQXZDLENBQW5COztBQUZLO0FBSUgsWUFBTTZCLFlBQVlELFdBQVcxRSxDQUFYLENBQWxCO0FBQ0EsWUFBSUssU0FBU21CLElBQVQsQ0FBYyxVQUFDYixPQUFEO0FBQUEsaUJBQWFnRSxVQUFVQyxRQUFWLENBQW1CakUsT0FBbkIsQ0FBYjtBQUFBLFNBQWQsQ0FBSixFQUE2RDtBQUMzRCxjQUFNa0UsY0FBY0YsVUFBVXZCLE9BQVYsQ0FBa0JDLFdBQWxCLEVBQXBCO0FBQ0llLHlCQUFhSCxPQUFiLEdBQXVCWSxXQUF2QixHQUFxQ1YsUUFGa0I7QUFHdkRFLG9CQUFVN0QsU0FBUzhELGdCQUFULENBQTBCRixPQUExQixDQUg2Qzs7QUFJM0QsY0FBSUssZUFBZUosT0FBZixFQUF3QmhFLFFBQXhCLENBQUosRUFBdUM7QUFDckMyRCxzQkFBVWEsV0FBVjtBQUNEO0FBQ0Q7QUFDRDtBQWJFOztBQUdMLFdBQUssSUFBSTdFLElBQUksQ0FBUixFQUFXMkIsSUFBSStDLFdBQVc3RSxNQUEvQixFQUF1Q0csSUFBSTJCLENBQTNDLEVBQThDM0IsR0FBOUMsRUFBbUQ7QUFBQSxZQUkzQ29FLE9BSjJDO0FBQUEsWUFLM0NDLE9BTDJDOztBQUFBOztBQUFBLDhCQVMvQztBQUVIO0FBQ0Y7QUFDRjs7QUFFRDtBQUNBLE1BQUksSUFBSUcsSUFBSixDQUFTUixPQUFULENBQUosRUFBdUI7QUFDckIsUUFBTWMsYUFBYWQsUUFBUTlELE9BQVIsQ0FBZ0IsR0FBaEIsRUFBcUIsRUFBckIsQ0FBbkI7QUFDQSxRQUFJa0UsZUFBYUgsT0FBYixHQUF1QmEsVUFBdkIsR0FBb0NYLFFBQXhDO0FBQ0EsUUFBSUUsVUFBVTdELFNBQVM4RCxnQkFBVCxDQUEwQkYsT0FBMUIsQ0FBZDtBQUNBLFFBQUlLLGVBQWVKLE9BQWYsRUFBd0JoRSxRQUF4QixDQUFKLEVBQXVDO0FBQ3JDMkQsZ0JBQVVjLFVBQVY7QUFDRDtBQUNGOztBQUVEO0FBQ0EsTUFBSSxhQUFhTixJQUFiLENBQWtCUixPQUFsQixDQUFKLEVBQWdDO0FBQzlCO0FBQ0EsUUFBTWUsT0FBT2YsUUFBUTlELE9BQVIsQ0FBZ0IsWUFBaEIsRUFBOEIsYUFBOUIsQ0FBYjtBQUNBLFFBQUlrRSxlQUFhSCxPQUFiLEdBQXVCYyxJQUF2QixHQUE4QlosUUFBbEM7QUFDQSxRQUFJRSxVQUFVN0QsU0FBUzhELGdCQUFULENBQTBCRixPQUExQixDQUFkO0FBQ0EsUUFBSUssZUFBZUosT0FBZixFQUF3QmhFLFFBQXhCLENBQUosRUFBdUM7QUFDckMyRCxnQkFBVWUsSUFBVjtBQUNEO0FBQ0Y7O0FBRUQ7QUFDQSxNQUFJLGFBQWFQLElBQWIsQ0FBa0JSLE9BQWxCLENBQUosRUFBZ0M7QUFDOUIsUUFBTWdCLFFBQVFoQixRQUFRM0IsSUFBUixHQUFlQyxLQUFmLENBQXFCLEdBQXJCLEVBQTBCaUMsS0FBMUIsQ0FBZ0MsQ0FBaEMsRUFBbUNVLEdBQW5DLENBQXVDLFVBQUN4QyxJQUFEO0FBQUEsbUJBQWNBLElBQWQ7QUFBQSxLQUF2QyxFQUNlekIsSUFEZixDQUNvQixVQUFDQyxJQUFELEVBQU9DLElBQVA7QUFBQSxhQUFnQkQsS0FBS3BCLE1BQUwsR0FBY3FCLEtBQUtyQixNQUFuQztBQUFBLEtBRHBCLENBQWQ7QUFFQSxXQUFPbUYsTUFBTW5GLE1BQWIsRUFBcUI7QUFDbkIsVUFBSXFGLFVBQVVsQixRQUFROUQsT0FBUixDQUFnQjhFLE1BQU01RCxLQUFOLEVBQWhCLEVBQStCLEVBQS9CLEVBQW1DaUIsSUFBbkMsRUFBZDtBQUNBLFVBQUkrQixVQUFVLE1BQUdILE9BQUgsR0FBYWlCLE9BQWIsR0FBdUJmLFFBQXZCLEVBQWtDOUIsSUFBbEMsRUFBZDtBQUNBLFVBQUksQ0FBQytCLFFBQVF2RSxNQUFULElBQW1CdUUsUUFBUWUsTUFBUixDQUFlLENBQWYsTUFBc0IsR0FBN0MsRUFBa0Q7QUFDaEQ7QUFDRDtBQUNELFVBQUlkLFVBQVU3RCxTQUFTOEQsZ0JBQVQsQ0FBMEJGLE9BQTFCLENBQWQ7QUFDQSxVQUFJSyxlQUFlSixPQUFmLEVBQXdCaEUsUUFBeEIsQ0FBSixFQUF1QztBQUNyQzJELGtCQUFVa0IsT0FBVjtBQUNEO0FBQ0Y7QUFDRDtBQUNBLFFBQUlsQixXQUFXQSxRQUFRb0IsS0FBUixDQUFjLEtBQWQsRUFBcUJ2RixNQUFyQixHQUE4QixDQUE3QyxFQUFnRDtBQUM5QyxVQUFNNkUsY0FBYWxFLFNBQVM4RCxnQkFBVCxNQUE2QkwsT0FBN0IsR0FBdUNELE9BQXZDLENBQW5COztBQUQ4QztBQUc1QyxZQUFNVyxZQUFZRCxZQUFXMUUsQ0FBWCxDQUFsQjtBQUNBLFlBQUlLLFNBQVNtQixJQUFULENBQWMsVUFBQ2IsT0FBRDtBQUFBLGlCQUFhZ0UsVUFBVUMsUUFBVixDQUFtQmpFLE9BQW5CLENBQWI7QUFBQSxTQUFkLENBQUosRUFBOEQ7QUFDNUQ7QUFDQTtBQUNBLGNBQU1rRSxjQUFjRixVQUFVdkIsT0FBVixDQUFrQkMsV0FBbEIsRUFBcEI7QUFDSWUseUJBQWFILE9BQWIsR0FBdUJZLFdBQXZCLEdBQXFDVixRQUptQjtBQUt4REUsb0JBQVU3RCxTQUFTOEQsZ0JBQVQsQ0FBMEJGLE9BQTFCLENBTDhDOztBQU01RCxjQUFJSyxlQUFlSixPQUFmLEVBQXdCaEUsUUFBeEIsQ0FBSixFQUF1QztBQUNyQzJELHNCQUFVYSxXQUFWO0FBQ0Q7QUFDRDtBQUNEO0FBZDJDOztBQUU5QyxXQUFLLElBQUk3RSxJQUFJLENBQVIsRUFBVzJCLElBQUkrQyxZQUFXN0UsTUFBL0IsRUFBdUNHLElBQUkyQixDQUEzQyxFQUE4QzNCLEdBQTlDLEVBQW1EO0FBQUEsWUFNM0NvRSxPQU4yQztBQUFBLFlBTzNDQyxPQVAyQzs7QUFBQTs7QUFBQSwrQkFXL0M7QUFFSDtBQUNGO0FBQ0Y7O0FBRUQsU0FBT0wsT0FBUDtBQUNEOztBQUVEOzs7Ozs7O0FBT0EsU0FBU1MsY0FBVCxDQUF5QkosT0FBekIsRUFBa0NoRSxRQUFsQyxFQUE0QztBQUFBLE1BQ2xDUixNQURrQyxHQUN2QndFLE9BRHVCLENBQ2xDeEUsTUFEa0M7O0FBRTFDLFNBQU9BLFdBQVdRLFNBQVNSLE1BQXBCLElBQThCUSxTQUFTZ0YsS0FBVCxDQUFlLFVBQUMxRSxPQUFELEVBQWE7QUFDL0QsU0FBSyxJQUFJWCxJQUFJLENBQWIsRUFBZ0JBLElBQUlILE1BQXBCLEVBQTRCRyxHQUE1QixFQUFpQztBQUMvQixVQUFJcUUsUUFBUXJFLENBQVIsTUFBZVcsT0FBbkIsRUFBNEI7QUFDMUIsZUFBTyxJQUFQO0FBQ0Q7QUFDRjtBQUNELFdBQU8sS0FBUDtBQUNELEdBUG9DLENBQXJDO0FBUUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQkNyS3VCMkUsSztBQWJ4Qjs7Ozs7O0FBTUE7Ozs7Ozs7QUFPZSxTQUFTQSxLQUFULENBQWdCM0UsT0FBaEIsRUFBeUJMLE9BQXpCLEVBQWtDOztBQUUvQztBQUNBLE1BQUksSUFBSixFQUFxQjtBQUNuQixXQUFPLEtBQVA7QUFDRCxHQUZELE1BRU87QUFDTGlGLFdBQU8vRSxRQUFQLEdBQWtCRixRQUFRa0YsT0FBUixJQUFvQixZQUFNO0FBQzFDLFVBQUlqRixPQUFPSSxPQUFYO0FBQ0EsYUFBT0osS0FBS2UsTUFBWixFQUFvQjtBQUNsQmYsZUFBT0EsS0FBS2UsTUFBWjtBQUNEO0FBQ0QsYUFBT2YsSUFBUDtBQUNELEtBTm9DLEVBQXJDO0FBT0Q7O0FBRUQ7QUFDQSxNQUFNa0YsbUJBQW1COUMsT0FBTytDLGNBQVAsQ0FBc0IsSUFBdEIsQ0FBekI7O0FBRUE7QUFDQSxNQUFJLENBQUMvQyxPQUFPZ0Qsd0JBQVAsQ0FBZ0NGLGdCQUFoQyxFQUFrRCxXQUFsRCxDQUFMLEVBQXFFO0FBQ25FOUMsV0FBT2lELGNBQVAsQ0FBc0JILGdCQUF0QixFQUF3QyxXQUF4QyxFQUFxRDtBQUNuREksa0JBQVksSUFEdUM7QUFFbkRDLFNBRm1ELGlCQUU1QztBQUNMLGVBQU8sS0FBS0MsUUFBTCxDQUFjeEQsTUFBZCxDQUFxQixVQUFDeUQsSUFBRCxFQUFVO0FBQ3BDO0FBQ0EsaUJBQU9BLEtBQUtqQixJQUFMLEtBQWMsS0FBZCxJQUF1QmlCLEtBQUtqQixJQUFMLEtBQWMsUUFBckMsSUFBaURpQixLQUFLakIsSUFBTCxLQUFjLE9BQXRFO0FBQ0QsU0FITSxDQUFQO0FBSUQ7QUFQa0QsS0FBckQ7QUFTRDs7QUFFRCxNQUFJLENBQUNwQyxPQUFPZ0Qsd0JBQVAsQ0FBZ0NGLGdCQUFoQyxFQUFrRCxZQUFsRCxDQUFMLEVBQXNFO0FBQ3BFO0FBQ0E7QUFDQTlDLFdBQU9pRCxjQUFQLENBQXNCSCxnQkFBdEIsRUFBd0MsWUFBeEMsRUFBc0Q7QUFDcERJLGtCQUFZLElBRHdDO0FBRXBEQyxTQUZvRCxpQkFFN0M7QUFBQSxZQUNHRyxPQURILEdBQ2UsSUFEZixDQUNHQSxPQURIOztBQUVMLFlBQU1oRCxrQkFBa0JOLE9BQU9DLElBQVAsQ0FBWXFELE9BQVosQ0FBeEI7QUFDQSxZQUFNQyxlQUFlakQsZ0JBQWdCSixNQUFoQixDQUF1QixVQUFDZixVQUFELEVBQWFrQixhQUFiLEVBQTRCcEMsS0FBNUIsRUFBc0M7QUFDaEZrQixxQkFBV2xCLEtBQVgsSUFBb0I7QUFDbEI2QixrQkFBTU8sYUFEWTtBQUVsQi9DLG1CQUFPZ0csUUFBUWpELGFBQVI7QUFGVyxXQUFwQjtBQUlBLGlCQUFPbEIsVUFBUDtBQUNELFNBTm9CLEVBTWxCLEVBTmtCLENBQXJCO0FBT0FhLGVBQU9pRCxjQUFQLENBQXNCTSxZQUF0QixFQUFvQyxRQUFwQyxFQUE4QztBQUM1Q0wsc0JBQVksS0FEZ0M7QUFFNUNNLHdCQUFjLEtBRjhCO0FBRzVDbEcsaUJBQU9nRCxnQkFBZ0JwRDtBQUhxQixTQUE5QztBQUtBLGVBQU9xRyxZQUFQO0FBQ0Q7QUFsQm1ELEtBQXREO0FBb0JEOztBQUVELE1BQUksQ0FBQ1QsaUJBQWlCckQsWUFBdEIsRUFBb0M7QUFDbEM7QUFDQTtBQUNBcUQscUJBQWlCckQsWUFBakIsR0FBZ0MsVUFBVUssSUFBVixFQUFnQjtBQUM5QyxhQUFPLEtBQUt3RCxPQUFMLENBQWF4RCxJQUFiLEtBQXNCLElBQTdCO0FBQ0QsS0FGRDtBQUdEOztBQUVELE1BQUksQ0FBQ2dELGlCQUFpQlcsb0JBQXRCLEVBQTRDO0FBQzFDO0FBQ0E7QUFDQVgscUJBQWlCVyxvQkFBakIsR0FBd0MsVUFBVWhELE9BQVYsRUFBbUI7QUFDekQsVUFBTWlELGlCQUFpQixFQUF2QjtBQUNBQywwQkFBb0IsS0FBS0MsU0FBekIsRUFBb0MsVUFBQ3pCLFVBQUQsRUFBZ0I7QUFDbEQsWUFBSUEsV0FBV3JDLElBQVgsS0FBb0JXLE9BQXBCLElBQStCQSxZQUFZLEdBQS9DLEVBQW9EO0FBQ2xEaUQseUJBQWVHLElBQWYsQ0FBb0IxQixVQUFwQjtBQUNEO0FBQ0YsT0FKRDtBQUtBLGFBQU91QixjQUFQO0FBQ0QsS0FSRDtBQVNEOztBQUVELE1BQUksQ0FBQ1osaUJBQWlCZ0Isc0JBQXRCLEVBQThDO0FBQzVDO0FBQ0E7QUFDQWhCLHFCQUFpQmdCLHNCQUFqQixHQUEwQyxVQUFVQyxTQUFWLEVBQXFCO0FBQzdELFVBQU0xQixRQUFRMEIsVUFBVXJFLElBQVYsR0FBaUJuQyxPQUFqQixDQUF5QixNQUF6QixFQUFpQyxHQUFqQyxFQUFzQ29DLEtBQXRDLENBQTRDLEdBQTVDLENBQWQ7QUFDQSxVQUFNK0QsaUJBQWlCLEVBQXZCO0FBQ0FDLDBCQUFvQixDQUFDLElBQUQsQ0FBcEIsRUFBNEIsVUFBQ3hCLFVBQUQsRUFBZ0I7QUFDMUMsWUFBTTZCLHNCQUFzQjdCLFdBQVdtQixPQUFYLENBQW1CVyxLQUEvQztBQUNBLFlBQUlELHVCQUF1QjNCLE1BQU1LLEtBQU4sQ0FBWSxVQUFDNUMsSUFBRDtBQUFBLGlCQUFVa0Usb0JBQW9CRSxPQUFwQixDQUE0QnBFLElBQTVCLElBQW9DLENBQUMsQ0FBL0M7QUFBQSxTQUFaLENBQTNCLEVBQTBGO0FBQ3hGNEQseUJBQWVHLElBQWYsQ0FBb0IxQixVQUFwQjtBQUNEO0FBQ0YsT0FMRDtBQU1BLGFBQU91QixjQUFQO0FBQ0QsS0FWRDtBQVdEOztBQUVELE1BQUksQ0FBQ1osaUJBQWlCbkIsZ0JBQXRCLEVBQXdDO0FBQ3RDO0FBQ0E7QUFDQW1CLHFCQUFpQm5CLGdCQUFqQixHQUFvQyxVQUFVd0MsU0FBVixFQUFxQjtBQUFBOztBQUN2REEsa0JBQVlBLFVBQVU1RyxPQUFWLENBQWtCLFVBQWxCLEVBQThCLE9BQTlCLEVBQXVDbUMsSUFBdkMsRUFBWixDQUR1RCxDQUNHOztBQUUxRDtBQUNBLFVBQU0wRSxlQUFlQyxnQkFBZ0JGLFNBQWhCLENBQXJCO0FBQ0EsVUFBTUcsV0FBV0YsYUFBYTNGLEtBQWIsRUFBakI7O0FBRUEsVUFBTThGLFFBQVFILGFBQWFsSCxNQUEzQjtBQUNBLGFBQU9vSCxTQUFTLElBQVQsRUFBZTFFLE1BQWYsQ0FBc0IsVUFBQ3lELElBQUQsRUFBVTtBQUNyQyxZQUFJbUIsT0FBTyxDQUFYO0FBQ0EsZUFBT0EsT0FBT0QsS0FBZCxFQUFxQjtBQUNuQmxCLGlCQUFPZSxhQUFhSSxJQUFiLEVBQW1CbkIsSUFBbkIsUUFBUDtBQUNBLGNBQUksQ0FBQ0EsSUFBTCxFQUFXO0FBQUU7QUFDWCxtQkFBTyxLQUFQO0FBQ0Q7QUFDRG1CLGtCQUFRLENBQVI7QUFDRDtBQUNELGVBQU8sSUFBUDtBQUNELE9BVk0sQ0FBUDtBQVdELEtBbkJEO0FBb0JEOztBQUVELE1BQUksQ0FBQzFCLGlCQUFpQmIsUUFBdEIsRUFBZ0M7QUFDOUI7QUFDQWEscUJBQWlCYixRQUFqQixHQUE0QixVQUFVakUsT0FBVixFQUFtQjtBQUM3QyxVQUFJeUcsWUFBWSxLQUFoQjtBQUNBZCwwQkFBb0IsQ0FBQyxJQUFELENBQXBCLEVBQTRCLFVBQUN4QixVQUFELEVBQWF1QyxJQUFiLEVBQXNCO0FBQ2hELFlBQUl2QyxlQUFlbkUsT0FBbkIsRUFBNEI7QUFDMUJ5RyxzQkFBWSxJQUFaO0FBQ0FDO0FBQ0Q7QUFDRixPQUxEO0FBTUEsYUFBT0QsU0FBUDtBQUNELEtBVEQ7QUFVRDs7QUFFRCxTQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7O0FBTUEsU0FBU0osZUFBVCxDQUEwQkYsU0FBMUIsRUFBcUM7QUFDbkMsU0FBT0EsVUFBVXhFLEtBQVYsQ0FBZ0IsR0FBaEIsRUFBcUJnRixPQUFyQixHQUErQnJDLEdBQS9CLENBQW1DLFVBQUMxQixRQUFELEVBQVc0RCxJQUFYLEVBQW9CO0FBQzVELFFBQU1GLFdBQVdFLFNBQVMsQ0FBMUI7O0FBRDRELDBCQUVyQzVELFNBQVNqQixLQUFULENBQWUsR0FBZixDQUZxQztBQUFBO0FBQUEsUUFFckR5QyxJQUZxRDtBQUFBLFFBRS9Dd0MsTUFGK0M7O0FBSTVELFFBQUlDLFdBQVcsSUFBZjtBQUNBLFFBQUlDLGNBQWMsSUFBbEI7O0FBTDREO0FBTzVELGNBQVEsSUFBUjs7QUFFRTtBQUNBLGFBQUssSUFBSWpELElBQUosQ0FBU08sSUFBVCxDQUFMO0FBQ0UwQyx3QkFBYyxTQUFTQyxXQUFULENBQXNCMUIsSUFBdEIsRUFBNEI7QUFDeEMsbUJBQU8sVUFBQ3dCLFFBQUQ7QUFBQSxxQkFBY0EsU0FBU3hCLEtBQUsxRSxNQUFkLEtBQXlCMEUsS0FBSzFFLE1BQTVDO0FBQUEsYUFBUDtBQUNELFdBRkQ7QUFHQTs7QUFFRjtBQUNBLGFBQUssTUFBTWtELElBQU4sQ0FBV08sSUFBWCxDQUFMO0FBQ0UsY0FBTUMsUUFBUUQsS0FBSzRDLE1BQUwsQ0FBWSxDQUFaLEVBQWVyRixLQUFmLENBQXFCLEdBQXJCLENBQWQ7QUFDQWtGLHFCQUFXLGtCQUFDeEIsSUFBRCxFQUFVO0FBQ25CLGdCQUFNNEIsZ0JBQWdCNUIsS0FBS0MsT0FBTCxDQUFhVyxLQUFuQztBQUNBLG1CQUFPZ0IsaUJBQWlCNUMsTUFBTUssS0FBTixDQUFZLFVBQUM1QyxJQUFEO0FBQUEscUJBQVVtRixjQUFjZixPQUFkLENBQXNCcEUsSUFBdEIsSUFBOEIsQ0FBQyxDQUF6QztBQUFBLGFBQVosQ0FBeEI7QUFDRCxXQUhEO0FBSUFnRix3QkFBYyxTQUFTSSxVQUFULENBQXFCN0IsSUFBckIsRUFBMkJ6RixJQUEzQixFQUFpQztBQUM3QyxnQkFBSTBHLFFBQUosRUFBYztBQUNaLHFCQUFPakIsS0FBS1Msc0JBQUwsQ0FBNEJ6QixNQUFNZCxJQUFOLENBQVcsR0FBWCxDQUE1QixDQUFQO0FBQ0Q7QUFDRCxtQkFBUSxPQUFPOEIsSUFBUCxLQUFnQixVQUFqQixHQUErQkEsS0FBS3dCLFFBQUwsQ0FBL0IsR0FBZ0RNLFlBQVk5QixJQUFaLEVBQWtCekYsSUFBbEIsRUFBd0JpSCxRQUF4QixDQUF2RDtBQUNELFdBTEQ7QUFNQTs7QUFFRjtBQUNBLGFBQUssTUFBTWhELElBQU4sQ0FBV08sSUFBWCxDQUFMO0FBQUEsb0NBQ3lDQSxLQUFLN0UsT0FBTCxDQUFhLFVBQWIsRUFBeUIsRUFBekIsRUFBNkJvQyxLQUE3QixDQUFtQyxHQUFuQyxDQUR6QztBQUFBO0FBQUEsY0FDU3lGLFlBRFQ7QUFBQSxjQUN1QkMsY0FEdkI7O0FBRUVSLHFCQUFXLGtCQUFDeEIsSUFBRCxFQUFVO0FBQ25CLGdCQUFNaUMsZUFBZXRGLE9BQU9DLElBQVAsQ0FBWW9ELEtBQUtDLE9BQWpCLEVBQTBCWSxPQUExQixDQUFrQ2tCLFlBQWxDLElBQWtELENBQUMsQ0FBeEU7QUFDQSxnQkFBSUUsWUFBSixFQUFrQjtBQUFFO0FBQ2xCLGtCQUFJLENBQUNELGNBQUQsSUFBb0JoQyxLQUFLQyxPQUFMLENBQWE4QixZQUFiLE1BQStCQyxjQUF2RCxFQUF3RTtBQUN0RSx1QkFBTyxJQUFQO0FBQ0Q7QUFDRjtBQUNELG1CQUFPLEtBQVA7QUFDRCxXQVJEO0FBU0FQLHdCQUFjLFNBQVNTLGNBQVQsQ0FBeUJsQyxJQUF6QixFQUErQnpGLElBQS9CLEVBQXFDO0FBQ2pELGdCQUFJMEcsUUFBSixFQUFjO0FBQUE7QUFDWixvQkFBTWtCLFdBQVcsRUFBakI7QUFDQTdCLG9DQUFvQixDQUFDTixJQUFELENBQXBCLEVBQTRCLFVBQUNsQixVQUFELEVBQWdCO0FBQzFDLHNCQUFJMEMsU0FBUzFDLFVBQVQsQ0FBSixFQUEwQjtBQUN4QnFELDZCQUFTM0IsSUFBVCxDQUFjMUIsVUFBZDtBQUNEO0FBQ0YsaUJBSkQ7QUFLQTtBQUFBLHFCQUFPcUQ7QUFBUDtBQVBZOztBQUFBO0FBUWI7QUFDRCxtQkFBUSxPQUFPbkMsSUFBUCxLQUFnQixVQUFqQixHQUErQkEsS0FBS3dCLFFBQUwsQ0FBL0IsR0FBZ0RNLFlBQVk5QixJQUFaLEVBQWtCekYsSUFBbEIsRUFBd0JpSCxRQUF4QixDQUF2RDtBQUNELFdBWEQ7QUFZQTs7QUFFRjtBQUNBLGFBQUssS0FBS2hELElBQUwsQ0FBVU8sSUFBVixDQUFMO0FBQ0UsY0FBTXFELEtBQUtyRCxLQUFLNEMsTUFBTCxDQUFZLENBQVosQ0FBWDtBQUNBSCxxQkFBVyxrQkFBQ3hCLElBQUQsRUFBVTtBQUNuQixtQkFBT0EsS0FBS0MsT0FBTCxDQUFhbUMsRUFBYixLQUFvQkEsRUFBM0I7QUFDRCxXQUZEO0FBR0FYLHdCQUFjLFNBQVNZLE9BQVQsQ0FBa0JyQyxJQUFsQixFQUF3QnpGLElBQXhCLEVBQThCO0FBQzFDLGdCQUFJMEcsUUFBSixFQUFjO0FBQUE7QUFDWixvQkFBTWtCLFdBQVcsRUFBakI7QUFDQTdCLG9DQUFvQixDQUFDTixJQUFELENBQXBCLEVBQTRCLFVBQUNsQixVQUFELEVBQWF1QyxJQUFiLEVBQXNCO0FBQ2hELHNCQUFJRyxTQUFTMUMsVUFBVCxDQUFKLEVBQTBCO0FBQ3hCcUQsNkJBQVMzQixJQUFULENBQWMxQixVQUFkO0FBQ0F1QztBQUNEO0FBQ0YsaUJBTEQ7QUFNQTtBQUFBLHFCQUFPYztBQUFQO0FBUlk7O0FBQUE7QUFTYjtBQUNELG1CQUFRLE9BQU9uQyxJQUFQLEtBQWdCLFVBQWpCLEdBQStCQSxLQUFLd0IsUUFBTCxDQUEvQixHQUFnRE0sWUFBWTlCLElBQVosRUFBa0J6RixJQUFsQixFQUF3QmlILFFBQXhCLENBQXZEO0FBQ0QsV0FaRDtBQWFBOztBQUVGO0FBQ0EsYUFBSyxLQUFLaEQsSUFBTCxDQUFVTyxJQUFWLENBQUw7QUFDRXlDLHFCQUFXLGtCQUFDeEIsSUFBRDtBQUFBLG1CQUFVLElBQVY7QUFBQSxXQUFYO0FBQ0F5Qix3QkFBYyxTQUFTYSxjQUFULENBQXlCdEMsSUFBekIsRUFBK0J6RixJQUEvQixFQUFxQztBQUNqRCxnQkFBSTBHLFFBQUosRUFBYztBQUFBO0FBQ1osb0JBQU1rQixXQUFXLEVBQWpCO0FBQ0E3QixvQ0FBb0IsQ0FBQ04sSUFBRCxDQUFwQixFQUE0QixVQUFDbEIsVUFBRDtBQUFBLHlCQUFnQnFELFNBQVMzQixJQUFULENBQWMxQixVQUFkLENBQWhCO0FBQUEsaUJBQTVCO0FBQ0E7QUFBQSxxQkFBT3FEO0FBQVA7QUFIWTs7QUFBQTtBQUliO0FBQ0QsbUJBQVEsT0FBT25DLElBQVAsS0FBZ0IsVUFBakIsR0FBK0JBLEtBQUt3QixRQUFMLENBQS9CLEdBQWdETSxZQUFZOUIsSUFBWixFQUFrQnpGLElBQWxCLEVBQXdCaUgsUUFBeEIsQ0FBdkQ7QUFDRCxXQVBEO0FBUUE7O0FBRUY7QUFDQTtBQUNFQSxxQkFBVyxrQkFBQ3hCLElBQUQsRUFBVTtBQUNuQixtQkFBT0EsS0FBS3ZELElBQUwsS0FBY3NDLElBQXJCO0FBQ0QsV0FGRDtBQUdBMEMsd0JBQWMsU0FBU2MsUUFBVCxDQUFtQnZDLElBQW5CLEVBQXlCekYsSUFBekIsRUFBK0I7QUFDM0MsZ0JBQUkwRyxRQUFKLEVBQWM7QUFBQTtBQUNaLG9CQUFNa0IsV0FBVyxFQUFqQjtBQUNBN0Isb0NBQW9CLENBQUNOLElBQUQsQ0FBcEIsRUFBNEIsVUFBQ2xCLFVBQUQsRUFBZ0I7QUFDMUMsc0JBQUkwQyxTQUFTMUMsVUFBVCxDQUFKLEVBQTBCO0FBQ3hCcUQsNkJBQVMzQixJQUFULENBQWMxQixVQUFkO0FBQ0Q7QUFDRixpQkFKRDtBQUtBO0FBQUEscUJBQU9xRDtBQUFQO0FBUFk7O0FBQUE7QUFRYjtBQUNELG1CQUFRLE9BQU9uQyxJQUFQLEtBQWdCLFVBQWpCLEdBQStCQSxLQUFLd0IsUUFBTCxDQUEvQixHQUFnRE0sWUFBWTlCLElBQVosRUFBa0J6RixJQUFsQixFQUF3QmlILFFBQXhCLENBQXZEO0FBQ0QsV0FYRDtBQXpGSjtBQVA0RDs7QUE4RzVELFFBQUksQ0FBQ0QsTUFBTCxFQUFhO0FBQ1gsYUFBT0UsV0FBUDtBQUNEOztBQUVELFFBQU1lLE9BQU9qQixPQUFPbkMsS0FBUCxDQUFhLHlCQUFiLENBQWI7QUFDQSxRQUFNcUQsT0FBT0QsS0FBSyxDQUFMLENBQWI7QUFDQSxRQUFNNUgsUUFBUThILFNBQVNGLEtBQUssQ0FBTCxDQUFULEVBQWtCLEVBQWxCLElBQXdCLENBQXRDOztBQUVBLFFBQU1HLGlCQUFpQixTQUFqQkEsY0FBaUIsQ0FBQzNDLElBQUQsRUFBVTtBQUMvQixVQUFJQSxJQUFKLEVBQVU7QUFDUixZQUFJNEMsYUFBYTVDLEtBQUsxRSxNQUFMLENBQVlpRixTQUE3QjtBQUNBLFlBQUlrQyxTQUFTLE1BQWIsRUFBcUI7QUFDbkJHLHVCQUFhQSxXQUFXckcsTUFBWCxDQUFrQmlGLFFBQWxCLENBQWI7QUFDRDtBQUNELFlBQU1xQixZQUFZRCxXQUFXRSxTQUFYLENBQXFCLFVBQUNDLEtBQUQ7QUFBQSxpQkFBV0EsVUFBVS9DLElBQXJCO0FBQUEsU0FBckIsQ0FBbEI7QUFDQSxZQUFJNkMsY0FBY2pJLEtBQWxCLEVBQXlCO0FBQ3ZCLGlCQUFPLElBQVA7QUFDRDtBQUNGO0FBQ0QsYUFBTyxLQUFQO0FBQ0QsS0FaRDs7QUFjQSxXQUFPLFNBQVNvSSxrQkFBVCxDQUE2QmhELElBQTdCLEVBQW1DO0FBQ3hDLFVBQU1aLFFBQVFxQyxZQUFZekIsSUFBWixDQUFkO0FBQ0EsVUFBSWlCLFFBQUosRUFBYztBQUNaLGVBQU83QixNQUFNdkMsTUFBTixDQUFhLFVBQUNzRixRQUFELEVBQVdjLFdBQVgsRUFBMkI7QUFDN0MsY0FBSU4sZUFBZU0sV0FBZixDQUFKLEVBQWlDO0FBQy9CZCxxQkFBUzNCLElBQVQsQ0FBY3lDLFdBQWQ7QUFDRDtBQUNELGlCQUFPZCxRQUFQO0FBQ0QsU0FMTSxFQUtKLEVBTEksQ0FBUDtBQU1EO0FBQ0QsYUFBT1EsZUFBZXZELEtBQWYsS0FBeUJBLEtBQWhDO0FBQ0QsS0FYRDtBQVlELEdBaEpNLENBQVA7QUFpSkQ7O0FBRUQ7Ozs7OztBQU1BLFNBQVNrQixtQkFBVCxDQUE4QjFHLEtBQTlCLEVBQXFDc0osT0FBckMsRUFBOEM7QUFDNUN0SixRQUFNYyxPQUFOLENBQWMsVUFBQ3NGLElBQUQsRUFBVTtBQUN0QixRQUFJbUQsV0FBVyxJQUFmO0FBQ0FELFlBQVFsRCxJQUFSLEVBQWM7QUFBQSxhQUFNbUQsV0FBVyxLQUFqQjtBQUFBLEtBQWQ7QUFDQSxRQUFJbkQsS0FBS08sU0FBTCxJQUFrQjRDLFFBQXRCLEVBQWdDO0FBQzlCN0MsMEJBQW9CTixLQUFLTyxTQUF6QixFQUFvQzJDLE9BQXBDO0FBQ0Q7QUFDRixHQU5EO0FBT0Q7O0FBRUQ7Ozs7Ozs7O0FBUUEsU0FBU3BCLFdBQVQsQ0FBc0I5QixJQUF0QixFQUE0QnpGLElBQTVCLEVBQWtDaUgsUUFBbEMsRUFBNEM7QUFDMUMsU0FBT3hCLEtBQUsxRSxNQUFaLEVBQW9CO0FBQ2xCMEUsV0FBT0EsS0FBSzFFLE1BQVo7QUFDQSxRQUFJa0csU0FBU3hCLElBQVQsQ0FBSixFQUFvQjtBQUNsQixhQUFPQSxJQUFQO0FBQ0Q7QUFDRCxRQUFJQSxTQUFTekYsSUFBYixFQUFtQjtBQUNqQjtBQUNEO0FBQ0Y7QUFDRCxTQUFPLElBQVA7QUFDRDs7Ozs7Ozs7Ozs7Ozs7OFFDbFZEOzs7Ozs7O1FBb0JnQjZJLGlCLEdBQUFBLGlCO1FBbUNBQyxnQixHQUFBQSxnQjtrQkFvRlFDLGdCOztBQXBJeEI7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFFQTs7Ozs7OztBQU9PLFNBQVNGLGlCQUFULENBQTRCekksT0FBNUIsRUFBbUQ7QUFBQSxNQUFkTCxPQUFjLHVFQUFKLEVBQUk7OztBQUV4RCxNQUFJSyxRQUFROEMsUUFBUixLQUFxQixDQUF6QixFQUE0QjtBQUMxQjlDLGNBQVVBLFFBQVFHLFVBQWxCO0FBQ0Q7O0FBRUQsTUFBSUgsUUFBUThDLFFBQVIsS0FBcUIsQ0FBekIsRUFBNEI7QUFDMUIsVUFBTSxJQUFJQyxLQUFKLGdHQUFzRy9DLE9BQXRHLHlDQUFzR0EsT0FBdEcsVUFBTjtBQUNEOztBQUVELE1BQU1nRCxpQkFBaUIscUJBQU1oRCxPQUFOLEVBQWVMLE9BQWYsQ0FBdkI7O0FBRUEsTUFBTWlELFdBQVcscUJBQU01QyxPQUFOLEVBQWVMLE9BQWYsQ0FBakI7QUFDQSxNQUFNaUosWUFBWSx3QkFBU2hHLFFBQVQsRUFBbUI1QyxPQUFuQixFQUE0QkwsT0FBNUIsQ0FBbEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFJcUQsY0FBSixFQUFvQjtBQUNsQixXQUFPLElBQVA7QUFDRDs7QUFFRCxTQUFPNEYsU0FBUDtBQUNEOztBQUVEOzs7Ozs7O0FBT08sU0FBU0YsZ0JBQVQsQ0FBMkJoSixRQUEzQixFQUFtRDtBQUFBLE1BQWRDLE9BQWMsdUVBQUosRUFBSTs7O0FBRXhELE1BQUksQ0FBQ1AsTUFBTXlELE9BQU4sQ0FBY25ELFFBQWQsQ0FBTCxFQUE4QjtBQUM1QkEsZUFBVyxnQ0FBZ0JBLFFBQWhCLENBQVg7QUFDRDs7QUFFRCxNQUFJQSxTQUFTbUIsSUFBVCxDQUFjLFVBQUNiLE9BQUQ7QUFBQSxXQUFhQSxRQUFROEMsUUFBUixLQUFxQixDQUFsQztBQUFBLEdBQWQsQ0FBSixFQUF3RDtBQUN0RCxVQUFNLElBQUlDLEtBQUosMEZBQU47QUFDRDs7QUFFRCxNQUFNQyxpQkFBaUIscUJBQU10RCxTQUFTLENBQVQsQ0FBTixFQUFtQkMsT0FBbkIsQ0FBdkI7O0FBRUEsTUFBTWUsV0FBVywrQkFBa0JoQixRQUFsQixFQUE0QkMsT0FBNUIsQ0FBakI7QUFDQSxNQUFNa0osbUJBQW1CSixrQkFBa0IvSCxRQUFsQixFQUE0QmYsT0FBNUIsQ0FBekI7O0FBRUE7QUFDQSxNQUFNbUosa0JBQWtCQyxtQkFBbUJySixRQUFuQixDQUF4QjtBQUNBLE1BQU1zSixxQkFBcUJGLGdCQUFnQixDQUFoQixDQUEzQjs7QUFFQSxNQUFNbEcsV0FBVyx3QkFBWWlHLGdCQUFaLFNBQWdDRyxrQkFBaEMsRUFBc0R0SixRQUF0RCxFQUFnRUMsT0FBaEUsQ0FBakI7QUFDQSxNQUFNc0osa0JBQWtCLGdDQUFnQnBKLFNBQVM4RCxnQkFBVCxDQUEwQmYsUUFBMUIsQ0FBaEIsQ0FBeEI7O0FBRUEsTUFBSSxDQUFDbEQsU0FBU2dGLEtBQVQsQ0FBZSxVQUFDMUUsT0FBRDtBQUFBLFdBQWFpSixnQkFBZ0JwSSxJQUFoQixDQUFxQixVQUFDZ0IsS0FBRDtBQUFBLGFBQVdBLFVBQVU3QixPQUFyQjtBQUFBLEtBQXJCLENBQWI7QUFBQSxHQUFmLENBQUwsRUFBdUY7QUFDckY7QUFDQSxXQUFPa0osUUFBUUMsSUFBUix5SUFHSnpKLFFBSEksQ0FBUDtBQUlEOztBQUVELE1BQUlzRCxjQUFKLEVBQW9CO0FBQ2xCLFdBQU8sSUFBUDtBQUNEOztBQUVELFNBQU9KLFFBQVA7QUFDRDs7QUFFRDs7Ozs7O0FBTUEsU0FBU21HLGtCQUFULENBQTZCckosUUFBN0IsRUFBdUM7QUFBQSw2QkFFQSxpQ0FBb0JBLFFBQXBCLENBRkE7QUFBQSxNQUU3QndCLE9BRjZCLHdCQUU3QkEsT0FGNkI7QUFBQSxNQUVwQkMsVUFGb0Isd0JBRXBCQSxVQUZvQjtBQUFBLE1BRVJDLEdBRlEsd0JBRVJBLEdBRlE7O0FBSXJDLE1BQU1nSSxlQUFlLEVBQXJCOztBQUVBLE1BQUloSSxHQUFKLEVBQVM7QUFDUGdJLGlCQUFhdkQsSUFBYixDQUFrQnpFLEdBQWxCO0FBQ0Q7O0FBRUQsTUFBSUYsT0FBSixFQUFhO0FBQ1gsUUFBTW1JLGdCQUFnQm5JLFFBQVFvRCxHQUFSLENBQVksVUFBQ3hDLElBQUQ7QUFBQSxtQkFBY0EsSUFBZDtBQUFBLEtBQVosRUFBa0N5QixJQUFsQyxDQUF1QyxFQUF2QyxDQUF0QjtBQUNBNkYsaUJBQWF2RCxJQUFiLENBQWtCd0QsYUFBbEI7QUFDRDs7QUFFRCxNQUFJbEksVUFBSixFQUFnQjtBQUNkLFFBQU1tSSxvQkFBb0J0SCxPQUFPQyxJQUFQLENBQVlkLFVBQVosRUFBd0JlLE1BQXhCLENBQStCLFVBQUNxSCxLQUFELEVBQVF6SCxJQUFSLEVBQWlCO0FBQ3hFeUgsWUFBTTFELElBQU4sT0FBZS9ELElBQWYsVUFBd0JYLFdBQVdXLElBQVgsQ0FBeEI7QUFDQSxhQUFPeUgsS0FBUDtBQUNELEtBSHlCLEVBR3ZCLEVBSHVCLEVBR25CaEcsSUFIbUIsQ0FHZCxFQUhjLENBQTFCO0FBSUE2RixpQkFBYXZELElBQWIsQ0FBa0J5RCxpQkFBbEI7QUFDRDs7QUFFRCxNQUFJRixhQUFhbEssTUFBakIsRUFBeUI7QUFDdkI7QUFDRDs7QUFFRCxTQUFPLENBQ0xrSyxhQUFhN0YsSUFBYixDQUFrQixFQUFsQixDQURLLENBQVA7QUFHRDs7QUFFRDs7Ozs7Ozs7O0FBU2UsU0FBU29GLGdCQUFULENBQTJCYSxLQUEzQixFQUFnRDtBQUFBLE1BQWQ3SixPQUFjLHVFQUFKLEVBQUk7O0FBQzdELE1BQUk2SixNQUFNdEssTUFBTixJQUFnQixDQUFDc0ssTUFBTTFILElBQTNCLEVBQWlDO0FBQy9CLFdBQU80RyxpQkFBaUJjLEtBQWpCLEVBQXdCN0osT0FBeEIsQ0FBUDtBQUNEO0FBQ0QsU0FBTzhJLGtCQUFrQmUsS0FBbEIsRUFBeUI3SixPQUF6QixDQUFQO0FBQ0QsQzs7Ozs7Ozs7Ozs7O2tCQ3ZIdUI4RSxLOztBQW5CeEI7O0FBRUEsSUFBTWdGLGdCQUFnQjtBQUNwQnJILFdBRG9CLHFCQUNUQyxhQURTLEVBQ007QUFDeEIsV0FBTyxDQUNMLE9BREssRUFFTCxjQUZLLEVBR0wscUJBSEssRUFJTDZELE9BSkssQ0FJRzdELGFBSkgsSUFJb0IsQ0FBQyxDQUo1QjtBQUtEO0FBUG1CLENBQXRCOztBQVVBOzs7Ozs7O0FBbEJBOzs7Ozs7QUF5QmUsU0FBU29DLEtBQVQsQ0FBZ0JZLElBQWhCLEVBQXNCMUYsT0FBdEIsRUFBK0I7QUFBQSxzQkFPeENBLE9BUHdDLENBRzFDQyxJQUgwQztBQUFBLE1BRzFDQSxJQUgwQyxpQ0FHbkNDLFFBSG1DO0FBQUEsc0JBT3hDRixPQVB3QyxDQUkxQytKLElBSjBDO0FBQUEsTUFJMUNBLElBSjBDLGlDQUluQyxJQUptQztBQUFBLDBCQU94Qy9KLE9BUHdDLENBSzFDZ0ssUUFMMEM7QUFBQSxNQUsxQ0EsUUFMMEMscUNBSy9CLENBQUMsSUFBRCxFQUFPLE9BQVAsRUFBZ0IsTUFBaEIsRUFBd0IsS0FBeEIsQ0FMK0I7QUFBQSx3QkFPeENoSyxPQVB3QyxDQU0xQ2lLLE1BTjBDO0FBQUEsTUFNMUNBLE1BTjBDLG1DQU1qQyxFQU5pQzs7O0FBUzVDLE1BQU0zRyxPQUFPLEVBQWI7QUFDQSxNQUFJakQsVUFBVXFGLElBQWQ7QUFDQSxNQUFJbkcsU0FBUytELEtBQUsvRCxNQUFsQjtBQUNBLE1BQUkySyxjQUFjLEtBQWxCOztBQUVBLE1BQU1DLGNBQWNKLFFBQVEsQ0FBQ3RLLE1BQU15RCxPQUFOLENBQWM2RyxJQUFkLElBQXNCQSxJQUF0QixHQUE2QixDQUFDQSxJQUFELENBQTlCLEVBQXNDcEYsR0FBdEMsQ0FBMEMsVUFBQ3pDLEtBQUQsRUFBVztBQUMvRSxRQUFJLE9BQU9BLEtBQVAsS0FBaUIsVUFBckIsRUFBaUM7QUFDL0IsYUFBTyxVQUFDN0IsT0FBRDtBQUFBLGVBQWFBLFlBQVk2QixLQUF6QjtBQUFBLE9BQVA7QUFDRDtBQUNELFdBQU9BLEtBQVA7QUFDRCxHQUwyQixDQUE1Qjs7QUFPQSxNQUFNa0ksYUFBYSxTQUFiQSxVQUFhLENBQUMvSixPQUFELEVBQWE7QUFDOUIsV0FBTzBKLFFBQVFJLFlBQVlqSixJQUFaLENBQWlCLFVBQUNtSixPQUFEO0FBQUEsYUFBYUEsUUFBUWhLLE9BQVIsQ0FBYjtBQUFBLEtBQWpCLENBQWY7QUFDRCxHQUZEOztBQUlBZ0MsU0FBT0MsSUFBUCxDQUFZMkgsTUFBWixFQUFvQjdKLE9BQXBCLENBQTRCLFVBQUNxRSxJQUFELEVBQVU7QUFDcEMsUUFBSUEsU0FBUyxPQUFiLEVBQXNCO0FBQ3BCeUYsb0JBQWMsSUFBZDtBQUNEO0FBQ0QsUUFBSUksWUFBWUwsT0FBT3hGLElBQVAsQ0FBaEI7QUFDQSxRQUFJLE9BQU82RixTQUFQLEtBQXFCLFVBQXpCLEVBQXFDO0FBQ3JDLFFBQUksT0FBT0EsU0FBUCxLQUFxQixRQUF6QixFQUFtQztBQUNqQ0Esa0JBQVlBLFVBQVVDLFFBQVYsRUFBWjtBQUNEO0FBQ0QsUUFBSSxPQUFPRCxTQUFQLEtBQXFCLFFBQXpCLEVBQW1DO0FBQ2pDQSxrQkFBWSxJQUFJRSxNQUFKLENBQVcsNEJBQVlGLFNBQVosRUFBdUIxSyxPQUF2QixDQUErQixLQUEvQixFQUFzQyxNQUF0QyxDQUFYLENBQVo7QUFDRDtBQUNELFFBQUksT0FBTzBLLFNBQVAsS0FBcUIsU0FBekIsRUFBb0M7QUFDbENBLGtCQUFZQSxZQUFZLE1BQVosR0FBcUIsSUFBakM7QUFDRDtBQUNEO0FBQ0FMLFdBQU94RixJQUFQLElBQWUsVUFBQ3RDLElBQUQsRUFBT3hDLEtBQVA7QUFBQSxhQUFpQjJLLFVBQVVwRyxJQUFWLENBQWV2RSxLQUFmLENBQWpCO0FBQUEsS0FBZjtBQUNELEdBakJEOztBQW1CQSxNQUFJdUssV0FBSixFQUFpQjtBQUFBO0FBQ2YsVUFBTU8sa0JBQWtCUixPQUFPeEgsU0FBL0I7QUFDQXdILGFBQU94SCxTQUFQLEdBQW1CLFVBQUNOLElBQUQsRUFBT3hDLEtBQVAsRUFBYytLLGdCQUFkLEVBQW1DO0FBQ3BELGVBQU9ULE9BQU8zRCxLQUFQLENBQWEzRyxLQUFiLEtBQXVCOEssbUJBQW1CQSxnQkFBZ0J0SSxJQUFoQixFQUFzQnhDLEtBQXRCLEVBQTZCK0ssZ0JBQTdCLENBQWpEO0FBQ0QsT0FGRDtBQUZlO0FBS2hCOztBQUVELFNBQU9ySyxZQUFZSixJQUFuQixFQUF5QjtBQUN2QixRQUFJbUssV0FBVy9KLE9BQVgsTUFBd0IsSUFBNUIsRUFBa0M7QUFDaEM7QUFDQSxVQUFJc0ssZ0JBQWdCWCxRQUFoQixFQUEwQjNKLE9BQTFCLEVBQW1DNEosTUFBbkMsRUFBMkMzRyxJQUEzQyxFQUFpRHJELElBQWpELENBQUosRUFBNEQ7QUFDNUQsVUFBSWdJLFNBQVM1SCxPQUFULEVBQWtCNEosTUFBbEIsRUFBMEIzRyxJQUExQixFQUFnQ3JELElBQWhDLENBQUosRUFBMkM7O0FBRTNDO0FBQ0EwSyxzQkFBZ0JYLFFBQWhCLEVBQTBCM0osT0FBMUIsRUFBbUM0SixNQUFuQyxFQUEyQzNHLElBQTNDO0FBQ0EsVUFBSUEsS0FBSy9ELE1BQUwsS0FBZ0JBLE1BQXBCLEVBQTRCO0FBQzFCMEksaUJBQVM1SCxPQUFULEVBQWtCNEosTUFBbEIsRUFBMEIzRyxJQUExQjtBQUNEOztBQUVEO0FBQ0EsVUFBSUEsS0FBSy9ELE1BQUwsS0FBZ0JBLE1BQXBCLEVBQTRCO0FBQzFCcUwsb0JBQVlaLFFBQVosRUFBc0IzSixPQUF0QixFQUErQjRKLE1BQS9CLEVBQXVDM0csSUFBdkM7QUFDRDtBQUNGOztBQUVEakQsY0FBVUEsUUFBUUcsVUFBbEI7QUFDQWpCLGFBQVMrRCxLQUFLL0QsTUFBZDtBQUNEOztBQUVELE1BQUljLFlBQVlKLElBQWhCLEVBQXNCO0FBQ3BCLFFBQU02RCxVQUFVK0csWUFBWWIsUUFBWixFQUFzQjNKLE9BQXRCLEVBQStCNEosTUFBL0IsQ0FBaEI7QUFDQTNHLFNBQUs3QyxPQUFMLENBQWFxRCxPQUFiO0FBQ0Q7O0FBRUQsU0FBT1IsS0FBS00sSUFBTCxDQUFVLEdBQVYsQ0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7O0FBVUEsU0FBUytHLGVBQVQsQ0FBMEJYLFFBQTFCLEVBQW9DM0osT0FBcEMsRUFBNkM0SixNQUE3QyxFQUFxRDNHLElBQXJELEVBQXdGO0FBQUEsTUFBN0J0QyxNQUE2Qix1RUFBcEJYLFFBQVFHLFVBQVk7O0FBQ3RGLE1BQU1zRCxVQUFVZ0gsc0JBQXNCZCxRQUF0QixFQUFnQzNKLE9BQWhDLEVBQXlDNEosTUFBekMsQ0FBaEI7QUFDQSxNQUFJbkcsT0FBSixFQUFhO0FBQ1gsUUFBTUMsVUFBVS9DLE9BQU9nRCxnQkFBUCxDQUF3QkYsT0FBeEIsQ0FBaEI7QUFDQSxRQUFJQyxRQUFReEUsTUFBUixLQUFtQixDQUF2QixFQUEwQjtBQUN4QitELFdBQUs3QyxPQUFMLENBQWFxRCxPQUFiO0FBQ0EsYUFBTyxJQUFQO0FBQ0Q7QUFDRjtBQUNELFNBQU8sS0FBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFBLFNBQVNnSCxxQkFBVCxDQUFnQ2QsUUFBaEMsRUFBMEMzSixPQUExQyxFQUFtRDRKLE1BQW5ELEVBQTJEO0FBQ3pELE1BQU16SSxhQUFhbkIsUUFBUW1CLFVBQTNCO0FBQ0EsTUFBTXVKLGFBQWExSSxPQUFPQyxJQUFQLENBQVlkLFVBQVosRUFBd0JkLElBQXhCLENBQTZCLFVBQUNDLElBQUQsRUFBT0MsSUFBUCxFQUFnQjtBQUM5RCxRQUFNb0ssVUFBVWhCLFNBQVN6RCxPQUFULENBQWlCL0UsV0FBV2IsSUFBWCxFQUFpQndCLElBQWxDLENBQWhCO0FBQ0EsUUFBTThJLFVBQVVqQixTQUFTekQsT0FBVCxDQUFpQi9FLFdBQVdaLElBQVgsRUFBaUJ1QixJQUFsQyxDQUFoQjtBQUNBLFFBQUk4SSxZQUFZLENBQUMsQ0FBakIsRUFBb0I7QUFDbEIsVUFBSUQsWUFBWSxDQUFDLENBQWpCLEVBQW9CO0FBQ2xCLGVBQU8sQ0FBUDtBQUNEO0FBQ0QsYUFBTyxDQUFDLENBQVI7QUFDRDtBQUNELFdBQU9BLFVBQVVDLE9BQWpCO0FBQ0QsR0FWa0IsQ0FBbkI7O0FBWUEsT0FBSyxJQUFJdkwsSUFBSSxDQUFSLEVBQVcyQixJQUFJMEosV0FBV3hMLE1BQS9CLEVBQXVDRyxJQUFJMkIsQ0FBM0MsRUFBOEMzQixHQUE5QyxFQUFtRDtBQUNqRCxRQUFNOEMsTUFBTXVJLFdBQVdyTCxDQUFYLENBQVo7QUFDQSxRQUFNK0MsWUFBWWpCLFdBQVdnQixHQUFYLENBQWxCO0FBQ0EsUUFBTUUsZ0JBQWdCRCxVQUFVTixJQUFoQztBQUNBLFFBQU11RixpQkFBaUIsNEJBQVlqRixVQUFVOUMsS0FBdEIsQ0FBdkI7O0FBRUEsUUFBTXVMLGdCQUFnQmpCLE9BQU92SCxhQUFQLEtBQXlCdUgsT0FBT3hILFNBQXREO0FBQ0EsUUFBTTBJLHVCQUF1QnJCLGNBQWNwSCxhQUFkLEtBQWdDb0gsY0FBY3JILFNBQTNFO0FBQ0EsUUFBSTJJLFlBQVlGLGFBQVosRUFBMkJ4SSxhQUEzQixFQUEwQ2dGLGNBQTFDLEVBQTBEeUQsb0JBQTFELENBQUosRUFBcUY7QUFDbkY7QUFDRDs7QUFFRCxRQUFJckgsZ0JBQWNwQixhQUFkLFVBQWdDZ0YsY0FBaEMsT0FBSjs7QUFFQSxRQUFLLE1BQUQsQ0FBU3hELElBQVQsQ0FBY3dELGNBQWQsTUFBa0MsS0FBdEMsRUFBNkM7QUFDM0MsVUFBSWhGLGtCQUFrQixJQUF0QixFQUE0QjtBQUMxQm9CLHdCQUFjNEQsY0FBZDtBQUNEOztBQUVELFVBQUloRixrQkFBa0IsT0FBdEIsRUFBK0I7QUFDN0IsWUFBTTBELFlBQVlzQixlQUFlM0YsSUFBZixHQUFzQm5DLE9BQXRCLENBQThCLE1BQTlCLEVBQXNDLEdBQXRDLENBQWxCO0FBQ0FrRSx3QkFBY3NDLFNBQWQ7QUFDRDtBQUNGOztBQUVELFdBQU90QyxPQUFQO0FBQ0Q7QUFDRCxTQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O0FBU0EsU0FBU21FLFFBQVQsQ0FBbUI1SCxPQUFuQixFQUE0QjRKLE1BQTVCLEVBQW9DM0csSUFBcEMsRUFBdUU7QUFBQSxNQUE3QnRDLE1BQTZCLHVFQUFwQlgsUUFBUUcsVUFBWTs7QUFDckUsTUFBTXNELFVBQVV1SCxlQUFlaEwsT0FBZixFQUF3QjRKLE1BQXhCLENBQWhCO0FBQ0EsTUFBSW5HLE9BQUosRUFBYTtBQUNYLFFBQU1DLFVBQVUvQyxPQUFPOEUsb0JBQVAsQ0FBNEJoQyxPQUE1QixDQUFoQjtBQUNBLFFBQUlDLFFBQVF4RSxNQUFSLEtBQW1CLENBQXZCLEVBQTBCO0FBQ3hCK0QsV0FBSzdDLE9BQUwsQ0FBYXFELE9BQWI7QUFDQSxhQUFPLElBQVA7QUFDRDtBQUNGO0FBQ0QsU0FBTyxLQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTdUgsY0FBVCxDQUF5QmhMLE9BQXpCLEVBQWtDNEosTUFBbEMsRUFBMEM7QUFDeEMsTUFBTW5ILFVBQVV6QyxRQUFReUMsT0FBUixDQUFnQkMsV0FBaEIsRUFBaEI7QUFDQSxNQUFJcUksWUFBWW5CLE9BQU94SSxHQUFuQixFQUF3QixJQUF4QixFQUE4QnFCLE9BQTlCLENBQUosRUFBNEM7QUFDMUMsV0FBTyxJQUFQO0FBQ0Q7QUFDRCxTQUFPQSxPQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7O0FBV0EsU0FBUzhILFdBQVQsQ0FBc0JaLFFBQXRCLEVBQWdDM0osT0FBaEMsRUFBeUM0SixNQUF6QyxFQUFpRDNHLElBQWpELEVBQXVEO0FBQ3JELE1BQU10QyxTQUFTWCxRQUFRRyxVQUF2QjtBQUNBLE1BQU1pRixXQUFXekUsT0FBT2lGLFNBQVAsSUFBb0JqRixPQUFPeUUsUUFBNUM7QUFDQSxPQUFLLElBQUkvRixJQUFJLENBQVIsRUFBVzJCLElBQUlvRSxTQUFTbEcsTUFBN0IsRUFBcUNHLElBQUkyQixDQUF6QyxFQUE0QzNCLEdBQTVDLEVBQWlEO0FBQy9DLFFBQU0rSSxRQUFRaEQsU0FBUy9GLENBQVQsQ0FBZDtBQUNBLFFBQUkrSSxVQUFVcEksT0FBZCxFQUF1QjtBQUNyQixVQUFNaUwsZUFBZVQsWUFBWWIsUUFBWixFQUFzQnZCLEtBQXRCLEVBQTZCd0IsTUFBN0IsQ0FBckI7QUFDQSxVQUFJLENBQUNxQixZQUFMLEVBQW1CO0FBQ2pCLGVBQU8vQixRQUFRQyxJQUFSLHNGQUVKZixLQUZJLEVBRUd3QixNQUZILEVBRVdxQixZQUZYLENBQVA7QUFHRDtBQUNELFVBQU14SCxpQkFBZXdILFlBQWYsb0JBQXlDNUwsSUFBRSxDQUEzQyxPQUFOO0FBQ0E0RCxXQUFLN0MsT0FBTCxDQUFhcUQsT0FBYjtBQUNBLGFBQU8sSUFBUDtBQUNEO0FBQ0Y7QUFDRCxTQUFPLEtBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7QUFRQSxTQUFTK0csV0FBVCxDQUFzQmIsUUFBdEIsRUFBZ0MzSixPQUFoQyxFQUF5QzRKLE1BQXpDLEVBQWlEO0FBQy9DLE1BQUluRyxVQUFVZ0gsc0JBQXNCZCxRQUF0QixFQUFnQzNKLE9BQWhDLEVBQXlDNEosTUFBekMsQ0FBZDtBQUNBLE1BQUksQ0FBQ25HLE9BQUwsRUFBYztBQUNaQSxjQUFVdUgsZUFBZWhMLE9BQWYsRUFBd0I0SixNQUF4QixDQUFWO0FBQ0Q7QUFDRCxTQUFPbkcsT0FBUDtBQUNEOztBQUVEOzs7Ozs7Ozs7QUFTQSxTQUFTc0gsV0FBVCxDQUFzQmQsU0FBdEIsRUFBaUNuSSxJQUFqQyxFQUF1Q3hDLEtBQXZDLEVBQThDK0ssZ0JBQTlDLEVBQWdFO0FBQzlELE1BQUksQ0FBQy9LLEtBQUwsRUFBWTtBQUNWLFdBQU8sSUFBUDtBQUNEO0FBQ0QsTUFBTTRMLFFBQVFqQixhQUFhSSxnQkFBM0I7QUFDQSxNQUFJLENBQUNhLEtBQUwsRUFBWTtBQUNWLFdBQU8sS0FBUDtBQUNEO0FBQ0QsU0FBT0EsTUFBTXBKLElBQU4sRUFBWXhDLEtBQVosRUFBbUIrSyxnQkFBbkIsQ0FBUDtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvQkN6UmdCNUIsaUI7Ozs7OztvQkFBbUJDLGdCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7UUFBN0J5QyxNO1FBQ0F4SSxRO1FBQ0t5SSxNO1FBRUxDLE8iLCJmaWxlIjoib3B0aW1hbC1zZWxlY3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJPcHRpbWFsU2VsZWN0XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIk9wdGltYWxTZWxlY3RcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCBmdW5jdGlvbigpIHtcbnJldHVybiBcblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG5cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGlkZW50aXR5IGZ1bmN0aW9uIGZvciBjYWxsaW5nIGhhcm1vbnkgaW1wb3J0cyB3aXRoIHRoZSBjb3JyZWN0IGNvbnRleHRcbiBcdF9fd2VicGFja19yZXF1aXJlX18uaSA9IGZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfTtcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gNik7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgODA0ZDlmMjQ3ZWRmMDRjZWQ2MTciLCIvKipcbiAqICMgVXRpbGl0aWVzXG4gKlxuICogQ29udmVuaWVuY2UgaGVscGVycy5cbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhbiBhcnJheSB3aXRoIHRoZSBET00gbm9kZXMgb2YgdGhlIGxpc3RcbiAqXG4gKiBAcGFyYW0gIHtOb2RlTGlzdH0gICAgICAgICAgICAgbm9kZXMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtBcnJheS48SFRNTEVsZW1lbnQ+fSAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0Tm9kZUxpc3QgKG5vZGVzKSB7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBub2Rlc1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkobGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgYXJyW2ldID0gbm9kZXNbaV1cbiAgfVxuICByZXR1cm4gYXJyXG59XG5cbi8qKlxuICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgbGluZSBicmVha3MgYXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgJ0NTUy5lc2NhcGUoKSdcbiAqXG4gKiBEZXNjcmlwdGlvbiBvZiB2YWxpZCBjaGFyYWN0ZXJzOiBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvY3NzLWVzY2FwZXNcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmc/fSB2YWx1ZSAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlVmFsdWUgKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5yZXBsYWNlKC9bJ1wiYFxcXFwvOlxcPyYhIyQlXigpW1xcXXt8fSorOywuPD0+QH5dL2csICdcXFxcJCYnKVxuICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxuL2csICdcXEEnKVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3V0aWxpdGllcy5qcyIsIi8qKlxuICogIyBDb21tb25cbiAqXG4gKiBQcm9jZXNzIGNvbGxlY3Rpb25zIGZvciBzaW1pbGFyaXRpZXMuXG4gKi9cblxuLyoqXG4gKiBGaW5kIHRoZSBsYXN0IGNvbW1vbiBhbmNlc3RvciBvZiBlbGVtZW50c1xuICpcbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudHM+fSBlbGVtZW50cyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vbkFuY2VzdG9yIChlbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG5cbiAgY29uc3Qge1xuICAgIHJvb3QgPSBkb2N1bWVudFxuICB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IGFuY2VzdG9ycyA9IFtdXG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBwYXJlbnRzID0gW11cbiAgICB3aGlsZSAoZWxlbWVudCAhPT0gcm9vdCkge1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZVxuICAgICAgcGFyZW50cy51bnNoaWZ0KGVsZW1lbnQpXG4gICAgfVxuICAgIGFuY2VzdG9yc1tpbmRleF0gPSBwYXJlbnRzXG4gIH0pXG5cbiAgYW5jZXN0b3JzLnNvcnQoKGN1cnIsIG5leHQpID0+IGN1cnIubGVuZ3RoIC0gbmV4dC5sZW5ndGgpXG5cbiAgY29uc3Qgc2hhbGxvd0FuY2VzdG9yID0gYW5jZXN0b3JzLnNoaWZ0KClcblxuICB2YXIgYW5jZXN0b3IgPSBudWxsXG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzaGFsbG93QW5jZXN0b3IubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgcGFyZW50ID0gc2hhbGxvd0FuY2VzdG9yW2ldXG4gICAgY29uc3QgbWlzc2luZyA9IGFuY2VzdG9ycy5zb21lKChvdGhlclBhcmVudHMpID0+IHtcbiAgICAgIHJldHVybiAhb3RoZXJQYXJlbnRzLnNvbWUoKG90aGVyUGFyZW50KSA9PiBvdGhlclBhcmVudCA9PT0gcGFyZW50KVxuICAgIH0pXG5cbiAgICBpZiAobWlzc2luZykge1xuICAgICAgLy8gVE9ETzogZmluZCBzaW1pbGFyIHN1Yi1wYXJlbnRzLCBub3QgdGhlIHRvcCByb290LCBlLmcuIHNoYXJpbmcgYSBjbGFzcyBzZWxlY3RvclxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBhbmNlc3RvciA9IHBhcmVudFxuICB9XG5cbiAgcmV0dXJuIGFuY2VzdG9yXG59XG5cbi8qKlxuICogR2V0IGEgc2V0IG9mIGNvbW1vbiBwcm9wZXJ0aWVzIG9mIGVsZW1lbnRzXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPEhUTUxFbGVtZW50Pn0gZWxlbWVudHMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblByb3BlcnRpZXMgKGVsZW1lbnRzKSB7XG5cbiAgY29uc3QgY29tbW9uUHJvcGVydGllcyA9IHtcbiAgICBjbGFzc2VzOiBbXSxcbiAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICB0YWc6IG51bGxcbiAgfVxuXG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcblxuICAgIHZhciB7XG4gICAgICBjbGFzc2VzOiBjb21tb25DbGFzc2VzLFxuICAgICAgYXR0cmlidXRlczogY29tbW9uQXR0cmlidXRlcyxcbiAgICAgIHRhZzogY29tbW9uVGFnXG4gICAgfSA9IGNvbW1vblByb3BlcnRpZXNcblxuICAgIC8vIH4gY2xhc3Nlc1xuICAgIGlmIChjb21tb25DbGFzc2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjbGFzc2VzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgIGlmIChjbGFzc2VzKSB7XG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnRyaW0oKS5zcGxpdCgnICcpXG4gICAgICAgIGlmICghY29tbW9uQ2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLmNsYXNzZXMgPSBjbGFzc2VzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbW9uQ2xhc3NlcyA9IGNvbW1vbkNsYXNzZXMuZmlsdGVyKChlbnRyeSkgPT4gY2xhc3Nlcy5zb21lKChuYW1lKSA9PiBuYW1lID09PSBlbnRyeSkpXG4gICAgICAgICAgaWYgKGNvbW1vbkNsYXNzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLmNsYXNzZXMgPSBjb21tb25DbGFzc2VzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb21tb25Qcm9wZXJ0aWVzLmNsYXNzZXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IHJlc3RydWN0dXJlIHJlbW92YWwgYXMgMnggc2V0IC8gMnggZGVsZXRlLCBpbnN0ZWFkIG9mIG1vZGlmeSBhbHdheXMgcmVwbGFjaW5nIHdpdGggbmV3IGNvbGxlY3Rpb25cbiAgICAgICAgZGVsZXRlIGNvbW1vblByb3BlcnRpZXMuY2xhc3Nlc1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIH4gYXR0cmlidXRlc1xuICAgIGlmIChjb21tb25BdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRBdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gT2JqZWN0LmtleXMoZWxlbWVudEF0dHJpYnV0ZXMpLnJlZHVjZSgoYXR0cmlidXRlcywga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsZW1lbnRBdHRyaWJ1dGVzW2tleV1cbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5uYW1lXG4gICAgICAgIC8vIE5PVEU6IHdvcmthcm91bmQgZGV0ZWN0aW9uIGZvciBub24tc3RhbmRhcmQgcGhhbnRvbWpzIE5hbWVkTm9kZU1hcCBiZWhhdmlvdXJcbiAgICAgICAgLy8gKGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYXJpeWEvcGhhbnRvbWpzL2lzc3Vlcy8xNDYzNClcbiAgICAgICAgaWYgKGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGVOYW1lICE9PSAnY2xhc3MnKSB7XG4gICAgICAgICAgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgICB9LCB7fSlcblxuICAgICAgY29uc3QgYXR0cmlidXRlc05hbWVzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcylcbiAgICAgIGNvbnN0IGNvbW1vbkF0dHJpYnV0ZXNOYW1lcyA9IE9iamVjdC5rZXlzKGNvbW1vbkF0dHJpYnV0ZXMpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVzTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICghY29tbW9uQXR0cmlidXRlc05hbWVzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21tb25BdHRyaWJ1dGVzID0gY29tbW9uQXR0cmlidXRlc05hbWVzLnJlZHVjZSgobmV4dENvbW1vbkF0dHJpYnV0ZXMsIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29tbW9uQXR0cmlidXRlc1tuYW1lXVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBhdHRyaWJ1dGVzW25hbWVdKSB7XG4gICAgICAgICAgICAgIG5leHRDb21tb25BdHRyaWJ1dGVzW25hbWVdID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXh0Q29tbW9uQXR0cmlidXRlc1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjb21tb25BdHRyaWJ1dGVzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMuYXR0cmlidXRlcyA9IGNvbW1vbkF0dHJpYnV0ZXNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGNvbW1vblByb3BlcnRpZXMuYXR0cmlidXRlc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGNvbW1vblByb3BlcnRpZXMuYXR0cmlidXRlc1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIH4gdGFnXG4gICAgaWYgKGNvbW1vblRhZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB0YWcgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgaWYgKCFjb21tb25UYWcpIHtcbiAgICAgICAgY29tbW9uUHJvcGVydGllcy50YWcgPSB0YWdcbiAgICAgIH0gZWxzZSBpZiAodGFnICE9PSBjb21tb25UYWcpIHtcbiAgICAgICAgZGVsZXRlIGNvbW1vblByb3BlcnRpZXMudGFnXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBjb21tb25Qcm9wZXJ0aWVzXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29tbW9uLmpzIiwiLyoqXG4gKiAjIE9wdGltaXplXG4gKlxuICogMS4pIEltcHJvdmUgZWZmaWNpZW5jeSB0aHJvdWdoIHNob3J0ZXIgc2VsZWN0b3JzIGJ5IHJlbW92aW5nIHJlZHVuZGFuY3lcbiAqIDIuKSBJbXByb3ZlIHJvYnVzdG5lc3MgdGhyb3VnaCBzZWxlY3RvciB0cmFuc2Zvcm1hdGlvblxuICovXG5cbmltcG9ydCBhZGFwdCBmcm9tICcuL2FkYXB0J1xuaW1wb3J0IHsgY29udmVydE5vZGVMaXN0IH0gZnJvbSAnLi91dGlsaXRpZXMnXG5cbi8qKlxuICogQXBwbHkgZGlmZmVyZW50IG9wdGltaXphdGlvbiB0ZWNobmlxdWVzXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudHxBcnJheS48SFRNTEVsZW1lbnQ+fSBlbGVtZW50ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9wdGltaXplIChzZWxlY3RvciwgZWxlbWVudHMsIG9wdGlvbnMgPSB7fSkge1xuXG4gIC8vIGNvbnZlcnQgc2luZ2xlIGVudHJ5IGFuZCBOb2RlTGlzdFxuICBpZiAoIUFycmF5LmlzQXJyYXkoZWxlbWVudHMpKSB7XG4gICAgZWxlbWVudHMgPSAhZWxlbWVudHMubGVuZ3RoID8gW2VsZW1lbnRzXSA6IGNvbnZlcnROb2RlTGlzdChlbGVtZW50cylcbiAgfVxuXG4gIGlmICghZWxlbWVudHMubGVuZ3RoIHx8IGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGVsZW1lbnQubm9kZVR5cGUgIT09IDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlucHV0IC0gdG8gY29tcGFyZSBIVE1MRWxlbWVudHMgaXRzIG5lY2Vzc2FyeSB0byBwcm92aWRlIGEgcmVmZXJlbmNlIG9mIHRoZSBzZWxlY3RlZCBub2RlKHMpISAobWlzc2luZyBcImVsZW1lbnRzXCIpYClcbiAgfVxuXG4gIGNvbnN0IGdsb2JhbE1vZGlmaWVkID0gYWRhcHQoZWxlbWVudHNbMF0sIG9wdGlvbnMpXG5cbiAgLy8gY2h1bmsgcGFydHMgb3V0c2lkZSBvZiBxdW90ZXMgKGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI1NjYzNzI5KVxuICB2YXIgcGF0aCA9IHNlbGVjdG9yLnJlcGxhY2UoLz4gL2csICc+Jykuc3BsaXQoL1xccysoPz0oPzooPzpbXlwiXSpcIil7Mn0pKlteXCJdKiQpLylcblxuICBpZiAocGF0aC5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIG9wdGltaXplUGFydCgnJywgc2VsZWN0b3IsICcnLCBlbGVtZW50cylcbiAgfVxuXG4gIGNvbnN0IHNob3J0ZW5lZCA9IFtwYXRoLnBvcCgpXVxuICB3aGlsZSAocGF0aC5sZW5ndGggPiAxKSAge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnBvcCgpXG4gICAgY29uc3QgcHJlUGFydCA9IHBhdGguam9pbignICcpXG4gICAgY29uc3QgcG9zdFBhcnQgPSBzaG9ydGVuZWQuam9pbignICcpXG5cbiAgICBjb25zdCBwYXR0ZXJuID0gYCR7cHJlUGFydH0gJHtwb3N0UGFydH1gXG4gICAgY29uc3QgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggIT09IGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgc2hvcnRlbmVkLnVuc2hpZnQob3B0aW1pemVQYXJ0KHByZVBhcnQsIGN1cnJlbnQsIHBvc3RQYXJ0LCBlbGVtZW50cykpXG4gICAgfVxuICB9XG4gIHNob3J0ZW5lZC51bnNoaWZ0KHBhdGhbMF0pXG4gIHBhdGggPSBzaG9ydGVuZWRcblxuICAvLyBvcHRpbWl6ZSBzdGFydCArIGVuZFxuICBwYXRoWzBdID0gb3B0aW1pemVQYXJ0KCcnLCBwYXRoWzBdLCBwYXRoLnNsaWNlKDEpLmpvaW4oJyAnKSwgZWxlbWVudHMpXG4gIHBhdGhbcGF0aC5sZW5ndGgtMV0gPSBvcHRpbWl6ZVBhcnQocGF0aC5zbGljZSgwLCAtMSkuam9pbignICcpLCBwYXRoW3BhdGgubGVuZ3RoLTFdLCAnJywgZWxlbWVudHMpXG5cbiAgaWYgKGdsb2JhbE1vZGlmaWVkKSB7XG4gICAgZGVsZXRlIGdsb2JhbC5kb2N1bWVudFxuICB9XG5cbiAgcmV0dXJuIHBhdGguam9pbignICcpLnJlcGxhY2UoLz4vZywgJz4gJykudHJpbSgpXG59XG5cbi8qKlxuICogSW1wcm92ZSBhIGNodW5rIG9mIHRoZSBzZWxlY3RvclxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgIHByZVBhcnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICAgY3VycmVudCAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgICBwb3N0UGFydCAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIG9wdGltaXplUGFydCAocHJlUGFydCwgY3VycmVudCwgcG9zdFBhcnQsIGVsZW1lbnRzKSB7XG4gIGlmIChwcmVQYXJ0Lmxlbmd0aCkgcHJlUGFydCA9IGAke3ByZVBhcnR9IGBcbiAgaWYgKHBvc3RQYXJ0Lmxlbmd0aCkgcG9zdFBhcnQgPSBgICR7cG9zdFBhcnR9YFxuXG4gIC8vIHJvYnVzdG5lc3M6IGF0dHJpYnV0ZSB3aXRob3V0IHZhbHVlIChnZW5lcmFsaXphdGlvbilcbiAgaWYgKC9cXFsqXFxdLy50ZXN0KGN1cnJlbnQpKSB7XG4gICAgY29uc3Qga2V5ID0gY3VycmVudC5yZXBsYWNlKC89LiokLywgJ10nKVxuICAgIHZhciBwYXR0ZXJuID0gYCR7cHJlUGFydH0ke2tleX0ke3Bvc3RQYXJ0fWBcbiAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICBpZiAoY29tcGFyZVJlc3VsdHMobWF0Y2hlcywgZWxlbWVudHMpKSB7XG4gICAgICBjdXJyZW50ID0ga2V5XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJvYnVzdG5lc3M6IHJlcGxhY2Ugc3BlY2lmaWMga2V5LXZhbHVlIHdpdGggYmFzZSB0YWcgKGhldXJpc3RpYylcbiAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAke3ByZVBhcnR9JHtrZXl9YClcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXVxuICAgICAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gcmVmZXJlbmNlLmNvbnRhaW5zKGVsZW1lbnQpKSkge1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcmVmZXJlbmNlLnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIHZhciBwYXR0ZXJuID0gYCR7cHJlUGFydH0ke2Rlc2NyaXB0aW9ufSR7cG9zdFBhcnR9YFxuICAgICAgICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgICAgICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBkZXNjcmlwdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcm9idXN0bmVzczogZGVzY2VuZGFudCBpbnN0ZWFkIGNoaWxkIChoZXVyaXN0aWMpXG4gIGlmICgvPi8udGVzdChjdXJyZW50KSkge1xuICAgIGNvbnN0IGRlc2NlbmRhbnQgPSBjdXJyZW50LnJlcGxhY2UoLz4vLCAnJylcbiAgICB2YXIgcGF0dGVybiA9IGAke3ByZVBhcnR9JHtkZXNjZW5kYW50fSR7cG9zdFBhcnR9YFxuICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgIGN1cnJlbnQgPSBkZXNjZW5kYW50XG4gICAgfVxuICB9XG5cbiAgLy8gcm9idXN0bmVzczogJ250aC1vZi10eXBlJyBpbnN0ZWFkICdudGgtY2hpbGQnIChoZXVyaXN0aWMpXG4gIGlmICgvOm50aC1jaGlsZC8udGVzdChjdXJyZW50KSkge1xuICAgIC8vIFRPRE86IGNvbnNpZGVyIGNvbXBsZXRlIGNvdmVyYWdlIG9mICdudGgtb2YtdHlwZScgcmVwbGFjZW1lbnRcbiAgICBjb25zdCB0eXBlID0gY3VycmVudC5yZXBsYWNlKC9udGgtY2hpbGQvZywgJ250aC1vZi10eXBlJylcbiAgICB2YXIgcGF0dGVybiA9IGAke3ByZVBhcnR9JHt0eXBlfSR7cG9zdFBhcnR9YFxuICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgIGN1cnJlbnQgPSB0eXBlXG4gICAgfVxuICB9XG5cbiAgLy8gZWZmaWNpZW5jeTogY29tYmluYXRpb25zIG9mIGNsYXNzbmFtZSAocGFydGlhbCBwZXJtdXRhdGlvbnMpXG4gIGlmICgvXFwuXFxTK1xcLlxcUysvLnRlc3QoY3VycmVudCkpIHtcbiAgICBjb25zdCBuYW1lcyA9IGN1cnJlbnQudHJpbSgpLnNwbGl0KCcuJykuc2xpY2UoMSkubWFwKChuYW1lKSA9PiBgLiR7bmFtZX1gKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoY3VyciwgbmV4dCkgPT4gY3Vyci5sZW5ndGggLSBuZXh0Lmxlbmd0aClcbiAgICB3aGlsZSAobmFtZXMubGVuZ3RoKSB7XG4gICAgICB2YXIgcGFydGlhbCA9IGN1cnJlbnQucmVwbGFjZShuYW1lcy5zaGlmdCgpLCAnJykudHJpbSgpXG4gICAgICB2YXIgcGF0dGVybiA9IGAke3ByZVBhcnR9JHtwYXJ0aWFsfSR7cG9zdFBhcnR9YC50cmltKClcbiAgICAgIGlmICghcGF0dGVybi5sZW5ndGggfHwgcGF0dGVybi5jaGFyQXQoMCkgPT09ICc+Jykge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgICBpZiAoY29tcGFyZVJlc3VsdHMobWF0Y2hlcywgZWxlbWVudHMpKSB7XG4gICAgICAgIGN1cnJlbnQgPSBwYXJ0aWFsXG4gICAgICB9XG4gICAgfVxuICAgIC8vIHJvYnVzdG5lc3M6IGRlZ3JhZGUgY29tcGxleCBjbGFzc25hbWUgKGhldXJpc3RpYylcbiAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50Lm1hdGNoKC9cXC4vZykubGVuZ3RoID4gMikge1xuICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCR7cHJlUGFydH0ke2N1cnJlbnR9YClcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXVxuICAgICAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gcmVmZXJlbmNlLmNvbnRhaW5zKGVsZW1lbnQpICkpIHtcbiAgICAgICAgICAvLyBUT0RPOlxuICAgICAgICAgIC8vIC0gY2hlY2sgdXNpbmcgYXR0cmlidXRlcyArIHJlZ2FyZCBleGNsdWRlc1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcmVmZXJlbmNlLnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIHZhciBwYXR0ZXJuID0gYCR7cHJlUGFydH0ke2Rlc2NyaXB0aW9ufSR7cG9zdFBhcnR9YFxuICAgICAgICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgICAgICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBkZXNjcmlwdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnRcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSBtYXRjaGVzIHdpdGggZXhwZWN0ZWQgZWxlbWVudHNcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48SFRNTEVsZW1lbnQ+fSBtYXRjaGVzICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVSZXN1bHRzIChtYXRjaGVzLCBlbGVtZW50cykge1xuICBjb25zdCB7IGxlbmd0aCB9ID0gbWF0Y2hlc1xuICByZXR1cm4gbGVuZ3RoID09PSBlbGVtZW50cy5sZW5ndGggJiYgZWxlbWVudHMuZXZlcnkoKGVsZW1lbnQpID0+IHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobWF0Y2hlc1tpXSA9PT0gZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfSlcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9vcHRpbWl6ZS5qcyIsIi8qKlxuICogIyBBZGFwdFxuICpcbiAqIENoZWNrIGFuZCBleHRlbmQgdGhlIGVudmlyb25tZW50IGZvciB1bml2ZXJzYWwgdXNhZ2UuXG4gKi9cblxuLyoqXG4gKiBNb2RpZnkgdGhlIGNvbnRleHQgYmFzZWQgb24gdGhlIGVudmlyb25tZW50XG4gKlxuICogQHBhcmFtICB7SFRNTEVMZW1lbnR9IGVsZW1lbnQgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgb3B0aW9ucyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGFwdCAoZWxlbWVudCwgb3B0aW9ucykge1xuXG4gIC8vIGRldGVjdCBlbnZpcm9ubWVudCBzZXR1cFxuICBpZiAoZ2xvYmFsLmRvY3VtZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0gZWxzZSB7XG4gICAgZ2xvYmFsLmRvY3VtZW50ID0gb3B0aW9ucy5jb250ZXh0IHx8ICgoKSA9PiB7XG4gICAgICB2YXIgcm9vdCA9IGVsZW1lbnRcbiAgICAgIHdoaWxlIChyb290LnBhcmVudCkge1xuICAgICAgICByb290ID0gcm9vdC5wYXJlbnRcbiAgICAgIH1cbiAgICAgIHJldHVybiByb290XG4gICAgfSkoKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZiNTUvZG9taGFuZGxlci9ibG9iL21hc3Rlci9pbmRleC5qcyNMNzVcbiAgY29uc3QgRWxlbWVudFByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwuZG9jdW1lbnQpXG5cbiAgLy8gYWx0ZXJuYXRpdmUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZWxlbWVudHMgd2l0aCBmaWx0ZXJpbmcgaW52YWxpZCBlbGVtZW50cyAoZS5nLiB0ZXh0bm9kZXMpXG4gIGlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50UHJvdG90eXBlLCAnY2hpbGRUYWdzJykpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRWxlbWVudFByb3RvdHlwZSwgJ2NoaWxkVGFncycsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5maWx0ZXIoKG5vZGUpID0+IHtcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmI1NS9kb21lbGVtZW50dHlwZS9ibG9iL21hc3Rlci9pbmRleC5qcyNMMTJcbiAgICAgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAndGFnJyB8fCBub2RlLnR5cGUgPT09ICdzY3JpcHQnIHx8IG5vZGUudHlwZSA9PT0gJ3N0eWxlJ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudFByb3RvdHlwZSwgJ2F0dHJpYnV0ZXMnKSkge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2F0dHJpYnV0ZXNcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTmFtZWROb2RlTWFwXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVsZW1lbnRQcm90b3R5cGUsICdhdHRyaWJ1dGVzJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCAoKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlicyB9ID0gdGhpc1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzTmFtZXMgPSBPYmplY3Qua2V5cyhhdHRyaWJzKVxuICAgICAgICBjb25zdCBOYW1lZE5vZGVNYXAgPSBhdHRyaWJ1dGVzTmFtZXMucmVkdWNlKChhdHRyaWJ1dGVzLCBhdHRyaWJ1dGVOYW1lLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGF0dHJpYnV0ZXNbaW5kZXhdID0ge1xuICAgICAgICAgICAgbmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBhdHRyaWJzW2F0dHJpYnV0ZU5hbWVdXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgICAgIH0sIHsgfSlcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hbWVkTm9kZU1hcCwgJ2xlbmd0aCcsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBhdHRyaWJ1dGVzTmFtZXMubGVuZ3RoXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBOYW1lZE5vZGVNYXBcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgaWYgKCFFbGVtZW50UHJvdG90eXBlLmdldEF0dHJpYnV0ZSkge1xuICAgIC8vIGh0dHBzOi8vZG9jcy53ZWJwbGF0Zm9ybS5vcmcvd2lraS9kb20vRWxlbWVudC9nZXRBdHRyaWJ1dGVcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRBdHRyaWJ1dGVcbiAgICBFbGVtZW50UHJvdG90eXBlLmdldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJzW25hbWVdIHx8IG51bGxcbiAgICB9XG4gIH1cblxuICBpZiAoIUVsZW1lbnRQcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHtcbiAgICAvLyBodHRwczovL2RvY3Mud2VicGxhdGZvcm0ub3JnL3dpa2kvZG9tL0RvY3VtZW50L2dldEVsZW1lbnRzQnlUYWdOYW1lXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvZ2V0RWxlbWVudHNCeVRhZ05hbWVcbiAgICBFbGVtZW50UHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lID0gZnVuY3Rpb24gKHRhZ05hbWUpIHtcbiAgICAgIGNvbnN0IEhUTUxDb2xsZWN0aW9uID0gW11cbiAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHModGhpcy5jaGlsZFRhZ3MsIChkZXNjZW5kYW50KSA9PiB7XG4gICAgICAgIGlmIChkZXNjZW5kYW50Lm5hbWUgPT09IHRhZ05hbWUgfHwgdGFnTmFtZSA9PT0gJyonKSB7XG4gICAgICAgICAgSFRNTENvbGxlY3Rpb24ucHVzaChkZXNjZW5kYW50KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIEhUTUxDb2xsZWN0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKCFFbGVtZW50UHJvdG90eXBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpIHtcbiAgICAvLyBodHRwczovL2RvY3Mud2VicGxhdGZvcm0ub3JnL3dpa2kvZG9tL0RvY3VtZW50L2dldEVsZW1lbnRzQnlDbGFzc05hbWVcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRFbGVtZW50c0J5Q2xhc3NOYW1lXG4gICAgRWxlbWVudFByb3RvdHlwZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgICAgY29uc3QgbmFtZXMgPSBjbGFzc05hbWUudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS5zcGxpdCgnICcpXG4gICAgICBjb25zdCBIVE1MQ29sbGVjdGlvbiA9IFtdXG4gICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKFt0aGlzXSwgKGRlc2NlbmRhbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGVzY2VuZGFudENsYXNzTmFtZSA9IGRlc2NlbmRhbnQuYXR0cmlicy5jbGFzc1xuICAgICAgICBpZiAoZGVzY2VuZGFudENsYXNzTmFtZSAmJiBuYW1lcy5ldmVyeSgobmFtZSkgPT4gZGVzY2VuZGFudENsYXNzTmFtZS5pbmRleE9mKG5hbWUpID4gLTEpKSB7XG4gICAgICAgICAgSFRNTENvbGxlY3Rpb24ucHVzaChkZXNjZW5kYW50KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIEhUTUxDb2xsZWN0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKCFFbGVtZW50UHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAvLyBodHRwczovL2RvY3Mud2VicGxhdGZvcm0ub3JnL3dpa2kvY3NzL3NlbGVjdG9yc19hcGkvcXVlcnlTZWxlY3RvckFsbFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3F1ZXJ5U2VsZWN0b3JBbGxcbiAgICBFbGVtZW50UHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwgPSBmdW5jdGlvbiAoc2VsZWN0b3JzKSB7XG4gICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMucmVwbGFjZSgvKD4pKFxcUykvZywgJyQxICQyJykudHJpbSgpIC8vIGFkZCBzcGFjZSBmb3IgJz4nIHNlbGVjdG9yXG5cbiAgICAgIC8vIHVzaW5nIHJpZ2h0IHRvIGxlZnQgZXhlY3V0aW9uID0+IGh0dHBzOi8vZ2l0aHViLmNvbS9mYjU1L2Nzcy1zZWxlY3QjaG93LWRvZXMtaXQtd29ya1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZ2V0SW5zdHJ1Y3Rpb25zKHNlbGVjdG9ycylcbiAgICAgIGNvbnN0IGRpc2NvdmVyID0gaW5zdHJ1Y3Rpb25zLnNoaWZ0KClcblxuICAgICAgY29uc3QgdG90YWwgPSBpbnN0cnVjdGlvbnMubGVuZ3RoXG4gICAgICByZXR1cm4gZGlzY292ZXIodGhpcykuZmlsdGVyKChub2RlKSA9PiB7XG4gICAgICAgIHZhciBzdGVwID0gMFxuICAgICAgICB3aGlsZSAoc3RlcCA8IHRvdGFsKSB7XG4gICAgICAgICAgbm9kZSA9IGluc3RydWN0aW9uc1tzdGVwXShub2RlLCB0aGlzKVxuICAgICAgICAgIGlmICghbm9kZSkgeyAvLyBoaWVyYXJjaHkgZG9lc24ndCBtYXRjaFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ZXAgKz0gMVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmICghRWxlbWVudFByb3RvdHlwZS5jb250YWlucykge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2NvbnRhaW5zXG4gICAgRWxlbWVudFByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICB2YXIgaW5jbHVzaXZlID0gZmFsc2VcbiAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMoW3RoaXNdLCAoZGVzY2VuZGFudCwgZG9uZSkgPT4ge1xuICAgICAgICBpZiAoZGVzY2VuZGFudCA9PT0gZWxlbWVudCkge1xuICAgICAgICAgIGluY2x1c2l2ZSA9IHRydWVcbiAgICAgICAgICBkb25lKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiBpbmNsdXNpdmVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFJldHJpZXZlIHRyYW5zZm9ybWF0aW9uIHN0ZXBzXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59ICAgc2VsZWN0b3JzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7QXJyYXkuPEZ1bmN0aW9uPn0gICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBnZXRJbnN0cnVjdGlvbnMgKHNlbGVjdG9ycykge1xuICByZXR1cm4gc2VsZWN0b3JzLnNwbGl0KCcgJykucmV2ZXJzZSgpLm1hcCgoc2VsZWN0b3IsIHN0ZXApID0+IHtcbiAgICBjb25zdCBkaXNjb3ZlciA9IHN0ZXAgPT09IDBcbiAgICBjb25zdCBbdHlwZSwgcHNldWRvXSA9IHNlbGVjdG9yLnNwbGl0KCc6JylcblxuICAgIHZhciB2YWxpZGF0ZSA9IG51bGxcbiAgICB2YXIgaW5zdHJ1Y3Rpb24gPSBudWxsXG5cbiAgICBzd2l0Y2ggKHRydWUpIHtcblxuICAgICAgLy8gY2hpbGQ6ICc+J1xuICAgICAgY2FzZSAvPi8udGVzdCh0eXBlKTpcbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiBjaGVja1BhcmVudCAobm9kZSkge1xuICAgICAgICAgIHJldHVybiAodmFsaWRhdGUpID0+IHZhbGlkYXRlKG5vZGUucGFyZW50KSAmJiBub2RlLnBhcmVudFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIC8vIGNsYXNzOiAnLidcbiAgICAgIGNhc2UgL15cXC4vLnRlc3QodHlwZSk6XG4gICAgICAgIGNvbnN0IG5hbWVzID0gdHlwZS5zdWJzdHIoMSkuc3BsaXQoJy4nKVxuICAgICAgICB2YWxpZGF0ZSA9IChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9kZUNsYXNzTmFtZSA9IG5vZGUuYXR0cmlicy5jbGFzc1xuICAgICAgICAgIHJldHVybiBub2RlQ2xhc3NOYW1lICYmIG5hbWVzLmV2ZXJ5KChuYW1lKSA9PiBub2RlQ2xhc3NOYW1lLmluZGV4T2YobmFtZSkgPiAtMSlcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbiA9IGZ1bmN0aW9uIGNoZWNrQ2xhc3MgKG5vZGUsIHJvb3QpIHtcbiAgICAgICAgICBpZiAoZGlzY292ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUobmFtZXMuam9pbignICcpKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSA/IG5vZGUodmFsaWRhdGUpIDogZ2V0QW5jZXN0b3Iobm9kZSwgcm9vdCwgdmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgLy8gYXR0cmlidXRlOiAnW2tleT1cInZhbHVlXCJdJ1xuICAgICAgY2FzZSAvXlxcWy8udGVzdCh0eXBlKTpcbiAgICAgICAgY29uc3QgW2F0dHJpYnV0ZUtleSwgYXR0cmlidXRlVmFsdWVdID0gdHlwZS5yZXBsYWNlKC9cXFt8XFxdfFwiL2csICcnKS5zcGxpdCgnPScpXG4gICAgICAgIHZhbGlkYXRlID0gKG5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNBdHRyaWJ1dGUgPSBPYmplY3Qua2V5cyhub2RlLmF0dHJpYnMpLmluZGV4T2YoYXR0cmlidXRlS2V5KSA+IC0xXG4gICAgICAgICAgaWYgKGhhc0F0dHJpYnV0ZSkgeyAvLyByZWdhcmQgb3B0aW9uYWwgYXR0cmlidXRlVmFsdWVcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlVmFsdWUgfHwgKG5vZGUuYXR0cmlic1thdHRyaWJ1dGVLZXldID09PSBhdHRyaWJ1dGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiBjaGVja0F0dHJpYnV0ZSAobm9kZSwgcm9vdCkge1xuICAgICAgICAgIGlmIChkaXNjb3Zlcikge1xuICAgICAgICAgICAgY29uc3QgTm9kZUxpc3QgPSBbXVxuICAgICAgICAgICAgdHJhdmVyc2VEZXNjZW5kYW50cyhbbm9kZV0sIChkZXNjZW5kYW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0ZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgIE5vZGVMaXN0LnB1c2goZGVzY2VuZGFudClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBOb2RlTGlzdFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSA/IG5vZGUodmFsaWRhdGUpIDogZ2V0QW5jZXN0b3Iobm9kZSwgcm9vdCwgdmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgLy8gaWQ6ICcjJ1xuICAgICAgY2FzZSAvXiMvLnRlc3QodHlwZSk6XG4gICAgICAgIGNvbnN0IGlkID0gdHlwZS5zdWJzdHIoMSlcbiAgICAgICAgdmFsaWRhdGUgPSAobm9kZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBub2RlLmF0dHJpYnMuaWQgPT09IGlkXG4gICAgICAgIH1cbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiBjaGVja0lkIChub2RlLCByb290KSB7XG4gICAgICAgICAgaWYgKGRpc2NvdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBOb2RlTGlzdCA9IFtdXG4gICAgICAgICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKFtub2RlXSwgKGRlc2NlbmRhbnQsIGRvbmUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgTm9kZUxpc3QucHVzaChkZXNjZW5kYW50KVxuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIE5vZGVMaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodHlwZW9mIG5vZGUgPT09ICdmdW5jdGlvbicpID8gbm9kZSh2YWxpZGF0ZSkgOiBnZXRBbmNlc3Rvcihub2RlLCByb290LCB2YWxpZGF0ZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICAvLyB1bml2ZXJzYWw6ICcqJ1xuICAgICAgY2FzZSAvXFwqLy50ZXN0KHR5cGUpOlxuICAgICAgICB2YWxpZGF0ZSA9IChub2RlKSA9PiB0cnVlXG4gICAgICAgIGluc3RydWN0aW9uID0gZnVuY3Rpb24gY2hlY2tVbml2ZXJzYWwgKG5vZGUsIHJvb3QpIHtcbiAgICAgICAgICBpZiAoZGlzY292ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IE5vZGVMaXN0ID0gW11cbiAgICAgICAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMoW25vZGVdLCAoZGVzY2VuZGFudCkgPT4gTm9kZUxpc3QucHVzaChkZXNjZW5kYW50KSlcbiAgICAgICAgICAgIHJldHVybiBOb2RlTGlzdFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSA/IG5vZGUodmFsaWRhdGUpIDogZ2V0QW5jZXN0b3Iobm9kZSwgcm9vdCwgdmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgLy8gdGFnOiAnLi4uJ1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFsaWRhdGUgPSAobm9kZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBub2RlLm5hbWUgPT09IHR5cGVcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbiA9IGZ1bmN0aW9uIGNoZWNrVGFnIChub2RlLCByb290KSB7XG4gICAgICAgICAgaWYgKGRpc2NvdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBOb2RlTGlzdCA9IFtdXG4gICAgICAgICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKFtub2RlXSwgKGRlc2NlbmRhbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgTm9kZUxpc3QucHVzaChkZXNjZW5kYW50KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIE5vZGVMaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodHlwZW9mIG5vZGUgPT09ICdmdW5jdGlvbicpID8gbm9kZSh2YWxpZGF0ZSkgOiBnZXRBbmNlc3Rvcihub2RlLCByb290LCB2YWxpZGF0ZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHNldWRvKSB7XG4gICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25cbiAgICB9XG5cbiAgICBjb25zdCBydWxlID0gcHNldWRvLm1hdGNoKC8tKGNoaWxkfHR5cGUpXFwoKFxcZCspXFwpJC8pXG4gICAgY29uc3Qga2luZCA9IHJ1bGVbMV1cbiAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHJ1bGVbMl0sIDEwKSAtIDFcblxuICAgIGNvbnN0IHZhbGlkYXRlUHNldWRvID0gKG5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIHZhciBjb21wYXJlU2V0ID0gbm9kZS5wYXJlbnQuY2hpbGRUYWdzXG4gICAgICAgIGlmIChraW5kID09PSAndHlwZScpIHtcbiAgICAgICAgICBjb21wYXJlU2V0ID0gY29tcGFyZVNldC5maWx0ZXIodmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gY29tcGFyZVNldC5maW5kSW5kZXgoKGNoaWxkKSA9PiBjaGlsZCA9PT0gbm9kZSlcbiAgICAgICAgaWYgKG5vZGVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gZW5oYW5jZUluc3RydWN0aW9uIChub2RlKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGluc3RydWN0aW9uKG5vZGUpXG4gICAgICBpZiAoZGlzY292ZXIpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoLnJlZHVjZSgoTm9kZUxpc3QsIG1hdGNoZWROb2RlKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbGlkYXRlUHNldWRvKG1hdGNoZWROb2RlKSkge1xuICAgICAgICAgICAgTm9kZUxpc3QucHVzaChtYXRjaGVkTm9kZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIE5vZGVMaXN0XG4gICAgICAgIH0sIFtdKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbGlkYXRlUHNldWRvKG1hdGNoKSAmJiBtYXRjaFxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBXYWxraW5nIHJlY3Vyc2l2ZSB0byBpbnZva2UgY2FsbGJhY2tzXG4gKlxuICogQHBhcmFtIHtBcnJheS48SFRNTEVsZW1lbnQ+fSBub2RlcyAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gICAgICAgICAgICBoYW5kbGVyIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZURlc2NlbmRhbnRzIChub2RlcywgaGFuZGxlcikge1xuICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgdmFyIHByb2dyZXNzID0gdHJ1ZVxuICAgIGhhbmRsZXIobm9kZSwgKCkgPT4gcHJvZ3Jlc3MgPSBmYWxzZSlcbiAgICBpZiAobm9kZS5jaGlsZFRhZ3MgJiYgcHJvZ3Jlc3MpIHtcbiAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMobm9kZS5jaGlsZFRhZ3MsIGhhbmRsZXIpXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIEJ1YmJsZSB1cCBmcm9tIGJvdHRvbSB0byB0b3BcbiAqXG4gKiBAcGFyYW0gIHtIVE1MRUxlbWVudH0gbm9kZSAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRUxlbWVudH0gcm9vdCAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gICAgdmFsaWRhdGUgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtIVE1MRUxlbWVudH0gICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGdldEFuY2VzdG9yIChub2RlLCByb290LCB2YWxpZGF0ZSkge1xuICB3aGlsZSAobm9kZS5wYXJlbnQpIHtcbiAgICBub2RlID0gbm9kZS5wYXJlbnRcbiAgICBpZiAodmFsaWRhdGUobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuICAgIGlmIChub2RlID09PSByb290KSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2FkYXB0LmpzIiwiLyoqXG4gKiAjIFNlbGVjdFxuICpcbiAqIENvbnN0cnVjdCBhIHVuaXF1ZSBDU1MgcXVlcnkgc2VsZWN0b3IgdG8gYWNjZXNzIHRoZSBzZWxlY3RlZCBET00gZWxlbWVudChzKS5cbiAqIEZvciBsb25nZXZpdHkgaXQgYXBwbGllcyBkaWZmZXJlbnQgbWF0Y2hpbmcgYW5kIG9wdGltaXphdGlvbiBzdHJhdGVnaWVzLlxuICovXG5cbmltcG9ydCBhZGFwdCBmcm9tICcuL2FkYXB0J1xuaW1wb3J0IG1hdGNoIGZyb20gJy4vbWF0Y2gnXG5pbXBvcnQgb3B0aW1pemUgZnJvbSAnLi9vcHRpbWl6ZSdcbmltcG9ydCB7IGNvbnZlcnROb2RlTGlzdCB9IGZyb20gJy4vdXRpbGl0aWVzJ1xuaW1wb3J0IHsgZ2V0Q29tbW9uQW5jZXN0b3IsIGdldENvbW1vblByb3BlcnRpZXMgfSBmcm9tICcuL2NvbW1vbidcblxuLyoqXG4gKiBHZXQgYSBzZWxlY3RvciBmb3IgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICBvcHRpb25zIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaW5nbGVTZWxlY3RvciAoZWxlbWVudCwgb3B0aW9ucyA9IHt9KSB7XG5cbiAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDMpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlXG4gIH1cblxuICBpZiAoZWxlbWVudC5ub2RlVHlwZSAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnB1dCAtIG9ubHkgSFRNTEVsZW1lbnRzIG9yIHJlcHJlc2VudGF0aW9ucyBvZiB0aGVtIGFyZSBzdXBwb3J0ZWQhIChub3QgXCIke3R5cGVvZiBlbGVtZW50fVwiKWApXG4gIH1cblxuICBjb25zdCBnbG9iYWxNb2RpZmllZCA9IGFkYXB0KGVsZW1lbnQsIG9wdGlvbnMpXG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBtYXRjaChlbGVtZW50LCBvcHRpb25zKVxuICBjb25zdCBvcHRpbWl6ZWQgPSBvcHRpbWl6ZShzZWxlY3RvciwgZWxlbWVudCwgb3B0aW9ucylcblxuICAvLyBkZWJ1Z1xuICAvLyBjb25zb2xlLmxvZyhgXG4gIC8vICAgc2VsZWN0b3I6ICAke3NlbGVjdG9yfVxuICAvLyAgIG9wdGltaXplZDogJHtvcHRpbWl6ZWR9XG4gIC8vIGApXG5cbiAgaWYgKGdsb2JhbE1vZGlmaWVkKSB7XG4gICAgZGVsZXRlIGdsb2JhbC5kb2N1bWVudFxuICB9XG5cbiAgcmV0dXJuIG9wdGltaXplZFxufVxuXG4vKipcbiAqIEdldCBhIHNlbGVjdG9yIHRvIG1hdGNoIG11bHRpcGxlIGRlc2NlbmRhbnRzIGZyb20gYW4gYW5jZXN0b3JcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48SFRNTEVsZW1lbnQ+fE5vZGVMaXN0fSBlbGVtZW50cyAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNdWx0aVNlbGVjdG9yIChlbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGVsZW1lbnRzKSkge1xuICAgIGVsZW1lbnRzID0gY29udmVydE5vZGVMaXN0KGVsZW1lbnRzKVxuICB9XG5cbiAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGVsZW1lbnQubm9kZVR5cGUgIT09IDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlucHV0IC0gb25seSBhbiBBcnJheSBvZiBIVE1MRWxlbWVudHMgb3IgcmVwcmVzZW50YXRpb25zIG9mIHRoZW0gaXMgc3VwcG9ydGVkIWApXG4gIH1cblxuICBjb25zdCBnbG9iYWxNb2RpZmllZCA9IGFkYXB0KGVsZW1lbnRzWzBdLCBvcHRpb25zKVxuXG4gIGNvbnN0IGFuY2VzdG9yID0gZ2V0Q29tbW9uQW5jZXN0b3IoZWxlbWVudHMsIG9wdGlvbnMpXG4gIGNvbnN0IGFuY2VzdG9yU2VsZWN0b3IgPSBnZXRTaW5nbGVTZWxlY3RvcihhbmNlc3Rvciwgb3B0aW9ucylcblxuICAvLyBUT0RPOiBjb25zaWRlciB1c2FnZSBvZiBtdWx0aXBsZSBzZWxlY3RvcnMgKyBwYXJlbnQtY2hpbGQgcmVsYXRpb24gKyBjaGVjayBmb3IgcGFydCByZWR1bmRhbmN5XG4gIGNvbnN0IGNvbW1vblNlbGVjdG9ycyA9IGdldENvbW1vblNlbGVjdG9ycyhlbGVtZW50cylcbiAgY29uc3QgZGVzY2VuZGFudFNlbGVjdG9yID0gY29tbW9uU2VsZWN0b3JzWzBdXG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBvcHRpbWl6ZShgJHthbmNlc3RvclNlbGVjdG9yfSAke2Rlc2NlbmRhbnRTZWxlY3Rvcn1gLCBlbGVtZW50cywgb3B0aW9ucylcbiAgY29uc3Qgc2VsZWN0b3JNYXRjaGVzID0gY29udmVydE5vZGVMaXN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKVxuXG4gIGlmICghZWxlbWVudHMuZXZlcnkoKGVsZW1lbnQpID0+IHNlbGVjdG9yTWF0Y2hlcy5zb21lKChlbnRyeSkgPT4gZW50cnkgPT09IGVsZW1lbnQpICkpIHtcbiAgICAvLyBUT0RPOiBjbHVzdGVyIG1hdGNoZXMgdG8gc3BsaXQgaW50byBzaW1pbGFyIGdyb3VwcyBmb3Igc3ViIHNlbGVjdGlvbnNcbiAgICByZXR1cm4gY29uc29sZS53YXJuKGBcbiAgICAgIFRoZSBzZWxlY3RlZCBlbGVtZW50cyBjYW5cXCd0IGJlIGVmZmljaWVudGx5IG1hcHBlZC5cbiAgICAgIEl0cyBwcm9iYWJseSBiZXN0IHRvIHVzZSBtdWx0aXBsZSBzaW5nbGUgc2VsZWN0b3JzIGluc3RlYWQhXG4gICAgYCwgZWxlbWVudHMpXG4gIH1cblxuICBpZiAoZ2xvYmFsTW9kaWZpZWQpIHtcbiAgICBkZWxldGUgZ2xvYmFsLmRvY3VtZW50XG4gIH1cblxuICByZXR1cm4gc2VsZWN0b3Jcbn1cblxuLyoqXG4gKiBHZXQgc2VsZWN0b3JzIHRvIGRlc2NyaWJlIGEgc2V0IG9mIGVsZW1lbnRzXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPEhUTUxFbGVtZW50cz59IGVsZW1lbnRzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBnZXRDb21tb25TZWxlY3RvcnMgKGVsZW1lbnRzKSB7XG5cbiAgY29uc3QgeyBjbGFzc2VzLCBhdHRyaWJ1dGVzLCB0YWcgfSA9IGdldENvbW1vblByb3BlcnRpZXMoZWxlbWVudHMpXG5cbiAgY29uc3Qgc2VsZWN0b3JQYXRoID0gW11cblxuICBpZiAodGFnKSB7XG4gICAgc2VsZWN0b3JQYXRoLnB1c2godGFnKVxuICB9XG5cbiAgaWYgKGNsYXNzZXMpIHtcbiAgICBjb25zdCBjbGFzc1NlbGVjdG9yID0gY2xhc3Nlcy5tYXAoKG5hbWUpID0+IGAuJHtuYW1lfWApLmpvaW4oJycpXG4gICAgc2VsZWN0b3JQYXRoLnB1c2goY2xhc3NTZWxlY3RvcilcbiAgfVxuXG4gIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgY29uc3QgYXR0cmlidXRlU2VsZWN0b3IgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5yZWR1Y2UoKHBhcnRzLCBuYW1lKSA9PiB7XG4gICAgICBwYXJ0cy5wdXNoKGBbJHtuYW1lfT1cIiR7YXR0cmlidXRlc1tuYW1lXX1cIl1gKVxuICAgICAgcmV0dXJuIHBhcnRzXG4gICAgfSwgW10pLmpvaW4oJycpXG4gICAgc2VsZWN0b3JQYXRoLnB1c2goYXR0cmlidXRlU2VsZWN0b3IpXG4gIH1cblxuICBpZiAoc2VsZWN0b3JQYXRoLmxlbmd0aCkge1xuICAgIC8vIFRPRE86IGNoZWNrIGZvciBwYXJlbnQtY2hpbGQgcmVsYXRpb25cbiAgfVxuXG4gIHJldHVybiBbXG4gICAgc2VsZWN0b3JQYXRoLmpvaW4oJycpXG4gIF1cbn1cblxuLyoqXG4gKiBDaG9vc2UgYWN0aW9uIGRlcGVuZGluZyBvbiB0aGUgaW5wdXQgKG11bHRpcGxlL3NpbmdsZSlcbiAqXG4gKiBOT1RFOiBleHRlbmRlZCBkZXRlY3Rpb24gaXMgdXNlZCBmb3Igc3BlY2lhbCBjYXNlcyBsaWtlIHRoZSA8c2VsZWN0PiBlbGVtZW50IHdpdGggPG9wdGlvbnM+XG4gKlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR8Tm9kZUxpc3R8QXJyYXkuPEhUTUxFbGVtZW50Pn0gaW5wdXQgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRRdWVyeVNlbGVjdG9yIChpbnB1dCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmIChpbnB1dC5sZW5ndGggJiYgIWlucHV0Lm5hbWUpIHtcbiAgICByZXR1cm4gZ2V0TXVsdGlTZWxlY3RvcihpbnB1dCwgb3B0aW9ucylcbiAgfVxuICByZXR1cm4gZ2V0U2luZ2xlU2VsZWN0b3IoaW5wdXQsIG9wdGlvbnMpXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2VsZWN0LmpzIiwiLyoqXG4gKiAjIE1hdGNoXG4gKlxuICogUmV0cmlldmUgc2VsZWN0b3IgZm9yIGEgbm9kZS5cbiAqL1xuXG5pbXBvcnQgeyBlc2NhcGVWYWx1ZSB9IGZyb20gJy4vdXRpbGl0aWVzJ1xuXG5jb25zdCBkZWZhdWx0SWdub3JlID0ge1xuICBhdHRyaWJ1dGUgKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3N0eWxlJyxcbiAgICAgICdkYXRhLXJlYWN0aWQnLFxuICAgICAgJ2RhdGEtcmVhY3QtY2hlY2tzdW0nXG4gICAgXS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID4gLTFcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcGF0aCBvZiB0aGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBub2RlICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgIG9wdGlvbnMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF0Y2ggKG5vZGUsIG9wdGlvbnMpIHtcblxuICBjb25zdCB7XG4gICAgcm9vdCA9IGRvY3VtZW50LFxuICAgIHNraXAgPSBudWxsLFxuICAgIHByaW9yaXR5ID0gWydpZCcsICdjbGFzcycsICdocmVmJywgJ3NyYyddLFxuICAgIGlnbm9yZSA9IHt9XG4gIH0gPSBvcHRpb25zXG5cbiAgY29uc3QgcGF0aCA9IFtdXG4gIHZhciBlbGVtZW50ID0gbm9kZVxuICB2YXIgbGVuZ3RoID0gcGF0aC5sZW5ndGhcbiAgdmFyIGlnbm9yZUNsYXNzID0gZmFsc2VcblxuICBjb25zdCBza2lwQ29tcGFyZSA9IHNraXAgJiYgKEFycmF5LmlzQXJyYXkoc2tpcCkgPyBza2lwIDogW3NraXBdKS5tYXAoKGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIChlbGVtZW50KSA9PiBlbGVtZW50ID09PSBlbnRyeVxuICAgIH1cbiAgICByZXR1cm4gZW50cnlcbiAgfSlcblxuICBjb25zdCBza2lwQ2hlY2tzID0gKGVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gc2tpcCAmJiBza2lwQ29tcGFyZS5zb21lKChjb21wYXJlKSA9PiBjb21wYXJlKGVsZW1lbnQpKVxuICB9XG5cbiAgT2JqZWN0LmtleXMoaWdub3JlKS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgaWYgKHR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgIGlnbm9yZUNsYXNzID0gdHJ1ZVxuICAgIH1cbiAgICB2YXIgcHJlZGljYXRlID0gaWdub3JlW3R5cGVdXG4gICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdmdW5jdGlvbicpIHJldHVyblxuICAgIGlmICh0eXBlb2YgcHJlZGljYXRlID09PSAnbnVtYmVyJykge1xuICAgICAgcHJlZGljYXRlID0gcHJlZGljYXRlLnRvU3RyaW5nKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcmVkaWNhdGUgPSBuZXcgUmVnRXhwKGVzY2FwZVZhbHVlKHByZWRpY2F0ZSkucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKSlcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdib29sZWFuJykge1xuICAgICAgcHJlZGljYXRlID0gcHJlZGljYXRlID8gLyg/OikvIDogLy5eL1xuICAgIH1cbiAgICAvLyBjaGVjayBjbGFzcy0vYXR0cmlidXRlbmFtZSBmb3IgcmVnZXhcbiAgICBpZ25vcmVbdHlwZV0gPSAobmFtZSwgdmFsdWUpID0+IHByZWRpY2F0ZS50ZXN0KHZhbHVlKVxuICB9KVxuXG4gIGlmIChpZ25vcmVDbGFzcykge1xuICAgIGNvbnN0IGlnbm9yZUF0dHJpYnV0ZSA9IGlnbm9yZS5hdHRyaWJ1dGVcbiAgICBpZ25vcmUuYXR0cmlidXRlID0gKG5hbWUsIHZhbHVlLCBkZWZhdWx0UHJlZGljYXRlKSA9PiB7XG4gICAgICByZXR1cm4gaWdub3JlLmNsYXNzKHZhbHVlKSB8fCBpZ25vcmVBdHRyaWJ1dGUgJiYgaWdub3JlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBkZWZhdWx0UHJlZGljYXRlKVxuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChlbGVtZW50ICE9PSByb290KSB7XG4gICAgaWYgKHNraXBDaGVja3MoZWxlbWVudCkgIT09IHRydWUpIHtcbiAgICAgIC8vIH4gZ2xvYmFsXG4gICAgICBpZiAoY2hlY2tBdHRyaWJ1dGVzKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUsIHBhdGgsIHJvb3QpKSBicmVha1xuICAgICAgaWYgKGNoZWNrVGFnKGVsZW1lbnQsIGlnbm9yZSwgcGF0aCwgcm9vdCkpIGJyZWFrXG5cbiAgICAgIC8vIH4gbG9jYWxcbiAgICAgIGNoZWNrQXR0cmlidXRlcyhwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlLCBwYXRoKVxuICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSBsZW5ndGgpIHtcbiAgICAgICAgY2hlY2tUYWcoZWxlbWVudCwgaWdub3JlLCBwYXRoKVxuICAgICAgfVxuXG4gICAgICAvLyBkZWZpbmUgb25seSBvbmUgcGFydCBlYWNoIGl0ZXJhdGlvblxuICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSBsZW5ndGgpIHtcbiAgICAgICAgY2hlY2tDaGlsZHMocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSwgcGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlXG4gICAgbGVuZ3RoID0gcGF0aC5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbGVtZW50ID09PSByb290KSB7XG4gICAgY29uc3QgcGF0dGVybiA9IGZpbmRQYXR0ZXJuKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUpXG4gICAgcGF0aC51bnNoaWZ0KHBhdHRlcm4pXG4gIH1cblxuICByZXR1cm4gcGF0aC5qb2luKCcgJylcbn1cblxuLyoqXG4gKiBFeHRlbmQgcGF0aCB3aXRoIGF0dHJpYnV0ZSBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHByaW9yaXR5IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIGVsZW1lbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgIGlnbm9yZSAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHBhdGggICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIHBhcmVudCAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBjaGVja0F0dHJpYnV0ZXMgKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUsIHBhdGgsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICBjb25zdCBwYXR0ZXJuID0gZmluZEF0dHJpYnV0ZXNQYXR0ZXJuKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUpXG4gIGlmIChwYXR0ZXJuKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBwYXRoLnVuc2hpZnQocGF0dGVybilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIExvb2t1cCBhdHRyaWJ1dGUgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwcmlvcml0eSAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBlbGVtZW50ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICBpZ25vcmUgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZz99ICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gZmluZEF0dHJpYnV0ZXNQYXR0ZXJuIChwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlKSB7XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbGVtZW50LmF0dHJpYnV0ZXNcbiAgY29uc3Qgc29ydGVkS2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLnNvcnQoKGN1cnIsIG5leHQpID0+IHtcbiAgICBjb25zdCBjdXJyUG9zID0gcHJpb3JpdHkuaW5kZXhPZihhdHRyaWJ1dGVzW2N1cnJdLm5hbWUpXG4gICAgY29uc3QgbmV4dFBvcyA9IHByaW9yaXR5LmluZGV4T2YoYXR0cmlidXRlc1tuZXh0XS5uYW1lKVxuICAgIGlmIChuZXh0UG9zID09PSAtMSkge1xuICAgICAgaWYgKGN1cnJQb3MgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJQb3MgLSBuZXh0UG9zXG4gIH0pXG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzb3J0ZWRLZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHNvcnRlZEtleXNbaV1cbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2tleV1cbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLm5hbWVcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGVzY2FwZVZhbHVlKGF0dHJpYnV0ZS52YWx1ZSlcblxuICAgIGNvbnN0IGN1cnJlbnRJZ25vcmUgPSBpZ25vcmVbYXR0cmlidXRlTmFtZV0gfHwgaWdub3JlLmF0dHJpYnV0ZVxuICAgIGNvbnN0IGN1cnJlbnREZWZhdWx0SWdub3JlID0gZGVmYXVsdElnbm9yZVthdHRyaWJ1dGVOYW1lXSB8fCBkZWZhdWx0SWdub3JlLmF0dHJpYnV0ZVxuICAgIGlmIChjaGVja0lnbm9yZShjdXJyZW50SWdub3JlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSwgY3VycmVudERlZmF1bHRJZ25vcmUpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBwYXR0ZXJuID0gYFske2F0dHJpYnV0ZU5hbWV9PVwiJHthdHRyaWJ1dGVWYWx1ZX1cIl1gXG5cbiAgICBpZiAoKC9cXGJcXGQvKS50ZXN0KGF0dHJpYnV0ZVZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSAnaWQnKSB7XG4gICAgICAgIHBhdHRlcm4gPSBgIyR7YXR0cmlidXRlVmFsdWV9YFxuICAgICAgfVxuXG4gICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnLicpXG4gICAgICAgIHBhdHRlcm4gPSBgLiR7Y2xhc3NOYW1lfWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0dGVyblxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogRXh0ZW5kIHBhdGggd2l0aCB0YWcgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBlbGVtZW50IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgIGlnbm9yZSAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcGF0aCAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBwYXJlbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGNoZWNrVGFnIChlbGVtZW50LCBpZ25vcmUsIHBhdGgsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICBjb25zdCBwYXR0ZXJuID0gZmluZFRhZ1BhdHRlcm4oZWxlbWVudCwgaWdub3JlKVxuICBpZiAocGF0dGVybikge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocGF0dGVybilcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHBhdGgudW5zaGlmdChwYXR0ZXJuKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogTG9va3VwIHRhZyBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgaWdub3JlICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBmaW5kVGFnUGF0dGVybiAoZWxlbWVudCwgaWdub3JlKSB7XG4gIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICBpZiAoY2hlY2tJZ25vcmUoaWdub3JlLnRhZywgbnVsbCwgdGFnTmFtZSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiB0YWdOYW1lXG59XG5cbi8qKlxuICogRXh0ZW5kIHBhdGggd2l0aCBzcGVjaWZpYyBjaGlsZCBpZGVudGlmaWVyXG4gKlxuICogTk9URTogJ2NoaWxkVGFncycgaXMgYSBjdXN0b20gcHJvcGVydHkgdG8gdXNlIGFzIGEgdmlldyBmaWx0ZXIgZm9yIHRhZ3MgdXNpbmcgJ2FkYXB0ZXIuanMnXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHByaW9yaXR5IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIGVsZW1lbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgIGlnbm9yZSAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHBhdGggICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBjaGVja0NoaWxkcyAocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSwgcGF0aCkge1xuICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGVcbiAgY29uc3QgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGRUYWdzIHx8IHBhcmVudC5jaGlsZHJlblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV1cbiAgICBpZiAoY2hpbGQgPT09IGVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0dGVybiA9IGZpbmRQYXR0ZXJuKHByaW9yaXR5LCBjaGlsZCwgaWdub3JlKVxuICAgICAgaWYgKCFjaGlsZFBhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybihgXG4gICAgICAgICAgRWxlbWVudCBjb3VsZG5cXCd0IGJlIG1hdGNoZWQgdGhyb3VnaCBzdHJpY3QgaWdub3JlIHBhdHRlcm4hXG4gICAgICAgIGAsIGNoaWxkLCBpZ25vcmUsIGNoaWxkUGF0dGVybilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBgPiAke2NoaWxkUGF0dGVybn06bnRoLWNoaWxkKCR7aSsxfSlgXG4gICAgICBwYXRoLnVuc2hpZnQocGF0dGVybilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIExvb2t1cCBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHByaW9yaXR5IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIGVsZW1lbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgIGlnbm9yZSAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBmaW5kUGF0dGVybiAocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSkge1xuICB2YXIgcGF0dGVybiA9IGZpbmRBdHRyaWJ1dGVzUGF0dGVybihwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlKVxuICBpZiAoIXBhdHRlcm4pIHtcbiAgICBwYXR0ZXJuID0gZmluZFRhZ1BhdHRlcm4oZWxlbWVudCwgaWdub3JlKVxuICB9XG4gIHJldHVybiBwYXR0ZXJuXG59XG5cbi8qKlxuICogVmFsaWRhdGUgd2l0aCBjdXN0b20gYW5kIGRlZmF1bHQgZnVuY3Rpb25zXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IHByZWRpY2F0ZSAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtzdHJpbmc/fSAgbmFtZSAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge3N0cmluZ30gICB2YWx1ZSAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7RnVuY3Rpb259IGRlZmF1bHRQcmVkaWNhdGUgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY2hlY2tJZ25vcmUgKHByZWRpY2F0ZSwgbmFtZSwgdmFsdWUsIGRlZmF1bHRQcmVkaWNhdGUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgY29uc3QgY2hlY2sgPSBwcmVkaWNhdGUgfHwgZGVmYXVsdFByZWRpY2F0ZVxuICBpZiAoIWNoZWNrKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIGNoZWNrKG5hbWUsIHZhbHVlLCBkZWZhdWx0UHJlZGljYXRlKVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL21hdGNoLmpzIiwiZXhwb3J0IHNlbGVjdCwgeyBnZXRTaW5nbGVTZWxlY3RvciwgZ2V0TXVsdGlTZWxlY3RvciB9IGZyb20gJy4vc2VsZWN0J1xuZXhwb3J0IG9wdGltaXplIGZyb20gJy4vb3B0aW1pemUnXG5leHBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi9jb21tb24nXG5cbmV4cG9ydCBkZWZhdWx0IGZyb20gJy4vc2VsZWN0J1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAxMmM2NDlhYmYyMjJjZGFkYjljZSIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbGl0aWVzLmpzIiwid2VicGFjazovLy8uL3NyYy9jb21tb24uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL29wdGltaXplLmpzIiwid2VicGFjazovLy8uL3NyYy9hZGFwdC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2VsZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvbWF0Y2guanMiXSwibmFtZXMiOlsiY29udmVydE5vZGVMaXN0IiwiZXNjYXBlVmFsdWUiLCJub2RlcyIsImxlbmd0aCIsImFyciIsIkFycmF5IiwiaSIsInZhbHVlIiwiQ1NTIiwiZXNjYXBlIiwicmVwbGFjZSIsImdldENvbW1vbkFuY2VzdG9yIiwiZ2V0Q29tbW9uUHJvcGVydGllcyIsImVsZW1lbnRzIiwib3B0aW9ucyIsInJvb3QiLCJkb2N1bWVudCIsImFuY2VzdG9ycyIsImZvckVhY2giLCJlbGVtZW50IiwiaW5kZXgiLCJwYXJlbnRzIiwicGFyZW50Tm9kZSIsInVuc2hpZnQiLCJzb3J0IiwiY3VyciIsIm5leHQiLCJzaGFsbG93QW5jZXN0b3IiLCJzaGlmdCIsImFuY2VzdG9yIiwicGFyZW50IiwibWlzc2luZyIsInNvbWUiLCJvdGhlclBhcmVudHMiLCJvdGhlclBhcmVudCIsImwiLCJjb21tb25Qcm9wZXJ0aWVzIiwiY2xhc3NlcyIsImF0dHJpYnV0ZXMiLCJ0YWciLCJjb21tb25DbGFzc2VzIiwiY29tbW9uQXR0cmlidXRlcyIsImNvbW1vblRhZyIsInVuZGVmaW5lZCIsImdldEF0dHJpYnV0ZSIsInRyaW0iLCJzcGxpdCIsImZpbHRlciIsImVudHJ5IiwibmFtZSIsImVsZW1lbnRBdHRyaWJ1dGVzIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImtleSIsImF0dHJpYnV0ZSIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVzTmFtZXMiLCJjb21tb25BdHRyaWJ1dGVzTmFtZXMiLCJuZXh0Q29tbW9uQXR0cmlidXRlcyIsInRhZ05hbWUiLCJ0b0xvd2VyQ2FzZSIsIm9wdGltaXplIiwic2VsZWN0b3IiLCJpc0FycmF5Iiwibm9kZVR5cGUiLCJFcnJvciIsImdsb2JhbE1vZGlmaWVkIiwicGF0aCIsIm9wdGltaXplUGFydCIsInNob3J0ZW5lZCIsInBvcCIsImN1cnJlbnQiLCJwcmVQYXJ0Iiwiam9pbiIsInBvc3RQYXJ0IiwicGF0dGVybiIsIm1hdGNoZXMiLCJxdWVyeVNlbGVjdG9yQWxsIiwic2xpY2UiLCJ0ZXN0IiwiY29tcGFyZVJlc3VsdHMiLCJyZWZlcmVuY2VzIiwicmVmZXJlbmNlIiwiY29udGFpbnMiLCJkZXNjcmlwdGlvbiIsImRlc2NlbmRhbnQiLCJ0eXBlIiwibmFtZXMiLCJtYXAiLCJwYXJ0aWFsIiwiY2hhckF0IiwibWF0Y2giLCJldmVyeSIsImFkYXB0IiwiZ2xvYmFsIiwiY29udGV4dCIsIkVsZW1lbnRQcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsImNoaWxkcmVuIiwibm9kZSIsImF0dHJpYnMiLCJOYW1lZE5vZGVNYXAiLCJjb25maWd1cmFibGUiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIkhUTUxDb2xsZWN0aW9uIiwidHJhdmVyc2VEZXNjZW5kYW50cyIsImNoaWxkVGFncyIsInB1c2giLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiY2xhc3NOYW1lIiwiZGVzY2VuZGFudENsYXNzTmFtZSIsImNsYXNzIiwiaW5kZXhPZiIsInNlbGVjdG9ycyIsImluc3RydWN0aW9ucyIsImdldEluc3RydWN0aW9ucyIsImRpc2NvdmVyIiwidG90YWwiLCJzdGVwIiwiaW5jbHVzaXZlIiwiZG9uZSIsInJldmVyc2UiLCJwc2V1ZG8iLCJ2YWxpZGF0ZSIsImluc3RydWN0aW9uIiwiY2hlY2tQYXJlbnQiLCJzdWJzdHIiLCJub2RlQ2xhc3NOYW1lIiwiY2hlY2tDbGFzcyIsImdldEFuY2VzdG9yIiwiYXR0cmlidXRlS2V5IiwiYXR0cmlidXRlVmFsdWUiLCJoYXNBdHRyaWJ1dGUiLCJjaGVja0F0dHJpYnV0ZSIsIk5vZGVMaXN0IiwiaWQiLCJjaGVja0lkIiwiY2hlY2tVbml2ZXJzYWwiLCJjaGVja1RhZyIsInJ1bGUiLCJraW5kIiwicGFyc2VJbnQiLCJ2YWxpZGF0ZVBzZXVkbyIsImNvbXBhcmVTZXQiLCJub2RlSW5kZXgiLCJmaW5kSW5kZXgiLCJjaGlsZCIsImVuaGFuY2VJbnN0cnVjdGlvbiIsIm1hdGNoZWROb2RlIiwiaGFuZGxlciIsInByb2dyZXNzIiwiZ2V0U2luZ2xlU2VsZWN0b3IiLCJnZXRNdWx0aVNlbGVjdG9yIiwiZ2V0UXVlcnlTZWxlY3RvciIsIm9wdGltaXplZCIsImFuY2VzdG9yU2VsZWN0b3IiLCJjb21tb25TZWxlY3RvcnMiLCJnZXRDb21tb25TZWxlY3RvcnMiLCJkZXNjZW5kYW50U2VsZWN0b3IiLCJzZWxlY3Rvck1hdGNoZXMiLCJjb25zb2xlIiwid2FybiIsInNlbGVjdG9yUGF0aCIsImNsYXNzU2VsZWN0b3IiLCJhdHRyaWJ1dGVTZWxlY3RvciIsInBhcnRzIiwiaW5wdXQiLCJzZWxlY3QiLCJjb21tb24iLCJkZWZhdWx0IiwiZGVmYXVsdElnbm9yZSIsInNraXAiLCJwcmlvcml0eSIsImlnbm9yZSIsImlnbm9yZUNsYXNzIiwic2tpcENvbXBhcmUiLCJza2lwQ2hlY2tzIiwiY29tcGFyZSIsInByZWRpY2F0ZSIsInRvU3RyaW5nIiwiUmVnRXhwIiwiaWdub3JlQXR0cmlidXRlIiwiZGVmYXVsdFByZWRpY2F0ZSIsImNoZWNrQXR0cmlidXRlcyIsImNoZWNrQ2hpbGRzIiwiZmluZFBhdHRlcm4iLCJmaW5kQXR0cmlidXRlc1BhdHRlcm4iLCJzb3J0ZWRLZXlzIiwiY3VyclBvcyIsIm5leHRQb3MiLCJjdXJyZW50SWdub3JlIiwiY3VycmVudERlZmF1bHRJZ25vcmUiLCJjaGVja0lnbm9yZSIsImZpbmRUYWdQYXR0ZXJuIiwiY2hpbGRQYXR0ZXJuIiwiY2hlY2siXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsbURBQTJDLGNBQWM7O0FBRXpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQTJCLDBCQUEwQixFQUFFO0FBQ3ZELHlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhEQUFzRCwrREFBK0Q7O0FBRXJIO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7OztRQ3BEZ0JBLGUsR0FBQUEsZTtRQWlCQUMsVyxHQUFBQSxXO0FBN0JoQjs7Ozs7O0FBTUE7Ozs7OztBQU1PLFNBQVNELGVBQVQsQ0FBeUJFLEtBQXpCLEVBQWdDO0FBQUEsTUFDN0JDLE1BRDZCLEdBQ2xCRCxLQURrQixDQUM3QkMsTUFENkI7O0FBRXJDLE1BQU1DLE1BQU0sSUFBSUMsS0FBSixDQUFVRixNQUFWLENBQVo7QUFDQSxPQUFLLElBQUlHLElBQUksQ0FBYixFQUFnQkEsSUFBSUgsTUFBcEIsRUFBNEJHLEdBQTVCLEVBQWlDO0FBQy9CRixRQUFJRSxDQUFKLElBQVNKLE1BQU1JLENBQU4sQ0FBVDtBQUNEO0FBQ0QsU0FBT0YsR0FBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFPLFNBQVNILFdBQVQsQ0FBcUJNLEtBQXJCLEVBQTRCOztBQUVqQyxN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U0EsU0FBU3lILFdBQVQsQ0FBc0JkLFNBQXRCLEVBQWlDdEksSUFBakMsRUFBdUMxQyxLQUF2QyxFQUE4Q29MLGdCQUE5QyxFQUFnRTtBQUM5RCxNQUFJLENBQUNwTCxLQUFMLEVBQVk7QUFDVixXQUFPLElBQVA7QUFDRDtBQUNELE1BQU1pTSxRQUFRakIsYUFBYUksZ0JBQTNCO0FBQ0EsTUFBSSxDQUFDYSxLQUFMLEVBQVk7QUFDVixXQUFPLEtBQVA7QUFDRDtBQUNELFNBQU9BLE1BQU12SixJQUFOLEVBQVkxQyxLQUFaLEVBQW1Cb0wsZ0JBQW5CLENBQVA7QUFDRCIsImZpbGUiOiJvcHRpbWFsLXNlbGVjdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIk9wdGltYWxTZWxlY3RcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiT3B0aW1hbFNlbGVjdFwiXSA9IGZhY3RvcnkoKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIFxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5pID0gZnVuY3Rpb24odmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbiBcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gXHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbiBcdFx0XHR9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA1KTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyB3ZWJwYWNrL2Jvb3RzdHJhcCAxMmM2NDlhYmYyMjJjZGFkYjljZSIsIi8qKlxuICogIyBVdGlsaXRpZXNcbiAqXG4gKiBDb252ZW5pZW5jZSBoZWxwZXJzLlxuICovXG5cbi8qKlxuICogQ3JlYXRlIGFuIGFycmF5IHdpdGggdGhlIERPTSBub2RlcyBvZiB0aGUgbGlzdFxuICpcbiAqIEBwYXJhbSAge05vZGVMaXN0fSAgICAgICAgICAgICBub2RlcyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0FycmF5LjxIVE1MRWxlbWVudD59ICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnROb2RlTGlzdChub2Rlcykge1xuICBjb25zdCB7IGxlbmd0aCB9ID0gbm9kZXNcbiAgY29uc3QgYXJyID0gbmV3IEFycmF5KGxlbmd0aClcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGFycltpXSA9IG5vZGVzW2ldXG4gIH1cbiAgcmV0dXJuIGFyclxufVxuXG4vKipcbiAqIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGxpbmUgYnJlYWtzIGFzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mICdDU1MuZXNjYXBlKCknXG4gKlxuICogRGVzY3JpcHRpb24gb2YgdmFsaWQgY2hhcmFjdGVyczogaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2Nzcy1lc2NhcGVzXG4gKlxuICogQHBhcmFtICB7U3RyaW5nP30gdmFsdWUgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVZhbHVlKHZhbHVlKSB7XG5cbiAgaWYgKENTUy5lc2NhcGUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgQ1NTLmVzY2FwZSh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gdmFsdWUgJiYgdmFsdWUucmVwbGFjZSgvWydcImBcXFxcLzpcXD8mISMkJV4oKVtcXF17fH0qKzssLjw9PkB+XS9nLCAnXFxcXCQmJylcbiAgICAucmVwbGFjZSgvXFxuL2csICdcXEEnKVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL3V0aWxpdGllcy5qcyIsIi8qKlxuICogIyBDb21tb25cbiAqXG4gKiBQcm9jZXNzIGNvbGxlY3Rpb25zIGZvciBzaW1pbGFyaXRpZXMuXG4gKi9cblxuLyoqXG4gKiBGaW5kIHRoZSBsYXN0IGNvbW1vbiBhbmNlc3RvciBvZiBlbGVtZW50c1xuICpcbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudHM+fSBlbGVtZW50cyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vbkFuY2VzdG9yIChlbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG5cbiAgY29uc3Qge1xuICAgIHJvb3QgPSBkb2N1bWVudFxuICB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IGFuY2VzdG9ycyA9IFtdXG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBwYXJlbnRzID0gW11cbiAgICB3aGlsZSAoZWxlbWVudCAhPT0gcm9vdCkge1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZVxuICAgICAgcGFyZW50cy51bnNoaWZ0KGVsZW1lbnQpXG4gICAgfVxuICAgIGFuY2VzdG9yc1tpbmRleF0gPSBwYXJlbnRzXG4gIH0pXG5cbiAgYW5jZXN0b3JzLnNvcnQoKGN1cnIsIG5leHQpID0+IGN1cnIubGVuZ3RoIC0gbmV4dC5sZW5ndGgpXG5cbiAgY29uc3Qgc2hhbGxvd0FuY2VzdG9yID0gYW5jZXN0b3JzLnNoaWZ0KClcblxuICB2YXIgYW5jZXN0b3IgPSBudWxsXG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzaGFsbG93QW5jZXN0b3IubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgY29uc3QgcGFyZW50ID0gc2hhbGxvd0FuY2VzdG9yW2ldXG4gICAgY29uc3QgbWlzc2luZyA9IGFuY2VzdG9ycy5zb21lKChvdGhlclBhcmVudHMpID0+IHtcbiAgICAgIHJldHVybiAhb3RoZXJQYXJlbnRzLnNvbWUoKG90aGVyUGFyZW50KSA9PiBvdGhlclBhcmVudCA9PT0gcGFyZW50KVxuICAgIH0pXG5cbiAgICBpZiAobWlzc2luZykge1xuICAgICAgLy8gVE9ETzogZmluZCBzaW1pbGFyIHN1Yi1wYXJlbnRzLCBub3QgdGhlIHRvcCByb290LCBlLmcuIHNoYXJpbmcgYSBjbGFzcyBzZWxlY3RvclxuICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBhbmNlc3RvciA9IHBhcmVudFxuICB9XG5cbiAgcmV0dXJuIGFuY2VzdG9yXG59XG5cbi8qKlxuICogR2V0IGEgc2V0IG9mIGNvbW1vbiBwcm9wZXJ0aWVzIG9mIGVsZW1lbnRzXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPEhUTUxFbGVtZW50Pn0gZWxlbWVudHMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblByb3BlcnRpZXMgKGVsZW1lbnRzKSB7XG5cbiAgY29uc3QgY29tbW9uUHJvcGVydGllcyA9IHtcbiAgICBjbGFzc2VzOiBbXSxcbiAgICBhdHRyaWJ1dGVzOiB7fSxcbiAgICB0YWc6IG51bGxcbiAgfVxuXG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcblxuICAgIHZhciB7XG4gICAgICBjbGFzc2VzOiBjb21tb25DbGFzc2VzLFxuICAgICAgYXR0cmlidXRlczogY29tbW9uQXR0cmlidXRlcyxcbiAgICAgIHRhZzogY29tbW9uVGFnXG4gICAgfSA9IGNvbW1vblByb3BlcnRpZXNcblxuICAgIC8vIH4gY2xhc3Nlc1xuICAgIGlmIChjb21tb25DbGFzc2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBjbGFzc2VzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgIGlmIChjbGFzc2VzKSB7XG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLnRyaW0oKS5zcGxpdCgnICcpXG4gICAgICAgIGlmICghY29tbW9uQ2xhc3Nlcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLmNsYXNzZXMgPSBjbGFzc2VzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29tbW9uQ2xhc3NlcyA9IGNvbW1vbkNsYXNzZXMuZmlsdGVyKChlbnRyeSkgPT4gY2xhc3Nlcy5zb21lKChuYW1lKSA9PiBuYW1lID09PSBlbnRyeSkpXG4gICAgICAgICAgaWYgKGNvbW1vbkNsYXNzZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb21tb25Qcm9wZXJ0aWVzLmNsYXNzZXMgPSBjb21tb25DbGFzc2VzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb21tb25Qcm9wZXJ0aWVzLmNsYXNzZXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IHJlc3RydWN0dXJlIHJlbW92YWwgYXMgMnggc2V0IC8gMnggZGVsZXRlLCBpbnN0ZWFkIG9mIG1vZGlmeSBhbHdheXMgcmVwbGFjaW5nIHdpdGggbmV3IGNvbGxlY3Rpb25cbiAgICAgICAgZGVsZXRlIGNvbW1vblByb3BlcnRpZXMuY2xhc3Nlc1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIH4gYXR0cmlidXRlc1xuICAgIGlmIChjb21tb25BdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRBdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzXG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0gT2JqZWN0LmtleXMoZWxlbWVudEF0dHJpYnV0ZXMpLnJlZHVjZSgoYXR0cmlidXRlcywga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsZW1lbnRBdHRyaWJ1dGVzW2tleV1cbiAgICAgICAgY29uc3QgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZS5uYW1lXG4gICAgICAgIC8vIE5PVEU6IHdvcmthcm91bmQgZGV0ZWN0aW9uIGZvciBub24tc3RhbmRhcmQgcGhhbnRvbWpzIE5hbWVkTm9kZU1hcCBiZWhhdmlvdXJcbiAgICAgICAgLy8gKGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYXJpeWEvcGhhbnRvbWpzL2lzc3Vlcy8xNDYzNClcbiAgICAgICAgaWYgKGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGVOYW1lICE9PSAnY2xhc3MnKSB7XG4gICAgICAgICAgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgICB9LCB7fSlcblxuICAgICAgY29uc3QgYXR0cmlidXRlc05hbWVzID0gT2JqZWN0LmtleXMoYXR0cmlidXRlcylcbiAgICAgIGNvbnN0IGNvbW1vbkF0dHJpYnV0ZXNOYW1lcyA9IE9iamVjdC5rZXlzKGNvbW1vbkF0dHJpYnV0ZXMpXG5cbiAgICAgIGlmIChhdHRyaWJ1dGVzTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmICghY29tbW9uQXR0cmlidXRlc05hbWVzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21tb25BdHRyaWJ1dGVzID0gY29tbW9uQXR0cmlidXRlc05hbWVzLnJlZHVjZSgobmV4dENvbW1vbkF0dHJpYnV0ZXMsIG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29tbW9uQXR0cmlidXRlc1tuYW1lXVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBhdHRyaWJ1dGVzW25hbWVdKSB7XG4gICAgICAgICAgICAgIG5leHRDb21tb25BdHRyaWJ1dGVzW25hbWVdID0gdmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXh0Q29tbW9uQXR0cmlidXRlc1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjb21tb25BdHRyaWJ1dGVzKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbW1vblByb3BlcnRpZXMuYXR0cmlidXRlcyA9IGNvbW1vbkF0dHJpYnV0ZXNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIGNvbW1vblByb3BlcnRpZXMuYXR0cmlidXRlc1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGNvbW1vblByb3BlcnRpZXMuYXR0cmlidXRlc1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIH4gdGFnXG4gICAgaWYgKGNvbW1vblRhZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB0YWcgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgaWYgKCFjb21tb25UYWcpIHtcbiAgICAgICAgY29tbW9uUHJvcGVydGllcy50YWcgPSB0YWdcbiAgICAgIH0gZWxzZSBpZiAodGFnICE9PSBjb21tb25UYWcpIHtcbiAgICAgICAgZGVsZXRlIGNvbW1vblByb3BlcnRpZXMudGFnXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBjb21tb25Qcm9wZXJ0aWVzXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvY29tbW9uLmpzIiwiLyoqXG4gKiAjIE9wdGltaXplXG4gKlxuICogMS4pIEltcHJvdmUgZWZmaWNpZW5jeSB0aHJvdWdoIHNob3J0ZXIgc2VsZWN0b3JzIGJ5IHJlbW92aW5nIHJlZHVuZGFuY3lcbiAqIDIuKSBJbXByb3ZlIHJvYnVzdG5lc3MgdGhyb3VnaCBzZWxlY3RvciB0cmFuc2Zvcm1hdGlvblxuICovXG5cbmltcG9ydCBhZGFwdCBmcm9tICcuL2FkYXB0J1xuaW1wb3J0IHsgY29udmVydE5vZGVMaXN0IH0gZnJvbSAnLi91dGlsaXRpZXMnXG5cbi8qKlxuICogQXBwbHkgZGlmZmVyZW50IG9wdGltaXphdGlvbiB0ZWNobmlxdWVzXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudHxBcnJheS48SFRNTEVsZW1lbnQ+fSBlbGVtZW50ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9wdGltaXplIChzZWxlY3RvciwgZWxlbWVudHMsIG9wdGlvbnMgPSB7fSkge1xuXG4gIC8vIGNvbnZlcnQgc2luZ2xlIGVudHJ5IGFuZCBOb2RlTGlzdFxuICBpZiAoIUFycmF5LmlzQXJyYXkoZWxlbWVudHMpKSB7XG4gICAgZWxlbWVudHMgPSAhZWxlbWVudHMubGVuZ3RoID8gW2VsZW1lbnRzXSA6IGNvbnZlcnROb2RlTGlzdChlbGVtZW50cylcbiAgfVxuXG4gIGlmICghZWxlbWVudHMubGVuZ3RoIHx8IGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGVsZW1lbnQubm9kZVR5cGUgIT09IDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlucHV0IC0gdG8gY29tcGFyZSBIVE1MRWxlbWVudHMgaXRzIG5lY2Vzc2FyeSB0byBwcm92aWRlIGEgcmVmZXJlbmNlIG9mIHRoZSBzZWxlY3RlZCBub2RlKHMpISAobWlzc2luZyBcImVsZW1lbnRzXCIpYClcbiAgfVxuXG4gIGNvbnN0IGdsb2JhbE1vZGlmaWVkID0gYWRhcHQoZWxlbWVudHNbMF0sIG9wdGlvbnMpXG5cbiAgLy8gY2h1bmsgcGFydHMgb3V0c2lkZSBvZiBxdW90ZXMgKGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzI1NjYzNzI5KVxuICB2YXIgcGF0aCA9IHNlbGVjdG9yLnJlcGxhY2UoLz4gL2csICc+Jykuc3BsaXQoL1xccysoPz0oPzooPzpbXlwiXSpcIil7Mn0pKlteXCJdKiQpLylcblxuICBpZiAocGF0aC5sZW5ndGggPCAyKSB7XG4gICAgcmV0dXJuIG9wdGltaXplUGFydCgnJywgc2VsZWN0b3IsICcnLCBlbGVtZW50cylcbiAgfVxuXG4gIGNvbnN0IHNob3J0ZW5lZCA9IFtwYXRoLnBvcCgpXVxuICB3aGlsZSAocGF0aC5sZW5ndGggPiAxKSAge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBwYXRoLnBvcCgpXG4gICAgY29uc3QgcHJlUGFydCA9IHBhdGguam9pbignICcpXG4gICAgY29uc3QgcG9zdFBhcnQgPSBzaG9ydGVuZWQuam9pbignICcpXG5cbiAgICBjb25zdCBwYXR0ZXJuID0gYCR7cHJlUGFydH0gJHtwb3N0UGFydH1gXG4gICAgY29uc3QgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggIT09IGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgc2hvcnRlbmVkLnVuc2hpZnQob3B0aW1pemVQYXJ0KHByZVBhcnQsIGN1cnJlbnQsIHBvc3RQYXJ0LCBlbGVtZW50cykpXG4gICAgfVxuICB9XG4gIHNob3J0ZW5lZC51bnNoaWZ0KHBhdGhbMF0pXG4gIHBhdGggPSBzaG9ydGVuZWRcblxuICAvLyBvcHRpbWl6ZSBzdGFydCArIGVuZFxuICBwYXRoWzBdID0gb3B0aW1pemVQYXJ0KCcnLCBwYXRoWzBdLCBwYXRoLnNsaWNlKDEpLmpvaW4oJyAnKSwgZWxlbWVudHMpXG4gIHBhdGhbcGF0aC5sZW5ndGgtMV0gPSBvcHRpbWl6ZVBhcnQocGF0aC5zbGljZSgwLCAtMSkuam9pbignICcpLCBwYXRoW3BhdGgubGVuZ3RoLTFdLCAnJywgZWxlbWVudHMpXG5cbiAgaWYgKGdsb2JhbE1vZGlmaWVkKSB7XG4gICAgZGVsZXRlIGdsb2JhbC5kb2N1bWVudFxuICB9XG5cbiAgcmV0dXJuIHBhdGguam9pbignICcpLnJlcGxhY2UoLz4vZywgJz4gJykudHJpbSgpXG59XG5cbi8qKlxuICogSW1wcm92ZSBhIGNodW5rIG9mIHRoZSBzZWxlY3RvclxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgIHByZVBhcnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7c3RyaW5nfSAgICAgICAgICAgICAgY3VycmVudCAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgICBwb3N0UGFydCAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIG9wdGltaXplUGFydCAocHJlUGFydCwgY3VycmVudCwgcG9zdFBhcnQsIGVsZW1lbnRzKSB7XG4gIGlmIChwcmVQYXJ0Lmxlbmd0aCkgcHJlUGFydCA9IGAke3ByZVBhcnR9IGBcbiAgaWYgKHBvc3RQYXJ0Lmxlbmd0aCkgcG9zdFBhcnQgPSBgICR7cG9zdFBhcnR9YFxuXG4gIC8vIHJvYnVzdG5lc3M6IGF0dHJpYnV0ZSB3aXRob3V0IHZhbHVlIChnZW5lcmFsaXphdGlvbilcbiAgaWYgKC9cXFsqXFxdLy50ZXN0KGN1cnJlbnQpKSB7XG4gICAgY29uc3Qga2V5ID0gY3VycmVudC5yZXBsYWNlKC89LiokLywgJ10nKVxuICAgIHZhciBwYXR0ZXJuID0gYCR7cHJlUGFydH0ke2tleX0ke3Bvc3RQYXJ0fWBcbiAgICB2YXIgbWF0Y2hlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocGF0dGVybilcbiAgICBpZiAoY29tcGFyZVJlc3VsdHMobWF0Y2hlcywgZWxlbWVudHMpKSB7XG4gICAgICBjdXJyZW50ID0ga2V5XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJvYnVzdG5lc3M6IHJlcGxhY2Ugc3BlY2lmaWMga2V5LXZhbHVlIHdpdGggYmFzZSB0YWcgKGhldXJpc3RpYylcbiAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAke3ByZVBhcnR9JHtrZXl9YClcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXVxuICAgICAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gcmVmZXJlbmNlLmNvbnRhaW5zKGVsZW1lbnQpKSkge1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcmVmZXJlbmNlLnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIHZhciBwYXR0ZXJuID0gYCR7cHJlUGFydH0ke2Rlc2NyaXB0aW9ufSR7cG9zdFBhcnR9YFxuICAgICAgICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgICAgICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBkZXNjcmlwdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gcm9idXN0bmVzczogZGVzY2VuZGFudCBpbnN0ZWFkIGNoaWxkIChoZXVyaXN0aWMpXG4gIGlmICgvPi8udGVzdChjdXJyZW50KSkge1xuICAgIGNvbnN0IGRlc2NlbmRhbnQgPSBjdXJyZW50LnJlcGxhY2UoLz4vLCAnJylcbiAgICB2YXIgcGF0dGVybiA9IGAke3ByZVBhcnR9JHtkZXNjZW5kYW50fSR7cG9zdFBhcnR9YFxuICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgIGN1cnJlbnQgPSBkZXNjZW5kYW50XG4gICAgfVxuICB9XG5cbiAgLy8gcm9idXN0bmVzczogJ250aC1vZi10eXBlJyBpbnN0ZWFkICdudGgtY2hpbGQnIChoZXVyaXN0aWMpXG4gIGlmICgvOm50aC1jaGlsZC8udGVzdChjdXJyZW50KSkge1xuICAgIC8vIFRPRE86IGNvbnNpZGVyIGNvbXBsZXRlIGNvdmVyYWdlIG9mICdudGgtb2YtdHlwZScgcmVwbGFjZW1lbnRcbiAgICBjb25zdCB0eXBlID0gY3VycmVudC5yZXBsYWNlKC9udGgtY2hpbGQvZywgJ250aC1vZi10eXBlJylcbiAgICB2YXIgcGF0dGVybiA9IGAke3ByZVBhcnR9JHt0eXBlfSR7cG9zdFBhcnR9YFxuICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgIGN1cnJlbnQgPSB0eXBlXG4gICAgfVxuICB9XG5cbiAgLy8gZWZmaWNpZW5jeTogY29tYmluYXRpb25zIG9mIGNsYXNzbmFtZSAocGFydGlhbCBwZXJtdXRhdGlvbnMpXG4gIGlmICgvXFwuXFxTK1xcLlxcUysvLnRlc3QoY3VycmVudCkpIHtcbiAgICB2YXIgbmFtZXMgPSBjdXJyZW50LnRyaW0oKS5zcGxpdCgnLicpLnNsaWNlKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IGAuJHtuYW1lfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChjdXJyLCBuZXh0KSA9PiBjdXJyLmxlbmd0aCAtIG5leHQubGVuZ3RoKVxuICAgIHdoaWxlIChuYW1lcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHBhcnRpYWwgPSBjdXJyZW50LnJlcGxhY2UobmFtZXMuc2hpZnQoKSwgJycpLnRyaW0oKVxuICAgICAgdmFyIHBhdHRlcm4gPSBgJHtwcmVQYXJ0fSR7cGFydGlhbH0ke3Bvc3RQYXJ0fWAudHJpbSgpXG4gICAgICBpZiAoIXBhdHRlcm4ubGVuZ3RoIHx8IHBhdHRlcm4uY2hhckF0KDApID09PSAnPicgfHwgcGF0dGVybi5jaGFyQXQocGF0dGVybi5sZW5ndGgtMSkgPT09ICc+Jykge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgdmFyIG1hdGNoZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgICBpZiAoY29tcGFyZVJlc3VsdHMobWF0Y2hlcywgZWxlbWVudHMpKSB7XG4gICAgICAgIGN1cnJlbnQgPSBwYXJ0aWFsXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcm9idXN0bmVzczogZGVncmFkZSBjb21wbGV4IGNsYXNzbmFtZSAoaGV1cmlzdGljKVxuICAgIG5hbWVzID0gY3VycmVudCAmJiBjdXJyZW50Lm1hdGNoKC9cXC4vZylcbiAgICBpZiAobmFtZXMgJiYgbmFtZXMubGVuZ3RoID4gMikge1xuICAgICAgY29uc3QgcmVmZXJlbmNlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYCR7cHJlUGFydH0ke2N1cnJlbnR9YClcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmVmZXJlbmNlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXVxuICAgICAgICBpZiAoZWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gcmVmZXJlbmNlLmNvbnRhaW5zKGVsZW1lbnQpICkpIHtcbiAgICAgICAgICAvLyBUT0RPOlxuICAgICAgICAgIC8vIC0gY2hlY2sgdXNpbmcgYXR0cmlidXRlcyArIHJlZ2FyZCBleGNsdWRlc1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gcmVmZXJlbmNlLnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIHZhciBwYXR0ZXJuID0gYCR7cHJlUGFydH0ke2Rlc2NyaXB0aW9ufSR7cG9zdFBhcnR9YFxuICAgICAgICAgIHZhciBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwYXR0ZXJuKVxuICAgICAgICAgIGlmIChjb21wYXJlUmVzdWx0cyhtYXRjaGVzLCBlbGVtZW50cykpIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBkZXNjcmlwdGlvblxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnRcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZSBtYXRjaGVzIHdpdGggZXhwZWN0ZWQgZWxlbWVudHNcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48SFRNTEVsZW1lbnQ+fSBtYXRjaGVzICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0FycmF5LjxIVE1MRWxlbWVudD59IGVsZW1lbnRzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVSZXN1bHRzIChtYXRjaGVzLCBlbGVtZW50cykge1xuICBjb25zdCB7IGxlbmd0aCB9ID0gbWF0Y2hlc1xuICByZXR1cm4gbGVuZ3RoID09PSBlbGVtZW50cy5sZW5ndGggJiYgZWxlbWVudHMuZXZlcnkoKGVsZW1lbnQpID0+IHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobWF0Y2hlc1tpXSA9PT0gZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfSlcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3NyYy9vcHRpbWl6ZS5qcyIsIi8qKlxuICogIyBBZGFwdFxuICpcbiAqIENoZWNrIGFuZCBleHRlbmQgdGhlIGVudmlyb25tZW50IGZvciB1bml2ZXJzYWwgdXNhZ2UuXG4gKi9cblxuLyoqXG4gKiBNb2RpZnkgdGhlIGNvbnRleHQgYmFzZWQgb24gdGhlIGVudmlyb25tZW50XG4gKlxuICogQHBhcmFtICB7SFRNTEVMZW1lbnR9IGVsZW1lbnQgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgb3B0aW9ucyAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGFwdCAoZWxlbWVudCwgb3B0aW9ucykge1xuXG4gIC8vIGRldGVjdCBlbnZpcm9ubWVudCBzZXR1cFxuICBpZiAoZ2xvYmFsLmRvY3VtZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0gZWxzZSB7XG4gICAgZ2xvYmFsLmRvY3VtZW50ID0gb3B0aW9ucy5jb250ZXh0IHx8ICgoKSA9PiB7XG4gICAgICB2YXIgcm9vdCA9IGVsZW1lbnRcbiAgICAgIHdoaWxlIChyb290LnBhcmVudCkge1xuICAgICAgICByb290ID0gcm9vdC5wYXJlbnRcbiAgICAgIH1cbiAgICAgIHJldHVybiByb290XG4gICAgfSkoKVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZiNTUvZG9taGFuZGxlci9ibG9iL21hc3Rlci9pbmRleC5qcyNMNzVcbiAgY29uc3QgRWxlbWVudFByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihnbG9iYWwuZG9jdW1lbnQpXG5cbiAgLy8gYWx0ZXJuYXRpdmUgZGVzY3JpcHRvciB0byBhY2Nlc3MgZWxlbWVudHMgd2l0aCBmaWx0ZXJpbmcgaW52YWxpZCBlbGVtZW50cyAoZS5nLiB0ZXh0bm9kZXMpXG4gIGlmICghT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50UHJvdG90eXBlLCAnY2hpbGRUYWdzJykpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRWxlbWVudFByb3RvdHlwZSwgJ2NoaWxkVGFncycsIHtcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBnZXQgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5maWx0ZXIoKG5vZGUpID0+IHtcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmI1NS9kb21lbGVtZW50dHlwZS9ibG9iL21hc3Rlci9pbmRleC5qcyNMMTJcbiAgICAgICAgICByZXR1cm4gbm9kZS50eXBlID09PSAndGFnJyB8fCBub2RlLnR5cGUgPT09ICdzY3JpcHQnIHx8IG5vZGUudHlwZSA9PT0gJ3N0eWxlJ1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBpZiAoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRWxlbWVudFByb3RvdHlwZSwgJ2F0dHJpYnV0ZXMnKSkge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L2F0dHJpYnV0ZXNcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTmFtZWROb2RlTWFwXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEVsZW1lbnRQcm90b3R5cGUsICdhdHRyaWJ1dGVzJywge1xuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCAoKSB7XG4gICAgICAgIGNvbnN0IHsgYXR0cmlicyB9ID0gdGhpc1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzTmFtZXMgPSBPYmplY3Qua2V5cyhhdHRyaWJzKVxuICAgICAgICBjb25zdCBOYW1lZE5vZGVNYXAgPSBhdHRyaWJ1dGVzTmFtZXMucmVkdWNlKChhdHRyaWJ1dGVzLCBhdHRyaWJ1dGVOYW1lLCBpbmRleCkgPT4ge1xuICAgICAgICAgIGF0dHJpYnV0ZXNbaW5kZXhdID0ge1xuICAgICAgICAgICAgbmFtZTogYXR0cmlidXRlTmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBhdHRyaWJzW2F0dHJpYnV0ZU5hbWVdXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gICAgICAgIH0sIHsgfSlcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE5hbWVkTm9kZU1hcCwgJ2xlbmd0aCcsIHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIHZhbHVlOiBhdHRyaWJ1dGVzTmFtZXMubGVuZ3RoXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBOYW1lZE5vZGVNYXBcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgaWYgKCFFbGVtZW50UHJvdG90eXBlLmdldEF0dHJpYnV0ZSkge1xuICAgIC8vIGh0dHBzOi8vZG9jcy53ZWJwbGF0Zm9ybS5vcmcvd2lraS9kb20vRWxlbWVudC9nZXRBdHRyaWJ1dGVcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRBdHRyaWJ1dGVcbiAgICBFbGVtZW50UHJvdG90eXBlLmdldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdHRyaWJzW25hbWVdIHx8IG51bGxcbiAgICB9XG4gIH1cblxuICBpZiAoIUVsZW1lbnRQcm90b3R5cGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHtcbiAgICAvLyBodHRwczovL2RvY3Mud2VicGxhdGZvcm0ub3JnL3dpa2kvZG9tL0RvY3VtZW50L2dldEVsZW1lbnRzQnlUYWdOYW1lXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvZ2V0RWxlbWVudHNCeVRhZ05hbWVcbiAgICBFbGVtZW50UHJvdG90eXBlLmdldEVsZW1lbnRzQnlUYWdOYW1lID0gZnVuY3Rpb24gKHRhZ05hbWUpIHtcbiAgICAgIGNvbnN0IEhUTUxDb2xsZWN0aW9uID0gW11cbiAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHModGhpcy5jaGlsZFRhZ3MsIChkZXNjZW5kYW50KSA9PiB7XG4gICAgICAgIGlmIChkZXNjZW5kYW50Lm5hbWUgPT09IHRhZ05hbWUgfHwgdGFnTmFtZSA9PT0gJyonKSB7XG4gICAgICAgICAgSFRNTENvbGxlY3Rpb24ucHVzaChkZXNjZW5kYW50KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIEhUTUxDb2xsZWN0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKCFFbGVtZW50UHJvdG90eXBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpIHtcbiAgICAvLyBodHRwczovL2RvY3Mud2VicGxhdGZvcm0ub3JnL3dpa2kvZG9tL0RvY3VtZW50L2dldEVsZW1lbnRzQnlDbGFzc05hbWVcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9nZXRFbGVtZW50c0J5Q2xhc3NOYW1lXG4gICAgRWxlbWVudFByb3RvdHlwZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgICAgY29uc3QgbmFtZXMgPSBjbGFzc05hbWUudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS5zcGxpdCgnICcpXG4gICAgICBjb25zdCBIVE1MQ29sbGVjdGlvbiA9IFtdXG4gICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKFt0aGlzXSwgKGRlc2NlbmRhbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGVzY2VuZGFudENsYXNzTmFtZSA9IGRlc2NlbmRhbnQuYXR0cmlicy5jbGFzc1xuICAgICAgICBpZiAoZGVzY2VuZGFudENsYXNzTmFtZSAmJiBuYW1lcy5ldmVyeSgobmFtZSkgPT4gZGVzY2VuZGFudENsYXNzTmFtZS5pbmRleE9mKG5hbWUpID4gLTEpKSB7XG4gICAgICAgICAgSFRNTENvbGxlY3Rpb24ucHVzaChkZXNjZW5kYW50KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgcmV0dXJuIEhUTUxDb2xsZWN0aW9uXG4gICAgfVxuICB9XG5cbiAgaWYgKCFFbGVtZW50UHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAvLyBodHRwczovL2RvY3Mud2VicGxhdGZvcm0ub3JnL3dpa2kvY3NzL3NlbGVjdG9yc19hcGkvcXVlcnlTZWxlY3RvckFsbFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FbGVtZW50L3F1ZXJ5U2VsZWN0b3JBbGxcbiAgICBFbGVtZW50UHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwgPSBmdW5jdGlvbiAoc2VsZWN0b3JzKSB7XG4gICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMucmVwbGFjZSgvKD4pKFxcUykvZywgJyQxICQyJykudHJpbSgpIC8vIGFkZCBzcGFjZSBmb3IgJz4nIHNlbGVjdG9yXG5cbiAgICAgIC8vIHVzaW5nIHJpZ2h0IHRvIGxlZnQgZXhlY3V0aW9uID0+IGh0dHBzOi8vZ2l0aHViLmNvbS9mYjU1L2Nzcy1zZWxlY3QjaG93LWRvZXMtaXQtd29ya1xuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gZ2V0SW5zdHJ1Y3Rpb25zKHNlbGVjdG9ycylcbiAgICAgIGNvbnN0IGRpc2NvdmVyID0gaW5zdHJ1Y3Rpb25zLnNoaWZ0KClcblxuICAgICAgY29uc3QgdG90YWwgPSBpbnN0cnVjdGlvbnMubGVuZ3RoXG4gICAgICByZXR1cm4gZGlzY292ZXIodGhpcykuZmlsdGVyKChub2RlKSA9PiB7XG4gICAgICAgIHZhciBzdGVwID0gMFxuICAgICAgICB3aGlsZSAoc3RlcCA8IHRvdGFsKSB7XG4gICAgICAgICAgbm9kZSA9IGluc3RydWN0aW9uc1tzdGVwXShub2RlLCB0aGlzKVxuICAgICAgICAgIGlmICghbm9kZSkgeyAvLyBoaWVyYXJjaHkgZG9lc24ndCBtYXRjaFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ZXAgKz0gMVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlmICghRWxlbWVudFByb3RvdHlwZS5jb250YWlucykge1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2NvbnRhaW5zXG4gICAgRWxlbWVudFByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICB2YXIgaW5jbHVzaXZlID0gZmFsc2VcbiAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMoW3RoaXNdLCAoZGVzY2VuZGFudCwgZG9uZSkgPT4ge1xuICAgICAgICBpZiAoZGVzY2VuZGFudCA9PT0gZWxlbWVudCkge1xuICAgICAgICAgIGluY2x1c2l2ZSA9IHRydWVcbiAgICAgICAgICBkb25lKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVybiBpbmNsdXNpdmVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIFJldHJpZXZlIHRyYW5zZm9ybWF0aW9uIHN0ZXBzXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59ICAgc2VsZWN0b3JzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7QXJyYXkuPEZ1bmN0aW9uPn0gICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBnZXRJbnN0cnVjdGlvbnMgKHNlbGVjdG9ycykge1xuICByZXR1cm4gc2VsZWN0b3JzLnNwbGl0KCcgJykucmV2ZXJzZSgpLm1hcCgoc2VsZWN0b3IsIHN0ZXApID0+IHtcbiAgICBjb25zdCBkaXNjb3ZlciA9IHN0ZXAgPT09IDBcbiAgICBjb25zdCBbdHlwZSwgcHNldWRvXSA9IHNlbGVjdG9yLnNwbGl0KCc6JylcblxuICAgIHZhciB2YWxpZGF0ZSA9IG51bGxcbiAgICB2YXIgaW5zdHJ1Y3Rpb24gPSBudWxsXG5cbiAgICBzd2l0Y2ggKHRydWUpIHtcblxuICAgICAgLy8gY2hpbGQ6ICc+J1xuICAgICAgY2FzZSAvPi8udGVzdCh0eXBlKTpcbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiBjaGVja1BhcmVudCAobm9kZSkge1xuICAgICAgICAgIHJldHVybiAodmFsaWRhdGUpID0+IHZhbGlkYXRlKG5vZGUucGFyZW50KSAmJiBub2RlLnBhcmVudFxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIC8vIGNsYXNzOiAnLidcbiAgICAgIGNhc2UgL15cXC4vLnRlc3QodHlwZSk6XG4gICAgICAgIGNvbnN0IG5hbWVzID0gdHlwZS5zdWJzdHIoMSkuc3BsaXQoJy4nKVxuICAgICAgICB2YWxpZGF0ZSA9IChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9kZUNsYXNzTmFtZSA9IG5vZGUuYXR0cmlicy5jbGFzc1xuICAgICAgICAgIHJldHVybiBub2RlQ2xhc3NOYW1lICYmIG5hbWVzLmV2ZXJ5KChuYW1lKSA9PiBub2RlQ2xhc3NOYW1lLmluZGV4T2YobmFtZSkgPiAtMSlcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbiA9IGZ1bmN0aW9uIGNoZWNrQ2xhc3MgKG5vZGUsIHJvb3QpIHtcbiAgICAgICAgICBpZiAoZGlzY292ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUobmFtZXMuam9pbignICcpKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSA/IG5vZGUodmFsaWRhdGUpIDogZ2V0QW5jZXN0b3Iobm9kZSwgcm9vdCwgdmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgLy8gYXR0cmlidXRlOiAnW2tleT1cInZhbHVlXCJdJ1xuICAgICAgY2FzZSAvXlxcWy8udGVzdCh0eXBlKTpcbiAgICAgICAgY29uc3QgW2F0dHJpYnV0ZUtleSwgYXR0cmlidXRlVmFsdWVdID0gdHlwZS5yZXBsYWNlKC9cXFt8XFxdfFwiL2csICcnKS5zcGxpdCgnPScpXG4gICAgICAgIHZhbGlkYXRlID0gKG5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCBoYXNBdHRyaWJ1dGUgPSBPYmplY3Qua2V5cyhub2RlLmF0dHJpYnMpLmluZGV4T2YoYXR0cmlidXRlS2V5KSA+IC0xXG4gICAgICAgICAgaWYgKGhhc0F0dHJpYnV0ZSkgeyAvLyByZWdhcmQgb3B0aW9uYWwgYXR0cmlidXRlVmFsdWVcbiAgICAgICAgICAgIGlmICghYXR0cmlidXRlVmFsdWUgfHwgKG5vZGUuYXR0cmlic1thdHRyaWJ1dGVLZXldID09PSBhdHRyaWJ1dGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiBjaGVja0F0dHJpYnV0ZSAobm9kZSwgcm9vdCkge1xuICAgICAgICAgIGlmIChkaXNjb3Zlcikge1xuICAgICAgICAgICAgY29uc3QgTm9kZUxpc3QgPSBbXVxuICAgICAgICAgICAgdHJhdmVyc2VEZXNjZW5kYW50cyhbbm9kZV0sIChkZXNjZW5kYW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmICh2YWxpZGF0ZShkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgIE5vZGVMaXN0LnB1c2goZGVzY2VuZGFudClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBOb2RlTGlzdFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSA/IG5vZGUodmFsaWRhdGUpIDogZ2V0QW5jZXN0b3Iobm9kZSwgcm9vdCwgdmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgLy8gaWQ6ICcjJ1xuICAgICAgY2FzZSAvXiMvLnRlc3QodHlwZSk6XG4gICAgICAgIGNvbnN0IGlkID0gdHlwZS5zdWJzdHIoMSlcbiAgICAgICAgdmFsaWRhdGUgPSAobm9kZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBub2RlLmF0dHJpYnMuaWQgPT09IGlkXG4gICAgICAgIH1cbiAgICAgICAgaW5zdHJ1Y3Rpb24gPSBmdW5jdGlvbiBjaGVja0lkIChub2RlLCByb290KSB7XG4gICAgICAgICAgaWYgKGRpc2NvdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBOb2RlTGlzdCA9IFtdXG4gICAgICAgICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKFtub2RlXSwgKGRlc2NlbmRhbnQsIGRvbmUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgTm9kZUxpc3QucHVzaChkZXNjZW5kYW50KVxuICAgICAgICAgICAgICAgIGRvbmUoKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIE5vZGVMaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodHlwZW9mIG5vZGUgPT09ICdmdW5jdGlvbicpID8gbm9kZSh2YWxpZGF0ZSkgOiBnZXRBbmNlc3Rvcihub2RlLCByb290LCB2YWxpZGF0ZSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICAvLyB1bml2ZXJzYWw6ICcqJ1xuICAgICAgY2FzZSAvXFwqLy50ZXN0KHR5cGUpOlxuICAgICAgICB2YWxpZGF0ZSA9IChub2RlKSA9PiB0cnVlXG4gICAgICAgIGluc3RydWN0aW9uID0gZnVuY3Rpb24gY2hlY2tVbml2ZXJzYWwgKG5vZGUsIHJvb3QpIHtcbiAgICAgICAgICBpZiAoZGlzY292ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IE5vZGVMaXN0ID0gW11cbiAgICAgICAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMoW25vZGVdLCAoZGVzY2VuZGFudCkgPT4gTm9kZUxpc3QucHVzaChkZXNjZW5kYW50KSlcbiAgICAgICAgICAgIHJldHVybiBOb2RlTGlzdFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKHR5cGVvZiBub2RlID09PSAnZnVuY3Rpb24nKSA/IG5vZGUodmFsaWRhdGUpIDogZ2V0QW5jZXN0b3Iobm9kZSwgcm9vdCwgdmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgLy8gdGFnOiAnLi4uJ1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFsaWRhdGUgPSAobm9kZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBub2RlLm5hbWUgPT09IHR5cGVcbiAgICAgICAgfVxuICAgICAgICBpbnN0cnVjdGlvbiA9IGZ1bmN0aW9uIGNoZWNrVGFnIChub2RlLCByb290KSB7XG4gICAgICAgICAgaWYgKGRpc2NvdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBOb2RlTGlzdCA9IFtdXG4gICAgICAgICAgICB0cmF2ZXJzZURlc2NlbmRhbnRzKFtub2RlXSwgKGRlc2NlbmRhbnQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgTm9kZUxpc3QucHVzaChkZXNjZW5kYW50KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuIE5vZGVMaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAodHlwZW9mIG5vZGUgPT09ICdmdW5jdGlvbicpID8gbm9kZSh2YWxpZGF0ZSkgOiBnZXRBbmNlc3Rvcihub2RlLCByb290LCB2YWxpZGF0ZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghcHNldWRvKSB7XG4gICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25cbiAgICB9XG5cbiAgICBjb25zdCBydWxlID0gcHNldWRvLm1hdGNoKC8tKGNoaWxkfHR5cGUpXFwoKFxcZCspXFwpJC8pXG4gICAgY29uc3Qga2luZCA9IHJ1bGVbMV1cbiAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHJ1bGVbMl0sIDEwKSAtIDFcblxuICAgIGNvbnN0IHZhbGlkYXRlUHNldWRvID0gKG5vZGUpID0+IHtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIHZhciBjb21wYXJlU2V0ID0gbm9kZS5wYXJlbnQuY2hpbGRUYWdzXG4gICAgICAgIGlmIChraW5kID09PSAndHlwZScpIHtcbiAgICAgICAgICBjb21wYXJlU2V0ID0gY29tcGFyZVNldC5maWx0ZXIodmFsaWRhdGUpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gY29tcGFyZVNldC5maW5kSW5kZXgoKGNoaWxkKSA9PiBjaGlsZCA9PT0gbm9kZSlcbiAgICAgICAgaWYgKG5vZGVJbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gZW5oYW5jZUluc3RydWN0aW9uIChub2RlKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGluc3RydWN0aW9uKG5vZGUpXG4gICAgICBpZiAoZGlzY292ZXIpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoLnJlZHVjZSgoTm9kZUxpc3QsIG1hdGNoZWROb2RlKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbGlkYXRlUHNldWRvKG1hdGNoZWROb2RlKSkge1xuICAgICAgICAgICAgTm9kZUxpc3QucHVzaChtYXRjaGVkTm9kZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIE5vZGVMaXN0XG4gICAgICAgIH0sIFtdKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbGlkYXRlUHNldWRvKG1hdGNoKSAmJiBtYXRjaFxuICAgIH1cbiAgfSlcbn1cblxuLyoqXG4gKiBXYWxraW5nIHJlY3Vyc2l2ZSB0byBpbnZva2UgY2FsbGJhY2tzXG4gKlxuICogQHBhcmFtIHtBcnJheS48SFRNTEVsZW1lbnQ+fSBub2RlcyAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gICAgICAgICAgICBoYW5kbGVyIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZURlc2NlbmRhbnRzIChub2RlcywgaGFuZGxlcikge1xuICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgdmFyIHByb2dyZXNzID0gdHJ1ZVxuICAgIGhhbmRsZXIobm9kZSwgKCkgPT4gcHJvZ3Jlc3MgPSBmYWxzZSlcbiAgICBpZiAobm9kZS5jaGlsZFRhZ3MgJiYgcHJvZ3Jlc3MpIHtcbiAgICAgIHRyYXZlcnNlRGVzY2VuZGFudHMobm9kZS5jaGlsZFRhZ3MsIGhhbmRsZXIpXG4gICAgfVxuICB9KVxufVxuXG4vKipcbiAqIEJ1YmJsZSB1cCBmcm9tIGJvdHRvbSB0byB0b3BcbiAqXG4gKiBAcGFyYW0gIHtIVE1MRUxlbWVudH0gbm9kZSAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtIVE1MRUxlbWVudH0gcm9vdCAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gICAgdmFsaWRhdGUgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtIVE1MRUxlbWVudH0gICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGdldEFuY2VzdG9yIChub2RlLCByb290LCB2YWxpZGF0ZSkge1xuICB3aGlsZSAobm9kZS5wYXJlbnQpIHtcbiAgICBub2RlID0gbm9kZS5wYXJlbnRcbiAgICBpZiAodmFsaWRhdGUobm9kZSkpIHtcbiAgICAgIHJldHVybiBub2RlXG4gICAgfVxuICAgIGlmIChub2RlID09PSByb290KSB7XG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2FkYXB0LmpzIiwiLyoqXG4gKiAjIFNlbGVjdFxuICpcbiAqIENvbnN0cnVjdCBhIHVuaXF1ZSBDU1MgcXVlcnkgc2VsZWN0b3IgdG8gYWNjZXNzIHRoZSBzZWxlY3RlZCBET00gZWxlbWVudChzKS5cbiAqIEZvciBsb25nZXZpdHkgaXQgYXBwbGllcyBkaWZmZXJlbnQgbWF0Y2hpbmcgYW5kIG9wdGltaXphdGlvbiBzdHJhdGVnaWVzLlxuICovXG5cbmltcG9ydCBhZGFwdCBmcm9tICcuL2FkYXB0J1xuaW1wb3J0IG1hdGNoIGZyb20gJy4vbWF0Y2gnXG5pbXBvcnQgb3B0aW1pemUgZnJvbSAnLi9vcHRpbWl6ZSdcbmltcG9ydCB7IGNvbnZlcnROb2RlTGlzdCB9IGZyb20gJy4vdXRpbGl0aWVzJ1xuaW1wb3J0IHsgZ2V0Q29tbW9uQW5jZXN0b3IsIGdldENvbW1vblByb3BlcnRpZXMgfSBmcm9tICcuL2NvbW1vbidcblxuLyoqXG4gKiBHZXQgYSBzZWxlY3RvciBmb3IgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICBvcHRpb25zIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaW5nbGVTZWxlY3RvciAoZWxlbWVudCwgb3B0aW9ucyA9IHt9KSB7XG5cbiAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDMpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlXG4gIH1cblxuICBpZiAoZWxlbWVudC5ub2RlVHlwZSAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnB1dCAtIG9ubHkgSFRNTEVsZW1lbnRzIG9yIHJlcHJlc2VudGF0aW9ucyBvZiB0aGVtIGFyZSBzdXBwb3J0ZWQhIChub3QgXCIke3R5cGVvZiBlbGVtZW50fVwiKWApXG4gIH1cblxuICBjb25zdCBnbG9iYWxNb2RpZmllZCA9IGFkYXB0KGVsZW1lbnQsIG9wdGlvbnMpXG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBtYXRjaChlbGVtZW50LCBvcHRpb25zKVxuICBjb25zdCBvcHRpbWl6ZWQgPSBvcHRpbWl6ZShzZWxlY3RvciwgZWxlbWVudCwgb3B0aW9ucylcblxuICAvLyBkZWJ1Z1xuICAvLyBjb25zb2xlLmxvZyhgXG4gIC8vICAgc2VsZWN0b3I6ICAke3NlbGVjdG9yfVxuICAvLyAgIG9wdGltaXplZDogJHtvcHRpbWl6ZWR9XG4gIC8vIGApXG5cbiAgaWYgKGdsb2JhbE1vZGlmaWVkKSB7XG4gICAgZGVsZXRlIGdsb2JhbC5kb2N1bWVudFxuICB9XG5cbiAgcmV0dXJuIG9wdGltaXplZFxufVxuXG4vKipcbiAqIEdldCBhIHNlbGVjdG9yIHRvIG1hdGNoIG11bHRpcGxlIGRlc2NlbmRhbnRzIGZyb20gYW4gYW5jZXN0b3JcbiAqXG4gKiBAcGFyYW0gIHtBcnJheS48SFRNTEVsZW1lbnQ+fE5vZGVMaXN0fSBlbGVtZW50cyAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNdWx0aVNlbGVjdG9yIChlbGVtZW50cywgb3B0aW9ucyA9IHt9KSB7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KGVsZW1lbnRzKSkge1xuICAgIGVsZW1lbnRzID0gY29udmVydE5vZGVMaXN0KGVsZW1lbnRzKVxuICB9XG5cbiAgaWYgKGVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IGVsZW1lbnQubm9kZVR5cGUgIT09IDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGlucHV0IC0gb25seSBhbiBBcnJheSBvZiBIVE1MRWxlbWVudHMgb3IgcmVwcmVzZW50YXRpb25zIG9mIHRoZW0gaXMgc3VwcG9ydGVkIWApXG4gIH1cblxuICBjb25zdCBnbG9iYWxNb2RpZmllZCA9IGFkYXB0KGVsZW1lbnRzWzBdLCBvcHRpb25zKVxuXG4gIGNvbnN0IGFuY2VzdG9yID0gZ2V0Q29tbW9uQW5jZXN0b3IoZWxlbWVudHMsIG9wdGlvbnMpXG4gIGNvbnN0IGFuY2VzdG9yU2VsZWN0b3IgPSBnZXRTaW5nbGVTZWxlY3RvcihhbmNlc3Rvciwgb3B0aW9ucylcblxuICAvLyBUT0RPOiBjb25zaWRlciB1c2FnZSBvZiBtdWx0aXBsZSBzZWxlY3RvcnMgKyBwYXJlbnQtY2hpbGQgcmVsYXRpb24gKyBjaGVjayBmb3IgcGFydCByZWR1bmRhbmN5XG4gIGNvbnN0IGNvbW1vblNlbGVjdG9ycyA9IGdldENvbW1vblNlbGVjdG9ycyhlbGVtZW50cylcbiAgY29uc3QgZGVzY2VuZGFudFNlbGVjdG9yID0gY29tbW9uU2VsZWN0b3JzWzBdXG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBvcHRpbWl6ZShgJHthbmNlc3RvclNlbGVjdG9yfSAke2Rlc2NlbmRhbnRTZWxlY3Rvcn1gLCBlbGVtZW50cywgb3B0aW9ucylcbiAgY29uc3Qgc2VsZWN0b3JNYXRjaGVzID0gY29udmVydE5vZGVMaXN0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKVxuXG4gIGlmICghZWxlbWVudHMuZXZlcnkoKGVsZW1lbnQpID0+IHNlbGVjdG9yTWF0Y2hlcy5zb21lKChlbnRyeSkgPT4gZW50cnkgPT09IGVsZW1lbnQpICkpIHtcbiAgICAvLyBUT0RPOiBjbHVzdGVyIG1hdGNoZXMgdG8gc3BsaXQgaW50byBzaW1pbGFyIGdyb3VwcyBmb3Igc3ViIHNlbGVjdGlvbnNcbiAgICByZXR1cm4gY29uc29sZS53YXJuKGBcbiAgICAgIFRoZSBzZWxlY3RlZCBlbGVtZW50cyBjYW5cXCd0IGJlIGVmZmljaWVudGx5IG1hcHBlZC5cbiAgICAgIEl0cyBwcm9iYWJseSBiZXN0IHRvIHVzZSBtdWx0aXBsZSBzaW5nbGUgc2VsZWN0b3JzIGluc3RlYWQhXG4gICAgYCwgZWxlbWVudHMpXG4gIH1cblxuICBpZiAoZ2xvYmFsTW9kaWZpZWQpIHtcbiAgICBkZWxldGUgZ2xvYmFsLmRvY3VtZW50XG4gIH1cblxuICByZXR1cm4gc2VsZWN0b3Jcbn1cblxuLyoqXG4gKiBHZXQgc2VsZWN0b3JzIHRvIGRlc2NyaWJlIGEgc2V0IG9mIGVsZW1lbnRzXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPEhUTUxFbGVtZW50cz59IGVsZW1lbnRzIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBnZXRDb21tb25TZWxlY3RvcnMgKGVsZW1lbnRzKSB7XG5cbiAgY29uc3QgeyBjbGFzc2VzLCBhdHRyaWJ1dGVzLCB0YWcgfSA9IGdldENvbW1vblByb3BlcnRpZXMoZWxlbWVudHMpXG5cbiAgY29uc3Qgc2VsZWN0b3JQYXRoID0gW11cblxuICBpZiAodGFnKSB7XG4gICAgc2VsZWN0b3JQYXRoLnB1c2godGFnKVxuICB9XG5cbiAgaWYgKGNsYXNzZXMpIHtcbiAgICBjb25zdCBjbGFzc1NlbGVjdG9yID0gY2xhc3Nlcy5tYXAoKG5hbWUpID0+IGAuJHtuYW1lfWApLmpvaW4oJycpXG4gICAgc2VsZWN0b3JQYXRoLnB1c2goY2xhc3NTZWxlY3RvcilcbiAgfVxuXG4gIGlmIChhdHRyaWJ1dGVzKSB7XG4gICAgY29uc3QgYXR0cmlidXRlU2VsZWN0b3IgPSBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5yZWR1Y2UoKHBhcnRzLCBuYW1lKSA9PiB7XG4gICAgICBwYXJ0cy5wdXNoKGBbJHtuYW1lfT1cIiR7YXR0cmlidXRlc1tuYW1lXX1cIl1gKVxuICAgICAgcmV0dXJuIHBhcnRzXG4gICAgfSwgW10pLmpvaW4oJycpXG4gICAgc2VsZWN0b3JQYXRoLnB1c2goYXR0cmlidXRlU2VsZWN0b3IpXG4gIH1cblxuICBpZiAoc2VsZWN0b3JQYXRoLmxlbmd0aCkge1xuICAgIC8vIFRPRE86IGNoZWNrIGZvciBwYXJlbnQtY2hpbGQgcmVsYXRpb25cbiAgfVxuXG4gIHJldHVybiBbXG4gICAgc2VsZWN0b3JQYXRoLmpvaW4oJycpXG4gIF1cbn1cblxuLyoqXG4gKiBDaG9vc2UgYWN0aW9uIGRlcGVuZGluZyBvbiB0aGUgaW5wdXQgKG11bHRpcGxlL3NpbmdsZSlcbiAqXG4gKiBOT1RFOiBleHRlbmRlZCBkZXRlY3Rpb24gaXMgdXNlZCBmb3Igc3BlY2lhbCBjYXNlcyBsaWtlIHRoZSA8c2VsZWN0PiBlbGVtZW50IHdpdGggPG9wdGlvbnM+XG4gKlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR8Tm9kZUxpc3R8QXJyYXkuPEhUTUxFbGVtZW50Pn0gaW5wdXQgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRRdWVyeVNlbGVjdG9yIChpbnB1dCwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmIChpbnB1dC5sZW5ndGggJiYgIWlucHV0Lm5hbWUpIHtcbiAgICByZXR1cm4gZ2V0TXVsdGlTZWxlY3RvcihpbnB1dCwgb3B0aW9ucylcbiAgfVxuICByZXR1cm4gZ2V0U2luZ2xlU2VsZWN0b3IoaW5wdXQsIG9wdGlvbnMpXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9zcmMvc2VsZWN0LmpzIiwiZXhwb3J0IHNlbGVjdCwgeyBnZXRTaW5nbGVTZWxlY3RvciwgZ2V0TXVsdGlTZWxlY3RvciB9IGZyb20gJy4vc2VsZWN0J1xuZXhwb3J0IG9wdGltaXplIGZyb20gJy4vb3B0aW1pemUnXG5leHBvcnQgKiBhcyBjb21tb24gZnJvbSAnLi9jb21tb24nXG5cbmV4cG9ydCBkZWZhdWx0IGZyb20gJy4vc2VsZWN0J1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL2luZGV4LmpzIiwiLyoqXG4gKiAjIE1hdGNoXG4gKlxuICogUmV0cmlldmUgc2VsZWN0b3IgZm9yIGEgbm9kZS5cbiAqL1xuXG5pbXBvcnQgeyBlc2NhcGVWYWx1ZSB9IGZyb20gJy4vdXRpbGl0aWVzJ1xuXG5jb25zdCBkZWZhdWx0SWdub3JlID0ge1xuICBhdHRyaWJ1dGUgKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ3N0eWxlJyxcbiAgICAgICdkYXRhLXJlYWN0aWQnLFxuICAgICAgJ2RhdGEtcmVhY3QtY2hlY2tzdW0nXG4gICAgXS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID4gLTFcbiAgfVxufVxuXG4vKipcbiAqIEdldCB0aGUgcGF0aCBvZiB0aGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBub2RlICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgIG9wdGlvbnMgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWF0Y2ggKG5vZGUsIG9wdGlvbnMpIHtcblxuICBjb25zdCB7XG4gICAgcm9vdCA9IGRvY3VtZW50LFxuICAgIHNraXAgPSBudWxsLFxuICAgIHByaW9yaXR5ID0gWydpZCcsICdjbGFzcycsICdocmVmJywgJ3NyYyddLFxuICAgIGlnbm9yZSA9IHt9XG4gIH0gPSBvcHRpb25zXG5cbiAgY29uc3QgcGF0aCA9IFtdXG4gIHZhciBlbGVtZW50ID0gbm9kZVxuICB2YXIgbGVuZ3RoID0gcGF0aC5sZW5ndGhcbiAgdmFyIGlnbm9yZUNsYXNzID0gZmFsc2VcblxuICBjb25zdCBza2lwQ29tcGFyZSA9IHNraXAgJiYgKEFycmF5LmlzQXJyYXkoc2tpcCkgPyBza2lwIDogW3NraXBdKS5tYXAoKGVudHJ5KSA9PiB7XG4gICAgaWYgKHR5cGVvZiBlbnRyeSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIChlbGVtZW50KSA9PiBlbGVtZW50ID09PSBlbnRyeVxuICAgIH1cbiAgICByZXR1cm4gZW50cnlcbiAgfSlcblxuICBjb25zdCBza2lwQ2hlY2tzID0gKGVsZW1lbnQpID0+IHtcbiAgICByZXR1cm4gc2tpcCAmJiBza2lwQ29tcGFyZS5zb21lKChjb21wYXJlKSA9PiBjb21wYXJlKGVsZW1lbnQpKVxuICB9XG5cbiAgT2JqZWN0LmtleXMoaWdub3JlKS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgaWYgKHR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgIGlnbm9yZUNsYXNzID0gdHJ1ZVxuICAgIH1cbiAgICB2YXIgcHJlZGljYXRlID0gaWdub3JlW3R5cGVdXG4gICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdmdW5jdGlvbicpIHJldHVyblxuICAgIGlmICh0eXBlb2YgcHJlZGljYXRlID09PSAnbnVtYmVyJykge1xuICAgICAgcHJlZGljYXRlID0gcHJlZGljYXRlLnRvU3RyaW5nKClcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcmVkaWNhdGUgPSBuZXcgUmVnRXhwKGVzY2FwZVZhbHVlKHByZWRpY2F0ZSkucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKSlcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgPT09ICdib29sZWFuJykge1xuICAgICAgcHJlZGljYXRlID0gcHJlZGljYXRlID8gLyg/OikvIDogLy5eL1xuICAgIH1cbiAgICAvLyBjaGVjayBjbGFzcy0vYXR0cmlidXRlbmFtZSBmb3IgcmVnZXhcbiAgICBpZ25vcmVbdHlwZV0gPSAobmFtZSwgdmFsdWUpID0+IHByZWRpY2F0ZS50ZXN0KHZhbHVlKVxuICB9KVxuXG4gIGlmIChpZ25vcmVDbGFzcykge1xuICAgIGNvbnN0IGlnbm9yZUF0dHJpYnV0ZSA9IGlnbm9yZS5hdHRyaWJ1dGVcbiAgICBpZ25vcmUuYXR0cmlidXRlID0gKG5hbWUsIHZhbHVlLCBkZWZhdWx0UHJlZGljYXRlKSA9PiB7XG4gICAgICByZXR1cm4gaWdub3JlLmNsYXNzKHZhbHVlKSB8fCBpZ25vcmVBdHRyaWJ1dGUgJiYgaWdub3JlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBkZWZhdWx0UHJlZGljYXRlKVxuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChlbGVtZW50ICE9PSByb290KSB7XG4gICAgaWYgKHNraXBDaGVja3MoZWxlbWVudCkgIT09IHRydWUpIHtcbiAgICAgIC8vIH4gZ2xvYmFsXG4gICAgICBpZiAoY2hlY2tBdHRyaWJ1dGVzKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUsIHBhdGgsIHJvb3QpKSBicmVha1xuICAgICAgaWYgKGNoZWNrVGFnKGVsZW1lbnQsIGlnbm9yZSwgcGF0aCwgcm9vdCkpIGJyZWFrXG5cbiAgICAgIC8vIH4gbG9jYWxcbiAgICAgIGNoZWNrQXR0cmlidXRlcyhwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlLCBwYXRoKVxuICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSBsZW5ndGgpIHtcbiAgICAgICAgY2hlY2tUYWcoZWxlbWVudCwgaWdub3JlLCBwYXRoKVxuICAgICAgfVxuXG4gICAgICAvLyBkZWZpbmUgb25seSBvbmUgcGFydCBlYWNoIGl0ZXJhdGlvblxuICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSBsZW5ndGgpIHtcbiAgICAgICAgY2hlY2tDaGlsZHMocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSwgcGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlXG4gICAgbGVuZ3RoID0gcGF0aC5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbGVtZW50ID09PSByb290KSB7XG4gICAgY29uc3QgcGF0dGVybiA9IGZpbmRQYXR0ZXJuKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUpXG4gICAgcGF0aC51bnNoaWZ0KHBhdHRlcm4pXG4gIH1cblxuICByZXR1cm4gcGF0aC5qb2luKCcgJylcbn1cblxuLyoqXG4gKiBFeHRlbmQgcGF0aCB3aXRoIGF0dHJpYnV0ZSBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHByaW9yaXR5IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIGVsZW1lbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgIGlnbm9yZSAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHBhdGggICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIHBhcmVudCAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBjaGVja0F0dHJpYnV0ZXMgKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUsIHBhdGgsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICBjb25zdCBwYXR0ZXJuID0gZmluZEF0dHJpYnV0ZXNQYXR0ZXJuKHByaW9yaXR5LCBlbGVtZW50LCBpZ25vcmUpXG4gIGlmIChwYXR0ZXJuKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IHBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHBhdHRlcm4pXG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBwYXRoLnVuc2hpZnQocGF0dGVybilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIExvb2t1cCBhdHRyaWJ1dGUgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSAge0FycmF5LjxzdHJpbmc+fSBwcmlvcml0eSAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBlbGVtZW50ICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgICBpZ25vcmUgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge3N0cmluZz99ICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gZmluZEF0dHJpYnV0ZXNQYXR0ZXJuIChwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlKSB7XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbGVtZW50LmF0dHJpYnV0ZXNcbiAgY29uc3Qgc29ydGVkS2V5cyA9IE9iamVjdC5rZXlzKGF0dHJpYnV0ZXMpLnNvcnQoKGN1cnIsIG5leHQpID0+IHtcbiAgICBjb25zdCBjdXJyUG9zID0gcHJpb3JpdHkuaW5kZXhPZihhdHRyaWJ1dGVzW2N1cnJdLm5hbWUpXG4gICAgY29uc3QgbmV4dFBvcyA9IHByaW9yaXR5LmluZGV4T2YoYXR0cmlidXRlc1tuZXh0XS5uYW1lKVxuICAgIGlmIChuZXh0UG9zID09PSAtMSkge1xuICAgICAgaWYgKGN1cnJQb3MgPT09IC0xKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJQb3MgLSBuZXh0UG9zXG4gIH0pXG5cbiAgZm9yICh2YXIgaSA9IDAsIGwgPSBzb3J0ZWRLZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHNvcnRlZEtleXNbaV1cbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2tleV1cbiAgICBjb25zdCBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLm5hbWVcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGVzY2FwZVZhbHVlKGF0dHJpYnV0ZS52YWx1ZSlcblxuICAgIGNvbnN0IGN1cnJlbnRJZ25vcmUgPSBpZ25vcmVbYXR0cmlidXRlTmFtZV0gfHwgaWdub3JlLmF0dHJpYnV0ZVxuICAgIGNvbnN0IGN1cnJlbnREZWZhdWx0SWdub3JlID0gZGVmYXVsdElnbm9yZVthdHRyaWJ1dGVOYW1lXSB8fCBkZWZhdWx0SWdub3JlLmF0dHJpYnV0ZVxuICAgIGlmIChjaGVja0lnbm9yZShjdXJyZW50SWdub3JlLCBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVWYWx1ZSwgY3VycmVudERlZmF1bHRJZ25vcmUpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIHZhciBwYXR0ZXJuID0gYFske2F0dHJpYnV0ZU5hbWV9PVwiJHthdHRyaWJ1dGVWYWx1ZX1cIl1gXG5cbiAgICBpZiAoKC9cXGJcXGQvKS50ZXN0KGF0dHJpYnV0ZVZhbHVlKSA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSAnaWQnKSB7XG4gICAgICAgIHBhdHRlcm4gPSBgIyR7YXR0cmlidXRlVmFsdWV9YFxuICAgICAgfVxuXG4gICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnLicpXG4gICAgICAgIHBhdHRlcm4gPSBgLiR7Y2xhc3NOYW1lfWBcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0dGVyblxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogRXh0ZW5kIHBhdGggd2l0aCB0YWcgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBlbGVtZW50IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgIGlnbm9yZSAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtBcnJheS48c3RyaW5nPn0gcGF0aCAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgICBwYXJlbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKi9cbmZ1bmN0aW9uIGNoZWNrVGFnIChlbGVtZW50LCBpZ25vcmUsIHBhdGgsIHBhcmVudCA9IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICBjb25zdCBwYXR0ZXJuID0gZmluZFRhZ1BhdHRlcm4oZWxlbWVudCwgaWdub3JlKVxuICBpZiAocGF0dGVybikge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUocGF0dGVybilcbiAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHBhdGgudW5zaGlmdChwYXR0ZXJuKVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogTG9va3VwIHRhZyBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtPYmplY3R9ICAgICAgaWdub3JlICAtIFtkZXNjcmlwdGlvbl1cbiAqIEByZXR1cm4ge2Jvb2xlYW59ICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBmaW5kVGFnUGF0dGVybiAoZWxlbWVudCwgaWdub3JlKSB7XG4gIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKVxuICBpZiAoY2hlY2tJZ25vcmUoaWdub3JlLnRhZywgbnVsbCwgdGFnTmFtZSkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHJldHVybiB0YWdOYW1lXG59XG5cbi8qKlxuICogRXh0ZW5kIHBhdGggd2l0aCBzcGVjaWZpYyBjaGlsZCBpZGVudGlmaWVyXG4gKlxuICogTk9URTogJ2NoaWxkVGFncycgaXMgYSBjdXN0b20gcHJvcGVydHkgdG8gdXNlIGFzIGEgdmlldyBmaWx0ZXIgZm9yIHRhZ3MgdXNpbmcgJ2FkYXB0ZXIuanMnXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHByaW9yaXR5IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIGVsZW1lbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgIGlnbm9yZSAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHBhdGggICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBjaGVja0NoaWxkcyAocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSwgcGF0aCkge1xuICBjb25zdCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGVcbiAgY29uc3QgY2hpbGRyZW4gPSBwYXJlbnQuY2hpbGRUYWdzIHx8IHBhcmVudC5jaGlsZHJlblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV1cbiAgICBpZiAoY2hpbGQgPT09IGVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNoaWxkUGF0dGVybiA9IGZpbmRQYXR0ZXJuKHByaW9yaXR5LCBjaGlsZCwgaWdub3JlKVxuICAgICAgaWYgKCFjaGlsZFBhdHRlcm4pIHtcbiAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybihgXG4gICAgICAgICAgRWxlbWVudCBjb3VsZG5cXCd0IGJlIG1hdGNoZWQgdGhyb3VnaCBzdHJpY3QgaWdub3JlIHBhdHRlcm4hXG4gICAgICAgIGAsIGNoaWxkLCBpZ25vcmUsIGNoaWxkUGF0dGVybilcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdHRlcm4gPSBgPiAke2NoaWxkUGF0dGVybn06bnRoLWNoaWxkKCR7aSsxfSlgXG4gICAgICBwYXRoLnVuc2hpZnQocGF0dGVybilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIExvb2t1cCBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtICB7QXJyYXkuPHN0cmluZz59IHByaW9yaXR5IC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9ICAgIGVsZW1lbnQgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICAgIGlnbm9yZSAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHJldHVybiB7c3RyaW5nfSAgICAgICAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICovXG5mdW5jdGlvbiBmaW5kUGF0dGVybiAocHJpb3JpdHksIGVsZW1lbnQsIGlnbm9yZSkge1xuICB2YXIgcGF0dGVybiA9IGZpbmRBdHRyaWJ1dGVzUGF0dGVybihwcmlvcml0eSwgZWxlbWVudCwgaWdub3JlKVxuICBpZiAoIXBhdHRlcm4pIHtcbiAgICBwYXR0ZXJuID0gZmluZFRhZ1BhdHRlcm4oZWxlbWVudCwgaWdub3JlKVxuICB9XG4gIHJldHVybiBwYXR0ZXJuXG59XG5cbi8qKlxuICogVmFsaWRhdGUgd2l0aCBjdXN0b20gYW5kIGRlZmF1bHQgZnVuY3Rpb25zXG4gKlxuICogQHBhcmFtICB7RnVuY3Rpb259IHByZWRpY2F0ZSAgICAgICAgLSBbZGVzY3JpcHRpb25dXG4gKiBAcGFyYW0gIHtzdHJpbmc/fSAgbmFtZSAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqIEBwYXJhbSAge3N0cmluZ30gICB2YWx1ZSAgICAgICAgICAgIC0gW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7RnVuY3Rpb259IGRlZmF1bHRQcmVkaWNhdGUgLSBbZGVzY3JpcHRpb25dXG4gKiBAcmV0dXJuIHtib29sZWFufSAgICAgICAgICAgICAgICAgICAtIFtkZXNjcmlwdGlvbl1cbiAqL1xuZnVuY3Rpb24gY2hlY2tJZ25vcmUgKHByZWRpY2F0ZSwgbmFtZSwgdmFsdWUsIGRlZmF1bHRQcmVkaWNhdGUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgY29uc3QgY2hlY2sgPSBwcmVkaWNhdGUgfHwgZGVmYXVsdFByZWRpY2F0ZVxuICBpZiAoIWNoZWNrKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIGNoZWNrKG5hbWUsIHZhbHVlLCBkZWZhdWx0UHJlZGljYXRlKVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vc3JjL21hdGNoLmpzIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/dist/optimal-select.min.js b/dist/optimal-select.min.js index 2eb406a..ea7a74a 100644 --- a/dist/optimal-select.min.js +++ b/dist/optimal-select.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.OptimalSelect=t():e.OptimalSelect=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,r){"use strict";function n(e){for(var t=e.length,r=new Array(t),n=0;n@~]/g,"\\$&").replace(/\n/g,"A")}Object.defineProperty(t,"__esModule",{value:!0}),t.convertNodeList=n,t.escapeValue=o},function(e,t,r){"use strict";function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.root,n=void 0===r?document:r,o=[];e.forEach(function(e,t){for(var r=[];e!==n;)e=e.parentNode,r.unshift(e);o[t]=r}),o.sort(function(e,t){return e.length-t.length});for(var u=o.shift(),i=null,l=function(){var e=u[a],t=o.some(function(t){return!t.some(function(t){return t===e})});return t?"break":void(i=e)},a=0,c=u.length;a2&&void 0!==arguments[2]?arguments[2]:{};if(Array.isArray(t)||(t=t.length?(0,c.convertNodeList)(t):[t]),!t.length||t.some(function(e){return 1!==e.nodeType}))throw new Error('Invalid input - to compare HTMLElements its necessary to provide a reference of the selected node(s)! (missing "elements")');var n=(0,a.default)(t[0],r),o=e.replace(/> /g,">").split(/\s+(?=(?:(?:[^"]*"){2})*[^"]*$)/);if(o.length<2)return u("",e,"",t);for(var i=[o.pop()];o.length>1;){var l=o.pop(),f=o.join(" "),s=i.join(" "),d=f+" "+s,p=document.querySelectorAll(d);p.length!==t.length&&i.unshift(u(f,l,s,t))}return i.unshift(o[0]),o=i,o[0]=u("",o[0],o.slice(1).join(" "),t),o[o.length-1]=u(o.slice(0,-1).join(" "),o[o.length-1],"",t),n&&delete!0,o.join(" ").replace(/>/g,"> ").trim()}function u(e,t,r,n){if(e.length&&(e+=" "),r.length&&(r=" "+r),/\[*\]/.test(t)){var o=t.replace(/=.*$/,"]"),u=""+e+o+r,l=document.querySelectorAll(u);if(i(l,n))t=o;else for(var a=document.querySelectorAll(""+e+o),c=function(){var o=a[f];if(n.some(function(e){return o.contains(e)})){var c=o.tagName.toLowerCase();return u=""+e+c+r,l=document.querySelectorAll(u),i(l,n)&&(t=c),"break"}},f=0,s=a.length;f/.test(t)){var p=t.replace(/>/,""),u=""+e+p+r,l=document.querySelectorAll(u);i(l,n)&&(t=p)}if(/:nth-child/.test(t)){var v=t.replace(/nth-child/g,"nth-of-type"),u=""+e+v+r,l=document.querySelectorAll(u);i(l,n)&&(t=v)}if(/\.\S+\.\S+/.test(t)){for(var y=t.trim().split(".").slice(1).map(function(e){return"."+e}).sort(function(e,t){return e.length-t.length});y.length;){var m=t.replace(y.shift(),"").trim(),u=(""+e+m+r).trim();if(!u.length||">"===u.charAt(0))break;var l=document.querySelectorAll(u);i(l,n)&&(t=m)}if(t&&t.match(/\./g).length>2)for(var g=document.querySelectorAll(""+e+t),h=function(){var o=g[f];if(n.some(function(e){return o.contains(e)})){var a=o.tagName.toLowerCase();return u=""+e+a+r,l=document.querySelectorAll(u),i(l,n)&&(t=a),"break"}},f=0,s=g.length;f1&&void 0!==arguments[1]?arguments[1]:{};if(3===e.nodeType&&(e=e.parentNode),1!==e.nodeType)throw new Error('Invalid input - only HTMLElements or representations of them are supported! (not "'+("undefined"==typeof e?"undefined":a(e))+'")');var r=(0,f.default)(e,t),n=(0,d.default)(e,t),o=(0,v.default)(n,e,t);return r&&delete!0,o}function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Array.isArray(e)||(e=(0,y.convertNodeList)(e)),e.some(function(e){return 1!==e.nodeType}))throw new Error("Invalid input - only an Array of HTMLElements or representations of them is supported!");var r=(0,f.default)(e[0],t),n=(0,m.getCommonAncestor)(e,t),u=o(n,t),l=i(e),a=l[0],c=(0,v.default)(u+" "+a,e,t),s=(0,y.convertNodeList)(document.querySelectorAll(c));return e.every(function(e){return s.some(function(t){return t===e})})?(r&&delete!0,c):console.warn("\n The selected elements can't be efficiently mapped.\n Its probably best to use multiple single selectors instead!\n ",e)}function i(e){var t=(0,m.getCommonProperties)(e),r=t.classes,n=t.attributes,o=t.tag,u=[];if(o&&u.push(o),r){var i=r.map(function(e){return"."+e}).join("");u.push(i)}if(n){var l=Object.keys(n).reduce(function(e,t){return e.push("["+t+'="'+n[t]+'"]'),e},[]).join("");u.push(l)}return u.length,[u.join("")]}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.length&&!e.name?u(e,t):o(e,t)}Object.defineProperty(t,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.getSingleSelector=o,t.getMultiSelector=u,t.default=l;var c=r(3),f=n(c),s=r(5),d=n(s),p=r(2),v=n(p),y=r(0),m=r(1)},function(e,t,r){"use strict";function n(e,t){var r=t.root,n=void 0===r?document:r,u=t.skip,l=void 0===u?null:u,f=t.priority,d=void 0===f?["id","class","href","src"]:f,p=t.ignore,v=void 0===p?{}:p,y=[],m=e,g=y.length,h=!1,b=l&&(Array.isArray(l)?l:[l]).map(function(e){return"function"!=typeof e?function(t){return t===e}:e}),S=function(e){return l&&b.some(function(t){return t(e)})};for(Object.keys(v).forEach(function(e){"class"===e&&(h=!0);var t=v[e];"function"!=typeof t&&("number"==typeof t&&(t=t.toString()),"string"==typeof t&&(t=new RegExp((0,s.escapeValue)(t).replace(/\\/g,"\\\\"))),"boolean"==typeof t&&(t=t?/(?:)/:/.^/),v[e]=function(e,r){return t.test(r)})}),h&&!function(){var e=v.attribute;v.attribute=function(t,r,n){return v.class(r)||e&&e(t,r,n)}}();m!==n;){if(S(m)!==!0){if(o(d,m,v,y,n))break;if(i(m,v,y,n))break;o(d,m,v,y),y.length===g&&i(m,v,y),y.length===g&&a(d,m,v,y)}m=m.parentNode,g=y.length}if(m===n){var j=c(d,m,v);y.unshift(j)}return y.join(" ")}function o(e,t,r,n){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:t.parentNode,i=u(e,t,r);if(i){var l=o.querySelectorAll(i);if(1===l.length)return n.unshift(i),!0}return!1}function u(e,t,r){for(var n=t.attributes,o=Object.keys(n).sort(function(t,r){var o=e.indexOf(n[t].name),u=e.indexOf(n[r].name);return u===-1?o===-1?0:-1:o-u}),u=0,i=o.length;u3&&void 0!==arguments[3]?arguments[3]:e.parentNode,o=l(e,t);if(o){var u=n.getElementsByTagName(o);if(1===u.length)return r.unshift(o),!0}return!1}function l(e,t){var r=e.tagName.toLowerCase();return f(t.tag,null,r)?null:r}function a(e,t,r,n){for(var o=t.parentNode,u=o.childTags||o.children,i=0,l=u.length;i-1}};e.exports=t.default},function(e,t,r){"use strict";function n(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.common=t.optimize=t.getMultiSelector=t.getSingleSelector=t.select=void 0;var u=r(4);Object.defineProperty(t,"getSingleSelector",{enumerable:!0,get:function(){return u.getSingleSelector}}),Object.defineProperty(t,"getMultiSelector",{enumerable:!0,get:function(){return u.getMultiSelector}});var i=o(u),l=r(2),a=o(l),c=r(1),f=n(c);t.select=i.default,t.optimize=a.default,t.common=f,t.default=i.default}])}); +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.OptimalSelect=t():e.OptimalSelect=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=5)}([function(e,t,r){"use strict";function n(e){for(var t=e.length,r=new Array(t),n=0;n@~]/g,"\\$&").replace(/\n/g,"A")}Object.defineProperty(t,"__esModule",{value:!0}),t.convertNodeList=n,t.escapeValue=o},function(e,t,r){"use strict";function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.root,n=void 0===r?document:r,o=[];e.forEach(function(e,t){for(var r=[];e!==n;)e=e.parentNode,r.unshift(e);o[t]=r}),o.sort(function(e,t){return e.length-t.length});for(var u=o.shift(),i=null,l=0,a=u.length;l2&&void 0!==arguments[2]?arguments[2]:{};if(Array.isArray(t)||(t=t.length?(0,a.convertNodeList)(t):[t]),!t.length||t.some(function(e){return 1!==e.nodeType}))throw new Error('Invalid input - to compare HTMLElements its necessary to provide a reference of the selected node(s)! (missing "elements")');var n=(0,l.default)(t[0],r),u=e.replace(/> /g,">").split(/\s+(?=(?:(?:[^"]*"){2})*[^"]*$)/);if(u.length<2)return o("",e,"",t);for(var i=[u.pop()];u.length>1;){var c=u.pop(),f=u.join(" "),s=i.join(" "),d=f+" "+s;document.querySelectorAll(d).length!==t.length&&i.unshift(o(f,c,s,t))}return i.unshift(u[0]),u=i,u[0]=o("",u[0],u.slice(1).join(" "),t),u[u.length-1]=o(u.slice(0,-1).join(" "),u[u.length-1],"",t),n&&delete!0,u.join(" ").replace(/>/g,"> ").trim()}function o(e,t,r,n){if(e.length&&(e+=" "),r.length&&(r=" "+r),/\[*\]/.test(t)){var o=t.replace(/=.*$/,"]"),i=""+e+o+r,l=document.querySelectorAll(i);if(u(l,n))t=o;else for(var a=document.querySelectorAll(""+e+o),c=0,f=a.length;c/.test(t)){var d=t.replace(/>/,""),i=""+e+d+r,l=document.querySelectorAll(i);u(l,n)&&(t=d)}if(/:nth-child/.test(t)){var p=t.replace(/nth-child/g,"nth-of-type"),i=""+e+p+r,l=document.querySelectorAll(i);u(l,n)&&(t=p)}if(/\.\S+\.\S+/.test(t)){for(var v=t.trim().split(".").slice(1).map(function(e){return"."+e}).sort(function(e,t){return e.length-t.length});v.length;){var g=t.replace(v.shift(),"").trim(),i=(""+e+g+r).trim();if(!i.length||">"===i.charAt(0)||">"===i.charAt(i.length-1))break;var l=document.querySelectorAll(i);u(l,n)&&(t=g)}if((v=t&&t.match(/\./g))&&v.length>2)for(var h=document.querySelectorAll(""+e+t),c=0,f=h.length;c1&&void 0!==arguments[1]?arguments[1]:{};if(3===e.nodeType&&(e=e.parentNode),1!==e.nodeType)throw new Error('Invalid input - only HTMLElements or representations of them are supported! (not "'+(void 0===e?"undefined":a(e))+'")');var r=(0,f.default)(e,t),n=(0,d.default)(e,t),o=(0,v.default)(n,e,t);return r&&delete!0,o}function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Array.isArray(e)||(e=(0,g.convertNodeList)(e)),e.some(function(e){return 1!==e.nodeType}))throw new Error("Invalid input - only an Array of HTMLElements or representations of them is supported!");var r=(0,f.default)(e[0],t),n=(0,h.getCommonAncestor)(e,t),u=o(n,t),l=i(e),a=l[0],c=(0,v.default)(u+" "+a,e,t),s=(0,g.convertNodeList)(document.querySelectorAll(c));return e.every(function(e){return s.some(function(t){return t===e})})?(r&&delete!0,c):console.warn("\n The selected elements can't be efficiently mapped.\n Its probably best to use multiple single selectors instead!\n ",e)}function i(e){var t=(0,h.getCommonProperties)(e),r=t.classes,n=t.attributes,o=t.tag,u=[];if(o&&u.push(o),r){var i=r.map(function(e){return"."+e}).join("");u.push(i)}if(n){var l=Object.keys(n).reduce(function(e,t){return e.push("["+t+'="'+n[t]+'"]'),e},[]).join("");u.push(l)}return u.length,[u.join("")]}function l(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.length&&!e.name?u(e,t):o(e,t)}Object.defineProperty(t,"__esModule",{value:!0});var a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.getSingleSelector=o,t.getMultiSelector=u,t.default=l;var c=r(3),f=n(c),s=r(6),d=n(s),p=r(2),v=n(p),g=r(0),h=r(1)},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=t.common=t.optimize=t.getMultiSelector=t.getSingleSelector=t.select=void 0;var o=r(4);Object.defineProperty(t,"getSingleSelector",{enumerable:!0,get:function(){return o.getSingleSelector}}),Object.defineProperty(t,"getMultiSelector",{enumerable:!0,get:function(){return o.getMultiSelector}});var u=n(o),i=r(2),l=n(i),a=r(1),c=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(a);t.select=u.default,t.optimize=l.default,t.common=c,t.default=u.default},function(e,t,r){"use strict";function n(e,t){var r=t.root,n=void 0===r?document:r,u=t.skip,l=void 0===u?null:u,f=t.priority,d=void 0===f?["id","class","href","src"]:f,p=t.ignore,v=void 0===p?{}:p,g=[],h=e,m=g.length,y=!1,b=l&&(Array.isArray(l)?l:[l]).map(function(e){return"function"!=typeof e?function(t){return t===e}:e});if(Object.keys(v).forEach(function(e){"class"===e&&(y=!0);var t=v[e];"function"!=typeof t&&("number"==typeof t&&(t=t.toString()),"string"==typeof t&&(t=new RegExp((0,s.escapeValue)(t).replace(/\\/g,"\\\\"))),"boolean"==typeof t&&(t=t?/(?:)/:/.^/),v[e]=function(e,r){return t.test(r)})}),y){var S=v.attribute;v.attribute=function(e,t,r){return v.class(t)||S&&S(e,t,r)}}for(;h!==n;){if(!0!==function(e){return l&&b.some(function(t){return t(e)})}(h)){if(o(d,h,v,g,n))break;if(i(h,v,g,n))break;o(d,h,v,g),g.length===m&&i(h,v,g),g.length===m&&a(d,h,v,g)}h=h.parentNode,m=g.length}if(h===n){var j=c(d,h,v);g.unshift(j)}return g.join(" ")}function o(e,t,r,n){var o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:t.parentNode,i=u(e,t,r);if(i){if(1===o.querySelectorAll(i).length)return n.unshift(i),!0}return!1}function u(e,t,r){for(var n=t.attributes,o=Object.keys(n).sort(function(t,r){var o=e.indexOf(n[t].name),u=e.indexOf(n[r].name);return-1===u?-1===o?0:-1:o-u}),u=0,i=o.length;u3&&void 0!==arguments[3]?arguments[3]:e.parentNode,o=l(e,t);if(o){if(1===n.getElementsByTagName(o).length)return r.unshift(o),!0}return!1}function l(e,t){var r=e.tagName.toLowerCase();return f(t.tag,null,r)?null:r}function a(e,t,r,n){for(var o=t.parentNode,u=o.childTags||o.children,i=0,l=u.length;i-1}};e.exports=t.default}])}); //# sourceMappingURL=optimal-select.min.js.map \ No newline at end of file diff --git a/dist/optimal-select.min.js.map b/dist/optimal-select.min.js.map index ab742c8..3b303b5 100644 --- a/dist/optimal-select.min.js.map +++ b/dist/optimal-select.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///optimal-select.min.js","webpack:///webpack/bootstrap 0060c4b15b8ff72e7443","webpack:///./src/utilities.js","webpack:///./src/common.js","webpack:///./src/optimize.js","webpack:///./src/adapt.js","webpack:///./src/select.js","webpack:///./src/match.js","webpack:///./src/index.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","convertNodeList","nodes","length","arr","Array","escapeValue","replace","getCommonAncestor","elements","options","arguments","undefined","_options$root","document","ancestors","forEach","element","index","parents","parentNode","unshift","sort","curr","next","shallowAncestor","shift","ancestor","_loop","parent","missing","some","otherParents","otherParent","_ret","getCommonProperties","commonProperties","classes","attributes","tag","commonClasses","commonAttributes","commonTag","getAttribute","trim","split","filter","entry","elementAttributes","keys","reduce","key","attribute","attributeName","attributesNames","commonAttributesNames","nextCommonAttributes","tagName","toLowerCase","_interopRequireDefault","obj","default","optimize","selector","isArray","_utilities","nodeType","Error","globalModified","_adapt2","path","optimizePart","shortened","pop","current","prePart","join","postPart","pattern","matches","querySelectorAll","slice","test","compareResults","references","reference","contains","description","descendant","type","names","map","partial","charAt","match","_loop2","_ret2","every","_adapt","adapt","Symbol","iterator","constructor","sliceIterator","_arr","_n","_d","_e","_s","_i","done","push","err","TypeError","getSingleSelector","_typeof","_match2","optimized","_optimize2","getMultiSelector","_common","ancestorSelector","commonSelectors","getCommonSelectors","descendantSelector","selectorMatches","console","warn","_getCommonProperties","selectorPath","classSelector","attributeSelector","parts","getQuerySelector","input","_match","_optimize","node","_options$skip","skip","_options$priority","priority","_options$ignore","ignore","ignoreClass","skipCompare","skipChecks","compare","predicate","toString","RegExp","ignoreAttribute","defaultPredicate","class","checkAttributes","checkTag","checkChilds","findPattern","findAttributesPattern","sortedKeys","currPos","indexOf","nextPos","attributeValue","currentIgnore","currentDefaultIgnore","defaultIgnore","checkIgnore","className","findTagPattern","getElementsByTagName","children","childTags","child","childPattern","check","_interopRequireWildcard","newObj","common","select","_select2","_select3","_optimize3","_common2"],"mappings":"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","file":"optimal-select.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OptimalSelect\"] = factory();\n\telse\n\t\troot[\"OptimalSelect\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OptimalSelect\"] = factory();\n\telse\n\t\troot[\"OptimalSelect\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 6);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertNodeList = convertNodeList;\nexports.escapeValue = escapeValue;\n/**\n * # Utilities\n *\n * Convenience helpers.\n */\n\n/**\n * Create an array with the DOM nodes of the list\n *\n * @param {NodeList} nodes - [description]\n * @return {Array.} - [description]\n */\nfunction convertNodeList(nodes) {\n var length = nodes.length;\n\n var arr = new Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = nodes[i];\n }\n return arr;\n}\n\n/**\n * Escape special characters and line breaks as a simplified version of 'CSS.escape()'\n *\n * Description of valid characters: https://mathiasbynens.be/notes/css-escapes\n *\n * @param {String?} value - [description]\n * @return {String} - [description]\n */\nfunction escapeValue(value) {\n return value && value.replace(/['\"`\\\\/:\\?&!#$%^()[\\]{|}*+;,.<=>@~]/g, '\\\\$&').replace(/\\n/g, '\\A');\n}\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getCommonAncestor = getCommonAncestor;\nexports.getCommonProperties = getCommonProperties;\n/**\n * # Common\n *\n * Process collections for similarities.\n */\n\n/**\n * Find the last common ancestor of elements\n *\n * @param {Array.} elements - [description]\n * @return {HTMLElement} - [description]\n */\nfunction getCommonAncestor(elements) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _options$root = options.root,\n root = _options$root === undefined ? document : _options$root;\n\n\n var ancestors = [];\n\n elements.forEach(function (element, index) {\n var parents = [];\n while (element !== root) {\n element = element.parentNode;\n parents.unshift(element);\n }\n ancestors[index] = parents;\n });\n\n ancestors.sort(function (curr, next) {\n return curr.length - next.length;\n });\n\n var shallowAncestor = ancestors.shift();\n\n var ancestor = null;\n\n var _loop = function _loop() {\n var parent = shallowAncestor[i];\n var missing = ancestors.some(function (otherParents) {\n return !otherParents.some(function (otherParent) {\n return otherParent === parent;\n });\n });\n\n if (missing) {\n // TODO: find similar sub-parents, not the top root, e.g. sharing a class selector\n return 'break';\n }\n\n ancestor = parent;\n };\n\n for (var i = 0, l = shallowAncestor.length; i < l; i++) {\n var _ret = _loop();\n\n if (_ret === 'break') break;\n }\n\n return ancestor;\n}\n\n/**\n * Get a set of common properties of elements\n *\n * @param {Array.} elements - [description]\n * @return {Object} - [description]\n */\nfunction getCommonProperties(elements) {\n\n var commonProperties = {\n classes: [],\n attributes: {},\n tag: null\n };\n\n elements.forEach(function (element) {\n var commonClasses = commonProperties.classes,\n commonAttributes = commonProperties.attributes,\n commonTag = commonProperties.tag;\n\n // ~ classes\n\n if (commonClasses !== undefined) {\n var classes = element.getAttribute('class');\n if (classes) {\n classes = classes.trim().split(' ');\n if (!commonClasses.length) {\n commonProperties.classes = classes;\n } else {\n commonClasses = commonClasses.filter(function (entry) {\n return classes.some(function (name) {\n return name === entry;\n });\n });\n if (commonClasses.length) {\n commonProperties.classes = commonClasses;\n } else {\n delete commonProperties.classes;\n }\n }\n } else {\n // TODO: restructure removal as 2x set / 2x delete, instead of modify always replacing with new collection\n delete commonProperties.classes;\n }\n }\n\n // ~ attributes\n if (commonAttributes !== undefined) {\n (function () {\n var elementAttributes = element.attributes;\n var attributes = Object.keys(elementAttributes).reduce(function (attributes, key) {\n var attribute = elementAttributes[key];\n var attributeName = attribute.name;\n // NOTE: workaround detection for non-standard phantomjs NamedNodeMap behaviour\n // (issue: https://github.com/ariya/phantomjs/issues/14634)\n if (attribute && attributeName !== 'class') {\n attributes[attributeName] = attribute.value;\n }\n return attributes;\n }, {});\n\n var attributesNames = Object.keys(attributes);\n var commonAttributesNames = Object.keys(commonAttributes);\n\n if (attributesNames.length) {\n if (!commonAttributesNames.length) {\n commonProperties.attributes = attributes;\n } else {\n commonAttributes = commonAttributesNames.reduce(function (nextCommonAttributes, name) {\n var value = commonAttributes[name];\n if (value === attributes[name]) {\n nextCommonAttributes[name] = value;\n }\n return nextCommonAttributes;\n }, {});\n if (Object.keys(commonAttributes).length) {\n commonProperties.attributes = commonAttributes;\n } else {\n delete commonProperties.attributes;\n }\n }\n } else {\n delete commonProperties.attributes;\n }\n })();\n }\n\n // ~ tag\n if (commonTag !== undefined) {\n var tag = element.tagName.toLowerCase();\n if (!commonTag) {\n commonProperties.tag = tag;\n } else if (tag !== commonTag) {\n delete commonProperties.tag;\n }\n }\n });\n\n return commonProperties;\n}\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = optimize;\n\nvar _adapt = __webpack_require__(3);\n\nvar _adapt2 = _interopRequireDefault(_adapt);\n\nvar _utilities = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Apply different optimization techniques\n *\n * @param {string} selector - [description]\n * @param {HTMLElement|Array.} element - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\n/**\n * # Optimize\n *\n * 1.) Improve efficiency through shorter selectors by removing redundancy\n * 2.) Improve robustness through selector transformation\n */\n\nfunction optimize(selector, elements) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\n // convert single entry and NodeList\n if (!Array.isArray(elements)) {\n elements = !elements.length ? [elements] : (0, _utilities.convertNodeList)(elements);\n }\n\n if (!elements.length || elements.some(function (element) {\n return element.nodeType !== 1;\n })) {\n throw new Error('Invalid input - to compare HTMLElements its necessary to provide a reference of the selected node(s)! (missing \"elements\")');\n }\n\n var globalModified = (0, _adapt2.default)(elements[0], options);\n\n // chunk parts outside of quotes (http://stackoverflow.com/a/25663729)\n var path = selector.replace(/> /g, '>').split(/\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n\n if (path.length < 2) {\n return optimizePart('', selector, '', elements);\n }\n\n var shortened = [path.pop()];\n while (path.length > 1) {\n var current = path.pop();\n var prePart = path.join(' ');\n var postPart = shortened.join(' ');\n\n var pattern = prePart + ' ' + postPart;\n var matches = document.querySelectorAll(pattern);\n if (matches.length !== elements.length) {\n shortened.unshift(optimizePart(prePart, current, postPart, elements));\n }\n }\n shortened.unshift(path[0]);\n path = shortened;\n\n // optimize start + end\n path[0] = optimizePart('', path[0], path.slice(1).join(' '), elements);\n path[path.length - 1] = optimizePart(path.slice(0, -1).join(' '), path[path.length - 1], '', elements);\n\n if (globalModified) {\n delete true;\n }\n\n return path.join(' ').replace(/>/g, '> ').trim();\n}\n\n/**\n * Improve a chunk of the selector\n *\n * @param {string} prePart - [description]\n * @param {string} current - [description]\n * @param {string} postPart - [description]\n * @param {Array.} elements - [description]\n * @return {string} - [description]\n */\nfunction optimizePart(prePart, current, postPart, elements) {\n if (prePart.length) prePart = prePart + ' ';\n if (postPart.length) postPart = ' ' + postPart;\n\n // robustness: attribute without value (generalization)\n if (/\\[*\\]/.test(current)) {\n var key = current.replace(/=.*$/, ']');\n var pattern = '' + prePart + key + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = key;\n } else {\n // robustness: replace specific key-value with base tag (heuristic)\n var references = document.querySelectorAll('' + prePart + key);\n\n var _loop = function _loop() {\n var reference = references[i];\n if (elements.some(function (element) {\n return reference.contains(element);\n })) {\n var description = reference.tagName.toLowerCase();\n pattern = '' + prePart + description + postPart;\n matches = document.querySelectorAll(pattern);\n\n if (compareResults(matches, elements)) {\n current = description;\n }\n return 'break';\n }\n };\n\n for (var i = 0, l = references.length; i < l; i++) {\n var pattern;\n var matches;\n\n var _ret = _loop();\n\n if (_ret === 'break') break;\n }\n }\n }\n\n // robustness: descendant instead child (heuristic)\n if (/>/.test(current)) {\n var descendant = current.replace(/>/, '');\n var pattern = '' + prePart + descendant + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = descendant;\n }\n }\n\n // robustness: 'nth-of-type' instead 'nth-child' (heuristic)\n if (/:nth-child/.test(current)) {\n // TODO: consider complete coverage of 'nth-of-type' replacement\n var type = current.replace(/nth-child/g, 'nth-of-type');\n var pattern = '' + prePart + type + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = type;\n }\n }\n\n // efficiency: combinations of classname (partial permutations)\n if (/\\.\\S+\\.\\S+/.test(current)) {\n var names = current.trim().split('.').slice(1).map(function (name) {\n return '.' + name;\n }).sort(function (curr, next) {\n return curr.length - next.length;\n });\n while (names.length) {\n var partial = current.replace(names.shift(), '').trim();\n var pattern = ('' + prePart + partial + postPart).trim();\n if (!pattern.length || pattern.charAt(0) === '>') {\n break;\n }\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = partial;\n }\n }\n // robustness: degrade complex classname (heuristic)\n if (current && current.match(/\\./g).length > 2) {\n var _references = document.querySelectorAll('' + prePart + current);\n\n var _loop2 = function _loop2() {\n var reference = _references[i];\n if (elements.some(function (element) {\n return reference.contains(element);\n })) {\n // TODO:\n // - check using attributes + regard excludes\n var description = reference.tagName.toLowerCase();\n pattern = '' + prePart + description + postPart;\n matches = document.querySelectorAll(pattern);\n\n if (compareResults(matches, elements)) {\n current = description;\n }\n return 'break';\n }\n };\n\n for (var i = 0, l = _references.length; i < l; i++) {\n var pattern;\n var matches;\n\n var _ret2 = _loop2();\n\n if (_ret2 === 'break') break;\n }\n }\n }\n\n return current;\n}\n\n/**\n * Evaluate matches with expected elements\n *\n * @param {Array.} matches - [description]\n * @param {Array.} elements - [description]\n * @return {Boolean} - [description]\n */\nfunction compareResults(matches, elements) {\n var length = matches.length;\n\n return length === elements.length && elements.every(function (element) {\n for (var i = 0; i < length; i++) {\n if (matches[i] === element) {\n return true;\n }\n }\n return false;\n });\n}\nmodule.exports = exports['default'];\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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; };\n\nvar _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\"); } }; }();\n\nexports.default = adapt;\n/**\n * # Adapt\n *\n * Check and extend the environment for universal usage.\n */\n\n/**\n * Modify the context based on the environment\n *\n * @param {HTMLELement} element - [description]\n * @param {Object} options - [description]\n * @return {boolean} - [description]\n */\nfunction adapt(element, options) {\n\n // detect environment setup\n if (true) {\n return false;\n } else {\n global.document = options.context || function () {\n var root = element;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n }();\n }\n\n // https://github.com/fb55/domhandler/blob/master/index.js#L75\n var ElementPrototype = Object.getPrototypeOf(true);\n\n // alternative descriptor to access elements with filtering invalid elements (e.g. textnodes)\n if (!Object.getOwnPropertyDescriptor(ElementPrototype, 'childTags')) {\n Object.defineProperty(ElementPrototype, 'childTags', {\n enumerable: true,\n get: function get() {\n return this.children.filter(function (node) {\n // https://github.com/fb55/domelementtype/blob/master/index.js#L12\n return node.type === 'tag' || node.type === 'script' || node.type === 'style';\n });\n }\n });\n }\n\n if (!Object.getOwnPropertyDescriptor(ElementPrototype, 'attributes')) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes\n // https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap\n Object.defineProperty(ElementPrototype, 'attributes', {\n enumerable: true,\n get: function get() {\n var attribs = this.attribs;\n\n var attributesNames = Object.keys(attribs);\n var NamedNodeMap = attributesNames.reduce(function (attributes, attributeName, index) {\n attributes[index] = {\n name: attributeName,\n value: attribs[attributeName]\n };\n return attributes;\n }, {});\n Object.defineProperty(NamedNodeMap, 'length', {\n enumerable: false,\n configurable: false,\n value: attributesNames.length\n });\n return NamedNodeMap;\n }\n });\n }\n\n if (!ElementPrototype.getAttribute) {\n // https://docs.webplatform.org/wiki/dom/Element/getAttribute\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute\n ElementPrototype.getAttribute = function (name) {\n return this.attribs[name] || null;\n };\n }\n\n if (!ElementPrototype.getElementsByTagName) {\n // https://docs.webplatform.org/wiki/dom/Document/getElementsByTagName\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByTagName\n ElementPrototype.getElementsByTagName = function (tagName) {\n var HTMLCollection = [];\n traverseDescendants(this.childTags, function (descendant) {\n if (descendant.name === tagName || tagName === '*') {\n HTMLCollection.push(descendant);\n }\n });\n return HTMLCollection;\n };\n }\n\n if (!ElementPrototype.getElementsByClassName) {\n // https://docs.webplatform.org/wiki/dom/Document/getElementsByClassName\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByClassName\n ElementPrototype.getElementsByClassName = function (className) {\n var names = className.trim().replace(/\\s+/g, ' ').split(' ');\n var HTMLCollection = [];\n traverseDescendants([this], function (descendant) {\n var descendantClassName = descendant.attribs.class;\n if (descendantClassName && names.every(function (name) {\n return descendantClassName.indexOf(name) > -1;\n })) {\n HTMLCollection.push(descendant);\n }\n });\n return HTMLCollection;\n };\n }\n\n if (!ElementPrototype.querySelectorAll) {\n // https://docs.webplatform.org/wiki/css/selectors_api/querySelectorAll\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll\n ElementPrototype.querySelectorAll = function (selectors) {\n var _this = this;\n\n selectors = selectors.replace(/(>)(\\S)/g, '$1 $2').trim(); // add space for '>' selector\n\n // using right to left execution => https://github.com/fb55/css-select#how-does-it-work\n var instructions = getInstructions(selectors);\n var discover = instructions.shift();\n\n var total = instructions.length;\n return discover(this).filter(function (node) {\n var step = 0;\n while (step < total) {\n node = instructions[step](node, _this);\n if (!node) {\n // hierarchy doesn't match\n return false;\n }\n step += 1;\n }\n return true;\n });\n };\n }\n\n if (!ElementPrototype.contains) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/contains\n ElementPrototype.contains = function (element) {\n var inclusive = false;\n traverseDescendants([this], function (descendant, done) {\n if (descendant === element) {\n inclusive = true;\n done();\n }\n });\n return inclusive;\n };\n }\n\n return true;\n}\n\n/**\n * Retrieve transformation steps\n *\n * @param {Array.} selectors - [description]\n * @return {Array.} - [description]\n */\nfunction getInstructions(selectors) {\n return selectors.split(' ').reverse().map(function (selector, step) {\n var discover = step === 0;\n\n var _selector$split = selector.split(':'),\n _selector$split2 = _slicedToArray(_selector$split, 2),\n type = _selector$split2[0],\n pseudo = _selector$split2[1];\n\n var validate = null;\n var instruction = null;\n\n (function () {\n switch (true) {\n\n // child: '>'\n case />/.test(type):\n instruction = function checkParent(node) {\n return function (validate) {\n return validate(node.parent) && node.parent;\n };\n };\n break;\n\n // class: '.'\n case /^\\./.test(type):\n var names = type.substr(1).split('.');\n validate = function validate(node) {\n var nodeClassName = node.attribs.class;\n return nodeClassName && names.every(function (name) {\n return nodeClassName.indexOf(name) > -1;\n });\n };\n instruction = function checkClass(node, root) {\n if (discover) {\n return node.getElementsByClassName(names.join(' '));\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // attribute: '[key=\"value\"]'\n case /^\\[/.test(type):\n var _type$replace$split = type.replace(/\\[|\\]|\"/g, '').split('='),\n _type$replace$split2 = _slicedToArray(_type$replace$split, 2),\n attributeKey = _type$replace$split2[0],\n attributeValue = _type$replace$split2[1];\n\n validate = function validate(node) {\n var hasAttribute = Object.keys(node.attribs).indexOf(attributeKey) > -1;\n if (hasAttribute) {\n // regard optional attributeValue\n if (!attributeValue || node.attribs[attributeKey] === attributeValue) {\n return true;\n }\n }\n return false;\n };\n instruction = function checkAttribute(node, root) {\n if (discover) {\n var _ret2 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n }\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret2 === 'undefined' ? 'undefined' : _typeof(_ret2)) === \"object\") return _ret2.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // id: '#'\n case /^#/.test(type):\n var id = type.substr(1);\n validate = function validate(node) {\n return node.attribs.id === id;\n };\n instruction = function checkId(node, root) {\n if (discover) {\n var _ret3 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant, done) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n done();\n }\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret3 === 'undefined' ? 'undefined' : _typeof(_ret3)) === \"object\") return _ret3.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // universal: '*'\n case /\\*/.test(type):\n validate = function validate(node) {\n return true;\n };\n instruction = function checkUniversal(node, root) {\n if (discover) {\n var _ret4 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n return NodeList.push(descendant);\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret4 === 'undefined' ? 'undefined' : _typeof(_ret4)) === \"object\") return _ret4.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // tag: '...'\n default:\n validate = function validate(node) {\n return node.name === type;\n };\n instruction = function checkTag(node, root) {\n if (discover) {\n var _ret5 = function () {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n }\n });\n return {\n v: NodeList\n };\n }();\n\n if ((typeof _ret5 === 'undefined' ? 'undefined' : _typeof(_ret5)) === \"object\") return _ret5.v;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n }\n })();\n\n if (!pseudo) {\n return instruction;\n }\n\n var rule = pseudo.match(/-(child|type)\\((\\d+)\\)$/);\n var kind = rule[1];\n var index = parseInt(rule[2], 10) - 1;\n\n var validatePseudo = function validatePseudo(node) {\n if (node) {\n var compareSet = node.parent.childTags;\n if (kind === 'type') {\n compareSet = compareSet.filter(validate);\n }\n var nodeIndex = compareSet.findIndex(function (child) {\n return child === node;\n });\n if (nodeIndex === index) {\n return true;\n }\n }\n return false;\n };\n\n return function enhanceInstruction(node) {\n var match = instruction(node);\n if (discover) {\n return match.reduce(function (NodeList, matchedNode) {\n if (validatePseudo(matchedNode)) {\n NodeList.push(matchedNode);\n }\n return NodeList;\n }, []);\n }\n return validatePseudo(match) && match;\n };\n });\n}\n\n/**\n * Walking recursive to invoke callbacks\n *\n * @param {Array.} nodes - [description]\n * @param {Function} handler - [description]\n */\nfunction traverseDescendants(nodes, handler) {\n nodes.forEach(function (node) {\n var progress = true;\n handler(node, function () {\n return progress = false;\n });\n if (node.childTags && progress) {\n traverseDescendants(node.childTags, handler);\n }\n });\n}\n\n/**\n * Bubble up from bottom to top\n *\n * @param {HTMLELement} node - [description]\n * @param {HTMLELement} root - [description]\n * @param {Function} validate - [description]\n * @return {HTMLELement} - [description]\n */\nfunction getAncestor(node, root, validate) {\n while (node.parent) {\n node = node.parent;\n if (validate(node)) {\n return node;\n }\n if (node === root) {\n break;\n }\n }\n return null;\n}\nmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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; }; /**\n * # Select\n *\n * Construct a unique CSS query selector to access the selected DOM element(s).\n * For longevity it applies different matching and optimization strategies.\n */\n\nexports.getSingleSelector = getSingleSelector;\nexports.getMultiSelector = getMultiSelector;\nexports.default = getQuerySelector;\n\nvar _adapt = __webpack_require__(3);\n\nvar _adapt2 = _interopRequireDefault(_adapt);\n\nvar _match = __webpack_require__(5);\n\nvar _match2 = _interopRequireDefault(_match);\n\nvar _optimize = __webpack_require__(2);\n\nvar _optimize2 = _interopRequireDefault(_optimize);\n\nvar _utilities = __webpack_require__(0);\n\nvar _common = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Get a selector for the provided element\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nfunction getSingleSelector(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n if (element.nodeType === 3) {\n element = element.parentNode;\n }\n\n if (element.nodeType !== 1) {\n throw new Error('Invalid input - only HTMLElements or representations of them are supported! (not \"' + (typeof element === 'undefined' ? 'undefined' : _typeof(element)) + '\")');\n }\n\n var globalModified = (0, _adapt2.default)(element, options);\n\n var selector = (0, _match2.default)(element, options);\n var optimized = (0, _optimize2.default)(selector, element, options);\n\n // debug\n // console.log(`\n // selector: ${selector}\n // optimized: ${optimized}\n // `)\n\n if (globalModified) {\n delete true;\n }\n\n return optimized;\n}\n\n/**\n * Get a selector to match multiple descendants from an ancestor\n *\n * @param {Array.|NodeList} elements - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nfunction getMultiSelector(elements) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n if (!Array.isArray(elements)) {\n elements = (0, _utilities.convertNodeList)(elements);\n }\n\n if (elements.some(function (element) {\n return element.nodeType !== 1;\n })) {\n throw new Error('Invalid input - only an Array of HTMLElements or representations of them is supported!');\n }\n\n var globalModified = (0, _adapt2.default)(elements[0], options);\n\n var ancestor = (0, _common.getCommonAncestor)(elements, options);\n var ancestorSelector = getSingleSelector(ancestor, options);\n\n // TODO: consider usage of multiple selectors + parent-child relation + check for part redundancy\n var commonSelectors = getCommonSelectors(elements);\n var descendantSelector = commonSelectors[0];\n\n var selector = (0, _optimize2.default)(ancestorSelector + ' ' + descendantSelector, elements, options);\n var selectorMatches = (0, _utilities.convertNodeList)(document.querySelectorAll(selector));\n\n if (!elements.every(function (element) {\n return selectorMatches.some(function (entry) {\n return entry === element;\n });\n })) {\n // TODO: cluster matches to split into similar groups for sub selections\n return console.warn('\\n The selected elements can\\'t be efficiently mapped.\\n Its probably best to use multiple single selectors instead!\\n ', elements);\n }\n\n if (globalModified) {\n delete true;\n }\n\n return selector;\n}\n\n/**\n * Get selectors to describe a set of elements\n *\n * @param {Array.} elements - [description]\n * @return {string} - [description]\n */\nfunction getCommonSelectors(elements) {\n var _getCommonProperties = (0, _common.getCommonProperties)(elements),\n classes = _getCommonProperties.classes,\n attributes = _getCommonProperties.attributes,\n tag = _getCommonProperties.tag;\n\n var selectorPath = [];\n\n if (tag) {\n selectorPath.push(tag);\n }\n\n if (classes) {\n var classSelector = classes.map(function (name) {\n return '.' + name;\n }).join('');\n selectorPath.push(classSelector);\n }\n\n if (attributes) {\n var attributeSelector = Object.keys(attributes).reduce(function (parts, name) {\n parts.push('[' + name + '=\"' + attributes[name] + '\"]');\n return parts;\n }, []).join('');\n selectorPath.push(attributeSelector);\n }\n\n if (selectorPath.length) {\n // TODO: check for parent-child relation\n }\n\n return [selectorPath.join('')];\n}\n\n/**\n * Choose action depending on the input (multiple/single)\n *\n * NOTE: extended detection is used for special cases like the element with \n *\n * @param {HTMLElement|NodeList|Array.} input - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nexport default function getQuerySelector (input, options = {}) {\n if (input.length && !input.name) {\n return getMultiSelector(input, options)\n }\n return getSingleSelector(input, options)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/select.js","/**\n * # Match\n *\n * Retrieve selector for a node.\n */\n\nimport { escapeValue } from './utilities'\n\nconst defaultIgnore = {\n attribute (attributeName) {\n return [\n 'style',\n 'data-reactid',\n 'data-react-checksum'\n ].indexOf(attributeName) > -1\n }\n}\n\n/**\n * Get the path of the element\n *\n * @param {HTMLElement} node - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nexport default function match (node, options) {\n\n const {\n root = document,\n skip = null,\n priority = ['id', 'class', 'href', 'src'],\n ignore = {}\n } = options\n\n const path = []\n var element = node\n var length = path.length\n var ignoreClass = false\n\n const skipCompare = skip && (Array.isArray(skip) ? skip : [skip]).map((entry) => {\n if (typeof entry !== 'function') {\n return (element) => element === entry\n }\n return entry\n })\n\n const skipChecks = (element) => {\n return skip && skipCompare.some((compare) => compare(element))\n }\n\n Object.keys(ignore).forEach((type) => {\n if (type === 'class') {\n ignoreClass = true\n }\n var predicate = ignore[type]\n if (typeof predicate === 'function') return\n if (typeof predicate === 'number') {\n predicate = predicate.toString()\n }\n if (typeof predicate === 'string') {\n predicate = new RegExp(escapeValue(predicate).replace(/\\\\/g, '\\\\\\\\'))\n }\n if (typeof predicate === 'boolean') {\n predicate = predicate ? /(?:)/ : /.^/\n }\n // check class-/attributename for regex\n ignore[type] = (name, value) => predicate.test(value)\n })\n\n if (ignoreClass) {\n const ignoreAttribute = ignore.attribute\n ignore.attribute = (name, value, defaultPredicate) => {\n return ignore.class(value) || ignoreAttribute && ignoreAttribute(name, value, defaultPredicate)\n }\n }\n\n while (element !== root) {\n if (skipChecks(element) !== true) {\n // ~ global\n if (checkAttributes(priority, element, ignore, path, root)) break\n if (checkTag(element, ignore, path, root)) break\n\n // ~ local\n checkAttributes(priority, element, ignore, path)\n if (path.length === length) {\n checkTag(element, ignore, path)\n }\n\n // define only one part each iteration\n if (path.length === length) {\n checkChilds(priority, element, ignore, path)\n }\n }\n\n element = element.parentNode\n length = path.length\n }\n\n if (element === root) {\n const pattern = findPattern(priority, element, ignore)\n path.unshift(pattern)\n }\n\n return path.join(' ')\n}\n\n/**\n * Extend path with attribute identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @param {HTMLElement} parent - [description]\n * @return {boolean} - [description]\n */\nfunction checkAttributes (priority, element, ignore, path, parent = element.parentNode) {\n const pattern = findAttributesPattern(priority, element, ignore)\n if (pattern) {\n const matches = parent.querySelectorAll(pattern)\n if (matches.length === 1) {\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup attribute identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {string?} - [description]\n */\nfunction findAttributesPattern (priority, element, ignore) {\n const attributes = element.attributes\n const sortedKeys = Object.keys(attributes).sort((curr, next) => {\n const currPos = priority.indexOf(attributes[curr].name)\n const nextPos = priority.indexOf(attributes[next].name)\n if (nextPos === -1) {\n if (currPos === -1) {\n return 0\n }\n return -1\n }\n return currPos - nextPos\n })\n\n for (var i = 0, l = sortedKeys.length; i < l; i++) {\n const key = sortedKeys[i]\n const attribute = attributes[key]\n const attributeName = attribute.name\n const attributeValue = escapeValue(attribute.value)\n\n const currentIgnore = ignore[attributeName] || ignore.attribute\n const currentDefaultIgnore = defaultIgnore[attributeName] || defaultIgnore.attribute\n if (checkIgnore(currentIgnore, attributeName, attributeValue, currentDefaultIgnore)) {\n continue\n }\n\n var pattern = `[${attributeName}=\"${attributeValue}\"]`\n\n if ((/\\b\\d/).test(attributeValue) === false) {\n if (attributeName === 'id') {\n pattern = `#${attributeValue}`\n }\n\n if (attributeName === 'class') {\n const className = attributeValue.trim().replace(/\\s+/g, '.')\n pattern = `.${className}`\n }\n }\n\n return pattern\n }\n return null\n}\n\n/**\n * Extend path with tag identifier\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @param {HTMLElement} parent - [description]\n * @return {boolean} - [description]\n */\nfunction checkTag (element, ignore, path, parent = element.parentNode) {\n const pattern = findTagPattern(element, ignore)\n if (pattern) {\n const matches = parent.getElementsByTagName(pattern)\n if (matches.length === 1) {\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup tag identifier\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {boolean} - [description]\n */\nfunction findTagPattern (element, ignore) {\n const tagName = element.tagName.toLowerCase()\n if (checkIgnore(ignore.tag, null, tagName)) {\n return null\n }\n return tagName\n}\n\n/**\n * Extend path with specific child identifier\n *\n * NOTE: 'childTags' is a custom property to use as a view filter for tags using 'adapter.js'\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @return {boolean} - [description]\n */\nfunction checkChilds (priority, element, ignore, path) {\n const parent = element.parentNode\n const children = parent.childTags || parent.children\n for (var i = 0, l = children.length; i < l; i++) {\n const child = children[i]\n if (child === element) {\n const childPattern = findPattern(priority, child, ignore)\n if (!childPattern) {\n return console.warn(`\n Element couldn\\'t be matched through strict ignore pattern!\n `, child, ignore, childPattern)\n }\n const pattern = `> ${childPattern}:nth-child(${i+1})`\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {string} - [description]\n */\nfunction findPattern (priority, element, ignore) {\n var pattern = findAttributesPattern(priority, element, ignore)\n if (!pattern) {\n pattern = findTagPattern(element, ignore)\n }\n return pattern\n}\n\n/**\n * Validate with custom and default functions\n *\n * @param {Function} predicate - [description]\n * @param {string?} name - [description]\n * @param {string} value - [description]\n * @param {Function} defaultPredicate - [description]\n * @return {boolean} - [description]\n */\nfunction checkIgnore (predicate, name, value, defaultPredicate) {\n if (!value) {\n return true\n }\n const check = predicate || defaultPredicate\n if (!check) {\n return false\n }\n return check(name, value, defaultPredicate)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/match.js","export select, { getSingleSelector, getMultiSelector } from './select'\nexport optimize from './optimize'\nexport * as common from './common'\n\nexport default from './select'\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///optimal-select.min.js","webpack:///webpack/bootstrap 3cc0e0928e329b29125e","webpack:///./src/utilities.js","webpack:///./src/common.js","webpack:///./src/optimize.js","webpack:///./src/adapt.js","webpack:///./src/select.js","webpack:///./src/index.js","webpack:///./src/match.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","convertNodeList","nodes","length","arr","Array","escapeValue","CSS","escape","replace","getCommonAncestor","elements","options","arguments","undefined","_options$root","document","ancestors","forEach","element","index","parents","parentNode","unshift","sort","curr","next","shallowAncestor","shift","ancestor","parent","some","otherParents","otherParent","getCommonProperties","commonProperties","classes","attributes","tag","commonClasses","commonAttributes","commonTag","getAttribute","trim","split","filter","entry","elementAttributes","keys","reduce","key","attribute","attributeName","attributesNames","commonAttributesNames","nextCommonAttributes","tagName","toLowerCase","optimize","selector","isArray","_utilities","nodeType","Error","globalModified","_adapt2","default","path","optimizePart","shortened","pop","current","prePart","join","postPart","pattern","querySelectorAll","slice","test","matches","compareResults","references","_ret","reference","contains","description","descendant","type","names","map","partial","charAt","match","_ret2","every","_adapt","obj","adapt","sliceIterator","_arr","_n","_d","_e","_s","_i","Symbol","iterator","done","push","err","_interopRequireDefault","getSingleSelector","_typeof","_match2","optimized","_optimize2","getMultiSelector","_common","ancestorSelector","commonSelectors","getCommonSelectors","descendantSelector","selectorMatches","console","warn","_getCommonProperties","selectorPath","classSelector","attributeSelector","parts","getQuerySelector","input","constructor","_match","_optimize","common","select","_select2","_select3","_optimize3","_common2","newObj","node","_options$skip","skip","_options$priority","priority","_options$ignore","ignore","ignoreClass","skipCompare","predicate","toString","RegExp","ignoreAttribute","defaultPredicate","class","compare","checkAttributes","checkTag","checkChilds","findPattern","findAttributesPattern","sortedKeys","currPos","indexOf","nextPos","attributeValue","checkIgnore","defaultIgnore","findTagPattern","getElementsByTagName","children","childTags","child","childPattern","check"],"mappings":"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","file":"optimal-select.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OptimalSelect\"] = factory();\n\telse\n\t\troot[\"OptimalSelect\"] = factory();\n})(this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OptimalSelect\"] = factory();\n\telse\n\t\troot[\"OptimalSelect\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 5);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.convertNodeList = convertNodeList;\nexports.escapeValue = escapeValue;\n/**\n * # Utilities\n *\n * Convenience helpers.\n */\n\n/**\n * Create an array with the DOM nodes of the list\n *\n * @param {NodeList} nodes - [description]\n * @return {Array.} - [description]\n */\nfunction convertNodeList(nodes) {\n var length = nodes.length;\n\n var arr = new Array(length);\n for (var i = 0; i < length; i++) {\n arr[i] = nodes[i];\n }\n return arr;\n}\n\n/**\n * Escape special characters and line breaks as a simplified version of 'CSS.escape()'\n *\n * Description of valid characters: https://mathiasbynens.be/notes/css-escapes\n *\n * @param {String?} value - [description]\n * @return {String} - [description]\n */\nfunction escapeValue(value) {\n\n if (CSS.escape) {\n return value && CSS.escape(value);\n }\n\n return value && value.replace(/['\"`\\\\/:\\?&!#$%^()[\\]{|}*+;,.<=>@~]/g, '\\\\$&').replace(/\\n/g, '\\A');\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getCommonAncestor = getCommonAncestor;\nexports.getCommonProperties = getCommonProperties;\n/**\n * # Common\n *\n * Process collections for similarities.\n */\n\n/**\n * Find the last common ancestor of elements\n *\n * @param {Array.} elements - [description]\n * @return {HTMLElement} - [description]\n */\nfunction getCommonAncestor(elements) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _options$root = options.root,\n root = _options$root === undefined ? document : _options$root;\n\n\n var ancestors = [];\n\n elements.forEach(function (element, index) {\n var parents = [];\n while (element !== root) {\n element = element.parentNode;\n parents.unshift(element);\n }\n ancestors[index] = parents;\n });\n\n ancestors.sort(function (curr, next) {\n return curr.length - next.length;\n });\n\n var shallowAncestor = ancestors.shift();\n\n var ancestor = null;\n\n var _loop = function _loop() {\n var parent = shallowAncestor[i];\n var missing = ancestors.some(function (otherParents) {\n return !otherParents.some(function (otherParent) {\n return otherParent === parent;\n });\n });\n\n if (missing) {\n // TODO: find similar sub-parents, not the top root, e.g. sharing a class selector\n return 'break';\n }\n\n ancestor = parent;\n };\n\n for (var i = 0, l = shallowAncestor.length; i < l; i++) {\n var _ret = _loop();\n\n if (_ret === 'break') break;\n }\n\n return ancestor;\n}\n\n/**\n * Get a set of common properties of elements\n *\n * @param {Array.} elements - [description]\n * @return {Object} - [description]\n */\nfunction getCommonProperties(elements) {\n\n var commonProperties = {\n classes: [],\n attributes: {},\n tag: null\n };\n\n elements.forEach(function (element) {\n var commonClasses = commonProperties.classes,\n commonAttributes = commonProperties.attributes,\n commonTag = commonProperties.tag;\n\n // ~ classes\n\n if (commonClasses !== undefined) {\n var classes = element.getAttribute('class');\n if (classes) {\n classes = classes.trim().split(' ');\n if (!commonClasses.length) {\n commonProperties.classes = classes;\n } else {\n commonClasses = commonClasses.filter(function (entry) {\n return classes.some(function (name) {\n return name === entry;\n });\n });\n if (commonClasses.length) {\n commonProperties.classes = commonClasses;\n } else {\n delete commonProperties.classes;\n }\n }\n } else {\n // TODO: restructure removal as 2x set / 2x delete, instead of modify always replacing with new collection\n delete commonProperties.classes;\n }\n }\n\n // ~ attributes\n if (commonAttributes !== undefined) {\n var elementAttributes = element.attributes;\n var attributes = Object.keys(elementAttributes).reduce(function (attributes, key) {\n var attribute = elementAttributes[key];\n var attributeName = attribute.name;\n // NOTE: workaround detection for non-standard phantomjs NamedNodeMap behaviour\n // (issue: https://github.com/ariya/phantomjs/issues/14634)\n if (attribute && attributeName !== 'class') {\n attributes[attributeName] = attribute.value;\n }\n return attributes;\n }, {});\n\n var attributesNames = Object.keys(attributes);\n var commonAttributesNames = Object.keys(commonAttributes);\n\n if (attributesNames.length) {\n if (!commonAttributesNames.length) {\n commonProperties.attributes = attributes;\n } else {\n commonAttributes = commonAttributesNames.reduce(function (nextCommonAttributes, name) {\n var value = commonAttributes[name];\n if (value === attributes[name]) {\n nextCommonAttributes[name] = value;\n }\n return nextCommonAttributes;\n }, {});\n if (Object.keys(commonAttributes).length) {\n commonProperties.attributes = commonAttributes;\n } else {\n delete commonProperties.attributes;\n }\n }\n } else {\n delete commonProperties.attributes;\n }\n }\n\n // ~ tag\n if (commonTag !== undefined) {\n var tag = element.tagName.toLowerCase();\n if (!commonTag) {\n commonProperties.tag = tag;\n } else if (tag !== commonTag) {\n delete commonProperties.tag;\n }\n }\n });\n\n return commonProperties;\n}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = optimize;\n\nvar _adapt = __webpack_require__(3);\n\nvar _adapt2 = _interopRequireDefault(_adapt);\n\nvar _utilities = __webpack_require__(0);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Apply different optimization techniques\n *\n * @param {string} selector - [description]\n * @param {HTMLElement|Array.} element - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\n/**\n * # Optimize\n *\n * 1.) Improve efficiency through shorter selectors by removing redundancy\n * 2.) Improve robustness through selector transformation\n */\n\nfunction optimize(selector, elements) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\n // convert single entry and NodeList\n if (!Array.isArray(elements)) {\n elements = !elements.length ? [elements] : (0, _utilities.convertNodeList)(elements);\n }\n\n if (!elements.length || elements.some(function (element) {\n return element.nodeType !== 1;\n })) {\n throw new Error('Invalid input - to compare HTMLElements its necessary to provide a reference of the selected node(s)! (missing \"elements\")');\n }\n\n var globalModified = (0, _adapt2.default)(elements[0], options);\n\n // chunk parts outside of quotes (http://stackoverflow.com/a/25663729)\n var path = selector.replace(/> /g, '>').split(/\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n\n if (path.length < 2) {\n return optimizePart('', selector, '', elements);\n }\n\n var shortened = [path.pop()];\n while (path.length > 1) {\n var current = path.pop();\n var prePart = path.join(' ');\n var postPart = shortened.join(' ');\n\n var pattern = prePart + ' ' + postPart;\n var matches = document.querySelectorAll(pattern);\n if (matches.length !== elements.length) {\n shortened.unshift(optimizePart(prePart, current, postPart, elements));\n }\n }\n shortened.unshift(path[0]);\n path = shortened;\n\n // optimize start + end\n path[0] = optimizePart('', path[0], path.slice(1).join(' '), elements);\n path[path.length - 1] = optimizePart(path.slice(0, -1).join(' '), path[path.length - 1], '', elements);\n\n if (globalModified) {\n delete true;\n }\n\n return path.join(' ').replace(/>/g, '> ').trim();\n}\n\n/**\n * Improve a chunk of the selector\n *\n * @param {string} prePart - [description]\n * @param {string} current - [description]\n * @param {string} postPart - [description]\n * @param {Array.} elements - [description]\n * @return {string} - [description]\n */\nfunction optimizePart(prePart, current, postPart, elements) {\n if (prePart.length) prePart = prePart + ' ';\n if (postPart.length) postPart = ' ' + postPart;\n\n // robustness: attribute without value (generalization)\n if (/\\[*\\]/.test(current)) {\n var key = current.replace(/=.*$/, ']');\n var pattern = '' + prePart + key + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = key;\n } else {\n // robustness: replace specific key-value with base tag (heuristic)\n var references = document.querySelectorAll('' + prePart + key);\n\n var _loop = function _loop() {\n var reference = references[i];\n if (elements.some(function (element) {\n return reference.contains(element);\n })) {\n var description = reference.tagName.toLowerCase();\n pattern = '' + prePart + description + postPart;\n matches = document.querySelectorAll(pattern);\n\n if (compareResults(matches, elements)) {\n current = description;\n }\n return 'break';\n }\n };\n\n for (var i = 0, l = references.length; i < l; i++) {\n var pattern;\n var matches;\n\n var _ret = _loop();\n\n if (_ret === 'break') break;\n }\n }\n }\n\n // robustness: descendant instead child (heuristic)\n if (/>/.test(current)) {\n var descendant = current.replace(/>/, '');\n var pattern = '' + prePart + descendant + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = descendant;\n }\n }\n\n // robustness: 'nth-of-type' instead 'nth-child' (heuristic)\n if (/:nth-child/.test(current)) {\n // TODO: consider complete coverage of 'nth-of-type' replacement\n var type = current.replace(/nth-child/g, 'nth-of-type');\n var pattern = '' + prePart + type + postPart;\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = type;\n }\n }\n\n // efficiency: combinations of classname (partial permutations)\n if (/\\.\\S+\\.\\S+/.test(current)) {\n var names = current.trim().split('.').slice(1).map(function (name) {\n return '.' + name;\n }).sort(function (curr, next) {\n return curr.length - next.length;\n });\n while (names.length) {\n var partial = current.replace(names.shift(), '').trim();\n var pattern = ('' + prePart + partial + postPart).trim();\n if (!pattern.length || pattern.charAt(0) === '>' || pattern.charAt(pattern.length - 1) === '>') {\n break;\n }\n var matches = document.querySelectorAll(pattern);\n if (compareResults(matches, elements)) {\n current = partial;\n }\n }\n\n // robustness: degrade complex classname (heuristic)\n names = current && current.match(/\\./g);\n if (names && names.length > 2) {\n var _references = document.querySelectorAll('' + prePart + current);\n\n var _loop2 = function _loop2() {\n var reference = _references[i];\n if (elements.some(function (element) {\n return reference.contains(element);\n })) {\n // TODO:\n // - check using attributes + regard excludes\n var description = reference.tagName.toLowerCase();\n pattern = '' + prePart + description + postPart;\n matches = document.querySelectorAll(pattern);\n\n if (compareResults(matches, elements)) {\n current = description;\n }\n return 'break';\n }\n };\n\n for (var i = 0, l = _references.length; i < l; i++) {\n var pattern;\n var matches;\n\n var _ret2 = _loop2();\n\n if (_ret2 === 'break') break;\n }\n }\n }\n\n return current;\n}\n\n/**\n * Evaluate matches with expected elements\n *\n * @param {Array.} matches - [description]\n * @param {Array.} elements - [description]\n * @return {Boolean} - [description]\n */\nfunction compareResults(matches, elements) {\n var length = matches.length;\n\n return length === elements.length && elements.every(function (element) {\n for (var i = 0; i < length; i++) {\n if (matches[i] === element) {\n return true;\n }\n }\n return false;\n });\n}\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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\"); } }; }();\n\nexports.default = adapt;\n/**\n * # Adapt\n *\n * Check and extend the environment for universal usage.\n */\n\n/**\n * Modify the context based on the environment\n *\n * @param {HTMLELement} element - [description]\n * @param {Object} options - [description]\n * @return {boolean} - [description]\n */\nfunction adapt(element, options) {\n\n // detect environment setup\n if (true) {\n return false;\n } else {\n global.document = options.context || function () {\n var root = element;\n while (root.parent) {\n root = root.parent;\n }\n return root;\n }();\n }\n\n // https://github.com/fb55/domhandler/blob/master/index.js#L75\n var ElementPrototype = Object.getPrototypeOf(true);\n\n // alternative descriptor to access elements with filtering invalid elements (e.g. textnodes)\n if (!Object.getOwnPropertyDescriptor(ElementPrototype, 'childTags')) {\n Object.defineProperty(ElementPrototype, 'childTags', {\n enumerable: true,\n get: function get() {\n return this.children.filter(function (node) {\n // https://github.com/fb55/domelementtype/blob/master/index.js#L12\n return node.type === 'tag' || node.type === 'script' || node.type === 'style';\n });\n }\n });\n }\n\n if (!Object.getOwnPropertyDescriptor(ElementPrototype, 'attributes')) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes\n // https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap\n Object.defineProperty(ElementPrototype, 'attributes', {\n enumerable: true,\n get: function get() {\n var attribs = this.attribs;\n\n var attributesNames = Object.keys(attribs);\n var NamedNodeMap = attributesNames.reduce(function (attributes, attributeName, index) {\n attributes[index] = {\n name: attributeName,\n value: attribs[attributeName]\n };\n return attributes;\n }, {});\n Object.defineProperty(NamedNodeMap, 'length', {\n enumerable: false,\n configurable: false,\n value: attributesNames.length\n });\n return NamedNodeMap;\n }\n });\n }\n\n if (!ElementPrototype.getAttribute) {\n // https://docs.webplatform.org/wiki/dom/Element/getAttribute\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute\n ElementPrototype.getAttribute = function (name) {\n return this.attribs[name] || null;\n };\n }\n\n if (!ElementPrototype.getElementsByTagName) {\n // https://docs.webplatform.org/wiki/dom/Document/getElementsByTagName\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByTagName\n ElementPrototype.getElementsByTagName = function (tagName) {\n var HTMLCollection = [];\n traverseDescendants(this.childTags, function (descendant) {\n if (descendant.name === tagName || tagName === '*') {\n HTMLCollection.push(descendant);\n }\n });\n return HTMLCollection;\n };\n }\n\n if (!ElementPrototype.getElementsByClassName) {\n // https://docs.webplatform.org/wiki/dom/Document/getElementsByClassName\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByClassName\n ElementPrototype.getElementsByClassName = function (className) {\n var names = className.trim().replace(/\\s+/g, ' ').split(' ');\n var HTMLCollection = [];\n traverseDescendants([this], function (descendant) {\n var descendantClassName = descendant.attribs.class;\n if (descendantClassName && names.every(function (name) {\n return descendantClassName.indexOf(name) > -1;\n })) {\n HTMLCollection.push(descendant);\n }\n });\n return HTMLCollection;\n };\n }\n\n if (!ElementPrototype.querySelectorAll) {\n // https://docs.webplatform.org/wiki/css/selectors_api/querySelectorAll\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll\n ElementPrototype.querySelectorAll = function (selectors) {\n var _this = this;\n\n selectors = selectors.replace(/(>)(\\S)/g, '$1 $2').trim(); // add space for '>' selector\n\n // using right to left execution => https://github.com/fb55/css-select#how-does-it-work\n var instructions = getInstructions(selectors);\n var discover = instructions.shift();\n\n var total = instructions.length;\n return discover(this).filter(function (node) {\n var step = 0;\n while (step < total) {\n node = instructions[step](node, _this);\n if (!node) {\n // hierarchy doesn't match\n return false;\n }\n step += 1;\n }\n return true;\n });\n };\n }\n\n if (!ElementPrototype.contains) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Node/contains\n ElementPrototype.contains = function (element) {\n var inclusive = false;\n traverseDescendants([this], function (descendant, done) {\n if (descendant === element) {\n inclusive = true;\n done();\n }\n });\n return inclusive;\n };\n }\n\n return true;\n}\n\n/**\n * Retrieve transformation steps\n *\n * @param {Array.} selectors - [description]\n * @return {Array.} - [description]\n */\nfunction getInstructions(selectors) {\n return selectors.split(' ').reverse().map(function (selector, step) {\n var discover = step === 0;\n\n var _selector$split = selector.split(':'),\n _selector$split2 = _slicedToArray(_selector$split, 2),\n type = _selector$split2[0],\n pseudo = _selector$split2[1];\n\n var validate = null;\n var instruction = null;\n\n switch (true) {\n\n // child: '>'\n case />/.test(type):\n instruction = function checkParent(node) {\n return function (validate) {\n return validate(node.parent) && node.parent;\n };\n };\n break;\n\n // class: '.'\n case /^\\./.test(type):\n var names = type.substr(1).split('.');\n validate = function validate(node) {\n var nodeClassName = node.attribs.class;\n return nodeClassName && names.every(function (name) {\n return nodeClassName.indexOf(name) > -1;\n });\n };\n instruction = function checkClass(node, root) {\n if (discover) {\n return node.getElementsByClassName(names.join(' '));\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // attribute: '[key=\"value\"]'\n case /^\\[/.test(type):\n var _type$replace$split = type.replace(/\\[|\\]|\"/g, '').split('='),\n _type$replace$split2 = _slicedToArray(_type$replace$split, 2),\n attributeKey = _type$replace$split2[0],\n attributeValue = _type$replace$split2[1];\n\n validate = function validate(node) {\n var hasAttribute = Object.keys(node.attribs).indexOf(attributeKey) > -1;\n if (hasAttribute) {\n // regard optional attributeValue\n if (!attributeValue || node.attribs[attributeKey] === attributeValue) {\n return true;\n }\n }\n return false;\n };\n instruction = function checkAttribute(node, root) {\n if (discover) {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n }\n });\n return NodeList;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // id: '#'\n case /^#/.test(type):\n var id = type.substr(1);\n validate = function validate(node) {\n return node.attribs.id === id;\n };\n instruction = function checkId(node, root) {\n if (discover) {\n var NodeList = [];\n traverseDescendants([node], function (descendant, done) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n done();\n }\n });\n return NodeList;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // universal: '*'\n case /\\*/.test(type):\n validate = function validate(node) {\n return true;\n };\n instruction = function checkUniversal(node, root) {\n if (discover) {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n return NodeList.push(descendant);\n });\n return NodeList;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n break;\n\n // tag: '...'\n default:\n validate = function validate(node) {\n return node.name === type;\n };\n instruction = function checkTag(node, root) {\n if (discover) {\n var NodeList = [];\n traverseDescendants([node], function (descendant) {\n if (validate(descendant)) {\n NodeList.push(descendant);\n }\n });\n return NodeList;\n }\n return typeof node === 'function' ? node(validate) : getAncestor(node, root, validate);\n };\n }\n\n if (!pseudo) {\n return instruction;\n }\n\n var rule = pseudo.match(/-(child|type)\\((\\d+)\\)$/);\n var kind = rule[1];\n var index = parseInt(rule[2], 10) - 1;\n\n var validatePseudo = function validatePseudo(node) {\n if (node) {\n var compareSet = node.parent.childTags;\n if (kind === 'type') {\n compareSet = compareSet.filter(validate);\n }\n var nodeIndex = compareSet.findIndex(function (child) {\n return child === node;\n });\n if (nodeIndex === index) {\n return true;\n }\n }\n return false;\n };\n\n return function enhanceInstruction(node) {\n var match = instruction(node);\n if (discover) {\n return match.reduce(function (NodeList, matchedNode) {\n if (validatePseudo(matchedNode)) {\n NodeList.push(matchedNode);\n }\n return NodeList;\n }, []);\n }\n return validatePseudo(match) && match;\n };\n });\n}\n\n/**\n * Walking recursive to invoke callbacks\n *\n * @param {Array.} nodes - [description]\n * @param {Function} handler - [description]\n */\nfunction traverseDescendants(nodes, handler) {\n nodes.forEach(function (node) {\n var progress = true;\n handler(node, function () {\n return progress = false;\n });\n if (node.childTags && progress) {\n traverseDescendants(node.childTags, handler);\n }\n });\n}\n\n/**\n * Bubble up from bottom to top\n *\n * @param {HTMLELement} node - [description]\n * @param {HTMLELement} root - [description]\n * @param {Function} validate - [description]\n * @return {HTMLELement} - [description]\n */\nfunction getAncestor(node, root, validate) {\n while (node.parent) {\n node = node.parent;\n if (validate(node)) {\n return node;\n }\n if (node === root) {\n break;\n }\n }\n return null;\n}\nmodule.exports = exports['default'];\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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; }; /**\n * # Select\n *\n * Construct a unique CSS query selector to access the selected DOM element(s).\n * For longevity it applies different matching and optimization strategies.\n */\n\nexports.getSingleSelector = getSingleSelector;\nexports.getMultiSelector = getMultiSelector;\nexports.default = getQuerySelector;\n\nvar _adapt = __webpack_require__(3);\n\nvar _adapt2 = _interopRequireDefault(_adapt);\n\nvar _match = __webpack_require__(6);\n\nvar _match2 = _interopRequireDefault(_match);\n\nvar _optimize = __webpack_require__(2);\n\nvar _optimize2 = _interopRequireDefault(_optimize);\n\nvar _utilities = __webpack_require__(0);\n\nvar _common = __webpack_require__(1);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Get a selector for the provided element\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nfunction getSingleSelector(element) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n if (element.nodeType === 3) {\n element = element.parentNode;\n }\n\n if (element.nodeType !== 1) {\n throw new Error('Invalid input - only HTMLElements or representations of them are supported! (not \"' + (typeof element === 'undefined' ? 'undefined' : _typeof(element)) + '\")');\n }\n\n var globalModified = (0, _adapt2.default)(element, options);\n\n var selector = (0, _match2.default)(element, options);\n var optimized = (0, _optimize2.default)(selector, element, options);\n\n // debug\n // console.log(`\n // selector: ${selector}\n // optimized: ${optimized}\n // `)\n\n if (globalModified) {\n delete true;\n }\n\n return optimized;\n}\n\n/**\n * Get a selector to match multiple descendants from an ancestor\n *\n * @param {Array.|NodeList} elements - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nfunction getMultiSelector(elements) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\n if (!Array.isArray(elements)) {\n elements = (0, _utilities.convertNodeList)(elements);\n }\n\n if (elements.some(function (element) {\n return element.nodeType !== 1;\n })) {\n throw new Error('Invalid input - only an Array of HTMLElements or representations of them is supported!');\n }\n\n var globalModified = (0, _adapt2.default)(elements[0], options);\n\n var ancestor = (0, _common.getCommonAncestor)(elements, options);\n var ancestorSelector = getSingleSelector(ancestor, options);\n\n // TODO: consider usage of multiple selectors + parent-child relation + check for part redundancy\n var commonSelectors = getCommonSelectors(elements);\n var descendantSelector = commonSelectors[0];\n\n var selector = (0, _optimize2.default)(ancestorSelector + ' ' + descendantSelector, elements, options);\n var selectorMatches = (0, _utilities.convertNodeList)(document.querySelectorAll(selector));\n\n if (!elements.every(function (element) {\n return selectorMatches.some(function (entry) {\n return entry === element;\n });\n })) {\n // TODO: cluster matches to split into similar groups for sub selections\n return console.warn('\\n The selected elements can\\'t be efficiently mapped.\\n Its probably best to use multiple single selectors instead!\\n ', elements);\n }\n\n if (globalModified) {\n delete true;\n }\n\n return selector;\n}\n\n/**\n * Get selectors to describe a set of elements\n *\n * @param {Array.} elements - [description]\n * @return {string} - [description]\n */\nfunction getCommonSelectors(elements) {\n var _getCommonProperties = (0, _common.getCommonProperties)(elements),\n classes = _getCommonProperties.classes,\n attributes = _getCommonProperties.attributes,\n tag = _getCommonProperties.tag;\n\n var selectorPath = [];\n\n if (tag) {\n selectorPath.push(tag);\n }\n\n if (classes) {\n var classSelector = classes.map(function (name) {\n return '.' + name;\n }).join('');\n selectorPath.push(classSelector);\n }\n\n if (attributes) {\n var attributeSelector = Object.keys(attributes).reduce(function (parts, name) {\n parts.push('[' + name + '=\"' + attributes[name] + '\"]');\n return parts;\n }, []).join('');\n selectorPath.push(attributeSelector);\n }\n\n if (selectorPath.length) {\n // TODO: check for parent-child relation\n }\n\n return [selectorPath.join('')];\n}\n\n/**\n * Choose action depending on the input (multiple/single)\n *\n * NOTE: extended detection is used for special cases like the element with \n *\n * @param {HTMLElement|NodeList|Array.} input - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nexport default function getQuerySelector (input, options = {}) {\n if (input.length && !input.name) {\n return getMultiSelector(input, options)\n }\n return getSingleSelector(input, options)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/select.js","export select, { getSingleSelector, getMultiSelector } from './select'\nexport optimize from './optimize'\nexport * as common from './common'\n\nexport default from './select'\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","/**\n * # Match\n *\n * Retrieve selector for a node.\n */\n\nimport { escapeValue } from './utilities'\n\nconst defaultIgnore = {\n attribute (attributeName) {\n return [\n 'style',\n 'data-reactid',\n 'data-react-checksum'\n ].indexOf(attributeName) > -1\n }\n}\n\n/**\n * Get the path of the element\n *\n * @param {HTMLElement} node - [description]\n * @param {Object} options - [description]\n * @return {string} - [description]\n */\nexport default function match (node, options) {\n\n const {\n root = document,\n skip = null,\n priority = ['id', 'class', 'href', 'src'],\n ignore = {}\n } = options\n\n const path = []\n var element = node\n var length = path.length\n var ignoreClass = false\n\n const skipCompare = skip && (Array.isArray(skip) ? skip : [skip]).map((entry) => {\n if (typeof entry !== 'function') {\n return (element) => element === entry\n }\n return entry\n })\n\n const skipChecks = (element) => {\n return skip && skipCompare.some((compare) => compare(element))\n }\n\n Object.keys(ignore).forEach((type) => {\n if (type === 'class') {\n ignoreClass = true\n }\n var predicate = ignore[type]\n if (typeof predicate === 'function') return\n if (typeof predicate === 'number') {\n predicate = predicate.toString()\n }\n if (typeof predicate === 'string') {\n predicate = new RegExp(escapeValue(predicate).replace(/\\\\/g, '\\\\\\\\'))\n }\n if (typeof predicate === 'boolean') {\n predicate = predicate ? /(?:)/ : /.^/\n }\n // check class-/attributename for regex\n ignore[type] = (name, value) => predicate.test(value)\n })\n\n if (ignoreClass) {\n const ignoreAttribute = ignore.attribute\n ignore.attribute = (name, value, defaultPredicate) => {\n return ignore.class(value) || ignoreAttribute && ignoreAttribute(name, value, defaultPredicate)\n }\n }\n\n while (element !== root) {\n if (skipChecks(element) !== true) {\n // ~ global\n if (checkAttributes(priority, element, ignore, path, root)) break\n if (checkTag(element, ignore, path, root)) break\n\n // ~ local\n checkAttributes(priority, element, ignore, path)\n if (path.length === length) {\n checkTag(element, ignore, path)\n }\n\n // define only one part each iteration\n if (path.length === length) {\n checkChilds(priority, element, ignore, path)\n }\n }\n\n element = element.parentNode\n length = path.length\n }\n\n if (element === root) {\n const pattern = findPattern(priority, element, ignore)\n path.unshift(pattern)\n }\n\n return path.join(' ')\n}\n\n/**\n * Extend path with attribute identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @param {HTMLElement} parent - [description]\n * @return {boolean} - [description]\n */\nfunction checkAttributes (priority, element, ignore, path, parent = element.parentNode) {\n const pattern = findAttributesPattern(priority, element, ignore)\n if (pattern) {\n const matches = parent.querySelectorAll(pattern)\n if (matches.length === 1) {\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup attribute identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {string?} - [description]\n */\nfunction findAttributesPattern (priority, element, ignore) {\n const attributes = element.attributes\n const sortedKeys = Object.keys(attributes).sort((curr, next) => {\n const currPos = priority.indexOf(attributes[curr].name)\n const nextPos = priority.indexOf(attributes[next].name)\n if (nextPos === -1) {\n if (currPos === -1) {\n return 0\n }\n return -1\n }\n return currPos - nextPos\n })\n\n for (var i = 0, l = sortedKeys.length; i < l; i++) {\n const key = sortedKeys[i]\n const attribute = attributes[key]\n const attributeName = attribute.name\n const attributeValue = escapeValue(attribute.value)\n\n const currentIgnore = ignore[attributeName] || ignore.attribute\n const currentDefaultIgnore = defaultIgnore[attributeName] || defaultIgnore.attribute\n if (checkIgnore(currentIgnore, attributeName, attributeValue, currentDefaultIgnore)) {\n continue\n }\n\n var pattern = `[${attributeName}=\"${attributeValue}\"]`\n\n if ((/\\b\\d/).test(attributeValue) === false) {\n if (attributeName === 'id') {\n pattern = `#${attributeValue}`\n }\n\n if (attributeName === 'class') {\n const className = attributeValue.trim().replace(/\\s+/g, '.')\n pattern = `.${className}`\n }\n }\n\n return pattern\n }\n return null\n}\n\n/**\n * Extend path with tag identifier\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @param {HTMLElement} parent - [description]\n * @return {boolean} - [description]\n */\nfunction checkTag (element, ignore, path, parent = element.parentNode) {\n const pattern = findTagPattern(element, ignore)\n if (pattern) {\n const matches = parent.getElementsByTagName(pattern)\n if (matches.length === 1) {\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup tag identifier\n *\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {boolean} - [description]\n */\nfunction findTagPattern (element, ignore) {\n const tagName = element.tagName.toLowerCase()\n if (checkIgnore(ignore.tag, null, tagName)) {\n return null\n }\n return tagName\n}\n\n/**\n * Extend path with specific child identifier\n *\n * NOTE: 'childTags' is a custom property to use as a view filter for tags using 'adapter.js'\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @param {Array.} path - [description]\n * @return {boolean} - [description]\n */\nfunction checkChilds (priority, element, ignore, path) {\n const parent = element.parentNode\n const children = parent.childTags || parent.children\n for (var i = 0, l = children.length; i < l; i++) {\n const child = children[i]\n if (child === element) {\n const childPattern = findPattern(priority, child, ignore)\n if (!childPattern) {\n return console.warn(`\n Element couldn\\'t be matched through strict ignore pattern!\n `, child, ignore, childPattern)\n }\n const pattern = `> ${childPattern}:nth-child(${i+1})`\n path.unshift(pattern)\n return true\n }\n }\n return false\n}\n\n/**\n * Lookup identifier\n *\n * @param {Array.} priority - [description]\n * @param {HTMLElement} element - [description]\n * @param {Object} ignore - [description]\n * @return {string} - [description]\n */\nfunction findPattern (priority, element, ignore) {\n var pattern = findAttributesPattern(priority, element, ignore)\n if (!pattern) {\n pattern = findTagPattern(element, ignore)\n }\n return pattern\n}\n\n/**\n * Validate with custom and default functions\n *\n * @param {Function} predicate - [description]\n * @param {string?} name - [description]\n * @param {string} value - [description]\n * @param {Function} defaultPredicate - [description]\n * @return {boolean} - [description]\n */\nfunction checkIgnore (predicate, name, value, defaultPredicate) {\n if (!value) {\n return true\n }\n const check = predicate || defaultPredicate\n if (!check) {\n return false\n }\n return check(name, value, defaultPredicate)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/match.js"],"sourceRoot":""} \ No newline at end of file diff --git a/src/utilities.js b/src/utilities.js index da1837e..b216a3d 100644 --- a/src/utilities.js +++ b/src/utilities.js @@ -10,7 +10,7 @@ * @param {NodeList} nodes - [description] * @return {Array.} - [description] */ -export function convertNodeList (nodes) { +export function convertNodeList(nodes) { const { length } = nodes const arr = new Array(length) for (var i = 0; i < length; i++) { @@ -27,7 +27,12 @@ export function convertNodeList (nodes) { * @param {String?} value - [description] * @return {String} - [description] */ -export function escapeValue (value) { +export function escapeValue(value) { + + if (CSS.escape) { + return value && CSS.escape(value); + } + return value && value.replace(/['"`\\/:\?&!#$%^()[\]{|}*+;,.<=>@~]/g, '\\$&') - .replace(/\n/g, '\A') + .replace(/\n/g, '\A') }