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>
345 lines (294 loc) • 44.2 kB
JavaScript
var _excluded = ["className", "closeOnSelect", "defaultValue", "disabled", "disabledHours", "disabledMinutes", "disabledSeconds", "maxTime", "minTime", "onChange", "onlyHour", "placeholder", "popoverProps", "secondsAvailable", "size", "value"];
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 ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
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, useRef, useState, useMemo } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import { ConfigContext, getComputedSize } from "../config-provider";
import Icon from "../icon";
import Input from "../input";
import Popover from "../popover";
import TimeSelect from "./TimeSelect";
import "./style";
import { transformTimeWithSeconds, extractHMSFromTime, isLegalTimeString, isTimeAfter, isTimeBefore } from "./core";
var prefix = "adui-time";
var noop = function noop() {};
var TimePicker = forwardRef(function (_ref, ref) {
var className = _ref.className,
closeOnSelect = _ref.closeOnSelect,
defaultValue = _ref.defaultValue,
disabled = _ref.disabled,
disabledHours = _ref.disabledHours,
disabledMinutes = _ref.disabledMinutes,
disabledSeconds = _ref.disabledSeconds,
maxTime = _ref.maxTime,
minTime = _ref.minTime,
onChange = _ref.onChange,
onlyHour = _ref.onlyHour,
placeholder = _ref.placeholder,
popoverProps = _ref.popoverProps,
_ref$secondsAvailable = _ref.secondsAvailable,
secondsAvailable = _ref$secondsAvailable === void 0 ? false : _ref$secondsAvailable,
sizeProp = _ref.size,
value = _ref.value,
otherProps = _objectWithoutProperties(_ref, _excluded);
var getInitialState = function getInitialState() {
var valueState = value !== null ? value : defaultValue;
var _extractHMSFromTime = extractHMSFromTime(valueState),
hour = _extractHMSFromTime.hour,
minute = _extractHMSFromTime.minute,
second = _extractHMSFromTime.second;
return {
hour: hour,
inputValue: valueState || "",
minute: onlyHour ? "00" : minute,
second: secondsAvailable ? second : "00",
prevValueProp: valueState || "",
visible: false
};
};
var initialState = useMemo(getInitialState, []);
var _useState = useState(initialState.inputValue),
_useState2 = _slicedToArray(_useState, 2),
inputValue = _useState2[0],
setInputValue = _useState2[1];
var _useState3 = useState(initialState.hour),
_useState4 = _slicedToArray(_useState3, 2),
hour = _useState4[0],
setHour = _useState4[1];
var _useState5 = useState(initialState.minute),
_useState6 = _slicedToArray(_useState5, 2),
minute = _useState6[0],
setMinute = _useState6[1];
var _useState7 = useState(initialState.second),
_useState8 = _slicedToArray(_useState7, 2),
second = _useState8[0],
setSecond = _useState8[1];
var _useState9 = useState(initialState.prevValueProp),
_useState10 = _slicedToArray(_useState9, 2),
prevValueProp = _useState10[0],
setPrevValueProp = _useState10[1];
var _useState11 = useState(initialState.visible),
_useState12 = _slicedToArray(_useState11, 2),
visible = _useState12[0],
setVisible = _useState12[1];
if (value !== null && prevValueProp !== value) {
var _extractHMSFromTime2 = extractHMSFromTime(value),
newHour = _extractHMSFromTime2.hour,
newMinute = _extractHMSFromTime2.minute,
newSecond = _extractHMSFromTime2.second;
setInputValue(value || "");
setHour(newHour);
setMinute(onlyHour ? "00" : newMinute);
setSecond(secondsAvailable ? newSecond : "00");
setPrevValueProp(value || "");
}
var inputRef = useRef(null);
var _useContext = useContext(ConfigContext),
sizeContext = _useContext.size;
var size = getComputedSize(sizeProp, sizeContext);
var handleClick = function handleClick(valueNew, type) {
var valueProp = value;
var inputValueNow = "";
if (secondsAvailable) {
if (type === "hour") {
inputValueNow = "".concat(valueNew, ":").concat(minute || "", ":").concat(second || "");
} else if (type === "minute") {
inputValueNow = "".concat(hour || "", ":").concat(valueNew, ":").concat(second || "");
} else {
inputValueNow = "".concat(hour || "", ":").concat(minute || "", ":").concat(valueNew);
}
} else {
inputValueNow = type === "hour" ? "".concat(valueNew, ":").concat(minute || "") : "".concat(hour || "", ":").concat(valueNew);
}
if (maxTime && isTimeAfter(inputValueNow, maxTime)) {
inputValueNow = secondsAvailable ? transformTimeWithSeconds(maxTime) : maxTime;
} else if (minTime && isTimeBefore(inputValueNow, minTime)) {
inputValueNow = secondsAvailable ? transformTimeWithSeconds(minTime) : minTime;
}
if (valueProp === null) {
var valueFinal = _objectSpread({
inputValueNow: inputValueNow
}, extractHMSFromTime(inputValueNow));
setHour(valueFinal.hour);
setMinute(valueFinal.minute);
setSecond(valueFinal.second);
setInputValue(valueFinal.inputValueNow);
}
if (isLegalTimeString({
time: inputValue,
onlyHour: onlyHour
})) {
if (onChange) {
onChange(inputValueNow);
}
if (closeOnSelect) {
setTimeout(function () {
setVisible(false);
}, 120);
}
}
};
var handleVisibleChange = function handleVisibleChange(visibleNew) {
var inputElement = inputRef.current.input;
if (disabled) {
return;
}
setTimeout(function () {
var _document = document,
activeElement = _document.activeElement;
if (visibleNew || !visibleNew && inputElement !== activeElement) {
var withSeconds = hour && minute && second ? "".concat(hour, ":").concat(minute, ":").concat(second) : "";
var noSeconds = hour && minute ? "".concat(hour, ":").concat(minute) : "";
var newInputValue = secondsAvailable ? withSeconds : noSeconds;
if (!visibleNew && inputValue !== newInputValue) {
setInputValue(newInputValue);
}
setVisible(visibleNew);
}
}, 0);
};
var handleInputChange = function handleInputChange(_ref2) {
var inputValueNew = _ref2.target.value;
setInputValue(inputValueNew);
if (inputValueNew === "" || isLegalTimeString({
time: inputValueNew,
onlyHour: onlyHour
}) && !isTimeAfter(inputValueNew, maxTime) && !isTimeBefore(inputValueNew, minTime)) {
var _extractHMSFromTime3 = extractHMSFromTime(inputValueNew),
hourNew = _extractHMSFromTime3.hour,
minuteNew = _extractHMSFromTime3.minute,
secondNew = _extractHMSFromTime3.second;
if (!(disabledHours && disabledHours(hourNew)) && !(disabledMinutes && disabledMinutes(minuteNew)) && !(disabledSeconds && disabledSeconds(secondNew))) {
if (onChange) {
onChange(inputValueNew);
}
if (value === null) {
setHour(hourNew);
setMinute(onlyHour ? "00" : minuteNew);
setSecond(secondsAvailable ? secondNew : "00");
}
}
}
};
var handleInputFocus = function handleInputFocus() {
if (!visible) {
setVisible(true);
}
};
var handleInputKeyDown = function handleInputKeyDown(_ref3) {
var key = _ref3.key;
var keys = ["Tab", "Escape", "Enter"];
if (keys.includes(key)) {
setVisible(false);
inputRef.current.input.blur();
}
};
useImperativeHandle(ref, function () {
return {
input: inputRef.current,
handleVisibleChange: handleVisibleChange
};
});
var classSet = classNames(className, "".concat(prefix, "-input"), "".concat(prefix, "-").concat(size), _defineProperty({}, "".concat(prefix, "-secondsAvailable"), secondsAvailable));
return React.createElement(Popover, _extends({
arrowed: false,
onVisibleChange: handleVisibleChange,
popup: React.createElement("div", null, React.createElement(TimeSelect, {
onChange: handleClick,
currentHour: hour ? parseInt(hour, 10) : null,
disabledHours: disabledHours,
maxTime: maxTime,
minTime: minTime,
onlyHour: onlyHour,
selectedValue: hour,
size: size,
type: "hour"
}), !onlyHour && React.createElement(TimeSelect, {
disabledMinutes: disabledMinutes,
onChange: handleClick,
currentHour: hour ? parseInt(hour, 10) : null,
maxTime: maxTime,
minTime: minTime,
selectedValue: minute,
size: size,
type: "minute"
}), secondsAvailable && React.createElement(TimeSelect, {
disabledSeconds: disabledSeconds,
onChange: handleClick,
currentHour: hour ? parseInt(hour, 10) : null,
currentMinute: minute ? parseInt(minute, 10) : null,
maxTime: maxTime,
minTime: minTime,
selectedValue: second,
size: size,
type: "second"
})),
trigger: "click",
visible: visible
}, popoverProps), React.createElement(Input, _extends({
className: classSet,
cleaveOptions: {
blocks: secondsAvailable ? [2, 2, 2] : [2, 2],
delimiter: ":"
},
disabled: disabled,
rightElement: React.createElement(Icon, {
icon: "time-outlined"
}),
size: size,
value: inputValue,
onChange: handleInputChange,
onFocus: handleInputFocus,
onKeyDown: handleInputKeyDown,
ref: inputRef
}, otherProps)));
});
TimePicker.displayName = "TimePicker";
TimePicker.propTypes = {
className: PropTypes.string,
closeOnSelect: PropTypes.bool,
defaultValue: PropTypes.string,
disabled: PropTypes.bool,
disabledHours: PropTypes.func,
disabledMinutes: PropTypes.func,
disabledSeconds: PropTypes.func,
intent: PropTypes.oneOf(["normal", "primary", "success", "warning", "danger"]),
maxTime: PropTypes.string,
minTime: PropTypes.string,
onChange: PropTypes.func,
onlyHour: PropTypes.bool,
placeholder: PropTypes.string,
size: PropTypes.oneOf(["mini", "small", "medium", "large"]),
value: PropTypes.string
};
TimePicker.defaultProps = {
className: "",
closeOnSelect: false,
defaultValue: null,
disabled: false,
disabledHours: noop,
disabledMinutes: noop,
disabledSeconds: noop,
intent: "normal",
maxTime: "24:00",
minTime: null,
onChange: noop,
onlyHour: false,
placeholder: "请选择",
secondsAvailable: false,
size: "small",
value: null
};
export default TimePicker;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsImZvcndhcmRSZWYiLCJ1c2VDb250ZXh0IiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsInVzZVJlZiIsInVzZVN0YXRlIiwidXNlTWVtbyIsIlByb3BUeXBlcyIsImNsYXNzTmFtZXMiLCJDb25maWdDb250ZXh0IiwiZ2V0Q29tcHV0ZWRTaXplIiwiSWNvbiIsIklucHV0IiwiUG9wb3ZlciIsIlRpbWVTZWxlY3QiLCJ0cmFuc2Zvcm1UaW1lV2l0aFNlY29uZHMiLCJleHRyYWN0SE1TRnJvbVRpbWUiLCJpc0xlZ2FsVGltZVN0cmluZyIsImlzVGltZUFmdGVyIiwiaXNUaW1lQmVmb3JlIiwicHJlZml4Iiwibm9vcCIsIlRpbWVQaWNrZXIiLCJyZWYiLCJjbGFzc05hbWUiLCJjbG9zZU9uU2VsZWN0IiwiZGVmYXVsdFZhbHVlIiwiZGlzYWJsZWQiLCJkaXNhYmxlZEhvdXJzIiwiZGlzYWJsZWRNaW51dGVzIiwiZGlzYWJsZWRTZWNvbmRzIiwibWF4VGltZSIsIm1pblRpbWUiLCJvbkNoYW5nZSIsIm9ubHlIb3VyIiwicGxhY2Vob2xkZXIiLCJwb3BvdmVyUHJvcHMiLCJzZWNvbmRzQXZhaWxhYmxlIiwic2l6ZVByb3AiLCJzaXplIiwidmFsdWUiLCJvdGhlclByb3BzIiwiZ2V0SW5pdGlhbFN0YXRlIiwidmFsdWVTdGF0ZSIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJpbnB1dFZhbHVlIiwicHJldlZhbHVlUHJvcCIsInZpc2libGUiLCJpbml0aWFsU3RhdGUiLCJzZXRJbnB1dFZhbHVlIiwic2V0SG91ciIsInNldE1pbnV0ZSIsInNldFNlY29uZCIsInNldFByZXZWYWx1ZVByb3AiLCJzZXRWaXNpYmxlIiwibmV3SG91ciIsIm5ld01pbnV0ZSIsIm5ld1NlY29uZCIsImlucHV0UmVmIiwic2l6ZUNvbnRleHQiLCJoYW5kbGVDbGljayIsInZhbHVlTmV3IiwidHlwZSIsInZhbHVlUHJvcCIsImlucHV0VmFsdWVOb3ciLCJ2YWx1ZUZpbmFsIiwidGltZSIsInNldFRpbWVvdXQiLCJoYW5kbGVWaXNpYmxlQ2hhbmdlIiwidmlzaWJsZU5ldyIsImlucHV0RWxlbWVudCIsImN1cnJlbnQiLCJpbnB1dCIsImRvY3VtZW50IiwiYWN0aXZlRWxlbWVudCIsIndpdGhTZWNvbmRzIiwibm9TZWNvbmRzIiwibmV3SW5wdXRWYWx1ZSIsImhhbmRsZUlucHV0Q2hhbmdlIiwiaW5wdXRWYWx1ZU5ldyIsInRhcmdldCIsImhvdXJOZXciLCJtaW51dGVOZXciLCJzZWNvbmROZXciLCJoYW5kbGVJbnB1dEZvY3VzIiwiaGFuZGxlSW5wdXRLZXlEb3duIiwia2V5Iiwia2V5cyIsImluY2x1ZGVzIiwiYmx1ciIsImNsYXNzU2V0IiwicGFyc2VJbnQiLCJibG9ja3MiLCJkZWxpbWl0ZXIiLCJkaXNwbGF5TmFtZSIsInByb3BUeXBlcyIsInN0cmluZyIsImJvb2wiLCJmdW5jIiwiaW50ZW50Iiwib25lT2YiLCJkZWZhdWx0UHJvcHMiXSwic291cmNlcyI6WyIuLi8uLi9jb21wb25lbnRzL3RpbWUtcGlja2VyL1RpbWVQaWNrZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwge1xuICBmb3J3YXJkUmVmLFxuICB1c2VDb250ZXh0LFxuICB1c2VJbXBlcmF0aXZlSGFuZGxlLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxuICB1c2VNZW1vLFxufSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IFByb3BUeXBlcyBmcm9tIFwicHJvcC10eXBlc1wiXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiXG5pbXBvcnQgeyBDb25maWdDb250ZXh0LCBnZXRDb21wdXRlZFNpemUgfSBmcm9tIFwiLi4vY29uZmlnLXByb3ZpZGVyXCJcbmltcG9ydCBJY29uIGZyb20gXCIuLi9pY29uXCJcbmltcG9ydCBJbnB1dCBmcm9tIFwiLi4vaW5wdXRcIlxuaW1wb3J0IFBvcG92ZXIsIHsgSVBvcG92ZXJQcm9wcyB9IGZyb20gXCIuLi9wb3BvdmVyXCJcbmltcG9ydCBUaW1lU2VsZWN0IGZyb20gXCIuL1RpbWVTZWxlY3RcIlxuaW1wb3J0IFwiLi9zdHlsZVwiXG5pbXBvcnQge1xuICB0cmFuc2Zvcm1UaW1lV2l0aFNlY29uZHMsXG4gIGV4dHJhY3RITVNGcm9tVGltZSxcbiAgaXNMZWdhbFRpbWVTdHJpbmcsXG4gIGlzVGltZUFmdGVyLFxuICBpc1RpbWVCZWZvcmUsXG59IGZyb20gXCIuL2NvcmVcIlxuXG5jb25zdCBwcmVmaXggPSBcImFkdWktdGltZVwiXG5jb25zdCBub29wID0gKCkgPT4ge31cblxuZXhwb3J0IGludGVyZmFjZSBJVGltZVBpY2tlclByb3BzIHtcbiAgW2tleTogc3RyaW5nXTogYW55XG4gIC8qKlxuICAgKiDpmYTliqDnsbvlkI1cbiAgICovXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICAvKipcbiAgICog5piv5ZCm5Zyo6YCJ5oup5ZCO77yM5raI5aSxIFBvcG92ZXJcbiAgICovXG4gIGNsb3NlT25TZWxlY3Q/OiBib29sZWFuXG4gIC8qKlxuICAgKiDlhoXpg6jpqbHliqjvvIzpu5jorqTpgInmi6nml7bpl7RcbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IG51bGwgfCBzdHJpbmdcbiAgLyoqXG4gICAqIOaYr+WQpuemgeeUqFxuICAgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIC8qKlxuICAgKiDnpoHmraLpgInmi6nnmoTlsI/ml7ZcbiAgICovXG4gIGRpc2FibGVkSG91cnM/OiAoaG91cj86IHN0cmluZyB8IG51bGwpID0+IGJvb2xlYW4gfCB2b2lkXG4gIC8qKlxuICAgKiDnpoHmraLpgInmi6nnmoTliIbpkp9cbiAgICovXG4gIGRpc2FibGVkTWludXRlcz86IChtaW51dGU/OiBzdHJpbmcgfCBudWxsKSA9PiBib29sZWFuIHwgdm9pZFxuICAvKipcbiAgICog56aB5q2i6YCJ5oup55qE56eSXG4gICAqL1xuICBkaXNhYmxlZFNlY29uZHM/OiAoc2Vjb25kPzogc3RyaW5nIHwgbnVsbCkgPT4gYm9vbGVhbiB8IHZvaWRcbiAgLyoqXG4gICAqIOiuvue9rui+k+WFpeahhuexu+Wei1xuICAgKi9cbiAgaW50ZW50PzogXCJub3JtYWxcIiB8IFwicHJpbWFyeVwiIHwgXCJzdWNjZXNzXCIgfCBcIndhcm5pbmdcIiB8IFwiZGFuZ2VyXCJcbiAgLyoqXG4gICAqIOWPr+mAieaXtumXtOeahOacgOWkp+WAvFxuICAgKi9cbiAgbWF4VGltZT86IHN0cmluZyB8IG51bGxcbiAgLyoqXG4gICAqIOWPr+mAieaXtumXtOeahOacgOWwj+WAvFxuICAgKi9cbiAgbWluVGltZT86IHN0cmluZyB8IG51bGxcbiAgLyoqXG4gICAqIOaXtumXtOaUueWPmOeahCBoYW5kbGVyXG4gICAqL1xuICBvbkNoYW5nZT86ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkXG4gIC8qKlxuICAgKiDliKTmlq3mmK/lkKbmmK/mlbTmlbBcbiAgICovXG4gIG9ubHlIb3VyPzogYm9vbGVhblxuICAvKipcbiAgICog5Y2g5L2N5a2X56ymXG4gICAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZ1xuICAvKipcbiAgICog5Lyg5YWlIFBvcG92ZXIg55qEIHByb3BzXG4gICAqL1xuICBwb3BvdmVyUHJvcHM/OiBJUG9wb3ZlclByb3BzXG4gIC8qKlxuICAgKiAyMDIyMTIxNjog5pSv5oyB56eS55qE6YCJ5oupXG4gICAqL1xuICBzZWNvbmRzQXZhaWxhYmxlPzogYm9vbGVhblxuICAvKipcbiAgICog6K6+572u5bC65a+4XG4gICAqL1xuICBzaXplPzogXCJtaW5pXCIgfCBcInNtYWxsXCIgfCBcIm1lZGl1bVwiIHwgXCJsYXJnZVwiXG4gIC8qKlxuICAgKiDlpJbpg6jmjqfliLbvvJrlvZPliY3ml7bpl7RcbiAgICovXG4gIHZhbHVlPzogbnVsbCB8IHN0cmluZ1xufVxuXG4vKipcbiAqIOaXtumXtOmAieaLqeWZqOeUqOS6juS6huino+W9k+WJjeW3sumAieaXtumXtO+8jOmAieaLqeaIlui+k+WFpemcgOimgeeahOaXtumXtOOAgeaXtumXtOiMg+WbtOetieOAglxuICovXG5jb25zdCBUaW1lUGlja2VyOiBSZWFjdC5Gb3J3YXJkUmVmRXhvdGljQ29tcG9uZW50PFxuICBJVGltZVBpY2tlclByb3BzICYgUmVhY3QuUmVmQXR0cmlidXRlczxhbnk+XG4+ID0gZm9yd2FyZFJlZihcbiAgKFxuICAgIHtcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNsb3NlT25TZWxlY3QsXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGRpc2FibGVkSG91cnMsXG4gICAgICBkaXNhYmxlZE1pbnV0ZXMsXG4gICAgICBkaXNhYmxlZFNlY29uZHMsXG4gICAgICBtYXhUaW1lLFxuICAgICAgbWluVGltZSxcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgb25seUhvdXIsXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICAgIHBvcG92ZXJQcm9wcyxcbiAgICAgIHNlY29uZHNBdmFpbGFibGUgPSBmYWxzZSxcbiAgICAgIHNpemU6IHNpemVQcm9wLFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5vdGhlclByb3BzXG4gICAgfTogSVRpbWVQaWNrZXJQcm9wcyxcbiAgICByZWZcbiAgKSA9PiB7XG4gICAgY29uc3QgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWVTdGF0ZSA9IHZhbHVlICE9PSBudWxsID8gdmFsdWUgOiBkZWZhdWx0VmFsdWVcbiAgICAgIGNvbnN0IHsgaG91ciwgbWludXRlLCBzZWNvbmQgfSA9IGV4dHJhY3RITVNGcm9tVGltZSh2YWx1ZVN0YXRlKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaG91cixcbiAgICAgICAgaW5wdXRWYWx1ZTogdmFsdWVTdGF0ZSB8fCBcIlwiLFxuICAgICAgICBtaW51dGU6IG9ubHlIb3VyID8gXCIwMFwiIDogbWludXRlLFxuICAgICAgICBzZWNvbmQ6IHNlY29uZHNBdmFpbGFibGUgPyBzZWNvbmQgOiBcIjAwXCIsXG4gICAgICAgIHByZXZWYWx1ZVByb3A6IHZhbHVlU3RhdGUgfHwgXCJcIixcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHVzZU1lbW8oZ2V0SW5pdGlhbFN0YXRlLCBbXSlcbiAgICBjb25zdCBbaW5wdXRWYWx1ZSwgc2V0SW5wdXRWYWx1ZV0gPSB1c2VTdGF0ZShpbml0aWFsU3RhdGUuaW5wdXRWYWx1ZSlcbiAgICBjb25zdCBbaG91ciwgc2V0SG91cl0gPSB1c2VTdGF0ZShpbml0aWFsU3RhdGUuaG91cilcbiAgICBjb25zdCBbbWludXRlLCBzZXRNaW51dGVdID0gdXNlU3RhdGUoaW5pdGlhbFN0YXRlLm1pbnV0ZSlcbiAgICBjb25zdCBbc2Vjb25kLCBzZXRTZWNvbmRdID0gdXNlU3RhdGUoaW5pdGlhbFN0YXRlLnNlY29uZClcbiAgICBjb25zdCBbcHJldlZhbHVlUHJvcCwgc2V0UHJldlZhbHVlUHJvcF0gPSB1c2VTdGF0ZShcbiAgICAgIGluaXRpYWxTdGF0ZS5wcmV2VmFsdWVQcm9wXG4gICAgKVxuICAgIGNvbnN0IFt2aXNpYmxlLCBzZXRWaXNpYmxlXSA9IHVzZVN0YXRlKGluaXRpYWxTdGF0ZS52aXNpYmxlKVxuXG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHByZXZWYWx1ZVByb3AgIT09IHZhbHVlKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGhvdXI6IG5ld0hvdXIsXG4gICAgICAgIG1pbnV0ZTogbmV3TWludXRlLFxuICAgICAgICBzZWNvbmQ6IG5ld1NlY29uZCxcbiAgICAgIH0gPSBleHRyYWN0SE1TRnJvbVRpbWUodmFsdWUpXG5cbiAgICAgIHNldElucHV0VmFsdWUodmFsdWUgfHwgXCJcIilcbiAgICAgIHNldEhvdXIobmV3SG91cilcbiAgICAgIHNldE1pbnV0ZShvbmx5SG91ciA/IFwiMDBcIiA6IG5ld01pbnV0ZSlcbiAgICAgIHNldFNlY29uZChzZWNvbmRzQXZhaWxhYmxlID8gbmV3U2Vjb25kIDogXCIwMFwiKVxuICAgICAgc2V0UHJldlZhbHVlUHJvcCh2YWx1ZSB8fCBcIlwiKVxuICAgIH1cblxuICAgIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmPGFueT4obnVsbClcblxuICAgIGNvbnN0IHsgc2l6ZTogc2l6ZUNvbnRleHQgfSA9IHVzZUNvbnRleHQoQ29uZmlnQ29udGV4dClcblxuICAgIGNvbnN0IHNpemUgPSBnZXRDb21wdXRlZFNpemUoc2l6ZVByb3AsIHNpemVDb250ZXh0KVxuXG4gICAgY29uc3QgaGFuZGxlQ2xpY2sgPSAodmFsdWVOZXc6IHN0cmluZywgdHlwZTogXCJob3VyXCIgfCBcIm1pbnV0ZVwiKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZVByb3AgPSB2YWx1ZVxuXG4gICAgICBsZXQgaW5wdXRWYWx1ZU5vdyA9IFwiXCJcbiAgICAgIGlmIChzZWNvbmRzQXZhaWxhYmxlKSB7XG4gICAgICAgIGlmICh0eXBlID09PSBcImhvdXJcIikge1xuICAgICAgICAgIGlucHV0VmFsdWVOb3cgPSBgJHt2YWx1ZU5ld306JHttaW51dGUgfHwgXCJcIn06JHtzZWNvbmQgfHwgXCJcIn1gXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJtaW51dGVcIikge1xuICAgICAgICAgIGlucHV0VmFsdWVOb3cgPSBgJHtob3VyIHx8IFwiXCJ9OiR7dmFsdWVOZXd9OiR7c2Vjb25kIHx8IFwiXCJ9YFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlucHV0VmFsdWVOb3cgPSBgJHtob3VyIHx8IFwiXCJ9OiR7bWludXRlIHx8IFwiXCJ9OiR7dmFsdWVOZXd9YFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dFZhbHVlTm93ID1cbiAgICAgICAgICB0eXBlID09PSBcImhvdXJcIlxuICAgICAgICAgICAgPyBgJHt2YWx1ZU5ld306JHttaW51dGUgfHwgXCJcIn1gXG4gICAgICAgICAgICA6IGAke2hvdXIgfHwgXCJcIn06JHt2YWx1ZU5ld31gXG4gICAgICB9XG5cbiAgICAgIGlmIChtYXhUaW1lICYmIGlzVGltZUFmdGVyKGlucHV0VmFsdWVOb3csIG1heFRpbWUpKSB7XG4gICAgICAgIGlucHV0VmFsdWVOb3cgPSBzZWNvbmRzQXZhaWxhYmxlXG4gICAgICAgICAgPyB0cmFuc2Zvcm1UaW1lV2l0aFNlY29uZHMobWF4VGltZSlcbiAgICAgICAgICA6IG1heFRpbWVcbiAgICAgIH0gZWxzZSBpZiAobWluVGltZSAmJiBpc1RpbWVCZWZvcmUoaW5wdXRWYWx1ZU5vdywgbWluVGltZSkpIHtcbiAgICAgICAgaW5wdXRWYWx1ZU5vdyA9IHNlY29uZHNBdmFpbGFibGVcbiAgICAgICAgICA/IHRyYW5zZm9ybVRpbWVXaXRoU2Vjb25kcyhtaW5UaW1lKVxuICAgICAgICAgIDogbWluVGltZVxuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWVQcm9wID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlRmluYWwgPSB7XG4gICAgICAgICAgaW5wdXRWYWx1ZU5vdyxcbiAgICAgICAgICAuLi5leHRyYWN0SE1TRnJvbVRpbWUoaW5wdXRWYWx1ZU5vdyksXG4gICAgICAgIH1cbiAgICAgICAgc2V0SG91cih2YWx1ZUZpbmFsLmhvdXIpXG4gICAgICAgIHNldE1pbnV0ZSh2YWx1ZUZpbmFsLm1pbnV0ZSlcbiAgICAgICAgc2V0U2Vjb25kKHZhbHVlRmluYWwuc2Vjb25kKVxuICAgICAgICBzZXRJbnB1dFZhbHVlKHZhbHVlRmluYWwuaW5wdXRWYWx1ZU5vdylcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTGVnYWxUaW1lU3RyaW5nKHsgdGltZTogaW5wdXRWYWx1ZSwgb25seUhvdXIgfSkpIHtcbiAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgb25DaGFuZ2UoaW5wdXRWYWx1ZU5vdylcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xvc2VPblNlbGVjdCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgc2V0VmlzaWJsZShmYWxzZSlcbiAgICAgICAgICB9LCAxMjApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVWaXNpYmxlQ2hhbmdlID0gKHZpc2libGVOZXc6IGJvb2xlYW4pID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQ6IGlucHV0RWxlbWVudCB9ID0gaW5wdXRSZWYuY3VycmVudFxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWN0aXZlRWxlbWVudCB9ID0gZG9jdW1lbnRcbiAgICAgICAgaWYgKHZpc2libGVOZXcgfHwgKCF2aXNpYmxlTmV3ICYmIGlucHV0RWxlbWVudCAhPT0gYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICBjb25zdCB3aXRoU2Vjb25kcyA9XG4gICAgICAgICAgICBob3VyICYmIG1pbnV0ZSAmJiBzZWNvbmQgPyBgJHtob3VyfToke21pbnV0ZX06JHtzZWNvbmR9YCA6IFwiXCJcbiAgICAgICAgICBjb25zdCBub1NlY29uZHMgPSBob3VyICYmIG1pbnV0ZSA/IGAke2hvdXJ9OiR7bWludXRlfWAgOiBcIlwiXG4gICAgICAgICAgY29uc3QgbmV3SW5wdXRWYWx1ZSA9IHNlY29uZHNBdmFpbGFibGUgPyB3aXRoU2Vjb25kcyA6IG5vU2Vjb25kc1xuICAgICAgICAgIGlmICghdmlzaWJsZU5ldyAmJiBpbnB1dFZhbHVlICE9PSBuZXdJbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICBzZXRJbnB1dFZhbHVlKG5ld0lucHV0VmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICAgIHNldFZpc2libGUodmlzaWJsZU5ldylcbiAgICAgICAgfVxuICAgICAgfSwgMClcbiAgICB9XG5cbiAgICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9ICh7XG4gICAgICB0YXJnZXQ6IHsgdmFsdWU6IGlucHV0VmFsdWVOZXcgfSxcbiAgICB9OiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgc2V0SW5wdXRWYWx1ZShpbnB1dFZhbHVlTmV3KVxuICAgICAgaWYgKFxuICAgICAgICBpbnB1dFZhbHVlTmV3ID09PSBcIlwiIHx8XG4gICAgICAgIChpc0xlZ2FsVGltZVN0cmluZyh7XG4gICAgICAgICAgdGltZTogaW5wdXRWYWx1ZU5ldyxcbiAgICAgICAgICBvbmx5SG91cixcbiAgICAgICAgfSkgJiZcbiAgICAgICAgICAhaXNUaW1lQWZ0ZXIoaW5wdXRWYWx1ZU5ldywgbWF4VGltZSkgJiZcbiAgICAgICAgICAhaXNUaW1lQmVmb3JlKGlucHV0VmFsdWVOZXcsIG1pblRpbWUpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBob3VyOiBob3VyTmV3LFxuICAgICAgICAgIG1pbnV0ZTogbWludXRlTmV3LFxuICAgICAgICAgIHNlY29uZDogc2Vjb25kTmV3LFxuICAgICAgICB9ID0gZXh0cmFjdEhNU0Zyb21UaW1lKGlucHV0VmFsdWVOZXcpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhKGRpc2FibGVkSG91cnMgJiYgZGlzYWJsZWRIb3Vycyhob3VyTmV3KSkgJiZcbiAgICAgICAgICAhKGRpc2FibGVkTWludXRlcyAmJiBkaXNhYmxlZE1pbnV0ZXMobWludXRlTmV3KSkgJiZcbiAgICAgICAgICAhKGRpc2FibGVkU2Vjb25kcyAmJiBkaXNhYmxlZFNlY29uZHMoc2Vjb25kTmV3KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgICBvbkNoYW5nZShpbnB1dFZhbHVlTmV3KVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHNldEhvdXIoaG91ck5ldylcbiAgICAgICAgICAgIHNldE1pbnV0ZShvbmx5SG91ciA/IFwiMDBcIiA6IG1pbnV0ZU5ldylcbiAgICAgICAgICAgIHNldFNlY29uZChzZWNvbmRzQXZhaWxhYmxlID8gc2Vjb25kTmV3IDogXCIwMFwiKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUlucHV0Rm9jdXMgPSAoKSA9PiB7XG4gICAgICBpZiAoIXZpc2libGUpIHtcbiAgICAgICAgc2V0VmlzaWJsZSh0cnVlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUlucHV0S2V5RG93biA9ICh7XG4gICAgICBrZXksXG4gICAgfTogUmVhY3QuS2V5Ym9hcmRFdmVudDxIVE1MSW5wdXRFbGVtZW50PikgPT4ge1xuICAgICAgY29uc3Qga2V5cyA9IFtcIlRhYlwiLCBcIkVzY2FwZVwiLCBcIkVudGVyXCJdXG4gICAgICBpZiAoa2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHNldFZpc2libGUoZmFsc2UpXG4gICAgICAgIGlucHV0UmVmLmN1cnJlbnQuaW5wdXQuYmx1cigpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgICBpbnB1dDogaW5wdXRSZWYuY3VycmVudCxcbiAgICAgIGhhbmRsZVZpc2libGVDaGFuZ2UsXG4gICAgfSkpXG5cbiAgICBjb25zdCBjbGFzc1NldCA9IGNsYXNzTmFtZXMoXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBgJHtwcmVmaXh9LWlucHV0YCxcbiAgICAgIGAke3ByZWZpeH0tJHtzaXplfWAsXG4gICAgICB7XG4gICAgICAgIFtgJHtwcmVmaXh9LXNlY29uZHNBdmFpbGFibGVgXTogc2Vjb25kc0F2YWlsYWJsZSxcbiAgICAgIH1cbiAgICApXG5cbiAgICByZXR1cm4gKFxuICAgICAgPFBvcG92ZXJcbiAgICAgICAgYXJyb3dlZD17ZmFsc2V9XG4gICAgICAgIG9uVmlzaWJsZUNoYW5nZT17aGFuZGxlVmlzaWJsZUNoYW5nZX1cbiAgICAgICAgcG9wdXA9e1xuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8VGltZVNlbGVjdFxuICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlQ2xpY2t9XG4gICAgICAgICAgICAgIGN1cnJlbnRIb3VyPXtob3VyID8gcGFyc2VJbnQoaG91ciwgMTApIDogbnVsbH1cbiAgICAgICAgICAgICAgZGlzYWJsZWRIb3Vycz17ZGlzYWJsZWRIb3Vyc31cbiAgICAgICAgICAgICAgbWF4VGltZT17bWF4VGltZX1cbiAgICAgICAgICAgICAgbWluVGltZT17bWluVGltZX1cbiAgICAgICAgICAgICAgb25seUhvdXI9e29ubHlIb3VyfVxuICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlPXtob3VyfVxuICAgICAgICAgICAgICBzaXplPXtzaXplfVxuICAgICAgICAgICAgICB0eXBlPVwiaG91clwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgeyFvbmx5SG91ciAmJiAoXG4gICAgICAgICAgICAgIDxUaW1lU2VsZWN0XG4gICAgICAgICAgICAgICAgZGlzYWJsZWRNaW51dGVzPXtkaXNhYmxlZE1pbnV0ZXN9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUNsaWNrfVxuICAgICAgICAgICAgICAgIGN1cnJlbnRIb3VyPXtob3VyID8gcGFyc2VJbnQoaG91ciwgMTApIDogbnVsbH1cbiAgICAgICAgICAgICAgICBtYXhUaW1lPXttYXhUaW1lfVxuICAgICAgICAgICAgICAgIG1pblRpbWU9e21pblRpbWV9XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZT17bWludXRlfVxuICAgICAgICAgICAgICAgIHNpemU9e3NpemV9XG4gICAgICAgICAgICAgICAgdHlwZT1cIm1pbnV0ZVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3NlY29uZHNBdmFpbGFibGUgJiYgKFxuICAgICAgICAgICAgICA8VGltZVNlbGVjdFxuICAgICAgICAgICAgICAgIGRpc2FibGVkU2Vjb25kcz17ZGlzYWJsZWRTZWNvbmRzfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDbGlja31cbiAgICAgICAgICAgICAgICBjdXJyZW50SG91cj17aG91ciA/IHBhcnNlSW50KGhvdXIsIDEwKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgY3VycmVudE1pbnV0ZT17bWludXRlID8gcGFyc2VJbnQobWludXRlLCAxMCkgOiBudWxsfVxuICAgICAgICAgICAgICAgIG1heFRpbWU9e21heFRpbWV9XG4gICAgICAgICAgICAgICAgbWluVGltZT17bWluVGltZX1cbiAgICAgICAgICAgICAgICBzZWxlY3RlZFZhbHVlPXtzZWNvbmR9XG4gICAgICAgICAgICAgICAgc2l6ZT17c2l6ZX1cbiAgICAgICAgICAgICAgICB0eXBlPVwic2Vjb25kXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlcj1cImNsaWNrXCJcbiAgICAgICAgdmlzaWJsZT17dmlzaWJsZX1cbiAgICAgICAgey4uLnBvcG92ZXJQcm9wc31cbiAgICAgID5cbiAgICAgICAgPElucHV0XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc1NldH1cbiAgICAgICAgICBjbGVhdmVPcHRpb25zPXt7XG4gICAgICAgICAgICBibG9ja3M6IHNlY29uZHNBdmFpbGFibGUgPyBbMiwgMiwgMl0gOiBbMiwgMl0sXG4gICAgICAgICAgICBkZWxpbWl0ZXI6IFwiOlwiLFxuICAgICAgICAgIH19XG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgIHJpZ2h0RWxlbWVudD17PEljb24gaWNvbj1cInRpbWUtb3V0bGluZWRcIiAvPn1cbiAgICAgICAgICBzaXplPXtzaXplfVxuICAgICAgICAgIHZhbHVlPXtpbnB1dFZhbHVlfVxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICBvbkZvY3VzPXtoYW5kbGVJbnB1dEZvY3VzfVxuICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlSW5wdXRLZXlEb3dufVxuICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgey4uLm90aGVyUHJvcHN9XG4gICAgICAgIC8+XG4gICAgICA8L1BvcG92ZXI+XG4gICAgKVxuICB9XG4pXG5cblRpbWVQaWNrZXIuZGlzcGxheU5hbWUgPSBcIlRpbWVQaWNrZXJcIlxuXG5UaW1lUGlja2VyLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIOmZhOWKoOexu+WQjVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5piv5ZCm5Zyo6YCJ5oup5ZCO77yM5raI5aSxIFBvcG92ZXJcbiAgICovXG4gIGNsb3NlT25TZWxlY3Q6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog5YaF6YOo6amx5Yqo77yM6buY6K6k6YCJ5oup5pe26Ze0XG4gICAqL1xuICBkZWZhdWx0VmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gIC8qKlxuICAgKiDmmK/lkKbnpoHnlKhcbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgLyoqXG4gICAqIOemgeatoumAieaLqeeahOWwj+aXtlxuICAgKi9cbiAgZGlzYWJsZWRIb3VyczogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiDnpoHmraLpgInmi6nnmoTliIbpkp9cbiAgICovXG4gIGRpc2FibGVkTWludXRlczogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiDnpoHmraLpgInmi6nnmoTnp5JcbiAgICovXG4gIGRpc2FibGVkU2Vjb25kczogUHJvcFR5cGVzLmZ1bmMsXG4gIC8qKlxuICAgKiDorr7nva7ovpPlhaXmoYbnsbvlnotcbiAgICovXG4gIGludGVudDogUHJvcFR5cGVzLm9uZU9mKFtcbiAgICBcIm5vcm1hbFwiLFxuICAgIFwicHJpbWFyeVwiLFxuICAgIFwic3VjY2Vzc1wiLFxuICAgIFwid2FybmluZ1wiLFxuICAgIFwiZGFuZ2VyXCIsXG4gIF0pLFxuICAvKipcbiAgICog5Y+v6YCJ5pe26Ze055qE5pyA5aSn5YC8XG4gICAqL1xuICBtYXhUaW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5Y+v6YCJ5pe26Ze055qE5pyA5bCP5YC8XG4gICAqL1xuICBtaW5UaW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAvKipcbiAgICog5pe26Ze05pS55Y+Y55qEIGhhbmRsZXJcbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcbiAgLyoqXG4gICAqIOWIpOaWreaYr+WQpuaYr+aVtOaVsFxuICAgKi9cbiAgb25seUhvdXI6IFByb3BUeXBlcy5ib29sLFxuICAvKipcbiAgICog5Y2g5L2N5a2X56ymXG4gICAqL1xuICBwbGFjZWhvbGRlcjogUHJvcFR5cGVzLnN0cmluZyxcbiAgLyoqXG4gICAqIOiuvue9ruWwuuWvuFxuICAgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFtcIm1pbmlcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImxhcmdlXCJdKSxcbiAgLyoqXG4gICAqIOWklumDqOaOp+WItu+8muW9k+WJjeaXtumXtFxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5zdHJpbmcsXG59XG5cblRpbWVQaWNrZXIuZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6IFwiXCIsXG4gIGNsb3NlT25TZWxlY3Q6IGZhbHNlLFxuICBkZWZhdWx0VmFsdWU6IG51bGwsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgZGlzYWJsZWRIb3Vyczogbm9vcCxcbiAgZGlzYWJsZWRNaW51dGVzOiBub29wLFxuICBkaXNhYmxlZFNlY29uZHM6IG5vb3AsXG4gIGludGVudDogXCJub3JtYWxcIixcbiAgbWF4VGltZTogXCIyNDowMFwiLFxuICBtaW5UaW1lOiBudWxsLFxuICBvbkNoYW5nZTogbm9vcCxcbiAgb25seUhvdXI6IGZhbHNlLFxuICBwbGFjZWhvbGRlcjogXCLor7fpgInmi6lcIixcbiAgc2Vjb25kc0F2YWlsYWJsZTogZmFsc2UsXG4gIHNpemU6IFwic21h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