adui
Version:
<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>
328 lines • 57.2 kB
JavaScript
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
var _excluded = ["autoComplete", "autoFocus", "className", "cleaveOptions", "contentJustify", "countHanzi", "defaultValue", "disabled", "id", "intent", "leftElement", "limit", "name", "onBlur", "onChange", "onFocus", "onKeyDown", "onPressEnter", "placeholder", "required", "rightElement", "size", "style", "theme", "type", "value"];
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
import React, { forwardRef, useContext, useImperativeHandle, useEffect, useRef, useState } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import Cleave from "cleave.js/react";
import warning from "../_util/warning";
import { ConfigContext, getComputedSize } from "../config-provider";
import Textarea from "./Textarea";
import "./style";
var prefix = "adui-channels-input";
var Input = forwardRef(function (_ref, ref) {
var _cleaveRef$current;
var autoComplete = _ref.autoComplete,
autoFocus = _ref.autoFocus,
className = _ref.className,
cleaveOptions = _ref.cleaveOptions,
contentJustify = _ref.contentJustify,
countHanzi = _ref.countHanzi,
defaultValue = _ref.defaultValue,
disabled = _ref.disabled,
id = _ref.id,
intent = _ref.intent,
leftElement = _ref.leftElement,
limit = _ref.limit,
name = _ref.name,
onBlur = _ref.onBlur,
onChange = _ref.onChange,
onFocus = _ref.onFocus,
onKeyDown = _ref.onKeyDown,
onPressEnter = _ref.onPressEnter,
placeholder = _ref.placeholder,
required = _ref.required,
rightElement = _ref.rightElement,
sizeProp = _ref.size,
style = _ref.style,
theme = _ref.theme,
type = _ref.type,
value = _ref.value,
otherProps = _objectWithoutProperties(_ref, _excluded);
var _useState = useState(null),
_useState2 = _slicedToArray(_useState, 2),
leftElementWidth = _useState2[0],
setLeftElementWidth = _useState2[1];
var _useState3 = useState(null),
_useState4 = _slicedToArray(_useState3, 2),
rightElementWidth = _useState4[0],
setRightElementWidth = _useState4[1];
var inputRef = useRef(null);
var wrapperElementRef = useRef(null);
var leftElementRef = useRef(null);
var rightElementRef = useRef(null);
var justifyElementRef = useRef(null);
var cleaveRef = useRef(null);
var inputElement = (inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) || (cleaveRef === null || cleaveRef === void 0 || (_cleaveRef$current = cleaveRef.current) === null || _cleaveRef$current === void 0 ? void 0 : _cleaveRef$current.element);
var _useContext = useContext(ConfigContext),
sizeContext = _useContext.size;
var size = getComputedSize(sizeProp, sizeContext);
var handleChange = function handleChange(e) {
if (!disabled && onChange) {
var val = e.target.value.replace(/\u0008|\u0009|\u000A|\u000B|\u000C|\u000D|\u00A0|\u2028|\u2029|\uFEFF/g, "");
onChange(e, val);
}
};
var handleKeyDown = function handleKeyDown(e) {
if (e.key === "Enter" && onPressEnter) {
onPressEnter(e);
}
if (onKeyDown) {
onKeyDown(e);
}
};
var handleBlur = function handleBlur(e) {
if (onBlur) {
onBlur(e);
}
};
var handleFocus = function handleFocus(e) {
if (onFocus) {
onFocus(e);
}
};
var handleAttachedElementClick = function handleAttachedElementClick(position) {
if (position === "left" && leftElement && leftElement.type && leftElement.type.name === "Icon") {
inputElement.focus();
inputElement.select();
}
if (position === "right" && rightElement && rightElement.type && rightElement.type.name === "Icon") {
inputElement.focus();
inputElement.select();
}
};
var fixControlledValue = function fixControlledValue(val) {
if (typeof val === "undefined" || val === null) {
return "";
}
return val;
};
var updateElementsWidth = function updateElementsWidth() {
if (leftElementRef !== null && leftElementRef !== void 0 && leftElementRef.current) {
var clientWidth = leftElementRef.current.clientWidth;
if (Math.abs(clientWidth - (leftElementWidth || 0)) > 2) {
setLeftElementWidth(clientWidth);
}
} else if (leftElementWidth) {
setLeftElementWidth(null);
}
if (rightElementRef !== null && rightElementRef !== void 0 && rightElementRef.current) {
var _clientWidth = rightElementRef.current.clientWidth;
if (Math.abs(_clientWidth - (rightElementWidth || 0)) > 2) {
setRightElementWidth(_clientWidth);
}
} else if (rightElementWidth) {
setRightElementWidth(null);
}
if (justifyElementRef !== null && justifyElementRef !== void 0 && justifyElementRef.current) {
var scrollWidth = justifyElementRef.current.scrollWidth;
if (wrapperElementRef.current && Math.ceil(scrollWidth) !== wrapperElementRef.current.clientWidth) {
wrapperElementRef.current.style.width = "".concat(Math.ceil(scrollWidth), "px");
}
}
};
var getFormatStrLeng = function getFormatStrLeng(str) {
var len = str.length;
var realLength = 0;
var charCode = -1;
for (var i = 0; i < len; i += 1) {
charCode = str.charCodeAt(i);
if (charCode >= 0 && charCode <= 128) {
realLength += 0.5;
} else {
realLength += 1;
}
}
return Math.ceil(realLength);
};
useEffect(function () {
updateElementsWidth();
if (cleaveRef !== null && cleaveRef !== void 0 && cleaveRef.current) {
var el = cleaveRef.current.element;
if (cleaveRef.current.lastInputValue !== value) {
cleaveRef.current.lastInputValue = value;
}
if (cleaveRef.current.state.value !== value) {
cleaveRef.current.state.value = value;
}
if (cleaveRef.current.properties.result !== value) {
cleaveRef.current.properties.result = value;
}
if (el && el.value !== value && value) {
el.value = value;
}
}
});
useImperativeHandle(ref, function () {
var _cleaveRef$current2;
var realRef = (inputRef === null || inputRef === void 0 ? void 0 : inputRef.current) || (cleaveRef === null || cleaveRef === void 0 || (_cleaveRef$current2 = cleaveRef.current) === null || _cleaveRef$current2 === void 0 ? void 0 : _cleaveRef$current2.element);
return {
cleave: cleaveRef === null || cleaveRef === void 0 ? void 0 : cleaveRef.current,
input: realRef,
leftElement: leftElementRef === null || leftElementRef === void 0 ? void 0 : leftElementRef.current,
rightElement: rightElementRef === null || rightElementRef === void 0 ? void 0 : rightElementRef.current,
updateElementsWidth: updateElementsWidth,
handleChange: handleChange,
handleKeyDown: handleKeyDown,
handleBlur: handleBlur,
handleFocus: handleFocus,
handleAttachedElementClick: handleAttachedElementClick,
focus: function focus() {
return realRef.focus();
},
blur: function blur() {
return realRef.blur();
}
};
});
var inputProps = {
autoComplete: autoComplete,
autoFocus: autoFocus,
className: "".concat(prefix, "-base"),
disabled: disabled,
id: id,
name: name,
onBlur: handleBlur,
onChange: handleChange,
onFocus: handleFocus,
onKeyDown: handleKeyDown,
placeholder: placeholder,
ref: inputRef,
required: required,
style: {
paddingLeft: leftElementWidth ? "".concat(leftElementWidth, "px") : undefined,
paddingRight: rightElementWidth ? "".concat(rightElementWidth, "px") : undefined
},
type: type
};
var cleaveInputProps = _objectSpread({}, inputProps);
if (value !== null) {
inputProps.value = fixControlledValue(value);
} else {
inputProps.defaultValue = fixControlledValue(defaultValue);
}
cleaveInputProps.value = value || defaultValue || "";
var input = !cleaveOptions || Object.keys(cleaveOptions).length === 0 ? React.createElement("input", inputProps) : React.createElement(Cleave, _extends({
options: cleaveOptions
}, cleaveInputProps, {
ref: cleaveRef
}));
var length;
if (limit) {
warning(!rightElement, "Input", "不允许同时使用 prop `limit` 与 prop `rightElement`");
if (value) {
length = countHanzi ? getFormatStrLeng(value) : value.length;
} else {
warning(value !== null, "Input", "如果要使用 limit Prop,必须从外部控制 value。");
length = 0;
}
}
if (contentJustify) {
warning(value !== null, "Input", "如果使用 contentJusfity Prop,必须从外部控制 value。");
}
var classSet = classNames(className, "".concat(prefix, "-wrapper"), "".concat(prefix, "-").concat(size), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, "".concat(prefix, "-").concat(theme), theme), "".concat(prefix, "-disabled"), disabled), "".concat(prefix, "-limited"), limit), "".concat(prefix, "-limited_digit-over-2"), limit && limit.toString().length > 2), "".concat(prefix, "-normal"), intent === "normal"), "".concat(prefix, "-primary"), intent === "primary"), "".concat(prefix, "-success"), intent === "success"), "".concat(prefix, "-warning"), intent === "warning"), "".concat(prefix, "-danger"), intent === "danger" || length && limit && length > limit));
var leftType = leftElement && leftElement.type ? leftElement.type.type : "";
var rightType = rightElement && rightElement.type ? rightElement.type.type : "";
return React.createElement("div", _extends({
ref: wrapperElementRef,
className: classSet,
style: style
}, otherProps), !!leftElement && React.createElement("div", {
ref: leftElementRef,
onClick: function onClick() {
return handleAttachedElementClick("left");
},
role: "none",
className: classNames("".concat(prefix, "-left"), _defineProperty(_defineProperty(_defineProperty({}, "".concat(prefix, "-left_button"), leftType === "Button"), "".concat(prefix, "-left_icon"), leftType === "Icon"), "".concat(prefix, "-left_select"), leftType === "Select"))
}, leftElement), input, !!rightElement && React.createElement("div", {
ref: rightElementRef,
onClick: function onClick() {
return handleAttachedElementClick("right");
},
role: "none",
className: classNames("".concat(prefix, "-right"), _defineProperty(_defineProperty(_defineProperty({}, "".concat(prefix, "-right_button"), rightType === "Button"), "".concat(prefix, "-right_icon"), rightType === "Icon"), "".concat(prefix, "-right_select"), rightType === "Select"))
}, rightElement), limit && React.createElement("div", {
className: "".concat(prefix, "-limit")
}, React.createElement("span", null, "".concat(length, "/").concat(limit))), contentJustify && React.createElement("div", {
className: "".concat(prefix, "-justify"),
ref: justifyElementRef,
style: {
paddingLeft: leftElementWidth ? "".concat(leftElementWidth, "px") : undefined,
paddingRight: rightElementWidth ? "".concat(rightElementWidth, "px") : undefined,
minWidth: style === null || style === void 0 ? void 0 : style.minWidth
}
}, fixControlledValue(value)));
});
Input.Textarea = Textarea;
Input.displayName = "Input";
Input.propTypes = {
autoComplete: PropTypes.oneOf(["on", "off"]),
autoFocus: PropTypes.bool,
className: PropTypes.string,
cleaveOptions: PropTypes.object,
contentJustify: PropTypes.bool,
countHanzi: PropTypes.bool,
defaultValue: PropTypes.string,
disabled: PropTypes.bool,
id: PropTypes.string,
intent: PropTypes.oneOf(["normal", "primary", "success", "warning", "danger"]),
leftElement: PropTypes.any,
limit: PropTypes.number,
name: PropTypes.string,
onBlur: PropTypes.func,
onChange: PropTypes.func,
onFocus: PropTypes.func,
onKeyDown: PropTypes.func,
onPressEnter: PropTypes.func,
placeholder: PropTypes.string,
required: PropTypes.bool,
rightElement: PropTypes.any,
size: PropTypes.oneOf(["mini", "small", "medium", "large"]),
style: PropTypes.object,
theme: PropTypes.oneOf([null, "light"]),
type: PropTypes.string,
value: PropTypes.string
};
Input.defaultProps = {
autoComplete: "off",
autoFocus: false,
className: undefined,
cleaveOptions: {},
contentJustify: false,
countHanzi: true,
defaultValue: null,
disabled: false,
id: null,
intent: "normal",
leftElement: undefined,
limit: null,
name: null,
onBlur: function onBlur() {},
onChange: function onChange() {},
onFocus: function onFocus() {},
onKeyDown: function onKeyDown() {},
onPressEnter: function onPressEnter() {},
placeholder: "请输入",
required: false,
rightElement: undefined,
size: "small",
style: {},
theme: null,
type: null,
value: null
};
export default Input;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImZvcndhcmRSZWYiLCJ1c2VDb250ZXh0IiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsInVzZUVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiUHJvcFR5cGVzIiwiY2xhc3NOYW1lcyIsIkNsZWF2ZSIsIndhcm5pbmciLCJDb25maWdDb250ZXh0IiwiZ2V0Q29tcHV0ZWRTaXplIiwiVGV4dGFyZWEiLCJwcmVmaXgiLCJJbnB1dCIsIl9yZWYiLCJyZWYiLCJfY2xlYXZlUmVmJGN1cnJlbnQiLCJhdXRvQ29tcGxldGUiLCJhdXRvRm9jdXMiLCJjbGFzc05hbWUiLCJjbGVhdmVPcHRpb25zIiwiY29udGVudEp1c3RpZnkiLCJjb3VudEhhbnppIiwiZGVmYXVsdFZhbHVlIiwiZGlzYWJsZWQiLCJpZCIsImludGVudCIsImxlZnRFbGVtZW50IiwibGltaXQiLCJuYW1lIiwib25CbHVyIiwib25DaGFuZ2UiLCJvbkZvY3VzIiwib25LZXlEb3duIiwib25QcmVzc0VudGVyIiwicGxhY2Vob2xkZXIiLCJyZXF1aXJlZCIsInJpZ2h0RWxlbWVudCIsInNpemVQcm9wIiwic2l6ZSIsInN0eWxlIiwidGhlbWUiLCJ0eXBlIiwidmFsdWUiLCJvdGhlclByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwibGVmdEVsZW1lbnRXaWR0aCIsInNldExlZnRFbGVtZW50V2lkdGgiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsInJpZ2h0RWxlbWVudFdpZHRoIiwic2V0UmlnaHRFbGVtZW50V2lkdGgiLCJpbnB1dFJlZiIsIndyYXBwZXJFbGVtZW50UmVmIiwibGVmdEVsZW1lbnRSZWYiLCJyaWdodEVsZW1lbnRSZWYiLCJqdXN0aWZ5RWxlbWVudFJlZiIsImNsZWF2ZVJlZiIsImlucHV0RWxlbWVudCIsImN1cnJlbnQiLCJlbGVtZW50IiwiX3VzZUNvbnRleHQiLCJzaXplQ29udGV4dCIsImhhbmRsZUNoYW5nZSIsImUiLCJ2YWwiLCJ0YXJnZXQiLCJyZXBsYWNlIiwiaGFuZGxlS2V5RG93biIsImtleSIsImhhbmRsZUJsdXIiLCJoYW5kbGVGb2N1cyIsImhhbmRsZUF0dGFjaGVkRWxlbWVudENsaWNrIiwicG9zaXRpb24iLCJmb2N1cyIsInNlbGVjdCIsImZpeENvbnRyb2xsZWRWYWx1ZSIsInVwZGF0ZUVsZW1lbnRzV2lkdGgiLCJjbGllbnRXaWR0aCIsIk1hdGgiLCJhYnMiLCJzY3JvbGxXaWR0aCIsImNlaWwiLCJ3aWR0aCIsImNvbmNhdCIsImdldEZvcm1hdFN0ckxlbmciLCJzdHIiLCJsZW4iLCJsZW5ndGgiLCJyZWFsTGVuZ3RoIiwiY2hhckNvZGUiLCJpIiwiY2hhckNvZGVBdCIsImVsIiwibGFzdElucHV0VmFsdWUiLCJzdGF0ZSIsInByb3BlcnRpZXMiLCJyZXN1bHQiLCJfY2xlYXZlUmVmJGN1cnJlbnQyIiwicmVhbFJlZiIsImNsZWF2ZSIsImlucHV0IiwiYmx1ciIsImlucHV0UHJvcHMiLCJwYWRkaW5nTGVmdCIsInVuZGVmaW5lZCIsInBhZGRpbmdSaWdodCIsImNsZWF2ZUlucHV0UHJvcHMiLCJfb2JqZWN0U3ByZWFkIiwiT2JqZWN0Iiwia2V5cyIsImNyZWF0ZUVsZW1lbnQiLCJfZXh0ZW5kcyIsIm9wdGlvbnMiLCJjbGFzc1NldCIsIl9kZWZpbmVQcm9wZXJ0eSIsInRvU3RyaW5nIiwibGVmdFR5cGUiLCJyaWdodFR5cGUiLCJvbkNsaWNrIiwicm9sZSIsIm1pbldpZHRoIiwiZGlzcGxheU5hbWUiLCJwcm9wVHlwZXMiLCJvbmVPZiIsImJvb2wiLCJzdHJpbmciLCJvYmplY3QiLCJhbnkiLCJudW1iZXIiLCJmdW5jIiwiZGVmYXVsdFByb3BzIl0sInNvdXJjZXMiOlsiLi4vLi4vY29tcG9uZW50cy9jaGFubmVscy1pbnB1dC9JbnB1dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7XG4gIGZvcndhcmRSZWYsXG4gIHVzZUNvbnRleHQsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUsXG4gIHVzZUVmZmVjdCxcbiAgdXNlUmVmLFxuICB1c2VTdGF0ZSxcbn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSBcInByb3AtdHlwZXNcIlxuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIlxuaW1wb3J0IENsZWF2ZSBmcm9tIFwiY2xlYXZlLmpzL3JlYWN0XCJcbmltcG9ydCB3YXJuaW5nIGZyb20gXCIuLi9fdXRpbC93YXJuaW5nXCJcbmltcG9ydCB7IENvbmZpZ0NvbnRleHQsIGdldENvbXB1dGVkU2l6ZSB9IGZyb20gXCIuLi9jb25maWctcHJvdmlkZXJcIlxuaW1wb3J0IFRleHRhcmVhIGZyb20gXCIuL1RleHRhcmVhXCJcbmltcG9ydCBcIi4vc3R5bGVcIlxuXG5jb25zdCBwcmVmaXggPSBcImFkdWktY2hhbm5lbHMtaW5wdXRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIElJbnB1dFByb3BzIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIC8qKlxuICAgKiBpbnB1dCDmoIfnrb7ljp/nlJ/lsZ7mgKcgLSBhdXRvQ29tcGxldGVcbiAgICovXG4gIGF1dG9Db21wbGV0ZT86IFwib25cIiB8IFwib2ZmXCJcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIGF1dG9Gb2N1c1xuICAgKi9cbiAgYXV0b0ZvY3VzPzogYm9vbGVhblxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCNXG4gICAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOWunueOsOaJi+acuuWPt+OAgeaXpeacn+OAgeaVsOWtl+WPiuiHquWumuS5ieagvOW8j++8jOWPr+afpeeci1vnpLrkvotdKGh0dHA6Ly93eGFkLmRlc2lnbi9hZHVpL2NvbXBvbmVudHMvaW5wdXQp44CCXG4gICAqL1xuICBjbGVhdmVPcHRpb25zPzogb2JqZWN0XG4gIC8qKlxuICAgKiDlrr3luqbmmK/lkKbkuI7lhoXlrrnlrr3luqblr7npvZBcbiAgICovXG4gIGNvbnRlbnRKdXN0aWZ5PzogYm9vbGVhblxuICAvKipcbiAgICog5piv5ZCm5oyJ54Wn5LiA5Liq5rGJ5a2X566XIDIg5a2X5pWw55qE5pa55byP6ZmQ5Yi26ZW/5bqmXG4gICAqL1xuICBjb3VudEhhbnppPzogYm9vbGVhblxuICAvKipcbiAgICog6buY6K6k5YC8IC0g5YaF6YOo6amx5YqoXG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBzdHJpbmcgfCBudWxsXG4gIC8qKlxuICAgKiDmmK/lkKbnpoHnlKhcbiAgICovXG4gIGRpc2FibGVkPzogYm9vbGVhblxuICAvKipcbiAgICog6L6T5YWl5qGG55qEIGlkXG4gICAqL1xuICBpZD86IHN0cmluZyB8IG51bGxcbiAgLyoqXG4gICAqIOexu+Wei1xuICAgKi9cbiAgaW50ZW50PzogXCJub3JtYWxcIiB8IFwicHJpbWFyeVwiIHwgXCJzdWNjZXNzXCIgfCBcIndhcm5pbmdcIiB8IFwiZGFuZ2VyXCJcbiAgLyoqXG4gICAqIOWJjee9ruWFg+e0oFxuICAgKi9cbiAgbGVmdEVsZW1lbnQ/OiBKU1guRWxlbWVudFxuICAvKipcbiAgICog6ZmQ5Yi26ZW/5bqmXG4gICAqL1xuICBsaW1pdD86IG51bWJlciB8IG51bGxcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIG5hbWVcbiAgICovXG4gIG5hbWU/OiBzdHJpbmcgfCBudWxsXG4gIC8qKlxuICAgKiBibHVyIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkJsdXI/OiAoZTogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4gdm9pZFxuICAvKipcbiAgICog5YC85pS55Y+Y5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2hhbmdlPzogKGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+LCB2YWx1ZT86IHN0cmluZykgPT4gdm9pZFxuICAvKipcbiAgICogZm9jdXMg5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uRm9jdXM/OiAoZTogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4gdm9pZFxuICAvKipcbiAgICoga2V5ZG93biDml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25LZXlEb3duPzogKGU6IFJlYWN0LktleWJvYXJkRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pID0+IHZvaWRcbiAgLyoqXG4gICAqIGVudGVyIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvblByZXNzRW50ZXI/OiAoZTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4gdm9pZFxuICAvKipcbiAgICogcGxhY2Vob2xkZXJcbiAgICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nXG4gIC8qKlxuICAgKiBpbnB1dCDmoIfnrb7ljp/nlJ/lsZ7mgKcgLSByZXF1aXJlZFxuICAgKi9cbiAgcmVxdWlyZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiDlkI7nva7lhYPntKBcbiAgICovXG4gIHJpZ2h0RWxlbWVudD86IEpTWC5FbGVtZW50XG4gIC8qKlxuICAgKiDorr7nva7lsLrlr7hcbiAgICovXG4gIHNpemU/OiBcIm1pbmlcIiB8IFwic21hbGxcIiB8IFwibWVkaXVtXCIgfCBcImxhcmdlXCJcbiAgLyoqXG4gICAqIOmZhOWKoOagt+W8j1xuICAgKi9cbiAgc3R5bGU/OiBSZWFjdC5DU1NQcm9wZXJ0aWVzXG4gIC8qKlxuICAgKiDorr7nva7kuLvpophcbiAgICovXG4gIHRoZW1lPzogbnVsbCB8IFwibGlnaHRcIlxuICAvKipcbiAgICogaW5wdXQg5qCH562+5Y6f55Sf5bGe5oCnIC0gdHlwZVxuICAgKi9cbiAgdHlwZT86IHN0cmluZyB8IG51bGxcbiAgLyoqXG4gICAqIOWAvCAtIOWklumDqOaOp+WItlxuICAgKi9cbiAgdmFsdWU/OiBzdHJpbmcgfCBudWxsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUlucHV0XG4gIGV4dGVuZHMgUmVhY3QuRm9yd2FyZFJlZkV4b3RpY0NvbXBvbmVudDxcbiAgICBJSW5wdXRQcm9wcyAmIFJlYWN0LlJlZkF0dHJpYnV0ZXM8YW55PlxuICA+IHtcbiAgVGV4dGFyZWE6IHR5cGVvZiBUZXh0YXJlYVxufVxuXG4vKipcbiAqIOi+k+WFpeahhueUqOS6juaWh+acrOi+k+WFpeeahOWMuuWfn++8jOWPr+e7k+WQiOWbvuagh+OAgeaMiemSruOAgemAieaLqeWZqOetiee7hOS7tuS9v+eUqOOAglxuICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCBJbnB1dDogSUlucHV0ID0gZm9yd2FyZFJlZihcbiAgKFxuICAgIHtcbiAgICAgIGF1dG9Db21wbGV0ZSxcbiAgICAgIGF1dG9Gb2N1cyxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNsZWF2ZU9wdGlvbnMsXG4gICAgICBjb250ZW50SnVzdGlmeSxcbiAgICAgIGNvdW50SGFuemksXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGlkLFxuICAgICAgaW50ZW50LFxuICAgICAgbGVmdEVsZW1lbnQsXG4gICAgICBsaW1pdCxcbiAgICAgIG5hbWUsXG4gICAgICBvbkJsdXIsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIG9uRm9jdXMsXG4gICAgICBvbktleURvd24sXG4gICAgICBvblByZXNzRW50ZXIsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHJlcXVpcmVkLFxuICAgICAgcmlnaHRFbGVtZW50LFxuICAgICAgc2l6ZTogc2l6ZVByb3AsXG4gICAgICBzdHlsZSxcbiAgICAgIHRoZW1lLFxuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4ub3RoZXJQcm9wc1xuICAgIH06IElJbnB1dFByb3BzLFxuICAgIHJlZlxuICApID0+IHtcbiAgICBjb25zdCBbbGVmdEVsZW1lbnRXaWR0aCwgc2V0TGVmdEVsZW1lbnRXaWR0aF0gPSB1c2VTdGF0ZTxudWxsIHwgbnVtYmVyPihcbiAgICAgIG51bGxcbiAgICApXG4gICAgY29uc3QgW3JpZ2h0RWxlbWVudFdpZHRoLCBzZXRSaWdodEVsZW1lbnRXaWR0aF0gPSB1c2VTdGF0ZTxudWxsIHwgbnVtYmVyPihcbiAgICAgIG51bGxcbiAgICApXG4gICAgY29uc3QgaW5wdXRSZWYgPSB1c2VSZWY8YW55PihudWxsKVxuICAgIGNvbnN0IHdyYXBwZXJFbGVtZW50UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICAgIGNvbnN0IGxlZnRFbGVtZW50UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICAgIGNvbnN0IHJpZ2h0RWxlbWVudFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgICBjb25zdCBqdXN0aWZ5RWxlbWVudFJlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgICBjb25zdCBjbGVhdmVSZWYgPSB1c2VSZWY8YW55PihudWxsKVxuXG4gICAgY29uc3QgaW5wdXRFbGVtZW50ID0gaW5wdXRSZWY/LmN1cnJlbnQgfHwgY2xlYXZlUmVmPy5jdXJyZW50Py5lbGVtZW50XG5cbiAgICBjb25zdCB7IHNpemU6IHNpemVDb250ZXh0IH0gPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpXG5cbiAgICBjb25zdCBzaXplID0gZ2V0Q29tcHV0ZWRTaXplKHNpemVQcm9wLCBzaXplQ29udGV4dClcblxuICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKCFkaXNhYmxlZCAmJiBvbkNoYW5nZSkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb250cm9sLXJlZ2V4LCBtYXgtbGVuICovXG4gICAgICAgIC8vIDA4IEJhY2tzcGFjZSwgMDkgVGFiLCAwQSDmjaLooYznrKYsIDBCIOWeguebtOWItuihqOespiwgMEMg5o2i6aG1LCAwRCDlm57ovaYsIEEwIOS4jemXtOaWreepuuagvCxcbiAgICAgICAgLy8gMjAyOC8yMDI5IOWIhumalOespiwgRkVmZiDlrZfoioLpobrluo/moIforrDjgIJcbiAgICAgICAgY29uc3QgdmFsID0gZS50YXJnZXQudmFsdWUucmVwbGFjZShcbiAgICAgICAgICAvXFx1MDAwOHxcXHUwMDA5fFxcdTAwMEF8XFx1MDAwQnxcXHUwMDBDfFxcdTAwMER8XFx1MDBBMHxcXHUyMDI4fFxcdTIwMjl8XFx1RkVGRi9nLFxuICAgICAgICAgIFwiXCJcbiAgICAgICAgKVxuICAgICAgICBvbkNoYW5nZShlLCB2YWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBSZWFjdC5LZXlib2FyZEV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIiAmJiBvblByZXNzRW50ZXIpIHtcbiAgICAgICAgb25QcmVzc0VudGVyKGUpXG4gICAgICB9XG4gICAgICBpZiAob25LZXlEb3duKSB7XG4gICAgICAgIG9uS2V5RG93bihlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUJsdXIgPSAoZTogUmVhY3QuRm9jdXNFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgaWYgKG9uQmx1cikge1xuICAgICAgICBvbkJsdXIoZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVGb2N1cyA9IChlOiBSZWFjdC5Gb2N1c0V2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAob25Gb2N1cykge1xuICAgICAgICBvbkZvY3VzKGUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlQXR0YWNoZWRFbGVtZW50Q2xpY2sgPSAocG9zaXRpb246IFwibGVmdFwiIHwgXCJyaWdodFwiKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBvc2l0aW9uID09PSBcImxlZnRcIiAmJlxuICAgICAgICBsZWZ0RWxlbWVudCAmJlxuICAgICAgICBsZWZ0RWxlbWVudC50eXBlICYmXG4gICAgICAgIGxlZnRFbGVtZW50LnR5cGUubmFtZSA9PT0gXCJJY29uXCJcbiAgICAgICkge1xuICAgICAgICBpbnB1dEVsZW1lbnQuZm9jdXMoKVxuICAgICAgICBpbnB1dEVsZW1lbnQuc2VsZWN0KClcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgcG9zaXRpb24gPT09IFwicmlnaHRcIiAmJlxuICAgICAgICByaWdodEVsZW1lbnQgJiZcbiAgICAgICAgcmlnaHRFbGVtZW50LnR5cGUgJiZcbiAgICAgICAgcmlnaHRFbGVtZW50LnR5cGUubmFtZSA9PT0gXCJJY29uXCJcbiAgICAgICkge1xuICAgICAgICBpbnB1dEVsZW1lbnQuZm9jdXMoKVxuICAgICAgICBpbnB1dEVsZW1lbnQuc2VsZWN0KClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmaXhDb250cm9sbGVkVmFsdWUgPSAodmFsPzogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwidW5kZWZpbmVkXCIgfHwgdmFsID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBcIlwiXG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsXG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlRWxlbWVudHNXaWR0aCA9ICgpID0+IHtcbiAgICAgIC8qKlxuICAgICAgICog6L+Z5Liq5pa55rOV5Lya5ZyoIGRpZFVwZGF0ZSDlkowgZGlkTW91bnQg5pe25Y67IHNldFN0YXRlXG4gICAgICAgKiDkuIDlrpropoHpgb/lhY3pgKDmiJDlvqrnjq/jgIJcbiAgICAgICAqL1xuICAgICAgaWYgKGxlZnRFbGVtZW50UmVmPy5jdXJyZW50KSB7XG4gICAgICAgIGNvbnN0IHsgY2xpZW50V2lkdGggfSA9IGxlZnRFbGVtZW50UmVmLmN1cnJlbnRcblxuICAgICAgICAvLyDpmLLmraLlvqrnjq9cbiAgICAgICAgaWYgKE1hdGguYWJzKGNsaWVudFdpZHRoIC0gKGxlZnRFbGVtZW50V2lkdGggfHwgMCkpID4gMikge1xuICAgICAgICAgIHNldExlZnRFbGVtZW50V2lkdGgoY2xpZW50V2lkdGgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobGVmdEVsZW1lbnRXaWR0aCkge1xuICAgICAgICBzZXRMZWZ0RWxlbWVudFdpZHRoKG51bGwpXG4gICAgICB9XG5cbiAgICAgIGlmIChyaWdodEVsZW1lbnRSZWY/LmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgeyBjbGllbnRXaWR0aCB9ID0gcmlnaHRFbGVtZW50UmVmLmN1cnJlbnRcblxuICAgICAgICAvLyDpmLLmraLlvqrnjq9cbiAgICAgICAgaWYgKE1hdGguYWJzKGNsaWVudFdpZHRoIC0gKHJpZ2h0RWxlbWVudFdpZHRoIHx8IDApKSA+IDIpIHtcbiAgICAgICAgICBzZXRSaWdodEVsZW1lbnRXaWR0aChjbGllbnRXaWR0aClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyaWdodEVsZW1lbnRXaWR0aCkge1xuICAgICAgICBzZXRSaWdodEVsZW1lbnRXaWR0aChudWxsKVxuICAgICAgfVxuXG4gICAgICBpZiAoanVzdGlmeUVsZW1lbnRSZWY/LmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgeyBzY3JvbGxXaWR0aCB9ID0ganVzdGlmeUVsZW1lbnRSZWYuY3VycmVudFxuICAgICAgICBpZiAoXG4gICAgICAgICAgd3JhcHBlckVsZW1lbnRSZWYuY3VycmVudCAmJlxuICAgICAgICAgIE1hdGguY2VpbChzY3JvbGxXaWR0aCkgIT09IHdyYXBwZXJFbGVtZW50UmVmLmN1cnJlbnQuY2xpZW50V2lkdGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgd3JhcHBlckVsZW1lbnRSZWYuY3VycmVudC5zdHlsZS53aWR0aCA9IGAke01hdGguY2VpbChzY3JvbGxXaWR0aCl9cHhgXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBnZXRGb3JtYXRTdHJMZW5nID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoXG4gICAgICBsZXQgcmVhbExlbmd0aCA9IDBcbiAgICAgIGxldCBjaGFyQ29kZSA9IC0xXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICAgICAgaWYgKGNoYXJDb2RlID49IDAgJiYgY2hhckNvZGUgPD0gMTI4KSB7XG4gICAgICAgICAgcmVhbExlbmd0aCArPSAwLjVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWFsTGVuZ3RoICs9IDFcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIE1hdGguY2VpbChyZWFsTGVuZ3RoKVxuICAgIH1cblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICB1cGRhdGVFbGVtZW50c1dpZHRoKClcbiAgICAgIGlmIChjbGVhdmVSZWY/LmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgZWwgPSBjbGVhdmVSZWYuY3VycmVudC5lbGVtZW50XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDkv67lpI0gY2xlYXZlLjEuNC43IGJ1ZzpcbiAgICAgICAgICovXG4gICAgICAgIGlmIChjbGVhdmVSZWYuY3VycmVudC5sYXN0SW5wdXRWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICBjbGVhdmVSZWYuY3VycmVudC5sYXN0SW5wdXRWYWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsZWF2ZVJlZi5jdXJyZW50LnN0YXRlLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgIGNsZWF2ZVJlZi5jdXJyZW50LnN0YXRlLnZhbHVlID0gdmFsdWVcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xlYXZlUmVmLmN1cnJlbnQucHJvcGVydGllcy5yZXN1bHQgIT09IHZhbHVlKSB7XG4gICAgICAgICAgY2xlYXZlUmVmLmN1cnJlbnQucHJvcGVydGllcy5yZXN1bHQgPSB2YWx1ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbCAmJiBlbC52YWx1ZSAhPT0gdmFsdWUgJiYgdmFsdWUpIHtcbiAgICAgICAgICBlbC52YWx1ZSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+IHtcbiAgICAgIGNvbnN0IHJlYWxSZWYgPSBpbnB1dFJlZj8uY3VycmVudCB8fCBjbGVhdmVSZWY/LmN1cnJlbnQ/LmVsZW1lbnRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsZWF2ZTogY2xlYXZlUmVmPy5jdXJyZW50LFxuICAgICAgICBpbnB1dDogcmVhbFJlZixcbiAgICAgICAgbGVmdEVsZW1lbnQ6IGxlZnRFbGVtZW50UmVmPy5jdXJyZW50LFxuICAgICAgICByaWdodEVsZW1lbnQ6IHJpZ2h0RWxlbWVudFJlZj8uY3VycmVudCxcbiAgICAgICAgdXBkYXRlRWxlbWVudHNXaWR0aCxcbiAgICAgICAgaGFuZGxlQ2hhbmdlLFxuICAgICAgICBoYW5kbGVLZXlEb3duLFxuICAgICAgICBoYW5kbGVCbHVyLFxuICAgICAgICBoYW5kbGVGb2N1cyxcbiAgICAgICAgaGFuZGxlQXR0YWNoZWRFbGVtZW50Q2xpY2ssXG4gICAgICAgIGZvY3VzOiAoKSA9PiByZWFsUmVmLmZvY3VzKCksXG4gICAgICAgIGJsdXI6ICgpID0+IHJlYWxSZWYuYmx1cigpLFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBpbnB1dFByb3BzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge1xuICAgICAgYXV0b0NvbXBsZXRlLFxuICAgICAgYXV0b0ZvY3VzLFxuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXh9LWJhc2VgLFxuICAgICAgZGlzYWJsZWQsXG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBvbkJsdXI6IGhhbmRsZUJsdXIsXG4gICAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLFxuICAgICAgb25Gb2N1czogaGFuZGxlRm9jdXMsXG4gICAgICBvbktleURvd246IGhhbmRsZUtleURvd24sXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICByZXF1aXJlZCxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHBhZGRpbmdMZWZ0OiBsZWZ0RWxlbWVudFdpZHRoID8gYCR7bGVmdEVsZW1lbnRXaWR0aH1weGAgOiB1bmRlZmluZWQsXG4gICAgICAgIHBhZGRpbmdSaWdodDogcmlnaHRFbGVtZW50V2lkdGggPyBgJHtyaWdodEVsZW1lbnRXaWR0aH1weGAgOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgdHlwZSxcbiAgICB9XG5cbiAgICBjb25zdCBjbGVhdmVJbnB1dFByb3BzID0geyAuLi5pbnB1dFByb3BzIH1cblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaW5wdXRQcm9wcy52YWx1ZSA9IGZpeENvbnRyb2xsZWRWYWx1ZSh2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXRQcm9wcy5kZWZhdWx0VmFsdWUgPSBmaXhDb250cm9sbGVkVmFsdWUoZGVmYXVsdFZhbHVlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGNsZWF2ZSDkuI3mjqXmlLbljp/nlJ/nmoQgZGVmYXVsdFZhbHVl77yM5b+F6aG75Lyg5YWlIHZhbHVlIHByb3Ag5p2l5a6e546wIGRlZmF1bHRWYWx1ZSDnmoTkvZznlKhcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbm9zaXIvY2xlYXZlLmpzL2Jsb2IvbWFzdGVyL2RvYy9yZWFjdGpzLWNvbXBvbmVudC11c2FnZS5tZCNob3ctdG8tcGFzcy1kZWZhdWx0LXZhbHVlXG4gICAgICovXG4gICAgY2xlYXZlSW5wdXRQcm9wcy52YWx1ZSA9IHZhbHVlIHx8IGRlZmF1bHRWYWx1ZSB8fCBcIlwiXG5cbiAgICBjb25zdCBpbnB1dCA9XG4gICAgICAhY2xlYXZlT3B0aW9ucyB8fCBPYmplY3Qua2V5cyhjbGVhdmVPcHRpb25zKS5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgIDxpbnB1dCB7Li4uaW5wdXRQcm9wc30gLz5cbiAgICAgICkgOiAoXG4gICAgICAgIDxDbGVhdmUgb3B0aW9ucz17Y2xlYXZlT3B0aW9uc30gey4uLmNsZWF2ZUlucHV0UHJvcHN9IHJlZj17Y2xlYXZlUmVmfSAvPlxuICAgICAgKVxuXG4gICAgbGV0IGxlbmd0aFxuICAgIGlmIChsaW1pdCkge1xuICAgICAgd2FybmluZyhcbiAgICAgICAgIXJpZ2h0RWxlbWVudCxcbiAgICAgICAgXCJJbnB1dFwiLFxuICAgICAgICBcIuS4jeWFgeiuuOWQjOaXtuS9v+eUqCBwcm9wIGBsaW1pdGAg5LiOIHByb3AgYHJpZ2h0RWxlbWVudGBcIlxuICAgICAgKVxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGxlbmd0aCA9IGNvdW50SGFuemkgPyBnZXRGb3JtYXRTdHJMZW5nKHZhbHVlKSA6IHZhbHVlLmxlbmd0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FybmluZyhcbiAgICAgICAgICB2YWx1ZSAhPT0gbnVsbCxcbiAgICAgICAgICBcIklucHV0XCIsXG4gICAgICAgICAgXCLlpoLmnpzopoHkvb/nlKggbGltaXQgUHJvcO+8jOW/hemhu+S7juWklumDqOaOp+WItiB2YWx1ZeOAglwiXG4gICAgICAgIClcbiAgICAgICAgbGVuZ3RoID0gMFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29udGVudEp1c3RpZnkpIHtcbiAgICAgIHdhcm5pbmcoXG4gICAgICAgIHZhbHVlICE9PSBudWxsLFxuICAgICAgICBcIklucHV0XCIsXG4gICAgICAgIFwi5aaC5p6c5L2/55SoIGNvbnRlbnRKdXNmaXR5IFByb3DvvIzlv4Xpobvku47lpJbpg6jmjqfliLYgdmFsdWXjgIJcIlxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGNsYXNzU2V0ID0gY2xhc3NOYW1lcyhcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGAke3ByZWZpeH0td3JhcHBlcmAsXG4gICAgICBgJHtwcmVmaXh9LSR7c2l6ZX1gLFxuICAgICAge1xuICAgICAgICBbYCR7cHJlZml4fS0ke3RoZW1lfWBdOiB0aGVtZSxcbiAgICAgICAgW2Ake3ByZWZpeH0tZGlzYWJsZWRgXTogZGlzYWJsZWQsXG4gICAgICAgIFtgJHtwcmVmaXh9LWxpbWl0ZWRgXTogbGltaXQsXG4gICAgICAgIFtgJHtwcmVmaXh9LWxpbWl0ZWRfZGlnaXQtb3Zlci0yYF06XG4gICAgICAgICAgbGltaXQgJiYgbGltaXQudG9TdHJpbmcoKS5sZW5ndGggPiAyLFxuICAgICAgICBbYCR7cHJlZml4fS1ub3JtYWxgXTogaW50ZW50ID09PSBcIm5vcm1hbFwiLFxuICAgICAgICBbYCR7cHJlZml4fS1wcmltYXJ5YF06IGludGVudCA9PT0gXCJwcmltYXJ5XCIsXG4gICAgICAgIFtgJHtwcmVmaXh9LXN1Y2Nlc3NgXTogaW50ZW50ID09PSBcInN1Y2Nlc3NcIixcbiAgICAgICAgW2Ake3ByZWZpeH0td2FybmluZ2BdOiBpbnRlbnQgPT09IFwid2FybmluZ1wiLFxuICAgICAgICBbYCR7cHJlZml4fS1kYW5nZXJgXTpcbiAgICAgICAgICBpbnRlbnQgPT09IFwiZGFuZ2VyXCIgfHwgKGxlbmd0aCAmJiBsaW1pdCAmJiBsZW5ndGggPiBsaW1pdCksXG4gICAgICB9XG4gICAgKVxuXG4gICAgY29uc3QgbGVmdFR5cGUgPVxuICAgICAgbGVmdEVsZW1lbnQgJiYgbGVmdEVsZW1lbnQudHlwZSA/IGxlZnRFbGVtZW50LnR5cGUudHlwZSA6IFwiXCJcbiAgICBjb25zdCByaWdodFR5cGUgPVxuICAgICAgcmlnaHRFbGVtZW50ICYmIHJpZ2h0RWxlbWVudC50eXBlID8gcmlnaHRFbGVtZW50LnR5cGUudHlwZSA6IFwiXCJcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIHJlZj17d3JhcHBlckVsZW1lbnRSZWZ9XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NTZXR9XG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgey4uLm90aGVyUHJvcHN9XG4gICAgICA+XG4gICAgICAgIHshIWxlZnRFbGVtZW50ICYmIChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICByZWY9e2xlZnRFbGVtZW50UmVmfVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlQXR0YWNoZWRFbGVtZW50Q2xpY2soXCJsZWZ0XCIpfVxuICAgICAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGAke3ByZWZpeH0tbGVmdGAsIHtcbiAgICAgICAgICAgICAgW2Ake3ByZWZpeH0tbGVmdF9idXR0b25gXTogbGVmdFR5cGUgPT09IFwiQnV0dG9uXCIsXG4gICAgICAgICAgICAgIFtgJHtwcmVmaXh9LWxlZnRfaWNvbmBdOiBsZWZ0VHlwZSA9PT0gXCJJY29uXCIsXG4gICAgICAgICAgICAgIFtgJHtwcmVmaXh9LWxlZnRfc2VsZWN0YF06IGxlZnRUeXBlID09PSBcIlNlbGVjdFwiLFxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2xlZnRFbGVtZW50fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgICB7aW5wdXR9XG4gICAgICAgIHshIXJpZ2h0RWxlbWVudCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgcmVmPXtyaWdodEVsZW1lbnRSZWZ9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVBdHRhY2hlZEVsZW1lbnRDbGljayhcInJpZ2h0XCIpfVxuICAgICAgICAgICAgcm9sZT1cIm5vbmVcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGAke3ByZWZpeH0tcmlnaHRgLCB7XG4gICAgICAgICAgICAgIFtgJHtwcmVmaXh9LXJpZ2h0X2J1dHRvbmBdOiByaWdodFR5cGUgPT09IFwiQnV0dG9uXCIsXG4gICAgICAgICAgICAgIFtgJHtwcmVmaXh9LXJpZ2h0X2ljb25gXTogcmlnaHRUeXBlID09PSBcIkljb25cIixcbiAgICAgICAgICAgICAgW2Ake3ByZWZpeH0tcmlnaHRfc2VsZWN0YF06IHJpZ2h0VHlwZSA9PT0gXCJTZWxlY3RcIixcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtyaWdodEVsZW1lbnR9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIHtsaW1pdCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tbGltaXRgfT5cbiAgICAgICAgICAgIDxzcGFuPntgJHtsZW5ndGh9LyR7bGltaXR9YH08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIHtjb250ZW50SnVzdGlmeSAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtwcmVmaXh9LWp1c3RpZnlgfVxuICAgICAgICAgICAgcmVmPXtqdXN0aWZ5RWxlbWVudFJlZn1cbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiBsZWZ0RWxlbWVudFdpZHRoXG4gICAgICAgICAgICAgICAgPyBgJHtsZWZ0RWxlbWVudFdpZHRofXB4YFxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6IHJpZ2h0RWxlbWVudFdpZHRoXG4gICAgICAgICAgICAgICAgPyBgJHtyaWdodEVsZW1lbnRXaWR0aH1weGBcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgbWluV2lkdGg6IHN0eWxlPy5taW5XaWR0aCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2ZpeENvbnRyb2xsZWRWYWx1ZSh2YWx1ZSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbilcblxuSW5wdXQuVGV4dGFyZWEgPSBUZXh0YXJlYVxuXG5JbnB1dC5kaXNwbGF5TmFtZSA9IFwiSW5wdXRcIlxuXG5JbnB1dC5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBpbnB1dCDmoIfnrb7ljp/nlJ/lsZ7mgKcgLSBhdXRvQ29tcGxldGVcbiAgICovXG4gIGF1dG9Db21wbGV0ZTogUHJvcFR5cGVzLm9uZU9mKFtcIm9uXCIsIFwib2ZmXCJdKSxcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIGF1dG9Gb2N1c1xuICAgKi9cbiAgYXV0b0ZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5a6e546w5omL5py65Y+344CB5pel5pyf44CB5pWw5a2X5Y+K6Ieq5a6a5LmJ5qC85byP77yM5Y+v5p+l55yLW+ekuuS+i10oaHR0cDovL3d4YWQuZGVzaWduL2FkdWkvY29tcG9uZW50cy9pbnB1dCnjgIJcbiAgICovXG4gIGNsZWF2ZU9wdGlvbnM6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiDlrr3luqbmmK/lkKbkuI7lhoXlrrnlrr3luqblr7npvZBcbiAgICovXG4gIGNvbnRlbnRKdXN0aWZ5OiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOaYr+WQpuaMieeFp+S4gOS4quaxieWtl+eulyAyIOWtl+aVsOeahOaWueW8j+mZkOWItumVv+W6plxuICAgKi9cbiAgY291bnRIYW56aTogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDpu5jorqTlgLwgLSDlhoXpg6jpqbHliqhcbiAgICovXG4gIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog6L6T5YWl5qGG55qEIGlkXG4gICAqL1xuICBpZDogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIOexu+Wei1xuICAgKi9cbiAgaW50ZW50OiBQcm9wVHlwZXMub25lT2YoW1xuICAgIFwibm9ybWFsXCIsXG4gICAgXCJwcmltYXJ5XCIsXG4gICAgXCJzdWNjZXNzXCIsXG4gICAgXCJ3YXJuaW5nXCIsXG4gICAgXCJkYW5nZXJcIixcbiAgXSksXG4gIC8qKlxuICAgKiDliY3nva7lhYPntKBcbiAgICovXG4gIGxlZnRFbGVtZW50OiBQcm9wVHlwZXMuYW55LFxuICAvKipcbiAgICog6ZmQ5Yi26ZW/5bqmXG4gICAqL1xuICBsaW1pdDogUHJvcFR5cGVzLm51bWJlcixcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIG5hbWVcbiAgICovXG4gIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiBibHVyIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuICAvKipcbiAgICog5YC85pS55Y+Y5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIGZvY3VzIOaXtueahCBoYW5kbGVyXG4gICAqL1xuICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIGtleWRvd24g5pe255qEIGhhbmRsZXJcbiAgICovXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiBlbnRlciDml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25QcmVzc0VudGVyOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIHBsYWNlaG9sZGVyXG4gICAqL1xuICBwbGFjZWhvbGRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIGlucHV0IOagh+etvuWOn+eUn+WxnuaApyAtIHJlcXVpcmVkXG4gICAqL1xuICByZXF1aXJlZDogUHJvcFR5cGVzLmJvb2wsXG4gIC8qKlxuICAgKiDlkI7nva7lhYPntKBcbiAgICovXG4gIHJpZ2h0RWxlbWVudDogUHJvcFR5cGVzLmFueSxcbiAgLyoqXG4gICAqIOiuvue9ruWwuuWvuFxuICAgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFtcIm1pbmlcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImxhcmdlXCJdKSxcbiAgLyoqXG4gICAqIOmZhOWKoOagt+W8j1xuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG4gIC8qKlxuICAgKiDorr7nva7kuLvpophcbiAgICovXG4gIHRoZW1lOiBQcm9wVHlwZXMub25lT2YoW251bGwsIFwibGlnaHRcIl0pLFxuICAvKipcbiAgICogaW5wdXQg5qCH562+5Y6f55Sf5bGe5oCnIC0gdHlwZVxuICAgKi9cbiAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIOWAvCAtIOWklumDqOaOp+WItlxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsXG59XG5cbklucHV0LmRlZmF1bHRQcm9wcyA9IHtcbiAgYXV0b0NvbXBsZXRlOiBcIm9mZlwiLFxuICBhdXRvRm9jdXM6IGZhbHNlLFxuICBjbGFzc05hbWU6IHVuZGVmaW5lZCxcbiAgY2xlYXZlT3B0aW9uczoge30sXG4gIGNvbnRlbnRKdXN0aWZ5OiBmYWxzZSxcbiAgY291bnRIYW56aTogdHJ1ZSxcbiAgZGVmYXVsdFZhbHVlOiBudWxsLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGlkOiBudWxsLFxuICBpbnRlbnQ6IFwibm9ybWFsXCIsXG4gIGxlZnRFbGVtZW50OiB1bmRlZmluZWQsXG4gIGxpbWl0OiBudWxsLFxuICBuYW1lOiBudWxsLFxuICBvbkJsdXI6ICgpID0+IHt9LFxuICBvbkNoYW5nZTogKCkgPT4ge30sXG4gIG9uRm9jdXM6ICgpID0+IHt9LFxuICBvbktleURvd246ICgpID0+IHt9LFxuICBvblByZXNzRW50ZXI6ICgpID0+IHt9LFxuICBwbGFjZWhvbGRlcjogXCLor7fovpPlhaVcIixcbiAgcmVxdWlyZWQ6IGZhbHNlLFxuICByaWdodEVsZW1lbnQ6IHVuZGVmaW5lZCxcbiAgc2l6ZTogXCJzbWFsbFwiLFxuICBzdHlsZToge30sXG4gIHRoZW1lOiBudWxsLFxuICB0eXBlOiBudWxsLFxuICB2YWx1ZTogbnVsbCxcbn1cblxuZXhwb3J0IGRlZmF1bHQgSW5wdXRcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU9BLEtBQUssSUFDVkMsVUFBVSxFQUNWQyxVQUFVLEVBQ1ZDLG1CQUFtQixFQUNuQkMsU0FBUyxFQUNUQyxNQUFNLEVBQ05DLFFBQVEsUUFDSCxPQUFPO0FBQ2QsT0FBT0MsU0FBUyxNQUFNLFlBQVk7QUFDbEMsT0FBT0MsVUFBVSxNQUFNLFlBQVk7QUFDbkMsT0FBT0MsTUFBTSxNQUFNLGlCQUFpQjtBQUNwQyxPQUFPQyxPQUFPLE1BQU0sa0JBQWtCO0FBQ3RDLFNBQVNDLGFBQWEsRUFBRUMsZUFBZSxRQUFRLG9CQUFvQjtBQUNuRSxPQUFPQyxRQUFRLE1BQU0sWUFBWTtBQUNqQyxPQUFPLFNBQVM7QUFFaEIsSUFBTUMsTUFBTSxHQUFHLHFCQUFxQjtBQXlIcEMsSUFBTUMsS0FBYSxHQUFHZCxVQUFVLENBQzlCLFVBQUFlLElBQUEsRUE4QkVDLEdBQUcsRUFDQTtFQUFBLElBQUFDLGtCQUFBO0VBQUEsSUE3QkRDLFlBQVksR0FBQUgsSUFBQSxDQUFaRyxZQUFZO0lBQ1pDLFNBQVMsR0FBQUosSUFBQSxDQUFUSSxTQUFTO0lBQ1RDLFNBQVMsR0FBQUwsSUFBQSxDQUFUSyxTQUFTO0lBQ1RDLGFBQWEsR0FBQU4sSUFBQSxDQUFiTSxhQUFhO0lBQ2JDLGNBQWMsR0FBQVAsSUFBQSxDQUFkTyxjQUFjO0lBQ2RDLFVBQVUsR0FBQVIsSUFBQSxDQUFWUSxVQUFVO0lBQ1ZDLFlBQVksR0FBQVQsSUFBQSxDQUFaUyxZQUFZO0lBQ1pDLFFBQVEsR0FBQVYsSUFBQSxDQUFSVSxRQUFRO0lBQ1JDLEVBQUUsR0FBQVgsSUFBQSxDQUFGVyxFQUFFO0lBQ0ZDLE1BQU0sR0FBQVosSUFBQSxDQUFOWSxNQUFNO0lBQ05DLFdBQVcsR0FBQWIsSUFBQSxDQUFYYSxXQUFX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