UNPKG

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>

627 lines (538 loc) 77.9 kB
var _excluded = ["allowClear", "className", "closeOnSelect", "defaultValue", "defaultVisible", "disabled", "disabledDays", "dropdownRender", "hour", "intent", "maxDate", "minDate", "onChange", "onClick", "onEndDaySelect", "onStartDaySelect", "onVisibleChange", "placeholder", "placement", "popoverProps", "renderDay", "shortcuts", "size", "theme", "triggerElement", "value", "visible"]; function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } import React, { forwardRef, useContext, useImperativeHandle, useMemo, useRef, useState } from "react"; import PropTypes from "prop-types"; import classNames from "classnames"; import DPR from "day-picker-react"; import { CaptionElementProps, DateUtils, NavbarElementProps } from "day-picker-react"; import "./style"; import styles from "./classNames"; import { ConfigContext, getComputedSize } from "../config-provider"; import Icon from "../icon"; import Input from "../input"; import Popover from "../popover"; import Caption from "./Caption"; import Navbar from "./Navbar"; import Shortcuts from "./Shortcuts"; import { MONTHS, WEEKDAYS_LONG, WEEKDAYS_SHORT, getDefaultMaxDate, getDefaultMinDate, isLegalDateRangeString, convertDateToString, convertDateRangeToString, isDayInRange } from "./core"; var DayPicker = DPR.__esModule ? DPR.default : DPR; var prefix = "adui-date"; var noop = function noop() {}; var RangePicker = forwardRef(function (_ref, ref) { var _modifiers; var allowClear = _ref.allowClear, className = _ref.className, closeOnSelect = _ref.closeOnSelect, defaultValue = _ref.defaultValue, defaultVisible = _ref.defaultVisible, disabled = _ref.disabled, disabledDays = _ref.disabledDays, dropdownRender = _ref.dropdownRender, _ref$hour = _ref.hour, hour = _ref$hour === void 0 ? 12 : _ref$hour, intent = _ref.intent, maxDate = _ref.maxDate, minDate = _ref.minDate, onChange = _ref.onChange, _onClick = _ref.onClick, onEndDaySelect = _ref.onEndDaySelect, onStartDaySelect = _ref.onStartDaySelect, onVisibleChange = _ref.onVisibleChange, placeholder = _ref.placeholder, placement = _ref.placement, popoverProps = _ref.popoverProps, _renderDay = _ref.renderDay, shortcuts = _ref.shortcuts, sizeProp = _ref.size, theme = _ref.theme, triggerElement = _ref.triggerElement, valueProp = _ref.value, visibleProp = _ref.visible, otherProps = _objectWithoutProperties(_ref, _excluded); var getInitialState = function getInitialState() { var rangeValue = ""; var from; var to; if (valueProp !== null && valueProp !== undefined) { ; var _valueProp = _slicedToArray(valueProp, 2); from = _valueProp[0]; to = _valueProp[1]; rangeValue = convertDateRangeToString(valueProp); } else if (defaultValue !== null && defaultValue !== undefined) { ; var _defaultValue = _slicedToArray(defaultValue, 2); from = _defaultValue[0]; to = _defaultValue[1]; rangeValue = convertDateRangeToString(defaultValue); } return { from: from, month: from, rangeValue: rangeValue, to: to }; }; var initialState = useMemo(getInitialState, []); var _useState = useState(null), _useState2 = _slicedToArray(_useState, 2), enteredTo = _useState2[0], setEnteredTo = _useState2[1]; var _useState3 = useState(initialState.from), _useState4 = _slicedToArray(_useState3, 2), from = _useState4[0], setFrom = _useState4[1]; var _useState5 = useState(initialState.to), _useState6 = _slicedToArray(_useState5, 2), to = _useState6[0], setTo = _useState6[1]; var _useState7 = useState(initialState.month), _useState8 = _slicedToArray(_useState7, 2), month = _useState8[0], setMonth = _useState8[1]; var _useState9 = useState(valueProp), _useState10 = _slicedToArray(_useState9, 2), prevValueProp = _useState10[0], setPrevValueProp = _useState10[1]; var _useState11 = useState(initialState.rangeValue), _useState12 = _slicedToArray(_useState11, 2), rangeValue = _useState12[0], setRangeValue = _useState12[1]; var _useState13 = useState(function () { if (visibleProp !== null && visibleProp !== undefined) { return visibleProp; } if (defaultVisible !== null && defaultVisible !== undefined) { return defaultVisible; } return false; }), _useState14 = _slicedToArray(_useState13, 2), visible = _useState14[0], setVisible = _useState14[1]; var _useState15 = useState("out"), _useState16 = _slicedToArray(_useState15, 2), clearIconState = _useState16[0], setClearIconState = _useState16[1]; var nextClickInsideRef = useRef(false); if (valueProp !== null && valueProp !== undefined && valueProp !== prevValueProp) { setFrom(valueProp[0]); setTo(valueProp[1]); setRangeValue(convertDateRangeToString(valueProp)); setPrevValueProp(valueProp); } if (visibleProp !== null && visible !== !!visibleProp) { setVisible(!!visibleProp); } var inputRef = useRef(null); var dayPickerRef = useRef(null); var _useContext = useContext(ConfigContext), sizeContext = _useContext.size; var size = getComputedSize(sizeProp, sizeContext); var classSet = classNames(className, "".concat(prefix, "-rangeBase"), "".concat(prefix, "-").concat(size)); var fromFinal; var enteredToFinal = to || enteredTo; var isReverse = from && enteredToFinal && DateUtils.isDayAfter(from, enteredToFinal); if (isReverse) { fromFinal = enteredToFinal; enteredToFinal = from; } else { fromFinal = from; } var selectedDays = [fromFinal, { from: fromFinal, to: enteredToFinal }]; var modifiers = (_modifiers = {}, _defineProperty(_modifiers, "".concat(prefix, "-rangeStart"), isReverse ? to && fromFinal : fromFinal), _defineProperty(_modifiers, "".concat(prefix, "-rangeStartHover"), isReverse && !to && fromFinal), _defineProperty(_modifiers, "".concat(prefix, "-rangeEnd"), isReverse ? enteredToFinal : to && enteredToFinal), _defineProperty(_modifiers, "".concat(prefix, "-rangeEndHover"), !isReverse && !to && enteredToFinal), _defineProperty(_modifiers, "".concat(prefix, "-selectedRange"), function selectedRange(day) { return isDayInRange(day, [fromFinal, enteredToFinal], true); }), _modifiers); var shortcutsEnabled = shortcuts && shortcuts.length > 0; var range = [fromFinal, enteredToFinal]; var isDayDisabled = function isDayDisabled(day) { return disabledDays ? disabledDays(day) || DateUtils.isDayBefore(day, minDate) || DateUtils.isDayAfter(day, maxDate) : null; }; var handleVisibleChange = function handleVisibleChange(bool) { if (disabled) { return; } setTimeout(function () { if (nextClickInsideRef.current === true) { nextClickInsideRef.current = false; if (!bool) { return; } } var newVal = convertDateRangeToString([from, to]); if (!bool) { if (!to) { if (newVal) { var rangeReset = rangeValue.split(" - "); setTimeout(function () { setFrom(new Date(rangeReset[0])); setTo(new Date(rangeReset[1])); }, 250); } } else if (rangeValue !== newVal) { setRangeValue(newVal); } } if (onVisibleChange) { onVisibleChange(bool); } if (visibleProp === null) { setVisible(bool); } }, 0); }; var isSelectingFirstDay = function isSelectingFirstDay(fromArg, toArg) { var isRangeSelected = fromArg && toArg; return !fromArg || isRangeSelected; }; var handleDayClick = function handleDayClick(day) { day.setHours(hour, 0, 0, 0); if (DateUtils.isDayBefore(day, minDate) || DateUtils.isDayAfter(day, maxDate)) { return; } if (isSelectingFirstDay(from, to)) { if (onStartDaySelect) { onStartDaySelect(day); } setEnteredTo(null); setFrom(day); setTo(null); } else { if (onEndDaySelect) { onEndDaySelect(day); } var newRange; var fromStr = convertDateToString(from); var toStr = convertDateToString(day); var newRangeValue = ""; if (DateUtils.isDayAfter(day, from)) { newRange = [from, day]; newRangeValue = "".concat(fromStr, " - ").concat(toStr); } else { newRange = [day, from]; newRangeValue = "".concat(toStr, " - ").concat(fromStr); } if (valueProp === null) { setEnteredTo(day); setRangeValue(newRangeValue); setTo(day); } if (onChange) { onChange(newRange); } if (closeOnSelect) { setTimeout(function () { if (onVisibleChange) { onVisibleChange(false); } if (visibleProp === null) { setVisible(false); } }, 100); } } }; var handleDayMouseEnter = function handleDayMouseEnter(day) { if (!isSelectingFirstDay(from, to)) { setEnteredTo(day); } }; var handleDayMouseLeave = function handleDayMouseLeave() { setEnteredTo(null); }; var handleInputChange = function handleInputChange(_ref2) { var target = _ref2.target; var val = target.value; setRangeValue(val); if (val.trim() === "") { if (valueProp === null) { setEnteredTo(null); setFrom(null); setTo(null); } if (onChange) { onChange([undefined, undefined]); } } else if (isLegalDateRangeString(val)) { var rangeValueStrs = val.split(" - "); var newFrom = new Date(rangeValueStrs[0]); var newTo = new Date(rangeValueStrs[1]); newFrom.setHours(hour, 0, 0, 0); newTo.setHours(hour, 0, 0, 0); if (!isDayDisabled(newFrom) && !isDayDisabled(newTo) && !DateUtils.isDayBefore(newTo, newFrom) && !(DateUtils.isSameDay(from, newFrom) && DateUtils.isSameDay(to, newTo))) { if (valueProp === null) { setFrom(newFrom); setTo(newTo); } if (!DateUtils.isSameDay(from, newFrom)) { setMonth(newFrom); } else if (!DateUtils.isSameDay(to, newTo)) { setMonth(newTo); } if (onChange) { onChange([newFrom, newTo]); } } } }; var handleInputFocus = function handleInputFocus() { if (!visible) { if (onVisibleChange) { onVisibleChange(true); } if (visibleProp === null) { setVisible(true); } var _ref3 = inputRef.current || {}, _inputElement = _ref3.input; setTimeout(function () { var selectionStart = _inputElement.selectionStart; if (selectionStart < 12) { setMonth(from); } else if (to) { setMonth(new Date(to.getFullYear(), to.getMonth() - 1)); } }, 0); } }; var handleInputKeyDown = function handleInputKeyDown(_ref4) { var key = _ref4.key; var keys = ["Tab", "Escape", "Enter"]; if (keys.includes(key)) { var _inputRef$current; handleVisibleChange(false); (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 ? void 0 : _inputRef$current.input.blur(); } }; var handleMonthChange = function handleMonthChange(date, e) { if (e) { var target = e.currentTarget; var targetRect = target && target.getBoundingClientRect(); var dayPickerRect = dayPickerRef.current.dayPicker.getBoundingClientRect(); if (target.name === "month" && (targetRect.left - dayPickerRect.left) * 2 > dayPickerRect.width) { date.setMonth(date.getMonth() - 1); } } var newMonth = date; if (DateUtils.isDayAfter(date, maxDate)) { if (maxDate) { newMonth = maxDate; } } else if (DateUtils.isDayBefore(date, minDate)) { if (minDate) { newMonth = minDate; } } setMonth(newMonth); }; useImperativeHandle(ref, function () { return { input: inputRef.current, handleDayClick: handleDayClick, handleVisibleChange: handleVisibleChange }; }); var popupElement = React.createElement(React.Fragment, null, shortcutsEnabled && React.createElement(Shortcuts, { onShortcutClick: function onShortcutClick(valueShortcut) { if (Array.isArray(valueShortcut)) { var fromShortcut = valueShortcut[0]; var toShortcut = valueShortcut[1]; setFrom(fromShortcut); setMonth(fromShortcut); setTo(toShortcut); setRangeValue(convertDateRangeToString(valueShortcut)); if (onChange) { onChange(valueShortcut); } if (closeOnSelect) { setTimeout(function () { setVisible(false); }, 100); } } }, selectedDays: range, shortcuts: shortcuts }), React.createElement(DayPicker, { ref: dayPickerRef, numberOfMonths: 2, disabledDays: isDayDisabled, fromMonth: minDate, toMonth: maxDate, canChangeMonth: true, classNames: styles, month: month, months: MONTHS, weekdaysLong: WEEKDAYS_LONG, weekdaysShort: WEEKDAYS_SHORT, selectedDays: selectedDays, navbarElement: React.createElement(Navbar, _extends({ maxDate: maxDate, minDate: minDate, onManuallyChangeMonth: function onManuallyChangeMonth() { setMonth(minDate); } }, NavbarElementProps)), captionElement: React.createElement(Caption, _extends({ maxDate: maxDate, minDate: minDate, onDateChange: handleMonthChange }, CaptionElementProps)), onDayMouseEnter: handleDayMouseEnter, onDayMouseLeave: handleDayMouseLeave, onDayClick: handleDayClick, renderDay: function renderDay(day) { return React.createElement("div", { className: "".concat(prefix, "-cell") }, _renderDay && _renderDay(day) ? _renderDay(day) : day.getDate()); }, modifiers: modifiers })); var inputElement = React.createElement(Input, _extends({ className: classSet, disabled: disabled, intent: intent, onChange: handleInputChange, onFocus: handleInputFocus, onKeyDown: handleInputKeyDown, onClick: function onClick() { if (_onClick) { _onClick(); } nextClickInsideRef.current = true; }, placeholder: placeholder, ref: inputRef, rightElement: allowClear ? React.createElement(Icon, { icon: clearIconState === "in" ? "cancel-circle" : "calendar-outlined", onMouseEnter: function onMouseEnter() { if (rangeValue) { setClearIconState("in"); } }, onMouseLeave: function onMouseLeave() { setClearIconState("out"); }, onClick: function onClick(e) { if (rangeValue) { e.stopPropagation(); if (valueProp === null) { setEnteredTo(null); setFrom(null); setTo(null); setRangeValue(""); } if (onChange) { onChange([undefined, undefined]); } if (visible) { if (onVisibleChange) { onVisibleChange(false); } if (visibleProp === null) { setVisible(false); } } setTimeout(function () { nextClickInsideRef.current = false; }); } } }) : React.createElement(Icon, { icon: "calendar-outlined", onClick: function onClick() { setTimeout(function () { nextClickInsideRef.current = false; }); } }), size: size, theme: theme, value: rangeValue }, otherProps)); return React.createElement(Popover, _extends({ arrowed: false, onVisibleChange: handleVisibleChange, placement: placement, popup: React.createElement("div", { className: "".concat(prefix, "-popup") }, dropdownRender && dropdownRender(popupElement) ? dropdownRender(popupElement) : popupElement), popupStyle: { width: shortcutsEnabled ? "576px" : "476px", maxWidth: shortcutsEnabled ? "576px" : "476px" }, trigger: "click", visible: visible }, popoverProps), triggerElement || inputElement); }); RangePicker.propTypes = { allowClear: PropTypes.bool, className: PropTypes.string, closeOnSelect: PropTypes.bool, defaultValue: PropTypes.any, defaultVisible: PropTypes.bool, disabled: PropTypes.bool, disabledDays: PropTypes.func, dropdownRender: PropTypes.any, hour: PropTypes.number, intent: PropTypes.oneOf(["normal", "primary", "success", "warning", "danger"]), maxDate: PropTypes.instanceOf(Date), minDate: PropTypes.instanceOf(Date), onChange: PropTypes.func, onEndDaySelect: PropTypes.func, onStartDaySelect: PropTypes.func, onVisibleChange: PropTypes.func, placeholder: PropTypes.string, placement: PropTypes.oneOf(["top", "left", "right", "bottom", "topLeft", "topRight", "bottomLeft", "bottomRight", "leftTop", "leftBottom", "rightTop", "rightBottom"]), popoverProps: PropTypes.object, renderDay: PropTypes.any, shortcuts: PropTypes.any, size: PropTypes.oneOf(["mini", "small", "medium", "large"]), theme: PropTypes.oneOf([null, "light"]), triggerElement: PropTypes.any, value: PropTypes.any, visible: PropTypes.bool }; RangePicker.defaultProps = { allowClear: false, className: "", closeOnSelect: false, defaultValue: null, defaultVisible: null, disabled: false, disabledDays: noop, dropdownRender: undefined, hour: 12, intent: "normal", maxDate: getDefaultMaxDate(), minDate: getDefaultMinDate(), onChange: noop, onEndDaySelect: noop, onStartDaySelect: noop, onVisibleChange: noop, placeholder: "选择日期范围", placement: "bottomLeft", popoverProps: {}, renderDay: undefined, shortcuts: undefined, size: "small", theme: null, triggerElement: undefined, value: null, visible: null }; RangePicker.displayName = "RangePicker"; export default RangePicker; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImZvcndhcmRSZWYiLCJ1c2VDb250ZXh0IiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIlByb3BUeXBlcyIsImNsYXNzTmFtZXMiLCJEUFIiLCJDYXB0aW9uRWxlbWVudFByb3BzIiwiRGF0ZVV0aWxzIiwiTmF2YmFyRWxlbWVudFByb3BzIiwic3R5bGVzIiwiQ29uZmlnQ29udGV4dCIsImdldENvbXB1dGVkU2l6ZSIsIkljb24iLCJJbnB1dCIsIlBvcG92ZXIiLCJDYXB0aW9uIiwiTmF2YmFyIiwiU2hvcnRjdXRzIiwiTU9OVEhTIiwiV0VFS0RBWVNfTE9ORyIsIldFRUtEQVlTX1NIT1JUIiwiZ2V0RGVmYXVsdE1heERhdGUiLCJnZXREZWZhdWx0TWluRGF0ZSIsImlzTGVnYWxEYXRlUmFuZ2VTdHJpbmciLCJjb252ZXJ0RGF0ZVRvU3RyaW5nIiwiY29udmVydERhdGVSYW5nZVRvU3RyaW5nIiwiaXNEYXlJblJhbmdlIiwiRGF5UGlja2VyIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJwcmVmaXgiLCJub29wIiwiUmFuZ2VQaWNrZXIiLCJyZWYiLCJhbGxvd0NsZWFyIiwiY2xhc3NOYW1lIiwiY2xvc2VPblNlbGVjdCIsImRlZmF1bHRWYWx1ZSIsImRlZmF1bHRWaXNpYmxlIiwiZGlzYWJsZWQiLCJkaXNhYmxlZERheXMiLCJkcm9wZG93blJlbmRlciIsImhvdXIiLCJpbnRlbnQiLCJtYXhEYXRlIiwibWluRGF0ZSIsIm9uQ2hhbmdlIiwib25DbGljayIsIm9uRW5kRGF5U2VsZWN0Iiwib25TdGFydERheVNlbGVjdCIsIm9uVmlzaWJsZUNoYW5nZSIsInBsYWNlaG9sZGVyIiwicGxhY2VtZW50IiwicG9wb3ZlclByb3BzIiwicmVuZGVyRGF5Iiwic2hvcnRjdXRzIiwic2l6ZVByb3AiLCJzaXplIiwidGhlbWUiLCJ0cmlnZ2VyRWxlbWVudCIsInZhbHVlUHJvcCIsInZhbHVlIiwidmlzaWJsZVByb3AiLCJ2aXNpYmxlIiwib3RoZXJQcm9wcyIsImdldEluaXRpYWxTdGF0ZSIsInJhbmdlVmFsdWUiLCJmcm9tIiwidG8iLCJ1bmRlZmluZWQiLCJtb250aCIsImluaXRpYWxTdGF0ZSIsImVudGVyZWRUbyIsInNldEVudGVyZWRUbyIsInNldEZyb20iLCJzZXRUbyIsInNldE1vbnRoIiwicHJldlZhbHVlUHJvcCIsInNldFByZXZWYWx1ZVByb3AiLCJzZXRSYW5nZVZhbHVlIiwic2V0VmlzaWJsZSIsImNsZWFySWNvblN0YXRlIiwic2V0Q2xlYXJJY29uU3RhdGUiLCJuZXh0Q2xpY2tJbnNpZGVSZWYiLCJpbnB1dFJlZiIsImRheVBpY2tlclJlZiIsInNpemVDb250ZXh0IiwiY2xhc3NTZXQiLCJmcm9tRmluYWwiLCJlbnRlcmVkVG9GaW5hbCIsImlzUmV2ZXJzZSIsImlzRGF5QWZ0ZXIiLCJzZWxlY3RlZERheXMiLCJtb2RpZmllcnMiLCJkYXkiLCJzaG9ydGN1dHNFbmFibGVkIiwibGVuZ3RoIiwicmFuZ2UiLCJpc0RheURpc2FibGVkIiwiaXNEYXlCZWZvcmUiLCJoYW5kbGVWaXNpYmxlQ2hhbmdlIiwiYm9vbCIsInNldFRpbWVvdXQiLCJjdXJyZW50IiwibmV3VmFsIiwicmFuZ2VSZXNldCIsInNwbGl0IiwiRGF0ZSIsImlzU2VsZWN0aW5nRmlyc3REYXkiLCJmcm9tQXJnIiwidG9BcmciLCJpc1JhbmdlU2VsZWN0ZWQiLCJoYW5kbGVEYXlDbGljayIsInNldEhvdXJzIiwibmV3UmFuZ2UiLCJmcm9tU3RyIiwidG9TdHIiLCJuZXdSYW5nZVZhbHVlIiwiaGFuZGxlRGF5TW91c2VFbnRlciIsImhhbmRsZURheU1vdXNlTGVhdmUiLCJoYW5kbGVJbnB1dENoYW5nZSIsInRhcmdldCIsInZhbCIsInRyaW0iLCJyYW5nZVZhbHVlU3RycyIsIm5ld0Zyb20iLCJuZXdUbyIsImlzU2FtZURheSIsImhhbmRsZUlucHV0Rm9jdXMiLCJpbnB1dEVsZW1lbnQiLCJpbnB1dCIsInNlbGVjdGlvblN0YXJ0IiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImhhbmRsZUlucHV0S2V5RG93biIsImtleSIsImtleXMiLCJpbmNsdWRlcyIsImJsdXIiLCJoYW5kbGVNb250aENoYW5nZSIsImRhdGUiLCJlIiwiY3VycmVudFRhcmdldCIsInRhcmdldFJlY3QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJkYXlQaWNrZXJSZWN0IiwiZGF5UGlja2VyIiwibmFtZSIsImxlZnQiLCJ3aWR0aCIsIm5ld01vbnRoIiwicG9wdXBFbGVtZW50IiwidmFsdWVTaG9ydGN1dCIsIkFycmF5IiwiaXNBcnJheSIsImZyb21TaG9ydGN1dCIsInRvU2hvcnRjdXQiLCJnZXREYXRlIiwic3RvcFByb3BhZ2F0aW9uIiwibWF4V2lkdGgiLCJwcm9wVHlwZXMiLCJzdHJpbmciLCJhbnkiLCJmdW5jIiwibnVtYmVyIiwib25lT2YiLCJpbnN0YW5jZU9mIiwib2JqZWN0IiwiZGVmYXVsdFByb3BzIiwiZGlzcGxheU5hbWUiXSwic291cmNlcyI6WyIuLi8uLi9jb21wb25lbnRzL2RhdGUtcGlja2VyL1JhbmdlUGlja2VyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZHVwbGljYXRlcyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCBSZWFjdCwge1xuICBmb3J3YXJkUmVmLFxuICB1c2VDb250ZXh0LFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlLFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgRFBSIGZyb20gXCJkYXktcGlja2VyLXJlYWN0XCJcbmltcG9ydCB7XG4gIENhcHRpb25FbGVtZW50UHJvcHMsXG4gIERhdGVVdGlscyxcbiAgTmF2YmFyRWxlbWVudFByb3BzLFxufSBmcm9tIFwiZGF5LXBpY2tlci1yZWFjdFwiXG5pbXBvcnQgXCIuL3N0eWxlXCJcbmltcG9ydCBzdHlsZXMgZnJvbSBcIi4vY2xhc3NOYW1lc1wiXG5pbXBvcnQgeyBDb25maWdDb250ZXh0LCBnZXRDb21wdXRlZFNpemUgfSBmcm9tIFwiLi4vY29uZmlnLXByb3ZpZGVyXCJcbmltcG9ydCBJY29uIGZyb20gXCIuLi9pY29uXCJcbmltcG9ydCBJbnB1dCBmcm9tIFwiLi4vaW5wdXRcIlxuaW1wb3J0IHsgUGxhY2VtZW50IH0gZnJvbSBcIi4uL3BvcC10cmlnZ2VyXCJcbmltcG9ydCBQb3BvdmVyLCB7IElQb3BvdmVyUHJvcHMgfSBmcm9tIFwiLi4vcG9wb3ZlclwiXG5pbXBvcnQgQ2FwdGlvbiBmcm9tIFwiLi9DYXB0aW9uXCJcbmltcG9ydCBOYXZiYXIgZnJvbSBcIi4vTmF2YmFyXCJcbmltcG9ydCBTaG9ydGN1dHMgZnJvbSBcIi4vU2hvcnRjdXRzXCJcbmltcG9ydCB7XG4gIE1PTlRIUyxcbiAgV0VFS0RBWVNfTE9ORyxcbiAgV0VFS0RBWVNfU0hPUlQsXG4gIGdldERlZmF1bHRNYXhEYXRlLFxuICBnZXREZWZhdWx0TWluRGF0ZSxcbiAgaXNMZWdhbERhdGVSYW5nZVN0cmluZyxcbiAgY29udmVydERhdGVUb1N0cmluZyxcbiAgY29udmVydERhdGVSYW5nZVRvU3RyaW5nLFxuICBpc0RheUluUmFuZ2UsXG59IGZyb20gXCIuL2NvcmVcIlxuXG5jb25zdCBEYXlQaWNrZXIgPSBEUFIuX19lc01vZHVsZSA/IERQUi5kZWZhdWx0IDogRFBSXG5jb25zdCBwcmVmaXggPSBcImFkdWktZGF0ZVwiXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuZXhwb3J0IGludGVyZmFjZSBJUmFuZ2VQaWNrZXJQcm9wcyB7XG4gIFtrZXk6IHN0cmluZ106IGFueVxuICAvKipcbiAgICog5piv5ZCm5pSv5oyB5riF6ZmkXG4gICAqL1xuICBhbGxvd0NsZWFyPzogYm9vbGVhblxuICAvKipcbiAgICog6ZmE5Yqg57G75ZCNXG4gICAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOaYr+WQpuWcqOmAieaLqeWQju+8jOa2iOWksSBQb3BvdmVyXG4gICAqL1xuICBjbG9zZU9uU2VsZWN0PzogYm9vbGVhblxuICAvKipcbiAgICog5YaF6YOo6amx5Yqo77ya6buY6K6k5pel5pyf6IyD5Zu0XG4gICAqL1xuICBkZWZhdWx0VmFsdWU/OiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXSB8IG51bGxcbiAgLyoqXG4gICAqIOWGhemDqOmpseWKqO+8mum7mOiupOaYr+WQpuaYvuekuuS4i+aLiVxuICAgKi9cbiAgZGVmYXVsdFZpc2libGU/OiBib29sZWFuIHwgbnVsbFxuICAvKipcbiAgICog5piv5ZCm56aB55SoXG4gICAqL1xuICBkaXNhYmxlZD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIOemgeatoumAieaLqeeahOWkqe+8jGRheSA9PiBib29s77yb5q+P5LiA5aSp5piv55qE5pe26Ze05Li6IDEyOjAwOjAw77yM6L+Z5LiA5Liq5piv55SxIGRheS1waWNrZXItcmVhY3Qg5Yaz5a6a55qE77ybXG4gICAqIOavlOi+g+aXpeacn+eahOaXtuWAmeWwj+W/g+i/meS4gOeCueOAglxuICAgKi9cbiAgZGlzYWJsZWREYXlzPzogKGRhdGU6IERhdGUpID0+IGJvb2xlYW4gfCB2b2lkXG4gIC8qKlxuICAgKiDoh6rlrprkuYnkuIvmi4nmoYblhoXlrrlcbiAgICovXG4gIGRyb3Bkb3duUmVuZGVyPzogKGVsZW1lbnQ6IEpTWC5FbGVtZW50KSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgLyoqXG4gICAqIDIwMjIwNDA3OiDpu5jorqTnmoTml6XmnJ/ml7bpl7TkuLogMTIg54K577yM5Y+v5Lul5L2/55So5q2kIFByb3Ag5L+u5pS55bCP5pe2XG4gICAqL1xuICBob3VyPzogbnVtYmVyXG4gIC8qKlxuICAgKiDorr7nva7ovpPlhaXmoYbnsbvlnotcbiAgICovXG4gIGludGVudD86IFwibm9ybWFsXCIgfCBcInByaW1hcnlcIiB8IFwic3VjY2Vzc1wiIHwgXCJ3YXJuaW5nXCIgfCBcImRhbmdlclwiXG4gIC8qKlxuICAgKiDmnIDlpKfpmZDliLbml6XmnJ9cbiAgICovXG4gIG1heERhdGU/OiBEYXRlXG4gIC8qKlxuICAgKiDmnIDlsI/pmZDliLbml6XmnJ9cbiAgICovXG4gIG1pbkRhdGU/OiBEYXRlXG4gIC8qKlxuICAgKiDml6XmnJ/mlLnlj5jml7bnmoQgaGFuZGxlclxuICAgKi9cbiAgb25DaGFuZ2U/OiAoZGF0ZTogW0RhdGUgfCBudWxsIHwgdW5kZWZpbmVkLCBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZF0pID0+IHZvaWRcbiAgLyoqXG4gICAqIOesrOS6jOasoeeCueWHu+S6huaXpeacn+aXtueahCBoYW5kbGVy77yM5Y2z57uT5p2f6YCJ5oupXG4gICAqL1xuICBvbkVuZERheVNlbGVjdD86IChkYXRlOiBEYXRlKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDnrKzkuIDmrKHngrnlh7vkuobml6XmnJ/ml7bnmoQgaGFuZGxlcu+8jOWNs+W8gOWni+mAieaLqe+8iOWPr+S7peWcqOatpOaXtuiuvue9riBtYXhEYXRlIG1pbkRhdGXvvIzlrp7njrDmjqfliLbml6XmnJ/pgInmi6nojIPlm7TnmoTlip/og73vvIlcbiAgICovXG4gIG9uU3RhcnREYXlTZWxlY3Q/OiAoZGF0ZTogRGF0ZSkgPT4gdm9pZFxuICAvKipcbiAgICog5pi+56S654q25oCB5Y+R55Sf5Y+Y5YyW5pe255qEaGFuZGxlclxuICAgKi9cbiAgb25WaXNpYmxlQ2hhbmdlPzogKHZpc2libGU6IGJvb2xlYW4pID0+IHZvaWRcbiAgLyoqXG4gICAqIOWNoOS9jeWtl+esplxuICAgKi9cbiAgcGxhY2Vob2xkZXI/OiBzdHJpbmdcbiAgLyoqXG4gICAqIOW8ueWHuuWxguS9jee9rlxuICAgKi9cbiAgcGxhY2VtZW50PzogUGxhY2VtZW50XG4gIC8qKlxuICAgKiDkvKDlhaUgUG9wb3ZlciDnmoQgcHJvcHNcbiAgICovXG4gIHBvcG92ZXJQcm9wcz86IElQb3BvdmVyUHJvcHNcbiAgLyoqXG4gICAqIOiHquWumuS5ieWmguS9lea4suafk+avj+S4quaXpeacn1xuICAgKi9cbiAgcmVuZGVyRGF5PzogKGRheTogRGF0ZSkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiDlv6vmjbfpgInmi6npobnvvIzmoLzlvI/vvJpcbiAgICogW3tcbiAgICogbGFiZWw6IFwi56WW5Zu95q+N5Lqy55Sf5pelXCIsIHZhbHVlOiBbbmV3IERhdGUoXCIyMDIyLTEwLTAxXCIpLCBuZXcgRGF0ZShcIjIwMjItMTAtMDdcIildXG4gICAqIH1dXG4gICAqL1xuICBzaG9ydGN1dHM/OiB7XG4gICAgLyoqXG4gICAgICog6K+l6aG555qE5paH5a2XXG4gICAgICovXG4gICAgbGFiZWw6IFJlYWN0LlJlYWN0Tm9kZVxuICAgIC8qKlxuICAgICAqIOivpemhueeahOaXpeacn1xuICAgICAqL1xuICAgIHZhbHVlOiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXVxuICB9W11cbiAgLyoqXG4gICAqIOiuvue9ruWwuuWvuFxuICAgKi9cbiAgc2l6ZT86IFwibWluaVwiIHwgXCJzbWFsbFwiIHwgXCJtZWRpdW1cIiB8IFwibGFyZ2VcIlxuICAvKipcbiAgICog6K6+572u5Li76aKYXG4gICAqL1xuICB0aGVtZT86IG51bGwgfCBcImxpZ2h0XCJcbiAgLyoqXG4gICAqIOiHquWumuS5ieinpuWPkeS4i+aLieeahOWFg+e0oFxuICAgKi9cbiAgdHJpZ2dlckVsZW1lbnQ/OiBKU1guRWxlbWVudFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5b2T5YmN5pel5pyf6IyD5Zu0XG4gICAqL1xuICB2YWx1ZT86IFtEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgRGF0ZSB8IG51bGwgfCB1bmRlZmluZWRdIHwgbnVsbFxuICAvKipcbiAgICog5aSW6YOo5o6n5Yi277ya5piv5ZCm5pi+56S65LiL5ouJ6YCJ5oupXG4gICAqL1xuICB2aXNpYmxlPzogYm9vbGVhbiB8IG51bGxcbn1cblxuLyoqXG4gKiDml6XmnJ/pgInmi6nlmajnlKjkuo7kuobop6PlvZPliY3lt7LpgInml6XmnJ/vvIzpgInmi6nmiJbovpPlhaXpnIDopoHnmoTml6XmnJ/jgIHml6XmnJ/ojIPlm7TnrYnjgIJcbiAqL1xuY29uc3QgUmFuZ2VQaWNrZXI6IFJlYWN0LkZvcndhcmRSZWZFeG90aWNDb21wb25lbnQ8XG4gIElSYW5nZVBpY2tlclByb3BzICYgUmVhY3QuUmVmQXR0cmlidXRlczxhbnk+XG4+ID0gZm9yd2FyZFJlZihcbiAgKFxuICAgIHtcbiAgICAgIGFsbG93Q2xlYXIsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBjbG9zZU9uU2VsZWN0LFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgZGVmYXVsdFZpc2libGUsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGRpc2FibGVkRGF5cyxcbiAgICAgIGRyb3Bkb3duUmVuZGVyLFxuICAgICAgaG91ciA9IDEyLFxuICAgICAgaW50ZW50LFxuICAgICAgbWF4RGF0ZSxcbiAgICAgIG1pbkRhdGUsXG4gICAgICBvbkNoYW5nZSxcbiAgICAgIG9uQ2xpY2ssXG4gICAgICBvbkVuZERheVNlbGVjdCxcbiAgICAgIG9uU3RhcnREYXlTZWxlY3QsXG4gICAgICBvblZpc2libGVDaGFuZ2UsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHBsYWNlbWVudCxcbiAgICAgIHBvcG92ZXJQcm9wcyxcbiAgICAgIHJlbmRlckRheSxcbiAgICAgIHNob3J0Y3V0cyxcbiAgICAgIHNpemU6IHNpemVQcm9wLFxuICAgICAgdGhlbWUsXG4gICAgICB0cmlnZ2VyRWxlbWVudCxcbiAgICAgIHZhbHVlOiB2YWx1ZVByb3AsXG4gICAgICB2aXNpYmxlOiB2aXNpYmxlUHJvcCxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9OiBJUmFuZ2VQaWNrZXJQcm9wcyxcbiAgICByZWZcbiAgKSA9PiB7XG4gICAgLyoqXG4gICAgICogc2VsZWN0ZWREYXkg5Li65Lyg57uZIERheVBpY2tlciDnmoTmnIDnu4ggRGF0ZSBPYmplY3TvvIxcbiAgICAgKiB2YWx1ZSDkuLogaW5wdXQg55qE6L6T5YWlIFN0cmluZ+OAglxuICAgICAqL1xuICAgIGNvbnN0IGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IHtcbiAgICAgIGxldCByYW5nZVZhbHVlID0gXCJcIlxuICAgICAgbGV0IGZyb21cbiAgICAgIGxldCB0b1xuICAgICAgaWYgKHZhbHVlUHJvcCAhPT0gbnVsbCAmJiB2YWx1ZVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICA7W2Zyb20sIHRvXSA9IHZhbHVlUHJvcFxuICAgICAgICByYW5nZVZhbHVlID0gY29udmVydERhdGVSYW5nZVRvU3RyaW5nKHZhbHVlUHJvcClcbiAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlICE9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIDtbZnJvbSwgdG9dID0gZGVmYXVsdFZhbHVlXG4gICAgICAgIHJhbmdlVmFsdWUgPSBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcoZGVmYXVsdFZhbHVlKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmcm9tLFxuICAgICAgICBtb250aDogZnJvbSxcbiAgICAgICAgcmFuZ2VWYWx1ZSxcbiAgICAgICAgdG8sXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0gdXNlTWVtbyhnZXRJbml0aWFsU3RhdGUsIFtdKVxuXG4gICAgY29uc3QgW2VudGVyZWRUbywgc2V0RW50ZXJlZFRvXSA9IHVzZVN0YXRlPERhdGUgfCBudWxsIHwgdW5kZWZpbmVkPihudWxsKVxuICAgIGNvbnN0IFtmcm9tLCBzZXRGcm9tXSA9IHVzZVN0YXRlPERhdGUgfCBudWxsIHwgdW5kZWZpbmVkPihpbml0aWFsU3RhdGUuZnJvbSlcbiAgICBjb25zdCBbdG8sIHNldFRvXSA9IHVzZVN0YXRlPERhdGUgfCBudWxsIHwgdW5kZWZpbmVkPihpbml0aWFsU3RhdGUudG8pXG4gICAgY29uc3QgW21vbnRoLCBzZXRNb250aF0gPSB1c2VTdGF0ZTxEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZD4oXG4gICAgICBpbml0aWFsU3RhdGUubW9udGhcbiAgICApXG4gICAgY29uc3QgW3ByZXZWYWx1ZVByb3AsIHNldFByZXZWYWx1ZVByb3BdID0gdXNlU3RhdGU8XG4gICAgICBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXSB8IG51bGwgfCB1bmRlZmluZWRcbiAgICA+KHZhbHVlUHJvcClcbiAgICBjb25zdCBbcmFuZ2VWYWx1ZSwgc2V0UmFuZ2VWYWx1ZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFxuICAgICAgaW5pdGlhbFN0YXRlLnJhbmdlVmFsdWVcbiAgICApXG4gICAgY29uc3QgW3Zpc2libGUsIHNldFZpc2libGVdID0gdXNlU3RhdGU8Ym9vbGVhbj4oKCkgPT4ge1xuICAgICAgaWYgKHZpc2libGVQcm9wICE9PSBudWxsICYmIHZpc2libGVQcm9wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZpc2libGVQcm9wXG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZpc2libGUgIT09IG51bGwgJiYgZGVmYXVsdFZpc2libGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZpc2libGVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0pXG4gICAgY29uc3QgW2NsZWFySWNvblN0YXRlLCBzZXRDbGVhckljb25TdGF0ZV0gPSB1c2VTdGF0ZTxcImluXCIgfCBcIm91dFwiPihcIm91dFwiKVxuICAgIGNvbnN0IG5leHRDbGlja0luc2lkZVJlZiA9IHVzZVJlZihmYWxzZSlcblxuICAgIC8vIOebuOW9k+S6jueUn+WRveWRqOacnyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNcbiAgICBpZiAoXG4gICAgICB2YWx1ZVByb3AgIT09IG51bGwgJiZcbiAgICAgIHZhbHVlUHJvcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICB2YWx1ZVByb3AgIT09IHByZXZWYWx1ZVByb3BcbiAgICApIHtcbiAgICAgIHNldEZyb20odmFsdWVQcm9wWzBdKVxuICAgICAgc2V0VG8odmFsdWVQcm9wWzFdKVxuICAgICAgc2V0UmFuZ2VWYWx1ZShjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcodmFsdWVQcm9wKSlcbiAgICAgIHNldFByZXZWYWx1ZVByb3AodmFsdWVQcm9wKVxuICAgIH1cbiAgICBpZiAodmlzaWJsZVByb3AgIT09IG51bGwgJiYgdmlzaWJsZSAhPT0gISF2aXNpYmxlUHJvcCkge1xuICAgICAgc2V0VmlzaWJsZSghIXZpc2libGVQcm9wKVxuICAgIH1cblxuICAgIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmPGFueT4obnVsbClcbiAgICBjb25zdCBkYXlQaWNrZXJSZWYgPSB1c2VSZWY8YW55PihudWxsKVxuXG4gICAgY29uc3QgeyBzaXplOiBzaXplQ29udGV4dCB9ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KVxuICAgIGNvbnN0IHNpemUgPSBnZXRDb21wdXRlZFNpemUoc2l6ZVByb3AsIHNpemVDb250ZXh0KVxuXG4gICAgY29uc3QgY2xhc3NTZXQgPSBjbGFzc05hbWVzKFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgYCR7cHJlZml4fS1yYW5nZUJhc2VgLFxuICAgICAgYCR7cHJlZml4fS0ke3NpemV9YFxuICAgIClcblxuICAgIGxldCBmcm9tRmluYWw6IERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgbGV0IGVudGVyZWRUb0ZpbmFsID0gdG8gfHwgZW50ZXJlZFRvXG4gICAgY29uc3QgaXNSZXZlcnNlID1cbiAgICAgIGZyb20gJiYgZW50ZXJlZFRvRmluYWwgJiYgRGF0ZVV0aWxzLmlzRGF5QWZ0ZXIoZnJvbSwgZW50ZXJlZFRvRmluYWwpXG4gICAgaWYgKGlzUmV2ZXJzZSkge1xuICAgICAgZnJvbUZpbmFsID0gZW50ZXJlZFRvRmluYWxcbiAgICAgIGVudGVyZWRUb0ZpbmFsID0gZnJvbVxuICAgIH0gZWxzZSB7XG4gICAgICBmcm9tRmluYWwgPSBmcm9tXG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWREYXlzID0gW1xuICAgICAgZnJvbUZpbmFsLFxuICAgICAge1xuICAgICAgICBmcm9tOiBmcm9tRmluYWwsXG4gICAgICAgIHRvOiBlbnRlcmVkVG9GaW5hbCxcbiAgICAgIH0sXG4gICAgXVxuICAgIGNvbnN0IG1vZGlmaWVycyA9IHtcbiAgICAgIFtgJHtwcmVmaXh9LXJhbmdlU3RhcnRgXTogaXNSZXZlcnNlID8gdG8gJiYgZnJvbUZpbmFsIDogZnJvbUZpbmFsLFxuICAgICAgW2Ake3ByZWZpeH0tcmFuZ2VTdGFydEhvdmVyYF06IGlzUmV2ZXJzZSAmJiAhdG8gJiYgZnJvbUZpbmFsLFxuICAgICAgW2Ake3ByZWZpeH0tcmFuZ2VFbmRgXTogaXNSZXZlcnNlID8gZW50ZXJlZFRvRmluYWwgOiB0byAmJiBlbnRlcmVkVG9GaW5hbCxcbiAgICAgIFtgJHtwcmVmaXh9LXJhbmdlRW5kSG92ZXJgXTogIWlzUmV2ZXJzZSAmJiAhdG8gJiYgZW50ZXJlZFRvRmluYWwsXG4gICAgICBbYCR7cHJlZml4fS1zZWxlY3RlZFJhbmdlYF06IChkYXk6IERhdGUpID0+XG4gICAgICAgIGlzRGF5SW5SYW5nZShkYXksIFtmcm9tRmluYWwsIGVudGVyZWRUb0ZpbmFsXSwgdHJ1ZSksXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvcnRjdXRzRW5hYmxlZCA9IHNob3J0Y3V0cyAmJiBzaG9ydGN1dHMubGVuZ3RoID4gMFxuXG4gICAgY29uc3QgcmFuZ2U6IFtEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCwgRGF0ZSB8IG51bGwgfCB1bmRlZmluZWRdID0gW1xuICAgICAgZnJvbUZpbmFsLFxuICAgICAgZW50ZXJlZFRvRmluYWwsXG4gICAgXVxuXG4gICAgY29uc3QgaXNEYXlEaXNhYmxlZCA9IChkYXk6IERhdGUpID0+IHtcbiAgICAgIHJldHVybiBkaXNhYmxlZERheXNcbiAgICAgICAgPyBkaXNhYmxlZERheXMoZGF5KSB8fFxuICAgICAgICAgICAgRGF0ZVV0aWxzLmlzRGF5QmVmb3JlKGRheSwgbWluRGF0ZSkgfHxcbiAgICAgICAgICAgIERhdGVVdGlscy5pc0RheUFmdGVyKGRheSwgbWF4RGF0ZSlcbiAgICAgICAgOiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlVmlzaWJsZUNoYW5nZSA9IChib29sOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKG5leHRDbGlja0luc2lkZVJlZi5jdXJyZW50ID09PSB0cnVlKSB7XG4gICAgICAgICAgbmV4dENsaWNrSW5zaWRlUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAgIC8vIOWxleW8gOaXtu+8jOWmguaenOWcqOWGhemDqOWFg+e0oOeCueWHu++8jOWImeS4jeWBmum7mOiupOeahOaUtui1t+aTjeS9nFxuICAgICAgICAgIGlmICghYm9vbCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbCA9IGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyhbZnJvbSwgdG9dKVxuICAgICAgICBpZiAoIWJvb2wpIHtcbiAgICAgICAgICBpZiAoIXRvKSB7XG4gICAgICAgICAgICBpZiAobmV3VmFsKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJhbmdlUmVzZXQgPSByYW5nZVZhbHVlLnNwbGl0KFwiIC0gXCIpXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldEZyb20obmV3IERhdGUocmFuZ2VSZXNldFswXSkpXG4gICAgICAgICAgICAgICAgc2V0VG8obmV3IERhdGUocmFuZ2VSZXNldFsxXSkpXG4gICAgICAgICAgICAgIH0sIDI1MClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHJhbmdlVmFsdWUgIT09IG5ld1ZhbCkge1xuICAgICAgICAgICAgc2V0UmFuZ2VWYWx1ZShuZXdWYWwpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgICAgICBvblZpc2libGVDaGFuZ2UoYm9vbClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRWaXNpYmxlKGJvb2wpXG4gICAgICAgIH1cbiAgICAgIH0sIDApXG4gICAgfVxuXG4gICAgY29uc3QgaXNTZWxlY3RpbmdGaXJzdERheSA9IChcbiAgICAgIGZyb21Bcmc/OiBEYXRlIHwgbnVsbCxcbiAgICAgIHRvQXJnPzogRGF0ZSB8IG51bGxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGlzUmFuZ2VTZWxlY3RlZCA9IGZyb21BcmcgJiYgdG9BcmdcbiAgICAgIHJldHVybiAhZnJvbUFyZyB8fCBpc1JhbmdlU2VsZWN0ZWRcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVEYXlDbGljayA9IChkYXk6IERhdGUpID0+IHtcbiAgICAgIGRheS5zZXRIb3Vycyhob3VyLCAwLCAwLCAwKVxuICAgICAgaWYgKFxuICAgICAgICBEYXRlVXRpbHMuaXNEYXlCZWZvcmUoZGF5LCBtaW5EYXRlKSB8fFxuICAgICAgICBEYXRlVXRpbHMuaXNEYXlBZnRlcihkYXksIG1heERhdGUpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoaXNTZWxlY3RpbmdGaXJzdERheShmcm9tLCB0bykpIHtcbiAgICAgICAgaWYgKG9uU3RhcnREYXlTZWxlY3QpIHtcbiAgICAgICAgICBvblN0YXJ0RGF5U2VsZWN0KGRheSlcbiAgICAgICAgfVxuICAgICAgICBzZXRFbnRlcmVkVG8obnVsbClcbiAgICAgICAgc2V0RnJvbShkYXkpXG4gICAgICAgIHNldFRvKG51bGwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob25FbmREYXlTZWxlY3QpIHtcbiAgICAgICAgICBvbkVuZERheVNlbGVjdChkYXkpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IG5ld1JhbmdlOiBbRGF0ZSB8IG51bGwgfCB1bmRlZmluZWQsIERhdGUgfCBudWxsIHwgdW5kZWZpbmVkXVxuICAgICAgICBjb25zdCBmcm9tU3RyID0gY29udmVydERhdGVUb1N0cmluZyhmcm9tKVxuICAgICAgICBjb25zdCB0b1N0ciA9IGNvbnZlcnREYXRlVG9TdHJpbmcoZGF5KVxuICAgICAgICBsZXQgbmV3UmFuZ2VWYWx1ZSA9IFwiXCJcbiAgICAgICAgaWYgKERhdGVVdGlscy5pc0RheUFmdGVyKGRheSwgZnJvbSkpIHtcbiAgICAgICAgICBuZXdSYW5nZSA9IFtmcm9tLCBkYXldXG4gICAgICAgICAgbmV3UmFuZ2VWYWx1ZSA9IGAke2Zyb21TdHJ9IC0gJHt0b1N0cn1gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3UmFuZ2UgPSBbZGF5LCBmcm9tXVxuICAgICAgICAgIG5ld1JhbmdlVmFsdWUgPSBgJHt0b1N0cn0gLSAke2Zyb21TdHJ9YFxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZVByb3AgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRFbnRlcmVkVG8oZGF5KVxuICAgICAgICAgIHNldFJhbmdlVmFsdWUobmV3UmFuZ2VWYWx1ZSlcbiAgICAgICAgICBzZXRUbyhkYXkpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgb25DaGFuZ2UobmV3UmFuZ2UpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNsb3NlT25TZWxlY3QpIHtcbiAgICAgICAgICAvLyDlu7bov5/mmK/kuLrkuoborqnnirbmgIHnmoTlj5jljJblnKjop4bop4nkuIrlhYjooqvmjqXlj5dcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgb25WaXNpYmxlQ2hhbmdlKGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpc2libGVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHNldFZpc2libGUoZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMTAwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlRGF5TW91c2VFbnRlciA9IChkYXk6IERhdGUpID0+IHtcbiAgICAgIGlmICghaXNTZWxlY3RpbmdGaXJzdERheShmcm9tLCB0bykpIHtcbiAgICAgICAgc2V0RW50ZXJlZFRvKGRheSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVEYXlNb3VzZUxlYXZlID0gKCkgPT4ge1xuICAgICAgc2V0RW50ZXJlZFRvKG51bGwpXG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoe1xuICAgICAgdGFyZ2V0LFxuICAgIH06IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCB7IHZhbHVlOiB2YWwgfSA9IHRhcmdldFxuICAgICAgc2V0UmFuZ2VWYWx1ZSh2YWwpXG4gICAgICBpZiAodmFsLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0RW50ZXJlZFRvKG51bGwpXG4gICAgICAgICAgc2V0RnJvbShudWxsKVxuICAgICAgICAgIHNldFRvKG51bGwpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgb25DaGFuZ2UoW3VuZGVmaW5lZCwgdW5kZWZpbmVkXSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0xlZ2FsRGF0ZVJhbmdlU3RyaW5nKHZhbCkpIHtcbiAgICAgICAgY29uc3QgcmFuZ2VWYWx1ZVN0cnMgPSB2YWwuc3BsaXQoXCIgLSBcIilcbiAgICAgICAgY29uc3QgbmV3RnJvbSA9IG5ldyBEYXRlKHJhbmdlVmFsdWVTdHJzWzBdKVxuICAgICAgICBjb25zdCBuZXdUbyA9IG5ldyBEYXRlKHJhbmdlVmFsdWVTdHJzWzFdKVxuICAgICAgICBuZXdGcm9tLnNldEhvdXJzKGhvdXIsIDAsIDAsIDApXG4gICAgICAgIG5ld1RvLnNldEhvdXJzKGhvdXIsIDAsIDAsIDApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhaXNEYXlEaXNhYmxlZChuZXdGcm9tKSAmJlxuICAgICAgICAgICFpc0RheURpc2FibGVkKG5ld1RvKSAmJlxuICAgICAgICAgICFEYXRlVXRpbHMuaXNEYXlCZWZvcmUobmV3VG8sIG5ld0Zyb20pICYmXG4gICAgICAgICAgIShcbiAgICAgICAgICAgIERhdGVVdGlscy5pc1NhbWVEYXkoZnJvbSwgbmV3RnJvbSkgJiYgRGF0ZVV0aWxzLmlzU2FtZURheSh0bywgbmV3VG8pXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgICBzZXRGcm9tKG5ld0Zyb20pXG4gICAgICAgICAgICBzZXRUbyhuZXdUbylcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g5L+u5pS55pel5pyf5ZCO55qEIG1vbnRoIOi3s+i9rFxuICAgICAgICAgIGlmICghRGF0ZVV0aWxzLmlzU2FtZURheShmcm9tLCBuZXdGcm9tKSkge1xuICAgICAgICAgICAgc2V0TW9udGgobmV3RnJvbSlcbiAgICAgICAgICB9IGVsc2UgaWYgKCFEYXRlVXRpbHMuaXNTYW1lRGF5KHRvLCBuZXdUbykpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKG5ld1RvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgICAgIG9uQ2hhbmdlKFtuZXdGcm9tLCBuZXdUb10pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlSW5wdXRGb2N1cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlzaWJsZSkge1xuICAgICAgICBpZiAob25WaXNpYmxlQ2hhbmdlKSB7XG4gICAgICAgICAgb25WaXNpYmxlQ2hhbmdlKHRydWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpc2libGVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0VmlzaWJsZSh0cnVlKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaW5wdXQ6IGlucHV0RWxlbWVudCB9ID0gaW5wdXRSZWYuY3VycmVudCB8fCB7fVxuICAgICAgICAvLyBnZXQgaW5wdXQgY3Vyc29yIHBvc2l0aW9uIHdoZW4gZm9jdXNlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0IH0gPSBpbnB1dEVsZW1lbnRcbiAgICAgICAgICAvLyDlsI/kuo4gMTIg5Luj6KGoIGZvY3VzIOWIsOeahOaYryBmcm9tIGRhdGVcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPCAxMikge1xuICAgICAgICAgICAgc2V0TW9udGgoZnJvbSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHRvKSB7XG4gICAgICAgICAgICBzZXRNb250aChuZXcgRGF0ZSh0by5nZXRGdWxsWWVhcigpLCB0by5nZXRNb250aCgpIC0gMSkpXG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUlucHV0S2V5RG93biA9ICh7XG4gICAgICBrZXksXG4gICAgfTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3Qga2V5cyA9IFtcIlRhYlwiLCBcIkVzY2FwZVwiLCBcIkVudGVyXCJdXG4gICAgICBpZiAoa2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIGhhbmRsZVZpc2libGVDaGFuZ2UoZmFsc2UpXG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQ/LmlucHV0LmJsdXIoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZU1vbnRoQ2hhbmdlID0gKFxuICAgICAgZGF0ZTogRGF0ZSxcbiAgICAgIGU6IFJlYWN0LkZvcm1FdmVudDxIVE1MU2VsZWN0RWxlbWVudD5cbiAgICApID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldDogdGFyZ2V0IH0gPSBlXG4gICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgIGNvbnN0IGRheVBpY2tlclJlY3QgPVxuICAgICAgICAgIGRheVBpY2tlclJlZi5jdXJyZW50LmRheVBpY2tlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0YXJnZXQubmFtZSA9PT0gXCJtb250aFwiICYmXG4gICAgICAgICAgKHRhcmdldFJlY3QubGVmdCAtIGRheVBpY2tlclJlY3QubGVmdCkgKiAyID4gZGF5UGlja2VyUmVjdC53aWR0aFxuICAgICAgICApIHtcbiAgICAgICAgICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSAtIDEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxldCBuZXdNb250aCA9IGRhdGVcbiAgICAgIGlmIChEYXRlVXRpbHMuaXNEYXlBZnRlcihkYXRlLCBtYXhEYXRlKSkge1xuICAgICAgICBpZiAobWF4RGF0ZSkge1xuICAgICAgICAgIG5ld01vbnRoID0gbWF4RGF0ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKERhdGVVdGlscy5pc0RheUJlZm9yZShkYXRlLCBtaW5EYXRlKSkge1xuICAgICAgICBpZiAobWluRGF0ZSkge1xuICAgICAgICAgIG5ld01vbnRoID0gbWluRGF0ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRNb250aChuZXdNb250aClcbiAgICB9XG5cbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICAgIGlucHV0OiBpbnB1dFJlZi5jdXJyZW50LFxuICAgICAgaGFuZGxlRGF5Q2xpY2ssXG4gICAgICBoYW5kbGVWaXNpYmxlQ2hhbmdlLFxuICAgIH0pKVxuXG4gICAgY29uc3QgcG9wdXBFbGVtZW50ID0gKFxuICAgICAgPD5cbiAgICAgICAge3Nob3J0Y3V0c0VuYWJsZWQgJiYgKFxuICAgICAgICAgIDxTaG9ydGN1dHNcbiAgICAgICAgICAgIG9uU2hvcnRjdXRDbGljaz17KHZhbHVlU2hvcnRjdXQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVTaG9ydGN1dCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tU2hvcnRjdXQgPSB2YWx1ZVNob3J0Y3V0WzBdXG4gICAgICAgICAgICAgICAgY29uc3QgdG9TaG9ydGN1dCA9IHZhbHVlU2hvcnRjdXRbMV1cbiAgICAgICAgICAgICAgICBzZXRGcm9tKGZyb21TaG9ydGN1dClcbiAgICAgICAgICAgICAgICBzZXRNb250aChmcm9tU2hvcnRjdXQpXG4gICAgICAgICAgICAgICAgc2V0VG8odG9TaG9ydGN1dClcbiAgICAgICAgICAgICAgICBzZXRSYW5nZVZhbHVlKGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWx1ZVNob3J0Y3V0KSlcblxuICAgICAgICAgICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodmFsdWVTaG9ydGN1dClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xvc2VPblNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgLy8g5bu26L+f5piv5Li65LqG6K6p54q25oCB55qE5Y+Y5YyW5Zyo6KeG6KeJ5LiK5YWI6KKr5o6l5Y+XXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSlcbiAgICAgICAgICAgICAgICAgIH0sIDEwMClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBzZWxlY3RlZERheXM9e3JhbmdlfVxuICAgICAgICAgICAgc2hvcnRjdXRzPXtzaG9ydGN1dHN9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgPERheVBpY2tlclxuICAgICAgICAgIHJlZj17ZGF5UGlja2VyUmVmfVxuICAgICAgICAgIG51bWJlck9mTW9udGhzPXsyfVxuICAgICAgICAgIGRpc2FibGVkRGF5cz17aXNEYXlEaXNhYmxlZH1cbiAgICAgICAgICBmcm9tTW9udGg9e21pbkRhdGV9XG4gICAgICAgICAgdG9Nb250aD17bWF4RGF0ZX1cbiAgICAgICAgICBjYW5DaGFuZ2VNb250aFxuICAgICAgICAgIGNsYXNzTmFtZXM9e3N0eWxlc31cbiAgICAgICAgICBtb250aD17bW9udGh9XG4gICAgICAgICAgbW9udGhzPXtNT05USFN9XG4gICAgICAgICAgd2Vla2RheXNMb25nPXtXRUVLREFZU19MT05HfVxuICAgICAgICAgIHdlZWtkYXlzU2hvcnQ9e1dFRUtEQVlTX1NIT1JUfVxuICAgICAgICAgIHNlbGVjdGVkRGF5cz17c2VsZWN0ZWREYXlzfVxuICAgICAgICAgIG5hdmJhckVsZW1lbnQ9e1xuICAgICAgICAgICAgPE5hdmJhclxuICAgICAgICAgICAgICBtYXhEYXRlPXttYXhEYXRlfVxuICAgICAgICAgICAgICBtaW5EYXRlPXttaW5EYXRlfVxuICAgICAgICAgICAgICBvbk1hbnVhbGx5Q2hhbmdlTW9udGg9eygpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRNb250aChtaW5EYXRlKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICB7Li4uTmF2YmFyRWxlbWVudFByb3BzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgY2FwdGlvbkVsZW1lbnQ9e1xuICAgICAgICAgICAgPENhcHRpb25cbiAgICAgICAgICAgICAgbWF4RGF0ZT17bWF4RGF0ZX1cbiAgICAgICAgICAgICAgbWluRGF0ZT17bWluRGF0ZX1cbiAgICAgICAgICAgICAgb25EYXRlQ2hhbmdlPXtoYW5kbGVNb250aENoYW5nZX1cbiAgICAgICAgICAgICAgey4uLkNhcHRpb25FbGVtZW50UHJvcHN9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBvbkRheU1vdXNlRW50ZXI9e2hhbmRsZURheU1vdXNlRW50ZXJ9XG4gICAgICAgICAgb25EYXlNb3VzZUxlYXZlPXtoYW5kbGVEYXlNb3VzZUxlYXZlfVxuICAgICAgICAgIG9uRGF5Q2xpY2s9e2hhbmRsZURheUNsaWNrfVxuICAgICAgICAgIHJlbmRlckRheT17KGRheTogRGF0ZSkgPT4gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3ByZWZpeH0tY2VsbGB9PlxuICAgICAgICAgICAgICB7cmVuZGVyRGF5ICYmIHJlbmRlckRheShkYXkpID8gcmVuZGVyRGF5KGRheSkgOiBkYXkuZ2V0RGF0ZSgpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICBtb2RpZmllcnM9e21vZGlmaWVyc31cbiAgICAgICAgLz5cbiAgICAgIDwvPlxuICAgIClcblxuICAgIGNvbnN0IGlucHV0RWxlbWVudCA9IChcbiAgICAgIDxJbnB1dFxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzU2V0fVxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XG4gICAgICAgIGludGVudD17aW50ZW50fVxuICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgIG9uRm9jdXM9e2hhbmRsZUlucHV0Rm9jdXN9XG4gICAgICAgIG9uS2V5RG93bj17aGFuZGxlSW5wdXRLZXlEb3dufVxuICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgICAgICAgIG9uQ2xpY2soKVxuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0Q2xpY2tJbnNpZGVSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgfX1cbiAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICByZWY9e2lucHV0UmVmfVxuICAgICAgICByaWdodEVsZW1lbnQ9e1xuICAgICAgICAgIGFsbG93Q2xlYXIgPyAoXG4gICAgICAgICAgICA8SWNvblxuICAgICAgICAgICAgICBpY29uPXtcbiAgICAgICAgICAgICAgICBjbGVhckljb25TdGF0ZSA9PT0gXCJpblwiID8gXCJjYW5jZWwtY2lyY2xlXCIgOiBcImNhbGVuZGFyLW91dGxpbmVkXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2VWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgc2V0Q2xlYXJJY29uU3RhdGUoXCJpblwiKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0Q2xlYXJJY29uU3RhdGUoXCJvdXRcIilcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2VWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlUHJvcCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXRFbnRlcmVkVG8obnVsbClcbiAgICAgICAgICAgICAgICAgICAgc2V0RnJvbShudWxsKVxuICAgICAgICAgICAgICAgICAgICBzZXRUbyhudWxsKVxuICAgICAgICAgICAgICAgICAgICBzZXRSYW5nZVZhbHVlKFwiXCIpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UoW3VuZGVmaW5lZCwgdW5kZWZpbmVkXSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvblZpc2libGVDaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICBvblZpc2libGVDaGFuZ2UoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpc2libGVQcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dENsaWNrSW5zaWRlUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8SWNvblxuICAgICAgICAgICAgICBpY29uPVwiY2FsZW5kYXItb3V0bGluZWRcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gc2V0VGltZW91dCDnlKjkuo7opobnm5YgSW5wdXQg5pys6Lqr6K6+572u55qEIG5leHRDbGlja0luc2lkZVJlZlxuICAgICAgICAgICAgICAgIC8vIOazqOaEjyDkuIvkuIDmrKEgaGFuZGxlVmlzaWJsZUNoYW5nZSDosIPnlKjkuK3nmoQgc2V0VGltZW9