-
-
Save hmaurer/c0e17b79532dc0cc584831b2f5d641e3 to your computer and use it in GitHub Desktop.
This file has been truncated, but you can view the full file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { | |
Backdrop_default, | |
ButtonBase_default, | |
Button_default, | |
FormControlContext_default, | |
Grow_default, | |
HTMLElementType, | |
IconButton_default, | |
KeyboardArrowLeft_default, | |
KeyboardArrowRight_default, | |
Modal_default, | |
Paper_default, | |
Popper_default, | |
React as React3, | |
React2 as React, | |
React3 as React2, | |
Toolbar_default, | |
Transition_default, | |
Typography_default, | |
_getPrototypeOf, | |
_inherits, | |
_possibleConstructorReturn, | |
createChainedFunction, | |
createSvgIcon, | |
debounce, | |
elementAcceptingRef_default, | |
fade, | |
getScrollbarSize, | |
getTransitionProps, | |
ownerDocument, | |
ownerWindow, | |
refType_default, | |
reflow, | |
require_react_dom, | |
setRef, | |
styled_default, | |
unsupportedProp, | |
useEventCallback, | |
useForkRef, | |
useFormControl, | |
useIsFocusVisible, | |
useMediaQuery, | |
useTheme, | |
withTheme | |
} from "/node_modules/.vite/chunk.TRYU4BUL.js?v=e6bf9c83"; | |
import { | |
ThemeProvider, | |
__commonJS, | |
__export, | |
__exportStar, | |
__toModule, | |
_arrayWithHoles, | |
_classCallCheck, | |
_createClass, | |
_defineProperty, | |
_extends, | |
_iterableToArray, | |
_nonIterableRest, | |
_objectWithoutProperties, | |
_slicedToArray, | |
_toConsumableArray, | |
_typeof, | |
_unsupportedIterableToArray, | |
blue_default, | |
borders, | |
boxShadow, | |
capitalize, | |
chainPropTypes, | |
clsx_m_default, | |
common_default, | |
compose_default, | |
createMuiTheme_default, | |
darken, | |
decomposeColor, | |
deepmerge, | |
display_default, | |
duration, | |
elementTypeAcceptingRef_default, | |
exactProp, | |
flexbox, | |
getDisplayName, | |
getLuminance, | |
getThemeProps, | |
green_default, | |
grey_default, | |
grid, | |
import_prop_types, | |
indigo_default, | |
keys, | |
lighten, | |
mergeClasses, | |
merge_default, | |
orange_default, | |
palette, | |
pink_default, | |
positions_default, | |
red_default, | |
require_SvgIcon, | |
require_hoist_non_react_statics_cjs, | |
require_prop_types, | |
require_react, | |
require_react_is, | |
sizing, | |
spacing, | |
typography, | |
withStyles_default | |
} from "/node_modules/.vite/chunk.5ZFU4BUR.js?v=e6bf9c83"; | |
// node_modules/@material-ui/core/esm/index.js | |
var require_esm = __commonJS((exports) => { | |
__export(exports, { | |
Accordion: () => Accordion_default, | |
AccordionActions: () => AccordionActions_default, | |
AccordionDetails: () => AccordionDetails_default, | |
AccordionSummary: () => AccordionSummary_default, | |
AppBar: () => AppBar_default, | |
Avatar: () => Avatar_default, | |
Backdrop: () => Backdrop_default, | |
Badge: () => Badge_default, | |
BottomNavigation: () => BottomNavigation_default, | |
BottomNavigationAction: () => BottomNavigationAction_default, | |
Box: () => Box_default, | |
Breadcrumbs: () => Breadcrumbs_default, | |
Button: () => Button_default, | |
ButtonBase: () => ButtonBase_default, | |
ButtonGroup: () => ButtonGroup_default, | |
Card: () => Card_default, | |
CardActionArea: () => CardActionArea_default, | |
CardActions: () => CardActions_default, | |
CardContent: () => CardContent_default, | |
CardHeader: () => CardHeader_default, | |
CardMedia: () => CardMedia_default, | |
Checkbox: () => Checkbox_default, | |
Chip: () => Chip_default, | |
CircularProgress: () => CircularProgress_default, | |
ClickAwayListener: () => ClickAwayListener_default, | |
Collapse: () => Collapse_default, | |
Container: () => Container_default, | |
CssBaseline: () => CssBaseline_default, | |
Dialog: () => Dialog_default, | |
DialogActions: () => DialogActions_default, | |
DialogContent: () => DialogContent_default, | |
DialogContentText: () => DialogContentText_default, | |
DialogTitle: () => DialogTitle_default, | |
Divider: () => Divider_default, | |
Drawer: () => Drawer_default, | |
ExpansionPanel: () => ExpansionPanel_default, | |
ExpansionPanelActions: () => ExpansionPanelActions_default, | |
ExpansionPanelDetails: () => ExpansionPanelDetails_default, | |
ExpansionPanelSummary: () => ExpansionPanelSummary_default, | |
Fab: () => Fab_default, | |
Fade: () => Fade_default, | |
FilledInput: () => FilledInput_default, | |
FormControl: () => FormControl_default, | |
FormControlLabel: () => FormControlLabel_default, | |
FormGroup: () => FormGroup_default, | |
FormHelperText: () => FormHelperText_default, | |
FormLabel: () => FormLabel_default, | |
Grid: () => Grid_default, | |
GridList: () => GridList_default, | |
GridListTile: () => GridListTile_default, | |
GridListTileBar: () => GridListTileBar_default, | |
Grow: () => Grow_default, | |
Hidden: () => Hidden_default, | |
Icon: () => Icon_default, | |
IconButton: () => IconButton_default, | |
Input: () => Input_default, | |
InputAdornment: () => InputAdornment_default, | |
InputBase: () => InputBase_default, | |
InputLabel: () => InputLabel_default, | |
LinearProgress: () => LinearProgress_default, | |
Link: () => Link_default, | |
List: () => List_default, | |
ListItem: () => ListItem_default, | |
ListItemAvatar: () => ListItemAvatar_default, | |
ListItemIcon: () => ListItemIcon_default, | |
ListItemSecondaryAction: () => ListItemSecondaryAction_default, | |
ListItemText: () => ListItemText_default, | |
ListSubheader: () => ListSubheader_default, | |
Menu: () => Menu_default, | |
MenuItem: () => MenuItem_default, | |
MenuList: () => MenuList_default, | |
MobileStepper: () => MobileStepper_default, | |
Modal: () => Modal_default, | |
ModalManager: () => ModalManager, | |
MuiThemeProvider: () => ThemeProvider_default, | |
NativeSelect: () => NativeSelect_default, | |
NoSsr: () => NoSsr_default, | |
OutlinedInput: () => OutlinedInput_default, | |
Paper: () => Paper_default, | |
Popover: () => Popover_default, | |
Popper: () => Popper_default, | |
Portal: () => Portal_default, | |
Radio: () => Radio_default, | |
RadioGroup: () => RadioGroup_default, | |
RootRef: () => RootRef_default, | |
Select: () => Select_default, | |
ServerStyleSheets: () => ServerStyleSheets, | |
Slide: () => Slide_default, | |
Slider: () => Slider_default, | |
Snackbar: () => Snackbar_default, | |
SnackbarContent: () => SnackbarContent_default, | |
Step: () => Step_default, | |
StepButton: () => StepButton_default, | |
StepConnector: () => StepConnector_default, | |
StepContent: () => StepContent_default, | |
StepIcon: () => StepIcon_default, | |
StepLabel: () => StepLabel_default, | |
Stepper: () => Stepper_default, | |
StylesProvider: () => StylesProvider, | |
SvgIcon: () => import_SvgIcon2.default, | |
SwipeableDrawer: () => SwipeableDrawer_default, | |
Switch: () => Switch_default, | |
Tab: () => Tab_default, | |
TabScrollButton: () => TabScrollButton_default, | |
Table: () => Table_default, | |
TableBody: () => TableBody_default, | |
TableCell: () => TableCell_default, | |
TableContainer: () => TableContainer_default, | |
TableFooter: () => TableFooter_default, | |
TableHead: () => TableHead_default, | |
TablePagination: () => TablePagination_default, | |
TableRow: () => TableRow_default, | |
TableSortLabel: () => TableSortLabel_default, | |
Tabs: () => Tabs_default, | |
TextField: () => TextField_default, | |
TextareaAutosize: () => TextareaAutosize_default, | |
ThemeProvider: () => ThemeProvider_default, | |
Toolbar: () => Toolbar_default, | |
Tooltip: () => Tooltip_default, | |
Typography: () => Typography_default, | |
Unstable_TrapFocus: () => Unstable_TrapFocus_default, | |
Zoom: () => Zoom_default, | |
capitalize: () => capitalize, | |
colors: () => colors_exports, | |
createChainedFunction: () => createChainedFunction, | |
createGenerateClassName: () => createGenerateClassName, | |
createMuiTheme: () => createMuiTheme_default, | |
createStyles: () => createStyles, | |
createSvgIcon: () => createSvgIcon, | |
darken: () => darken, | |
debounce: () => debounce, | |
decomposeColor: () => decomposeColor, | |
deprecatedPropType: () => deprecatedPropType, | |
duration: () => duration, | |
easing: () => easing, | |
emphasize: () => emphasize, | |
fade: () => fade, | |
getContrastRatio: () => getContrastRatio, | |
getLuminance: () => getLuminance, | |
hexToRgb: () => hexToRgb, | |
hslToRgb: () => hslToRgb, | |
isMuiElement: () => isMuiElement, | |
isWidthDown: () => isWidthDown, | |
isWidthUp: () => isWidthUp, | |
jssPreset: () => jssPreset, | |
lighten: () => lighten, | |
makeStyles: () => makeStyles_default, | |
ownerDocument: () => ownerDocument, | |
ownerWindow: () => ownerWindow, | |
recomposeColor: () => recomposeColor, | |
requirePropFactory: () => requirePropFactory, | |
responsiveFontSizes: () => responsiveFontSizes, | |
rgbToHex: () => rgbToHex, | |
setRef: () => setRef, | |
styleFunction: () => styleFunction, | |
styled: () => styled_default, | |
unstable_createMuiStrictModeTheme: () => createMuiStrictModeTheme, | |
unstable_useId: () => useId, | |
unsupportedProp: () => unsupportedProp, | |
useControlled: () => useControlled, | |
useEventCallback: () => useEventCallback, | |
useForkRef: () => useForkRef, | |
useFormControl: () => useFormControl2, | |
useIsFocusVisible: () => useIsFocusVisible, | |
useMediaQuery: () => useMediaQuery, | |
useRadioGroup: () => useRadioGroup, | |
useScrollTrigger: () => useScrollTrigger, | |
useTheme: () => useTheme, | |
withMobileDialog: () => withMobileDialog_default, | |
withStyles: () => withStyles_default, | |
withTheme: () => withTheme_default, | |
withWidth: () => withWidth_default | |
}); | |
var import_SvgIcon2 = __toModule(require_SvgIcon()); | |
__exportStar(exports, __toModule(require_SvgIcon())); | |
/** @license Material-UI v4.11.0 | |
* | |
* This source code is licensed under the MIT license found in the | |
* LICENSE file in the root directory of this source tree. | |
*/ | |
}); | |
// dep:@material-ui_core | |
var require_material_ui_core = __commonJS((exports) => { | |
__exportStar(exports, __toModule(require_esm())); | |
}); | |
// node_modules/@material-ui/core/esm/colors/index.js | |
var colors_exports = {}; | |
__export(colors_exports, { | |
amber: () => amber_default, | |
blue: () => blue_default, | |
blueGrey: () => blueGrey_default, | |
brown: () => brown_default, | |
common: () => common_default, | |
cyan: () => cyan_default, | |
deepOrange: () => deepOrange_default, | |
deepPurple: () => deepPurple_default, | |
green: () => green_default, | |
grey: () => grey_default, | |
indigo: () => indigo_default, | |
lightBlue: () => lightBlue_default, | |
lightGreen: () => lightGreen_default, | |
lime: () => lime_default, | |
orange: () => orange_default, | |
pink: () => pink_default, | |
purple: () => purple_default, | |
red: () => red_default, | |
teal: () => teal_default, | |
yellow: () => yellow_default | |
}); | |
// node_modules/@material-ui/core/esm/colors/purple.js | |
var purple = { | |
50: "#f3e5f5", | |
100: "#e1bee7", | |
200: "#ce93d8", | |
300: "#ba68c8", | |
400: "#ab47bc", | |
500: "#9c27b0", | |
600: "#8e24aa", | |
700: "#7b1fa2", | |
800: "#6a1b9a", | |
900: "#4a148c", | |
A100: "#ea80fc", | |
A200: "#e040fb", | |
A400: "#d500f9", | |
A700: "#aa00ff" | |
}; | |
var purple_default = purple; | |
// node_modules/@material-ui/core/esm/colors/deepPurple.js | |
var deepPurple = { | |
50: "#ede7f6", | |
100: "#d1c4e9", | |
200: "#b39ddb", | |
300: "#9575cd", | |
400: "#7e57c2", | |
500: "#673ab7", | |
600: "#5e35b1", | |
700: "#512da8", | |
800: "#4527a0", | |
900: "#311b92", | |
A100: "#b388ff", | |
A200: "#7c4dff", | |
A400: "#651fff", | |
A700: "#6200ea" | |
}; | |
var deepPurple_default = deepPurple; | |
// node_modules/@material-ui/core/esm/colors/lightBlue.js | |
var lightBlue = { | |
50: "#e1f5fe", | |
100: "#b3e5fc", | |
200: "#81d4fa", | |
300: "#4fc3f7", | |
400: "#29b6f6", | |
500: "#03a9f4", | |
600: "#039be5", | |
700: "#0288d1", | |
800: "#0277bd", | |
900: "#01579b", | |
A100: "#80d8ff", | |
A200: "#40c4ff", | |
A400: "#00b0ff", | |
A700: "#0091ea" | |
}; | |
var lightBlue_default = lightBlue; | |
// node_modules/@material-ui/core/esm/colors/cyan.js | |
var cyan = { | |
50: "#e0f7fa", | |
100: "#b2ebf2", | |
200: "#80deea", | |
300: "#4dd0e1", | |
400: "#26c6da", | |
500: "#00bcd4", | |
600: "#00acc1", | |
700: "#0097a7", | |
800: "#00838f", | |
900: "#006064", | |
A100: "#84ffff", | |
A200: "#18ffff", | |
A400: "#00e5ff", | |
A700: "#00b8d4" | |
}; | |
var cyan_default = cyan; | |
// node_modules/@material-ui/core/esm/colors/teal.js | |
var teal = { | |
50: "#e0f2f1", | |
100: "#b2dfdb", | |
200: "#80cbc4", | |
300: "#4db6ac", | |
400: "#26a69a", | |
500: "#009688", | |
600: "#00897b", | |
700: "#00796b", | |
800: "#00695c", | |
900: "#004d40", | |
A100: "#a7ffeb", | |
A200: "#64ffda", | |
A400: "#1de9b6", | |
A700: "#00bfa5" | |
}; | |
var teal_default = teal; | |
// node_modules/@material-ui/core/esm/colors/lightGreen.js | |
var lightGreen = { | |
50: "#f1f8e9", | |
100: "#dcedc8", | |
200: "#c5e1a5", | |
300: "#aed581", | |
400: "#9ccc65", | |
500: "#8bc34a", | |
600: "#7cb342", | |
700: "#689f38", | |
800: "#558b2f", | |
900: "#33691e", | |
A100: "#ccff90", | |
A200: "#b2ff59", | |
A400: "#76ff03", | |
A700: "#64dd17" | |
}; | |
var lightGreen_default = lightGreen; | |
// node_modules/@material-ui/core/esm/colors/lime.js | |
var lime = { | |
50: "#f9fbe7", | |
100: "#f0f4c3", | |
200: "#e6ee9c", | |
300: "#dce775", | |
400: "#d4e157", | |
500: "#cddc39", | |
600: "#c0ca33", | |
700: "#afb42b", | |
800: "#9e9d24", | |
900: "#827717", | |
A100: "#f4ff81", | |
A200: "#eeff41", | |
A400: "#c6ff00", | |
A700: "#aeea00" | |
}; | |
var lime_default = lime; | |
// node_modules/@material-ui/core/esm/colors/yellow.js | |
var yellow = { | |
50: "#fffde7", | |
100: "#fff9c4", | |
200: "#fff59d", | |
300: "#fff176", | |
400: "#ffee58", | |
500: "#ffeb3b", | |
600: "#fdd835", | |
700: "#fbc02d", | |
800: "#f9a825", | |
900: "#f57f17", | |
A100: "#ffff8d", | |
A200: "#ffff00", | |
A400: "#ffea00", | |
A700: "#ffd600" | |
}; | |
var yellow_default = yellow; | |
// node_modules/@material-ui/core/esm/colors/amber.js | |
var amber = { | |
50: "#fff8e1", | |
100: "#ffecb3", | |
200: "#ffe082", | |
300: "#ffd54f", | |
400: "#ffca28", | |
500: "#ffc107", | |
600: "#ffb300", | |
700: "#ffa000", | |
800: "#ff8f00", | |
900: "#ff6f00", | |
A100: "#ffe57f", | |
A200: "#ffd740", | |
A400: "#ffc400", | |
A700: "#ffab00" | |
}; | |
var amber_default = amber; | |
// node_modules/@material-ui/core/esm/colors/deepOrange.js | |
var deepOrange = { | |
50: "#fbe9e7", | |
100: "#ffccbc", | |
200: "#ffab91", | |
300: "#ff8a65", | |
400: "#ff7043", | |
500: "#ff5722", | |
600: "#f4511e", | |
700: "#e64a19", | |
800: "#d84315", | |
900: "#bf360c", | |
A100: "#ff9e80", | |
A200: "#ff6e40", | |
A400: "#ff3d00", | |
A700: "#dd2c00" | |
}; | |
var deepOrange_default = deepOrange; | |
// node_modules/@material-ui/core/esm/colors/brown.js | |
var brown = { | |
50: "#efebe9", | |
100: "#d7ccc8", | |
200: "#bcaaa4", | |
300: "#a1887f", | |
400: "#8d6e63", | |
500: "#795548", | |
600: "#6d4c41", | |
700: "#5d4037", | |
800: "#4e342e", | |
900: "#3e2723", | |
A100: "#d7ccc8", | |
A200: "#bcaaa4", | |
A400: "#8d6e63", | |
A700: "#5d4037" | |
}; | |
var brown_default = brown; | |
// node_modules/@material-ui/core/esm/colors/blueGrey.js | |
var blueGrey = { | |
50: "#eceff1", | |
100: "#cfd8dc", | |
200: "#b0bec5", | |
300: "#90a4ae", | |
400: "#78909c", | |
500: "#607d8b", | |
600: "#546e7a", | |
700: "#455a64", | |
800: "#37474f", | |
900: "#263238", | |
A100: "#cfd8dc", | |
A200: "#b0bec5", | |
A400: "#78909c", | |
A700: "#455a64" | |
}; | |
var blueGrey_default = blueGrey; | |
// node_modules/@material-ui/core/esm/styles/colorManipulator.js | |
function intToHex(int) { | |
var hex = int.toString(16); | |
return hex.length === 1 ? "0".concat(hex) : hex; | |
} | |
function rgbToHex(color) { | |
if (color.indexOf("#") === 0) { | |
return color; | |
} | |
var _decomposeColor = decomposeColor(color), values = _decomposeColor.values; | |
return "#".concat(values.map(function(n) { | |
return intToHex(n); | |
}).join("")); | |
} | |
function emphasize(color) { | |
var coefficient = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0.15; | |
return getLuminance(color) > 0.5 ? darken(color, coefficient) : lighten(color, coefficient); | |
} | |
// node_modules/@material-ui/system/esm/borders.js | |
var borders_default = borders; | |
// node_modules/@material-ui/system/esm/css.js | |
function omit(input, fields) { | |
var output = {}; | |
Object.keys(input).forEach(function(prop) { | |
if (fields.indexOf(prop) === -1) { | |
output[prop] = input[prop]; | |
} | |
}); | |
return output; | |
} | |
function css(styleFunction2) { | |
var newStyleFunction = function newStyleFunction2(props) { | |
var output = styleFunction2(props); | |
if (props.css) { | |
return _extends({}, merge_default(output, styleFunction2(_extends({ | |
theme: props.theme | |
}, props.css))), omit(props.css, [styleFunction2.filterProps])); | |
} | |
return output; | |
}; | |
newStyleFunction.propTypes = true ? _extends({}, styleFunction2.propTypes, { | |
css: import_prop_types.default.object | |
}) : {}; | |
newStyleFunction.filterProps = ["css"].concat(_toConsumableArray(styleFunction2.filterProps)); | |
return newStyleFunction; | |
} | |
var css_default = css; | |
// node_modules/@material-ui/system/esm/flexbox.js | |
var flexbox_default = flexbox; | |
// node_modules/@material-ui/system/esm/grid.js | |
var grid_default = grid; | |
// node_modules/@material-ui/system/esm/palette.js | |
var palette_default = palette; | |
// node_modules/@material-ui/system/esm/shadows.js | |
var shadows_default = boxShadow; | |
// node_modules/@material-ui/system/esm/sizing.js | |
var sizing_default = sizing; | |
// node_modules/@material-ui/system/esm/spacing.js | |
var spacing_default = spacing; | |
// node_modules/@material-ui/system/esm/typography.js | |
var typography_default = typography; | |
// node_modules/@material-ui/core/esm/styles/createMuiStrictModeTheme.js | |
function createMuiStrictModeTheme(options) { | |
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { | |
args[_key - 1] = arguments[_key]; | |
} | |
return createMuiTheme_default.apply(void 0, [deepmerge({ | |
unstable_strictMode: true | |
}, options)].concat(args)); | |
} | |
// node_modules/@material-ui/styles/esm/ThemeProvider/ThemeProvider.js | |
var ThemeProvider_default = ThemeProvider; | |
// node_modules/@material-ui/core/esm/styles/cssUtils.js | |
function isUnitless(value) { | |
return String(parseFloat(value)).length === String(value).length; | |
} | |
function getUnit(input) { | |
return String(input).match(/[\d.\-+]*\s*(.*)/)[1] || ""; | |
} | |
function toUnitless(length) { | |
return parseFloat(length); | |
} | |
function convertLength(baseFontSize) { | |
return function(length, toUnit) { | |
var fromUnit = getUnit(length); | |
if (fromUnit === toUnit) { | |
return length; | |
} | |
var pxLength = toUnitless(length); | |
if (fromUnit !== "px") { | |
if (fromUnit === "em") { | |
pxLength = toUnitless(length) * toUnitless(baseFontSize); | |
} else if (fromUnit === "rem") { | |
pxLength = toUnitless(length) * toUnitless(baseFontSize); | |
return length; | |
} | |
} | |
var outputLength = pxLength; | |
if (toUnit !== "px") { | |
if (toUnit === "em") { | |
outputLength = pxLength / toUnitless(baseFontSize); | |
} else if (toUnit === "rem") { | |
outputLength = pxLength / toUnitless(baseFontSize); | |
} else { | |
return length; | |
} | |
} | |
return parseFloat(outputLength.toFixed(5)) + toUnit; | |
}; | |
} | |
function alignProperty(_ref5) { | |
var size = _ref5.size, grid2 = _ref5.grid; | |
var sizeBelow = size - size % grid2; | |
var sizeAbove = sizeBelow + grid2; | |
return size - sizeBelow < sizeAbove - size ? sizeBelow : sizeAbove; | |
} | |
function fontGrid(_ref23) { | |
var lineHeight = _ref23.lineHeight, pixels = _ref23.pixels, htmlFontSize = _ref23.htmlFontSize; | |
return pixels / (lineHeight * htmlFontSize); | |
} | |
function responsiveProperty(_ref33) { | |
var cssProperty = _ref33.cssProperty, min = _ref33.min, max = _ref33.max, _ref3$unit = _ref33.unit, unit = _ref3$unit === void 0 ? "rem" : _ref3$unit, _ref3$breakpoints = _ref33.breakpoints, breakpoints = _ref3$breakpoints === void 0 ? [600, 960, 1280] : _ref3$breakpoints, _ref3$transform = _ref33.transform, transform = _ref3$transform === void 0 ? null : _ref3$transform; | |
var output = _defineProperty({}, cssProperty, "".concat(min).concat(unit)); | |
var factor = (max - min) / breakpoints[breakpoints.length - 1]; | |
breakpoints.forEach(function(breakpoint) { | |
var value = min + factor * breakpoint; | |
if (transform !== null) { | |
value = transform(value); | |
} | |
output["@media (min-width:".concat(breakpoint, "px)")] = _defineProperty({}, cssProperty, "".concat(Math.round(value * 1e4) / 1e4).concat(unit)); | |
}); | |
return output; | |
} | |
// node_modules/@material-ui/core/esm/styles/responsiveFontSizes.js | |
function responsiveFontSizes(themeInput) { | |
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; | |
var _options$breakpoints = options.breakpoints, breakpoints = _options$breakpoints === void 0 ? ["sm", "md", "lg"] : _options$breakpoints, _options$disableAlign = options.disableAlign, disableAlign = _options$disableAlign === void 0 ? false : _options$disableAlign, _options$factor = options.factor, factor = _options$factor === void 0 ? 2 : _options$factor, _options$variants = options.variants, variants = _options$variants === void 0 ? ["h1", "h2", "h3", "h4", "h5", "h6", "subtitle1", "subtitle2", "body1", "body2", "caption", "button", "overline"] : _options$variants; | |
var theme = _extends({}, themeInput); | |
theme.typography = _extends({}, theme.typography); | |
var typography2 = theme.typography; | |
var convert = convertLength(typography2.htmlFontSize); | |
var breakpointValues = breakpoints.map(function(x) { | |
return theme.breakpoints.values[x]; | |
}); | |
variants.forEach(function(variant) { | |
var style = typography2[variant]; | |
var remFontSize = parseFloat(convert(style.fontSize, "rem")); | |
if (remFontSize <= 1) { | |
return; | |
} | |
var maxFontSize = remFontSize; | |
var minFontSize = 1 + (maxFontSize - 1) / factor; | |
var lineHeight = style.lineHeight; | |
if (!isUnitless(lineHeight) && !disableAlign) { | |
throw new Error(true ? "Material-UI: Unsupported non-unitless line height with grid alignment.\nUse unitless line heights instead." : formatMuiErrorMessage(6)); | |
} | |
if (!isUnitless(lineHeight)) { | |
lineHeight = parseFloat(convert(lineHeight, "rem")) / parseFloat(remFontSize); | |
} | |
var transform = null; | |
if (!disableAlign) { | |
transform = function transform2(value) { | |
return alignProperty({ | |
size: value, | |
grid: fontGrid({ | |
pixels: 4, | |
lineHeight, | |
htmlFontSize: typography2.htmlFontSize | |
}) | |
}); | |
}; | |
} | |
typography2[variant] = _extends({}, style, responsiveProperty({ | |
cssProperty: "fontSize", | |
min: minFontSize, | |
max: maxFontSize, | |
unit: "rem", | |
breakpoints: breakpointValues, | |
transform | |
})); | |
}); | |
return theme; | |
} | |
// node_modules/@material-ui/core/esm/styles/withTheme.js | |
var withTheme_default = withTheme; | |
// node_modules/@material-ui/core/esm/utils/deprecatedPropType.js | |
function deprecatedPropType(validator, reason) { | |
if (false) { | |
return function() { | |
return null; | |
}; | |
} | |
return function(props, propName, componentName, location, propFullName) { | |
var componentNameSafe = componentName || "<<anonymous>>"; | |
var propFullNameSafe = propFullName || propName; | |
if (typeof props[propName] !== "undefined") { | |
return new Error("The ".concat(location, " `").concat(propFullNameSafe, "` of ") + "`".concat(componentNameSafe, "` is deprecated. ").concat(reason)); | |
} | |
return null; | |
}; | |
} | |
// node_modules/@material-ui/core/esm/utils/isMuiElement.js | |
function isMuiElement(element, muiNames) { | |
return React3.isValidElement(element) && muiNames.indexOf(element.type.muiName) !== -1; | |
} | |
// node_modules/@material-ui/core/esm/utils/useControlled.js | |
function useControlled(_ref5) { | |
var controlled = _ref5.controlled, defaultProp = _ref5.default, name = _ref5.name, _ref$state = _ref5.state, state = _ref$state === void 0 ? "value" : _ref$state; | |
var _React$useRef = React2.useRef(controlled !== void 0), isControlled = _React$useRef.current; | |
var _React$useState = React2.useState(defaultProp), valueState = _React$useState[0], setValue = _React$useState[1]; | |
var value = isControlled ? controlled : valueState; | |
if (true) { | |
React2.useEffect(function() { | |
if (isControlled !== (controlled !== void 0)) { | |
console.error(["Material-UI: A component is changing the ".concat(isControlled ? "" : "un", "controlled ").concat(state, " state of ").concat(name, " to be ").concat(isControlled ? "un" : "", "controlled."), "Elements should not switch from uncontrolled to controlled (or vice versa).", "Decide between using a controlled or uncontrolled ".concat(name, " ") + "element for the lifetime of the component.", "The nature of the state is determined during the first render, it's considered controlled if the value is not `undefined`.", "More info: https://fb.me/react-controlled-components"].join("\n")); | |
} | |
}, [controlled]); | |
var _React$useRef2 = React2.useRef(defaultProp), defaultValue = _React$useRef2.current; | |
React2.useEffect(function() { | |
if (!isControlled && defaultValue !== defaultProp) { | |
console.error(["Material-UI: A component is changing the default ".concat(state, " state of an uncontrolled ").concat(name, " after being initialized. ") + "To suppress this warning opt to use a controlled ".concat(name, ".")].join("\n")); | |
} | |
}, [JSON.stringify(defaultProp)]); | |
} | |
var setValueIfUncontrolled = React2.useCallback(function(newValue) { | |
if (!isControlled) { | |
setValue(newValue); | |
} | |
}, []); | |
return [value, setValueIfUncontrolled]; | |
} | |
// node_modules/@material-ui/core/esm/utils/unstable_useId.js | |
function useId(idOverride) { | |
var _React$useState = React.useState(idOverride), defaultId = _React$useState[0], setDefaultId = _React$useState[1]; | |
var id = idOverride || defaultId; | |
React.useEffect(function() { | |
if (defaultId == null) { | |
setDefaultId("mui-".concat(Math.round(Math.random() * 1e5))); | |
} | |
}, [defaultId]); | |
return id; | |
} | |
// node_modules/@babel/runtime/helpers/esm/toArray.js | |
function _toArray(arr) { | |
return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); | |
} | |
// node_modules/@material-ui/core/esm/Accordion/Accordion.js | |
var React6 = __toModule(require_react()); | |
var import_react_is = __toModule(require_react_is()); | |
var import_prop_types3 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Collapse/Collapse.js | |
var React4 = __toModule(require_react()); | |
var import_prop_types2 = __toModule(require_prop_types()); | |
var styles = function styles2(theme) { | |
return { | |
container: { | |
height: 0, | |
overflow: "hidden", | |
transition: theme.transitions.create("height") | |
}, | |
entered: { | |
height: "auto", | |
overflow: "visible" | |
}, | |
hidden: { | |
visibility: "hidden" | |
}, | |
wrapper: { | |
display: "flex" | |
}, | |
wrapperInner: { | |
width: "100%" | |
} | |
}; | |
}; | |
var Collapse = React4.forwardRef(function Collapse2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$collapsedHeigh = props.collapsedHeight, collapsedHeightProp = _props$collapsedHeigh === void 0 ? "0px" : _props$collapsedHeigh, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disableStrictM = props.disableStrictModeCompat, disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM, inProp = props.in, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, style = props.style, _props$timeout = props.timeout, timeout = _props$timeout === void 0 ? duration.standard : _props$timeout, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Transition_default : _props$TransitionComp, other = _objectWithoutProperties(props, ["children", "classes", "className", "collapsedHeight", "component", "disableStrictModeCompat", "in", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "style", "timeout", "TransitionComponent"]); | |
var theme = useTheme(); | |
var timer = React4.useRef(); | |
var wrapperRef = React4.useRef(null); | |
var autoTransitionDuration = React4.useRef(); | |
var collapsedHeight = typeof collapsedHeightProp === "number" ? "".concat(collapsedHeightProp, "px") : collapsedHeightProp; | |
React4.useEffect(function() { | |
return function() { | |
clearTimeout(timer.current); | |
}; | |
}, []); | |
var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat; | |
var nodeRef = React4.useRef(null); | |
var handleRef = useForkRef(ref, enableStrictModeCompat ? nodeRef : void 0); | |
var normalizedTransitionCallback = function normalizedTransitionCallback2(callback) { | |
return function(nodeOrAppearing, maybeAppearing) { | |
if (callback) { | |
var _ref5 = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing], _ref23 = _slicedToArray(_ref5, 2), node = _ref23[0], isAppearing = _ref23[1]; | |
if (isAppearing === void 0) { | |
callback(node); | |
} else { | |
callback(node, isAppearing); | |
} | |
} | |
}; | |
}; | |
var handleEnter = normalizedTransitionCallback(function(node, isAppearing) { | |
node.style.height = collapsedHeight; | |
if (onEnter) { | |
onEnter(node, isAppearing); | |
} | |
}); | |
var handleEntering = normalizedTransitionCallback(function(node, isAppearing) { | |
var wrapperHeight = wrapperRef.current ? wrapperRef.current.clientHeight : 0; | |
var _getTransitionProps = getTransitionProps({ | |
style, | |
timeout | |
}, { | |
mode: "enter" | |
}), transitionDuration = _getTransitionProps.duration; | |
if (timeout === "auto") { | |
var duration2 = theme.transitions.getAutoHeightDuration(wrapperHeight); | |
node.style.transitionDuration = "".concat(duration2, "ms"); | |
autoTransitionDuration.current = duration2; | |
} else { | |
node.style.transitionDuration = typeof transitionDuration === "string" ? transitionDuration : "".concat(transitionDuration, "ms"); | |
} | |
node.style.height = "".concat(wrapperHeight, "px"); | |
if (onEntering) { | |
onEntering(node, isAppearing); | |
} | |
}); | |
var handleEntered = normalizedTransitionCallback(function(node, isAppearing) { | |
node.style.height = "auto"; | |
if (onEntered) { | |
onEntered(node, isAppearing); | |
} | |
}); | |
var handleExit = normalizedTransitionCallback(function(node) { | |
var wrapperHeight = wrapperRef.current ? wrapperRef.current.clientHeight : 0; | |
node.style.height = "".concat(wrapperHeight, "px"); | |
if (onExit) { | |
onExit(node); | |
} | |
}); | |
var handleExited = normalizedTransitionCallback(onExited); | |
var handleExiting = normalizedTransitionCallback(function(node) { | |
var wrapperHeight = wrapperRef.current ? wrapperRef.current.clientHeight : 0; | |
var _getTransitionProps2 = getTransitionProps({ | |
style, | |
timeout | |
}, { | |
mode: "exit" | |
}), transitionDuration = _getTransitionProps2.duration; | |
if (timeout === "auto") { | |
var duration2 = theme.transitions.getAutoHeightDuration(wrapperHeight); | |
node.style.transitionDuration = "".concat(duration2, "ms"); | |
autoTransitionDuration.current = duration2; | |
} else { | |
node.style.transitionDuration = typeof transitionDuration === "string" ? transitionDuration : "".concat(transitionDuration, "ms"); | |
} | |
node.style.height = collapsedHeight; | |
if (onExiting) { | |
onExiting(node); | |
} | |
}); | |
var addEndListener = function addEndListener2(nodeOrNext, maybeNext) { | |
var next = enableStrictModeCompat ? nodeOrNext : maybeNext; | |
if (timeout === "auto") { | |
timer.current = setTimeout(next, autoTransitionDuration.current || 0); | |
} | |
}; | |
return React4.createElement(TransitionComponent, _extends({ | |
in: inProp, | |
onEnter: handleEnter, | |
onEntered: handleEntered, | |
onEntering: handleEntering, | |
onExit: handleExit, | |
onExited: handleExited, | |
onExiting: handleExiting, | |
addEndListener, | |
nodeRef: enableStrictModeCompat ? nodeRef : void 0, | |
timeout: timeout === "auto" ? null : timeout | |
}, other), function(state, childProps) { | |
return React4.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.container, className, { | |
entered: classes.entered, | |
exited: !inProp && collapsedHeight === "0px" && classes.hidden | |
}[state]), | |
style: _extends({ | |
minHeight: collapsedHeight | |
}, style), | |
ref: handleRef | |
}, childProps), React4.createElement("div", { | |
className: classes.wrapper, | |
ref: wrapperRef | |
}, React4.createElement("div", { | |
className: classes.wrapperInner | |
}, children))); | |
}); | |
}); | |
true ? Collapse.propTypes = { | |
children: import_prop_types2.default.node, | |
classes: import_prop_types2.default.object, | |
className: import_prop_types2.default.string, | |
collapsedHeight: import_prop_types2.default.oneOfType([import_prop_types2.default.number, import_prop_types2.default.string]), | |
component: import_prop_types2.default.elementType, | |
disableStrictModeCompat: import_prop_types2.default.bool, | |
in: import_prop_types2.default.bool, | |
onEnter: import_prop_types2.default.func, | |
onEntered: import_prop_types2.default.func, | |
onEntering: import_prop_types2.default.func, | |
onExit: import_prop_types2.default.func, | |
onExited: import_prop_types2.default.func, | |
onExiting: import_prop_types2.default.func, | |
style: import_prop_types2.default.object, | |
timeout: import_prop_types2.default.oneOfType([import_prop_types2.default.oneOf(["auto"]), import_prop_types2.default.number, import_prop_types2.default.shape({ | |
appear: import_prop_types2.default.number, | |
enter: import_prop_types2.default.number, | |
exit: import_prop_types2.default.number | |
})]) | |
} : void 0; | |
Collapse.muiSupportAuto = true; | |
var Collapse_default = withStyles_default(styles, { | |
name: "MuiCollapse" | |
})(Collapse); | |
// node_modules/@material-ui/core/esm/Accordion/AccordionContext.js | |
var React5 = __toModule(require_react()); | |
var AccordionContext = React5.createContext({}); | |
if (true) { | |
AccordionContext.displayName = "AccordionContext"; | |
} | |
var AccordionContext_default = AccordionContext; | |
// node_modules/@material-ui/core/esm/Accordion/Accordion.js | |
var styles3 = function styles4(theme) { | |
var transition = { | |
duration: theme.transitions.duration.shortest | |
}; | |
return { | |
root: { | |
position: "relative", | |
transition: theme.transitions.create(["margin"], transition), | |
"&:before": { | |
position: "absolute", | |
left: 0, | |
top: -1, | |
right: 0, | |
height: 1, | |
content: '""', | |
opacity: 1, | |
backgroundColor: theme.palette.divider, | |
transition: theme.transitions.create(["opacity", "background-color"], transition) | |
}, | |
"&:first-child": { | |
"&:before": { | |
display: "none" | |
} | |
}, | |
"&$expanded": { | |
margin: "16px 0", | |
"&:first-child": { | |
marginTop: 0 | |
}, | |
"&:last-child": { | |
marginBottom: 0 | |
}, | |
"&:before": { | |
opacity: 0 | |
} | |
}, | |
"&$expanded + &": { | |
"&:before": { | |
display: "none" | |
} | |
}, | |
"&$disabled": { | |
backgroundColor: theme.palette.action.disabledBackground | |
} | |
}, | |
rounded: { | |
borderRadius: 0, | |
"&:first-child": { | |
borderTopLeftRadius: theme.shape.borderRadius, | |
borderTopRightRadius: theme.shape.borderRadius | |
}, | |
"&:last-child": { | |
borderBottomLeftRadius: theme.shape.borderRadius, | |
borderBottomRightRadius: theme.shape.borderRadius, | |
"@supports (-ms-ime-align: auto)": { | |
borderBottomLeftRadius: 0, | |
borderBottomRightRadius: 0 | |
} | |
} | |
}, | |
expanded: {}, | |
disabled: {} | |
}; | |
}; | |
var Accordion = React6.forwardRef(function Accordion2(props, ref) { | |
var childrenProp = props.children, classes = props.classes, className = props.className, _props$defaultExpande = props.defaultExpanded, defaultExpanded = _props$defaultExpande === void 0 ? false : _props$defaultExpande, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, expandedProp = props.expanded, onChange = props.onChange, _props$square = props.square, square = _props$square === void 0 ? false : _props$square, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Collapse_default : _props$TransitionComp, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["children", "classes", "className", "defaultExpanded", "disabled", "expanded", "onChange", "square", "TransitionComponent", "TransitionProps"]); | |
var _useControlled = useControlled({ | |
controlled: expandedProp, | |
default: defaultExpanded, | |
name: "Accordion", | |
state: "expanded" | |
}), _useControlled2 = _slicedToArray(_useControlled, 2), expanded = _useControlled2[0], setExpandedState = _useControlled2[1]; | |
var handleChange = React6.useCallback(function(event) { | |
setExpandedState(!expanded); | |
if (onChange) { | |
onChange(event, !expanded); | |
} | |
}, [expanded, onChange, setExpandedState]); | |
var _React$Children$toArr = React6.Children.toArray(childrenProp), _React$Children$toArr2 = _toArray(_React$Children$toArr), summary = _React$Children$toArr2[0], children = _React$Children$toArr2.slice(1); | |
var contextValue = React6.useMemo(function() { | |
return { | |
expanded, | |
disabled, | |
toggle: handleChange | |
}; | |
}, [expanded, disabled, handleChange]); | |
return React6.createElement(Paper_default, _extends({ | |
className: clsx_m_default(classes.root, className, expanded && classes.expanded, disabled && classes.disabled, !square && classes.rounded), | |
ref, | |
square | |
}, other), React6.createElement(AccordionContext_default.Provider, { | |
value: contextValue | |
}, summary), React6.createElement(TransitionComponent, _extends({ | |
in: expanded, | |
timeout: "auto" | |
}, TransitionProps), React6.createElement("div", { | |
"aria-labelledby": summary.props.id, | |
id: summary.props["aria-controls"], | |
role: "region" | |
}, children))); | |
}); | |
true ? Accordion.propTypes = { | |
children: chainPropTypes(import_prop_types3.default.node.isRequired, function(props) { | |
var summary = React6.Children.toArray(props.children)[0]; | |
if (import_react_is.isFragment(summary)) { | |
return new Error("Material-UI: The Accordion doesn't accept a Fragment as a child. Consider providing an array instead."); | |
} | |
if (!React6.isValidElement(summary)) { | |
return new Error("Material-UI: Expected the first child of Accordion to be a valid element."); | |
} | |
return null; | |
}), | |
classes: import_prop_types3.default.object, | |
className: import_prop_types3.default.string, | |
defaultExpanded: import_prop_types3.default.bool, | |
disabled: import_prop_types3.default.bool, | |
expanded: import_prop_types3.default.bool, | |
onChange: import_prop_types3.default.func, | |
square: import_prop_types3.default.bool, | |
TransitionComponent: import_prop_types3.default.elementType, | |
TransitionProps: import_prop_types3.default.object | |
} : void 0; | |
var Accordion_default = withStyles_default(styles3, { | |
name: "MuiAccordion" | |
})(Accordion); | |
// node_modules/@material-ui/core/esm/AccordionActions/AccordionActions.js | |
var React7 = __toModule(require_react()); | |
var import_prop_types4 = __toModule(require_prop_types()); | |
var styles5 = { | |
root: { | |
display: "flex", | |
alignItems: "center", | |
padding: 8, | |
justifyContent: "flex-end" | |
}, | |
spacing: { | |
"& > :not(:first-child)": { | |
marginLeft: 8 | |
} | |
} | |
}; | |
var AccordionActions = React7.forwardRef(function AccordionActions2(props, ref) { | |
var classes = props.classes, className = props.className, _props$disableSpacing = props.disableSpacing, disableSpacing = _props$disableSpacing === void 0 ? false : _props$disableSpacing, other = _objectWithoutProperties(props, ["classes", "className", "disableSpacing"]); | |
return React7.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, !disableSpacing && classes.spacing), | |
ref | |
}, other)); | |
}); | |
true ? AccordionActions.propTypes = { | |
children: import_prop_types4.default.node, | |
classes: import_prop_types4.default.object, | |
className: import_prop_types4.default.string, | |
disableSpacing: import_prop_types4.default.bool | |
} : void 0; | |
var AccordionActions_default = withStyles_default(styles5, { | |
name: "MuiAccordionActions" | |
})(AccordionActions); | |
// node_modules/@material-ui/core/esm/AccordionDetails/AccordionDetails.js | |
var React8 = __toModule(require_react()); | |
var import_prop_types5 = __toModule(require_prop_types()); | |
var styles6 = function styles7(theme) { | |
return { | |
root: { | |
display: "flex", | |
padding: theme.spacing(1, 2, 2) | |
} | |
}; | |
}; | |
var AccordionDetails = React8.forwardRef(function AccordionDetails2(props, ref) { | |
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]); | |
return React8.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other)); | |
}); | |
true ? AccordionDetails.propTypes = { | |
children: import_prop_types5.default.node, | |
classes: import_prop_types5.default.object, | |
className: import_prop_types5.default.string | |
} : void 0; | |
var AccordionDetails_default = withStyles_default(styles6, { | |
name: "MuiAccordionDetails" | |
})(AccordionDetails); | |
// node_modules/@material-ui/core/esm/AccordionSummary/AccordionSummary.js | |
var React9 = __toModule(require_react()); | |
var import_prop_types6 = __toModule(require_prop_types()); | |
var styles8 = function styles9(theme) { | |
var transition = { | |
duration: theme.transitions.duration.shortest | |
}; | |
return { | |
root: { | |
display: "flex", | |
minHeight: 8 * 6, | |
transition: theme.transitions.create(["min-height", "background-color"], transition), | |
padding: theme.spacing(0, 2), | |
"&:hover:not($disabled)": { | |
cursor: "pointer" | |
}, | |
"&$expanded": { | |
minHeight: 64 | |
}, | |
"&$focused": { | |
backgroundColor: theme.palette.action.focus | |
}, | |
"&$disabled": { | |
opacity: theme.palette.action.disabledOpacity | |
} | |
}, | |
expanded: {}, | |
focused: {}, | |
disabled: {}, | |
content: { | |
display: "flex", | |
flexGrow: 1, | |
transition: theme.transitions.create(["margin"], transition), | |
margin: "12px 0", | |
"&$expanded": { | |
margin: "20px 0" | |
} | |
}, | |
expandIcon: { | |
transform: "rotate(0deg)", | |
transition: theme.transitions.create("transform", transition), | |
"&:hover": { | |
backgroundColor: "transparent" | |
}, | |
"&$expanded": { | |
transform: "rotate(180deg)" | |
} | |
} | |
}; | |
}; | |
var AccordionSummary = React9.forwardRef(function AccordionSummary2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, expandIcon = props.expandIcon, IconButtonProps = props.IconButtonProps, onBlur = props.onBlur, onClick = props.onClick, onFocusVisible = props.onFocusVisible, other = _objectWithoutProperties(props, ["children", "classes", "className", "expandIcon", "IconButtonProps", "onBlur", "onClick", "onFocusVisible"]); | |
var _React$useState = React9.useState(false), focusedState = _React$useState[0], setFocusedState = _React$useState[1]; | |
var handleFocusVisible = function handleFocusVisible2(event) { | |
setFocusedState(true); | |
if (onFocusVisible) { | |
onFocusVisible(event); | |
} | |
}; | |
var handleBlur = function handleBlur2(event) { | |
setFocusedState(false); | |
if (onBlur) { | |
onBlur(event); | |
} | |
}; | |
var _React$useContext = React9.useContext(AccordionContext_default), _React$useContext$dis = _React$useContext.disabled, disabled = _React$useContext$dis === void 0 ? false : _React$useContext$dis, expanded = _React$useContext.expanded, toggle = _React$useContext.toggle; | |
var handleChange = function handleChange2(event) { | |
if (toggle) { | |
toggle(event); | |
} | |
if (onClick) { | |
onClick(event); | |
} | |
}; | |
return React9.createElement(ButtonBase_default, _extends({ | |
focusRipple: false, | |
disableRipple: true, | |
disabled, | |
component: "div", | |
"aria-expanded": expanded, | |
className: clsx_m_default(classes.root, className, disabled && classes.disabled, expanded && classes.expanded, focusedState && classes.focused), | |
onFocusVisible: handleFocusVisible, | |
onBlur: handleBlur, | |
onClick: handleChange, | |
ref | |
}, other), React9.createElement("div", { | |
className: clsx_m_default(classes.content, expanded && classes.expanded) | |
}, children), expandIcon && React9.createElement(IconButton_default, _extends({ | |
className: clsx_m_default(classes.expandIcon, expanded && classes.expanded), | |
edge: "end", | |
component: "div", | |
tabIndex: null, | |
role: null, | |
"aria-hidden": true | |
}, IconButtonProps), expandIcon)); | |
}); | |
true ? AccordionSummary.propTypes = { | |
children: import_prop_types6.default.node, | |
classes: import_prop_types6.default.object, | |
className: import_prop_types6.default.string, | |
expandIcon: import_prop_types6.default.node, | |
IconButtonProps: import_prop_types6.default.object, | |
onBlur: import_prop_types6.default.func, | |
onClick: import_prop_types6.default.func, | |
onFocusVisible: import_prop_types6.default.func | |
} : void 0; | |
var AccordionSummary_default = withStyles_default(styles8, { | |
name: "MuiAccordionSummary" | |
})(AccordionSummary); | |
// node_modules/@material-ui/core/esm/AppBar/AppBar.js | |
var React10 = __toModule(require_react()); | |
var import_prop_types7 = __toModule(require_prop_types()); | |
var styles10 = function styles11(theme) { | |
var backgroundColorDefault = theme.palette.type === "light" ? theme.palette.grey[100] : theme.palette.grey[900]; | |
return { | |
root: { | |
display: "flex", | |
flexDirection: "column", | |
width: "100%", | |
boxSizing: "border-box", | |
zIndex: theme.zIndex.appBar, | |
flexShrink: 0 | |
}, | |
positionFixed: { | |
position: "fixed", | |
top: 0, | |
left: "auto", | |
right: 0, | |
"@media print": { | |
position: "absolute" | |
} | |
}, | |
positionAbsolute: { | |
position: "absolute", | |
top: 0, | |
left: "auto", | |
right: 0 | |
}, | |
positionSticky: { | |
position: "sticky", | |
top: 0, | |
left: "auto", | |
right: 0 | |
}, | |
positionStatic: { | |
position: "static" | |
}, | |
positionRelative: { | |
position: "relative" | |
}, | |
colorDefault: { | |
backgroundColor: backgroundColorDefault, | |
color: theme.palette.getContrastText(backgroundColorDefault) | |
}, | |
colorPrimary: { | |
backgroundColor: theme.palette.primary.main, | |
color: theme.palette.primary.contrastText | |
}, | |
colorSecondary: { | |
backgroundColor: theme.palette.secondary.main, | |
color: theme.palette.secondary.contrastText | |
}, | |
colorInherit: { | |
color: "inherit" | |
}, | |
colorTransparent: { | |
backgroundColor: "transparent", | |
color: "inherit" | |
} | |
}; | |
}; | |
var AppBar = React10.forwardRef(function AppBar2(props, ref) { | |
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$position = props.position, position = _props$position === void 0 ? "fixed" : _props$position, other = _objectWithoutProperties(props, ["classes", "className", "color", "position"]); | |
return React10.createElement(Paper_default, _extends({ | |
square: true, | |
component: "header", | |
elevation: 4, | |
className: clsx_m_default(classes.root, classes["position".concat(capitalize(position))], classes["color".concat(capitalize(color))], className, position === "fixed" && "mui-fixed"), | |
ref | |
}, other)); | |
}); | |
true ? AppBar.propTypes = { | |
children: import_prop_types7.default.node, | |
classes: import_prop_types7.default.object, | |
className: import_prop_types7.default.string, | |
color: import_prop_types7.default.oneOf(["default", "inherit", "primary", "secondary", "transparent"]), | |
position: import_prop_types7.default.oneOf(["absolute", "fixed", "relative", "static", "sticky"]) | |
} : void 0; | |
var AppBar_default = withStyles_default(styles10, { | |
name: "MuiAppBar" | |
})(AppBar); | |
// node_modules/@material-ui/core/esm/Avatar/Avatar.js | |
var React12 = __toModule(require_react()); | |
var import_prop_types8 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/Person.js | |
var React11 = __toModule(require_react()); | |
var Person_default = createSvgIcon(React11.createElement("path", { | |
d: "M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" | |
}), "Person"); | |
// node_modules/@material-ui/core/esm/Avatar/Avatar.js | |
var styles12 = function styles13(theme) { | |
return { | |
root: { | |
position: "relative", | |
display: "flex", | |
alignItems: "center", | |
justifyContent: "center", | |
flexShrink: 0, | |
width: 40, | |
height: 40, | |
fontFamily: theme.typography.fontFamily, | |
fontSize: theme.typography.pxToRem(20), | |
lineHeight: 1, | |
borderRadius: "50%", | |
overflow: "hidden", | |
userSelect: "none" | |
}, | |
colorDefault: { | |
color: theme.palette.background.default, | |
backgroundColor: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[600] | |
}, | |
circle: {}, | |
rounded: { | |
borderRadius: theme.shape.borderRadius | |
}, | |
square: { | |
borderRadius: 0 | |
}, | |
img: { | |
width: "100%", | |
height: "100%", | |
textAlign: "center", | |
objectFit: "cover", | |
color: "transparent", | |
textIndent: 1e4 | |
}, | |
fallback: { | |
width: "75%", | |
height: "75%" | |
} | |
}; | |
}; | |
function useLoaded(_ref5) { | |
var src = _ref5.src, srcSet = _ref5.srcSet; | |
var _React$useState = React12.useState(false), loaded = _React$useState[0], setLoaded = _React$useState[1]; | |
React12.useEffect(function() { | |
if (!src && !srcSet) { | |
return void 0; | |
} | |
setLoaded(false); | |
var active = true; | |
var image = new Image(); | |
image.src = src; | |
image.srcSet = srcSet; | |
image.onload = function() { | |
if (!active) { | |
return; | |
} | |
setLoaded("loaded"); | |
}; | |
image.onerror = function() { | |
if (!active) { | |
return; | |
} | |
setLoaded("error"); | |
}; | |
return function() { | |
active = false; | |
}; | |
}, [src, srcSet]); | |
return loaded; | |
} | |
var Avatar = React12.forwardRef(function Avatar2(props, ref) { | |
var alt = props.alt, childrenProp = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, imgProps = props.imgProps, sizes = props.sizes, src = props.src, srcSet = props.srcSet, _props$variant = props.variant, variant = _props$variant === void 0 ? "circle" : _props$variant, other = _objectWithoutProperties(props, ["alt", "children", "classes", "className", "component", "imgProps", "sizes", "src", "srcSet", "variant"]); | |
var children = null; | |
var loaded = useLoaded({ | |
src, | |
srcSet | |
}); | |
var hasImg = src || srcSet; | |
var hasImgNotFailing = hasImg && loaded !== "error"; | |
if (hasImgNotFailing) { | |
children = React12.createElement("img", _extends({ | |
alt, | |
src, | |
srcSet, | |
sizes, | |
className: classes.img | |
}, imgProps)); | |
} else if (childrenProp != null) { | |
children = childrenProp; | |
} else if (hasImg && alt) { | |
children = alt[0]; | |
} else { | |
children = React12.createElement(Person_default, { | |
className: classes.fallback | |
}); | |
} | |
return React12.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, classes.system, classes[variant], className, !hasImgNotFailing && classes.colorDefault), | |
ref | |
}, other), children); | |
}); | |
true ? Avatar.propTypes = { | |
alt: import_prop_types8.default.string, | |
children: import_prop_types8.default.node, | |
classes: import_prop_types8.default.object, | |
className: import_prop_types8.default.string, | |
component: import_prop_types8.default.elementType, | |
imgProps: import_prop_types8.default.object, | |
sizes: import_prop_types8.default.string, | |
src: import_prop_types8.default.string, | |
srcSet: import_prop_types8.default.string, | |
variant: import_prop_types8.default.oneOf(["circle", "rounded", "square"]) | |
} : void 0; | |
var Avatar_default = withStyles_default(styles12, { | |
name: "MuiAvatar" | |
})(Avatar); | |
// node_modules/@material-ui/core/esm/Badge/Badge.js | |
var React13 = __toModule(require_react()); | |
var import_prop_types9 = __toModule(require_prop_types()); | |
var RADIUS_STANDARD = 10; | |
var RADIUS_DOT = 4; | |
var styles14 = function styles15(theme) { | |
return { | |
root: { | |
position: "relative", | |
display: "inline-flex", | |
verticalAlign: "middle", | |
flexShrink: 0 | |
}, | |
badge: { | |
display: "flex", | |
flexDirection: "row", | |
flexWrap: "wrap", | |
justifyContent: "center", | |
alignContent: "center", | |
alignItems: "center", | |
position: "absolute", | |
boxSizing: "border-box", | |
fontFamily: theme.typography.fontFamily, | |
fontWeight: theme.typography.fontWeightMedium, | |
fontSize: theme.typography.pxToRem(12), | |
minWidth: RADIUS_STANDARD * 2, | |
lineHeight: 1, | |
padding: "0 6px", | |
height: RADIUS_STANDARD * 2, | |
borderRadius: RADIUS_STANDARD, | |
zIndex: 1, | |
transition: theme.transitions.create("transform", { | |
easing: theme.transitions.easing.easeInOut, | |
duration: theme.transitions.duration.enteringScreen | |
}) | |
}, | |
colorPrimary: { | |
backgroundColor: theme.palette.primary.main, | |
color: theme.palette.primary.contrastText | |
}, | |
colorSecondary: { | |
backgroundColor: theme.palette.secondary.main, | |
color: theme.palette.secondary.contrastText | |
}, | |
colorError: { | |
backgroundColor: theme.palette.error.main, | |
color: theme.palette.error.contrastText | |
}, | |
dot: { | |
borderRadius: RADIUS_DOT, | |
height: RADIUS_DOT * 2, | |
minWidth: RADIUS_DOT * 2, | |
padding: 0 | |
}, | |
anchorOriginTopRightRectangle: { | |
top: 0, | |
right: 0, | |
transform: "scale(1) translate(50%, -50%)", | |
transformOrigin: "100% 0%", | |
"&$invisible": { | |
transform: "scale(0) translate(50%, -50%)" | |
} | |
}, | |
anchorOriginBottomRightRectangle: { | |
bottom: 0, | |
right: 0, | |
transform: "scale(1) translate(50%, 50%)", | |
transformOrigin: "100% 100%", | |
"&$invisible": { | |
transform: "scale(0) translate(50%, 50%)" | |
} | |
}, | |
anchorOriginTopLeftRectangle: { | |
top: 0, | |
left: 0, | |
transform: "scale(1) translate(-50%, -50%)", | |
transformOrigin: "0% 0%", | |
"&$invisible": { | |
transform: "scale(0) translate(-50%, -50%)" | |
} | |
}, | |
anchorOriginBottomLeftRectangle: { | |
bottom: 0, | |
left: 0, | |
transform: "scale(1) translate(-50%, 50%)", | |
transformOrigin: "0% 100%", | |
"&$invisible": { | |
transform: "scale(0) translate(-50%, 50%)" | |
} | |
}, | |
anchorOriginTopRightCircle: { | |
top: "14%", | |
right: "14%", | |
transform: "scale(1) translate(50%, -50%)", | |
transformOrigin: "100% 0%", | |
"&$invisible": { | |
transform: "scale(0) translate(50%, -50%)" | |
} | |
}, | |
anchorOriginBottomRightCircle: { | |
bottom: "14%", | |
right: "14%", | |
transform: "scale(1) translate(50%, 50%)", | |
transformOrigin: "100% 100%", | |
"&$invisible": { | |
transform: "scale(0) translate(50%, 50%)" | |
} | |
}, | |
anchorOriginTopLeftCircle: { | |
top: "14%", | |
left: "14%", | |
transform: "scale(1) translate(-50%, -50%)", | |
transformOrigin: "0% 0%", | |
"&$invisible": { | |
transform: "scale(0) translate(-50%, -50%)" | |
} | |
}, | |
anchorOriginBottomLeftCircle: { | |
bottom: "14%", | |
left: "14%", | |
transform: "scale(1) translate(-50%, 50%)", | |
transformOrigin: "0% 100%", | |
"&$invisible": { | |
transform: "scale(0) translate(-50%, 50%)" | |
} | |
}, | |
invisible: { | |
transition: theme.transitions.create("transform", { | |
easing: theme.transitions.easing.easeInOut, | |
duration: theme.transitions.duration.leavingScreen | |
}) | |
} | |
}; | |
}; | |
var Badge = React13.forwardRef(function Badge2(props, ref) { | |
var _props$anchorOrigin = props.anchorOrigin, anchorOrigin = _props$anchorOrigin === void 0 ? { | |
vertical: "top", | |
horizontal: "right" | |
} : _props$anchorOrigin, badgeContent = props.badgeContent, children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, _props$component = props.component, ComponentProp = _props$component === void 0 ? "span" : _props$component, invisibleProp = props.invisible, _props$max = props.max, max = _props$max === void 0 ? 99 : _props$max, _props$overlap = props.overlap, overlap = _props$overlap === void 0 ? "rectangle" : _props$overlap, _props$showZero = props.showZero, showZero = _props$showZero === void 0 ? false : _props$showZero, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["anchorOrigin", "badgeContent", "children", "classes", "className", "color", "component", "invisible", "max", "overlap", "showZero", "variant"]); | |
var invisible = invisibleProp; | |
if (invisibleProp == null && (badgeContent === 0 && !showZero || badgeContent == null && variant !== "dot")) { | |
invisible = true; | |
} | |
var displayValue = ""; | |
if (variant !== "dot") { | |
displayValue = badgeContent > max ? "".concat(max, "+") : badgeContent; | |
} | |
return React13.createElement(ComponentProp, _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other), children, React13.createElement("span", { | |
className: clsx_m_default(classes.badge, classes["".concat(anchorOrigin.horizontal).concat(capitalize(anchorOrigin.vertical), "}")], classes["anchorOrigin".concat(capitalize(anchorOrigin.vertical)).concat(capitalize(anchorOrigin.horizontal)).concat(capitalize(overlap))], color !== "default" && classes["color".concat(capitalize(color))], invisible && classes.invisible, variant === "dot" && classes.dot) | |
}, displayValue)); | |
}); | |
true ? Badge.propTypes = { | |
anchorOrigin: import_prop_types9.default.shape({ | |
horizontal: import_prop_types9.default.oneOf(["left", "right"]).isRequired, | |
vertical: import_prop_types9.default.oneOf(["bottom", "top"]).isRequired | |
}), | |
badgeContent: import_prop_types9.default.node, | |
children: import_prop_types9.default.node, | |
classes: import_prop_types9.default.object, | |
className: import_prop_types9.default.string, | |
color: import_prop_types9.default.oneOf(["default", "error", "primary", "secondary"]), | |
component: import_prop_types9.default.elementType, | |
invisible: import_prop_types9.default.bool, | |
max: import_prop_types9.default.number, | |
overlap: import_prop_types9.default.oneOf(["circle", "rectangle"]), | |
showZero: import_prop_types9.default.bool, | |
variant: import_prop_types9.default.oneOf(["dot", "standard"]) | |
} : void 0; | |
var Badge_default = withStyles_default(styles14, { | |
name: "MuiBadge" | |
})(Badge); | |
// node_modules/@material-ui/core/esm/BottomNavigation/BottomNavigation.js | |
var React14 = __toModule(require_react()); | |
var import_react_is2 = __toModule(require_react_is()); | |
var import_prop_types10 = __toModule(require_prop_types()); | |
var styles16 = function styles17(theme) { | |
return { | |
root: { | |
display: "flex", | |
justifyContent: "center", | |
height: 56, | |
backgroundColor: theme.palette.background.paper | |
} | |
}; | |
}; | |
var BottomNavigation = React14.forwardRef(function BottomNavigation2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, onChange = props.onChange, _props$showLabels = props.showLabels, showLabels = _props$showLabels === void 0 ? false : _props$showLabels, value = props.value, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "onChange", "showLabels", "value"]); | |
return React14.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other), React14.Children.map(children, function(child, childIndex) { | |
if (!React14.isValidElement(child)) { | |
return null; | |
} | |
if (true) { | |
if (import_react_is2.isFragment(child)) { | |
console.error(["Material-UI: The BottomNavigation component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n")); | |
} | |
} | |
var childValue = child.props.value === void 0 ? childIndex : child.props.value; | |
return React14.cloneElement(child, { | |
selected: childValue === value, | |
showLabel: child.props.showLabel !== void 0 ? child.props.showLabel : showLabels, | |
value: childValue, | |
onChange | |
}); | |
})); | |
}); | |
true ? BottomNavigation.propTypes = { | |
children: import_prop_types10.default.node, | |
classes: import_prop_types10.default.object, | |
className: import_prop_types10.default.string, | |
component: import_prop_types10.default.elementType, | |
onChange: import_prop_types10.default.func, | |
showLabels: import_prop_types10.default.bool, | |
value: import_prop_types10.default.any | |
} : void 0; | |
var BottomNavigation_default = withStyles_default(styles16, { | |
name: "MuiBottomNavigation" | |
})(BottomNavigation); | |
// node_modules/@material-ui/core/esm/BottomNavigationAction/BottomNavigationAction.js | |
var React15 = __toModule(require_react()); | |
var import_prop_types11 = __toModule(require_prop_types()); | |
var styles18 = function styles19(theme) { | |
return { | |
root: { | |
transition: theme.transitions.create(["color", "padding-top"], { | |
duration: theme.transitions.duration.short | |
}), | |
padding: "6px 12px 8px", | |
minWidth: 80, | |
maxWidth: 168, | |
color: theme.palette.text.secondary, | |
flex: "1", | |
"&$iconOnly": { | |
paddingTop: 16 | |
}, | |
"&$selected": { | |
paddingTop: 6, | |
color: theme.palette.primary.main | |
} | |
}, | |
selected: {}, | |
iconOnly: {}, | |
wrapper: { | |
display: "inline-flex", | |
alignItems: "center", | |
justifyContent: "center", | |
width: "100%", | |
flexDirection: "column" | |
}, | |
label: { | |
fontFamily: theme.typography.fontFamily, | |
fontSize: theme.typography.pxToRem(12), | |
opacity: 1, | |
transition: "font-size 0.2s, opacity 0.2s", | |
transitionDelay: "0.1s", | |
"&$iconOnly": { | |
opacity: 0, | |
transitionDelay: "0s" | |
}, | |
"&$selected": { | |
fontSize: theme.typography.pxToRem(14) | |
} | |
} | |
}; | |
}; | |
var BottomNavigationAction = React15.forwardRef(function BottomNavigationAction2(props, ref) { | |
var classes = props.classes, className = props.className, icon = props.icon, label = props.label, onChange = props.onChange, onClick = props.onClick, selected = props.selected, showLabel = props.showLabel, value = props.value, other = _objectWithoutProperties(props, ["classes", "className", "icon", "label", "onChange", "onClick", "selected", "showLabel", "value"]); | |
var handleChange = function handleChange2(event) { | |
if (onChange) { | |
onChange(event, value); | |
} | |
if (onClick) { | |
onClick(event); | |
} | |
}; | |
return React15.createElement(ButtonBase_default, _extends({ | |
ref, | |
className: clsx_m_default(classes.root, className, selected ? classes.selected : !showLabel && classes.iconOnly), | |
focusRipple: true, | |
onClick: handleChange | |
}, other), React15.createElement("span", { | |
className: classes.wrapper | |
}, icon, React15.createElement("span", { | |
className: clsx_m_default(classes.label, selected ? classes.selected : !showLabel && classes.iconOnly) | |
}, label))); | |
}); | |
true ? BottomNavigationAction.propTypes = { | |
children: unsupportedProp, | |
classes: import_prop_types11.default.object, | |
className: import_prop_types11.default.string, | |
icon: import_prop_types11.default.node, | |
label: import_prop_types11.default.node, | |
onChange: import_prop_types11.default.func, | |
onClick: import_prop_types11.default.func, | |
selected: import_prop_types11.default.bool, | |
showLabel: import_prop_types11.default.bool, | |
value: import_prop_types11.default.any | |
} : void 0; | |
var BottomNavigationAction_default = withStyles_default(styles18, { | |
name: "MuiBottomNavigationAction" | |
})(BottomNavigationAction); | |
// node_modules/@material-ui/core/esm/Box/Box.js | |
var styleFunction = css_default(compose_default(borders_default, display_default, flexbox_default, grid_default, positions_default, palette_default, shadows_default, sizing_default, spacing_default, typography_default)); | |
var Box = styled_default("div")(styleFunction, { | |
name: "MuiBox" | |
}); | |
var Box_default = Box; | |
// node_modules/@material-ui/core/esm/Breadcrumbs/Breadcrumbs.js | |
var React18 = __toModule(require_react()); | |
var import_react_is3 = __toModule(require_react_is()); | |
var import_prop_types13 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Breadcrumbs/BreadcrumbCollapsed.js | |
var React17 = __toModule(require_react()); | |
var import_prop_types12 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/MoreHoriz.js | |
var React16 = __toModule(require_react()); | |
var MoreHoriz_default = createSvgIcon(React16.createElement("path", { | |
d: "M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" | |
}), "MoreHoriz"); | |
// node_modules/@material-ui/core/esm/Breadcrumbs/BreadcrumbCollapsed.js | |
var styles20 = function styles21(theme) { | |
return { | |
root: { | |
display: "flex", | |
marginLeft: theme.spacing(0.5), | |
marginRight: theme.spacing(0.5), | |
backgroundColor: theme.palette.grey[100], | |
color: theme.palette.grey[700], | |
borderRadius: 2, | |
cursor: "pointer", | |
"&:hover, &:focus": { | |
backgroundColor: theme.palette.grey[200] | |
}, | |
"&:active": { | |
boxShadow: theme.shadows[0], | |
backgroundColor: emphasize(theme.palette.grey[200], 0.12) | |
} | |
}, | |
icon: { | |
width: 24, | |
height: 16 | |
} | |
}; | |
}; | |
function BreadcrumbCollapsed(props) { | |
var classes = props.classes, other = _objectWithoutProperties(props, ["classes"]); | |
return React17.createElement(ButtonBase_default, _extends({ | |
component: "li", | |
className: classes.root, | |
focusRipple: true | |
}, other), React17.createElement(MoreHoriz_default, { | |
className: classes.icon | |
})); | |
} | |
true ? BreadcrumbCollapsed.propTypes = { | |
classes: import_prop_types12.default.object.isRequired | |
} : void 0; | |
var BreadcrumbCollapsed_default = withStyles_default(styles20, { | |
name: "PrivateBreadcrumbCollapsed" | |
})(BreadcrumbCollapsed); | |
// node_modules/@material-ui/core/esm/Breadcrumbs/Breadcrumbs.js | |
var styles22 = { | |
root: {}, | |
ol: { | |
display: "flex", | |
flexWrap: "wrap", | |
alignItems: "center", | |
padding: 0, | |
margin: 0, | |
listStyle: "none" | |
}, | |
li: {}, | |
separator: { | |
display: "flex", | |
userSelect: "none", | |
marginLeft: 8, | |
marginRight: 8 | |
} | |
}; | |
function insertSeparators(items, className, separator) { | |
return items.reduce(function(acc, current, index) { | |
if (index < items.length - 1) { | |
acc = acc.concat(current, React18.createElement("li", { | |
"aria-hidden": true, | |
key: "separator-".concat(index), | |
className | |
}, separator)); | |
} else { | |
acc.push(current); | |
} | |
return acc; | |
}, []); | |
} | |
var Breadcrumbs = React18.forwardRef(function Breadcrumbs2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "nav" : _props$component, _props$expandText = props.expandText, expandText = _props$expandText === void 0 ? "Show path" : _props$expandText, _props$itemsAfterColl = props.itemsAfterCollapse, itemsAfterCollapse = _props$itemsAfterColl === void 0 ? 1 : _props$itemsAfterColl, _props$itemsBeforeCol = props.itemsBeforeCollapse, itemsBeforeCollapse = _props$itemsBeforeCol === void 0 ? 1 : _props$itemsBeforeCol, _props$maxItems = props.maxItems, maxItems = _props$maxItems === void 0 ? 8 : _props$maxItems, _props$separator = props.separator, separator = _props$separator === void 0 ? "/" : _props$separator, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "expandText", "itemsAfterCollapse", "itemsBeforeCollapse", "maxItems", "separator"]); | |
var _React$useState = React18.useState(false), expanded = _React$useState[0], setExpanded = _React$useState[1]; | |
var renderItemsBeforeAndAfter = function renderItemsBeforeAndAfter2(allItems2) { | |
var handleClickExpand = function handleClickExpand2(event) { | |
setExpanded(true); | |
var focusable = event.currentTarget.parentNode.querySelector("a[href],button,[tabindex]"); | |
if (focusable) { | |
focusable.focus(); | |
} | |
}; | |
if (itemsBeforeCollapse + itemsAfterCollapse >= allItems2.length) { | |
if (true) { | |
console.error(["Material-UI: You have provided an invalid combination of props to the Breadcrumbs.", "itemsAfterCollapse={".concat(itemsAfterCollapse, "} + itemsBeforeCollapse={").concat(itemsBeforeCollapse, "} >= maxItems={").concat(maxItems, "}")].join("\n")); | |
} | |
return allItems2; | |
} | |
return [].concat(_toConsumableArray(allItems2.slice(0, itemsBeforeCollapse)), [React18.createElement(BreadcrumbCollapsed_default, { | |
"aria-label": expandText, | |
key: "ellipsis", | |
onClick: handleClickExpand | |
})], _toConsumableArray(allItems2.slice(allItems2.length - itemsAfterCollapse, allItems2.length))); | |
}; | |
var allItems = React18.Children.toArray(children).filter(function(child) { | |
if (true) { | |
if (import_react_is3.isFragment(child)) { | |
console.error(["Material-UI: The Breadcrumbs component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n")); | |
} | |
} | |
return React18.isValidElement(child); | |
}).map(function(child, index) { | |
return React18.createElement("li", { | |
className: classes.li, | |
key: "child-".concat(index) | |
}, child); | |
}); | |
return React18.createElement(Typography_default, _extends({ | |
ref, | |
component: Component3, | |
color: "textSecondary", | |
className: clsx_m_default(classes.root, className) | |
}, other), React18.createElement("ol", { | |
className: classes.ol | |
}, insertSeparators(expanded || maxItems && allItems.length <= maxItems ? allItems : renderItemsBeforeAndAfter(allItems), classes.separator, separator))); | |
}); | |
true ? Breadcrumbs.propTypes = { | |
children: import_prop_types13.default.node, | |
classes: import_prop_types13.default.object, | |
className: import_prop_types13.default.string, | |
component: import_prop_types13.default.elementType, | |
expandText: import_prop_types13.default.string, | |
itemsAfterCollapse: import_prop_types13.default.number, | |
itemsBeforeCollapse: import_prop_types13.default.number, | |
maxItems: import_prop_types13.default.number, | |
separator: import_prop_types13.default.node | |
} : void 0; | |
var Breadcrumbs_default = withStyles_default(styles22, { | |
name: "MuiBreadcrumbs" | |
})(Breadcrumbs); | |
// node_modules/@material-ui/core/esm/ButtonGroup/ButtonGroup.js | |
var React19 = __toModule(require_react()); | |
var import_react_is4 = __toModule(require_react_is()); | |
var import_prop_types14 = __toModule(require_prop_types()); | |
Button_default.styles; | |
var styles23 = function styles24(theme) { | |
return { | |
root: { | |
display: "inline-flex", | |
borderRadius: theme.shape.borderRadius | |
}, | |
contained: { | |
boxShadow: theme.shadows[2] | |
}, | |
disableElevation: { | |
boxShadow: "none" | |
}, | |
disabled: {}, | |
fullWidth: { | |
width: "100%" | |
}, | |
vertical: { | |
flexDirection: "column" | |
}, | |
grouped: { | |
minWidth: 40 | |
}, | |
groupedHorizontal: { | |
"&:not(:first-child)": { | |
borderTopLeftRadius: 0, | |
borderBottomLeftRadius: 0 | |
}, | |
"&:not(:last-child)": { | |
borderTopRightRadius: 0, | |
borderBottomRightRadius: 0 | |
} | |
}, | |
groupedVertical: { | |
"&:not(:first-child)": { | |
borderTopRightRadius: 0, | |
borderTopLeftRadius: 0 | |
}, | |
"&:not(:last-child)": { | |
borderBottomRightRadius: 0, | |
borderBottomLeftRadius: 0 | |
} | |
}, | |
groupedText: {}, | |
groupedTextHorizontal: { | |
"&:not(:last-child)": { | |
borderRight: "1px solid ".concat(theme.palette.type === "light" ? "rgba(0, 0, 0, 0.23)" : "rgba(255, 255, 255, 0.23)") | |
} | |
}, | |
groupedTextVertical: { | |
"&:not(:last-child)": { | |
borderBottom: "1px solid ".concat(theme.palette.type === "light" ? "rgba(0, 0, 0, 0.23)" : "rgba(255, 255, 255, 0.23)") | |
} | |
}, | |
groupedTextPrimary: { | |
"&:not(:last-child)": { | |
borderColor: fade(theme.palette.primary.main, 0.5) | |
} | |
}, | |
groupedTextSecondary: { | |
"&:not(:last-child)": { | |
borderColor: fade(theme.palette.secondary.main, 0.5) | |
} | |
}, | |
groupedOutlined: {}, | |
groupedOutlinedHorizontal: { | |
"&:not(:first-child)": { | |
marginLeft: -1 | |
}, | |
"&:not(:last-child)": { | |
borderRightColor: "transparent" | |
} | |
}, | |
groupedOutlinedVertical: { | |
"&:not(:first-child)": { | |
marginTop: -1 | |
}, | |
"&:not(:last-child)": { | |
borderBottomColor: "transparent" | |
} | |
}, | |
groupedOutlinedPrimary: { | |
"&:hover": { | |
borderColor: theme.palette.primary.main | |
} | |
}, | |
groupedOutlinedSecondary: { | |
"&:hover": { | |
borderColor: theme.palette.secondary.main | |
} | |
}, | |
groupedContained: { | |
boxShadow: "none" | |
}, | |
groupedContainedHorizontal: { | |
"&:not(:last-child)": { | |
borderRight: "1px solid ".concat(theme.palette.grey[400]), | |
"&$disabled": { | |
borderRight: "1px solid ".concat(theme.palette.action.disabled) | |
} | |
} | |
}, | |
groupedContainedVertical: { | |
"&:not(:last-child)": { | |
borderBottom: "1px solid ".concat(theme.palette.grey[400]), | |
"&$disabled": { | |
borderBottom: "1px solid ".concat(theme.palette.action.disabled) | |
} | |
} | |
}, | |
groupedContainedPrimary: { | |
"&:not(:last-child)": { | |
borderColor: theme.palette.primary.dark | |
} | |
}, | |
groupedContainedSecondary: { | |
"&:not(:last-child)": { | |
borderColor: theme.palette.secondary.dark | |
} | |
} | |
}; | |
}; | |
var ButtonGroup = React19.forwardRef(function ButtonGroup2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$disableElevati = props.disableElevation, disableElevation = _props$disableElevati === void 0 ? false : _props$disableElevati, _props$disableFocusRi = props.disableFocusRipple, disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi, _props$disableRipple = props.disableRipple, disableRipple = _props$disableRipple === void 0 ? false : _props$disableRipple, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, _props$variant = props.variant, variant = _props$variant === void 0 ? "outlined" : _props$variant, other = _objectWithoutProperties(props, ["children", "classes", "className", "color", "component", "disabled", "disableElevation", "disableFocusRipple", "disableRipple", "fullWidth", "orientation", "size", "variant"]); | |
var buttonClassName = clsx_m_default(classes.grouped, classes["grouped".concat(capitalize(orientation))], classes["grouped".concat(capitalize(variant))], classes["grouped".concat(capitalize(variant)).concat(capitalize(orientation))], classes["grouped".concat(capitalize(variant)).concat(color !== "default" ? capitalize(color) : "")], disabled && classes.disabled); | |
return React19.createElement(Component3, _extends({ | |
role: "group", | |
className: clsx_m_default(classes.root, className, fullWidth && classes.fullWidth, disableElevation && classes.disableElevation, variant === "contained" && classes.contained, orientation === "vertical" && classes.vertical), | |
ref | |
}, other), React19.Children.map(children, function(child) { | |
if (!React19.isValidElement(child)) { | |
return null; | |
} | |
if (true) { | |
if (import_react_is4.isFragment(child)) { | |
console.error(["Material-UI: The ButtonGroup component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n")); | |
} | |
} | |
return React19.cloneElement(child, { | |
className: clsx_m_default(buttonClassName, child.props.className), | |
color: child.props.color || color, | |
disabled: child.props.disabled || disabled, | |
disableElevation: child.props.disableElevation || disableElevation, | |
disableFocusRipple, | |
disableRipple, | |
fullWidth, | |
size: child.props.size || size, | |
variant: child.props.variant || variant | |
}); | |
})); | |
}); | |
true ? ButtonGroup.propTypes = { | |
children: import_prop_types14.default.node, | |
classes: import_prop_types14.default.object, | |
className: import_prop_types14.default.string, | |
color: import_prop_types14.default.oneOf(["default", "inherit", "primary", "secondary"]), | |
component: import_prop_types14.default.elementType, | |
disabled: import_prop_types14.default.bool, | |
disableElevation: import_prop_types14.default.bool, | |
disableFocusRipple: import_prop_types14.default.bool, | |
disableRipple: import_prop_types14.default.bool, | |
fullWidth: import_prop_types14.default.bool, | |
orientation: import_prop_types14.default.oneOf(["horizontal", "vertical"]), | |
size: import_prop_types14.default.oneOf(["large", "medium", "small"]), | |
variant: import_prop_types14.default.oneOf(["contained", "outlined", "text"]) | |
} : void 0; | |
var ButtonGroup_default = withStyles_default(styles23, { | |
name: "MuiButtonGroup" | |
})(ButtonGroup); | |
// node_modules/@material-ui/core/esm/Card/Card.js | |
var React20 = __toModule(require_react()); | |
var import_prop_types15 = __toModule(require_prop_types()); | |
var styles25 = { | |
root: { | |
overflow: "hidden" | |
} | |
}; | |
var Card = React20.forwardRef(function Card2(props, ref) { | |
var classes = props.classes, className = props.className, _props$raised = props.raised, raised = _props$raised === void 0 ? false : _props$raised, other = _objectWithoutProperties(props, ["classes", "className", "raised"]); | |
return React20.createElement(Paper_default, _extends({ | |
className: clsx_m_default(classes.root, className), | |
elevation: raised ? 8 : 1, | |
ref | |
}, other)); | |
}); | |
true ? Card.propTypes = { | |
children: import_prop_types15.default.node, | |
classes: import_prop_types15.default.object, | |
className: import_prop_types15.default.string, | |
raised: import_prop_types15.default.bool | |
} : void 0; | |
var Card_default = withStyles_default(styles25, { | |
name: "MuiCard" | |
})(Card); | |
// node_modules/@material-ui/core/esm/CardActionArea/CardActionArea.js | |
var React21 = __toModule(require_react()); | |
var import_prop_types16 = __toModule(require_prop_types()); | |
var styles26 = function styles27(theme) { | |
return { | |
root: { | |
display: "block", | |
textAlign: "inherit", | |
width: "100%", | |
"&:hover $focusHighlight": { | |
opacity: theme.palette.action.hoverOpacity | |
}, | |
"&$focusVisible $focusHighlight": { | |
opacity: 0.12 | |
} | |
}, | |
focusVisible: {}, | |
focusHighlight: { | |
overflow: "hidden", | |
pointerEvents: "none", | |
position: "absolute", | |
top: 0, | |
right: 0, | |
bottom: 0, | |
left: 0, | |
borderRadius: "inherit", | |
opacity: 0, | |
backgroundColor: "currentcolor", | |
transition: theme.transitions.create("opacity", { | |
duration: theme.transitions.duration.short | |
}) | |
} | |
}; | |
}; | |
var CardActionArea = React21.forwardRef(function CardActionArea2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, focusVisibleClassName = props.focusVisibleClassName, other = _objectWithoutProperties(props, ["children", "classes", "className", "focusVisibleClassName"]); | |
return React21.createElement(ButtonBase_default, _extends({ | |
className: clsx_m_default(classes.root, className), | |
focusVisibleClassName: clsx_m_default(focusVisibleClassName, classes.focusVisible), | |
ref | |
}, other), children, React21.createElement("span", { | |
className: classes.focusHighlight | |
})); | |
}); | |
true ? CardActionArea.propTypes = { | |
children: import_prop_types16.default.node, | |
classes: import_prop_types16.default.object, | |
className: import_prop_types16.default.string, | |
focusVisibleClassName: import_prop_types16.default.string | |
} : void 0; | |
var CardActionArea_default = withStyles_default(styles26, { | |
name: "MuiCardActionArea" | |
})(CardActionArea); | |
// node_modules/@material-ui/core/esm/CardActions/CardActions.js | |
var React22 = __toModule(require_react()); | |
var import_prop_types17 = __toModule(require_prop_types()); | |
var styles28 = { | |
root: { | |
display: "flex", | |
alignItems: "center", | |
padding: 8 | |
}, | |
spacing: { | |
"& > :not(:first-child)": { | |
marginLeft: 8 | |
} | |
} | |
}; | |
var CardActions = React22.forwardRef(function CardActions2(props, ref) { | |
var _props$disableSpacing = props.disableSpacing, disableSpacing = _props$disableSpacing === void 0 ? false : _props$disableSpacing, classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["disableSpacing", "classes", "className"]); | |
return React22.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, !disableSpacing && classes.spacing), | |
ref | |
}, other)); | |
}); | |
true ? CardActions.propTypes = { | |
children: import_prop_types17.default.node, | |
classes: import_prop_types17.default.object, | |
className: import_prop_types17.default.string, | |
disableSpacing: import_prop_types17.default.bool | |
} : void 0; | |
var CardActions_default = withStyles_default(styles28, { | |
name: "MuiCardActions" | |
})(CardActions); | |
// node_modules/@material-ui/core/esm/CardContent/CardContent.js | |
var React23 = __toModule(require_react()); | |
var import_prop_types18 = __toModule(require_prop_types()); | |
var styles29 = { | |
root: { | |
padding: 16, | |
"&:last-child": { | |
paddingBottom: 24 | |
} | |
} | |
}; | |
var CardContent = React23.forwardRef(function CardContent2(props, ref) { | |
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]); | |
return React23.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other)); | |
}); | |
true ? CardContent.propTypes = { | |
children: import_prop_types18.default.node, | |
classes: import_prop_types18.default.object, | |
className: import_prop_types18.default.string, | |
component: import_prop_types18.default.elementType | |
} : void 0; | |
var CardContent_default = withStyles_default(styles29, { | |
name: "MuiCardContent" | |
})(CardContent); | |
// node_modules/@material-ui/core/esm/CardHeader/CardHeader.js | |
var React24 = __toModule(require_react()); | |
var import_prop_types19 = __toModule(require_prop_types()); | |
var styles30 = { | |
root: { | |
display: "flex", | |
alignItems: "center", | |
padding: 16 | |
}, | |
avatar: { | |
flex: "0 0 auto", | |
marginRight: 16 | |
}, | |
action: { | |
flex: "0 0 auto", | |
alignSelf: "flex-start", | |
marginTop: -8, | |
marginRight: -8 | |
}, | |
content: { | |
flex: "1 1 auto" | |
}, | |
title: {}, | |
subheader: {} | |
}; | |
var CardHeader = React24.forwardRef(function CardHeader2(props, ref) { | |
var action = props.action, avatar = props.avatar, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disableTypogra = props.disableTypography, disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra, subheaderProp = props.subheader, subheaderTypographyProps = props.subheaderTypographyProps, titleProp = props.title, titleTypographyProps = props.titleTypographyProps, other = _objectWithoutProperties(props, ["action", "avatar", "classes", "className", "component", "disableTypography", "subheader", "subheaderTypographyProps", "title", "titleTypographyProps"]); | |
var title = titleProp; | |
if (title != null && title.type !== Typography_default && !disableTypography) { | |
title = React24.createElement(Typography_default, _extends({ | |
variant: avatar ? "body2" : "h5", | |
className: classes.title, | |
component: "span", | |
display: "block" | |
}, titleTypographyProps), title); | |
} | |
var subheader = subheaderProp; | |
if (subheader != null && subheader.type !== Typography_default && !disableTypography) { | |
subheader = React24.createElement(Typography_default, _extends({ | |
variant: avatar ? "body2" : "body1", | |
className: classes.subheader, | |
color: "textSecondary", | |
component: "span", | |
display: "block" | |
}, subheaderTypographyProps), subheader); | |
} | |
return React24.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other), avatar && React24.createElement("div", { | |
className: classes.avatar | |
}, avatar), React24.createElement("div", { | |
className: classes.content | |
}, title, subheader), action && React24.createElement("div", { | |
className: classes.action | |
}, action)); | |
}); | |
true ? CardHeader.propTypes = { | |
action: import_prop_types19.default.node, | |
avatar: import_prop_types19.default.node, | |
children: import_prop_types19.default.node, | |
classes: import_prop_types19.default.object, | |
className: import_prop_types19.default.string, | |
component: import_prop_types19.default.elementType, | |
disableTypography: import_prop_types19.default.bool, | |
subheader: import_prop_types19.default.node, | |
subheaderTypographyProps: import_prop_types19.default.object, | |
title: import_prop_types19.default.node, | |
titleTypographyProps: import_prop_types19.default.object | |
} : void 0; | |
var CardHeader_default = withStyles_default(styles30, { | |
name: "MuiCardHeader" | |
})(CardHeader); | |
// node_modules/@material-ui/core/esm/CardMedia/CardMedia.js | |
var React25 = __toModule(require_react()); | |
var import_prop_types20 = __toModule(require_prop_types()); | |
var styles31 = { | |
root: { | |
display: "block", | |
backgroundSize: "cover", | |
backgroundRepeat: "no-repeat", | |
backgroundPosition: "center" | |
}, | |
media: { | |
width: "100%" | |
}, | |
img: { | |
objectFit: "cover" | |
} | |
}; | |
var MEDIA_COMPONENTS = ["video", "audio", "picture", "iframe", "img"]; | |
var CardMedia = React25.forwardRef(function CardMedia2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, image = props.image, src = props.src, style = props.style, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "image", "src", "style"]); | |
var isMediaComponent = MEDIA_COMPONENTS.indexOf(Component3) !== -1; | |
var composedStyle = !isMediaComponent && image ? _extends({ | |
backgroundImage: 'url("'.concat(image, '")') | |
}, style) : style; | |
return React25.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className, isMediaComponent && classes.media, "picture img".indexOf(Component3) !== -1 && classes.img), | |
ref, | |
style: composedStyle, | |
src: isMediaComponent ? image || src : void 0 | |
}, other), children); | |
}); | |
true ? CardMedia.propTypes = { | |
children: chainPropTypes(import_prop_types20.default.node, function(props) { | |
if (!props.children && !props.image && !props.src && !props.component) { | |
return new Error("Material-UI: Either `children`, `image`, `src` or `component` prop must be specified."); | |
} | |
return null; | |
}), | |
classes: import_prop_types20.default.object, | |
className: import_prop_types20.default.string, | |
component: import_prop_types20.default.elementType, | |
image: import_prop_types20.default.string, | |
src: import_prop_types20.default.string, | |
style: import_prop_types20.default.object | |
} : void 0; | |
var CardMedia_default = withStyles_default(styles31, { | |
name: "MuiCardMedia" | |
})(CardMedia); | |
// node_modules/@material-ui/core/esm/Checkbox/Checkbox.js | |
var React31 = __toModule(require_react()); | |
var import_prop_types22 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/internal/SwitchBase.js | |
var React27 = __toModule(require_react()); | |
var import_prop_types21 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/FormControl/useFormControl.js | |
var React26 = __toModule(require_react()); | |
function useFormControl2() { | |
return React26.useContext(FormControlContext_default); | |
} | |
// node_modules/@material-ui/core/esm/internal/SwitchBase.js | |
var styles32 = { | |
root: { | |
padding: 9 | |
}, | |
checked: {}, | |
disabled: {}, | |
input: { | |
cursor: "inherit", | |
position: "absolute", | |
opacity: 0, | |
width: "100%", | |
height: "100%", | |
top: 0, | |
left: 0, | |
margin: 0, | |
padding: 0, | |
zIndex: 1 | |
} | |
}; | |
var SwitchBase = React27.forwardRef(function SwitchBase2(props, ref) { | |
var autoFocus = props.autoFocus, checkedProp = props.checked, checkedIcon = props.checkedIcon, classes = props.classes, className = props.className, defaultChecked = props.defaultChecked, disabledProp = props.disabled, icon = props.icon, id = props.id, inputProps = props.inputProps, inputRef = props.inputRef, name = props.name, onBlur = props.onBlur, onChange = props.onChange, onFocus = props.onFocus, readOnly = props.readOnly, required = props.required, tabIndex = props.tabIndex, type = props.type, value = props.value, other = _objectWithoutProperties(props, ["autoFocus", "checked", "checkedIcon", "classes", "className", "defaultChecked", "disabled", "icon", "id", "inputProps", "inputRef", "name", "onBlur", "onChange", "onFocus", "readOnly", "required", "tabIndex", "type", "value"]); | |
var _useControlled = useControlled({ | |
controlled: checkedProp, | |
default: Boolean(defaultChecked), | |
name: "SwitchBase", | |
state: "checked" | |
}), _useControlled2 = _slicedToArray(_useControlled, 2), checked = _useControlled2[0], setCheckedState = _useControlled2[1]; | |
var muiFormControl = useFormControl2(); | |
var handleFocus = function handleFocus2(event) { | |
if (onFocus) { | |
onFocus(event); | |
} | |
if (muiFormControl && muiFormControl.onFocus) { | |
muiFormControl.onFocus(event); | |
} | |
}; | |
var handleBlur = function handleBlur2(event) { | |
if (onBlur) { | |
onBlur(event); | |
} | |
if (muiFormControl && muiFormControl.onBlur) { | |
muiFormControl.onBlur(event); | |
} | |
}; | |
var handleInputChange = function handleInputChange2(event) { | |
var newChecked = event.target.checked; | |
setCheckedState(newChecked); | |
if (onChange) { | |
onChange(event, newChecked); | |
} | |
}; | |
var disabled = disabledProp; | |
if (muiFormControl) { | |
if (typeof disabled === "undefined") { | |
disabled = muiFormControl.disabled; | |
} | |
} | |
var hasLabelFor = type === "checkbox" || type === "radio"; | |
return React27.createElement(IconButton_default, _extends({ | |
component: "span", | |
className: clsx_m_default(classes.root, className, checked && classes.checked, disabled && classes.disabled), | |
disabled, | |
tabIndex: null, | |
role: void 0, | |
onFocus: handleFocus, | |
onBlur: handleBlur, | |
ref | |
}, other), React27.createElement("input", _extends({ | |
autoFocus, | |
checked: checkedProp, | |
defaultChecked, | |
className: classes.input, | |
disabled, | |
id: hasLabelFor && id, | |
name, | |
onChange: handleInputChange, | |
readOnly, | |
ref: inputRef, | |
required, | |
tabIndex, | |
type, | |
value | |
}, inputProps)), checked ? checkedIcon : icon); | |
}); | |
true ? SwitchBase.propTypes = { | |
autoFocus: import_prop_types21.default.bool, | |
checked: import_prop_types21.default.bool, | |
checkedIcon: import_prop_types21.default.node.isRequired, | |
classes: import_prop_types21.default.object.isRequired, | |
className: import_prop_types21.default.string, | |
defaultChecked: import_prop_types21.default.bool, | |
disabled: import_prop_types21.default.bool, | |
icon: import_prop_types21.default.node.isRequired, | |
id: import_prop_types21.default.string, | |
inputProps: import_prop_types21.default.object, | |
inputRef: refType_default, | |
name: import_prop_types21.default.string, | |
onBlur: import_prop_types21.default.func, | |
onChange: import_prop_types21.default.func, | |
onFocus: import_prop_types21.default.func, | |
readOnly: import_prop_types21.default.bool, | |
required: import_prop_types21.default.bool, | |
tabIndex: import_prop_types21.default.oneOfType([import_prop_types21.default.number, import_prop_types21.default.string]), | |
type: import_prop_types21.default.string.isRequired, | |
value: import_prop_types21.default.any | |
} : void 0; | |
var SwitchBase_default = withStyles_default(styles32, { | |
name: "PrivateSwitchBase" | |
})(SwitchBase); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/CheckBoxOutlineBlank.js | |
var React28 = __toModule(require_react()); | |
var CheckBoxOutlineBlank_default = createSvgIcon(React28.createElement("path", { | |
d: "M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z" | |
}), "CheckBoxOutlineBlank"); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/CheckBox.js | |
var React29 = __toModule(require_react()); | |
var CheckBox_default = createSvgIcon(React29.createElement("path", { | |
d: "M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" | |
}), "CheckBox"); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/IndeterminateCheckBox.js | |
var React30 = __toModule(require_react()); | |
var IndeterminateCheckBox_default = createSvgIcon(React30.createElement("path", { | |
d: "M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z" | |
}), "IndeterminateCheckBox"); | |
// node_modules/@material-ui/core/esm/Checkbox/Checkbox.js | |
var styles33 = function styles34(theme) { | |
return { | |
root: { | |
color: theme.palette.text.secondary | |
}, | |
checked: {}, | |
disabled: {}, | |
indeterminate: {}, | |
colorPrimary: { | |
"&$checked": { | |
color: theme.palette.primary.main, | |
"&:hover": { | |
backgroundColor: fade(theme.palette.primary.main, theme.palette.action.hoverOpacity), | |
"@media (hover: none)": { | |
backgroundColor: "transparent" | |
} | |
} | |
}, | |
"&$disabled": { | |
color: theme.palette.action.disabled | |
} | |
}, | |
colorSecondary: { | |
"&$checked": { | |
color: theme.palette.secondary.main, | |
"&:hover": { | |
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity), | |
"@media (hover: none)": { | |
backgroundColor: "transparent" | |
} | |
} | |
}, | |
"&$disabled": { | |
color: theme.palette.action.disabled | |
} | |
} | |
}; | |
}; | |
var defaultCheckedIcon = React31.createElement(CheckBox_default, null); | |
var defaultIcon = React31.createElement(CheckBoxOutlineBlank_default, null); | |
var defaultIndeterminateIcon = React31.createElement(IndeterminateCheckBox_default, null); | |
var Checkbox = React31.forwardRef(function Checkbox2(props, ref) { | |
var _props$checkedIcon = props.checkedIcon, checkedIcon = _props$checkedIcon === void 0 ? defaultCheckedIcon : _props$checkedIcon, classes = props.classes, _props$color = props.color, color = _props$color === void 0 ? "secondary" : _props$color, _props$icon = props.icon, iconProp = _props$icon === void 0 ? defaultIcon : _props$icon, _props$indeterminate = props.indeterminate, indeterminate = _props$indeterminate === void 0 ? false : _props$indeterminate, _props$indeterminateI = props.indeterminateIcon, indeterminateIconProp = _props$indeterminateI === void 0 ? defaultIndeterminateIcon : _props$indeterminateI, inputProps = props.inputProps, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, other = _objectWithoutProperties(props, ["checkedIcon", "classes", "color", "icon", "indeterminate", "indeterminateIcon", "inputProps", "size"]); | |
var icon = indeterminate ? indeterminateIconProp : iconProp; | |
var indeterminateIcon = indeterminate ? indeterminateIconProp : checkedIcon; | |
return React31.createElement(SwitchBase_default, _extends({ | |
type: "checkbox", | |
classes: { | |
root: clsx_m_default(classes.root, classes["color".concat(capitalize(color))], indeterminate && classes.indeterminate), | |
checked: classes.checked, | |
disabled: classes.disabled | |
}, | |
color, | |
inputProps: _extends({ | |
"data-indeterminate": indeterminate | |
}, inputProps), | |
icon: React31.cloneElement(icon, { | |
fontSize: icon.props.fontSize === void 0 && size === "small" ? size : icon.props.fontSize | |
}), | |
checkedIcon: React31.cloneElement(indeterminateIcon, { | |
fontSize: indeterminateIcon.props.fontSize === void 0 && size === "small" ? size : indeterminateIcon.props.fontSize | |
}), | |
ref | |
}, other)); | |
}); | |
true ? Checkbox.propTypes = { | |
checked: import_prop_types22.default.bool, | |
checkedIcon: import_prop_types22.default.node, | |
classes: import_prop_types22.default.object, | |
color: import_prop_types22.default.oneOf(["default", "primary", "secondary"]), | |
disabled: import_prop_types22.default.bool, | |
disableRipple: import_prop_types22.default.bool, | |
icon: import_prop_types22.default.node, | |
id: import_prop_types22.default.string, | |
indeterminate: import_prop_types22.default.bool, | |
indeterminateIcon: import_prop_types22.default.node, | |
inputProps: import_prop_types22.default.object, | |
inputRef: refType_default, | |
onChange: import_prop_types22.default.func, | |
required: import_prop_types22.default.bool, | |
size: import_prop_types22.default.oneOf(["medium", "small"]), | |
value: import_prop_types22.default.any | |
} : void 0; | |
var Checkbox_default = withStyles_default(styles33, { | |
name: "MuiCheckbox" | |
})(Checkbox); | |
// node_modules/@material-ui/core/esm/Chip/Chip.js | |
var React33 = __toModule(require_react()); | |
var import_prop_types23 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/Cancel.js | |
var React32 = __toModule(require_react()); | |
var Cancel_default = createSvgIcon(React32.createElement("path", { | |
d: "M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z" | |
}), "Cancel"); | |
// node_modules/@material-ui/core/esm/Chip/Chip.js | |
var styles35 = function styles36(theme) { | |
var backgroundColor = theme.palette.type === "light" ? theme.palette.grey[300] : theme.palette.grey[700]; | |
var deleteIconColor = fade(theme.palette.text.primary, 0.26); | |
return { | |
root: { | |
fontFamily: theme.typography.fontFamily, | |
fontSize: theme.typography.pxToRem(13), | |
display: "inline-flex", | |
alignItems: "center", | |
justifyContent: "center", | |
height: 32, | |
color: theme.palette.getContrastText(backgroundColor), | |
backgroundColor, | |
borderRadius: 32 / 2, | |
whiteSpace: "nowrap", | |
transition: theme.transitions.create(["background-color", "box-shadow"]), | |
cursor: "default", | |
outline: 0, | |
textDecoration: "none", | |
border: "none", | |
padding: 0, | |
verticalAlign: "middle", | |
boxSizing: "border-box", | |
"&$disabled": { | |
opacity: 0.5, | |
pointerEvents: "none" | |
}, | |
"& $avatar": { | |
marginLeft: 5, | |
marginRight: -6, | |
width: 24, | |
height: 24, | |
color: theme.palette.type === "light" ? theme.palette.grey[700] : theme.palette.grey[300], | |
fontSize: theme.typography.pxToRem(12) | |
}, | |
"& $avatarColorPrimary": { | |
color: theme.palette.primary.contrastText, | |
backgroundColor: theme.palette.primary.dark | |
}, | |
"& $avatarColorSecondary": { | |
color: theme.palette.secondary.contrastText, | |
backgroundColor: theme.palette.secondary.dark | |
}, | |
"& $avatarSmall": { | |
marginLeft: 4, | |
marginRight: -4, | |
width: 18, | |
height: 18, | |
fontSize: theme.typography.pxToRem(10) | |
} | |
}, | |
sizeSmall: { | |
height: 24 | |
}, | |
colorPrimary: { | |
backgroundColor: theme.palette.primary.main, | |
color: theme.palette.primary.contrastText | |
}, | |
colorSecondary: { | |
backgroundColor: theme.palette.secondary.main, | |
color: theme.palette.secondary.contrastText | |
}, | |
disabled: {}, | |
clickable: { | |
userSelect: "none", | |
WebkitTapHighlightColor: "transparent", | |
cursor: "pointer", | |
"&:hover, &:focus": { | |
backgroundColor: emphasize(backgroundColor, 0.08) | |
}, | |
"&:active": { | |
boxShadow: theme.shadows[1] | |
} | |
}, | |
clickableColorPrimary: { | |
"&:hover, &:focus": { | |
backgroundColor: emphasize(theme.palette.primary.main, 0.08) | |
} | |
}, | |
clickableColorSecondary: { | |
"&:hover, &:focus": { | |
backgroundColor: emphasize(theme.palette.secondary.main, 0.08) | |
} | |
}, | |
deletable: { | |
"&:focus": { | |
backgroundColor: emphasize(backgroundColor, 0.08) | |
} | |
}, | |
deletableColorPrimary: { | |
"&:focus": { | |
backgroundColor: emphasize(theme.palette.primary.main, 0.2) | |
} | |
}, | |
deletableColorSecondary: { | |
"&:focus": { | |
backgroundColor: emphasize(theme.palette.secondary.main, 0.2) | |
} | |
}, | |
outlined: { | |
backgroundColor: "transparent", | |
border: "1px solid ".concat(theme.palette.type === "light" ? "rgba(0, 0, 0, 0.23)" : "rgba(255, 255, 255, 0.23)"), | |
"$clickable&:hover, $clickable&:focus, $deletable&:focus": { | |
backgroundColor: fade(theme.palette.text.primary, theme.palette.action.hoverOpacity) | |
}, | |
"& $avatar": { | |
marginLeft: 4 | |
}, | |
"& $avatarSmall": { | |
marginLeft: 2 | |
}, | |
"& $icon": { | |
marginLeft: 4 | |
}, | |
"& $iconSmall": { | |
marginLeft: 2 | |
}, | |
"& $deleteIcon": { | |
marginRight: 5 | |
}, | |
"& $deleteIconSmall": { | |
marginRight: 3 | |
} | |
}, | |
outlinedPrimary: { | |
color: theme.palette.primary.main, | |
border: "1px solid ".concat(theme.palette.primary.main), | |
"$clickable&:hover, $clickable&:focus, $deletable&:focus": { | |
backgroundColor: fade(theme.palette.primary.main, theme.palette.action.hoverOpacity) | |
} | |
}, | |
outlinedSecondary: { | |
color: theme.palette.secondary.main, | |
border: "1px solid ".concat(theme.palette.secondary.main), | |
"$clickable&:hover, $clickable&:focus, $deletable&:focus": { | |
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity) | |
} | |
}, | |
avatar: {}, | |
avatarSmall: {}, | |
avatarColorPrimary: {}, | |
avatarColorSecondary: {}, | |
icon: { | |
color: theme.palette.type === "light" ? theme.palette.grey[700] : theme.palette.grey[300], | |
marginLeft: 5, | |
marginRight: -6 | |
}, | |
iconSmall: { | |
width: 18, | |
height: 18, | |
marginLeft: 4, | |
marginRight: -4 | |
}, | |
iconColorPrimary: { | |
color: "inherit" | |
}, | |
iconColorSecondary: { | |
color: "inherit" | |
}, | |
label: { | |
overflow: "hidden", | |
textOverflow: "ellipsis", | |
paddingLeft: 12, | |
paddingRight: 12, | |
whiteSpace: "nowrap" | |
}, | |
labelSmall: { | |
paddingLeft: 8, | |
paddingRight: 8 | |
}, | |
deleteIcon: { | |
WebkitTapHighlightColor: "transparent", | |
color: deleteIconColor, | |
height: 22, | |
width: 22, | |
cursor: "pointer", | |
margin: "0 5px 0 -6px", | |
"&:hover": { | |
color: fade(deleteIconColor, 0.4) | |
} | |
}, | |
deleteIconSmall: { | |
height: 16, | |
width: 16, | |
marginRight: 4, | |
marginLeft: -4 | |
}, | |
deleteIconColorPrimary: { | |
color: fade(theme.palette.primary.contrastText, 0.7), | |
"&:hover, &:active": { | |
color: theme.palette.primary.contrastText | |
} | |
}, | |
deleteIconColorSecondary: { | |
color: fade(theme.palette.secondary.contrastText, 0.7), | |
"&:hover, &:active": { | |
color: theme.palette.secondary.contrastText | |
} | |
}, | |
deleteIconOutlinedColorPrimary: { | |
color: fade(theme.palette.primary.main, 0.7), | |
"&:hover, &:active": { | |
color: theme.palette.primary.main | |
} | |
}, | |
deleteIconOutlinedColorSecondary: { | |
color: fade(theme.palette.secondary.main, 0.7), | |
"&:hover, &:active": { | |
color: theme.palette.secondary.main | |
} | |
} | |
}; | |
}; | |
function isDeleteKeyboardEvent(keyboardEvent) { | |
return keyboardEvent.key === "Backspace" || keyboardEvent.key === "Delete"; | |
} | |
var Chip = React33.forwardRef(function Chip2(props, ref) { | |
var avatarProp = props.avatar, classes = props.classes, className = props.className, clickableProp = props.clickable, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, ComponentProp = props.component, deleteIconProp = props.deleteIcon, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, iconProp = props.icon, label = props.label, onClick = props.onClick, onDelete = props.onDelete, onKeyDown = props.onKeyDown, onKeyUp = props.onKeyUp, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, _props$variant = props.variant, variant = _props$variant === void 0 ? "default" : _props$variant, other = _objectWithoutProperties(props, ["avatar", "classes", "className", "clickable", "color", "component", "deleteIcon", "disabled", "icon", "label", "onClick", "onDelete", "onKeyDown", "onKeyUp", "size", "variant"]); | |
var chipRef = React33.useRef(null); | |
var handleRef = useForkRef(chipRef, ref); | |
var handleDeleteIconClick = function handleDeleteIconClick2(event) { | |
event.stopPropagation(); | |
if (onDelete) { | |
onDelete(event); | |
} | |
}; | |
var handleKeyDown = function handleKeyDown2(event) { | |
if (event.currentTarget === event.target && isDeleteKeyboardEvent(event)) { | |
event.preventDefault(); | |
} | |
if (onKeyDown) { | |
onKeyDown(event); | |
} | |
}; | |
var handleKeyUp = function handleKeyUp2(event) { | |
if (event.currentTarget === event.target) { | |
if (onDelete && isDeleteKeyboardEvent(event)) { | |
onDelete(event); | |
} else if (event.key === "Escape" && chipRef.current) { | |
chipRef.current.blur(); | |
} | |
} | |
if (onKeyUp) { | |
onKeyUp(event); | |
} | |
}; | |
var clickable = clickableProp !== false && onClick ? true : clickableProp; | |
var small = size === "small"; | |
var Component3 = ComponentProp || (clickable ? ButtonBase_default : "div"); | |
var moreProps = Component3 === ButtonBase_default ? { | |
component: "div" | |
} : {}; | |
var deleteIcon = null; | |
if (onDelete) { | |
var customClasses = clsx_m_default(color !== "default" && (variant === "default" ? classes["deleteIconColor".concat(capitalize(color))] : classes["deleteIconOutlinedColor".concat(capitalize(color))]), small && classes.deleteIconSmall); | |
deleteIcon = deleteIconProp && React33.isValidElement(deleteIconProp) ? React33.cloneElement(deleteIconProp, { | |
className: clsx_m_default(deleteIconProp.props.className, classes.deleteIcon, customClasses), | |
onClick: handleDeleteIconClick | |
}) : React33.createElement(Cancel_default, { | |
className: clsx_m_default(classes.deleteIcon, customClasses), | |
onClick: handleDeleteIconClick | |
}); | |
} | |
var avatar = null; | |
if (avatarProp && React33.isValidElement(avatarProp)) { | |
avatar = React33.cloneElement(avatarProp, { | |
className: clsx_m_default(classes.avatar, avatarProp.props.className, small && classes.avatarSmall, color !== "default" && classes["avatarColor".concat(capitalize(color))]) | |
}); | |
} | |
var icon = null; | |
if (iconProp && React33.isValidElement(iconProp)) { | |
icon = React33.cloneElement(iconProp, { | |
className: clsx_m_default(classes.icon, iconProp.props.className, small && classes.iconSmall, color !== "default" && classes["iconColor".concat(capitalize(color))]) | |
}); | |
} | |
if (true) { | |
if (avatar && icon) { | |
console.error("Material-UI: The Chip component can not handle the avatar and the icon prop at the same time. Pick one."); | |
} | |
} | |
return React33.createElement(Component3, _extends({ | |
role: clickable || onDelete ? "button" : void 0, | |
className: clsx_m_default(classes.root, className, color !== "default" && [classes["color".concat(capitalize(color))], clickable && classes["clickableColor".concat(capitalize(color))], onDelete && classes["deletableColor".concat(capitalize(color))]], variant !== "default" && [classes.outlined, { | |
primary: classes.outlinedPrimary, | |
secondary: classes.outlinedSecondary | |
}[color]], disabled && classes.disabled, small && classes.sizeSmall, clickable && classes.clickable, onDelete && classes.deletable), | |
"aria-disabled": disabled ? true : void 0, | |
tabIndex: clickable || onDelete ? 0 : void 0, | |
onClick, | |
onKeyDown: handleKeyDown, | |
onKeyUp: handleKeyUp, | |
ref: handleRef | |
}, moreProps, other), avatar || icon, React33.createElement("span", { | |
className: clsx_m_default(classes.label, small && classes.labelSmall) | |
}, label), deleteIcon); | |
}); | |
true ? Chip.propTypes = { | |
avatar: import_prop_types23.default.element, | |
children: unsupportedProp, | |
classes: import_prop_types23.default.object, | |
className: import_prop_types23.default.string, | |
clickable: import_prop_types23.default.bool, | |
color: import_prop_types23.default.oneOf(["default", "primary", "secondary"]), | |
component: import_prop_types23.default.elementType, | |
deleteIcon: import_prop_types23.default.element, | |
disabled: import_prop_types23.default.bool, | |
icon: import_prop_types23.default.element, | |
label: import_prop_types23.default.node, | |
onClick: import_prop_types23.default.func, | |
onDelete: import_prop_types23.default.func, | |
onKeyDown: import_prop_types23.default.func, | |
onKeyUp: import_prop_types23.default.func, | |
size: import_prop_types23.default.oneOf(["medium", "small"]), | |
variant: import_prop_types23.default.oneOf(["default", "outlined"]) | |
} : void 0; | |
var Chip_default = withStyles_default(styles35, { | |
name: "MuiChip" | |
})(Chip); | |
// node_modules/@material-ui/core/esm/CircularProgress/CircularProgress.js | |
var React34 = __toModule(require_react()); | |
var import_prop_types24 = __toModule(require_prop_types()); | |
var SIZE = 44; | |
function getRelativeValue(value, min, max) { | |
return (Math.min(Math.max(min, value), max) - min) / (max - min); | |
} | |
function easeOut(t) { | |
t = getRelativeValue(t, 0, 1); | |
t = (t -= 1) * t * t + 1; | |
return t; | |
} | |
function easeIn(t) { | |
return t * t; | |
} | |
var styles37 = function styles38(theme) { | |
return { | |
root: { | |
display: "inline-block" | |
}, | |
static: { | |
transition: theme.transitions.create("transform") | |
}, | |
indeterminate: { | |
animation: "$circular-rotate 1.4s linear infinite" | |
}, | |
colorPrimary: { | |
color: theme.palette.primary.main | |
}, | |
colorSecondary: { | |
color: theme.palette.secondary.main | |
}, | |
svg: { | |
display: "block" | |
}, | |
circle: { | |
stroke: "currentColor" | |
}, | |
circleStatic: { | |
transition: theme.transitions.create("stroke-dashoffset") | |
}, | |
circleIndeterminate: { | |
animation: "$circular-dash 1.4s ease-in-out infinite", | |
strokeDasharray: "80px, 200px", | |
strokeDashoffset: "0px" | |
}, | |
"@keyframes circular-rotate": { | |
"0%": { | |
transformOrigin: "50% 50%" | |
}, | |
"100%": { | |
transform: "rotate(360deg)" | |
} | |
}, | |
"@keyframes circular-dash": { | |
"0%": { | |
strokeDasharray: "1px, 200px", | |
strokeDashoffset: "0px" | |
}, | |
"50%": { | |
strokeDasharray: "100px, 200px", | |
strokeDashoffset: "-15px" | |
}, | |
"100%": { | |
strokeDasharray: "100px, 200px", | |
strokeDashoffset: "-125px" | |
} | |
}, | |
circleDisableShrink: { | |
animation: "none" | |
} | |
}; | |
}; | |
var CircularProgress = React34.forwardRef(function CircularProgress2(props, ref) { | |
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$disableShrink = props.disableShrink, disableShrink = _props$disableShrink === void 0 ? false : _props$disableShrink, _props$size = props.size, size = _props$size === void 0 ? 40 : _props$size, style = props.style, _props$thickness = props.thickness, thickness = _props$thickness === void 0 ? 3.6 : _props$thickness, _props$value = props.value, value = _props$value === void 0 ? 0 : _props$value, _props$variant = props.variant, variant = _props$variant === void 0 ? "indeterminate" : _props$variant, other = _objectWithoutProperties(props, ["classes", "className", "color", "disableShrink", "size", "style", "thickness", "value", "variant"]); | |
var circleStyle = {}; | |
var rootStyle = {}; | |
var rootProps = {}; | |
if (variant === "determinate" || variant === "static") { | |
var circumference = 2 * Math.PI * ((SIZE - thickness) / 2); | |
circleStyle.strokeDasharray = circumference.toFixed(3); | |
rootProps["aria-valuenow"] = Math.round(value); | |
if (variant === "static") { | |
circleStyle.strokeDashoffset = "".concat(((100 - value) / 100 * circumference).toFixed(3), "px"); | |
rootStyle.transform = "rotate(-90deg)"; | |
} else { | |
circleStyle.strokeDashoffset = "".concat((easeIn((100 - value) / 100) * circumference).toFixed(3), "px"); | |
rootStyle.transform = "rotate(".concat((easeOut(value / 70) * 270).toFixed(3), "deg)"); | |
} | |
} | |
return React34.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, color !== "inherit" && classes["color".concat(capitalize(color))], { | |
indeterminate: classes.indeterminate, | |
static: classes.static | |
}[variant]), | |
style: _extends({ | |
width: size, | |
height: size | |
}, rootStyle, style), | |
ref, | |
role: "progressbar" | |
}, rootProps, other), React34.createElement("svg", { | |
className: classes.svg, | |
viewBox: "".concat(SIZE / 2, " ").concat(SIZE / 2, " ").concat(SIZE, " ").concat(SIZE) | |
}, React34.createElement("circle", { | |
className: clsx_m_default(classes.circle, disableShrink && classes.circleDisableShrink, { | |
indeterminate: classes.circleIndeterminate, | |
static: classes.circleStatic | |
}[variant]), | |
style: circleStyle, | |
cx: SIZE, | |
cy: SIZE, | |
r: (SIZE - thickness) / 2, | |
fill: "none", | |
strokeWidth: thickness | |
}))); | |
}); | |
true ? CircularProgress.propTypes = { | |
classes: import_prop_types24.default.object, | |
className: import_prop_types24.default.string, | |
color: import_prop_types24.default.oneOf(["inherit", "primary", "secondary"]), | |
disableShrink: chainPropTypes(import_prop_types24.default.bool, function(props) { | |
if (props.disableShrink && props.variant && props.variant !== "indeterminate") { | |
return new Error("Material-UI: You have provided the `disableShrink` prop with a variant other than `indeterminate`. This will have no effect."); | |
} | |
return null; | |
}), | |
size: import_prop_types24.default.oneOfType([import_prop_types24.default.number, import_prop_types24.default.string]), | |
style: import_prop_types24.default.object, | |
thickness: import_prop_types24.default.number, | |
value: import_prop_types24.default.number, | |
variant: import_prop_types24.default.oneOf(["determinate", "indeterminate", "static"]) | |
} : void 0; | |
var CircularProgress_default = withStyles_default(styles37, { | |
name: "MuiCircularProgress", | |
flip: false | |
})(CircularProgress); | |
// node_modules/@material-ui/core/esm/ClickAwayListener/ClickAwayListener.js | |
var React35 = __toModule(require_react()); | |
var ReactDOM = __toModule(require_react_dom()); | |
var import_prop_types25 = __toModule(require_prop_types()); | |
function mapEventPropToEvent(eventProp) { | |
return eventProp.substring(2).toLowerCase(); | |
} | |
function clickedRootScrollbar(event) { | |
return document.documentElement.clientWidth < event.clientX || document.documentElement.clientHeight < event.clientY; | |
} | |
function ClickAwayListener(props) { | |
var children = props.children, _props$disableReactTr = props.disableReactTree, disableReactTree = _props$disableReactTr === void 0 ? false : _props$disableReactTr, _props$mouseEvent = props.mouseEvent, mouseEvent = _props$mouseEvent === void 0 ? "onClick" : _props$mouseEvent, onClickAway = props.onClickAway, _props$touchEvent = props.touchEvent, touchEvent = _props$touchEvent === void 0 ? "onTouchEnd" : _props$touchEvent; | |
var movedRef = React35.useRef(false); | |
var nodeRef = React35.useRef(null); | |
var mountedRef = React35.useRef(false); | |
var syntheticEventRef = React35.useRef(false); | |
React35.useEffect(function() { | |
mountedRef.current = true; | |
return function() { | |
mountedRef.current = false; | |
}; | |
}, []); | |
var handleOwnRef = React35.useCallback(function(instance) { | |
nodeRef.current = ReactDOM.findDOMNode(instance); | |
}, []); | |
var handleRef = useForkRef(children.ref, handleOwnRef); | |
var handleClickAway = useEventCallback(function(event) { | |
var insideReactTree = syntheticEventRef.current; | |
syntheticEventRef.current = false; | |
if (!mountedRef.current || !nodeRef.current || clickedRootScrollbar(event)) { | |
return; | |
} | |
if (movedRef.current) { | |
movedRef.current = false; | |
return; | |
} | |
var insideDOM; | |
if (event.composedPath) { | |
insideDOM = event.composedPath().indexOf(nodeRef.current) > -1; | |
} else { | |
var doc = ownerDocument(nodeRef.current); | |
insideDOM = !doc.documentElement.contains(event.target) || nodeRef.current.contains(event.target); | |
} | |
if (!insideDOM && (disableReactTree || !insideReactTree)) { | |
onClickAway(event); | |
} | |
}); | |
var createHandleSynthetic = function createHandleSynthetic2(handlerName) { | |
return function(event) { | |
syntheticEventRef.current = true; | |
var childrenPropsHandler = children.props[handlerName]; | |
if (childrenPropsHandler) { | |
childrenPropsHandler(event); | |
} | |
}; | |
}; | |
var childrenProps = { | |
ref: handleRef | |
}; | |
if (touchEvent !== false) { | |
childrenProps[touchEvent] = createHandleSynthetic(touchEvent); | |
} | |
React35.useEffect(function() { | |
if (touchEvent !== false) { | |
var mappedTouchEvent = mapEventPropToEvent(touchEvent); | |
var doc = ownerDocument(nodeRef.current); | |
var handleTouchMove = function handleTouchMove2() { | |
movedRef.current = true; | |
}; | |
doc.addEventListener(mappedTouchEvent, handleClickAway); | |
doc.addEventListener("touchmove", handleTouchMove); | |
return function() { | |
doc.removeEventListener(mappedTouchEvent, handleClickAway); | |
doc.removeEventListener("touchmove", handleTouchMove); | |
}; | |
} | |
return void 0; | |
}, [handleClickAway, touchEvent]); | |
if (mouseEvent !== false) { | |
childrenProps[mouseEvent] = createHandleSynthetic(mouseEvent); | |
} | |
React35.useEffect(function() { | |
if (mouseEvent !== false) { | |
var mappedMouseEvent = mapEventPropToEvent(mouseEvent); | |
var doc = ownerDocument(nodeRef.current); | |
doc.addEventListener(mappedMouseEvent, handleClickAway); | |
return function() { | |
doc.removeEventListener(mappedMouseEvent, handleClickAway); | |
}; | |
} | |
return void 0; | |
}, [handleClickAway, mouseEvent]); | |
return React35.createElement(React35.Fragment, null, React35.cloneElement(children, childrenProps)); | |
} | |
true ? ClickAwayListener.propTypes = { | |
children: elementAcceptingRef_default.isRequired, | |
disableReactTree: import_prop_types25.default.bool, | |
mouseEvent: import_prop_types25.default.oneOf(["onClick", "onMouseDown", "onMouseUp", false]), | |
onClickAway: import_prop_types25.default.func.isRequired, | |
touchEvent: import_prop_types25.default.oneOf(["onTouchEnd", "onTouchStart", false]) | |
} : void 0; | |
if (true) { | |
ClickAwayListener["propTypes"] = exactProp(ClickAwayListener.propTypes); | |
} | |
var ClickAwayListener_default = ClickAwayListener; | |
// node_modules/@material-ui/core/esm/Container/Container.js | |
var React36 = __toModule(require_react()); | |
var import_prop_types26 = __toModule(require_prop_types()); | |
var styles39 = function styles40(theme) { | |
return { | |
root: _defineProperty({ | |
width: "100%", | |
marginLeft: "auto", | |
boxSizing: "border-box", | |
marginRight: "auto", | |
paddingLeft: theme.spacing(2), | |
paddingRight: theme.spacing(2), | |
display: "block" | |
}, theme.breakpoints.up("sm"), { | |
paddingLeft: theme.spacing(3), | |
paddingRight: theme.spacing(3) | |
}), | |
disableGutters: { | |
paddingLeft: 0, | |
paddingRight: 0 | |
}, | |
fixed: Object.keys(theme.breakpoints.values).reduce(function(acc, breakpoint) { | |
var value = theme.breakpoints.values[breakpoint]; | |
if (value !== 0) { | |
acc[theme.breakpoints.up(breakpoint)] = { | |
maxWidth: value | |
}; | |
} | |
return acc; | |
}, {}), | |
maxWidthXs: _defineProperty({}, theme.breakpoints.up("xs"), { | |
maxWidth: Math.max(theme.breakpoints.values.xs, 444) | |
}), | |
maxWidthSm: _defineProperty({}, theme.breakpoints.up("sm"), { | |
maxWidth: theme.breakpoints.values.sm | |
}), | |
maxWidthMd: _defineProperty({}, theme.breakpoints.up("md"), { | |
maxWidth: theme.breakpoints.values.md | |
}), | |
maxWidthLg: _defineProperty({}, theme.breakpoints.up("lg"), { | |
maxWidth: theme.breakpoints.values.lg | |
}), | |
maxWidthXl: _defineProperty({}, theme.breakpoints.up("xl"), { | |
maxWidth: theme.breakpoints.values.xl | |
}) | |
}; | |
}; | |
var Container = React36.forwardRef(function Container2(props, ref) { | |
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disableGutters = props.disableGutters, disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, _props$fixed = props.fixed, fixed = _props$fixed === void 0 ? false : _props$fixed, _props$maxWidth = props.maxWidth, maxWidth = _props$maxWidth === void 0 ? "lg" : _props$maxWidth, other = _objectWithoutProperties(props, ["classes", "className", "component", "disableGutters", "fixed", "maxWidth"]); | |
return React36.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className, fixed && classes.fixed, disableGutters && classes.disableGutters, maxWidth !== false && classes["maxWidth".concat(capitalize(String(maxWidth)))]), | |
ref | |
}, other)); | |
}); | |
true ? Container.propTypes = { | |
children: import_prop_types26.default.node.isRequired, | |
classes: import_prop_types26.default.object, | |
className: import_prop_types26.default.string, | |
component: import_prop_types26.default.elementType, | |
disableGutters: import_prop_types26.default.bool, | |
fixed: import_prop_types26.default.bool, | |
maxWidth: import_prop_types26.default.oneOf(["lg", "md", "sm", "xl", "xs", false]) | |
} : void 0; | |
var Container_default = withStyles_default(styles39, { | |
name: "MuiContainer" | |
})(Container); | |
// node_modules/@material-ui/core/esm/CssBaseline/CssBaseline.js | |
var React37 = __toModule(require_react()); | |
var import_prop_types27 = __toModule(require_prop_types()); | |
var html = { | |
WebkitFontSmoothing: "antialiased", | |
MozOsxFontSmoothing: "grayscale", | |
boxSizing: "border-box" | |
}; | |
var body = function body2(theme) { | |
return _extends({ | |
color: theme.palette.text.primary | |
}, theme.typography.body2, { | |
backgroundColor: theme.palette.background.default, | |
"@media print": { | |
backgroundColor: theme.palette.common.white | |
} | |
}); | |
}; | |
var styles41 = function styles42(theme) { | |
return { | |
"@global": { | |
html, | |
"*, *::before, *::after": { | |
boxSizing: "inherit" | |
}, | |
"strong, b": { | |
fontWeight: theme.typography.fontWeightBold | |
}, | |
body: _extends({ | |
margin: 0 | |
}, body(theme), { | |
"&::backdrop": { | |
backgroundColor: theme.palette.background.default | |
} | |
}) | |
} | |
}; | |
}; | |
function CssBaseline(props) { | |
var _props$children = props.children, children = _props$children === void 0 ? null : _props$children, classes = props.classes; | |
return React37.createElement(React37.Fragment, null, children); | |
} | |
true ? CssBaseline.propTypes = { | |
children: import_prop_types27.default.node, | |
classes: import_prop_types27.default.object | |
} : void 0; | |
if (true) { | |
CssBaseline["propTypes"] = exactProp(CssBaseline.propTypes); | |
} | |
var CssBaseline_default = withStyles_default(styles41, { | |
name: "MuiCssBaseline" | |
})(CssBaseline); | |
// node_modules/@material-ui/core/esm/DialogContentText/DialogContentText.js | |
var React38 = __toModule(require_react()); | |
var import_prop_types28 = __toModule(require_prop_types()); | |
var styles43 = { | |
root: { | |
marginBottom: 12 | |
} | |
}; | |
var DialogContentText = React38.forwardRef(function DialogContentText2(props, ref) { | |
return React38.createElement(Typography_default, _extends({ | |
component: "p", | |
variant: "body1", | |
color: "textSecondary", | |
ref | |
}, props)); | |
}); | |
true ? DialogContentText.propTypes = { | |
children: import_prop_types28.default.node, | |
classes: import_prop_types28.default.object | |
} : void 0; | |
var DialogContentText_default = withStyles_default(styles43, { | |
name: "MuiDialogContentText" | |
})(DialogContentText); | |
// node_modules/@material-ui/core/esm/DialogTitle/DialogTitle.js | |
var React39 = __toModule(require_react()); | |
var import_prop_types29 = __toModule(require_prop_types()); | |
var styles44 = { | |
root: { | |
margin: 0, | |
padding: "16px 24px", | |
flex: "0 0 auto" | |
} | |
}; | |
var DialogTitle = React39.forwardRef(function DialogTitle2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$disableTypogra = props.disableTypography, disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra, other = _objectWithoutProperties(props, ["children", "classes", "className", "disableTypography"]); | |
return React39.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other), disableTypography ? children : React39.createElement(Typography_default, { | |
component: "h2", | |
variant: "h6" | |
}, children)); | |
}); | |
true ? DialogTitle.propTypes = { | |
children: import_prop_types29.default.node, | |
classes: import_prop_types29.default.object, | |
className: import_prop_types29.default.string, | |
disableTypography: import_prop_types29.default.bool | |
} : void 0; | |
var DialogTitle_default = withStyles_default(styles44, { | |
name: "MuiDialogTitle" | |
})(DialogTitle); | |
// node_modules/@material-ui/core/esm/Divider/Divider.js | |
var React40 = __toModule(require_react()); | |
var import_prop_types30 = __toModule(require_prop_types()); | |
var styles45 = function styles46(theme) { | |
return { | |
root: { | |
height: 1, | |
margin: 0, | |
border: "none", | |
flexShrink: 0, | |
backgroundColor: theme.palette.divider | |
}, | |
absolute: { | |
position: "absolute", | |
bottom: 0, | |
left: 0, | |
width: "100%" | |
}, | |
inset: { | |
marginLeft: 72 | |
}, | |
light: { | |
backgroundColor: fade(theme.palette.divider, 0.08) | |
}, | |
middle: { | |
marginLeft: theme.spacing(2), | |
marginRight: theme.spacing(2) | |
}, | |
vertical: { | |
height: "100%", | |
width: 1 | |
}, | |
flexItem: { | |
alignSelf: "stretch", | |
height: "auto" | |
} | |
}; | |
}; | |
var Divider = React40.forwardRef(function Divider2(props, ref) { | |
var _props$absolute = props.absolute, absolute = _props$absolute === void 0 ? false : _props$absolute, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "hr" : _props$component, _props$flexItem = props.flexItem, flexItem = _props$flexItem === void 0 ? false : _props$flexItem, _props$light = props.light, light = _props$light === void 0 ? false : _props$light, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, _props$role = props.role, role = _props$role === void 0 ? Component3 !== "hr" ? "separator" : void 0 : _props$role, _props$variant = props.variant, variant = _props$variant === void 0 ? "fullWidth" : _props$variant, other = _objectWithoutProperties(props, ["absolute", "classes", "className", "component", "flexItem", "light", "orientation", "role", "variant"]); | |
return React40.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className, variant !== "fullWidth" && classes[variant], absolute && classes.absolute, flexItem && classes.flexItem, light && classes.light, orientation === "vertical" && classes.vertical), | |
role, | |
ref | |
}, other)); | |
}); | |
true ? Divider.propTypes = { | |
absolute: import_prop_types30.default.bool, | |
children: import_prop_types30.default.node, | |
classes: import_prop_types30.default.object, | |
className: import_prop_types30.default.string, | |
component: import_prop_types30.default.elementType, | |
flexItem: import_prop_types30.default.bool, | |
light: import_prop_types30.default.bool, | |
orientation: import_prop_types30.default.oneOf(["horizontal", "vertical"]), | |
role: import_prop_types30.default.string, | |
variant: import_prop_types30.default.oneOf(["fullWidth", "inset", "middle"]) | |
} : void 0; | |
var Divider_default = withStyles_default(styles45, { | |
name: "MuiDivider" | |
})(Divider); | |
// node_modules/@material-ui/core/esm/Drawer/Drawer.js | |
var React42 = __toModule(require_react()); | |
var import_prop_types32 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Slide/Slide.js | |
var React41 = __toModule(require_react()); | |
var import_prop_types31 = __toModule(require_prop_types()); | |
var ReactDOM2 = __toModule(require_react_dom()); | |
function getTranslateValue(direction, node) { | |
var rect = node.getBoundingClientRect(); | |
var transform; | |
if (node.fakeTransform) { | |
transform = node.fakeTransform; | |
} else { | |
var computedStyle = window.getComputedStyle(node); | |
transform = computedStyle.getPropertyValue("-webkit-transform") || computedStyle.getPropertyValue("transform"); | |
} | |
var offsetX = 0; | |
var offsetY = 0; | |
if (transform && transform !== "none" && typeof transform === "string") { | |
var transformValues = transform.split("(")[1].split(")")[0].split(","); | |
offsetX = parseInt(transformValues[4], 10); | |
offsetY = parseInt(transformValues[5], 10); | |
} | |
if (direction === "left") { | |
return "translateX(".concat(window.innerWidth, "px) translateX(").concat(offsetX - rect.left, "px)"); | |
} | |
if (direction === "right") { | |
return "translateX(-".concat(rect.left + rect.width - offsetX, "px)"); | |
} | |
if (direction === "up") { | |
return "translateY(".concat(window.innerHeight, "px) translateY(").concat(offsetY - rect.top, "px)"); | |
} | |
return "translateY(-".concat(rect.top + rect.height - offsetY, "px)"); | |
} | |
function setTranslateValue(direction, node) { | |
var transform = getTranslateValue(direction, node); | |
if (transform) { | |
node.style.webkitTransform = transform; | |
node.style.transform = transform; | |
} | |
} | |
var defaultTimeout = { | |
enter: duration.enteringScreen, | |
exit: duration.leavingScreen | |
}; | |
var Slide = React41.forwardRef(function Slide2(props, ref) { | |
var children = props.children, _props$direction = props.direction, direction = _props$direction === void 0 ? "down" : _props$direction, inProp = props.in, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, style = props.style, _props$timeout = props.timeout, timeout = _props$timeout === void 0 ? defaultTimeout : _props$timeout, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Transition_default : _props$TransitionComp, other = _objectWithoutProperties(props, ["children", "direction", "in", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "style", "timeout", "TransitionComponent"]); | |
var theme = useTheme(); | |
var childrenRef = React41.useRef(null); | |
var handleOwnRef = React41.useCallback(function(instance) { | |
childrenRef.current = ReactDOM2.findDOMNode(instance); | |
}, []); | |
var handleRefIntermediary = useForkRef(children.ref, handleOwnRef); | |
var handleRef = useForkRef(handleRefIntermediary, ref); | |
var normalizedTransitionCallback = function normalizedTransitionCallback2(callback) { | |
return function(isAppearing) { | |
if (callback) { | |
if (isAppearing === void 0) { | |
callback(childrenRef.current); | |
} else { | |
callback(childrenRef.current, isAppearing); | |
} | |
} | |
}; | |
}; | |
var handleEnter = normalizedTransitionCallback(function(node, isAppearing) { | |
setTranslateValue(direction, node); | |
reflow(node); | |
if (onEnter) { | |
onEnter(node, isAppearing); | |
} | |
}); | |
var handleEntering = normalizedTransitionCallback(function(node, isAppearing) { | |
var transitionProps = getTransitionProps({ | |
timeout, | |
style | |
}, { | |
mode: "enter" | |
}); | |
node.style.webkitTransition = theme.transitions.create("-webkit-transform", _extends({}, transitionProps, { | |
easing: theme.transitions.easing.easeOut | |
})); | |
node.style.transition = theme.transitions.create("transform", _extends({}, transitionProps, { | |
easing: theme.transitions.easing.easeOut | |
})); | |
node.style.webkitTransform = "none"; | |
node.style.transform = "none"; | |
if (onEntering) { | |
onEntering(node, isAppearing); | |
} | |
}); | |
var handleEntered = normalizedTransitionCallback(onEntered); | |
var handleExiting = normalizedTransitionCallback(onExiting); | |
var handleExit = normalizedTransitionCallback(function(node) { | |
var transitionProps = getTransitionProps({ | |
timeout, | |
style | |
}, { | |
mode: "exit" | |
}); | |
node.style.webkitTransition = theme.transitions.create("-webkit-transform", _extends({}, transitionProps, { | |
easing: theme.transitions.easing.sharp | |
})); | |
node.style.transition = theme.transitions.create("transform", _extends({}, transitionProps, { | |
easing: theme.transitions.easing.sharp | |
})); | |
setTranslateValue(direction, node); | |
if (onExit) { | |
onExit(node); | |
} | |
}); | |
var handleExited = normalizedTransitionCallback(function(node) { | |
node.style.webkitTransition = ""; | |
node.style.transition = ""; | |
if (onExited) { | |
onExited(node); | |
} | |
}); | |
var updatePosition = React41.useCallback(function() { | |
if (childrenRef.current) { | |
setTranslateValue(direction, childrenRef.current); | |
} | |
}, [direction]); | |
React41.useEffect(function() { | |
if (inProp || direction === "down" || direction === "right") { | |
return void 0; | |
} | |
var handleResize = debounce(function() { | |
if (childrenRef.current) { | |
setTranslateValue(direction, childrenRef.current); | |
} | |
}); | |
window.addEventListener("resize", handleResize); | |
return function() { | |
handleResize.clear(); | |
window.removeEventListener("resize", handleResize); | |
}; | |
}, [direction, inProp]); | |
React41.useEffect(function() { | |
if (!inProp) { | |
updatePosition(); | |
} | |
}, [inProp, updatePosition]); | |
return React41.createElement(TransitionComponent, _extends({ | |
nodeRef: childrenRef, | |
onEnter: handleEnter, | |
onEntered: handleEntered, | |
onEntering: handleEntering, | |
onExit: handleExit, | |
onExited: handleExited, | |
onExiting: handleExiting, | |
appear: true, | |
in: inProp, | |
timeout | |
}, other), function(state, childProps) { | |
return React41.cloneElement(children, _extends({ | |
ref: handleRef, | |
style: _extends({ | |
visibility: state === "exited" && !inProp ? "hidden" : void 0 | |
}, style, children.props.style) | |
}, childProps)); | |
}); | |
}); | |
true ? Slide.propTypes = { | |
children: elementAcceptingRef_default, | |
direction: import_prop_types31.default.oneOf(["down", "left", "right", "up"]), | |
in: import_prop_types31.default.bool, | |
onEnter: import_prop_types31.default.func, | |
onEntered: import_prop_types31.default.func, | |
onEntering: import_prop_types31.default.func, | |
onExit: import_prop_types31.default.func, | |
onExited: import_prop_types31.default.func, | |
onExiting: import_prop_types31.default.func, | |
style: import_prop_types31.default.object, | |
timeout: import_prop_types31.default.oneOfType([import_prop_types31.default.number, import_prop_types31.default.shape({ | |
appear: import_prop_types31.default.number, | |
enter: import_prop_types31.default.number, | |
exit: import_prop_types31.default.number | |
})]) | |
} : void 0; | |
var Slide_default = Slide; | |
// node_modules/@material-ui/core/esm/Drawer/Drawer.js | |
var styles47 = function styles48(theme) { | |
return { | |
root: {}, | |
docked: { | |
flex: "0 0 auto" | |
}, | |
paper: { | |
overflowY: "auto", | |
display: "flex", | |
flexDirection: "column", | |
height: "100%", | |
flex: "1 0 auto", | |
zIndex: theme.zIndex.drawer, | |
WebkitOverflowScrolling: "touch", | |
position: "fixed", | |
top: 0, | |
outline: 0 | |
}, | |
paperAnchorLeft: { | |
left: 0, | |
right: "auto" | |
}, | |
paperAnchorRight: { | |
left: "auto", | |
right: 0 | |
}, | |
paperAnchorTop: { | |
top: 0, | |
left: 0, | |
bottom: "auto", | |
right: 0, | |
height: "auto", | |
maxHeight: "100%" | |
}, | |
paperAnchorBottom: { | |
top: "auto", | |
left: 0, | |
bottom: 0, | |
right: 0, | |
height: "auto", | |
maxHeight: "100%" | |
}, | |
paperAnchorDockedLeft: { | |
borderRight: "1px solid ".concat(theme.palette.divider) | |
}, | |
paperAnchorDockedTop: { | |
borderBottom: "1px solid ".concat(theme.palette.divider) | |
}, | |
paperAnchorDockedRight: { | |
borderLeft: "1px solid ".concat(theme.palette.divider) | |
}, | |
paperAnchorDockedBottom: { | |
borderTop: "1px solid ".concat(theme.palette.divider) | |
}, | |
modal: {} | |
}; | |
}; | |
var oppositeDirection = { | |
left: "right", | |
right: "left", | |
top: "down", | |
bottom: "up" | |
}; | |
function isHorizontal(anchor) { | |
return ["left", "right"].indexOf(anchor) !== -1; | |
} | |
function getAnchor(theme, anchor) { | |
return theme.direction === "rtl" && isHorizontal(anchor) ? oppositeDirection[anchor] : anchor; | |
} | |
var defaultTransitionDuration = { | |
enter: duration.enteringScreen, | |
exit: duration.leavingScreen | |
}; | |
var Drawer = React42.forwardRef(function Drawer2(props, ref) { | |
var _props$anchor = props.anchor, anchorProp = _props$anchor === void 0 ? "left" : _props$anchor, BackdropProps = props.BackdropProps, children = props.children, classes = props.classes, className = props.className, _props$elevation = props.elevation, elevation = _props$elevation === void 0 ? 16 : _props$elevation, _props$ModalProps = props.ModalProps; | |
_props$ModalProps = _props$ModalProps === void 0 ? {} : _props$ModalProps; | |
var BackdropPropsProp = _props$ModalProps.BackdropProps, ModalProps = _objectWithoutProperties(_props$ModalProps, ["BackdropProps"]), onClose = props.onClose, _props$open = props.open, open = _props$open === void 0 ? false : _props$open, _props$PaperProps = props.PaperProps, PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps, SlideProps = props.SlideProps, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Slide_default : _props$TransitionComp, _props$transitionDura = props.transitionDuration, transitionDuration = _props$transitionDura === void 0 ? defaultTransitionDuration : _props$transitionDura, _props$variant = props.variant, variant = _props$variant === void 0 ? "temporary" : _props$variant, other = _objectWithoutProperties(props, ["anchor", "BackdropProps", "children", "classes", "className", "elevation", "ModalProps", "onClose", "open", "PaperProps", "SlideProps", "TransitionComponent", "transitionDuration", "variant"]); | |
var theme = useTheme(); | |
var mounted = React42.useRef(false); | |
React42.useEffect(function() { | |
mounted.current = true; | |
}, []); | |
var anchor = getAnchor(theme, anchorProp); | |
var drawer = React42.createElement(Paper_default, _extends({ | |
elevation: variant === "temporary" ? elevation : 0, | |
square: true | |
}, PaperProps, { | |
className: clsx_m_default(classes.paper, classes["paperAnchor".concat(capitalize(anchor))], PaperProps.className, variant !== "temporary" && classes["paperAnchorDocked".concat(capitalize(anchor))]) | |
}), children); | |
if (variant === "permanent") { | |
return React42.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, classes.docked, className), | |
ref | |
}, other), drawer); | |
} | |
var slidingDrawer = React42.createElement(TransitionComponent, _extends({ | |
in: open, | |
direction: oppositeDirection[anchor], | |
timeout: transitionDuration, | |
appear: mounted.current | |
}, SlideProps), drawer); | |
if (variant === "persistent") { | |
return React42.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, classes.docked, className), | |
ref | |
}, other), slidingDrawer); | |
} | |
return React42.createElement(Modal_default, _extends({ | |
BackdropProps: _extends({}, BackdropProps, BackdropPropsProp, { | |
transitionDuration | |
}), | |
BackdropComponent: Backdrop_default, | |
className: clsx_m_default(classes.root, classes.modal, className), | |
open, | |
onClose, | |
ref | |
}, other, ModalProps), slidingDrawer); | |
}); | |
true ? Drawer.propTypes = { | |
anchor: import_prop_types32.default.oneOf(["bottom", "left", "right", "top"]), | |
BackdropProps: import_prop_types32.default.object, | |
children: import_prop_types32.default.node, | |
classes: import_prop_types32.default.object, | |
className: import_prop_types32.default.string, | |
elevation: import_prop_types32.default.number, | |
ModalProps: import_prop_types32.default.object, | |
onClose: import_prop_types32.default.func, | |
open: import_prop_types32.default.bool, | |
PaperProps: import_prop_types32.default.object, | |
SlideProps: import_prop_types32.default.object, | |
transitionDuration: import_prop_types32.default.oneOfType([import_prop_types32.default.number, import_prop_types32.default.shape({ | |
appear: import_prop_types32.default.number, | |
enter: import_prop_types32.default.number, | |
exit: import_prop_types32.default.number | |
})]), | |
variant: import_prop_types32.default.oneOf(["permanent", "persistent", "temporary"]) | |
} : void 0; | |
var Drawer_default = withStyles_default(styles47, { | |
name: "MuiDrawer", | |
flip: false | |
})(Drawer); | |
// node_modules/@material-ui/core/esm/ExpansionPanel/ExpansionPanel.js | |
var React44 = __toModule(require_react()); | |
var import_react_is5 = __toModule(require_react_is()); | |
var import_prop_types33 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/ExpansionPanel/ExpansionPanelContext.js | |
var React43 = __toModule(require_react()); | |
var ExpansionPanelContext = React43.createContext({}); | |
if (true) { | |
ExpansionPanelContext.displayName = "ExpansionPanelContext"; | |
} | |
var ExpansionPanelContext_default = ExpansionPanelContext; | |
// node_modules/@material-ui/core/esm/ExpansionPanel/ExpansionPanel.js | |
var styles49 = function styles50(theme) { | |
var transition = { | |
duration: theme.transitions.duration.shortest | |
}; | |
return { | |
root: { | |
position: "relative", | |
transition: theme.transitions.create(["margin"], transition), | |
"&:before": { | |
position: "absolute", | |
left: 0, | |
top: -1, | |
right: 0, | |
height: 1, | |
content: '""', | |
opacity: 1, | |
backgroundColor: theme.palette.divider, | |
transition: theme.transitions.create(["opacity", "background-color"], transition) | |
}, | |
"&:first-child": { | |
"&:before": { | |
display: "none" | |
} | |
}, | |
"&$expanded": { | |
margin: "16px 0", | |
"&:first-child": { | |
marginTop: 0 | |
}, | |
"&:last-child": { | |
marginBottom: 0 | |
}, | |
"&:before": { | |
opacity: 0 | |
} | |
}, | |
"&$expanded + &": { | |
"&:before": { | |
display: "none" | |
} | |
}, | |
"&$disabled": { | |
backgroundColor: theme.palette.action.disabledBackground | |
} | |
}, | |
rounded: { | |
borderRadius: 0, | |
"&:first-child": { | |
borderTopLeftRadius: theme.shape.borderRadius, | |
borderTopRightRadius: theme.shape.borderRadius | |
}, | |
"&:last-child": { | |
borderBottomLeftRadius: theme.shape.borderRadius, | |
borderBottomRightRadius: theme.shape.borderRadius, | |
"@supports (-ms-ime-align: auto)": { | |
borderBottomLeftRadius: 0, | |
borderBottomRightRadius: 0 | |
} | |
} | |
}, | |
expanded: {}, | |
disabled: {} | |
}; | |
}; | |
var warnedOnce = false; | |
var ExpansionPanel = React44.forwardRef(function ExpansionPanel2(props, ref) { | |
if (true) { | |
if (!warnedOnce) { | |
warnedOnce = true; | |
console.error(["Material-UI: the ExpansionPanel component was renamed to Accordion to use a more common naming convention.", "", "You should use `import { Accordion } from '@material-ui/core'`", "or `import Accordion from '@material-ui/core/Accordion'`"].join("\n")); | |
} | |
} | |
var childrenProp = props.children, classes = props.classes, className = props.className, _props$defaultExpande = props.defaultExpanded, defaultExpanded = _props$defaultExpande === void 0 ? false : _props$defaultExpande, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, expandedProp = props.expanded, onChange = props.onChange, _props$square = props.square, square = _props$square === void 0 ? false : _props$square, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Collapse_default : _props$TransitionComp, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["children", "classes", "className", "defaultExpanded", "disabled", "expanded", "onChange", "square", "TransitionComponent", "TransitionProps"]); | |
var _useControlled = useControlled({ | |
controlled: expandedProp, | |
default: defaultExpanded, | |
name: "ExpansionPanel", | |
state: "expanded" | |
}), _useControlled2 = _slicedToArray(_useControlled, 2), expanded = _useControlled2[0], setExpandedState = _useControlled2[1]; | |
var handleChange = React44.useCallback(function(event) { | |
setExpandedState(!expanded); | |
if (onChange) { | |
onChange(event, !expanded); | |
} | |
}, [expanded, onChange, setExpandedState]); | |
var _React$Children$toArr = React44.Children.toArray(childrenProp), _React$Children$toArr2 = _toArray(_React$Children$toArr), summary = _React$Children$toArr2[0], children = _React$Children$toArr2.slice(1); | |
var contextValue = React44.useMemo(function() { | |
return { | |
expanded, | |
disabled, | |
toggle: handleChange | |
}; | |
}, [expanded, disabled, handleChange]); | |
return React44.createElement(Paper_default, _extends({ | |
className: clsx_m_default(classes.root, className, expanded && classes.expanded, disabled && classes.disabled, !square && classes.rounded), | |
ref, | |
square | |
}, other), React44.createElement(ExpansionPanelContext_default.Provider, { | |
value: contextValue | |
}, summary), React44.createElement(TransitionComponent, _extends({ | |
in: expanded, | |
timeout: "auto" | |
}, TransitionProps), React44.createElement("div", { | |
"aria-labelledby": summary.props.id, | |
id: summary.props["aria-controls"], | |
role: "region" | |
}, children))); | |
}); | |
true ? ExpansionPanel.propTypes = { | |
children: chainPropTypes(import_prop_types33.default.node.isRequired, function(props) { | |
var summary = React44.Children.toArray(props.children)[0]; | |
if (import_react_is5.isFragment(summary)) { | |
return new Error("Material-UI: The ExpansionPanel doesn't accept a Fragment as a child. Consider providing an array instead."); | |
} | |
if (!React44.isValidElement(summary)) { | |
return new Error("Material-UI: Expected the first child of ExpansionPanel to be a valid element."); | |
} | |
return null; | |
}), | |
classes: import_prop_types33.default.object, | |
className: import_prop_types33.default.string, | |
defaultExpanded: import_prop_types33.default.bool, | |
disabled: import_prop_types33.default.bool, | |
expanded: import_prop_types33.default.bool, | |
onChange: import_prop_types33.default.func, | |
square: import_prop_types33.default.bool, | |
TransitionComponent: import_prop_types33.default.elementType, | |
TransitionProps: import_prop_types33.default.object | |
} : void 0; | |
var ExpansionPanel_default = withStyles_default(styles49, { | |
name: "MuiExpansionPanel" | |
})(ExpansionPanel); | |
// node_modules/@material-ui/core/esm/ExpansionPanelActions/ExpansionPanelActions.js | |
var React45 = __toModule(require_react()); | |
var import_prop_types34 = __toModule(require_prop_types()); | |
var styles51 = { | |
root: { | |
display: "flex", | |
alignItems: "center", | |
padding: 8, | |
justifyContent: "flex-end" | |
}, | |
spacing: { | |
"& > :not(:first-child)": { | |
marginLeft: 8 | |
} | |
} | |
}; | |
var warnedOnce2 = false; | |
var ExpansionPanelActions = React45.forwardRef(function ExpansionPanelActions2(props, ref) { | |
if (true) { | |
if (!warnedOnce2) { | |
warnedOnce2 = true; | |
console.error(["Material-UI: the ExpansionPanelActions component was renamed to AccordionActions to use a more common naming convention.", "", "You should use `import { AccordionActions } from '@material-ui/core'`", "or `import AccordionActions from '@material-ui/core/AccordionActions'`"].join("\n")); | |
} | |
} | |
var classes = props.classes, className = props.className, _props$disableSpacing = props.disableSpacing, disableSpacing = _props$disableSpacing === void 0 ? false : _props$disableSpacing, other = _objectWithoutProperties(props, ["classes", "className", "disableSpacing"]); | |
return React45.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, !disableSpacing && classes.spacing), | |
ref | |
}, other)); | |
}); | |
true ? ExpansionPanelActions.propTypes = { | |
children: import_prop_types34.default.node, | |
classes: import_prop_types34.default.object, | |
className: import_prop_types34.default.string, | |
disableSpacing: import_prop_types34.default.bool | |
} : void 0; | |
var ExpansionPanelActions_default = withStyles_default(styles51, { | |
name: "MuiExpansionPanelActions" | |
})(ExpansionPanelActions); | |
// node_modules/@material-ui/core/esm/ExpansionPanelDetails/ExpansionPanelDetails.js | |
var React46 = __toModule(require_react()); | |
var import_prop_types35 = __toModule(require_prop_types()); | |
var styles52 = function styles53(theme) { | |
return { | |
root: { | |
display: "flex", | |
padding: theme.spacing(1, 2, 2) | |
} | |
}; | |
}; | |
var warnedOnce3 = false; | |
var ExpansionPanelDetails = React46.forwardRef(function ExpansionPanelDetails2(props, ref) { | |
if (true) { | |
if (!warnedOnce3) { | |
warnedOnce3 = true; | |
console.error(["Material-UI: the ExpansionPanelDetails component was renamed to AccordionDetails to use a more common naming convention.", "", "You should use `import { AccordionDetails } from '@material-ui/core'`", "or `import AccordionDetails from '@material-ui/core/AccordionActions'`"].join("\n")); | |
} | |
} | |
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]); | |
return React46.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other)); | |
}); | |
true ? ExpansionPanelDetails.propTypes = { | |
children: import_prop_types35.default.node, | |
classes: import_prop_types35.default.object, | |
className: import_prop_types35.default.string | |
} : void 0; | |
var ExpansionPanelDetails_default = withStyles_default(styles52, { | |
name: "MuiExpansionPanelDetails" | |
})(ExpansionPanelDetails); | |
// node_modules/@material-ui/core/esm/ExpansionPanelSummary/ExpansionPanelSummary.js | |
var React47 = __toModule(require_react()); | |
var import_prop_types36 = __toModule(require_prop_types()); | |
var styles54 = function styles55(theme) { | |
var transition = { | |
duration: theme.transitions.duration.shortest | |
}; | |
return { | |
root: { | |
display: "flex", | |
minHeight: 8 * 6, | |
transition: theme.transitions.create(["min-height", "background-color"], transition), | |
padding: theme.spacing(0, 2), | |
"&:hover:not($disabled)": { | |
cursor: "pointer" | |
}, | |
"&$expanded": { | |
minHeight: 64 | |
}, | |
"&$focused": { | |
backgroundColor: theme.palette.action.focus | |
}, | |
"&$disabled": { | |
opacity: theme.palette.action.disabledOpacity | |
} | |
}, | |
expanded: {}, | |
focused: {}, | |
disabled: {}, | |
content: { | |
display: "flex", | |
flexGrow: 1, | |
transition: theme.transitions.create(["margin"], transition), | |
margin: "12px 0", | |
"&$expanded": { | |
margin: "20px 0" | |
} | |
}, | |
expandIcon: { | |
transform: "rotate(0deg)", | |
transition: theme.transitions.create("transform", transition), | |
"&:hover": { | |
backgroundColor: "transparent" | |
}, | |
"&$expanded": { | |
transform: "rotate(180deg)" | |
} | |
} | |
}; | |
}; | |
var warnedOnce4 = false; | |
var ExpansionPanelSummary = React47.forwardRef(function ExpansionPanelSummary2(props, ref) { | |
if (true) { | |
if (!warnedOnce4) { | |
warnedOnce4 = true; | |
console.error(["Material-UI: the ExpansionPanelSummary component was renamed to AccordionSummary to use a more common naming convention.", "", "You should use `import { AccordionSummary } from '@material-ui/core'`", "or `import AccordionSummary from '@material-ui/core/AccordionSummary'`"].join("\n")); | |
} | |
} | |
var children = props.children, classes = props.classes, className = props.className, expandIcon = props.expandIcon, IconButtonProps = props.IconButtonProps, onBlur = props.onBlur, onClick = props.onClick, onFocusVisible = props.onFocusVisible, other = _objectWithoutProperties(props, ["children", "classes", "className", "expandIcon", "IconButtonProps", "onBlur", "onClick", "onFocusVisible"]); | |
var _React$useState = React47.useState(false), focusedState = _React$useState[0], setFocusedState = _React$useState[1]; | |
var handleFocusVisible = function handleFocusVisible2(event) { | |
setFocusedState(true); | |
if (onFocusVisible) { | |
onFocusVisible(event); | |
} | |
}; | |
var handleBlur = function handleBlur2(event) { | |
setFocusedState(false); | |
if (onBlur) { | |
onBlur(event); | |
} | |
}; | |
var _React$useContext = React47.useContext(ExpansionPanelContext_default), _React$useContext$dis = _React$useContext.disabled, disabled = _React$useContext$dis === void 0 ? false : _React$useContext$dis, expanded = _React$useContext.expanded, toggle = _React$useContext.toggle; | |
var handleChange = function handleChange2(event) { | |
if (toggle) { | |
toggle(event); | |
} | |
if (onClick) { | |
onClick(event); | |
} | |
}; | |
return React47.createElement(ButtonBase_default, _extends({ | |
focusRipple: false, | |
disableRipple: true, | |
disabled, | |
component: "div", | |
"aria-expanded": expanded, | |
className: clsx_m_default(classes.root, className, disabled && classes.disabled, expanded && classes.expanded, focusedState && classes.focused), | |
onFocusVisible: handleFocusVisible, | |
onBlur: handleBlur, | |
onClick: handleChange, | |
ref | |
}, other), React47.createElement("div", { | |
className: clsx_m_default(classes.content, expanded && classes.expanded) | |
}, children), expandIcon && React47.createElement(IconButton_default, _extends({ | |
className: clsx_m_default(classes.expandIcon, expanded && classes.expanded), | |
edge: "end", | |
component: "div", | |
tabIndex: null, | |
role: null, | |
"aria-hidden": true | |
}, IconButtonProps), expandIcon)); | |
}); | |
true ? ExpansionPanelSummary.propTypes = { | |
children: import_prop_types36.default.node, | |
classes: import_prop_types36.default.object, | |
className: import_prop_types36.default.string, | |
expandIcon: import_prop_types36.default.node, | |
IconButtonProps: import_prop_types36.default.object, | |
onBlur: import_prop_types36.default.func, | |
onClick: import_prop_types36.default.func, | |
onFocusVisible: import_prop_types36.default.func | |
} : void 0; | |
var ExpansionPanelSummary_default = withStyles_default(styles54, { | |
name: "MuiExpansionPanelSummary" | |
})(ExpansionPanelSummary); | |
// node_modules/@material-ui/core/esm/Fab/Fab.js | |
var React48 = __toModule(require_react()); | |
var import_prop_types37 = __toModule(require_prop_types()); | |
var styles56 = function styles57(theme) { | |
return { | |
root: _extends({}, theme.typography.button, { | |
boxSizing: "border-box", | |
minHeight: 36, | |
transition: theme.transitions.create(["background-color", "box-shadow", "border"], { | |
duration: theme.transitions.duration.short | |
}), | |
borderRadius: "50%", | |
padding: 0, | |
minWidth: 0, | |
width: 56, | |
height: 56, | |
boxShadow: theme.shadows[6], | |
"&:active": { | |
boxShadow: theme.shadows[12] | |
}, | |
color: theme.palette.getContrastText(theme.palette.grey[300]), | |
backgroundColor: theme.palette.grey[300], | |
"&:hover": { | |
backgroundColor: theme.palette.grey.A100, | |
"@media (hover: none)": { | |
backgroundColor: theme.palette.grey[300] | |
}, | |
"&$disabled": { | |
backgroundColor: theme.palette.action.disabledBackground | |
}, | |
textDecoration: "none" | |
}, | |
"&$focusVisible": { | |
boxShadow: theme.shadows[6] | |
}, | |
"&$disabled": { | |
color: theme.palette.action.disabled, | |
boxShadow: theme.shadows[0], | |
backgroundColor: theme.palette.action.disabledBackground | |
} | |
}), | |
label: { | |
width: "100%", | |
display: "inherit", | |
alignItems: "inherit", | |
justifyContent: "inherit" | |
}, | |
primary: { | |
color: theme.palette.primary.contrastText, | |
backgroundColor: theme.palette.primary.main, | |
"&:hover": { | |
backgroundColor: theme.palette.primary.dark, | |
"@media (hover: none)": { | |
backgroundColor: theme.palette.primary.main | |
} | |
} | |
}, | |
secondary: { | |
color: theme.palette.secondary.contrastText, | |
backgroundColor: theme.palette.secondary.main, | |
"&:hover": { | |
backgroundColor: theme.palette.secondary.dark, | |
"@media (hover: none)": { | |
backgroundColor: theme.palette.secondary.main | |
} | |
} | |
}, | |
extended: { | |
borderRadius: 48 / 2, | |
padding: "0 16px", | |
width: "auto", | |
minHeight: "auto", | |
minWidth: 48, | |
height: 48, | |
"&$sizeSmall": { | |
width: "auto", | |
padding: "0 8px", | |
borderRadius: 34 / 2, | |
minWidth: 34, | |
height: 34 | |
}, | |
"&$sizeMedium": { | |
width: "auto", | |
padding: "0 16px", | |
borderRadius: 40 / 2, | |
minWidth: 40, | |
height: 40 | |
} | |
}, | |
focusVisible: {}, | |
disabled: {}, | |
colorInherit: { | |
color: "inherit" | |
}, | |
sizeSmall: { | |
width: 40, | |
height: 40 | |
}, | |
sizeMedium: { | |
width: 48, | |
height: 48 | |
} | |
}; | |
}; | |
var Fab = React48.forwardRef(function Fab2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, _props$component = props.component, component = _props$component === void 0 ? "button" : _props$component, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$disableFocusRi = props.disableFocusRipple, disableFocusRipple = _props$disableFocusRi === void 0 ? false : _props$disableFocusRi, focusVisibleClassName = props.focusVisibleClassName, _props$size = props.size, size = _props$size === void 0 ? "large" : _props$size, _props$variant = props.variant, variant = _props$variant === void 0 ? "round" : _props$variant, other = _objectWithoutProperties(props, ["children", "classes", "className", "color", "component", "disabled", "disableFocusRipple", "focusVisibleClassName", "size", "variant"]); | |
return React48.createElement(ButtonBase_default, _extends({ | |
className: clsx_m_default(classes.root, className, variant !== "round" && classes.extended, size !== "large" && classes["size".concat(capitalize(size))], disabled && classes.disabled, { | |
primary: classes.primary, | |
secondary: classes.secondary, | |
inherit: classes.colorInherit | |
}[color]), | |
component, | |
disabled, | |
focusRipple: !disableFocusRipple, | |
focusVisibleClassName: clsx_m_default(classes.focusVisible, focusVisibleClassName), | |
ref | |
}, other), React48.createElement("span", { | |
className: classes.label | |
}, children)); | |
}); | |
true ? Fab.propTypes = { | |
children: import_prop_types37.default.node.isRequired, | |
classes: import_prop_types37.default.object, | |
className: import_prop_types37.default.string, | |
color: import_prop_types37.default.oneOf(["default", "inherit", "primary", "secondary"]), | |
component: import_prop_types37.default.elementType, | |
disabled: import_prop_types37.default.bool, | |
disableFocusRipple: import_prop_types37.default.bool, | |
disableRipple: import_prop_types37.default.bool, | |
focusVisibleClassName: import_prop_types37.default.string, | |
href: import_prop_types37.default.string, | |
size: import_prop_types37.default.oneOf(["large", "medium", "small"]), | |
variant: import_prop_types37.default.oneOf(["extended", "round"]) | |
} : void 0; | |
var Fab_default = withStyles_default(styles56, { | |
name: "MuiFab" | |
})(Fab); | |
// node_modules/@material-ui/core/esm/FilledInput/FilledInput.js | |
var React51 = __toModule(require_react()); | |
var import_prop_types40 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/InputBase/InputBase.js | |
var React50 = __toModule(require_react()); | |
var import_prop_types39 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/FormControl/formControlState.js | |
function formControlState(_ref5) { | |
var props = _ref5.props, states = _ref5.states, muiFormControl = _ref5.muiFormControl; | |
return states.reduce(function(acc, state) { | |
acc[state] = props[state]; | |
if (muiFormControl) { | |
if (typeof props[state] === "undefined") { | |
acc[state] = muiFormControl[state]; | |
} | |
} | |
return acc; | |
}, {}); | |
} | |
// node_modules/@material-ui/core/esm/TextareaAutosize/TextareaAutosize.js | |
var React49 = __toModule(require_react()); | |
var import_prop_types38 = __toModule(require_prop_types()); | |
function getStyleValue(computedStyle, property) { | |
return parseInt(computedStyle[property], 10) || 0; | |
} | |
var useEnhancedEffect = typeof window !== "undefined" ? React49.useLayoutEffect : React49.useEffect; | |
var styles58 = { | |
shadow: { | |
visibility: "hidden", | |
position: "absolute", | |
overflow: "hidden", | |
height: 0, | |
top: 0, | |
left: 0, | |
transform: "translateZ(0)" | |
} | |
}; | |
var TextareaAutosize = React49.forwardRef(function TextareaAutosize2(props, ref) { | |
var onChange = props.onChange, rows = props.rows, rowsMax = props.rowsMax, _props$rowsMin = props.rowsMin, rowsMinProp = _props$rowsMin === void 0 ? 1 : _props$rowsMin, style = props.style, value = props.value, other = _objectWithoutProperties(props, ["onChange", "rows", "rowsMax", "rowsMin", "style", "value"]); | |
var rowsMin = rows || rowsMinProp; | |
var _React$useRef = React49.useRef(value != null), isControlled = _React$useRef.current; | |
var inputRef = React49.useRef(null); | |
var handleRef = useForkRef(ref, inputRef); | |
var shadowRef = React49.useRef(null); | |
var renders = React49.useRef(0); | |
var _React$useState = React49.useState({}), state = _React$useState[0], setState = _React$useState[1]; | |
var syncHeight = React49.useCallback(function() { | |
var input = inputRef.current; | |
var computedStyle = window.getComputedStyle(input); | |
var inputShallow = shadowRef.current; | |
inputShallow.style.width = computedStyle.width; | |
inputShallow.value = input.value || props.placeholder || "x"; | |
if (inputShallow.value.slice(-1) === "\n") { | |
inputShallow.value += " "; | |
} | |
var boxSizing = computedStyle["box-sizing"]; | |
var padding = getStyleValue(computedStyle, "padding-bottom") + getStyleValue(computedStyle, "padding-top"); | |
var border = getStyleValue(computedStyle, "border-bottom-width") + getStyleValue(computedStyle, "border-top-width"); | |
var innerHeight = inputShallow.scrollHeight - padding; | |
inputShallow.value = "x"; | |
var singleRowHeight = inputShallow.scrollHeight - padding; | |
var outerHeight = innerHeight; | |
if (rowsMin) { | |
outerHeight = Math.max(Number(rowsMin) * singleRowHeight, outerHeight); | |
} | |
if (rowsMax) { | |
outerHeight = Math.min(Number(rowsMax) * singleRowHeight, outerHeight); | |
} | |
outerHeight = Math.max(outerHeight, singleRowHeight); | |
var outerHeightStyle = outerHeight + (boxSizing === "border-box" ? padding + border : 0); | |
var overflow = Math.abs(outerHeight - innerHeight) <= 1; | |
setState(function(prevState) { | |
if (renders.current < 20 && (outerHeightStyle > 0 && Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) > 1 || prevState.overflow !== overflow)) { | |
renders.current += 1; | |
return { | |
overflow, | |
outerHeightStyle | |
}; | |
} | |
if (true) { | |
if (renders.current === 20) { | |
console.error(["Material-UI: Too many re-renders. The layout is unstable.", "TextareaAutosize limits the number of renders to prevent an infinite loop."].join("\n")); | |
} | |
} | |
return prevState; | |
}); | |
}, [rowsMax, rowsMin, props.placeholder]); | |
React49.useEffect(function() { | |
var handleResize = debounce(function() { | |
renders.current = 0; | |
syncHeight(); | |
}); | |
window.addEventListener("resize", handleResize); | |
return function() { | |
handleResize.clear(); | |
window.removeEventListener("resize", handleResize); | |
}; | |
}, [syncHeight]); | |
useEnhancedEffect(function() { | |
syncHeight(); | |
}); | |
React49.useEffect(function() { | |
renders.current = 0; | |
}, [value]); | |
var handleChange = function handleChange2(event) { | |
renders.current = 0; | |
if (!isControlled) { | |
syncHeight(); | |
} | |
if (onChange) { | |
onChange(event); | |
} | |
}; | |
return React49.createElement(React49.Fragment, null, React49.createElement("textarea", _extends({ | |
value, | |
onChange: handleChange, | |
ref: handleRef, | |
rows: rowsMin, | |
style: _extends({ | |
height: state.outerHeightStyle, | |
overflow: state.overflow ? "hidden" : null | |
}, style) | |
}, other)), React49.createElement("textarea", { | |
"aria-hidden": true, | |
className: props.className, | |
readOnly: true, | |
ref: shadowRef, | |
tabIndex: -1, | |
style: _extends({}, styles58.shadow, style) | |
})); | |
}); | |
true ? TextareaAutosize.propTypes = { | |
className: import_prop_types38.default.string, | |
onChange: import_prop_types38.default.func, | |
placeholder: import_prop_types38.default.string, | |
rows: import_prop_types38.default.oneOfType([import_prop_types38.default.number, import_prop_types38.default.string]), | |
rowsMax: import_prop_types38.default.oneOfType([import_prop_types38.default.number, import_prop_types38.default.string]), | |
rowsMin: import_prop_types38.default.oneOfType([import_prop_types38.default.number, import_prop_types38.default.string]), | |
style: import_prop_types38.default.object, | |
value: import_prop_types38.default.oneOfType([import_prop_types38.default.arrayOf(import_prop_types38.default.string), import_prop_types38.default.number, import_prop_types38.default.string]) | |
} : void 0; | |
var TextareaAutosize_default = TextareaAutosize; | |
// node_modules/@material-ui/core/esm/InputBase/utils.js | |
function hasValue(value) { | |
return value != null && !(Array.isArray(value) && value.length === 0); | |
} | |
function isFilled(obj) { | |
var SSR = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false; | |
return obj && (hasValue(obj.value) && obj.value !== "" || SSR && hasValue(obj.defaultValue) && obj.defaultValue !== ""); | |
} | |
function isAdornedStart(obj) { | |
return obj.startAdornment; | |
} | |
// node_modules/@material-ui/core/esm/InputBase/InputBase.js | |
var styles59 = function styles60(theme) { | |
var light = theme.palette.type === "light"; | |
var placeholder = { | |
color: "currentColor", | |
opacity: light ? 0.42 : 0.5, | |
transition: theme.transitions.create("opacity", { | |
duration: theme.transitions.duration.shorter | |
}) | |
}; | |
var placeholderHidden = { | |
opacity: "0 !important" | |
}; | |
var placeholderVisible = { | |
opacity: light ? 0.42 : 0.5 | |
}; | |
return { | |
"@global": { | |
"@keyframes mui-auto-fill": {}, | |
"@keyframes mui-auto-fill-cancel": {} | |
}, | |
root: _extends({}, theme.typography.body1, { | |
color: theme.palette.text.primary, | |
lineHeight: "1.1876em", | |
boxSizing: "border-box", | |
position: "relative", | |
cursor: "text", | |
display: "inline-flex", | |
alignItems: "center", | |
"&$disabled": { | |
color: theme.palette.text.disabled, | |
cursor: "default" | |
} | |
}), | |
formControl: {}, | |
focused: {}, | |
disabled: {}, | |
adornedStart: {}, | |
adornedEnd: {}, | |
error: {}, | |
marginDense: {}, | |
multiline: { | |
padding: "".concat(8 - 2, "px 0 ").concat(8 - 1, "px"), | |
"&$marginDense": { | |
paddingTop: 4 - 1 | |
} | |
}, | |
colorSecondary: {}, | |
fullWidth: { | |
width: "100%" | |
}, | |
input: { | |
font: "inherit", | |
letterSpacing: "inherit", | |
color: "currentColor", | |
padding: "".concat(8 - 2, "px 0 ").concat(8 - 1, "px"), | |
border: 0, | |
boxSizing: "content-box", | |
background: "none", | |
height: "1.1876em", | |
margin: 0, | |
WebkitTapHighlightColor: "transparent", | |
display: "block", | |
minWidth: 0, | |
width: "100%", | |
animationName: "mui-auto-fill-cancel", | |
animationDuration: "10ms", | |
"&::-webkit-input-placeholder": placeholder, | |
"&::-moz-placeholder": placeholder, | |
"&:-ms-input-placeholder": placeholder, | |
"&::-ms-input-placeholder": placeholder, | |
"&:focus": { | |
outline: 0 | |
}, | |
"&:invalid": { | |
boxShadow: "none" | |
}, | |
"&::-webkit-search-decoration": { | |
"-webkit-appearance": "none" | |
}, | |
"label[data-shrink=false] + $formControl &": { | |
"&::-webkit-input-placeholder": placeholderHidden, | |
"&::-moz-placeholder": placeholderHidden, | |
"&:-ms-input-placeholder": placeholderHidden, | |
"&::-ms-input-placeholder": placeholderHidden, | |
"&:focus::-webkit-input-placeholder": placeholderVisible, | |
"&:focus::-moz-placeholder": placeholderVisible, | |
"&:focus:-ms-input-placeholder": placeholderVisible, | |
"&:focus::-ms-input-placeholder": placeholderVisible | |
}, | |
"&$disabled": { | |
opacity: 1 | |
}, | |
"&:-webkit-autofill": { | |
animationDuration: "5000s", | |
animationName: "mui-auto-fill" | |
} | |
}, | |
inputMarginDense: { | |
paddingTop: 4 - 1 | |
}, | |
inputMultiline: { | |
height: "auto", | |
resize: "none", | |
padding: 0 | |
}, | |
inputTypeSearch: { | |
"-moz-appearance": "textfield", | |
"-webkit-appearance": "textfield" | |
}, | |
inputAdornedStart: {}, | |
inputAdornedEnd: {}, | |
inputHiddenLabel: {} | |
}; | |
}; | |
var useEnhancedEffect2 = typeof window === "undefined" ? React50.useEffect : React50.useLayoutEffect; | |
var InputBase = React50.forwardRef(function InputBase2(props, ref) { | |
var ariaDescribedby = props["aria-describedby"], autoComplete = props.autoComplete, autoFocus = props.autoFocus, classes = props.classes, className = props.className, color = props.color, defaultValue = props.defaultValue, disabled = props.disabled, endAdornment = props.endAdornment, error = props.error, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, id = props.id, _props$inputComponent = props.inputComponent, inputComponent = _props$inputComponent === void 0 ? "input" : _props$inputComponent, _props$inputProps = props.inputProps, inputPropsProp = _props$inputProps === void 0 ? {} : _props$inputProps, inputRefProp = props.inputRef, margin = props.margin, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, name = props.name, onBlur = props.onBlur, onChange = props.onChange, onClick = props.onClick, onFocus = props.onFocus, onKeyDown = props.onKeyDown, onKeyUp = props.onKeyUp, placeholder = props.placeholder, readOnly = props.readOnly, renderSuffix = props.renderSuffix, rows = props.rows, rowsMax = props.rowsMax, rowsMin = props.rowsMin, startAdornment = props.startAdornment, _props$type = props.type, type = _props$type === void 0 ? "text" : _props$type, valueProp = props.value, other = _objectWithoutProperties(props, ["aria-describedby", "autoComplete", "autoFocus", "classes", "className", "color", "defaultValue", "disabled", "endAdornment", "error", "fullWidth", "id", "inputComponent", "inputProps", "inputRef", "margin", "multiline", "name", "onBlur", "onChange", "onClick", "onFocus", "onKeyDown", "onKeyUp", "placeholder", "readOnly", "renderSuffix", "rows", "rowsMax", "rowsMin", "startAdornment", "type", "value"]); | |
var value = inputPropsProp.value != null ? inputPropsProp.value : valueProp; | |
var _React$useRef = React50.useRef(value != null), isControlled = _React$useRef.current; | |
var inputRef = React50.useRef(); | |
var handleInputRefWarning = React50.useCallback(function(instance) { | |
if (true) { | |
if (instance && instance.nodeName !== "INPUT" && !instance.focus) { | |
console.error(["Material-UI: You have provided a `inputComponent` to the input component", "that does not correctly handle the `inputRef` prop.", "Make sure the `inputRef` prop is called with a HTMLInputElement."].join("\n")); | |
} | |
} | |
}, []); | |
var handleInputPropsRefProp = useForkRef(inputPropsProp.ref, handleInputRefWarning); | |
var handleInputRefProp = useForkRef(inputRefProp, handleInputPropsRefProp); | |
var handleInputRef = useForkRef(inputRef, handleInputRefProp); | |
var _React$useState = React50.useState(false), focused = _React$useState[0], setFocused = _React$useState[1]; | |
var muiFormControl = useFormControl(); | |
if (true) { | |
React50.useEffect(function() { | |
if (muiFormControl) { | |
return muiFormControl.registerEffect(); | |
} | |
return void 0; | |
}, [muiFormControl]); | |
} | |
var fcs = formControlState({ | |
props, | |
muiFormControl, | |
states: ["color", "disabled", "error", "hiddenLabel", "margin", "required", "filled"] | |
}); | |
fcs.focused = muiFormControl ? muiFormControl.focused : focused; | |
React50.useEffect(function() { | |
if (!muiFormControl && disabled && focused) { | |
setFocused(false); | |
if (onBlur) { | |
onBlur(); | |
} | |
} | |
}, [muiFormControl, disabled, focused, onBlur]); | |
var onFilled = muiFormControl && muiFormControl.onFilled; | |
var onEmpty = muiFormControl && muiFormControl.onEmpty; | |
var checkDirty = React50.useCallback(function(obj) { | |
if (isFilled(obj)) { | |
if (onFilled) { | |
onFilled(); | |
} | |
} else if (onEmpty) { | |
onEmpty(); | |
} | |
}, [onFilled, onEmpty]); | |
useEnhancedEffect2(function() { | |
if (isControlled) { | |
checkDirty({ | |
value | |
}); | |
} | |
}, [value, checkDirty, isControlled]); | |
var handleFocus = function handleFocus2(event) { | |
if (fcs.disabled) { | |
event.stopPropagation(); | |
return; | |
} | |
if (onFocus) { | |
onFocus(event); | |
} | |
if (inputPropsProp.onFocus) { | |
inputPropsProp.onFocus(event); | |
} | |
if (muiFormControl && muiFormControl.onFocus) { | |
muiFormControl.onFocus(event); | |
} else { | |
setFocused(true); | |
} | |
}; | |
var handleBlur = function handleBlur2(event) { | |
if (onBlur) { | |
onBlur(event); | |
} | |
if (inputPropsProp.onBlur) { | |
inputPropsProp.onBlur(event); | |
} | |
if (muiFormControl && muiFormControl.onBlur) { | |
muiFormControl.onBlur(event); | |
} else { | |
setFocused(false); | |
} | |
}; | |
var handleChange = function handleChange2(event) { | |
if (!isControlled) { | |
var element = event.target || inputRef.current; | |
if (element == null) { | |
throw new Error(true ? "Material-UI: Expected valid input target. Did you use a custom `inputComponent` and forget to forward refs? See https://material-ui.com/r/input-component-ref-interface for more info." : formatMuiErrorMessage(1)); | |
} | |
checkDirty({ | |
value: element.value | |
}); | |
} | |
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { | |
args[_key - 1] = arguments[_key]; | |
} | |
if (inputPropsProp.onChange) { | |
inputPropsProp.onChange.apply(inputPropsProp, [event].concat(args)); | |
} | |
if (onChange) { | |
onChange.apply(void 0, [event].concat(args)); | |
} | |
}; | |
React50.useEffect(function() { | |
checkDirty(inputRef.current); | |
}, []); | |
var handleClick = function handleClick2(event) { | |
if (inputRef.current && event.currentTarget === event.target) { | |
inputRef.current.focus(); | |
} | |
if (onClick) { | |
onClick(event); | |
} | |
}; | |
var InputComponent = inputComponent; | |
var inputProps = _extends({}, inputPropsProp, { | |
ref: handleInputRef | |
}); | |
if (typeof InputComponent !== "string") { | |
inputProps = _extends({ | |
inputRef: handleInputRef, | |
type | |
}, inputProps, { | |
ref: null | |
}); | |
} else if (multiline) { | |
if (rows && !rowsMax && !rowsMin) { | |
InputComponent = "textarea"; | |
} else { | |
inputProps = _extends({ | |
rows, | |
rowsMax | |
}, inputProps); | |
InputComponent = TextareaAutosize_default; | |
} | |
} else { | |
inputProps = _extends({ | |
type | |
}, inputProps); | |
} | |
var handleAutoFill = function handleAutoFill2(event) { | |
checkDirty(event.animationName === "mui-auto-fill-cancel" ? inputRef.current : { | |
value: "x" | |
}); | |
}; | |
React50.useEffect(function() { | |
if (muiFormControl) { | |
muiFormControl.setAdornedStart(Boolean(startAdornment)); | |
} | |
}, [muiFormControl, startAdornment]); | |
return React50.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, classes["color".concat(capitalize(fcs.color || "primary"))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fullWidth && classes.fullWidth, fcs.focused && classes.focused, muiFormControl && classes.formControl, multiline && classes.multiline, startAdornment && classes.adornedStart, endAdornment && classes.adornedEnd, fcs.margin === "dense" && classes.marginDense), | |
onClick: handleClick, | |
ref | |
}, other), startAdornment, React50.createElement(FormControlContext_default.Provider, { | |
value: null | |
}, React50.createElement(InputComponent, _extends({ | |
"aria-invalid": fcs.error, | |
"aria-describedby": ariaDescribedby, | |
autoComplete, | |
autoFocus, | |
defaultValue, | |
disabled: fcs.disabled, | |
id, | |
onAnimationStart: handleAutoFill, | |
name, | |
placeholder, | |
readOnly, | |
required: fcs.required, | |
rows, | |
value, | |
onKeyDown, | |
onKeyUp | |
}, inputProps, { | |
className: clsx_m_default(classes.input, inputPropsProp.className, fcs.disabled && classes.disabled, multiline && classes.inputMultiline, fcs.hiddenLabel && classes.inputHiddenLabel, startAdornment && classes.inputAdornedStart, endAdornment && classes.inputAdornedEnd, type === "search" && classes.inputTypeSearch, fcs.margin === "dense" && classes.inputMarginDense), | |
onBlur: handleBlur, | |
onChange: handleChange, | |
onFocus: handleFocus | |
}))), endAdornment, renderSuffix ? renderSuffix(_extends({}, fcs, { | |
startAdornment | |
})) : null); | |
}); | |
true ? InputBase.propTypes = { | |
"aria-describedby": import_prop_types39.default.string, | |
autoComplete: import_prop_types39.default.string, | |
autoFocus: import_prop_types39.default.bool, | |
classes: import_prop_types39.default.object, | |
className: import_prop_types39.default.string, | |
color: import_prop_types39.default.oneOf(["primary", "secondary"]), | |
defaultValue: import_prop_types39.default.any, | |
disabled: import_prop_types39.default.bool, | |
endAdornment: import_prop_types39.default.node, | |
error: import_prop_types39.default.bool, | |
fullWidth: import_prop_types39.default.bool, | |
id: import_prop_types39.default.string, | |
inputComponent: import_prop_types39.default.elementType, | |
inputProps: import_prop_types39.default.object, | |
inputRef: refType_default, | |
margin: import_prop_types39.default.oneOf(["dense", "none"]), | |
multiline: import_prop_types39.default.bool, | |
name: import_prop_types39.default.string, | |
onBlur: import_prop_types39.default.func, | |
onChange: import_prop_types39.default.func, | |
onClick: import_prop_types39.default.func, | |
onFocus: import_prop_types39.default.func, | |
onKeyDown: import_prop_types39.default.func, | |
onKeyUp: import_prop_types39.default.func, | |
placeholder: import_prop_types39.default.string, | |
readOnly: import_prop_types39.default.bool, | |
renderSuffix: import_prop_types39.default.func, | |
required: import_prop_types39.default.bool, | |
rows: import_prop_types39.default.oneOfType([import_prop_types39.default.number, import_prop_types39.default.string]), | |
rowsMax: import_prop_types39.default.oneOfType([import_prop_types39.default.number, import_prop_types39.default.string]), | |
rowsMin: import_prop_types39.default.oneOfType([import_prop_types39.default.number, import_prop_types39.default.string]), | |
startAdornment: import_prop_types39.default.node, | |
type: import_prop_types39.default.string, | |
value: import_prop_types39.default.any | |
} : void 0; | |
var InputBase_default = withStyles_default(styles59, { | |
name: "MuiInputBase" | |
})(InputBase); | |
// node_modules/@material-ui/core/esm/FilledInput/FilledInput.js | |
var styles61 = function styles62(theme) { | |
var light = theme.palette.type === "light"; | |
var bottomLineColor = light ? "rgba(0, 0, 0, 0.42)" : "rgba(255, 255, 255, 0.7)"; | |
var backgroundColor = light ? "rgba(0, 0, 0, 0.09)" : "rgba(255, 255, 255, 0.09)"; | |
return { | |
root: { | |
position: "relative", | |
backgroundColor, | |
borderTopLeftRadius: theme.shape.borderRadius, | |
borderTopRightRadius: theme.shape.borderRadius, | |
transition: theme.transitions.create("background-color", { | |
duration: theme.transitions.duration.shorter, | |
easing: theme.transitions.easing.easeOut | |
}), | |
"&:hover": { | |
backgroundColor: light ? "rgba(0, 0, 0, 0.13)" : "rgba(255, 255, 255, 0.13)", | |
"@media (hover: none)": { | |
backgroundColor | |
} | |
}, | |
"&$focused": { | |
backgroundColor: light ? "rgba(0, 0, 0, 0.09)" : "rgba(255, 255, 255, 0.09)" | |
}, | |
"&$disabled": { | |
backgroundColor: light ? "rgba(0, 0, 0, 0.12)" : "rgba(255, 255, 255, 0.12)" | |
} | |
}, | |
colorSecondary: { | |
"&$underline:after": { | |
borderBottomColor: theme.palette.secondary.main | |
} | |
}, | |
underline: { | |
"&:after": { | |
borderBottom: "2px solid ".concat(theme.palette.primary.main), | |
left: 0, | |
bottom: 0, | |
content: '""', | |
position: "absolute", | |
right: 0, | |
transform: "scaleX(0)", | |
transition: theme.transitions.create("transform", { | |
duration: theme.transitions.duration.shorter, | |
easing: theme.transitions.easing.easeOut | |
}), | |
pointerEvents: "none" | |
}, | |
"&$focused:after": { | |
transform: "scaleX(1)" | |
}, | |
"&$error:after": { | |
borderBottomColor: theme.palette.error.main, | |
transform: "scaleX(1)" | |
}, | |
"&:before": { | |
borderBottom: "1px solid ".concat(bottomLineColor), | |
left: 0, | |
bottom: 0, | |
content: '"\\00a0"', | |
position: "absolute", | |
right: 0, | |
transition: theme.transitions.create("border-bottom-color", { | |
duration: theme.transitions.duration.shorter | |
}), | |
pointerEvents: "none" | |
}, | |
"&:hover:before": { | |
borderBottom: "1px solid ".concat(theme.palette.text.primary) | |
}, | |
"&$disabled:before": { | |
borderBottomStyle: "dotted" | |
} | |
}, | |
focused: {}, | |
disabled: {}, | |
adornedStart: { | |
paddingLeft: 12 | |
}, | |
adornedEnd: { | |
paddingRight: 12 | |
}, | |
error: {}, | |
marginDense: {}, | |
multiline: { | |
padding: "27px 12px 10px", | |
"&$marginDense": { | |
paddingTop: 23, | |
paddingBottom: 6 | |
} | |
}, | |
input: { | |
padding: "27px 12px 10px", | |
"&:-webkit-autofill": { | |
WebkitBoxShadow: theme.palette.type === "light" ? null : "0 0 0 100px #266798 inset", | |
WebkitTextFillColor: theme.palette.type === "light" ? null : "#fff", | |
caretColor: theme.palette.type === "light" ? null : "#fff", | |
borderTopLeftRadius: "inherit", | |
borderTopRightRadius: "inherit" | |
} | |
}, | |
inputMarginDense: { | |
paddingTop: 23, | |
paddingBottom: 6 | |
}, | |
inputHiddenLabel: { | |
paddingTop: 18, | |
paddingBottom: 19, | |
"&$inputMarginDense": { | |
paddingTop: 10, | |
paddingBottom: 11 | |
} | |
}, | |
inputMultiline: { | |
padding: 0 | |
}, | |
inputAdornedStart: { | |
paddingLeft: 0 | |
}, | |
inputAdornedEnd: { | |
paddingRight: 0 | |
} | |
}; | |
}; | |
var FilledInput = React51.forwardRef(function FilledInput2(props, ref) { | |
var disableUnderline = props.disableUnderline, classes = props.classes, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, _props$inputComponent = props.inputComponent, inputComponent = _props$inputComponent === void 0 ? "input" : _props$inputComponent, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, _props$type = props.type, type = _props$type === void 0 ? "text" : _props$type, other = _objectWithoutProperties(props, ["disableUnderline", "classes", "fullWidth", "inputComponent", "multiline", "type"]); | |
return React51.createElement(InputBase_default, _extends({ | |
classes: _extends({}, classes, { | |
root: clsx_m_default(classes.root, !disableUnderline && classes.underline), | |
underline: null | |
}), | |
fullWidth, | |
inputComponent, | |
multiline, | |
ref, | |
type | |
}, other)); | |
}); | |
true ? FilledInput.propTypes = { | |
autoComplete: import_prop_types40.default.string, | |
autoFocus: import_prop_types40.default.bool, | |
classes: import_prop_types40.default.object, | |
color: import_prop_types40.default.oneOf(["primary", "secondary"]), | |
defaultValue: import_prop_types40.default.any, | |
disabled: import_prop_types40.default.bool, | |
disableUnderline: import_prop_types40.default.bool, | |
endAdornment: import_prop_types40.default.node, | |
error: import_prop_types40.default.bool, | |
fullWidth: import_prop_types40.default.bool, | |
id: import_prop_types40.default.string, | |
inputComponent: import_prop_types40.default.elementType, | |
inputProps: import_prop_types40.default.object, | |
inputRef: refType_default, | |
margin: import_prop_types40.default.oneOf(["dense", "none"]), | |
multiline: import_prop_types40.default.bool, | |
name: import_prop_types40.default.string, | |
onChange: import_prop_types40.default.func, | |
placeholder: import_prop_types40.default.string, | |
readOnly: import_prop_types40.default.bool, | |
required: import_prop_types40.default.bool, | |
rows: import_prop_types40.default.oneOfType([import_prop_types40.default.number, import_prop_types40.default.string]), | |
rowsMax: import_prop_types40.default.oneOfType([import_prop_types40.default.number, import_prop_types40.default.string]), | |
startAdornment: import_prop_types40.default.node, | |
type: import_prop_types40.default.string, | |
value: import_prop_types40.default.any | |
} : void 0; | |
FilledInput.muiName = "Input"; | |
var FilledInput_default = withStyles_default(styles61, { | |
name: "MuiFilledInput" | |
})(FilledInput); | |
// node_modules/@material-ui/core/esm/FormControl/FormControl.js | |
var React52 = __toModule(require_react()); | |
var import_prop_types41 = __toModule(require_prop_types()); | |
var styles63 = { | |
root: { | |
display: "inline-flex", | |
flexDirection: "column", | |
position: "relative", | |
minWidth: 0, | |
padding: 0, | |
margin: 0, | |
border: 0, | |
verticalAlign: "top" | |
}, | |
marginNormal: { | |
marginTop: 16, | |
marginBottom: 8 | |
}, | |
marginDense: { | |
marginTop: 8, | |
marginBottom: 4 | |
}, | |
fullWidth: { | |
width: "100%" | |
} | |
}; | |
var FormControl = React52.forwardRef(function FormControl2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$error = props.error, error = _props$error === void 0 ? false : _props$error, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, visuallyFocused = props.focused, _props$hiddenLabel = props.hiddenLabel, hiddenLabel = _props$hiddenLabel === void 0 ? false : _props$hiddenLabel, _props$margin = props.margin, margin = _props$margin === void 0 ? "none" : _props$margin, _props$required = props.required, required = _props$required === void 0 ? false : _props$required, size = props.size, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["children", "classes", "className", "color", "component", "disabled", "error", "fullWidth", "focused", "hiddenLabel", "margin", "required", "size", "variant"]); | |
var _React$useState = React52.useState(function() { | |
var initialAdornedStart = false; | |
if (children) { | |
React52.Children.forEach(children, function(child) { | |
if (!isMuiElement(child, ["Input", "Select"])) { | |
return; | |
} | |
var input = isMuiElement(child, ["Select"]) ? child.props.input : child; | |
if (input && isAdornedStart(input.props)) { | |
initialAdornedStart = true; | |
} | |
}); | |
} | |
return initialAdornedStart; | |
}), adornedStart = _React$useState[0], setAdornedStart = _React$useState[1]; | |
var _React$useState2 = React52.useState(function() { | |
var initialFilled = false; | |
if (children) { | |
React52.Children.forEach(children, function(child) { | |
if (!isMuiElement(child, ["Input", "Select"])) { | |
return; | |
} | |
if (isFilled(child.props, true)) { | |
initialFilled = true; | |
} | |
}); | |
} | |
return initialFilled; | |
}), filled = _React$useState2[0], setFilled = _React$useState2[1]; | |
var _React$useState3 = React52.useState(false), _focused = _React$useState3[0], setFocused = _React$useState3[1]; | |
var focused = visuallyFocused !== void 0 ? visuallyFocused : _focused; | |
if (disabled && focused) { | |
setFocused(false); | |
} | |
var registerEffect; | |
if (true) { | |
var registeredInput = React52.useRef(false); | |
registerEffect = function registerEffect2() { | |
if (registeredInput.current) { | |
console.error(["Material-UI: There are multiple InputBase components inside a FormControl.", "This is not supported. It might cause infinite rendering loops.", "Only use one InputBase."].join("\n")); | |
} | |
registeredInput.current = true; | |
return function() { | |
registeredInput.current = false; | |
}; | |
}; | |
} | |
var onFilled = React52.useCallback(function() { | |
setFilled(true); | |
}, []); | |
var onEmpty = React52.useCallback(function() { | |
setFilled(false); | |
}, []); | |
var childContext = { | |
adornedStart, | |
setAdornedStart, | |
color, | |
disabled, | |
error, | |
filled, | |
focused, | |
fullWidth, | |
hiddenLabel, | |
margin: (size === "small" ? "dense" : void 0) || margin, | |
onBlur: function onBlur() { | |
setFocused(false); | |
}, | |
onEmpty, | |
onFilled, | |
onFocus: function onFocus() { | |
setFocused(true); | |
}, | |
registerEffect, | |
required, | |
variant | |
}; | |
return React52.createElement(FormControlContext_default.Provider, { | |
value: childContext | |
}, React52.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className, margin !== "none" && classes["margin".concat(capitalize(margin))], fullWidth && classes.fullWidth), | |
ref | |
}, other), children)); | |
}); | |
true ? FormControl.propTypes = { | |
children: import_prop_types41.default.node, | |
classes: import_prop_types41.default.object, | |
className: import_prop_types41.default.string, | |
color: import_prop_types41.default.oneOf(["primary", "secondary"]), | |
component: import_prop_types41.default.elementType, | |
disabled: import_prop_types41.default.bool, | |
error: import_prop_types41.default.bool, | |
focused: import_prop_types41.default.bool, | |
fullWidth: import_prop_types41.default.bool, | |
hiddenLabel: import_prop_types41.default.bool, | |
margin: import_prop_types41.default.oneOf(["dense", "none", "normal"]), | |
required: import_prop_types41.default.bool, | |
size: import_prop_types41.default.oneOf(["medium", "small"]), | |
variant: import_prop_types41.default.oneOf(["filled", "outlined", "standard"]) | |
} : void 0; | |
var FormControl_default = withStyles_default(styles63, { | |
name: "MuiFormControl" | |
})(FormControl); | |
// node_modules/@material-ui/core/esm/FormControlLabel/FormControlLabel.js | |
var React53 = __toModule(require_react()); | |
var import_prop_types42 = __toModule(require_prop_types()); | |
var styles64 = function styles65(theme) { | |
return { | |
root: { | |
display: "inline-flex", | |
alignItems: "center", | |
cursor: "pointer", | |
verticalAlign: "middle", | |
WebkitTapHighlightColor: "transparent", | |
marginLeft: -11, | |
marginRight: 16, | |
"&$disabled": { | |
cursor: "default" | |
} | |
}, | |
labelPlacementStart: { | |
flexDirection: "row-reverse", | |
marginLeft: 16, | |
marginRight: -11 | |
}, | |
labelPlacementTop: { | |
flexDirection: "column-reverse", | |
marginLeft: 16 | |
}, | |
labelPlacementBottom: { | |
flexDirection: "column", | |
marginLeft: 16 | |
}, | |
disabled: {}, | |
label: { | |
"&$disabled": { | |
color: theme.palette.text.disabled | |
} | |
} | |
}; | |
}; | |
var FormControlLabel = React53.forwardRef(function FormControlLabel2(props, ref) { | |
var checked = props.checked, classes = props.classes, className = props.className, control = props.control, disabledProp = props.disabled, inputRef = props.inputRef, label = props.label, _props$labelPlacement = props.labelPlacement, labelPlacement = _props$labelPlacement === void 0 ? "end" : _props$labelPlacement, name = props.name, onChange = props.onChange, value = props.value, other = _objectWithoutProperties(props, ["checked", "classes", "className", "control", "disabled", "inputRef", "label", "labelPlacement", "name", "onChange", "value"]); | |
var muiFormControl = useFormControl2(); | |
var disabled = disabledProp; | |
if (typeof disabled === "undefined" && typeof control.props.disabled !== "undefined") { | |
disabled = control.props.disabled; | |
} | |
if (typeof disabled === "undefined" && muiFormControl) { | |
disabled = muiFormControl.disabled; | |
} | |
var controlProps = { | |
disabled | |
}; | |
["checked", "name", "onChange", "value", "inputRef"].forEach(function(key) { | |
if (typeof control.props[key] === "undefined" && typeof props[key] !== "undefined") { | |
controlProps[key] = props[key]; | |
} | |
}); | |
return React53.createElement("label", _extends({ | |
className: clsx_m_default(classes.root, className, labelPlacement !== "end" && classes["labelPlacement".concat(capitalize(labelPlacement))], disabled && classes.disabled), | |
ref | |
}, other), React53.cloneElement(control, controlProps), React53.createElement(Typography_default, { | |
component: "span", | |
className: clsx_m_default(classes.label, disabled && classes.disabled) | |
}, label)); | |
}); | |
true ? FormControlLabel.propTypes = { | |
checked: import_prop_types42.default.bool, | |
classes: import_prop_types42.default.object, | |
className: import_prop_types42.default.string, | |
control: import_prop_types42.default.element.isRequired, | |
disabled: import_prop_types42.default.bool, | |
inputRef: refType_default, | |
label: import_prop_types42.default.node, | |
labelPlacement: import_prop_types42.default.oneOf(["bottom", "end", "start", "top"]), | |
name: import_prop_types42.default.string, | |
onChange: import_prop_types42.default.func, | |
value: import_prop_types42.default.any | |
} : void 0; | |
var FormControlLabel_default = withStyles_default(styles64, { | |
name: "MuiFormControlLabel" | |
})(FormControlLabel); | |
// node_modules/@material-ui/core/esm/FormGroup/FormGroup.js | |
var React54 = __toModule(require_react()); | |
var import_prop_types43 = __toModule(require_prop_types()); | |
var styles66 = { | |
root: { | |
display: "flex", | |
flexDirection: "column", | |
flexWrap: "wrap" | |
}, | |
row: { | |
flexDirection: "row" | |
} | |
}; | |
var FormGroup = React54.forwardRef(function FormGroup2(props, ref) { | |
var classes = props.classes, className = props.className, _props$row = props.row, row = _props$row === void 0 ? false : _props$row, other = _objectWithoutProperties(props, ["classes", "className", "row"]); | |
return React54.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, row && classes.row), | |
ref | |
}, other)); | |
}); | |
true ? FormGroup.propTypes = { | |
children: import_prop_types43.default.node, | |
classes: import_prop_types43.default.object, | |
className: import_prop_types43.default.string, | |
row: import_prop_types43.default.bool | |
} : void 0; | |
var FormGroup_default = withStyles_default(styles66, { | |
name: "MuiFormGroup" | |
})(FormGroup); | |
// node_modules/@material-ui/core/esm/FormHelperText/FormHelperText.js | |
var React55 = __toModule(require_react()); | |
var import_prop_types44 = __toModule(require_prop_types()); | |
var styles67 = function styles68(theme) { | |
return { | |
root: _extends({ | |
color: theme.palette.text.secondary | |
}, theme.typography.caption, { | |
textAlign: "left", | |
marginTop: 3, | |
margin: 0, | |
"&$disabled": { | |
color: theme.palette.text.disabled | |
}, | |
"&$error": { | |
color: theme.palette.error.main | |
} | |
}), | |
error: {}, | |
disabled: {}, | |
marginDense: { | |
marginTop: 4 | |
}, | |
contained: { | |
marginLeft: 14, | |
marginRight: 14 | |
}, | |
focused: {}, | |
filled: {}, | |
required: {} | |
}; | |
}; | |
var FormHelperText = React55.forwardRef(function FormHelperText2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "p" : _props$component, disabled = props.disabled, error = props.error, filled = props.filled, focused = props.focused, margin = props.margin, required = props.required, variant = props.variant, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "disabled", "error", "filled", "focused", "margin", "required", "variant"]); | |
var muiFormControl = useFormControl2(); | |
var fcs = formControlState({ | |
props, | |
muiFormControl, | |
states: ["variant", "margin", "disabled", "error", "filled", "focused", "required"] | |
}); | |
return React55.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, (fcs.variant === "filled" || fcs.variant === "outlined") && classes.contained, className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required, fcs.margin === "dense" && classes.marginDense), | |
ref | |
}, other), children === " " ? React55.createElement("span", { | |
dangerouslySetInnerHTML: { | |
__html: "​" | |
} | |
}) : children); | |
}); | |
true ? FormHelperText.propTypes = { | |
children: import_prop_types44.default.node, | |
classes: import_prop_types44.default.object, | |
className: import_prop_types44.default.string, | |
component: import_prop_types44.default.elementType, | |
disabled: import_prop_types44.default.bool, | |
error: import_prop_types44.default.bool, | |
filled: import_prop_types44.default.bool, | |
focused: import_prop_types44.default.bool, | |
margin: import_prop_types44.default.oneOf(["dense"]), | |
required: import_prop_types44.default.bool, | |
variant: import_prop_types44.default.oneOf(["filled", "outlined", "standard"]) | |
} : void 0; | |
var FormHelperText_default = withStyles_default(styles67, { | |
name: "MuiFormHelperText" | |
})(FormHelperText); | |
// node_modules/@material-ui/core/esm/FormLabel/FormLabel.js | |
var React56 = __toModule(require_react()); | |
var import_prop_types45 = __toModule(require_prop_types()); | |
var styles69 = function styles70(theme) { | |
return { | |
root: _extends({ | |
color: theme.palette.text.secondary | |
}, theme.typography.body1, { | |
lineHeight: 1, | |
padding: 0, | |
"&$focused": { | |
color: theme.palette.primary.main | |
}, | |
"&$disabled": { | |
color: theme.palette.text.disabled | |
}, | |
"&$error": { | |
color: theme.palette.error.main | |
} | |
}), | |
colorSecondary: { | |
"&$focused": { | |
color: theme.palette.secondary.main | |
} | |
}, | |
focused: {}, | |
disabled: {}, | |
error: {}, | |
filled: {}, | |
required: {}, | |
asterisk: { | |
"&$error": { | |
color: theme.palette.error.main | |
} | |
} | |
}; | |
}; | |
var FormLabel = React56.forwardRef(function FormLabel2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, color = props.color, _props$component = props.component, Component3 = _props$component === void 0 ? "label" : _props$component, disabled = props.disabled, error = props.error, filled = props.filled, focused = props.focused, required = props.required, other = _objectWithoutProperties(props, ["children", "classes", "className", "color", "component", "disabled", "error", "filled", "focused", "required"]); | |
var muiFormControl = useFormControl2(); | |
var fcs = formControlState({ | |
props, | |
muiFormControl, | |
states: ["color", "required", "focused", "disabled", "error", "filled"] | |
}); | |
return React56.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, classes["color".concat(capitalize(fcs.color || "primary"))], className, fcs.disabled && classes.disabled, fcs.error && classes.error, fcs.filled && classes.filled, fcs.focused && classes.focused, fcs.required && classes.required), | |
ref | |
}, other), children, fcs.required && React56.createElement("span", { | |
"aria-hidden": true, | |
className: clsx_m_default(classes.asterisk, fcs.error && classes.error) | |
}, "\u2009", "*")); | |
}); | |
true ? FormLabel.propTypes = { | |
children: import_prop_types45.default.node, | |
classes: import_prop_types45.default.object, | |
className: import_prop_types45.default.string, | |
color: import_prop_types45.default.oneOf(["primary", "secondary"]), | |
component: import_prop_types45.default.elementType, | |
disabled: import_prop_types45.default.bool, | |
error: import_prop_types45.default.bool, | |
filled: import_prop_types45.default.bool, | |
focused: import_prop_types45.default.bool, | |
required: import_prop_types45.default.bool | |
} : void 0; | |
var FormLabel_default = withStyles_default(styles69, { | |
name: "MuiFormLabel" | |
})(FormLabel); | |
// node_modules/@material-ui/core/esm/GridList/GridList.js | |
var React57 = __toModule(require_react()); | |
var import_react_is6 = __toModule(require_react_is()); | |
var import_prop_types46 = __toModule(require_prop_types()); | |
var styles71 = { | |
root: { | |
display: "flex", | |
flexWrap: "wrap", | |
overflowY: "auto", | |
listStyle: "none", | |
padding: 0, | |
WebkitOverflowScrolling: "touch" | |
} | |
}; | |
var GridList = React57.forwardRef(function GridList2(props, ref) { | |
var _props$cellHeight = props.cellHeight, cellHeight = _props$cellHeight === void 0 ? 180 : _props$cellHeight, children = props.children, classes = props.classes, className = props.className, _props$cols = props.cols, cols = _props$cols === void 0 ? 2 : _props$cols, _props$component = props.component, Component3 = _props$component === void 0 ? "ul" : _props$component, _props$spacing = props.spacing, spacing2 = _props$spacing === void 0 ? 4 : _props$spacing, style = props.style, other = _objectWithoutProperties(props, ["cellHeight", "children", "classes", "className", "cols", "component", "spacing", "style"]); | |
return React57.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref, | |
style: _extends({ | |
margin: -spacing2 / 2 | |
}, style) | |
}, other), React57.Children.map(children, function(child) { | |
if (!React57.isValidElement(child)) { | |
return null; | |
} | |
if (true) { | |
if (import_react_is6.isFragment(child)) { | |
console.error(["Material-UI: The GridList component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n")); | |
} | |
} | |
var childCols = child.props.cols || 1; | |
var childRows = child.props.rows || 1; | |
return React57.cloneElement(child, { | |
style: _extends({ | |
width: "".concat(100 / cols * childCols, "%"), | |
height: cellHeight === "auto" ? "auto" : cellHeight * childRows + spacing2, | |
padding: spacing2 / 2 | |
}, child.props.style) | |
}); | |
})); | |
}); | |
true ? GridList.propTypes = { | |
cellHeight: import_prop_types46.default.oneOfType([import_prop_types46.default.number, import_prop_types46.default.oneOf(["auto"])]), | |
children: import_prop_types46.default.node.isRequired, | |
classes: import_prop_types46.default.object.isRequired, | |
className: import_prop_types46.default.string, | |
cols: import_prop_types46.default.number, | |
component: import_prop_types46.default.elementType, | |
spacing: import_prop_types46.default.number, | |
style: import_prop_types46.default.object | |
} : void 0; | |
var GridList_default = withStyles_default(styles71, { | |
name: "MuiGridList" | |
})(GridList); | |
// node_modules/@material-ui/core/esm/GridListTile/GridListTile.js | |
var React58 = __toModule(require_react()); | |
var import_prop_types47 = __toModule(require_prop_types()); | |
var styles72 = { | |
root: { | |
boxSizing: "border-box", | |
flexShrink: 0 | |
}, | |
tile: { | |
position: "relative", | |
display: "block", | |
height: "100%", | |
overflow: "hidden" | |
}, | |
imgFullHeight: { | |
height: "100%", | |
transform: "translateX(-50%)", | |
position: "relative", | |
left: "50%" | |
}, | |
imgFullWidth: { | |
width: "100%", | |
position: "relative", | |
transform: "translateY(-50%)", | |
top: "50%" | |
} | |
}; | |
var fit = function fit2(imgEl, classes) { | |
if (!imgEl || !imgEl.complete) { | |
return; | |
} | |
if (imgEl.width / imgEl.height > imgEl.parentElement.offsetWidth / imgEl.parentElement.offsetHeight) { | |
var _imgEl$classList, _imgEl$classList2; | |
(_imgEl$classList = imgEl.classList).remove.apply(_imgEl$classList, _toConsumableArray(classes.imgFullWidth.split(" "))); | |
(_imgEl$classList2 = imgEl.classList).add.apply(_imgEl$classList2, _toConsumableArray(classes.imgFullHeight.split(" "))); | |
} else { | |
var _imgEl$classList3, _imgEl$classList4; | |
(_imgEl$classList3 = imgEl.classList).remove.apply(_imgEl$classList3, _toConsumableArray(classes.imgFullHeight.split(" "))); | |
(_imgEl$classList4 = imgEl.classList).add.apply(_imgEl$classList4, _toConsumableArray(classes.imgFullWidth.split(" "))); | |
} | |
}; | |
function ensureImageCover(imgEl, classes) { | |
if (!imgEl) { | |
return; | |
} | |
if (imgEl.complete) { | |
fit(imgEl, classes); | |
} else { | |
imgEl.addEventListener("load", function() { | |
fit(imgEl, classes); | |
}); | |
} | |
} | |
var GridListTile = React58.forwardRef(function GridListTile2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$cols = props.cols, cols = _props$cols === void 0 ? 1 : _props$cols, _props$component = props.component, Component3 = _props$component === void 0 ? "li" : _props$component, _props$rows = props.rows, rows = _props$rows === void 0 ? 1 : _props$rows, other = _objectWithoutProperties(props, ["children", "classes", "className", "cols", "component", "rows"]); | |
var imgRef = React58.useRef(null); | |
React58.useEffect(function() { | |
ensureImageCover(imgRef.current, classes); | |
}); | |
React58.useEffect(function() { | |
var handleResize = debounce(function() { | |
fit(imgRef.current, classes); | |
}); | |
window.addEventListener("resize", handleResize); | |
return function() { | |
handleResize.clear(); | |
window.removeEventListener("resize", handleResize); | |
}; | |
}, [classes]); | |
return React58.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other), React58.createElement("div", { | |
className: classes.tile | |
}, React58.Children.map(children, function(child) { | |
if (!React58.isValidElement(child)) { | |
return null; | |
} | |
if (child.type === "img" || isMuiElement(child, ["Image"])) { | |
return React58.cloneElement(child, { | |
ref: imgRef | |
}); | |
} | |
return child; | |
}))); | |
}); | |
true ? GridListTile.propTypes = { | |
children: import_prop_types47.default.node, | |
classes: import_prop_types47.default.object.isRequired, | |
className: import_prop_types47.default.string, | |
cols: import_prop_types47.default.number, | |
component: import_prop_types47.default.elementType, | |
rows: import_prop_types47.default.number | |
} : void 0; | |
var GridListTile_default = withStyles_default(styles72, { | |
name: "MuiGridListTile" | |
})(GridListTile); | |
// node_modules/@material-ui/core/esm/GridListTileBar/GridListTileBar.js | |
var React59 = __toModule(require_react()); | |
var import_prop_types48 = __toModule(require_prop_types()); | |
var styles73 = function styles74(theme) { | |
return { | |
root: { | |
position: "absolute", | |
left: 0, | |
right: 0, | |
height: 48, | |
background: "rgba(0, 0, 0, 0.5)", | |
display: "flex", | |
alignItems: "center", | |
fontFamily: theme.typography.fontFamily | |
}, | |
titlePositionBottom: { | |
bottom: 0 | |
}, | |
titlePositionTop: { | |
top: 0 | |
}, | |
rootSubtitle: { | |
height: 68 | |
}, | |
titleWrap: { | |
flexGrow: 1, | |
marginLeft: 16, | |
marginRight: 16, | |
color: theme.palette.common.white, | |
overflow: "hidden" | |
}, | |
titleWrapActionPosLeft: { | |
marginLeft: 0 | |
}, | |
titleWrapActionPosRight: { | |
marginRight: 0 | |
}, | |
title: { | |
fontSize: theme.typography.pxToRem(16), | |
lineHeight: "24px", | |
textOverflow: "ellipsis", | |
overflow: "hidden", | |
whiteSpace: "nowrap" | |
}, | |
subtitle: { | |
fontSize: theme.typography.pxToRem(12), | |
lineHeight: 1, | |
textOverflow: "ellipsis", | |
overflow: "hidden", | |
whiteSpace: "nowrap" | |
}, | |
actionIcon: {}, | |
actionIconActionPosLeft: { | |
order: -1 | |
} | |
}; | |
}; | |
var GridListTileBar = React59.forwardRef(function GridListTileBar2(props, ref) { | |
var actionIcon = props.actionIcon, _props$actionPosition = props.actionPosition, actionPosition = _props$actionPosition === void 0 ? "right" : _props$actionPosition, classes = props.classes, className = props.className, subtitle = props.subtitle, title = props.title, _props$titlePosition = props.titlePosition, titlePosition = _props$titlePosition === void 0 ? "bottom" : _props$titlePosition, other = _objectWithoutProperties(props, ["actionIcon", "actionPosition", "classes", "className", "subtitle", "title", "titlePosition"]); | |
var actionPos = actionIcon && actionPosition; | |
return React59.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, titlePosition === "top" ? classes.titlePositionTop : classes.titlePositionBottom, subtitle && classes.rootSubtitle), | |
ref | |
}, other), React59.createElement("div", { | |
className: clsx_m_default(classes.titleWrap, { | |
left: classes.titleWrapActionPosLeft, | |
right: classes.titleWrapActionPosRight | |
}[actionPos]) | |
}, React59.createElement("div", { | |
className: classes.title | |
}, title), subtitle ? React59.createElement("div", { | |
className: classes.subtitle | |
}, subtitle) : null), actionIcon ? React59.createElement("div", { | |
className: clsx_m_default(classes.actionIcon, actionPos === "left" && classes.actionIconActionPosLeft) | |
}, actionIcon) : null); | |
}); | |
true ? GridListTileBar.propTypes = { | |
actionIcon: import_prop_types48.default.node, | |
actionPosition: import_prop_types48.default.oneOf(["left", "right"]), | |
classes: import_prop_types48.default.object, | |
className: import_prop_types48.default.string, | |
subtitle: import_prop_types48.default.node, | |
title: import_prop_types48.default.node, | |
titlePosition: import_prop_types48.default.oneOf(["bottom", "top"]) | |
} : void 0; | |
var GridListTileBar_default = withStyles_default(styles73, { | |
name: "MuiGridListTileBar" | |
})(GridListTileBar); | |
// node_modules/@material-ui/core/esm/Hidden/Hidden.js | |
var React62 = __toModule(require_react()); | |
var import_prop_types52 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Hidden/HiddenJs.js | |
var import_prop_types50 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/withWidth/withWidth.js | |
var React60 = __toModule(require_react()); | |
var import_prop_types49 = __toModule(require_prop_types()); | |
var import_hoist_non_react_statics = __toModule(require_hoist_non_react_statics_cjs()); | |
var isWidthUp = function isWidthUp2(breakpoint, width) { | |
var inclusive = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true; | |
if (inclusive) { | |
return keys.indexOf(breakpoint) <= keys.indexOf(width); | |
} | |
return keys.indexOf(breakpoint) < keys.indexOf(width); | |
}; | |
var isWidthDown = function isWidthDown2(breakpoint, width) { | |
var inclusive = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : true; | |
if (inclusive) { | |
return keys.indexOf(width) <= keys.indexOf(breakpoint); | |
} | |
return keys.indexOf(width) < keys.indexOf(breakpoint); | |
}; | |
var useEnhancedEffect3 = typeof window === "undefined" ? React60.useEffect : React60.useLayoutEffect; | |
var withWidth = function withWidth2() { | |
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; | |
return function(Component3) { | |
var _options$withTheme = options.withTheme, withThemeOption = _options$withTheme === void 0 ? false : _options$withTheme, _options$noSSR = options.noSSR, noSSR = _options$noSSR === void 0 ? false : _options$noSSR, initialWidthOption = options.initialWidth; | |
function WithWidth(props) { | |
var contextTheme = useTheme(); | |
var theme = props.theme || contextTheme; | |
var _getThemeProps = getThemeProps({ | |
theme, | |
name: "MuiWithWidth", | |
props: _extends({}, props) | |
}), initialWidth = _getThemeProps.initialWidth, width = _getThemeProps.width, other = _objectWithoutProperties(_getThemeProps, ["initialWidth", "width"]); | |
var _React$useState = React60.useState(false), mountedState = _React$useState[0], setMountedState = _React$useState[1]; | |
useEnhancedEffect3(function() { | |
setMountedState(true); | |
}, []); | |
var keys2 = theme.breakpoints.keys.slice().reverse(); | |
var widthComputed = keys2.reduce(function(output, key) { | |
var matches = useMediaQuery(theme.breakpoints.up(key)); | |
return !output && matches ? key : output; | |
}, null); | |
var more = _extends({ | |
width: width || (mountedState || noSSR ? widthComputed : void 0) || initialWidth || initialWidthOption | |
}, withThemeOption ? { | |
theme | |
} : {}, other); | |
if (more.width === void 0) { | |
return null; | |
} | |
return React60.createElement(Component3, more); | |
} | |
true ? WithWidth.propTypes = { | |
initialWidth: import_prop_types49.default.oneOf(["xs", "sm", "md", "lg", "xl"]), | |
theme: import_prop_types49.default.object, | |
width: import_prop_types49.default.oneOf(["xs", "sm", "md", "lg", "xl"]) | |
} : void 0; | |
if (true) { | |
WithWidth.displayName = "WithWidth(".concat(getDisplayName(Component3), ")"); | |
} | |
import_hoist_non_react_statics.default(WithWidth, Component3); | |
return WithWidth; | |
}; | |
}; | |
var withWidth_default = withWidth; | |
// node_modules/@material-ui/core/esm/Hidden/HiddenJs.js | |
function HiddenJs(props) { | |
var children = props.children, only = props.only, width = props.width; | |
var theme = useTheme(); | |
var visible = true; | |
if (only) { | |
if (Array.isArray(only)) { | |
for (var i = 0; i < only.length; i += 1) { | |
var breakpoint = only[i]; | |
if (width === breakpoint) { | |
visible = false; | |
break; | |
} | |
} | |
} else if (only && width === only) { | |
visible = false; | |
} | |
} | |
if (visible) { | |
for (var _i = 0; _i < theme.breakpoints.keys.length; _i += 1) { | |
var _breakpoint = theme.breakpoints.keys[_i]; | |
var breakpointUp = props["".concat(_breakpoint, "Up")]; | |
var breakpointDown = props["".concat(_breakpoint, "Down")]; | |
if (breakpointUp && isWidthUp(_breakpoint, width) || breakpointDown && isWidthDown(_breakpoint, width)) { | |
visible = false; | |
break; | |
} | |
} | |
} | |
if (!visible) { | |
return null; | |
} | |
return children; | |
} | |
HiddenJs.propTypes = { | |
children: import_prop_types50.default.node, | |
className: import_prop_types50.default.string, | |
implementation: import_prop_types50.default.oneOf(["js", "css"]), | |
initialWidth: import_prop_types50.default.oneOf(["xs", "sm", "md", "lg", "xl"]), | |
lgDown: import_prop_types50.default.bool, | |
lgUp: import_prop_types50.default.bool, | |
mdDown: import_prop_types50.default.bool, | |
mdUp: import_prop_types50.default.bool, | |
only: import_prop_types50.default.oneOfType([import_prop_types50.default.oneOf(["xs", "sm", "md", "lg", "xl"]), import_prop_types50.default.arrayOf(import_prop_types50.default.oneOf(["xs", "sm", "md", "lg", "xl"]))]), | |
smDown: import_prop_types50.default.bool, | |
smUp: import_prop_types50.default.bool, | |
width: import_prop_types50.default.string.isRequired, | |
xlDown: import_prop_types50.default.bool, | |
xlUp: import_prop_types50.default.bool, | |
xsDown: import_prop_types50.default.bool, | |
xsUp: import_prop_types50.default.bool | |
}; | |
if (true) { | |
HiddenJs.propTypes = exactProp(HiddenJs.propTypes); | |
} | |
var HiddenJs_default = withWidth_default()(HiddenJs); | |
// node_modules/@material-ui/core/esm/Hidden/HiddenCss.js | |
var React61 = __toModule(require_react()); | |
var import_prop_types51 = __toModule(require_prop_types()); | |
var styles75 = function styles76(theme) { | |
var hidden = { | |
display: "none" | |
}; | |
return theme.breakpoints.keys.reduce(function(acc, key) { | |
acc["only".concat(capitalize(key))] = _defineProperty({}, theme.breakpoints.only(key), hidden); | |
acc["".concat(key, "Up")] = _defineProperty({}, theme.breakpoints.up(key), hidden); | |
acc["".concat(key, "Down")] = _defineProperty({}, theme.breakpoints.down(key), hidden); | |
return acc; | |
}, {}); | |
}; | |
function HiddenCss(props) { | |
var children = props.children, classes = props.classes, className = props.className, only = props.only, other = _objectWithoutProperties(props, ["children", "classes", "className", "only"]); | |
var theme = useTheme(); | |
if (true) { | |
var unknownProps = Object.keys(other).filter(function(propName) { | |
var isUndeclaredBreakpoint = !theme.breakpoints.keys.some(function(breakpoint2) { | |
return "".concat(breakpoint2, "Up") === propName || "".concat(breakpoint2, "Down") === propName; | |
}); | |
return isUndeclaredBreakpoint; | |
}); | |
if (unknownProps.length > 0) { | |
console.error('Material-UI: Unsupported props received by `<Hidden implementation="css" />`: '.concat(unknownProps.join(", "), ". Did you forget to wrap this component in a ThemeProvider declaring these breakpoints?")); | |
} | |
} | |
var clsx = []; | |
if (className) { | |
clsx.push(className); | |
} | |
for (var i = 0; i < theme.breakpoints.keys.length; i += 1) { | |
var breakpoint = theme.breakpoints.keys[i]; | |
var breakpointUp = props["".concat(breakpoint, "Up")]; | |
var breakpointDown = props["".concat(breakpoint, "Down")]; | |
if (breakpointUp) { | |
clsx.push(classes["".concat(breakpoint, "Up")]); | |
} | |
if (breakpointDown) { | |
clsx.push(classes["".concat(breakpoint, "Down")]); | |
} | |
} | |
if (only) { | |
var onlyBreakpoints = Array.isArray(only) ? only : [only]; | |
onlyBreakpoints.forEach(function(breakpoint2) { | |
clsx.push(classes["only".concat(capitalize(breakpoint2))]); | |
}); | |
} | |
return React61.createElement("div", { | |
className: clsx.join(" ") | |
}, children); | |
} | |
true ? HiddenCss.propTypes = { | |
children: import_prop_types51.default.node, | |
classes: import_prop_types51.default.object.isRequired, | |
className: import_prop_types51.default.string, | |
implementation: import_prop_types51.default.oneOf(["js", "css"]), | |
lgDown: import_prop_types51.default.bool, | |
lgUp: import_prop_types51.default.bool, | |
mdDown: import_prop_types51.default.bool, | |
mdUp: import_prop_types51.default.bool, | |
only: import_prop_types51.default.oneOfType([import_prop_types51.default.oneOf(["xs", "sm", "md", "lg", "xl"]), import_prop_types51.default.arrayOf(import_prop_types51.default.oneOf(["xs", "sm", "md", "lg", "xl"]))]), | |
smDown: import_prop_types51.default.bool, | |
smUp: import_prop_types51.default.bool, | |
xlDown: import_prop_types51.default.bool, | |
xlUp: import_prop_types51.default.bool, | |
xsDown: import_prop_types51.default.bool, | |
xsUp: import_prop_types51.default.bool | |
} : void 0; | |
var HiddenCss_default = withStyles_default(styles75, { | |
name: "PrivateHiddenCss" | |
})(HiddenCss); | |
// node_modules/@material-ui/core/esm/Hidden/Hidden.js | |
function Hidden(props) { | |
var _props$implementation = props.implementation, implementation = _props$implementation === void 0 ? "js" : _props$implementation, _props$lgDown = props.lgDown, lgDown = _props$lgDown === void 0 ? false : _props$lgDown, _props$lgUp = props.lgUp, lgUp = _props$lgUp === void 0 ? false : _props$lgUp, _props$mdDown = props.mdDown, mdDown = _props$mdDown === void 0 ? false : _props$mdDown, _props$mdUp = props.mdUp, mdUp = _props$mdUp === void 0 ? false : _props$mdUp, _props$smDown = props.smDown, smDown = _props$smDown === void 0 ? false : _props$smDown, _props$smUp = props.smUp, smUp = _props$smUp === void 0 ? false : _props$smUp, _props$xlDown = props.xlDown, xlDown = _props$xlDown === void 0 ? false : _props$xlDown, _props$xlUp = props.xlUp, xlUp = _props$xlUp === void 0 ? false : _props$xlUp, _props$xsDown = props.xsDown, xsDown = _props$xsDown === void 0 ? false : _props$xsDown, _props$xsUp = props.xsUp, xsUp = _props$xsUp === void 0 ? false : _props$xsUp, other = _objectWithoutProperties(props, ["implementation", "lgDown", "lgUp", "mdDown", "mdUp", "smDown", "smUp", "xlDown", "xlUp", "xsDown", "xsUp"]); | |
if (implementation === "js") { | |
return React62.createElement(HiddenJs_default, _extends({ | |
lgDown, | |
lgUp, | |
mdDown, | |
mdUp, | |
smDown, | |
smUp, | |
xlDown, | |
xlUp, | |
xsDown, | |
xsUp | |
}, other)); | |
} | |
return React62.createElement(HiddenCss_default, _extends({ | |
lgDown, | |
lgUp, | |
mdDown, | |
mdUp, | |
smDown, | |
smUp, | |
xlDown, | |
xlUp, | |
xsDown, | |
xsUp | |
}, other)); | |
} | |
true ? Hidden.propTypes = { | |
children: import_prop_types52.default.node, | |
className: import_prop_types52.default.string, | |
implementation: import_prop_types52.default.oneOf(["js", "css"]), | |
initialWidth: import_prop_types52.default.oneOf(["xs", "sm", "md", "lg", "xl"]), | |
lgDown: import_prop_types52.default.bool, | |
lgUp: import_prop_types52.default.bool, | |
mdDown: import_prop_types52.default.bool, | |
mdUp: import_prop_types52.default.bool, | |
only: import_prop_types52.default.oneOfType([import_prop_types52.default.oneOf(["xs", "sm", "md", "lg", "xl"]), import_prop_types52.default.arrayOf(import_prop_types52.default.oneOf(["xs", "sm", "md", "lg", "xl"]))]), | |
smDown: import_prop_types52.default.bool, | |
smUp: import_prop_types52.default.bool, | |
xlDown: import_prop_types52.default.bool, | |
xlUp: import_prop_types52.default.bool, | |
xsDown: import_prop_types52.default.bool, | |
xsUp: import_prop_types52.default.bool | |
} : void 0; | |
var Hidden_default = Hidden; | |
// node_modules/@material-ui/core/esm/Icon/Icon.js | |
var React63 = __toModule(require_react()); | |
var import_prop_types53 = __toModule(require_prop_types()); | |
var styles77 = function styles78(theme) { | |
return { | |
root: { | |
userSelect: "none", | |
fontSize: theme.typography.pxToRem(24), | |
width: "1em", | |
height: "1em", | |
overflow: "hidden", | |
flexShrink: 0 | |
}, | |
colorPrimary: { | |
color: theme.palette.primary.main | |
}, | |
colorSecondary: { | |
color: theme.palette.secondary.main | |
}, | |
colorAction: { | |
color: theme.palette.action.active | |
}, | |
colorError: { | |
color: theme.palette.error.main | |
}, | |
colorDisabled: { | |
color: theme.palette.action.disabled | |
}, | |
fontSizeInherit: { | |
fontSize: "inherit" | |
}, | |
fontSizeSmall: { | |
fontSize: theme.typography.pxToRem(20) | |
}, | |
fontSizeLarge: { | |
fontSize: theme.typography.pxToRem(36) | |
} | |
}; | |
}; | |
var Icon = React63.forwardRef(function Icon2(props, ref) { | |
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "inherit" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "span" : _props$component, _props$fontSize = props.fontSize, fontSize = _props$fontSize === void 0 ? "default" : _props$fontSize, other = _objectWithoutProperties(props, ["classes", "className", "color", "component", "fontSize"]); | |
return React63.createElement(Component3, _extends({ | |
className: clsx_m_default("material-icons", classes.root, className, color !== "inherit" && classes["color".concat(capitalize(color))], fontSize !== "default" && classes["fontSize".concat(capitalize(fontSize))]), | |
"aria-hidden": true, | |
ref | |
}, other)); | |
}); | |
true ? Icon.propTypes = { | |
children: import_prop_types53.default.node, | |
classes: import_prop_types53.default.object.isRequired, | |
className: import_prop_types53.default.string, | |
color: import_prop_types53.default.oneOf(["inherit", "primary", "secondary", "action", "error", "disabled"]), | |
component: import_prop_types53.default.elementType, | |
fontSize: import_prop_types53.default.oneOf(["inherit", "default", "small", "large"]) | |
} : void 0; | |
Icon.muiName = "Icon"; | |
var Icon_default = withStyles_default(styles77, { | |
name: "MuiIcon" | |
})(Icon); | |
// node_modules/@material-ui/core/esm/Input/Input.js | |
var React64 = __toModule(require_react()); | |
var import_prop_types54 = __toModule(require_prop_types()); | |
var styles79 = function styles80(theme) { | |
var light = theme.palette.type === "light"; | |
var bottomLineColor = light ? "rgba(0, 0, 0, 0.42)" : "rgba(255, 255, 255, 0.7)"; | |
return { | |
root: { | |
position: "relative" | |
}, | |
formControl: { | |
"label + &": { | |
marginTop: 16 | |
} | |
}, | |
focused: {}, | |
disabled: {}, | |
colorSecondary: { | |
"&$underline:after": { | |
borderBottomColor: theme.palette.secondary.main | |
} | |
}, | |
underline: { | |
"&:after": { | |
borderBottom: "2px solid ".concat(theme.palette.primary.main), | |
left: 0, | |
bottom: 0, | |
content: '""', | |
position: "absolute", | |
right: 0, | |
transform: "scaleX(0)", | |
transition: theme.transitions.create("transform", { | |
duration: theme.transitions.duration.shorter, | |
easing: theme.transitions.easing.easeOut | |
}), | |
pointerEvents: "none" | |
}, | |
"&$focused:after": { | |
transform: "scaleX(1)" | |
}, | |
"&$error:after": { | |
borderBottomColor: theme.palette.error.main, | |
transform: "scaleX(1)" | |
}, | |
"&:before": { | |
borderBottom: "1px solid ".concat(bottomLineColor), | |
left: 0, | |
bottom: 0, | |
content: '"\\00a0"', | |
position: "absolute", | |
right: 0, | |
transition: theme.transitions.create("border-bottom-color", { | |
duration: theme.transitions.duration.shorter | |
}), | |
pointerEvents: "none" | |
}, | |
"&:hover:not($disabled):before": { | |
borderBottom: "2px solid ".concat(theme.palette.text.primary), | |
"@media (hover: none)": { | |
borderBottom: "1px solid ".concat(bottomLineColor) | |
} | |
}, | |
"&$disabled:before": { | |
borderBottomStyle: "dotted" | |
} | |
}, | |
error: {}, | |
marginDense: {}, | |
multiline: {}, | |
fullWidth: {}, | |
input: {}, | |
inputMarginDense: {}, | |
inputMultiline: {}, | |
inputTypeSearch: {} | |
}; | |
}; | |
var Input = React64.forwardRef(function Input2(props, ref) { | |
var disableUnderline = props.disableUnderline, classes = props.classes, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, _props$inputComponent = props.inputComponent, inputComponent = _props$inputComponent === void 0 ? "input" : _props$inputComponent, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, _props$type = props.type, type = _props$type === void 0 ? "text" : _props$type, other = _objectWithoutProperties(props, ["disableUnderline", "classes", "fullWidth", "inputComponent", "multiline", "type"]); | |
return React64.createElement(InputBase_default, _extends({ | |
classes: _extends({}, classes, { | |
root: clsx_m_default(classes.root, !disableUnderline && classes.underline), | |
underline: null | |
}), | |
fullWidth, | |
inputComponent, | |
multiline, | |
ref, | |
type | |
}, other)); | |
}); | |
true ? Input.propTypes = { | |
autoComplete: import_prop_types54.default.string, | |
autoFocus: import_prop_types54.default.bool, | |
classes: import_prop_types54.default.object, | |
color: import_prop_types54.default.oneOf(["primary", "secondary"]), | |
defaultValue: import_prop_types54.default.any, | |
disabled: import_prop_types54.default.bool, | |
disableUnderline: import_prop_types54.default.bool, | |
endAdornment: import_prop_types54.default.node, | |
error: import_prop_types54.default.bool, | |
fullWidth: import_prop_types54.default.bool, | |
id: import_prop_types54.default.string, | |
inputComponent: import_prop_types54.default.elementType, | |
inputProps: import_prop_types54.default.object, | |
inputRef: refType_default, | |
margin: import_prop_types54.default.oneOf(["dense", "none"]), | |
multiline: import_prop_types54.default.bool, | |
name: import_prop_types54.default.string, | |
onChange: import_prop_types54.default.func, | |
placeholder: import_prop_types54.default.string, | |
readOnly: import_prop_types54.default.bool, | |
required: import_prop_types54.default.bool, | |
rows: import_prop_types54.default.oneOfType([import_prop_types54.default.number, import_prop_types54.default.string]), | |
rowsMax: import_prop_types54.default.oneOfType([import_prop_types54.default.number, import_prop_types54.default.string]), | |
startAdornment: import_prop_types54.default.node, | |
type: import_prop_types54.default.string, | |
value: import_prop_types54.default.any | |
} : void 0; | |
Input.muiName = "Input"; | |
var Input_default = withStyles_default(styles79, { | |
name: "MuiInput" | |
})(Input); | |
// node_modules/@material-ui/core/esm/InputLabel/InputLabel.js | |
var React65 = __toModule(require_react()); | |
var import_prop_types55 = __toModule(require_prop_types()); | |
var styles81 = function styles82(theme) { | |
return { | |
root: { | |
display: "block", | |
transformOrigin: "top left" | |
}, | |
focused: {}, | |
disabled: {}, | |
error: {}, | |
required: {}, | |
asterisk: {}, | |
formControl: { | |
position: "absolute", | |
left: 0, | |
top: 0, | |
transform: "translate(0, 24px) scale(1)" | |
}, | |
marginDense: { | |
transform: "translate(0, 21px) scale(1)" | |
}, | |
shrink: { | |
transform: "translate(0, 1.5px) scale(0.75)", | |
transformOrigin: "top left" | |
}, | |
animated: { | |
transition: theme.transitions.create(["color", "transform"], { | |
duration: theme.transitions.duration.shorter, | |
easing: theme.transitions.easing.easeOut | |
}) | |
}, | |
filled: { | |
zIndex: 1, | |
pointerEvents: "none", | |
transform: "translate(12px, 20px) scale(1)", | |
"&$marginDense": { | |
transform: "translate(12px, 17px) scale(1)" | |
}, | |
"&$shrink": { | |
transform: "translate(12px, 10px) scale(0.75)", | |
"&$marginDense": { | |
transform: "translate(12px, 7px) scale(0.75)" | |
} | |
} | |
}, | |
outlined: { | |
zIndex: 1, | |
pointerEvents: "none", | |
transform: "translate(14px, 20px) scale(1)", | |
"&$marginDense": { | |
transform: "translate(14px, 12px) scale(1)" | |
}, | |
"&$shrink": { | |
transform: "translate(14px, -6px) scale(0.75)" | |
} | |
} | |
}; | |
}; | |
var InputLabel = React65.forwardRef(function InputLabel2(props, ref) { | |
var classes = props.classes, className = props.className, _props$disableAnimati = props.disableAnimation, disableAnimation = _props$disableAnimati === void 0 ? false : _props$disableAnimati, margin = props.margin, shrinkProp = props.shrink, variant = props.variant, other = _objectWithoutProperties(props, ["classes", "className", "disableAnimation", "margin", "shrink", "variant"]); | |
var muiFormControl = useFormControl2(); | |
var shrink = shrinkProp; | |
if (typeof shrink === "undefined" && muiFormControl) { | |
shrink = muiFormControl.filled || muiFormControl.focused || muiFormControl.adornedStart; | |
} | |
var fcs = formControlState({ | |
props, | |
muiFormControl, | |
states: ["margin", "variant"] | |
}); | |
return React65.createElement(FormLabel_default, _extends({ | |
"data-shrink": shrink, | |
className: clsx_m_default(classes.root, className, muiFormControl && classes.formControl, !disableAnimation && classes.animated, shrink && classes.shrink, fcs.margin === "dense" && classes.marginDense, { | |
filled: classes.filled, | |
outlined: classes.outlined | |
}[fcs.variant]), | |
classes: { | |
focused: classes.focused, | |
disabled: classes.disabled, | |
error: classes.error, | |
required: classes.required, | |
asterisk: classes.asterisk | |
}, | |
ref | |
}, other)); | |
}); | |
true ? InputLabel.propTypes = { | |
children: import_prop_types55.default.node, | |
classes: import_prop_types55.default.object, | |
className: import_prop_types55.default.string, | |
color: import_prop_types55.default.oneOf(["primary", "secondary"]), | |
disableAnimation: import_prop_types55.default.bool, | |
disabled: import_prop_types55.default.bool, | |
error: import_prop_types55.default.bool, | |
focused: import_prop_types55.default.bool, | |
margin: import_prop_types55.default.oneOf(["dense"]), | |
required: import_prop_types55.default.bool, | |
shrink: import_prop_types55.default.bool, | |
variant: import_prop_types55.default.oneOf(["filled", "outlined", "standard"]) | |
} : void 0; | |
var InputLabel_default = withStyles_default(styles81, { | |
name: "MuiInputLabel" | |
})(InputLabel); | |
// node_modules/@material-ui/core/esm/LinearProgress/LinearProgress.js | |
var React66 = __toModule(require_react()); | |
var import_prop_types56 = __toModule(require_prop_types()); | |
var TRANSITION_DURATION = 4; | |
var styles83 = function styles84(theme) { | |
var getColor = function getColor2(color) { | |
return theme.palette.type === "light" ? lighten(color, 0.62) : darken(color, 0.5); | |
}; | |
var backgroundPrimary = getColor(theme.palette.primary.main); | |
var backgroundSecondary = getColor(theme.palette.secondary.main); | |
return { | |
root: { | |
position: "relative", | |
overflow: "hidden", | |
height: 4, | |
"@media print": { | |
colorAdjust: "exact" | |
} | |
}, | |
colorPrimary: { | |
backgroundColor: backgroundPrimary | |
}, | |
colorSecondary: { | |
backgroundColor: backgroundSecondary | |
}, | |
determinate: {}, | |
indeterminate: {}, | |
buffer: { | |
backgroundColor: "transparent" | |
}, | |
query: { | |
transform: "rotate(180deg)" | |
}, | |
dashed: { | |
position: "absolute", | |
marginTop: 0, | |
height: "100%", | |
width: "100%", | |
animation: "$buffer 3s infinite linear" | |
}, | |
dashedColorPrimary: { | |
backgroundImage: "radial-gradient(".concat(backgroundPrimary, " 0%, ").concat(backgroundPrimary, " 16%, transparent 42%)"), | |
backgroundSize: "10px 10px", | |
backgroundPosition: "0 -23px" | |
}, | |
dashedColorSecondary: { | |
backgroundImage: "radial-gradient(".concat(backgroundSecondary, " 0%, ").concat(backgroundSecondary, " 16%, transparent 42%)"), | |
backgroundSize: "10px 10px", | |
backgroundPosition: "0 -23px" | |
}, | |
bar: { | |
width: "100%", | |
position: "absolute", | |
left: 0, | |
bottom: 0, | |
top: 0, | |
transition: "transform 0.2s linear", | |
transformOrigin: "left" | |
}, | |
barColorPrimary: { | |
backgroundColor: theme.palette.primary.main | |
}, | |
barColorSecondary: { | |
backgroundColor: theme.palette.secondary.main | |
}, | |
bar1Indeterminate: { | |
width: "auto", | |
animation: "$indeterminate1 2.1s cubic-bezier(0.65, 0.815, 0.735, 0.395) infinite" | |
}, | |
bar1Determinate: { | |
transition: "transform .".concat(TRANSITION_DURATION, "s linear") | |
}, | |
bar1Buffer: { | |
zIndex: 1, | |
transition: "transform .".concat(TRANSITION_DURATION, "s linear") | |
}, | |
bar2Indeterminate: { | |
width: "auto", | |
animation: "$indeterminate2 2.1s cubic-bezier(0.165, 0.84, 0.44, 1) 1.15s infinite" | |
}, | |
bar2Buffer: { | |
transition: "transform .".concat(TRANSITION_DURATION, "s linear") | |
}, | |
"@keyframes indeterminate1": { | |
"0%": { | |
left: "-35%", | |
right: "100%" | |
}, | |
"60%": { | |
left: "100%", | |
right: "-90%" | |
}, | |
"100%": { | |
left: "100%", | |
right: "-90%" | |
} | |
}, | |
"@keyframes indeterminate2": { | |
"0%": { | |
left: "-200%", | |
right: "100%" | |
}, | |
"60%": { | |
left: "107%", | |
right: "-8%" | |
}, | |
"100%": { | |
left: "107%", | |
right: "-8%" | |
} | |
}, | |
"@keyframes buffer": { | |
"0%": { | |
opacity: 1, | |
backgroundPosition: "0 -23px" | |
}, | |
"50%": { | |
opacity: 0, | |
backgroundPosition: "0 -23px" | |
}, | |
"100%": { | |
opacity: 1, | |
backgroundPosition: "-200px -23px" | |
} | |
} | |
}; | |
}; | |
var LinearProgress = React66.forwardRef(function LinearProgress2(props, ref) { | |
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, value = props.value, valueBuffer = props.valueBuffer, _props$variant = props.variant, variant = _props$variant === void 0 ? "indeterminate" : _props$variant, other = _objectWithoutProperties(props, ["classes", "className", "color", "value", "valueBuffer", "variant"]); | |
var theme = useTheme(); | |
var rootProps = {}; | |
var inlineStyles = { | |
bar1: {}, | |
bar2: {} | |
}; | |
if (variant === "determinate" || variant === "buffer") { | |
if (value !== void 0) { | |
rootProps["aria-valuenow"] = Math.round(value); | |
rootProps["aria-valuemin"] = 0; | |
rootProps["aria-valuemax"] = 100; | |
var transform = value - 100; | |
if (theme.direction === "rtl") { | |
transform = -transform; | |
} | |
inlineStyles.bar1.transform = "translateX(".concat(transform, "%)"); | |
} else if (true) { | |
console.error("Material-UI: You need to provide a value prop when using the determinate or buffer variant of LinearProgress ."); | |
} | |
} | |
if (variant === "buffer") { | |
if (valueBuffer !== void 0) { | |
var _transform = (valueBuffer || 0) - 100; | |
if (theme.direction === "rtl") { | |
_transform = -_transform; | |
} | |
inlineStyles.bar2.transform = "translateX(".concat(_transform, "%)"); | |
} else if (true) { | |
console.error("Material-UI: You need to provide a valueBuffer prop when using the buffer variant of LinearProgress."); | |
} | |
} | |
return React66.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, classes["color".concat(capitalize(color))], className, { | |
determinate: classes.determinate, | |
indeterminate: classes.indeterminate, | |
buffer: classes.buffer, | |
query: classes.query | |
}[variant]), | |
role: "progressbar" | |
}, rootProps, { | |
ref | |
}, other), variant === "buffer" ? React66.createElement("div", { | |
className: clsx_m_default(classes.dashed, classes["dashedColor".concat(capitalize(color))]) | |
}) : null, React66.createElement("div", { | |
className: clsx_m_default(classes.bar, classes["barColor".concat(capitalize(color))], (variant === "indeterminate" || variant === "query") && classes.bar1Indeterminate, { | |
determinate: classes.bar1Determinate, | |
buffer: classes.bar1Buffer | |
}[variant]), | |
style: inlineStyles.bar1 | |
}), variant === "determinate" ? null : React66.createElement("div", { | |
className: clsx_m_default(classes.bar, (variant === "indeterminate" || variant === "query") && classes.bar2Indeterminate, variant === "buffer" ? [classes["color".concat(capitalize(color))], classes.bar2Buffer] : classes["barColor".concat(capitalize(color))]), | |
style: inlineStyles.bar2 | |
})); | |
}); | |
true ? LinearProgress.propTypes = { | |
classes: import_prop_types56.default.object, | |
className: import_prop_types56.default.string, | |
color: import_prop_types56.default.oneOf(["primary", "secondary"]), | |
value: import_prop_types56.default.number, | |
valueBuffer: import_prop_types56.default.number, | |
variant: import_prop_types56.default.oneOf(["buffer", "determinate", "indeterminate", "query"]) | |
} : void 0; | |
var LinearProgress_default = withStyles_default(styles83, { | |
name: "MuiLinearProgress" | |
})(LinearProgress); | |
// node_modules/@material-ui/core/esm/Link/Link.js | |
var React67 = __toModule(require_react()); | |
var import_prop_types57 = __toModule(require_prop_types()); | |
var styles85 = { | |
root: {}, | |
underlineNone: { | |
textDecoration: "none" | |
}, | |
underlineHover: { | |
textDecoration: "none", | |
"&:hover": { | |
textDecoration: "underline" | |
} | |
}, | |
underlineAlways: { | |
textDecoration: "underline" | |
}, | |
button: { | |
position: "relative", | |
WebkitTapHighlightColor: "transparent", | |
backgroundColor: "transparent", | |
outline: 0, | |
border: 0, | |
margin: 0, | |
borderRadius: 0, | |
padding: 0, | |
cursor: "pointer", | |
userSelect: "none", | |
verticalAlign: "middle", | |
"-moz-appearance": "none", | |
"-webkit-appearance": "none", | |
"&::-moz-focus-inner": { | |
borderStyle: "none" | |
}, | |
"&$focusVisible": { | |
outline: "auto" | |
} | |
}, | |
focusVisible: {} | |
}; | |
var Link = React67.forwardRef(function Link2(props, ref) { | |
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$component = props.component, component = _props$component === void 0 ? "a" : _props$component, onBlur = props.onBlur, onFocus = props.onFocus, TypographyClasses = props.TypographyClasses, _props$underline = props.underline, underline = _props$underline === void 0 ? "hover" : _props$underline, _props$variant = props.variant, variant = _props$variant === void 0 ? "inherit" : _props$variant, other = _objectWithoutProperties(props, ["classes", "className", "color", "component", "onBlur", "onFocus", "TypographyClasses", "underline", "variant"]); | |
var _useIsFocusVisible = useIsFocusVisible(), isFocusVisible = _useIsFocusVisible.isFocusVisible, onBlurVisible = _useIsFocusVisible.onBlurVisible, focusVisibleRef = _useIsFocusVisible.ref; | |
var _React$useState = React67.useState(false), focusVisible = _React$useState[0], setFocusVisible = _React$useState[1]; | |
var handlerRef = useForkRef(ref, focusVisibleRef); | |
var handleBlur = function handleBlur2(event) { | |
if (focusVisible) { | |
onBlurVisible(); | |
setFocusVisible(false); | |
} | |
if (onBlur) { | |
onBlur(event); | |
} | |
}; | |
var handleFocus = function handleFocus2(event) { | |
if (isFocusVisible(event)) { | |
setFocusVisible(true); | |
} | |
if (onFocus) { | |
onFocus(event); | |
} | |
}; | |
return React67.createElement(Typography_default, _extends({ | |
className: clsx_m_default(classes.root, classes["underline".concat(capitalize(underline))], className, focusVisible && classes.focusVisible, component === "button" && classes.button), | |
classes: TypographyClasses, | |
color, | |
component, | |
onBlur: handleBlur, | |
onFocus: handleFocus, | |
ref: handlerRef, | |
variant | |
}, other)); | |
}); | |
true ? Link.propTypes = { | |
children: import_prop_types57.default.node.isRequired, | |
classes: import_prop_types57.default.object.isRequired, | |
className: import_prop_types57.default.string, | |
color: import_prop_types57.default.oneOf(["initial", "inherit", "primary", "secondary", "textPrimary", "textSecondary", "error"]), | |
component: elementTypeAcceptingRef_default, | |
onBlur: import_prop_types57.default.func, | |
onFocus: import_prop_types57.default.func, | |
TypographyClasses: import_prop_types57.default.object, | |
underline: import_prop_types57.default.oneOf(["none", "hover", "always"]), | |
variant: import_prop_types57.default.string | |
} : void 0; | |
var Link_default = withStyles_default(styles85, { | |
name: "MuiLink" | |
})(Link); | |
// node_modules/@material-ui/core/esm/List/List.js | |
var React69 = __toModule(require_react()); | |
var import_prop_types58 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/List/ListContext.js | |
var React68 = __toModule(require_react()); | |
var ListContext = React68.createContext({}); | |
if (true) { | |
ListContext.displayName = "ListContext"; | |
} | |
var ListContext_default = ListContext; | |
// node_modules/@material-ui/core/esm/List/List.js | |
var styles86 = { | |
root: { | |
listStyle: "none", | |
margin: 0, | |
padding: 0, | |
position: "relative" | |
}, | |
padding: { | |
paddingTop: 8, | |
paddingBottom: 8 | |
}, | |
dense: {}, | |
subheader: { | |
paddingTop: 0 | |
} | |
}; | |
var List = React69.forwardRef(function List2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "ul" : _props$component, _props$dense = props.dense, dense = _props$dense === void 0 ? false : _props$dense, _props$disablePadding = props.disablePadding, disablePadding = _props$disablePadding === void 0 ? false : _props$disablePadding, subheader = props.subheader, other = _objectWithoutProperties(props, ["children", "classes", "className", "component", "dense", "disablePadding", "subheader"]); | |
var context = React69.useMemo(function() { | |
return { | |
dense | |
}; | |
}, [dense]); | |
return React69.createElement(ListContext_default.Provider, { | |
value: context | |
}, React69.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className, dense && classes.dense, !disablePadding && classes.padding, subheader && classes.subheader), | |
ref | |
}, other), subheader, children)); | |
}); | |
true ? List.propTypes = { | |
children: import_prop_types58.default.node, | |
classes: import_prop_types58.default.object.isRequired, | |
className: import_prop_types58.default.string, | |
component: import_prop_types58.default.elementType, | |
dense: import_prop_types58.default.bool, | |
disablePadding: import_prop_types58.default.bool, | |
subheader: import_prop_types58.default.node | |
} : void 0; | |
var List_default = withStyles_default(styles86, { | |
name: "MuiList" | |
})(List); | |
// node_modules/@material-ui/core/esm/ListItem/ListItem.js | |
var React70 = __toModule(require_react()); | |
var import_prop_types59 = __toModule(require_prop_types()); | |
var ReactDOM3 = __toModule(require_react_dom()); | |
var styles87 = function styles88(theme) { | |
return { | |
root: { | |
display: "flex", | |
justifyContent: "flex-start", | |
alignItems: "center", | |
position: "relative", | |
textDecoration: "none", | |
width: "100%", | |
boxSizing: "border-box", | |
textAlign: "left", | |
paddingTop: 8, | |
paddingBottom: 8, | |
"&$focusVisible": { | |
backgroundColor: theme.palette.action.selected | |
}, | |
"&$selected, &$selected:hover": { | |
backgroundColor: theme.palette.action.selected | |
}, | |
"&$disabled": { | |
opacity: 0.5 | |
} | |
}, | |
container: { | |
position: "relative" | |
}, | |
focusVisible: {}, | |
dense: { | |
paddingTop: 4, | |
paddingBottom: 4 | |
}, | |
alignItemsFlexStart: { | |
alignItems: "flex-start" | |
}, | |
disabled: {}, | |
divider: { | |
borderBottom: "1px solid ".concat(theme.palette.divider), | |
backgroundClip: "padding-box" | |
}, | |
gutters: { | |
paddingLeft: 16, | |
paddingRight: 16 | |
}, | |
button: { | |
transition: theme.transitions.create("background-color", { | |
duration: theme.transitions.duration.shortest | |
}), | |
"&:hover": { | |
textDecoration: "none", | |
backgroundColor: theme.palette.action.hover, | |
"@media (hover: none)": { | |
backgroundColor: "transparent" | |
} | |
} | |
}, | |
secondaryAction: { | |
paddingRight: 48 | |
}, | |
selected: {} | |
}; | |
}; | |
var useEnhancedEffect4 = typeof window === "undefined" ? React70.useEffect : React70.useLayoutEffect; | |
var ListItem = React70.forwardRef(function ListItem2(props, ref) { | |
var _props$alignItems = props.alignItems, alignItems = _props$alignItems === void 0 ? "center" : _props$alignItems, _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus, _props$button = props.button, button = _props$button === void 0 ? false : _props$button, childrenProp = props.children, classes = props.classes, className = props.className, componentProp = props.component, _props$ContainerCompo = props.ContainerComponent, ContainerComponent = _props$ContainerCompo === void 0 ? "li" : _props$ContainerCompo, _props$ContainerProps = props.ContainerProps; | |
_props$ContainerProps = _props$ContainerProps === void 0 ? {} : _props$ContainerProps; | |
var ContainerClassName = _props$ContainerProps.className, ContainerProps = _objectWithoutProperties(_props$ContainerProps, ["className"]), _props$dense = props.dense, dense = _props$dense === void 0 ? false : _props$dense, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$disableGutters = props.disableGutters, disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, _props$divider = props.divider, divider = _props$divider === void 0 ? false : _props$divider, focusVisibleClassName = props.focusVisibleClassName, _props$selected = props.selected, selected = _props$selected === void 0 ? false : _props$selected, other = _objectWithoutProperties(props, ["alignItems", "autoFocus", "button", "children", "classes", "className", "component", "ContainerComponent", "ContainerProps", "dense", "disabled", "disableGutters", "divider", "focusVisibleClassName", "selected"]); | |
var context = React70.useContext(ListContext_default); | |
var childContext = { | |
dense: dense || context.dense || false, | |
alignItems | |
}; | |
var listItemRef = React70.useRef(null); | |
useEnhancedEffect4(function() { | |
if (autoFocus) { | |
if (listItemRef.current) { | |
listItemRef.current.focus(); | |
} else if (true) { | |
console.error("Material-UI: Unable to set focus to a ListItem whose component has not been rendered."); | |
} | |
} | |
}, [autoFocus]); | |
var children = React70.Children.toArray(childrenProp); | |
var hasSecondaryAction = children.length && isMuiElement(children[children.length - 1], ["ListItemSecondaryAction"]); | |
var handleOwnRef = React70.useCallback(function(instance) { | |
listItemRef.current = ReactDOM3.findDOMNode(instance); | |
}, []); | |
var handleRef = useForkRef(handleOwnRef, ref); | |
var componentProps = _extends({ | |
className: clsx_m_default(classes.root, className, childContext.dense && classes.dense, !disableGutters && classes.gutters, divider && classes.divider, disabled && classes.disabled, button && classes.button, alignItems !== "center" && classes.alignItemsFlexStart, hasSecondaryAction && classes.secondaryAction, selected && classes.selected), | |
disabled | |
}, other); | |
var Component3 = componentProp || "li"; | |
if (button) { | |
componentProps.component = componentProp || "div"; | |
componentProps.focusVisibleClassName = clsx_m_default(classes.focusVisible, focusVisibleClassName); | |
Component3 = ButtonBase_default; | |
} | |
if (hasSecondaryAction) { | |
Component3 = !componentProps.component && !componentProp ? "div" : Component3; | |
if (ContainerComponent === "li") { | |
if (Component3 === "li") { | |
Component3 = "div"; | |
} else if (componentProps.component === "li") { | |
componentProps.component = "div"; | |
} | |
} | |
return React70.createElement(ListContext_default.Provider, { | |
value: childContext | |
}, React70.createElement(ContainerComponent, _extends({ | |
className: clsx_m_default(classes.container, ContainerClassName), | |
ref: handleRef | |
}, ContainerProps), React70.createElement(Component3, componentProps, children), children.pop())); | |
} | |
return React70.createElement(ListContext_default.Provider, { | |
value: childContext | |
}, React70.createElement(Component3, _extends({ | |
ref: handleRef | |
}, componentProps), children)); | |
}); | |
true ? ListItem.propTypes = { | |
alignItems: import_prop_types59.default.oneOf(["flex-start", "center"]), | |
autoFocus: import_prop_types59.default.bool, | |
button: import_prop_types59.default.bool, | |
children: chainPropTypes(import_prop_types59.default.node, function(props) { | |
var children = React70.Children.toArray(props.children); | |
var secondaryActionIndex = -1; | |
for (var i = children.length - 1; i >= 0; i -= 1) { | |
var child = children[i]; | |
if (isMuiElement(child, ["ListItemSecondaryAction"])) { | |
secondaryActionIndex = i; | |
break; | |
} | |
} | |
if (secondaryActionIndex !== -1 && secondaryActionIndex !== children.length - 1) { | |
return new Error("Material-UI: You used an element after ListItemSecondaryAction. For ListItem to detect that it has a secondary action you must pass it as the last child to ListItem."); | |
} | |
return null; | |
}), | |
classes: import_prop_types59.default.object.isRequired, | |
className: import_prop_types59.default.string, | |
component: import_prop_types59.default.elementType, | |
ContainerComponent: import_prop_types59.default.elementType, | |
ContainerProps: import_prop_types59.default.object, | |
dense: import_prop_types59.default.bool, | |
disabled: import_prop_types59.default.bool, | |
disableGutters: import_prop_types59.default.bool, | |
divider: import_prop_types59.default.bool, | |
focusVisibleClassName: import_prop_types59.default.string, | |
selected: import_prop_types59.default.bool | |
} : void 0; | |
var ListItem_default = withStyles_default(styles87, { | |
name: "MuiListItem" | |
})(ListItem); | |
// node_modules/@material-ui/core/esm/ListItemAvatar/ListItemAvatar.js | |
var React71 = __toModule(require_react()); | |
var import_prop_types60 = __toModule(require_prop_types()); | |
var styles89 = { | |
root: { | |
minWidth: 56, | |
flexShrink: 0 | |
}, | |
alignItemsFlexStart: { | |
marginTop: 8 | |
} | |
}; | |
var ListItemAvatar = React71.forwardRef(function ListItemAvatar2(props, ref) { | |
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]); | |
var context = React71.useContext(ListContext_default); | |
return React71.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, context.alignItems === "flex-start" && classes.alignItemsFlexStart), | |
ref | |
}, other)); | |
}); | |
true ? ListItemAvatar.propTypes = { | |
children: import_prop_types60.default.element.isRequired, | |
classes: import_prop_types60.default.object, | |
className: import_prop_types60.default.string | |
} : void 0; | |
var ListItemAvatar_default = withStyles_default(styles89, { | |
name: "MuiListItemAvatar" | |
})(ListItemAvatar); | |
// node_modules/@material-ui/core/esm/ListItemIcon/ListItemIcon.js | |
var React72 = __toModule(require_react()); | |
var import_prop_types61 = __toModule(require_prop_types()); | |
var styles90 = function styles91(theme) { | |
return { | |
root: { | |
minWidth: 56, | |
color: theme.palette.action.active, | |
flexShrink: 0, | |
display: "inline-flex" | |
}, | |
alignItemsFlexStart: { | |
marginTop: 8 | |
} | |
}; | |
}; | |
var ListItemIcon = React72.forwardRef(function ListItemIcon2(props, ref) { | |
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]); | |
var context = React72.useContext(ListContext_default); | |
return React72.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, context.alignItems === "flex-start" && classes.alignItemsFlexStart), | |
ref | |
}, other)); | |
}); | |
true ? ListItemIcon.propTypes = { | |
children: import_prop_types61.default.node, | |
classes: import_prop_types61.default.object, | |
className: import_prop_types61.default.string | |
} : void 0; | |
var ListItemIcon_default = withStyles_default(styles90, { | |
name: "MuiListItemIcon" | |
})(ListItemIcon); | |
// node_modules/@material-ui/core/esm/ListItemSecondaryAction/ListItemSecondaryAction.js | |
var React73 = __toModule(require_react()); | |
var import_prop_types62 = __toModule(require_prop_types()); | |
var styles92 = { | |
root: { | |
position: "absolute", | |
right: 16, | |
top: "50%", | |
transform: "translateY(-50%)" | |
} | |
}; | |
var ListItemSecondaryAction = React73.forwardRef(function ListItemSecondaryAction2(props, ref) { | |
var classes = props.classes, className = props.className, other = _objectWithoutProperties(props, ["classes", "className"]); | |
return React73.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other)); | |
}); | |
true ? ListItemSecondaryAction.propTypes = { | |
children: import_prop_types62.default.node, | |
classes: import_prop_types62.default.object, | |
className: import_prop_types62.default.string | |
} : void 0; | |
ListItemSecondaryAction.muiName = "ListItemSecondaryAction"; | |
var ListItemSecondaryAction_default = withStyles_default(styles92, { | |
name: "MuiListItemSecondaryAction" | |
})(ListItemSecondaryAction); | |
// node_modules/@material-ui/core/esm/ListItemText/ListItemText.js | |
var React74 = __toModule(require_react()); | |
var import_prop_types63 = __toModule(require_prop_types()); | |
var styles93 = { | |
root: { | |
flex: "1 1 auto", | |
minWidth: 0, | |
marginTop: 4, | |
marginBottom: 4 | |
}, | |
multiline: { | |
marginTop: 6, | |
marginBottom: 6 | |
}, | |
dense: {}, | |
inset: { | |
paddingLeft: 56 | |
}, | |
primary: {}, | |
secondary: {} | |
}; | |
var ListItemText = React74.forwardRef(function ListItemText2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, _props$disableTypogra = props.disableTypography, disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra, _props$inset = props.inset, inset = _props$inset === void 0 ? false : _props$inset, primaryProp = props.primary, primaryTypographyProps = props.primaryTypographyProps, secondaryProp = props.secondary, secondaryTypographyProps = props.secondaryTypographyProps, other = _objectWithoutProperties(props, ["children", "classes", "className", "disableTypography", "inset", "primary", "primaryTypographyProps", "secondary", "secondaryTypographyProps"]); | |
var _React$useContext = React74.useContext(ListContext_default), dense = _React$useContext.dense; | |
var primary = primaryProp != null ? primaryProp : children; | |
if (primary != null && primary.type !== Typography_default && !disableTypography) { | |
primary = React74.createElement(Typography_default, _extends({ | |
variant: dense ? "body2" : "body1", | |
className: classes.primary, | |
component: "span", | |
display: "block" | |
}, primaryTypographyProps), primary); | |
} | |
var secondary = secondaryProp; | |
if (secondary != null && secondary.type !== Typography_default && !disableTypography) { | |
secondary = React74.createElement(Typography_default, _extends({ | |
variant: "body2", | |
className: classes.secondary, | |
color: "textSecondary", | |
display: "block" | |
}, secondaryTypographyProps), secondary); | |
} | |
return React74.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, dense && classes.dense, inset && classes.inset, primary && secondary && classes.multiline), | |
ref | |
}, other), primary, secondary); | |
}); | |
true ? ListItemText.propTypes = { | |
children: import_prop_types63.default.node, | |
classes: import_prop_types63.default.object, | |
className: import_prop_types63.default.string, | |
disableTypography: import_prop_types63.default.bool, | |
inset: import_prop_types63.default.bool, | |
primary: import_prop_types63.default.node, | |
primaryTypographyProps: import_prop_types63.default.object, | |
secondary: import_prop_types63.default.node, | |
secondaryTypographyProps: import_prop_types63.default.object | |
} : void 0; | |
var ListItemText_default = withStyles_default(styles93, { | |
name: "MuiListItemText" | |
})(ListItemText); | |
// node_modules/@material-ui/core/esm/ListSubheader/ListSubheader.js | |
var React75 = __toModule(require_react()); | |
var import_prop_types64 = __toModule(require_prop_types()); | |
var styles94 = function styles95(theme) { | |
return { | |
root: { | |
boxSizing: "border-box", | |
lineHeight: "48px", | |
listStyle: "none", | |
color: theme.palette.text.secondary, | |
fontFamily: theme.typography.fontFamily, | |
fontWeight: theme.typography.fontWeightMedium, | |
fontSize: theme.typography.pxToRem(14) | |
}, | |
colorPrimary: { | |
color: theme.palette.primary.main | |
}, | |
colorInherit: { | |
color: "inherit" | |
}, | |
gutters: { | |
paddingLeft: 16, | |
paddingRight: 16 | |
}, | |
inset: { | |
paddingLeft: 72 | |
}, | |
sticky: { | |
position: "sticky", | |
top: 0, | |
zIndex: 1, | |
backgroundColor: "inherit" | |
} | |
}; | |
}; | |
var ListSubheader = React75.forwardRef(function ListSubheader2(props, ref) { | |
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "default" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "li" : _props$component, _props$disableGutters = props.disableGutters, disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, _props$disableSticky = props.disableSticky, disableSticky = _props$disableSticky === void 0 ? false : _props$disableSticky, _props$inset = props.inset, inset = _props$inset === void 0 ? false : _props$inset, other = _objectWithoutProperties(props, ["classes", "className", "color", "component", "disableGutters", "disableSticky", "inset"]); | |
return React75.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className, color !== "default" && classes["color".concat(capitalize(color))], inset && classes.inset, !disableSticky && classes.sticky, !disableGutters && classes.gutters), | |
ref | |
}, other)); | |
}); | |
true ? ListSubheader.propTypes = { | |
children: import_prop_types64.default.node, | |
classes: import_prop_types64.default.object.isRequired, | |
className: import_prop_types64.default.string, | |
color: import_prop_types64.default.oneOf(["default", "primary", "inherit"]), | |
component: import_prop_types64.default.elementType, | |
disableGutters: import_prop_types64.default.bool, | |
disableSticky: import_prop_types64.default.bool, | |
inset: import_prop_types64.default.bool | |
} : void 0; | |
var ListSubheader_default = withStyles_default(styles94, { | |
name: "MuiListSubheader" | |
})(ListSubheader); | |
// node_modules/@material-ui/core/esm/Menu/Menu.js | |
var React78 = __toModule(require_react()); | |
var import_react_is8 = __toModule(require_react_is()); | |
var import_prop_types67 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Popover/Popover.js | |
var React76 = __toModule(require_react()); | |
var import_prop_types65 = __toModule(require_prop_types()); | |
var ReactDOM4 = __toModule(require_react_dom()); | |
function getOffsetTop(rect, vertical) { | |
var offset4 = 0; | |
if (typeof vertical === "number") { | |
offset4 = vertical; | |
} else if (vertical === "center") { | |
offset4 = rect.height / 2; | |
} else if (vertical === "bottom") { | |
offset4 = rect.height; | |
} | |
return offset4; | |
} | |
function getOffsetLeft(rect, horizontal) { | |
var offset4 = 0; | |
if (typeof horizontal === "number") { | |
offset4 = horizontal; | |
} else if (horizontal === "center") { | |
offset4 = rect.width / 2; | |
} else if (horizontal === "right") { | |
offset4 = rect.width; | |
} | |
return offset4; | |
} | |
function getTransformOriginValue(transformOrigin) { | |
return [transformOrigin.horizontal, transformOrigin.vertical].map(function(n) { | |
return typeof n === "number" ? "".concat(n, "px") : n; | |
}).join(" "); | |
} | |
function getScrollParent(parent, child) { | |
var element = child; | |
var scrollTop = 0; | |
while (element && element !== parent) { | |
element = element.parentElement; | |
scrollTop += element.scrollTop; | |
} | |
return scrollTop; | |
} | |
function getAnchorEl(anchorEl) { | |
return typeof anchorEl === "function" ? anchorEl() : anchorEl; | |
} | |
var styles96 = { | |
root: {}, | |
paper: { | |
position: "absolute", | |
overflowY: "auto", | |
overflowX: "hidden", | |
minWidth: 16, | |
minHeight: 16, | |
maxWidth: "calc(100% - 32px)", | |
maxHeight: "calc(100% - 32px)", | |
outline: 0 | |
} | |
}; | |
var Popover = React76.forwardRef(function Popover2(props, ref) { | |
var action = props.action, anchorEl = props.anchorEl, _props$anchorOrigin = props.anchorOrigin, anchorOrigin = _props$anchorOrigin === void 0 ? { | |
vertical: "top", | |
horizontal: "left" | |
} : _props$anchorOrigin, anchorPosition = props.anchorPosition, _props$anchorReferenc = props.anchorReference, anchorReference = _props$anchorReferenc === void 0 ? "anchorEl" : _props$anchorReferenc, children = props.children, classes = props.classes, className = props.className, containerProp = props.container, _props$elevation = props.elevation, elevation = _props$elevation === void 0 ? 8 : _props$elevation, getContentAnchorEl = props.getContentAnchorEl, _props$marginThreshol = props.marginThreshold, marginThreshold = _props$marginThreshol === void 0 ? 16 : _props$marginThreshol, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, open = props.open, _props$PaperProps = props.PaperProps, PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps, _props$transformOrigi = props.transformOrigin, transformOrigin = _props$transformOrigi === void 0 ? { | |
vertical: "top", | |
horizontal: "left" | |
} : _props$transformOrigi, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Grow_default : _props$TransitionComp, _props$transitionDura = props.transitionDuration, transitionDurationProp = _props$transitionDura === void 0 ? "auto" : _props$transitionDura, _props$TransitionProp = props.TransitionProps, TransitionProps = _props$TransitionProp === void 0 ? {} : _props$TransitionProp, other = _objectWithoutProperties(props, ["action", "anchorEl", "anchorOrigin", "anchorPosition", "anchorReference", "children", "classes", "className", "container", "elevation", "getContentAnchorEl", "marginThreshold", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "open", "PaperProps", "transformOrigin", "TransitionComponent", "transitionDuration", "TransitionProps"]); | |
var paperRef = React76.useRef(); | |
var getAnchorOffset = React76.useCallback(function(contentAnchorOffset) { | |
if (anchorReference === "anchorPosition") { | |
if (true) { | |
if (!anchorPosition) { | |
console.error('Material-UI: You need to provide a `anchorPosition` prop when using <Popover anchorReference="anchorPosition" />.'); | |
} | |
} | |
return anchorPosition; | |
} | |
var resolvedAnchorEl = getAnchorEl(anchorEl); | |
var anchorElement = resolvedAnchorEl && resolvedAnchorEl.nodeType === 1 ? resolvedAnchorEl : ownerDocument(paperRef.current).body; | |
var anchorRect = anchorElement.getBoundingClientRect(); | |
if (true) { | |
var box = anchorElement.getBoundingClientRect(); | |
if (box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) { | |
console.warn(["Material-UI: The `anchorEl` prop provided to the component is invalid.", "The anchor element should be part of the document layout.", "Make sure the element is present in the document or that it's not display none."].join("\n")); | |
} | |
} | |
var anchorVertical = contentAnchorOffset === 0 ? anchorOrigin.vertical : "center"; | |
return { | |
top: anchorRect.top + getOffsetTop(anchorRect, anchorVertical), | |
left: anchorRect.left + getOffsetLeft(anchorRect, anchorOrigin.horizontal) | |
}; | |
}, [anchorEl, anchorOrigin.horizontal, anchorOrigin.vertical, anchorPosition, anchorReference]); | |
var getContentAnchorOffset = React76.useCallback(function(element) { | |
var contentAnchorOffset = 0; | |
if (getContentAnchorEl && anchorReference === "anchorEl") { | |
var contentAnchorEl = getContentAnchorEl(element); | |
if (contentAnchorEl && element.contains(contentAnchorEl)) { | |
var scrollTop = getScrollParent(element, contentAnchorEl); | |
contentAnchorOffset = contentAnchorEl.offsetTop + contentAnchorEl.clientHeight / 2 - scrollTop || 0; | |
} | |
if (true) { | |
if (anchorOrigin.vertical !== "top") { | |
console.error(["Material-UI: You can not change the default `anchorOrigin.vertical` value ", "when also providing the `getContentAnchorEl` prop to the popover component.", "Only use one of the two props.", "Set `getContentAnchorEl` to `null | undefined` or leave `anchorOrigin.vertical` unchanged."].join("\n")); | |
} | |
} | |
} | |
return contentAnchorOffset; | |
}, [anchorOrigin.vertical, anchorReference, getContentAnchorEl]); | |
var getTransformOrigin = React76.useCallback(function(elemRect) { | |
var contentAnchorOffset = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; | |
return { | |
vertical: getOffsetTop(elemRect, transformOrigin.vertical) + contentAnchorOffset, | |
horizontal: getOffsetLeft(elemRect, transformOrigin.horizontal) | |
}; | |
}, [transformOrigin.horizontal, transformOrigin.vertical]); | |
var getPositioningStyle = React76.useCallback(function(element) { | |
var contentAnchorOffset = getContentAnchorOffset(element); | |
var elemRect = { | |
width: element.offsetWidth, | |
height: element.offsetHeight | |
}; | |
var elemTransformOrigin = getTransformOrigin(elemRect, contentAnchorOffset); | |
if (anchorReference === "none") { | |
return { | |
top: null, | |
left: null, | |
transformOrigin: getTransformOriginValue(elemTransformOrigin) | |
}; | |
} | |
var anchorOffset = getAnchorOffset(contentAnchorOffset); | |
var top = anchorOffset.top - elemTransformOrigin.vertical; | |
var left = anchorOffset.left - elemTransformOrigin.horizontal; | |
var bottom = top + elemRect.height; | |
var right = left + elemRect.width; | |
var containerWindow = ownerWindow(getAnchorEl(anchorEl)); | |
var heightThreshold = containerWindow.innerHeight - marginThreshold; | |
var widthThreshold = containerWindow.innerWidth - marginThreshold; | |
if (top < marginThreshold) { | |
var diff = top - marginThreshold; | |
top -= diff; | |
elemTransformOrigin.vertical += diff; | |
} else if (bottom > heightThreshold) { | |
var _diff = bottom - heightThreshold; | |
top -= _diff; | |
elemTransformOrigin.vertical += _diff; | |
} | |
if (true) { | |
if (elemRect.height > heightThreshold && elemRect.height && heightThreshold) { | |
console.error(["Material-UI: The popover component is too tall.", "Some part of it can not be seen on the screen (".concat(elemRect.height - heightThreshold, "px)."), "Please consider adding a `max-height` to improve the user-experience."].join("\n")); | |
} | |
} | |
if (left < marginThreshold) { | |
var _diff2 = left - marginThreshold; | |
left -= _diff2; | |
elemTransformOrigin.horizontal += _diff2; | |
} else if (right > widthThreshold) { | |
var _diff3 = right - widthThreshold; | |
left -= _diff3; | |
elemTransformOrigin.horizontal += _diff3; | |
} | |
return { | |
top: "".concat(Math.round(top), "px"), | |
left: "".concat(Math.round(left), "px"), | |
transformOrigin: getTransformOriginValue(elemTransformOrigin) | |
}; | |
}, [anchorEl, anchorReference, getAnchorOffset, getContentAnchorOffset, getTransformOrigin, marginThreshold]); | |
var setPositioningStyles = React76.useCallback(function() { | |
var element = paperRef.current; | |
if (!element) { | |
return; | |
} | |
var positioning = getPositioningStyle(element); | |
if (positioning.top !== null) { | |
element.style.top = positioning.top; | |
} | |
if (positioning.left !== null) { | |
element.style.left = positioning.left; | |
} | |
element.style.transformOrigin = positioning.transformOrigin; | |
}, [getPositioningStyle]); | |
var handleEntering = function handleEntering2(element, isAppearing) { | |
if (onEntering) { | |
onEntering(element, isAppearing); | |
} | |
setPositioningStyles(); | |
}; | |
var handlePaperRef = React76.useCallback(function(instance) { | |
paperRef.current = ReactDOM4.findDOMNode(instance); | |
}, []); | |
React76.useEffect(function() { | |
if (open) { | |
setPositioningStyles(); | |
} | |
}); | |
React76.useImperativeHandle(action, function() { | |
return open ? { | |
updatePosition: function updatePosition() { | |
setPositioningStyles(); | |
} | |
} : null; | |
}, [open, setPositioningStyles]); | |
React76.useEffect(function() { | |
if (!open) { | |
return void 0; | |
} | |
var handleResize = debounce(function() { | |
setPositioningStyles(); | |
}); | |
window.addEventListener("resize", handleResize); | |
return function() { | |
handleResize.clear(); | |
window.removeEventListener("resize", handleResize); | |
}; | |
}, [open, setPositioningStyles]); | |
var transitionDuration = transitionDurationProp; | |
if (transitionDurationProp === "auto" && !TransitionComponent.muiSupportAuto) { | |
transitionDuration = void 0; | |
} | |
var container = containerProp || (anchorEl ? ownerDocument(getAnchorEl(anchorEl)).body : void 0); | |
return React76.createElement(Modal_default, _extends({ | |
container, | |
open, | |
ref, | |
BackdropProps: { | |
invisible: true | |
}, | |
className: clsx_m_default(classes.root, className) | |
}, other), React76.createElement(TransitionComponent, _extends({ | |
appear: true, | |
in: open, | |
onEnter, | |
onEntered, | |
onExit, | |
onExited, | |
onExiting, | |
timeout: transitionDuration | |
}, TransitionProps, { | |
onEntering: createChainedFunction(handleEntering, TransitionProps.onEntering) | |
}), React76.createElement(Paper_default, _extends({ | |
elevation, | |
ref: handlePaperRef | |
}, PaperProps, { | |
className: clsx_m_default(classes.paper, PaperProps.className) | |
}), children))); | |
}); | |
true ? Popover.propTypes = { | |
action: refType_default, | |
anchorEl: chainPropTypes(import_prop_types65.default.oneOfType([HTMLElementType, import_prop_types65.default.func]), function(props) { | |
if (props.open && (!props.anchorReference || props.anchorReference === "anchorEl")) { | |
var resolvedAnchorEl = getAnchorEl(props.anchorEl); | |
if (resolvedAnchorEl && resolvedAnchorEl.nodeType === 1) { | |
var box = resolvedAnchorEl.getBoundingClientRect(); | |
if (box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) { | |
return new Error(["Material-UI: The `anchorEl` prop provided to the component is invalid.", "The anchor element should be part of the document layout.", "Make sure the element is present in the document or that it's not display none."].join("\n")); | |
} | |
} else { | |
return new Error(["Material-UI: The `anchorEl` prop provided to the component is invalid.", "It should be an Element instance but it's `".concat(resolvedAnchorEl, "` instead.")].join("\n")); | |
} | |
} | |
return null; | |
}), | |
anchorOrigin: import_prop_types65.default.shape({ | |
horizontal: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["center", "left", "right"]), import_prop_types65.default.number]).isRequired, | |
vertical: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["bottom", "center", "top"]), import_prop_types65.default.number]).isRequired | |
}), | |
anchorPosition: import_prop_types65.default.shape({ | |
left: import_prop_types65.default.number.isRequired, | |
top: import_prop_types65.default.number.isRequired | |
}), | |
anchorReference: import_prop_types65.default.oneOf(["anchorEl", "anchorPosition", "none"]), | |
children: import_prop_types65.default.node, | |
classes: import_prop_types65.default.object, | |
className: import_prop_types65.default.string, | |
container: import_prop_types65.default.oneOfType([HTMLElementType, import_prop_types65.default.instanceOf(React76.Component), import_prop_types65.default.func]), | |
elevation: import_prop_types65.default.number, | |
getContentAnchorEl: import_prop_types65.default.func, | |
marginThreshold: import_prop_types65.default.number, | |
onClose: import_prop_types65.default.func, | |
onEnter: import_prop_types65.default.func, | |
onEntered: import_prop_types65.default.func, | |
onEntering: import_prop_types65.default.func, | |
onExit: import_prop_types65.default.func, | |
onExited: import_prop_types65.default.func, | |
onExiting: import_prop_types65.default.func, | |
open: import_prop_types65.default.bool.isRequired, | |
PaperProps: import_prop_types65.default.shape({ | |
component: elementTypeAcceptingRef_default | |
}), | |
transformOrigin: import_prop_types65.default.shape({ | |
horizontal: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["center", "left", "right"]), import_prop_types65.default.number]).isRequired, | |
vertical: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["bottom", "center", "top"]), import_prop_types65.default.number]).isRequired | |
}), | |
TransitionComponent: import_prop_types65.default.elementType, | |
transitionDuration: import_prop_types65.default.oneOfType([import_prop_types65.default.oneOf(["auto"]), import_prop_types65.default.number, import_prop_types65.default.shape({ | |
appear: import_prop_types65.default.number, | |
enter: import_prop_types65.default.number, | |
exit: import_prop_types65.default.number | |
})]), | |
TransitionProps: import_prop_types65.default.object | |
} : void 0; | |
var Popover_default = withStyles_default(styles96, { | |
name: "MuiPopover" | |
})(Popover); | |
// node_modules/@material-ui/core/esm/MenuList/MenuList.js | |
var React77 = __toModule(require_react()); | |
var import_react_is7 = __toModule(require_react_is()); | |
var import_prop_types66 = __toModule(require_prop_types()); | |
var ReactDOM5 = __toModule(require_react_dom()); | |
function nextItem(list, item, disableListWrap) { | |
if (list === item) { | |
return list.firstChild; | |
} | |
if (item && item.nextElementSibling) { | |
return item.nextElementSibling; | |
} | |
return disableListWrap ? null : list.firstChild; | |
} | |
function previousItem(list, item, disableListWrap) { | |
if (list === item) { | |
return disableListWrap ? list.firstChild : list.lastChild; | |
} | |
if (item && item.previousElementSibling) { | |
return item.previousElementSibling; | |
} | |
return disableListWrap ? null : list.lastChild; | |
} | |
function textCriteriaMatches(nextFocus, textCriteria) { | |
if (textCriteria === void 0) { | |
return true; | |
} | |
var text = nextFocus.innerText; | |
if (text === void 0) { | |
text = nextFocus.textContent; | |
} | |
text = text.trim().toLowerCase(); | |
if (text.length === 0) { | |
return false; | |
} | |
if (textCriteria.repeating) { | |
return text[0] === textCriteria.keys[0]; | |
} | |
return text.indexOf(textCriteria.keys.join("")) === 0; | |
} | |
function moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, traversalFunction, textCriteria) { | |
var wrappedOnce = false; | |
var nextFocus = traversalFunction(list, currentFocus, currentFocus ? disableListWrap : false); | |
while (nextFocus) { | |
if (nextFocus === list.firstChild) { | |
if (wrappedOnce) { | |
return; | |
} | |
wrappedOnce = true; | |
} | |
var nextFocusDisabled = disabledItemsFocusable ? false : nextFocus.disabled || nextFocus.getAttribute("aria-disabled") === "true"; | |
if (!nextFocus.hasAttribute("tabindex") || !textCriteriaMatches(nextFocus, textCriteria) || nextFocusDisabled) { | |
nextFocus = traversalFunction(list, nextFocus, disableListWrap); | |
} else { | |
nextFocus.focus(); | |
return; | |
} | |
} | |
} | |
var useEnhancedEffect5 = typeof window === "undefined" ? React77.useEffect : React77.useLayoutEffect; | |
var MenuList = React77.forwardRef(function MenuList2(props, ref) { | |
var actions = props.actions, _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus, _props$autoFocusItem = props.autoFocusItem, autoFocusItem = _props$autoFocusItem === void 0 ? false : _props$autoFocusItem, children = props.children, className = props.className, _props$disabledItemsF = props.disabledItemsFocusable, disabledItemsFocusable = _props$disabledItemsF === void 0 ? false : _props$disabledItemsF, _props$disableListWra = props.disableListWrap, disableListWrap = _props$disableListWra === void 0 ? false : _props$disableListWra, onKeyDown = props.onKeyDown, _props$variant = props.variant, variant = _props$variant === void 0 ? "selectedMenu" : _props$variant, other = _objectWithoutProperties(props, ["actions", "autoFocus", "autoFocusItem", "children", "className", "disabledItemsFocusable", "disableListWrap", "onKeyDown", "variant"]); | |
var listRef = React77.useRef(null); | |
var textCriteriaRef = React77.useRef({ | |
keys: [], | |
repeating: true, | |
previousKeyMatched: true, | |
lastTime: null | |
}); | |
useEnhancedEffect5(function() { | |
if (autoFocus) { | |
listRef.current.focus(); | |
} | |
}, [autoFocus]); | |
React77.useImperativeHandle(actions, function() { | |
return { | |
adjustStyleForScrollbar: function adjustStyleForScrollbar(containerElement, theme) { | |
var noExplicitWidth = !listRef.current.style.width; | |
if (containerElement.clientHeight < listRef.current.clientHeight && noExplicitWidth) { | |
var scrollbarSize = "".concat(getScrollbarSize(true), "px"); | |
listRef.current.style[theme.direction === "rtl" ? "paddingLeft" : "paddingRight"] = scrollbarSize; | |
listRef.current.style.width = "calc(100% + ".concat(scrollbarSize, ")"); | |
} | |
return listRef.current; | |
} | |
}; | |
}, []); | |
var handleKeyDown = function handleKeyDown2(event) { | |
var list = listRef.current; | |
var key = event.key; | |
var currentFocus = ownerDocument(list).activeElement; | |
if (key === "ArrowDown") { | |
event.preventDefault(); | |
moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, nextItem); | |
} else if (key === "ArrowUp") { | |
event.preventDefault(); | |
moveFocus(list, currentFocus, disableListWrap, disabledItemsFocusable, previousItem); | |
} else if (key === "Home") { | |
event.preventDefault(); | |
moveFocus(list, null, disableListWrap, disabledItemsFocusable, nextItem); | |
} else if (key === "End") { | |
event.preventDefault(); | |
moveFocus(list, null, disableListWrap, disabledItemsFocusable, previousItem); | |
} else if (key.length === 1) { | |
var criteria = textCriteriaRef.current; | |
var lowerKey = key.toLowerCase(); | |
var currTime = performance.now(); | |
if (criteria.keys.length > 0) { | |
if (currTime - criteria.lastTime > 500) { | |
criteria.keys = []; | |
criteria.repeating = true; | |
criteria.previousKeyMatched = true; | |
} else if (criteria.repeating && lowerKey !== criteria.keys[0]) { | |
criteria.repeating = false; | |
} | |
} | |
criteria.lastTime = currTime; | |
criteria.keys.push(lowerKey); | |
var keepFocusOnCurrent = currentFocus && !criteria.repeating && textCriteriaMatches(currentFocus, criteria); | |
if (criteria.previousKeyMatched && (keepFocusOnCurrent || moveFocus(list, currentFocus, false, disabledItemsFocusable, nextItem, criteria))) { | |
event.preventDefault(); | |
} else { | |
criteria.previousKeyMatched = false; | |
} | |
} | |
if (onKeyDown) { | |
onKeyDown(event); | |
} | |
}; | |
var handleOwnRef = React77.useCallback(function(instance) { | |
listRef.current = ReactDOM5.findDOMNode(instance); | |
}, []); | |
var handleRef = useForkRef(handleOwnRef, ref); | |
var activeItemIndex = -1; | |
React77.Children.forEach(children, function(child, index) { | |
if (!React77.isValidElement(child)) { | |
return; | |
} | |
if (true) { | |
if (import_react_is7.isFragment(child)) { | |
console.error(["Material-UI: The Menu component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n")); | |
} | |
} | |
if (!child.props.disabled) { | |
if (variant === "selectedMenu" && child.props.selected) { | |
activeItemIndex = index; | |
} else if (activeItemIndex === -1) { | |
activeItemIndex = index; | |
} | |
} | |
}); | |
var items = React77.Children.map(children, function(child, index) { | |
if (index === activeItemIndex) { | |
var newChildProps = {}; | |
if (autoFocusItem) { | |
newChildProps.autoFocus = true; | |
} | |
if (child.props.tabIndex === void 0 && variant === "selectedMenu") { | |
newChildProps.tabIndex = 0; | |
} | |
return React77.cloneElement(child, newChildProps); | |
} | |
return child; | |
}); | |
return React77.createElement(List_default, _extends({ | |
role: "menu", | |
ref: handleRef, | |
className, | |
onKeyDown: handleKeyDown, | |
tabIndex: autoFocus ? 0 : -1 | |
}, other), items); | |
}); | |
true ? MenuList.propTypes = { | |
autoFocus: import_prop_types66.default.bool, | |
autoFocusItem: import_prop_types66.default.bool, | |
children: import_prop_types66.default.node, | |
className: import_prop_types66.default.string, | |
disabledItemsFocusable: import_prop_types66.default.bool, | |
disableListWrap: import_prop_types66.default.bool, | |
onKeyDown: import_prop_types66.default.func, | |
variant: import_prop_types66.default.oneOf(["menu", "selectedMenu"]) | |
} : void 0; | |
var MenuList_default = MenuList; | |
// node_modules/@material-ui/core/esm/Menu/Menu.js | |
var ReactDOM6 = __toModule(require_react_dom()); | |
var RTL_ORIGIN = { | |
vertical: "top", | |
horizontal: "right" | |
}; | |
var LTR_ORIGIN = { | |
vertical: "top", | |
horizontal: "left" | |
}; | |
var styles97 = { | |
paper: { | |
maxHeight: "calc(100% - 96px)", | |
WebkitOverflowScrolling: "touch" | |
}, | |
list: { | |
outline: 0 | |
} | |
}; | |
var Menu = React78.forwardRef(function Menu2(props, ref) { | |
var _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? true : _props$autoFocus, children = props.children, classes = props.classes, _props$disableAutoFoc = props.disableAutoFocusItem, disableAutoFocusItem = _props$disableAutoFoc === void 0 ? false : _props$disableAutoFoc, _props$MenuListProps = props.MenuListProps, MenuListProps = _props$MenuListProps === void 0 ? {} : _props$MenuListProps, onClose = props.onClose, onEntering = props.onEntering, open = props.open, _props$PaperProps = props.PaperProps, PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps, PopoverClasses = props.PopoverClasses, _props$transitionDura = props.transitionDuration, transitionDuration = _props$transitionDura === void 0 ? "auto" : _props$transitionDura, _props$variant = props.variant, variant = _props$variant === void 0 ? "selectedMenu" : _props$variant, other = _objectWithoutProperties(props, ["autoFocus", "children", "classes", "disableAutoFocusItem", "MenuListProps", "onClose", "onEntering", "open", "PaperProps", "PopoverClasses", "transitionDuration", "variant"]); | |
var theme = useTheme(); | |
var autoFocusItem = autoFocus && !disableAutoFocusItem && open; | |
var menuListActionsRef = React78.useRef(null); | |
var contentAnchorRef = React78.useRef(null); | |
var getContentAnchorEl = function getContentAnchorEl2() { | |
return contentAnchorRef.current; | |
}; | |
var handleEntering = function handleEntering2(element, isAppearing) { | |
if (menuListActionsRef.current) { | |
menuListActionsRef.current.adjustStyleForScrollbar(element, theme); | |
} | |
if (onEntering) { | |
onEntering(element, isAppearing); | |
} | |
}; | |
var handleListKeyDown = function handleListKeyDown2(event) { | |
if (event.key === "Tab") { | |
event.preventDefault(); | |
if (onClose) { | |
onClose(event, "tabKeyDown"); | |
} | |
} | |
}; | |
var activeItemIndex = -1; | |
React78.Children.map(children, function(child, index) { | |
if (!React78.isValidElement(child)) { | |
return; | |
} | |
if (true) { | |
if (import_react_is8.isFragment(child)) { | |
console.error(["Material-UI: The Menu component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n")); | |
} | |
} | |
if (!child.props.disabled) { | |
if (variant !== "menu" && child.props.selected) { | |
activeItemIndex = index; | |
} else if (activeItemIndex === -1) { | |
activeItemIndex = index; | |
} | |
} | |
}); | |
var items = React78.Children.map(children, function(child, index) { | |
if (index === activeItemIndex) { | |
return React78.cloneElement(child, { | |
ref: function ref2(instance) { | |
contentAnchorRef.current = ReactDOM6.findDOMNode(instance); | |
setRef(child.ref, instance); | |
} | |
}); | |
} | |
return child; | |
}); | |
return React78.createElement(Popover_default, _extends({ | |
getContentAnchorEl, | |
classes: PopoverClasses, | |
onClose, | |
onEntering: handleEntering, | |
anchorOrigin: theme.direction === "rtl" ? RTL_ORIGIN : LTR_ORIGIN, | |
transformOrigin: theme.direction === "rtl" ? RTL_ORIGIN : LTR_ORIGIN, | |
PaperProps: _extends({}, PaperProps, { | |
classes: _extends({}, PaperProps.classes, { | |
root: classes.paper | |
}) | |
}), | |
open, | |
ref, | |
transitionDuration | |
}, other), React78.createElement(MenuList_default, _extends({ | |
onKeyDown: handleListKeyDown, | |
actions: menuListActionsRef, | |
autoFocus: autoFocus && (activeItemIndex === -1 || disableAutoFocusItem), | |
autoFocusItem, | |
variant | |
}, MenuListProps, { | |
className: clsx_m_default(classes.list, MenuListProps.className) | |
}), items)); | |
}); | |
true ? Menu.propTypes = { | |
anchorEl: import_prop_types67.default.oneOfType([HTMLElementType, import_prop_types67.default.func]), | |
autoFocus: import_prop_types67.default.bool, | |
children: import_prop_types67.default.node, | |
classes: import_prop_types67.default.object, | |
disableAutoFocusItem: import_prop_types67.default.bool, | |
MenuListProps: import_prop_types67.default.object, | |
onClose: import_prop_types67.default.func, | |
onEnter: import_prop_types67.default.func, | |
onEntered: import_prop_types67.default.func, | |
onEntering: import_prop_types67.default.func, | |
onExit: import_prop_types67.default.func, | |
onExited: import_prop_types67.default.func, | |
onExiting: import_prop_types67.default.func, | |
open: import_prop_types67.default.bool.isRequired, | |
PaperProps: import_prop_types67.default.object, | |
PopoverClasses: import_prop_types67.default.object, | |
transitionDuration: import_prop_types67.default.oneOfType([import_prop_types67.default.oneOf(["auto"]), import_prop_types67.default.number, import_prop_types67.default.shape({ | |
appear: import_prop_types67.default.number, | |
enter: import_prop_types67.default.number, | |
exit: import_prop_types67.default.number | |
})]), | |
variant: import_prop_types67.default.oneOf(["menu", "selectedMenu"]) | |
} : void 0; | |
var Menu_default = withStyles_default(styles97, { | |
name: "MuiMenu" | |
})(Menu); | |
// node_modules/@material-ui/core/esm/MenuItem/MenuItem.js | |
var React79 = __toModule(require_react()); | |
var import_prop_types68 = __toModule(require_prop_types()); | |
var styles98 = function styles99(theme) { | |
return { | |
root: _extends({}, theme.typography.body1, _defineProperty({ | |
minHeight: 48, | |
paddingTop: 6, | |
paddingBottom: 6, | |
boxSizing: "border-box", | |
width: "auto", | |
overflow: "hidden", | |
whiteSpace: "nowrap" | |
}, theme.breakpoints.up("sm"), { | |
minHeight: "auto" | |
})), | |
gutters: {}, | |
selected: {}, | |
dense: _extends({}, theme.typography.body2, { | |
minHeight: "auto" | |
}) | |
}; | |
}; | |
var MenuItem = React79.forwardRef(function MenuItem2(props, ref) { | |
var classes = props.classes, className = props.className, _props$component = props.component, component = _props$component === void 0 ? "li" : _props$component, _props$disableGutters = props.disableGutters, disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, ListItemClasses = props.ListItemClasses, _props$role = props.role, role = _props$role === void 0 ? "menuitem" : _props$role, selected = props.selected, tabIndexProp = props.tabIndex, other = _objectWithoutProperties(props, ["classes", "className", "component", "disableGutters", "ListItemClasses", "role", "selected", "tabIndex"]); | |
var tabIndex; | |
if (!props.disabled) { | |
tabIndex = tabIndexProp !== void 0 ? tabIndexProp : -1; | |
} | |
return React79.createElement(ListItem_default, _extends({ | |
button: true, | |
role, | |
tabIndex, | |
component, | |
selected, | |
disableGutters, | |
classes: _extends({ | |
dense: classes.dense | |
}, ListItemClasses), | |
className: clsx_m_default(classes.root, className, selected && classes.selected, !disableGutters && classes.gutters), | |
ref | |
}, other)); | |
}); | |
true ? MenuItem.propTypes = { | |
children: import_prop_types68.default.node, | |
classes: import_prop_types68.default.object.isRequired, | |
className: import_prop_types68.default.string, | |
component: import_prop_types68.default.elementType, | |
dense: import_prop_types68.default.bool, | |
disabled: import_prop_types68.default.bool, | |
disableGutters: import_prop_types68.default.bool, | |
ListItemClasses: import_prop_types68.default.object, | |
role: import_prop_types68.default.string, | |
selected: import_prop_types68.default.bool, | |
tabIndex: import_prop_types68.default.number | |
} : void 0; | |
var MenuItem_default = withStyles_default(styles98, { | |
name: "MuiMenuItem" | |
})(MenuItem); | |
// node_modules/@material-ui/core/esm/MobileStepper/MobileStepper.js | |
var React80 = __toModule(require_react()); | |
var import_prop_types69 = __toModule(require_prop_types()); | |
var styles100 = function styles101(theme) { | |
return { | |
root: { | |
display: "flex", | |
flexDirection: "row", | |
justifyContent: "space-between", | |
alignItems: "center", | |
background: theme.palette.background.default, | |
padding: 8 | |
}, | |
positionBottom: { | |
position: "fixed", | |
bottom: 0, | |
left: 0, | |
right: 0, | |
zIndex: theme.zIndex.mobileStepper | |
}, | |
positionTop: { | |
position: "fixed", | |
top: 0, | |
left: 0, | |
right: 0, | |
zIndex: theme.zIndex.mobileStepper | |
}, | |
positionStatic: {}, | |
dots: { | |
display: "flex", | |
flexDirection: "row" | |
}, | |
dot: { | |
backgroundColor: theme.palette.action.disabled, | |
borderRadius: "50%", | |
width: 8, | |
height: 8, | |
margin: "0 2px" | |
}, | |
dotActive: { | |
backgroundColor: theme.palette.primary.main | |
}, | |
progress: { | |
width: "50%" | |
} | |
}; | |
}; | |
var MobileStepper = React80.forwardRef(function MobileStepper2(props, ref) { | |
var _props$activeStep = props.activeStep, activeStep = _props$activeStep === void 0 ? 0 : _props$activeStep, backButton = props.backButton, classes = props.classes, className = props.className, LinearProgressProps = props.LinearProgressProps, nextButton = props.nextButton, _props$position = props.position, position = _props$position === void 0 ? "bottom" : _props$position, steps = props.steps, _props$variant = props.variant, variant = _props$variant === void 0 ? "dots" : _props$variant, other = _objectWithoutProperties(props, ["activeStep", "backButton", "classes", "className", "LinearProgressProps", "nextButton", "position", "steps", "variant"]); | |
return React80.createElement(Paper_default, _extends({ | |
square: true, | |
elevation: 0, | |
className: clsx_m_default(classes.root, classes["position".concat(capitalize(position))], className), | |
ref | |
}, other), backButton, variant === "text" && React80.createElement(React80.Fragment, null, activeStep + 1, " / ", steps), variant === "dots" && React80.createElement("div", { | |
className: classes.dots | |
}, _toConsumableArray(new Array(steps)).map(function(_, index) { | |
return React80.createElement("div", { | |
key: index, | |
className: clsx_m_default(classes.dot, index === activeStep && classes.dotActive) | |
}); | |
})), variant === "progress" && React80.createElement(LinearProgress_default, _extends({ | |
className: classes.progress, | |
variant: "determinate", | |
value: Math.ceil(activeStep / (steps - 1) * 100) | |
}, LinearProgressProps)), nextButton); | |
}); | |
true ? MobileStepper.propTypes = { | |
activeStep: import_prop_types69.default.number, | |
backButton: import_prop_types69.default.node, | |
classes: import_prop_types69.default.object, | |
className: import_prop_types69.default.string, | |
LinearProgressProps: import_prop_types69.default.object, | |
nextButton: import_prop_types69.default.node, | |
position: import_prop_types69.default.oneOf(["bottom", "static", "top"]), | |
steps: import_prop_types69.default.number.isRequired, | |
variant: import_prop_types69.default.oneOf(["dots", "progress", "text"]) | |
} : void 0; | |
var MobileStepper_default = withStyles_default(styles100, { | |
name: "MuiMobileStepper" | |
})(MobileStepper); | |
// node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js | |
var React83 = __toModule(require_react()); | |
var import_prop_types71 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/NativeSelect/NativeSelectInput.js | |
var React81 = __toModule(require_react()); | |
var import_prop_types70 = __toModule(require_prop_types()); | |
var NativeSelectInput = React81.forwardRef(function NativeSelectInput2(props, ref) { | |
var classes = props.classes, className = props.className, disabled = props.disabled, IconComponent = props.IconComponent, inputRef = props.inputRef, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["classes", "className", "disabled", "IconComponent", "inputRef", "variant"]); | |
return React81.createElement(React81.Fragment, null, React81.createElement("select", _extends({ | |
className: clsx_m_default(classes.root, classes.select, classes[variant], className, disabled && classes.disabled), | |
disabled, | |
ref: inputRef || ref | |
}, other)), props.multiple ? null : React81.createElement(IconComponent, { | |
className: clsx_m_default(classes.icon, classes["icon".concat(capitalize(variant))], disabled && classes.disabled) | |
})); | |
}); | |
true ? NativeSelectInput.propTypes = { | |
children: import_prop_types70.default.node, | |
classes: import_prop_types70.default.object.isRequired, | |
className: import_prop_types70.default.string, | |
disabled: import_prop_types70.default.bool, | |
IconComponent: import_prop_types70.default.elementType.isRequired, | |
inputRef: refType_default, | |
multiple: import_prop_types70.default.bool, | |
name: import_prop_types70.default.string, | |
onChange: import_prop_types70.default.func, | |
value: import_prop_types70.default.any, | |
variant: import_prop_types70.default.oneOf(["standard", "outlined", "filled"]) | |
} : void 0; | |
var NativeSelectInput_default = NativeSelectInput; | |
// node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDropDown.js | |
var React82 = __toModule(require_react()); | |
var ArrowDropDown_default = createSvgIcon(React82.createElement("path", { | |
d: "M7 10l5 5 5-5z" | |
}), "ArrowDropDown"); | |
// node_modules/@material-ui/core/esm/NativeSelect/NativeSelect.js | |
var styles102 = function styles103(theme) { | |
return { | |
root: {}, | |
select: { | |
"-moz-appearance": "none", | |
"-webkit-appearance": "none", | |
userSelect: "none", | |
borderRadius: 0, | |
minWidth: 16, | |
cursor: "pointer", | |
"&:focus": { | |
backgroundColor: theme.palette.type === "light" ? "rgba(0, 0, 0, 0.05)" : "rgba(255, 255, 255, 0.05)", | |
borderRadius: 0 | |
}, | |
"&::-ms-expand": { | |
display: "none" | |
}, | |
"&$disabled": { | |
cursor: "default" | |
}, | |
"&[multiple]": { | |
height: "auto" | |
}, | |
"&:not([multiple]) option, &:not([multiple]) optgroup": { | |
backgroundColor: theme.palette.background.paper | |
}, | |
"&&": { | |
paddingRight: 24 | |
} | |
}, | |
filled: { | |
"&&": { | |
paddingRight: 32 | |
} | |
}, | |
outlined: { | |
borderRadius: theme.shape.borderRadius, | |
"&&": { | |
paddingRight: 32 | |
} | |
}, | |
selectMenu: { | |
height: "auto", | |
minHeight: "1.1876em", | |
textOverflow: "ellipsis", | |
whiteSpace: "nowrap", | |
overflow: "hidden" | |
}, | |
disabled: {}, | |
icon: { | |
position: "absolute", | |
right: 0, | |
top: "calc(50% - 12px)", | |
pointerEvents: "none", | |
color: theme.palette.action.active, | |
"&$disabled": { | |
color: theme.palette.action.disabled | |
} | |
}, | |
iconOpen: { | |
transform: "rotate(180deg)" | |
}, | |
iconFilled: { | |
right: 7 | |
}, | |
iconOutlined: { | |
right: 7 | |
}, | |
nativeInput: { | |
bottom: 0, | |
left: 0, | |
position: "absolute", | |
opacity: 0, | |
pointerEvents: "none", | |
width: "100%" | |
} | |
}; | |
}; | |
var defaultInput = React83.createElement(Input_default, null); | |
var NativeSelect = React83.forwardRef(function NativeSelect2(props, ref) { | |
var children = props.children, classes = props.classes, _props$IconComponent = props.IconComponent, IconComponent = _props$IconComponent === void 0 ? ArrowDropDown_default : _props$IconComponent, _props$input = props.input, input = _props$input === void 0 ? defaultInput : _props$input, inputProps = props.inputProps, variant = props.variant, other = _objectWithoutProperties(props, ["children", "classes", "IconComponent", "input", "inputProps", "variant"]); | |
var muiFormControl = useFormControl2(); | |
var fcs = formControlState({ | |
props, | |
muiFormControl, | |
states: ["variant"] | |
}); | |
return React83.cloneElement(input, _extends({ | |
inputComponent: NativeSelectInput_default, | |
inputProps: _extends({ | |
children, | |
classes, | |
IconComponent, | |
variant: fcs.variant, | |
type: void 0 | |
}, inputProps, input ? input.props.inputProps : {}), | |
ref | |
}, other)); | |
}); | |
true ? NativeSelect.propTypes = { | |
children: import_prop_types71.default.node, | |
classes: import_prop_types71.default.object, | |
IconComponent: import_prop_types71.default.elementType, | |
input: import_prop_types71.default.element, | |
inputProps: import_prop_types71.default.object, | |
onChange: import_prop_types71.default.func, | |
value: import_prop_types71.default.any, | |
variant: import_prop_types71.default.oneOf(["filled", "outlined", "standard"]) | |
} : void 0; | |
NativeSelect.muiName = "Select"; | |
var NativeSelect_default = withStyles_default(styles102, { | |
name: "MuiNativeSelect" | |
})(NativeSelect); | |
// node_modules/@material-ui/core/esm/NoSsr/NoSsr.js | |
var React84 = __toModule(require_react()); | |
var import_prop_types72 = __toModule(require_prop_types()); | |
var useEnhancedEffect6 = typeof window !== "undefined" && true ? React84.useLayoutEffect : React84.useEffect; | |
function NoSsr(props) { | |
var children = props.children, _props$defer = props.defer, defer = _props$defer === void 0 ? false : _props$defer, _props$fallback = props.fallback, fallback = _props$fallback === void 0 ? null : _props$fallback; | |
var _React$useState = React84.useState(false), mountedState = _React$useState[0], setMountedState = _React$useState[1]; | |
useEnhancedEffect6(function() { | |
if (!defer) { | |
setMountedState(true); | |
} | |
}, [defer]); | |
React84.useEffect(function() { | |
if (defer) { | |
setMountedState(true); | |
} | |
}, [defer]); | |
return React84.createElement(React84.Fragment, null, mountedState ? children : fallback); | |
} | |
true ? NoSsr.propTypes = { | |
children: import_prop_types72.default.node, | |
defer: import_prop_types72.default.bool, | |
fallback: import_prop_types72.default.node | |
} : void 0; | |
if (true) { | |
NoSsr["propTypes"] = exactProp(NoSsr.propTypes); | |
} | |
var NoSsr_default = NoSsr; | |
// node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js | |
var React86 = __toModule(require_react()); | |
var import_prop_types74 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/OutlinedInput/NotchedOutline.js | |
var React85 = __toModule(require_react()); | |
var import_prop_types73 = __toModule(require_prop_types()); | |
var styles104 = function styles105(theme) { | |
return { | |
root: { | |
position: "absolute", | |
bottom: 0, | |
right: 0, | |
top: -5, | |
left: 0, | |
margin: 0, | |
padding: "0 8px", | |
pointerEvents: "none", | |
borderRadius: "inherit", | |
borderStyle: "solid", | |
borderWidth: 1, | |
overflow: "hidden" | |
}, | |
legend: { | |
textAlign: "left", | |
padding: 0, | |
lineHeight: "11px", | |
transition: theme.transitions.create("width", { | |
duration: 150, | |
easing: theme.transitions.easing.easeOut | |
}) | |
}, | |
legendLabelled: { | |
display: "block", | |
width: "auto", | |
textAlign: "left", | |
padding: 0, | |
height: 11, | |
fontSize: "0.75em", | |
visibility: "hidden", | |
maxWidth: 0.01, | |
transition: theme.transitions.create("max-width", { | |
duration: 50, | |
easing: theme.transitions.easing.easeOut | |
}), | |
"& > span": { | |
paddingLeft: 5, | |
paddingRight: 5, | |
display: "inline-block" | |
} | |
}, | |
legendNotched: { | |
maxWidth: 1e3, | |
transition: theme.transitions.create("max-width", { | |
duration: 100, | |
easing: theme.transitions.easing.easeOut, | |
delay: 50 | |
}) | |
} | |
}; | |
}; | |
var NotchedOutline = React85.forwardRef(function NotchedOutline2(props, ref) { | |
var children = props.children, classes = props.classes, className = props.className, label = props.label, labelWidthProp = props.labelWidth, notched = props.notched, style = props.style, other = _objectWithoutProperties(props, ["children", "classes", "className", "label", "labelWidth", "notched", "style"]); | |
var theme = useTheme(); | |
var align = theme.direction === "rtl" ? "right" : "left"; | |
if (label !== void 0) { | |
return React85.createElement("fieldset", _extends({ | |
"aria-hidden": true, | |
className: clsx_m_default(classes.root, className), | |
ref, | |
style | |
}, other), React85.createElement("legend", { | |
className: clsx_m_default(classes.legendLabelled, notched && classes.legendNotched) | |
}, label ? React85.createElement("span", null, label) : React85.createElement("span", { | |
dangerouslySetInnerHTML: { | |
__html: "​" | |
} | |
}))); | |
} | |
var labelWidth = labelWidthProp > 0 ? labelWidthProp * 0.75 + 8 : 0.01; | |
return React85.createElement("fieldset", _extends({ | |
"aria-hidden": true, | |
style: _extends(_defineProperty({}, "padding".concat(capitalize(align)), 8), style), | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other), React85.createElement("legend", { | |
className: classes.legend, | |
style: { | |
width: notched ? labelWidth : 0.01 | |
} | |
}, React85.createElement("span", { | |
dangerouslySetInnerHTML: { | |
__html: "​" | |
} | |
}))); | |
}); | |
true ? NotchedOutline.propTypes = { | |
children: import_prop_types73.default.node, | |
classes: import_prop_types73.default.object, | |
className: import_prop_types73.default.string, | |
label: import_prop_types73.default.node, | |
labelWidth: import_prop_types73.default.number.isRequired, | |
notched: import_prop_types73.default.bool.isRequired, | |
style: import_prop_types73.default.object | |
} : void 0; | |
var NotchedOutline_default = withStyles_default(styles104, { | |
name: "PrivateNotchedOutline" | |
})(NotchedOutline); | |
// node_modules/@material-ui/core/esm/OutlinedInput/OutlinedInput.js | |
var styles106 = function styles107(theme) { | |
var borderColor = theme.palette.type === "light" ? "rgba(0, 0, 0, 0.23)" : "rgba(255, 255, 255, 0.23)"; | |
return { | |
root: { | |
position: "relative", | |
borderRadius: theme.shape.borderRadius, | |
"&:hover $notchedOutline": { | |
borderColor: theme.palette.text.primary | |
}, | |
"@media (hover: none)": { | |
"&:hover $notchedOutline": { | |
borderColor | |
} | |
}, | |
"&$focused $notchedOutline": { | |
borderColor: theme.palette.primary.main, | |
borderWidth: 2 | |
}, | |
"&$error $notchedOutline": { | |
borderColor: theme.palette.error.main | |
}, | |
"&$disabled $notchedOutline": { | |
borderColor: theme.palette.action.disabled | |
} | |
}, | |
colorSecondary: { | |
"&$focused $notchedOutline": { | |
borderColor: theme.palette.secondary.main | |
} | |
}, | |
focused: {}, | |
disabled: {}, | |
adornedStart: { | |
paddingLeft: 14 | |
}, | |
adornedEnd: { | |
paddingRight: 14 | |
}, | |
error: {}, | |
marginDense: {}, | |
multiline: { | |
padding: "18.5px 14px", | |
"&$marginDense": { | |
paddingTop: 10.5, | |
paddingBottom: 10.5 | |
} | |
}, | |
notchedOutline: { | |
borderColor | |
}, | |
input: { | |
padding: "18.5px 14px", | |
"&:-webkit-autofill": { | |
WebkitBoxShadow: theme.palette.type === "light" ? null : "0 0 0 100px #266798 inset", | |
WebkitTextFillColor: theme.palette.type === "light" ? null : "#fff", | |
caretColor: theme.palette.type === "light" ? null : "#fff", | |
borderRadius: "inherit" | |
} | |
}, | |
inputMarginDense: { | |
paddingTop: 10.5, | |
paddingBottom: 10.5 | |
}, | |
inputMultiline: { | |
padding: 0 | |
}, | |
inputAdornedStart: { | |
paddingLeft: 0 | |
}, | |
inputAdornedEnd: { | |
paddingRight: 0 | |
} | |
}; | |
}; | |
var OutlinedInput = React86.forwardRef(function OutlinedInput2(props, ref) { | |
var classes = props.classes, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, _props$inputComponent = props.inputComponent, inputComponent = _props$inputComponent === void 0 ? "input" : _props$inputComponent, label = props.label, _props$labelWidth = props.labelWidth, labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, notched = props.notched, _props$type = props.type, type = _props$type === void 0 ? "text" : _props$type, other = _objectWithoutProperties(props, ["classes", "fullWidth", "inputComponent", "label", "labelWidth", "multiline", "notched", "type"]); | |
return React86.createElement(InputBase_default, _extends({ | |
renderSuffix: function renderSuffix(state) { | |
return React86.createElement(NotchedOutline_default, { | |
className: classes.notchedOutline, | |
label, | |
labelWidth, | |
notched: typeof notched !== "undefined" ? notched : Boolean(state.startAdornment || state.filled || state.focused) | |
}); | |
}, | |
classes: _extends({}, classes, { | |
root: clsx_m_default(classes.root, classes.underline), | |
notchedOutline: null | |
}), | |
fullWidth, | |
inputComponent, | |
multiline, | |
ref, | |
type | |
}, other)); | |
}); | |
true ? OutlinedInput.propTypes = { | |
autoComplete: import_prop_types74.default.string, | |
autoFocus: import_prop_types74.default.bool, | |
classes: import_prop_types74.default.object, | |
color: import_prop_types74.default.oneOf(["primary", "secondary"]), | |
defaultValue: import_prop_types74.default.any, | |
disabled: import_prop_types74.default.bool, | |
endAdornment: import_prop_types74.default.node, | |
error: import_prop_types74.default.bool, | |
fullWidth: import_prop_types74.default.bool, | |
id: import_prop_types74.default.string, | |
inputComponent: import_prop_types74.default.elementType, | |
inputProps: import_prop_types74.default.object, | |
inputRef: refType_default, | |
label: import_prop_types74.default.node, | |
labelWidth: import_prop_types74.default.number, | |
margin: import_prop_types74.default.oneOf(["dense", "none"]), | |
multiline: import_prop_types74.default.bool, | |
name: import_prop_types74.default.string, | |
notched: import_prop_types74.default.bool, | |
onChange: import_prop_types74.default.func, | |
placeholder: import_prop_types74.default.string, | |
readOnly: import_prop_types74.default.bool, | |
required: import_prop_types74.default.bool, | |
rows: import_prop_types74.default.oneOfType([import_prop_types74.default.number, import_prop_types74.default.string]), | |
rowsMax: import_prop_types74.default.oneOfType([import_prop_types74.default.number, import_prop_types74.default.string]), | |
startAdornment: import_prop_types74.default.node, | |
type: import_prop_types74.default.string, | |
value: import_prop_types74.default.any | |
} : void 0; | |
OutlinedInput.muiName = "Input"; | |
var OutlinedInput_default = withStyles_default(styles106, { | |
name: "MuiOutlinedInput" | |
})(OutlinedInput); | |
// node_modules/@material-ui/core/esm/Radio/Radio.js | |
var React92 = __toModule(require_react()); | |
var import_prop_types76 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Radio/RadioButtonIcon.js | |
var React89 = __toModule(require_react()); | |
var import_prop_types75 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/RadioButtonUnchecked.js | |
var React87 = __toModule(require_react()); | |
var RadioButtonUnchecked_default = createSvgIcon(React87.createElement("path", { | |
d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z" | |
}), "RadioButtonUnchecked"); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/RadioButtonChecked.js | |
var React88 = __toModule(require_react()); | |
var RadioButtonChecked_default = createSvgIcon(React88.createElement("path", { | |
d: "M8.465 8.465C9.37 7.56 10.62 7 12 7C14.76 7 17 9.24 17 12C17 13.38 16.44 14.63 15.535 15.535C14.63 16.44 13.38 17 12 17C9.24 17 7 14.76 7 12C7 10.62 7.56 9.37 8.465 8.465Z" | |
}), "RadioButtonChecked"); | |
// node_modules/@material-ui/core/esm/Radio/RadioButtonIcon.js | |
var styles108 = function styles109(theme) { | |
return { | |
root: { | |
position: "relative", | |
display: "flex", | |
"&$checked $layer": { | |
transform: "scale(1)", | |
transition: theme.transitions.create("transform", { | |
easing: theme.transitions.easing.easeOut, | |
duration: theme.transitions.duration.shortest | |
}) | |
} | |
}, | |
layer: { | |
left: 0, | |
position: "absolute", | |
transform: "scale(0)", | |
transition: theme.transitions.create("transform", { | |
easing: theme.transitions.easing.easeIn, | |
duration: theme.transitions.duration.shortest | |
}) | |
}, | |
checked: {} | |
}; | |
}; | |
function RadioButtonIcon(props) { | |
var checked = props.checked, classes = props.classes, fontSize = props.fontSize; | |
return React89.createElement("div", { | |
className: clsx_m_default(classes.root, checked && classes.checked) | |
}, React89.createElement(RadioButtonUnchecked_default, { | |
fontSize | |
}), React89.createElement(RadioButtonChecked_default, { | |
fontSize, | |
className: classes.layer | |
})); | |
} | |
true ? RadioButtonIcon.propTypes = { | |
checked: import_prop_types75.default.bool, | |
classes: import_prop_types75.default.object.isRequired, | |
fontSize: import_prop_types75.default.oneOf(["small", "default"]) | |
} : void 0; | |
var RadioButtonIcon_default = withStyles_default(styles108, { | |
name: "PrivateRadioButtonIcon" | |
})(RadioButtonIcon); | |
// node_modules/@material-ui/core/esm/RadioGroup/useRadioGroup.js | |
var React91 = __toModule(require_react()); | |
// node_modules/@material-ui/core/esm/RadioGroup/RadioGroupContext.js | |
var React90 = __toModule(require_react()); | |
var RadioGroupContext = React90.createContext(); | |
if (true) { | |
RadioGroupContext.displayName = "RadioGroupContext"; | |
} | |
var RadioGroupContext_default = RadioGroupContext; | |
// node_modules/@material-ui/core/esm/RadioGroup/useRadioGroup.js | |
function useRadioGroup() { | |
return React91.useContext(RadioGroupContext_default); | |
} | |
// node_modules/@material-ui/core/esm/Radio/Radio.js | |
var styles110 = function styles111(theme) { | |
return { | |
root: { | |
color: theme.palette.text.secondary | |
}, | |
checked: {}, | |
disabled: {}, | |
colorPrimary: { | |
"&$checked": { | |
color: theme.palette.primary.main, | |
"&:hover": { | |
backgroundColor: fade(theme.palette.primary.main, theme.palette.action.hoverOpacity), | |
"@media (hover: none)": { | |
backgroundColor: "transparent" | |
} | |
} | |
}, | |
"&$disabled": { | |
color: theme.palette.action.disabled | |
} | |
}, | |
colorSecondary: { | |
"&$checked": { | |
color: theme.palette.secondary.main, | |
"&:hover": { | |
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity), | |
"@media (hover: none)": { | |
backgroundColor: "transparent" | |
} | |
} | |
}, | |
"&$disabled": { | |
color: theme.palette.action.disabled | |
} | |
} | |
}; | |
}; | |
var defaultCheckedIcon2 = React92.createElement(RadioButtonIcon_default, { | |
checked: true | |
}); | |
var defaultIcon2 = React92.createElement(RadioButtonIcon_default, null); | |
var Radio = React92.forwardRef(function Radio2(props, ref) { | |
var checkedProp = props.checked, classes = props.classes, _props$color = props.color, color = _props$color === void 0 ? "secondary" : _props$color, nameProp = props.name, onChangeProp = props.onChange, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, other = _objectWithoutProperties(props, ["checked", "classes", "color", "name", "onChange", "size"]); | |
var radioGroup = useRadioGroup(); | |
var checked = checkedProp; | |
var onChange = createChainedFunction(onChangeProp, radioGroup && radioGroup.onChange); | |
var name = nameProp; | |
if (radioGroup) { | |
if (typeof checked === "undefined") { | |
checked = radioGroup.value === props.value; | |
} | |
if (typeof name === "undefined") { | |
name = radioGroup.name; | |
} | |
} | |
return React92.createElement(SwitchBase_default, _extends({ | |
color, | |
type: "radio", | |
icon: React92.cloneElement(defaultIcon2, { | |
fontSize: size === "small" ? "small" : "default" | |
}), | |
checkedIcon: React92.cloneElement(defaultCheckedIcon2, { | |
fontSize: size === "small" ? "small" : "default" | |
}), | |
classes: { | |
root: clsx_m_default(classes.root, classes["color".concat(capitalize(color))]), | |
checked: classes.checked, | |
disabled: classes.disabled | |
}, | |
name, | |
checked, | |
onChange, | |
ref | |
}, other)); | |
}); | |
true ? Radio.propTypes = { | |
checked: import_prop_types76.default.bool, | |
checkedIcon: import_prop_types76.default.node, | |
classes: import_prop_types76.default.object, | |
color: import_prop_types76.default.oneOf(["default", "primary", "secondary"]), | |
disabled: import_prop_types76.default.bool, | |
disableRipple: import_prop_types76.default.bool, | |
icon: import_prop_types76.default.node, | |
id: import_prop_types76.default.string, | |
inputProps: import_prop_types76.default.object, | |
inputRef: refType_default, | |
name: import_prop_types76.default.string, | |
onChange: import_prop_types76.default.func, | |
required: import_prop_types76.default.bool, | |
size: import_prop_types76.default.oneOf(["medium", "small"]), | |
value: import_prop_types76.default.any | |
} : void 0; | |
var Radio_default = withStyles_default(styles110, { | |
name: "MuiRadio" | |
})(Radio); | |
// node_modules/@material-ui/core/esm/RadioGroup/RadioGroup.js | |
var React93 = __toModule(require_react()); | |
var import_prop_types77 = __toModule(require_prop_types()); | |
var RadioGroup = React93.forwardRef(function RadioGroup2(props, ref) { | |
var actions = props.actions, children = props.children, nameProp = props.name, valueProp = props.value, onChange = props.onChange, other = _objectWithoutProperties(props, ["actions", "children", "name", "value", "onChange"]); | |
var rootRef = React93.useRef(null); | |
var _useControlled = useControlled({ | |
controlled: valueProp, | |
default: props.defaultValue, | |
name: "RadioGroup" | |
}), _useControlled2 = _slicedToArray(_useControlled, 2), value = _useControlled2[0], setValue = _useControlled2[1]; | |
React93.useImperativeHandle(actions, function() { | |
return { | |
focus: function focus() { | |
var input = rootRef.current.querySelector("input:not(:disabled):checked"); | |
if (!input) { | |
input = rootRef.current.querySelector("input:not(:disabled)"); | |
} | |
if (input) { | |
input.focus(); | |
} | |
} | |
}; | |
}, []); | |
var handleRef = useForkRef(ref, rootRef); | |
var handleChange = function handleChange2(event) { | |
setValue(event.target.value); | |
if (onChange) { | |
onChange(event, event.target.value); | |
} | |
}; | |
var name = useId(nameProp); | |
return React93.createElement(RadioGroupContext_default.Provider, { | |
value: { | |
name, | |
onChange: handleChange, | |
value | |
} | |
}, React93.createElement(FormGroup_default, _extends({ | |
role: "radiogroup", | |
ref: handleRef | |
}, other), children)); | |
}); | |
true ? RadioGroup.propTypes = { | |
children: import_prop_types77.default.node, | |
defaultValue: import_prop_types77.default.oneOfType([import_prop_types77.default.arrayOf(import_prop_types77.default.string), import_prop_types77.default.number, import_prop_types77.default.string]), | |
name: import_prop_types77.default.string, | |
onChange: import_prop_types77.default.func, | |
value: import_prop_types77.default.any | |
} : void 0; | |
var RadioGroup_default = RadioGroup; | |
// node_modules/@material-ui/core/esm/RootRef/RootRef.js | |
var React94 = __toModule(require_react()); | |
var ReactDOM7 = __toModule(require_react_dom()); | |
var import_prop_types78 = __toModule(require_prop_types()); | |
function _createSuper(Derived) { | |
var hasNativeReflectConstruct = _isNativeReflectConstruct(); | |
return function _createSuperInternal() { | |
var Super = _getPrototypeOf(Derived), result; | |
if (hasNativeReflectConstruct) { | |
var NewTarget = _getPrototypeOf(this).constructor; | |
result = Reflect.construct(Super, arguments, NewTarget); | |
} else { | |
result = Super.apply(this, arguments); | |
} | |
return _possibleConstructorReturn(this, result); | |
}; | |
} | |
function _isNativeReflectConstruct() { | |
if (typeof Reflect === "undefined" || !Reflect.construct) | |
return false; | |
if (Reflect.construct.sham) | |
return false; | |
if (typeof Proxy === "function") | |
return true; | |
try { | |
Date.prototype.toString.call(Reflect.construct(Date, [], function() { | |
})); | |
return true; | |
} catch (e) { | |
return false; | |
} | |
} | |
var RootRef = function(_React$Component) { | |
_inherits(RootRef2, _React$Component); | |
var _super = _createSuper(RootRef2); | |
function RootRef2() { | |
_classCallCheck(this, RootRef2); | |
return _super.apply(this, arguments); | |
} | |
_createClass(RootRef2, [{ | |
key: "componentDidMount", | |
value: function componentDidMount() { | |
this.ref = ReactDOM7.findDOMNode(this); | |
setRef(this.props.rootRef, this.ref); | |
} | |
}, { | |
key: "componentDidUpdate", | |
value: function componentDidUpdate(prevProps) { | |
var ref = ReactDOM7.findDOMNode(this); | |
if (prevProps.rootRef !== this.props.rootRef || this.ref !== ref) { | |
if (prevProps.rootRef !== this.props.rootRef) { | |
setRef(prevProps.rootRef, null); | |
} | |
this.ref = ref; | |
setRef(this.props.rootRef, this.ref); | |
} | |
} | |
}, { | |
key: "componentWillUnmount", | |
value: function componentWillUnmount() { | |
this.ref = null; | |
setRef(this.props.rootRef, null); | |
} | |
}, { | |
key: "render", | |
value: function render() { | |
return this.props.children; | |
} | |
}]); | |
return RootRef2; | |
}(React94.Component); | |
true ? RootRef.propTypes = { | |
children: import_prop_types78.default.element.isRequired, | |
rootRef: refType_default.isRequired | |
} : void 0; | |
if (true) { | |
true ? RootRef.propTypes = exactProp(RootRef.propTypes) : void 0; | |
} | |
var RootRef_default = RootRef; | |
// node_modules/@material-ui/core/esm/Select/Select.js | |
var React96 = __toModule(require_react()); | |
var import_prop_types80 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Select/SelectInput.js | |
var React95 = __toModule(require_react()); | |
var import_react_is9 = __toModule(require_react_is()); | |
var import_prop_types79 = __toModule(require_prop_types()); | |
function areEqualValues(a, b) { | |
if (_typeof(b) === "object" && b !== null) { | |
return a === b; | |
} | |
return String(a) === String(b); | |
} | |
function isEmpty(display) { | |
return display == null || typeof display === "string" && !display.trim(); | |
} | |
var SelectInput = React95.forwardRef(function SelectInput2(props, ref) { | |
var ariaLabel = props["aria-label"], autoFocus = props.autoFocus, autoWidth = props.autoWidth, children = props.children, classes = props.classes, className = props.className, defaultValue = props.defaultValue, disabled = props.disabled, displayEmpty = props.displayEmpty, IconComponent = props.IconComponent, inputRefProp = props.inputRef, labelId = props.labelId, _props$MenuProps = props.MenuProps, MenuProps = _props$MenuProps === void 0 ? {} : _props$MenuProps, multiple = props.multiple, name = props.name, onBlur = props.onBlur, onChange = props.onChange, onClose = props.onClose, onFocus = props.onFocus, onOpen = props.onOpen, openProp = props.open, readOnly = props.readOnly, renderValue = props.renderValue, _props$SelectDisplayP = props.SelectDisplayProps, SelectDisplayProps = _props$SelectDisplayP === void 0 ? {} : _props$SelectDisplayP, tabIndexProp = props.tabIndex, type = props.type, valueProp = props.value, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["aria-label", "autoFocus", "autoWidth", "children", "classes", "className", "defaultValue", "disabled", "displayEmpty", "IconComponent", "inputRef", "labelId", "MenuProps", "multiple", "name", "onBlur", "onChange", "onClose", "onFocus", "onOpen", "open", "readOnly", "renderValue", "SelectDisplayProps", "tabIndex", "type", "value", "variant"]); | |
var _useControlled = useControlled({ | |
controlled: valueProp, | |
default: defaultValue, | |
name: "Select" | |
}), _useControlled2 = _slicedToArray(_useControlled, 2), value = _useControlled2[0], setValue = _useControlled2[1]; | |
var inputRef = React95.useRef(null); | |
var _React$useState = React95.useState(null), displayNode = _React$useState[0], setDisplayNode = _React$useState[1]; | |
var _React$useRef = React95.useRef(openProp != null), isOpenControlled = _React$useRef.current; | |
var _React$useState2 = React95.useState(), menuMinWidthState = _React$useState2[0], setMenuMinWidthState = _React$useState2[1]; | |
var _React$useState3 = React95.useState(false), openState = _React$useState3[0], setOpenState = _React$useState3[1]; | |
var handleRef = useForkRef(ref, inputRefProp); | |
React95.useImperativeHandle(handleRef, function() { | |
return { | |
focus: function focus() { | |
displayNode.focus(); | |
}, | |
node: inputRef.current, | |
value | |
}; | |
}, [displayNode, value]); | |
React95.useEffect(function() { | |
if (autoFocus && displayNode) { | |
displayNode.focus(); | |
} | |
}, [autoFocus, displayNode]); | |
React95.useEffect(function() { | |
if (displayNode) { | |
var label = ownerDocument(displayNode).getElementById(labelId); | |
if (label) { | |
var handler = function handler2() { | |
if (getSelection().isCollapsed) { | |
displayNode.focus(); | |
} | |
}; | |
label.addEventListener("click", handler); | |
return function() { | |
label.removeEventListener("click", handler); | |
}; | |
} | |
} | |
return void 0; | |
}, [labelId, displayNode]); | |
var update = function update2(open2, event) { | |
if (open2) { | |
if (onOpen) { | |
onOpen(event); | |
} | |
} else if (onClose) { | |
onClose(event); | |
} | |
if (!isOpenControlled) { | |
setMenuMinWidthState(autoWidth ? null : displayNode.clientWidth); | |
setOpenState(open2); | |
} | |
}; | |
var handleMouseDown = function handleMouseDown2(event) { | |
if (event.button !== 0) { | |
return; | |
} | |
event.preventDefault(); | |
displayNode.focus(); | |
update(true, event); | |
}; | |
var handleClose = function handleClose2(event) { | |
update(false, event); | |
}; | |
var childrenArray = React95.Children.toArray(children); | |
var handleChange = function handleChange2(event) { | |
var index = childrenArray.map(function(child2) { | |
return child2.props.value; | |
}).indexOf(event.target.value); | |
if (index === -1) { | |
return; | |
} | |
var child = childrenArray[index]; | |
setValue(child.props.value); | |
if (onChange) { | |
onChange(event, child); | |
} | |
}; | |
var handleItemClick = function handleItemClick2(child) { | |
return function(event) { | |
if (!multiple) { | |
update(false, event); | |
} | |
var newValue; | |
if (multiple) { | |
newValue = Array.isArray(value) ? value.slice() : []; | |
var itemIndex = value.indexOf(child.props.value); | |
if (itemIndex === -1) { | |
newValue.push(child.props.value); | |
} else { | |
newValue.splice(itemIndex, 1); | |
} | |
} else { | |
newValue = child.props.value; | |
} | |
if (child.props.onClick) { | |
child.props.onClick(event); | |
} | |
if (value === newValue) { | |
return; | |
} | |
setValue(newValue); | |
if (onChange) { | |
event.persist(); | |
Object.defineProperty(event, "target", { | |
writable: true, | |
value: { | |
value: newValue, | |
name | |
} | |
}); | |
onChange(event, child); | |
} | |
}; | |
}; | |
var handleKeyDown = function handleKeyDown2(event) { | |
if (!readOnly) { | |
var validKeys = [ | |
" ", | |
"ArrowUp", | |
"ArrowDown", | |
"Enter" | |
]; | |
if (validKeys.indexOf(event.key) !== -1) { | |
event.preventDefault(); | |
update(true, event); | |
} | |
} | |
}; | |
var open = displayNode !== null && (isOpenControlled ? openProp : openState); | |
var handleBlur = function handleBlur2(event) { | |
if (!open && onBlur) { | |
event.persist(); | |
Object.defineProperty(event, "target", { | |
writable: true, | |
value: { | |
value, | |
name | |
} | |
}); | |
onBlur(event); | |
} | |
}; | |
delete other["aria-invalid"]; | |
var display; | |
var displaySingle; | |
var displayMultiple = []; | |
var computeDisplay = false; | |
var foundMatch = false; | |
if (isFilled({ | |
value | |
}) || displayEmpty) { | |
if (renderValue) { | |
display = renderValue(value); | |
} else { | |
computeDisplay = true; | |
} | |
} | |
var items = childrenArray.map(function(child) { | |
if (!React95.isValidElement(child)) { | |
return null; | |
} | |
if (true) { | |
if (import_react_is9.isFragment(child)) { | |
console.error(["Material-UI: The Select component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n")); | |
} | |
} | |
var selected; | |
if (multiple) { | |
if (!Array.isArray(value)) { | |
throw new Error(true ? "Material-UI: The `value` prop must be an array when using the `Select` component with `multiple`." : formatMuiErrorMessage(2)); | |
} | |
selected = value.some(function(v) { | |
return areEqualValues(v, child.props.value); | |
}); | |
if (selected && computeDisplay) { | |
displayMultiple.push(child.props.children); | |
} | |
} else { | |
selected = areEqualValues(value, child.props.value); | |
if (selected && computeDisplay) { | |
displaySingle = child.props.children; | |
} | |
} | |
if (selected) { | |
foundMatch = true; | |
} | |
return React95.cloneElement(child, { | |
"aria-selected": selected ? "true" : void 0, | |
onClick: handleItemClick(child), | |
onKeyUp: function onKeyUp(event) { | |
if (event.key === " ") { | |
event.preventDefault(); | |
} | |
if (child.props.onKeyUp) { | |
child.props.onKeyUp(event); | |
} | |
}, | |
role: "option", | |
selected, | |
value: void 0, | |
"data-value": child.props.value | |
}); | |
}); | |
if (true) { | |
React95.useEffect(function() { | |
if (!foundMatch && !multiple && value !== "") { | |
var values = childrenArray.map(function(child) { | |
return child.props.value; | |
}); | |
console.warn(["Material-UI: You have provided an out-of-range value `".concat(value, "` for the select ").concat(name ? '(name="'.concat(name, '") ') : "", "component."), "Consider providing a value that matches one of the available options or ''.", "The available values are ".concat(values.filter(function(x) { | |
return x != null; | |
}).map(function(x) { | |
return "`".concat(x, "`"); | |
}).join(", ") || '""', ".")].join("\n")); | |
} | |
}, [foundMatch, childrenArray, multiple, name, value]); | |
} | |
if (computeDisplay) { | |
display = multiple ? displayMultiple.join(", ") : displaySingle; | |
} | |
var menuMinWidth = menuMinWidthState; | |
if (!autoWidth && isOpenControlled && displayNode) { | |
menuMinWidth = displayNode.clientWidth; | |
} | |
var tabIndex; | |
if (typeof tabIndexProp !== "undefined") { | |
tabIndex = tabIndexProp; | |
} else { | |
tabIndex = disabled ? null : 0; | |
} | |
var buttonId = SelectDisplayProps.id || (name ? "mui-component-select-".concat(name) : void 0); | |
return React95.createElement(React95.Fragment, null, React95.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, classes.select, classes.selectMenu, classes[variant], className, disabled && classes.disabled), | |
ref: setDisplayNode, | |
tabIndex, | |
role: "button", | |
"aria-disabled": disabled ? "true" : void 0, | |
"aria-expanded": open ? "true" : void 0, | |
"aria-haspopup": "listbox", | |
"aria-label": ariaLabel, | |
"aria-labelledby": [labelId, buttonId].filter(Boolean).join(" ") || void 0, | |
onKeyDown: handleKeyDown, | |
onMouseDown: disabled || readOnly ? null : handleMouseDown, | |
onBlur: handleBlur, | |
onFocus | |
}, SelectDisplayProps, { | |
id: buttonId | |
}), isEmpty(display) ? React95.createElement("span", { | |
dangerouslySetInnerHTML: { | |
__html: "​" | |
} | |
}) : display), React95.createElement("input", _extends({ | |
value: Array.isArray(value) ? value.join(",") : value, | |
name, | |
ref: inputRef, | |
"aria-hidden": true, | |
onChange: handleChange, | |
tabIndex: -1, | |
className: classes.nativeInput, | |
autoFocus | |
}, other)), React95.createElement(IconComponent, { | |
className: clsx_m_default(classes.icon, classes["icon".concat(capitalize(variant))], open && classes.iconOpen, disabled && classes.disabled) | |
}), React95.createElement(Menu_default, _extends({ | |
id: "menu-".concat(name || ""), | |
anchorEl: displayNode, | |
open, | |
onClose: handleClose | |
}, MenuProps, { | |
MenuListProps: _extends({ | |
"aria-labelledby": labelId, | |
role: "listbox", | |
disableListWrap: true | |
}, MenuProps.MenuListProps), | |
PaperProps: _extends({}, MenuProps.PaperProps, { | |
style: _extends({ | |
minWidth: menuMinWidth | |
}, MenuProps.PaperProps != null ? MenuProps.PaperProps.style : null) | |
}) | |
}), items)); | |
}); | |
true ? SelectInput.propTypes = { | |
"aria-label": import_prop_types79.default.string, | |
autoFocus: import_prop_types79.default.bool, | |
autoWidth: import_prop_types79.default.bool, | |
children: import_prop_types79.default.node, | |
classes: import_prop_types79.default.object.isRequired, | |
className: import_prop_types79.default.string, | |
defaultValue: import_prop_types79.default.any, | |
disabled: import_prop_types79.default.bool, | |
displayEmpty: import_prop_types79.default.bool, | |
IconComponent: import_prop_types79.default.elementType.isRequired, | |
inputRef: refType_default, | |
labelId: import_prop_types79.default.string, | |
MenuProps: import_prop_types79.default.object, | |
multiple: import_prop_types79.default.bool, | |
name: import_prop_types79.default.string, | |
onBlur: import_prop_types79.default.func, | |
onChange: import_prop_types79.default.func, | |
onClose: import_prop_types79.default.func, | |
onFocus: import_prop_types79.default.func, | |
onOpen: import_prop_types79.default.func, | |
open: import_prop_types79.default.bool, | |
readOnly: import_prop_types79.default.bool, | |
renderValue: import_prop_types79.default.func, | |
SelectDisplayProps: import_prop_types79.default.object, | |
tabIndex: import_prop_types79.default.oneOfType([import_prop_types79.default.number, import_prop_types79.default.string]), | |
type: import_prop_types79.default.any, | |
value: import_prop_types79.default.any, | |
variant: import_prop_types79.default.oneOf(["standard", "outlined", "filled"]) | |
} : void 0; | |
var SelectInput_default = SelectInput; | |
// node_modules/@material-ui/core/esm/Select/Select.js | |
var styles112 = styles102; | |
var _ref = React96.createElement(Input_default, null); | |
var _ref2 = React96.createElement(FilledInput_default, null); | |
var Select = React96.forwardRef(function Select2(props, ref) { | |
var _props$autoWidth = props.autoWidth, autoWidth = _props$autoWidth === void 0 ? false : _props$autoWidth, children = props.children, classes = props.classes, _props$displayEmpty = props.displayEmpty, displayEmpty = _props$displayEmpty === void 0 ? false : _props$displayEmpty, _props$IconComponent = props.IconComponent, IconComponent = _props$IconComponent === void 0 ? ArrowDropDown_default : _props$IconComponent, id = props.id, input = props.input, inputProps = props.inputProps, label = props.label, labelId = props.labelId, _props$labelWidth = props.labelWidth, labelWidth = _props$labelWidth === void 0 ? 0 : _props$labelWidth, MenuProps = props.MenuProps, _props$multiple = props.multiple, multiple = _props$multiple === void 0 ? false : _props$multiple, _props$native = props.native, native = _props$native === void 0 ? false : _props$native, onClose = props.onClose, onOpen = props.onOpen, open = props.open, renderValue = props.renderValue, SelectDisplayProps = props.SelectDisplayProps, _props$variant = props.variant, variantProps = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["autoWidth", "children", "classes", "displayEmpty", "IconComponent", "id", "input", "inputProps", "label", "labelId", "labelWidth", "MenuProps", "multiple", "native", "onClose", "onOpen", "open", "renderValue", "SelectDisplayProps", "variant"]); | |
var inputComponent = native ? NativeSelectInput_default : SelectInput_default; | |
var muiFormControl = useFormControl2(); | |
var fcs = formControlState({ | |
props, | |
muiFormControl, | |
states: ["variant"] | |
}); | |
var variant = fcs.variant || variantProps; | |
var InputComponent = input || { | |
standard: _ref, | |
outlined: React96.createElement(OutlinedInput_default, { | |
label, | |
labelWidth | |
}), | |
filled: _ref2 | |
}[variant]; | |
return React96.cloneElement(InputComponent, _extends({ | |
inputComponent, | |
inputProps: _extends({ | |
children, | |
IconComponent, | |
variant, | |
type: void 0, | |
multiple | |
}, native ? { | |
id | |
} : { | |
autoWidth, | |
displayEmpty, | |
labelId, | |
MenuProps, | |
onClose, | |
onOpen, | |
open, | |
renderValue, | |
SelectDisplayProps: _extends({ | |
id | |
}, SelectDisplayProps) | |
}, inputProps, { | |
classes: inputProps ? mergeClasses({ | |
baseClasses: classes, | |
newClasses: inputProps.classes, | |
Component: Select2 | |
}) : classes | |
}, input ? input.props.inputProps : {}), | |
ref | |
}, other)); | |
}); | |
true ? Select.propTypes = { | |
autoWidth: import_prop_types80.default.bool, | |
children: import_prop_types80.default.node, | |
classes: import_prop_types80.default.object, | |
defaultValue: import_prop_types80.default.any, | |
displayEmpty: import_prop_types80.default.bool, | |
IconComponent: import_prop_types80.default.elementType, | |
id: import_prop_types80.default.string, | |
input: import_prop_types80.default.element, | |
inputProps: import_prop_types80.default.object, | |
label: import_prop_types80.default.node, | |
labelId: import_prop_types80.default.string, | |
labelWidth: import_prop_types80.default.number, | |
MenuProps: import_prop_types80.default.object, | |
multiple: import_prop_types80.default.bool, | |
native: import_prop_types80.default.bool, | |
onChange: import_prop_types80.default.func, | |
onClose: import_prop_types80.default.func, | |
onOpen: import_prop_types80.default.func, | |
open: import_prop_types80.default.bool, | |
renderValue: import_prop_types80.default.func, | |
SelectDisplayProps: import_prop_types80.default.object, | |
value: import_prop_types80.default.any, | |
variant: import_prop_types80.default.oneOf(["filled", "outlined", "standard"]) | |
} : void 0; | |
Select.muiName = "Select"; | |
var Select_default = withStyles_default(styles112, { | |
name: "MuiSelect" | |
})(Select); | |
// node_modules/@material-ui/core/esm/Slider/Slider.js | |
var React98 = __toModule(require_react()); | |
var import_prop_types81 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Slider/ValueLabel.js | |
var React97 = __toModule(require_react()); | |
var styles113 = function styles114(theme) { | |
return { | |
thumb: { | |
"&$open": { | |
"& $offset": { | |
transform: "scale(1) translateY(-10px)" | |
} | |
} | |
}, | |
open: {}, | |
offset: _extends({ | |
zIndex: 1 | |
}, theme.typography.body2, { | |
fontSize: theme.typography.pxToRem(12), | |
lineHeight: 1.2, | |
transition: theme.transitions.create(["transform"], { | |
duration: theme.transitions.duration.shortest | |
}), | |
top: -34, | |
transformOrigin: "bottom center", | |
transform: "scale(0)", | |
position: "absolute" | |
}), | |
circle: { | |
display: "flex", | |
alignItems: "center", | |
justifyContent: "center", | |
width: 32, | |
height: 32, | |
borderRadius: "50% 50% 50% 0", | |
backgroundColor: "currentColor", | |
transform: "rotate(-45deg)" | |
}, | |
label: { | |
color: theme.palette.primary.contrastText, | |
transform: "rotate(45deg)" | |
} | |
}; | |
}; | |
function ValueLabel(props) { | |
var children = props.children, classes = props.classes, className = props.className, open = props.open, value = props.value, valueLabelDisplay = props.valueLabelDisplay; | |
if (valueLabelDisplay === "off") { | |
return children; | |
} | |
return React97.cloneElement(children, { | |
className: clsx_m_default(children.props.className, (open || valueLabelDisplay === "on") && classes.open, classes.thumb) | |
}, React97.createElement("span", { | |
className: clsx_m_default(classes.offset, className) | |
}, React97.createElement("span", { | |
className: classes.circle | |
}, React97.createElement("span", { | |
className: classes.label | |
}, value)))); | |
} | |
var ValueLabel_default = withStyles_default(styles113, { | |
name: "PrivateValueLabel" | |
})(ValueLabel); | |
// node_modules/@material-ui/core/esm/Slider/Slider.js | |
function asc(a, b) { | |
return a - b; | |
} | |
function clamp(value, min, max) { | |
return Math.min(Math.max(min, value), max); | |
} | |
function findClosest(values, currentValue) { | |
var _values$reduce = values.reduce(function(acc, value, index) { | |
var distance = Math.abs(currentValue - value); | |
if (acc === null || distance < acc.distance || distance === acc.distance) { | |
return { | |
distance, | |
index | |
}; | |
} | |
return acc; | |
}, null), closestIndex = _values$reduce.index; | |
return closestIndex; | |
} | |
function trackFinger(event, touchId) { | |
if (touchId.current !== void 0 && event.changedTouches) { | |
for (var i = 0; i < event.changedTouches.length; i += 1) { | |
var touch = event.changedTouches[i]; | |
if (touch.identifier === touchId.current) { | |
return { | |
x: touch.clientX, | |
y: touch.clientY | |
}; | |
} | |
} | |
return false; | |
} | |
return { | |
x: event.clientX, | |
y: event.clientY | |
}; | |
} | |
function valueToPercent(value, min, max) { | |
return (value - min) * 100 / (max - min); | |
} | |
function percentToValue(percent, min, max) { | |
return (max - min) * percent + min; | |
} | |
function getDecimalPrecision(num) { | |
if (Math.abs(num) < 1) { | |
var parts = num.toExponential().split("e-"); | |
var matissaDecimalPart = parts[0].split(".")[1]; | |
return (matissaDecimalPart ? matissaDecimalPart.length : 0) + parseInt(parts[1], 10); | |
} | |
var decimalPart = num.toString().split(".")[1]; | |
return decimalPart ? decimalPart.length : 0; | |
} | |
function roundValueToStep(value, step, min) { | |
var nearest = Math.round((value - min) / step) * step + min; | |
return Number(nearest.toFixed(getDecimalPrecision(step))); | |
} | |
function setValueIndex(_ref5) { | |
var values = _ref5.values, source = _ref5.source, newValue = _ref5.newValue, index = _ref5.index; | |
if (values[index] === newValue) { | |
return source; | |
} | |
var output = values.slice(); | |
output[index] = newValue; | |
return output; | |
} | |
function focusThumb(_ref23) { | |
var sliderRef = _ref23.sliderRef, activeIndex = _ref23.activeIndex, setActive = _ref23.setActive; | |
if (!sliderRef.current.contains(document.activeElement) || Number(document.activeElement.getAttribute("data-index")) !== activeIndex) { | |
sliderRef.current.querySelector('[role="slider"][data-index="'.concat(activeIndex, '"]')).focus(); | |
} | |
if (setActive) { | |
setActive(activeIndex); | |
} | |
} | |
var axisProps = { | |
horizontal: { | |
offset: function offset(percent) { | |
return { | |
left: "".concat(percent, "%") | |
}; | |
}, | |
leap: function leap(percent) { | |
return { | |
width: "".concat(percent, "%") | |
}; | |
} | |
}, | |
"horizontal-reverse": { | |
offset: function offset2(percent) { | |
return { | |
right: "".concat(percent, "%") | |
}; | |
}, | |
leap: function leap2(percent) { | |
return { | |
width: "".concat(percent, "%") | |
}; | |
} | |
}, | |
vertical: { | |
offset: function offset3(percent) { | |
return { | |
bottom: "".concat(percent, "%") | |
}; | |
}, | |
leap: function leap3(percent) { | |
return { | |
height: "".concat(percent, "%") | |
}; | |
} | |
} | |
}; | |
var Identity = function Identity2(x) { | |
return x; | |
}; | |
var styles115 = function styles116(theme) { | |
return { | |
root: { | |
height: 2, | |
width: "100%", | |
boxSizing: "content-box", | |
padding: "13px 0", | |
display: "inline-block", | |
position: "relative", | |
cursor: "pointer", | |
touchAction: "none", | |
color: theme.palette.primary.main, | |
WebkitTapHighlightColor: "transparent", | |
"&$disabled": { | |
pointerEvents: "none", | |
cursor: "default", | |
color: theme.palette.grey[400] | |
}, | |
"&$vertical": { | |
width: 2, | |
height: "100%", | |
padding: "0 13px" | |
}, | |
"@media (pointer: coarse)": { | |
padding: "20px 0", | |
"&$vertical": { | |
padding: "0 20px" | |
} | |
}, | |
"@media print": { | |
colorAdjust: "exact" | |
} | |
}, | |
colorPrimary: {}, | |
colorSecondary: { | |
color: theme.palette.secondary.main | |
}, | |
marked: { | |
marginBottom: 20, | |
"&$vertical": { | |
marginBottom: "auto", | |
marginRight: 20 | |
} | |
}, | |
vertical: {}, | |
disabled: {}, | |
rail: { | |
display: "block", | |
position: "absolute", | |
width: "100%", | |
height: 2, | |
borderRadius: 1, | |
backgroundColor: "currentColor", | |
opacity: 0.38, | |
"$vertical &": { | |
height: "100%", | |
width: 2 | |
} | |
}, | |
track: { | |
display: "block", | |
position: "absolute", | |
height: 2, | |
borderRadius: 1, | |
backgroundColor: "currentColor", | |
"$vertical &": { | |
width: 2 | |
} | |
}, | |
trackFalse: { | |
"& $track": { | |
display: "none" | |
} | |
}, | |
trackInverted: { | |
"& $track": { | |
backgroundColor: theme.palette.type === "light" ? lighten(theme.palette.primary.main, 0.62) : darken(theme.palette.primary.main, 0.5) | |
}, | |
"& $rail": { | |
opacity: 1 | |
} | |
}, | |
thumb: { | |
position: "absolute", | |
width: 12, | |
height: 12, | |
marginLeft: -6, | |
marginTop: -5, | |
boxSizing: "border-box", | |
borderRadius: "50%", | |
outline: 0, | |
backgroundColor: "currentColor", | |
display: "flex", | |
alignItems: "center", | |
justifyContent: "center", | |
transition: theme.transitions.create(["box-shadow"], { | |
duration: theme.transitions.duration.shortest | |
}), | |
"&::after": { | |
position: "absolute", | |
content: '""', | |
borderRadius: "50%", | |
left: -15, | |
top: -15, | |
right: -15, | |
bottom: -15 | |
}, | |
"&$focusVisible,&:hover": { | |
boxShadow: "0px 0px 0px 8px ".concat(fade(theme.palette.primary.main, 0.16)), | |
"@media (hover: none)": { | |
boxShadow: "none" | |
} | |
}, | |
"&$active": { | |
boxShadow: "0px 0px 0px 14px ".concat(fade(theme.palette.primary.main, 0.16)) | |
}, | |
"&$disabled": { | |
width: 8, | |
height: 8, | |
marginLeft: -4, | |
marginTop: -3, | |
"&:hover": { | |
boxShadow: "none" | |
} | |
}, | |
"$vertical &": { | |
marginLeft: -5, | |
marginBottom: -6 | |
}, | |
"$vertical &$disabled": { | |
marginLeft: -3, | |
marginBottom: -4 | |
} | |
}, | |
thumbColorPrimary: {}, | |
thumbColorSecondary: { | |
"&$focusVisible,&:hover": { | |
boxShadow: "0px 0px 0px 8px ".concat(fade(theme.palette.secondary.main, 0.16)) | |
}, | |
"&$active": { | |
boxShadow: "0px 0px 0px 14px ".concat(fade(theme.palette.secondary.main, 0.16)) | |
} | |
}, | |
active: {}, | |
focusVisible: {}, | |
valueLabel: { | |
left: "calc(-50% - 4px)" | |
}, | |
mark: { | |
position: "absolute", | |
width: 2, | |
height: 2, | |
borderRadius: 1, | |
backgroundColor: "currentColor" | |
}, | |
markActive: { | |
backgroundColor: theme.palette.background.paper, | |
opacity: 0.8 | |
}, | |
markLabel: _extends({}, theme.typography.body2, { | |
color: theme.palette.text.secondary, | |
position: "absolute", | |
top: 26, | |
transform: "translateX(-50%)", | |
whiteSpace: "nowrap", | |
"$vertical &": { | |
top: "auto", | |
left: 26, | |
transform: "translateY(50%)" | |
}, | |
"@media (pointer: coarse)": { | |
top: 40, | |
"$vertical &": { | |
left: 31 | |
} | |
} | |
}), | |
markLabelActive: { | |
color: theme.palette.text.primary | |
} | |
}; | |
}; | |
var Slider = React98.forwardRef(function Slider2(props, ref) { | |
var ariaLabel = props["aria-label"], ariaLabelledby = props["aria-labelledby"], ariaValuetext = props["aria-valuetext"], classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, _props$component = props.component, Component3 = _props$component === void 0 ? "span" : _props$component, defaultValue = props.defaultValue, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, getAriaLabel = props.getAriaLabel, getAriaValueText = props.getAriaValueText, _props$marks = props.marks, marksProp = _props$marks === void 0 ? false : _props$marks, _props$max = props.max, max = _props$max === void 0 ? 100 : _props$max, _props$min = props.min, min = _props$min === void 0 ? 0 : _props$min, name = props.name, onChange = props.onChange, onChangeCommitted = props.onChangeCommitted, onMouseDown = props.onMouseDown, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, _props$scale = props.scale, scale = _props$scale === void 0 ? Identity : _props$scale, _props$step = props.step, step = _props$step === void 0 ? 1 : _props$step, _props$ThumbComponent = props.ThumbComponent, ThumbComponent = _props$ThumbComponent === void 0 ? "span" : _props$ThumbComponent, _props$track = props.track, track = _props$track === void 0 ? "normal" : _props$track, valueProp = props.value, _props$ValueLabelComp = props.ValueLabelComponent, ValueLabelComponent = _props$ValueLabelComp === void 0 ? ValueLabel_default : _props$ValueLabelComp, _props$valueLabelDisp = props.valueLabelDisplay, valueLabelDisplay = _props$valueLabelDisp === void 0 ? "off" : _props$valueLabelDisp, _props$valueLabelForm = props.valueLabelFormat, valueLabelFormat = _props$valueLabelForm === void 0 ? Identity : _props$valueLabelForm, other = _objectWithoutProperties(props, ["aria-label", "aria-labelledby", "aria-valuetext", "classes", "className", "color", "component", "defaultValue", "disabled", "getAriaLabel", "getAriaValueText", "marks", "max", "min", "name", "onChange", "onChangeCommitted", "onMouseDown", "orientation", "scale", "step", "ThumbComponent", "track", "value", "ValueLabelComponent", "valueLabelDisplay", "valueLabelFormat"]); | |
var theme = useTheme(); | |
var touchId = React98.useRef(); | |
var _React$useState = React98.useState(-1), active = _React$useState[0], setActive = _React$useState[1]; | |
var _React$useState2 = React98.useState(-1), open = _React$useState2[0], setOpen = _React$useState2[1]; | |
var _useControlled = useControlled({ | |
controlled: valueProp, | |
default: defaultValue, | |
name: "Slider" | |
}), _useControlled2 = _slicedToArray(_useControlled, 2), valueDerived = _useControlled2[0], setValueState = _useControlled2[1]; | |
var range = Array.isArray(valueDerived); | |
var values = range ? valueDerived.slice().sort(asc) : [valueDerived]; | |
values = values.map(function(value) { | |
return clamp(value, min, max); | |
}); | |
var marks = marksProp === true && step !== null ? _toConsumableArray(Array(Math.floor((max - min) / step) + 1)).map(function(_, index) { | |
return { | |
value: min + step * index | |
}; | |
}) : marksProp || []; | |
var _useIsFocusVisible = useIsFocusVisible(), isFocusVisible = _useIsFocusVisible.isFocusVisible, onBlurVisible = _useIsFocusVisible.onBlurVisible, focusVisibleRef = _useIsFocusVisible.ref; | |
var _React$useState3 = React98.useState(-1), focusVisible = _React$useState3[0], setFocusVisible = _React$useState3[1]; | |
var sliderRef = React98.useRef(); | |
var handleFocusRef = useForkRef(focusVisibleRef, sliderRef); | |
var handleRef = useForkRef(ref, handleFocusRef); | |
var handleFocus = useEventCallback(function(event) { | |
var index = Number(event.currentTarget.getAttribute("data-index")); | |
if (isFocusVisible(event)) { | |
setFocusVisible(index); | |
} | |
setOpen(index); | |
}); | |
var handleBlur = useEventCallback(function() { | |
if (focusVisible !== -1) { | |
setFocusVisible(-1); | |
onBlurVisible(); | |
} | |
setOpen(-1); | |
}); | |
var handleMouseOver = useEventCallback(function(event) { | |
var index = Number(event.currentTarget.getAttribute("data-index")); | |
setOpen(index); | |
}); | |
var handleMouseLeave = useEventCallback(function() { | |
setOpen(-1); | |
}); | |
var isRtl = theme.direction === "rtl"; | |
var handleKeyDown = useEventCallback(function(event) { | |
var index = Number(event.currentTarget.getAttribute("data-index")); | |
var value = values[index]; | |
var tenPercents = (max - min) / 10; | |
var marksValues = marks.map(function(mark) { | |
return mark.value; | |
}); | |
var marksIndex = marksValues.indexOf(value); | |
var newValue; | |
var increaseKey = isRtl ? "ArrowLeft" : "ArrowRight"; | |
var decreaseKey = isRtl ? "ArrowRight" : "ArrowLeft"; | |
switch (event.key) { | |
case "Home": | |
newValue = min; | |
break; | |
case "End": | |
newValue = max; | |
break; | |
case "PageUp": | |
if (step) { | |
newValue = value + tenPercents; | |
} | |
break; | |
case "PageDown": | |
if (step) { | |
newValue = value - tenPercents; | |
} | |
break; | |
case increaseKey: | |
case "ArrowUp": | |
if (step) { | |
newValue = value + step; | |
} else { | |
newValue = marksValues[marksIndex + 1] || marksValues[marksValues.length - 1]; | |
} | |
break; | |
case decreaseKey: | |
case "ArrowDown": | |
if (step) { | |
newValue = value - step; | |
} else { | |
newValue = marksValues[marksIndex - 1] || marksValues[0]; | |
} | |
break; | |
default: | |
return; | |
} | |
event.preventDefault(); | |
if (step) { | |
newValue = roundValueToStep(newValue, step, min); | |
} | |
newValue = clamp(newValue, min, max); | |
if (range) { | |
var previousValue = newValue; | |
newValue = setValueIndex({ | |
values, | |
source: valueDerived, | |
newValue, | |
index | |
}).sort(asc); | |
focusThumb({ | |
sliderRef, | |
activeIndex: newValue.indexOf(previousValue) | |
}); | |
} | |
setValueState(newValue); | |
setFocusVisible(index); | |
if (onChange) { | |
onChange(event, newValue); | |
} | |
if (onChangeCommitted) { | |
onChangeCommitted(event, newValue); | |
} | |
}); | |
var previousIndex = React98.useRef(); | |
var axis = orientation; | |
if (isRtl && orientation !== "vertical") { | |
axis += "-reverse"; | |
} | |
var getFingerNewValue = function getFingerNewValue2(_ref33) { | |
var finger = _ref33.finger, _ref3$move = _ref33.move, move = _ref3$move === void 0 ? false : _ref3$move, values2 = _ref33.values, source = _ref33.source; | |
var slider = sliderRef.current; | |
var _slider$getBoundingCl = slider.getBoundingClientRect(), width = _slider$getBoundingCl.width, height = _slider$getBoundingCl.height, bottom = _slider$getBoundingCl.bottom, left = _slider$getBoundingCl.left; | |
var percent; | |
if (axis.indexOf("vertical") === 0) { | |
percent = (bottom - finger.y) / height; | |
} else { | |
percent = (finger.x - left) / width; | |
} | |
if (axis.indexOf("-reverse") !== -1) { | |
percent = 1 - percent; | |
} | |
var newValue; | |
newValue = percentToValue(percent, min, max); | |
if (step) { | |
newValue = roundValueToStep(newValue, step, min); | |
} else { | |
var marksValues = marks.map(function(mark) { | |
return mark.value; | |
}); | |
var closestIndex = findClosest(marksValues, newValue); | |
newValue = marksValues[closestIndex]; | |
} | |
newValue = clamp(newValue, min, max); | |
var activeIndex = 0; | |
if (range) { | |
if (!move) { | |
activeIndex = findClosest(values2, newValue); | |
} else { | |
activeIndex = previousIndex.current; | |
} | |
var previousValue = newValue; | |
newValue = setValueIndex({ | |
values: values2, | |
source, | |
newValue, | |
index: activeIndex | |
}).sort(asc); | |
activeIndex = newValue.indexOf(previousValue); | |
previousIndex.current = activeIndex; | |
} | |
return { | |
newValue, | |
activeIndex | |
}; | |
}; | |
var handleTouchMove = useEventCallback(function(event) { | |
var finger = trackFinger(event, touchId); | |
if (!finger) { | |
return; | |
} | |
var _getFingerNewValue = getFingerNewValue({ | |
finger, | |
move: true, | |
values, | |
source: valueDerived | |
}), newValue = _getFingerNewValue.newValue, activeIndex = _getFingerNewValue.activeIndex; | |
focusThumb({ | |
sliderRef, | |
activeIndex, | |
setActive | |
}); | |
setValueState(newValue); | |
if (onChange) { | |
onChange(event, newValue); | |
} | |
}); | |
var handleTouchEnd = useEventCallback(function(event) { | |
var finger = trackFinger(event, touchId); | |
if (!finger) { | |
return; | |
} | |
var _getFingerNewValue2 = getFingerNewValue({ | |
finger, | |
values, | |
source: valueDerived | |
}), newValue = _getFingerNewValue2.newValue; | |
setActive(-1); | |
if (event.type === "touchend") { | |
setOpen(-1); | |
} | |
if (onChangeCommitted) { | |
onChangeCommitted(event, newValue); | |
} | |
touchId.current = void 0; | |
var doc = ownerDocument(sliderRef.current); | |
doc.removeEventListener("mousemove", handleTouchMove); | |
doc.removeEventListener("mouseup", handleTouchEnd); | |
doc.removeEventListener("touchmove", handleTouchMove); | |
doc.removeEventListener("touchend", handleTouchEnd); | |
}); | |
var handleTouchStart = useEventCallback(function(event) { | |
event.preventDefault(); | |
var touch = event.changedTouches[0]; | |
if (touch != null) { | |
touchId.current = touch.identifier; | |
} | |
var finger = trackFinger(event, touchId); | |
var _getFingerNewValue3 = getFingerNewValue({ | |
finger, | |
values, | |
source: valueDerived | |
}), newValue = _getFingerNewValue3.newValue, activeIndex = _getFingerNewValue3.activeIndex; | |
focusThumb({ | |
sliderRef, | |
activeIndex, | |
setActive | |
}); | |
setValueState(newValue); | |
if (onChange) { | |
onChange(event, newValue); | |
} | |
var doc = ownerDocument(sliderRef.current); | |
doc.addEventListener("touchmove", handleTouchMove); | |
doc.addEventListener("touchend", handleTouchEnd); | |
}); | |
React98.useEffect(function() { | |
var slider = sliderRef.current; | |
slider.addEventListener("touchstart", handleTouchStart); | |
var doc = ownerDocument(slider); | |
return function() { | |
slider.removeEventListener("touchstart", handleTouchStart); | |
doc.removeEventListener("mousemove", handleTouchMove); | |
doc.removeEventListener("mouseup", handleTouchEnd); | |
doc.removeEventListener("touchmove", handleTouchMove); | |
doc.removeEventListener("touchend", handleTouchEnd); | |
}; | |
}, [handleTouchEnd, handleTouchMove, handleTouchStart]); | |
var handleMouseDown = useEventCallback(function(event) { | |
if (onMouseDown) { | |
onMouseDown(event); | |
} | |
event.preventDefault(); | |
var finger = trackFinger(event, touchId); | |
var _getFingerNewValue4 = getFingerNewValue({ | |
finger, | |
values, | |
source: valueDerived | |
}), newValue = _getFingerNewValue4.newValue, activeIndex = _getFingerNewValue4.activeIndex; | |
focusThumb({ | |
sliderRef, | |
activeIndex, | |
setActive | |
}); | |
setValueState(newValue); | |
if (onChange) { | |
onChange(event, newValue); | |
} | |
var doc = ownerDocument(sliderRef.current); | |
doc.addEventListener("mousemove", handleTouchMove); | |
doc.addEventListener("mouseup", handleTouchEnd); | |
}); | |
var trackOffset = valueToPercent(range ? values[0] : min, min, max); | |
var trackLeap = valueToPercent(values[values.length - 1], min, max) - trackOffset; | |
var trackStyle = _extends({}, axisProps[axis].offset(trackOffset), axisProps[axis].leap(trackLeap)); | |
return React98.createElement(Component3, _extends({ | |
ref: handleRef, | |
className: clsx_m_default(classes.root, classes["color".concat(capitalize(color))], className, disabled && classes.disabled, marks.length > 0 && marks.some(function(mark) { | |
return mark.label; | |
}) && classes.marked, track === false && classes.trackFalse, orientation === "vertical" && classes.vertical, track === "inverted" && classes.trackInverted), | |
onMouseDown: handleMouseDown | |
}, other), React98.createElement("span", { | |
className: classes.rail | |
}), React98.createElement("span", { | |
className: classes.track, | |
style: trackStyle | |
}), React98.createElement("input", { | |
value: values.join(","), | |
name, | |
type: "hidden" | |
}), marks.map(function(mark, index) { | |
var percent = valueToPercent(mark.value, min, max); | |
var style = axisProps[axis].offset(percent); | |
var markActive; | |
if (track === false) { | |
markActive = values.indexOf(mark.value) !== -1; | |
} else { | |
markActive = track === "normal" && (range ? mark.value >= values[0] && mark.value <= values[values.length - 1] : mark.value <= values[0]) || track === "inverted" && (range ? mark.value <= values[0] || mark.value >= values[values.length - 1] : mark.value >= values[0]); | |
} | |
return React98.createElement(React98.Fragment, { | |
key: mark.value | |
}, React98.createElement("span", { | |
style, | |
"data-index": index, | |
className: clsx_m_default(classes.mark, markActive && classes.markActive) | |
}), mark.label != null ? React98.createElement("span", { | |
"aria-hidden": true, | |
"data-index": index, | |
style, | |
className: clsx_m_default(classes.markLabel, markActive && classes.markLabelActive) | |
}, mark.label) : null); | |
}), values.map(function(value, index) { | |
var percent = valueToPercent(value, min, max); | |
var style = axisProps[axis].offset(percent); | |
return React98.createElement(ValueLabelComponent, { | |
key: index, | |
valueLabelFormat, | |
valueLabelDisplay, | |
className: classes.valueLabel, | |
value: typeof valueLabelFormat === "function" ? valueLabelFormat(scale(value), index) : valueLabelFormat, | |
index, | |
open: open === index || active === index || valueLabelDisplay === "on", | |
disabled | |
}, React98.createElement(ThumbComponent, { | |
className: clsx_m_default(classes.thumb, classes["thumbColor".concat(capitalize(color))], active === index && classes.active, disabled && classes.disabled, focusVisible === index && classes.focusVisible), | |
tabIndex: disabled ? null : 0, | |
role: "slider", | |
style, | |
"data-index": index, | |
"aria-label": getAriaLabel ? getAriaLabel(index) : ariaLabel, | |
"aria-labelledby": ariaLabelledby, | |
"aria-orientation": orientation, | |
"aria-valuemax": scale(max), | |
"aria-valuemin": scale(min), | |
"aria-valuenow": scale(value), | |
"aria-valuetext": getAriaValueText ? getAriaValueText(scale(value), index) : ariaValuetext, | |
onKeyDown: handleKeyDown, | |
onFocus: handleFocus, | |
onBlur: handleBlur, | |
onMouseOver: handleMouseOver, | |
onMouseLeave: handleMouseLeave | |
})); | |
})); | |
}); | |
true ? Slider.propTypes = { | |
"aria-label": chainPropTypes(import_prop_types81.default.string, function(props) { | |
var range = Array.isArray(props.value || props.defaultValue); | |
if (range && props["aria-label"] != null) { | |
return new Error("Material-UI: You need to use the `getAriaLabel` prop instead of `aria-label` when using a range slider."); | |
} | |
return null; | |
}), | |
"aria-labelledby": import_prop_types81.default.string, | |
"aria-valuetext": chainPropTypes(import_prop_types81.default.string, function(props) { | |
var range = Array.isArray(props.value || props.defaultValue); | |
if (range && props["aria-valuetext"] != null) { | |
return new Error("Material-UI: You need to use the `getAriaValueText` prop instead of `aria-valuetext` when using a range slider."); | |
} | |
return null; | |
}), | |
classes: import_prop_types81.default.object.isRequired, | |
className: import_prop_types81.default.string, | |
color: import_prop_types81.default.oneOf(["primary", "secondary"]), | |
component: import_prop_types81.default.elementType, | |
defaultValue: import_prop_types81.default.oneOfType([import_prop_types81.default.number, import_prop_types81.default.arrayOf(import_prop_types81.default.number)]), | |
disabled: import_prop_types81.default.bool, | |
getAriaLabel: import_prop_types81.default.func, | |
getAriaValueText: import_prop_types81.default.func, | |
marks: import_prop_types81.default.oneOfType([import_prop_types81.default.bool, import_prop_types81.default.array]), | |
max: import_prop_types81.default.number, | |
min: import_prop_types81.default.number, | |
name: import_prop_types81.default.string, | |
onChange: import_prop_types81.default.func, | |
onChangeCommitted: import_prop_types81.default.func, | |
onMouseDown: import_prop_types81.default.func, | |
orientation: import_prop_types81.default.oneOf(["horizontal", "vertical"]), | |
scale: import_prop_types81.default.func, | |
step: import_prop_types81.default.number, | |
ThumbComponent: import_prop_types81.default.elementType, | |
track: import_prop_types81.default.oneOf(["normal", false, "inverted"]), | |
value: import_prop_types81.default.oneOfType([import_prop_types81.default.number, import_prop_types81.default.arrayOf(import_prop_types81.default.number)]), | |
ValueLabelComponent: import_prop_types81.default.elementType, | |
valueLabelDisplay: import_prop_types81.default.oneOf(["on", "auto", "off"]), | |
valueLabelFormat: import_prop_types81.default.oneOfType([import_prop_types81.default.string, import_prop_types81.default.func]) | |
} : void 0; | |
var Slider_default = withStyles_default(styles115, { | |
name: "MuiSlider" | |
})(Slider); | |
// node_modules/@material-ui/core/esm/Snackbar/Snackbar.js | |
var React100 = __toModule(require_react()); | |
var import_prop_types83 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/SnackbarContent/SnackbarContent.js | |
var React99 = __toModule(require_react()); | |
var import_prop_types82 = __toModule(require_prop_types()); | |
var styles117 = function styles118(theme) { | |
var emphasis = theme.palette.type === "light" ? 0.8 : 0.98; | |
var backgroundColor = emphasize(theme.palette.background.default, emphasis); | |
return { | |
root: _extends({}, theme.typography.body2, _defineProperty({ | |
color: theme.palette.getContrastText(backgroundColor), | |
backgroundColor, | |
display: "flex", | |
alignItems: "center", | |
flexWrap: "wrap", | |
padding: "6px 16px", | |
borderRadius: theme.shape.borderRadius, | |
flexGrow: 1 | |
}, theme.breakpoints.up("sm"), { | |
flexGrow: "initial", | |
minWidth: 288 | |
})), | |
message: { | |
padding: "8px 0" | |
}, | |
action: { | |
display: "flex", | |
alignItems: "center", | |
marginLeft: "auto", | |
paddingLeft: 16, | |
marginRight: -8 | |
} | |
}; | |
}; | |
var SnackbarContent = React99.forwardRef(function SnackbarContent2(props, ref) { | |
var action = props.action, classes = props.classes, className = props.className, message = props.message, _props$role = props.role, role = _props$role === void 0 ? "alert" : _props$role, other = _objectWithoutProperties(props, ["action", "classes", "className", "message", "role"]); | |
return React99.createElement(Paper_default, _extends({ | |
role, | |
square: true, | |
elevation: 6, | |
className: clsx_m_default(classes.root, className), | |
ref | |
}, other), React99.createElement("div", { | |
className: classes.message | |
}, message), action ? React99.createElement("div", { | |
className: classes.action | |
}, action) : null); | |
}); | |
true ? SnackbarContent.propTypes = { | |
action: import_prop_types82.default.node, | |
classes: import_prop_types82.default.object, | |
className: import_prop_types82.default.string, | |
message: import_prop_types82.default.node, | |
role: import_prop_types82.default.string | |
} : void 0; | |
var SnackbarContent_default = withStyles_default(styles117, { | |
name: "MuiSnackbarContent" | |
})(SnackbarContent); | |
// node_modules/@material-ui/core/esm/Snackbar/Snackbar.js | |
var styles119 = function styles120(theme) { | |
var top1 = { | |
top: 8 | |
}; | |
var bottom1 = { | |
bottom: 8 | |
}; | |
var right = { | |
justifyContent: "flex-end" | |
}; | |
var left = { | |
justifyContent: "flex-start" | |
}; | |
var top3 = { | |
top: 24 | |
}; | |
var bottom3 = { | |
bottom: 24 | |
}; | |
var right3 = { | |
right: 24 | |
}; | |
var left3 = { | |
left: 24 | |
}; | |
var center = { | |
left: "50%", | |
right: "auto", | |
transform: "translateX(-50%)" | |
}; | |
return { | |
root: { | |
zIndex: theme.zIndex.snackbar, | |
position: "fixed", | |
display: "flex", | |
left: 8, | |
right: 8, | |
justifyContent: "center", | |
alignItems: "center" | |
}, | |
anchorOriginTopCenter: _extends({}, top1, _defineProperty({}, theme.breakpoints.up("sm"), _extends({}, top3, center))), | |
anchorOriginBottomCenter: _extends({}, bottom1, _defineProperty({}, theme.breakpoints.up("sm"), _extends({}, bottom3, center))), | |
anchorOriginTopRight: _extends({}, top1, right, _defineProperty({}, theme.breakpoints.up("sm"), _extends({ | |
left: "auto" | |
}, top3, right3))), | |
anchorOriginBottomRight: _extends({}, bottom1, right, _defineProperty({}, theme.breakpoints.up("sm"), _extends({ | |
left: "auto" | |
}, bottom3, right3))), | |
anchorOriginTopLeft: _extends({}, top1, left, _defineProperty({}, theme.breakpoints.up("sm"), _extends({ | |
right: "auto" | |
}, top3, left3))), | |
anchorOriginBottomLeft: _extends({}, bottom1, left, _defineProperty({}, theme.breakpoints.up("sm"), _extends({ | |
right: "auto" | |
}, bottom3, left3))) | |
}; | |
}; | |
var Snackbar = React100.forwardRef(function Snackbar2(props, ref) { | |
var action = props.action, _props$anchorOrigin = props.anchorOrigin; | |
_props$anchorOrigin = _props$anchorOrigin === void 0 ? { | |
vertical: "bottom", | |
horizontal: "center" | |
} : _props$anchorOrigin; | |
var vertical = _props$anchorOrigin.vertical, horizontal = _props$anchorOrigin.horizontal, _props$autoHideDurati = props.autoHideDuration, autoHideDuration = _props$autoHideDurati === void 0 ? null : _props$autoHideDurati, children = props.children, classes = props.classes, className = props.className, ClickAwayListenerProps = props.ClickAwayListenerProps, ContentProps = props.ContentProps, _props$disableWindowB = props.disableWindowBlurListener, disableWindowBlurListener = _props$disableWindowB === void 0 ? false : _props$disableWindowB, message = props.message, onClose = props.onClose, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, onMouseEnter = props.onMouseEnter, onMouseLeave = props.onMouseLeave, open = props.open, resumeHideDuration = props.resumeHideDuration, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Grow_default : _props$TransitionComp, _props$transitionDura = props.transitionDuration, transitionDuration = _props$transitionDura === void 0 ? { | |
enter: duration.enteringScreen, | |
exit: duration.leavingScreen | |
} : _props$transitionDura, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["action", "anchorOrigin", "autoHideDuration", "children", "classes", "className", "ClickAwayListenerProps", "ContentProps", "disableWindowBlurListener", "message", "onClose", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "onMouseEnter", "onMouseLeave", "open", "resumeHideDuration", "TransitionComponent", "transitionDuration", "TransitionProps"]); | |
var timerAutoHide = React100.useRef(); | |
var _React$useState = React100.useState(true), exited = _React$useState[0], setExited = _React$useState[1]; | |
var handleClose = useEventCallback(function() { | |
if (onClose) { | |
onClose.apply(void 0, arguments); | |
} | |
}); | |
var setAutoHideTimer = useEventCallback(function(autoHideDurationParam) { | |
if (!onClose || autoHideDurationParam == null) { | |
return; | |
} | |
clearTimeout(timerAutoHide.current); | |
timerAutoHide.current = setTimeout(function() { | |
handleClose(null, "timeout"); | |
}, autoHideDurationParam); | |
}); | |
React100.useEffect(function() { | |
if (open) { | |
setAutoHideTimer(autoHideDuration); | |
} | |
return function() { | |
clearTimeout(timerAutoHide.current); | |
}; | |
}, [open, autoHideDuration, setAutoHideTimer]); | |
var handlePause = function handlePause2() { | |
clearTimeout(timerAutoHide.current); | |
}; | |
var handleResume = React100.useCallback(function() { | |
if (autoHideDuration != null) { | |
setAutoHideTimer(resumeHideDuration != null ? resumeHideDuration : autoHideDuration * 0.5); | |
} | |
}, [autoHideDuration, resumeHideDuration, setAutoHideTimer]); | |
var handleMouseEnter = function handleMouseEnter2(event) { | |
if (onMouseEnter) { | |
onMouseEnter(event); | |
} | |
handlePause(); | |
}; | |
var handleMouseLeave = function handleMouseLeave2(event) { | |
if (onMouseLeave) { | |
onMouseLeave(event); | |
} | |
handleResume(); | |
}; | |
var handleClickAway = function handleClickAway2(event) { | |
if (onClose) { | |
onClose(event, "clickaway"); | |
} | |
}; | |
var handleExited = function handleExited2() { | |
setExited(true); | |
}; | |
var handleEnter = function handleEnter2() { | |
setExited(false); | |
}; | |
React100.useEffect(function() { | |
if (!disableWindowBlurListener && open) { | |
window.addEventListener("focus", handleResume); | |
window.addEventListener("blur", handlePause); | |
return function() { | |
window.removeEventListener("focus", handleResume); | |
window.removeEventListener("blur", handlePause); | |
}; | |
} | |
return void 0; | |
}, [disableWindowBlurListener, handleResume, open]); | |
if (!open && exited) { | |
return null; | |
} | |
return React100.createElement(ClickAwayListener_default, _extends({ | |
onClickAway: handleClickAway | |
}, ClickAwayListenerProps), React100.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, classes["anchorOrigin".concat(capitalize(vertical)).concat(capitalize(horizontal))], className), | |
onMouseEnter: handleMouseEnter, | |
onMouseLeave: handleMouseLeave, | |
ref | |
}, other), React100.createElement(TransitionComponent, _extends({ | |
appear: true, | |
in: open, | |
onEnter: createChainedFunction(handleEnter, onEnter), | |
onEntered, | |
onEntering, | |
onExit, | |
onExited: createChainedFunction(handleExited, onExited), | |
onExiting, | |
timeout: transitionDuration, | |
direction: vertical === "top" ? "down" : "up" | |
}, TransitionProps), children || React100.createElement(SnackbarContent_default, _extends({ | |
message, | |
action | |
}, ContentProps))))); | |
}); | |
true ? Snackbar.propTypes = { | |
action: import_prop_types83.default.node, | |
anchorOrigin: import_prop_types83.default.shape({ | |
horizontal: import_prop_types83.default.oneOf(["center", "left", "right"]).isRequired, | |
vertical: import_prop_types83.default.oneOf(["bottom", "top"]).isRequired | |
}), | |
autoHideDuration: import_prop_types83.default.number, | |
children: import_prop_types83.default.element, | |
classes: import_prop_types83.default.object, | |
className: import_prop_types83.default.string, | |
ClickAwayListenerProps: import_prop_types83.default.object, | |
ContentProps: import_prop_types83.default.object, | |
disableWindowBlurListener: import_prop_types83.default.bool, | |
key: import_prop_types83.default.any, | |
message: import_prop_types83.default.node, | |
onClose: import_prop_types83.default.func, | |
onEnter: import_prop_types83.default.func, | |
onEntered: import_prop_types83.default.func, | |
onEntering: import_prop_types83.default.func, | |
onExit: import_prop_types83.default.func, | |
onExited: import_prop_types83.default.func, | |
onExiting: import_prop_types83.default.func, | |
onMouseEnter: import_prop_types83.default.func, | |
onMouseLeave: import_prop_types83.default.func, | |
open: import_prop_types83.default.bool, | |
resumeHideDuration: import_prop_types83.default.number, | |
TransitionComponent: import_prop_types83.default.elementType, | |
transitionDuration: import_prop_types83.default.oneOfType([import_prop_types83.default.number, import_prop_types83.default.shape({ | |
appear: import_prop_types83.default.number, | |
enter: import_prop_types83.default.number, | |
exit: import_prop_types83.default.number | |
})]), | |
TransitionProps: import_prop_types83.default.object | |
} : void 0; | |
var Snackbar_default = withStyles_default(styles119, { | |
flip: false, | |
name: "MuiSnackbar" | |
})(Snackbar); | |
// node_modules/@material-ui/core/esm/Step/Step.js | |
var React101 = __toModule(require_react()); | |
var import_react_is10 = __toModule(require_react_is()); | |
var import_prop_types84 = __toModule(require_prop_types()); | |
var styles121 = { | |
root: {}, | |
horizontal: { | |
paddingLeft: 8, | |
paddingRight: 8 | |
}, | |
vertical: {}, | |
alternativeLabel: { | |
flex: 1, | |
position: "relative" | |
}, | |
completed: {} | |
}; | |
var Step = React101.forwardRef(function Step2(props, ref) { | |
var _props$active = props.active, active = _props$active === void 0 ? false : _props$active, alternativeLabel = props.alternativeLabel, children = props.children, classes = props.classes, className = props.className, _props$completed = props.completed, completed = _props$completed === void 0 ? false : _props$completed, connectorProp = props.connector, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$expanded = props.expanded, expanded = _props$expanded === void 0 ? false : _props$expanded, index = props.index, last = props.last, orientation = props.orientation, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "children", "classes", "className", "completed", "connector", "disabled", "expanded", "index", "last", "orientation"]); | |
var connector = connectorProp ? React101.cloneElement(connectorProp, { | |
orientation, | |
alternativeLabel, | |
index, | |
active, | |
completed, | |
disabled | |
}) : null; | |
var newChildren = React101.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, classes[orientation], className, alternativeLabel && classes.alternativeLabel, completed && classes.completed), | |
ref | |
}, other), connector && alternativeLabel && index !== 0 ? connector : null, React101.Children.map(children, function(child) { | |
if (!React101.isValidElement(child)) { | |
return null; | |
} | |
if (true) { | |
if (import_react_is10.isFragment(child)) { | |
console.error(["Material-UI: The Step component doesn't accept a Fragment as a child.", "Consider providing an array instead."].join("\n")); | |
} | |
} | |
return React101.cloneElement(child, _extends({ | |
active, | |
alternativeLabel, | |
completed, | |
disabled, | |
expanded, | |
last, | |
icon: index + 1, | |
orientation | |
}, child.props)); | |
})); | |
if (connector && !alternativeLabel && index !== 0) { | |
return React101.createElement(React101.Fragment, null, connector, newChildren); | |
} | |
return newChildren; | |
}); | |
true ? Step.propTypes = { | |
active: import_prop_types84.default.bool, | |
children: import_prop_types84.default.node, | |
classes: import_prop_types84.default.object, | |
className: import_prop_types84.default.string, | |
completed: import_prop_types84.default.bool, | |
disabled: import_prop_types84.default.bool, | |
expanded: import_prop_types84.default.bool | |
} : void 0; | |
var Step_default = withStyles_default(styles121, { | |
name: "MuiStep" | |
})(Step); | |
// node_modules/@material-ui/core/esm/StepButton/StepButton.js | |
var React106 = __toModule(require_react()); | |
var import_prop_types87 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/StepLabel/StepLabel.js | |
var React105 = __toModule(require_react()); | |
var import_prop_types86 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/StepIcon/StepIcon.js | |
var React104 = __toModule(require_react()); | |
var import_prop_types85 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/CheckCircle.js | |
var React102 = __toModule(require_react()); | |
var CheckCircle_default = createSvgIcon(React102.createElement("path", { | |
d: "M12 0a12 12 0 1 0 0 24 12 12 0 0 0 0-24zm-2 17l-5-5 1.4-1.4 3.6 3.6 7.6-7.6L19 8l-9 9z" | |
}), "CheckCircle"); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/Warning.js | |
var React103 = __toModule(require_react()); | |
var Warning_default = createSvgIcon(React103.createElement("path", { | |
d: "M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z" | |
}), "Warning"); | |
// node_modules/@material-ui/core/esm/StepIcon/StepIcon.js | |
var import_SvgIcon = __toModule(require_SvgIcon()); | |
var styles122 = function styles123(theme) { | |
return { | |
root: { | |
display: "block", | |
color: theme.palette.text.disabled, | |
"&$completed": { | |
color: theme.palette.primary.main | |
}, | |
"&$active": { | |
color: theme.palette.primary.main | |
}, | |
"&$error": { | |
color: theme.palette.error.main | |
} | |
}, | |
text: { | |
fill: theme.palette.primary.contrastText, | |
fontSize: theme.typography.caption.fontSize, | |
fontFamily: theme.typography.fontFamily | |
}, | |
active: {}, | |
completed: {}, | |
error: {} | |
}; | |
}; | |
var _ref3 = React104.createElement("circle", { | |
cx: "12", | |
cy: "12", | |
r: "12" | |
}); | |
var StepIcon = React104.forwardRef(function StepIcon2(props, ref) { | |
var _props$completed = props.completed, completed = _props$completed === void 0 ? false : _props$completed, icon = props.icon, _props$active = props.active, active = _props$active === void 0 ? false : _props$active, _props$error = props.error, error = _props$error === void 0 ? false : _props$error, classes = props.classes; | |
if (typeof icon === "number" || typeof icon === "string") { | |
var className = clsx_m_default(classes.root, active && classes.active, error && classes.error, completed && classes.completed); | |
if (error) { | |
return React104.createElement(Warning_default, { | |
className, | |
ref | |
}); | |
} | |
if (completed) { | |
return React104.createElement(CheckCircle_default, { | |
className, | |
ref | |
}); | |
} | |
return React104.createElement(import_SvgIcon.default, { | |
className, | |
ref | |
}, _ref3, React104.createElement("text", { | |
className: classes.text, | |
x: "12", | |
y: "16", | |
textAnchor: "middle" | |
}, icon)); | |
} | |
return icon; | |
}); | |
true ? StepIcon.propTypes = { | |
active: import_prop_types85.default.bool, | |
classes: import_prop_types85.default.object, | |
completed: import_prop_types85.default.bool, | |
error: import_prop_types85.default.bool, | |
icon: import_prop_types85.default.node | |
} : void 0; | |
var StepIcon_default = withStyles_default(styles122, { | |
name: "MuiStepIcon" | |
})(StepIcon); | |
// node_modules/@material-ui/core/esm/StepLabel/StepLabel.js | |
var styles124 = function styles125(theme) { | |
return { | |
root: { | |
display: "flex", | |
alignItems: "center", | |
"&$alternativeLabel": { | |
flexDirection: "column" | |
}, | |
"&$disabled": { | |
cursor: "default" | |
} | |
}, | |
horizontal: {}, | |
vertical: {}, | |
label: { | |
color: theme.palette.text.secondary, | |
"&$active": { | |
color: theme.palette.text.primary, | |
fontWeight: 500 | |
}, | |
"&$completed": { | |
color: theme.palette.text.primary, | |
fontWeight: 500 | |
}, | |
"&$alternativeLabel": { | |
textAlign: "center", | |
marginTop: 16 | |
}, | |
"&$error": { | |
color: theme.palette.error.main | |
} | |
}, | |
active: {}, | |
completed: {}, | |
error: {}, | |
disabled: {}, | |
iconContainer: { | |
flexShrink: 0, | |
display: "flex", | |
paddingRight: 8, | |
"&$alternativeLabel": { | |
paddingRight: 0 | |
} | |
}, | |
alternativeLabel: {}, | |
labelContainer: { | |
width: "100%" | |
} | |
}; | |
}; | |
var StepLabel = React105.forwardRef(function StepLabel2(props, ref) { | |
var _props$active = props.active, active = _props$active === void 0 ? false : _props$active, _props$alternativeLab = props.alternativeLabel, alternativeLabel = _props$alternativeLab === void 0 ? false : _props$alternativeLab, children = props.children, classes = props.classes, className = props.className, _props$completed = props.completed, completed = _props$completed === void 0 ? false : _props$completed, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$error = props.error, error = _props$error === void 0 ? false : _props$error, expanded = props.expanded, icon = props.icon, last = props.last, optional = props.optional, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, StepIconComponentProp = props.StepIconComponent, StepIconProps = props.StepIconProps, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "children", "classes", "className", "completed", "disabled", "error", "expanded", "icon", "last", "optional", "orientation", "StepIconComponent", "StepIconProps"]); | |
var StepIconComponent = StepIconComponentProp; | |
if (icon && !StepIconComponent) { | |
StepIconComponent = StepIcon_default; | |
} | |
return React105.createElement("span", _extends({ | |
className: clsx_m_default(classes.root, classes[orientation], className, disabled && classes.disabled, alternativeLabel && classes.alternativeLabel, error && classes.error), | |
ref | |
}, other), icon || StepIconComponent ? React105.createElement("span", { | |
className: clsx_m_default(classes.iconContainer, alternativeLabel && classes.alternativeLabel) | |
}, React105.createElement(StepIconComponent, _extends({ | |
completed, | |
active, | |
error, | |
icon | |
}, StepIconProps))) : null, React105.createElement("span", { | |
className: classes.labelContainer | |
}, children ? React105.createElement(Typography_default, { | |
variant: "body2", | |
component: "span", | |
display: "block", | |
className: clsx_m_default(classes.label, alternativeLabel && classes.alternativeLabel, completed && classes.completed, active && classes.active, error && classes.error) | |
}, children) : null, optional)); | |
}); | |
true ? StepLabel.propTypes = { | |
children: import_prop_types86.default.node, | |
classes: import_prop_types86.default.object, | |
className: import_prop_types86.default.string, | |
disabled: import_prop_types86.default.bool, | |
error: import_prop_types86.default.bool, | |
icon: import_prop_types86.default.node, | |
optional: import_prop_types86.default.node, | |
StepIconComponent: import_prop_types86.default.elementType, | |
StepIconProps: import_prop_types86.default.object | |
} : void 0; | |
StepLabel.muiName = "StepLabel"; | |
var StepLabel_default = withStyles_default(styles124, { | |
name: "MuiStepLabel" | |
})(StepLabel); | |
// node_modules/@material-ui/core/esm/StepButton/StepButton.js | |
var styles126 = { | |
root: { | |
width: "100%", | |
padding: "24px 16px", | |
margin: "-24px -16px", | |
boxSizing: "content-box" | |
}, | |
horizontal: {}, | |
vertical: { | |
justifyContent: "flex-start", | |
padding: "8px", | |
margin: "-8px" | |
}, | |
touchRipple: { | |
color: "rgba(0, 0, 0, 0.3)" | |
} | |
}; | |
var StepButton = React106.forwardRef(function StepButton2(props, ref) { | |
var active = props.active, alternativeLabel = props.alternativeLabel, children = props.children, classes = props.classes, className = props.className, completed = props.completed, disabled = props.disabled, expanded = props.expanded, icon = props.icon, last = props.last, optional = props.optional, orientation = props.orientation, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "children", "classes", "className", "completed", "disabled", "expanded", "icon", "last", "optional", "orientation"]); | |
var childProps = { | |
active, | |
alternativeLabel, | |
completed, | |
disabled, | |
icon, | |
optional, | |
orientation | |
}; | |
var child = isMuiElement(children, ["StepLabel"]) ? React106.cloneElement(children, childProps) : React106.createElement(StepLabel_default, childProps, children); | |
return React106.createElement(ButtonBase_default, _extends({ | |
focusRipple: true, | |
disabled, | |
TouchRippleProps: { | |
className: classes.touchRipple | |
}, | |
className: clsx_m_default(classes.root, classes[orientation], className), | |
ref | |
}, other), child); | |
}); | |
true ? StepButton.propTypes = { | |
active: import_prop_types87.default.bool, | |
alternativeLabel: import_prop_types87.default.bool, | |
children: import_prop_types87.default.node, | |
classes: import_prop_types87.default.object.isRequired, | |
className: import_prop_types87.default.string, | |
completed: import_prop_types87.default.bool, | |
disabled: import_prop_types87.default.bool, | |
expanded: import_prop_types87.default.bool, | |
icon: import_prop_types87.default.node, | |
last: import_prop_types87.default.bool, | |
optional: import_prop_types87.default.node, | |
orientation: import_prop_types87.default.oneOf(["horizontal", "vertical"]) | |
} : void 0; | |
var StepButton_default = withStyles_default(styles126, { | |
name: "MuiStepButton" | |
})(StepButton); | |
// node_modules/@material-ui/core/esm/StepConnector/StepConnector.js | |
var React107 = __toModule(require_react()); | |
var import_prop_types88 = __toModule(require_prop_types()); | |
var styles127 = function styles128(theme) { | |
return { | |
root: { | |
flex: "1 1 auto" | |
}, | |
horizontal: {}, | |
vertical: { | |
marginLeft: 12, | |
padding: "0 0 8px" | |
}, | |
alternativeLabel: { | |
position: "absolute", | |
top: 8 + 4, | |
left: "calc(-50% + 20px)", | |
right: "calc(50% + 20px)" | |
}, | |
active: {}, | |
completed: {}, | |
disabled: {}, | |
line: { | |
display: "block", | |
borderColor: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[600] | |
}, | |
lineHorizontal: { | |
borderTopStyle: "solid", | |
borderTopWidth: 1 | |
}, | |
lineVertical: { | |
borderLeftStyle: "solid", | |
borderLeftWidth: 1, | |
minHeight: 24 | |
} | |
}; | |
}; | |
var StepConnector = React107.forwardRef(function StepConnector2(props, ref) { | |
var active = props.active, _props$alternativeLab = props.alternativeLabel, alternativeLabel = _props$alternativeLab === void 0 ? false : _props$alternativeLab, classes = props.classes, className = props.className, completed = props.completed, disabled = props.disabled, index = props.index, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "classes", "className", "completed", "disabled", "index", "orientation"]); | |
return React107.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, classes[orientation], className, alternativeLabel && classes.alternativeLabel, active && classes.active, completed && classes.completed, disabled && classes.disabled), | |
ref | |
}, other), React107.createElement("span", { | |
className: clsx_m_default(classes.line, { | |
horizontal: classes.lineHorizontal, | |
vertical: classes.lineVertical | |
}[orientation]) | |
})); | |
}); | |
true ? StepConnector.propTypes = { | |
classes: import_prop_types88.default.object, | |
className: import_prop_types88.default.string | |
} : void 0; | |
var StepConnector_default = withStyles_default(styles127, { | |
name: "MuiStepConnector" | |
})(StepConnector); | |
// node_modules/@material-ui/core/esm/StepContent/StepContent.js | |
var React108 = __toModule(require_react()); | |
var import_prop_types89 = __toModule(require_prop_types()); | |
var styles129 = function styles130(theme) { | |
return { | |
root: { | |
marginTop: 8, | |
marginLeft: 12, | |
paddingLeft: 8 + 12, | |
paddingRight: 8, | |
borderLeft: "1px solid ".concat(theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[600]) | |
}, | |
last: { | |
borderLeft: "none" | |
}, | |
transition: {} | |
}; | |
}; | |
var StepContent = React108.forwardRef(function StepContent2(props, ref) { | |
var active = props.active, alternativeLabel = props.alternativeLabel, children = props.children, classes = props.classes, className = props.className, completed = props.completed, expanded = props.expanded, last = props.last, optional = props.optional, orientation = props.orientation, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Collapse_default : _props$TransitionComp, _props$transitionDura = props.transitionDuration, transitionDurationProp = _props$transitionDura === void 0 ? "auto" : _props$transitionDura, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["active", "alternativeLabel", "children", "classes", "className", "completed", "expanded", "last", "optional", "orientation", "TransitionComponent", "transitionDuration", "TransitionProps"]); | |
if (true) { | |
if (orientation !== "vertical") { | |
console.error("Material-UI: <StepContent /> is only designed for use with the vertical stepper."); | |
} | |
} | |
var transitionDuration = transitionDurationProp; | |
if (transitionDurationProp === "auto" && !TransitionComponent.muiSupportAuto) { | |
transitionDuration = void 0; | |
} | |
return React108.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, className, last && classes.last), | |
ref | |
}, other), React108.createElement(TransitionComponent, _extends({ | |
in: active || expanded, | |
className: classes.transition, | |
timeout: transitionDuration, | |
unmountOnExit: true | |
}, TransitionProps), children)); | |
}); | |
true ? StepContent.propTypes = { | |
children: import_prop_types89.default.node, | |
classes: import_prop_types89.default.object, | |
className: import_prop_types89.default.string, | |
TransitionComponent: import_prop_types89.default.elementType, | |
transitionDuration: import_prop_types89.default.oneOfType([import_prop_types89.default.oneOf(["auto"]), import_prop_types89.default.number, import_prop_types89.default.shape({ | |
appear: import_prop_types89.default.number, | |
enter: import_prop_types89.default.number, | |
exit: import_prop_types89.default.number | |
})]), | |
TransitionProps: import_prop_types89.default.object | |
} : void 0; | |
var StepContent_default = withStyles_default(styles129, { | |
name: "MuiStepContent" | |
})(StepContent); | |
// node_modules/@material-ui/core/esm/Stepper/Stepper.js | |
var React109 = __toModule(require_react()); | |
var import_prop_types90 = __toModule(require_prop_types()); | |
var styles131 = { | |
root: { | |
display: "flex", | |
padding: 24 | |
}, | |
horizontal: { | |
flexDirection: "row", | |
alignItems: "center" | |
}, | |
vertical: { | |
flexDirection: "column" | |
}, | |
alternativeLabel: { | |
alignItems: "flex-start" | |
} | |
}; | |
var defaultConnector = React109.createElement(StepConnector_default, null); | |
var Stepper = React109.forwardRef(function Stepper2(props, ref) { | |
var _props$activeStep = props.activeStep, activeStep = _props$activeStep === void 0 ? 0 : _props$activeStep, _props$alternativeLab = props.alternativeLabel, alternativeLabel = _props$alternativeLab === void 0 ? false : _props$alternativeLab, children = props.children, classes = props.classes, className = props.className, _props$connector = props.connector, connectorProp = _props$connector === void 0 ? defaultConnector : _props$connector, _props$nonLinear = props.nonLinear, nonLinear = _props$nonLinear === void 0 ? false : _props$nonLinear, _props$orientation = props.orientation, orientation = _props$orientation === void 0 ? "horizontal" : _props$orientation, other = _objectWithoutProperties(props, ["activeStep", "alternativeLabel", "children", "classes", "className", "connector", "nonLinear", "orientation"]); | |
var connector = React109.isValidElement(connectorProp) ? React109.cloneElement(connectorProp, { | |
orientation | |
}) : null; | |
var childrenArray = React109.Children.toArray(children); | |
var steps = childrenArray.map(function(step, index) { | |
var state = { | |
index, | |
active: false, | |
completed: false, | |
disabled: false | |
}; | |
if (activeStep === index) { | |
state.active = true; | |
} else if (!nonLinear && activeStep > index) { | |
state.completed = true; | |
} else if (!nonLinear && activeStep < index) { | |
state.disabled = true; | |
} | |
return React109.cloneElement(step, _extends({ | |
alternativeLabel, | |
connector, | |
last: index + 1 === childrenArray.length, | |
orientation | |
}, state, step.props)); | |
}); | |
return React109.createElement(Paper_default, _extends({ | |
square: true, | |
elevation: 0, | |
className: clsx_m_default(classes.root, classes[orientation], className, alternativeLabel && classes.alternativeLabel), | |
ref | |
}, other), steps); | |
}); | |
true ? Stepper.propTypes = { | |
activeStep: import_prop_types90.default.number, | |
alternativeLabel: import_prop_types90.default.bool, | |
children: import_prop_types90.default.node, | |
classes: import_prop_types90.default.object, | |
className: import_prop_types90.default.string, | |
connector: import_prop_types90.default.element, | |
nonLinear: import_prop_types90.default.bool, | |
orientation: import_prop_types90.default.oneOf(["horizontal", "vertical"]) | |
} : void 0; | |
var Stepper_default = withStyles_default(styles131, { | |
name: "MuiStepper" | |
})(Stepper); | |
// node_modules/@material-ui/core/esm/SwipeableDrawer/SwipeableDrawer.js | |
var React111 = __toModule(require_react()); | |
var import_prop_types92 = __toModule(require_prop_types()); | |
var ReactDOM8 = __toModule(require_react_dom()); | |
// node_modules/@material-ui/core/esm/SwipeableDrawer/SwipeArea.js | |
var React110 = __toModule(require_react()); | |
var import_prop_types91 = __toModule(require_prop_types()); | |
var styles132 = function styles133(theme) { | |
return { | |
root: { | |
position: "fixed", | |
top: 0, | |
left: 0, | |
bottom: 0, | |
zIndex: theme.zIndex.drawer - 1 | |
}, | |
anchorLeft: { | |
right: "auto" | |
}, | |
anchorRight: { | |
left: "auto", | |
right: 0 | |
}, | |
anchorTop: { | |
bottom: "auto", | |
right: 0 | |
}, | |
anchorBottom: { | |
top: "auto", | |
bottom: 0, | |
right: 0 | |
} | |
}; | |
}; | |
var SwipeArea = React110.forwardRef(function SwipeArea2(props, ref) { | |
var anchor = props.anchor, classes = props.classes, className = props.className, width = props.width, other = _objectWithoutProperties(props, ["anchor", "classes", "className", "width"]); | |
return React110.createElement("div", _extends({ | |
className: clsx_m_default(classes.root, classes["anchor".concat(capitalize(anchor))], className), | |
ref, | |
style: _defineProperty({}, isHorizontal(anchor) ? "width" : "height", width) | |
}, other)); | |
}); | |
true ? SwipeArea.propTypes = { | |
anchor: import_prop_types91.default.oneOf(["left", "top", "right", "bottom"]).isRequired, | |
classes: import_prop_types91.default.object.isRequired, | |
className: import_prop_types91.default.string, | |
width: import_prop_types91.default.number.isRequired | |
} : void 0; | |
var SwipeArea_default = withStyles_default(styles132, { | |
name: "PrivateSwipeArea" | |
})(SwipeArea); | |
// node_modules/@material-ui/core/esm/SwipeableDrawer/SwipeableDrawer.js | |
var UNCERTAINTY_THRESHOLD = 3; | |
var nodeThatClaimedTheSwipe = null; | |
function calculateCurrentX(anchor, touches) { | |
return anchor === "right" ? document.body.offsetWidth - touches[0].pageX : touches[0].pageX; | |
} | |
function calculateCurrentY(anchor, touches) { | |
return anchor === "bottom" ? window.innerHeight - touches[0].clientY : touches[0].clientY; | |
} | |
function getMaxTranslate(horizontalSwipe, paperInstance) { | |
return horizontalSwipe ? paperInstance.clientWidth : paperInstance.clientHeight; | |
} | |
function getTranslate(currentTranslate, startLocation, open, maxTranslate) { | |
return Math.min(Math.max(open ? startLocation - currentTranslate : maxTranslate + startLocation - currentTranslate, 0), maxTranslate); | |
} | |
function getDomTreeShapes(element, rootNode) { | |
var domTreeShapes = []; | |
while (element && element !== rootNode) { | |
var style = window.getComputedStyle(element); | |
if (style.getPropertyValue("position") === "absolute" || style.getPropertyValue("overflow-x") === "hidden") { | |
domTreeShapes = []; | |
} else if (element.clientWidth > 0 && element.scrollWidth > element.clientWidth || element.clientHeight > 0 && element.scrollHeight > element.clientHeight) { | |
domTreeShapes.push(element); | |
} | |
element = element.parentElement; | |
} | |
return domTreeShapes; | |
} | |
function findNativeHandler(_ref5) { | |
var domTreeShapes = _ref5.domTreeShapes, start = _ref5.start, current = _ref5.current, anchor = _ref5.anchor; | |
var axisProperties = { | |
scrollPosition: { | |
x: "scrollLeft", | |
y: "scrollTop" | |
}, | |
scrollLength: { | |
x: "scrollWidth", | |
y: "scrollHeight" | |
}, | |
clientLength: { | |
x: "clientWidth", | |
y: "clientHeight" | |
} | |
}; | |
return domTreeShapes.some(function(shape) { | |
var goingForward = current >= start; | |
if (anchor === "top" || anchor === "left") { | |
goingForward = !goingForward; | |
} | |
var axis = anchor === "left" || anchor === "right" ? "x" : "y"; | |
var scrollPosition = shape[axisProperties.scrollPosition[axis]]; | |
var areNotAtStart = scrollPosition > 0; | |
var areNotAtEnd = scrollPosition + shape[axisProperties.clientLength[axis]] < shape[axisProperties.scrollLength[axis]]; | |
if (goingForward && areNotAtEnd || !goingForward && areNotAtStart) { | |
return shape; | |
} | |
return null; | |
}); | |
} | |
var iOS = typeof navigator !== "undefined" && /iPad|iPhone|iPod/.test(navigator.userAgent); | |
var transitionDurationDefault = { | |
enter: duration.enteringScreen, | |
exit: duration.leavingScreen | |
}; | |
var useEnhancedEffect7 = typeof window !== "undefined" ? React111.useLayoutEffect : React111.useEffect; | |
var SwipeableDrawer = React111.forwardRef(function SwipeableDrawer2(inProps, ref) { | |
var theme = useTheme(); | |
var props = getThemeProps({ | |
name: "MuiSwipeableDrawer", | |
props: _extends({}, inProps), | |
theme | |
}); | |
var _props$anchor = props.anchor, anchor = _props$anchor === void 0 ? "left" : _props$anchor, _props$disableBackdro = props.disableBackdropTransition, disableBackdropTransition = _props$disableBackdro === void 0 ? false : _props$disableBackdro, _props$disableDiscove = props.disableDiscovery, disableDiscovery = _props$disableDiscove === void 0 ? false : _props$disableDiscove, _props$disableSwipeTo = props.disableSwipeToOpen, disableSwipeToOpen = _props$disableSwipeTo === void 0 ? iOS : _props$disableSwipeTo, hideBackdrop = props.hideBackdrop, _props$hysteresis = props.hysteresis, hysteresis = _props$hysteresis === void 0 ? 0.52 : _props$hysteresis, _props$minFlingVeloci = props.minFlingVelocity, minFlingVelocity = _props$minFlingVeloci === void 0 ? 450 : _props$minFlingVeloci, _props$ModalProps = props.ModalProps; | |
_props$ModalProps = _props$ModalProps === void 0 ? {} : _props$ModalProps; | |
var BackdropProps = _props$ModalProps.BackdropProps, ModalPropsProp = _objectWithoutProperties(_props$ModalProps, ["BackdropProps"]), onClose = props.onClose, onOpen = props.onOpen, open = props.open, _props$PaperProps = props.PaperProps, PaperProps = _props$PaperProps === void 0 ? {} : _props$PaperProps, SwipeAreaProps = props.SwipeAreaProps, _props$swipeAreaWidth = props.swipeAreaWidth, swipeAreaWidth = _props$swipeAreaWidth === void 0 ? 20 : _props$swipeAreaWidth, _props$transitionDura = props.transitionDuration, transitionDuration = _props$transitionDura === void 0 ? transitionDurationDefault : _props$transitionDura, _props$variant = props.variant, variant = _props$variant === void 0 ? "temporary" : _props$variant, other = _objectWithoutProperties(props, ["anchor", "disableBackdropTransition", "disableDiscovery", "disableSwipeToOpen", "hideBackdrop", "hysteresis", "minFlingVelocity", "ModalProps", "onClose", "onOpen", "open", "PaperProps", "SwipeAreaProps", "swipeAreaWidth", "transitionDuration", "variant"]); | |
var _React$useState = React111.useState(false), maybeSwiping = _React$useState[0], setMaybeSwiping = _React$useState[1]; | |
var swipeInstance = React111.useRef({ | |
isSwiping: null | |
}); | |
var swipeAreaRef = React111.useRef(); | |
var backdropRef = React111.useRef(); | |
var paperRef = React111.useRef(); | |
var touchDetected = React111.useRef(false); | |
var calculatedDurationRef = React111.useRef(); | |
useEnhancedEffect7(function() { | |
calculatedDurationRef.current = null; | |
}, [open]); | |
var setPosition = React111.useCallback(function(translate) { | |
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; | |
var _options$mode = options.mode, mode = _options$mode === void 0 ? null : _options$mode, _options$changeTransi = options.changeTransition, changeTransition = _options$changeTransi === void 0 ? true : _options$changeTransi; | |
var anchorRtl = getAnchor(theme, anchor); | |
var rtlTranslateMultiplier = ["right", "bottom"].indexOf(anchorRtl) !== -1 ? 1 : -1; | |
var horizontalSwipe = isHorizontal(anchor); | |
var transform = horizontalSwipe ? "translate(".concat(rtlTranslateMultiplier * translate, "px, 0)") : "translate(0, ".concat(rtlTranslateMultiplier * translate, "px)"); | |
var drawerStyle = paperRef.current.style; | |
drawerStyle.webkitTransform = transform; | |
drawerStyle.transform = transform; | |
var transition = ""; | |
if (mode) { | |
transition = theme.transitions.create("all", getTransitionProps({ | |
timeout: transitionDuration | |
}, { | |
mode | |
})); | |
} | |
if (changeTransition) { | |
drawerStyle.webkitTransition = transition; | |
drawerStyle.transition = transition; | |
} | |
if (!disableBackdropTransition && !hideBackdrop) { | |
var backdropStyle = backdropRef.current.style; | |
backdropStyle.opacity = 1 - translate / getMaxTranslate(horizontalSwipe, paperRef.current); | |
if (changeTransition) { | |
backdropStyle.webkitTransition = transition; | |
backdropStyle.transition = transition; | |
} | |
} | |
}, [anchor, disableBackdropTransition, hideBackdrop, theme, transitionDuration]); | |
var handleBodyTouchEnd = useEventCallback(function(event) { | |
if (!touchDetected.current) { | |
return; | |
} | |
nodeThatClaimedTheSwipe = null; | |
touchDetected.current = false; | |
setMaybeSwiping(false); | |
if (!swipeInstance.current.isSwiping) { | |
swipeInstance.current.isSwiping = null; | |
return; | |
} | |
swipeInstance.current.isSwiping = null; | |
var anchorRtl = getAnchor(theme, anchor); | |
var horizontal = isHorizontal(anchor); | |
var current; | |
if (horizontal) { | |
current = calculateCurrentX(anchorRtl, event.changedTouches); | |
} else { | |
current = calculateCurrentY(anchorRtl, event.changedTouches); | |
} | |
var startLocation = horizontal ? swipeInstance.current.startX : swipeInstance.current.startY; | |
var maxTranslate = getMaxTranslate(horizontal, paperRef.current); | |
var currentTranslate = getTranslate(current, startLocation, open, maxTranslate); | |
var translateRatio = currentTranslate / maxTranslate; | |
if (Math.abs(swipeInstance.current.velocity) > minFlingVelocity) { | |
calculatedDurationRef.current = Math.abs((maxTranslate - currentTranslate) / swipeInstance.current.velocity) * 1e3; | |
} | |
if (open) { | |
if (swipeInstance.current.velocity > minFlingVelocity || translateRatio > hysteresis) { | |
onClose(); | |
} else { | |
setPosition(0, { | |
mode: "exit" | |
}); | |
} | |
return; | |
} | |
if (swipeInstance.current.velocity < -minFlingVelocity || 1 - translateRatio > hysteresis) { | |
onOpen(); | |
} else { | |
setPosition(getMaxTranslate(horizontal, paperRef.current), { | |
mode: "enter" | |
}); | |
} | |
}); | |
var handleBodyTouchMove = useEventCallback(function(event) { | |
if (!paperRef.current || !touchDetected.current) { | |
return; | |
} | |
if (nodeThatClaimedTheSwipe != null && nodeThatClaimedTheSwipe !== swipeInstance.current) { | |
return; | |
} | |
var anchorRtl = getAnchor(theme, anchor); | |
var horizontalSwipe = isHorizontal(anchor); | |
var currentX = calculateCurrentX(anchorRtl, event.touches); | |
var currentY = calculateCurrentY(anchorRtl, event.touches); | |
if (open && paperRef.current.contains(event.target) && nodeThatClaimedTheSwipe == null) { | |
var domTreeShapes = getDomTreeShapes(event.target, paperRef.current); | |
var nativeHandler = findNativeHandler({ | |
domTreeShapes, | |
start: horizontalSwipe ? swipeInstance.current.startX : swipeInstance.current.startY, | |
current: horizontalSwipe ? currentX : currentY, | |
anchor | |
}); | |
if (nativeHandler) { | |
nodeThatClaimedTheSwipe = nativeHandler; | |
return; | |
} | |
nodeThatClaimedTheSwipe = swipeInstance.current; | |
} | |
if (swipeInstance.current.isSwiping == null) { | |
var dx = Math.abs(currentX - swipeInstance.current.startX); | |
var dy = Math.abs(currentY - swipeInstance.current.startY); | |
if (dx > dy) { | |
if (event.cancelable) { | |
event.preventDefault(); | |
} | |
} | |
var definitelySwiping = horizontalSwipe ? dx > dy && dx > UNCERTAINTY_THRESHOLD : dy > dx && dy > UNCERTAINTY_THRESHOLD; | |
if (definitelySwiping === true || (horizontalSwipe ? dy > UNCERTAINTY_THRESHOLD : dx > UNCERTAINTY_THRESHOLD)) { | |
swipeInstance.current.isSwiping = definitelySwiping; | |
if (!definitelySwiping) { | |
handleBodyTouchEnd(event); | |
return; | |
} | |
swipeInstance.current.startX = currentX; | |
swipeInstance.current.startY = currentY; | |
if (!disableDiscovery && !open) { | |
if (horizontalSwipe) { | |
swipeInstance.current.startX -= swipeAreaWidth; | |
} else { | |
swipeInstance.current.startY -= swipeAreaWidth; | |
} | |
} | |
} | |
} | |
if (!swipeInstance.current.isSwiping) { | |
return; | |
} | |
var maxTranslate = getMaxTranslate(horizontalSwipe, paperRef.current); | |
var startLocation = horizontalSwipe ? swipeInstance.current.startX : swipeInstance.current.startY; | |
if (open && !swipeInstance.current.paperHit) { | |
startLocation = Math.min(startLocation, maxTranslate); | |
} | |
var translate = getTranslate(horizontalSwipe ? currentX : currentY, startLocation, open, maxTranslate); | |
if (open) { | |
if (!swipeInstance.current.paperHit) { | |
var paperHit = horizontalSwipe ? currentX < maxTranslate : currentY < maxTranslate; | |
if (paperHit) { | |
swipeInstance.current.paperHit = true; | |
swipeInstance.current.startX = currentX; | |
swipeInstance.current.startY = currentY; | |
} else { | |
return; | |
} | |
} else if (translate === 0) { | |
swipeInstance.current.startX = currentX; | |
swipeInstance.current.startY = currentY; | |
} | |
} | |
if (swipeInstance.current.lastTranslate === null) { | |
swipeInstance.current.lastTranslate = translate; | |
swipeInstance.current.lastTime = performance.now() + 1; | |
} | |
var velocity = (translate - swipeInstance.current.lastTranslate) / (performance.now() - swipeInstance.current.lastTime) * 1e3; | |
swipeInstance.current.velocity = swipeInstance.current.velocity * 0.4 + velocity * 0.6; | |
swipeInstance.current.lastTranslate = translate; | |
swipeInstance.current.lastTime = performance.now(); | |
if (event.cancelable) { | |
event.preventDefault(); | |
} | |
setPosition(translate); | |
}); | |
var handleBodyTouchStart = useEventCallback(function(event) { | |
if (event.defaultPrevented) { | |
return; | |
} | |
if (event.muiHandled) { | |
return; | |
} | |
if (open && !backdropRef.current.contains(event.target) && !paperRef.current.contains(event.target)) { | |
return; | |
} | |
var anchorRtl = getAnchor(theme, anchor); | |
var horizontalSwipe = isHorizontal(anchor); | |
var currentX = calculateCurrentX(anchorRtl, event.touches); | |
var currentY = calculateCurrentY(anchorRtl, event.touches); | |
if (!open) { | |
if (disableSwipeToOpen || event.target !== swipeAreaRef.current) { | |
return; | |
} | |
if (horizontalSwipe) { | |
if (currentX > swipeAreaWidth) { | |
return; | |
} | |
} else if (currentY > swipeAreaWidth) { | |
return; | |
} | |
} | |
event.muiHandled = true; | |
nodeThatClaimedTheSwipe = null; | |
swipeInstance.current.startX = currentX; | |
swipeInstance.current.startY = currentY; | |
setMaybeSwiping(true); | |
if (!open && paperRef.current) { | |
setPosition(getMaxTranslate(horizontalSwipe, paperRef.current) + (disableDiscovery ? 20 : -swipeAreaWidth), { | |
changeTransition: false | |
}); | |
} | |
swipeInstance.current.velocity = 0; | |
swipeInstance.current.lastTime = null; | |
swipeInstance.current.lastTranslate = null; | |
swipeInstance.current.paperHit = false; | |
touchDetected.current = true; | |
}); | |
React111.useEffect(function() { | |
if (variant === "temporary") { | |
var doc = ownerDocument(paperRef.current); | |
doc.addEventListener("touchstart", handleBodyTouchStart); | |
doc.addEventListener("touchmove", handleBodyTouchMove, { | |
passive: false | |
}); | |
doc.addEventListener("touchend", handleBodyTouchEnd); | |
return function() { | |
doc.removeEventListener("touchstart", handleBodyTouchStart); | |
doc.removeEventListener("touchmove", handleBodyTouchMove, { | |
passive: false | |
}); | |
doc.removeEventListener("touchend", handleBodyTouchEnd); | |
}; | |
} | |
return void 0; | |
}, [variant, handleBodyTouchStart, handleBodyTouchMove, handleBodyTouchEnd]); | |
React111.useEffect(function() { | |
return function() { | |
if (nodeThatClaimedTheSwipe === swipeInstance.current) { | |
nodeThatClaimedTheSwipe = null; | |
} | |
}; | |
}, []); | |
React111.useEffect(function() { | |
if (!open) { | |
setMaybeSwiping(false); | |
} | |
}, [open]); | |
var handleBackdropRef = React111.useCallback(function(instance) { | |
backdropRef.current = ReactDOM8.findDOMNode(instance); | |
}, []); | |
return React111.createElement(React111.Fragment, null, React111.createElement(Drawer_default, _extends({ | |
open: variant === "temporary" && maybeSwiping ? true : open, | |
variant, | |
ModalProps: _extends({ | |
BackdropProps: _extends({}, BackdropProps, { | |
ref: handleBackdropRef | |
}) | |
}, ModalPropsProp), | |
PaperProps: _extends({}, PaperProps, { | |
style: _extends({ | |
pointerEvents: variant === "temporary" && !open ? "none" : "" | |
}, PaperProps.style), | |
ref: paperRef | |
}), | |
anchor, | |
transitionDuration: calculatedDurationRef.current || transitionDuration, | |
onClose, | |
ref | |
}, other)), !disableSwipeToOpen && variant === "temporary" && React111.createElement(NoSsr_default, null, React111.createElement(SwipeArea_default, _extends({ | |
anchor, | |
ref: swipeAreaRef, | |
width: swipeAreaWidth | |
}, SwipeAreaProps)))); | |
}); | |
true ? SwipeableDrawer.propTypes = { | |
anchor: import_prop_types92.default.oneOf(["left", "top", "right", "bottom"]), | |
children: import_prop_types92.default.node, | |
disableBackdropTransition: import_prop_types92.default.bool, | |
disableDiscovery: import_prop_types92.default.bool, | |
disableSwipeToOpen: import_prop_types92.default.bool, | |
hideBackdrop: import_prop_types92.default.bool, | |
hysteresis: import_prop_types92.default.number, | |
minFlingVelocity: import_prop_types92.default.number, | |
ModalProps: import_prop_types92.default.shape({ | |
BackdropProps: import_prop_types92.default.shape({ | |
component: elementTypeAcceptingRef_default | |
}) | |
}), | |
onClose: import_prop_types92.default.func.isRequired, | |
onOpen: import_prop_types92.default.func.isRequired, | |
open: import_prop_types92.default.bool.isRequired, | |
PaperProps: import_prop_types92.default.shape({ | |
component: elementTypeAcceptingRef_default, | |
style: import_prop_types92.default.object | |
}), | |
SwipeAreaProps: import_prop_types92.default.object, | |
swipeAreaWidth: import_prop_types92.default.number, | |
transitionDuration: import_prop_types92.default.oneOfType([import_prop_types92.default.number, import_prop_types92.default.shape({ | |
enter: import_prop_types92.default.number, | |
exit: import_prop_types92.default.number | |
})]), | |
variant: import_prop_types92.default.oneOf(["permanent", "persistent", "temporary"]) | |
} : void 0; | |
var SwipeableDrawer_default = SwipeableDrawer; | |
// node_modules/@material-ui/core/esm/Switch/Switch.js | |
var React112 = __toModule(require_react()); | |
var import_prop_types93 = __toModule(require_prop_types()); | |
var styles134 = function styles135(theme) { | |
return { | |
root: { | |
display: "inline-flex", | |
width: 34 + 12 * 2, | |
height: 14 + 12 * 2, | |
overflow: "hidden", | |
padding: 12, | |
boxSizing: "border-box", | |
position: "relative", | |
flexShrink: 0, | |
zIndex: 0, | |
verticalAlign: "middle", | |
"@media print": { | |
colorAdjust: "exact" | |
} | |
}, | |
edgeStart: { | |
marginLeft: -8 | |
}, | |
edgeEnd: { | |
marginRight: -8 | |
}, | |
switchBase: { | |
position: "absolute", | |
top: 0, | |
left: 0, | |
zIndex: 1, | |
color: theme.palette.type === "light" ? theme.palette.grey[50] : theme.palette.grey[400], | |
transition: theme.transitions.create(["left", "transform"], { | |
duration: theme.transitions.duration.shortest | |
}), | |
"&$checked": { | |
transform: "translateX(20px)" | |
}, | |
"&$disabled": { | |
color: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[800] | |
}, | |
"&$checked + $track": { | |
opacity: 0.5 | |
}, | |
"&$disabled + $track": { | |
opacity: theme.palette.type === "light" ? 0.12 : 0.1 | |
} | |
}, | |
colorPrimary: { | |
"&$checked": { | |
color: theme.palette.primary.main, | |
"&:hover": { | |
backgroundColor: fade(theme.palette.primary.main, theme.palette.action.hoverOpacity), | |
"@media (hover: none)": { | |
backgroundColor: "transparent" | |
} | |
} | |
}, | |
"&$disabled": { | |
color: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[800] | |
}, | |
"&$checked + $track": { | |
backgroundColor: theme.palette.primary.main | |
}, | |
"&$disabled + $track": { | |
backgroundColor: theme.palette.type === "light" ? theme.palette.common.black : theme.palette.common.white | |
} | |
}, | |
colorSecondary: { | |
"&$checked": { | |
color: theme.palette.secondary.main, | |
"&:hover": { | |
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.hoverOpacity), | |
"@media (hover: none)": { | |
backgroundColor: "transparent" | |
} | |
} | |
}, | |
"&$disabled": { | |
color: theme.palette.type === "light" ? theme.palette.grey[400] : theme.palette.grey[800] | |
}, | |
"&$checked + $track": { | |
backgroundColor: theme.palette.secondary.main | |
}, | |
"&$disabled + $track": { | |
backgroundColor: theme.palette.type === "light" ? theme.palette.common.black : theme.palette.common.white | |
} | |
}, | |
sizeSmall: { | |
width: 40, | |
height: 24, | |
padding: 7, | |
"& $thumb": { | |
width: 16, | |
height: 16 | |
}, | |
"& $switchBase": { | |
padding: 4, | |
"&$checked": { | |
transform: "translateX(16px)" | |
} | |
} | |
}, | |
checked: {}, | |
disabled: {}, | |
input: { | |
left: "-100%", | |
width: "300%" | |
}, | |
thumb: { | |
boxShadow: theme.shadows[1], | |
backgroundColor: "currentColor", | |
width: 20, | |
height: 20, | |
borderRadius: "50%" | |
}, | |
track: { | |
height: "100%", | |
width: "100%", | |
borderRadius: 14 / 2, | |
zIndex: -1, | |
transition: theme.transitions.create(["opacity", "background-color"], { | |
duration: theme.transitions.duration.shortest | |
}), | |
backgroundColor: theme.palette.type === "light" ? theme.palette.common.black : theme.palette.common.white, | |
opacity: theme.palette.type === "light" ? 0.38 : 0.3 | |
} | |
}; | |
}; | |
var Switch = React112.forwardRef(function Switch2(props, ref) { | |
var classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "secondary" : _props$color, _props$edge = props.edge, edge = _props$edge === void 0 ? false : _props$edge, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, other = _objectWithoutProperties(props, ["classes", "className", "color", "edge", "size"]); | |
var icon = React112.createElement("span", { | |
className: classes.thumb | |
}); | |
return React112.createElement("span", { | |
className: clsx_m_default(classes.root, className, { | |
start: classes.edgeStart, | |
end: classes.edgeEnd | |
}[edge], size === "small" && classes["size".concat(capitalize(size))]) | |
}, React112.createElement(SwitchBase_default, _extends({ | |
type: "checkbox", | |
icon, | |
checkedIcon: icon, | |
classes: { | |
root: clsx_m_default(classes.switchBase, classes["color".concat(capitalize(color))]), | |
input: classes.input, | |
checked: classes.checked, | |
disabled: classes.disabled | |
}, | |
ref | |
}, other)), React112.createElement("span", { | |
className: classes.track | |
})); | |
}); | |
true ? Switch.propTypes = { | |
checked: import_prop_types93.default.bool, | |
checkedIcon: import_prop_types93.default.node, | |
classes: import_prop_types93.default.object, | |
className: import_prop_types93.default.string, | |
color: import_prop_types93.default.oneOf(["default", "primary", "secondary"]), | |
defaultChecked: import_prop_types93.default.bool, | |
disabled: import_prop_types93.default.bool, | |
disableRipple: import_prop_types93.default.bool, | |
edge: import_prop_types93.default.oneOf(["end", "start", false]), | |
icon: import_prop_types93.default.node, | |
id: import_prop_types93.default.string, | |
inputProps: import_prop_types93.default.object, | |
inputRef: refType_default, | |
onChange: import_prop_types93.default.func, | |
required: import_prop_types93.default.bool, | |
size: import_prop_types93.default.oneOf(["medium", "small"]), | |
value: import_prop_types93.default.any | |
} : void 0; | |
var Switch_default = withStyles_default(styles134, { | |
name: "MuiSwitch" | |
})(Switch); | |
// node_modules/@material-ui/core/esm/Table/Table.js | |
var React114 = __toModule(require_react()); | |
var import_prop_types94 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Table/TableContext.js | |
var React113 = __toModule(require_react()); | |
var TableContext = React113.createContext(); | |
if (true) { | |
TableContext.displayName = "TableContext"; | |
} | |
var TableContext_default = TableContext; | |
// node_modules/@material-ui/core/esm/Table/Table.js | |
var styles136 = function styles137(theme) { | |
return { | |
root: { | |
display: "table", | |
width: "100%", | |
borderCollapse: "collapse", | |
borderSpacing: 0, | |
"& caption": _extends({}, theme.typography.body2, { | |
padding: theme.spacing(2), | |
color: theme.palette.text.secondary, | |
textAlign: "left", | |
captionSide: "bottom" | |
}) | |
}, | |
stickyHeader: { | |
borderCollapse: "separate" | |
} | |
}; | |
}; | |
var defaultComponent = "table"; | |
var Table = React114.forwardRef(function Table2(props, ref) { | |
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent : _props$component, _props$padding = props.padding, padding = _props$padding === void 0 ? "default" : _props$padding, _props$size = props.size, size = _props$size === void 0 ? "medium" : _props$size, _props$stickyHeader = props.stickyHeader, stickyHeader = _props$stickyHeader === void 0 ? false : _props$stickyHeader, other = _objectWithoutProperties(props, ["classes", "className", "component", "padding", "size", "stickyHeader"]); | |
var table = React114.useMemo(function() { | |
return { | |
padding, | |
size, | |
stickyHeader | |
}; | |
}, [padding, size, stickyHeader]); | |
return React114.createElement(TableContext_default.Provider, { | |
value: table | |
}, React114.createElement(Component3, _extends({ | |
role: Component3 === defaultComponent ? null : "table", | |
ref, | |
className: clsx_m_default(classes.root, className, stickyHeader && classes.stickyHeader) | |
}, other))); | |
}); | |
true ? Table.propTypes = { | |
children: import_prop_types94.default.node.isRequired, | |
classes: import_prop_types94.default.object.isRequired, | |
className: import_prop_types94.default.string, | |
component: import_prop_types94.default.elementType, | |
padding: import_prop_types94.default.oneOf(["default", "checkbox", "none"]), | |
size: import_prop_types94.default.oneOf(["small", "medium"]), | |
stickyHeader: import_prop_types94.default.bool | |
} : void 0; | |
var Table_default = withStyles_default(styles136, { | |
name: "MuiTable" | |
})(Table); | |
// node_modules/@material-ui/core/esm/TableBody/TableBody.js | |
var React116 = __toModule(require_react()); | |
var import_prop_types95 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/Table/Tablelvl2Context.js | |
var React115 = __toModule(require_react()); | |
var Tablelvl2Context = React115.createContext(); | |
if (true) { | |
Tablelvl2Context.displayName = "Tablelvl2Context"; | |
} | |
var Tablelvl2Context_default = Tablelvl2Context; | |
// node_modules/@material-ui/core/esm/TableBody/TableBody.js | |
var styles138 = { | |
root: { | |
display: "table-row-group" | |
} | |
}; | |
var tablelvl2 = { | |
variant: "body" | |
}; | |
var defaultComponent2 = "tbody"; | |
var TableBody = React116.forwardRef(function TableBody2(props, ref) { | |
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent2 : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]); | |
return React116.createElement(Tablelvl2Context_default.Provider, { | |
value: tablelvl2 | |
}, React116.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref, | |
role: Component3 === defaultComponent2 ? null : "rowgroup" | |
}, other))); | |
}); | |
true ? TableBody.propTypes = { | |
children: import_prop_types95.default.node, | |
classes: import_prop_types95.default.object.isRequired, | |
className: import_prop_types95.default.string, | |
component: import_prop_types95.default.elementType | |
} : void 0; | |
var TableBody_default = withStyles_default(styles138, { | |
name: "MuiTableBody" | |
})(TableBody); | |
// node_modules/@material-ui/core/esm/TableCell/TableCell.js | |
var React117 = __toModule(require_react()); | |
var import_prop_types96 = __toModule(require_prop_types()); | |
var styles139 = function styles140(theme) { | |
return { | |
root: _extends({}, theme.typography.body2, { | |
display: "table-cell", | |
verticalAlign: "inherit", | |
borderBottom: "1px solid\n ".concat(theme.palette.type === "light" ? lighten(fade(theme.palette.divider, 1), 0.88) : darken(fade(theme.palette.divider, 1), 0.68)), | |
textAlign: "left", | |
padding: 16 | |
}), | |
head: { | |
color: theme.palette.text.primary, | |
lineHeight: theme.typography.pxToRem(24), | |
fontWeight: theme.typography.fontWeightMedium | |
}, | |
body: { | |
color: theme.palette.text.primary | |
}, | |
footer: { | |
color: theme.palette.text.secondary, | |
lineHeight: theme.typography.pxToRem(21), | |
fontSize: theme.typography.pxToRem(12) | |
}, | |
sizeSmall: { | |
padding: "6px 24px 6px 16px", | |
"&:last-child": { | |
paddingRight: 16 | |
}, | |
"&$paddingCheckbox": { | |
width: 24, | |
padding: "0 12px 0 16px", | |
"&:last-child": { | |
paddingLeft: 12, | |
paddingRight: 16 | |
}, | |
"& > *": { | |
padding: 0 | |
} | |
} | |
}, | |
paddingCheckbox: { | |
width: 48, | |
padding: "0 0 0 4px", | |
"&:last-child": { | |
paddingLeft: 0, | |
paddingRight: 4 | |
} | |
}, | |
paddingNone: { | |
padding: 0, | |
"&:last-child": { | |
padding: 0 | |
} | |
}, | |
alignLeft: { | |
textAlign: "left" | |
}, | |
alignCenter: { | |
textAlign: "center" | |
}, | |
alignRight: { | |
textAlign: "right", | |
flexDirection: "row-reverse" | |
}, | |
alignJustify: { | |
textAlign: "justify" | |
}, | |
stickyHeader: { | |
position: "sticky", | |
top: 0, | |
left: 0, | |
zIndex: 2, | |
backgroundColor: theme.palette.background.default | |
} | |
}; | |
}; | |
var TableCell = React117.forwardRef(function TableCell2(props, ref) { | |
var _props$align = props.align, align = _props$align === void 0 ? "inherit" : _props$align, classes = props.classes, className = props.className, component = props.component, paddingProp = props.padding, scopeProp = props.scope, sizeProp = props.size, sortDirection = props.sortDirection, variantProp = props.variant, other = _objectWithoutProperties(props, ["align", "classes", "className", "component", "padding", "scope", "size", "sortDirection", "variant"]); | |
var table = React117.useContext(TableContext_default); | |
var tablelvl24 = React117.useContext(Tablelvl2Context_default); | |
var isHeadCell = tablelvl24 && tablelvl24.variant === "head"; | |
var role; | |
var Component3; | |
if (component) { | |
Component3 = component; | |
role = isHeadCell ? "columnheader" : "cell"; | |
} else { | |
Component3 = isHeadCell ? "th" : "td"; | |
} | |
var scope = scopeProp; | |
if (!scope && isHeadCell) { | |
scope = "col"; | |
} | |
var padding = paddingProp || (table && table.padding ? table.padding : "default"); | |
var size = sizeProp || (table && table.size ? table.size : "medium"); | |
var variant = variantProp || tablelvl24 && tablelvl24.variant; | |
var ariaSort = null; | |
if (sortDirection) { | |
ariaSort = sortDirection === "asc" ? "ascending" : "descending"; | |
} | |
return React117.createElement(Component3, _extends({ | |
ref, | |
className: clsx_m_default(classes.root, classes[variant], className, align !== "inherit" && classes["align".concat(capitalize(align))], padding !== "default" && classes["padding".concat(capitalize(padding))], size !== "medium" && classes["size".concat(capitalize(size))], variant === "head" && table && table.stickyHeader && classes.stickyHeader), | |
"aria-sort": ariaSort, | |
role, | |
scope | |
}, other)); | |
}); | |
true ? TableCell.propTypes = { | |
align: import_prop_types96.default.oneOf(["center", "inherit", "justify", "left", "right"]), | |
children: import_prop_types96.default.node, | |
classes: import_prop_types96.default.object, | |
className: import_prop_types96.default.string, | |
component: import_prop_types96.default.elementType, | |
padding: import_prop_types96.default.oneOf(["checkbox", "default", "none"]), | |
scope: import_prop_types96.default.string, | |
size: import_prop_types96.default.oneOf(["medium", "small"]), | |
sortDirection: import_prop_types96.default.oneOf(["asc", "desc", false]), | |
variant: import_prop_types96.default.oneOf(["body", "footer", "head"]) | |
} : void 0; | |
var TableCell_default = withStyles_default(styles139, { | |
name: "MuiTableCell" | |
})(TableCell); | |
// node_modules/@material-ui/core/esm/TableContainer/TableContainer.js | |
var React118 = __toModule(require_react()); | |
var import_prop_types97 = __toModule(require_prop_types()); | |
var styles141 = { | |
root: { | |
width: "100%", | |
overflowX: "auto" | |
} | |
}; | |
var TableContainer = React118.forwardRef(function TableContainer2(props, ref) { | |
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? "div" : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]); | |
return React118.createElement(Component3, _extends({ | |
ref, | |
className: clsx_m_default(classes.root, className) | |
}, other)); | |
}); | |
true ? TableContainer.propTypes = { | |
children: import_prop_types97.default.node, | |
classes: import_prop_types97.default.object.isRequired, | |
className: import_prop_types97.default.string, | |
component: import_prop_types97.default.elementType | |
} : void 0; | |
var TableContainer_default = withStyles_default(styles141, { | |
name: "MuiTableContainer" | |
})(TableContainer); | |
// node_modules/@material-ui/core/esm/TableFooter/TableFooter.js | |
var React119 = __toModule(require_react()); | |
var import_prop_types98 = __toModule(require_prop_types()); | |
var styles142 = { | |
root: { | |
display: "table-footer-group" | |
} | |
}; | |
var tablelvl22 = { | |
variant: "footer" | |
}; | |
var defaultComponent3 = "tfoot"; | |
var TableFooter = React119.forwardRef(function TableFooter2(props, ref) { | |
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent3 : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]); | |
return React119.createElement(Tablelvl2Context_default.Provider, { | |
value: tablelvl22 | |
}, React119.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref, | |
role: Component3 === defaultComponent3 ? null : "rowgroup" | |
}, other))); | |
}); | |
true ? TableFooter.propTypes = { | |
children: import_prop_types98.default.node, | |
classes: import_prop_types98.default.object.isRequired, | |
className: import_prop_types98.default.string, | |
component: import_prop_types98.default.elementType | |
} : void 0; | |
var TableFooter_default = withStyles_default(styles142, { | |
name: "MuiTableFooter" | |
})(TableFooter); | |
// node_modules/@material-ui/core/esm/TableHead/TableHead.js | |
var React120 = __toModule(require_react()); | |
var import_prop_types99 = __toModule(require_prop_types()); | |
var styles143 = { | |
root: { | |
display: "table-header-group" | |
} | |
}; | |
var tablelvl23 = { | |
variant: "head" | |
}; | |
var defaultComponent4 = "thead"; | |
var TableHead = React120.forwardRef(function TableHead2(props, ref) { | |
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent4 : _props$component, other = _objectWithoutProperties(props, ["classes", "className", "component"]); | |
return React120.createElement(Tablelvl2Context_default.Provider, { | |
value: tablelvl23 | |
}, React120.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className), | |
ref, | |
role: Component3 === defaultComponent4 ? null : "rowgroup" | |
}, other))); | |
}); | |
true ? TableHead.propTypes = { | |
children: import_prop_types99.default.node, | |
classes: import_prop_types99.default.object.isRequired, | |
className: import_prop_types99.default.string, | |
component: import_prop_types99.default.elementType | |
} : void 0; | |
var TableHead_default = withStyles_default(styles143, { | |
name: "MuiTableHead" | |
})(TableHead); | |
// node_modules/@material-ui/core/esm/TablePagination/TablePagination.js | |
var React122 = __toModule(require_react()); | |
var import_prop_types101 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/TablePagination/TablePaginationActions.js | |
var React121 = __toModule(require_react()); | |
var import_prop_types100 = __toModule(require_prop_types()); | |
var _ref4 = React121.createElement(KeyboardArrowRight_default, null); | |
var _ref22 = React121.createElement(KeyboardArrowLeft_default, null); | |
var _ref32 = React121.createElement(KeyboardArrowLeft_default, null); | |
var _ref42 = React121.createElement(KeyboardArrowRight_default, null); | |
var TablePaginationActions = React121.forwardRef(function TablePaginationActions2(props, ref) { | |
var backIconButtonProps = props.backIconButtonProps, count = props.count, nextIconButtonProps = props.nextIconButtonProps, onChangePage = props.onChangePage, page = props.page, rowsPerPage = props.rowsPerPage, other = _objectWithoutProperties(props, ["backIconButtonProps", "count", "nextIconButtonProps", "onChangePage", "page", "rowsPerPage"]); | |
var theme = useTheme(); | |
var handleBackButtonClick = function handleBackButtonClick2(event) { | |
onChangePage(event, page - 1); | |
}; | |
var handleNextButtonClick = function handleNextButtonClick2(event) { | |
onChangePage(event, page + 1); | |
}; | |
return React121.createElement("div", _extends({ | |
ref | |
}, other), React121.createElement(IconButton_default, _extends({ | |
onClick: handleBackButtonClick, | |
disabled: page === 0, | |
color: "inherit" | |
}, backIconButtonProps), theme.direction === "rtl" ? _ref4 : _ref22), React121.createElement(IconButton_default, _extends({ | |
onClick: handleNextButtonClick, | |
disabled: count !== -1 ? page >= Math.ceil(count / rowsPerPage) - 1 : false, | |
color: "inherit" | |
}, nextIconButtonProps), theme.direction === "rtl" ? _ref32 : _ref42)); | |
}); | |
true ? TablePaginationActions.propTypes = { | |
backIconButtonProps: import_prop_types100.default.object, | |
count: import_prop_types100.default.number.isRequired, | |
nextIconButtonProps: import_prop_types100.default.object, | |
onChangePage: import_prop_types100.default.func.isRequired, | |
page: import_prop_types100.default.number.isRequired, | |
rowsPerPage: import_prop_types100.default.number.isRequired | |
} : void 0; | |
var TablePaginationActions_default = TablePaginationActions; | |
// node_modules/@material-ui/core/esm/TablePagination/TablePagination.js | |
var styles144 = function styles145(theme) { | |
return { | |
root: { | |
color: theme.palette.text.primary, | |
fontSize: theme.typography.pxToRem(14), | |
overflow: "auto", | |
"&:last-child": { | |
padding: 0 | |
} | |
}, | |
toolbar: { | |
minHeight: 52, | |
paddingRight: 2 | |
}, | |
spacer: { | |
flex: "1 1 100%" | |
}, | |
caption: { | |
flexShrink: 0 | |
}, | |
selectRoot: { | |
marginRight: 32, | |
marginLeft: 8 | |
}, | |
select: { | |
paddingLeft: 8, | |
paddingRight: 24, | |
textAlign: "right", | |
textAlignLast: "right" | |
}, | |
selectIcon: {}, | |
input: { | |
color: "inherit", | |
fontSize: "inherit", | |
flexShrink: 0 | |
}, | |
menuItem: {}, | |
actions: { | |
flexShrink: 0, | |
marginLeft: 20 | |
} | |
}; | |
}; | |
var defaultLabelDisplayedRows = function defaultLabelDisplayedRows2(_ref5) { | |
var from = _ref5.from, to = _ref5.to, count = _ref5.count; | |
return "".concat(from, "-").concat(to, " of ").concat(count !== -1 ? count : "more than ".concat(to)); | |
}; | |
var defaultRowsPerPageOptions = [10, 25, 50, 100]; | |
var TablePagination = React122.forwardRef(function TablePagination2(props, ref) { | |
var _props$ActionsCompone = props.ActionsComponent, ActionsComponent = _props$ActionsCompone === void 0 ? TablePaginationActions_default : _props$ActionsCompone, backIconButtonProps = props.backIconButtonProps, _props$backIconButton = props.backIconButtonText, backIconButtonText = _props$backIconButton === void 0 ? "Previous page" : _props$backIconButton, classes = props.classes, className = props.className, colSpanProp = props.colSpan, _props$component = props.component, Component3 = _props$component === void 0 ? TableCell_default : _props$component, count = props.count, _props$labelDisplayed = props.labelDisplayedRows, labelDisplayedRows = _props$labelDisplayed === void 0 ? defaultLabelDisplayedRows : _props$labelDisplayed, _props$labelRowsPerPa = props.labelRowsPerPage, labelRowsPerPage = _props$labelRowsPerPa === void 0 ? "Rows per page:" : _props$labelRowsPerPa, nextIconButtonProps = props.nextIconButtonProps, _props$nextIconButton = props.nextIconButtonText, nextIconButtonText = _props$nextIconButton === void 0 ? "Next page" : _props$nextIconButton, onChangePage = props.onChangePage, onChangeRowsPerPage = props.onChangeRowsPerPage, page = props.page, rowsPerPage = props.rowsPerPage, _props$rowsPerPageOpt = props.rowsPerPageOptions, rowsPerPageOptions = _props$rowsPerPageOpt === void 0 ? defaultRowsPerPageOptions : _props$rowsPerPageOpt, _props$SelectProps = props.SelectProps, SelectProps = _props$SelectProps === void 0 ? {} : _props$SelectProps, other = _objectWithoutProperties(props, ["ActionsComponent", "backIconButtonProps", "backIconButtonText", "classes", "className", "colSpan", "component", "count", "labelDisplayedRows", "labelRowsPerPage", "nextIconButtonProps", "nextIconButtonText", "onChangePage", "onChangeRowsPerPage", "page", "rowsPerPage", "rowsPerPageOptions", "SelectProps"]); | |
var colSpan; | |
if (Component3 === TableCell_default || Component3 === "td") { | |
colSpan = colSpanProp || 1e3; | |
} | |
var selectId = useId(); | |
var labelId = useId(); | |
var MenuItemComponent = SelectProps.native ? "option" : MenuItem_default; | |
return React122.createElement(Component3, _extends({ | |
className: clsx_m_default(classes.root, className), | |
colSpan, | |
ref | |
}, other), React122.createElement(Toolbar_default, { | |
className: classes.toolbar | |
}, React122.createElement("div", { | |
className: classes.spacer | |
}), rowsPerPageOptions.length > 1 && React122.createElement(Typography_default, { | |
color: "inherit", | |
variant: "body2", | |
className: classes.caption, | |
id: labelId | |
}, labelRowsPerPage), rowsPerPageOptions.length > 1 && React122.createElement(Select_default, _extends({ | |
classes: { | |
select: classes.select, | |
icon: classes.selectIcon | |
}, | |
input: React122.createElement(InputBase_default, { | |
className: clsx_m_default(classes.input, classes.selectRoot) | |
}), | |
value: rowsPerPage, | |
onChange: onChangeRowsPerPage, | |
id: selectId, | |
labelId | |
}, SelectProps), rowsPerPageOptions.map(function(rowsPerPageOption) { | |
return React122.createElement(MenuItemComponent, { | |
className: classes.menuItem, | |
key: rowsPerPageOption.value ? rowsPerPageOption.value : rowsPerPageOption, | |
value: rowsPerPageOption.value ? rowsPerPageOption.value : rowsPerPageOption | |
}, rowsPerPageOption.label ? rowsPerPageOption.label : rowsPerPageOption); | |
})), React122.createElement(Typography_default, { | |
color: "inherit", | |
variant: "body2", | |
className: classes.caption | |
}, labelDisplayedRows({ | |
from: count === 0 ? 0 : page * rowsPerPage + 1, | |
to: count !== -1 ? Math.min(count, (page + 1) * rowsPerPage) : (page + 1) * rowsPerPage, | |
count: count === -1 ? -1 : count, | |
page | |
})), React122.createElement(ActionsComponent, { | |
className: classes.actions, | |
backIconButtonProps: _extends({ | |
title: backIconButtonText, | |
"aria-label": backIconButtonText | |
}, backIconButtonProps), | |
count, | |
nextIconButtonProps: _extends({ | |
title: nextIconButtonText, | |
"aria-label": nextIconButtonText | |
}, nextIconButtonProps), | |
onChangePage, | |
page, | |
rowsPerPage | |
}))); | |
}); | |
true ? TablePagination.propTypes = { | |
ActionsComponent: import_prop_types101.default.elementType, | |
backIconButtonProps: import_prop_types101.default.object, | |
backIconButtonText: import_prop_types101.default.string, | |
classes: import_prop_types101.default.object.isRequired, | |
className: import_prop_types101.default.string, | |
colSpan: import_prop_types101.default.number, | |
component: import_prop_types101.default.elementType, | |
count: import_prop_types101.default.number.isRequired, | |
labelDisplayedRows: import_prop_types101.default.func, | |
labelRowsPerPage: import_prop_types101.default.node, | |
nextIconButtonProps: import_prop_types101.default.object, | |
nextIconButtonText: import_prop_types101.default.string, | |
onChangePage: import_prop_types101.default.func.isRequired, | |
onChangeRowsPerPage: import_prop_types101.default.func, | |
page: chainPropTypes(import_prop_types101.default.number.isRequired, function(props) { | |
var count = props.count, page = props.page, rowsPerPage = props.rowsPerPage; | |
if (count === -1) { | |
return null; | |
} | |
var newLastPage = Math.max(0, Math.ceil(count / rowsPerPage) - 1); | |
if (page < 0 || page > newLastPage) { | |
return new Error("Material-UI: The page prop of a TablePagination is out of range " + "(0 to ".concat(newLastPage, ", but page is ").concat(page, ").")); | |
} | |
return null; | |
}), | |
rowsPerPage: import_prop_types101.default.number.isRequired, | |
rowsPerPageOptions: import_prop_types101.default.array, | |
SelectProps: import_prop_types101.default.object | |
} : void 0; | |
var TablePagination_default = withStyles_default(styles144, { | |
name: "MuiTablePagination" | |
})(TablePagination); | |
// node_modules/@material-ui/core/esm/TableRow/TableRow.js | |
var React123 = __toModule(require_react()); | |
var import_prop_types102 = __toModule(require_prop_types()); | |
var styles146 = function styles147(theme) { | |
return { | |
root: { | |
color: "inherit", | |
display: "table-row", | |
verticalAlign: "middle", | |
outline: 0, | |
"&$hover:hover": { | |
backgroundColor: theme.palette.action.hover | |
}, | |
"&$selected, &$selected:hover": { | |
backgroundColor: fade(theme.palette.secondary.main, theme.palette.action.selectedOpacity) | |
} | |
}, | |
selected: {}, | |
hover: {}, | |
head: {}, | |
footer: {} | |
}; | |
}; | |
var defaultComponent5 = "tr"; | |
var TableRow = React123.forwardRef(function TableRow2(props, ref) { | |
var classes = props.classes, className = props.className, _props$component = props.component, Component3 = _props$component === void 0 ? defaultComponent5 : _props$component, _props$hover = props.hover, hover = _props$hover === void 0 ? false : _props$hover, _props$selected = props.selected, selected = _props$selected === void 0 ? false : _props$selected, other = _objectWithoutProperties(props, ["classes", "className", "component", "hover", "selected"]); | |
var tablelvl24 = React123.useContext(Tablelvl2Context_default); | |
return React123.createElement(Component3, _extends({ | |
ref, | |
className: clsx_m_default(classes.root, className, tablelvl24 && { | |
head: classes.head, | |
footer: classes.footer | |
}[tablelvl24.variant], hover && classes.hover, selected && classes.selected), | |
role: Component3 === defaultComponent5 ? null : "row" | |
}, other)); | |
}); | |
true ? TableRow.propTypes = { | |
children: import_prop_types102.default.node, | |
classes: import_prop_types102.default.object.isRequired, | |
className: import_prop_types102.default.string, | |
component: import_prop_types102.default.elementType, | |
hover: import_prop_types102.default.bool, | |
selected: import_prop_types102.default.bool | |
} : void 0; | |
var TableRow_default = withStyles_default(styles146, { | |
name: "MuiTableRow" | |
})(TableRow); | |
// node_modules/@material-ui/core/esm/TableSortLabel/TableSortLabel.js | |
var React125 = __toModule(require_react()); | |
var import_prop_types103 = __toModule(require_prop_types()); | |
// node_modules/@material-ui/core/esm/internal/svg-icons/ArrowDownward.js | |
var React124 = __toModule(require_react()); | |
var ArrowDownward_default = createSvgIcon(React124.createElement("path", { | |
d: "M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z" | |
}), "ArrowDownward"); | |
// node_modules/@material-ui/core/esm/TableSortLabel/TableSortLabel.js | |
var styles148 = function styles149(theme) { | |
return { | |
root: { | |
cursor: "pointer", | |
display: "inline-flex", | |
justifyContent: "flex-start", | |
flexDirection: "inherit", | |
alignItems: "center", | |
"&:focus": { | |
color: theme.palette.text.secondary | |
}, | |
"&:hover": { | |
color: theme.palette.text.secondary, | |
"& $icon": { | |
opacity: 0.5 | |
} | |
}, | |
"&$active": { | |
color: theme.palette.text.primary, | |
"&& $icon": { | |
opacity: 1, | |
color: theme.palette.text.secondary | |
} | |
} | |
}, | |
active: {}, | |
icon: { | |
fontSize: 18, | |
marginRight: 4, | |
marginLeft: 4, | |
opacity: 0, | |
transition: theme.transitions.create(["opacity", "transform"], { | |
duration: theme.transitions.duration.shorter | |
}), | |
userSelect: "none" | |
}, | |
iconDirectionDesc: { | |
transform: "rotate(0deg)" | |
}, | |
iconDirectionAsc: { | |
transform: "rotate(180deg)" | |
} | |
}; | |
}; | |
var TableSortLabel = React125.forwardRef(function TableSortLabel2(props, ref) { | |
var _props$active = props.active, active = _props$active === void 0 ? false : _props$active, children = props.children, classes = props.classes, className = props.className, _props$direction = props.direction, direction = _props$direction === void 0 ? "asc" : _props$direction, _props$hideSortIcon = props.hideSortIcon, hideSortIcon = _props$hideSortIcon === void 0 ? false : _props$hideSortIcon, _props$IconComponent = props.IconComponent, IconComponent = _props$IconComponent === void 0 ? ArrowDownward_default : _props$IconComponent, other = _objectWithoutProperties(props, ["active", "children", "classes", "className", "direction", "hideSortIcon", "IconComponent"]); | |
return React125.createElement(ButtonBase_default, _extends({ | |
className: clsx_m_default(classes.root, className, active && classes.active), | |
component: "span", | |
disableRipple: true, | |
ref | |
}, other), children, hideSortIcon && !active ? null : React125.createElement(IconComponent, { | |
className: clsx_m_default(classes.icon, classes["iconDirection".concat(capitalize(direction))]) | |
})); | |
}); | |
true ? TableSortLabel.propTypes = { | |
active: import_prop_types103.default.bool, | |
children: import_prop_types103.default.node, | |
classes: import_prop_types103.default.object.isRequired, | |
className: import_prop_types103.default.string, | |
direction: import_prop_types103.default.oneOf(["asc", "desc"]), | |
hideSortIcon: import_prop_types103.default.bool, | |
IconComponent: import_prop_types103.default.elementType | |
} : void 0; | |
var TableSortLabel_default = withStyles_default(styles148, { | |
name: "MuiTableSortLabel" | |
})(TableSortLabel); | |
// node_modules/@material-ui/core/esm/TextField/TextField.js | |
var React126 = __toModule(require_react()); | |
var import_prop_types104 = __toModule(require_prop_types()); | |
var variantComponent = { | |
standard: Input_default, | |
filled: FilledInput_default, | |
outlined: OutlinedInput_default | |
}; | |
var styles150 = { | |
root: {} | |
}; | |
var TextField = React126.forwardRef(function TextField2(props, ref) { | |
var autoComplete = props.autoComplete, _props$autoFocus = props.autoFocus, autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus, children = props.children, classes = props.classes, className = props.className, _props$color = props.color, color = _props$color === void 0 ? "primary" : _props$color, defaultValue = props.defaultValue, _props$disabled = props.disabled, disabled = _props$disabled === void 0 ? false : _props$disabled, _props$error = props.error, error = _props$error === void 0 ? false : _props$error, FormHelperTextProps = props.FormHelperTextProps, _props$fullWidth = props.fullWidth, fullWidth = _props$fullWidth === void 0 ? false : _props$fullWidth, helperText = props.helperText, hiddenLabel = props.hiddenLabel, id = props.id, InputLabelProps = props.InputLabelProps, inputProps = props.inputProps, InputProps = props.InputProps, inputRef = props.inputRef, label = props.label, _props$multiline = props.multiline, multiline = _props$multiline === void 0 ? false : _props$multiline, name = props.name, onBlur = props.onBlur, onChange = props.onChange, onFocus = props.onFocus, placeholder = props.placeholder, _props$required = props.required, required = _props$required === void 0 ? false : _props$required, rows = props.rows, rowsMax = props.rowsMax, _props$select = props.select, select = _props$select === void 0 ? false : _props$select, SelectProps = props.SelectProps, type = props.type, value = props.value, _props$variant = props.variant, variant = _props$variant === void 0 ? "standard" : _props$variant, other = _objectWithoutProperties(props, ["autoComplete", "autoFocus", "children", "classes", "className", "color", "defaultValue", "disabled", "error", "FormHelperTextProps", "fullWidth", "helperText", "hiddenLabel", "id", "InputLabelProps", "inputProps", "InputProps", "inputRef", "label", "multiline", "name", "onBlur", "onChange", "onFocus", "placeholder", "required", "rows", "rowsMax", "select", "SelectProps", "type", "value", "variant"]); | |
if (true) { | |
if (select && !children) { | |
console.error("Material-UI: `children` must be passed when using the `TextField` component with `select`."); | |
} | |
} | |
var InputMore = {}; | |
if (variant === "outlined") { | |
if (InputLabelProps && typeof InputLabelProps.shrink !== "undefined") { | |
InputMore.notched = InputLabelProps.shrink; | |
} | |
if (label) { | |
var _InputLabelProps$requ; | |
var displayRequired = (_InputLabelProps$requ = InputLabelProps === null || InputLabelProps === void 0 ? void 0 : InputLabelProps.required) !== null && _InputLabelProps$requ !== void 0 ? _InputLabelProps$requ : required; | |
InputMore.label = React126.createElement(React126.Fragment, null, label, displayRequired && "\xA0*"); | |
} | |
} | |
if (select) { | |
if (!SelectProps || !SelectProps.native) { | |
InputMore.id = void 0; | |
} | |
InputMore["aria-describedby"] = void 0; | |
} | |
var helperTextId = helperText && id ? "".concat(id, "-helper-text") : void 0; | |
var inputLabelId = label && id ? "".concat(id, "-label") : void 0; | |
var InputComponent = variantComponent[variant]; | |
var InputElement = React126.createElement(InputComponent, _extends({ | |
"aria-describedby": helperTextId, | |
autoComplete, | |
autoFocus, | |
defaultValue, | |
fullWidth, | |
multiline, | |
name, | |
rows, | |
rowsMax, | |
type, | |
value, | |
id, | |
inputRef, | |
onBlur, | |
onChange, | |
onFocus, | |
placeholder, | |
inputProps | |
}, InputMore, InputProps)); | |
return React126.createElement(FormControl_default, _extends({ | |
className: clsx_m_default(classes.root, className), | |
disabled, | |
error, | |
fullWidth, | |
hiddenLabel, | |
ref, | |
required, | |
color, | |
variant | |
}, other), label && React126.createElement(InputLabel_default, _extends({ | |
htmlFor: id, | |
id: inputLabelId | |
}, InputLabelProps), label), select ? React126.createElement(Select_default, _extends({ | |
"aria-describedby": helperTextId, | |
id, | |
labelId: inputLabelId, | |
value, | |
input: InputElement | |
}, SelectProps), children) : InputElement, helperText && React126.createElement(FormHelperText_default, _extends({ | |
id: helperTextId | |
}, FormHelperTextProps), helperText)); | |
}); | |
true ? TextField.propTypes = { | |
autoComplete: import_prop_types104.default.string, | |
autoFocus: import_prop_types104.default.bool, | |
children: import_prop_types104.default.node, | |
classes: import_prop_types104.default.object, | |
className: import_prop_types104.default.string, | |
color: import_prop_types104.default.oneOf(["primary", "secondary"]), | |
defaultValue: import_prop_types104.default.any, | |
disabled: import_prop_types104.default.bool, | |
error: import_prop_types104.default.bool, | |
FormHelperTextProps: import_prop_types104.default.object, | |
fullWidth: import_prop_types104.default.bool, | |
helperText: import_prop_types104.default.node, | |
hiddenLabel: import_prop_types104.default.bool, | |
id: import_prop_types104.default.string, | |
InputLabelProps: import_prop_types104.default.object, | |
inputProps: import_prop_types104.default.object, | |
InputProps: import_prop_types104.default.object, | |
inputRef: refType_default, | |
label: import_prop_types104.default.node, | |
margin: import_prop_types104.default.oneOf(["dense", "none", "normal"]), | |
multiline: import_prop_types104.default.bool, | |
name: import_prop_types104.default.string, | |
onBlur: import_prop_types104.default.func, | |
onChange: import_prop_types104.default.func, | |
onFocus: import_prop_types104.default.func, | |
placeholder: import_prop_types104.default.string, | |
required: import_prop_types104.default.bool, | |
rows: import_prop_types104.default.oneOfType([import_prop_types104.default.number, import_prop_types104.default.string]), | |
rowsMax: import_prop_types104.default.oneOfType([import_prop_types104.default.number, import_prop_types104.default.string]), | |
select: import_prop_types104.default.bool, | |
SelectProps: import_prop_types104.default.object, | |
size: import_prop_types104.default.oneOf(["medium", "small"]), | |
type: import_prop_types104.default.string, | |
value: import_prop_types104.default.any, | |
variant: import_prop_types104.default.oneOf(["filled", "outlined", "standard"]) | |
} : void 0; | |
var TextField_default = withStyles_default(styles150, { | |
name: "MuiTextField" | |
})(TextField); | |
// node_modules/@material-ui/core/esm/Tooltip/Tooltip.js | |
var React127 = __toModule(require_react()); | |
var ReactDOM9 = __toModule(require_react_dom()); | |
var import_prop_types105 = __toModule(require_prop_types()); | |
function round(value) { | |
return Math.round(value * 1e5) / 1e5; | |
} | |
function arrowGenerator() { | |
return { | |
'&[x-placement*="bottom"] $arrow': { | |
top: 0, | |
left: 0, | |
marginTop: "-0.71em", | |
marginLeft: 4, | |
marginRight: 4, | |
"&::before": { | |
transformOrigin: "0 100%" | |
} | |
}, | |
'&[x-placement*="top"] $arrow': { | |
bottom: 0, | |
left: 0, | |
marginBottom: "-0.71em", | |
marginLeft: 4, | |
marginRight: 4, | |
"&::before": { | |
transformOrigin: "100% 0" | |
} | |
}, | |
'&[x-placement*="right"] $arrow': { | |
left: 0, | |
marginLeft: "-0.71em", | |
height: "1em", | |
width: "0.71em", | |
marginTop: 4, | |
marginBottom: 4, | |
"&::before": { | |
transformOrigin: "100% 100%" | |
} | |
}, | |
'&[x-placement*="left"] $arrow': { | |
right: 0, | |
marginRight: "-0.71em", | |
height: "1em", | |
width: "0.71em", | |
marginTop: 4, | |
marginBottom: 4, | |
"&::before": { | |
transformOrigin: "0 0" | |
} | |
} | |
}; | |
} | |
var styles151 = function styles152(theme) { | |
return { | |
popper: { | |
zIndex: theme.zIndex.tooltip, | |
pointerEvents: "none" | |
}, | |
popperInteractive: { | |
pointerEvents: "auto" | |
}, | |
popperArrow: arrowGenerator(), | |
tooltip: { | |
backgroundColor: fade(theme.palette.grey[700], 0.9), | |
borderRadius: theme.shape.borderRadius, | |
color: theme.palette.common.white, | |
fontFamily: theme.typography.fontFamily, | |
padding: "4px 8px", | |
fontSize: theme.typography.pxToRem(10), | |
lineHeight: "".concat(round(14 / 10), "em"), | |
maxWidth: 300, | |
wordWrap: "break-word", | |
fontWeight: theme.typography.fontWeightMedium | |
}, | |
tooltipArrow: { | |
position: "relative", | |
margin: "0" | |
}, | |
arrow: { | |
overflow: "hidden", | |
position: "absolute", | |
width: "1em", | |
height: "0.71em", | |
boxSizing: "border-box", | |
color: fade(theme.palette.grey[700], 0.9), | |
"&::before": { | |
content: '""', | |
margin: "auto", | |
display: "block", | |
width: "100%", | |
height: "100%", | |
backgroundColor: "currentColor", | |
transform: "rotate(45deg)" | |
} | |
}, | |
touch: { | |
padding: "8px 16px", | |
fontSize: theme.typography.pxToRem(14), | |
lineHeight: "".concat(round(16 / 14), "em"), | |
fontWeight: theme.typography.fontWeightRegular | |
}, | |
tooltipPlacementLeft: _defineProperty({ | |
transformOrigin: "right center", | |
margin: "0 24px " | |
}, theme.breakpoints.up("sm"), { | |
margin: "0 14px" | |
}), | |
tooltipPlacementRight: _defineProperty({ | |
transformOrigin: "left center", | |
margin: "0 24px" | |
}, theme.breakpoints.up("sm"), { | |
margin: "0 14px" | |
}), | |
tooltipPlacementTop: _defineProperty({ | |
transformOrigin: "center bottom", | |
margin: "24px 0" | |
}, theme.breakpoints.up("sm"), { | |
margin: "14px 0" | |
}), | |
tooltipPlacementBottom: _defineProperty({ | |
transformOrigin: "center top", | |
margin: "24px 0" | |
}, theme.breakpoints.up("sm"), { | |
margin: "14px 0" | |
}) | |
}; | |
}; | |
var hystersisOpen = false; | |
var hystersisTimer = null; | |
var Tooltip = React127.forwardRef(function Tooltip2(props, ref) { | |
var _props$arrow = props.arrow, arrow = _props$arrow === void 0 ? false : _props$arrow, children = props.children, classes = props.classes, _props$disableFocusLi = props.disableFocusListener, disableFocusListener = _props$disableFocusLi === void 0 ? false : _props$disableFocusLi, _props$disableHoverLi = props.disableHoverListener, disableHoverListener = _props$disableHoverLi === void 0 ? false : _props$disableHoverLi, _props$disableTouchLi = props.disableTouchListener, disableTouchListener = _props$disableTouchLi === void 0 ? false : _props$disableTouchLi, _props$enterDelay = props.enterDelay, enterDelay = _props$enterDelay === void 0 ? 100 : _props$enterDelay, _props$enterNextDelay = props.enterNextDelay, enterNextDelay = _props$enterNextDelay === void 0 ? 0 : _props$enterNextDelay, _props$enterTouchDela = props.enterTouchDelay, enterTouchDelay = _props$enterTouchDela === void 0 ? 700 : _props$enterTouchDela, idProp = props.id, _props$interactive = props.interactive, interactive = _props$interactive === void 0 ? false : _props$interactive, _props$leaveDelay = props.leaveDelay, leaveDelay = _props$leaveDelay === void 0 ? 0 : _props$leaveDelay, _props$leaveTouchDela = props.leaveTouchDelay, leaveTouchDelay = _props$leaveTouchDela === void 0 ? 1500 : _props$leaveTouchDela, onClose = props.onClose, onOpen = props.onOpen, openProp = props.open, _props$placement = props.placement, placement = _props$placement === void 0 ? "bottom" : _props$placement, _props$PopperComponen = props.PopperComponent, PopperComponent = _props$PopperComponen === void 0 ? Popper_default : _props$PopperComponen, PopperProps = props.PopperProps, title = props.title, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Grow_default : _props$TransitionComp, TransitionProps = props.TransitionProps, other = _objectWithoutProperties(props, ["arrow", "children", "classes", "disableFocusListener", "disableHoverListener", "disableTouchListener", "enterDelay", "enterNextDelay", "enterTouchDelay", "id", "interactive", "leaveDelay", "leaveTouchDelay", "onClose", "onOpen", "open", "placement", "PopperComponent", "PopperProps", "title", "TransitionComponent", "TransitionProps"]); | |
var theme = useTheme(); | |
var _React$useState = React127.useState(), childNode = _React$useState[0], setChildNode = _React$useState[1]; | |
var _React$useState2 = React127.useState(null), arrowRef = _React$useState2[0], setArrowRef = _React$useState2[1]; | |
var ignoreNonTouchEvents = React127.useRef(false); | |
var closeTimer = React127.useRef(); | |
var enterTimer = React127.useRef(); | |
var leaveTimer = React127.useRef(); | |
var touchTimer = React127.useRef(); | |
var _useControlled = useControlled({ | |
controlled: openProp, | |
default: false, | |
name: "Tooltip", | |
state: "open" | |
}), _useControlled2 = _slicedToArray(_useControlled, 2), openState = _useControlled2[0], setOpenState = _useControlled2[1]; | |
var open = openState; | |
if (true) { | |
var _React$useRef = React127.useRef(openProp !== void 0), isControlled = _React$useRef.current; | |
React127.useEffect(function() { | |
if (childNode && childNode.disabled && !isControlled && title !== "" && childNode.tagName.toLowerCase() === "button") { | |
console.error(["Material-UI: You are providing a disabled `button` child to the Tooltip component.", "A disabled element does not fire events.", "Tooltip needs to listen to the child element's events to display the title.", "", "Add a simple wrapper element, such as a `span`."].join("\n")); | |
} | |
}, [title, childNode, isControlled]); | |
} | |
var id = useId(idProp); | |
React127.useEffect(function() { | |
return function() { | |
clearTimeout(closeTimer.current); | |
clearTimeout(enterTimer.current); | |
clearTimeout(leaveTimer.current); | |
clearTimeout(touchTimer.current); | |
}; | |
}, []); | |
var handleOpen = function handleOpen2(event) { | |
clearTimeout(hystersisTimer); | |
hystersisOpen = true; | |
setOpenState(true); | |
if (onOpen) { | |
onOpen(event); | |
} | |
}; | |
var handleEnter = function handleEnter2() { | |
var forward = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true; | |
return function(event) { | |
var childrenProps2 = children.props; | |
if (event.type === "mouseover" && childrenProps2.onMouseOver && forward) { | |
childrenProps2.onMouseOver(event); | |
} | |
if (ignoreNonTouchEvents.current && event.type !== "touchstart") { | |
return; | |
} | |
if (childNode) { | |
childNode.removeAttribute("title"); | |
} | |
clearTimeout(enterTimer.current); | |
clearTimeout(leaveTimer.current); | |
if (enterDelay || hystersisOpen && enterNextDelay) { | |
event.persist(); | |
enterTimer.current = setTimeout(function() { | |
handleOpen(event); | |
}, hystersisOpen ? enterNextDelay : enterDelay); | |
} else { | |
handleOpen(event); | |
} | |
}; | |
}; | |
var _useIsFocusVisible = useIsFocusVisible(), isFocusVisible = _useIsFocusVisible.isFocusVisible, onBlurVisible = _useIsFocusVisible.onBlurVisible, focusVisibleRef = _useIsFocusVisible.ref; | |
var _React$useState3 = React127.useState(false), childIsFocusVisible = _React$useState3[0], setChildIsFocusVisible = _React$useState3[1]; | |
var handleBlur = function handleBlur2() { | |
if (childIsFocusVisible) { | |
setChildIsFocusVisible(false); | |
onBlurVisible(); | |
} | |
}; | |
var handleFocus = function handleFocus2() { | |
var forward = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true; | |
return function(event) { | |
if (!childNode) { | |
setChildNode(event.currentTarget); | |
} | |
if (isFocusVisible(event)) { | |
setChildIsFocusVisible(true); | |
handleEnter()(event); | |
} | |
var childrenProps2 = children.props; | |
if (childrenProps2.onFocus && forward) { | |
childrenProps2.onFocus(event); | |
} | |
}; | |
}; | |
var handleClose = function handleClose2(event) { | |
clearTimeout(hystersisTimer); | |
hystersisTimer = setTimeout(function() { | |
hystersisOpen = false; | |
}, 800 + leaveDelay); | |
setOpenState(false); | |
if (onClose) { | |
onClose(event); | |
} | |
clearTimeout(closeTimer.current); | |
closeTimer.current = setTimeout(function() { | |
ignoreNonTouchEvents.current = false; | |
}, theme.transitions.duration.shortest); | |
}; | |
var handleLeave = function handleLeave2() { | |
var forward = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true; | |
return function(event) { | |
var childrenProps2 = children.props; | |
if (event.type === "blur") { | |
if (childrenProps2.onBlur && forward) { | |
childrenProps2.onBlur(event); | |
} | |
handleBlur(); | |
} | |
if (event.type === "mouseleave" && childrenProps2.onMouseLeave && event.currentTarget === childNode) { | |
childrenProps2.onMouseLeave(event); | |
} | |
clearTimeout(enterTimer.current); | |
clearTimeout(leaveTimer.current); | |
event.persist(); | |
leaveTimer.current = setTimeout(function() { | |
handleClose(event); | |
}, leaveDelay); | |
}; | |
}; | |
var detectTouchStart = function detectTouchStart2(event) { | |
ignoreNonTouchEvents.current = true; | |
var childrenProps2 = children.props; | |
if (childrenProps2.onTouchStart) { | |
childrenProps2.onTouchStart(event); | |
} | |
}; | |
var handleTouchStart = function handleTouchStart2(event) { | |
detectTouchStart(event); | |
clearTimeout(leaveTimer.current); | |
clearTimeout(closeTimer.current); | |
clearTimeout(touchTimer.current); | |
event.persist(); | |
touchTimer.current = setTimeout(function() { | |
handleEnter()(event); | |
}, enterTouchDelay); | |
}; | |
var handleTouchEnd = function handleTouchEnd2(event) { | |
if (children.props.onTouchEnd) { | |
children.props.onTouchEnd(event); | |
} | |
clearTimeout(touchTimer.current); | |
clearTimeout(leaveTimer.current); | |
event.persist(); | |
leaveTimer.current = setTimeout(function() { | |
handleClose(event); | |
}, leaveTouchDelay); | |
}; | |
var handleUseRef = useForkRef(setChildNode, ref); | |
var handleFocusRef = useForkRef(focusVisibleRef, handleUseRef); | |
var handleOwnRef = React127.useCallback(function(instance) { | |
setRef(handleFocusRef, ReactDOM9.findDOMNode(instance)); | |
}, [handleFocusRef]); | |
var handleRef = useForkRef(children.ref, handleOwnRef); | |
if (title === "") { | |
open = false; | |
} | |
var shouldShowNativeTitle = !open && !disableHoverListener; | |
var childrenProps = _extends({ | |
"aria-describedby": open ? id : null, | |
title: shouldShowNativeTitle && typeof title === "string" ? title : null | |
}, other, children.props, { | |
className: clsx_m_default(other.className, children.props.className), | |
onTouchStart: detectTouchStart, | |
ref: handleRef | |
}); | |
var interactiveWrapperListeners = {}; | |
if (!disableTouchListener) { | |
childrenProps.onTouchStart = handleTouchStart; | |
childrenProps.onTouchEnd = handleTouchEnd; | |
} | |
if (!disableHoverListener) { | |
childrenProps.onMouseOver = handleEnter(); | |
childrenProps.onMouseLeave = handleLeave(); | |
if (interactive) { | |
interactiveWrapperListeners.onMouseOver = handleEnter(false); | |
interactiveWrapperListeners.onMouseLeave = handleLeave(false); | |
} | |
} | |
if (!disableFocusListener) { | |
childrenProps.onFocus = handleFocus(); | |
childrenProps.onBlur = handleLeave(); | |
if (interactive) { | |
interactiveWrapperListeners.onFocus = handleFocus(false); | |
interactiveWrapperListeners.onBlur = handleLeave(false); | |
} | |
} | |
if (true) { | |
if (children.props.title) { | |
console.error(["Material-UI: You have provided a `title` prop to the child of <Tooltip />.", "Remove this title prop `".concat(children.props.title, "` or the Tooltip component.")].join("\n")); | |
} | |
} | |
var mergedPopperProps = React127.useMemo(function() { | |
return deepmerge({ | |
popperOptions: { | |
modifiers: { | |
arrow: { | |
enabled: Boolean(arrowRef), | |
element: arrowRef | |
} | |
} | |
} | |
}, PopperProps); | |
}, [arrowRef, PopperProps]); | |
return React127.createElement(React127.Fragment, null, React127.cloneElement(children, childrenProps), React127.createElement(PopperComponent, _extends({ | |
className: clsx_m_default(classes.popper, interactive && classes.popperInteractive, arrow && classes.popperArrow), | |
placement, | |
anchorEl: childNode, | |
open: childNode ? open : false, | |
id: childrenProps["aria-describedby"], | |
transition: true | |
}, interactiveWrapperListeners, mergedPopperProps), function(_ref5) { | |
var placementInner = _ref5.placement, TransitionPropsInner = _ref5.TransitionProps; | |
return React127.createElement(TransitionComponent, _extends({ | |
timeout: theme.transitions.duration.shorter | |
}, TransitionPropsInner, TransitionProps), React127.createElement("div", { | |
className: clsx_m_default(classes.tooltip, classes["tooltipPlacement".concat(capitalize(placementInner.split("-")[0]))], ignoreNonTouchEvents.current && classes.touch, arrow && classes.tooltipArrow) | |
}, title, arrow ? React127.createElement("span", { | |
className: classes.arrow, | |
ref: setArrowRef | |
}) : null)); | |
})); | |
}); | |
true ? Tooltip.propTypes = { | |
arrow: import_prop_types105.default.bool, | |
children: elementAcceptingRef_default.isRequired, | |
classes: import_prop_types105.default.object, | |
className: import_prop_types105.default.string, | |
disableFocusListener: import_prop_types105.default.bool, | |
disableHoverListener: import_prop_types105.default.bool, | |
disableTouchListener: import_prop_types105.default.bool, | |
enterDelay: import_prop_types105.default.number, | |
enterNextDelay: import_prop_types105.default.number, | |
enterTouchDelay: import_prop_types105.default.number, | |
id: import_prop_types105.default.string, | |
interactive: import_prop_types105.default.bool, | |
leaveDelay: import_prop_types105.default.number, | |
leaveTouchDelay: import_prop_types105.default.number, | |
onClose: import_prop_types105.default.func, | |
onOpen: import_prop_types105.default.func, | |
open: import_prop_types105.default.bool, | |
placement: import_prop_types105.default.oneOf(["bottom-end", "bottom-start", "bottom", "left-end", "left-start", "left", "right-end", "right-start", "right", "top-end", "top-start", "top"]), | |
PopperComponent: import_prop_types105.default.elementType, | |
PopperProps: import_prop_types105.default.object, | |
title: import_prop_types105.default.node.isRequired, | |
TransitionComponent: import_prop_types105.default.elementType, | |
TransitionProps: import_prop_types105.default.object | |
} : void 0; | |
var Tooltip_default = withStyles_default(styles151, { | |
name: "MuiTooltip", | |
flip: false | |
})(Tooltip); | |
// node_modules/@material-ui/core/esm/useScrollTrigger/useScrollTrigger.js | |
var React128 = __toModule(require_react()); | |
function defaultTrigger(store, options) { | |
var _options$disableHyste = options.disableHysteresis, disableHysteresis = _options$disableHyste === void 0 ? false : _options$disableHyste, _options$threshold = options.threshold, threshold = _options$threshold === void 0 ? 100 : _options$threshold, target = options.target; | |
var previous = store.current; | |
if (target) { | |
store.current = target.pageYOffset !== void 0 ? target.pageYOffset : target.scrollTop; | |
} | |
if (!disableHysteresis && previous !== void 0) { | |
if (store.current < previous) { | |
return false; | |
} | |
} | |
return store.current > threshold; | |
} | |
var defaultTarget = typeof window !== "undefined" ? window : null; | |
function useScrollTrigger() { | |
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; | |
var _options$getTrigger = options.getTrigger, getTrigger = _options$getTrigger === void 0 ? defaultTrigger : _options$getTrigger, _options$target = options.target, target = _options$target === void 0 ? defaultTarget : _options$target, other = _objectWithoutProperties(options, ["getTrigger", "target"]); | |
var store = React128.useRef(); | |
var _React$useState = React128.useState(function() { | |
return getTrigger(store, other); | |
}), trigger = _React$useState[0], setTrigger = _React$useState[1]; | |
React128.useEffect(function() { | |
var handleScroll = function handleScroll2() { | |
setTrigger(getTrigger(store, _extends({ | |
target | |
}, other))); | |
}; | |
handleScroll(); | |
target.addEventListener("scroll", handleScroll); | |
return function() { | |
target.removeEventListener("scroll", handleScroll); | |
}; | |
}, [target, getTrigger, JSON.stringify(other)]); | |
return trigger; | |
} | |
// node_modules/@material-ui/core/esm/withMobileDialog/withMobileDialog.js | |
var React129 = __toModule(require_react()); | |
var import_prop_types106 = __toModule(require_prop_types()); | |
var withMobileDialog = function withMobileDialog2() { | |
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; | |
return function(Component3) { | |
var _options$breakpoint = options.breakpoint, breakpoint = _options$breakpoint === void 0 ? "sm" : _options$breakpoint; | |
function WithMobileDialog(props) { | |
return React129.createElement(Component3, _extends({ | |
fullScreen: isWidthDown(breakpoint, props.width) | |
}, props)); | |
} | |
true ? WithMobileDialog.propTypes = { | |
width: import_prop_types106.default.oneOf(["xs", "sm", "md", "lg", "xl"]).isRequired | |
} : void 0; | |
return withWidth_default()(WithMobileDialog); | |
}; | |
}; | |
var withMobileDialog_default = withMobileDialog; | |
// node_modules/@material-ui/core/esm/Zoom/Zoom.js | |
var React130 = __toModule(require_react()); | |
var import_prop_types107 = __toModule(require_prop_types()); | |
var styles153 = { | |
entering: { | |
transform: "none" | |
}, | |
entered: { | |
transform: "none" | |
} | |
}; | |
var defaultTimeout2 = { | |
enter: duration.enteringScreen, | |
exit: duration.leavingScreen | |
}; | |
var Zoom = React130.forwardRef(function Zoom2(props, ref) { | |
var children = props.children, _props$disableStrictM = props.disableStrictModeCompat, disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM, inProp = props.in, onEnter = props.onEnter, onEntered = props.onEntered, onEntering = props.onEntering, onExit = props.onExit, onExited = props.onExited, onExiting = props.onExiting, style = props.style, _props$timeout = props.timeout, timeout = _props$timeout === void 0 ? defaultTimeout2 : _props$timeout, _props$TransitionComp = props.TransitionComponent, TransitionComponent = _props$TransitionComp === void 0 ? Transition_default : _props$TransitionComp, other = _objectWithoutProperties(props, ["children", "disableStrictModeCompat", "in", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "style", "timeout", "TransitionComponent"]); | |
var theme = useTheme(); | |
var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat; | |
var nodeRef = React130.useRef(null); | |
var foreignRef = useForkRef(children.ref, ref); | |
var handleRef = useForkRef(enableStrictModeCompat ? nodeRef : void 0, foreignRef); | |
var normalizedTransitionCallback = function normalizedTransitionCallback2(callback) { | |
return function(nodeOrAppearing, maybeAppearing) { | |
if (callback) { | |
var _ref5 = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing], _ref23 = _slicedToArray(_ref5, 2), node = _ref23[0], isAppearing = _ref23[1]; | |
if (isAppearing === void 0) { | |
callback(node); | |
} else { | |
callback(node, isAppearing); | |
} | |
} | |
}; | |
}; | |
var handleEntering = normalizedTransitionCallback(onEntering); | |
var handleEnter = normalizedTransitionCallback(function(node, isAppearing) { | |
reflow(node); | |
var transitionProps = getTransitionProps({ | |
style, | |
timeout | |
}, { | |
mode: "enter" | |
}); | |
node.style.webkitTransition = theme.transitions.create("transform", transitionProps); | |
node.style.transition = theme.transitions.create("transform", transitionProps); | |
if (onEnter) { | |
onEnter(node, isAppearing); | |
} | |
}); | |
var handleEntered = normalizedTransitionCallback(onEntered); | |
var handleExiting = normalizedTransitionCallback(onExiting); | |
var handleExit = normalizedTransitionCallback(function(node) { | |
var transitionProps = getTransitionProps({ | |
style, | |
timeout | |
}, { | |
mode: "exit" | |
}); | |
node.style.webkitTransition = theme.transitions.create("transform", transitionProps); | |
node.style.transition = theme.transitions.create("transform", transitionProps); | |
if (onExit) { | |
onExit(node); | |
} | |
}); | |
var handleExited = normalizedTransitionCallback(onExited); | |
return React130.createElement(TransitionComponent, _extends({ | |
appear: true, | |
in: inProp, | |
nodeRef: enableStrictModeCompat ? nodeRef : void 0, | |
onEnter: handleEnter, | |
onEntered: handleEntered, | |
onEntering: handleEntering, | |
onExit: handleExit, | |
onExited: handleExited, | |
onExiting: handleExiting, | |
timeout | |
}, other), function(state, childProps) { | |
return React130.cloneElement(children, _extends({ | |
style: _extends({ | |
transform: "scale(0)", | |
visibility: state === "exited" && !inProp ? "hidden" : void 0 | |
}, styles153[state], style, children.props.style), | |
ref: handleRef | |
}, childProps)); | |
}); | |
}); | |
true ? Zoom.propTypes = { | |
children: import_prop_types107.default.element, | |
disableStrictModeCompat: import_prop_types107.default.bool, | |
in: import_prop_types107.default.bool, | |
onEnter: import_prop_types107.default.func, | |
onEntered: import_prop_types107.default.func, | |
onEntering: import_prop_types107.default.func, | |
onExit: import_prop_types107.default.func, | |
onExited: import_prop_types107.default.func, | |
onExiting: import_prop_types107.default.func, | |
style: import_prop_types107.default.object, | |
timeout: import_prop_types107.default.oneOfType([import_prop_types107.default.number, import_prop_types107.default.shape({ | |
appear: import_prop_types107.default.number, | |
enter: import_prop_types107.default.number, | |
exit: import_prop_types107.default.number | |
})]) | |
} : void 0; | |
var Zoom_default = Zoom; | |
export default require_material_ui_core(); | |
//# sourceMappingURL=@material-ui_core.js.map | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbmRleC5qcyIsImRlcDpAbWF0ZXJpYWwtdWlfY29yZSIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9jb2xvcnMvaW5kZXguanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vY29sb3JzL3B1cnBsZS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9jb2xvcnMvZGVlcFB1cnBsZS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9jb2xvcnMvbGlnaHRCbHVlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9jeWFuLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy90ZWFsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9saWdodEdyZWVuLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9saW1lLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy95ZWxsb3cuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vY29sb3JzL2FtYmVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9kZWVwT3JhbmdlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2NvbG9ycy9icm93bi5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9jb2xvcnMvYmx1ZUdyZXkuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vc3R5bGVzL2NvbG9yTWFuaXB1bGF0b3IuanMiLCIuLi9AbWF0ZXJpYWwtdWkvc3lzdGVtL2VzbS9ib3JkZXJzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL3N5c3RlbS9lc20vY3NzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL3N5c3RlbS9lc20vZmxleGJveC5qcyIsIi4uL0BtYXRlcmlhbC11aS9zeXN0ZW0vZXNtL2dyaWQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvc3lzdGVtL2VzbS9wYWxldHRlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL3N5c3RlbS9lc20vc2hhZG93cy5qcyIsIi4uL0BtYXRlcmlhbC11aS9zeXN0ZW0vZXNtL3NpemluZy5qcyIsIi4uL0BtYXRlcmlhbC11aS9zeXN0ZW0vZXNtL3NwYWNpbmcuanMiLCIuLi9AbWF0ZXJpYWwtdWkvc3lzdGVtL2VzbS90eXBvZ3JhcGh5LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3N0eWxlcy9jcmVhdGVNdWlTdHJpY3RNb2RlVGhlbWUuanMiLCIuLi9AbWF0ZXJpYWwtdWkvc3R5bGVzL2VzbS9UaGVtZVByb3ZpZGVyL1RoZW1lUHJvdmlkZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vc3R5bGVzL2Nzc1V0aWxzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3N0eWxlcy9yZXNwb25zaXZlRm9udFNpemVzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3N0eWxlcy93aXRoVGhlbWUuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vdXRpbHMvZGVwcmVjYXRlZFByb3BUeXBlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3V0aWxzL2lzTXVpRWxlbWVudC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS91dGlscy91c2VDb250cm9sbGVkLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3V0aWxzL3Vuc3RhYmxlX3VzZUlkLmpzIiwiLi4vQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9BcnJheS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9BY2NvcmRpb24vQWNjb3JkaW9uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NvbGxhcHNlL0NvbGxhcHNlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0FjY29yZGlvbi9BY2NvcmRpb25Db250ZXh0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0FjY29yZGlvbkFjdGlvbnMvQWNjb3JkaW9uQWN0aW9ucy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9BY2NvcmRpb25EZXRhaWxzL0FjY29yZGlvbkRldGFpbHMuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQWNjb3JkaW9uU3VtbWFyeS9BY2NvcmRpb25TdW1tYXJ5LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0FwcEJhci9BcHBCYXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQXZhdGFyL0F2YXRhci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvUGVyc29uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0JhZGdlL0JhZGdlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0JvdHRvbU5hdmlnYXRpb24vQm90dG9tTmF2aWdhdGlvbi5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Cb3R0b21OYXZpZ2F0aW9uQWN0aW9uL0JvdHRvbU5hdmlnYXRpb25BY3Rpb24uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQm94L0JveC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9CcmVhZGNydW1icy9CcmVhZGNydW1icy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9CcmVhZGNydW1icy9CcmVhZGNydW1iQ29sbGFwc2VkLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL3N2Zy1pY29ucy9Nb3JlSG9yaXouanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQnV0dG9uR3JvdXAvQnV0dG9uR3JvdXAuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vQ2FyZC9DYXJkLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NhcmRBY3Rpb25BcmVhL0NhcmRBY3Rpb25BcmVhLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NhcmRBY3Rpb25zL0NhcmRBY3Rpb25zLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NhcmRDb250ZW50L0NhcmRDb250ZW50LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NhcmRIZWFkZXIvQ2FyZEhlYWRlci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9DYXJkTWVkaWEvQ2FyZE1lZGlhLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NoZWNrYm94L0NoZWNrYm94LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL1N3aXRjaEJhc2UuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vRm9ybUNvbnRyb2wvdXNlRm9ybUNvbnRyb2wuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vaW50ZXJuYWwvc3ZnLWljb25zL0NoZWNrQm94T3V0bGluZUJsYW5rLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL3N2Zy1pY29ucy9DaGVja0JveC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvSW5kZXRlcm1pbmF0ZUNoZWNrQm94LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NoaXAvQ2hpcC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvQ2FuY2VsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0NpcmN1bGFyUHJvZ3Jlc3MvQ2lyY3VsYXJQcm9ncmVzcy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9DbGlja0F3YXlMaXN0ZW5lci9DbGlja0F3YXlMaXN0ZW5lci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Db250YWluZXIvQ29udGFpbmVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Nzc0Jhc2VsaW5lL0Nzc0Jhc2VsaW5lLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0RpYWxvZ0NvbnRlbnRUZXh0L0RpYWxvZ0NvbnRlbnRUZXh0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0RpYWxvZ1RpdGxlL0RpYWxvZ1RpdGxlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0RpdmlkZXIvRGl2aWRlci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9EcmF3ZXIvRHJhd2VyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1NsaWRlL1NsaWRlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0V4cGFuc2lvblBhbmVsL0V4cGFuc2lvblBhbmVsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0V4cGFuc2lvblBhbmVsL0V4cGFuc2lvblBhbmVsQ29udGV4dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9FeHBhbnNpb25QYW5lbEFjdGlvbnMvRXhwYW5zaW9uUGFuZWxBY3Rpb25zLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0V4cGFuc2lvblBhbmVsRGV0YWlscy9FeHBhbnNpb25QYW5lbERldGFpbHMuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vRXhwYW5zaW9uUGFuZWxTdW1tYXJ5L0V4cGFuc2lvblBhbmVsU3VtbWFyeS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9GYWIvRmFiLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0ZpbGxlZElucHV0L0ZpbGxlZElucHV0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0lucHV0QmFzZS9JbnB1dEJhc2UuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vRm9ybUNvbnRyb2wvZm9ybUNvbnRyb2xTdGF0ZS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UZXh0YXJlYUF1dG9zaXplL1RleHRhcmVhQXV0b3NpemUuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSW5wdXRCYXNlL3V0aWxzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Zvcm1Db250cm9sL0Zvcm1Db250cm9sLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Zvcm1Db250cm9sTGFiZWwvRm9ybUNvbnRyb2xMYWJlbC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Gb3JtR3JvdXAvRm9ybUdyb3VwLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Zvcm1IZWxwZXJUZXh0L0Zvcm1IZWxwZXJUZXh0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0Zvcm1MYWJlbC9Gb3JtTGFiZWwuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vR3JpZExpc3QvR3JpZExpc3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vR3JpZExpc3RUaWxlL0dyaWRMaXN0VGlsZS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9HcmlkTGlzdFRpbGVCYXIvR3JpZExpc3RUaWxlQmFyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0hpZGRlbi9IaWRkZW4uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSGlkZGVuL0hpZGRlbkpzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL3dpdGhXaWR0aC93aXRoV2lkdGguanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSGlkZGVuL0hpZGRlbkNzcy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9JY29uL0ljb24uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSW5wdXQvSW5wdXQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vSW5wdXRMYWJlbC9JbnB1dExhYmVsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0xpbmVhclByb2dyZXNzL0xpbmVhclByb2dyZXNzLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0xpbmsvTGluay5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9MaXN0L0xpc3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTGlzdC9MaXN0Q29udGV4dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9MaXN0SXRlbS9MaXN0SXRlbS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9MaXN0SXRlbUF2YXRhci9MaXN0SXRlbUF2YXRhci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9MaXN0SXRlbUljb24vTGlzdEl0ZW1JY29uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0xpc3RJdGVtU2Vjb25kYXJ5QWN0aW9uL0xpc3RJdGVtU2Vjb25kYXJ5QWN0aW9uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL0xpc3RJdGVtVGV4dC9MaXN0SXRlbVRleHQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTGlzdFN1YmhlYWRlci9MaXN0U3ViaGVhZGVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL01lbnUvTWVudS5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Qb3BvdmVyL1BvcG92ZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTWVudUxpc3QvTWVudUxpc3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTWVudUl0ZW0vTWVudUl0ZW0uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTW9iaWxlU3RlcHBlci9Nb2JpbGVTdGVwcGVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL05hdGl2ZVNlbGVjdC9OYXRpdmVTZWxlY3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vTmF0aXZlU2VsZWN0L05hdGl2ZVNlbGVjdElucHV0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL3N2Zy1pY29ucy9BcnJvd0Ryb3BEb3duLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL05vU3NyL05vU3NyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL091dGxpbmVkSW5wdXQvT3V0bGluZWRJbnB1dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9PdXRsaW5lZElucHV0L05vdGNoZWRPdXRsaW5lLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1JhZGlvL1JhZGlvLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1JhZGlvL1JhZGlvQnV0dG9uSWNvbi5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvUmFkaW9CdXR0b25VbmNoZWNrZWQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vaW50ZXJuYWwvc3ZnLWljb25zL1JhZGlvQnV0dG9uQ2hlY2tlZC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9SYWRpb0dyb3VwL3VzZVJhZGlvR3JvdXAuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vUmFkaW9Hcm91cC9SYWRpb0dyb3VwQ29udGV4dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9SYWRpb0dyb3VwL1JhZGlvR3JvdXAuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vUm9vdFJlZi9Sb290UmVmLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1NlbGVjdC9TZWxlY3QuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU2VsZWN0L1NlbGVjdElucHV0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1NsaWRlci9TbGlkZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU2xpZGVyL1ZhbHVlTGFiZWwuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU25hY2tiYXIvU25hY2tiYXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU25hY2tiYXJDb250ZW50L1NuYWNrYmFyQ29udGVudC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9TdGVwL1N0ZXAuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU3RlcEJ1dHRvbi9TdGVwQnV0dG9uLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1N0ZXBMYWJlbC9TdGVwTGFiZWwuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU3RlcEljb24vU3RlcEljb24uanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vaW50ZXJuYWwvc3ZnLWljb25zL0NoZWNrQ2lyY2xlLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL2ludGVybmFsL3N2Zy1pY29ucy9XYXJuaW5nLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1N0ZXBDb25uZWN0b3IvU3RlcENvbm5lY3Rvci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9TdGVwQ29udGVudC9TdGVwQ29udGVudC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9TdGVwcGVyL1N0ZXBwZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vU3dpcGVhYmxlRHJhd2VyL1N3aXBlYWJsZURyYXdlci5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9Td2lwZWFibGVEcmF3ZXIvU3dpcGVBcmVhLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1N3aXRjaC9Td2l0Y2guanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vVGFibGUvVGFibGUuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vVGFibGUvVGFibGVDb250ZXh0LmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1RhYmxlQm9keS9UYWJsZUJvZHkuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vVGFibGUvVGFibGVsdmwyQ29udGV4dC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UYWJsZUNlbGwvVGFibGVDZWxsLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1RhYmxlQ29udGFpbmVyL1RhYmxlQ29udGFpbmVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1RhYmxlRm9vdGVyL1RhYmxlRm9vdGVyLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1RhYmxlSGVhZC9UYWJsZUhlYWQuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vVGFibGVQYWdpbmF0aW9uL1RhYmxlUGFnaW5hdGlvbi5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UYWJsZVBhZ2luYXRpb24vVGFibGVQYWdpbmF0aW9uQWN0aW9ucy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UYWJsZVJvdy9UYWJsZVJvdy5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UYWJsZVNvcnRMYWJlbC9UYWJsZVNvcnRMYWJlbC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9pbnRlcm5hbC9zdmctaWNvbnMvQXJyb3dEb3dud2FyZC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS9UZXh0RmllbGQvVGV4dEZpZWxkLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1Rvb2x0aXAvVG9vbHRpcC5qcyIsIi4uL0BtYXRlcmlhbC11aS9jb3JlL2VzbS91c2VTY3JvbGxUcmlnZ2VyL3VzZVNjcm9sbFRyaWdnZXIuanMiLCIuLi9AbWF0ZXJpYWwtdWkvY29yZS9lc20vd2l0aE1vYmlsZURpYWxvZy93aXRoTW9iaWxlRGlhbG9nLmpzIiwiLi4vQG1hdGVyaWFsLXVpL2NvcmUvZXNtL1pvb20vWm9vbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2UgTWF0ZXJpYWwtVUkgdjQuMTEuMFxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvZXhwb3J0ICovXG5pbXBvcnQgKiBhcyBjb2xvcnMgZnJvbSAnLi9jb2xvcnMnO1xuZXhwb3J0IHsgY29sb3JzIH07XG5leHBvcnQgKiBmcm9tICcuL3N0eWxlcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWNjb3JkaW9uIH0gZnJvbSAnLi9BY2NvcmRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9BY2NvcmRpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBY2NvcmRpb25BY3Rpb25zIH0gZnJvbSAnLi9BY2NvcmRpb25BY3Rpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vQWNjb3JkaW9uQWN0aW9ucyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEFjY29yZGlvbkRldGFpbHMgfSBmcm9tICcuL0FjY29yZGlvbkRldGFpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9BY2NvcmRpb25EZXRhaWxzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQWNjb3JkaW9uU3VtbWFyeSB9IGZyb20gJy4vQWNjb3JkaW9uU3VtbWFyeSc7XG5leHBvcnQgKiBmcm9tICcuL0FjY29yZGlvblN1bW1hcnknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBBcHBCYXIgfSBmcm9tICcuL0FwcEJhcic7XG5leHBvcnQgKiBmcm9tICcuL0FwcEJhcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEF2YXRhciB9IGZyb20gJy4vQXZhdGFyJztcbmV4cG9ydCAqIGZyb20gJy4vQXZhdGFyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQmFja2Ryb3AgfSBmcm9tICcuL0JhY2tkcm9wJztcbmV4cG9ydCAqIGZyb20gJy4vQmFja2Ryb3AnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCYWRnZSB9IGZyb20gJy4vQmFkZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9CYWRnZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJvdHRvbU5hdmlnYXRpb24gfSBmcm9tICcuL0JvdHRvbU5hdmlnYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Cb3R0b21OYXZpZ2F0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQm90dG9tTmF2aWdhdGlvbkFjdGlvbiB9IGZyb20gJy4vQm90dG9tTmF2aWdhdGlvbkFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0JvdHRvbU5hdmlnYXRpb25BY3Rpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCb3ggfSBmcm9tICcuL0JveCc7XG5leHBvcnQgKiBmcm9tICcuL0JveCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJyZWFkY3J1bWJzIH0gZnJvbSAnLi9CcmVhZGNydW1icyc7XG5leHBvcnQgKiBmcm9tICcuL0JyZWFkY3J1bWJzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQnV0dG9uIH0gZnJvbSAnLi9CdXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9CdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBCdXR0b25CYXNlIH0gZnJvbSAnLi9CdXR0b25CYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vQnV0dG9uQmFzZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEJ1dHRvbkdyb3VwIH0gZnJvbSAnLi9CdXR0b25Hcm91cCc7XG5leHBvcnQgKiBmcm9tICcuL0J1dHRvbkdyb3VwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FyZCB9IGZyb20gJy4vQ2FyZCc7XG5leHBvcnQgKiBmcm9tICcuL0NhcmQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDYXJkQWN0aW9uQXJlYSB9IGZyb20gJy4vQ2FyZEFjdGlvbkFyZWEnO1xuZXhwb3J0ICogZnJvbSAnLi9DYXJkQWN0aW9uQXJlYSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcmRBY3Rpb25zIH0gZnJvbSAnLi9DYXJkQWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0NhcmRBY3Rpb25zJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2FyZENvbnRlbnQgfSBmcm9tICcuL0NhcmRDb250ZW50JztcbmV4cG9ydCAqIGZyb20gJy4vQ2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDYXJkSGVhZGVyIH0gZnJvbSAnLi9DYXJkSGVhZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FyZEhlYWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENhcmRNZWRpYSB9IGZyb20gJy4vQ2FyZE1lZGlhJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FyZE1lZGlhJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2hlY2tib3ggfSBmcm9tICcuL0NoZWNrYm94JztcbmV4cG9ydCAqIGZyb20gJy4vQ2hlY2tib3gnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDaGlwIH0gZnJvbSAnLi9DaGlwJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hpcCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENpcmN1bGFyUHJvZ3Jlc3MgfSBmcm9tICcuL0NpcmN1bGFyUHJvZ3Jlc3MnO1xuZXhwb3J0ICogZnJvbSAnLi9DaXJjdWxhclByb2dyZXNzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ2xpY2tBd2F5TGlzdGVuZXIgfSBmcm9tICcuL0NsaWNrQXdheUxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xpY2tBd2F5TGlzdGVuZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDb2xsYXBzZSB9IGZyb20gJy4vQ29sbGFwc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsYXBzZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIENvbnRhaW5lciB9IGZyb20gJy4vQ29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29udGFpbmVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgQ3NzQmFzZWxpbmUgfSBmcm9tICcuL0Nzc0Jhc2VsaW5lJztcbmV4cG9ydCAqIGZyb20gJy4vQ3NzQmFzZWxpbmUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEaWFsb2cgfSBmcm9tICcuL0RpYWxvZyc7XG5leHBvcnQgKiBmcm9tICcuL0RpYWxvZyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIERpYWxvZ0FjdGlvbnMgfSBmcm9tICcuL0RpYWxvZ0FjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9EaWFsb2dBY3Rpb25zJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRGlhbG9nQ29udGVudCB9IGZyb20gJy4vRGlhbG9nQ29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL0RpYWxvZ0NvbnRlbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEaWFsb2dDb250ZW50VGV4dCB9IGZyb20gJy4vRGlhbG9nQ29udGVudFRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9EaWFsb2dDb250ZW50VGV4dCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIERpYWxvZ1RpdGxlIH0gZnJvbSAnLi9EaWFsb2dUaXRsZSc7XG5leHBvcnQgKiBmcm9tICcuL0RpYWxvZ1RpdGxlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRGl2aWRlciB9IGZyb20gJy4vRGl2aWRlcic7XG5leHBvcnQgKiBmcm9tICcuL0RpdmlkZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBEcmF3ZXIgfSBmcm9tICcuL0RyYXdlcic7XG5leHBvcnQgKiBmcm9tICcuL0RyYXdlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEV4cGFuc2lvblBhbmVsIH0gZnJvbSAnLi9FeHBhbnNpb25QYW5lbCc7XG5leHBvcnQgKiBmcm9tICcuL0V4cGFuc2lvblBhbmVsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRXhwYW5zaW9uUGFuZWxBY3Rpb25zIH0gZnJvbSAnLi9FeHBhbnNpb25QYW5lbEFjdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHBhbnNpb25QYW5lbEFjdGlvbnMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBFeHBhbnNpb25QYW5lbERldGFpbHMgfSBmcm9tICcuL0V4cGFuc2lvblBhbmVsRGV0YWlscyc7XG5leHBvcnQgKiBmcm9tICcuL0V4cGFuc2lvblBhbmVsRGV0YWlscyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEV4cGFuc2lvblBhbmVsU3VtbWFyeSB9IGZyb20gJy4vRXhwYW5zaW9uUGFuZWxTdW1tYXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vRXhwYW5zaW9uUGFuZWxTdW1tYXJ5JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRmFiIH0gZnJvbSAnLi9GYWInO1xuZXhwb3J0ICogZnJvbSAnLi9GYWInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGYWRlIH0gZnJvbSAnLi9GYWRlJztcbmV4cG9ydCAqIGZyb20gJy4vRmFkZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZpbGxlZElucHV0IH0gZnJvbSAnLi9GaWxsZWRJbnB1dCc7XG5leHBvcnQgKiBmcm9tICcuL0ZpbGxlZElucHV0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybUNvbnRyb2wgfSBmcm9tICcuL0Zvcm1Db250cm9sJztcbmV4cG9ydCAqIGZyb20gJy4vRm9ybUNvbnRyb2wnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtQ29udHJvbExhYmVsIH0gZnJvbSAnLi9Gb3JtQ29udHJvbExhYmVsJztcbmV4cG9ydCAqIGZyb20gJy4vRm9ybUNvbnRyb2xMYWJlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEZvcm1Hcm91cCB9IGZyb20gJy4vRm9ybUdyb3VwJztcbmV4cG9ydCAqIGZyb20gJy4vRm9ybUdyb3VwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgRm9ybUhlbHBlclRleHQgfSBmcm9tICcuL0Zvcm1IZWxwZXJUZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vRm9ybUhlbHBlclRleHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBGb3JtTGFiZWwgfSBmcm9tICcuL0Zvcm1MYWJlbCc7XG5leHBvcnQgKiBmcm9tICcuL0Zvcm1MYWJlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdyaWQgfSBmcm9tICcuL0dyaWQnO1xuZXhwb3J0ICogZnJvbSAnLi9HcmlkJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgR3JpZExpc3QgfSBmcm9tICcuL0dyaWRMaXN0JztcbmV4cG9ydCAqIGZyb20gJy4vR3JpZExpc3QnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBHcmlkTGlzdFRpbGUgfSBmcm9tICcuL0dyaWRMaXN0VGlsZSc7XG5leHBvcnQgKiBmcm9tICcuL0dyaWRMaXN0VGlsZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEdyaWRMaXN0VGlsZUJhciB9IGZyb20gJy4vR3JpZExpc3RUaWxlQmFyJztcbmV4cG9ydCAqIGZyb20gJy4vR3JpZExpc3RUaWxlQmFyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgR3JvdyB9IGZyb20gJy4vR3Jvdyc7XG5leHBvcnQgKiBmcm9tICcuL0dyb3cnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBIaWRkZW4gfSBmcm9tICcuL0hpZGRlbic7XG5leHBvcnQgKiBmcm9tICcuL0hpZGRlbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEljb24gfSBmcm9tICcuL0ljb24nO1xuZXhwb3J0ICogZnJvbSAnLi9JY29uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSWNvbkJ1dHRvbiB9IGZyb20gJy4vSWNvbkJ1dHRvbic7XG5leHBvcnQgKiBmcm9tICcuL0ljb25CdXR0b24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnB1dCB9IGZyb20gJy4vSW5wdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnB1dCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIElucHV0QWRvcm5tZW50IH0gZnJvbSAnLi9JbnB1dEFkb3JubWVudCc7XG5leHBvcnQgKiBmcm9tICcuL0lucHV0QWRvcm5tZW50JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSW5wdXRCYXNlIH0gZnJvbSAnLi9JbnB1dEJhc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnB1dEJhc2UnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBJbnB1dExhYmVsIH0gZnJvbSAnLi9JbnB1dExhYmVsJztcbmV4cG9ydCAqIGZyb20gJy4vSW5wdXRMYWJlbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpbmVhclByb2dyZXNzIH0gZnJvbSAnLi9MaW5lYXJQcm9ncmVzcyc7XG5leHBvcnQgKiBmcm9tICcuL0xpbmVhclByb2dyZXNzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGluayB9IGZyb20gJy4vTGluayc7XG5leHBvcnQgKiBmcm9tICcuL0xpbmsnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMaXN0IH0gZnJvbSAnLi9MaXN0JztcbmV4cG9ydCAqIGZyb20gJy4vTGlzdCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpc3RJdGVtIH0gZnJvbSAnLi9MaXN0SXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL0xpc3RJdGVtJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGlzdEl0ZW1BdmF0YXIgfSBmcm9tICcuL0xpc3RJdGVtQXZhdGFyJztcbmV4cG9ydCAqIGZyb20gJy4vTGlzdEl0ZW1BdmF0YXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMaXN0SXRlbUljb24gfSBmcm9tICcuL0xpc3RJdGVtSWNvbic7XG5leHBvcnQgKiBmcm9tICcuL0xpc3RJdGVtSWNvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIExpc3RJdGVtU2Vjb25kYXJ5QWN0aW9uIH0gZnJvbSAnLi9MaXN0SXRlbVNlY29uZGFyeUFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0xpc3RJdGVtU2Vjb25kYXJ5QWN0aW9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTGlzdEl0ZW1UZXh0IH0gZnJvbSAnLi9MaXN0SXRlbVRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9MaXN0SXRlbVRleHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBMaXN0U3ViaGVhZGVyIH0gZnJvbSAnLi9MaXN0U3ViaGVhZGVyJztcbmV4cG9ydCAqIGZyb20gJy4vTGlzdFN1YmhlYWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1lbnUgfSBmcm9tICcuL01lbnUnO1xuZXhwb3J0ICogZnJvbSAnLi9NZW51JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTWVudUl0ZW0gfSBmcm9tICcuL01lbnVJdGVtJztcbmV4cG9ydCAqIGZyb20gJy4vTWVudUl0ZW0nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBNZW51TGlzdCB9IGZyb20gJy4vTWVudUxpc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9NZW51TGlzdCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE1vYmlsZVN0ZXBwZXIgfSBmcm9tICcuL01vYmlsZVN0ZXBwZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2JpbGVTdGVwcGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTW9kYWwgfSBmcm9tICcuL01vZGFsJztcbmV4cG9ydCAqIGZyb20gJy4vTW9kYWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOYXRpdmVTZWxlY3QgfSBmcm9tICcuL05hdGl2ZVNlbGVjdCc7XG5leHBvcnQgKiBmcm9tICcuL05hdGl2ZVNlbGVjdCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE5vU3NyIH0gZnJvbSAnLi9Ob1Nzcic7XG5leHBvcnQgKiBmcm9tICcuL05vU3NyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgT3V0bGluZWRJbnB1dCB9IGZyb20gJy4vT3V0bGluZWRJbnB1dCc7XG5leHBvcnQgKiBmcm9tICcuL091dGxpbmVkSW5wdXQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQYXBlciB9IGZyb20gJy4vUGFwZXInO1xuZXhwb3J0ICogZnJvbSAnLi9QYXBlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFBvcG92ZXIgfSBmcm9tICcuL1BvcG92ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Qb3BvdmVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUG9wcGVyIH0gZnJvbSAnLi9Qb3BwZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Qb3BwZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQb3J0YWwgfSBmcm9tICcuL1BvcnRhbCc7XG5leHBvcnQgKiBmcm9tICcuL1BvcnRhbCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFJhZGlvIH0gZnJvbSAnLi9SYWRpbyc7XG5leHBvcnQgKiBmcm9tICcuL1JhZGlvJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgUmFkaW9Hcm91cCB9IGZyb20gJy4vUmFkaW9Hcm91cCc7XG5leHBvcnQgKiBmcm9tICcuL1JhZGlvR3JvdXAnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBSb290UmVmIH0gZnJvbSAnLi9Sb290UmVmJztcbmV4cG9ydCAqIGZyb20gJy4vUm9vdFJlZic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNlbGVjdCB9IGZyb20gJy4vU2VsZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vU2VsZWN0JztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU2xpZGUgfSBmcm9tICcuL1NsaWRlJztcbmV4cG9ydCAqIGZyb20gJy4vU2xpZGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTbGlkZXIgfSBmcm9tICcuL1NsaWRlcic7XG5leHBvcnQgKiBmcm9tICcuL1NsaWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFNuYWNrYmFyIH0gZnJvbSAnLi9TbmFja2Jhcic7XG5leHBvcnQgKiBmcm9tICcuL1NuYWNrYmFyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU25hY2tiYXJDb250ZW50IH0gZnJvbSAnLi9TbmFja2JhckNvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9TbmFja2JhckNvbnRlbnQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdGVwIH0gZnJvbSAnLi9TdGVwJztcbmV4cG9ydCAqIGZyb20gJy4vU3RlcCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN0ZXBCdXR0b24gfSBmcm9tICcuL1N0ZXBCdXR0b24nO1xuZXhwb3J0ICogZnJvbSAnLi9TdGVwQnV0dG9uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3RlcENvbm5lY3RvciB9IGZyb20gJy4vU3RlcENvbm5lY3Rvcic7XG5leHBvcnQgKiBmcm9tICcuL1N0ZXBDb25uZWN0b3InO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdGVwQ29udGVudCB9IGZyb20gJy4vU3RlcENvbnRlbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9TdGVwQ29udGVudCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN0ZXBJY29uIH0gZnJvbSAnLi9TdGVwSWNvbic7XG5leHBvcnQgKiBmcm9tICcuL1N0ZXBJY29uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3RlcExhYmVsIH0gZnJvbSAnLi9TdGVwTGFiZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9TdGVwTGFiZWwnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTdGVwcGVyIH0gZnJvbSAnLi9TdGVwcGVyJztcbmV4cG9ydCAqIGZyb20gJy4vU3RlcHBlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFN2Z0ljb24gfSBmcm9tICcuL1N2Z0ljb24nO1xuZXhwb3J0ICogZnJvbSAnLi9TdmdJY29uJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgU3dpcGVhYmxlRHJhd2VyIH0gZnJvbSAnLi9Td2lwZWFibGVEcmF3ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Td2lwZWFibGVEcmF3ZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBTd2l0Y2ggfSBmcm9tICcuL1N3aXRjaCc7XG5leHBvcnQgKiBmcm9tICcuL1N3aXRjaCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYiB9IGZyb20gJy4vVGFiJztcbmV4cG9ydCAqIGZyb20gJy4vVGFiJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFibGUgfSBmcm9tICcuL1RhYmxlJztcbmV4cG9ydCAqIGZyb20gJy4vVGFibGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJsZUJvZHkgfSBmcm9tICcuL1RhYmxlQm9keSc7XG5leHBvcnQgKiBmcm9tICcuL1RhYmxlQm9keSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYmxlQ2VsbCB9IGZyb20gJy4vVGFibGVDZWxsJztcbmV4cG9ydCAqIGZyb20gJy4vVGFibGVDZWxsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFibGVDb250YWluZXIgfSBmcm9tICcuL1RhYmxlQ29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vVGFibGVDb250YWluZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJsZUZvb3RlciB9IGZyb20gJy4vVGFibGVGb290ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9UYWJsZUZvb3Rlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYmxlSGVhZCB9IGZyb20gJy4vVGFibGVIZWFkJztcbmV4cG9ydCAqIGZyb20gJy4vVGFibGVIZWFkJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFibGVQYWdpbmF0aW9uIH0gZnJvbSAnLi9UYWJsZVBhZ2luYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9UYWJsZVBhZ2luYXRpb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJsZVJvdyB9IGZyb20gJy4vVGFibGVSb3cnO1xuZXhwb3J0ICogZnJvbSAnLi9UYWJsZVJvdyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRhYmxlU29ydExhYmVsIH0gZnJvbSAnLi9UYWJsZVNvcnRMYWJlbCc7XG5leHBvcnQgKiBmcm9tICcuL1RhYmxlU29ydExhYmVsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGFicyB9IGZyb20gJy4vVGFicyc7XG5leHBvcnQgKiBmcm9tICcuL1RhYnMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUYWJTY3JvbGxCdXR0b24gfSBmcm9tICcuL1RhYlNjcm9sbEJ1dHRvbic7XG5leHBvcnQgKiBmcm9tICcuL1RhYlNjcm9sbEJ1dHRvbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRleHRGaWVsZCB9IGZyb20gJy4vVGV4dEZpZWxkJztcbmV4cG9ydCAqIGZyb20gJy4vVGV4dEZpZWxkJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVGV4dGFyZWFBdXRvc2l6ZSB9IGZyb20gJy4vVGV4dGFyZWFBdXRvc2l6ZSc7XG5leHBvcnQgKiBmcm9tICcuL1RleHRhcmVhQXV0b3NpemUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBUb29sYmFyIH0gZnJvbSAnLi9Ub29sYmFyJztcbmV4cG9ydCAqIGZyb20gJy4vVG9vbGJhcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFRvb2x0aXAgfSBmcm9tICcuL1Rvb2x0aXAnO1xuZXhwb3J0ICogZnJvbSAnLi9Ub29sdGlwJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVHlwb2dyYXBoeSB9IGZyb20gJy4vVHlwb2dyYXBoeSc7XG5leHBvcnQgKiBmcm9tICcuL1R5cG9ncmFwaHknOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG5cbmV4cG9ydCB7IGRlZmF1bHQgYXMgVW5zdGFibGVfVHJhcEZvY3VzIH0gZnJvbSAnLi9VbnN0YWJsZV9UcmFwRm9jdXMnO1xuZXhwb3J0ICogZnJvbSAnLi9VbnN0YWJsZV9UcmFwRm9jdXMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB1c2VNZWRpYVF1ZXJ5IH0gZnJvbSAnLi91c2VNZWRpYVF1ZXJ5JztcbmV4cG9ydCAqIGZyb20gJy4vdXNlTWVkaWFRdWVyeSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHVzZVNjcm9sbFRyaWdnZXIgfSBmcm9tICcuL3VzZVNjcm9sbFRyaWdnZXInO1xuZXhwb3J0ICogZnJvbSAnLi91c2VTY3JvbGxUcmlnZ2VyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgd2l0aE1vYmlsZURpYWxvZyB9IGZyb20gJy4vd2l0aE1vYmlsZURpYWxvZyc7XG5leHBvcnQgKiBmcm9tICcuL3dpdGhNb2JpbGVEaWFsb2cnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB3aXRoV2lkdGggfSBmcm9tICcuL3dpdGhXaWR0aCc7XG5leHBvcnQgKiBmcm9tICcuL3dpdGhXaWR0aCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFpvb20gfSBmcm9tICcuL1pvb20nO1xuZXhwb3J0ICogZnJvbSAnLi9ab29tJzsiLCJcbmV4cG9ydCAqIGZyb20gXCIuL25vZGVfbW9kdWxlcy9AbWF0ZXJpYWwtdWkvY29yZS9lc20vaW5kZXguanNcIiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgY29tbW9uIH0gZnJvbSAnLi9jb21tb24nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByZWQgfSBmcm9tICcuL3JlZCc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBpbmsgfSBmcm9tICcuL3BpbmsnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwdXJwbGUgfSBmcm9tICcuL3B1cnBsZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRlZXBQdXJwbGUgfSBmcm9tICcuL2RlZXBQdXJwbGUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBpbmRpZ28gfSBmcm9tICcuL2luZGlnbyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGJsdWUgfSBmcm9tICcuL2JsdWUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBsaWdodEJsdWUgfSBmcm9tICcuL2xpZ2h0Qmx1ZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGN5YW4gfSBmcm9tICcuL2N5YW4nO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB0ZWFsIH0gZnJvbSAnLi90ZWFsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZ3JlZW4gfSBmcm9tICcuL2dyZWVuJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbGlnaHRHcmVlbiB9IGZyb20gJy4vbGlnaHRHcmVlbic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGxpbWUgfSBmcm9tICcuL2xpbWUnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB5ZWxsb3cgfSBmcm9tICcuL3llbGxvdyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFtYmVyIH0gZnJvbSAnLi9hbWJlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIG9yYW5nZSB9IGZyb20gJy4vb3JhbmdlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVlcE9yYW5nZSB9IGZyb20gJy4vZGVlcE9yYW5nZSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGJyb3duIH0gZnJvbSAnLi9icm93bic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGdyZXkgfSBmcm9tICcuL2dyZXknO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBibHVlR3JleSB9IGZyb20gJy4vYmx1ZUdyZXknOyIsInZhciBwdXJwbGUgPSB7XG4gIDUwOiAnI2YzZTVmNScsXG4gIDEwMDogJyNlMWJlZTcnLFxuICAyMDA6ICcjY2U5M2Q4JyxcbiAgMzAwOiAnI2JhNjhjOCcsXG4gIDQwMDogJyNhYjQ3YmMnLFxuICA1MDA6ICcjOWMyN2IwJyxcbiAgNjAwOiAnIzhlMjRhYScsXG4gIDcwMDogJyM3YjFmYTInLFxuICA4MDA6ICcjNmExYjlhJyxcbiAgOTAwOiAnIzRhMTQ4YycsXG4gIEExMDA6ICcjZWE4MGZjJyxcbiAgQTIwMDogJyNlMDQwZmInLFxuICBBNDAwOiAnI2Q1MDBmOScsXG4gIEE3MDA6ICcjYWEwMGZmJ1xufTtcbmV4cG9ydCBkZWZhdWx0IHB1cnBsZTsiLCJ2YXIgZGVlcFB1cnBsZSA9IHtcbiAgNTA6ICcjZWRlN2Y2JyxcbiAgMTAwOiAnI2QxYzRlOScsXG4gIDIwMDogJyNiMzlkZGInLFxuICAzMDA6ICcjOTU3NWNkJyxcbiAgNDAwOiAnIzdlNTdjMicsXG4gIDUwMDogJyM2NzNhYjcnLFxuICA2MDA6ICcjNWUzNWIxJyxcbiAgNzAwOiAnIzUxMmRhOCcsXG4gIDgwMDogJyM0NTI3YTAnLFxuICA5MDA6ICcjMzExYjkyJyxcbiAgQTEwMDogJyNiMzg4ZmYnLFxuICBBMjAwOiAnIzdjNGRmZicsXG4gIEE0MDA6ICcjNjUxZmZmJyxcbiAgQTcwMDogJyM2MjAwZWEnXG59O1xuZXhwb3J0IGRlZmF1bHQgZGVlcFB1cnBsZTsiLCJ2YXIgbGlnaHRCbHVlID0ge1xuICA1MDogJyNlMWY1ZmUnLFxuICAxMDA6ICcjYjNlNWZjJyxcbiAgMjAwOiAnIzgxZDRmYScsXG4gIDMwMDogJyM0ZmMzZjcnLFxuICA0MDA6ICcjMjliNmY2JyxcbiAgNTAwOiAnIzAzYTlmNCcsXG4gIDYwMDogJyMwMzliZTUnLFxuICA3MDA6ICcjMDI4OGQxJyxcbiAgODAwOiAnIzAyNzdiZCcsXG4gIDkwMDogJyMwMTU3OWInLFxuICBBMTAwOiAnIzgwZDhmZicsXG4gIEEyMDA6ICcjNDBjNGZmJyxcbiAgQTQwMDogJyMwMGIwZmYnLFxuICBBNzAwOiAnIzAwOTFlYSdcbn07XG5leHBvcnQgZGVmYXVsdCBsaWdodEJsdWU7IiwidmFyIGN5YW4gPSB7XG4gIDUwOiAnI2UwZjdmYScsXG4gIDEwMDogJyNiMmViZjInLFxuICAyMDA6ICcjODBkZWVhJyxcbiAgMzAwOiAnIzRkZDBlMScsXG4gIDQwMDogJyMyNmM2ZGEnLFxuICA1MDA6ICcjMDBiY2Q0JyxcbiAgNjAwOiAnIzAwYWNjMScsXG4gIDcwMDogJyMwMDk3YTcnLFxuICA4MDA6ICcjMDA4MzhmJyxcbiAgOTAwOiAnIzAwNjA2NCcsXG4gIEExMDA6ICcjODRmZmZmJyxcbiAgQTIwMDogJyMxOGZmZmYnLFxuICBBNDAwOiAnIzAwZTVmZicsXG4gIEE3MDA6ICcjMDBiOGQ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGN5YW47IiwidmFyIHRlYWwgPSB7XG4gIDUwOiAnI2UwZjJmMScsXG4gIDEwMDogJyNiMmRmZGInLFxuICAyMDA6ICcjODBjYmM0JyxcbiAgMzAwOiAnIzRkYjZhYycsXG4gIDQwMDogJyMyNmE2OWEnLFxuICA1MDA6ICcjMDA5Njg4JyxcbiAgNjAwOiAnIzAwODk3YicsXG4gIDcwMDogJyMwMDc5NmInLFxuICA4MDA6ICcjMDA2OTVjJyxcbiAgOTAwOiAnIzAwNGQ0MCcsXG4gIEExMDA6ICcjYTdmZmViJyxcbiAgQTIwMDogJyM2NGZmZGEnLFxuICBBNDAwOiAnIzFkZTliNicsXG4gIEE3MDA6ICcjMDBiZmE1J1xufTtcbmV4cG9ydCBkZWZhdWx0IHRlYWw7IiwidmFyIGxpZ2h0R3JlZW4gPSB7XG4gIDUwOiAnI2YxZjhlOScsXG4gIDEwMDogJyNkY2VkYzgnLFxuICAyMDA6ICcjYzVlMWE1JyxcbiAgMzAwOiAnI2FlZDU4MScsXG4gIDQwMDogJyM5Y2NjNjUnLFxuICA1MDA6ICcjOGJjMzRhJyxcbiAgNjAwOiAnIzdjYjM0MicsXG4gIDcwMDogJyM2ODlmMzgnLFxuICA4MDA6ICcjNTU4YjJmJyxcbiAgOTAwOiAnIzMzNjkxZScsXG4gIEExMDA6ICcjY2NmZjkwJyxcbiAgQTIwMDogJyNiMmZmNTknLFxuICBBNDAwOiAnIzc2ZmYwMycsXG4gIEE3MDA6ICcjNjRkZDE3J1xufTtcbmV4cG9ydCBkZWZhdWx0IGxpZ2h0R3JlZW47IiwidmFyIGxpbWUgPSB7XG4gIDUwOiAnI2Y5ZmJlNycsXG4gIDEwMDogJyNmMGY0YzMnLFxuICAyMDA6ICcjZTZlZTljJyxcbiAgMzAwOiAnI2RjZTc3NScsXG4gIDQwMDogJyNkNGUxNTcnLFxuICA1MDA6ICcjY2RkYzM5JyxcbiAgNjAwOiAnI2MwY2EzMycsXG4gIDcwMDogJyNhZmI0MmInLFxuICA4MDA6ICcjOWU5ZDI0JyxcbiAgOTAwOiAnIzgyNzcxNycsXG4gIEExMDA6ICcjZjRmZjgxJyxcbiAgQTIwMDogJyNlZWZmNDEnLFxuICBBNDAwOiAnI2M2ZmYwMCcsXG4gIEE3MDA6ICcjYWVlYTAwJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGxpbWU7IiwidmFyIHllbGxvdyA9IHtcbiAgNTA6ICcjZmZmZGU3JyxcbiAgMTAwOiAnI2ZmZjljNCcsXG4gIDIwMDogJyNmZmY1OWQnLFxuICAzMDA6ICcjZmZmMTc2JyxcbiAgNDAwOiAnI2ZmZWU1OCcsXG4gIDUwMDogJyNmZmViM2InLFxuICA2MDA6ICcjZmRkODM1JyxcbiAgNzAwOiAnI2ZiYzAyZCcsXG4gIDgwMDogJyNmOWE4MjUnLFxuICA5MDA6ICcjZjU3ZjE3JyxcbiAgQTEwMDogJyNmZmZmOGQnLFxuICBBMjAwOiAnI2ZmZmYwMCcsXG4gIEE0MDA6ICcjZmZlYTAwJyxcbiAgQTcwMDogJyNmZmQ2MDAnXG59O1xuZXhwb3J0IGRlZmF1bHQgeWVsbG93OyIsInZhciBhbWJlciA9IHtcbiAgNTA6ICcjZmZmOGUxJyxcbiAgMTAwOiAnI2ZmZWNiMycsXG4gIDIwMDogJyNmZmUwODInLFxuICAzMDA6ICcjZmZkNTRmJyxcbiAgNDAwOiAnI2ZmY2EyOCcsXG4gIDUwMDogJyNmZmMxMDcnLFxuICA2MDA6ICcjZmZiMzAwJyxcbiAgNzAwOiAnI2ZmYTAwMCcsXG4gIDgwMDogJyNmZjhmMDAnLFxuICA5MDA6ICcjZmY2ZjAwJyxcbiAgQTEwMDogJyNmZmU1N2YnLFxuICBBMjAwOiAnI2ZmZDc0MCcsXG4gIEE0MDA6ICcjZmZjNDAwJyxcbiAgQTcwMDogJyNmZmFiMDAnXG59O1xuZXhwb3J0IGRlZmF1bHQgYW1iZXI7IiwidmFyIGRlZXBPcmFuZ2UgPSB7XG4gIDUwOiAnI2ZiZTllNycsXG4gIDEwMDogJyNmZmNjYmMnLFxuICAyMDA6ICcjZmZhYjkxJyxcbiAgMzAwOiAnI2ZmOGE2NScsXG4gIDQwMDogJyNmZjcwNDMnLFxuICA1MDA6ICcjZmY1NzIyJyxcbiAgNjAwOiAnI2Y0NTExZScsXG4gIDcwMDogJyNlNjRhMTknLFxuICA4MDA6ICcjZDg0MzE1JyxcbiAgOTAwOiAnI2JmMzYwYycsXG4gIEExMDA6ICcjZmY5ZTgwJyxcbiAgQTIwMDogJyNmZjZlNDAnLFxuICBBNDAwOiAnI2ZmM2QwMCcsXG4gIEE3MDA6ICcjZGQyYzAwJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGRlZXBPcmFuZ2U7IiwidmFyIGJyb3duID0ge1xuICA1MDogJyNlZmViZTknLFxuICAxMDA6ICcjZDdjY2M4JyxcbiAgMjAwOiAnI2JjYWFhNCcsXG4gIDMwMDogJyNhMTg4N2YnLFxuICA0MDA6ICcjOGQ2ZTYzJyxcbiAgNTAwOiAnIzc5NTU0OCcsXG4gIDYwMDogJyM2ZDRjNDEnLFxuICA3MDA6ICcjNWQ0MDM3JyxcbiAgODAwOiAnIzRlMzQyZScsXG4gIDkwMDogJyMzZTI3MjMnLFxuICBBMTAwOiAnI2Q3Y2NjOCcsXG4gIEEyMDA6ICcjYmNhYWE0JyxcbiAgQTQwMDogJyM4ZDZlNjMnLFxuICBBNzAwOiAnIzVkNDAzNydcbn07XG5leHBvcnQgZGVmYXVsdCBicm93bjsiLCJ2YXIgYmx1ZUdyZXkgPSB7XG4gIDUwOiAnI2VjZWZmMScsXG4gIDEwMDogJyNjZmQ4ZGMnLFxuICAyMDA6ICcjYjBiZWM1JyxcbiAgMzAwOiAnIzkwYTRhZScsXG4gIDQwMDogJyM3ODkwOWMnLFxuICA1MDA6ICcjNjA3ZDhiJyxcbiAgNjAwOiAnIzU0NmU3YScsXG4gIDcwMDogJyM0NTVhNjQnLFxuICA4MDA6ICcjMzc0NzRmJyxcbiAgOTAwOiAnIzI2MzIzOCcsXG4gIEExMDA6ICcjY2ZkOGRjJyxcbiAgQTIwMDogJyNiMGJlYzUnLFxuICBBNDAwOiAnIzc4OTA5YycsXG4gIEE3MDA6ICcjNDU1YTY0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGJsdWVHcmV5OyIsImltcG9ydCB7IGZvcm1hdE11aUVycm9yTWVzc2FnZSBhcyBfZm9ybWF0TXVpRXJyb3JNZXNzYWdlIH0gZnJvbSBcIkBtYXRlcmlhbC11aS91dGlsc1wiO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuXG4vKipcbiAqIFJldHVybnMgYSBudW1iZXIgd2hvc2UgdmFsdWUgaXMgbGltaXRlZCB0byB0aGUgZ2l2ZW4gcmFuZ2UuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBjbGFtcGVkXG4gKiBAcGFyYW0ge251bWJlcn0gbWluIFRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgb3V0cHV0IHJhbmdlXG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IFRoZSB1cHBlciBib3VuZGFyeSBvZiB0aGUgb3V0cHV0IHJhbmdlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBBIG51bWJlciBpbiB0aGUgcmFuZ2UgW21pbiwgbWF4XVxuICovXG5mdW5jdGlvbiBjbGFtcCh2YWx1ZSkge1xuICB2YXIgbWluID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICB2YXIgbWF4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAxO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiTWF0ZXJpYWwtVUk6IFRoZSB2YWx1ZSBwcm92aWRlZCBcIi5jb25jYXQodmFsdWUsIFwiIGlzIG91dCBvZiByYW5nZSBbXCIpLmNvbmNhdChtaW4sIFwiLCBcIikuY29uY2F0KG1heCwgXCJdLlwiKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG1pbiwgdmFsdWUpLCBtYXgpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGNvbG9yIGZyb20gQ1NTIGhleCBmb3JtYXQgdG8gQ1NTIHJnYiBmb3JtYXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gSGV4IGNvbG9yLCBpLmUuICNubm4gb3IgI25ubm5ublxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgcmdiIGNvbG9yIHN0cmluZ1xuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGhleFRvUmdiKGNvbG9yKSB7XG4gIGNvbG9yID0gY29sb3Iuc3Vic3RyKDEpO1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKFwiLnsxLFwiLmNvbmNhdChjb2xvci5sZW5ndGggPj0gNiA/IDIgOiAxLCBcIn1cIiksICdnJyk7XG4gIHZhciBjb2xvcnMgPSBjb2xvci5tYXRjaChyZSk7XG5cbiAgaWYgKGNvbG9ycyAmJiBjb2xvcnNbMF0ubGVuZ3RoID09PSAxKSB7XG4gICAgY29sb3JzID0gY29sb3JzLm1hcChmdW5jdGlvbiAobikge1xuICAgICAgcmV0dXJuIG4gKyBuO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9ycyA/IFwicmdiXCIuY29uY2F0KGNvbG9ycy5sZW5ndGggPT09IDQgPyAnYScgOiAnJywgXCIoXCIpLmNvbmNhdChjb2xvcnMubWFwKGZ1bmN0aW9uIChuLCBpbmRleCkge1xuICAgIHJldHVybiBpbmRleCA8IDMgPyBwYXJzZUludChuLCAxNikgOiBNYXRoLnJvdW5kKHBhcnNlSW50KG4sIDE2KSAvIDI1NSAqIDEwMDApIC8gMTAwMDtcbiAgfSkuam9pbignLCAnKSwgXCIpXCIpIDogJyc7XG59XG5cbmZ1bmN0aW9uIGludFRvSGV4KGludCkge1xuICB2YXIgaGV4ID0gaW50LnRvU3RyaW5nKDE2KTtcbiAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIi5jb25jYXQoaGV4KSA6IGhleDtcbn1cbi8qKlxuICogQ29udmVydHMgYSBjb2xvciBmcm9tIENTUyByZ2IgZm9ybWF0IHRvIENTUyBoZXggZm9ybWF0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciAtIFJHQiBjb2xvciwgaS5lLiByZ2IobiwgbiwgbilcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgQ1NTIHJnYiBjb2xvciBzdHJpbmcsIGkuZS4gI25ubm5ublxuICovXG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJnYlRvSGV4KGNvbG9yKSB7XG4gIC8vIElkZW1wb3RlbnRcbiAgaWYgKGNvbG9yLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgIHJldHVybiBjb2xvcjtcbiAgfVxuXG4gIHZhciBfZGVjb21wb3NlQ29sb3IgPSBkZWNvbXBvc2VDb2xvcihjb2xvciksXG4gICAgICB2YWx1ZXMgPSBfZGVjb21wb3NlQ29sb3IudmFsdWVzO1xuXG4gIHJldHVybiBcIiNcIi5jb25jYXQodmFsdWVzLm1hcChmdW5jdGlvbiAobikge1xuICAgIHJldHVybiBpbnRUb0hleChuKTtcbiAgfSkuam9pbignJykpO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGNvbG9yIGZyb20gaHNsIGZvcm1hdCB0byByZ2IgZm9ybWF0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciAtIEhTTCBjb2xvciB2YWx1ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHJnYiBjb2xvciB2YWx1ZXNcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gaHNsVG9SZ2IoY29sb3IpIHtcbiAgY29sb3IgPSBkZWNvbXBvc2VDb2xvcihjb2xvcik7XG4gIHZhciBfY29sb3IgPSBjb2xvcixcbiAgICAgIHZhbHVlcyA9IF9jb2xvci52YWx1ZXM7XG4gIHZhciBoID0gdmFsdWVzWzBdO1xuICB2YXIgcyA9IHZhbHVlc1sxXSAvIDEwMDtcbiAgdmFyIGwgPSB2YWx1ZXNbMl0gLyAxMDA7XG4gIHZhciBhID0gcyAqIE1hdGgubWluKGwsIDEgLSBsKTtcblxuICB2YXIgZiA9IGZ1bmN0aW9uIGYobikge1xuICAgIHZhciBrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAobiArIGggLyAzMCkgJSAxMjtcbiAgICByZXR1cm4gbCAtIGEgKiBNYXRoLm1heChNYXRoLm1pbihrIC0gMywgOSAtIGssIDEpLCAtMSk7XG4gIH07XG5cbiAgdmFyIHR5cGUgPSAncmdiJztcbiAgdmFyIHJnYiA9IFtNYXRoLnJvdW5kKGYoMCkgKiAyNTUpLCBNYXRoLnJvdW5kKGYoOCkgKiAyNTUpLCBNYXRoLnJvdW5kKGYoNCkgKiAyNTUpXTtcblxuICBpZiAoY29sb3IudHlwZSA9PT0gJ2hzbGEnKSB7XG4gICAgdHlwZSArPSAnYSc7XG4gICAgcmdiLnB1c2godmFsdWVzWzNdKTtcbiAgfVxuXG4gIHJldHVybiByZWNvbXBvc2VDb2xvcih7XG4gICAgdHlwZTogdHlwZSxcbiAgICB2YWx1ZXM6IHJnYlxuICB9KTtcbn1cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCB0aGUgdHlwZSBhbmQgdmFsdWVzIG9mIGEgY29sb3IuXG4gKlxuICogTm90ZTogRG9lcyBub3Qgc3VwcG9ydCByZ2IgJSB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gQ1NTIGNvbG9yLCBpLmUuIG9uZSBvZjogI25ubiwgI25ubm5ubiwgcmdiKCksIHJnYmEoKSwgaHNsKCksIGhzbGEoKVxuICogQHJldHVybnMge29iamVjdH0gLSBBIE1VSSBjb2xvciBvYmplY3Q6IHt0eXBlOiBzdHJpbmcsIHZhbHVlczogbnVtYmVyW119XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29tcG9zZUNvbG9yKGNvbG9yKSB7XG4gIC8vIElkZW1wb3RlbnRcbiAgaWYgKGNvbG9yLnR5cGUpIHtcbiAgICByZXR1cm4gY29sb3I7XG4gIH1cblxuICBpZiAoY29sb3IuY2hhckF0KDApID09PSAnIycpIHtcbiAgICByZXR1cm4gZGVjb21wb3NlQ29sb3IoaGV4VG9SZ2IoY29sb3IpKTtcbiAgfVxuXG4gIHZhciBtYXJrZXIgPSBjb2xvci5pbmRleE9mKCcoJyk7XG4gIHZhciB0eXBlID0gY29sb3Iuc3Vic3RyaW5nKDAsIG1hcmtlcik7XG5cbiAgaWYgKFsncmdiJywgJ3JnYmEnLCAnaHNsJywgJ2hzbGEnXS5pbmRleE9mKHR5cGUpID09PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBcIk1hdGVyaWFsLVVJOiBVbnN1cHBvcnRlZCBgXCIuY29uY2F0KGNvbG9yLCBcImAgY29sb3IuXFxuV2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIGZvcm1hdHM6ICNubm4sICNubm5ubm4sIHJnYigpLCByZ2JhKCksIGhzbCgpLCBoc2xhKCkuXCIpIDogX2Zvcm1hdE11aUVycm9yTWVzc2FnZSgzLCBjb2xvcikpO1xuICB9XG5cbiAgdmFyIHZhbHVlcyA9IGNvbG9yLnN1YnN0cmluZyhtYXJrZXIgKyAxLCBjb2xvci5sZW5ndGggLSAxKS5zcGxpdCgnLCcpO1xuICB2YWx1ZXMgPSB2YWx1ZXMubWFwKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICB2YWx1ZXM6IHZhbHVlc1xuICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhIGNvbG9yIG9iamVjdCB3aXRoIHR5cGUgYW5kIHZhbHVlcyB0byBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29sb3IgLSBEZWNvbXBvc2VkIGNvbG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IudHlwZSAtIE9uZSBvZjogJ3JnYicsICdyZ2JhJywgJ2hzbCcsICdoc2xhJ1xuICogQHBhcmFtIHthcnJheX0gY29sb3IudmFsdWVzIC0gW24sbixuXSBvciBbbixuLG4sbl1cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgQ1NTIGNvbG9yIHN0cmluZ1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvbXBvc2VDb2xvcihjb2xvcikge1xuICB2YXIgdHlwZSA9IGNvbG9yLnR5cGU7XG4gIHZhciB2YWx1ZXMgPSBjb2xvci52YWx1ZXM7XG5cbiAgaWYgKHR5cGUuaW5kZXhPZigncmdiJykgIT09IC0xKSB7XG4gICAgLy8gT25seSBjb252ZXJ0IHRoZSBmaXJzdCAzIHZhbHVlcyB0byBpbnQgKGkuZS4gbm90IGFscGhhKVxuICAgIHZhbHVlcyA9IHZhbHVlcy5tYXAoZnVuY3Rpb24gKG4sIGkpIHtcbiAgICAgIHJldHVybiBpIDwgMyA/IHBhcnNlSW50KG4sIDEwKSA6IG47XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodHlwZS5pbmRleE9mKCdoc2wnKSAhPT0gLTEpIHtcbiAgICB2YWx1ZXNbMV0gPSBcIlwiLmNvbmNhdCh2YWx1ZXNbMV0sIFwiJVwiKTtcbiAgICB2YWx1ZXNbMl0gPSBcIlwiLmNvbmNhdCh2YWx1ZXNbMl0sIFwiJVwiKTtcbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdCh0eXBlLCBcIihcIikuY29uY2F0KHZhbHVlcy5qb2luKCcsICcpLCBcIilcIik7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNvbnRyYXN0IHJhdGlvIGJldHdlZW4gdHdvIGNvbG9ycy5cbiAqXG4gKiBGb3JtdWxhOiBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRzIwLVRFQ0hTL0cxNy5odG1sI0cxNy10ZXN0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JlZ3JvdW5kIC0gQ1NTIGNvbG9yLCBpLmUuIG9uZSBvZjogI25ubiwgI25ubm5ubiwgcmdiKCksIHJnYmEoKSwgaHNsKCksIGhzbGEoKVxuICogQHBhcmFtIHtzdHJpbmd9IGJhY2tncm91bmQgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBBIGNvbnRyYXN0IHJhdGlvIHZhbHVlIGluIHRoZSByYW5nZSAwIC0gMjEuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyYXN0UmF0aW8oZm9yZWdyb3VuZCwgYmFja2dyb3VuZCkge1xuICB2YXIgbHVtQSA9IGdldEx1bWluYW5jZShmb3JlZ3JvdW5kKTtcbiAgdmFyIGx1bUIgPSBnZXRMdW1pbmFuY2UoYmFja2dyb3VuZCk7XG4gIHJldHVybiAoTWF0aC5tYXgobHVtQSwgbHVtQikgKyAwLjA1KSAvIChNYXRoLm1pbihsdW1BLCBsdW1CKSArIDAuMDUpO1xufVxuLyoqXG4gKiBUaGUgcmVsYXRpdmUgYnJpZ2h0bmVzcyBvZiBhbnkgcG9pbnQgaW4gYSBjb2xvciBzcGFjZSxcbiAqIG5vcm1hbGl6ZWQgdG8gMCBmb3IgZGFya2VzdCBibGFjayBhbmQgMSBmb3IgbGlnaHRlc3Qgd2hpdGUuXG4gKlxuICogRm9ybXVsYTogaHR0cHM6Ly93d3cudzMub3JnL1RSL1dDQUcyMC1URUNIUy9HMTcuaHRtbCNHMTctdGVzdHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgcmVsYXRpdmUgYnJpZ2h0bmVzcyBvZiB0aGUgY29sb3IgaW4gdGhlIHJhbmdlIDAgLSAxXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEx1bWluYW5jZShjb2xvcikge1xuICBjb2xvciA9IGRlY29tcG9zZUNvbG9yKGNvbG9yKTtcbiAgdmFyIHJnYiA9IGNvbG9yLnR5cGUgPT09ICdoc2wnID8gZGVjb21wb3NlQ29sb3IoaHNsVG9SZ2IoY29sb3IpKS52YWx1ZXMgOiBjb2xvci52YWx1ZXM7XG4gIHJnYiA9IHJnYi5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhbCAvPSAyNTU7IC8vIG5vcm1hbGl6ZWRcblxuICAgIHJldHVybiB2YWwgPD0gMC4wMzkyOCA/IHZhbCAvIDEyLjkyIDogTWF0aC5wb3coKHZhbCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICB9KTsgLy8gVHJ1bmNhdGUgYXQgMyBkaWdpdHNcblxuICByZXR1cm4gTnVtYmVyKCgwLjIxMjYgKiByZ2JbMF0gKyAwLjcxNTIgKiByZ2JbMV0gKyAwLjA3MjIgKiByZ2JbMl0pLnRvRml4ZWQoMykpO1xufVxuLyoqXG4gKiBEYXJrZW4gb3IgbGlnaHRlbiBhIGNvbG9yLCBkZXBlbmRpbmcgb24gaXRzIGx1bWluYW5jZS5cbiAqIExpZ2h0IGNvbG9ycyBhcmUgZGFya2VuZWQsIGRhcmsgY29sb3JzIGFyZSBsaWdodGVuZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gQ1NTIGNvbG9yLCBpLmUuIG9uZSBvZjogI25ubiwgI25ubm5ubiwgcmdiKCksIHJnYmEoKSwgaHNsKCksIGhzbGEoKVxuICogQHBhcmFtIHtudW1iZXJ9IGNvZWZmaWNpZW50PTAuMTUgLSBtdWx0aXBsaWVyIGluIHRoZSByYW5nZSAwIC0gMVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nLiBIZXggaW5wdXQgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyByZ2JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZW1waGFzaXplKGNvbG9yKSB7XG4gIHZhciBjb2VmZmljaWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMC4xNTtcbiAgcmV0dXJuIGdldEx1bWluYW5jZShjb2xvcikgPiAwLjUgPyBkYXJrZW4oY29sb3IsIGNvZWZmaWNpZW50KSA6IGxpZ2h0ZW4oY29sb3IsIGNvZWZmaWNpZW50KTtcbn1cbi8qKlxuICogU2V0IHRoZSBhYnNvbHV0ZSB0cmFuc3BhcmVuY3kgb2YgYSBjb2xvci5cbiAqIEFueSBleGlzdGluZyBhbHBoYSB2YWx1ZXMgYXJlIG92ZXJ3cml0dGVuLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvciAtIENTUyBjb2xvciwgaS5lLiBvbmUgb2Y6ICNubm4sICNubm5ubm4sIHJnYigpLCByZ2JhKCksIGhzbCgpLCBoc2xhKClcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIHZhbHVlIHRvIHNldCB0aGUgYWxwaGEgY2hhbm5lbCB0byBpbiB0aGUgcmFuZ2UgMCAtMVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nLiBIZXggaW5wdXQgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyByZ2JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZmFkZShjb2xvciwgdmFsdWUpIHtcbiAgY29sb3IgPSBkZWNvbXBvc2VDb2xvcihjb2xvcik7XG4gIHZhbHVlID0gY2xhbXAodmFsdWUpO1xuXG4gIGlmIChjb2xvci50eXBlID09PSAncmdiJyB8fCBjb2xvci50eXBlID09PSAnaHNsJykge1xuICAgIGNvbG9yLnR5cGUgKz0gJ2EnO1xuICB9XG5cbiAgY29sb3IudmFsdWVzWzNdID0gdmFsdWU7XG4gIHJldHVybiByZWNvbXBvc2VDb2xvcihjb2xvcik7XG59XG4vKipcbiAqIERhcmtlbnMgYSBjb2xvci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29sb3IgLSBDU1MgY29sb3IsIGkuZS4gb25lIG9mOiAjbm5uLCAjbm5ubm5uLCByZ2IoKSwgcmdiYSgpLCBoc2woKSwgaHNsYSgpXG4gKiBAcGFyYW0ge251bWJlcn0gY29lZmZpY2llbnQgLSBtdWx0aXBsaWVyIGluIHRoZSByYW5nZSAwIC0gMVxuICogQHJldHVybnMge3N0cmluZ30gQSBDU1MgY29sb3Igc3RyaW5nLiBIZXggaW5wdXQgdmFsdWVzIGFyZSByZXR1cm5lZCBhcyByZ2JcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZGFya2VuKGNvbG9yLCBjb2VmZmljaWVudCkge1xuICBjb2xvciA9IGRlY29tcG9zZUNvbG9yKGNvbG9yKTtcbiAgY29lZmZpY2llbnQgPSBjbGFtcChjb2VmZmljaWVudCk7XG5cbiAgaWYgKGNvbG9yLnR5cGUuaW5kZXhPZignaHNsJykgIT09IC0xKSB7XG4gICAgY29sb3IudmFsdWVzWzJdICo9IDEgLSBjb2VmZmljaWVudDtcbiAgfSBlbHNlIGlmIChjb2xvci50eXBlLmluZGV4T2YoJ3JnYicpICE9PSAtMSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSArPSAxKSB7XG4gICAgICBjb2xvci52YWx1ZXNbaV0gKj0gMSAtIGNvZWZmaWNpZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWNvbXBvc2VDb2xvcihjb2xvcik7XG59XG4vKipcbiAqIExpZ2h0ZW5zIGEgY29sb3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbG9yIC0gQ1NTIGNvbG9yLCBpLmUuIG9uZSBvZjogI25ubiwgI25ubm5ubiwgcmdiKCksIHJnYmEoKSwgaHNsKCksIGhzbGEoKVxuICogQHBhcmFtIHtudW1iZXJ9IGNvZWZmaWNpZW50IC0gbXVsdGlwbGllciBpbiB0aGUgcmFuZ2UgMCAtIDFcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgQ1NTIGNvbG9yIHN0cmluZy4gSGV4IGlucHV0IHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgcmdiXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGxpZ2h0ZW4oY29sb3IsIGNvZWZmaWNpZW50KSB7XG4gIGNvbG9yID0gZGVjb21wb3NlQ29sb3IoY29sb3IpO1xuICBjb2VmZmljaWVudCA9IGNsYW1wKGNvZWZmaWNpZW50KTtcblxuICBpZiAoY29sb3IudHlwZS5pbmRleE9mKCdoc2wnKSAhPT0gLTEpIHtcbiAgICBjb2xvci52YWx1ZXNbMl0gKz0gKDEwMCAtIGNvbG9yLnZhbHVlc1syXSkgKiBjb2VmZmljaWVudDtcbiAgfSBlbHNlIGlmIChjb2xvci50eXBlLmluZGV4T2YoJ3JnYicpICE9PSAtMSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSArPSAxKSB7XG4gICAgICBjb2xvci52YWx1ZXNbaV0gKz0gKDI1NSAtIGNvbG9yLnZhbHVlc1tpXSkgKiBjb2VmZmljaWVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVjb21wb3NlQ29sb3IoY29sb3IpO1xufSIsImltcG9ydCBzdHlsZSBmcm9tICcuL3N0eWxlJztcbmltcG9ydCBjb21wb3NlIGZyb20gJy4vY29tcG9zZSc7XG5cbmZ1bmN0aW9uIGdldEJvcmRlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBcIlwiLmNvbmNhdCh2YWx1ZSwgXCJweCBzb2xpZFwiKTtcbn1cblxuZXhwb3J0IHZhciBib3JkZXIgPSBzdHlsZSh7XG4gIHByb3A6ICdib3JkZXInLFxuICB0aGVtZUtleTogJ2JvcmRlcnMnLFxuICB0cmFuc2Zvcm06IGdldEJvcmRlclxufSk7XG5leHBvcnQgdmFyIGJvcmRlclRvcCA9IHN0eWxlKHtcbiAgcHJvcDogJ2JvcmRlclRvcCcsXG4gIHRoZW1lS2V5OiAnYm9yZGVycycsXG4gIHRyYW5zZm9ybTogZ2V0Qm9yZGVyXG59KTtcbmV4cG9ydCB2YXIgYm9yZGVyUmlnaHQgPSBzdHlsZSh7XG4gIHByb3A6ICdib3JkZXJSaWdodCcsXG4gIHRoZW1lS2V5OiAnYm9yZGVycycsXG4gIHRyYW5zZm9ybTogZ2V0Qm9yZGVyXG59KTtcbmV4cG9ydCB2YXIgYm9yZGVyQm90dG9tID0gc3R5bGUoe1xuICBwcm9wOiAnYm9yZGVyQm90dG9tJyxcbiAgdGhlbWVLZXk6ICdib3JkZXJzJyxcbiAgdHJhbnNmb3JtOiBnZXRCb3JkZXJcbn0pO1xuZXhwb3J0IHZhciBib3JkZXJMZWZ0ID0gc3R5bGUoe1xuICBwcm9wOiAnYm9yZGVyTGVmdCcsXG4gIHRoZW1lS2V5OiAnYm9yZGVycycsXG4gIHRyYW5zZm9ybTogZ2V0Qm9yZGVyXG59KTtcbmV4cG9ydCB2YXIgYm9yZGVyQ29sb3IgPSBzdHlsZSh7XG4gIHByb3A6ICdib3JkZXJDb2xvcicsXG4gIHRoZW1lS2V5OiAncGFsZXR0ZSdcbn0pO1xuZXhwb3J0IHZhciBib3JkZXJSYWRpdXMgPSBzdHlsZSh7XG4gIHByb3A6ICdib3JkZXJSYWRpdXMnLFxuICB0aGVtZUtleTogJ3NoYXBlJ1xufSk7XG52YXIgYm9yZGVycyA9IGNvbXBvc2UoYm9yZGVyLCBib3JkZXJUb3AsIGJvcmRlclJpZ2h0LCBib3JkZXJCb3R0b20sIGJvcmRlckxlZnQsIGJvcmRlckNvbG9yLCBib3JkZXJSYWRpdXMpO1xuZXhwb3J0IGRlZmF1bHQgYm9yZGVyczsiLCJpbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IG1lcmdlIGZyb20gJy4vbWVyZ2UnO1xuXG5mdW5jdGlvbiBvbWl0KGlucHV0LCBmaWVsZHMpIHtcbiAgdmFyIG91dHB1dCA9IHt9O1xuICBPYmplY3Qua2V5cyhpbnB1dCkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgIGlmIChmaWVsZHMuaW5kZXhPZihwcm9wKSA9PT0gLTEpIHtcbiAgICAgIG91dHB1dFtwcm9wXSA9IGlucHV0W3Byb3BdO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmZ1bmN0aW9uIGNzcyhzdHlsZUZ1bmN0aW9uKSB7XG4gIHZhciBuZXdTdHlsZUZ1bmN0aW9uID0gZnVuY3Rpb24gbmV3U3R5bGVGdW5jdGlvbihwcm9wcykge1xuICAgIHZhciBvdXRwdXQgPSBzdHlsZUZ1bmN0aW9uKHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5jc3MpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgbWVyZ2Uob3V0cHV0LCBzdHlsZUZ1bmN0aW9uKF9leHRlbmRzKHtcbiAgICAgICAgdGhlbWU6IHByb3BzLnRoZW1lXG4gICAgICB9LCBwcm9wcy5jc3MpKSksIG9taXQocHJvcHMuY3NzLCBbc3R5bGVGdW5jdGlvbi5maWx0ZXJQcm9wc10pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xuXG4gIG5ld1N0eWxlRnVuY3Rpb24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IF9leHRlbmRzKHt9LCBzdHlsZUZ1bmN0aW9uLnByb3BUeXBlcywge1xuICAgIGNzczogUHJvcFR5cGVzLm9iamVjdFxuICB9KSA6IHt9O1xuICBuZXdTdHlsZUZ1bmN0aW9uLmZpbHRlclByb3BzID0gWydjc3MnXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHN0eWxlRnVuY3Rpb24uZmlsdGVyUHJvcHMpKTtcbiAgcmV0dXJuIG5ld1N0eWxlRnVuY3Rpb247XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNzczsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuZXhwb3J0IHZhciBmbGV4QmFzaXMgPSBzdHlsZSh7XG4gIHByb3A6ICdmbGV4QmFzaXMnXG59KTtcbmV4cG9ydCB2YXIgZmxleERpcmVjdGlvbiA9IHN0eWxlKHtcbiAgcHJvcDogJ2ZsZXhEaXJlY3Rpb24nXG59KTtcbmV4cG9ydCB2YXIgZmxleFdyYXAgPSBzdHlsZSh7XG4gIHByb3A6ICdmbGV4V3JhcCdcbn0pO1xuZXhwb3J0IHZhciBqdXN0aWZ5Q29udGVudCA9IHN0eWxlKHtcbiAgcHJvcDogJ2p1c3RpZnlDb250ZW50J1xufSk7XG5leHBvcnQgdmFyIGFsaWduSXRlbXMgPSBzdHlsZSh7XG4gIHByb3A6ICdhbGlnbkl0ZW1zJ1xufSk7XG5leHBvcnQgdmFyIGFsaWduQ29udGVudCA9IHN0eWxlKHtcbiAgcHJvcDogJ2FsaWduQ29udGVudCdcbn0pO1xuZXhwb3J0IHZhciBvcmRlciA9IHN0eWxlKHtcbiAgcHJvcDogJ29yZGVyJ1xufSk7XG5leHBvcnQgdmFyIGZsZXggPSBzdHlsZSh7XG4gIHByb3A6ICdmbGV4J1xufSk7XG5leHBvcnQgdmFyIGZsZXhHcm93ID0gc3R5bGUoe1xuICBwcm9wOiAnZmxleEdyb3cnXG59KTtcbmV4cG9ydCB2YXIgZmxleFNocmluayA9IHN0eWxlKHtcbiAgcHJvcDogJ2ZsZXhTaHJpbmsnXG59KTtcbmV4cG9ydCB2YXIgYWxpZ25TZWxmID0gc3R5bGUoe1xuICBwcm9wOiAnYWxpZ25TZWxmJ1xufSk7XG5leHBvcnQgdmFyIGp1c3RpZnlJdGVtcyA9IHN0eWxlKHtcbiAgcHJvcDogJ2p1c3RpZnlJdGVtcydcbn0pO1xuZXhwb3J0IHZhciBqdXN0aWZ5U2VsZiA9IHN0eWxlKHtcbiAgcHJvcDogJ2p1c3RpZnlTZWxmJ1xufSk7XG52YXIgZmxleGJveCA9IGNvbXBvc2UoZmxleEJhc2lzLCBmbGV4RGlyZWN0aW9uLCBmbGV4V3JhcCwganVzdGlmeUNvbnRlbnQsIGFsaWduSXRlbXMsIGFsaWduQ29udGVudCwgb3JkZXIsIGZsZXgsIGZsZXhHcm93LCBmbGV4U2hyaW5rLCBhbGlnblNlbGYsIGp1c3RpZnlJdGVtcywganVzdGlmeVNlbGYpO1xuZXhwb3J0IGRlZmF1bHQgZmxleGJveDsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuZXhwb3J0IHZhciBncmlkR2FwID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZEdhcCdcbn0pO1xuZXhwb3J0IHZhciBncmlkQ29sdW1uR2FwID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZENvbHVtbkdhcCdcbn0pO1xuZXhwb3J0IHZhciBncmlkUm93R2FwID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFJvd0dhcCdcbn0pO1xuZXhwb3J0IHZhciBncmlkQ29sdW1uID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZENvbHVtbidcbn0pO1xuZXhwb3J0IHZhciBncmlkUm93ID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFJvdydcbn0pO1xuZXhwb3J0IHZhciBncmlkQXV0b0Zsb3cgPSBzdHlsZSh7XG4gIHByb3A6ICdncmlkQXV0b0Zsb3cnXG59KTtcbmV4cG9ydCB2YXIgZ3JpZEF1dG9Db2x1bW5zID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZEF1dG9Db2x1bW5zJ1xufSk7XG5leHBvcnQgdmFyIGdyaWRBdXRvUm93cyA9IHN0eWxlKHtcbiAgcHJvcDogJ2dyaWRBdXRvUm93cydcbn0pO1xuZXhwb3J0IHZhciBncmlkVGVtcGxhdGVDb2x1bW5zID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFRlbXBsYXRlQ29sdW1ucydcbn0pO1xuZXhwb3J0IHZhciBncmlkVGVtcGxhdGVSb3dzID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZFRlbXBsYXRlUm93cydcbn0pO1xuZXhwb3J0IHZhciBncmlkVGVtcGxhdGVBcmVhcyA9IHN0eWxlKHtcbiAgcHJvcDogJ2dyaWRUZW1wbGF0ZUFyZWFzJ1xufSk7XG5leHBvcnQgdmFyIGdyaWRBcmVhID0gc3R5bGUoe1xuICBwcm9wOiAnZ3JpZEFyZWEnXG59KTtcbnZhciBncmlkID0gY29tcG9zZShncmlkR2FwLCBncmlkQ29sdW1uR2FwLCBncmlkUm93R2FwLCBncmlkQ29sdW1uLCBncmlkUm93LCBncmlkQXV0b0Zsb3csIGdyaWRBdXRvQ29sdW1ucywgZ3JpZEF1dG9Sb3dzLCBncmlkVGVtcGxhdGVDb2x1bW5zLCBncmlkVGVtcGxhdGVSb3dzLCBncmlkVGVtcGxhdGVBcmVhcywgZ3JpZEFyZWEpO1xuZXhwb3J0IGRlZmF1bHQgZ3JpZDsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuZXhwb3J0IHZhciBjb2xvciA9IHN0eWxlKHtcbiAgcHJvcDogJ2NvbG9yJyxcbiAgdGhlbWVLZXk6ICdwYWxldHRlJ1xufSk7XG5leHBvcnQgdmFyIGJnY29sb3IgPSBzdHlsZSh7XG4gIHByb3A6ICdiZ2NvbG9yJyxcbiAgY3NzUHJvcGVydHk6ICdiYWNrZ3JvdW5kQ29sb3InLFxuICB0aGVtZUtleTogJ3BhbGV0dGUnXG59KTtcbnZhciBwYWxldHRlID0gY29tcG9zZShjb2xvciwgYmdjb2xvcik7XG5leHBvcnQgZGVmYXVsdCBwYWxldHRlOyIsImltcG9ydCBzdHlsZSBmcm9tICcuL3N0eWxlJztcbnZhciBib3hTaGFkb3cgPSBzdHlsZSh7XG4gIHByb3A6ICdib3hTaGFkb3cnLFxuICB0aGVtZUtleTogJ3NoYWRvd3MnXG59KTtcbmV4cG9ydCBkZWZhdWx0IGJveFNoYWRvdzsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm0odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIDw9IDEgPyBcIlwiLmNvbmNhdCh2YWx1ZSAqIDEwMCwgXCIlXCIpIDogdmFsdWU7XG59XG5cbmV4cG9ydCB2YXIgd2lkdGggPSBzdHlsZSh7XG4gIHByb3A6ICd3aWR0aCcsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59KTtcbmV4cG9ydCB2YXIgbWF4V2lkdGggPSBzdHlsZSh7XG4gIHByb3A6ICdtYXhXaWR0aCcsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59KTtcbmV4cG9ydCB2YXIgbWluV2lkdGggPSBzdHlsZSh7XG4gIHByb3A6ICdtaW5XaWR0aCcsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59KTtcbmV4cG9ydCB2YXIgaGVpZ2h0ID0gc3R5bGUoe1xuICBwcm9wOiAnaGVpZ2h0JyxcbiAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1cbn0pO1xuZXhwb3J0IHZhciBtYXhIZWlnaHQgPSBzdHlsZSh7XG4gIHByb3A6ICdtYXhIZWlnaHQnLFxuICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxufSk7XG5leHBvcnQgdmFyIG1pbkhlaWdodCA9IHN0eWxlKHtcbiAgcHJvcDogJ21pbkhlaWdodCcsXG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtXG59KTtcbmV4cG9ydCB2YXIgc2l6ZVdpZHRoID0gc3R5bGUoe1xuICBwcm9wOiAnc2l6ZScsXG4gIGNzc1Byb3BlcnR5OiAnd2lkdGgnLFxuICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxufSk7XG5leHBvcnQgdmFyIHNpemVIZWlnaHQgPSBzdHlsZSh7XG4gIHByb3A6ICdzaXplJyxcbiAgY3NzUHJvcGVydHk6ICdoZWlnaHQnLFxuICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxufSk7XG5leHBvcnQgdmFyIGJveFNpemluZyA9IHN0eWxlKHtcbiAgcHJvcDogJ2JveFNpemluZydcbn0pO1xudmFyIHNpemluZyA9IGNvbXBvc2Uod2lkdGgsIG1heFdpZHRoLCBtaW5XaWR0aCwgaGVpZ2h0LCBtYXhIZWlnaHQsIG1pbkhlaWdodCwgYm94U2l6aW5nKTtcbmV4cG9ydCBkZWZhdWx0IHNpemluZzsiLCJpbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCByZXNwb25zaXZlUHJvcFR5cGUgZnJvbSAnLi9yZXNwb25zaXZlUHJvcFR5cGUnO1xuaW1wb3J0IHsgaGFuZGxlQnJlYWtwb2ludHMgfSBmcm9tICcuL2JyZWFrcG9pbnRzJztcbmltcG9ydCBtZXJnZSBmcm9tICcuL21lcmdlJztcbmltcG9ydCBtZW1vaXplIGZyb20gJy4vbWVtb2l6ZSc7XG52YXIgcHJvcGVydGllcyA9IHtcbiAgbTogJ21hcmdpbicsXG4gIHA6ICdwYWRkaW5nJ1xufTtcbnZhciBkaXJlY3Rpb25zID0ge1xuICB0OiAnVG9wJyxcbiAgcjogJ1JpZ2h0JyxcbiAgYjogJ0JvdHRvbScsXG4gIGw6ICdMZWZ0JyxcbiAgeDogWydMZWZ0JywgJ1JpZ2h0J10sXG4gIHk6IFsnVG9wJywgJ0JvdHRvbSddXG59O1xudmFyIGFsaWFzZXMgPSB7XG4gIG1hcmdpblg6ICdteCcsXG4gIG1hcmdpblk6ICdteScsXG4gIHBhZGRpbmdYOiAncHgnLFxuICBwYWRkaW5nWTogJ3B5J1xufTsgLy8gbWVtb2l6ZSgpIGltcGFjdDpcbi8vIEZyb20gMzAwLDAwMCBvcHMvc2VjXG4vLyBUbyAzNTAsMDAwIG9wcy9zZWNcblxudmFyIGdldENzc1Byb3BlcnRpZXMgPSBtZW1vaXplKGZ1bmN0aW9uIChwcm9wKSB7XG4gIC8vIEl0J3Mgbm90IGEgc2hvcnRoYW5kIG5vdGF0aW9uLlxuICBpZiAocHJvcC5sZW5ndGggPiAyKSB7XG4gICAgaWYgKGFsaWFzZXNbcHJvcF0pIHtcbiAgICAgIHByb3AgPSBhbGlhc2VzW3Byb3BdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvcCRzcGxpdCA9IHByb3Auc3BsaXQoJycpLFxuICAgICAgX3Byb3Akc3BsaXQyID0gX3NsaWNlZFRvQXJyYXkoX3Byb3Akc3BsaXQsIDIpLFxuICAgICAgYSA9IF9wcm9wJHNwbGl0MlswXSxcbiAgICAgIGIgPSBfcHJvcCRzcGxpdDJbMV07XG5cbiAgdmFyIHByb3BlcnR5ID0gcHJvcGVydGllc1thXTtcbiAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvbnNbYl0gfHwgJyc7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGRpcmVjdGlvbikgPyBkaXJlY3Rpb24ubWFwKGZ1bmN0aW9uIChkaXIpIHtcbiAgICByZXR1cm4gcHJvcGVydHkgKyBkaXI7XG4gIH0pIDogW3Byb3BlcnR5ICsgZGlyZWN0aW9uXTtcbn0pO1xudmFyIHNwYWNpbmdLZXlzID0gWydtJywgJ210JywgJ21yJywgJ21iJywgJ21sJywgJ214JywgJ215JywgJ3AnLCAncHQnLCAncHInLCAncGInLCAncGwnLCAncHgnLCAncHknLCAnbWFyZ2luJywgJ21hcmdpblRvcCcsICdtYXJnaW5SaWdodCcsICdtYXJnaW5Cb3R0b20nLCAnbWFyZ2luTGVmdCcsICdtYXJnaW5YJywgJ21hcmdpblknLCAncGFkZGluZycsICdwYWRkaW5nVG9wJywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdYJywgJ3BhZGRpbmdZJ107XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5hcnlTcGFjaW5nKHRoZW1lKSB7XG4gIHZhciB0aGVtZVNwYWNpbmcgPSB0aGVtZS5zcGFjaW5nIHx8IDg7XG5cbiAgaWYgKHR5cGVvZiB0aGVtZVNwYWNpbmcgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChhYnMpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYWJzICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJNYXRlcmlhbC1VSTogRXhwZWN0ZWQgc3BhY2luZyBhcmd1bWVudCB0byBiZSBhIG51bWJlciwgZ290IFwiLmNvbmNhdChhYnMsIFwiLlwiKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoZW1lU3BhY2luZyAqIGFicztcbiAgICB9O1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodGhlbWVTcGFjaW5nKSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYWJzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoYWJzID4gdGhlbWVTcGFjaW5nLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFtcIk1hdGVyaWFsLVVJOiBUaGUgdmFsdWUgcHJvdmlkZWQgKFwiLmNvbmNhdChhYnMsIFwiKSBvdmVyZmxvd3MuXCIpLCBcIlRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZTogXCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KHRoZW1lU3BhY2luZyksIFwiLlwiKSwgXCJcIi5jb25jYXQoYWJzLCBcIiA+IFwiKS5jb25jYXQodGhlbWVTcGFjaW5nLmxlbmd0aCAtIDEsIFwiLCB5b3UgbmVlZCB0byBhZGQgdGhlIG1pc3NpbmcgdmFsdWVzLlwiKV0uam9pbignXFxuJykpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGVtZVNwYWNpbmdbYWJzXTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0aGVtZVNwYWNpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdGhlbWVTcGFjaW5nO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKFtcIk1hdGVyaWFsLVVJOiBUaGUgYHRoZW1lLnNwYWNpbmdgIHZhbHVlIChcIi5jb25jYXQodGhlbWVTcGFjaW5nLCBcIikgaXMgaW52YWxpZC5cIiksICdJdCBzaG91bGQgYmUgYSBudW1iZXIsIGFuIGFycmF5IG9yIGEgZnVuY3Rpb24uJ10uam9pbignXFxuJykpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRWYWx1ZSh0cmFuc2Zvcm1lciwgcHJvcFZhbHVlKSB7XG4gIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAnc3RyaW5nJyB8fCBwcm9wVmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiBwcm9wVmFsdWU7XG4gIH1cblxuICB2YXIgYWJzID0gTWF0aC5hYnMocHJvcFZhbHVlKTtcbiAgdmFyIHRyYW5zZm9ybWVkID0gdHJhbnNmb3JtZXIoYWJzKTtcblxuICBpZiAocHJvcFZhbHVlID49IDApIHtcbiAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIHRyYW5zZm9ybWVkID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAtdHJhbnNmb3JtZWQ7XG4gIH1cblxuICByZXR1cm4gXCItXCIuY29uY2F0KHRyYW5zZm9ybWVkKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3R5bGVGcm9tUHJvcFZhbHVlKGNzc1Byb3BlcnRpZXMsIHRyYW5zZm9ybWVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcFZhbHVlKSB7XG4gICAgcmV0dXJuIGNzc1Byb3BlcnRpZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNzc1Byb3BlcnR5KSB7XG4gICAgICBhY2NbY3NzUHJvcGVydHldID0gZ2V0VmFsdWUodHJhbnNmb3JtZXIsIHByb3BWYWx1ZSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gc3BhY2luZyhwcm9wcykge1xuICB2YXIgdGhlbWUgPSBwcm9wcy50aGVtZTtcbiAgdmFyIHRyYW5zZm9ybWVyID0gY3JlYXRlVW5hcnlTcGFjaW5nKHRoZW1lKTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKS5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAvLyBVc2luZyBhIGhhc2ggY29tcHV0YXRpb24gb3ZlciBhbiBhcnJheSBpdGVyYXRpb24gY291bGQgYmUgZmFzdGVyLCBidXQgd2l0aCBvbmx5IDI4IGl0ZW1zLFxuICAgIC8vIGl0J3MgZG9lc24ndCB3b3J0aCB0aGUgYnVuZGxlIHNpemUuXG4gICAgaWYgKHNwYWNpbmdLZXlzLmluZGV4T2YocHJvcCkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY3NzUHJvcGVydGllcyA9IGdldENzc1Byb3BlcnRpZXMocHJvcCk7XG4gICAgdmFyIHN0eWxlRnJvbVByb3BWYWx1ZSA9IGdldFN0eWxlRnJvbVByb3BWYWx1ZShjc3NQcm9wZXJ0aWVzLCB0cmFuc2Zvcm1lcik7XG4gICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BdO1xuICAgIHJldHVybiBoYW5kbGVCcmVha3BvaW50cyhwcm9wcywgcHJvcFZhbHVlLCBzdHlsZUZyb21Qcm9wVmFsdWUpO1xuICB9KS5yZWR1Y2UobWVyZ2UsIHt9KTtcbn1cblxuc3BhY2luZy5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gc3BhY2luZ0tleXMucmVkdWNlKGZ1bmN0aW9uIChvYmosIGtleSkge1xuICBvYmpba2V5XSA9IHJlc3BvbnNpdmVQcm9wVHlwZTtcbiAgcmV0dXJuIG9iajtcbn0sIHt9KSA6IHt9O1xuc3BhY2luZy5maWx0ZXJQcm9wcyA9IHNwYWNpbmdLZXlzO1xuZXhwb3J0IGRlZmF1bHQgc3BhY2luZzsiLCJpbXBvcnQgc3R5bGUgZnJvbSAnLi9zdHlsZSc7XG5pbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuZXhwb3J0IHZhciBmb250RmFtaWx5ID0gc3R5bGUoe1xuICBwcm9wOiAnZm9udEZhbWlseScsXG4gIHRoZW1lS2V5OiAndHlwb2dyYXBoeSdcbn0pO1xuZXhwb3J0IHZhciBmb250U2l6ZSA9IHN0eWxlKHtcbiAgcHJvcDogJ2ZvbnRTaXplJyxcbiAgdGhlbWVLZXk6ICd0eXBvZ3JhcGh5J1xufSk7XG5leHBvcnQgdmFyIGZvbnRTdHlsZSA9IHN0eWxlKHtcbiAgcHJvcDogJ2ZvbnRTdHlsZScsXG4gIHRoZW1lS2V5OiAndHlwb2dyYXBoeSdcbn0pO1xuZXhwb3J0IHZhciBmb250V2VpZ2h0ID0gc3R5bGUoe1xuICBwcm9wOiAnZm9udFdlaWdodCcsXG4gIHRoZW1lS2V5OiAndHlwb2dyYXBoeSdcbn0pO1xuZXhwb3J0IHZhciBsZXR0ZXJTcGFjaW5nID0gc3R5bGUoe1xuICBwcm9wOiAnbGV0dGVyU3BhY2luZydcbn0pO1xuZXhwb3J0IHZhciBsaW5lSGVpZ2h0ID0gc3R5bGUoe1xuICBwcm9wOiAnbGluZUhlaWdodCdcbn0pO1xuZXhwb3J0IHZhciB0ZXh0QWxpZ24gPSBzdHlsZSh7XG4gIHByb3A6ICd0ZXh0QWxpZ24nXG59KTtcbnZhciB0eXBvZ3JhcGh5ID0gY29tcG9zZShmb250RmFtaWx5LCBmb250U2l6ZSwgZm9udFN0eWxlLCBmb250V2VpZ2h0LCBsZXR0ZXJTcGFjaW5nLCBsaW5lSGVpZ2h0LCB0ZXh0QWxpZ24pO1xuZXhwb3J0IGRlZmF1bHQgdHlwb2dyYXBoeTsiLCJpbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICdAbWF0ZXJpYWwtdWkvdXRpbHMnO1xuaW1wb3J0IGNyZWF0ZU11aVRoZW1lIGZyb20gJy4vY3JlYXRlTXVpVGhlbWUnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlTXVpU3RyaWN0TW9kZVRoZW1lKG9wdGlvbnMpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZU11aVRoZW1lLmFwcGx5KHZvaWQgMCwgW2RlZXBtZXJnZSh7XG4gICAgdW5zdGFibGVfc3RyaWN0TW9kZTogdHJ1ZVxuICB9LCBvcHRpb25zKV0uY29uY2F0KGFyZ3MpKTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgZXhhY3RQcm9wIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmltcG9ydCBUaGVtZUNvbnRleHQgZnJvbSAnLi4vdXNlVGhlbWUvVGhlbWVDb250ZXh0JztcbmltcG9ydCB1c2VUaGVtZSBmcm9tICcuLi91c2VUaGVtZSc7XG5pbXBvcnQgbmVzdGVkIGZyb20gJy4vbmVzdGVkJzsgLy8gVG8gc3VwcG9ydCBjb21wb3NpdGlvbiBvZiB0aGVtZS5cblxuZnVuY3Rpb24gbWVyZ2VPdXRlckxvY2FsVGhlbWUob3V0ZXJUaGVtZSwgbG9jYWxUaGVtZSkge1xuICBpZiAodHlwZW9mIGxvY2FsVGhlbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgbWVyZ2VkVGhlbWUgPSBsb2NhbFRoZW1lKG91dGVyVGhlbWUpO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICghbWVyZ2VkVGhlbWUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbJ01hdGVyaWFsLVVJOiBZb3Ugc2hvdWxkIHJldHVybiBhbiBvYmplY3QgZnJvbSB5b3VyIHRoZW1lIGZ1bmN0aW9uLCBpLmUuJywgJzxUaGVtZVByb3ZpZGVyIHRoZW1lPXsoKSA9PiAoe30pfSAvPiddLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2VkVGhlbWU7XG4gIH1cblxuICByZXR1cm4gX2V4dGVuZHMoe30sIG91dGVyVGhlbWUsIGxvY2FsVGhlbWUpO1xufVxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCB0YWtlcyBhIGB0aGVtZWAgcHJvcC5cbiAqIEl0IG1ha2VzIHRoZSBgdGhlbWVgIGF2YWlsYWJsZSBkb3duIHRoZSBSZWFjdCB0cmVlIHRoYW5rcyB0byBSZWFjdCBjb250ZXh0LlxuICogVGhpcyBjb21wb25lbnQgc2hvdWxkIHByZWZlcmFibHkgYmUgdXNlZCBhdCAqKnRoZSByb290IG9mIHlvdXIgY29tcG9uZW50IHRyZWUqKi5cbiAqL1xuXG5cbmZ1bmN0aW9uIFRoZW1lUHJvdmlkZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBsb2NhbFRoZW1lID0gcHJvcHMudGhlbWU7XG4gIHZhciBvdXRlclRoZW1lID0gdXNlVGhlbWUoKTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChvdXRlclRoZW1lID09PSBudWxsICYmIHR5cGVvZiBsb2NhbFRoZW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnTWF0ZXJpYWwtVUk6IFlvdSBhcmUgcHJvdmlkaW5nIGEgdGhlbWUgZnVuY3Rpb24gcHJvcCB0byB0aGUgVGhlbWVQcm92aWRlciBjb21wb25lbnQ6JywgJzxUaGVtZVByb3ZpZGVyIHRoZW1lPXtvdXRlclRoZW1lID0+IG91dGVyVGhlbWV9IC8+JywgJycsICdIb3dldmVyLCBubyBvdXRlciB0aGVtZSBpcyBwcmVzZW50LicsICdNYWtlIHN1cmUgYSB0aGVtZSBpcyBhbHJlYWR5IGluamVjdGVkIGhpZ2hlciBpbiB0aGUgUmVhY3QgdHJlZSAnICsgJ29yIHByb3ZpZGUgYSB0aGVtZSBvYmplY3QuJ10uam9pbignXFxuJykpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB0aGVtZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgIHZhciBvdXRwdXQgPSBvdXRlclRoZW1lID09PSBudWxsID8gbG9jYWxUaGVtZSA6IG1lcmdlT3V0ZXJMb2NhbFRoZW1lKG91dGVyVGhlbWUsIGxvY2FsVGhlbWUpO1xuXG4gICAgaWYgKG91dHB1dCAhPSBudWxsKSB7XG4gICAgICBvdXRwdXRbbmVzdGVkXSA9IG91dGVyVGhlbWUgIT09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfSwgW2xvY2FsVGhlbWUsIG91dGVyVGhlbWVdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRoZW1lQ29udGV4dC5Qcm92aWRlciwge1xuICAgIHZhbHVlOiB0aGVtZVxuICB9LCBjaGlsZHJlbik7XG59XG5cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFRoZW1lUHJvdmlkZXIucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogWW91ciBjb21wb25lbnQgdHJlZS5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBBIHRoZW1lIG9iamVjdC4gWW91IGNhbiBwcm92aWRlIGEgZnVuY3Rpb24gdG8gZXh0ZW5kIHRoZSBvdXRlciB0aGVtZS5cbiAgICovXG4gIHRoZW1lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuZnVuY10pLmlzUmVxdWlyZWRcbn0gOiB2b2lkIDA7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFRoZW1lUHJvdmlkZXIucHJvcFR5cGVzID0gZXhhY3RQcm9wKFRoZW1lUHJvdmlkZXIucHJvcFR5cGVzKSA6IHZvaWQgMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGhlbWVQcm92aWRlcjsiLCJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9kZWZpbmVQcm9wZXJ0eVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGlzVW5pdGxlc3ModmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZyhwYXJzZUZsb2F0KHZhbHVlKSkubGVuZ3RoID09PSBTdHJpbmcodmFsdWUpLmxlbmd0aDtcbn0gLy8gUG9ydGVkIGZyb20gQ29tcGFzc1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL0NvbXBhc3MvY29tcGFzcy9ibG9iL21hc3Rlci9jb3JlL3N0eWxlc2hlZXRzL2NvbXBhc3MvdHlwb2dyYXBoeS9fdW5pdHMuc2Nzc1xuLy8gRW11bGF0ZSB0aGUgc2FzcyBmdW5jdGlvbiBcInVuaXRcIlxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pdChpbnB1dCkge1xuICByZXR1cm4gU3RyaW5nKGlucHV0KS5tYXRjaCgvW1xcZC5cXC0rXSpcXHMqKC4qKS8pWzFdIHx8ICcnO1xufSAvLyBFbXVsYXRlIHRoZSBzYXNzIGZ1bmN0aW9uIFwidW5pdGxlc3NcIlxuXG5leHBvcnQgZnVuY3Rpb24gdG9Vbml0bGVzcyhsZW5ndGgpIHtcbiAgcmV0dXJuIHBhcnNlRmxvYXQobGVuZ3RoKTtcbn0gLy8gQ29udmVydCBhbnkgQ1NTIDxsZW5ndGg+IG9yIDxwZXJjZW50YWdlPiB2YWx1ZSB0byBhbnkgYW5vdGhlci5cbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL0t5bGVBTWF0aGV3cy9jb252ZXJ0LWNzcy1sZW5ndGhcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMZW5ndGgoYmFzZUZvbnRTaXplKSB7XG4gIHJldHVybiBmdW5jdGlvbiAobGVuZ3RoLCB0b1VuaXQpIHtcbiAgICB2YXIgZnJvbVVuaXQgPSBnZXRVbml0KGxlbmd0aCk7IC8vIE9wdGltaXplIGZvciBjYXNlcyB3aGVyZSBgZnJvbWAgYW5kIGB0b2AgdW5pdHMgYXJlIGFjY2lkZW50YWxseSB0aGUgc2FtZS5cblxuICAgIGlmIChmcm9tVW5pdCA9PT0gdG9Vbml0KSB7XG4gICAgICByZXR1cm4gbGVuZ3RoO1xuICAgIH0gLy8gQ29udmVydCBpbnB1dCBsZW5ndGggdG8gcGl4ZWxzLlxuXG5cbiAgICB2YXIgcHhMZW5ndGggPSB0b1VuaXRsZXNzKGxlbmd0aCk7XG5cbiAgICBpZiAoZnJvbVVuaXQgIT09ICdweCcpIHtcbiAgICAgIGlmIChmcm9tVW5pdCA9PT0gJ2VtJykge1xuICAgICAgICBweExlbmd0aCA9IHRvVW5pdGxlc3MobGVuZ3RoKSAqIHRvVW5pdGxlc3MoYmFzZUZvbnRTaXplKTtcbiAgICAgIH0gZWxzZSBpZiAoZnJvbVVuaXQgPT09ICdyZW0nKSB7XG4gICAgICAgIHB4TGVuZ3RoID0gdG9Vbml0bGVzcyhsZW5ndGgpICogdG9Vbml0bGVzcyhiYXNlRm9udFNpemUpO1xuICAgICAgICByZXR1cm4gbGVuZ3RoO1xuICAgICAgfVxuICAgIH0gLy8gQ29udmVydCBsZW5ndGggaW4gcGl4ZWxzIHRvIHRoZSBvdXRwdXQgdW5pdFxuXG5cbiAgICB2YXIgb3V0cHV0TGVuZ3RoID0gcHhMZW5ndGg7XG5cbiAgICBpZiAodG9Vbml0ICE9PSAncHgnKSB7XG4gICAgICBpZiAodG9Vbml0ID09PSAnZW0nKSB7XG4gICAgICAgIG91dHB1dExlbmd0aCA9IHB4TGVuZ3RoIC8gdG9Vbml0bGVzcyhiYXNlRm9udFNpemUpO1xuICAgICAgfSBlbHNlIGlmICh0b1VuaXQgPT09ICdyZW0nKSB7XG4gICAgICAgIG91dHB1dExlbmd0aCA9IHB4TGVuZ3RoIC8gdG9Vbml0bGVzcyhiYXNlRm9udFNpemUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VGbG9hdChvdXRwdXRMZW5ndGgudG9GaXhlZCg1KSkgKyB0b1VuaXQ7XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gYWxpZ25Qcm9wZXJ0eShfcmVmKSB7XG4gIHZhciBzaXplID0gX3JlZi5zaXplLFxuICAgICAgZ3JpZCA9IF9yZWYuZ3JpZDtcbiAgdmFyIHNpemVCZWxvdyA9IHNpemUgLSBzaXplICUgZ3JpZDtcbiAgdmFyIHNpemVBYm92ZSA9IHNpemVCZWxvdyArIGdyaWQ7XG4gIHJldHVybiBzaXplIC0gc2l6ZUJlbG93IDwgc2l6ZUFib3ZlIC0gc2l6ZSA/IHNpemVCZWxvdyA6IHNpemVBYm92ZTtcbn0gLy8gZm9udEdyaWQgZmluZHMgYSBtaW5pbWFsIGdyaWQgKGluIHJlbSkgZm9yIHRoZSBmb250U2l6ZSB2YWx1ZXMgc28gdGhhdCB0aGVcbi8vIGxpbmVIZWlnaHQgZmFsbHMgdW5kZXIgYSB4IHBpeGVscyBncmlkLCA0cHggaW4gdGhlIGNhc2Ugb2YgTWF0ZXJpYWwgRGVzaWduLFxuLy8gd2l0aG91dCBjaGFuZ2luZyB0aGUgcmVsYXRpdmUgbGluZSBoZWlnaHRcblxuZXhwb3J0IGZ1bmN0aW9uIGZvbnRHcmlkKF9yZWYyKSB7XG4gIHZhciBsaW5lSGVpZ2h0ID0gX3JlZjIubGluZUhlaWdodCxcbiAgICAgIHBpeGVscyA9IF9yZWYyLnBpeGVscyxcbiAgICAgIGh0bWxGb250U2l6ZSA9IF9yZWYyLmh0bWxGb250U2l6ZTtcbiAgcmV0dXJuIHBpeGVscyAvIChsaW5lSGVpZ2h0ICogaHRtbEZvbnRTaXplKTtcbn1cbi8qKlxuICogZ2VuZXJhdGUgYSByZXNwb25zaXZlIHZlcnNpb24gb2YgYSBnaXZlbiBDU1MgcHJvcGVydHlcbiAqIEBleGFtcGxlXG4gKiByZXNwb25zaXZlUHJvcGVydHkoe1xuICogICBjc3NQcm9wZXJ0eTogJ2ZvbnRTaXplJyxcbiAqICAgbWluOiAxNSxcbiAqICAgbWF4OiAyMCxcbiAqICAgdW5pdDogJ3B4JyxcbiAqICAgYnJlYWtwb2ludHM6IFszMDAsIDYwMF0sXG4gKiB9KVxuICpcbiAqIC8vIHRoaXMgcmV0dXJuc1xuICpcbiAqIHtcbiAqICAgZm9udFNpemU6ICcxNXB4JyxcbiAqICAgJ0BtZWRpYSAobWluLXdpZHRoOjMwMHB4KSc6IHtcbiAqICAgICBmb250U2l6ZTogJzE3LjVweCcsXG4gKiAgIH0sXG4gKiAgICdAbWVkaWEgKG1pbi13aWR0aDo2MDBweCknOiB7XG4gKiAgICAgZm9udFNpemU6ICcyMHB4JyxcbiAqICAgfSxcbiAqIH1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmNzc1Byb3BlcnR5IC0gVGhlIENTUyBwcm9wZXJ0eSB0byBiZSBtYWRlIHJlc3BvbnNpdmVcbiAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMubWluIC0gVGhlIHNtYWxsZXN0IHZhbHVlIG9mIHRoZSBDU1MgcHJvcGVydHlcbiAqIEBwYXJhbSB7bnVtYmVyfSBwYXJhbXMubWF4IC0gVGhlIGxhcmdlc3QgdmFsdWUgb2YgdGhlIENTUyBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMudW5pdF0gLSBUaGUgdW5pdCB0byBiZSB1c2VkIGZvciB0aGUgQ1NTIHByb3BlcnR5XG4gKiBAcGFyYW0ge0FycmF5Lm51bWJlcn0gW3BhcmFtcy5icmVha3BvaW50c10gIC0gQW4gYXJyYXkgb2YgYnJlYWtwb2ludHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1zLmFsaWduU3RlcF0gLSBSb3VuZCBzY2FsZWQgdmFsdWUgdG8gZmFsbCB1bmRlciB0aGlzIGdyaWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IHJlc3BvbnNpdmUgc3R5bGVzIGZvciB7cGFyYW1zLmNzc1Byb3BlcnR5fVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zaXZlUHJvcGVydHkoX3JlZjMpIHtcbiAgdmFyIGNzc1Byb3BlcnR5ID0gX3JlZjMuY3NzUHJvcGVydHksXG4gICAgICBtaW4gPSBfcmVmMy5taW4sXG4gICAgICBtYXggPSBfcmVmMy5tYXgsXG4gICAgICBfcmVmMyR1bml0ID0gX3JlZjMudW5pdCxcbiAgICAgIHVuaXQgPSBfcmVmMyR1bml0ID09PSB2b2lkIDAgPyAncmVtJyA6IF9yZWYzJHVuaXQsXG4gICAgICBfcmVmMyRicmVha3BvaW50cyA9IF9yZWYzLmJyZWFrcG9pbnRzLFxuICAgICAgYnJlYWtwb2ludHMgPSBfcmVmMyRicmVha3BvaW50cyA9PT0gdm9pZCAwID8gWzYwMCwgOTYwLCAxMjgwXSA6IF9yZWYzJGJyZWFrcG9pbnRzLFxuICAgICAgX3JlZjMkdHJhbnNmb3JtID0gX3JlZjMudHJhbnNmb3JtLFxuICAgICAgdHJhbnNmb3JtID0gX3JlZjMkdHJhbnNmb3JtID09PSB2b2lkIDAgPyBudWxsIDogX3JlZjMkdHJhbnNmb3JtO1xuXG4gIHZhciBvdXRwdXQgPSBfZGVmaW5lUHJvcGVydHkoe30sIGNzc1Byb3BlcnR5LCBcIlwiLmNvbmNhdChtaW4pLmNvbmNhdCh1bml0KSk7XG5cbiAgdmFyIGZhY3RvciA9IChtYXggLSBtaW4pIC8gYnJlYWtwb2ludHNbYnJlYWtwb2ludHMubGVuZ3RoIC0gMV07XG4gIGJyZWFrcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKGJyZWFrcG9pbnQpIHtcbiAgICB2YXIgdmFsdWUgPSBtaW4gKyBmYWN0b3IgKiBicmVha3BvaW50O1xuXG4gICAgaWYgKHRyYW5zZm9ybSAhPT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSB0cmFuc2Zvcm0odmFsdWUpO1xuICAgIH1cblxuICAgIG91dHB1dFtcIkBtZWRpYSAobWluLXdpZHRoOlwiLmNvbmNhdChicmVha3BvaW50LCBcInB4KVwiKV0gPSBfZGVmaW5lUHJvcGVydHkoe30sIGNzc1Byb3BlcnR5LCBcIlwiLmNvbmNhdChNYXRoLnJvdW5kKHZhbHVlICogMTAwMDApIC8gMTAwMDApLmNvbmNhdCh1bml0KSk7XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IHsgZm9ybWF0TXVpRXJyb3JNZXNzYWdlIGFzIF9mb3JtYXRNdWlFcnJvck1lc3NhZ2UgfSBmcm9tIFwiQG1hdGVyaWFsLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBpc1VuaXRsZXNzLCBjb252ZXJ0TGVuZ3RoLCByZXNwb25zaXZlUHJvcGVydHksIGFsaWduUHJvcGVydHksIGZvbnRHcmlkIH0gZnJvbSAnLi9jc3NVdGlscyc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXNwb25zaXZlRm9udFNpemVzKHRoZW1lSW5wdXQpIHtcbiAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICB2YXIgX29wdGlvbnMkYnJlYWtwb2ludHMgPSBvcHRpb25zLmJyZWFrcG9pbnRzLFxuICAgICAgYnJlYWtwb2ludHMgPSBfb3B0aW9ucyRicmVha3BvaW50cyA9PT0gdm9pZCAwID8gWydzbScsICdtZCcsICdsZyddIDogX29wdGlvbnMkYnJlYWtwb2ludHMsXG4gICAgICBfb3B0aW9ucyRkaXNhYmxlQWxpZ24gPSBvcHRpb25zLmRpc2FibGVBbGlnbixcbiAgICAgIGRpc2FibGVBbGlnbiA9IF9vcHRpb25zJGRpc2FibGVBbGlnbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRkaXNhYmxlQWxpZ24sXG4gICAgICBfb3B0aW9ucyRmYWN0b3IgPSBvcHRpb25zLmZhY3RvcixcbiAgICAgIGZhY3RvciA9IF9vcHRpb25zJGZhY3RvciA9PT0gdm9pZCAwID8gMiA6IF9vcHRpb25zJGZhY3RvcixcbiAgICAgIF9vcHRpb25zJHZhcmlhbnRzID0gb3B0aW9ucy52YXJpYW50cyxcbiAgICAgIHZhcmlhbnRzID0gX29wdGlvbnMkdmFyaWFudHMgPT09IHZvaWQgMCA/IFsnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnc3VidGl0bGUxJywgJ3N1YnRpdGxlMicsICdib2R5MScsICdib2R5MicsICdjYXB0aW9uJywgJ2J1dHRvbicsICdvdmVybGluZSddIDogX29wdGlvbnMkdmFyaWFudHM7XG5cbiAgdmFyIHRoZW1lID0gX2V4dGVuZHMoe30sIHRoZW1lSW5wdXQpO1xuXG4gIHRoZW1lLnR5cG9ncmFwaHkgPSBfZXh0ZW5kcyh7fSwgdGhlbWUudHlwb2dyYXBoeSk7XG4gIHZhciB0eXBvZ3JhcGh5ID0gdGhlbWUudHlwb2dyYXBoeTsgLy8gQ29udmVydCBiZXR3ZWVuIGNzcyBsZW5ndGhzIGUuZy4gZW0tPnB4IG9yIHB4LT5yZW1cbiAgLy8gU2V0IHRoZSBiYXNlRm9udFNpemUgZm9yIHlvdXIgcHJvamVjdC4gRGVmYXVsdHMgdG8gMTZweCAoYWxzbyB0aGUgYnJvd3NlciBkZWZhdWx0KS5cblxuICB2YXIgY29udmVydCA9IGNvbnZlcnRMZW5ndGgodHlwb2dyYXBoeS5odG1sRm9udFNpemUpO1xuICB2YXIgYnJlYWtwb2ludFZhbHVlcyA9IGJyZWFrcG9pbnRzLm1hcChmdW5jdGlvbiAoeCkge1xuICAgIHJldHVybiB0aGVtZS5icmVha3BvaW50cy52YWx1ZXNbeF07XG4gIH0pO1xuICB2YXJpYW50cy5mb3JFYWNoKGZ1bmN0aW9uICh2YXJpYW50KSB7XG4gICAgdmFyIHN0eWxlID0gdHlwb2dyYXBoeVt2YXJpYW50XTtcbiAgICB2YXIgcmVtRm9udFNpemUgPSBwYXJzZUZsb2F0KGNvbnZlcnQoc3R5bGUuZm9udFNpemUsICdyZW0nKSk7XG5cbiAgICBpZiAocmVtRm9udFNpemUgPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBtYXhGb250U2l6ZSA9IHJlbUZvbnRTaXplO1xuICAgIHZhciBtaW5Gb250U2l6ZSA9IDEgKyAobWF4Rm9udFNpemUgLSAxKSAvIGZhY3RvcjtcbiAgICB2YXIgbGluZUhlaWdodCA9IHN0eWxlLmxpbmVIZWlnaHQ7XG5cbiAgICBpZiAoIWlzVW5pdGxlc3MobGluZUhlaWdodCkgJiYgIWRpc2FibGVBbGlnbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFwiTWF0ZXJpYWwtVUk6IFVuc3VwcG9ydGVkIG5vbi11bml0bGVzcyBsaW5lIGhlaWdodCB3aXRoIGdyaWQgYWxpZ25tZW50LlxcblVzZSB1bml0bGVzcyBsaW5lIGhlaWdodHMgaW5zdGVhZC5cIiA6IF9mb3JtYXRNdWlFcnJvck1lc3NhZ2UoNikpO1xuICAgIH1cblxuICAgIGlmICghaXNVbml0bGVzcyhsaW5lSGVpZ2h0KSkge1xuICAgICAgLy8gbWFrZSBpdCB1bml0bGVzc1xuICAgICAgbGluZUhlaWdodCA9IHBhcnNlRmxvYXQoY29udmVydChsaW5lSGVpZ2h0LCAncmVtJykpIC8gcGFyc2VGbG9hdChyZW1Gb250U2l6ZSk7XG4gICAgfVxuXG4gICAgdmFyIHRyYW5zZm9ybSA9IG51bGw7XG5cbiAgICBpZiAoIWRpc2FibGVBbGlnbikge1xuICAgICAgdHJhbnNmb3JtID0gZnVuY3Rpb24gdHJhbnNmb3JtKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhbGlnblByb3BlcnR5KHtcbiAgICAgICAgICBzaXplOiB2YWx1ZSxcbiAgICAgICAgICBncmlkOiBmb250R3JpZCh7XG4gICAgICAgICAgICBwaXhlbHM6IDQsXG4gICAgICAgICAgICBsaW5lSGVpZ2h0OiBsaW5lSGVpZ2h0LFxuICAgICAgICAgICAgaHRtbEZvbnRTaXplOiB0eXBvZ3JhcGh5Lmh0bWxGb250U2l6ZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB0eXBvZ3JhcGh5W3ZhcmlhbnRdID0gX2V4dGVuZHMoe30sIHN0eWxlLCByZXNwb25zaXZlUHJvcGVydHkoe1xuICAgICAgY3NzUHJvcGVydHk6ICdmb250U2l6ZScsXG4gICAgICBtaW46IG1pbkZvbnRTaXplLFxuICAgICAgbWF4OiBtYXhGb250U2l6ZSxcbiAgICAgIHVuaXQ6ICdyZW0nLFxuICAgICAgYnJlYWtwb2ludHM6IGJyZWFrcG9pbnRWYWx1ZXMsXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybVxuICAgIH0pKTtcbiAgfSk7XG4gIHJldHVybiB0aGVtZTtcbn0iLCJpbXBvcnQgeyB3aXRoVGhlbWVDcmVhdG9yIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3N0eWxlcyc7XG5pbXBvcnQgZGVmYXVsdFRoZW1lIGZyb20gJy4vZGVmYXVsdFRoZW1lJztcbnZhciB3aXRoVGhlbWUgPSB3aXRoVGhlbWVDcmVhdG9yKHtcbiAgZGVmYXVsdFRoZW1lOiBkZWZhdWx0VGhlbWVcbn0pO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFRoZW1lOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlcHJlY2F0ZWRQcm9wVHlwZSh2YWxpZGF0b3IsIHJlYXNvbikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZVNhZmUgPSBjb21wb25lbnROYW1lIHx8ICc8PGFub255bW91cz4+JztcbiAgICB2YXIgcHJvcEZ1bGxOYW1lU2FmZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHNbcHJvcE5hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcIlRoZSBcIi5jb25jYXQobG9jYXRpb24sIFwiIGBcIikuY29uY2F0KHByb3BGdWxsTmFtZVNhZmUsIFwiYCBvZiBcIikgKyBcImBcIi5jb25jYXQoY29tcG9uZW50TmFtZVNhZmUsIFwiYCBpcyBkZXByZWNhdGVkLiBcIikuY29uY2F0KHJlYXNvbikpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzTXVpRWxlbWVudChlbGVtZW50LCBtdWlOYW1lcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpICYmIG11aU5hbWVzLmluZGV4T2YoZWxlbWVudC50eXBlLm11aU5hbWUpICE9PSAtMTtcbn0iLCIvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rcywgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VDb250cm9sbGVkKF9yZWYpIHtcbiAgdmFyIGNvbnRyb2xsZWQgPSBfcmVmLmNvbnRyb2xsZWQsXG4gICAgICBkZWZhdWx0UHJvcCA9IF9yZWYuZGVmYXVsdCxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgICBfcmVmJHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIHN0YXRlID0gX3JlZiRzdGF0ZSA9PT0gdm9pZCAwID8gJ3ZhbHVlJyA6IF9yZWYkc3RhdGU7XG5cbiAgdmFyIF9SZWFjdCR1c2VSZWYgPSBSZWFjdC51c2VSZWYoY29udHJvbGxlZCAhPT0gdW5kZWZpbmVkKSxcbiAgICAgIGlzQ29udHJvbGxlZCA9IF9SZWFjdCR1c2VSZWYuY3VycmVudDtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZGVmYXVsdFByb3ApLFxuICAgICAgdmFsdWVTdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciB2YWx1ZSA9IGlzQ29udHJvbGxlZCA/IGNvbnRyb2xsZWQgOiB2YWx1ZVN0YXRlO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChpc0NvbnRyb2xsZWQgIT09IChjb250cm9sbGVkICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoW1wiTWF0ZXJpYWwtVUk6IEEgY29tcG9uZW50IGlzIGNoYW5naW5nIHRoZSBcIi5jb25jYXQoaXNDb250cm9sbGVkID8gJycgOiAndW4nLCBcImNvbnRyb2xsZWQgXCIpLmNvbmNhdChzdGF0ZSwgXCIgc3RhdGUgb2YgXCIpLmNvbmNhdChuYW1lLCBcIiB0byBiZSBcIikuY29uY2F0KGlzQ29udHJvbGxlZCA/ICd1bicgOiAnJywgXCJjb250cm9sbGVkLlwiKSwgJ0VsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLicsIFwiRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBcIi5jb25jYXQobmFtZSwgXCIgXCIpICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LicsIFwiVGhlIG5hdHVyZSBvZiB0aGUgc3RhdGUgaXMgZGV0ZXJtaW5lZCBkdXJpbmcgdGhlIGZpcnN0IHJlbmRlciwgaXQncyBjb25zaWRlcmVkIGNvbnRyb2xsZWQgaWYgdGhlIHZhbHVlIGlzIG5vdCBgdW5kZWZpbmVkYC5cIiwgJ01vcmUgaW5mbzogaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnXS5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfSwgW2NvbnRyb2xsZWRdKTtcblxuICAgIHZhciBfUmVhY3QkdXNlUmVmMiA9IFJlYWN0LnVzZVJlZihkZWZhdWx0UHJvcCksXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IF9SZWFjdCR1c2VSZWYyLmN1cnJlbnQ7XG5cbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFpc0NvbnRyb2xsZWQgJiYgZGVmYXVsdFZhbHVlICE9PSBkZWZhdWx0UHJvcCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFtcIk1hdGVyaWFsLVVJOiBBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyB0aGUgZGVmYXVsdCBcIi5jb25jYXQoc3RhdGUsIFwiIHN0YXRlIG9mIGFuIHVuY29udHJvbGxlZCBcIikuY29uY2F0KG5hbWUsIFwiIGFmdGVyIGJlaW5nIGluaXRpYWxpemVkLiBcIikgKyBcIlRvIHN1cHByZXNzIHRoaXMgd2FybmluZyBvcHQgdG8gdXNlIGEgY29udHJvbGxlZCBcIi5jb25jYXQobmFtZSwgXCIuXCIpXS5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfSwgW0pTT04uc3RyaW5naWZ5KGRlZmF1bHRQcm9wKV0pO1xuICB9XG5cbiAgdmFyIHNldFZhbHVlSWZVbmNvbnRyb2xsZWQgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobmV3VmFsdWUpIHtcbiAgICBpZiAoIWlzQ29udHJvbGxlZCkge1xuICAgICAgc2V0VmFsdWUobmV3VmFsdWUpO1xuICAgIH1cbiAgfSwgW10pO1xuICByZXR1cm4gW3ZhbHVlLCBzZXRWYWx1ZUlmVW5jb250cm9sbGVkXTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIFByaXZhdGUgbW9kdWxlIHJlc2VydmVkIGZvciBAbWF0ZXJpYWwtdWkveCBwYWNrYWdlcy5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VJZChpZE92ZXJyaWRlKSB7XG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZShpZE92ZXJyaWRlKSxcbiAgICAgIGRlZmF1bHRJZCA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldERlZmF1bHRJZCA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICB2YXIgaWQgPSBpZE92ZXJyaWRlIHx8IGRlZmF1bHRJZDtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZGVmYXVsdElkID09IG51bGwpIHtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIHRoaXMgZGVmYXVsdCBpZCB3aGVuIHBvc3NpYmxlLlxuICAgICAgLy8gVXNlIHRoZSByYW5kb20gdmFsdWUgZm9yIGNsaWVudC1zaWRlIHJlbmRlcmluZyBvbmx5LlxuICAgICAgLy8gV2UgY2FuJ3QgdXNlIGl0IHNlcnZlci1zaWRlLlxuICAgICAgc2V0RGVmYXVsdElkKFwibXVpLVwiLmNvbmNhdChNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxZTUpKSk7XG4gICAgfVxuICB9LCBbZGVmYXVsdElkXSk7XG4gIHJldHVybiBpZDtcbn0iLCJpbXBvcnQgYXJyYXlXaXRoSG9sZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FycmF5V2l0aEhvbGVzXCI7XG5pbXBvcnQgaXRlcmFibGVUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pdGVyYWJsZVRvQXJyYXlcIjtcbmltcG9ydCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXlcIjtcbmltcG9ydCBub25JdGVyYWJsZVJlc3QgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL25vbkl0ZXJhYmxlUmVzdFwiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX3RvQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3RvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQXJyYXlcIjtcbmltcG9ydCBfc2xpY2VkVG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vc2xpY2VkVG9BcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzRnJhZ21lbnQgfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyBjaGFpblByb3BUeXBlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5pbXBvcnQgQ29sbGFwc2UgZnJvbSAnLi4vQ29sbGFwc2UnO1xuaW1wb3J0IFBhcGVyIGZyb20gJy4uL1BhcGVyJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBBY2NvcmRpb25Db250ZXh0IGZyb20gJy4vQWNjb3JkaW9uQ29udGV4dCc7XG5pbXBvcnQgdXNlQ29udHJvbGxlZCBmcm9tICcuLi91dGlscy91c2VDb250cm9sbGVkJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHZhciB0cmFuc2l0aW9uID0ge1xuICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydGVzdFxuICB9O1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydtYXJnaW4nXSwgdHJhbnNpdGlvbiksXG4gICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IC0xLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5kaXZpZGVyLFxuICAgICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydvcGFjaXR5JywgJ2JhY2tncm91bmQtY29sb3InXSwgdHJhbnNpdGlvbilcbiAgICAgIH0sXG4gICAgICAnJjpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgJyY6YmVmb3JlJzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZXhwYW5kZWQnOiB7XG4gICAgICAgIG1hcmdpbjogJzE2cHggMCcsXG4gICAgICAgICcmOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICAgIG1hcmdpblRvcDogMFxuICAgICAgICB9LFxuICAgICAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICAgIG1hcmdpbkJvdHRvbTogMFxuICAgICAgICB9LFxuICAgICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZXhwYW5kZWQgKyAmJzoge1xuICAgICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgc3F1YXJlPXtmYWxzZX1gLiAqL1xuICAgIHJvdW5kZWQ6IHtcbiAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICcmOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlclRvcFJpZ2h0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXNcbiAgICAgIH0sXG4gICAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICBib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIC8vIEZpeCBhIHJlbmRlcmluZyBpc3N1ZSBvbiBFZGdlXG4gICAgICAgICdAc3VwcG9ydHMgKC1tcy1pbWUtYWxpZ246IGF1dG8pJzoge1xuICAgICAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IDAsXG4gICAgICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBleHBhbmRlZD17dHJ1ZX1gLiAqL1xuICAgIGV4cGFuZGVkOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9XG4gIH07XG59O1xudmFyIEFjY29yZGlvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEFjY29yZGlvbihwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlblByb3AgPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGRlZmF1bHRFeHBhbmRlID0gcHJvcHMuZGVmYXVsdEV4cGFuZGVkLFxuICAgICAgZGVmYXVsdEV4cGFuZGVkID0gX3Byb3BzJGRlZmF1bHRFeHBhbmRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkZWZhdWx0RXhwYW5kZSxcbiAgICAgIF9wcm9wcyRkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZGlzYWJsZWQgPSBfcHJvcHMkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVkLFxuICAgICAgZXhwYW5kZWRQcm9wID0gcHJvcHMuZXhwYW5kZWQsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgX3Byb3BzJHNxdWFyZSA9IHByb3BzLnNxdWFyZSxcbiAgICAgIHNxdWFyZSA9IF9wcm9wcyRzcXVhcmUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHNxdWFyZSxcbiAgICAgIF9wcm9wcyRUcmFuc2l0aW9uQ29tcCA9IHByb3BzLlRyYW5zaXRpb25Db21wb25lbnQsXG4gICAgICBUcmFuc2l0aW9uQ29tcG9uZW50ID0gX3Byb3BzJFRyYW5zaXRpb25Db21wID09PSB2b2lkIDAgPyBDb2xsYXBzZSA6IF9wcm9wcyRUcmFuc2l0aW9uQ29tcCxcbiAgICAgIFRyYW5zaXRpb25Qcm9wcyA9IHByb3BzLlRyYW5zaXRpb25Qcm9wcyxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJkZWZhdWx0RXhwYW5kZWRcIiwgXCJkaXNhYmxlZFwiLCBcImV4cGFuZGVkXCIsIFwib25DaGFuZ2VcIiwgXCJzcXVhcmVcIiwgXCJUcmFuc2l0aW9uQ29tcG9uZW50XCIsIFwiVHJhbnNpdGlvblByb3BzXCJdKTtcblxuICB2YXIgX3VzZUNvbnRyb2xsZWQgPSB1c2VDb250cm9sbGVkKHtcbiAgICBjb250cm9sbGVkOiBleHBhbmRlZFByb3AsXG4gICAgZGVmYXVsdDogZGVmYXVsdEV4cGFuZGVkLFxuICAgIG5hbWU6ICdBY2NvcmRpb24nLFxuICAgIHN0YXRlOiAnZXhwYW5kZWQnXG4gIH0pLFxuICAgICAgX3VzZUNvbnRyb2xsZWQyID0gX3NsaWNlZFRvQXJyYXkoX3VzZUNvbnRyb2xsZWQsIDIpLFxuICAgICAgZXhwYW5kZWQgPSBfdXNlQ29udHJvbGxlZDJbMF0sXG4gICAgICBzZXRFeHBhbmRlZFN0YXRlID0gX3VzZUNvbnRyb2xsZWQyWzFdO1xuXG4gIHZhciBoYW5kbGVDaGFuZ2UgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBzZXRFeHBhbmRlZFN0YXRlKCFleHBhbmRlZCk7XG5cbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlKGV2ZW50LCAhZXhwYW5kZWQpO1xuICAgIH1cbiAgfSwgW2V4cGFuZGVkLCBvbkNoYW5nZSwgc2V0RXhwYW5kZWRTdGF0ZV0pO1xuXG4gIHZhciBfUmVhY3QkQ2hpbGRyZW4kdG9BcnIgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuUHJvcCksXG4gICAgICBfUmVhY3QkQ2hpbGRyZW4kdG9BcnIyID0gX3RvQXJyYXkoX1JlYWN0JENoaWxkcmVuJHRvQXJyKSxcbiAgICAgIHN1bW1hcnkgPSBfUmVhY3QkQ2hpbGRyZW4kdG9BcnIyWzBdLFxuICAgICAgY2hpbGRyZW4gPSBfUmVhY3QkQ2hpbGRyZW4kdG9BcnIyLnNsaWNlKDEpO1xuXG4gIHZhciBjb250ZXh0VmFsdWUgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXhwYW5kZWQ6IGV4cGFuZGVkLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgdG9nZ2xlOiBoYW5kbGVDaGFuZ2VcbiAgICB9O1xuICB9LCBbZXhwYW5kZWQsIGRpc2FibGVkLCBoYW5kbGVDaGFuZ2VdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhcGVyLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBleHBhbmRlZCAmJiBjbGFzc2VzLmV4cGFuZGVkLCBkaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkLCAhc3F1YXJlICYmIGNsYXNzZXMucm91bmRlZCksXG4gICAgcmVmOiByZWYsXG4gICAgc3F1YXJlOiBzcXVhcmVcbiAgfSwgb3RoZXIpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChBY2NvcmRpb25Db250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCBzdW1tYXJ5KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbkNvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGluOiBleHBhbmRlZCxcbiAgICB0aW1lb3V0OiBcImF1dG9cIlxuICB9LCBUcmFuc2l0aW9uUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogc3VtbWFyeS5wcm9wcy5pZCxcbiAgICBpZDogc3VtbWFyeS5wcm9wc1snYXJpYS1jb250cm9scyddLFxuICAgIHJvbGU6IFwicmVnaW9uXCJcbiAgfSwgY2hpbGRyZW4pKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEFjY29yZGlvbi5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgYWNjb3JkaW9uLlxuICAgKi9cbiAgY2hpbGRyZW46IGNoYWluUHJvcFR5cGVzKFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsIGZ1bmN0aW9uIChwcm9wcykge1xuICAgIHZhciBzdW1tYXJ5ID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShwcm9wcy5jaGlsZHJlbilbMF07XG5cbiAgICBpZiAoaXNGcmFnbWVudChzdW1tYXJ5KSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcihcIk1hdGVyaWFsLVVJOiBUaGUgQWNjb3JkaW9uIGRvZXNuJ3QgYWNjZXB0IGEgRnJhZ21lbnQgYXMgYSBjaGlsZC4gXCIgKyAnQ29uc2lkZXIgcHJvdmlkaW5nIGFuIGFycmF5IGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCEgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KHN1bW1hcnkpKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCdNYXRlcmlhbC1VSTogRXhwZWN0ZWQgdGhlIGZpcnN0IGNoaWxkIG9mIEFjY29yZGlvbiB0byBiZSBhIHZhbGlkIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBleHBhbmRzIHRoZSBhY2NvcmRpb24gYnkgZGVmYXVsdC5cbiAgICovXG4gIGRlZmF1bHRFeHBhbmRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGFjY29yZGlvbiB3aWxsIGJlIGRpc3BsYXllZCBpbiBhIGRpc2FibGVkIHN0YXRlLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGV4cGFuZHMgdGhlIGFjY29yZGlvbiwgb3RoZXJ3aXNlIGNvbGxhcHNlIGl0LlxuICAgKiBTZXR0aW5nIHRoaXMgcHJvcCBlbmFibGVzIGNvbnRyb2wgb3ZlciB0aGUgYWNjb3JkaW9uLlxuICAgKi9cbiAgZXhwYW5kZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBleHBhbmQvY29sbGFwc2Ugc3RhdGUgaXMgY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV4cGFuZGVkIFRoZSBgZXhwYW5kZWRgIHN0YXRlIG9mIHRoZSBhY2NvcmRpb24uXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgcm91bmRlZCBjb3JuZXJzIGFyZSBkaXNhYmxlZC5cbiAgICovXG4gIHNxdWFyZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIGNvbGxhcHNlIGVmZmVjdC5cbiAgICogW0ZvbGxvdyB0aGlzIGd1aWRlXSgvY29tcG9uZW50cy90cmFuc2l0aW9ucy8jdHJhbnNpdGlvbmNvbXBvbmVudC1wcm9wKSB0byBsZWFybiBtb3JlIGFib3V0IHRoZSByZXF1aXJlbWVudHMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgVHJhbnNpdGlvbkNvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBQcm9wcyBhcHBsaWVkIHRvIHRoZSBbYFRyYW5zaXRpb25gXShodHRwOi8vcmVhY3Rjb21tdW5pdHkub3JnL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXAvdHJhbnNpdGlvbiNUcmFuc2l0aW9uLXByb3BzKSBlbGVtZW50LlxuICAgKi9cbiAgVHJhbnNpdGlvblByb3BzOiBQcm9wVHlwZXMub2JqZWN0XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUFjY29yZGlvbidcbn0pKEFjY29yZGlvbik7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3NsaWNlZFRvQXJyYXkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NsaWNlZFRvQXJyYXlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgeyBkdXJhdGlvbiB9IGZyb20gJy4uL3N0eWxlcy90cmFuc2l0aW9ucyc7XG5pbXBvcnQgeyBnZXRUcmFuc2l0aW9uUHJvcHMgfSBmcm9tICcuLi90cmFuc2l0aW9ucy91dGlscyc7XG5pbXBvcnQgdXNlVGhlbWUgZnJvbSAnLi4vc3R5bGVzL3VzZVRoZW1lJztcbmltcG9ydCB7IHVzZUZvcmtSZWYgfSBmcm9tICcuLi91dGlscyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIgZWxlbWVudC4gKi9cbiAgICBjb250YWluZXI6IHtcbiAgICAgIGhlaWdodDogMCxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgnaGVpZ2h0JylcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50IHdoZW4gdGhlIHRyYW5zaXRpb24gaGFzIGVudGVyZWQuICovXG4gICAgZW50ZXJlZDoge1xuICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICBvdmVyZmxvdzogJ3Zpc2libGUnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIgZWxlbWVudCB3aGVuIHRoZSB0cmFuc2l0aW9uIGhhcyBleGl0ZWQgYW5kIGBjb2xsYXBzZWRIZWlnaHRgICE9IDBweC4gKi9cbiAgICBoaWRkZW46IHtcbiAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBvdXRlciB3cmFwcGVyIGVsZW1lbnQuICovXG4gICAgd3JhcHBlcjoge1xuICAgICAgLy8gSGFjayB0byBnZXQgY2hpbGRyZW4gd2l0aCBhIG5lZ2F0aXZlIG1hcmdpbiB0byBub3QgZmFsc2lmeSB0aGUgaGVpZ2h0IGNvbXB1dGF0aW9uLlxuICAgICAgZGlzcGxheTogJ2ZsZXgnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBpbm5lciB3cmFwcGVyIGVsZW1lbnQuICovXG4gICAgd3JhcHBlcklubmVyOiB7XG4gICAgICB3aWR0aDogJzEwMCUnXG4gICAgfVxuICB9O1xufTtcbi8qKlxuICogVGhlIENvbGxhcHNlIHRyYW5zaXRpb24gaXMgdXNlZCBieSB0aGVcbiAqIFtWZXJ0aWNhbCBTdGVwcGVyXSgvY29tcG9uZW50cy9zdGVwcGVycy8jdmVydGljYWwtc3RlcHBlcikgU3RlcENvbnRlbnQgY29tcG9uZW50LlxuICogSXQgdXNlcyBbcmVhY3QtdHJhbnNpdGlvbi1ncm91cF0oaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0anMvcmVhY3QtdHJhbnNpdGlvbi1ncm91cCkgaW50ZXJuYWxseS5cbiAqL1xuXG52YXIgQ29sbGFwc2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBDb2xsYXBzZShwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29sbGFwc2VkSGVpZ2ggPSBwcm9wcy5jb2xsYXBzZWRIZWlnaHQsXG4gICAgICBjb2xsYXBzZWRIZWlnaHRQcm9wID0gX3Byb3BzJGNvbGxhcHNlZEhlaWdoID09PSB2b2lkIDAgPyAnMHB4JyA6IF9wcm9wcyRjb2xsYXBzZWRIZWlnaCxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZGlzYWJsZVN0cmljdE0gPSBwcm9wcy5kaXNhYmxlU3RyaWN0TW9kZUNvbXBhdCxcbiAgICAgIGRpc2FibGVTdHJpY3RNb2RlQ29tcGF0ID0gX3Byb3BzJGRpc2FibGVTdHJpY3RNID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlU3RyaWN0TSxcbiAgICAgIGluUHJvcCA9IHByb3BzLmluLFxuICAgICAgb25FbnRlciA9IHByb3BzLm9uRW50ZXIsXG4gICAgICBvbkVudGVyZWQgPSBwcm9wcy5vbkVudGVyZWQsXG4gICAgICBvbkVudGVyaW5nID0gcHJvcHMub25FbnRlcmluZyxcbiAgICAgIG9uRXhpdCA9IHByb3BzLm9uRXhpdCxcbiAgICAgIG9uRXhpdGVkID0gcHJvcHMub25FeGl0ZWQsXG4gICAgICBvbkV4aXRpbmcgPSBwcm9wcy5vbkV4aXRpbmcsXG4gICAgICBzdHlsZSA9IHByb3BzLnN0eWxlLFxuICAgICAgX3Byb3BzJHRpbWVvdXQgPSBwcm9wcy50aW1lb3V0LFxuICAgICAgdGltZW91dCA9IF9wcm9wcyR0aW1lb3V0ID09PSB2b2lkIDAgPyBkdXJhdGlvbi5zdGFuZGFyZCA6IF9wcm9wcyR0aW1lb3V0LFxuICAgICAgX3Byb3BzJFRyYW5zaXRpb25Db21wID0gcHJvcHMuVHJhbnNpdGlvbkNvbXBvbmVudCxcbiAgICAgIFRyYW5zaXRpb25Db21wb25lbnQgPSBfcHJvcHMkVHJhbnNpdGlvbkNvbXAgPT09IHZvaWQgMCA/IFRyYW5zaXRpb24gOiBfcHJvcHMkVHJhbnNpdGlvbkNvbXAsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sbGFwc2VkSGVpZ2h0XCIsIFwiY29tcG9uZW50XCIsIFwiZGlzYWJsZVN0cmljdE1vZGVDb21wYXRcIiwgXCJpblwiLCBcIm9uRW50ZXJcIiwgXCJvbkVudGVyZWRcIiwgXCJvbkVudGVyaW5nXCIsIFwib25FeGl0XCIsIFwib25FeGl0ZWRcIiwgXCJvbkV4aXRpbmdcIiwgXCJzdHlsZVwiLCBcInRpbWVvdXRcIiwgXCJUcmFuc2l0aW9uQ29tcG9uZW50XCJdKTtcblxuICB2YXIgdGhlbWUgPSB1c2VUaGVtZSgpO1xuICB2YXIgdGltZXIgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIHdyYXBwZXJSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBhdXRvVHJhbnNpdGlvbkR1cmF0aW9uID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBjb2xsYXBzZWRIZWlnaHQgPSB0eXBlb2YgY29sbGFwc2VkSGVpZ2h0UHJvcCA9PT0gJ251bWJlcicgPyBcIlwiLmNvbmNhdChjb2xsYXBzZWRIZWlnaHRQcm9wLCBcInB4XCIpIDogY29sbGFwc2VkSGVpZ2h0UHJvcDtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyLmN1cnJlbnQpO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIGVuYWJsZVN0cmljdE1vZGVDb21wYXQgPSB0aGVtZS51bnN0YWJsZV9zdHJpY3RNb2RlICYmICFkaXNhYmxlU3RyaWN0TW9kZUNvbXBhdDtcbiAgdmFyIG5vZGVSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciBoYW5kbGVSZWYgPSB1c2VGb3JrUmVmKHJlZiwgZW5hYmxlU3RyaWN0TW9kZUNvbXBhdCA/IG5vZGVSZWYgOiB1bmRlZmluZWQpO1xuXG4gIHZhciBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiAobm9kZU9yQXBwZWFyaW5nLCBtYXliZUFwcGVhcmluZykge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfcmVmID0gZW5hYmxlU3RyaWN0TW9kZUNvbXBhdCA/IFtub2RlUmVmLmN1cnJlbnQsIG5vZGVPckFwcGVhcmluZ10gOiBbbm9kZU9yQXBwZWFyaW5nLCBtYXliZUFwcGVhcmluZ10sXG4gICAgICAgICAgICBfcmVmMiA9IF9zbGljZWRUb0FycmF5KF9yZWYsIDIpLFxuICAgICAgICAgICAgbm9kZSA9IF9yZWYyWzBdLFxuICAgICAgICAgICAgaXNBcHBlYXJpbmcgPSBfcmVmMlsxXTsgLy8gb25FbnRlclh4eCBhbmQgb25FeGl0WHh4IGNhbGxiYWNrcyBoYXZlIGEgZGlmZmVyZW50IGFyZ3VtZW50cy5sZW5ndGggdmFsdWUuXG5cblxuICAgICAgICBpZiAoaXNBcHBlYXJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNhbGxiYWNrKG5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgdmFyIGhhbmRsZUVudGVyID0gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhmdW5jdGlvbiAobm9kZSwgaXNBcHBlYXJpbmcpIHtcbiAgICBub2RlLnN0eWxlLmhlaWdodCA9IGNvbGxhcHNlZEhlaWdodDtcblxuICAgIGlmIChvbkVudGVyKSB7XG4gICAgICBvbkVudGVyKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgaGFuZGxlRW50ZXJpbmcgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGZ1bmN0aW9uIChub2RlLCBpc0FwcGVhcmluZykge1xuICAgIHZhciB3cmFwcGVySGVpZ2h0ID0gd3JhcHBlclJlZi5jdXJyZW50ID8gd3JhcHBlclJlZi5jdXJyZW50LmNsaWVudEhlaWdodCA6IDA7XG5cbiAgICB2YXIgX2dldFRyYW5zaXRpb25Qcm9wcyA9IGdldFRyYW5zaXRpb25Qcm9wcyh7XG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICB0aW1lb3V0OiB0aW1lb3V0XG4gICAgfSwge1xuICAgICAgbW9kZTogJ2VudGVyJ1xuICAgIH0pLFxuICAgICAgICB0cmFuc2l0aW9uRHVyYXRpb24gPSBfZ2V0VHJhbnNpdGlvblByb3BzLmR1cmF0aW9uO1xuXG4gICAgaWYgKHRpbWVvdXQgPT09ICdhdXRvJykge1xuICAgICAgdmFyIGR1cmF0aW9uMiA9IHRoZW1lLnRyYW5zaXRpb25zLmdldEF1dG9IZWlnaHREdXJhdGlvbih3cmFwcGVySGVpZ2h0KTtcbiAgICAgIG5vZGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gXCJcIi5jb25jYXQoZHVyYXRpb24yLCBcIm1zXCIpO1xuICAgICAgYXV0b1RyYW5zaXRpb25EdXJhdGlvbi5jdXJyZW50ID0gZHVyYXRpb24yO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IHR5cGVvZiB0cmFuc2l0aW9uRHVyYXRpb24gPT09ICdzdHJpbmcnID8gdHJhbnNpdGlvbkR1cmF0aW9uIDogXCJcIi5jb25jYXQodHJhbnNpdGlvbkR1cmF0aW9uLCBcIm1zXCIpO1xuICAgIH1cblxuICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gXCJcIi5jb25jYXQod3JhcHBlckhlaWdodCwgXCJweFwiKTtcblxuICAgIGlmIChvbkVudGVyaW5nKSB7XG4gICAgICBvbkVudGVyaW5nKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgaGFuZGxlRW50ZXJlZCA9IG5vcm1hbGl6ZWRUcmFuc2l0aW9uQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUsIGlzQXBwZWFyaW5nKSB7XG4gICAgbm9kZS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG5cbiAgICBpZiAob25FbnRlcmVkKSB7XG4gICAgICBvbkVudGVyZWQobm9kZSwgaXNBcHBlYXJpbmcpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBoYW5kbGVFeGl0ID0gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciB3cmFwcGVySGVpZ2h0ID0gd3JhcHBlclJlZi5jdXJyZW50ID8gd3JhcHBlclJlZi5jdXJyZW50LmNsaWVudEhlaWdodCA6IDA7XG4gICAgbm9kZS5zdHlsZS5oZWlnaHQgPSBcIlwiLmNvbmNhdCh3cmFwcGVySGVpZ2h0LCBcInB4XCIpO1xuXG4gICAgaWYgKG9uRXhpdCkge1xuICAgICAgb25FeGl0KG5vZGUpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBoYW5kbGVFeGl0ZWQgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKG9uRXhpdGVkKTtcbiAgdmFyIGhhbmRsZUV4aXRpbmcgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIHdyYXBwZXJIZWlnaHQgPSB3cmFwcGVyUmVmLmN1cnJlbnQgPyB3cmFwcGVyUmVmLmN1cnJlbnQuY2xpZW50SGVpZ2h0IDogMDtcblxuICAgIHZhciBfZ2V0VHJhbnNpdGlvblByb3BzMiA9IGdldFRyYW5zaXRpb25Qcm9wcyh7XG4gICAgICBzdHlsZTogc3R5bGUsXG4gICAgICB0aW1lb3V0OiB0aW1lb3V0XG4gICAgfSwge1xuICAgICAgbW9kZTogJ2V4aXQnXG4gICAgfSksXG4gICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbiA9IF9nZXRUcmFuc2l0aW9uUHJvcHMyLmR1cmF0aW9uO1xuXG4gICAgaWYgKHRpbWVvdXQgPT09ICdhdXRvJykge1xuICAgICAgdmFyIGR1cmF0aW9uMiA9IHRoZW1lLnRyYW5zaXRpb25zLmdldEF1dG9IZWlnaHREdXJhdGlvbih3cmFwcGVySGVpZ2h0KTtcbiAgICAgIG5vZGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gXCJcIi5jb25jYXQoZHVyYXRpb24yLCBcIm1zXCIpO1xuICAgICAgYXV0b1RyYW5zaXRpb25EdXJhdGlvbi5jdXJyZW50ID0gZHVyYXRpb24yO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IHR5cGVvZiB0cmFuc2l0aW9uRHVyYXRpb24gPT09ICdzdHJpbmcnID8gdHJhbnNpdGlvbkR1cmF0aW9uIDogXCJcIi5jb25jYXQodHJhbnNpdGlvbkR1cmF0aW9uLCBcIm1zXCIpO1xuICAgIH1cblxuICAgIG5vZGUuc3R5bGUuaGVpZ2h0ID0gY29sbGFwc2VkSGVpZ2h0O1xuXG4gICAgaWYgKG9uRXhpdGluZykge1xuICAgICAgb25FeGl0aW5nKG5vZGUpO1xuICAgIH1cbiAgfSk7XG5cbiAgdmFyIGFkZEVuZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkRW5kTGlzdGVuZXIobm9kZU9yTmV4dCwgbWF5YmVOZXh0KSB7XG4gICAgdmFyIG5leHQgPSBlbmFibGVTdHJpY3RNb2RlQ29tcGF0ID8gbm9kZU9yTmV4dCA6IG1heWJlTmV4dDtcblxuICAgIGlmICh0aW1lb3V0ID09PSAnYXV0bycpIHtcbiAgICAgIHRpbWVyLmN1cnJlbnQgPSBzZXRUaW1lb3V0KG5leHQsIGF1dG9UcmFuc2l0aW9uRHVyYXRpb24uY3VycmVudCB8fCAwKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zaXRpb25Db21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBpbjogaW5Qcm9wLFxuICAgIG9uRW50ZXI6IGhhbmRsZUVudGVyLFxuICAgIG9uRW50ZXJlZDogaGFuZGxlRW50ZXJlZCxcbiAgICBvbkVudGVyaW5nOiBoYW5kbGVFbnRlcmluZyxcbiAgICBvbkV4aXQ6IGhhbmRsZUV4aXQsXG4gICAgb25FeGl0ZWQ6IGhhbmRsZUV4aXRlZCxcbiAgICBvbkV4aXRpbmc6IGhhbmRsZUV4aXRpbmcsXG4gICAgYWRkRW5kTGlzdGVuZXI6IGFkZEVuZExpc3RlbmVyLFxuICAgIG5vZGVSZWY6IGVuYWJsZVN0cmljdE1vZGVDb21wYXQgPyBub2RlUmVmIDogdW5kZWZpbmVkLFxuICAgIHRpbWVvdXQ6IHRpbWVvdXQgPT09ICdhdXRvJyA/IG51bGwgOiB0aW1lb3V0XG4gIH0sIG90aGVyKSwgZnVuY3Rpb24gKHN0YXRlLCBjaGlsZFByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuY29udGFpbmVyLCBjbGFzc05hbWUsIHtcbiAgICAgICAgJ2VudGVyZWQnOiBjbGFzc2VzLmVudGVyZWQsXG4gICAgICAgICdleGl0ZWQnOiAhaW5Qcm9wICYmIGNvbGxhcHNlZEhlaWdodCA9PT0gJzBweCcgJiYgY2xhc3Nlcy5oaWRkZW5cbiAgICAgIH1bc3RhdGVdKSxcbiAgICAgIHN0eWxlOiBfZXh0ZW5kcyh7XG4gICAgICAgIG1pbkhlaWdodDogY29sbGFwc2VkSGVpZ2h0XG4gICAgICB9LCBzdHlsZSksXG4gICAgICByZWY6IGhhbmRsZVJlZlxuICAgIH0sIGNoaWxkUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMud3JhcHBlcixcbiAgICAgIHJlZjogd3JhcHBlclJlZlxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy53cmFwcGVySW5uZXJcbiAgICB9LCBjaGlsZHJlbikpKTtcbiAgfSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENvbGxhcHNlLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG5vZGUgdG8gYmUgY29sbGFwc2VkLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgY29udGFpbmVyIHdoZW4gY29sbGFwc2VkLlxuICAgKi9cbiAgY29sbGFwc2VkSGVpZ2h0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhpcyBwcm9wIGlmIHlvdSBlbmNvdW50ZXIgJ0Z1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGJlIGdpdmVuIHJlZnMnLFxuICAgKiB1c2UgYHVuc3RhYmxlX2NyZWF0ZVN0cmljdE1vZGVUaGVtZWAsXG4gICAqIGFuZCBjYW4ndCBmb3J3YXJkIHRoZSByZWYgaW4gdGhlIHBhc3NlZCBgQ29tcG9uZW50YC5cbiAgICovXG4gIGRpc2FibGVTdHJpY3RNb2RlQ29tcGF0OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgY29tcG9uZW50IHdpbGwgdHJhbnNpdGlvbiBpbi5cbiAgICovXG4gIGluOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25FbnRlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uRW50ZXJlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uRW50ZXJpbmc6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkV4aXQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkV4aXRlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uRXhpdGluZzogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBUaGUgZHVyYXRpb24gZm9yIHRoZSB0cmFuc2l0aW9uLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqIFlvdSBtYXkgc3BlY2lmeSBhIHNpbmdsZSB0aW1lb3V0IGZvciBhbGwgdHJhbnNpdGlvbnMsIG9yIGluZGl2aWR1YWxseSB3aXRoIGFuIG9iamVjdC5cbiAgICpcbiAgICogU2V0IHRvICdhdXRvJyB0byBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZSB0cmFuc2l0aW9uIHRpbWUgYmFzZWQgb24gaGVpZ2h0LlxuICAgKi9cbiAgdGltZW91dDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFsnYXV0byddKSwgUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBhcHBlYXI6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgZW50ZXI6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgZXhpdDogUHJvcFR5cGVzLm51bWJlclxuICB9KV0pXG59IDogdm9pZCAwO1xuQ29sbGFwc2UubXVpU3VwcG9ydEF1dG8gPSB0cnVlO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNvbGxhcHNlJ1xufSkoQ29sbGFwc2UpOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0Jztcbi8qKlxuICogQGlnbm9yZSAtIGludGVybmFsIGNvbXBvbmVudC5cbiAqIEB0eXBlIHtSZWFjdC5Db250ZXh0PHt9IHwge2V4cGFuZGVkOiBib29sZWFuLCBkaXNhYmxlZDogYm9vbGVhbiwgdG9nZ2xlOiAoKSA9PiB2b2lkfT59XG4gKi9cblxudmFyIEFjY29yZGlvbkNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEFjY29yZGlvbkNvbnRleHQuZGlzcGxheU5hbWUgPSAnQWNjb3JkaW9uQ29udGV4dCc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFjY29yZGlvbkNvbnRleHQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgcGFkZGluZzogOCxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVTcGFjaW5nPXtmYWxzZX1gLiAqL1xuICBzcGFjaW5nOiB7XG4gICAgJyYgPiA6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICBtYXJnaW5MZWZ0OiA4XG4gICAgfVxuICB9XG59O1xudmFyIEFjY29yZGlvbkFjdGlvbnMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBBY2NvcmRpb25BY3Rpb25zKHByb3BzLCByZWYpIHtcbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGRpc2FibGVTcGFjaW5nID0gcHJvcHMuZGlzYWJsZVNwYWNpbmcsXG4gICAgICBkaXNhYmxlU3BhY2luZyA9IF9wcm9wcyRkaXNhYmxlU3BhY2luZyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVNwYWNpbmcsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImRpc2FibGVTcGFjaW5nXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgIWRpc2FibGVTcGFjaW5nICYmIGNsYXNzZXMuc3BhY2luZyksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQWNjb3JkaW9uQWN0aW9ucy5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYWN0aW9ucyBkbyBub3QgaGF2ZSBhZGRpdGlvbmFsIG1hcmdpbi5cbiAgICovXG4gIGRpc2FibGVTcGFjaW5nOiBQcm9wVHlwZXMuYm9vbFxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlBY2NvcmRpb25BY3Rpb25zJ1xufSkoQWNjb3JkaW9uQWN0aW9ucyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIHBhZGRpbmc6IHRoZW1lLnNwYWNpbmcoMSwgMiwgMilcbiAgICB9XG4gIH07XG59O1xudmFyIEFjY29yZGlvbkRldGFpbHMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBBY2NvcmRpb25EZXRhaWxzKHByb3BzLCByZWYpIHtcbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBBY2NvcmRpb25EZXRhaWxzLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBhY2NvcmRpb24gZGV0YWlscy5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQWNjb3JkaW9uRGV0YWlscydcbn0pKEFjY29yZGlvbkRldGFpbHMpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcblxuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvYXJpYS1yb2xlICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmltcG9ydCBJY29uQnV0dG9uIGZyb20gJy4uL0ljb25CdXR0b24nO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IEFjY29yZGlvbkNvbnRleHQgZnJvbSAnLi4vQWNjb3JkaW9uL0FjY29yZGlvbkNvbnRleHQnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgdmFyIHRyYW5zaXRpb24gPSB7XG4gICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0ZXN0XG4gIH07XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBtaW5IZWlnaHQ6IDggKiA2LFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFsnbWluLWhlaWdodCcsICdiYWNrZ3JvdW5kLWNvbG9yJ10sIHRyYW5zaXRpb24pLFxuICAgICAgcGFkZGluZzogdGhlbWUuc3BhY2luZygwLCAyKSxcbiAgICAgICcmOmhvdmVyOm5vdCgkZGlzYWJsZWQpJzoge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgICcmJGV4cGFuZGVkJzoge1xuICAgICAgICBtaW5IZWlnaHQ6IDY0XG4gICAgICB9LFxuICAgICAgJyYkZm9jdXNlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5mb2N1c1xuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBvcGFjaXR5OiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZE9wYWNpdHlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCwgY2hpbGRyZW4gd3JhcHBlciBlbGVtZW50IGFuZCBgSWNvbkJ1dHRvbmAgY29tcG9uZW50IGlmIGBleHBhbmRlZD17dHJ1ZX1gLiAqL1xuICAgIGV4cGFuZGVkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGZvY3VzZWQ9e3RydWV9YC4gKi9cbiAgICBmb2N1c2VkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIHdyYXBwZXIgZWxlbWVudC4gKi9cbiAgICBjb250ZW50OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4R3JvdzogMSxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZShbJ21hcmdpbiddLCB0cmFuc2l0aW9uKSxcbiAgICAgIG1hcmdpbjogJzEycHggMCcsXG4gICAgICAnJiRleHBhbmRlZCc6IHtcbiAgICAgICAgbWFyZ2luOiAnMjBweCAwJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYEljb25CdXR0b25gIGNvbXBvbmVudCB3aGVuIGBleHBhbmRJY29uYCBpcyBzdXBwbGllZC4gKi9cbiAgICBleHBhbmRJY29uOiB7XG4gICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoMGRlZyknLFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCd0cmFuc2Zvcm0nLCB0cmFuc2l0aW9uKSxcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBob3ZlciBlZmZlY3QgZm9yIHRoZSBJY29uQnV0dG9uLFxuICAgICAgICAvLyBiZWNhdXNlIGEgaG92ZXIgZWZmZWN0IHNob3VsZCBhcHBseSB0byB0aGUgZW50aXJlIEV4cGFuZCBidXR0b24gYW5kXG4gICAgICAgIC8vIG5vdCBvbmx5IHRvIHRoZSBJY29uQnV0dG9uLlxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgIH0sXG4gICAgICAnJiRleHBhbmRlZCc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDE4MGRlZyknXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBBY2NvcmRpb25TdW1tYXJ5ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQWNjb3JkaW9uU3VtbWFyeShwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBleHBhbmRJY29uID0gcHJvcHMuZXhwYW5kSWNvbixcbiAgICAgIEljb25CdXR0b25Qcm9wcyA9IHByb3BzLkljb25CdXR0b25Qcm9wcyxcbiAgICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgICAgb25Gb2N1c1Zpc2libGUgPSBwcm9wcy5vbkZvY3VzVmlzaWJsZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJleHBhbmRJY29uXCIsIFwiSWNvbkJ1dHRvblByb3BzXCIsIFwib25CbHVyXCIsIFwib25DbGlja1wiLCBcIm9uRm9jdXNWaXNpYmxlXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgZm9jdXNlZFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgICAgc2V0Rm9jdXNlZFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciBoYW5kbGVGb2N1c1Zpc2libGUgPSBmdW5jdGlvbiBoYW5kbGVGb2N1c1Zpc2libGUoZXZlbnQpIHtcbiAgICBzZXRGb2N1c2VkU3RhdGUodHJ1ZSk7XG5cbiAgICBpZiAob25Gb2N1c1Zpc2libGUpIHtcbiAgICAgIG9uRm9jdXNWaXNpYmxlKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgc2V0Rm9jdXNlZFN0YXRlKGZhbHNlKTtcblxuICAgIGlmIChvbkJsdXIpIHtcbiAgICAgIG9uQmx1cihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQWNjb3JkaW9uQ29udGV4dCksXG4gICAgICBfUmVhY3QkdXNlQ29udGV4dCRkaXMgPSBfUmVhY3QkdXNlQ29udGV4dC5kaXNhYmxlZCxcbiAgICAgIGRpc2FibGVkID0gX1JlYWN0JHVzZUNvbnRleHQkZGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9SZWFjdCR1c2VDb250ZXh0JGRpcyxcbiAgICAgIGV4cGFuZGVkID0gX1JlYWN0JHVzZUNvbnRleHQuZXhwYW5kZWQsXG4gICAgICB0b2dnbGUgPSBfUmVhY3QkdXNlQ29udGV4dC50b2dnbGU7XG5cbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShldmVudCkge1xuICAgIGlmICh0b2dnbGUpIHtcbiAgICAgIHRvZ2dsZShldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKG9uQ2xpY2spIHtcbiAgICAgIG9uQ2xpY2soZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQnV0dG9uQmFzZSwgX2V4dGVuZHMoe1xuICAgIGZvY3VzUmlwcGxlOiBmYWxzZSxcbiAgICBkaXNhYmxlUmlwcGxlOiB0cnVlLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICBjb21wb25lbnQ6IFwiZGl2XCIsXG4gICAgXCJhcmlhLWV4cGFuZGVkXCI6IGV4cGFuZGVkLFxuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgZGlzYWJsZWQgJiYgY2xhc3Nlcy5kaXNhYmxlZCwgZXhwYW5kZWQgJiYgY2xhc3Nlcy5leHBhbmRlZCwgZm9jdXNlZFN0YXRlICYmIGNsYXNzZXMuZm9jdXNlZCksXG4gICAgb25Gb2N1c1Zpc2libGU6IGhhbmRsZUZvY3VzVmlzaWJsZSxcbiAgICBvbkJsdXI6IGhhbmRsZUJsdXIsXG4gICAgb25DbGljazogaGFuZGxlQ2hhbmdlLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLmNvbnRlbnQsIGV4cGFuZGVkICYmIGNsYXNzZXMuZXhwYW5kZWQpXG4gIH0sIGNoaWxkcmVuKSwgZXhwYW5kSWNvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQnV0dG9uLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuZXhwYW5kSWNvbiwgZXhwYW5kZWQgJiYgY2xhc3Nlcy5leHBhbmRlZCksXG4gICAgZWRnZTogXCJlbmRcIixcbiAgICBjb21wb25lbnQ6IFwiZGl2XCIsXG4gICAgdGFiSW5kZXg6IG51bGwsXG4gICAgcm9sZTogbnVsbCxcbiAgICBcImFyaWEtaGlkZGVuXCI6IHRydWVcbiAgfSwgSWNvbkJ1dHRvblByb3BzKSwgZXhwYW5kSWNvbikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBBY2NvcmRpb25TdW1tYXJ5LnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBhY2NvcmRpb24gc3VtbWFyeS5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBpY29uIHRvIGRpc3BsYXkgYXMgdGhlIGV4cGFuZCBpbmRpY2F0b3IuXG4gICAqL1xuICBleHBhbmRJY29uOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogUHJvcHMgYXBwbGllZCB0byB0aGUgYEljb25CdXR0b25gIGVsZW1lbnQgd3JhcHBpbmcgdGhlIGV4cGFuZCBpY29uLlxuICAgKi9cbiAgSWNvbkJ1dHRvblByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25Gb2N1c1Zpc2libGU6IFByb3BUeXBlcy5mdW5jXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUFjY29yZGlvblN1bW1hcnknXG59KShBY2NvcmRpb25TdW1tYXJ5KTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICcuLi91dGlscy9jYXBpdGFsaXplJztcbmltcG9ydCBQYXBlciBmcm9tICcuLi9QYXBlcic7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICB2YXIgYmFja2dyb3VuZENvbG9yRGVmYXVsdCA9IHRoZW1lLnBhbGV0dGUudHlwZSA9PT0gJ2xpZ2h0JyA/IHRoZW1lLnBhbGV0dGUuZ3JleVsxMDBdIDogdGhlbWUucGFsZXR0ZS5ncmV5WzkwMF07XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgIC8vIFByZXZlbnQgcGFkZGluZyBpc3N1ZSB3aXRoIHRoZSBNb2RhbCBhbmQgZml4ZWQgcG9zaXRpb25lZCBBcHBCYXIuXG4gICAgICB6SW5kZXg6IHRoZW1lLnpJbmRleC5hcHBCYXIsXG4gICAgICBmbGV4U2hyaW5rOiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHBvc2l0aW9uPVwiZml4ZWRcImAuICovXG4gICAgcG9zaXRpb25GaXhlZDoge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAnYXV0bycsXG4gICAgICByaWdodDogMCxcbiAgICAgICdAbWVkaWEgcHJpbnQnOiB7XG4gICAgICAgIC8vIFByZXZlbnQgdGhlIGFwcCBiYXIgdG8gYmUgdmlzaWJsZSBvbiBlYWNoIHByaW50ZWQgcGFnZS5cbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgcG9zaXRpb249XCJhYnNvbHV0ZVwiYC4gKi9cbiAgICBwb3NpdGlvbkFic29sdXRlOiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6ICdhdXRvJyxcbiAgICAgIHJpZ2h0OiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHBvc2l0aW9uPVwic3RpY2t5XCJgLiAqL1xuICAgIHBvc2l0aW9uU3RpY2t5OiB7XG4gICAgICAvLyDimqDvuI8gc3RpY2t5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgSUUgMTEuXG4gICAgICBwb3NpdGlvbjogJ3N0aWNreScsXG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAnYXV0bycsXG4gICAgICByaWdodDogMFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBwb3NpdGlvbj1cInN0YXRpY1wiYC4gKi9cbiAgICBwb3NpdGlvblN0YXRpYzoge1xuICAgICAgcG9zaXRpb246ICdzdGF0aWMnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHBvc2l0aW9uPVwicmVsYXRpdmVcImAuICovXG4gICAgcG9zaXRpb25SZWxhdGl2ZToge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJkZWZhdWx0XCJgLiAqL1xuICAgIGNvbG9yRGVmYXVsdDoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBiYWNrZ3JvdW5kQ29sb3JEZWZhdWx0LFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZ2V0Q29udHJhc3RUZXh0KGJhY2tncm91bmRDb2xvckRlZmF1bHQpXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBjb2xvclByaW1hcnk6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5LmNvbnRyYXN0VGV4dFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cInNlY29uZGFyeVwiYC4gKi9cbiAgICBjb2xvclNlY29uZGFyeToge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmNvbnRyYXN0VGV4dFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cImluaGVyaXRcImAuICovXG4gICAgY29sb3JJbmhlcml0OiB7XG4gICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwidHJhbnNwYXJlbnRcImAuICovXG4gICAgY29sb3JUcmFuc3BhcmVudDoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgY29sb3I6ICdpbmhlcml0J1xuICAgIH1cbiAgfTtcbn07XG52YXIgQXBwQmFyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQXBwQmFyKHByb3BzLCByZWYpIHtcbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBjb2xvciA9IF9wcm9wcyRjb2xvciA9PT0gdm9pZCAwID8gJ3ByaW1hcnknIDogX3Byb3BzJGNvbG9yLFxuICAgICAgX3Byb3BzJHBvc2l0aW9uID0gcHJvcHMucG9zaXRpb24sXG4gICAgICBwb3NpdGlvbiA9IF9wcm9wcyRwb3NpdGlvbiA9PT0gdm9pZCAwID8gJ2ZpeGVkJyA6IF9wcm9wcyRwb3NpdGlvbixcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sb3JcIiwgXCJwb3NpdGlvblwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhcGVyLCBfZXh0ZW5kcyh7XG4gICAgc3F1YXJlOiB0cnVlLFxuICAgIGNvbXBvbmVudDogXCJoZWFkZXJcIixcbiAgICBlbGV2YXRpb246IDQsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3Nlc1tcInBvc2l0aW9uXCIuY29uY2F0KGNhcGl0YWxpemUocG9zaXRpb24pKV0sIGNsYXNzZXNbXCJjb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGNvbG9yKSldLCBjbGFzc05hbWUsIHBvc2l0aW9uID09PSAnZml4ZWQnICYmICdtdWktZml4ZWQnKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBBcHBCYXIucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ2luaGVyaXQnLCAncHJpbWFyeScsICdzZWNvbmRhcnknLCAndHJhbnNwYXJlbnQnXSksXG5cbiAgLyoqXG4gICAqIFRoZSBwb3NpdGlvbmluZyB0eXBlLiBUaGUgYmVoYXZpb3Igb2YgdGhlIGRpZmZlcmVudCBvcHRpb25zIGlzIGRlc2NyaWJlZFxuICAgKiBbaW4gdGhlIE1ETiB3ZWIgZG9jc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9MZWFybi9DU1MvQ1NTX2xheW91dC9Qb3NpdGlvbmluZykuXG4gICAqIE5vdGU6IGBzdGlja3lgIGlzIG5vdCB1bml2ZXJzYWxseSBzdXBwb3J0ZWQgYW5kIHdpbGwgZmFsbCBiYWNrIHRvIGBzdGF0aWNgIHdoZW4gdW5hdmFpbGFibGUuXG4gICAqL1xuICBwb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsnYWJzb2x1dGUnLCAnZml4ZWQnLCAncmVsYXRpdmUnLCAnc3RhdGljJywgJ3N0aWNreSddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlBcHBCYXInXG59KShBcHBCYXIpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBQZXJzb24gZnJvbSAnLi4vaW50ZXJuYWwvc3ZnLWljb25zL1BlcnNvbic7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgIGZsZXhTaHJpbms6IDAsXG4gICAgICB3aWR0aDogNDAsXG4gICAgICBoZWlnaHQ6IDQwLFxuICAgICAgZm9udEZhbWlseTogdGhlbWUudHlwb2dyYXBoeS5mb250RmFtaWx5LFxuICAgICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkucHhUb1JlbSgyMCksXG4gICAgICBsaW5lSGVpZ2h0OiAxLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNTAlJyxcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIG5vdCBgc3JjYCBvciBgc3JjU2V0YC4gKi9cbiAgICBjb2xvckRlZmF1bHQ6IHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmJhY2tncm91bmQuZGVmYXVsdCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS50eXBlID09PSAnbGlnaHQnID8gdGhlbWUucGFsZXR0ZS5ncmV5WzQwMF0gOiB0aGVtZS5wYWxldHRlLmdyZXlbNjAwXVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiY2lyY2xlXCJgLiAqL1xuICAgIGNpcmNsZToge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwicm91bmRlZFwiYC4gKi9cbiAgICByb3VuZGVkOiB7XG4gICAgICBib3JkZXJSYWRpdXM6IHRoZW1lLnNoYXBlLmJvcmRlclJhZGl1c1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwic3F1YXJlXCJgLiAqL1xuICAgIHNxdWFyZToge1xuICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBpbWcgZWxlbWVudCBpZiBlaXRoZXIgYHNyY2Agb3IgYHNyY1NldGAgaXMgZGVmaW5lZC4gKi9cbiAgICBpbWc6IHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAvLyBIYW5kbGUgbm9uLXNxdWFyZSBpbWFnZS4gVGhlIHByb3BlcnR5IGlzbid0IHN1cHBvcnRlZCBieSBJRSAxMS5cbiAgICAgIG9iamVjdEZpdDogJ2NvdmVyJyxcbiAgICAgIC8vIEhpZGUgYWx0IHRleHQuXG4gICAgICBjb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgIC8vIEhpZGUgdGhlIGltYWdlIGJyb2tlbiBpY29uLCBvbmx5IHdvcmtzIG9uIENocm9tZS5cbiAgICAgIHRleHRJbmRlbnQ6IDEwMDAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBmYWxsYmFjayBpY29uICovXG4gICAgZmFsbGJhY2s6IHtcbiAgICAgIHdpZHRoOiAnNzUlJyxcbiAgICAgIGhlaWdodDogJzc1JSdcbiAgICB9XG4gIH07XG59O1xuXG5mdW5jdGlvbiB1c2VMb2FkZWQoX3JlZikge1xuICB2YXIgc3JjID0gX3JlZi5zcmMsXG4gICAgICBzcmNTZXQgPSBfcmVmLnNyY1NldDtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgbG9hZGVkID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgICAgc2V0TG9hZGVkID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzcmMgJiYgIXNyY1NldCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBzZXRMb2FkZWQoZmFsc2UpO1xuICAgIHZhciBhY3RpdmUgPSB0cnVlO1xuICAgIHZhciBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgIGltYWdlLnNyYyA9IHNyYztcbiAgICBpbWFnZS5zcmNTZXQgPSBzcmNTZXQ7XG5cbiAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldExvYWRlZCgnbG9hZGVkJyk7XG4gICAgfTtcblxuICAgIGltYWdlLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWFjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldExvYWRlZCgnZXJyb3InKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG4gIH0sIFtzcmMsIHNyY1NldF0pO1xuICByZXR1cm4gbG9hZGVkO1xufVxuXG52YXIgQXZhdGFyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQXZhdGFyKHByb3BzLCByZWYpIHtcbiAgdmFyIGFsdCA9IHByb3BzLmFsdCxcbiAgICAgIGNoaWxkcmVuUHJvcCA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgaW1nUHJvcHMgPSBwcm9wcy5pbWdQcm9wcyxcbiAgICAgIHNpemVzID0gcHJvcHMuc2l6ZXMsXG4gICAgICBzcmMgPSBwcm9wcy5zcmMsXG4gICAgICBzcmNTZXQgPSBwcm9wcy5zcmNTZXQsXG4gICAgICBfcHJvcHMkdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICB2YXJpYW50ID0gX3Byb3BzJHZhcmlhbnQgPT09IHZvaWQgMCA/ICdjaXJjbGUnIDogX3Byb3BzJHZhcmlhbnQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiYWx0XCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29tcG9uZW50XCIsIFwiaW1nUHJvcHNcIiwgXCJzaXplc1wiLCBcInNyY1wiLCBcInNyY1NldFwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHZhciBjaGlsZHJlbiA9IG51bGw7IC8vIFVzZSBhIGhvb2sgaW5zdGVhZCBvZiBvbkVycm9yIG9uIHRoZSBpbWcgZWxlbWVudCB0byBzdXBwb3J0IHNlcnZlci1zaWRlIHJlbmRlcmluZy5cblxuICB2YXIgbG9hZGVkID0gdXNlTG9hZGVkKHtcbiAgICBzcmM6IHNyYyxcbiAgICBzcmNTZXQ6IHNyY1NldFxuICB9KTtcbiAgdmFyIGhhc0ltZyA9IHNyYyB8fCBzcmNTZXQ7XG4gIHZhciBoYXNJbWdOb3RGYWlsaW5nID0gaGFzSW1nICYmIGxvYWRlZCAhPT0gJ2Vycm9yJztcblxuICBpZiAoaGFzSW1nTm90RmFpbGluZykge1xuICAgIGNoaWxkcmVuID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwgX2V4dGVuZHMoe1xuICAgICAgYWx0OiBhbHQsXG4gICAgICBzcmM6IHNyYyxcbiAgICAgIHNyY1NldDogc3JjU2V0LFxuICAgICAgc2l6ZXM6IHNpemVzLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLmltZ1xuICAgIH0sIGltZ1Byb3BzKSk7XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5Qcm9wICE9IG51bGwpIHtcbiAgICBjaGlsZHJlbiA9IGNoaWxkcmVuUHJvcDtcbiAgfSBlbHNlIGlmIChoYXNJbWcgJiYgYWx0KSB7XG4gICAgY2hpbGRyZW4gPSBhbHRbMF07XG4gIH0gZWxzZSB7XG4gICAgY2hpbGRyZW4gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQZXJzb24sIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5mYWxsYmFja1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzZXMuc3lzdGVtLCBjbGFzc2VzW3ZhcmlhbnRdLCBjbGFzc05hbWUsICFoYXNJbWdOb3RGYWlsaW5nICYmIGNsYXNzZXMuY29sb3JEZWZhdWx0KSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIGNoaWxkcmVuKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQXZhdGFyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBgc3JjYCBvciBgc3JjU2V0YCB0b1xuICAgKiBwcm92aWRlIGFuIGFsdCBhdHRyaWJ1dGUgZm9yIHRoZSByZW5kZXJlZCBgaW1nYCBlbGVtZW50LlxuICAgKi9cbiAgYWx0OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHJlbmRlciBpY29uIG9yIHRleHQgZWxlbWVudHMgaW5zaWRlIHRoZSBBdmF0YXIgaWYgYHNyY2AgaXMgbm90IHNldC5cbiAgICogVGhpcyBjYW4gYmUgYW4gZWxlbWVudCwgb3IganVzdCBhIHN0cmluZy5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVzIGFwcGxpZWQgdG8gdGhlIGBpbWdgIGVsZW1lbnQgaWYgdGhlIGNvbXBvbmVudCBpcyB1c2VkIHRvIGRpc3BsYXkgYW4gaW1hZ2UuXG4gICAqIEl0IGNhbiBiZSB1c2VkIHRvIGxpc3RlbiBmb3IgdGhlIGxvYWRpbmcgZXJyb3IgZXZlbnQuXG4gICAqL1xuICBpbWdQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogVGhlIGBzaXplc2AgYXR0cmlidXRlIGZvciB0aGUgYGltZ2AgZWxlbWVudC5cbiAgICovXG4gIHNpemVzOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgYHNyY2AgYXR0cmlidXRlIGZvciB0aGUgYGltZ2AgZWxlbWVudC5cbiAgICovXG4gIHNyYzogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGBzcmNTZXRgIGF0dHJpYnV0ZSBmb3IgdGhlIGBpbWdgIGVsZW1lbnQuXG4gICAqIFVzZSB0aGlzIGF0dHJpYnV0ZSBmb3IgcmVzcG9uc2l2ZSBpbWFnZSBkaXNwbGF5LlxuICAgKi9cbiAgc3JjU2V0OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgc2hhcGUgb2YgdGhlIGF2YXRhci5cbiAgICovXG4gIHZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2NpcmNsZScsICdyb3VuZGVkJywgJ3NxdWFyZSddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlBdmF0YXInXG59KShBdmF0YXIpOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBjcmVhdGVTdmdJY29uIGZyb20gJy4uLy4uL3V0aWxzL2NyZWF0ZVN2Z0ljb24nO1xuLyoqXG4gKiBAaWdub3JlIC0gaW50ZXJuYWwgY29tcG9uZW50LlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVN2Z0ljb24oIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gIGQ6IFwiTTEyIDEyYzIuMjEgMCA0LTEuNzkgNC00cy0xLjc5LTQtNC00LTQgMS43OS00IDQgMS43OSA0IDQgNHptMCAyYy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00elwiXG59KSwgJ1BlcnNvbicpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBjYXBpdGFsaXplIGZyb20gJy4uL3V0aWxzL2NhcGl0YWxpemUnO1xudmFyIFJBRElVU19TVEFOREFSRCA9IDEwO1xudmFyIFJBRElVU19ET1QgPSA0O1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IHtcbiAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIC8vIEZvciBjb3JyZWN0IGFsaWdubWVudCB3aXRoIHRoZSB0ZXh0LlxuICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICBmbGV4U2hyaW5rOiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBiYWRnZSBgc3BhbmAgZWxlbWVudC4gKi9cbiAgICBiYWRnZToge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICBmbGV4V3JhcDogJ3dyYXAnLFxuICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgYWxpZ25Db250ZW50OiAnY2VudGVyJyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgIGZvbnRGYW1pbHk6IHRoZW1lLnR5cG9ncmFwaHkuZm9udEZhbWlseSxcbiAgICAgIGZvbnRXZWlnaHQ6IHRoZW1lLnR5cG9ncmFwaHkuZm9udFdlaWdodE1lZGl1bSxcbiAgICAgIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LnB4VG9SZW0oMTIpLFxuICAgICAgbWluV2lkdGg6IFJBRElVU19TVEFOREFSRCAqIDIsXG4gICAgICBsaW5lSGVpZ2h0OiAxLFxuICAgICAgcGFkZGluZzogJzAgNnB4JyxcbiAgICAgIGhlaWdodDogUkFESVVTX1NUQU5EQVJEICogMixcbiAgICAgIGJvcmRlclJhZGl1czogUkFESVVTX1NUQU5EQVJELFxuICAgICAgekluZGV4OiAxLFxuICAgICAgLy8gUmVuZGVyIHRoZSBiYWRnZSBvbiB0b3Agb2YgcG90ZW50aWFsIHJpcHBsZXMuXG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJ3RyYW5zZm9ybScsIHtcbiAgICAgICAgZWFzaW5nOiB0aGVtZS50cmFuc2l0aW9ucy5lYXNpbmcuZWFzZUluT3V0LFxuICAgICAgICBkdXJhdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuZHVyYXRpb24uZW50ZXJpbmdTY3JlZW5cbiAgICAgIH0pXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBjb2xvclByaW1hcnk6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5LmNvbnRyYXN0VGV4dFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cInNlY29uZGFyeVwiYC4gKi9cbiAgICBjb2xvclNlY29uZGFyeToge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmNvbnRyYXN0VGV4dFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cImVycm9yXCJgLiAqL1xuICAgIGNvbG9yRXJyb3I6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IuY29udHJhc3RUZXh0XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHZhcmlhbnQ9XCJkb3RcImAuICovXG4gICAgZG90OiB7XG4gICAgICBib3JkZXJSYWRpdXM6IFJBRElVU19ET1QsXG4gICAgICBoZWlnaHQ6IFJBRElVU19ET1QgKiAyLFxuICAgICAgbWluV2lkdGg6IFJBRElVU19ET1QgKiAyLFxuICAgICAgcGFkZGluZzogMFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBhbmNob3JPcmlnaW49e3sgJ3RvcCcsICdyaWdodCcgfX0gb3ZlcmxhcD1cInJlY3RhbmdsZVwiYC4gKi9cbiAgICBhbmNob3JPcmlnaW5Ub3BSaWdodFJlY3RhbmdsZToge1xuICAgICAgdG9wOiAwLFxuICAgICAgcmlnaHQ6IDAsXG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSB0cmFuc2xhdGUoNTAlLCAtNTAlKScsXG4gICAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKDUwJSwgLTUwJSknXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGFuY2hvck9yaWdpbj17eyAnYm90dG9tJywgJ3JpZ2h0JyB9fSBvdmVybGFwPVwicmVjdGFuZ2xlXCJgLiAqL1xuICAgIGFuY2hvck9yaWdpbkJvdHRvbVJpZ2h0UmVjdGFuZ2xlOiB7XG4gICAgICBib3R0b206IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpIHRyYW5zbGF0ZSg1MCUsIDUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAxMDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKDUwJSwgNTAlKSdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgYW5jaG9yT3JpZ2luPXt7ICd0b3AnLCAnbGVmdCcgfX0gb3ZlcmxhcD1cInJlY3RhbmdsZVwiYC4gKi9cbiAgICBhbmNob3JPcmlnaW5Ub3BMZWZ0UmVjdGFuZ2xlOiB7XG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSkgdHJhbnNsYXRlKC01MCUsIC01MCUpJyxcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKC01MCUsIC01MCUpJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBhbmNob3JPcmlnaW49e3sgJ2JvdHRvbScsICdsZWZ0JyB9fSBvdmVybGFwPVwicmVjdGFuZ2xlXCJgLiAqL1xuICAgIGFuY2hvck9yaWdpbkJvdHRvbUxlZnRSZWN0YW5nbGU6IHtcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSB0cmFuc2xhdGUoLTUwJSwgNTAlKScsXG4gICAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAxMDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKC01MCUsIDUwJSknXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGFuY2hvck9yaWdpbj17eyAndG9wJywgJ3JpZ2h0JyB9fSBvdmVybGFwPVwiY2lyY2xlXCJgLiAqL1xuICAgIGFuY2hvck9yaWdpblRvcFJpZ2h0Q2lyY2xlOiB7XG4gICAgICB0b3A6ICcxNCUnLFxuICAgICAgcmlnaHQ6ICcxNCUnLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSkgdHJhbnNsYXRlKDUwJSwgLTUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAwJScsXG4gICAgICAnJiRpbnZpc2libGUnOiB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApIHRyYW5zbGF0ZSg1MCUsIC01MCUpJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBhbmNob3JPcmlnaW49e3sgJ2JvdHRvbScsICdyaWdodCcgfX0gb3ZlcmxhcD1cImNpcmNsZVwiYC4gKi9cbiAgICBhbmNob3JPcmlnaW5Cb3R0b21SaWdodENpcmNsZToge1xuICAgICAgYm90dG9tOiAnMTQlJyxcbiAgICAgIHJpZ2h0OiAnMTQlJyxcbiAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpIHRyYW5zbGF0ZSg1MCUsIDUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAxMDAlJyxcbiAgICAgICcmJGludmlzaWJsZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCkgdHJhbnNsYXRlKDUwJSwgNTAlKSdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgYW5jaG9yT3JpZ2luPXt7ICd0b3AnLCAnbGVmdCcgfX0gb3ZlcmxhcD1cImNpcmNsZVwiYC4gKi9cbiAgICBhbmNob3JPcmlnaW5Ub3BMZWZ0Q2lyY2xlOiB7XG4gICAgICB0b3A6ICcxNCUnLFxuICAgICAgbGVmdDogJzE0JScsXG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSB0cmFuc2xhdGUoLTUwJSwgLTUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgICAgJyYkaW52aXNpYmxlJzoge1xuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZSgwKSB0cmFuc2xhdGUoLTUwJSwgLTUwJSknXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGFuY2hvck9yaWdpbj17eyAnYm90dG9tJywgJ2xlZnQnIH19IG92ZXJsYXA9XCJjaXJjbGVcImAuICovXG4gICAgYW5jaG9yT3JpZ2luQm90dG9tTGVmdENpcmNsZToge1xuICAgICAgYm90dG9tOiAnMTQlJyxcbiAgICAgIGxlZnQ6ICcxNCUnLFxuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSkgdHJhbnNsYXRlKC01MCUsIDUwJSknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMTAwJScsXG4gICAgICAnJiRpbnZpc2libGUnOiB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDApIHRyYW5zbGF0ZSgtNTAlLCA1MCUpJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgdG8gdGhlIGJhZGdlIGBzcGFuYCBlbGVtZW50IGlmIGBpbnZpc2libGU9e3RydWV9YC4gKi9cbiAgICBpbnZpc2libGU6IHtcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgndHJhbnNmb3JtJywge1xuICAgICAgICBlYXNpbmc6IHRoZW1lLnRyYW5zaXRpb25zLmVhc2luZy5lYXNlSW5PdXQsXG4gICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5sZWF2aW5nU2NyZWVuXG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn07XG52YXIgQmFkZ2UgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBCYWRnZShwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkYW5jaG9yT3JpZ2luID0gcHJvcHMuYW5jaG9yT3JpZ2luLFxuICAgICAgYW5jaG9yT3JpZ2luID0gX3Byb3BzJGFuY2hvck9yaWdpbiA9PT0gdm9pZCAwID8ge1xuICAgIHZlcnRpY2FsOiAndG9wJyxcbiAgICBob3Jpem9udGFsOiAncmlnaHQnXG4gIH0gOiBfcHJvcHMkYW5jaG9yT3JpZ2luLFxuICAgICAgYmFkZ2VDb250ZW50ID0gcHJvcHMuYmFkZ2VDb250ZW50LFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBjb2xvciA9IF9wcm9wcyRjb2xvciA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX3Byb3BzJGNvbG9yLFxuICAgICAgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIENvbXBvbmVudFByb3AgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnc3BhbicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgaW52aXNpYmxlUHJvcCA9IHByb3BzLmludmlzaWJsZSxcbiAgICAgIF9wcm9wcyRtYXggPSBwcm9wcy5tYXgsXG4gICAgICBtYXggPSBfcHJvcHMkbWF4ID09PSB2b2lkIDAgPyA5OSA6IF9wcm9wcyRtYXgsXG4gICAgICBfcHJvcHMkb3ZlcmxhcCA9IHByb3BzLm92ZXJsYXAsXG4gICAgICBvdmVybGFwID0gX3Byb3BzJG92ZXJsYXAgPT09IHZvaWQgMCA/ICdyZWN0YW5nbGUnIDogX3Byb3BzJG92ZXJsYXAsXG4gICAgICBfcHJvcHMkc2hvd1plcm8gPSBwcm9wcy5zaG93WmVybyxcbiAgICAgIHNob3daZXJvID0gX3Byb3BzJHNob3daZXJvID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRzaG93WmVybyxcbiAgICAgIF9wcm9wcyR2YXJpYW50ID0gcHJvcHMudmFyaWFudCxcbiAgICAgIHZhcmlhbnQgPSBfcHJvcHMkdmFyaWFudCA9PT0gdm9pZCAwID8gJ3N0YW5kYXJkJyA6IF9wcm9wcyR2YXJpYW50LFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImFuY2hvck9yaWdpblwiLCBcImJhZGdlQ29udGVudFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29tcG9uZW50XCIsIFwiaW52aXNpYmxlXCIsIFwibWF4XCIsIFwib3ZlcmxhcFwiLCBcInNob3daZXJvXCIsIFwidmFyaWFudFwiXSk7XG5cbiAgdmFyIGludmlzaWJsZSA9IGludmlzaWJsZVByb3A7XG5cbiAgaWYgKGludmlzaWJsZVByb3AgPT0gbnVsbCAmJiAoYmFkZ2VDb250ZW50ID09PSAwICYmICFzaG93WmVybyB8fCBiYWRnZUNvbnRlbnQgPT0gbnVsbCAmJiB2YXJpYW50ICE9PSAnZG90JykpIHtcbiAgICBpbnZpc2libGUgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGRpc3BsYXlWYWx1ZSA9ICcnO1xuXG4gIGlmICh2YXJpYW50ICE9PSAnZG90Jykge1xuICAgIGRpc3BsYXlWYWx1ZSA9IGJhZGdlQ29udGVudCA+IG1heCA/IFwiXCIuY29uY2F0KG1heCwgXCIrXCIpIDogYmFkZ2VDb250ZW50O1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudFByb3AsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc05hbWUpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgY2hpbGRyZW4sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuYmFkZ2UsIGNsYXNzZXNbXCJcIi5jb25jYXQoYW5jaG9yT3JpZ2luLmhvcml6b250YWwpLmNvbmNhdChjYXBpdGFsaXplKGFuY2hvck9yaWdpbi52ZXJ0aWNhbCksIFwifVwiKV0sIGNsYXNzZXNbXCJhbmNob3JPcmlnaW5cIi5jb25jYXQoY2FwaXRhbGl6ZShhbmNob3JPcmlnaW4udmVydGljYWwpKS5jb25jYXQoY2FwaXRhbGl6ZShhbmNob3JPcmlnaW4uaG9yaXpvbnRhbCkpLmNvbmNhdChjYXBpdGFsaXplKG92ZXJsYXApKV0sIGNvbG9yICE9PSAnZGVmYXVsdCcgJiYgY2xhc3Nlc1tcImNvbG9yXCIuY29uY2F0KGNhcGl0YWxpemUoY29sb3IpKV0sIGludmlzaWJsZSAmJiBjbGFzc2VzLmludmlzaWJsZSwgdmFyaWFudCA9PT0gJ2RvdCcgJiYgY2xhc3Nlcy5kb3QpXG4gIH0sIGRpc3BsYXlWYWx1ZSkpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBCYWRnZS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgYW5jaG9yIG9mIHRoZSBiYWRnZS5cbiAgICovXG4gIGFuY2hvck9yaWdpbjogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBob3Jpem9udGFsOiBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ3JpZ2h0J10pLmlzUmVxdWlyZWQsXG4gICAgdmVydGljYWw6IFByb3BUeXBlcy5vbmVPZihbJ2JvdHRvbScsICd0b3AnXSkuaXNSZXF1aXJlZFxuICB9KSxcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgcmVuZGVyZWQgd2l0aGluIHRoZSBiYWRnZS5cbiAgICovXG4gIGJhZGdlQ29udGVudDogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFRoZSBiYWRnZSB3aWxsIGJlIGFkZGVkIHJlbGF0aXZlIHRvIHRoaXMgbm9kZS5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ2Vycm9yJywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYmFkZ2Ugd2lsbCBiZSBpbnZpc2libGUuXG4gICAqL1xuICBpbnZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBNYXggY291bnQgdG8gc2hvdy5cbiAgICovXG4gIG1heDogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogV3JhcHBlZCBzaGFwZSB0aGUgYmFkZ2Ugc2hvdWxkIG92ZXJsYXAuXG4gICAqL1xuICBvdmVybGFwOiBQcm9wVHlwZXMub25lT2YoWydjaXJjbGUnLCAncmVjdGFuZ2xlJ10pLFxuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBiYWRnZSBpcyBoaWRkZW4gd2hlbiBgYmFkZ2VDb250ZW50YCBpcyB6ZXJvLlxuICAgKi9cbiAgc2hvd1plcm86IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFyaWFudCB0byB1c2UuXG4gICAqL1xuICB2YXJpYW50OiBQcm9wVHlwZXMub25lT2YoWydkb3QnLCAnc3RhbmRhcmQnXSlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQmFkZ2UnXG59KShCYWRnZSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNGcmFnbWVudCB9IGZyb20gJ3JlYWN0LWlzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICBoZWlnaHQ6IDU2LFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmJhY2tncm91bmQucGFwZXJcbiAgICB9XG4gIH07XG59O1xudmFyIEJvdHRvbU5hdmlnYXRpb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBCb3R0b21OYXZpZ2F0aW9uKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgX3Byb3BzJHNob3dMYWJlbHMgPSBwcm9wcy5zaG93TGFiZWxzLFxuICAgICAgc2hvd0xhYmVscyA9IF9wcm9wcyRzaG93TGFiZWxzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRzaG93TGFiZWxzLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb21wb25lbnRcIiwgXCJvbkNoYW5nZVwiLCBcInNob3dMYWJlbHNcIiwgXCJ2YWx1ZVwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpLCBSZWFjdC5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCwgY2hpbGRJbmRleCkge1xuICAgIGlmICghIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaXNGcmFnbWVudChjaGlsZCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbXCJNYXRlcmlhbC1VSTogVGhlIEJvdHRvbU5hdmlnYXRpb24gY29tcG9uZW50IGRvZXNuJ3QgYWNjZXB0IGEgRnJhZ21lbnQgYXMgYSBjaGlsZC5cIiwgJ0NvbnNpZGVyIHByb3ZpZGluZyBhbiBhcnJheSBpbnN0ZWFkLiddLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGRWYWx1ZSA9IGNoaWxkLnByb3BzLnZhbHVlID09PSB1bmRlZmluZWQgPyBjaGlsZEluZGV4IDogY2hpbGQucHJvcHMudmFsdWU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgIHNlbGVjdGVkOiBjaGlsZFZhbHVlID09PSB2YWx1ZSxcbiAgICAgIHNob3dMYWJlbDogY2hpbGQucHJvcHMuc2hvd0xhYmVsICE9PSB1bmRlZmluZWQgPyBjaGlsZC5wcm9wcy5zaG93TGFiZWwgOiBzaG93TGFiZWxzLFxuICAgICAgdmFsdWU6IGNoaWxkVmFsdWUsXG4gICAgICBvbkNoYW5nZTogb25DaGFuZ2VcbiAgICB9KTtcbiAgfSkpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBCb3R0b21OYXZpZ2F0aW9uLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgV2UgZGVmYXVsdCB0byB0aGUgaW5kZXggb2YgdGhlIGNoaWxkLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGFsbCBgQm90dG9tTmF2aWdhdGlvbkFjdGlvbmBzIHdpbGwgc2hvdyB0aGVpciBsYWJlbHMuXG4gICAqIEJ5IGRlZmF1bHQsIG9ubHkgdGhlIHNlbGVjdGVkIGBCb3R0b21OYXZpZ2F0aW9uQWN0aW9uYCB3aWxsIHNob3cgaXRzIGxhYmVsLlxuICAgKi9cbiAgc2hvd0xhYmVsczogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGBCb3R0b21OYXZpZ2F0aW9uQWN0aW9uYC5cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUJvdHRvbU5hdmlnYXRpb24nXG59KShCb3R0b21OYXZpZ2F0aW9uKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmltcG9ydCB1bnN1cHBvcnRlZFByb3AgZnJvbSAnLi4vdXRpbHMvdW5zdXBwb3J0ZWRQcm9wJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydjb2xvcicsICdwYWRkaW5nLXRvcCddLCB7XG4gICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydFxuICAgICAgfSksXG4gICAgICBwYWRkaW5nOiAnNnB4IDEycHggOHB4JyxcbiAgICAgIG1pbldpZHRoOiA4MCxcbiAgICAgIG1heFdpZHRoOiAxNjgsXG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LnNlY29uZGFyeSxcbiAgICAgIGZsZXg6ICcxJyxcbiAgICAgICcmJGljb25Pbmx5Jzoge1xuICAgICAgICBwYWRkaW5nVG9wOiAxNlxuICAgICAgfSxcbiAgICAgICcmJHNlbGVjdGVkJzoge1xuICAgICAgICBwYWRkaW5nVG9wOiA2LFxuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW5cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBzZWxlY3RlZC4gKi9cbiAgICBzZWxlY3RlZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBzaG93TGFiZWw9e2ZhbHNlfWAgYW5kIG5vdCBzZWxlY3RlZC4gKi9cbiAgICBpY29uT25seToge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgc3BhbiBlbGVtZW50IHRoYXQgd3JhcHMgdGhlIGljb24gYW5kIGxhYmVsLiAqL1xuICAgIHdyYXBwZXI6IHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgbGFiZWwncyBzcGFuIGVsZW1lbnQuICovXG4gICAgbGFiZWw6IHtcbiAgICAgIGZvbnRGYW1pbHk6IHRoZW1lLnR5cG9ncmFwaHkuZm9udEZhbWlseSxcbiAgICAgIGZvbnRTaXplOiB0aGVtZS50eXBvZ3JhcGh5LnB4VG9SZW0oMTIpLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHRyYW5zaXRpb246ICdmb250LXNpemUgMC4ycywgb3BhY2l0eSAwLjJzJyxcbiAgICAgIHRyYW5zaXRpb25EZWxheTogJzAuMXMnLFxuICAgICAgJyYkaWNvbk9ubHknOiB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHRyYW5zaXRpb25EZWxheTogJzBzJ1xuICAgICAgfSxcbiAgICAgICcmJHNlbGVjdGVkJzoge1xuICAgICAgICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5weFRvUmVtKDE0KVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgQm90dG9tTmF2aWdhdGlvbkFjdGlvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEJvdHRvbU5hdmlnYXRpb25BY3Rpb24ocHJvcHMsIHJlZikge1xuICB2YXIgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBpY29uID0gcHJvcHMuaWNvbixcbiAgICAgIGxhYmVsID0gcHJvcHMubGFiZWwsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgb25DbGljayA9IHByb3BzLm9uQ2xpY2ssXG4gICAgICBzZWxlY3RlZCA9IHByb3BzLnNlbGVjdGVkLFxuICAgICAgc2hvd0xhYmVsID0gcHJvcHMuc2hvd0xhYmVsLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiaWNvblwiLCBcImxhYmVsXCIsIFwib25DaGFuZ2VcIiwgXCJvbkNsaWNrXCIsIFwic2VsZWN0ZWRcIiwgXCJzaG93TGFiZWxcIiwgXCJ2YWx1ZVwiXSk7XG5cbiAgdmFyIGhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUNoYW5nZShldmVudCkge1xuICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgb25DaGFuZ2UoZXZlbnQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b25CYXNlLCBfZXh0ZW5kcyh7XG4gICAgcmVmOiByZWYsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBzZWxlY3RlZCA/IGNsYXNzZXMuc2VsZWN0ZWQgOiAhc2hvd0xhYmVsICYmIGNsYXNzZXMuaWNvbk9ubHkpLFxuICAgIGZvY3VzUmlwcGxlOiB0cnVlLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUNoYW5nZVxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLndyYXBwZXJcbiAgfSwgaWNvbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5sYWJlbCwgc2VsZWN0ZWQgPyBjbGFzc2VzLnNlbGVjdGVkIDogIXNob3dMYWJlbCAmJiBjbGFzc2VzLmljb25Pbmx5KVxuICB9LCBsYWJlbCkpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQm90dG9tTmF2aWdhdGlvbkFjdGlvbi5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGlzIHByb3AgaXNuJ3Qgc3VwcG9ydGVkLlxuICAgKiBVc2UgdGhlIGBjb21wb25lbnRgIHByb3AgaWYgeW91IG5lZWQgdG8gY2hhbmdlIHRoZSBjaGlsZHJlbiBzdHJ1Y3R1cmUuXG4gICAqL1xuICBjaGlsZHJlbjogdW5zdXBwb3J0ZWRQcm9wLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGljb24gZWxlbWVudC5cbiAgICovXG4gIGljb246IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBUaGUgbGFiZWwgZWxlbWVudC5cbiAgICovXG4gIGxhYmVsOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2VsZWN0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgQm90dG9tTmF2aWdhdGlvbkFjdGlvbmAgd2lsbCBzaG93IGl0cyBsYWJlbC5cbiAgICogQnkgZGVmYXVsdCwgb25seSB0aGUgc2VsZWN0ZWQgYEJvdHRvbU5hdmlnYXRpb25BY3Rpb25gXG4gICAqIGluc2lkZSBgQm90dG9tTmF2aWdhdGlvbmAgd2lsbCBzaG93IGl0cyBsYWJlbC5cbiAgICovXG4gIHNob3dMYWJlbDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gcHJvdmlkZSB5b3VyIG93biB2YWx1ZS4gT3RoZXJ3aXNlLCB3ZSBmYWxsYmFjayB0byB0aGUgY2hpbGQgcG9zaXRpb24gaW5kZXguXG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLmFueVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlCb3R0b21OYXZpZ2F0aW9uQWN0aW9uJ1xufSkoQm90dG9tTmF2aWdhdGlvbkFjdGlvbik7IiwiaW1wb3J0IHsgYm9yZGVycywgY29tcG9zZSwgZGlzcGxheSwgZmxleGJveCwgZ3JpZCwgcGFsZXR0ZSwgcG9zaXRpb25zLCBzaGFkb3dzLCBzaXppbmcsIHNwYWNpbmcsIHR5cG9ncmFwaHksIGNzcyB9IGZyb20gJ0BtYXRlcmlhbC11aS9zeXN0ZW0nO1xuaW1wb3J0IHN0eWxlZCBmcm9tICcuLi9zdHlsZXMvc3R5bGVkJztcbmV4cG9ydCB2YXIgc3R5bGVGdW5jdGlvbiA9IGNzcyhjb21wb3NlKGJvcmRlcnMsIGRpc3BsYXksIGZsZXhib3gsIGdyaWQsIHBvc2l0aW9ucywgcGFsZXR0ZSwgc2hhZG93cywgc2l6aW5nLCBzcGFjaW5nLCB0eXBvZ3JhcGh5KSk7XG4vKipcbiAqIEBpZ25vcmUgLSBkbyBub3QgZG9jdW1lbnQuXG4gKi9cblxudmFyIEJveCA9IHN0eWxlZCgnZGl2Jykoc3R5bGVGdW5jdGlvbiwge1xuICBuYW1lOiAnTXVpQm94J1xufSk7XG5leHBvcnQgZGVmYXVsdCBCb3g7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheVwiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGlzRnJhZ21lbnQgfSBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgVHlwb2dyYXBoeSBmcm9tICcuLi9UeXBvZ3JhcGh5JztcbmltcG9ydCBCcmVhZGNydW1iQ29sbGFwc2VkIGZyb20gJy4vQnJlYWRjcnVtYkNvbGxhcHNlZCc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IHtcbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgcm9vdDoge30sXG5cbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIG9sIGVsZW1lbnQuICovXG4gIG9sOiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGZsZXhXcmFwOiAnd3JhcCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgcGFkZGluZzogMCxcbiAgICBtYXJnaW46IDAsXG4gICAgbGlzdFN0eWxlOiAnbm9uZSdcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgbGkgZWxlbWVudC4gKi9cbiAgbGk6IHt9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBzZXBhcmF0b3IgZWxlbWVudC4gKi9cbiAgc2VwYXJhdG9yOiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICBtYXJnaW5MZWZ0OiA4LFxuICAgIG1hcmdpblJpZ2h0OiA4XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGluc2VydFNlcGFyYXRvcnMoaXRlbXMsIGNsYXNzTmFtZSwgc2VwYXJhdG9yKSB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgY3VycmVudCwgaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICBhY2MgPSBhY2MuY29uY2F0KGN1cnJlbnQsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGlcIiwge1xuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHRydWUsXG4gICAgICAgIGtleTogXCJzZXBhcmF0b3ItXCIuY29uY2F0KGluZGV4KSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICAgIH0sIHNlcGFyYXRvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhY2MucHVzaChjdXJyZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG59XG5cbnZhciBCcmVhZGNydW1icyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEJyZWFkY3J1bWJzKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnbmF2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZXhwYW5kVGV4dCA9IHByb3BzLmV4cGFuZFRleHQsXG4gICAgICBleHBhbmRUZXh0ID0gX3Byb3BzJGV4cGFuZFRleHQgPT09IHZvaWQgMCA/ICdTaG93IHBhdGgnIDogX3Byb3BzJGV4cGFuZFRleHQsXG4gICAgICBfcHJvcHMkaXRlbXNBZnRlckNvbGwgPSBwcm9wcy5pdGVtc0FmdGVyQ29sbGFwc2UsXG4gICAgICBpdGVtc0FmdGVyQ29sbGFwc2UgPSBfcHJvcHMkaXRlbXNBZnRlckNvbGwgPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkaXRlbXNBZnRlckNvbGwsXG4gICAgICBfcHJvcHMkaXRlbXNCZWZvcmVDb2wgPSBwcm9wcy5pdGVtc0JlZm9yZUNvbGxhcHNlLFxuICAgICAgaXRlbXNCZWZvcmVDb2xsYXBzZSA9IF9wcm9wcyRpdGVtc0JlZm9yZUNvbCA9PT0gdm9pZCAwID8gMSA6IF9wcm9wcyRpdGVtc0JlZm9yZUNvbCxcbiAgICAgIF9wcm9wcyRtYXhJdGVtcyA9IHByb3BzLm1heEl0ZW1zLFxuICAgICAgbWF4SXRlbXMgPSBfcHJvcHMkbWF4SXRlbXMgPT09IHZvaWQgMCA/IDggOiBfcHJvcHMkbWF4SXRlbXMsXG4gICAgICBfcHJvcHMkc2VwYXJhdG9yID0gcHJvcHMuc2VwYXJhdG9yLFxuICAgICAgc2VwYXJhdG9yID0gX3Byb3BzJHNlcGFyYXRvciA9PT0gdm9pZCAwID8gJy8nIDogX3Byb3BzJHNlcGFyYXRvcixcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb21wb25lbnRcIiwgXCJleHBhbmRUZXh0XCIsIFwiaXRlbXNBZnRlckNvbGxhcHNlXCIsIFwiaXRlbXNCZWZvcmVDb2xsYXBzZVwiLCBcIm1heEl0ZW1zXCIsIFwic2VwYXJhdG9yXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgZXhwYW5kZWQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRFeHBhbmRlZCA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICB2YXIgcmVuZGVySXRlbXNCZWZvcmVBbmRBZnRlciA9IGZ1bmN0aW9uIHJlbmRlckl0ZW1zQmVmb3JlQW5kQWZ0ZXIoYWxsSXRlbXMpIHtcbiAgICB2YXIgaGFuZGxlQ2xpY2tFeHBhbmQgPSBmdW5jdGlvbiBoYW5kbGVDbGlja0V4cGFuZChldmVudCkge1xuICAgICAgc2V0RXhwYW5kZWQodHJ1ZSk7IC8vIFRoZSBjbGlja2VkIGVsZW1lbnQgcmVjZWl2ZWQgdGhlIGZvY3VzIGJ1dCBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLlxuICAgICAgLy8gTGV0J3Mga2VlcCB0aGUgZm9jdXMgaW4gdGhlIGNvbXBvbmVudCBhZnRlciBleHBhbmRpbmcuXG5cbiAgICAgIHZhciBmb2N1c2FibGUgPSBldmVudC5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcignYVtocmVmXSxidXR0b24sW3RhYmluZGV4XScpO1xuXG4gICAgICBpZiAoZm9jdXNhYmxlKSB7XG4gICAgICAgIGZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH07IC8vIFRoaXMgZGVmZW5kcyBhZ2FpbnN0IHNvbWVvbmUgcGFzc2luZyB3ZWlyZCBpbnB1dCwgdG8gZW5zdXJlIHRoYXQgaWYgYWxsXG4gICAgLy8gaXRlbXMgd291bGQgYmUgc2hvd24gYW55d2F5LCB3ZSBqdXN0IHNob3cgYWxsIGl0ZW1zIHdpdGhvdXQgdGhlIEVsbGlwc2lzSXRlbVxuXG5cbiAgICBpZiAoaXRlbXNCZWZvcmVDb2xsYXBzZSArIGl0ZW1zQWZ0ZXJDb2xsYXBzZSA+PSBhbGxJdGVtcy5sZW5ndGgpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoWydNYXRlcmlhbC1VSTogWW91IGhhdmUgcHJvdmlkZWQgYW4gaW52YWxpZCBjb21iaW5hdGlvbiBvZiBwcm9wcyB0byB0aGUgQnJlYWRjcnVtYnMuJywgXCJpdGVtc0FmdGVyQ29sbGFwc2U9e1wiLmNvbmNhdChpdGVtc0FmdGVyQ29sbGFwc2UsIFwifSArIGl0ZW1zQmVmb3JlQ29sbGFwc2U9e1wiKS5jb25jYXQoaXRlbXNCZWZvcmVDb2xsYXBzZSwgXCJ9ID49IG1heEl0ZW1zPXtcIikuY29uY2F0KG1heEl0ZW1zLCBcIn1cIildLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFsbEl0ZW1zO1xuICAgIH1cblxuICAgIHJldHVybiBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFsbEl0ZW1zLnNsaWNlKDAsIGl0ZW1zQmVmb3JlQ29sbGFwc2UpKSwgWy8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJyZWFkY3J1bWJDb2xsYXBzZWQsIHtcbiAgICAgIFwiYXJpYS1sYWJlbFwiOiBleHBhbmRUZXh0LFxuICAgICAga2V5OiBcImVsbGlwc2lzXCIsXG4gICAgICBvbkNsaWNrOiBoYW5kbGVDbGlja0V4cGFuZFxuICAgIH0pXSwgX3RvQ29uc3VtYWJsZUFycmF5KGFsbEl0ZW1zLnNsaWNlKGFsbEl0ZW1zLmxlbmd0aCAtIGl0ZW1zQWZ0ZXJDb2xsYXBzZSwgYWxsSXRlbXMubGVuZ3RoKSkpO1xuICB9O1xuXG4gIHZhciBhbGxJdGVtcyA9IFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pLmZpbHRlcihmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGlzRnJhZ21lbnQoY2hpbGQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoW1wiTWF0ZXJpYWwtVUk6IFRoZSBCcmVhZGNydW1icyBjb21wb25lbnQgZG9lc24ndCBhY2NlcHQgYSBGcmFnbWVudCBhcyBhIGNoaWxkLlwiLCAnQ29uc2lkZXIgcHJvdmlkaW5nIGFuIGFycmF5IGluc3RlYWQuJ10uam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoY2hpbGQpO1xuICB9KS5tYXAoZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxpXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5saSxcbiAgICAgIGtleTogXCJjaGlsZC1cIi5jb25jYXQoaW5kZXgpXG4gICAgfSwgY2hpbGQpO1xuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFR5cG9ncmFwaHksIF9leHRlbmRzKHtcbiAgICByZWY6IHJlZixcbiAgICBjb21wb25lbnQ6IENvbXBvbmVudCxcbiAgICBjb2xvcjogXCJ0ZXh0U2Vjb25kYXJ5XCIsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKVxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwib2xcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5vbFxuICB9LCBpbnNlcnRTZXBhcmF0b3JzKGV4cGFuZGVkIHx8IG1heEl0ZW1zICYmIGFsbEl0ZW1zLmxlbmd0aCA8PSBtYXhJdGVtcyA/IGFsbEl0ZW1zIDogcmVuZGVySXRlbXNCZWZvcmVBbmRBZnRlcihhbGxJdGVtcyksIGNsYXNzZXMuc2VwYXJhdG9yLCBzZXBhcmF0b3IpKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEJyZWFkY3J1bWJzLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBicmVhZGNydW1iIGNoaWxkcmVuLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCB1c2VkIGZvciB0aGUgcm9vdCBub2RlLlxuICAgKiBFaXRoZXIgYSBzdHJpbmcgdG8gdXNlIGEgSFRNTCBlbGVtZW50IG9yIGEgY29tcG9uZW50LlxuICAgKi9cbiAgY29tcG9uZW50OiBQcm9wVHlwZXNcbiAgLyogQHR5cGVzY3JpcHQtdG8tcHJvcHR5cGVzLWlnbm9yZSAqL1xuICAuZWxlbWVudFR5cGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGxhYmVsIGZvciB0aGUgZXhwYW5kIGJ1dHRvbi5cbiAgICpcbiAgICogRm9yIGxvY2FsaXphdGlvbiBwdXJwb3NlcywgeW91IGNhbiB1c2UgdGhlIHByb3ZpZGVkIFt0cmFuc2xhdGlvbnNdKC9ndWlkZXMvbG9jYWxpemF0aW9uLykuXG4gICAqL1xuICBleHBhbmRUZXh0OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJZiBtYXggaXRlbXMgaXMgZXhjZWVkZWQsIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gc2hvdyBhZnRlciB0aGUgZWxsaXBzaXMuXG4gICAqL1xuICBpdGVtc0FmdGVyQ29sbGFwc2U6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIElmIG1heCBpdGVtcyBpcyBleGNlZWRlZCwgdGhlIG51bWJlciBvZiBpdGVtcyB0byBzaG93IGJlZm9yZSB0aGUgZWxsaXBzaXMuXG4gICAqL1xuICBpdGVtc0JlZm9yZUNvbGxhcHNlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJyZWFkY3J1bWJzIHRvIGRpc3BsYXkuIFdoZW4gdGhlcmUgYXJlIG1vcmVcbiAgICogdGhhbiB0aGUgbWF4aW11bSBudW1iZXIsIG9ubHkgdGhlIGZpcnN0IGBpdGVtc0JlZm9yZUNvbGxhcHNlYCBhbmQgbGFzdCBgaXRlbXNBZnRlckNvbGxhcHNlYFxuICAgKiB3aWxsIGJlIHNob3duLCB3aXRoIGFuIGVsbGlwc2lzIGluIGJldHdlZW4uXG4gICAqL1xuICBtYXhJdGVtczogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogQ3VzdG9tIHNlcGFyYXRvciBub2RlLlxuICAgKi9cbiAgc2VwYXJhdG9yOiBQcm9wVHlwZXMubm9kZVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlCcmVhZGNydW1icydcbn0pKEJyZWFkY3J1bWJzKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IHsgZW1waGFzaXplIH0gZnJvbSAnLi4vc3R5bGVzL2NvbG9yTWFuaXB1bGF0b3InO1xuaW1wb3J0IE1vcmVIb3Jpekljb24gZnJvbSAnLi4vaW50ZXJuYWwvc3ZnLWljb25zL01vcmVIb3Jpeic7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcblxudmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIHJvb3Q6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIG1hcmdpbkxlZnQ6IHRoZW1lLnNwYWNpbmcoMC41KSxcbiAgICAgIG1hcmdpblJpZ2h0OiB0aGVtZS5zcGFjaW5nKDAuNSksXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuZ3JleVsxMDBdLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZ3JleVs3MDBdLFxuICAgICAgYm9yZGVyUmFkaXVzOiAyLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAnJjpob3ZlciwgJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmdyZXlbMjAwXVxuICAgICAgfSxcbiAgICAgICcmOmFjdGl2ZSc6IHtcbiAgICAgICAgYm94U2hhZG93OiB0aGVtZS5zaGFkb3dzWzBdLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGVtcGhhc2l6ZSh0aGVtZS5wYWxldHRlLmdyZXlbMjAwXSwgMC4xMilcbiAgICAgIH1cbiAgICB9LFxuICAgIGljb246IHtcbiAgICAgIHdpZHRoOiAyNCxcbiAgICAgIGhlaWdodDogMTZcbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiBAaWdub3JlIC0gaW50ZXJuYWwgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQnJlYWRjcnVtYkNvbGxhcHNlZChwcm9wcykge1xuICB2YXIgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbkJhc2UsIF9leHRlbmRzKHtcbiAgICBjb21wb25lbnQ6IFwibGlcIixcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMucm9vdCxcbiAgICBmb2N1c1JpcHBsZTogdHJ1ZVxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1vcmVIb3Jpekljb24sIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuaWNvblxuICB9KSk7XG59XG5cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEJyZWFkY3J1bWJDb2xsYXBzZWQucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ1ByaXZhdGVCcmVhZGNydW1iQ29sbGFwc2VkJ1xufSkoQnJlYWRjcnVtYkNvbGxhcHNlZCk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNyZWF0ZVN2Z0ljb24gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlU3ZnSWNvbic7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNNiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyIDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnpcIlxufSksICdNb3JlSG9yaXonKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBpc0ZyYWdtZW50IH0gZnJvbSAncmVhY3QtaXMnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG5pbXBvcnQgeyBmYWRlIH0gZnJvbSAnLi4vc3R5bGVzL2NvbG9yTWFuaXB1bGF0b3InO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuLi9CdXR0b24nOyAvLyBGb3JjZSBhIHNpZGUgZWZmZWN0IHNvIHdlIGRvbid0IGhhdmUgYW55IG92ZXJyaWRlIHByaW9yaXR5IGlzc3VlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXG5CdXR0b24uc3R5bGVzO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IHtcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBib3JkZXJSYWRpdXM6IHRoZW1lLnNoYXBlLmJvcmRlclJhZGl1c1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiY29udGFpbmVkXCJgLiAqL1xuICAgIGNvbnRhaW5lZDoge1xuICAgICAgYm94U2hhZG93OiB0aGVtZS5zaGFkb3dzWzJdXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVFbGV2YXRpb249e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlRWxldmF0aW9uOiB7XG4gICAgICBib3hTaGFkb3c6ICdub25lJ1xuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byBjaGlsZCBlbGVtZW50cyBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmdWxsV2lkdGg9e3RydWV9YC4gKi9cbiAgICBmdWxsV2lkdGg6IHtcbiAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiYC4gKi9cbiAgICB2ZXJ0aWNhbDoge1xuICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbidcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuLiAqL1xuICAgIGdyb3VwZWQ6IHtcbiAgICAgIG1pbldpZHRoOiA0MFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYG9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiYC4gKi9cbiAgICBncm91cGVkSG9yaXpvbnRhbDoge1xuICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlclRvcExlZnRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IDBcbiAgICAgIH0sXG4gICAgICAnJjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICBib3JkZXJUb3BSaWdodFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGBvcmllbnRhdGlvbj1cInZlcnRpY2FsXCJgLiAqL1xuICAgIGdyb3VwZWRWZXJ0aWNhbDoge1xuICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlclRvcFJpZ2h0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzOiAwXG4gICAgICB9LFxuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IDBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGB2YXJpYW50PVwidGV4dFwiYC4gKi9cbiAgICBncm91cGVkVGV4dDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJ0ZXh0XCJgIGFuZCBgb3JpZW50YXRpb249XCJob3Jpem9udGFsXCJgLiAqL1xuICAgIGdyb3VwZWRUZXh0SG9yaXpvbnRhbDoge1xuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyAncmdiYSgwLCAwLCAwLCAwLjIzKScgOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIzKScpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cInRleHRcImAgYW5kIGBvcmllbnRhdGlvbj1cInZlcnRpY2FsXCJgLiAqL1xuICAgIGdyb3VwZWRUZXh0VmVydGljYWw6IHtcbiAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUudHlwZSA9PT0gJ2xpZ2h0JyA/ICdyZ2JhKDAsIDAsIDAsIDAuMjMpJyA6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjMpJylcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGB2YXJpYW50PVwidGV4dFwiYCBhbmQgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBncm91cGVkVGV4dFByaW1hcnk6IHtcbiAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiBmYWRlKHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluLCAwLjUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cInRleHRcImAgYW5kIGBjb2xvcj1cInNlY29uZGFyeVwiYC4gKi9cbiAgICBncm91cGVkVGV4dFNlY29uZGFyeToge1xuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyQ29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgMC41KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYC4gKi9cbiAgICBncm91cGVkT3V0bGluZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGB2YXJpYW50PVwib3V0bGluZWRcImAgYW5kIGBvcmllbnRhdGlvbj1cImhvcml6b250YWxcImAuICovXG4gICAgZ3JvdXBlZE91dGxpbmVkSG9yaXpvbnRhbDoge1xuICAgICAgJyY6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICAgIG1hcmdpbkxlZnQ6IC0xXG4gICAgICB9LFxuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyUmlnaHRDb2xvcjogJ3RyYW5zcGFyZW50J1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYCBhbmQgYG9yaWVudGF0aW9uPVwidmVydGljYWxcImAuICovXG4gICAgZ3JvdXBlZE91dGxpbmVkVmVydGljYWw6IHtcbiAgICAgICcmOm5vdCg6Zmlyc3QtY2hpbGQpJzoge1xuICAgICAgICBtYXJnaW5Ub3A6IC0xXG4gICAgICB9LFxuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIGlmIGB2YXJpYW50PVwib3V0bGluZWRcImAgYW5kIGBjb2xvcj1cInByaW1hcnlcImAuICovXG4gICAgZ3JvdXBlZE91dGxpbmVkUHJpbWFyeToge1xuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpblxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYCBhbmQgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIGdyb3VwZWRPdXRsaW5lZFNlY29uZGFyeToge1xuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cImNvbnRhaW5lZFwiYC4gKi9cbiAgICBncm91cGVkQ29udGFpbmVkOiB7XG4gICAgICBib3hTaGFkb3c6ICdub25lJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgY2hpbGRyZW4gaWYgYHZhcmlhbnQ9XCJjb250YWluZWRcImAgYW5kIGBvcmllbnRhdGlvbj1cImhvcml6b250YWxcImAuICovXG4gICAgZ3JvdXBlZENvbnRhaW5lZEhvcml6b250YWw6IHtcbiAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5ncmV5WzQwMF0pLFxuICAgICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgICBib3JkZXJSaWdodDogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cImNvbnRhaW5lZFwiYCBhbmQgYG9yaWVudGF0aW9uPVwidmVydGljYWxcImAuICovXG4gICAgZ3JvdXBlZENvbnRhaW5lZFZlcnRpY2FsOiB7XG4gICAgICAnJjpub3QoOmxhc3QtY2hpbGQpJzoge1xuICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLmdyZXlbNDAwXSksXG4gICAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICAgIGJvcmRlckJvdHRvbTogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUuYWN0aW9uLmRpc2FibGVkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cImNvbnRhaW5lZFwiYCBhbmQgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBncm91cGVkQ29udGFpbmVkUHJpbWFyeToge1xuICAgICAgJyY6bm90KDpsYXN0LWNoaWxkKSc6IHtcbiAgICAgICAgYm9yZGVyQ29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5kYXJrXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjaGlsZHJlbiBpZiBgdmFyaWFudD1cImNvbnRhaW5lZFwiYCBhbmQgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIGdyb3VwZWRDb250YWluZWRTZWNvbmRhcnk6IHtcbiAgICAgICcmOm5vdCg6bGFzdC1jaGlsZCknOiB7XG4gICAgICAgIGJvcmRlckNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5kYXJrXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBCdXR0b25Hcm91cCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEJ1dHRvbkdyb3VwKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb2xvciA9IHByb3BzLmNvbG9yLFxuICAgICAgY29sb3IgPSBfcHJvcHMkY29sb3IgPT09IHZvaWQgMCA/ICdkZWZhdWx0JyA6IF9wcm9wcyRjb2xvcixcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIGRpc2FibGVkID0gX3Byb3BzJGRpc2FibGVkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlZCxcbiAgICAgIF9wcm9wcyRkaXNhYmxlRWxldmF0aSA9IHByb3BzLmRpc2FibGVFbGV2YXRpb24sXG4gICAgICBkaXNhYmxlRWxldmF0aW9uID0gX3Byb3BzJGRpc2FibGVFbGV2YXRpID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlRWxldmF0aSxcbiAgICAgIF9wcm9wcyRkaXNhYmxlRm9jdXNSaSA9IHByb3BzLmRpc2FibGVGb2N1c1JpcHBsZSxcbiAgICAgIGRpc2FibGVGb2N1c1JpcHBsZSA9IF9wcm9wcyRkaXNhYmxlRm9jdXNSaSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZUZvY3VzUmksXG4gICAgICBfcHJvcHMkZGlzYWJsZVJpcHBsZSA9IHByb3BzLmRpc2FibGVSaXBwbGUsXG4gICAgICBkaXNhYmxlUmlwcGxlID0gX3Byb3BzJGRpc2FibGVSaXBwbGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVSaXBwbGUsXG4gICAgICBfcHJvcHMkZnVsbFdpZHRoID0gcHJvcHMuZnVsbFdpZHRoLFxuICAgICAgZnVsbFdpZHRoID0gX3Byb3BzJGZ1bGxXaWR0aCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZnVsbFdpZHRoLFxuICAgICAgX3Byb3BzJG9yaWVudGF0aW9uID0gcHJvcHMub3JpZW50YXRpb24sXG4gICAgICBvcmllbnRhdGlvbiA9IF9wcm9wcyRvcmllbnRhdGlvbiA9PT0gdm9pZCAwID8gJ2hvcml6b250YWwnIDogX3Byb3BzJG9yaWVudGF0aW9uLFxuICAgICAgX3Byb3BzJHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnbWVkaXVtJyA6IF9wcm9wcyRzaXplLFxuICAgICAgX3Byb3BzJHZhcmlhbnQgPSBwcm9wcy52YXJpYW50LFxuICAgICAgdmFyaWFudCA9IF9wcm9wcyR2YXJpYW50ID09PSB2b2lkIDAgPyAnb3V0bGluZWQnIDogX3Byb3BzJHZhcmlhbnQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sb3JcIiwgXCJjb21wb25lbnRcIiwgXCJkaXNhYmxlZFwiLCBcImRpc2FibGVFbGV2YXRpb25cIiwgXCJkaXNhYmxlRm9jdXNSaXBwbGVcIiwgXCJkaXNhYmxlUmlwcGxlXCIsIFwiZnVsbFdpZHRoXCIsIFwib3JpZW50YXRpb25cIiwgXCJzaXplXCIsIFwidmFyaWFudFwiXSk7XG5cbiAgdmFyIGJ1dHRvbkNsYXNzTmFtZSA9IGNsc3goY2xhc3Nlcy5ncm91cGVkLCBjbGFzc2VzW1wiZ3JvdXBlZFwiLmNvbmNhdChjYXBpdGFsaXplKG9yaWVudGF0aW9uKSldLCBjbGFzc2VzW1wiZ3JvdXBlZFwiLmNvbmNhdChjYXBpdGFsaXplKHZhcmlhbnQpKV0sIGNsYXNzZXNbXCJncm91cGVkXCIuY29uY2F0KGNhcGl0YWxpemUodmFyaWFudCkpLmNvbmNhdChjYXBpdGFsaXplKG9yaWVudGF0aW9uKSldLCBjbGFzc2VzW1wiZ3JvdXBlZFwiLmNvbmNhdChjYXBpdGFsaXplKHZhcmlhbnQpKS5jb25jYXQoY29sb3IgIT09ICdkZWZhdWx0JyA/IGNhcGl0YWxpemUoY29sb3IpIDogJycpXSwgZGlzYWJsZWQgJiYgY2xhc3Nlcy5kaXNhYmxlZCk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICByb2xlOiBcImdyb3VwXCIsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBmdWxsV2lkdGggJiYgY2xhc3Nlcy5mdWxsV2lkdGgsIGRpc2FibGVFbGV2YXRpb24gJiYgY2xhc3Nlcy5kaXNhYmxlRWxldmF0aW9uLCB2YXJpYW50ID09PSAnY29udGFpbmVkJyAmJiBjbGFzc2VzLmNvbnRhaW5lZCwgb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgJiYgY2xhc3Nlcy52ZXJ0aWNhbCksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpLCBSZWFjdC5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICghIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaXNGcmFnbWVudChjaGlsZCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbXCJNYXRlcmlhbC1VSTogVGhlIEJ1dHRvbkdyb3VwIGNvbXBvbmVudCBkb2Vzbid0IGFjY2VwdCBhIEZyYWdtZW50IGFzIGEgY2hpbGQuXCIsICdDb25zaWRlciBwcm92aWRpbmcgYW4gYXJyYXkgaW5zdGVhZC4nXS5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xzeChidXR0b25DbGFzc05hbWUsIGNoaWxkLnByb3BzLmNsYXNzTmFtZSksXG4gICAgICBjb2xvcjogY2hpbGQucHJvcHMuY29sb3IgfHwgY29sb3IsXG4gICAgICBkaXNhYmxlZDogY2hpbGQucHJvcHMuZGlzYWJsZWQgfHwgZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlRWxldmF0aW9uOiBjaGlsZC5wcm9wcy5kaXNhYmxlRWxldmF0aW9uIHx8IGRpc2FibGVFbGV2YXRpb24sXG4gICAgICBkaXNhYmxlRm9jdXNSaXBwbGU6IGRpc2FibGVGb2N1c1JpcHBsZSxcbiAgICAgIGRpc2FibGVSaXBwbGU6IGRpc2FibGVSaXBwbGUsXG4gICAgICBmdWxsV2lkdGg6IGZ1bGxXaWR0aCxcbiAgICAgIHNpemU6IGNoaWxkLnByb3BzLnNpemUgfHwgc2l6ZSxcbiAgICAgIHZhcmlhbnQ6IGNoaWxkLnByb3BzLnZhcmlhbnQgfHwgdmFyaWFudFxuICAgIH0pO1xuICB9KSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEJ1dHRvbkdyb3VwLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBidXR0b24gZ3JvdXAuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGNvbXBvbmVudC4gSXQgc3VwcG9ydHMgdGhvc2UgdGhlbWUgY29sb3JzIHRoYXQgbWFrZSBzZW5zZSBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBjb2xvcjogUHJvcFR5cGVzLm9uZU9mKFsnZGVmYXVsdCcsICdpbmhlcml0JywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYnV0dG9ucyB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIG5vIGVsZXZhdGlvbiBpcyB1c2VkLlxuICAgKi9cbiAgZGlzYWJsZUVsZXZhdGlvbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGJ1dHRvbiBrZXlib2FyZCBmb2N1cyByaXBwbGUgd2lsbCBiZSBkaXNhYmxlZC5cbiAgICovXG4gIGRpc2FibGVGb2N1c1JpcHBsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGJ1dHRvbiByaXBwbGUgZWZmZWN0IHdpbGwgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBkaXNhYmxlUmlwcGxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYnV0dG9ucyB3aWxsIHRha2UgdXAgdGhlIGZ1bGwgd2lkdGggb2YgaXRzIGNvbnRhaW5lci5cbiAgICovXG4gIGZ1bGxXaWR0aDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBncm91cCBvcmllbnRhdGlvbiAobGF5b3V0IGZsb3cgZGlyZWN0aW9uKS5cbiAgICovXG4gIG9yaWVudGF0aW9uOiBQcm9wVHlwZXMub25lT2YoWydob3Jpem9udGFsJywgJ3ZlcnRpY2FsJ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgYnV0dG9uLlxuICAgKiBgc21hbGxgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGRlbnNlIGJ1dHRvbiBzdHlsaW5nLlxuICAgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFsnbGFyZ2UnLCAnbWVkaXVtJywgJ3NtYWxsJ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFyaWFudCB0byB1c2UuXG4gICAqL1xuICB2YXJpYW50OiBQcm9wVHlwZXMub25lT2YoWydjb250YWluZWQnLCAnb3V0bGluZWQnLCAndGV4dCddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlCdXR0b25Hcm91cCdcbn0pKEJ1dHRvbkdyb3VwKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUGFwZXIgZnJvbSAnLi4vUGFwZXInO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgfVxufTtcbnZhciBDYXJkID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2FyZChwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRyYWlzZWQgPSBwcm9wcy5yYWlzZWQsXG4gICAgICByYWlzZWQgPSBfcHJvcHMkcmFpc2VkID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRyYWlzZWQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcInJhaXNlZFwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBhcGVyLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICBlbGV2YXRpb246IHJhaXNlZCA/IDggOiAxLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENhcmQucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNhcmQgd2lsbCB1c2UgcmFpc2VkIHN0eWxpbmcuXG4gICAqL1xuICByYWlzZWQ6IFByb3BUeXBlcy5ib29sXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNhcmQnXG59KShDYXJkKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgdGV4dEFsaWduOiAnaW5oZXJpdCcsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgJyY6aG92ZXIgJGZvY3VzSGlnaGxpZ2h0Jzoge1xuICAgICAgICBvcGFjaXR5OiB0aGVtZS5wYWxldHRlLmFjdGlvbi5ob3Zlck9wYWNpdHlcbiAgICAgIH0sXG4gICAgICAnJiRmb2N1c1Zpc2libGUgJGZvY3VzSGlnaGxpZ2h0Jzoge1xuICAgICAgICBvcGFjaXR5OiAwLjEyXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSBCdXR0b25CYXNlIHJvb3QgZWxlbWVudCBpZiB0aGUgYWN0aW9uIGFyZWEgaXMga2V5Ym9hcmQgZm9jdXNlZC4gKi9cbiAgICBmb2N1c1Zpc2libGU6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIG92ZXJsYXkgdGhhdCBjb3ZlcnMgdGhlIGFjdGlvbiBhcmVhIHdoZW4gaXQgaXMga2V5Ym9hcmQgZm9jdXNlZC4gKi9cbiAgICBmb2N1c0hpZ2hsaWdodDoge1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICBib3JkZXJSYWRpdXM6ICdpbmhlcml0JyxcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdjdXJyZW50Y29sb3InLFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCdvcGFjaXR5Jywge1xuICAgICAgICBkdXJhdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuZHVyYXRpb24uc2hvcnRcbiAgICAgIH0pXG4gICAgfVxuICB9O1xufTtcbnZhciBDYXJkQWN0aW9uQXJlYSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENhcmRBY3Rpb25BcmVhKHByb3BzLCByZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGZvY3VzVmlzaWJsZUNsYXNzTmFtZSA9IHByb3BzLmZvY3VzVmlzaWJsZUNsYXNzTmFtZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJmb2N1c1Zpc2libGVDbGFzc05hbWVcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b25CYXNlLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICBmb2N1c1Zpc2libGVDbGFzc05hbWU6IGNsc3goZm9jdXNWaXNpYmxlQ2xhc3NOYW1lLCBjbGFzc2VzLmZvY3VzVmlzaWJsZSksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpLCBjaGlsZHJlbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuZm9jdXNIaWdobGlnaHRcbiAgfSkpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDYXJkQWN0aW9uQXJlYS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZm9jdXNWaXNpYmxlQ2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNhcmRBY3Rpb25BcmVhJ1xufSkoQ2FyZEFjdGlvbkFyZWEpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0ge1xuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICByb290OiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgIHBhZGRpbmc6IDhcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBkaXNhYmxlU3BhY2luZz17ZmFsc2V9YC4gKi9cbiAgc3BhY2luZzoge1xuICAgICcmID4gOm5vdCg6Zmlyc3QtY2hpbGQpJzoge1xuICAgICAgbWFyZ2luTGVmdDogOFxuICAgIH1cbiAgfVxufTtcbnZhciBDYXJkQWN0aW9ucyA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENhcmRBY3Rpb25zKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRkaXNhYmxlU3BhY2luZyA9IHByb3BzLmRpc2FibGVTcGFjaW5nLFxuICAgICAgZGlzYWJsZVNwYWNpbmcgPSBfcHJvcHMkZGlzYWJsZVNwYWNpbmcgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVTcGFjaW5nLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiZGlzYWJsZVNwYWNpbmdcIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgIWRpc2FibGVTcGFjaW5nICYmIGNsYXNzZXMuc3BhY2luZyksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQ2FyZEFjdGlvbnMucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGFjdGlvbnMgZG8gbm90IGhhdmUgYWRkaXRpb25hbCBtYXJnaW4uXG4gICAqL1xuICBkaXNhYmxlU3BhY2luZzogUHJvcFR5cGVzLmJvb2xcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQ2FyZEFjdGlvbnMnXG59KShDYXJkQWN0aW9ucyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBwYWRkaW5nOiAxNixcbiAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgcGFkZGluZ0JvdHRvbTogMjRcbiAgICB9XG4gIH1cbn07XG52YXIgQ2FyZENvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBDYXJkQ29udGVudChwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbXBvbmVudFwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQ2FyZENvbnRlbnQucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNhcmRDb250ZW50J1xufSkoQ2FyZENvbnRlbnQpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJy4uL1R5cG9ncmFwaHknO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgcGFkZGluZzogMTZcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYXZhdGFyIGVsZW1lbnQuICovXG4gIGF2YXRhcjoge1xuICAgIGZsZXg6ICcwIDAgYXV0bycsXG4gICAgbWFyZ2luUmlnaHQ6IDE2XG4gIH0sXG5cbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGFjdGlvbiBlbGVtZW50LiAqL1xuICBhY3Rpb246IHtcbiAgICBmbGV4OiAnMCAwIGF1dG8nLFxuICAgIGFsaWduU2VsZjogJ2ZsZXgtc3RhcnQnLFxuICAgIG1hcmdpblRvcDogLTgsXG4gICAgbWFyZ2luUmlnaHQ6IC04XG4gIH0sXG5cbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbnRlbnQgd3JhcHBlciBlbGVtZW50LiAqL1xuICBjb250ZW50OiB7XG4gICAgZmxleDogJzEgMSBhdXRvJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSB0aXRsZSBUeXBvZ3JhcGh5IGVsZW1lbnQuICovXG4gIHRpdGxlOiB7fSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgc3ViaGVhZGVyIFR5cG9ncmFwaHkgZWxlbWVudC4gKi9cbiAgc3ViaGVhZGVyOiB7fVxufTtcbnZhciBDYXJkSGVhZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2FyZEhlYWRlcihwcm9wcywgcmVmKSB7XG4gIHZhciBhY3Rpb24gPSBwcm9wcy5hY3Rpb24sXG4gICAgICBhdmF0YXIgPSBwcm9wcy5hdmF0YXIsXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZGlzYWJsZVR5cG9ncmEgPSBwcm9wcy5kaXNhYmxlVHlwb2dyYXBoeSxcbiAgICAgIGRpc2FibGVUeXBvZ3JhcGh5ID0gX3Byb3BzJGRpc2FibGVUeXBvZ3JhID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlVHlwb2dyYSxcbiAgICAgIHN1YmhlYWRlclByb3AgPSBwcm9wcy5zdWJoZWFkZXIsXG4gICAgICBzdWJoZWFkZXJUeXBvZ3JhcGh5UHJvcHMgPSBwcm9wcy5zdWJoZWFkZXJUeXBvZ3JhcGh5UHJvcHMsXG4gICAgICB0aXRsZVByb3AgPSBwcm9wcy50aXRsZSxcbiAgICAgIHRpdGxlVHlwb2dyYXBoeVByb3BzID0gcHJvcHMudGl0bGVUeXBvZ3JhcGh5UHJvcHMsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiYWN0aW9uXCIsIFwiYXZhdGFyXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbXBvbmVudFwiLCBcImRpc2FibGVUeXBvZ3JhcGh5XCIsIFwic3ViaGVhZGVyXCIsIFwic3ViaGVhZGVyVHlwb2dyYXBoeVByb3BzXCIsIFwidGl0bGVcIiwgXCJ0aXRsZVR5cG9ncmFwaHlQcm9wc1wiXSk7XG5cbiAgdmFyIHRpdGxlID0gdGl0bGVQcm9wO1xuXG4gIGlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLnR5cGUgIT09IFR5cG9ncmFwaHkgJiYgIWRpc2FibGVUeXBvZ3JhcGh5KSB7XG4gICAgdGl0bGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUeXBvZ3JhcGh5LCBfZXh0ZW5kcyh7XG4gICAgICB2YXJpYW50OiBhdmF0YXIgPyAnYm9keTInIDogJ2g1JyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy50aXRsZSxcbiAgICAgIGNvbXBvbmVudDogXCJzcGFuXCIsXG4gICAgICBkaXNwbGF5OiBcImJsb2NrXCJcbiAgICB9LCB0aXRsZVR5cG9ncmFwaHlQcm9wcyksIHRpdGxlKTtcbiAgfVxuXG4gIHZhciBzdWJoZWFkZXIgPSBzdWJoZWFkZXJQcm9wO1xuXG4gIGlmIChzdWJoZWFkZXIgIT0gbnVsbCAmJiBzdWJoZWFkZXIudHlwZSAhPT0gVHlwb2dyYXBoeSAmJiAhZGlzYWJsZVR5cG9ncmFwaHkpIHtcbiAgICBzdWJoZWFkZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUeXBvZ3JhcGh5LCBfZXh0ZW5kcyh7XG4gICAgICB2YXJpYW50OiBhdmF0YXIgPyAnYm9keTInIDogJ2JvZHkxJyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5zdWJoZWFkZXIsXG4gICAgICBjb2xvcjogXCJ0ZXh0U2Vjb25kYXJ5XCIsXG4gICAgICBjb21wb25lbnQ6IFwic3BhblwiLFxuICAgICAgZGlzcGxheTogXCJibG9ja1wiXG4gICAgfSwgc3ViaGVhZGVyVHlwb2dyYXBoeVByb3BzKSwgc3ViaGVhZGVyKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc05hbWUpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgYXZhdGFyICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuYXZhdGFyXG4gIH0sIGF2YXRhciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuY29udGVudFxuICB9LCB0aXRsZSwgc3ViaGVhZGVyKSwgYWN0aW9uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuYWN0aW9uXG4gIH0sIGFjdGlvbikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDYXJkSGVhZGVyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBhY3Rpb24gdG8gZGlzcGxheSBpbiB0aGUgY2FyZCBoZWFkZXIuXG4gICAqL1xuICBhY3Rpb246IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBUaGUgQXZhdGFyIGZvciB0aGUgQ2FyZCBIZWFkZXIuXG4gICAqL1xuICBhdmF0YXI6IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBgc3ViaGVhZGVyYCBhbmQgYHRpdGxlYCB3b24ndCBiZSB3cmFwcGVkIGJ5IGEgVHlwb2dyYXBoeSBjb21wb25lbnQuXG4gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byByZW5kZXIgYW4gYWx0ZXJuYXRpdmUgVHlwb2dyYXBoeSB2YXJpYW50IGJ5IHdyYXBwaW5nXG4gICAqIHRoZSBgdGl0bGVgIHRleHQsIGFuZCBvcHRpb25hbCBgc3ViaGVhZGVyYCB0ZXh0XG4gICAqIHdpdGggdGhlIFR5cG9ncmFwaHkgY29tcG9uZW50LlxuICAgKi9cbiAgZGlzYWJsZVR5cG9ncmFwaHk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgc3ViaGVhZGVyOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogVGhlc2UgcHJvcHMgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIHN1YmhlYWRlclxuICAgKiAoYXMgbG9uZyBhcyBkaXNhYmxlVHlwb2dyYXBoeSBpcyBub3QgYHRydWVgKS5cbiAgICovXG4gIHN1YmhlYWRlclR5cG9ncmFwaHlQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIENhcmQgVGl0bGUuXG4gICAqL1xuICB0aXRsZTogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFRoZXNlIHByb3BzIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSB0aXRsZVxuICAgKiAoYXMgbG9uZyBhcyBkaXNhYmxlVHlwb2dyYXBoeSBpcyBub3QgYHRydWVgKS5cbiAgICovXG4gIHRpdGxlVHlwb2dyYXBoeVByb3BzOiBQcm9wVHlwZXMub2JqZWN0XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNhcmRIZWFkZXInXG59KShDYXJkSGVhZGVyKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgeyBjaGFpblByb3BUeXBlcyB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IHtcbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgcm9vdDoge1xuICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgYmFja2dyb3VuZFNpemU6ICdjb3ZlcicsXG4gICAgYmFja2dyb3VuZFJlcGVhdDogJ25vLXJlcGVhdCcsXG4gICAgYmFja2dyb3VuZFBvc2l0aW9uOiAnY2VudGVyJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbXBvbmVudD1cInZpZGVvLCBhdWRpbywgcGljdHVyZSwgaWZyYW1lLCBvciBpbWdcImAuICovXG4gIG1lZGlhOiB7XG4gICAgd2lkdGg6ICcxMDAlJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbXBvbmVudD1cInBpY3R1cmUgb3IgaW1nXCJgLiAqL1xuICBpbWc6IHtcbiAgICAvLyDimqDvuI8gb2JqZWN0LWZpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFIDExLlxuICAgIG9iamVjdEZpdDogJ2NvdmVyJ1xuICB9XG59O1xudmFyIE1FRElBX0NPTVBPTkVOVFMgPSBbJ3ZpZGVvJywgJ2F1ZGlvJywgJ3BpY3R1cmUnLCAnaWZyYW1lJywgJ2ltZyddO1xudmFyIENhcmRNZWRpYSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENhcmRNZWRpYShwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgaW1hZ2UgPSBwcm9wcy5pbWFnZSxcbiAgICAgIHNyYyA9IHByb3BzLnNyYyxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29tcG9uZW50XCIsIFwiaW1hZ2VcIiwgXCJzcmNcIiwgXCJzdHlsZVwiXSk7XG5cbiAgdmFyIGlzTWVkaWFDb21wb25lbnQgPSBNRURJQV9DT01QT05FTlRTLmluZGV4T2YoQ29tcG9uZW50KSAhPT0gLTE7XG4gIHZhciBjb21wb3NlZFN0eWxlID0gIWlzTWVkaWFDb21wb25lbnQgJiYgaW1hZ2UgPyBfZXh0ZW5kcyh7XG4gICAgYmFja2dyb3VuZEltYWdlOiBcInVybChcXFwiXCIuY29uY2F0KGltYWdlLCBcIlxcXCIpXCIpXG4gIH0sIHN0eWxlKSA6IHN0eWxlO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBpc01lZGlhQ29tcG9uZW50ICYmIGNsYXNzZXMubWVkaWEsIFwicGljdHVyZSBpbWdcIi5pbmRleE9mKENvbXBvbmVudCkgIT09IC0xICYmIGNsYXNzZXMuaW1nKSxcbiAgICByZWY6IHJlZixcbiAgICBzdHlsZTogY29tcG9zZWRTdHlsZSxcbiAgICBzcmM6IGlzTWVkaWFDb21wb25lbnQgPyBpbWFnZSB8fCBzcmMgOiB1bmRlZmluZWRcbiAgfSwgb3RoZXIpLCBjaGlsZHJlbik7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENhcmRNZWRpYS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRyZW46IGNoYWluUHJvcFR5cGVzKFByb3BUeXBlcy5ub2RlLCBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLmNoaWxkcmVuICYmICFwcm9wcy5pbWFnZSAmJiAhcHJvcHMuc3JjICYmICFwcm9wcy5jb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ01hdGVyaWFsLVVJOiBFaXRoZXIgYGNoaWxkcmVuYCwgYGltYWdlYCwgYHNyY2Agb3IgYGNvbXBvbmVudGAgcHJvcCBtdXN0IGJlIHNwZWNpZmllZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSksXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSW1hZ2UgdG8gYmUgZGlzcGxheWVkIGFzIGEgYmFja2dyb3VuZCBpbWFnZS5cbiAgICogRWl0aGVyIGBpbWFnZWAgb3IgYHNyY2AgcHJvcCBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICogTm90ZSB0aGF0IGNhbGxlciBtdXN0IHNwZWNpZnkgaGVpZ2h0IG90aGVyd2lzZSB0aGUgaW1hZ2Ugd2lsbCBub3QgYmUgdmlzaWJsZS5cbiAgICovXG4gIGltYWdlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBBbiBhbGlhcyBmb3IgYGltYWdlYCBwcm9wZXJ0eS5cbiAgICogQXZhaWxhYmxlIG9ubHkgd2l0aCBtZWRpYSBjb21wb25lbnRzLlxuICAgKiBNZWRpYSBjb21wb25lbnRzOiBgdmlkZW9gLCBgYXVkaW9gLCBgcGljdHVyZWAsIGBpZnJhbWVgLCBgaW1nYC5cbiAgICovXG4gIHNyYzogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3Rcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQ2FyZE1lZGlhJ1xufSkoQ2FyZE1lZGlhKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgeyByZWZUeXBlIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmltcG9ydCBTd2l0Y2hCYXNlIGZyb20gJy4uL2ludGVybmFsL1N3aXRjaEJhc2UnO1xuaW1wb3J0IENoZWNrQm94T3V0bGluZUJsYW5rSWNvbiBmcm9tICcuLi9pbnRlcm5hbC9zdmctaWNvbnMvQ2hlY2tCb3hPdXRsaW5lQmxhbmsnO1xuaW1wb3J0IENoZWNrQm94SWNvbiBmcm9tICcuLi9pbnRlcm5hbC9zdmctaWNvbnMvQ2hlY2tCb3gnO1xuaW1wb3J0IHsgZmFkZSB9IGZyb20gJy4uL3N0eWxlcy9jb2xvck1hbmlwdWxhdG9yJztcbmltcG9ydCBJbmRldGVybWluYXRlQ2hlY2tCb3hJY29uIGZyb20gJy4uL2ludGVybmFsL3N2Zy1pY29ucy9JbmRldGVybWluYXRlQ2hlY2tCb3gnO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUudGV4dC5zZWNvbmRhcnlcbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY2hlY2tlZD17dHJ1ZX1gLiAqL1xuICAgIGNoZWNrZWQ6IHt9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBpbmRldGVybWluYXRlPXt0cnVlfWAuICovXG4gICAgaW5kZXRlcm1pbmF0ZToge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cInByaW1hcnlcImAuICovXG4gICAgY29sb3JQcmltYXJ5OiB7XG4gICAgICAnJiRjaGVja2VkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZmFkZSh0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbiwgdGhlbWUucGFsZXR0ZS5hY3Rpb24uaG92ZXJPcGFjaXR5KSxcbiAgICAgICAgICAvLyBSZXNldCBvbiB0b3VjaCBkZXZpY2VzLCBpdCBkb2Vzbid0IGFkZCBzcGVjaWZpY2l0eVxuICAgICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJzZWNvbmRhcnlcImAuICovXG4gICAgY29sb3JTZWNvbmRhcnk6IHtcbiAgICAgICcmJGNoZWNrZWQnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluLFxuICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgdGhlbWUucGFsZXR0ZS5hY3Rpb24uaG92ZXJPcGFjaXR5KSxcbiAgICAgICAgICAvLyBSZXNldCBvbiB0b3VjaCBkZXZpY2VzLCBpdCBkb2Vzbid0IGFkZCBzcGVjaWZpY2l0eVxuICAgICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIGRlZmF1bHRDaGVja2VkSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrQm94SWNvbiwgbnVsbCk7XG52YXIgZGVmYXVsdEljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDaGVja0JveE91dGxpbmVCbGFua0ljb24sIG51bGwpO1xudmFyIGRlZmF1bHRJbmRldGVybWluYXRlSWNvbiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEluZGV0ZXJtaW5hdGVDaGVja0JveEljb24sIG51bGwpO1xudmFyIENoZWNrYm94ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2hlY2tib3gocHJvcHMsIHJlZikge1xuICB2YXIgX3Byb3BzJGNoZWNrZWRJY29uID0gcHJvcHMuY2hlY2tlZEljb24sXG4gICAgICBjaGVja2VkSWNvbiA9IF9wcm9wcyRjaGVja2VkSWNvbiA9PT0gdm9pZCAwID8gZGVmYXVsdENoZWNrZWRJY29uIDogX3Byb3BzJGNoZWNrZWRJY29uLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBfcHJvcHMkY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbG9yID0gX3Byb3BzJGNvbG9yID09PSB2b2lkIDAgPyAnc2Vjb25kYXJ5JyA6IF9wcm9wcyRjb2xvcixcbiAgICAgIF9wcm9wcyRpY29uID0gcHJvcHMuaWNvbixcbiAgICAgIGljb25Qcm9wID0gX3Byb3BzJGljb24gPT09IHZvaWQgMCA/IGRlZmF1bHRJY29uIDogX3Byb3BzJGljb24sXG4gICAgICBfcHJvcHMkaW5kZXRlcm1pbmF0ZSA9IHByb3BzLmluZGV0ZXJtaW5hdGUsXG4gICAgICBpbmRldGVybWluYXRlID0gX3Byb3BzJGluZGV0ZXJtaW5hdGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGluZGV0ZXJtaW5hdGUsXG4gICAgICBfcHJvcHMkaW5kZXRlcm1pbmF0ZUkgPSBwcm9wcy5pbmRldGVybWluYXRlSWNvbixcbiAgICAgIGluZGV0ZXJtaW5hdGVJY29uUHJvcCA9IF9wcm9wcyRpbmRldGVybWluYXRlSSA9PT0gdm9pZCAwID8gZGVmYXVsdEluZGV0ZXJtaW5hdGVJY29uIDogX3Byb3BzJGluZGV0ZXJtaW5hdGVJLFxuICAgICAgaW5wdXRQcm9wcyA9IHByb3BzLmlucHV0UHJvcHMsXG4gICAgICBfcHJvcHMkc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICBzaXplID0gX3Byb3BzJHNpemUgPT09IHZvaWQgMCA/ICdtZWRpdW0nIDogX3Byb3BzJHNpemUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hlY2tlZEljb25cIiwgXCJjbGFzc2VzXCIsIFwiY29sb3JcIiwgXCJpY29uXCIsIFwiaW5kZXRlcm1pbmF0ZVwiLCBcImluZGV0ZXJtaW5hdGVJY29uXCIsIFwiaW5wdXRQcm9wc1wiLCBcInNpemVcIl0pO1xuXG4gIHZhciBpY29uID0gaW5kZXRlcm1pbmF0ZSA/IGluZGV0ZXJtaW5hdGVJY29uUHJvcCA6IGljb25Qcm9wO1xuICB2YXIgaW5kZXRlcm1pbmF0ZUljb24gPSBpbmRldGVybWluYXRlID8gaW5kZXRlcm1pbmF0ZUljb25Qcm9wIDogY2hlY2tlZEljb247XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2hCYXNlLCBfZXh0ZW5kcyh7XG4gICAgdHlwZTogXCJjaGVja2JveFwiLFxuICAgIGNsYXNzZXM6IHtcbiAgICAgIHJvb3Q6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc2VzW1wiY29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSwgaW5kZXRlcm1pbmF0ZSAmJiBjbGFzc2VzLmluZGV0ZXJtaW5hdGUpLFxuICAgICAgY2hlY2tlZDogY2xhc3Nlcy5jaGVja2VkLFxuICAgICAgZGlzYWJsZWQ6IGNsYXNzZXMuZGlzYWJsZWRcbiAgICB9LFxuICAgIGNvbG9yOiBjb2xvcixcbiAgICBpbnB1dFByb3BzOiBfZXh0ZW5kcyh7XG4gICAgICAnZGF0YS1pbmRldGVybWluYXRlJzogaW5kZXRlcm1pbmF0ZVxuICAgIH0sIGlucHV0UHJvcHMpLFxuICAgIGljb246IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoaWNvbiwge1xuICAgICAgZm9udFNpemU6IGljb24ucHJvcHMuZm9udFNpemUgPT09IHVuZGVmaW5lZCAmJiBzaXplID09PSBcInNtYWxsXCIgPyBzaXplIDogaWNvbi5wcm9wcy5mb250U2l6ZVxuICAgIH0pLFxuICAgIGNoZWNrZWRJY29uOiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGluZGV0ZXJtaW5hdGVJY29uLCB7XG4gICAgICBmb250U2l6ZTogaW5kZXRlcm1pbmF0ZUljb24ucHJvcHMuZm9udFNpemUgPT09IHVuZGVmaW5lZCAmJiBzaXplID09PSBcInNtYWxsXCIgPyBzaXplIDogaW5kZXRlcm1pbmF0ZUljb24ucHJvcHMuZm9udFNpemVcbiAgICB9KSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDaGVja2JveC5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBjb21wb25lbnQgaXMgY2hlY2tlZC5cbiAgICovXG4gIGNoZWNrZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgaWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIGNvbXBvbmVudCBpcyBjaGVja2VkLlxuICAgKi9cbiAgY2hlY2tlZEljb246IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBjaGVja2JveCB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSByaXBwbGUgZWZmZWN0IHdpbGwgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBkaXNhYmxlUmlwcGxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIGljb24gdG8gZGlzcGxheSB3aGVuIHRoZSBjb21wb25lbnQgaXMgdW5jaGVja2VkLlxuICAgKi9cbiAgaWNvbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNvbXBvbmVudCBhcHBlYXJzIGluZGV0ZXJtaW5hdGUuXG4gICAqIFRoaXMgZG9lcyBub3Qgc2V0IHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCB0byBpbmRldGVybWluYXRlIGR1ZVxuICAgKiB0byBpbmNvbnNpc3RlbnQgYmVoYXZpb3IgYWNyb3NzIGJyb3dzZXJzLlxuICAgKiBIb3dldmVyLCB3ZSBzZXQgYSBgZGF0YS1pbmRldGVybWluYXRlYCBhdHRyaWJ1dGUgb24gdGhlIGlucHV0LlxuICAgKi9cbiAgaW5kZXRlcm1pbmF0ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBpY29uIHRvIGRpc3BsYXkgd2hlbiB0aGUgY29tcG9uZW50IGlzIGluZGV0ZXJtaW5hdGUuXG4gICAqL1xuICBpbmRldGVybWluYXRlSWNvbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFtBdHRyaWJ1dGVzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQjQXR0cmlidXRlcykgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaW5wdXRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogUGFzcyBhIHJlZiB0byB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaW5wdXRSZWY6IHJlZlR5cGUsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBUaGUgZXZlbnQgc291cmNlIG9mIHRoZSBjYWxsYmFjay5cbiAgICogWW91IGNhbiBwdWxsIG91dCB0aGUgbmV3IGNoZWNrZWQgc3RhdGUgYnkgYWNjZXNzaW5nIGBldmVudC50YXJnZXQuY2hlY2tlZGAgKGJvb2xlYW4pLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgaW5wdXRgIGVsZW1lbnQgd2lsbCBiZSByZXF1aXJlZC5cbiAgICovXG4gIHJlcXVpcmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGNoZWNrYm94LlxuICAgKiBgc21hbGxgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGRlbnNlIGNoZWNrYm94IHN0eWxpbmcuXG4gICAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoWydtZWRpdW0nLCAnc21hbGwnXSksXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LiBUaGUgRE9NIEFQSSBjYXN0cyB0aGlzIHRvIGEgc3RyaW5nLlxuICAgKiBUaGUgYnJvd3NlciB1c2VzIFwib25cIiBhcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNoZWNrYm94J1xufSkoQ2hlY2tib3gpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgcmVmVHlwZSB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5pbXBvcnQgdXNlQ29udHJvbGxlZCBmcm9tICcuLi91dGlscy91c2VDb250cm9sbGVkJztcbmltcG9ydCB1c2VGb3JtQ29udHJvbCBmcm9tICcuLi9Gb3JtQ29udHJvbC91c2VGb3JtQ29udHJvbCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgSWNvbkJ1dHRvbiBmcm9tICcuLi9JY29uQnV0dG9uJztcbmV4cG9ydCB2YXIgc3R5bGVzID0ge1xuICByb290OiB7XG4gICAgcGFkZGluZzogOVxuICB9LFxuICBjaGVja2VkOiB7fSxcbiAgZGlzYWJsZWQ6IHt9LFxuICBpbnB1dDoge1xuICAgIGN1cnNvcjogJ2luaGVyaXQnLFxuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIG9wYWNpdHk6IDAsXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICB0b3A6IDAsXG4gICAgbGVmdDogMCxcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICB6SW5kZXg6IDFcbiAgfVxufTtcbi8qKlxuICogQGlnbm9yZSAtIGludGVybmFsIGNvbXBvbmVudC5cbiAqL1xuXG52YXIgU3dpdGNoQmFzZSA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFN3aXRjaEJhc2UocHJvcHMsIHJlZikge1xuICB2YXIgYXV0b0ZvY3VzID0gcHJvcHMuYXV0b0ZvY3VzLFxuICAgICAgY2hlY2tlZFByb3AgPSBwcm9wcy5jaGVja2VkLFxuICAgICAgY2hlY2tlZEljb24gPSBwcm9wcy5jaGVja2VkSWNvbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgZGVmYXVsdENoZWNrZWQgPSBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICAgIGRpc2FibGVkUHJvcCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgICBpZCA9IHByb3BzLmlkLFxuICAgICAgaW5wdXRQcm9wcyA9IHByb3BzLmlucHV0UHJvcHMsXG4gICAgICBpbnB1dFJlZiA9IHByb3BzLmlucHV0UmVmLFxuICAgICAgbmFtZSA9IHByb3BzLm5hbWUsXG4gICAgICBvbkJsdXIgPSBwcm9wcy5vbkJsdXIsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgb25Gb2N1cyA9IHByb3BzLm9uRm9jdXMsXG4gICAgICByZWFkT25seSA9IHByb3BzLnJlYWRPbmx5LFxuICAgICAgcmVxdWlyZWQgPSBwcm9wcy5yZXF1aXJlZCxcbiAgICAgIHRhYkluZGV4ID0gcHJvcHMudGFiSW5kZXgsXG4gICAgICB0eXBlID0gcHJvcHMudHlwZSxcbiAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiYXV0b0ZvY3VzXCIsIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRJY29uXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImRlZmF1bHRDaGVja2VkXCIsIFwiZGlzYWJsZWRcIiwgXCJpY29uXCIsIFwiaWRcIiwgXCJpbnB1dFByb3BzXCIsIFwiaW5wdXRSZWZcIiwgXCJuYW1lXCIsIFwib25CbHVyXCIsIFwib25DaGFuZ2VcIiwgXCJvbkZvY3VzXCIsIFwicmVhZE9ubHlcIiwgXCJyZXF1aXJlZFwiLCBcInRhYkluZGV4XCIsIFwidHlwZVwiLCBcInZhbHVlXCJdKTtcblxuICB2YXIgX3VzZUNvbnRyb2xsZWQgPSB1c2VDb250cm9sbGVkKHtcbiAgICBjb250cm9sbGVkOiBjaGVja2VkUHJvcCxcbiAgICBkZWZhdWx0OiBCb29sZWFuKGRlZmF1bHRDaGVja2VkKSxcbiAgICBuYW1lOiAnU3dpdGNoQmFzZScsXG4gICAgc3RhdGU6ICdjaGVja2VkJ1xuICB9KSxcbiAgICAgIF91c2VDb250cm9sbGVkMiA9IF9zbGljZWRUb0FycmF5KF91c2VDb250cm9sbGVkLCAyKSxcbiAgICAgIGNoZWNrZWQgPSBfdXNlQ29udHJvbGxlZDJbMF0sXG4gICAgICBzZXRDaGVja2VkU3RhdGUgPSBfdXNlQ29udHJvbGxlZDJbMV07XG5cbiAgdmFyIG11aUZvcm1Db250cm9sID0gdXNlRm9ybUNvbnRyb2woKTtcblxuICB2YXIgaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICBvbkZvY3VzKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAobXVpRm9ybUNvbnRyb2wgJiYgbXVpRm9ybUNvbnRyb2wub25Gb2N1cykge1xuICAgICAgbXVpRm9ybUNvbnRyb2wub25Gb2N1cyhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVCbHVyID0gZnVuY3Rpb24gaGFuZGxlQmx1cihldmVudCkge1xuICAgIGlmIChvbkJsdXIpIHtcbiAgICAgIG9uQmx1cihldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKG11aUZvcm1Db250cm9sICYmIG11aUZvcm1Db250cm9sLm9uQmx1cikge1xuICAgICAgbXVpRm9ybUNvbnRyb2wub25CbHVyKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUlucHV0Q2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlSW5wdXRDaGFuZ2UoZXZlbnQpIHtcbiAgICB2YXIgbmV3Q2hlY2tlZCA9IGV2ZW50LnRhcmdldC5jaGVja2VkO1xuICAgIHNldENoZWNrZWRTdGF0ZShuZXdDaGVja2VkKTtcblxuICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgLy8gVE9ETyB2NTogcmVtb3ZlIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gICAgICBvbkNoYW5nZShldmVudCwgbmV3Q2hlY2tlZCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBkaXNhYmxlZCA9IGRpc2FibGVkUHJvcDtcblxuICBpZiAobXVpRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAodHlwZW9mIGRpc2FibGVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgZGlzYWJsZWQgPSBtdWlGb3JtQ29udHJvbC5kaXNhYmxlZDtcbiAgICB9XG4gIH1cblxuICB2YXIgaGFzTGFiZWxGb3IgPSB0eXBlID09PSAnY2hlY2tib3gnIHx8IHR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQnV0dG9uLCBfZXh0ZW5kcyh7XG4gICAgY29tcG9uZW50OiBcInNwYW5cIixcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc05hbWUsIGNoZWNrZWQgJiYgY2xhc3Nlcy5jaGVja2VkLCBkaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkKSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgdGFiSW5kZXg6IG51bGwsXG4gICAgcm9sZTogdW5kZWZpbmVkLFxuICAgIG9uRm9jdXM6IGhhbmRsZUZvY3VzLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2V4dGVuZHMoe1xuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWRQcm9wLFxuICAgIGRlZmF1bHRDaGVja2VkOiBkZWZhdWx0Q2hlY2tlZCxcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMuaW5wdXQsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGlkOiBoYXNMYWJlbEZvciAmJiBpZCxcbiAgICBuYW1lOiBuYW1lLFxuICAgIG9uQ2hhbmdlOiBoYW5kbGVJbnB1dENoYW5nZSxcbiAgICByZWFkT25seTogcmVhZE9ubHksXG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICByZXF1aXJlZDogcmVxdWlyZWQsXG4gICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgIHR5cGU6IHR5cGUsXG4gICAgdmFsdWU6IHZhbHVlXG4gIH0sIGlucHV0UHJvcHMpKSwgY2hlY2tlZCA/IGNoZWNrZWRJY29uIDogaWNvbik7XG59KTsgLy8gTkI6IElmIGNoYW5nZWQsIHBsZWFzZSB1cGRhdGUgQ2hlY2tib3gsIFN3aXRjaCBhbmQgUmFkaW9cbi8vIHNvIHRoYXQgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGlzIHVwZGF0ZWQuXG5cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFN3aXRjaEJhc2UucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYGlucHV0YCBlbGVtZW50IHdpbGwgYmUgZm9jdXNlZCBkdXJpbmcgdGhlIGZpcnN0IG1vdW50LlxuICAgKi9cbiAgYXV0b0ZvY3VzOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgY29tcG9uZW50IGlzIGNoZWNrZWQuXG4gICAqL1xuICBjaGVja2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIGljb24gdG8gZGlzcGxheSB3aGVuIHRoZSBjb21wb25lbnQgaXMgY2hlY2tlZC5cbiAgICovXG4gIGNoZWNrZWRJY29uOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBkZWZhdWx0Q2hlY2tlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIHN3aXRjaCB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgaWNvbiB0byBkaXNwbGF5IHdoZW4gdGhlIGNvbXBvbmVudCBpcyB1bmNoZWNrZWQuXG4gICAqL1xuICBpY29uOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBbQXR0cmlidXRlc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0I0F0dHJpYnV0ZXMpIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlucHV0UHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFBhc3MgYSByZWYgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlucHV0UmVmOiByZWZUeXBlLFxuXG4gIC8qXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uQmx1cjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIHN0YXRlIGlzIGNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBUaGUgZXZlbnQgc291cmNlIG9mIHRoZSBjYWxsYmFjay5cbiAgICogWW91IGNhbiBwdWxsIG91dCB0aGUgbmV3IGNoZWNrZWQgc3RhdGUgYnkgYWNjZXNzaW5nIGBldmVudC50YXJnZXQuY2hlY2tlZGAgKGJvb2xlYW4pLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogSXQgcHJldmVudHMgdGhlIHVzZXIgZnJvbSBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkXG4gICAqIChub3QgZnJvbSBpbnRlcmFjdGluZyB3aXRoIHRoZSBmaWVsZCkuXG4gICAqL1xuICByZWFkT25seTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGBpbnB1dGAgZWxlbWVudCB3aWxsIGJlIHJlcXVpcmVkLlxuICAgKi9cbiAgcmVxdWlyZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICB0YWJJbmRleDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgaW5wdXQgY29tcG9uZW50IHByb3AgYHR5cGVgLlxuICAgKi9cbiAgdHlwZTogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMuYW55XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ1ByaXZhdGVTd2l0Y2hCYXNlJ1xufSkoU3dpdGNoQmFzZSk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IEZvcm1Db250cm9sQ29udGV4dCBmcm9tICcuL0Zvcm1Db250cm9sQ29udGV4dCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VGb3JtQ29udHJvbCgpIHtcbiAgcmV0dXJuIFJlYWN0LnVzZUNvbnRleHQoRm9ybUNvbnRyb2xDb250ZXh0KTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgY3JlYXRlU3ZnSWNvbiBmcm9tICcuLi8uLi91dGlscy9jcmVhdGVTdmdJY29uJztcbi8qKlxuICogQGlnbm9yZSAtIGludGVybmFsIGNvbXBvbmVudC5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVTdmdJY29uKCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICBkOiBcIk0xOSA1djE0SDVWNWgxNG0wLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yelwiXG59KSwgJ0NoZWNrQm94T3V0bGluZUJsYW5rJyk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNyZWF0ZVN2Z0ljb24gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlU3ZnSWNvbic7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5elwiXG59KSwgJ0NoZWNrQm94Jyk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNyZWF0ZVN2Z0ljb24gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlU3ZnSWNvbic7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0yIDEwSDd2LTJoMTB2MnpcIlxufSksICdJbmRldGVybWluYXRlQ2hlY2tCb3gnKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgQ2FuY2VsSWNvbiBmcm9tICcuLi9pbnRlcm5hbC9zdmctaWNvbnMvQ2FuY2VsJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCB7IGVtcGhhc2l6ZSwgZmFkZSB9IGZyb20gJy4uL3N0eWxlcy9jb2xvck1hbmlwdWxhdG9yJztcbmltcG9ydCB1c2VGb3JrUmVmIGZyb20gJy4uL3V0aWxzL3VzZUZvcmtSZWYnO1xuaW1wb3J0IHVuc3VwcG9ydGVkUHJvcCBmcm9tICcuLi91dGlscy91bnN1cHBvcnRlZFByb3AnO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHZhciBiYWNrZ3JvdW5kQ29sb3IgPSB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyB0aGVtZS5wYWxldHRlLmdyZXlbMzAwXSA6IHRoZW1lLnBhbGV0dGUuZ3JleVs3MDBdO1xuICB2YXIgZGVsZXRlSWNvbkNvbG9yID0gZmFkZSh0aGVtZS5wYWxldHRlLnRleHQucHJpbWFyeSwgMC4yNik7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBmb250RmFtaWx5OiB0aGVtZS50eXBvZ3JhcGh5LmZvbnRGYW1pbHksXG4gICAgICBmb250U2l6ZTogdGhlbWUudHlwb2dyYXBoeS5weFRvUmVtKDEzKSxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgIGhlaWdodDogMzIsXG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5nZXRDb250cmFzdFRleHQoYmFja2dyb3VuZENvbG9yKSxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgICAgYm9yZGVyUmFkaXVzOiAzMiAvIDIsXG4gICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZShbJ2JhY2tncm91bmQtY29sb3InLCAnYm94LXNoYWRvdyddKSxcbiAgICAgIC8vIGxhYmVsIHdpbGwgaW5oZXJpdCB0aGlzIGZyb20gcm9vdCwgdGhlbiBgY2xpY2thYmxlYCBjbGFzcyBvdmVycmlkZXMgdGhpcyBmb3IgYm90aFxuICAgICAgY3Vyc29yOiAnZGVmYXVsdCcsXG4gICAgICAvLyBXZSBkaXNhYmxlIHRoZSBmb2N1cyByaW5nIGZvciBtb3VzZSwgdG91Y2ggYW5kIGtleWJvYXJkIHVzZXJzLlxuICAgICAgb3V0bGluZTogMCxcbiAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZScsXG4gICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgIC8vIFJlbW92ZSBgYnV0dG9uYCBib3JkZXJcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAvLyBSZW1vdmUgYGJ1dHRvbmAgcGFkZGluZ1xuICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94JyxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBvcGFjaXR5OiAwLjUsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgfSxcbiAgICAgICcmICRhdmF0YXInOiB7XG4gICAgICAgIG1hcmdpbkxlZnQ6IDUsXG4gICAgICAgIG1hcmdpblJpZ2h0OiAtNixcbiAgICAgICAgd2lkdGg6IDI0LFxuICAgICAgICBoZWlnaHQ6IDI0LFxuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50eXBlID09PSAnbGlnaHQnID8gdGhlbWUucGFsZXR0ZS5ncmV5WzcwMF0gOiB0aGVtZS5wYWxldHRlLmdyZXlbMzAwXSxcbiAgICAgICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkucHhUb1JlbSgxMilcbiAgICAgIH0sXG4gICAgICAnJiAkYXZhdGFyQ29sb3JQcmltYXJ5Jzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5LmNvbnRyYXN0VGV4dCxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkuZGFya1xuICAgICAgfSxcbiAgICAgICcmICRhdmF0YXJDb2xvclNlY29uZGFyeSc6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmNvbnRyYXN0VGV4dCxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5kYXJrXG4gICAgICB9LFxuICAgICAgJyYgJGF2YXRhclNtYWxsJzoge1xuICAgICAgICBtYXJnaW5MZWZ0OiA0LFxuICAgICAgICBtYXJnaW5SaWdodDogLTQsXG4gICAgICAgIHdpZHRoOiAxOCxcbiAgICAgICAgaGVpZ2h0OiAxOCxcbiAgICAgICAgZm9udFNpemU6IHRoZW1lLnR5cG9ncmFwaHkucHhUb1JlbSgxMClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgc2l6ZT1cInNtYWxsXCJgLiAqL1xuICAgIHNpemVTbWFsbDoge1xuICAgICAgaGVpZ2h0OiAyNFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cInByaW1hcnlcImAuICovXG4gICAgY29sb3JQcmltYXJ5OiB7XG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluLFxuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5jb250cmFzdFRleHRcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJzZWNvbmRhcnlcImAuICovXG4gICAgY29sb3JTZWNvbmRhcnk6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbixcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5jb250cmFzdFRleHRcbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBvbkNsaWNrYCBpcyBkZWZpbmVkIG9yIGBjbGlja2FibGU9e3RydWV9YC4gKi9cbiAgICBjbGlja2FibGU6IHtcbiAgICAgIHVzZXJTZWxlY3Q6ICdub25lJyxcbiAgICAgIFdlYmtpdFRhcEhpZ2hsaWdodENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAnJjpob3ZlciwgJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlbXBoYXNpemUoYmFja2dyb3VuZENvbG9yLCAwLjA4KVxuICAgICAgfSxcbiAgICAgICcmOmFjdGl2ZSc6IHtcbiAgICAgICAgYm94U2hhZG93OiB0aGVtZS5zaGFkb3dzWzFdXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG9uQ2xpY2tgIGFuZCBgY29sb3I9XCJwcmltYXJ5XCJgIGlzIGRlZmluZWQgb3IgYGNsaWNrYWJsZT17dHJ1ZX1gLiAqL1xuICAgIGNsaWNrYWJsZUNvbG9yUHJpbWFyeToge1xuICAgICAgJyY6aG92ZXIsICY6Zm9jdXMnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogZW1waGFzaXplKHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluLCAwLjA4KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBvbkNsaWNrYCBhbmQgYGNvbG9yPVwic2Vjb25kYXJ5XCJgIGlzIGRlZmluZWQgb3IgYGNsaWNrYWJsZT17dHJ1ZX1gLiAqL1xuICAgIGNsaWNrYWJsZUNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICAnJjpob3ZlciwgJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlbXBoYXNpemUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgMC4wOClcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgb25EZWxldGVgIGlzIGRlZmluZWQuICovXG4gICAgZGVsZXRhYmxlOiB7XG4gICAgICAnJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlbXBoYXNpemUoYmFja2dyb3VuZENvbG9yLCAwLjA4KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBvbkRlbGV0ZWAgYW5kIGBjb2xvcj1cInByaW1hcnlcImAgaXMgZGVmaW5lZC4gKi9cbiAgICBkZWxldGFibGVDb2xvclByaW1hcnk6IHtcbiAgICAgICcmOmZvY3VzJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGVtcGhhc2l6ZSh0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbiwgMC4yKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBvbkRlbGV0ZWAgYW5kIGBjb2xvcj1cInNlY29uZGFyeVwiYCBpcyBkZWZpbmVkLiAqL1xuICAgIGRlbGV0YWJsZUNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICAnJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBlbXBoYXNpemUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgMC4yKVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwib3V0bGluZWRcImAuICovXG4gICAgb3V0bGluZWQ6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgIGJvcmRlcjogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUudHlwZSA9PT0gJ2xpZ2h0JyA/ICdyZ2JhKDAsIDAsIDAsIDAuMjMpJyA6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMjMpJyksXG4gICAgICAnJGNsaWNrYWJsZSY6aG92ZXIsICRjbGlja2FibGUmOmZvY3VzLCAkZGVsZXRhYmxlJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBmYWRlKHRoZW1lLnBhbGV0dGUudGV4dC5wcmltYXJ5LCB0aGVtZS5wYWxldHRlLmFjdGlvbi5ob3Zlck9wYWNpdHkpXG4gICAgICB9LFxuICAgICAgJyYgJGF2YXRhcic6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogNFxuICAgICAgfSxcbiAgICAgICcmICRhdmF0YXJTbWFsbCc6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogMlxuICAgICAgfSxcbiAgICAgICcmICRpY29uJzoge1xuICAgICAgICBtYXJnaW5MZWZ0OiA0XG4gICAgICB9LFxuICAgICAgJyYgJGljb25TbWFsbCc6IHtcbiAgICAgICAgbWFyZ2luTGVmdDogMlxuICAgICAgfSxcbiAgICAgICcmICRkZWxldGVJY29uJzoge1xuICAgICAgICBtYXJnaW5SaWdodDogNVxuICAgICAgfSxcbiAgICAgICcmICRkZWxldGVJY29uU21hbGwnOiB7XG4gICAgICAgIG1hcmdpblJpZ2h0OiAzXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYCBhbmQgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBvdXRsaW5lZFByaW1hcnk6IHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgIGJvcmRlcjogXCIxcHggc29saWQgXCIuY29uY2F0KHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluKSxcbiAgICAgICckY2xpY2thYmxlJjpob3ZlciwgJGNsaWNrYWJsZSY6Zm9jdXMsICRkZWxldGFibGUmOmZvY3VzJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sIHRoZW1lLnBhbGV0dGUuYWN0aW9uLmhvdmVyT3BhY2l0eSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgdmFyaWFudD1cIm91dGxpbmVkXCJgIGFuZCBgY29sb3I9XCJzZWNvbmRhcnlcImAuICovXG4gICAgb3V0bGluZWRTZWNvbmRhcnk6IHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluLFxuICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiksXG4gICAgICAnJGNsaWNrYWJsZSY6aG92ZXIsICRjbGlja2FibGUmOmZvY3VzLCAkZGVsZXRhYmxlJjpmb2N1cyc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBmYWRlKHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5Lm1haW4sIHRoZW1lLnBhbGV0dGUuYWN0aW9uLmhvdmVyT3BhY2l0eSlcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIFRPRE8gdjU6IHJlbW92ZVxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBhdmF0YXJgIGVsZW1lbnQuICovXG4gICAgYXZhdGFyOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgYXZhdGFyYCBlbGVtZW50IGlmIGBzaXplPVwic21hbGxcImAuICovXG4gICAgYXZhdGFyU21hbGw6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBhdmF0YXJgIGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBhdmF0YXJDb2xvclByaW1hcnk6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBhdmF0YXJgIGVsZW1lbnQgaWYgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIGF2YXRhckNvbG9yU2Vjb25kYXJ5OiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaWNvbmAgZWxlbWVudC4gKi9cbiAgICBpY29uOiB7XG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50eXBlID09PSAnbGlnaHQnID8gdGhlbWUucGFsZXR0ZS5ncmV5WzcwMF0gOiB0aGVtZS5wYWxldHRlLmdyZXlbMzAwXSxcbiAgICAgIG1hcmdpbkxlZnQ6IDUsXG4gICAgICBtYXJnaW5SaWdodDogLTZcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpY29uYCBlbGVtZW50IGlmIGBzaXplPVwic21hbGxcImAuICovXG4gICAgaWNvblNtYWxsOiB7XG4gICAgICB3aWR0aDogMTgsXG4gICAgICBoZWlnaHQ6IDE4LFxuICAgICAgbWFyZ2luTGVmdDogNCxcbiAgICAgIG1hcmdpblJpZ2h0OiAtNFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGljb25gIGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYC4gKi9cbiAgICBpY29uQ29sb3JQcmltYXJ5OiB7XG4gICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaWNvbmAgZWxlbWVudCBpZiBgY29sb3I9XCJzZWNvbmRhcnlcImAuICovXG4gICAgaWNvbkNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBsYWJlbCBgc3BhbmAgZWxlbWVudC4gKi9cbiAgICBsYWJlbDoge1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnLFxuICAgICAgcGFkZGluZ0xlZnQ6IDEyLFxuICAgICAgcGFkZGluZ1JpZ2h0OiAxMixcbiAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBsYWJlbCBgc3BhbmAgZWxlbWVudCBpZiBgc2l6ZT1cInNtYWxsXCJgLiAqL1xuICAgIGxhYmVsU21hbGw6IHtcbiAgICAgIHBhZGRpbmdMZWZ0OiA4LFxuICAgICAgcGFkZGluZ1JpZ2h0OiA4XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgZGVsZXRlSWNvbmAgZWxlbWVudC4gKi9cbiAgICBkZWxldGVJY29uOiB7XG4gICAgICBXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgIGNvbG9yOiBkZWxldGVJY29uQ29sb3IsXG4gICAgICBoZWlnaHQ6IDIyLFxuICAgICAgd2lkdGg6IDIyLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICBtYXJnaW46ICcwIDVweCAwIC02cHgnLFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGNvbG9yOiBmYWRlKGRlbGV0ZUljb25Db2xvciwgMC40KVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGRlbGV0ZUljb25gIGVsZW1lbnQgaWYgYHNpemU9XCJzbWFsbFwiYC4gKi9cbiAgICBkZWxldGVJY29uU21hbGw6IHtcbiAgICAgIGhlaWdodDogMTYsXG4gICAgICB3aWR0aDogMTYsXG4gICAgICBtYXJnaW5SaWdodDogNCxcbiAgICAgIG1hcmdpbkxlZnQ6IC00XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBkZWxldGVJY29uIGVsZW1lbnQgaWYgYGNvbG9yPVwicHJpbWFyeVwiYCBhbmQgYHZhcmlhbnQ9XCJkZWZhdWx0XCJgLiAqL1xuICAgIGRlbGV0ZUljb25Db2xvclByaW1hcnk6IHtcbiAgICAgIGNvbG9yOiBmYWRlKHRoZW1lLnBhbGV0dGUucHJpbWFyeS5jb250cmFzdFRleHQsIDAuNyksXG4gICAgICAnJjpob3ZlciwgJjphY3RpdmUnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkuY29udHJhc3RUZXh0XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBkZWxldGVJY29uIGVsZW1lbnQgaWYgYGNvbG9yPVwic2Vjb25kYXJ5XCJgIGFuZCBgdmFyaWFudD1cImRlZmF1bHRcImAuICovXG4gICAgZGVsZXRlSWNvbkNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICBjb2xvcjogZmFkZSh0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5jb250cmFzdFRleHQsIDAuNyksXG4gICAgICAnJjpob3ZlciwgJjphY3RpdmUnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5jb250cmFzdFRleHRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGRlbGV0ZUljb24gZWxlbWVudCBpZiBgY29sb3I9XCJwcmltYXJ5XCJgIGFuZCBgdmFyaWFudD1cIm91dGxpbmVkXCJgLiAqL1xuICAgIGRlbGV0ZUljb25PdXRsaW5lZENvbG9yUHJpbWFyeToge1xuICAgICAgY29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sIDAuNyksXG4gICAgICAnJjpob3ZlciwgJjphY3RpdmUnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpblxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgZGVsZXRlSWNvbiBlbGVtZW50IGlmIGBjb2xvcj1cInNlY29uZGFyeVwiYCBhbmQgYHZhcmlhbnQ9XCJvdXRsaW5lZFwiYC4gKi9cbiAgICBkZWxldGVJY29uT3V0bGluZWRDb2xvclNlY29uZGFyeToge1xuICAgICAgY29sb3I6IGZhZGUodGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbiwgMC43KSxcbiAgICAgICcmOmhvdmVyLCAmOmFjdGl2ZSc6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5Lm1haW5cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuXG5mdW5jdGlvbiBpc0RlbGV0ZUtleWJvYXJkRXZlbnQoa2V5Ym9hcmRFdmVudCkge1xuICByZXR1cm4ga2V5Ym9hcmRFdmVudC5rZXkgPT09ICdCYWNrc3BhY2UnIHx8IGtleWJvYXJkRXZlbnQua2V5ID09PSAnRGVsZXRlJztcbn1cbi8qKlxuICogQ2hpcHMgcmVwcmVzZW50IGNvbXBsZXggZW50aXRpZXMgaW4gc21hbGwgYmxvY2tzLCBzdWNoIGFzIGEgY29udGFjdC5cbiAqL1xuXG5cbnZhciBDaGlwID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2hpcChwcm9wcywgcmVmKSB7XG4gIHZhciBhdmF0YXJQcm9wID0gcHJvcHMuYXZhdGFyLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjbGlja2FibGVQcm9wID0gcHJvcHMuY2xpY2thYmxlLFxuICAgICAgX3Byb3BzJGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBjb2xvciA9IF9wcm9wcyRjb2xvciA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX3Byb3BzJGNvbG9yLFxuICAgICAgQ29tcG9uZW50UHJvcCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIGRlbGV0ZUljb25Qcm9wID0gcHJvcHMuZGVsZXRlSWNvbixcbiAgICAgIF9wcm9wcyRkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZGlzYWJsZWQgPSBfcHJvcHMkZGlzYWJsZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVkLFxuICAgICAgaWNvblByb3AgPSBwcm9wcy5pY29uLFxuICAgICAgbGFiZWwgPSBwcm9wcy5sYWJlbCxcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgICAgb25EZWxldGUgPSBwcm9wcy5vbkRlbGV0ZSxcbiAgICAgIG9uS2V5RG93biA9IHByb3BzLm9uS2V5RG93bixcbiAgICAgIG9uS2V5VXAgPSBwcm9wcy5vbktleVVwLFxuICAgICAgX3Byb3BzJHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnbWVkaXVtJyA6IF9wcm9wcyRzaXplLFxuICAgICAgX3Byb3BzJHZhcmlhbnQgPSBwcm9wcy52YXJpYW50LFxuICAgICAgdmFyaWFudCA9IF9wcm9wcyR2YXJpYW50ID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcHJvcHMkdmFyaWFudCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJhdmF0YXJcIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY2xpY2thYmxlXCIsIFwiY29sb3JcIiwgXCJjb21wb25lbnRcIiwgXCJkZWxldGVJY29uXCIsIFwiZGlzYWJsZWRcIiwgXCJpY29uXCIsIFwibGFiZWxcIiwgXCJvbkNsaWNrXCIsIFwib25EZWxldGVcIiwgXCJvbktleURvd25cIiwgXCJvbktleVVwXCIsIFwic2l6ZVwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHZhciBjaGlwUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgaGFuZGxlUmVmID0gdXNlRm9ya1JlZihjaGlwUmVmLCByZWYpO1xuXG4gIHZhciBoYW5kbGVEZWxldGVJY29uQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVEZWxldGVJY29uQ2xpY2soZXZlbnQpIHtcbiAgICAvLyBTdG9wIHRoZSBldmVudCBmcm9tIGJ1YmJsaW5nIHVwIHRvIHRoZSBgQ2hpcGBcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmIChvbkRlbGV0ZSkge1xuICAgICAgb25EZWxldGUoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICAvLyBJZ25vcmUgZXZlbnRzIGZyb20gY2hpbGRyZW4gb2YgYENoaXBgLlxuICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0ID09PSBldmVudC50YXJnZXQgJiYgaXNEZWxldGVLZXlib2FyZEV2ZW50KGV2ZW50KSkge1xuICAgICAgLy8gd2lsbCBiZSBoYW5kbGVkIGluIGtleVVwLCBvdGhlcndpc2Ugc29tZSBicm93c2Vyc1xuICAgICAgLy8gbWlnaHQgaW5pdCBuYXZpZ2F0aW9uXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChvbktleURvd24pIHtcbiAgICAgIG9uS2V5RG93bihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVLZXlVcCA9IGZ1bmN0aW9uIGhhbmRsZUtleVVwKGV2ZW50KSB7XG4gICAgLy8gSWdub3JlIGV2ZW50cyBmcm9tIGNoaWxkcmVuIG9mIGBDaGlwYC5cbiAgICBpZiAoZXZlbnQuY3VycmVudFRhcmdldCA9PT0gZXZlbnQudGFyZ2V0KSB7XG4gICAgICBpZiAob25EZWxldGUgJiYgaXNEZWxldGVLZXlib2FyZEV2ZW50KGV2ZW50KSkge1xuICAgICAgICBvbkRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScgJiYgY2hpcFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNoaXBSZWYuY3VycmVudC5ibHVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9uS2V5VXApIHtcbiAgICAgIG9uS2V5VXAoZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgY2xpY2thYmxlID0gY2xpY2thYmxlUHJvcCAhPT0gZmFsc2UgJiYgb25DbGljayA/IHRydWUgOiBjbGlja2FibGVQcm9wO1xuICB2YXIgc21hbGwgPSBzaXplID09PSAnc21hbGwnO1xuICB2YXIgQ29tcG9uZW50ID0gQ29tcG9uZW50UHJvcCB8fCAoY2xpY2thYmxlID8gQnV0dG9uQmFzZSA6ICdkaXYnKTtcbiAgdmFyIG1vcmVQcm9wcyA9IENvbXBvbmVudCA9PT0gQnV0dG9uQmFzZSA/IHtcbiAgICBjb21wb25lbnQ6ICdkaXYnXG4gIH0gOiB7fTtcbiAgdmFyIGRlbGV0ZUljb24gPSBudWxsO1xuXG4gIGlmIChvbkRlbGV0ZSkge1xuICAgIHZhciBjdXN0b21DbGFzc2VzID0gY2xzeChjb2xvciAhPT0gJ2RlZmF1bHQnICYmICh2YXJpYW50ID09PSBcImRlZmF1bHRcIiA/IGNsYXNzZXNbXCJkZWxldGVJY29uQ29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSA6IGNsYXNzZXNbXCJkZWxldGVJY29uT3V0bGluZWRDb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGNvbG9yKSldKSwgc21hbGwgJiYgY2xhc3Nlcy5kZWxldGVJY29uU21hbGwpO1xuICAgIGRlbGV0ZUljb24gPSBkZWxldGVJY29uUHJvcCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoZGVsZXRlSWNvblByb3ApID8gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudChkZWxldGVJY29uUHJvcCwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGRlbGV0ZUljb25Qcm9wLnByb3BzLmNsYXNzTmFtZSwgY2xhc3Nlcy5kZWxldGVJY29uLCBjdXN0b21DbGFzc2VzKSxcbiAgICAgIG9uQ2xpY2s6IGhhbmRsZURlbGV0ZUljb25DbGlja1xuICAgIH0pIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2FuY2VsSWNvbiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuZGVsZXRlSWNvbiwgY3VzdG9tQ2xhc3NlcyksXG4gICAgICBvbkNsaWNrOiBoYW5kbGVEZWxldGVJY29uQ2xpY2tcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBhdmF0YXIgPSBudWxsO1xuXG4gIGlmIChhdmF0YXJQcm9wICYmIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChhdmF0YXJQcm9wKSkge1xuICAgIGF2YXRhciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoYXZhdGFyUHJvcCwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuYXZhdGFyLCBhdmF0YXJQcm9wLnByb3BzLmNsYXNzTmFtZSwgc21hbGwgJiYgY2xhc3Nlcy5hdmF0YXJTbWFsbCwgY29sb3IgIT09ICdkZWZhdWx0JyAmJiBjbGFzc2VzW1wiYXZhdGFyQ29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSlcbiAgICB9KTtcbiAgfVxuXG4gIHZhciBpY29uID0gbnVsbDtcblxuICBpZiAoaWNvblByb3AgJiYgLyojX19QVVJFX18qL1JlYWN0LmlzVmFsaWRFbGVtZW50KGljb25Qcm9wKSkge1xuICAgIGljb24gPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGljb25Qcm9wLCB7XG4gICAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5pY29uLCBpY29uUHJvcC5wcm9wcy5jbGFzc05hbWUsIHNtYWxsICYmIGNsYXNzZXMuaWNvblNtYWxsLCBjb2xvciAhPT0gJ2RlZmF1bHQnICYmIGNsYXNzZXNbXCJpY29uQ29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSlcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGF2YXRhciAmJiBpY29uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdNYXRlcmlhbC1VSTogVGhlIENoaXAgY29tcG9uZW50IGNhbiBub3QgaGFuZGxlIHRoZSBhdmF0YXIgJyArICdhbmQgdGhlIGljb24gcHJvcCBhdCB0aGUgc2FtZSB0aW1lLiBQaWNrIG9uZS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgcm9sZTogY2xpY2thYmxlIHx8IG9uRGVsZXRlID8gJ2J1dHRvbicgOiB1bmRlZmluZWQsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBjb2xvciAhPT0gJ2RlZmF1bHQnICYmIFtjbGFzc2VzW1wiY29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXSwgY2xpY2thYmxlICYmIGNsYXNzZXNbXCJjbGlja2FibGVDb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGNvbG9yKSldLCBvbkRlbGV0ZSAmJiBjbGFzc2VzW1wiZGVsZXRhYmxlQ29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZShjb2xvcikpXV0sIHZhcmlhbnQgIT09IFwiZGVmYXVsdFwiICYmIFtjbGFzc2VzLm91dGxpbmVkLCB7XG4gICAgICAncHJpbWFyeSc6IGNsYXNzZXMub3V0bGluZWRQcmltYXJ5LFxuICAgICAgJ3NlY29uZGFyeSc6IGNsYXNzZXMub3V0bGluZWRTZWNvbmRhcnlcbiAgICB9W2NvbG9yXV0sIGRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQsIHNtYWxsICYmIGNsYXNzZXMuc2l6ZVNtYWxsLCBjbGlja2FibGUgJiYgY2xhc3Nlcy5jbGlja2FibGUsIG9uRGVsZXRlICYmIGNsYXNzZXMuZGVsZXRhYmxlKSxcbiAgICBcImFyaWEtZGlzYWJsZWRcIjogZGlzYWJsZWQgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgIHRhYkluZGV4OiBjbGlja2FibGUgfHwgb25EZWxldGUgPyAwIDogdW5kZWZpbmVkLFxuICAgIG9uQ2xpY2s6IG9uQ2xpY2ssXG4gICAgb25LZXlEb3duOiBoYW5kbGVLZXlEb3duLFxuICAgIG9uS2V5VXA6IGhhbmRsZUtleVVwLFxuICAgIHJlZjogaGFuZGxlUmVmXG4gIH0sIG1vcmVQcm9wcywgb3RoZXIpLCBhdmF0YXIgfHwgaWNvbiwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5sYWJlbCwgc21hbGwgJiYgY2xhc3Nlcy5sYWJlbFNtYWxsKVxuICB9LCBsYWJlbCksIGRlbGV0ZUljb24pO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDaGlwLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEF2YXRhciBlbGVtZW50LlxuICAgKi9cbiAgYXZhdGFyOiBQcm9wVHlwZXMuZWxlbWVudCxcblxuICAvKipcbiAgICogVGhpcyBwcm9wIGlzbid0IHN1cHBvcnRlZC5cbiAgICogVXNlIHRoZSBgY29tcG9uZW50YCBwcm9wIGlmIHlvdSBuZWVkIHRvIGNoYW5nZSB0aGUgY2hpbGRyZW4gc3RydWN0dXJlLlxuICAgKi9cbiAgY2hpbGRyZW46IHVuc3VwcG9ydGVkUHJvcCxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNoaXAgd2lsbCBhcHBlYXIgY2xpY2thYmxlLCBhbmQgd2lsbCByYWlzZSB3aGVuIHByZXNzZWQsXG4gICAqIGV2ZW4gaWYgdGhlIG9uQ2xpY2sgcHJvcCBpcyBub3QgZGVmaW5lZC5cbiAgICogSWYgZmFsc2UsIHRoZSBjaGlwIHdpbGwgbm90IGJlIGNsaWNrYWJsZSwgZXZlbiBpZiBvbkNsaWNrIHByb3AgaXMgZGVmaW5lZC5cbiAgICogVGhpcyBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsXG4gICAqIGFsb25nIHdpdGggdGhlIGNvbXBvbmVudCBwcm9wIHRvIGluZGljYXRlIGFuIGFuY2hvciBDaGlwIGlzIGNsaWNrYWJsZS5cbiAgICovXG4gIGNsaWNrYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGljb24gZWxlbWVudC4gU2hvd24gb25seSBpZiBgb25EZWxldGVgIGlzIHNldC5cbiAgICovXG4gIGRlbGV0ZUljb246IFByb3BUeXBlcy5lbGVtZW50LFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBjaGlwIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYSBkaXNhYmxlZCBzdGF0ZS5cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWNvbiBlbGVtZW50LlxuICAgKi9cbiAgaWNvbjogUHJvcFR5cGVzLmVsZW1lbnQsXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBsYWJlbC5cbiAgICovXG4gIGxhYmVsOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZ1bmN0aW9uIGZpcmVkIHdoZW4gdGhlIGRlbGV0ZSBpY29uIGlzIGNsaWNrZWQuXG4gICAqIElmIHNldCwgdGhlIGRlbGV0ZSBpY29uIHdpbGwgYmUgc2hvd24uXG4gICAqL1xuICBvbkRlbGV0ZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uS2V5VXA6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgY2hpcC5cbiAgICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihbJ21lZGl1bScsICdzbWFsbCddKSxcblxuICAvKipcbiAgICogVGhlIHZhcmlhbnQgdG8gdXNlLlxuICAgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLm9uZU9mKFsnZGVmYXVsdCcsICdvdXRsaW5lZCddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlDaGlwJ1xufSkoQ2hpcCk7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNyZWF0ZVN2Z0ljb24gZnJvbSAnLi4vLi4vdXRpbHMvY3JlYXRlU3ZnSWNvbic7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU3ZnSWNvbiggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgZDogXCJNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptNSAxMy41OUwxNS41OSAxNyAxMiAxMy40MSA4LjQxIDE3IDcgMTUuNTkgMTAuNTkgMTIgNyA4LjQxIDguNDEgNyAxMiAxMC41OSAxNS41OSA3IDE3IDguNDEgMTMuNDEgMTIgMTcgMTUuNTl6XCJcbn0pLCAnQ2FuY2VsJyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgY2hhaW5Qcm9wVHlwZXMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvdXRpbHMnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG52YXIgU0laRSA9IDQ0O1xuXG5mdW5jdGlvbiBnZXRSZWxhdGl2ZVZhbHVlKHZhbHVlLCBtaW4sIG1heCkge1xuICByZXR1cm4gKE1hdGgubWluKE1hdGgubWF4KG1pbiwgdmFsdWUpLCBtYXgpIC0gbWluKSAvIChtYXggLSBtaW4pO1xufVxuXG5mdW5jdGlvbiBlYXNlT3V0KHQpIHtcbiAgdCA9IGdldFJlbGF0aXZlVmFsdWUodCwgMCwgMSk7IC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2dyZS8xNjUwMjk0XG5cbiAgdCA9ICh0IC09IDEpICogdCAqIHQgKyAxO1xuICByZXR1cm4gdDtcbn1cblxuZnVuY3Rpb24gZWFzZUluKHQpIHtcbiAgcmV0dXJuIHQgKiB0O1xufVxuXG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgdmFyaWFudD1cInN0YXRpY1wiYC4gKi9cbiAgICBzdGF0aWM6IHtcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgndHJhbnNmb3JtJylcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgdmFyaWFudD1cImluZGV0ZXJtaW5hdGVcImAuICovXG4gICAgaW5kZXRlcm1pbmF0ZToge1xuICAgICAgYW5pbWF0aW9uOiAnJGNpcmN1bGFyLXJvdGF0ZSAxLjRzIGxpbmVhciBpbmZpbml0ZSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJwcmltYXJ5XCJgLiAqL1xuICAgIGNvbG9yUHJpbWFyeToge1xuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIGNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpblxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYHN2Z2AgZWxlbWVudC4gKi9cbiAgICBzdmc6IHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaycgLy8gS2VlcHMgdGhlIHByb2dyZXNzIGNlbnRlcmVkXG5cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBjaXJjbGVgIHN2ZyBwYXRoLiAqL1xuICAgIGNpcmNsZToge1xuICAgICAgc3Ryb2tlOiAnY3VycmVudENvbG9yJyAvLyBVc2UgYnV0dCB0byBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb24sIGJ5IGNoYW5jZSwgaXQncyBhbHJlYWR5IHRoZSBkZWZhdWx0IENTUyB2YWx1ZS5cbiAgICAgIC8vIHN0cm9rZUxpbmVjYXA6ICdidXR0JyxcblxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGNpcmNsZWAgc3ZnIHBhdGggaWYgYHZhcmlhbnQ9XCJzdGF0aWNcImAuICovXG4gICAgY2lyY2xlU3RhdGljOiB7XG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJ3N0cm9rZS1kYXNob2Zmc2V0JylcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBjaXJjbGVgIHN2ZyBwYXRoIGlmIGB2YXJpYW50PVwiaW5kZXRlcm1pbmF0ZVwiYC4gKi9cbiAgICBjaXJjbGVJbmRldGVybWluYXRlOiB7XG4gICAgICBhbmltYXRpb246ICckY2lyY3VsYXItZGFzaCAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlJyxcbiAgICAgIC8vIFNvbWUgZGVmYXVsdCB2YWx1ZSB0aGF0IGxvb2tzIGZpbmUgd2FpdGluZyBmb3IgdGhlIGFuaW1hdGlvbiB0byBraWNrcyBpbi5cbiAgICAgIHN0cm9rZURhc2hhcnJheTogJzgwcHgsIDIwMHB4JyxcbiAgICAgIHN0cm9rZURhc2hvZmZzZXQ6ICcwcHgnIC8vIEFkZCB0aGUgdW5pdCB0byBmaXggYSBFZGdlIDE2IGFuZCBiZWxvdyBidWcuXG5cbiAgICB9LFxuICAgICdAa2V5ZnJhbWVzIGNpcmN1bGFyLXJvdGF0ZSc6IHtcbiAgICAgICcwJSc6IHtcbiAgICAgICAgLy8gRml4IElFIDExIHdvYmJseVxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgNTAlJ1xuICAgICAgfSxcbiAgICAgICcxMDAlJzoge1xuICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoMzYwZGVnKSdcbiAgICAgIH1cbiAgICB9LFxuICAgICdAa2V5ZnJhbWVzIGNpcmN1bGFyLWRhc2gnOiB7XG4gICAgICAnMCUnOiB7XG4gICAgICAgIHN0cm9rZURhc2hhcnJheTogJzFweCwgMjAwcHgnLFxuICAgICAgICBzdHJva2VEYXNob2Zmc2V0OiAnMHB4J1xuICAgICAgfSxcbiAgICAgICc1MCUnOiB7XG4gICAgICAgIHN0cm9rZURhc2hhcnJheTogJzEwMHB4LCAyMDBweCcsXG4gICAgICAgIHN0cm9rZURhc2hvZmZzZXQ6ICctMTVweCdcbiAgICAgIH0sXG4gICAgICAnMTAwJSc6IHtcbiAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiAnMTAwcHgsIDIwMHB4JyxcbiAgICAgICAgc3Ryb2tlRGFzaG9mZnNldDogJy0xMjVweCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBjaXJjbGVgIHN2ZyBwYXRoIGlmIGBkaXNhYmxlU2hyaW5rPXt0cnVlfWAuICovXG4gICAgY2lyY2xlRGlzYWJsZVNocmluazoge1xuICAgICAgYW5pbWF0aW9uOiAnbm9uZSdcbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiAjIyBBUklBXG4gKlxuICogSWYgdGhlIHByb2dyZXNzIGJhciBpcyBkZXNjcmliaW5nIHRoZSBsb2FkaW5nIHByb2dyZXNzIG9mIGEgcGFydGljdWxhciByZWdpb24gb2YgYSBwYWdlLFxuICogeW91IHNob3VsZCB1c2UgYGFyaWEtZGVzY3JpYmVkYnlgIHRvIHBvaW50IHRvIHRoZSBwcm9ncmVzcyBiYXIsIGFuZCBzZXQgdGhlIGBhcmlhLWJ1c3lgXG4gKiBhdHRyaWJ1dGUgdG8gYHRydWVgIG9uIHRoYXQgcmVnaW9uIHVudGlsIGl0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLlxuICovXG5cbnZhciBDaXJjdWxhclByb2dyZXNzID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gQ2lyY3VsYXJQcm9ncmVzcyhwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb2xvciA9IHByb3BzLmNvbG9yLFxuICAgICAgY29sb3IgPSBfcHJvcHMkY29sb3IgPT09IHZvaWQgMCA/ICdwcmltYXJ5JyA6IF9wcm9wcyRjb2xvcixcbiAgICAgIF9wcm9wcyRkaXNhYmxlU2hyaW5rID0gcHJvcHMuZGlzYWJsZVNocmluayxcbiAgICAgIGRpc2FibGVTaHJpbmsgPSBfcHJvcHMkZGlzYWJsZVNocmluayA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVNocmluayxcbiAgICAgIF9wcm9wcyRzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHNpemUgPSBfcHJvcHMkc2l6ZSA9PT0gdm9pZCAwID8gNDAgOiBfcHJvcHMkc2l6ZSxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBfcHJvcHMkdGhpY2tuZXNzID0gcHJvcHMudGhpY2tuZXNzLFxuICAgICAgdGhpY2tuZXNzID0gX3Byb3BzJHRoaWNrbmVzcyA9PT0gdm9pZCAwID8gMy42IDogX3Byb3BzJHRoaWNrbmVzcyxcbiAgICAgIF9wcm9wcyR2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgdmFsdWUgPSBfcHJvcHMkdmFsdWUgPT09IHZvaWQgMCA/IDAgOiBfcHJvcHMkdmFsdWUsXG4gICAgICBfcHJvcHMkdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICB2YXJpYW50ID0gX3Byb3BzJHZhcmlhbnQgPT09IHZvaWQgMCA/ICdpbmRldGVybWluYXRlJyA6IF9wcm9wcyR2YXJpYW50LFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImRpc2FibGVTaHJpbmtcIiwgXCJzaXplXCIsIFwic3R5bGVcIiwgXCJ0aGlja25lc3NcIiwgXCJ2YWx1ZVwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHZhciBjaXJjbGVTdHlsZSA9IHt9O1xuICB2YXIgcm9vdFN0eWxlID0ge307XG4gIHZhciByb290UHJvcHMgPSB7fTtcblxuICBpZiAodmFyaWFudCA9PT0gJ2RldGVybWluYXRlJyB8fCB2YXJpYW50ID09PSAnc3RhdGljJykge1xuICAgIHZhciBjaXJjdW1mZXJlbmNlID0gMiAqIE1hdGguUEkgKiAoKFNJWkUgLSB0aGlja25lc3MpIC8gMik7XG4gICAgY2lyY2xlU3R5bGUuc3Ryb2tlRGFzaGFycmF5ID0gY2lyY3VtZmVyZW5jZS50b0ZpeGVkKDMpO1xuICAgIHJvb3RQcm9wc1snYXJpYS12YWx1ZW5vdyddID0gTWF0aC5yb3VuZCh2YWx1ZSk7XG5cbiAgICBpZiAodmFyaWFudCA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIGNpcmNsZVN0eWxlLnN0cm9rZURhc2hvZmZzZXQgPSBcIlwiLmNvbmNhdCgoKDEwMCAtIHZhbHVlKSAvIDEwMCAqIGNpcmN1bWZlcmVuY2UpLnRvRml4ZWQoMyksIFwicHhcIik7XG4gICAgICByb290U3R5bGUudHJhbnNmb3JtID0gJ3JvdGF0ZSgtOTBkZWcpJztcbiAgICB9IGVsc2Uge1xuICAgICAgY2lyY2xlU3R5bGUuc3Ryb2tlRGFzaG9mZnNldCA9IFwiXCIuY29uY2F0KChlYXNlSW4oKDEwMCAtIHZhbHVlKSAvIDEwMCkgKiBjaXJjdW1mZXJlbmNlKS50b0ZpeGVkKDMpLCBcInB4XCIpO1xuICAgICAgcm9vdFN0eWxlLnRyYW5zZm9ybSA9IFwicm90YXRlKFwiLmNvbmNhdCgoZWFzZU91dCh2YWx1ZSAvIDcwKSAqIDI3MCkudG9GaXhlZCgzKSwgXCJkZWcpXCIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBjb2xvciAhPT0gJ2luaGVyaXQnICYmIGNsYXNzZXNbXCJjb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGNvbG9yKSldLCB7XG4gICAgICAnaW5kZXRlcm1pbmF0ZSc6IGNsYXNzZXMuaW5kZXRlcm1pbmF0ZSxcbiAgICAgICdzdGF0aWMnOiBjbGFzc2VzLnN0YXRpY1xuICAgIH1bdmFyaWFudF0pLFxuICAgIHN0eWxlOiBfZXh0ZW5kcyh7XG4gICAgICB3aWR0aDogc2l6ZSxcbiAgICAgIGhlaWdodDogc2l6ZVxuICAgIH0sIHJvb3RTdHlsZSwgc3R5bGUpLFxuICAgIHJlZjogcmVmLFxuICAgIHJvbGU6IFwicHJvZ3Jlc3NiYXJcIlxuICB9LCByb290UHJvcHMsIG90aGVyKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlcy5zdmcsXG4gICAgdmlld0JveDogXCJcIi5jb25jYXQoU0laRSAvIDIsIFwiIFwiKS5jb25jYXQoU0laRSAvIDIsIFwiIFwiKS5jb25jYXQoU0laRSwgXCIgXCIpLmNvbmNhdChTSVpFKVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuY2lyY2xlLCBkaXNhYmxlU2hyaW5rICYmIGNsYXNzZXMuY2lyY2xlRGlzYWJsZVNocmluaywge1xuICAgICAgJ2luZGV0ZXJtaW5hdGUnOiBjbGFzc2VzLmNpcmNsZUluZGV0ZXJtaW5hdGUsXG4gICAgICAnc3RhdGljJzogY2xhc3Nlcy5jaXJjbGVTdGF0aWNcbiAgICB9W3ZhcmlhbnRdKSxcbiAgICBzdHlsZTogY2lyY2xlU3R5bGUsXG4gICAgY3g6IFNJWkUsXG4gICAgY3k6IFNJWkUsXG4gICAgcjogKFNJWkUgLSB0aGlja25lc3MpIC8gMixcbiAgICBmaWxsOiBcIm5vbmVcIixcbiAgICBzdHJva2VXaWR0aDogdGhpY2tuZXNzXG4gIH0pKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENpcmN1bGFyUHJvZ3Jlc3MucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydpbmhlcml0JywgJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBzaHJpbmsgYW5pbWF0aW9uIGlzIGRpc2FibGVkLlxuICAgKiBUaGlzIG9ubHkgd29ya3MgaWYgdmFyaWFudCBpcyBgaW5kZXRlcm1pbmF0ZWAuXG4gICAqL1xuICBkaXNhYmxlU2hyaW5rOiBjaGFpblByb3BUeXBlcyhQcm9wVHlwZXMuYm9vbCwgZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmRpc2FibGVTaHJpbmsgJiYgcHJvcHMudmFyaWFudCAmJiBwcm9wcy52YXJpYW50ICE9PSAnaW5kZXRlcm1pbmF0ZScpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ01hdGVyaWFsLVVJOiBZb3UgaGF2ZSBwcm92aWRlZCB0aGUgYGRpc2FibGVTaHJpbmtgIHByb3AgJyArICd3aXRoIGEgdmFyaWFudCBvdGhlciB0aGFuIGBpbmRldGVybWluYXRlYC4gVGhpcyB3aWxsIGhhdmUgbm8gZWZmZWN0LicpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9KSxcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGNpcmNsZS5cbiAgICogSWYgdXNpbmcgYSBudW1iZXIsIHRoZSBwaXhlbCB1bml0IGlzIGFzc3VtZWQuXG4gICAqIElmIHVzaW5nIGEgc3RyaW5nLCB5b3UgbmVlZCB0byBwcm92aWRlIHRoZSBDU1MgdW5pdCwgZS5nICczcmVtJy5cbiAgICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc3R5bGU6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFRoZSB0aGlja25lc3Mgb2YgdGhlIGNpcmNsZS5cbiAgICovXG4gIHRoaWNrbmVzczogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBwcm9ncmVzcyBpbmRpY2F0b3IgZm9yIHRoZSBkZXRlcm1pbmF0ZSBhbmQgc3RhdGljIHZhcmlhbnRzLlxuICAgKiBWYWx1ZSBiZXR3ZWVuIDAgYW5kIDEwMC5cbiAgICovXG4gIHZhbHVlOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFyaWFudCB0byB1c2UuXG4gICAqIFVzZSBpbmRldGVybWluYXRlIHdoZW4gdGhlcmUgaXMgbm8gcHJvZ3Jlc3MgdmFsdWUuXG4gICAqL1xuICB2YXJpYW50OiBQcm9wVHlwZXMub25lT2YoWydkZXRlcm1pbmF0ZScsICdpbmRldGVybWluYXRlJywgJ3N0YXRpYyddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlDaXJjdWxhclByb2dyZXNzJyxcbiAgZmxpcDogZmFsc2Vcbn0pKENpcmN1bGFyUHJvZ3Jlc3MpOyIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IG93bmVyRG9jdW1lbnQgZnJvbSAnLi4vdXRpbHMvb3duZXJEb2N1bWVudCc7XG5pbXBvcnQgdXNlRm9ya1JlZiBmcm9tICcuLi91dGlscy91c2VGb3JrUmVmJztcbmltcG9ydCB1c2VFdmVudENhbGxiYWNrIGZyb20gJy4uL3V0aWxzL3VzZUV2ZW50Q2FsbGJhY2snO1xuaW1wb3J0IHsgZWxlbWVudEFjY2VwdGluZ1JlZiwgZXhhY3RQcm9wIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcblxuZnVuY3Rpb24gbWFwRXZlbnRQcm9wVG9FdmVudChldmVudFByb3ApIHtcbiAgcmV0dXJuIGV2ZW50UHJvcC5zdWJzdHJpbmcoMikudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gY2xpY2tlZFJvb3RTY3JvbGxiYXIoZXZlbnQpIHtcbiAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCA8IGV2ZW50LmNsaWVudFggfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCA8IGV2ZW50LmNsaWVudFk7XG59XG4vKipcbiAqIExpc3RlbiBmb3IgY2xpY2sgZXZlbnRzIHRoYXQgb2NjdXIgc29tZXdoZXJlIGluIHRoZSBkb2N1bWVudCwgb3V0c2lkZSBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gKiBGb3IgaW5zdGFuY2UsIGlmIHlvdSBuZWVkIHRvIGhpZGUgYSBtZW51IHdoZW4gcGVvcGxlIGNsaWNrIGFueXdoZXJlIGVsc2Ugb24geW91ciBwYWdlLlxuICovXG5cblxuZnVuY3Rpb24gQ2xpY2tBd2F5TGlzdGVuZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBfcHJvcHMkZGlzYWJsZVJlYWN0VHIgPSBwcm9wcy5kaXNhYmxlUmVhY3RUcmVlLFxuICAgICAgZGlzYWJsZVJlYWN0VHJlZSA9IF9wcm9wcyRkaXNhYmxlUmVhY3RUciA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVJlYWN0VHIsXG4gICAgICBfcHJvcHMkbW91c2VFdmVudCA9IHByb3BzLm1vdXNlRXZlbnQsXG4gICAgICBtb3VzZUV2ZW50ID0gX3Byb3BzJG1vdXNlRXZlbnQgPT09IHZvaWQgMCA/ICdvbkNsaWNrJyA6IF9wcm9wcyRtb3VzZUV2ZW50LFxuICAgICAgb25DbGlja0F3YXkgPSBwcm9wcy5vbkNsaWNrQXdheSxcbiAgICAgIF9wcm9wcyR0b3VjaEV2ZW50ID0gcHJvcHMudG91Y2hFdmVudCxcbiAgICAgIHRvdWNoRXZlbnQgPSBfcHJvcHMkdG91Y2hFdmVudCA9PT0gdm9pZCAwID8gJ29uVG91Y2hFbmQnIDogX3Byb3BzJHRvdWNoRXZlbnQ7XG4gIHZhciBtb3ZlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBub2RlUmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICB2YXIgbW91bnRlZFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHZhciBzeW50aGV0aWNFdmVudFJlZiA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgbW91bnRlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgbW91bnRlZFJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgfTtcbiAgfSwgW10pOyAvLyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHdlIGRyb3Agc3VwcG9ydCBmb3Igbm9uIHJlZiBmb3J3YXJkaW5nIGNsYXNzIGNvbXBvbmVudHNcblxuICB2YXIgaGFuZGxlT3duUmVmID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgLy8gI1N0cmljdE1vZGUgcmVhZHlcbiAgICBub2RlUmVmLmN1cnJlbnQgPSBSZWFjdERPTS5maW5kRE9NTm9kZShpbnN0YW5jZSk7XG4gIH0sIFtdKTtcbiAgdmFyIGhhbmRsZVJlZiA9IHVzZUZvcmtSZWYoY2hpbGRyZW4ucmVmLCBoYW5kbGVPd25SZWYpOyAvLyBUaGUgaGFuZGxlciBkb2Vzbid0IHRha2UgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCBpbnRvIGFjY291bnQ6XG4gIC8vXG4gIC8vIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgaXMgbWVhbnQgdG8gc3RvcCBkZWZhdWx0IGJlaGF2aW91cnMgbGlrZVxuICAvLyBjbGlja2luZyBhIGNoZWNrYm94IHRvIGNoZWNrIGl0LCBoaXR0aW5nIGEgYnV0dG9uIHRvIHN1Ym1pdCBhIGZvcm0sXG4gIC8vIGFuZCBoaXR0aW5nIGxlZnQgYXJyb3cgdG8gbW92ZSB0aGUgY3Vyc29yIGluIGEgdGV4dCBpbnB1dCBldGMuXG4gIC8vIE9ubHkgc3BlY2lhbCBIVE1MIGVsZW1lbnRzIGhhdmUgdGhlc2UgZGVmYXVsdCBiZWhhdmlvcnMuXG5cbiAgdmFyIGhhbmRsZUNsaWNrQXdheSA9IHVzZUV2ZW50Q2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gR2l2ZW4gZGV2ZWxvcGVycyBjYW4gc3RvcCB0aGUgcHJvcGFnYXRpb24gb2YgdGhlIHN5bnRoZXRpYyBldmVudCxcbiAgICAvLyB3ZSBjYW4gb25seSBiZSBjb25maWRlbnQgd2l0aCBhIHBvc2l0aXZlIHZhbHVlLlxuICAgIHZhciBpbnNpZGVSZWFjdFRyZWUgPSBzeW50aGV0aWNFdmVudFJlZi5jdXJyZW50O1xuICAgIHN5bnRoZXRpY0V2ZW50UmVmLmN1cnJlbnQgPSBmYWxzZTsgLy8gMS4gSUUgMTEgc3VwcG9ydCwgd2hpY2ggdHJpZ2dlciB0aGUgaGFuZGxlQ2xpY2tBd2F5IGV2ZW4gYWZ0ZXIgdGhlIHVuYmluZFxuICAgIC8vIDIuIFRoZSBjaGlsZCBtaWdodCByZW5kZXIgbnVsbC5cbiAgICAvLyAzLiBCZWhhdmUgbGlrZSBhIGJsdXIgbGlzdGVuZXIuXG5cbiAgICBpZiAoIW1vdW50ZWRSZWYuY3VycmVudCB8fCAhbm9kZVJlZi5jdXJyZW50IHx8IGNsaWNrZWRSb290U2Nyb2xsYmFyKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRG8gbm90IGFjdCBpZiB1c2VyIHBlcmZvcm1lZCB0b3VjaG1vdmVcblxuXG4gICAgaWYgKG1vdmVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIG1vdmVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5zaWRlRE9NOyAvLyBJZiBub3QgZW5vdWdoLCBjYW4gdXNlIGh0dHBzOi8vZ2l0aHViLmNvbS9EaWV0ZXJIb2x2b2V0L2V2ZW50LXByb3BhZ2F0aW9uLXBhdGgvYmxvYi9tYXN0ZXIvcHJvcGFnYXRpb25QYXRoLmpzXG5cbiAgICBpZiAoZXZlbnQuY29tcG9zZWRQYXRoKSB7XG4gICAgICBpbnNpZGVET00gPSBldmVudC5jb21wb3NlZFBhdGgoKS5pbmRleE9mKG5vZGVSZWYuY3VycmVudCkgPiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyB2NiByZW1vdmUgZGVhZCBsb2dpYyBodHRwczovL2Nhbml1c2UuY29tLyNzZWFyY2g9Y29tcG9zZWRQYXRoLlxuICAgICAgdmFyIGRvYyA9IG93bmVyRG9jdW1lbnQobm9kZVJlZi5jdXJyZW50KTtcbiAgICAgIGluc2lkZURPTSA9ICFkb2MuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkgfHwgbm9kZVJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnNpZGVET00gJiYgKGRpc2FibGVSZWFjdFRyZWUgfHwgIWluc2lkZVJlYWN0VHJlZSkpIHtcbiAgICAgIG9uQ2xpY2tBd2F5KGV2ZW50KTtcbiAgICB9XG4gIH0pOyAvLyBLZWVwIHRyYWNrIG9mIG1vdXNlL3RvdWNoIGV2ZW50cyB0aGF0IGJ1YmJsZWQgdXAgdGhyb3VnaCB0aGUgcG9ydGFsLlxuXG4gIHZhciBjcmVhdGVIYW5kbGVTeW50aGV0aWMgPSBmdW5jdGlvbiBjcmVhdGVIYW5kbGVTeW50aGV0aWMoaGFuZGxlck5hbWUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBzeW50aGV0aWNFdmVudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIHZhciBjaGlsZHJlblByb3BzSGFuZGxlciA9IGNoaWxkcmVuLnByb3BzW2hhbmRsZXJOYW1lXTtcblxuICAgICAgaWYgKGNoaWxkcmVuUHJvcHNIYW5kbGVyKSB7XG4gICAgICAgIGNoaWxkcmVuUHJvcHNIYW5kbGVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIHZhciBjaGlsZHJlblByb3BzID0ge1xuICAgIHJlZjogaGFuZGxlUmVmXG4gIH07XG5cbiAgaWYgKHRvdWNoRXZlbnQgIT09IGZhbHNlKSB7XG4gICAgY2hpbGRyZW5Qcm9wc1t0b3VjaEV2ZW50XSA9IGNyZWF0ZUhhbmRsZVN5bnRoZXRpYyh0b3VjaEV2ZW50KTtcbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRvdWNoRXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB2YXIgbWFwcGVkVG91Y2hFdmVudCA9IG1hcEV2ZW50UHJvcFRvRXZlbnQodG91Y2hFdmVudCk7XG4gICAgICB2YXIgZG9jID0gb3duZXJEb2N1bWVudChub2RlUmVmLmN1cnJlbnQpO1xuXG4gICAgICB2YXIgaGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3ZlKCkge1xuICAgICAgICBtb3ZlZFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKG1hcHBlZFRvdWNoRXZlbnQsIGhhbmRsZUNsaWNrQXdheSk7XG4gICAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKG1hcHBlZFRvdWNoRXZlbnQsIGhhbmRsZUNsaWNrQXdheSk7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LCBbaGFuZGxlQ2xpY2tBd2F5LCB0b3VjaEV2ZW50XSk7XG5cbiAgaWYgKG1vdXNlRXZlbnQgIT09IGZhbHNlKSB7XG4gICAgY2hpbGRyZW5Qcm9wc1ttb3VzZUV2ZW50XSA9IGNyZWF0ZUhhbmRsZVN5bnRoZXRpYyhtb3VzZUV2ZW50KTtcbiAgfVxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG1vdXNlRXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB2YXIgbWFwcGVkTW91c2VFdmVudCA9IG1hcEV2ZW50UHJvcFRvRXZlbnQobW91c2VFdmVudCk7XG4gICAgICB2YXIgZG9jID0gb3duZXJEb2N1bWVudChub2RlUmVmLmN1cnJlbnQpO1xuICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIobWFwcGVkTW91c2VFdmVudCwgaGFuZGxlQ2xpY2tBd2F5KTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKG1hcHBlZE1vdXNlRXZlbnQsIGhhbmRsZUNsaWNrQXdheSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sIFtoYW5kbGVDbGlja0F3YXksIG1vdXNlRXZlbnRdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCBjaGlsZHJlblByb3BzKSk7XG59XG5cbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IENsaWNrQXdheUxpc3RlbmVyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSB3cmFwcGVkIGVsZW1lbnQuXG4gICAqL1xuICBjaGlsZHJlbjogZWxlbWVudEFjY2VwdGluZ1JlZi5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBSZWFjdCB0cmVlIGlzIGlnbm9yZWQgYW5kIG9ubHkgdGhlIERPTSB0cmVlIGlzIGNvbnNpZGVyZWQuXG4gICAqIFRoaXMgcHJvcCBjaGFuZ2VzIGhvdyBwb3J0YWxlZCBlbGVtZW50cyBhcmUgaGFuZGxlZC5cbiAgICovXG4gIGRpc2FibGVSZWFjdFRyZWU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgbW91c2UgZXZlbnQgdG8gbGlzdGVuIHRvLiBZb3UgY2FuIGRpc2FibGUgdGhlIGxpc3RlbmVyIGJ5IHByb3ZpZGluZyBgZmFsc2VgLlxuICAgKi9cbiAgbW91c2VFdmVudDogUHJvcFR5cGVzLm9uZU9mKFsnb25DbGljaycsICdvbk1vdXNlRG93bicsICdvbk1vdXNlVXAnLCBmYWxzZV0pLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCB3aGVuIGEgXCJjbGljayBhd2F5XCIgZXZlbnQgaXMgZGV0ZWN0ZWQuXG4gICAqL1xuICBvbkNsaWNrQXdheTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogVGhlIHRvdWNoIGV2ZW50IHRvIGxpc3RlbiB0by4gWW91IGNhbiBkaXNhYmxlIHRoZSBsaXN0ZW5lciBieSBwcm92aWRpbmcgYGZhbHNlYC5cbiAgICovXG4gIHRvdWNoRXZlbnQ6IFByb3BUeXBlcy5vbmVPZihbJ29uVG91Y2hFbmQnLCAnb25Ub3VjaFN0YXJ0JywgZmFsc2VdKVxufSA6IHZvaWQgMDtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIENsaWNrQXdheUxpc3RlbmVyWydwcm9wVHlwZXMnICsgJyddID0gZXhhY3RQcm9wKENsaWNrQXdheUxpc3RlbmVyLnByb3BUeXBlcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENsaWNrQXdheUxpc3RlbmVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICcuLi91dGlscy9jYXBpdGFsaXplJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiBfZGVmaW5lUHJvcGVydHkoe1xuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIG1hcmdpbkxlZnQ6ICdhdXRvJyxcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgbWFyZ2luUmlnaHQ6ICdhdXRvJyxcbiAgICAgIHBhZGRpbmdMZWZ0OiB0aGVtZS5zcGFjaW5nKDIpLFxuICAgICAgcGFkZGluZ1JpZ2h0OiB0aGVtZS5zcGFjaW5nKDIpLFxuICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgIH0sIHRoZW1lLmJyZWFrcG9pbnRzLnVwKCdzbScpLCB7XG4gICAgICBwYWRkaW5nTGVmdDogdGhlbWUuc3BhY2luZygzKSxcbiAgICAgIHBhZGRpbmdSaWdodDogdGhlbWUuc3BhY2luZygzKVxuICAgIH0pLFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZUd1dHRlcnM9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlR3V0dGVyczoge1xuICAgICAgcGFkZGluZ0xlZnQ6IDAsXG4gICAgICBwYWRkaW5nUmlnaHQ6IDBcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZml4ZWQ9e3RydWV9YC4gKi9cbiAgICBmaXhlZDogT2JqZWN0LmtleXModGhlbWUuYnJlYWtwb2ludHMudmFsdWVzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgYnJlYWtwb2ludCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhlbWUuYnJlYWtwb2ludHMudmFsdWVzW2JyZWFrcG9pbnRdO1xuXG4gICAgICBpZiAodmFsdWUgIT09IDApIHtcbiAgICAgICAgYWNjW3RoZW1lLmJyZWFrcG9pbnRzLnVwKGJyZWFrcG9pbnQpXSA9IHtcbiAgICAgICAgICBtYXhXaWR0aDogdmFsdWVcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSksXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBtYXhXaWR0aD1cInhzXCJgLiAqL1xuICAgIG1heFdpZHRoWHM6IF9kZWZpbmVQcm9wZXJ0eSh7fSwgdGhlbWUuYnJlYWtwb2ludHMudXAoJ3hzJyksIHtcbiAgICAgIG1heFdpZHRoOiBNYXRoLm1heCh0aGVtZS5icmVha3BvaW50cy52YWx1ZXMueHMsIDQ0NClcbiAgICB9KSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG1heFdpZHRoPVwic21cImAuICovXG4gICAgbWF4V2lkdGhTbTogX2RlZmluZVByb3BlcnR5KHt9LCB0aGVtZS5icmVha3BvaW50cy51cCgnc20nKSwge1xuICAgICAgbWF4V2lkdGg6IHRoZW1lLmJyZWFrcG9pbnRzLnZhbHVlcy5zbVxuICAgIH0pLFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbWF4V2lkdGg9XCJtZFwiYC4gKi9cbiAgICBtYXhXaWR0aE1kOiBfZGVmaW5lUHJvcGVydHkoe30sIHRoZW1lLmJyZWFrcG9pbnRzLnVwKCdtZCcpLCB7XG4gICAgICBtYXhXaWR0aDogdGhlbWUuYnJlYWtwb2ludHMudmFsdWVzLm1kXG4gICAgfSksXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBtYXhXaWR0aD1cImxnXCJgLiAqL1xuICAgIG1heFdpZHRoTGc6IF9kZWZpbmVQcm9wZXJ0eSh7fSwgdGhlbWUuYnJlYWtwb2ludHMudXAoJ2xnJyksIHtcbiAgICAgIG1heFdpZHRoOiB0aGVtZS5icmVha3BvaW50cy52YWx1ZXMubGdcbiAgICB9KSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG1heFdpZHRoPVwieGxcImAuICovXG4gICAgbWF4V2lkdGhYbDogX2RlZmluZVByb3BlcnR5KHt9LCB0aGVtZS5icmVha3BvaW50cy51cCgneGwnKSwge1xuICAgICAgbWF4V2lkdGg6IHRoZW1lLmJyZWFrcG9pbnRzLnZhbHVlcy54bFxuICAgIH0pXG4gIH07XG59O1xudmFyIENvbnRhaW5lciA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIENvbnRhaW5lcihwcm9wcywgcmVmKSB7XG4gIHZhciBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnZGl2JyA6IF9wcm9wcyRjb21wb25lbnQsXG4gICAgICBfcHJvcHMkZGlzYWJsZUd1dHRlcnMgPSBwcm9wcy5kaXNhYmxlR3V0dGVycyxcbiAgICAgIGRpc2FibGVHdXR0ZXJzID0gX3Byb3BzJGRpc2FibGVHdXR0ZXJzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRkaXNhYmxlR3V0dGVycyxcbiAgICAgIF9wcm9wcyRmaXhlZCA9IHByb3BzLmZpeGVkLFxuICAgICAgZml4ZWQgPSBfcHJvcHMkZml4ZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGZpeGVkLFxuICAgICAgX3Byb3BzJG1heFdpZHRoID0gcHJvcHMubWF4V2lkdGgsXG4gICAgICBtYXhXaWR0aCA9IF9wcm9wcyRtYXhXaWR0aCA9PT0gdm9pZCAwID8gJ2xnJyA6IF9wcm9wcyRtYXhXaWR0aCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29tcG9uZW50XCIsIFwiZGlzYWJsZUd1dHRlcnNcIiwgXCJmaXhlZFwiLCBcIm1heFdpZHRoXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBmaXhlZCAmJiBjbGFzc2VzLmZpeGVkLCBkaXNhYmxlR3V0dGVycyAmJiBjbGFzc2VzLmRpc2FibGVHdXR0ZXJzLCBtYXhXaWR0aCAhPT0gZmFsc2UgJiYgY2xhc3Nlc1tcIm1heFdpZHRoXCIuY29uY2F0KGNhcGl0YWxpemUoU3RyaW5nKG1heFdpZHRoKSkpXSksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gQ29udGFpbmVyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXNcbiAgLyogQHR5cGVzY3JpcHQtdG8tcHJvcHR5cGVzLWlnbm9yZSAqL1xuICAubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCB1c2VkIGZvciB0aGUgcm9vdCBub2RlLlxuICAgKiBFaXRoZXIgYSBzdHJpbmcgdG8gdXNlIGEgSFRNTCBlbGVtZW50IG9yIGEgY29tcG9uZW50LlxuICAgKi9cbiAgY29tcG9uZW50OiBQcm9wVHlwZXNcbiAgLyogQHR5cGVzY3JpcHQtdG8tcHJvcHR5cGVzLWlnbm9yZSAqL1xuICAuZWxlbWVudFR5cGUsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGRpc2FibGVHdXR0ZXJzOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogU2V0IHRoZSBtYXgtd2lkdGggdG8gbWF0Y2ggdGhlIG1pbi13aWR0aCBvZiB0aGUgY3VycmVudCBicmVha3BvaW50LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UnZCBwcmVmZXIgdG8gZGVzaWduIGZvciBhIGZpeGVkIHNldCBvZiBzaXplc1xuICAgKiBpbnN0ZWFkIG9mIHRyeWluZyB0byBhY2NvbW1vZGF0ZSBhIGZ1bGx5IGZsdWlkIHZpZXdwb3J0LlxuICAgKiBJdCdzIGZsdWlkIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBmaXhlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgbWF4LXdpZHRoIG9mIHRoZSBjb250YWluZXIuXG4gICAqIFRoZSBjb250YWluZXIgd2lkdGggZ3Jvd3Mgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgc2NyZWVuLlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGBtYXhXaWR0aGAuXG4gICAqL1xuICBtYXhXaWR0aDogUHJvcFR5cGVzLm9uZU9mKFsnbGcnLCAnbWQnLCAnc20nLCAneGwnLCAneHMnLCBmYWxzZV0pXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUNvbnRhaW5lcidcbn0pKENvbnRhaW5lcik7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IHsgZXhhY3RQcm9wIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmV4cG9ydCB2YXIgaHRtbCA9IHtcbiAgV2Via2l0Rm9udFNtb290aGluZzogJ2FudGlhbGlhc2VkJyxcbiAgLy8gQW50aWFsaWFzaW5nLlxuICBNb3pPc3hGb250U21vb3RoaW5nOiAnZ3JheXNjYWxlJyxcbiAgLy8gQW50aWFsaWFzaW5nLlxuICAvLyBDaGFuZ2UgZnJvbSBgYm94LXNpemluZzogY29udGVudC1ib3hgIHNvIHRoYXQgYHdpZHRoYFxuICAvLyBpcyBub3QgYWZmZWN0ZWQgYnkgYHBhZGRpbmdgIG9yIGBib3JkZXJgLlxuICBib3hTaXppbmc6ICdib3JkZXItYm94J1xufTtcbmV4cG9ydCB2YXIgYm9keSA9IGZ1bmN0aW9uIGJvZHkodGhlbWUpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHtcbiAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LnByaW1hcnlcbiAgfSwgdGhlbWUudHlwb2dyYXBoeS5ib2R5Miwge1xuICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5iYWNrZ3JvdW5kLmRlZmF1bHQsXG4gICAgJ0BtZWRpYSBwcmludCc6IHtcbiAgICAgIC8vIFNhdmUgcHJpbnRlciBpbmsuXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuY29tbW9uLndoaXRlXG4gICAgfVxuICB9KTtcbn07XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgICdAZ2xvYmFsJzoge1xuICAgICAgaHRtbDogaHRtbCxcbiAgICAgICcqLCAqOjpiZWZvcmUsICo6OmFmdGVyJzoge1xuICAgICAgICBib3hTaXppbmc6ICdpbmhlcml0J1xuICAgICAgfSxcbiAgICAgICdzdHJvbmcsIGInOiB7XG4gICAgICAgIGZvbnRXZWlnaHQ6IHRoZW1lLnR5cG9ncmFwaHkuZm9udFdlaWdodEJvbGRcbiAgICAgIH0sXG4gICAgICBib2R5OiBfZXh0ZW5kcyh7XG4gICAgICAgIG1hcmdpbjogMFxuICAgICAgfSwgYm9keSh0aGVtZSksIHtcbiAgICAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIGRvY3VtZW50LmJvZHkucmVxdWVzdEZ1bGxTY3JlZW4oKS5cbiAgICAgICAgLy8gT3RoZXIgZWxlbWVudHMsIGlmIGJhY2tncm91bmQgdHJhbnNwYXJlbnQsIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAnJjo6YmFja2Ryb3AnOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmJhY2tncm91bmQuZGVmYXVsdFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfTtcbn07XG4vKipcbiAqIEtpY2tzdGFydCBhbiBlbGVnYW50LCBjb25zaXN0ZW50LCBhbmQgc2ltcGxlIGJhc2VsaW5lIHRvIGJ1aWxkIHVwb24uXG4gKi9cblxuZnVuY3Rpb24gQ3NzQmFzZWxpbmUocHJvcHMpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgdmFyIF9wcm9wcyRjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2hpbGRyZW4gPSBfcHJvcHMkY2hpbGRyZW4gPT09IHZvaWQgMCA/IG51bGwgOiBfcHJvcHMkY2hpbGRyZW4sXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcztcbiAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgY2hpbGRyZW4pO1xufVxuXG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBDc3NCYXNlbGluZS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIHdyYXAgYSBub2RlLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3Rcbn0gOiB2b2lkIDA7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICBDc3NCYXNlbGluZVsncHJvcFR5cGVzJyArICcnXSA9IGV4YWN0UHJvcChDc3NCYXNlbGluZS5wcm9wVHlwZXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpQ3NzQmFzZWxpbmUnXG59KShDc3NCYXNlbGluZSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IFR5cG9ncmFwaHkgZnJvbSAnLi4vVHlwb2dyYXBoeSc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IHtcbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgcm9vdDoge1xuICAgIG1hcmdpbkJvdHRvbTogMTJcbiAgfVxufTtcbnZhciBEaWFsb2dDb250ZW50VGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIERpYWxvZ0NvbnRlbnRUZXh0KHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFR5cG9ncmFwaHksIF9leHRlbmRzKHtcbiAgICBjb21wb25lbnQ6IFwicFwiLFxuICAgIHZhcmlhbnQ6IFwiYm9keTFcIixcbiAgICBjb2xvcjogXCJ0ZXh0U2Vjb25kYXJ5XCIsXG4gICAgcmVmOiByZWZcbiAgfSwgcHJvcHMpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRGlhbG9nQ29udGVudFRleHQucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0XG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aURpYWxvZ0NvbnRlbnRUZXh0J1xufSkoRGlhbG9nQ29udGVudFRleHQpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJy4uL1R5cG9ncmFwaHknO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogJzE2cHggMjRweCcsXG4gICAgZmxleDogJzAgMCBhdXRvJ1xuICB9XG59O1xudmFyIERpYWxvZ1RpdGxlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRGlhbG9nVGl0bGUocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGRpc2FibGVUeXBvZ3JhID0gcHJvcHMuZGlzYWJsZVR5cG9ncmFwaHksXG4gICAgICBkaXNhYmxlVHlwb2dyYXBoeSA9IF9wcm9wcyRkaXNhYmxlVHlwb2dyYSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVR5cG9ncmEsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiZGlzYWJsZVR5cG9ncmFwaHlcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIGRpc2FibGVUeXBvZ3JhcGh5ID8gY2hpbGRyZW4gOiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUeXBvZ3JhcGh5LCB7XG4gICAgY29tcG9uZW50OiBcImgyXCIsXG4gICAgdmFyaWFudDogXCJoNlwiXG4gIH0sIGNoaWxkcmVuKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IERpYWxvZ1RpdGxlLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBjaGlsZHJlbiB3b24ndCBiZSB3cmFwcGVkIGJ5IGEgdHlwb2dyYXBoeSBjb21wb25lbnQuXG4gICAqIEZvciBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgdXNlZnVsIHRvIHJlbmRlciBhbiBoNCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGgyLlxuICAgKi9cbiAgZGlzYWJsZVR5cG9ncmFwaHk6IFByb3BUeXBlcy5ib29sXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aURpYWxvZ1RpdGxlJ1xufSkoRGlhbG9nVGl0bGUpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCB7IGZhZGUgfSBmcm9tICcuLi9zdHlsZXMvY29sb3JNYW5pcHVsYXRvcic7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgaGVpZ2h0OiAxLFxuICAgICAgbWFyZ2luOiAwLFxuICAgICAgLy8gUmVzZXQgYnJvd3NlciBkZWZhdWx0IHN0eWxlLlxuICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICBmbGV4U2hyaW5rOiAwLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmRpdmlkZXJcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgYWJzb2x1dGU9e3RydWV9YC4gKi9cbiAgICBhYnNvbHV0ZToge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBib3R0b206IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiaW5zZXRcImAuICovXG4gICAgaW5zZXQ6IHtcbiAgICAgIG1hcmdpbkxlZnQ6IDcyXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGxpZ2h0PXt0cnVlfWAuICovXG4gICAgbGlnaHQ6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogZmFkZSh0aGVtZS5wYWxldHRlLmRpdmlkZXIsIDAuMDgpXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHZhcmlhbnQ9XCJtaWRkbGVcImAuICovXG4gICAgbWlkZGxlOiB7XG4gICAgICBtYXJnaW5MZWZ0OiB0aGVtZS5zcGFjaW5nKDIpLFxuICAgICAgbWFyZ2luUmlnaHQ6IHRoZW1lLnNwYWNpbmcoMilcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiYC4gKi9cbiAgICB2ZXJ0aWNhbDoge1xuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICB3aWR0aDogMVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmbGV4SXRlbT17dHJ1ZX1gLiAqL1xuICAgIGZsZXhJdGVtOiB7XG4gICAgICBhbGlnblNlbGY6ICdzdHJldGNoJyxcbiAgICAgIGhlaWdodDogJ2F1dG8nXG4gICAgfVxuICB9O1xufTtcbnZhciBEaXZpZGVyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRGl2aWRlcihwcm9wcywgcmVmKSB7XG4gIHZhciBfcHJvcHMkYWJzb2x1dGUgPSBwcm9wcy5hYnNvbHV0ZSxcbiAgICAgIGFic29sdXRlID0gX3Byb3BzJGFic29sdXRlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRhYnNvbHV0ZSxcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGNvbXBvbmVudCA9IHByb3BzLmNvbXBvbmVudCxcbiAgICAgIENvbXBvbmVudCA9IF9wcm9wcyRjb21wb25lbnQgPT09IHZvaWQgMCA/ICdocicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgX3Byb3BzJGZsZXhJdGVtID0gcHJvcHMuZmxleEl0ZW0sXG4gICAgICBmbGV4SXRlbSA9IF9wcm9wcyRmbGV4SXRlbSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZmxleEl0ZW0sXG4gICAgICBfcHJvcHMkbGlnaHQgPSBwcm9wcy5saWdodCxcbiAgICAgIGxpZ2h0ID0gX3Byb3BzJGxpZ2h0ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRsaWdodCxcbiAgICAgIF9wcm9wcyRvcmllbnRhdGlvbiA9IHByb3BzLm9yaWVudGF0aW9uLFxuICAgICAgb3JpZW50YXRpb24gPSBfcHJvcHMkb3JpZW50YXRpb24gPT09IHZvaWQgMCA/ICdob3Jpem9udGFsJyA6IF9wcm9wcyRvcmllbnRhdGlvbixcbiAgICAgIF9wcm9wcyRyb2xlID0gcHJvcHMucm9sZSxcbiAgICAgIHJvbGUgPSBfcHJvcHMkcm9sZSA9PT0gdm9pZCAwID8gQ29tcG9uZW50ICE9PSAnaHInID8gJ3NlcGFyYXRvcicgOiB1bmRlZmluZWQgOiBfcHJvcHMkcm9sZSxcbiAgICAgIF9wcm9wcyR2YXJpYW50ID0gcHJvcHMudmFyaWFudCxcbiAgICAgIHZhcmlhbnQgPSBfcHJvcHMkdmFyaWFudCA9PT0gdm9pZCAwID8gJ2Z1bGxXaWR0aCcgOiBfcHJvcHMkdmFyaWFudCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJhYnNvbHV0ZVwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb21wb25lbnRcIiwgXCJmbGV4SXRlbVwiLCBcImxpZ2h0XCIsIFwib3JpZW50YXRpb25cIiwgXCJyb2xlXCIsIFwidmFyaWFudFwiXSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgdmFyaWFudCAhPT0gJ2Z1bGxXaWR0aCcgJiYgY2xhc3Nlc1t2YXJpYW50XSwgYWJzb2x1dGUgJiYgY2xhc3Nlcy5hYnNvbHV0ZSwgZmxleEl0ZW0gJiYgY2xhc3Nlcy5mbGV4SXRlbSwgbGlnaHQgJiYgY2xhc3Nlcy5saWdodCwgb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgJiYgY2xhc3Nlcy52ZXJ0aWNhbCksXG4gICAgcm9sZTogcm9sZSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBEaXZpZGVyLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEFic29sdXRlbHkgcG9zaXRpb24gdGhlIGVsZW1lbnQuXG4gICAqL1xuICBhYnNvbHV0ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGEgdmVydGljYWwgZGl2aWRlciB3aWxsIGhhdmUgdGhlIGNvcnJlY3QgaGVpZ2h0IHdoZW4gdXNlZCBpbiBmbGV4IGNvbnRhaW5lci5cbiAgICogKEJ5IGRlZmF1bHQsIGEgdmVydGljYWwgZGl2aWRlciB3aWxsIGhhdmUgYSBjYWxjdWxhdGVkIGhlaWdodCBvZiBgMHB4YCBpZiBpdCBpcyB0aGUgY2hpbGQgb2YgYSBmbGV4IGNvbnRhaW5lci4pXG4gICAqL1xuICBmbGV4SXRlbTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGRpdmlkZXIgd2lsbCBoYXZlIGEgbGlnaHRlciBjb2xvci5cbiAgICovXG4gIGxpZ2h0OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogVGhlIGRpdmlkZXIgb3JpZW50YXRpb24uXG4gICAqL1xuICBvcmllbnRhdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCddKSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcm9sZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIHZhcmlhbnQgdG8gdXNlLlxuICAgKi9cbiAgdmFyaWFudDogUHJvcFR5cGVzLm9uZU9mKFsnZnVsbFdpZHRoJywgJ2luc2V0JywgJ21pZGRsZSddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlEaXZpZGVyJ1xufSkoRGl2aWRlcik7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IE1vZGFsIGZyb20gJy4uL01vZGFsJztcbmltcG9ydCBCYWNrZHJvcCBmcm9tICcuLi9CYWNrZHJvcCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgU2xpZGUgZnJvbSAnLi4vU2xpZGUnO1xuaW1wb3J0IFBhcGVyIGZyb20gJy4uL1BhcGVyJztcbmltcG9ydCBjYXBpdGFsaXplIGZyb20gJy4uL3V0aWxzL2NhcGl0YWxpemUnO1xuaW1wb3J0IHsgZHVyYXRpb24gfSBmcm9tICcuLi9zdHlsZXMvdHJhbnNpdGlvbnMnO1xuaW1wb3J0IHVzZVRoZW1lIGZyb20gJy4uL3N0eWxlcy91c2VUaGVtZSc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwicGVybWFuZW50IG9yIHBlcnNpc3RlbnRcImAuICovXG4gICAgZG9ja2VkOiB7XG4gICAgICBmbGV4OiAnMCAwIGF1dG8nXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgUGFwZXJgIGNvbXBvbmVudC4gKi9cbiAgICBwYXBlcjoge1xuICAgICAgb3ZlcmZsb3dZOiAnYXV0bycsXG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgZmxleDogJzEgMCBhdXRvJyxcbiAgICAgIHpJbmRleDogdGhlbWUuekluZGV4LmRyYXdlcixcbiAgICAgIFdlYmtpdE92ZXJmbG93U2Nyb2xsaW5nOiAndG91Y2gnLFxuICAgICAgLy8gQWRkIGlPUyBtb21lbnR1bSBzY3JvbGxpbmcuXG4gICAgICAvLyB0ZW1wb3Jhcnkgc3R5bGVcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgdG9wOiAwLFxuICAgICAgLy8gV2UgZGlzYWJsZSB0aGUgZm9jdXMgcmluZyBmb3IgbW91c2UsIHRvdWNoIGFuZCBrZXlib2FyZCB1c2Vycy5cbiAgICAgIC8vIEF0IHNvbWUgcG9pbnQsIGl0IHdvdWxkIGJlIGJldHRlciB0byBrZWVwIGl0IGZvciBrZXlib2FyZCB1c2Vycy5cbiAgICAgIC8vIDpmb2N1cy1yaW5nIENTUyBwc2V1ZG8tY2xhc3Mgd2lsbCBoZWxwLlxuICAgICAgb3V0bGluZTogMFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cImxlZnRcImAuICovXG4gICAgcGFwZXJBbmNob3JMZWZ0OiB7XG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQ6ICdhdXRvJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cInJpZ2h0XCJgLiAqL1xuICAgIHBhcGVyQW5jaG9yUmlnaHQ6IHtcbiAgICAgIGxlZnQ6ICdhdXRvJyxcbiAgICAgIHJpZ2h0OiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgUGFwZXJgIGNvbXBvbmVudCBpZiBgYW5jaG9yPVwidG9wXCJgLiAqL1xuICAgIHBhcGVyQW5jaG9yVG9wOiB7XG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgYm90dG9tOiAnYXV0bycsXG4gICAgICByaWdodDogMCxcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgbWF4SGVpZ2h0OiAnMTAwJSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBQYXBlcmAgY29tcG9uZW50IGlmIGBhbmNob3I9XCJib3R0b21cImAuICovXG4gICAgcGFwZXJBbmNob3JCb3R0b206IHtcbiAgICAgIHRvcDogJ2F1dG8nLFxuICAgICAgbGVmdDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICBtYXhIZWlnaHQ6ICcxMDAlJ1xuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cImxlZnRcImAgYW5kIGB2YXJpYW50YCBpcyBub3QgXCJ0ZW1wb3JhcnlcIi4gKi9cbiAgICBwYXBlckFuY2hvckRvY2tlZExlZnQ6IHtcbiAgICAgIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5kaXZpZGVyKVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cInRvcFwiYCBhbmQgYHZhcmlhbnRgIGlzIG5vdCBcInRlbXBvcmFyeVwiLiAqL1xuICAgIHBhcGVyQW5jaG9yRG9ja2VkVG9wOiB7XG4gICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLmRpdmlkZXIpXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgUGFwZXJgIGNvbXBvbmVudCBpZiBgYW5jaG9yPVwicmlnaHRcImAgYW5kIGB2YXJpYW50YCBpcyBub3QgXCJ0ZW1wb3JhcnlcIi4gKi9cbiAgICBwYXBlckFuY2hvckRvY2tlZFJpZ2h0OiB7XG4gICAgICBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5kaXZpZGVyKVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYFBhcGVyYCBjb21wb25lbnQgaWYgYGFuY2hvcj1cImJvdHRvbVwiYCBhbmQgYHZhcmlhbnRgIGlzIG5vdCBcInRlbXBvcmFyeVwiLiAqL1xuICAgIHBhcGVyQW5jaG9yRG9ja2VkQm90dG9tOiB7XG4gICAgICBib3JkZXJUb3A6IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLmRpdmlkZXIpXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgTW9kYWxgIGNvbXBvbmVudC4gKi9cbiAgICBtb2RhbDoge31cbiAgfTtcbn07XG52YXIgb3Bwb3NpdGVEaXJlY3Rpb24gPSB7XG4gIGxlZnQ6ICdyaWdodCcsXG4gIHJpZ2h0OiAnbGVmdCcsXG4gIHRvcDogJ2Rvd24nLFxuICBib3R0b206ICd1cCdcbn07XG5leHBvcnQgZnVuY3Rpb24gaXNIb3Jpem9udGFsKGFuY2hvcikge1xuICByZXR1cm4gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihhbmNob3IpICE9PSAtMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmNob3IodGhlbWUsIGFuY2hvcikge1xuICByZXR1cm4gdGhlbWUuZGlyZWN0aW9uID09PSAncnRsJyAmJiBpc0hvcml6b250YWwoYW5jaG9yKSA/IG9wcG9zaXRlRGlyZWN0aW9uW2FuY2hvcl0gOiBhbmNob3I7XG59XG52YXIgZGVmYXVsdFRyYW5zaXRpb25EdXJhdGlvbiA9IHtcbiAgZW50ZXI6IGR1cmF0aW9uLmVudGVyaW5nU2NyZWVuLFxuICBleGl0OiBkdXJhdGlvbi5sZWF2aW5nU2NyZWVuXG59O1xuLyoqXG4gKiBUaGUgcHJvcHMgb2YgdGhlIFtNb2RhbF0oL2FwaS9tb2RhbC8pIGNvbXBvbmVudCBhcmUgYXZhaWxhYmxlXG4gKiB3aGVuIGB2YXJpYW50PVwidGVtcG9yYXJ5XCJgIGlzIHNldC5cbiAqL1xuXG52YXIgRHJhd2VyID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRHJhd2VyKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRhbmNob3IgPSBwcm9wcy5hbmNob3IsXG4gICAgICBhbmNob3JQcm9wID0gX3Byb3BzJGFuY2hvciA9PT0gdm9pZCAwID8gJ2xlZnQnIDogX3Byb3BzJGFuY2hvcixcbiAgICAgIEJhY2tkcm9wUHJvcHMgPSBwcm9wcy5CYWNrZHJvcFByb3BzLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGVsZXZhdGlvbiA9IHByb3BzLmVsZXZhdGlvbixcbiAgICAgIGVsZXZhdGlvbiA9IF9wcm9wcyRlbGV2YXRpb24gPT09IHZvaWQgMCA/IDE2IDogX3Byb3BzJGVsZXZhdGlvbixcbiAgICAgIF9wcm9wcyRNb2RhbFByb3BzID0gcHJvcHMuTW9kYWxQcm9wcztcbiAgX3Byb3BzJE1vZGFsUHJvcHMgPSBfcHJvcHMkTW9kYWxQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkTW9kYWxQcm9wcztcblxuICB2YXIgQmFja2Ryb3BQcm9wc1Byb3AgPSBfcHJvcHMkTW9kYWxQcm9wcy5CYWNrZHJvcFByb3BzLFxuICAgICAgTW9kYWxQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMkTW9kYWxQcm9wcywgW1wiQmFja2Ryb3BQcm9wc1wiXSksXG4gICAgICBvbkNsb3NlID0gcHJvcHMub25DbG9zZSxcbiAgICAgIF9wcm9wcyRvcGVuID0gcHJvcHMub3BlbixcbiAgICAgIG9wZW4gPSBfcHJvcHMkb3BlbiA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkb3BlbixcbiAgICAgIF9wcm9wcyRQYXBlclByb3BzID0gcHJvcHMuUGFwZXJQcm9wcyxcbiAgICAgIFBhcGVyUHJvcHMgPSBfcHJvcHMkUGFwZXJQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfcHJvcHMkUGFwZXJQcm9wcyxcbiAgICAgIFNsaWRlUHJvcHMgPSBwcm9wcy5TbGlkZVByb3BzLFxuICAgICAgX3Byb3BzJFRyYW5zaXRpb25Db21wID0gcHJvcHMuVHJhbnNpdGlvbkNvbXBvbmVudCxcbiAgICAgIFRyYW5zaXRpb25Db21wb25lbnQgPSBfcHJvcHMkVHJhbnNpdGlvbkNvbXAgPT09IHZvaWQgMCA/IFNsaWRlIDogX3Byb3BzJFRyYW5zaXRpb25Db21wLFxuICAgICAgX3Byb3BzJHRyYW5zaXRpb25EdXJhID0gcHJvcHMudHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gX3Byb3BzJHRyYW5zaXRpb25EdXJhID09PSB2b2lkIDAgPyBkZWZhdWx0VHJhbnNpdGlvbkR1cmF0aW9uIDogX3Byb3BzJHRyYW5zaXRpb25EdXJhLFxuICAgICAgX3Byb3BzJHZhcmlhbnQgPSBwcm9wcy52YXJpYW50LFxuICAgICAgdmFyaWFudCA9IF9wcm9wcyR2YXJpYW50ID09PSB2b2lkIDAgPyAndGVtcG9yYXJ5JyA6IF9wcm9wcyR2YXJpYW50LFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImFuY2hvclwiLCBcIkJhY2tkcm9wUHJvcHNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJlbGV2YXRpb25cIiwgXCJNb2RhbFByb3BzXCIsIFwib25DbG9zZVwiLCBcIm9wZW5cIiwgXCJQYXBlclByb3BzXCIsIFwiU2xpZGVQcm9wc1wiLCBcIlRyYW5zaXRpb25Db21wb25lbnRcIiwgXCJ0cmFuc2l0aW9uRHVyYXRpb25cIiwgXCJ2YXJpYW50XCJdKTtcblxuICB2YXIgdGhlbWUgPSB1c2VUaGVtZSgpOyAvLyBMZXQncyBhc3N1bWUgdGhhdCB0aGUgRHJhd2VyIHdpbGwgYWx3YXlzIGJlIHJlbmRlcmVkIG9uIHVzZXIgc3BhY2UuXG4gIC8vIFdlIHVzZSB0aGlzIHN0YXRlIGlzIG9yZGVyIHRvIHNraXAgdGhlIGFwcGVhciB0cmFuc2l0aW9uIGR1cmluZyB0aGVcbiAgLy8gaW5pdGlhbCBtb3VudCBvZiB0aGUgY29tcG9uZW50LlxuXG4gIHZhciBtb3VudGVkID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBtb3VudGVkLmN1cnJlbnQgPSB0cnVlO1xuICB9LCBbXSk7XG4gIHZhciBhbmNob3IgPSBnZXRBbmNob3IodGhlbWUsIGFuY2hvclByb3ApO1xuICB2YXIgZHJhd2VyID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUGFwZXIsIF9leHRlbmRzKHtcbiAgICBlbGV2YXRpb246IHZhcmlhbnQgPT09ICd0ZW1wb3JhcnknID8gZWxldmF0aW9uIDogMCxcbiAgICBzcXVhcmU6IHRydWVcbiAgfSwgUGFwZXJQcm9wcywge1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnBhcGVyLCBjbGFzc2VzW1wicGFwZXJBbmNob3JcIi5jb25jYXQoY2FwaXRhbGl6ZShhbmNob3IpKV0sIFBhcGVyUHJvcHMuY2xhc3NOYW1lLCB2YXJpYW50ICE9PSAndGVtcG9yYXJ5JyAmJiBjbGFzc2VzW1wicGFwZXJBbmNob3JEb2NrZWRcIi5jb25jYXQoY2FwaXRhbGl6ZShhbmNob3IpKV0pXG4gIH0pLCBjaGlsZHJlbik7XG5cbiAgaWYgKHZhcmlhbnQgPT09ICdwZXJtYW5lbnQnKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIF9leHRlbmRzKHtcbiAgICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzZXMuZG9ja2VkLCBjbGFzc05hbWUpLFxuICAgICAgcmVmOiByZWZcbiAgICB9LCBvdGhlciksIGRyYXdlcik7XG4gIH1cblxuICB2YXIgc2xpZGluZ0RyYXdlciA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRyYW5zaXRpb25Db21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBpbjogb3BlbixcbiAgICBkaXJlY3Rpb246IG9wcG9zaXRlRGlyZWN0aW9uW2FuY2hvcl0sXG4gICAgdGltZW91dDogdHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgIGFwcGVhcjogbW91bnRlZC5jdXJyZW50XG4gIH0sIFNsaWRlUHJvcHMpLCBkcmF3ZXIpO1xuXG4gIGlmICh2YXJpYW50ID09PSAncGVyc2lzdGVudCcpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3Nlcy5kb2NrZWQsIGNsYXNzTmFtZSksXG4gICAgICByZWY6IHJlZlxuICAgIH0sIG90aGVyKSwgc2xpZGluZ0RyYXdlcik7XG4gIH0gLy8gdmFyaWFudCA9PT0gdGVtcG9yYXJ5XG5cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTW9kYWwsIF9leHRlbmRzKHtcbiAgICBCYWNrZHJvcFByb3BzOiBfZXh0ZW5kcyh7fSwgQmFja2Ryb3BQcm9wcywgQmFja2Ryb3BQcm9wc1Byb3AsIHtcbiAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogdHJhbnNpdGlvbkR1cmF0aW9uXG4gICAgfSksXG4gICAgQmFja2Ryb3BDb21wb25lbnQ6IEJhY2tkcm9wLFxuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzZXMubW9kYWwsIGNsYXNzTmFtZSksXG4gICAgb3Blbjogb3BlbixcbiAgICBvbkNsb3NlOiBvbkNsb3NlLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyLCBNb2RhbFByb3BzKSwgc2xpZGluZ0RyYXdlcik7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IERyYXdlci5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBTaWRlIGZyb20gd2hpY2ggdGhlIGRyYXdlciB3aWxsIGFwcGVhci5cbiAgICovXG4gIGFuY2hvcjogUHJvcFR5cGVzLm9uZU9mKFsnYm90dG9tJywgJ2xlZnQnLCAncmlnaHQnLCAndG9wJ10pLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBCYWNrZHJvcFByb3BzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGhlIGRyYXdlci5cbiAgICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBlbGV2YXRpb24gb2YgdGhlIGRyYXdlci5cbiAgICovXG4gIGVsZXZhdGlvbjogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogUHJvcHMgYXBwbGllZCB0byB0aGUgW2BNb2RhbGBdKC9hcGkvbW9kYWwvKSBlbGVtZW50LlxuICAgKi9cbiAgTW9kYWxQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgY29tcG9uZW50IHJlcXVlc3RzIHRvIGJlIGNsb3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgb25DbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGRyYXdlciBpcyBvcGVuLlxuICAgKi9cbiAgb3BlbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFByb3BzIGFwcGxpZWQgdG8gdGhlIFtgUGFwZXJgXSgvYXBpL3BhcGVyLykgZWxlbWVudC5cbiAgICovXG4gIFBhcGVyUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFByb3BzIGFwcGxpZWQgdG8gdGhlIFtgU2xpZGVgXSgvYXBpL3NsaWRlLykgZWxlbWVudC5cbiAgICovXG4gIFNsaWRlUHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFRoZSBkdXJhdGlvbiBmb3IgdGhlIHRyYW5zaXRpb24sIGluIG1pbGxpc2Vjb25kcy5cbiAgICogWW91IG1heSBzcGVjaWZ5IGEgc2luZ2xlIHRpbWVvdXQgZm9yIGFsbCB0cmFuc2l0aW9ucywgb3IgaW5kaXZpZHVhbGx5IHdpdGggYW4gb2JqZWN0LlxuICAgKi9cbiAgdHJhbnNpdGlvbkR1cmF0aW9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGFwcGVhcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBlbnRlcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBleGl0OiBQcm9wVHlwZXMubnVtYmVyXG4gIH0pXSksXG5cbiAgLyoqXG4gICAqIFRoZSB2YXJpYW50IHRvIHVzZS5cbiAgICovXG4gIHZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ3Blcm1hbmVudCcsICdwZXJzaXN0ZW50JywgJ3RlbXBvcmFyeSddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlEcmF3ZXInLFxuICBmbGlwOiBmYWxzZVxufSkoRHJhd2VyKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0ICogYXMgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICcuLi91dGlscy9kZWJvdW5jZSc7XG5pbXBvcnQgeyBUcmFuc2l0aW9uIH0gZnJvbSAncmVhY3QtdHJhbnNpdGlvbi1ncm91cCc7XG5pbXBvcnQgeyBlbGVtZW50QWNjZXB0aW5nUmVmIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmltcG9ydCB1c2VGb3JrUmVmIGZyb20gJy4uL3V0aWxzL3VzZUZvcmtSZWYnO1xuaW1wb3J0IHVzZVRoZW1lIGZyb20gJy4uL3N0eWxlcy91c2VUaGVtZSc7XG5pbXBvcnQgeyBkdXJhdGlvbiB9IGZyb20gJy4uL3N0eWxlcy90cmFuc2l0aW9ucyc7XG5pbXBvcnQgeyByZWZsb3csIGdldFRyYW5zaXRpb25Qcm9wcyB9IGZyb20gJy4uL3RyYW5zaXRpb25zL3V0aWxzJzsgLy8gVHJhbnNsYXRlIHRoZSBub2RlIHNvIGhlIGNhbid0IGJlIHNlZW4gb24gdGhlIHNjcmVlbi5cbi8vIExhdGVyLCB3ZSBnb25uYSB0cmFuc2xhdGUgYmFjayB0aGUgbm9kZSB0byBoaXMgb3JpZ2luYWwgbG9jYXRpb25cbi8vIHdpdGggYG5vbmVgLmBcblxuZnVuY3Rpb24gZ2V0VHJhbnNsYXRlVmFsdWUoZGlyZWN0aW9uLCBub2RlKSB7XG4gIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHRyYW5zZm9ybTtcblxuICBpZiAobm9kZS5mYWtlVHJhbnNmb3JtKSB7XG4gICAgdHJhbnNmb3JtID0gbm9kZS5mYWtlVHJhbnNmb3JtO1xuICB9IGVsc2Uge1xuICAgIHZhciBjb21wdXRlZFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUobm9kZSk7XG4gICAgdHJhbnNmb3JtID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctd2Via2l0LXRyYW5zZm9ybScpIHx8IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndHJhbnNmb3JtJyk7XG4gIH1cblxuICB2YXIgb2Zmc2V0WCA9IDA7XG4gIHZhciBvZmZzZXRZID0gMDtcblxuICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gJ25vbmUnICYmIHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIHRyYW5zZm9ybVZhbHVlcyA9IHRyYW5zZm9ybS5zcGxpdCgnKCcpWzFdLnNwbGl0KCcpJylbMF0uc3BsaXQoJywnKTtcbiAgICBvZmZzZXRYID0gcGFyc2VJbnQodHJhbnNmb3JtVmFsdWVzWzRdLCAxMCk7XG4gICAgb2Zmc2V0WSA9IHBhcnNlSW50KHRyYW5zZm9ybVZhbHVlc1s1XSwgMTApO1xuICB9XG5cbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgcmV0dXJuIFwidHJhbnNsYXRlWChcIi5jb25jYXQod2luZG93LmlubmVyV2lkdGgsIFwicHgpIHRyYW5zbGF0ZVgoXCIpLmNvbmNhdChvZmZzZXRYIC0gcmVjdC5sZWZ0LCBcInB4KVwiKTtcbiAgfVxuXG4gIGlmIChkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGVYKC1cIi5jb25jYXQocmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAtIG9mZnNldFgsIFwicHgpXCIpO1xuICB9XG5cbiAgaWYgKGRpcmVjdGlvbiA9PT0gJ3VwJykge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZVkoXCIuY29uY2F0KHdpbmRvdy5pbm5lckhlaWdodCwgXCJweCkgdHJhbnNsYXRlWShcIikuY29uY2F0KG9mZnNldFkgLSByZWN0LnRvcCwgXCJweClcIik7XG4gIH0gLy8gZGlyZWN0aW9uID09PSAnZG93bidcblxuXG4gIHJldHVybiBcInRyYW5zbGF0ZVkoLVwiLmNvbmNhdChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC0gb2Zmc2V0WSwgXCJweClcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRUcmFuc2xhdGVWYWx1ZShkaXJlY3Rpb24sIG5vZGUpIHtcbiAgdmFyIHRyYW5zZm9ybSA9IGdldFRyYW5zbGF0ZVZhbHVlKGRpcmVjdGlvbiwgbm9kZSk7XG5cbiAgaWYgKHRyYW5zZm9ybSkge1xuICAgIG5vZGUuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICB9XG59XG52YXIgZGVmYXVsdFRpbWVvdXQgPSB7XG4gIGVudGVyOiBkdXJhdGlvbi5lbnRlcmluZ1NjcmVlbixcbiAgZXhpdDogZHVyYXRpb24ubGVhdmluZ1NjcmVlblxufTtcbi8qKlxuICogVGhlIFNsaWRlIHRyYW5zaXRpb24gaXMgdXNlZCBieSB0aGUgW0RyYXdlcl0oL2NvbXBvbmVudHMvZHJhd2Vycy8pIGNvbXBvbmVudC5cbiAqIEl0IHVzZXMgW3JlYWN0LXRyYW5zaXRpb24tZ3JvdXBdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlYWN0LXRyYW5zaXRpb24tZ3JvdXApIGludGVybmFsbHkuXG4gKi9cblxudmFyIFNsaWRlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gU2xpZGUocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIF9wcm9wcyRkaXJlY3Rpb24gPSBwcm9wcy5kaXJlY3Rpb24sXG4gICAgICBkaXJlY3Rpb24gPSBfcHJvcHMkZGlyZWN0aW9uID09PSB2b2lkIDAgPyAnZG93bicgOiBfcHJvcHMkZGlyZWN0aW9uLFxuICAgICAgaW5Qcm9wID0gcHJvcHMuaW4sXG4gICAgICBvbkVudGVyID0gcHJvcHMub25FbnRlcixcbiAgICAgIG9uRW50ZXJlZCA9IHByb3BzLm9uRW50ZXJlZCxcbiAgICAgIG9uRW50ZXJpbmcgPSBwcm9wcy5vbkVudGVyaW5nLFxuICAgICAgb25FeGl0ID0gcHJvcHMub25FeGl0LFxuICAgICAgb25FeGl0ZWQgPSBwcm9wcy5vbkV4aXRlZCxcbiAgICAgIG9uRXhpdGluZyA9IHByb3BzLm9uRXhpdGluZyxcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICBfcHJvcHMkdGltZW91dCA9IHByb3BzLnRpbWVvdXQsXG4gICAgICB0aW1lb3V0ID0gX3Byb3BzJHRpbWVvdXQgPT09IHZvaWQgMCA/IGRlZmF1bHRUaW1lb3V0IDogX3Byb3BzJHRpbWVvdXQsXG4gICAgICBfcHJvcHMkVHJhbnNpdGlvbkNvbXAgPSBwcm9wcy5UcmFuc2l0aW9uQ29tcG9uZW50LFxuICAgICAgVHJhbnNpdGlvbkNvbXBvbmVudCA9IF9wcm9wcyRUcmFuc2l0aW9uQ29tcCA9PT0gdm9pZCAwID8gVHJhbnNpdGlvbiA6IF9wcm9wcyRUcmFuc2l0aW9uQ29tcCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImRpcmVjdGlvblwiLCBcImluXCIsIFwib25FbnRlclwiLCBcIm9uRW50ZXJlZFwiLCBcIm9uRW50ZXJpbmdcIiwgXCJvbkV4aXRcIiwgXCJvbkV4aXRlZFwiLCBcIm9uRXhpdGluZ1wiLCBcInN0eWxlXCIsIFwidGltZW91dFwiLCBcIlRyYW5zaXRpb25Db21wb25lbnRcIl0pO1xuXG4gIHZhciB0aGVtZSA9IHVzZVRoZW1lKCk7XG4gIHZhciBjaGlsZHJlblJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgLyoqXG4gICAqIHVzZWQgaW4gY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7IHJlZjogaGFuZGxlUmVmIH0pXG4gICAqL1xuXG4gIHZhciBoYW5kbGVPd25SZWYgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAvLyAjU3RyaWN0TW9kZSByZWFkeVxuICAgIGNoaWxkcmVuUmVmLmN1cnJlbnQgPSBSZWFjdERPTS5maW5kRE9NTm9kZShpbnN0YW5jZSk7XG4gIH0sIFtdKTtcbiAgdmFyIGhhbmRsZVJlZkludGVybWVkaWFyeSA9IHVzZUZvcmtSZWYoY2hpbGRyZW4ucmVmLCBoYW5kbGVPd25SZWYpO1xuICB2YXIgaGFuZGxlUmVmID0gdXNlRm9ya1JlZihoYW5kbGVSZWZJbnRlcm1lZGlhcnksIHJlZik7XG5cbiAgdmFyIG5vcm1hbGl6ZWRUcmFuc2l0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChpc0FwcGVhcmluZykge1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIC8vIG9uRW50ZXJYeHggYW5kIG9uRXhpdFh4eCBjYWxsYmFja3MgaGF2ZSBhIGRpZmZlcmVudCBhcmd1bWVudHMubGVuZ3RoIHZhbHVlLlxuICAgICAgICBpZiAoaXNBcHBlYXJpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNhbGxiYWNrKGNoaWxkcmVuUmVmLmN1cnJlbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKGNoaWxkcmVuUmVmLmN1cnJlbnQsIGlzQXBwZWFyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgdmFyIGhhbmRsZUVudGVyID0gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhmdW5jdGlvbiAobm9kZSwgaXNBcHBlYXJpbmcpIHtcbiAgICBzZXRUcmFuc2xhdGVWYWx1ZShkaXJlY3Rpb24sIG5vZGUpO1xuICAgIHJlZmxvdyhub2RlKTtcblxuICAgIGlmIChvbkVudGVyKSB7XG4gICAgICBvbkVudGVyKG5vZGUsIGlzQXBwZWFyaW5nKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgaGFuZGxlRW50ZXJpbmcgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGZ1bmN0aW9uIChub2RlLCBpc0FwcGVhcmluZykge1xuICAgIHZhciB0cmFuc2l0aW9uUHJvcHMgPSBnZXRUcmFuc2l0aW9uUHJvcHMoe1xuICAgICAgdGltZW91dDogdGltZW91dCxcbiAgICAgIHN0eWxlOiBzdHlsZVxuICAgIH0sIHtcbiAgICAgIG1vZGU6ICdlbnRlcidcbiAgICB9KTtcbiAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJy13ZWJraXQtdHJhbnNmb3JtJywgX2V4dGVuZHMoe30sIHRyYW5zaXRpb25Qcm9wcywge1xuICAgICAgZWFzaW5nOiB0aGVtZS50cmFuc2l0aW9ucy5lYXNpbmcuZWFzZU91dFxuICAgIH0pKTtcbiAgICBub2RlLnN0eWxlLnRyYW5zaXRpb24gPSB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJ3RyYW5zZm9ybScsIF9leHRlbmRzKHt9LCB0cmFuc2l0aW9uUHJvcHMsIHtcbiAgICAgIGVhc2luZzogdGhlbWUudHJhbnNpdGlvbnMuZWFzaW5nLmVhc2VPdXRcbiAgICB9KSk7XG4gICAgbm9kZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSAnbm9uZSc7XG4gICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSAnbm9uZSc7XG5cbiAgICBpZiAob25FbnRlcmluZykge1xuICAgICAgb25FbnRlcmluZyhub2RlLCBpc0FwcGVhcmluZyk7XG4gICAgfVxuICB9KTtcbiAgdmFyIGhhbmRsZUVudGVyZWQgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKG9uRW50ZXJlZCk7XG4gIHZhciBoYW5kbGVFeGl0aW5nID0gbm9ybWFsaXplZFRyYW5zaXRpb25DYWxsYmFjayhvbkV4aXRpbmcpO1xuICB2YXIgaGFuZGxlRXhpdCA9IG5vcm1hbGl6ZWRUcmFuc2l0aW9uQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgdHJhbnNpdGlvblByb3BzID0gZ2V0VHJhbnNpdGlvblByb3BzKHtcbiAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICBzdHlsZTogc3R5bGVcbiAgICB9LCB7XG4gICAgICBtb2RlOiAnZXhpdCdcbiAgICB9KTtcbiAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoJy13ZWJraXQtdHJhbnNmb3JtJywgX2V4dGVuZHMoe30sIHRyYW5zaXRpb25Qcm9wcywge1xuICAgICAgZWFzaW5nOiB0aGVtZS50cmFuc2l0aW9ucy5lYXNpbmcuc2hhcnBcbiAgICB9KSk7XG4gICAgbm9kZS5zdHlsZS50cmFuc2l0aW9uID0gdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCd0cmFuc2Zvcm0nLCBfZXh0ZW5kcyh7fSwgdHJhbnNpdGlvblByb3BzLCB7XG4gICAgICBlYXNpbmc6IHRoZW1lLnRyYW5zaXRpb25zLmVhc2luZy5zaGFycFxuICAgIH0pKTtcbiAgICBzZXRUcmFuc2xhdGVWYWx1ZShkaXJlY3Rpb24sIG5vZGUpO1xuXG4gICAgaWYgKG9uRXhpdCkge1xuICAgICAgb25FeGl0KG5vZGUpO1xuICAgIH1cbiAgfSk7XG4gIHZhciBoYW5kbGVFeGl0ZWQgPSBub3JtYWxpemVkVHJhbnNpdGlvbkNhbGxiYWNrKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgLy8gTm8gbmVlZCBmb3IgdHJhbnNpdGlvbnMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGhpZGRlblxuICAgIG5vZGUuc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9ICcnO1xuICAgIG5vZGUuc3R5bGUudHJhbnNpdGlvbiA9ICcnO1xuXG4gICAgaWYgKG9uRXhpdGVkKSB7XG4gICAgICBvbkV4aXRlZChub2RlKTtcbiAgICB9XG4gIH0pO1xuICB2YXIgdXBkYXRlUG9zaXRpb24gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGNoaWxkcmVuUmVmLmN1cnJlbnQpIHtcbiAgICAgIHNldFRyYW5zbGF0ZVZhbHVlKGRpcmVjdGlvbiwgY2hpbGRyZW5SZWYuY3VycmVudCk7XG4gICAgfVxuICB9LCBbZGlyZWN0aW9uXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gU2tpcCBjb25maWd1cmF0aW9uIHdoZXJlIHRoZSBwb3NpdGlvbiBpcyBzY3JlZW4gc2l6ZSBpbnZhcmlhbnQuXG4gICAgaWYgKGluUHJvcCB8fCBkaXJlY3Rpb24gPT09ICdkb3duJyB8fCBkaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdmFyIGhhbmRsZVJlc2l6ZSA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChjaGlsZHJlblJlZi5jdXJyZW50KSB7XG4gICAgICAgIHNldFRyYW5zbGF0ZVZhbHVlKGRpcmVjdGlvbiwgY2hpbGRyZW5SZWYuY3VycmVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVJlc2l6ZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGhhbmRsZVJlc2l6ZS5jbGVhcigpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZVJlc2l6ZSk7XG4gICAgfTtcbiAgfSwgW2RpcmVjdGlvbiwgaW5Qcm9wXSk7XG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpblByb3ApIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZHJhd2VyIHdoZW4gdGhlIGRpcmVjdGlvbiBjaGFuZ2UgYW5kXG4gICAgICAvLyB3aGVuIGl0J3MgaGlkZGVuLlxuICAgICAgdXBkYXRlUG9zaXRpb24oKTtcbiAgICB9XG4gIH0sIFtpblByb3AsIHVwZGF0ZVBvc2l0aW9uXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgbm9kZVJlZjogY2hpbGRyZW5SZWYsXG4gICAgb25FbnRlcjogaGFuZGxlRW50ZXIsXG4gICAgb25FbnRlcmVkOiBoYW5kbGVFbnRlcmVkLFxuICAgIG9uRW50ZXJpbmc6IGhhbmRsZUVudGVyaW5nLFxuICAgIG9uRXhpdDogaGFuZGxlRXhpdCxcbiAgICBvbkV4aXRlZDogaGFuZGxlRXhpdGVkLFxuICAgIG9uRXhpdGluZzogaGFuZGxlRXhpdGluZyxcbiAgICBhcHBlYXI6IHRydWUsXG4gICAgaW46IGluUHJvcCxcbiAgICB0aW1lb3V0OiB0aW1lb3V0XG4gIH0sIG90aGVyKSwgZnVuY3Rpb24gKHN0YXRlLCBjaGlsZFByb3BzKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIF9leHRlbmRzKHtcbiAgICAgIHJlZjogaGFuZGxlUmVmLFxuICAgICAgc3R5bGU6IF9leHRlbmRzKHtcbiAgICAgICAgdmlzaWJpbGl0eTogc3RhdGUgPT09ICdleGl0ZWQnICYmICFpblByb3AgPyAnaGlkZGVuJyA6IHVuZGVmaW5lZFxuICAgICAgfSwgc3R5bGUsIGNoaWxkcmVuLnByb3BzLnN0eWxlKVxuICAgIH0sIGNoaWxkUHJvcHMpKTtcbiAgfSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFNsaWRlLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEEgc2luZ2xlIGNoaWxkIGNvbnRlbnQgZWxlbWVudC5cbiAgICovXG4gIGNoaWxkcmVuOiBlbGVtZW50QWNjZXB0aW5nUmVmLFxuXG4gIC8qKlxuICAgKiBEaXJlY3Rpb24gdGhlIGNoaWxkIG5vZGUgd2lsbCBlbnRlciBmcm9tLlxuICAgKi9cbiAgZGlyZWN0aW9uOiBQcm9wVHlwZXMub25lT2YoWydkb3duJywgJ2xlZnQnLCAncmlnaHQnLCAndXAnXSksXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgc2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZW50ZXIgb3IgZXhpdCBhbmltYXRpb24uXG4gICAqL1xuICBpbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uRW50ZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkVudGVyZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkVudGVyaW5nOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25FeGl0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25FeGl0ZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkV4aXRpbmc6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzdHlsZTogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogVGhlIGR1cmF0aW9uIGZvciB0aGUgdHJhbnNpdGlvbiwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBZb3UgbWF5IHNwZWNpZnkgYSBzaW5nbGUgdGltZW91dCBmb3IgYWxsIHRyYW5zaXRpb25zLCBvciBpbmRpdmlkdWFsbHkgd2l0aCBhbiBvYmplY3QuXG4gICAqL1xuICB0aW1lb3V0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGFwcGVhcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBlbnRlcjogUHJvcFR5cGVzLm51bWJlcixcbiAgICBleGl0OiBQcm9wVHlwZXMubnVtYmVyXG4gIH0pXSlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCBTbGlkZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfdG9BcnJheSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9BcnJheVwiO1xuaW1wb3J0IF9zbGljZWRUb0FycmF5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9zbGljZWRUb0FycmF5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaXNGcmFnbWVudCB9IGZyb20gJ3JlYWN0LWlzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGNoYWluUHJvcFR5cGVzIH0gZnJvbSAnQG1hdGVyaWFsLXVpL3V0aWxzJztcbmltcG9ydCBDb2xsYXBzZSBmcm9tICcuLi9Db2xsYXBzZSc7XG5pbXBvcnQgUGFwZXIgZnJvbSAnLi4vUGFwZXInO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IEV4cGFuc2lvblBhbmVsQ29udGV4dCBmcm9tICcuL0V4cGFuc2lvblBhbmVsQ29udGV4dCc7XG5pbXBvcnQgdXNlQ29udHJvbGxlZCBmcm9tICcuLi91dGlscy91c2VDb250cm9sbGVkJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHZhciB0cmFuc2l0aW9uID0ge1xuICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydGVzdFxuICB9O1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydtYXJnaW4nXSwgdHJhbnNpdGlvbiksXG4gICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB0b3A6IC0xLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5kaXZpZGVyLFxuICAgICAgICB0cmFuc2l0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5jcmVhdGUoWydvcGFjaXR5JywgJ2JhY2tncm91bmQtY29sb3InXSwgdHJhbnNpdGlvbilcbiAgICAgIH0sXG4gICAgICAnJjpmaXJzdC1jaGlsZCc6IHtcbiAgICAgICAgJyY6YmVmb3JlJzoge1xuICAgICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZXhwYW5kZWQnOiB7XG4gICAgICAgIG1hcmdpbjogJzE2cHggMCcsXG4gICAgICAgICcmOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICAgIG1hcmdpblRvcDogMFxuICAgICAgICB9LFxuICAgICAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICAgIG1hcmdpbkJvdHRvbTogMFxuICAgICAgICB9LFxuICAgICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZXhwYW5kZWQgKyAmJzoge1xuICAgICAgICAnJjpiZWZvcmUnOiB7XG4gICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgc3F1YXJlPXtmYWxzZX1gLiAqL1xuICAgIHJvdW5kZWQ6IHtcbiAgICAgIGJvcmRlclJhZGl1czogMCxcbiAgICAgICcmOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlclRvcFJpZ2h0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXNcbiAgICAgIH0sXG4gICAgICAnJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICBib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiB0aGVtZS5zaGFwZS5ib3JkZXJSYWRpdXMsXG4gICAgICAgIC8vIEZpeCBhIHJlbmRlcmluZyBpc3N1ZSBvbiBFZGdlXG4gICAgICAgICdAc3VwcG9ydHMgKC1tcy1pbWUtYWxpZ246IGF1dG8pJzoge1xuICAgICAgICAgIGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IDAsXG4gICAgICAgICAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBleHBhbmRlZD17dHJ1ZX1gLiAqL1xuICAgIGV4cGFuZGVkOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9XG4gIH07XG59O1xudmFyIHdhcm5lZE9uY2UgPSBmYWxzZTtcbi8qKlxuICog4pqg77iPIFRoZSBFeHBhbnNpb25QYW5lbCBjb21wb25lbnQgd2FzIHJlbmFtZWQgdG8gQWNjb3JkaW9uIHRvIHVzZSBhIG1vcmUgY29tbW9uIG5hbWluZyBjb252ZW50aW9uLlxuICpcbiAqIFlvdSBzaG91bGQgdXNlIGBpbXBvcnQgeyBBY2NvcmRpb24gfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXG4gKiBvciBgaW1wb3J0IEFjY29yZGlvbiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9BY2NvcmRpb24nYC5cbiAqL1xuXG52YXIgRXhwYW5zaW9uUGFuZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBFeHBhbnNpb25QYW5lbChwcm9wcywgcmVmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKCF3YXJuZWRPbmNlKSB7XG4gICAgICB3YXJuZWRPbmNlID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoWydNYXRlcmlhbC1VSTogdGhlIEV4cGFuc2lvblBhbmVsIGNvbXBvbmVudCB3YXMgcmVuYW1lZCB0byBBY2NvcmRpb24gdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uJywgJycsIFwiWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbiB9IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlJ2BcIiwgXCJvciBgaW1wb3J0IEFjY29yZGlvbiBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9BY2NvcmRpb24nYFwiXS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuUHJvcCA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkZGVmYXVsdEV4cGFuZGUgPSBwcm9wcy5kZWZhdWx0RXhwYW5kZWQsXG4gICAgICBkZWZhdWx0RXhwYW5kZWQgPSBfcHJvcHMkZGVmYXVsdEV4cGFuZGUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRlZmF1bHRFeHBhbmRlLFxuICAgICAgX3Byb3BzJGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgICBleHBhbmRlZFByb3AgPSBwcm9wcy5leHBhbmRlZCxcbiAgICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgICBfcHJvcHMkc3F1YXJlID0gcHJvcHMuc3F1YXJlLFxuICAgICAgc3F1YXJlID0gX3Byb3BzJHNxdWFyZSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkc3F1YXJlLFxuICAgICAgX3Byb3BzJFRyYW5zaXRpb25Db21wID0gcHJvcHMuVHJhbnNpdGlvbkNvbXBvbmVudCxcbiAgICAgIFRyYW5zaXRpb25Db21wb25lbnQgPSBfcHJvcHMkVHJhbnNpdGlvbkNvbXAgPT09IHZvaWQgMCA/IENvbGxhcHNlIDogX3Byb3BzJFRyYW5zaXRpb25Db21wLFxuICAgICAgVHJhbnNpdGlvblByb3BzID0gcHJvcHMuVHJhbnNpdGlvblByb3BzLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImRlZmF1bHRFeHBhbmRlZFwiLCBcImRpc2FibGVkXCIsIFwiZXhwYW5kZWRcIiwgXCJvbkNoYW5nZVwiLCBcInNxdWFyZVwiLCBcIlRyYW5zaXRpb25Db21wb25lbnRcIiwgXCJUcmFuc2l0aW9uUHJvcHNcIl0pO1xuXG4gIHZhciBfdXNlQ29udHJvbGxlZCA9IHVzZUNvbnRyb2xsZWQoe1xuICAgIGNvbnRyb2xsZWQ6IGV4cGFuZGVkUHJvcCxcbiAgICBkZWZhdWx0OiBkZWZhdWx0RXhwYW5kZWQsXG4gICAgbmFtZTogJ0V4cGFuc2lvblBhbmVsJyxcbiAgICBzdGF0ZTogJ2V4cGFuZGVkJ1xuICB9KSxcbiAgICAgIF91c2VDb250cm9sbGVkMiA9IF9zbGljZWRUb0FycmF5KF91c2VDb250cm9sbGVkLCAyKSxcbiAgICAgIGV4cGFuZGVkID0gX3VzZUNvbnRyb2xsZWQyWzBdLFxuICAgICAgc2V0RXhwYW5kZWRTdGF0ZSA9IF91c2VDb250cm9sbGVkMlsxXTtcblxuICB2YXIgaGFuZGxlQ2hhbmdlID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgc2V0RXhwYW5kZWRTdGF0ZSghZXhwYW5kZWQpO1xuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICBvbkNoYW5nZShldmVudCwgIWV4cGFuZGVkKTtcbiAgICB9XG4gIH0sIFtleHBhbmRlZCwgb25DaGFuZ2UsIHNldEV4cGFuZGVkU3RhdGVdKTtcblxuICB2YXIgX1JlYWN0JENoaWxkcmVuJHRvQXJyID0gUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlblByb3ApLFxuICAgICAgX1JlYWN0JENoaWxkcmVuJHRvQXJyMiA9IF90b0FycmF5KF9SZWFjdCRDaGlsZHJlbiR0b0FyciksXG4gICAgICBzdW1tYXJ5ID0gX1JlYWN0JENoaWxkcmVuJHRvQXJyMlswXSxcbiAgICAgIGNoaWxkcmVuID0gX1JlYWN0JENoaWxkcmVuJHRvQXJyMi5zbGljZSgxKTtcblxuICB2YXIgY29udGV4dFZhbHVlID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgIHRvZ2dsZTogaGFuZGxlQ2hhbmdlXG4gICAgfTtcbiAgfSwgW2V4cGFuZGVkLCBkaXNhYmxlZCwgaGFuZGxlQ2hhbmdlXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQYXBlciwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgZXhwYW5kZWQgJiYgY2xhc3Nlcy5leHBhbmRlZCwgZGlzYWJsZWQgJiYgY2xhc3Nlcy5kaXNhYmxlZCwgIXNxdWFyZSAmJiBjbGFzc2VzLnJvdW5kZWQpLFxuICAgIHJlZjogcmVmLFxuICAgIHNxdWFyZTogc3F1YXJlXG4gIH0sIG90aGVyKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXhwYW5zaW9uUGFuZWxDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IGNvbnRleHRWYWx1ZVxuICB9LCBzdW1tYXJ5KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbkNvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGluOiBleHBhbmRlZCxcbiAgICB0aW1lb3V0OiBcImF1dG9cIlxuICB9LCBUcmFuc2l0aW9uUHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgXCJhcmlhLWxhYmVsbGVkYnlcIjogc3VtbWFyeS5wcm9wcy5pZCxcbiAgICBpZDogc3VtbWFyeS5wcm9wc1snYXJpYS1jb250cm9scyddLFxuICAgIHJvbGU6IFwicmVnaW9uXCJcbiAgfSwgY2hpbGRyZW4pKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEV4cGFuc2lvblBhbmVsLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBleHBhbnNpb24gcGFuZWwuXG4gICAqL1xuICBjaGlsZHJlbjogY2hhaW5Qcm9wVHlwZXMoUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCwgZnVuY3Rpb24gKHByb3BzKSB7XG4gICAgdmFyIHN1bW1hcnkgPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KHByb3BzLmNoaWxkcmVuKVswXTtcblxuICAgIGlmIChpc0ZyYWdtZW50KHN1bW1hcnkpKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKFwiTWF0ZXJpYWwtVUk6IFRoZSBFeHBhbnNpb25QYW5lbCBkb2Vzbid0IGFjY2VwdCBhIEZyYWdtZW50IGFzIGEgY2hpbGQuIFwiICsgJ0NvbnNpZGVyIHByb3ZpZGluZyBhbiBhcnJheSBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGlmICghIC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudChzdW1tYXJ5KSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignTWF0ZXJpYWwtVUk6IEV4cGVjdGVkIHRoZSBmaXJzdCBjaGlsZCBvZiBFeHBhbnNpb25QYW5lbCB0byBiZSBhIHZhbGlkIGVsZW1lbnQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBleHBhbmRzIHRoZSBwYW5lbCBieSBkZWZhdWx0LlxuICAgKi9cbiAgZGVmYXVsdEV4cGFuZGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgcGFuZWwgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gYSBkaXNhYmxlZCBzdGF0ZS5cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBleHBhbmRzIHRoZSBwYW5lbCwgb3RoZXJ3aXNlIGNvbGxhcHNlIGl0LlxuICAgKiBTZXR0aW5nIHRoaXMgcHJvcCBlbmFibGVzIGNvbnRyb2wgb3ZlciB0aGUgcGFuZWwuXG4gICAqL1xuICBleHBhbmRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIGV4cGFuZC9jb2xsYXBzZSBzdGF0ZSBpcyBjaGFuZ2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHNvdXJjZSBvZiB0aGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXhwYW5kZWQgVGhlIGBleHBhbmRlZGAgc3RhdGUgb2YgdGhlIHBhbmVsLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJvdW5kZWQgY29ybmVycyBhcmUgZGlzYWJsZWQuXG4gICAqL1xuICBzcXVhcmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSBjb2xsYXBzZSBlZmZlY3QuXG4gICAqIFtGb2xsb3cgdGhpcyBndWlkZV0oL2NvbXBvbmVudHMvdHJhbnNpdGlvbnMvI3RyYW5zaXRpb25jb21wb25lbnQtcHJvcCkgdG8gbGVhcm4gbW9yZSBhYm91dCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIFRyYW5zaXRpb25Db21wb25lbnQ6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogUHJvcHMgYXBwbGllZCB0byB0aGUgW2BUcmFuc2l0aW9uYF0oaHR0cDovL3JlYWN0Y29tbXVuaXR5Lm9yZy9yZWFjdC10cmFuc2l0aW9uLWdyb3VwL3RyYW5zaXRpb24jVHJhbnNpdGlvbi1wcm9wcykgZWxlbWVudC5cbiAgICovXG4gIFRyYW5zaXRpb25Qcm9wczogUHJvcFR5cGVzLm9iamVjdFxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlFeHBhbnNpb25QYW5lbCdcbn0pKEV4cGFuc2lvblBhbmVsKTsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEBpZ25vcmUgLSBpbnRlcm5hbCBjb21wb25lbnQuXG4gKiBAdHlwZSB7UmVhY3QuQ29udGV4dDx7fSB8IHtleHBhbmRlZDogYm9vbGVhbiwgZGlzYWJsZWQ6IGJvb2xlYW4sIHRvZ2dsZTogKCkgPT4gdm9pZH0+fVxuICovXG5cbnZhciBFeHBhbnNpb25QYW5lbENvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7fSk7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEV4cGFuc2lvblBhbmVsQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdFeHBhbnNpb25QYW5lbENvbnRleHQnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBFeHBhbnNpb25QYW5lbENvbnRleHQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgcGFkZGluZzogOCxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJ1xuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVTcGFjaW5nPXtmYWxzZX1gLiAqL1xuICBzcGFjaW5nOiB7XG4gICAgJyYgPiA6bm90KDpmaXJzdC1jaGlsZCknOiB7XG4gICAgICBtYXJnaW5MZWZ0OiA4XG4gICAgfVxuICB9XG59O1xudmFyIHdhcm5lZE9uY2UgPSBmYWxzZTtcbi8qKlxuICog4pqg77iPIFRoZSBFeHBhbnNpb25QYW5lbEFjdGlvbnMgY29tcG9uZW50IHdhcyByZW5hbWVkIHRvIEFjY29yZGlvbkFjdGlvbnMgdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uXG4gKlxuICogWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbkFjdGlvbnMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXG4gKiBvciBgaW1wb3J0IEFjY29yZGlvbkFjdGlvbnMgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvQWNjb3JkaW9uQWN0aW9ucydgLlxuICovXG5cbnZhciBFeHBhbnNpb25QYW5lbEFjdGlvbnMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBFeHBhbnNpb25QYW5lbEFjdGlvbnMocHJvcHMsIHJlZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICghd2FybmVkT25jZSkge1xuICAgICAgd2FybmVkT25jZSA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKFsnTWF0ZXJpYWwtVUk6IHRoZSBFeHBhbnNpb25QYW5lbEFjdGlvbnMgY29tcG9uZW50IHdhcyByZW5hbWVkIHRvIEFjY29yZGlvbkFjdGlvbnMgdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uJywgJycsIFwiWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbkFjdGlvbnMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXCIsIFwib3IgYGltcG9ydCBBY2NvcmRpb25BY3Rpb25zIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0FjY29yZGlvbkFjdGlvbnMnYFwiXS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJGRpc2FibGVTcGFjaW5nID0gcHJvcHMuZGlzYWJsZVNwYWNpbmcsXG4gICAgICBkaXNhYmxlU3BhY2luZyA9IF9wcm9wcyRkaXNhYmxlU3BhY2luZyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZVNwYWNpbmcsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImRpc2FibGVTcGFjaW5nXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgIWRpc2FibGVTcGFjaW5nICYmIGNsYXNzZXMuc3BhY2luZyksXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRXhwYW5zaW9uUGFuZWxBY3Rpb25zLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBjb21wb25lbnQuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBhY3Rpb25zIGRvIG5vdCBoYXZlIGFkZGl0aW9uYWwgbWFyZ2luLlxuICAgKi9cbiAgZGlzYWJsZVNwYWNpbmc6IFByb3BUeXBlcy5ib29sXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUV4cGFuc2lvblBhbmVsQWN0aW9ucydcbn0pKEV4cGFuc2lvblBhbmVsQWN0aW9ucyk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIHBhZGRpbmc6IHRoZW1lLnNwYWNpbmcoMSwgMiwgMilcbiAgICB9XG4gIH07XG59O1xudmFyIHdhcm5lZE9uY2UgPSBmYWxzZTtcbi8qKlxuICog4pqg77iPIFRoZSBFeHBhbnNpb25QYW5lbERldGFpbHMgY29tcG9uZW50IHdhcyByZW5hbWVkIHRvIEFjY29yZGlvbkRldGFpbHMgdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uXG4gKlxuICogWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbkRldGFpbHMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXG4gKiBvciBgaW1wb3J0IEFjY29yZGlvbkRldGFpbHMgZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUvQWNjb3JkaW9uRGV0YWlscydgLlxuICovXG5cbnZhciBFeHBhbnNpb25QYW5lbERldGFpbHMgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBFeHBhbnNpb25QYW5lbERldGFpbHMocHJvcHMsIHJlZikge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICghd2FybmVkT25jZSkge1xuICAgICAgd2FybmVkT25jZSA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKFsnTWF0ZXJpYWwtVUk6IHRoZSBFeHBhbnNpb25QYW5lbERldGFpbHMgY29tcG9uZW50IHdhcyByZW5hbWVkIHRvIEFjY29yZGlvbkRldGFpbHMgdG8gdXNlIGEgbW9yZSBjb21tb24gbmFtaW5nIGNvbnZlbnRpb24uJywgJycsIFwiWW91IHNob3VsZCB1c2UgYGltcG9ydCB7IEFjY29yZGlvbkRldGFpbHMgfSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZSdgXCIsIFwib3IgYGltcG9ydCBBY2NvcmRpb25EZXRhaWxzIGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0FjY29yZGlvbkFjdGlvbnMnYFwiXS5qb2luKCdcXG4nKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBFeHBhbnNpb25QYW5lbERldGFpbHMucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGV4cGFuc2lvbiBwYW5lbCBkZXRhaWxzLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlFeHBhbnNpb25QYW5lbERldGFpbHMnXG59KShFeHBhbnNpb25QYW5lbERldGFpbHMpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcblxuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvYXJpYS1yb2xlICovXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmltcG9ydCBJY29uQnV0dG9uIGZyb20gJy4uL0ljb25CdXR0b24nO1xuaW1wb3J0IHdpdGhTdHlsZXMgZnJvbSAnLi4vc3R5bGVzL3dpdGhTdHlsZXMnO1xuaW1wb3J0IEV4cGFuc2lvblBhbmVsQ29udGV4dCBmcm9tICcuLi9FeHBhbnNpb25QYW5lbC9FeHBhbnNpb25QYW5lbENvbnRleHQnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgdmFyIHRyYW5zaXRpb24gPSB7XG4gICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0ZXN0XG4gIH07XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBtaW5IZWlnaHQ6IDggKiA2LFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFsnbWluLWhlaWdodCcsICdiYWNrZ3JvdW5kLWNvbG9yJ10sIHRyYW5zaXRpb24pLFxuICAgICAgcGFkZGluZzogdGhlbWUuc3BhY2luZygwLCAyKSxcbiAgICAgICcmOmhvdmVyOm5vdCgkZGlzYWJsZWQpJzoge1xuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgfSxcbiAgICAgICcmJGV4cGFuZGVkJzoge1xuICAgICAgICBtaW5IZWlnaHQ6IDY0XG4gICAgICB9LFxuICAgICAgJyYkZm9jdXNlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5mb2N1c1xuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBvcGFjaXR5OiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZE9wYWNpdHlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCwgY2hpbGRyZW4gd3JhcHBlciBlbGVtZW50IGFuZCBgSWNvbkJ1dHRvbmAgY29tcG9uZW50IGlmIGBleHBhbmRlZD17dHJ1ZX1gLiAqL1xuICAgIGV4cGFuZGVkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGZvY3VzZWQ9e3RydWV9YC4gKi9cbiAgICBmb2N1c2VkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNoaWxkcmVuIHdyYXBwZXIgZWxlbWVudC4gKi9cbiAgICBjb250ZW50OiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4R3JvdzogMSxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZShbJ21hcmdpbiddLCB0cmFuc2l0aW9uKSxcbiAgICAgIG1hcmdpbjogJzEycHggMCcsXG4gICAgICAnJiRleHBhbmRlZCc6IHtcbiAgICAgICAgbWFyZ2luOiAnMjBweCAwJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYEljb25CdXR0b25gIGNvbXBvbmVudCB3aGVuIGBleHBhbmRJY29uYCBpcyBzdXBwbGllZC4gKi9cbiAgICBleHBhbmRJY29uOiB7XG4gICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoMGRlZyknLFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCd0cmFuc2Zvcm0nLCB0cmFuc2l0aW9uKSxcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBob3ZlciBlZmZlY3QgZm9yIHRoZSBJY29uQnV0dG9uLFxuICAgICAgICAvLyBiZWNhdXNlIGEgaG92ZXIgZWZmZWN0IHNob3VsZCBhcHBseSB0byB0aGUgZW50aXJlIEV4cGFuZCBidXR0b24gYW5kXG4gICAgICAgIC8vIG5vdCBvbmx5IHRvIHRoZSBJY29uQnV0dG9uLlxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgIH0sXG4gICAgICAnJiRleHBhbmRlZCc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDE4MGRlZyknXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciB3YXJuZWRPbmNlID0gZmFsc2U7XG4vKipcbiAqIOKaoO+4jyBUaGUgRXhwYW5zaW9uUGFuZWxTdW1tYXJ5IGNvbXBvbmVudCB3YXMgcmVuYW1lZCB0byBBY2NvcmRpb25TdW1tYXJ5IHRvIHVzZSBhIG1vcmUgY29tbW9uIG5hbWluZyBjb252ZW50aW9uLlxuICpcbiAqIFlvdSBzaG91bGQgdXNlIGBpbXBvcnQgeyBBY2NvcmRpb25TdW1tYXJ5IH0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUnYFxuICogb3IgYGltcG9ydCBBY2NvcmRpb25TdW1tYXJ5IGZyb20gJ0BtYXRlcmlhbC11aS9jb3JlL0FjY29yZGlvblN1bW1hcnknYC5cbiAqL1xuXG52YXIgRXhwYW5zaW9uUGFuZWxTdW1tYXJ5ID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gRXhwYW5zaW9uUGFuZWxTdW1tYXJ5KHByb3BzLCByZWYpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoIXdhcm5lZE9uY2UpIHtcbiAgICAgIHdhcm5lZE9uY2UgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcihbJ01hdGVyaWFsLVVJOiB0aGUgRXhwYW5zaW9uUGFuZWxTdW1tYXJ5IGNvbXBvbmVudCB3YXMgcmVuYW1lZCB0byBBY2NvcmRpb25TdW1tYXJ5IHRvIHVzZSBhIG1vcmUgY29tbW9uIG5hbWluZyBjb252ZW50aW9uLicsICcnLCBcIllvdSBzaG91bGQgdXNlIGBpbXBvcnQgeyBBY2NvcmRpb25TdW1tYXJ5IH0gZnJvbSAnQG1hdGVyaWFsLXVpL2NvcmUnYFwiLCBcIm9yIGBpbXBvcnQgQWNjb3JkaW9uU3VtbWFyeSBmcm9tICdAbWF0ZXJpYWwtdWkvY29yZS9BY2NvcmRpb25TdW1tYXJ5J2BcIl0uam9pbignXFxuJykpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBleHBhbmRJY29uID0gcHJvcHMuZXhwYW5kSWNvbixcbiAgICAgIEljb25CdXR0b25Qcm9wcyA9IHByb3BzLkljb25CdXR0b25Qcm9wcyxcbiAgICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICAgIG9uQ2xpY2sgPSBwcm9wcy5vbkNsaWNrLFxuICAgICAgb25Gb2N1c1Zpc2libGUgPSBwcm9wcy5vbkZvY3VzVmlzaWJsZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJleHBhbmRJY29uXCIsIFwiSWNvbkJ1dHRvblByb3BzXCIsIFwib25CbHVyXCIsIFwib25DbGlja1wiLCBcIm9uRm9jdXNWaXNpYmxlXCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgZm9jdXNlZFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgICAgc2V0Rm9jdXNlZFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciBoYW5kbGVGb2N1c1Zpc2libGUgPSBmdW5jdGlvbiBoYW5kbGVGb2N1c1Zpc2libGUoZXZlbnQpIHtcbiAgICBzZXRGb2N1c2VkU3RhdGUodHJ1ZSk7XG5cbiAgICBpZiAob25Gb2N1c1Zpc2libGUpIHtcbiAgICAgIG9uRm9jdXNWaXNpYmxlKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGhhbmRsZUJsdXIgPSBmdW5jdGlvbiBoYW5kbGVCbHVyKGV2ZW50KSB7XG4gICAgc2V0Rm9jdXNlZFN0YXRlKGZhbHNlKTtcblxuICAgIGlmIChvbkJsdXIpIHtcbiAgICAgIG9uQmx1cihldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBfUmVhY3QkdXNlQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRXhwYW5zaW9uUGFuZWxDb250ZXh0KSxcbiAgICAgIF9SZWFjdCR1c2VDb250ZXh0JGRpcyA9IF9SZWFjdCR1c2VDb250ZXh0LmRpc2FibGVkLFxuICAgICAgZGlzYWJsZWQgPSBfUmVhY3QkdXNlQ29udGV4dCRkaXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX1JlYWN0JHVzZUNvbnRleHQkZGlzLFxuICAgICAgZXhwYW5kZWQgPSBfUmVhY3QkdXNlQ29udGV4dC5leHBhbmRlZCxcbiAgICAgIHRvZ2dsZSA9IF9SZWFjdCR1c2VDb250ZXh0LnRvZ2dsZTtcblxuICB2YXIgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgaWYgKHRvZ2dsZSkge1xuICAgICAgdG9nZ2xlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b25CYXNlLCBfZXh0ZW5kcyh7XG4gICAgZm9jdXNSaXBwbGU6IGZhbHNlLFxuICAgIGRpc2FibGVSaXBwbGU6IHRydWUsXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgIGNvbXBvbmVudDogXCJkaXZcIixcbiAgICBcImFyaWEtZXhwYW5kZWRcIjogZXhwYW5kZWQsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCBkaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkLCBleHBhbmRlZCAmJiBjbGFzc2VzLmV4cGFuZGVkLCBmb2N1c2VkU3RhdGUgJiYgY2xhc3Nlcy5mb2N1c2VkKSxcbiAgICBvbkZvY3VzVmlzaWJsZTogaGFuZGxlRm9jdXNWaXNpYmxlLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICBvbkNsaWNrOiBoYW5kbGVDaGFuZ2UsXG4gICAgcmVmOiByZWZcbiAgfSwgb3RoZXIpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuY29udGVudCwgZXhwYW5kZWQgJiYgY2xhc3Nlcy5leHBhbmRlZClcbiAgfSwgY2hpbGRyZW4pLCBleHBhbmRJY29uICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb25CdXR0b24sIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5leHBhbmRJY29uLCBleHBhbmRlZCAmJiBjbGFzc2VzLmV4cGFuZGVkKSxcbiAgICBlZGdlOiBcImVuZFwiLFxuICAgIGNvbXBvbmVudDogXCJkaXZcIixcbiAgICB0YWJJbmRleDogbnVsbCxcbiAgICByb2xlOiBudWxsLFxuICAgIFwiYXJpYS1oaWRkZW5cIjogdHJ1ZVxuICB9LCBJY29uQnV0dG9uUHJvcHMpLCBleHBhbmRJY29uKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEV4cGFuc2lvblBhbmVsU3VtbWFyeS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgZXhwYW5zaW9uIHBhbmVsIHN1bW1hcnkuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgaWNvbiB0byBkaXNwbGF5IGFzIHRoZSBleHBhbmQgaW5kaWNhdG9yLlxuICAgKi9cbiAgZXhwYW5kSWNvbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIFByb3BzIGFwcGxpZWQgdG8gdGhlIGBJY29uQnV0dG9uYCBlbGVtZW50IHdyYXBwaW5nIHRoZSBleHBhbmQgaWNvbi5cbiAgICovXG4gIEljb25CdXR0b25Qcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBmb2N1c2VkIHdpdGggYSBrZXlib2FyZC5cbiAgICogV2UgdHJpZ2dlciBhIGBvbkZvY3VzYCBjYWxsYmFjayB0b28uXG4gICAqL1xuICBvbkZvY3VzVmlzaWJsZTogUHJvcFR5cGVzLmZ1bmNcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpRXhwYW5zaW9uUGFuZWxTdW1tYXJ5J1xufSkoRXhwYW5zaW9uUGFuZWxTdW1tYXJ5KTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgQnV0dG9uQmFzZSBmcm9tICcuLi9CdXR0b25CYXNlJztcbmltcG9ydCBjYXBpdGFsaXplIGZyb20gJy4uL3V0aWxzL2NhcGl0YWxpemUnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSBmdW5jdGlvbiBzdHlsZXModGhlbWUpIHtcbiAgcmV0dXJuIHtcbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICAgIHJvb3Q6IF9leHRlbmRzKHt9LCB0aGVtZS50eXBvZ3JhcGh5LmJ1dHRvbiwge1xuICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICBtaW5IZWlnaHQ6IDM2LFxuICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKFsnYmFja2dyb3VuZC1jb2xvcicsICdib3gtc2hhZG93JywgJ2JvcmRlciddLCB7XG4gICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydFxuICAgICAgfSksXG4gICAgICBib3JkZXJSYWRpdXM6ICc1MCUnLFxuICAgICAgcGFkZGluZzogMCxcbiAgICAgIG1pbldpZHRoOiAwLFxuICAgICAgd2lkdGg6IDU2LFxuICAgICAgaGVpZ2h0OiA1NixcbiAgICAgIGJveFNoYWRvdzogdGhlbWUuc2hhZG93c1s2XSxcbiAgICAgICcmOmFjdGl2ZSc6IHtcbiAgICAgICAgYm94U2hhZG93OiB0aGVtZS5zaGFkb3dzWzEyXVxuICAgICAgfSxcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLmdldENvbnRyYXN0VGV4dCh0aGVtZS5wYWxldHRlLmdyZXlbMzAwXSksXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuZ3JleVszMDBdLFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5ncmV5LkExMDAsXG4gICAgICAgIC8vIFJlc2V0IG9uIHRvdWNoIGRldmljZXMsIGl0IGRvZXNuJ3QgYWRkIHNwZWNpZmljaXR5XG4gICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuZ3JleVszMDBdXG4gICAgICAgIH0sXG4gICAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWRCYWNrZ3JvdW5kXG4gICAgICAgIH0sXG4gICAgICAgIHRleHREZWNvcmF0aW9uOiAnbm9uZSdcbiAgICAgIH0sXG4gICAgICAnJiRmb2N1c1Zpc2libGUnOiB7XG4gICAgICAgIGJveFNoYWRvdzogdGhlbWUuc2hhZG93c1s2XVxuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5hY3Rpb24uZGlzYWJsZWQsXG4gICAgICAgIGJveFNoYWRvdzogdGhlbWUuc2hhZG93c1swXSxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLmFjdGlvbi5kaXNhYmxlZEJhY2tncm91bmRcbiAgICAgIH1cbiAgICB9KSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBzcGFuIGVsZW1lbnQgdGhhdCB3cmFwcyB0aGUgY2hpbGRyZW4uICovXG4gICAgbGFiZWw6IHtcbiAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAvLyBhc3N1cmUgdGhlIGNvcnJlY3Qgd2lkdGggZm9yIGlPUyBTYWZhcmlcbiAgICAgIGRpc3BsYXk6ICdpbmhlcml0JyxcbiAgICAgIGFsaWduSXRlbXM6ICdpbmhlcml0JyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnaW5oZXJpdCdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgY29sb3I9XCJwcmltYXJ5XCJgLiAqL1xuICAgIHByaW1hcnk6IHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkuY29udHJhc3RUZXh0LFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5kYXJrLFxuICAgICAgICAvLyBSZXNldCBvbiB0b3VjaCBkZXZpY2VzLCBpdCBkb2Vzbid0IGFkZCBzcGVjaWZpY2l0eVxuICAgICAgICAnQG1lZGlhIChob3Zlcjogbm9uZSknOiB7XG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGNvbG9yPVwic2Vjb25kYXJ5XCJgLiAqL1xuICAgIHNlY29uZGFyeToge1xuICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmNvbnRyYXN0VGV4dCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpbixcbiAgICAgICcmOmhvdmVyJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5LmRhcmssXG4gICAgICAgIC8vIFJlc2V0IG9uIHRvdWNoIGRldmljZXMsIGl0IGRvZXNuJ3QgYWRkIHNwZWNpZmljaXR5XG4gICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLnBhbGV0dGUuc2Vjb25kYXJ5Lm1haW5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiZXh0ZW5kZWRcImAuICovXG4gICAgZXh0ZW5kZWQ6IHtcbiAgICAgIGJvcmRlclJhZGl1czogNDggLyAyLFxuICAgICAgcGFkZGluZzogJzAgMTZweCcsXG4gICAgICB3aWR0aDogJ2F1dG8nLFxuICAgICAgbWluSGVpZ2h0OiAnYXV0bycsXG4gICAgICBtaW5XaWR0aDogNDgsXG4gICAgICBoZWlnaHQ6IDQ4LFxuICAgICAgJyYkc2l6ZVNtYWxsJzoge1xuICAgICAgICB3aWR0aDogJ2F1dG8nLFxuICAgICAgICBwYWRkaW5nOiAnMCA4cHgnLFxuICAgICAgICBib3JkZXJSYWRpdXM6IDM0IC8gMixcbiAgICAgICAgbWluV2lkdGg6IDM0LFxuICAgICAgICBoZWlnaHQ6IDM0XG4gICAgICB9LFxuICAgICAgJyYkc2l6ZU1lZGl1bSc6IHtcbiAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgcGFkZGluZzogJzAgMTZweCcsXG4gICAgICAgIGJvcmRlclJhZGl1czogNDAgLyAyLFxuICAgICAgICBtaW5XaWR0aDogNDAsXG4gICAgICAgIGhlaWdodDogNDBcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIEJ1dHRvbkJhc2Ugcm9vdCBlbGVtZW50IGlmIHRoZSBidXR0b24gaXMga2V5Ym9hcmQgZm9jdXNlZC4gKi9cbiAgICBmb2N1c1Zpc2libGU6IHt9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBjb2xvcj1cImluaGVyaXRcImAuICovXG4gICAgY29sb3JJbmhlcml0OiB7XG4gICAgICBjb2xvcjogJ2luaGVyaXQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHNpemU9XCJzbWFsbFwiYGAuICovXG4gICAgc2l6ZVNtYWxsOiB7XG4gICAgICB3aWR0aDogNDAsXG4gICAgICBoZWlnaHQ6IDQwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHNpemU9XCJtZWRpdW1cImBgLiAqL1xuICAgIHNpemVNZWRpdW06IHtcbiAgICAgIHdpZHRoOiA0OCxcbiAgICAgIGhlaWdodDogNDhcbiAgICB9XG4gIH07XG59O1xudmFyIEZhYiA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZhYihwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbG9yID0gX3Byb3BzJGNvbG9yID09PSB2b2lkIDAgPyAnZGVmYXVsdCcgOiBfcHJvcHMkY29sb3IsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgY29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2J1dHRvbicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgX3Byb3BzJGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgICBfcHJvcHMkZGlzYWJsZUZvY3VzUmkgPSBwcm9wcy5kaXNhYmxlRm9jdXNSaXBwbGUsXG4gICAgICBkaXNhYmxlRm9jdXNSaXBwbGUgPSBfcHJvcHMkZGlzYWJsZUZvY3VzUmkgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJGRpc2FibGVGb2N1c1JpLFxuICAgICAgZm9jdXNWaXNpYmxlQ2xhc3NOYW1lID0gcHJvcHMuZm9jdXNWaXNpYmxlQ2xhc3NOYW1lLFxuICAgICAgX3Byb3BzJHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc2l6ZSA9IF9wcm9wcyRzaXplID09PSB2b2lkIDAgPyAnbGFyZ2UnIDogX3Byb3BzJHNpemUsXG4gICAgICBfcHJvcHMkdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICB2YXJpYW50ID0gX3Byb3BzJHZhcmlhbnQgPT09IHZvaWQgMCA/ICdyb3VuZCcgOiBfcHJvcHMkdmFyaWFudCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNvbXBvbmVudFwiLCBcImRpc2FibGVkXCIsIFwiZGlzYWJsZUZvY3VzUmlwcGxlXCIsIFwiZm9jdXNWaXNpYmxlQ2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChCdXR0b25CYXNlLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCB2YXJpYW50ICE9PSBcInJvdW5kXCIgJiYgY2xhc3Nlcy5leHRlbmRlZCwgc2l6ZSAhPT0gJ2xhcmdlJyAmJiBjbGFzc2VzW1wic2l6ZVwiLmNvbmNhdChjYXBpdGFsaXplKHNpemUpKV0sIGRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQsIHtcbiAgICAgICdwcmltYXJ5JzogY2xhc3Nlcy5wcmltYXJ5LFxuICAgICAgJ3NlY29uZGFyeSc6IGNsYXNzZXMuc2Vjb25kYXJ5LFxuICAgICAgJ2luaGVyaXQnOiBjbGFzc2VzLmNvbG9ySW5oZXJpdFxuICAgIH1bY29sb3JdKSxcbiAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgZm9jdXNSaXBwbGU6ICFkaXNhYmxlRm9jdXNSaXBwbGUsXG4gICAgZm9jdXNWaXNpYmxlQ2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMuZm9jdXNWaXNpYmxlLCBmb2N1c1Zpc2libGVDbGFzc05hbWUpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMubGFiZWxcbiAgfSwgY2hpbGRyZW4pKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRmFiLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50IG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLm5vZGUuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydkZWZhdWx0JywgJ2luaGVyaXQnLCAncHJpbWFyeScsICdzZWNvbmRhcnknXSksXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIHJvb3Qgbm9kZS5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudDogUHJvcFR5cGVzXG4gIC8qIEB0eXBlc2NyaXB0LXRvLXByb3B0eXBlcy1pZ25vcmUgKi9cbiAgLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBidXR0b24gd2lsbCBiZSBkaXNhYmxlZC5cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgIGtleWJvYXJkIGZvY3VzIHJpcHBsZSB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZUZvY3VzUmlwcGxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgcmlwcGxlIGVmZmVjdCB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZVJpcHBsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGZvY3VzVmlzaWJsZUNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIFVSTCB0byBsaW5rIHRvIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKiBJZiBkZWZpbmVkLCBhbiBgYWAgZWxlbWVudCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJvb3Qgbm9kZS5cbiAgICovXG4gIGhyZWY6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBidXR0b24uXG4gICAqIGBzbWFsbGAgaXMgZXF1aXZhbGVudCB0byB0aGUgZGVuc2UgYnV0dG9uIHN0eWxpbmcuXG4gICAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoWydsYXJnZScsICdtZWRpdW0nLCAnc21hbGwnXSksXG5cbiAgLyoqXG4gICAqIFRoZSB2YXJpYW50IHRvIHVzZS5cbiAgICovXG4gIHZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2V4dGVuZGVkJywgJ3JvdW5kJ10pXG59IDogdm9pZCAwO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUZhYidcbn0pKEZhYik7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgcmVmVHlwZSB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5pbXBvcnQgSW5wdXRCYXNlIGZyb20gJy4uL0lucHV0QmFzZSc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICB2YXIgbGlnaHQgPSB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCc7XG4gIHZhciBib3R0b21MaW5lQ29sb3IgPSBsaWdodCA/ICdyZ2JhKDAsIDAsIDAsIDAuNDIpJyA6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyknO1xuICB2YXIgYmFja2dyb3VuZENvbG9yID0gbGlnaHQgPyAncmdiYSgwLCAwLCAwLCAwLjA5KScgOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA5KSc7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogYmFja2dyb3VuZENvbG9yLFxuICAgICAgYm9yZGVyVG9wTGVmdFJhZGl1czogdGhlbWUuc2hhcGUuYm9yZGVyUmFkaXVzLFxuICAgICAgYm9yZGVyVG9wUmlnaHRSYWRpdXM6IHRoZW1lLnNoYXBlLmJvcmRlclJhZGl1cyxcbiAgICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgnYmFja2dyb3VuZC1jb2xvcicsIHtcbiAgICAgICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0ZXIsXG4gICAgICAgIGVhc2luZzogdGhlbWUudHJhbnNpdGlvbnMuZWFzaW5nLmVhc2VPdXRcbiAgICAgIH0pLFxuICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogbGlnaHQgPyAncmdiYSgwLCAwLCAwLCAwLjEzKScgOiAncmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEzKScsXG4gICAgICAgIC8vIFJlc2V0IG9uIHRvdWNoIGRldmljZXMsIGl0IGRvZXNuJ3QgYWRkIHNwZWNpZmljaXR5XG4gICAgICAgICdAbWVkaWEgKGhvdmVyOiBub25lKSc6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJhY2tncm91bmRDb2xvclxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYkZm9jdXNlZCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBsaWdodCA/ICdyZ2JhKDAsIDAsIDAsIDAuMDkpJyA6ICdyZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDkpJ1xuICAgICAgfSxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGxpZ2h0ID8gJ3JnYmEoMCwgMCwgMCwgMC4xMiknIDogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMiknXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgY29sb3Igc2Vjb25kYXJ5LiAqL1xuICAgIGNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICAnJiR1bmRlcmxpbmU6YWZ0ZXInOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbUNvbG9yOiB0aGVtZS5wYWxldHRlLnNlY29uZGFyeS5tYWluXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVVbmRlcmxpbmU9e2ZhbHNlfWAuICovXG4gICAgdW5kZXJsaW5lOiB7XG4gICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tOiBcIjJweCBzb2xpZCBcIi5jb25jYXQodGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4pLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICBib3R0b206IDAsXG4gICAgICAgIC8vIERvaW5nIHRoZSBvdGhlciB3YXkgYXJvdW5kIGNyYXNoIG9uIElFIDExIFwiJydcIiBodHRwczovL2dpdGh1Yi5jb20vY3NzaW5qcy9qc3MvaXNzdWVzLzI0MlxuICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGVYKDApJyxcbiAgICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCd0cmFuc2Zvcm0nLCB7XG4gICAgICAgICAgZHVyYXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmR1cmF0aW9uLnNob3J0ZXIsXG4gICAgICAgICAgZWFzaW5nOiB0aGVtZS50cmFuc2l0aW9ucy5lYXNpbmcuZWFzZU91dFxuICAgICAgICB9KSxcbiAgICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnIC8vIFRyYW5zcGFyZW50IHRvIHRoZSBob3ZlciBzdHlsZS5cblxuICAgICAgfSxcbiAgICAgICcmJGZvY3VzZWQ6YWZ0ZXInOiB7XG4gICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgxKSdcbiAgICAgIH0sXG4gICAgICAnJiRlcnJvcjphZnRlcic6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tQ29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpbixcbiAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyAvLyBlcnJvciBpcyBhbHdheXMgdW5kZXJsaW5lZCBpbiByZWRcblxuICAgICAgfSxcbiAgICAgICcmOmJlZm9yZSc6IHtcbiAgICAgICAgYm9yZGVyQm90dG9tOiBcIjFweCBzb2xpZCBcIi5jb25jYXQoYm90dG9tTGluZUNvbG9yKSxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAvLyBEb2luZyB0aGUgb3RoZXIgd2F5IGFyb3VuZCBjcmFzaCBvbiBJRSAxMSBcIicnXCIgaHR0cHM6Ly9naXRodWIuY29tL2Nzc2luanMvanNzL2lzc3Vlcy8yNDJcbiAgICAgICAgY29udGVudDogJ1wiXFxcXDAwYTBcIicsXG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICByaWdodDogMCxcbiAgICAgICAgdHJhbnNpdGlvbjogdGhlbWUudHJhbnNpdGlvbnMuY3JlYXRlKCdib3JkZXItYm90dG9tLWNvbG9yJywge1xuICAgICAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydGVyXG4gICAgICAgIH0pLFxuICAgICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScgLy8gVHJhbnNwYXJlbnQgdG8gdGhlIGhvdmVyIHN0eWxlLlxuXG4gICAgICB9LFxuICAgICAgJyY6aG92ZXI6YmVmb3JlJzoge1xuICAgICAgICBib3JkZXJCb3R0b206IFwiMXB4IHNvbGlkIFwiLmNvbmNhdCh0aGVtZS5wYWxldHRlLnRleHQucHJpbWFyeSlcbiAgICAgIH0sXG4gICAgICAnJiRkaXNhYmxlZDpiZWZvcmUnOiB7XG4gICAgICAgIGJvcmRlckJvdHRvbVN0eWxlOiAnZG90dGVkJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIHRoZSBjb21wb25lbnQgaXMgZm9jdXNlZC4gKi9cbiAgICBmb2N1c2VkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgc3RhcnRBZG9ybm1lbnRgIGlzIHByb3ZpZGVkLiAqL1xuICAgIGFkb3JuZWRTdGFydDoge1xuICAgICAgcGFkZGluZ0xlZnQ6IDEyXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGVuZEFkb3JubWVudGAgaXMgcHJvdmlkZWQuICovXG4gICAgYWRvcm5lZEVuZDoge1xuICAgICAgcGFkZGluZ1JpZ2h0OiAxMlxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBlcnJvcj17dHJ1ZX1gLiAqL1xuICAgIGVycm9yOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQgaWYgYG1hcmdpbj1cImRlbnNlXCJgLiAqL1xuICAgIG1hcmdpbkRlbnNlOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG11bHRpbGluZT17dHJ1ZX1gLiAqL1xuICAgIG11bHRpbGluZToge1xuICAgICAgcGFkZGluZzogJzI3cHggMTJweCAxMHB4JyxcbiAgICAgICcmJG1hcmdpbkRlbnNlJzoge1xuICAgICAgICBwYWRkaW5nVG9wOiAyMyxcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogNlxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50LiAqL1xuICAgIGlucHV0OiB7XG4gICAgICBwYWRkaW5nOiAnMjdweCAxMnB4IDEwcHgnLFxuICAgICAgJyY6LXdlYmtpdC1hdXRvZmlsbCc6IHtcbiAgICAgICAgV2Via2l0Qm94U2hhZG93OiB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyBudWxsIDogJzAgMCAwIDEwMHB4ICMyNjY3OTggaW5zZXQnLFxuICAgICAgICBXZWJraXRUZXh0RmlsbENvbG9yOiB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyBudWxsIDogJyNmZmYnLFxuICAgICAgICBjYXJldENvbG9yOiB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCcgPyBudWxsIDogJyNmZmYnLFxuICAgICAgICBib3JkZXJUb3BMZWZ0UmFkaXVzOiAnaW5oZXJpdCcsXG4gICAgICAgIGJvcmRlclRvcFJpZ2h0UmFkaXVzOiAnaW5oZXJpdCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgbWFyZ2luPVwiZGVuc2VcImAuICovXG4gICAgaW5wdXRNYXJnaW5EZW5zZToge1xuICAgICAgcGFkZGluZ1RvcDogMjMsXG4gICAgICBwYWRkaW5nQm90dG9tOiA2XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGlmIGluIGA8Rm9ybUNvbnRyb2wgaGlkZGVuTGFiZWwgLz5gLiAqL1xuICAgIGlucHV0SGlkZGVuTGFiZWw6IHtcbiAgICAgIHBhZGRpbmdUb3A6IDE4LFxuICAgICAgcGFkZGluZ0JvdHRvbTogMTksXG4gICAgICAnJiRpbnB1dE1hcmdpbkRlbnNlJzoge1xuICAgICAgICBwYWRkaW5nVG9wOiAxMCxcbiAgICAgICAgcGFkZGluZ0JvdHRvbTogMTFcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgbXVsdGlsaW5lPXt0cnVlfWAuICovXG4gICAgaW5wdXRNdWx0aWxpbmU6IHtcbiAgICAgIHBhZGRpbmc6IDBcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgc3RhcnRBZG9ybm1lbnRgIGlzIHByb3ZpZGVkLiAqL1xuICAgIGlucHV0QWRvcm5lZFN0YXJ0OiB7XG4gICAgICBwYWRkaW5nTGVmdDogMFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50IGlmIGBlbmRBZG9ybm1lbnRgIGlzIHByb3ZpZGVkLiAqL1xuICAgIGlucHV0QWRvcm5lZEVuZDoge1xuICAgICAgcGFkZGluZ1JpZ2h0OiAwXG4gICAgfVxuICB9O1xufTtcbnZhciBGaWxsZWRJbnB1dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZpbGxlZElucHV0KHByb3BzLCByZWYpIHtcbiAgdmFyIGRpc2FibGVVbmRlcmxpbmUgPSBwcm9wcy5kaXNhYmxlVW5kZXJsaW5lLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBfcHJvcHMkZnVsbFdpZHRoID0gcHJvcHMuZnVsbFdpZHRoLFxuICAgICAgZnVsbFdpZHRoID0gX3Byb3BzJGZ1bGxXaWR0aCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZnVsbFdpZHRoLFxuICAgICAgX3Byb3BzJGlucHV0Q29tcG9uZW50ID0gcHJvcHMuaW5wdXRDb21wb25lbnQsXG4gICAgICBpbnB1dENvbXBvbmVudCA9IF9wcm9wcyRpbnB1dENvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2lucHV0JyA6IF9wcm9wcyRpbnB1dENvbXBvbmVudCxcbiAgICAgIF9wcm9wcyRtdWx0aWxpbmUgPSBwcm9wcy5tdWx0aWxpbmUsXG4gICAgICBtdWx0aWxpbmUgPSBfcHJvcHMkbXVsdGlsaW5lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRtdWx0aWxpbmUsXG4gICAgICBfcHJvcHMkdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICd0ZXh0JyA6IF9wcm9wcyR0eXBlLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImRpc2FibGVVbmRlcmxpbmVcIiwgXCJjbGFzc2VzXCIsIFwiZnVsbFdpZHRoXCIsIFwiaW5wdXRDb21wb25lbnRcIiwgXCJtdWx0aWxpbmVcIiwgXCJ0eXBlXCJdKTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW5wdXRCYXNlLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NlczogX2V4dGVuZHMoe30sIGNsYXNzZXMsIHtcbiAgICAgIHJvb3Q6IGNsc3goY2xhc3Nlcy5yb290LCAhZGlzYWJsZVVuZGVybGluZSAmJiBjbGFzc2VzLnVuZGVybGluZSksXG4gICAgICB1bmRlcmxpbmU6IG51bGxcbiAgICB9KSxcbiAgICBmdWxsV2lkdGg6IGZ1bGxXaWR0aCxcbiAgICBpbnB1dENvbXBvbmVudDogaW5wdXRDb21wb25lbnQsXG4gICAgbXVsdGlsaW5lOiBtdWx0aWxpbmUsXG4gICAgcmVmOiByZWYsXG4gICAgdHlwZTogdHlwZVxuICB9LCBvdGhlcikpO1xufSk7XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBGaWxsZWRJbnB1dC5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGlzIHByb3AgaGVscHMgdXNlcnMgdG8gZmlsbCBmb3JtcyBmYXN0ZXIsIGVzcGVjaWFsbHkgb24gbW9iaWxlIGRldmljZXMuXG4gICAqIFRoZSBuYW1lIGNhbiBiZSBjb25mdXNpbmcsIGFzIGl0J3MgbW9yZSBsaWtlIGFuIGF1dG9maWxsLlxuICAgKiBZb3UgY2FuIGxlYXJuIG1vcmUgYWJvdXQgaXQgW2ZvbGxvd2luZyB0aGUgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybS1jb250cm9sLWluZnJhc3RydWN0dXJlLmh0bWwjYXV0b2ZpbGwpLlxuICAgKi9cbiAgYXV0b0NvbXBsZXRlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgaW5wdXRgIGVsZW1lbnQgd2lsbCBiZSBmb2N1c2VkIGR1cmluZyB0aGUgZmlyc3QgbW91bnQuXG4gICAqL1xuICBhdXRvRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFRoZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LiBJdCBzdXBwb3J0cyB0aG9zZSB0aGVtZSBjb2xvcnMgdGhhdCBtYWtlIHNlbnNlIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoWydwcmltYXJ5JywgJ3NlY29uZGFyeSddKSxcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYGlucHV0YCBlbGVtZW50IHZhbHVlLiBVc2Ugd2hlbiB0aGUgY29tcG9uZW50IGlzIG5vdCBjb250cm9sbGVkLlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMuYW55LFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgaW5wdXRgIGVsZW1lbnQgd2lsbCBiZSBkaXNhYmxlZC5cbiAgICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaW5wdXQgd2lsbCBub3QgaGF2ZSBhbiB1bmRlcmxpbmUuXG4gICAqL1xuICBkaXNhYmxlVW5kZXJsaW5lOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogRW5kIGBJbnB1dEFkb3JubWVudGAgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgZW5kQWRvcm5tZW50OiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaW5wdXQgd2lsbCBpbmRpY2F0ZSBhbiBlcnJvci4gVGhpcyBpcyBub3JtYWxseSBvYnRhaW5lZCB2aWEgY29udGV4dCBmcm9tXG4gICAqIEZvcm1Db250cm9sLlxuICAgKi9cbiAgZXJyb3I6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBpbnB1dCB3aWxsIHRha2UgdXAgdGhlIGZ1bGwgd2lkdGggb2YgaXRzIGNvbnRhaW5lci5cbiAgICovXG4gIGZ1bGxXaWR0aDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaWQ6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3IgdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICogRWl0aGVyIGEgc3RyaW5nIHRvIHVzZSBhIEhUTUwgZWxlbWVudCBvciBhIGNvbXBvbmVudC5cbiAgICovXG4gIGlucHV0Q29tcG9uZW50OiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqXG4gICAqIFtBdHRyaWJ1dGVzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQjQXR0cmlidXRlcykgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaW5wdXRQcm9wczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogUGFzcyBhIHJlZiB0byB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgaW5wdXRSZWY6IHJlZlR5cGUsXG5cbiAgLyoqXG4gICAqIElmIGBkZW5zZWAsIHdpbGwgYWRqdXN0IHZlcnRpY2FsIHNwYWNpbmcuIFRoaXMgaXMgbm9ybWFsbHkgb2J0YWluZWQgdmlhIGNvbnRleHQgZnJvbVxuICAgKiBGb3JtQ29udHJvbC5cbiAgICovXG4gIG1hcmdpbjogUHJvcFR5cGVzLm9uZU9mKFsnZGVuc2UnLCAnbm9uZSddKSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBhIHRleHRhcmVhIGVsZW1lbnQgd2lsbCBiZSByZW5kZXJlZC5cbiAgICovXG4gIG11bHRpbGluZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIE5hbWUgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCB3aGVuIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgVGhlIGV2ZW50IHNvdXJjZSBvZiB0aGUgY2FsbGJhY2suXG4gICAqIFlvdSBjYW4gcHVsbCBvdXQgdGhlIG5ldyB2YWx1ZSBieSBhY2Nlc3NpbmcgYGV2ZW50LnRhcmdldC52YWx1ZWAgKHN0cmluZykuXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFRoZSBzaG9ydCBoaW50IGRpc3BsYXllZCBpbiB0aGUgaW5wdXQgYmVmb3JlIHRoZSB1c2VyIGVudGVycyBhIHZhbHVlLlxuICAgKi9cbiAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEl0IHByZXZlbnRzIHRoZSB1c2VyIGZyb20gY2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZFxuICAgKiAobm90IGZyb20gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgZmllbGQpLlxuICAgKi9cbiAgcmVhZE9ubHk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBgaW5wdXRgIGVsZW1lbnQgd2lsbCBiZSByZXF1aXJlZC5cbiAgICovXG4gIHJlcXVpcmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogTnVtYmVyIG9mIHJvd3MgdG8gZGlzcGxheSB3aGVuIG11bHRpbGluZSBvcHRpb24gaXMgc2V0IHRvIHRydWUuXG4gICAqL1xuICByb3dzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gZGlzcGxheSB3aGVuIG11bHRpbGluZSBvcHRpb24gaXMgc2V0IHRvIHRydWUuXG4gICAqL1xuICByb3dzTWF4OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIFN0YXJ0IGBJbnB1dEFkb3JubWVudGAgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgc3RhcnRBZG9ybm1lbnQ6IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBUeXBlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuIEl0IHNob3VsZCBiZSBbYSB2YWxpZCBIVE1MNSBpbnB1dCB0eXBlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQjRm9ybV8lM0NpbnB1dCUzRV90eXBlcykuXG4gICAqL1xuICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIGBpbnB1dGAgZWxlbWVudCwgcmVxdWlyZWQgZm9yIGEgY29udHJvbGxlZCBjb21wb25lbnQuXG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLmFueVxufSA6IHZvaWQgMDtcbkZpbGxlZElucHV0Lm11aU5hbWUgPSAnSW5wdXQnO1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN0eWxlcyhzdHlsZXMsIHtcbiAgbmFtZTogJ011aUZpbGxlZElucHV0J1xufSkoRmlsbGVkSW5wdXQpOyIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB7IGZvcm1hdE11aUVycm9yTWVzc2FnZSBhcyBfZm9ybWF0TXVpRXJyb3JNZXNzYWdlIH0gZnJvbSBcIkBtYXRlcmlhbC11aS91dGlsc1wiO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzLCBqc3gtYTExeS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgKi9cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IHJlZlR5cGUgfSBmcm9tICdAbWF0ZXJpYWwtdWkvdXRpbHMnO1xuaW1wb3J0IGZvcm1Db250cm9sU3RhdGUgZnJvbSAnLi4vRm9ybUNvbnRyb2wvZm9ybUNvbnRyb2xTdGF0ZSc7XG5pbXBvcnQgRm9ybUNvbnRyb2xDb250ZXh0LCB7IHVzZUZvcm1Db250cm9sIH0gZnJvbSAnLi4vRm9ybUNvbnRyb2wvRm9ybUNvbnRyb2xDb250ZXh0JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBjYXBpdGFsaXplIGZyb20gJy4uL3V0aWxzL2NhcGl0YWxpemUnO1xuaW1wb3J0IHVzZUZvcmtSZWYgZnJvbSAnLi4vdXRpbHMvdXNlRm9ya1JlZic7XG5pbXBvcnQgVGV4dGFyZWFBdXRvc2l6ZSBmcm9tICcuLi9UZXh0YXJlYUF1dG9zaXplJztcbmltcG9ydCB7IGlzRmlsbGVkIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICB2YXIgbGlnaHQgPSB0aGVtZS5wYWxldHRlLnR5cGUgPT09ICdsaWdodCc7XG4gIHZhciBwbGFjZWhvbGRlciA9IHtcbiAgICBjb2xvcjogJ2N1cnJlbnRDb2xvcicsXG4gICAgb3BhY2l0eTogbGlnaHQgPyAwLjQyIDogMC41LFxuICAgIHRyYW5zaXRpb246IHRoZW1lLnRyYW5zaXRpb25zLmNyZWF0ZSgnb3BhY2l0eScsIHtcbiAgICAgIGR1cmF0aW9uOiB0aGVtZS50cmFuc2l0aW9ucy5kdXJhdGlvbi5zaG9ydGVyXG4gICAgfSlcbiAgfTtcbiAgdmFyIHBsYWNlaG9sZGVySGlkZGVuID0ge1xuICAgIG9wYWNpdHk6ICcwICFpbXBvcnRhbnQnXG4gIH07XG4gIHZhciBwbGFjZWhvbGRlclZpc2libGUgPSB7XG4gICAgb3BhY2l0eTogbGlnaHQgPyAwLjQyIDogMC41XG4gIH07XG4gIHJldHVybiB7XG4gICAgJ0BnbG9iYWwnOiB7XG4gICAgICAnQGtleWZyYW1lcyBtdWktYXV0by1maWxsJzoge30sXG4gICAgICAnQGtleWZyYW1lcyBtdWktYXV0by1maWxsLWNhbmNlbCc6IHt9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDogX2V4dGVuZHMoe30sIHRoZW1lLnR5cG9ncmFwaHkuYm9keTEsIHtcbiAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQucHJpbWFyeSxcbiAgICAgIGxpbmVIZWlnaHQ6ICcxLjE4NzZlbScsXG4gICAgICAvLyBSZXNldCAoMTlweCksIG1hdGNoIHRoZSBuYXRpdmUgaW5wdXQgbGluZS1oZWlnaHRcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgLy8gUHJldmVudCBwYWRkaW5nIGlzc3VlIHdpdGggZnVsbFdpZHRoLlxuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBjdXJzb3I6ICd0ZXh0JyxcbiAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICcmJGRpc2FibGVkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LmRpc2FibGVkLFxuICAgICAgICBjdXJzb3I6ICdkZWZhdWx0J1xuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiB0aGUgY29tcG9uZW50IGlzIGEgZGVzY2VuZGFudCBvZiBgRm9ybUNvbnRyb2xgLiAqL1xuICAgIGZvcm1Db250cm9sOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgdGhlIGNvbXBvbmVudCBpcyBmb2N1c2VkLiAqL1xuICAgIGZvY3VzZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBzdGFydEFkb3JubWVudGAgaXMgcHJvdmlkZWQuICovXG4gICAgYWRvcm5lZFN0YXJ0OiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGVuZEFkb3JubWVudGAgaXMgcHJvdmlkZWQuICovXG4gICAgYWRvcm5lZEVuZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBlcnJvcj17dHJ1ZX1gLiAqL1xuICAgIGVycm9yOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQgaWYgYG1hcmdpbj1cImRlbnNlXCJgLiAqL1xuICAgIG1hcmdpbkRlbnNlOiB7fSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG11bHRpbGluZT17dHJ1ZX1gLiAqL1xuICAgIG11bHRpbGluZToge1xuICAgICAgcGFkZGluZzogXCJcIi5jb25jYXQoOCAtIDIsIFwicHggMCBcIikuY29uY2F0KDggLSAxLCBcInB4XCIpLFxuICAgICAgJyYkbWFyZ2luRGVuc2UnOiB7XG4gICAgICAgIHBhZGRpbmdUb3A6IDQgLSAxXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgdGhlIGNvbG9yIGlzIHNlY29uZGFyeS4gKi9cbiAgICBjb2xvclNlY29uZGFyeToge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmdWxsV2lkdGg9e3RydWV9YC4gKi9cbiAgICBmdWxsV2lkdGg6IHtcbiAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC4gKi9cbiAgICBpbnB1dDoge1xuICAgICAgZm9udDogJ2luaGVyaXQnLFxuICAgICAgbGV0dGVyU3BhY2luZzogJ2luaGVyaXQnLFxuICAgICAgY29sb3I6ICdjdXJyZW50Q29sb3InLFxuICAgICAgcGFkZGluZzogXCJcIi5jb25jYXQoOCAtIDIsIFwicHggMCBcIikuY29uY2F0KDggLSAxLCBcInB4XCIpLFxuICAgICAgYm9yZGVyOiAwLFxuICAgICAgYm94U2l6aW5nOiAnY29udGVudC1ib3gnLFxuICAgICAgYmFja2dyb3VuZDogJ25vbmUnLFxuICAgICAgaGVpZ2h0OiAnMS4xODc2ZW0nLFxuICAgICAgLy8gUmVzZXQgKDE5cHgpLCBtYXRjaCB0aGUgbmF0aXZlIGlucHV0IGxpbmUtaGVpZ2h0XG4gICAgICBtYXJnaW46IDAsXG4gICAgICAvLyBSZXNldCBmb3IgU2FmYXJpXG4gICAgICBXZWJraXRUYXBIaWdobGlnaHRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAvLyBNYWtlIHRoZSBmbGV4IGl0ZW0gc2hyaW5rIHdpdGggRmlyZWZveFxuICAgICAgbWluV2lkdGg6IDAsXG4gICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgLy8gRml4IElFIDExIHdpZHRoIGlzc3VlXG4gICAgICBhbmltYXRpb25OYW1lOiAnbXVpLWF1dG8tZmlsbC1jYW5jZWwnLFxuICAgICAgYW5pbWF0aW9uRHVyYXRpb246ICcxMG1zJyxcbiAgICAgICcmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXIsXG4gICAgICAnJjo6LW1vei1wbGFjZWhvbGRlcic6IHBsYWNlaG9sZGVyLFxuICAgICAgLy8gRmlyZWZveCAxOStcbiAgICAgICcmOi1tcy1pbnB1dC1wbGFjZWhvbGRlcic6IHBsYWNlaG9sZGVyLFxuICAgICAgLy8gSUUgMTFcbiAgICAgICcmOjotbXMtaW5wdXQtcGxhY2Vob2xkZXInOiBwbGFjZWhvbGRlcixcbiAgICAgIC8vIEVkZ2VcbiAgICAgICcmOmZvY3VzJzoge1xuICAgICAgICBvdXRsaW5lOiAwXG4gICAgICB9LFxuICAgICAgLy8gUmVzZXQgRmlyZWZveCBpbnZhbGlkIHJlcXVpcmVkIGlucHV0IHN0eWxlXG4gICAgICAnJjppbnZhbGlkJzoge1xuICAgICAgICBib3hTaGFkb3c6ICdub25lJ1xuICAgICAgfSxcbiAgICAgICcmOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uJzoge1xuICAgICAgICAvLyBSZW1vdmUgdGhlIHBhZGRpbmcgd2hlbiB0eXBlPXNlYXJjaC5cbiAgICAgICAgJy13ZWJraXQtYXBwZWFyYW5jZSc6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIC8vIFNob3cgYW5kIGhpZGUgdGhlIHBsYWNlaG9sZGVyIGxvZ2ljXG4gICAgICAnbGFiZWxbZGF0YS1zaHJpbms9ZmFsc2VdICsgJGZvcm1Db250cm9sICYnOiB7XG4gICAgICAgICcmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXJIaWRkZW4sXG4gICAgICAgICcmOjotbW96LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXJIaWRkZW4sXG4gICAgICAgIC8vIEZpcmVmb3ggMTkrXG4gICAgICAgICcmOi1tcy1pbnB1dC1wbGFjZWhvbGRlcic6IHBsYWNlaG9sZGVySGlkZGVuLFxuICAgICAgICAvLyBJRSAxMVxuICAgICAgICAnJjo6LW1zLWlucHV0LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXJIaWRkZW4sXG4gICAgICAgIC8vIEVkZ2VcbiAgICAgICAgJyY6Zm9jdXM6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXInOiBwbGFjZWhvbGRlclZpc2libGUsXG4gICAgICAgICcmOmZvY3VzOjotbW96LXBsYWNlaG9sZGVyJzogcGxhY2Vob2xkZXJWaXNpYmxlLFxuICAgICAgICAvLyBGaXJlZm94IDE5K1xuICAgICAgICAnJjpmb2N1czotbXMtaW5wdXQtcGxhY2Vob2xkZXInOiBwbGFjZWhvbGRlclZpc2libGUsXG4gICAgICAgIC8vIElFIDExXG4gICAgICAgICcmOmZvY3VzOjotbXMtaW5wdXQtcGxhY2Vob2xkZXInOiBwbGFjZWhvbGRlclZpc2libGUgLy8gRWRnZVxuXG4gICAgICB9LFxuICAgICAgJyYkZGlzYWJsZWQnOiB7XG4gICAgICAgIG9wYWNpdHk6IDEgLy8gUmVzZXQgaU9TIG9wYWNpdHlcblxuICAgICAgfSxcbiAgICAgICcmOi13ZWJraXQtYXV0b2ZpbGwnOiB7XG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiAnNTAwMHMnLFxuICAgICAgICBhbmltYXRpb25OYW1lOiAnbXVpLWF1dG8tZmlsbCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgbWFyZ2luPVwiZGVuc2VcImAuICovXG4gICAgaW5wdXRNYXJnaW5EZW5zZToge1xuICAgICAgcGFkZGluZ1RvcDogNCAtIDFcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudCBpZiBgbXVsdGlsaW5lPXt0cnVlfWAuICovXG4gICAgaW5wdXRNdWx0aWxpbmU6IHtcbiAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgcmVzaXplOiAnbm9uZScsXG4gICAgICBwYWRkaW5nOiAwXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQgaWYgYHR5cGU9XCJzZWFyY2hcImAuICovXG4gICAgaW5wdXRUeXBlU2VhcmNoOiB7XG4gICAgICAvLyBJbXByb3ZlIHR5cGUgc2VhcmNoIHN0eWxlLlxuICAgICAgJy1tb3otYXBwZWFyYW5jZSc6ICd0ZXh0ZmllbGQnLFxuICAgICAgJy13ZWJraXQtYXBwZWFyYW5jZSc6ICd0ZXh0ZmllbGQnXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQgaWYgYHN0YXJ0QWRvcm5tZW50YCBpcyBwcm92aWRlZC4gKi9cbiAgICBpbnB1dEFkb3JuZWRTdGFydDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50IGlmIGBlbmRBZG9ybm1lbnRgIGlzIHByb3ZpZGVkLiAqL1xuICAgIGlucHV0QWRvcm5lZEVuZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgYGlucHV0YCBlbGVtZW50IGlmIGBoaWRkZW5MYWJlbD17dHJ1ZX1gLiAqL1xuICAgIGlucHV0SGlkZGVuTGFiZWw6IHt9XG4gIH07XG59O1xudmFyIHVzZUVuaGFuY2VkRWZmZWN0ID0gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBSZWFjdC51c2VFZmZlY3QgOiBSZWFjdC51c2VMYXlvdXRFZmZlY3Q7XG4vKipcbiAqIGBJbnB1dEJhc2VgIGNvbnRhaW5zIGFzIGZldyBzdHlsZXMgYXMgcG9zc2libGUuXG4gKiBJdCBhaW1zIHRvIGJlIGEgc2ltcGxlIGJ1aWxkaW5nIGJsb2NrIGZvciBjcmVhdGluZyBhbiBpbnB1dC5cbiAqIEl0IGNvbnRhaW5zIGEgbG9hZCBvZiBzdHlsZSByZXNldCBhbmQgc29tZSBzdGF0ZSBsb2dpYy5cbiAqL1xuXG52YXIgSW5wdXRCYXNlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gSW5wdXRCYXNlKHByb3BzLCByZWYpIHtcbiAgdmFyIGFyaWFEZXNjcmliZWRieSA9IHByb3BzWydhcmlhLWRlc2NyaWJlZGJ5J10sXG4gICAgICBhdXRvQ29tcGxldGUgPSBwcm9wcy5hdXRvQ29tcGxldGUsXG4gICAgICBhdXRvRm9jdXMgPSBwcm9wcy5hdXRvRm9jdXMsXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZW5kQWRvcm5tZW50ID0gcHJvcHMuZW5kQWRvcm5tZW50LFxuICAgICAgZXJyb3IgPSBwcm9wcy5lcnJvcixcbiAgICAgIF9wcm9wcyRmdWxsV2lkdGggPSBwcm9wcy5mdWxsV2lkdGgsXG4gICAgICBmdWxsV2lkdGggPSBfcHJvcHMkZnVsbFdpZHRoID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRmdWxsV2lkdGgsXG4gICAgICBpZCA9IHByb3BzLmlkLFxuICAgICAgX3Byb3BzJGlucHV0Q29tcG9uZW50ID0gcHJvcHMuaW5wdXRDb21wb25lbnQsXG4gICAgICBpbnB1dENvbXBvbmVudCA9IF9wcm9wcyRpbnB1dENvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2lucHV0JyA6IF9wcm9wcyRpbnB1dENvbXBvbmVudCxcbiAgICAgIF9wcm9wcyRpbnB1dFByb3BzID0gcHJvcHMuaW5wdXRQcm9wcyxcbiAgICAgIGlucHV0UHJvcHNQcm9wID0gX3Byb3BzJGlucHV0UHJvcHMgPT09IHZvaWQgMCA/IHt9IDogX3Byb3BzJGlucHV0UHJvcHMsXG4gICAgICBpbnB1dFJlZlByb3AgPSBwcm9wcy5pbnB1dFJlZixcbiAgICAgIG1hcmdpbiA9IHByb3BzLm1hcmdpbixcbiAgICAgIF9wcm9wcyRtdWx0aWxpbmUgPSBwcm9wcy5tdWx0aWxpbmUsXG4gICAgICBtdWx0aWxpbmUgPSBfcHJvcHMkbXVsdGlsaW5lID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRtdWx0aWxpbmUsXG4gICAgICBuYW1lID0gcHJvcHMubmFtZSxcbiAgICAgIG9uQmx1ciA9IHByb3BzLm9uQmx1cixcbiAgICAgIG9uQ2hhbmdlID0gcHJvcHMub25DaGFuZ2UsXG4gICAgICBvbkNsaWNrID0gcHJvcHMub25DbGljayxcbiAgICAgIG9uRm9jdXMgPSBwcm9wcy5vbkZvY3VzLFxuICAgICAgb25LZXlEb3duID0gcHJvcHMub25LZXlEb3duLFxuICAgICAgb25LZXlVcCA9IHByb3BzLm9uS2V5VXAsXG4gICAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgICAgcmVhZE9ubHkgPSBwcm9wcy5yZWFkT25seSxcbiAgICAgIHJlbmRlclN1ZmZpeCA9IHByb3BzLnJlbmRlclN1ZmZpeCxcbiAgICAgIHJvd3MgPSBwcm9wcy5yb3dzLFxuICAgICAgcm93c01heCA9IHByb3BzLnJvd3NNYXgsXG4gICAgICByb3dzTWluID0gcHJvcHMucm93c01pbixcbiAgICAgIHN0YXJ0QWRvcm5tZW50ID0gcHJvcHMuc3RhcnRBZG9ybm1lbnQsXG4gICAgICBfcHJvcHMkdHlwZSA9IHByb3BzLnR5cGUsXG4gICAgICB0eXBlID0gX3Byb3BzJHR5cGUgPT09IHZvaWQgMCA/ICd0ZXh0JyA6IF9wcm9wcyR0eXBlLFxuICAgICAgdmFsdWVQcm9wID0gcHJvcHMudmFsdWUsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiYXJpYS1kZXNjcmliZWRieVwiLCBcImF1dG9Db21wbGV0ZVwiLCBcImF1dG9Gb2N1c1wiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImRlZmF1bHRWYWx1ZVwiLCBcImRpc2FibGVkXCIsIFwiZW5kQWRvcm5tZW50XCIsIFwiZXJyb3JcIiwgXCJmdWxsV2lkdGhcIiwgXCJpZFwiLCBcImlucHV0Q29tcG9uZW50XCIsIFwiaW5wdXRQcm9wc1wiLCBcImlucHV0UmVmXCIsIFwibWFyZ2luXCIsIFwibXVsdGlsaW5lXCIsIFwibmFtZVwiLCBcIm9uQmx1clwiLCBcIm9uQ2hhbmdlXCIsIFwib25DbGlja1wiLCBcIm9uRm9jdXNcIiwgXCJvbktleURvd25cIiwgXCJvbktleVVwXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJyZWFkT25seVwiLCBcInJlbmRlclN1ZmZpeFwiLCBcInJvd3NcIiwgXCJyb3dzTWF4XCIsIFwicm93c01pblwiLCBcInN0YXJ0QWRvcm5tZW50XCIsIFwidHlwZVwiLCBcInZhbHVlXCJdKTtcblxuICB2YXIgdmFsdWUgPSBpbnB1dFByb3BzUHJvcC52YWx1ZSAhPSBudWxsID8gaW5wdXRQcm9wc1Byb3AudmFsdWUgOiB2YWx1ZVByb3A7XG5cbiAgdmFyIF9SZWFjdCR1c2VSZWYgPSBSZWFjdC51c2VSZWYodmFsdWUgIT0gbnVsbCksXG4gICAgICBpc0NvbnRyb2xsZWQgPSBfUmVhY3QkdXNlUmVmLmN1cnJlbnQ7XG5cbiAgdmFyIGlucHV0UmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBoYW5kbGVJbnB1dFJlZldhcm5pbmcgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGluc3RhbmNlICYmIGluc3RhbmNlLm5vZGVOYW1lICE9PSAnSU5QVVQnICYmICFpbnN0YW5jZS5mb2N1cykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFsnTWF0ZXJpYWwtVUk6IFlvdSBoYXZlIHByb3ZpZGVkIGEgYGlucHV0Q29tcG9uZW50YCB0byB0aGUgaW5wdXQgY29tcG9uZW50JywgJ3RoYXQgZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgYGlucHV0UmVmYCBwcm9wLicsICdNYWtlIHN1cmUgdGhlIGBpbnB1dFJlZmAgcHJvcCBpcyBjYWxsZWQgd2l0aCBhIEhUTUxJbnB1dEVsZW1lbnQuJ10uam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW10pO1xuICB2YXIgaGFuZGxlSW5wdXRQcm9wc1JlZlByb3AgPSB1c2VGb3JrUmVmKGlucHV0UHJvcHNQcm9wLnJlZiwgaGFuZGxlSW5wdXRSZWZXYXJuaW5nKTtcbiAgdmFyIGhhbmRsZUlucHV0UmVmUHJvcCA9IHVzZUZvcmtSZWYoaW5wdXRSZWZQcm9wLCBoYW5kbGVJbnB1dFByb3BzUmVmUHJvcCk7XG4gIHZhciBoYW5kbGVJbnB1dFJlZiA9IHVzZUZvcmtSZWYoaW5wdXRSZWYsIGhhbmRsZUlucHV0UmVmUHJvcCk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKSxcbiAgICAgIGZvY3VzZWQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRGb2N1c2VkID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciBtdWlGb3JtQ29udHJvbCA9IHVzZUZvcm1Db250cm9sKCk7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG11aUZvcm1Db250cm9sKSB7XG4gICAgICAgIHJldHVybiBtdWlGb3JtQ29udHJvbC5yZWdpc3RlckVmZmVjdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sIFttdWlGb3JtQ29udHJvbF0pO1xuICB9XG5cbiAgdmFyIGZjcyA9IGZvcm1Db250cm9sU3RhdGUoe1xuICAgIHByb3BzOiBwcm9wcyxcbiAgICBtdWlGb3JtQ29udHJvbDogbXVpRm9ybUNvbnRyb2wsXG4gICAgc3RhdGVzOiBbJ2NvbG9yJywgJ2Rpc2FibGVkJywgJ2Vycm9yJywgJ2hpZGRlbkxhYmVsJywgJ21hcmdpbicsICdyZXF1aXJlZCcsICdmaWxsZWQnXVxuICB9KTtcbiAgZmNzLmZvY3VzZWQgPSBtdWlGb3JtQ29udHJvbCA/IG11aUZvcm1Db250cm9sLmZvY3VzZWQgOiBmb2N1c2VkOyAvLyBUaGUgYmx1ciB3b24ndCBmaXJlIHdoZW4gdGhlIGRpc2FibGVkIHN0YXRlIGlzIHNldCBvbiBhIGZvY3VzZWQgaW5wdXQuXG4gIC8vIFdlIG5lZWQgdG8gYm9vayBrZWVwIHRoZSBmb2N1c2VkIHN0YXRlIG1hbnVhbGx5LlxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFtdWlGb3JtQ29udHJvbCAmJiBkaXNhYmxlZCAmJiBmb2N1c2VkKSB7XG4gICAgICBzZXRGb2N1c2VkKGZhbHNlKTtcblxuICAgICAgaWYgKG9uQmx1cikge1xuICAgICAgICBvbkJsdXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFttdWlGb3JtQ29udHJvbCwgZGlzYWJsZWQsIGZvY3VzZWQsIG9uQmx1cl0pO1xuICB2YXIgb25GaWxsZWQgPSBtdWlGb3JtQ29udHJvbCAmJiBtdWlGb3JtQ29udHJvbC5vbkZpbGxlZDtcbiAgdmFyIG9uRW1wdHkgPSBtdWlGb3JtQ29udHJvbCAmJiBtdWlGb3JtQ29udHJvbC5vbkVtcHR5O1xuICB2YXIgY2hlY2tEaXJ0eSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChvYmopIHtcbiAgICBpZiAoaXNGaWxsZWQob2JqKSkge1xuICAgICAgaWYgKG9uRmlsbGVkKSB7XG4gICAgICAgIG9uRmlsbGVkKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvbkVtcHR5KSB7XG4gICAgICBvbkVtcHR5KCk7XG4gICAgfVxuICB9LCBbb25GaWxsZWQsIG9uRW1wdHldKTtcbiAgdXNlRW5oYW5jZWRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0NvbnRyb2xsZWQpIHtcbiAgICAgIGNoZWNrRGlydHkoe1xuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW3ZhbHVlLCBjaGVja0RpcnR5LCBpc0NvbnRyb2xsZWRdKTtcblxuICB2YXIgaGFuZGxlRm9jdXMgPSBmdW5jdGlvbiBoYW5kbGVGb2N1cyhldmVudCkge1xuICAgIC8vIEZpeCBhIGJ1ZyB3aXRoIElFIDExIHdoZXJlIHRoZSBmb2N1cy9ibHVyIGV2ZW50cyBhcmUgdHJpZ2dlcmVkXG4gICAgLy8gd2hpbGUgdGhlIGlucHV0IGlzIGRpc2FibGVkLlxuICAgIGlmIChmY3MuZGlzYWJsZWQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvbkZvY3VzKSB7XG4gICAgICBvbkZvY3VzKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXRQcm9wc1Byb3Aub25Gb2N1cykge1xuICAgICAgaW5wdXRQcm9wc1Byb3Aub25Gb2N1cyhldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKG11aUZvcm1Db250cm9sICYmIG11aUZvcm1Db250cm9sLm9uRm9jdXMpIHtcbiAgICAgIG11aUZvcm1Db250cm9sLm9uRm9jdXMoZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaGFuZGxlQmx1ciA9IGZ1bmN0aW9uIGhhbmRsZUJsdXIoZXZlbnQpIHtcbiAgICBpZiAob25CbHVyKSB7XG4gICAgICBvbkJsdXIoZXZlbnQpO1xuICAgIH1cblxuICAgIGlmIChpbnB1dFByb3BzUHJvcC5vbkJsdXIpIHtcbiAgICAgIGlucHV0UHJvcHNQcm9wLm9uQmx1cihldmVudCk7XG4gICAgfVxuXG4gICAgaWYgKG11aUZvcm1Db250cm9sICYmIG11aUZvcm1Db250cm9sLm9uQmx1cikge1xuICAgICAgbXVpRm9ybUNvbnRyb2wub25CbHVyKGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0Rm9jdXNlZChmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWlzQ29udHJvbGxlZCkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBldmVudC50YXJnZXQgfHwgaW5wdXRSZWYuY3VycmVudDtcblxuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gXCJNYXRlcmlhbC1VSTogRXhwZWN0ZWQgdmFsaWQgaW5wdXQgdGFyZ2V0LiBEaWQgeW91IHVzZSBhIGN1c3RvbSBgaW5wdXRDb21wb25lbnRgIGFuZCBmb3JnZXQgdG8gZm9yd2FyZCByZWZzPyBTZWUgaHR0cHM6Ly9tYXRlcmlhbC11aS5jb20vci9pbnB1dC1jb21wb25lbnQtcmVmLWludGVyZmFjZSBmb3IgbW9yZSBpbmZvLlwiIDogX2Zvcm1hdE11aUVycm9yTWVzc2FnZSgxKSk7XG4gICAgICB9XG5cbiAgICAgIGNoZWNrRGlydHkoe1xuICAgICAgICB2YWx1ZTogZWxlbWVudC52YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKGlucHV0UHJvcHNQcm9wLm9uQ2hhbmdlKSB7XG4gICAgICBpbnB1dFByb3BzUHJvcC5vbkNoYW5nZS5hcHBseShpbnB1dFByb3BzUHJvcCwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgIH0gLy8gUGVyZm9ybSBpbiB0aGUgd2lsbFVwZGF0ZVxuXG5cbiAgICBpZiAob25DaGFuZ2UpIHtcbiAgICAgIG9uQ2hhbmdlLmFwcGx5KHZvaWQgMCwgW2V2ZW50XS5jb25jYXQoYXJncykpO1xuICAgIH1cbiAgfTsgLy8gQ2hlY2sgdGhlIGlucHV0IHN0YXRlIG9uIG1vdW50LCBpbiBjYXNlIGl0IHdhcyBmaWxsZWQgYnkgdGhlIHVzZXJcbiAgLy8gb3IgYXV0byBmaWxsZWQgYnkgdGhlIGJyb3dzZXIgYmVmb3JlIHRoZSBoeWRyYXRpb24gKGZvciBTU1IpLlxuXG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBjaGVja0RpcnR5KGlucHV0UmVmLmN1cnJlbnQpO1xuICB9LCBbXSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG5cbiAgdmFyIGhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICBpZiAoaW5wdXRSZWYuY3VycmVudCAmJiBldmVudC5jdXJyZW50VGFyZ2V0ID09PSBldmVudC50YXJnZXQpIHtcbiAgICAgIGlucHV0UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBJbnB1dENvbXBvbmVudCA9IGlucHV0Q29tcG9uZW50O1xuXG4gIHZhciBpbnB1dFByb3BzID0gX2V4dGVuZHMoe30sIGlucHV0UHJvcHNQcm9wLCB7XG4gICAgcmVmOiBoYW5kbGVJbnB1dFJlZlxuICB9KTtcblxuICBpZiAodHlwZW9mIElucHV0Q29tcG9uZW50ICE9PSAnc3RyaW5nJykge1xuICAgIGlucHV0UHJvcHMgPSBfZXh0ZW5kcyh7XG4gICAgICAvLyBSZW5hbWUgcmVmIHRvIGlucHV0UmVmIGFzIHdlIGRvbid0IGtub3cgdGhlXG4gICAgICAvLyBwcm92aWRlZCBgaW5wdXRDb21wb25lbnRgIHN0cnVjdHVyZS5cbiAgICAgIGlucHV0UmVmOiBoYW5kbGVJbnB1dFJlZixcbiAgICAgIHR5cGU6IHR5cGVcbiAgICB9LCBpbnB1dFByb3BzLCB7XG4gICAgICByZWY6IG51bGxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChtdWx0aWxpbmUpIHtcbiAgICBpZiAocm93cyAmJiAhcm93c01heCAmJiAhcm93c01pbikge1xuICAgICAgSW5wdXRDb21wb25lbnQgPSAndGV4dGFyZWEnO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnB1dFByb3BzID0gX2V4dGVuZHMoe1xuICAgICAgICByb3dzOiByb3dzLFxuICAgICAgICByb3dzTWF4OiByb3dzTWF4XG4gICAgICB9LCBpbnB1dFByb3BzKTtcbiAgICAgIElucHV0Q29tcG9uZW50ID0gVGV4dGFyZWFBdXRvc2l6ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5wdXRQcm9wcyA9IF9leHRlbmRzKHtcbiAgICAgIHR5cGU6IHR5cGVcbiAgICB9LCBpbnB1dFByb3BzKTtcbiAgfVxuXG4gIHZhciBoYW5kbGVBdXRvRmlsbCA9IGZ1bmN0aW9uIGhhbmRsZUF1dG9GaWxsKGV2ZW50KSB7XG4gICAgLy8gUHJvdmlkZSBhIGZha2UgdmFsdWUgYXMgQ2hyb21lIG1pZ2h0IG5vdCBsZXQgeW91IGFjY2VzcyBpdCBmb3Igc2VjdXJpdHkgcmVhc29ucy5cbiAgICBjaGVja0RpcnR5KGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdtdWktYXV0by1maWxsLWNhbmNlbCcgPyBpbnB1dFJlZi5jdXJyZW50IDoge1xuICAgICAgdmFsdWU6ICd4J1xuICAgIH0pO1xuICB9O1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG11aUZvcm1Db250cm9sKSB7XG4gICAgICBtdWlGb3JtQ29udHJvbC5zZXRBZG9ybmVkU3RhcnQoQm9vbGVhbihzdGFydEFkb3JubWVudCkpO1xuICAgIH1cbiAgfSwgW211aUZvcm1Db250cm9sLCBzdGFydEFkb3JubWVudF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzZXNbXCJjb2xvclwiLmNvbmNhdChjYXBpdGFsaXplKGZjcy5jb2xvciB8fCAncHJpbWFyeScpKV0sIGNsYXNzTmFtZSwgZmNzLmRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQsIGZjcy5lcnJvciAmJiBjbGFzc2VzLmVycm9yLCBmdWxsV2lkdGggJiYgY2xhc3Nlcy5mdWxsV2lkdGgsIGZjcy5mb2N1c2VkICYmIGNsYXNzZXMuZm9jdXNlZCwgbXVpRm9ybUNvbnRyb2wgJiYgY2xhc3Nlcy5mb3JtQ29udHJvbCwgbXVsdGlsaW5lICYmIGNsYXNzZXMubXVsdGlsaW5lLCBzdGFydEFkb3JubWVudCAmJiBjbGFzc2VzLmFkb3JuZWRTdGFydCwgZW5kQWRvcm5tZW50ICYmIGNsYXNzZXMuYWRvcm5lZEVuZCwgZmNzLm1hcmdpbiA9PT0gJ2RlbnNlJyAmJiBjbGFzc2VzLm1hcmdpbkRlbnNlKSxcbiAgICBvbkNsaWNrOiBoYW5kbGVDbGljayxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIHN0YXJ0QWRvcm5tZW50LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtQ29udHJvbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogbnVsbFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJbnB1dENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIFwiYXJpYS1pbnZhbGlkXCI6IGZjcy5lcnJvcixcbiAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjogYXJpYURlc2NyaWJlZGJ5LFxuICAgIGF1dG9Db21wbGV0ZTogYXV0b0NvbXBsZXRlLFxuICAgIGF1dG9Gb2N1czogYXV0b0ZvY3VzLFxuICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIGRpc2FibGVkOiBmY3MuZGlzYWJsZWQsXG4gICAgaWQ6IGlkLFxuICAgIG9uQW5pbWF0aW9uU3RhcnQ6IGhhbmRsZUF1dG9GaWxsLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyLFxuICAgIHJlYWRPbmx5OiByZWFkT25seSxcbiAgICByZXF1aXJlZDogZmNzLnJlcXVpcmVkLFxuICAgIHJvd3M6IHJvd3MsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIG9uS2V5RG93bjogb25LZXlEb3duLFxuICAgIG9uS2V5VXA6IG9uS2V5VXBcbiAgfSwgaW5wdXRQcm9wcywge1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLmlucHV0LCBpbnB1dFByb3BzUHJvcC5jbGFzc05hbWUsIGZjcy5kaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkLCBtdWx0aWxpbmUgJiYgY2xhc3Nlcy5pbnB1dE11bHRpbGluZSwgZmNzLmhpZGRlbkxhYmVsICYmIGNsYXNzZXMuaW5wdXRIaWRkZW5MYWJlbCwgc3RhcnRBZG9ybm1lbnQgJiYgY2xhc3Nlcy5pbnB1dEFkb3JuZWRTdGFydCwgZW5kQWRvcm5tZW50ICYmIGNsYXNzZXMuaW5wdXRBZG9ybmVkRW5kLCB0eXBlID09PSAnc2VhcmNoJyAmJiBjbGFzc2VzLmlucHV0VHlwZVNlYXJjaCwgZmNzLm1hcmdpbiA9PT0gJ2RlbnNlJyAmJiBjbGFzc2VzLmlucHV0TWFyZ2luRGVuc2UpLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICBvbkNoYW5nZTogaGFuZGxlQ2hhbmdlLFxuICAgIG9uRm9jdXM6IGhhbmRsZUZvY3VzXG4gIH0pKSksIGVuZEFkb3JubWVudCwgcmVuZGVyU3VmZml4ID8gcmVuZGVyU3VmZml4KF9leHRlbmRzKHt9LCBmY3MsIHtcbiAgICBzdGFydEFkb3JubWVudDogc3RhcnRBZG9ybm1lbnRcbiAgfSkpIDogbnVsbCk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IElucHV0QmFzZS5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICAnYXJpYS1kZXNjcmliZWRieSc6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRoaXMgcHJvcCBoZWxwcyB1c2VycyB0byBmaWxsIGZvcm1zIGZhc3RlciwgZXNwZWNpYWxseSBvbiBtb2JpbGUgZGV2aWNlcy5cbiAgICogVGhlIG5hbWUgY2FuIGJlIGNvbmZ1c2luZywgYXMgaXQncyBtb3JlIGxpa2UgYW4gYXV0b2ZpbGwuXG4gICAqIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBpdCBbZm9sbG93aW5nIHRoZSBzcGVjaWZpY2F0aW9uXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNhdXRvZmlsbCkuXG4gICAqL1xuICBhdXRvQ29tcGxldGU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGBpbnB1dGAgZWxlbWVudCB3aWxsIGJlIGZvY3VzZWQgZHVyaW5nIHRoZSBmaXJzdCBtb3VudC5cbiAgICovXG4gIGF1dG9Gb2N1czogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGNvbXBvbmVudC4gSXQgc3VwcG9ydHMgdGhvc2UgdGhlbWUgY29sb3JzIHRoYXQgbWFrZSBzZW5zZSBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBjb2xvcjogUHJvcFR5cGVzLm9uZU9mKFsncHJpbWFyeScsICdzZWNvbmRhcnknXSksXG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGBpbnB1dGAgZWxlbWVudCB2YWx1ZS4gVXNlIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBub3QgY29udHJvbGxlZC5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZTogUHJvcFR5cGVzLmFueSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYGlucHV0YCBlbGVtZW50IHdpbGwgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEVuZCBgSW5wdXRBZG9ybm1lbnRgIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGVuZEFkb3JubWVudDogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGlucHV0IHdpbGwgaW5kaWNhdGUgYW4gZXJyb3IuIFRoaXMgaXMgbm9ybWFsbHkgb2J0YWluZWQgdmlhIGNvbnRleHQgZnJvbVxuICAgKiBGb3JtQ29udHJvbC5cbiAgICovXG4gIGVycm9yOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaW5wdXQgd2lsbCB0YWtlIHVwIHRoZSBmdWxsIHdpZHRoIG9mIGl0cyBjb250YWluZXIuXG4gICAqL1xuICBmdWxsV2lkdGg6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBpbnB1dENvbXBvbmVudDogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKlxuICAgKiBbQXR0cmlidXRlc10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0I0F0dHJpYnV0ZXMpIGFwcGxpZWQgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlucHV0UHJvcHM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIFBhc3MgYSByZWYgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGlucHV0UmVmOiByZWZUeXBlLFxuXG4gIC8qKlxuICAgKiBJZiBgZGVuc2VgLCB3aWxsIGFkanVzdCB2ZXJ0aWNhbCBzcGFjaW5nLiBUaGlzIGlzIG5vcm1hbGx5IG9idGFpbmVkIHZpYSBjb250ZXh0IGZyb21cbiAgICogRm9ybUNvbnRyb2wuXG4gICAqL1xuICBtYXJnaW46IFByb3BUeXBlcy5vbmVPZihbJ2RlbnNlJywgJ25vbmUnXSksXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgYSB0ZXh0YXJlYSBlbGVtZW50IHdpbGwgYmUgcmVuZGVyZWQuXG4gICAqL1xuICBtdWx0aWxpbmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBOYW1lIGF0dHJpYnV0ZSBvZiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgaW5wdXQgaXMgYmx1cnJlZC5cbiAgICpcbiAgICogTm90aWNlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IChldmVudCkgbWlnaHQgYmUgdW5kZWZpbmVkLlxuICAgKi9cbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgdmFsdWUgaXMgY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKiBZb3UgY2FuIHB1bGwgb3V0IHRoZSBuZXcgdmFsdWUgYnkgYWNjZXNzaW5nIGBldmVudC50YXJnZXQudmFsdWVgIChzdHJpbmcpLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgb25Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uS2V5RG93bjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIG9uS2V5VXA6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBUaGUgc2hvcnQgaGludCBkaXNwbGF5ZWQgaW4gdGhlIGlucHV0IGJlZm9yZSB0aGUgdXNlciBlbnRlcnMgYSB2YWx1ZS5cbiAgICovXG4gIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBJdCBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGRcbiAgICogKG5vdCBmcm9tIGludGVyYWN0aW5nIHdpdGggdGhlIGZpZWxkKS5cbiAgICovXG4gIHJlYWRPbmx5OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcmVuZGVyU3VmZml4OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgYGlucHV0YCBlbGVtZW50IHdpbGwgYmUgcmVxdWlyZWQuXG4gICAqL1xuICByZXF1aXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkgd2hlbiBtdWx0aWxpbmUgb3B0aW9uIGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcm93czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkgd2hlbiBtdWx0aWxpbmUgb3B0aW9uIGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcm93c01heDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBNaW5pbXVtIG51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkgd2hlbiBtdWx0aWxpbmUgb3B0aW9uIGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgcm93c01pbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBTdGFydCBgSW5wdXRBZG9ybm1lbnRgIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIHN0YXJ0QWRvcm5tZW50OiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogVHlwZSBvZiB0aGUgYGlucHV0YCBlbGVtZW50LiBJdCBzaG91bGQgYmUgW2EgdmFsaWQgSFRNTDUgaW5wdXQgdHlwZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0I0Zvcm1fJTNDaW5wdXQlM0VfdHlwZXMpLlxuICAgKi9cbiAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQsIHJlcXVpcmVkIGZvciBhIGNvbnRyb2xsZWQgY29tcG9uZW50LlxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5hbnlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpSW5wdXRCYXNlJ1xufSkoSW5wdXRCYXNlKTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtQ29udHJvbFN0YXRlKF9yZWYpIHtcbiAgdmFyIHByb3BzID0gX3JlZi5wcm9wcyxcbiAgICAgIHN0YXRlcyA9IF9yZWYuc3RhdGVzLFxuICAgICAgbXVpRm9ybUNvbnRyb2wgPSBfcmVmLm11aUZvcm1Db250cm9sO1xuICByZXR1cm4gc3RhdGVzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBzdGF0ZSkge1xuICAgIGFjY1tzdGF0ZV0gPSBwcm9wc1tzdGF0ZV07XG5cbiAgICBpZiAobXVpRm9ybUNvbnRyb2wpIHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcHNbc3RhdGVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBhY2Nbc3RhdGVdID0gbXVpRm9ybUNvbnRyb2xbc3RhdGVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn0iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJy4uL3V0aWxzL2RlYm91bmNlJztcbmltcG9ydCB1c2VGb3JrUmVmIGZyb20gJy4uL3V0aWxzL3VzZUZvcmtSZWYnO1xuXG5mdW5jdGlvbiBnZXRTdHlsZVZhbHVlKGNvbXB1dGVkU3R5bGUsIHByb3BlcnR5KSB7XG4gIHJldHVybiBwYXJzZUludChjb21wdXRlZFN0eWxlW3Byb3BlcnR5XSwgMTApIHx8IDA7XG59XG5cbnZhciB1c2VFbmhhbmNlZEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xudmFyIHN0eWxlcyA9IHtcbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHNoYWRvdyB0ZXh0YXJlYSBlbGVtZW50LiAqL1xuICBzaGFkb3c6IHtcbiAgICAvLyBWaXNpYmlsaXR5IG5lZWRlZCB0byBoaWRlIHRoZSBleHRyYSB0ZXh0IGFyZWEgb24gaVBhZHNcbiAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICAvLyBSZW1vdmUgZnJvbSB0aGUgY29udGVudCBmbG93XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgLy8gSWdub3JlIHRoZSBzY3JvbGxiYXIgd2lkdGhcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHRvcDogMCxcbiAgICBsZWZ0OiAwLFxuICAgIC8vIENyZWF0ZSBhIG5ldyBsYXllciwgaW5jcmVhc2UgdGhlIGlzb2xhdGlvbiBvZiB0aGUgY29tcHV0ZWQgdmFsdWVzXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWigwKSdcbiAgfVxufTtcbnZhciBUZXh0YXJlYUF1dG9zaXplID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoZnVuY3Rpb24gVGV4dGFyZWFBdXRvc2l6ZShwcm9wcywgcmVmKSB7XG4gIHZhciBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgcm93cyA9IHByb3BzLnJvd3MsXG4gICAgICByb3dzTWF4ID0gcHJvcHMucm93c01heCxcbiAgICAgIF9wcm9wcyRyb3dzTWluID0gcHJvcHMucm93c01pbixcbiAgICAgIHJvd3NNaW5Qcm9wID0gX3Byb3BzJHJvd3NNaW4gPT09IHZvaWQgMCA/IDEgOiBfcHJvcHMkcm93c01pbixcbiAgICAgIHN0eWxlID0gcHJvcHMuc3R5bGUsXG4gICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcIm9uQ2hhbmdlXCIsIFwicm93c1wiLCBcInJvd3NNYXhcIiwgXCJyb3dzTWluXCIsIFwic3R5bGVcIiwgXCJ2YWx1ZVwiXSk7XG5cbiAgdmFyIHJvd3NNaW4gPSByb3dzIHx8IHJvd3NNaW5Qcm9wO1xuXG4gIHZhciBfUmVhY3QkdXNlUmVmID0gUmVhY3QudXNlUmVmKHZhbHVlICE9IG51bGwpLFxuICAgICAgaXNDb250cm9sbGVkID0gX1JlYWN0JHVzZVJlZi5jdXJyZW50O1xuXG4gIHZhciBpbnB1dFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIGhhbmRsZVJlZiA9IHVzZUZvcmtSZWYocmVmLCBpbnB1dFJlZik7XG4gIHZhciBzaGFkb3dSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIHZhciByZW5kZXJzID0gUmVhY3QudXNlUmVmKDApO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7fSksXG4gICAgICBzdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciBzeW5jSGVpZ2h0ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnB1dCA9IGlucHV0UmVmLmN1cnJlbnQ7XG4gICAgdmFyIGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbnB1dCk7XG4gICAgdmFyIGlucHV0U2hhbGxvdyA9IHNoYWRvd1JlZi5jdXJyZW50O1xuICAgIGlucHV0U2hhbGxvdy5zdHlsZS53aWR0aCA9IGNvbXB1dGVkU3R5bGUud2lkdGg7XG4gICAgaW5wdXRTaGFsbG93LnZhbHVlID0gaW5wdXQudmFsdWUgfHwgcHJvcHMucGxhY2Vob2xkZXIgfHwgJ3gnO1xuXG4gICAgaWYgKGlucHV0U2hhbGxvdy52YWx1ZS5zbGljZSgtMSkgPT09ICdcXG4nKSB7XG4gICAgICAvLyBDZXJ0YWluIGZvbnRzIHdoaWNoIG92ZXJmbG93IHRoZSBsaW5lIGhlaWdodCB3aWxsIGNhdXNlIHRoZSB0ZXh0YXJlYVxuICAgICAgLy8gdG8gcmVwb3J0IGEgZGlmZmVyZW50IHNjcm9sbEhlaWdodCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbGFzdCBsaW5lXG4gICAgICAvLyBpcyBlbXB0eS4gTWFrZSBpdCBub24tZW1wdHkgdG8gYXZvaWQgdGhpcyBpc3N1ZS5cbiAgICAgIGlucHV0U2hhbGxvdy52YWx1ZSArPSAnICc7XG4gICAgfVxuXG4gICAgdmFyIGJveFNpemluZyA9IGNvbXB1dGVkU3R5bGVbJ2JveC1zaXppbmcnXTtcbiAgICB2YXIgcGFkZGluZyA9IGdldFN0eWxlVmFsdWUoY29tcHV0ZWRTdHlsZSwgJ3BhZGRpbmctYm90dG9tJykgKyBnZXRTdHlsZVZhbHVlKGNvbXB1dGVkU3R5bGUsICdwYWRkaW5nLXRvcCcpO1xuICAgIHZhciBib3JkZXIgPSBnZXRTdHlsZVZhbHVlKGNvbXB1dGVkU3R5bGUsICdib3JkZXItYm90dG9tLXdpZHRoJykgKyBnZXRTdHlsZVZhbHVlKGNvbXB1dGVkU3R5bGUsICdib3JkZXItdG9wLXdpZHRoJyk7IC8vIFRoZSBoZWlnaHQgb2YgdGhlIGlubmVyIGNvbnRlbnRcblxuICAgIHZhciBpbm5lckhlaWdodCA9IGlucHV0U2hhbGxvdy5zY3JvbGxIZWlnaHQgLSBwYWRkaW5nOyAvLyBNZWFzdXJlIGhlaWdodCBvZiBhIHRleHRhcmVhIHdpdGggYSBzaW5nbGUgcm93XG5cbiAgICBpbnB1dFNoYWxsb3cudmFsdWUgPSAneCc7XG4gICAgdmFyIHNpbmdsZVJvd0hlaWdodCA9IGlucHV0U2hhbGxvdy5zY3JvbGxIZWlnaHQgLSBwYWRkaW5nOyAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBvdXRlciBjb250ZW50XG5cbiAgICB2YXIgb3V0ZXJIZWlnaHQgPSBpbm5lckhlaWdodDtcblxuICAgIGlmIChyb3dzTWluKSB7XG4gICAgICBvdXRlckhlaWdodCA9IE1hdGgubWF4KE51bWJlcihyb3dzTWluKSAqIHNpbmdsZVJvd0hlaWdodCwgb3V0ZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIGlmIChyb3dzTWF4KSB7XG4gICAgICBvdXRlckhlaWdodCA9IE1hdGgubWluKE51bWJlcihyb3dzTWF4KSAqIHNpbmdsZVJvd0hlaWdodCwgb3V0ZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIG91dGVySGVpZ2h0ID0gTWF0aC5tYXgob3V0ZXJIZWlnaHQsIHNpbmdsZVJvd0hlaWdodCk7IC8vIFRha2UgdGhlIGJveCBzaXppbmcgaW50byBhY2NvdW50IGZvciBhcHBseWluZyB0aGlzIHZhbHVlIGFzIGEgc3R5bGUuXG5cbiAgICB2YXIgb3V0ZXJIZWlnaHRTdHlsZSA9IG91dGVySGVpZ2h0ICsgKGJveFNpemluZyA9PT0gJ2JvcmRlci1ib3gnID8gcGFkZGluZyArIGJvcmRlciA6IDApO1xuICAgIHZhciBvdmVyZmxvdyA9IE1hdGguYWJzKG91dGVySGVpZ2h0IC0gaW5uZXJIZWlnaHQpIDw9IDE7XG4gICAgc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgLy8gTmVlZCBhIGxhcmdlIGVub3VnaCBkaWZmZXJlbmNlIHRvIHVwZGF0ZSB0aGUgaGVpZ2h0LlxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBpbmZpbml0ZSByZW5kZXJpbmcgbG9vcC5cbiAgICAgIGlmIChyZW5kZXJzLmN1cnJlbnQgPCAyMCAmJiAob3V0ZXJIZWlnaHRTdHlsZSA+IDAgJiYgTWF0aC5hYnMoKHByZXZTdGF0ZS5vdXRlckhlaWdodFN0eWxlIHx8IDApIC0gb3V0ZXJIZWlnaHRTdHlsZSkgPiAxIHx8IHByZXZTdGF0ZS5vdmVyZmxvdyAhPT0gb3ZlcmZsb3cpKSB7XG4gICAgICAgIHJlbmRlcnMuY3VycmVudCArPSAxO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG92ZXJmbG93OiBvdmVyZmxvdyxcbiAgICAgICAgICBvdXRlckhlaWdodFN0eWxlOiBvdXRlckhlaWdodFN0eWxlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChyZW5kZXJzLmN1cnJlbnQgPT09IDIwKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihbJ01hdGVyaWFsLVVJOiBUb28gbWFueSByZS1yZW5kZXJzLiBUaGUgbGF5b3V0IGlzIHVuc3RhYmxlLicsICdUZXh0YXJlYUF1dG9zaXplIGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJlbmRlcnMgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wLiddLmpvaW4oJ1xcbicpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgIH0pO1xuICB9LCBbcm93c01heCwgcm93c01pbiwgcHJvcHMucGxhY2Vob2xkZXJdKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGFuZGxlUmVzaXplID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgcmVuZGVycy5jdXJyZW50ID0gMDtcbiAgICAgIHN5bmNIZWlnaHQoKTtcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlUmVzaXplKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlUmVzaXplLmNsZWFyKCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlUmVzaXplKTtcbiAgICB9O1xuICB9LCBbc3luY0hlaWdodF0pO1xuICB1c2VFbmhhbmNlZEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc3luY0hlaWdodCgpO1xuICB9KTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZW5kZXJzLmN1cnJlbnQgPSAwO1xuICB9LCBbdmFsdWVdKTtcblxuICB2YXIgaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgcmVuZGVycy5jdXJyZW50ID0gMDtcblxuICAgIGlmICghaXNDb250cm9sbGVkKSB7XG4gICAgICBzeW5jSGVpZ2h0KCk7XG4gICAgfVxuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICBvbkNoYW5nZShldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCBfZXh0ZW5kcyh7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIG9uQ2hhbmdlOiBoYW5kbGVDaGFuZ2UsXG4gICAgcmVmOiBoYW5kbGVSZWYgLy8gQXBwbHkgdGhlIHJvd3MgcHJvcCB0byBnZXQgYSBcImNvcnJlY3RcIiBmaXJzdCBTU1IgcGFpbnRcbiAgICAsXG4gICAgcm93czogcm93c01pbixcbiAgICBzdHlsZTogX2V4dGVuZHMoe1xuICAgICAgaGVpZ2h0OiBzdGF0ZS5vdXRlckhlaWdodFN0eWxlLFxuICAgICAgLy8gTmVlZCBhIGxhcmdlIGVub3VnaCBkaWZmZXJlbmNlIHRvIGFsbG93IHNjcm9sbGluZy5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVuZGVyaW5nIGxvb3AuXG4gICAgICBvdmVyZmxvdzogc3RhdGUub3ZlcmZsb3cgPyAnaGlkZGVuJyA6IG51bGxcbiAgICB9LCBzdHlsZSlcbiAgfSwgb3RoZXIpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiLCB7XG4gICAgXCJhcmlhLWhpZGRlblwiOiB0cnVlLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIHJlZjogc2hhZG93UmVmLFxuICAgIHRhYkluZGV4OiAtMSxcbiAgICBzdHlsZTogX2V4dGVuZHMoe30sIHN0eWxlcy5zaGFkb3csIHN0eWxlKVxuICB9KSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IFRleHRhcmVhQXV0b3NpemUucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHBsYWNlaG9sZGVyOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBVc2UgYHJvd3NNaW5gIGluc3RlYWQuIFRoZSBwcm9wIHdpbGwgYmUgcmVtb3ZlZCBpbiB2NS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHJvd3M6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBkaXNwbGF5LlxuICAgKi9cbiAgcm93c01heDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBNaW5pbXVtIG51bWJlciBvZiByb3dzIHRvIGRpc3BsYXkuXG4gICAqL1xuICByb3dzTWluOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnN0cmluZyksIFByb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IFRleHRhcmVhQXV0b3NpemU7IiwiLy8gU3VwcG9ydHMgZGV0ZXJtaW5hdGlvbiBvZiBpc0NvbnRyb2xsZWQoKS5cbi8vIENvbnRyb2xsZWQgaW5wdXQgYWNjZXB0cyBpdHMgY3VycmVudCB2YWx1ZSBhcyBhIHByb3AuXG4vL1xuLy8gQHNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Zvcm1zLmh0bWwjY29udHJvbGxlZC1jb21wb25lbnRzXG4vLyBAcGFyYW0gdmFsdWVcbi8vIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHN0cmluZyAoaW5jbHVkaW5nICcnKSBvciBudW1iZXIgKGluY2x1ZGluZyB6ZXJvKVxuZXhwb3J0IGZ1bmN0aW9uIGhhc1ZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICEoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKTtcbn0gLy8gRGV0ZXJtaW5lIGlmIGZpZWxkIGlzIGVtcHR5IG9yIGZpbGxlZC5cbi8vIFJlc3BvbnNlIGRldGVybWluZXMgaWYgbGFiZWwgaXMgcHJlc2VudGVkIGFib3ZlIGZpZWxkIG9yIGFzIHBsYWNlaG9sZGVyLlxuLy9cbi8vIEBwYXJhbSBvYmpcbi8vIEBwYXJhbSBTU1Jcbi8vIEByZXR1cm5zIHtib29sZWFufSBGYWxzZSB3aGVuIG5vdCBwcmVzZW50IG9yIGVtcHR5IHN0cmluZy5cbi8vICAgICAgICAgICAgICAgICAgICBUcnVlIHdoZW4gYW55IG51bWJlciBvciBzdHJpbmcgd2l0aCBsZW5ndGguXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpbGxlZChvYmopIHtcbiAgdmFyIFNTUiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG4gIHJldHVybiBvYmogJiYgKGhhc1ZhbHVlKG9iai52YWx1ZSkgJiYgb2JqLnZhbHVlICE9PSAnJyB8fCBTU1IgJiYgaGFzVmFsdWUob2JqLmRlZmF1bHRWYWx1ZSkgJiYgb2JqLmRlZmF1bHRWYWx1ZSAhPT0gJycpO1xufSAvLyBEZXRlcm1pbmUgaWYgYW4gSW5wdXQgaXMgYWRvcm5lZCBvbiBzdGFydC5cbi8vIEl0J3MgY29ycmVzcG9uZGluZyB0byB0aGUgbGVmdCB3aXRoIExUUi5cbi8vXG4vLyBAcGFyYW0gb2JqXG4vLyBAcmV0dXJucyB7Ym9vbGVhbn0gRmFsc2Ugd2hlbiBubyBhZG9ybm1lbnRzLlxuLy8gICAgICAgICAgICAgICAgICAgIFRydWUgd2hlbiBhZG9ybmVkIGF0IHRoZSBzdGFydC5cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWRvcm5lZFN0YXJ0KG9iaikge1xuICByZXR1cm4gb2JqLnN0YXJ0QWRvcm5tZW50O1xufSIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB7IGlzRmlsbGVkLCBpc0Fkb3JuZWRTdGFydCB9IGZyb20gJy4uL0lucHV0QmFzZS91dGlscyc7XG5pbXBvcnQgd2l0aFN0eWxlcyBmcm9tICcuLi9zdHlsZXMvd2l0aFN0eWxlcyc7XG5pbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICcuLi91dGlscy9jYXBpdGFsaXplJztcbmltcG9ydCBpc011aUVsZW1lbnQgZnJvbSAnLi4vdXRpbHMvaXNNdWlFbGVtZW50JztcbmltcG9ydCBGb3JtQ29udHJvbENvbnRleHQgZnJvbSAnLi9Gb3JtQ29udHJvbENvbnRleHQnO1xuZXhwb3J0IHZhciBzdHlsZXMgPSB7XG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gIHJvb3Q6IHtcbiAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgIC8vIFJlc2V0IGZpZWxkc2V0IGRlZmF1bHQgc3R5bGUuXG4gICAgbWluV2lkdGg6IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICBtYXJnaW46IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIHZlcnRpY2FsQWxpZ246ICd0b3AnIC8vIEZpeCBhbGlnbm1lbnQgaXNzdWUgb24gU2FmYXJpLlxuXG4gIH0sXG5cbiAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbWFyZ2luPVwibm9ybWFsXCJgLiAqL1xuICBtYXJnaW5Ob3JtYWw6IHtcbiAgICBtYXJnaW5Ub3A6IDE2LFxuICAgIG1hcmdpbkJvdHRvbTogOFxuICB9LFxuXG4gIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYG1hcmdpbj1cImRlbnNlXCJgLiAqL1xuICBtYXJnaW5EZW5zZToge1xuICAgIG1hcmdpblRvcDogOCxcbiAgICBtYXJnaW5Cb3R0b206IDRcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmdWxsV2lkdGg9e3RydWV9YC4gKi9cbiAgZnVsbFdpZHRoOiB7XG4gICAgd2lkdGg6ICcxMDAlJ1xuICB9XG59O1xuLyoqXG4gKiBQcm92aWRlcyBjb250ZXh0IHN1Y2ggYXMgZmlsbGVkL2ZvY3VzZWQvZXJyb3IvcmVxdWlyZWQgZm9yIGZvcm0gaW5wdXRzLlxuICogUmVseWluZyBvbiB0aGUgY29udGV4dCBwcm92aWRlcyBoaWdoIGZsZXhpYmlsaXR5IGFuZCBlbnN1cmVzIHRoYXQgdGhlIHN0YXRlIGFsd2F5cyBzdGF5c1xuICogY29uc2lzdGVudCBhY3Jvc3MgdGhlIGNoaWxkcmVuIG9mIHRoZSBgRm9ybUNvbnRyb2xgLlxuICogVGhpcyBjb250ZXh0IGlzIHVzZWQgYnkgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOlxuICpcbiAqICAtIEZvcm1MYWJlbFxuICogIC0gRm9ybUhlbHBlclRleHRcbiAqICAtIElucHV0XG4gKiAgLSBJbnB1dExhYmVsXG4gKlxuICogWW91IGNhbiBmaW5kIG9uZSBjb21wb3NpdGlvbiBleGFtcGxlIGJlbG93IGFuZCBtb3JlIGdvaW5nIHRvIFt0aGUgZGVtb3NdKC9jb21wb25lbnRzL3RleHQtZmllbGRzLyNjb21wb25lbnRzKS5cbiAqXG4gKiBgYGBqc3hcbiAqIDxGb3JtQ29udHJvbD5cbiAqICAgPElucHV0TGFiZWwgaHRtbEZvcj1cIm15LWlucHV0XCI+RW1haWwgYWRkcmVzczwvSW5wdXRMYWJlbD5cbiAqICAgPElucHV0IGlkPVwibXktaW5wdXRcIiBhcmlhLWRlc2NyaWJlZGJ5PVwibXktaGVscGVyLXRleHRcIiAvPlxuICogICA8Rm9ybUhlbHBlclRleHQgaWQ9XCJteS1oZWxwZXItdGV4dFwiPldlJ2xsIG5ldmVyIHNoYXJlIHlvdXIgZW1haWwuPC9Gb3JtSGVscGVyVGV4dD5cbiAqIDwvRm9ybUNvbnRyb2w+XG4gKiBgYGBcbiAqXG4gKiDimqDvuI9Pbmx5IG9uZSBpbnB1dCBjYW4gYmUgdXNlZCB3aXRoaW4gYSBGb3JtQ29udHJvbC5cbiAqL1xuXG52YXIgRm9ybUNvbnRyb2wgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb3JtQ29udHJvbChwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbG9yID0gX3Byb3BzJGNvbG9yID09PSB2b2lkIDAgPyAncHJpbWFyeScgOiBfcHJvcHMkY29sb3IsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ2RpdicgOiBfcHJvcHMkY29tcG9uZW50LFxuICAgICAgX3Byb3BzJGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBkaXNhYmxlZCA9IF9wcm9wcyRkaXNhYmxlZCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkZGlzYWJsZWQsXG4gICAgICBfcHJvcHMkZXJyb3IgPSBwcm9wcy5lcnJvcixcbiAgICAgIGVycm9yID0gX3Byb3BzJGVycm9yID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRlcnJvcixcbiAgICAgIF9wcm9wcyRmdWxsV2lkdGggPSBwcm9wcy5mdWxsV2lkdGgsXG4gICAgICBmdWxsV2lkdGggPSBfcHJvcHMkZnVsbFdpZHRoID09PSB2b2lkIDAgPyBmYWxzZSA6IF9wcm9wcyRmdWxsV2lkdGgsXG4gICAgICB2aXN1YWxseUZvY3VzZWQgPSBwcm9wcy5mb2N1c2VkLFxuICAgICAgX3Byb3BzJGhpZGRlbkxhYmVsID0gcHJvcHMuaGlkZGVuTGFiZWwsXG4gICAgICBoaWRkZW5MYWJlbCA9IF9wcm9wcyRoaWRkZW5MYWJlbCA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkaGlkZGVuTGFiZWwsXG4gICAgICBfcHJvcHMkbWFyZ2luID0gcHJvcHMubWFyZ2luLFxuICAgICAgbWFyZ2luID0gX3Byb3BzJG1hcmdpbiA9PT0gdm9pZCAwID8gJ25vbmUnIDogX3Byb3BzJG1hcmdpbixcbiAgICAgIF9wcm9wcyRyZXF1aXJlZCA9IHByb3BzLnJlcXVpcmVkLFxuICAgICAgcmVxdWlyZWQgPSBfcHJvcHMkcmVxdWlyZWQgPT09IHZvaWQgMCA/IGZhbHNlIDogX3Byb3BzJHJlcXVpcmVkLFxuICAgICAgc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICBfcHJvcHMkdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICB2YXJpYW50ID0gX3Byb3BzJHZhcmlhbnQgPT09IHZvaWQgMCA/ICdzdGFuZGFyZCcgOiBfcHJvcHMkdmFyaWFudCxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGlsZHJlblwiLCBcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNvbXBvbmVudFwiLCBcImRpc2FibGVkXCIsIFwiZXJyb3JcIiwgXCJmdWxsV2lkdGhcIiwgXCJmb2N1c2VkXCIsIFwiaGlkZGVuTGFiZWxcIiwgXCJtYXJnaW5cIiwgXCJyZXF1aXJlZFwiLCBcInNpemVcIiwgXCJ2YXJpYW50XCJdKTtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUoZnVuY3Rpb24gKCkge1xuICAgIC8vIFdlIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjaGlsZHJlbiBhbmQgZmluZCB0aGUgSW5wdXQgaW4gb3JkZXJcbiAgICAvLyB0byBmdWxseSBzdXBwb3J0IHNlcnZlci1zaWRlIHJlbmRlcmluZy5cbiAgICB2YXIgaW5pdGlhbEFkb3JuZWRTdGFydCA9IGZhbHNlO1xuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKCFpc011aUVsZW1lbnQoY2hpbGQsIFsnSW5wdXQnLCAnU2VsZWN0J10pKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGlucHV0ID0gaXNNdWlFbGVtZW50KGNoaWxkLCBbJ1NlbGVjdCddKSA/IGNoaWxkLnByb3BzLmlucHV0IDogY2hpbGQ7XG5cbiAgICAgICAgaWYgKGlucHV0ICYmIGlzQWRvcm5lZFN0YXJ0KGlucHV0LnByb3BzKSkge1xuICAgICAgICAgIGluaXRpYWxBZG9ybmVkU3RhcnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5pdGlhbEFkb3JuZWRTdGFydDtcbiAgfSksXG4gICAgICBhZG9ybmVkU3RhcnQgPSBfUmVhY3QkdXNlU3RhdGVbMF0sXG4gICAgICBzZXRBZG9ybmVkU3RhcnQgPSBfUmVhY3QkdXNlU3RhdGVbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTIgPSBSZWFjdC51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2UgbmVlZCB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGNoaWxkcmVuIGFuZCBmaW5kIHRoZSBJbnB1dCBpbiBvcmRlclxuICAgIC8vIHRvIGZ1bGx5IHN1cHBvcnQgc2VydmVyLXNpZGUgcmVuZGVyaW5nLlxuICAgIHZhciBpbml0aWFsRmlsbGVkID0gZmFsc2U7XG5cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoIWlzTXVpRWxlbWVudChjaGlsZCwgWydJbnB1dCcsICdTZWxlY3QnXSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNGaWxsZWQoY2hpbGQucHJvcHMsIHRydWUpKSB7XG4gICAgICAgICAgaW5pdGlhbEZpbGxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBpbml0aWFsRmlsbGVkO1xuICB9KSxcbiAgICAgIGZpbGxlZCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRGaWxsZWQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUzID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpLFxuICAgICAgX2ZvY3VzZWQgPSBfUmVhY3QkdXNlU3RhdGUzWzBdLFxuICAgICAgc2V0Rm9jdXNlZCA9IF9SZWFjdCR1c2VTdGF0ZTNbMV07XG5cbiAgdmFyIGZvY3VzZWQgPSB2aXN1YWxseUZvY3VzZWQgIT09IHVuZGVmaW5lZCA/IHZpc3VhbGx5Rm9jdXNlZCA6IF9mb2N1c2VkO1xuXG4gIGlmIChkaXNhYmxlZCAmJiBmb2N1c2VkKSB7XG4gICAgc2V0Rm9jdXNlZChmYWxzZSk7XG4gIH1cblxuICB2YXIgcmVnaXN0ZXJFZmZlY3Q7XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICB2YXIgcmVnaXN0ZXJlZElucHV0ID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcblxuICAgIHJlZ2lzdGVyRWZmZWN0ID0gZnVuY3Rpb24gcmVnaXN0ZXJFZmZlY3QoKSB7XG4gICAgICBpZiAocmVnaXN0ZXJlZElucHV0LmN1cnJlbnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihbJ01hdGVyaWFsLVVJOiBUaGVyZSBhcmUgbXVsdGlwbGUgSW5wdXRCYXNlIGNvbXBvbmVudHMgaW5zaWRlIGEgRm9ybUNvbnRyb2wuJywgJ1RoaXMgaXMgbm90IHN1cHBvcnRlZC4gSXQgbWlnaHQgY2F1c2UgaW5maW5pdGUgcmVuZGVyaW5nIGxvb3BzLicsICdPbmx5IHVzZSBvbmUgSW5wdXRCYXNlLiddLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cblxuICAgICAgcmVnaXN0ZXJlZElucHV0LmN1cnJlbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmVnaXN0ZXJlZElucHV0LmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuXG4gIHZhciBvbkZpbGxlZCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICBzZXRGaWxsZWQodHJ1ZSk7XG4gIH0sIFtdKTtcbiAgdmFyIG9uRW1wdHkgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgc2V0RmlsbGVkKGZhbHNlKTtcbiAgfSwgW10pO1xuICB2YXIgY2hpbGRDb250ZXh0ID0ge1xuICAgIGFkb3JuZWRTdGFydDogYWRvcm5lZFN0YXJ0LFxuICAgIHNldEFkb3JuZWRTdGFydDogc2V0QWRvcm5lZFN0YXJ0LFxuICAgIGNvbG9yOiBjb2xvcixcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgZXJyb3I6IGVycm9yLFxuICAgIGZpbGxlZDogZmlsbGVkLFxuICAgIGZvY3VzZWQ6IGZvY3VzZWQsXG4gICAgZnVsbFdpZHRoOiBmdWxsV2lkdGgsXG4gICAgaGlkZGVuTGFiZWw6IGhpZGRlbkxhYmVsLFxuICAgIG1hcmdpbjogKHNpemUgPT09ICdzbWFsbCcgPyAnZGVuc2UnIDogdW5kZWZpbmVkKSB8fCBtYXJnaW4sXG4gICAgb25CbHVyOiBmdW5jdGlvbiBvbkJsdXIoKSB7XG4gICAgICBzZXRGb2N1c2VkKGZhbHNlKTtcbiAgICB9LFxuICAgIG9uRW1wdHk6IG9uRW1wdHksXG4gICAgb25GaWxsZWQ6IG9uRmlsbGVkLFxuICAgIG9uRm9jdXM6IGZ1bmN0aW9uIG9uRm9jdXMoKSB7XG4gICAgICBzZXRGb2N1c2VkKHRydWUpO1xuICAgIH0sXG4gICAgcmVnaXN0ZXJFZmZlY3Q6IHJlZ2lzdGVyRWZmZWN0LFxuICAgIHJlcXVpcmVkOiByZXF1aXJlZCxcbiAgICB2YXJpYW50OiB2YXJpYW50XG4gIH07XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3JtQ29udHJvbENvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogY2hpbGRDb250ZXh0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgbWFyZ2luICE9PSAnbm9uZScgJiYgY2xhc3Nlc1tcIm1hcmdpblwiLmNvbmNhdChjYXBpdGFsaXplKG1hcmdpbikpXSwgZnVsbFdpZHRoICYmIGNsYXNzZXMuZnVsbFdpZHRoKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIGNoaWxkcmVuKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1Db250cm9sLnByb3BUeXBlcyA9IHtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2FybmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyB8IFRoZXNlIFByb3BUeXBlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIFR5cGVTY3JpcHQgdHlwZSBkZWZpbml0aW9ucyB8XG4gIC8vIHwgICAgIFRvIHVwZGF0ZSB0aGVtIGVkaXQgdGhlIGQudHMgZmlsZSBhbmQgcnVuIFwieWFybiBwcm9wdHlwZXNcIiAgICAgfFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0aGUgZm9ybSBjb250cm9sLlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBjb21wb25lbnQuIEl0IHN1cHBvcnRzIHRob3NlIHRoZW1lIGNvbG9ycyB0aGF0IG1ha2Ugc2Vuc2UgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihbJ3ByaW1hcnknLCAnc2Vjb25kYXJ5J10pLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgbGFiZWwsIGlucHV0IGFuZCBoZWxwZXIgdGV4dCBzaG91bGQgYmUgZGlzcGxheWVkIGluIGEgZGlzYWJsZWQgc3RhdGUuXG4gICAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGxhYmVsIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYW4gZXJyb3Igc3RhdGUuXG4gICAqL1xuICBlcnJvcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNvbXBvbmVudCB3aWxsIGJlIGRpc3BsYXllZCBpbiBmb2N1c2VkIHN0YXRlLlxuICAgKi9cbiAgZm9jdXNlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGNvbXBvbmVudCB3aWxsIHRha2UgdXAgdGhlIGZ1bGwgd2lkdGggb2YgaXRzIGNvbnRhaW5lci5cbiAgICovXG4gIGZ1bGxXaWR0aDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGxhYmVsIHdpbGwgYmUgaGlkZGVuLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8gaW5jcmVhc2UgZGVuc2l0eSBmb3IgYSBgRmlsbGVkSW5wdXRgLlxuICAgKiBCZSBzdXJlIHRvIGFkZCBgYXJpYS1sYWJlbGAgdG8gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIGhpZGRlbkxhYmVsOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYGRlbnNlYCBvciBgbm9ybWFsYCwgd2lsbCBhZGp1c3QgdmVydGljYWwgc3BhY2luZyBvZiB0aGlzIGFuZCBjb250YWluZWQgY29tcG9uZW50cy5cbiAgICovXG4gIG1hcmdpbjogUHJvcFR5cGVzLm9uZU9mKFsnZGVuc2UnLCAnbm9uZScsICdub3JtYWwnXSksXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGxhYmVsIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgaW5wdXQgaXMgcmVxdWlyZWQuXG4gICAqL1xuICByZXF1aXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSB0ZXh0IGZpZWxkLlxuICAgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFsnbWVkaXVtJywgJ3NtYWxsJ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgdmFyaWFudCB0byB1c2UuXG4gICAqL1xuICB2YXJpYW50OiBQcm9wVHlwZXMub25lT2YoWydmaWxsZWQnLCAnb3V0bGluZWQnLCAnc3RhbmRhcmQnXSlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpRm9ybUNvbnRyb2wnXG59KShGb3JtQ29udHJvbCk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBjbHN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgcmVmVHlwZSB9IGZyb20gJ0BtYXRlcmlhbC11aS91dGlscyc7XG5pbXBvcnQgeyB1c2VGb3JtQ29udHJvbCB9IGZyb20gJy4uL0Zvcm1Db250cm9sJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmltcG9ydCBUeXBvZ3JhcGh5IGZyb20gJy4uL1R5cG9ncmFwaHknO1xuaW1wb3J0IGNhcGl0YWxpemUgZnJvbSAnLi4vdXRpbHMvY2FwaXRhbGl6ZSc7XG5leHBvcnQgdmFyIHN0eWxlcyA9IGZ1bmN0aW9uIHN0eWxlcyh0aGVtZSkge1xuICByZXR1cm4ge1xuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQuICovXG4gICAgcm9vdDoge1xuICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAvLyBGb3IgY29ycmVjdCBhbGlnbm1lbnQgd2l0aCB0aGUgdGV4dC5cbiAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLFxuICAgICAgV2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I6ICd0cmFuc3BhcmVudCcsXG4gICAgICBtYXJnaW5MZWZ0OiAtMTEsXG4gICAgICBtYXJnaW5SaWdodDogMTYsXG4gICAgICAvLyB1c2VkIGZvciByb3cgcHJlc2VudGF0aW9uIG9mIHJhZGlvL2NoZWNrYm94XG4gICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbGFiZWxQbGFjZW1lbnQ9XCJzdGFydFwiYC4gKi9cbiAgICBsYWJlbFBsYWNlbWVudFN0YXJ0OiB7XG4gICAgICBmbGV4RGlyZWN0aW9uOiAncm93LXJldmVyc2UnLFxuICAgICAgbWFyZ2luTGVmdDogMTYsXG4gICAgICAvLyB1c2VkIGZvciByb3cgcHJlc2VudGF0aW9uIG9mIHJhZGlvL2NoZWNrYm94XG4gICAgICBtYXJnaW5SaWdodDogLTExXG4gICAgfSxcblxuICAgIC8qIFN0eWxlcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGxhYmVsUGxhY2VtZW50PVwidG9wXCJgLiAqL1xuICAgIGxhYmVsUGxhY2VtZW50VG9wOiB7XG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uLXJldmVyc2UnLFxuICAgICAgbWFyZ2luTGVmdDogMTZcbiAgICB9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbGFiZWxQbGFjZW1lbnQ9XCJib3R0b21cImAuICovXG4gICAgbGFiZWxQbGFjZW1lbnRCb3R0b206IHtcbiAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgbWFyZ2luTGVmdDogMTZcbiAgICB9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZGlzYWJsZWQ9e3RydWV9YC4gKi9cbiAgICBkaXNhYmxlZDoge30sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgbGFiZWwncyBUeXBvZ3JhcGh5IGNvbXBvbmVudC4gKi9cbiAgICBsYWJlbDoge1xuICAgICAgJyYkZGlzYWJsZWQnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQuZGlzYWJsZWRcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiBEcm9wIGluIHJlcGxhY2VtZW50IG9mIHRoZSBgUmFkaW9gLCBgU3dpdGNoYCBhbmQgYENoZWNrYm94YCBjb21wb25lbnQuXG4gKiBVc2UgdGhpcyBjb21wb25lbnQgaWYgeW91IHdhbnQgdG8gZGlzcGxheSBhbiBleHRyYSBsYWJlbC5cbiAqL1xuXG52YXIgRm9ybUNvbnRyb2xMYWJlbCA9IC8qI19fUFVSRV9fKi9SZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIEZvcm1Db250cm9sTGFiZWwocHJvcHMsIHJlZikge1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQsXG4gICAgICBjbGFzc2VzID0gcHJvcHMuY2xhc3NlcyxcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRyb2wgPSBwcm9wcy5jb250cm9sLFxuICAgICAgZGlzYWJsZWRQcm9wID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBpbnB1dFJlZiA9IHByb3BzLmlucHV0UmVmLFxuICAgICAgbGFiZWwgPSBwcm9wcy5sYWJlbCxcbiAgICAgIF9wcm9wcyRsYWJlbFBsYWNlbWVudCA9IHByb3BzLmxhYmVsUGxhY2VtZW50LFxuICAgICAgbGFiZWxQbGFjZW1lbnQgPSBfcHJvcHMkbGFiZWxQbGFjZW1lbnQgPT09IHZvaWQgMCA/ICdlbmQnIDogX3Byb3BzJGxhYmVsUGxhY2VtZW50LFxuICAgICAgbmFtZSA9IHByb3BzLm5hbWUsXG4gICAgICBvbkNoYW5nZSA9IHByb3BzLm9uQ2hhbmdlLFxuICAgICAgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgIG90aGVyID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByb3BzLCBbXCJjaGVja2VkXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRyb2xcIiwgXCJkaXNhYmxlZFwiLCBcImlucHV0UmVmXCIsIFwibGFiZWxcIiwgXCJsYWJlbFBsYWNlbWVudFwiLCBcIm5hbWVcIiwgXCJvbkNoYW5nZVwiLCBcInZhbHVlXCJdKTtcblxuICB2YXIgbXVpRm9ybUNvbnRyb2wgPSB1c2VGb3JtQ29udHJvbCgpO1xuICB2YXIgZGlzYWJsZWQgPSBkaXNhYmxlZFByb3A7XG5cbiAgaWYgKHR5cGVvZiBkaXNhYmxlZCA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnRyb2wucHJvcHMuZGlzYWJsZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZGlzYWJsZWQgPSBjb250cm9sLnByb3BzLmRpc2FibGVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBkaXNhYmxlZCA9PT0gJ3VuZGVmaW5lZCcgJiYgbXVpRm9ybUNvbnRyb2wpIHtcbiAgICBkaXNhYmxlZCA9IG11aUZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgdmFyIGNvbnRyb2xQcm9wcyA9IHtcbiAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgfTtcbiAgWydjaGVja2VkJywgJ25hbWUnLCAnb25DaGFuZ2UnLCAndmFsdWUnLCAnaW5wdXRSZWYnXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRyb2wucHJvcHNba2V5XSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHByb3BzW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb250cm9sUHJvcHNba2V5XSA9IHByb3BzW2tleV07XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIiwgX2V4dGVuZHMoe1xuICAgIGNsYXNzTmFtZTogY2xzeChjbGFzc2VzLnJvb3QsIGNsYXNzTmFtZSwgbGFiZWxQbGFjZW1lbnQgIT09ICdlbmQnICYmIGNsYXNzZXNbXCJsYWJlbFBsYWNlbWVudFwiLmNvbmNhdChjYXBpdGFsaXplKGxhYmVsUGxhY2VtZW50KSldLCBkaXNhYmxlZCAmJiBjbGFzc2VzLmRpc2FibGVkKSxcbiAgICByZWY6IHJlZlxuICB9LCBvdGhlciksIC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY29udHJvbCwgY29udHJvbFByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHlwb2dyYXBoeSwge1xuICAgIGNvbXBvbmVudDogXCJzcGFuXCIsXG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMubGFiZWwsIGRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQpXG4gIH0sIGxhYmVsKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1Db250cm9sTGFiZWwucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgY29tcG9uZW50IGFwcGVhcnMgc2VsZWN0ZWQuXG4gICAqL1xuICBjaGVja2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogT3ZlcnJpZGUgb3IgZXh0ZW5kIHRoZSBzdHlsZXMgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgKiBTZWUgW0NTUyBBUEldKCNjc3MpIGJlbG93IGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBjbGFzc2VzOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEEgY29udHJvbCBlbGVtZW50LiBGb3IgaW5zdGFuY2UsIGl0IGNhbiBiZSBiZSBhIGBSYWRpb2AsIGEgYFN3aXRjaGAgb3IgYSBgQ2hlY2tib3hgLlxuICAgKi9cbiAgY29udHJvbDogUHJvcFR5cGVzLmVsZW1lbnQuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgY29udHJvbCB3aWxsIGJlIGRpc2FibGVkLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBQYXNzIGEgcmVmIHRvIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBpbnB1dFJlZjogcmVmVHlwZSxcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gYmUgdXNlZCBpbiBhbiBlbmNsb3NpbmcgbGFiZWwgZWxlbWVudC5cbiAgICovXG4gIGxhYmVsOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogVGhlIHBvc2l0aW9uIG9mIHRoZSBsYWJlbC5cbiAgICovXG4gIGxhYmVsUGxhY2VtZW50OiBQcm9wVHlwZXMub25lT2YoWydib3R0b20nLCAnZW5kJywgJ3N0YXJ0JywgJ3RvcCddKSxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgc3RhdGUgaXMgY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IFRoZSBldmVudCBzb3VyY2Ugb2YgdGhlIGNhbGxiYWNrLlxuICAgKiBZb3UgY2FuIHB1bGwgb3V0IHRoZSBuZXcgY2hlY2tlZCBzdGF0ZSBieSBhY2Nlc3NpbmcgYGV2ZW50LnRhcmdldC5jaGVja2VkYCAoYm9vbGVhbikuXG4gICAqL1xuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5hbnlcbn0gOiB2b2lkIDA7XG5leHBvcnQgZGVmYXVsdCB3aXRoU3R5bGVzKHN0eWxlcywge1xuICBuYW1lOiAnTXVpRm9ybUNvbnRyb2xMYWJlbCdcbn0pKEZvcm1Db250cm9sTGFiZWwpOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0ge1xuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50LiAqL1xuICByb290OiB7XG4gICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgIGZsZXhXcmFwOiAnd3JhcCdcbiAgfSxcblxuICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGByb3c9e3RydWV9YC4gKi9cbiAgcm93OiB7XG4gICAgZmxleERpcmVjdGlvbjogJ3JvdydcbiAgfVxufTtcbi8qKlxuICogYEZvcm1Hcm91cGAgd3JhcHMgY29udHJvbHMgc3VjaCBhcyBgQ2hlY2tib3hgIGFuZCBgU3dpdGNoYC5cbiAqIEl0IHByb3ZpZGVzIGNvbXBhY3Qgcm93IGxheW91dC5cbiAqIEZvciB0aGUgYFJhZGlvYCwgeW91IHNob3VsZCBiZSB1c2luZyB0aGUgYFJhZGlvR3JvdXBgIGNvbXBvbmVudCBpbnN0ZWFkIG9mIHRoaXMgb25lLlxuICovXG5cbnZhciBGb3JtR3JvdXAgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb3JtR3JvdXAocHJvcHMsIHJlZikge1xuICB2YXIgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkcm93ID0gcHJvcHMucm93LFxuICAgICAgcm93ID0gX3Byb3BzJHJvdyA9PT0gdm9pZCAwID8gZmFsc2UgOiBfcHJvcHMkcm93LFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNsYXNzZXNcIiwgXCJjbGFzc05hbWVcIiwgXCJyb3dcIl0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgY2xhc3NOYW1lLCByb3cgJiYgY2xhc3Nlcy5yb3cpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSk7XG59KTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1Hcm91cC5wcm9wVHlwZXMgPSB7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhcm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gfCBUaGVzZSBQcm9wVHlwZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBUeXBlU2NyaXB0IHR5cGUgZGVmaW5pdGlvbnMgfFxuICAvLyB8ICAgICBUbyB1cGRhdGUgdGhlbSBlZGl0IHRoZSBkLnRzIGZpbGUgYW5kIHJ1biBcInlhcm4gcHJvcHR5cGVzXCIgICAgIHxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBvciBleHRlbmQgdGhlIHN0eWxlcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAqIFNlZSBbQ1NTIEFQSV0oI2NzcykgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIGNsYXNzZXM6IFByb3BUeXBlcy5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogRGlzcGxheSBncm91cCBvZiBlbGVtZW50cyBpbiBhIGNvbXBhY3Qgcm93LlxuICAgKi9cbiAgcm93OiBQcm9wVHlwZXMuYm9vbFxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlGb3JtR3JvdXAnXG59KShGb3JtR3JvdXApOyIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgY2xzeCBmcm9tICdjbHN4JztcbmltcG9ydCBmb3JtQ29udHJvbFN0YXRlIGZyb20gJy4uL0Zvcm1Db250cm9sL2Zvcm1Db250cm9sU3RhdGUnO1xuaW1wb3J0IHVzZUZvcm1Db250cm9sIGZyb20gJy4uL0Zvcm1Db250cm9sL3VzZUZvcm1Db250cm9sJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiBfZXh0ZW5kcyh7XG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LnNlY29uZGFyeVxuICAgIH0sIHRoZW1lLnR5cG9ncmFwaHkuY2FwdGlvbiwge1xuICAgICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgICBtYXJnaW5Ub3A6IDMsXG4gICAgICBtYXJnaW46IDAsXG4gICAgICAnJiRkaXNhYmxlZCc6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUudGV4dC5kaXNhYmxlZFxuICAgICAgfSxcbiAgICAgICcmJGVycm9yJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluXG4gICAgICB9XG4gICAgfSksXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBlcnJvcj17dHJ1ZX1gLiAqL1xuICAgIGVycm9yOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGRpc2FibGVkPXt0cnVlfWAuICovXG4gICAgZGlzYWJsZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgbWFyZ2luPVwiZGVuc2VcImAuICovXG4gICAgbWFyZ2luRGVuc2U6IHtcbiAgICAgIG1hcmdpblRvcDogNFxuICAgIH0sXG5cbiAgICAvKiBTdHlsZXMgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGB2YXJpYW50PVwiZmlsbGVkXCJgIG9yIGB2YXJpYW50PVwib3V0bGluZWRcImAuICovXG4gICAgY29udGFpbmVkOiB7XG4gICAgICBtYXJnaW5MZWZ0OiAxNCxcbiAgICAgIG1hcmdpblJpZ2h0OiAxNFxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmb2N1c2VkPXt0cnVlfWAuICovXG4gICAgZm9jdXNlZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmaWxsZWQ9e3RydWV9YC4gKi9cbiAgICBmaWxsZWQ6IHt9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgcmVxdWlyZWQ9e3RydWV9YC4gKi9cbiAgICByZXF1aXJlZDoge31cbiAgfTtcbn07XG52YXIgRm9ybUhlbHBlclRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb3JtSGVscGVyVGV4dChwcm9wcywgcmVmKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NlcyA9IHByb3BzLmNsYXNzZXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBfcHJvcHMkY29tcG9uZW50ID0gcHJvcHMuY29tcG9uZW50LFxuICAgICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudCA9PT0gdm9pZCAwID8gJ3AnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBlcnJvciA9IHByb3BzLmVycm9yLFxuICAgICAgZmlsbGVkID0gcHJvcHMuZmlsbGVkLFxuICAgICAgZm9jdXNlZCA9IHByb3BzLmZvY3VzZWQsXG4gICAgICBtYXJnaW4gPSBwcm9wcy5tYXJnaW4sXG4gICAgICByZXF1aXJlZCA9IHByb3BzLnJlcXVpcmVkLFxuICAgICAgdmFyaWFudCA9IHByb3BzLnZhcmlhbnQsXG4gICAgICBvdGhlciA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhwcm9wcywgW1wiY2hpbGRyZW5cIiwgXCJjbGFzc2VzXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29tcG9uZW50XCIsIFwiZGlzYWJsZWRcIiwgXCJlcnJvclwiLCBcImZpbGxlZFwiLCBcImZvY3VzZWRcIiwgXCJtYXJnaW5cIiwgXCJyZXF1aXJlZFwiLCBcInZhcmlhbnRcIl0pO1xuXG4gIHZhciBtdWlGb3JtQ29udHJvbCA9IHVzZUZvcm1Db250cm9sKCk7XG4gIHZhciBmY3MgPSBmb3JtQ29udHJvbFN0YXRlKHtcbiAgICBwcm9wczogcHJvcHMsXG4gICAgbXVpRm9ybUNvbnRyb2w6IG11aUZvcm1Db250cm9sLFxuICAgIHN0YXRlczogWyd2YXJpYW50JywgJ21hcmdpbicsICdkaXNhYmxlZCcsICdlcnJvcicsICdmaWxsZWQnLCAnZm9jdXNlZCcsICdyZXF1aXJlZCddXG4gIH0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBfZXh0ZW5kcyh7XG4gICAgY2xhc3NOYW1lOiBjbHN4KGNsYXNzZXMucm9vdCwgKGZjcy52YXJpYW50ID09PSAnZmlsbGVkJyB8fCBmY3MudmFyaWFudCA9PT0gJ291dGxpbmVkJykgJiYgY2xhc3Nlcy5jb250YWluZWQsIGNsYXNzTmFtZSwgZmNzLmRpc2FibGVkICYmIGNsYXNzZXMuZGlzYWJsZWQsIGZjcy5lcnJvciAmJiBjbGFzc2VzLmVycm9yLCBmY3MuZmlsbGVkICYmIGNsYXNzZXMuZmlsbGVkLCBmY3MuZm9jdXNlZCAmJiBjbGFzc2VzLmZvY3VzZWQsIGZjcy5yZXF1aXJlZCAmJiBjbGFzc2VzLnJlcXVpcmVkLCBmY3MubWFyZ2luID09PSAnZGVuc2UnICYmIGNsYXNzZXMubWFyZ2luRGVuc2UpLFxuICAgIHJlZjogcmVmXG4gIH0sIG90aGVyKSwgY2hpbGRyZW4gPT09ICcgJyA/XG4gIC8qI19fUFVSRV9fKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWRhbmdlclxuICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtcbiAgICAgIF9faHRtbDogJyYjODIwMzsnXG4gICAgfVxuICB9KSA6IGNoaWxkcmVuKTtcbn0pO1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRm9ybUhlbHBlclRleHQucHJvcFR5cGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXYXJuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHwgVGhlc2UgUHJvcFR5cGVzIGFyZSBnZW5lcmF0ZWQgZnJvbSB0aGUgVHlwZVNjcmlwdCB0eXBlIGRlZmluaXRpb25zIHxcbiAgLy8gfCAgICAgVG8gdXBkYXRlIHRoZW0gZWRpdCB0aGUgZC50cyBmaWxlIGFuZCBydW4gXCJ5YXJuIHByb3B0eXBlc1wiICAgICB8XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogSWYgYCcgJ2AgaXMgcHJvdmlkZWQsIHRoZSBjb21wb25lbnQgcmVzZXJ2ZXMgb25lIGxpbmUgaGVpZ2h0IGZvciBkaXNwbGF5aW5nIGEgZnV0dXJlIG1lc3NhZ2UuXG4gICAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIG9yIGV4dGVuZCB0aGUgc3R5bGVzIGFwcGxpZWQgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogU2VlIFtDU1MgQVBJXSgjY3NzKSBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgY2xhc3NlczogUHJvcFR5cGVzLm9iamVjdCxcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHRoZSByb290IG5vZGUuXG4gICAqIEVpdGhlciBhIHN0cmluZyB0byB1c2UgYSBIVE1MIGVsZW1lbnQgb3IgYSBjb21wb25lbnQuXG4gICAqL1xuICBjb21wb25lbnQ6IFByb3BUeXBlc1xuICAvKiBAdHlwZXNjcmlwdC10by1wcm9wdHlwZXMtaWdub3JlICovXG4gIC5lbGVtZW50VHlwZSxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaGVscGVyIHRleHQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBhIGRpc2FibGVkIHN0YXRlLlxuICAgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGhlbHBlciB0ZXh0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYW4gZXJyb3Igc3RhdGUuXG4gICAqL1xuICBlcnJvcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGhlbHBlciB0ZXh0IHNob3VsZCB1c2UgZmlsbGVkIGNsYXNzZXMga2V5LlxuICAgKi9cbiAgZmlsbGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgaGVscGVyIHRleHQgc2hvdWxkIHVzZSBmb2N1c2VkIGNsYXNzZXMga2V5LlxuICAgKi9cbiAgZm9jdXNlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIElmIGBkZW5zZWAsIHdpbGwgYWRqdXN0IHZlcnRpY2FsIHNwYWNpbmcuIFRoaXMgaXMgbm9ybWFsbHkgb2J0YWluZWQgdmlhIGNvbnRleHQgZnJvbVxuICAgKiBGb3JtQ29udHJvbC5cbiAgICovXG4gIG1hcmdpbjogUHJvcFR5cGVzLm9uZU9mKFsnZGVuc2UnXSksXG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhlIGhlbHBlciB0ZXh0IHNob3VsZCB1c2UgcmVxdWlyZWQgY2xhc3NlcyBrZXkuXG4gICAqL1xuICByZXF1aXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFRoZSB2YXJpYW50IHRvIHVzZS5cbiAgICovXG4gIHZhcmlhbnQ6IFByb3BUeXBlcy5vbmVPZihbJ2ZpbGxlZCcsICdvdXRsaW5lZCcsICdzdGFuZGFyZCddKVxufSA6IHZvaWQgMDtcbmV4cG9ydCBkZWZhdWx0IHdpdGhTdHlsZXMoc3R5bGVzLCB7XG4gIG5hbWU6ICdNdWlGb3JtSGVscGVyVGV4dCdcbn0pKEZvcm1IZWxwZXJUZXh0KTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgZm9ybUNvbnRyb2xTdGF0ZSBmcm9tICcuLi9Gb3JtQ29udHJvbC9mb3JtQ29udHJvbFN0YXRlJztcbmltcG9ydCB1c2VGb3JtQ29udHJvbCBmcm9tICcuLi9Gb3JtQ29udHJvbC91c2VGb3JtQ29udHJvbCc7XG5pbXBvcnQgY2FwaXRhbGl6ZSBmcm9tICcuLi91dGlscy9jYXBpdGFsaXplJztcbmltcG9ydCB3aXRoU3R5bGVzIGZyb20gJy4uL3N0eWxlcy93aXRoU3R5bGVzJztcbmV4cG9ydCB2YXIgc3R5bGVzID0gZnVuY3Rpb24gc3R5bGVzKHRoZW1lKSB7XG4gIHJldHVybiB7XG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudC4gKi9cbiAgICByb290OiBfZXh0ZW5kcyh7XG4gICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS50ZXh0LnNlY29uZGFyeVxuICAgIH0sIHRoZW1lLnR5cG9ncmFwaHkuYm9keTEsIHtcbiAgICAgIGxpbmVIZWlnaHQ6IDEsXG4gICAgICBwYWRkaW5nOiAwLFxuICAgICAgJyYkZm9jdXNlZCc6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUucHJpbWFyeS5tYWluXG4gICAgICB9LFxuICAgICAgJyYkZGlzYWJsZWQnOiB7XG4gICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnRleHQuZGlzYWJsZWRcbiAgICAgIH0sXG4gICAgICAnJiRlcnJvcic6IHtcbiAgICAgICAgY29sb3I6IHRoZW1lLnBhbGV0dGUuZXJyb3IubWFpblxuICAgICAgfVxuICAgIH0pLFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiB0aGUgY29sb3IgaXMgc2Vjb25kYXJ5LiAqL1xuICAgIGNvbG9yU2Vjb25kYXJ5OiB7XG4gICAgICAnJiRmb2N1c2VkJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5zZWNvbmRhcnkubWFpblxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBmb2N1c2VkPXt0cnVlfWAuICovXG4gICAgZm9jdXNlZDoge30sXG5cbiAgICAvKiBQc2V1ZG8tY2xhc3MgYXBwbGllZCB0byB0aGUgcm9vdCBlbGVtZW50IGlmIGBkaXNhYmxlZD17dHJ1ZX1gLiAqL1xuICAgIGRpc2FibGVkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYGVycm9yPXt0cnVlfWAuICovXG4gICAgZXJyb3I6IHt9LFxuXG4gICAgLyogUHNldWRvLWNsYXNzIGFwcGxpZWQgdG8gdGhlIHJvb3QgZWxlbWVudCBpZiBgZmlsbGVkPXt0cnVlfWAuICovXG4gICAgZmlsbGVkOiB7fSxcblxuICAgIC8qIFBzZXVkby1jbGFzcyBhcHBsaWVkIHRvIHRoZSByb290IGVsZW1lbnQgaWYgYHJlcXVpcmVkPXt0cnVlfWAuICovXG4gICAgcmVxdWlyZWQ6IHt9LFxuXG4gICAgLyogU3R5bGVzIGFwcGxpZWQgdG8gdGhlIGFzdGVyaXNrIGVsZW1lbnQuICovXG4gICAgYXN0ZXJpc2s6IHtcbiAgICAgICcmJGVycm9yJzoge1xuICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5lcnJvci5tYWluXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBGb3JtTGFiZWwgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihmdW5jdGlvbiBGb3JtTGFiZWwocHJvcHMsIHJlZikge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzZXMgPSBwcm9wcy5jbGFzc2VzLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIF9wcm9wcyRjb21wb25lbnQgPSBwcm9wcy5jb21wb25lbnQsXG4gICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50ID09PSB2b2lkIDAgPyAnbGFiZWwnIDogX3Byb3BzJGNvbXBvbmVudCxcbiAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBlcnJvciA9IHByb3BzLmVycm9yLFxuICAgICAgZmlsbGVkID0gcHJvcHMuZmlsbGVkLFxuICAgICAgZm9jdXNlZCA9IHByb3BzLmZvY3VzZWQsXG4gICAgICByZXF1aXJlZCA9IHByb3BzLnJlcXVpcmVkLFxuICAgICAgb3RoZXIgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJvcHMsIFtcImNoaWxkcmVuXCIsIFwiY2xhc3Nlc1wiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29tcG9uZW50XCIsIFwiZGlzYWJsZWRcIiwgXCJlcnJvclwiLCBcImZpbGxlZFwiLCBcImZvY3VzZWRcIiwgXCJyZXF1aXJlZFwiXSk7XG5cbiAgdmFyIG11aUZvcm1Db250cm9sID0gdXNlRm9ybUNvbnRyb2woKTtcbiAgdmFyIGZjcyA9IGZvcm1Db250cm9sU3RhdGUoe1xuICAgIHByb3BzOiBwcm9wcyxcbiAgICBtdWlGb3JtQ29udHJvbDogbXVpRm9ybUNvbnRyb2wsXG4gICAgc3RhdGVzOiBbJ2NvbG9yJywgJ3JlcXVpcmVkJywgJ2ZvY3VzZWQnLCAnZGlzYWJsZWQnLCAnZXJyb3InLCAnZmlsbGVkJ11cbiAgfSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIF9leHRlbmRzKHtcbiAgICBjbGFzc05hbWU6IGNsc3goY2xhc3Nlcy5yb290LCBjbGFzc2VzW1wiY29sb3JcIi5jb25jYXQoY2FwaXRhbGl6ZS |
View raw
(Sorry about that, but we can’t show files that are this big right now.)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment