dcl-npc-toolkit-ai-version
Version:
A collection of tools for creating Non-Player-Characters (NPCs). These are capable of having conversations with the player, and play different animations. AI usage is added atop of it
201 lines • 30.1 kB
JavaScript
import ReactEcs, { Input, Label, UiEntity } from '@dcl/sdk/react-ecs';
import { realHeight, realWidth } from "./dialog";
import { Color4 } from '@dcl/sdk/math';
import { modalScale, modelFontSizeScale } from './ui';
let isVisible = false;
let input_title = "";
let input_description = "";
let current_input = "";
let input_callback = () => {
};
function getScaledSize(size) {
return size * modalScale;
}
export const NpcUtilsInputUi = () => {
const width = getScaledSize(realWidth(700));
const height = getScaledSize(realHeight(284));
return (ReactEcs.createElement(UiEntity, { uiTransform: {
positionType: 'absolute',
width: getScaledSize(width),
height: getScaledSize(height),
position: { bottom: "30%", left: '50%' },
margin: { top: -height / 2, left: -width / 2 },
display: isVisible ? 'flex' : 'none'
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: '100%',
height: '100%',
justifyContent: 'space-around',
alignItems: 'stretch',
display: 'flex',
flexWrap: 'wrap',
flexDirection: 'row'
}, uiBackground: {
texture: { src: "https://i.ibb.co/8mcxBVm/notification.png" },
textureMode: 'stretch'
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: '100%',
height: '10%',
margin: { top: '2%' },
justifyContent: 'center'
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: '100%',
width: '100%',
justifyContent: 'center'
} },
ReactEcs.createElement(Label, { value: `<b>${input_title}</b>`, fontSize: getScaledFontSize(28) })),
ReactEcs.createElement(UiEntity, { uiTransform: {
positionType: 'absolute',
position: { top: '6.5%', right: '3%' },
width: getScaledSize(17.5),
height: getScaledSize(17.5),
}, onMouseDown: () => {
closeInput(true);
}, uiBackground: {
texture: { src: "https://i.ibb.co/zfDpTtW/close-Button.png" },
textureMode: 'stretch',
color: Color4.White()
} })),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: '95%',
height: '20%',
flexDirection: 'column',
} },
ReactEcs.createElement(Label, { value: `<b>${input_description}</b>`, fontSize: getScaledFontSize(28) })),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: '15%',
width: '85%'
}, uiBackground: {
texture: { src: "https://i.ibb.co/5WkcjKT/inputUi.png" },
textureMode: 'stretch'
} }, editInputUI()),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: '100%',
height: '12%',
flexDirection: 'row'
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
positionType: 'absolute',
position: { right: "20%" },
width: getScaledSize(140),
height: getScaledSize(48),
}, onMouseDown: () => {
input_callback(current_input);
closeInput(true);
}, uiBackground: {
texture: { src: "https://i.ibb.co/RB5PNYj/yes-Button.png" },
textureMode: 'stretch',
color: Color4.White()
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
positionType: 'absolute',
position: { left: "20%" },
width: getScaledSize(140),
height: getScaledSize(48),
}, onMouseDown: () => {
closeInput(true);
}, uiBackground: {
texture: { src: "https://i.ibb.co/fxmsqjv/noButton.png" },
textureMode: 'stretch',
color: Color4.White()
} })))));
};
const editInputUI = () => {
if (isVisible) {
return (ReactEcs.createElement(UiEntity, { uiTransform: {
width: "95%",
height: '80%',
margin: { left: "2.5%", top: '1%' }
} },
ReactEcs.createElement(Input, { uiTransform: {
width: "100%",
height: '100%'
}, fontSize: getScaledFontSize(20), placeholder: isVisible ? "Input here" : "Error", color: Color4.White(), placeholderColor: Color4.White(), onSubmit: () => {
input_callback(current_input);
closeInput(true);
}, onChange: (x) => {
onEdit(x);
} })));
}
else {
return (ReactEcs.createElement(UiEntity, null));
}
};
function getScaledFontSize(size) {
return size * modelFontSizeScale;
}
function setVisibility(status) {
isVisible = status;
}
export function isInputVisible() {
return isVisible;
}
export function closeInput(triggerWalkAway = true) {
if (isVisible == false)
return;
setVisibility(false);
if (!triggerWalkAway)
return;
}
export function invokeInput(title, text, callback, initial_value = "") {
input_title = title;
input_description = text;
input_callback = callback;
setVisibility(true);
}
function onEdit(param) {
current_input = param;
}
export const NpcUtilsLoadingUi = () => {
const width = getScaledSize(realWidth(700));
const height = getScaledSize(realHeight(200));
return (ReactEcs.createElement(UiEntity, { uiTransform: {
positionType: 'absolute',
width: getScaledSize(width),
height: getScaledSize(height),
position: { bottom: "30%", left: '50%' },
margin: { top: -height / 2, left: -width / 2 },
display: isLoadingVisible ? 'flex' : 'none'
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: '100%',
height: '100%',
justifyContent: 'space-around',
alignItems: 'stretch',
display: 'flex',
flexWrap: 'wrap',
flexDirection: 'row'
}, uiBackground: {
texture: { src: "https://i.ibb.co/8mcxBVm/notification.png" },
textureMode: 'stretch'
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: '100%',
height: '96%',
margin: { top: '2%' },
justifyContent: 'center'
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: '100%',
width: '100%',
justifyContent: 'center'
} },
ReactEcs.createElement(Label, { value: `<b>LOADING RESPONSE...</b>`, fontSize: getScaledFontSize(36) }))))));
};
let isLoadingVisible = false;
function setLoadingVisibility(status) {
isLoadingVisible = status;
}
export function closeLoading(triggerWalkAway = true) {
if (isLoadingVisible == false)
return;
setLoadingVisibility(false);
if (!triggerWalkAway)
return;
}
export function invokeLoading() {
setLoadingVisibility(true);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWlJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91aUlucHV0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFDckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRXJELElBQUksU0FBUyxHQUFZLEtBQUssQ0FBQTtBQUM5QixJQUFJLFdBQVcsR0FBVyxFQUFFLENBQUE7QUFDNUIsSUFBSSxpQkFBaUIsR0FBVyxFQUFFLENBQUE7QUFDbEMsSUFBSSxhQUFhLEdBQVcsRUFBRSxDQUFBO0FBQzlCLElBQUksY0FBYyxHQUFRLEdBQUcsRUFBRTtBQUMvQixDQUFDLENBQUE7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQy9CLE9BQU8sSUFBSSxHQUFHLFVBQVUsQ0FBQTtBQUM1QixDQUFDO0FBR0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEdBQUcsRUFBRTtJQUNoQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDM0MsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzdDLE9BQU8sQ0FDSCx1QkFBQyxRQUFRLElBQ0wsV0FBVyxFQUFFO1lBQ1QsWUFBWSxFQUFFLFVBQVU7WUFDeEIsS0FBSyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUM7WUFDM0IsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDN0IsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDO1lBQ3RDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTtZQUM5QyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU07U0FDdkM7UUFHRCx1QkFBQyxRQUFRLElBQ0wsV0FBVyxFQUFFO2dCQUNULEtBQUssRUFBRSxNQUFNO2dCQUNiLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGNBQWMsRUFBRSxjQUFjO2dCQUM5QixVQUFVLEVBQUUsU0FBUztnQkFDckIsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLGFBQWEsRUFBRSxLQUFLO2FBQ3ZCLEVBQ0QsWUFBWSxFQUFFO2dCQUNWLE9BQU8sRUFBRSxFQUFDLEdBQUcsRUFBRSwyQ0FBMkMsRUFBQztnQkFDM0QsV0FBVyxFQUFFLFNBQVM7YUFDekI7WUFHRCx1QkFBQyxRQUFRLElBQ0wsV0FBVyxFQUFFO29CQUNULEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUM7b0JBQ25CLGNBQWMsRUFBRSxRQUFRO2lCQUMzQjtnQkFHRCx1QkFBQyxRQUFRLElBQ0wsV0FBVyxFQUFFO3dCQUNULE1BQU0sRUFBRSxNQUFNO3dCQUNkLEtBQUssRUFBRSxNQUFNO3dCQUNiLGNBQWMsRUFBRSxRQUFRO3FCQUMzQjtvQkFFRCx1QkFBQyxLQUFLLElBQ0YsS0FBSyxFQUFFLE1BQU0sV0FBVyxNQUFNLEVBQzlCLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FDMUIsQ0FFRjtnQkFFWCx1QkFBQyxRQUFRLElBQ0wsV0FBVyxFQUFFO3dCQUNULFlBQVksRUFBRSxVQUFVO3dCQUN4QixRQUFRLEVBQUUsRUFBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUM7d0JBQ3BDLEtBQUssRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDO3dCQUMxQixNQUFNLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQztxQkFDOUIsRUFDRCxXQUFXLEVBQUUsR0FBRyxFQUFFO3dCQUNkLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDcEIsQ0FBQyxFQUNELFlBQVksRUFBRTt3QkFDVixPQUFPLEVBQUUsRUFBQyxHQUFHLEVBQUUsMkNBQTJDLEVBQUM7d0JBQzNELFdBQVcsRUFBRSxTQUFTO3dCQUN0QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRTtxQkFDeEIsR0FDTyxDQUVMO1lBRVgsdUJBQUMsUUFBUSxJQUNMLFdBQVcsRUFBRTtvQkFDVCxLQUFLLEVBQUUsS0FBSztvQkFDWixNQUFNLEVBQUUsS0FBSztvQkFDYixhQUFhLEVBQUUsUUFBUTtpQkFDMUI7Z0JBRUQsdUJBQUMsS0FBSyxJQUNGLEtBQUssRUFBRSxNQUFNLGlCQUFpQixNQUFNLEVBQ3BDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FDMUIsQ0FDRjtZQUVYLHVCQUFDLFFBQVEsSUFDTCxXQUFXLEVBQUU7b0JBQ1QsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsS0FBSyxFQUFFLEtBQUs7aUJBQ2YsRUFDRCxZQUFZLEVBQUU7b0JBQ1YsT0FBTyxFQUFFLEVBQUMsR0FBRyxFQUFFLHNDQUFzQyxFQUFDO29CQUN0RCxXQUFXLEVBQUUsU0FBUztpQkFDekIsSUFJQSxXQUFXLEVBQUUsQ0FFUDtZQUVYLHVCQUFDLFFBQVEsSUFDTCxXQUFXLEVBQUU7b0JBQ1QsS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsYUFBYSxFQUFFLEtBQUs7aUJBQ3ZCO2dCQUlELHVCQUFDLFFBQVEsSUFDTCxXQUFXLEVBQUU7d0JBQ1QsWUFBWSxFQUFFLFVBQVU7d0JBQ3hCLFFBQVEsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUM7d0JBQ3hCLEtBQUssRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDO3dCQUN6QixNQUFNLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztxQkFDNUIsRUFDRCxXQUFXLEVBQUUsR0FBRyxFQUFFO3dCQUNkLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQzt3QkFDOUIsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNyQixDQUFDLEVBQ0QsWUFBWSxFQUFFO3dCQUNWLE9BQU8sRUFBRSxFQUFDLEdBQUcsRUFBRSx5Q0FBeUMsRUFBQzt3QkFDekQsV0FBVyxFQUFFLFNBQVM7d0JBQ3RCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFO3FCQUN4QixHQUNPO2dCQUVaLHVCQUFDLFFBQVEsSUFDTCxXQUFXLEVBQUU7d0JBQ1QsWUFBWSxFQUFFLFVBQVU7d0JBQ3hCLFFBQVEsRUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUM7d0JBQ3ZCLEtBQUssRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDO3dCQUN6QixNQUFNLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztxQkFDNUIsRUFDRCxXQUFXLEVBQUUsR0FBRyxFQUFFO3dCQUNkLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDcEIsQ0FBQyxFQUVELFlBQVksRUFBRTt3QkFDVixPQUFPLEVBQUUsRUFBQyxHQUFHLEVBQUUsdUNBQXVDLEVBQUM7d0JBQ3ZELFdBQVcsRUFBRSxTQUFTO3dCQUN0QixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRTtxQkFDeEIsR0FDTyxDQUVMLENBQ0osQ0FDSixDQUNkLENBQUE7QUFDTCxDQUFDLENBQUE7QUFFRCxNQUFNLFdBQVcsR0FBRyxHQUFHLEVBQUU7SUFDckIsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FDSCx1QkFBQyxRQUFRLElBQ0wsV0FBVyxFQUFFO2dCQUNULEtBQUssRUFBRSxLQUFLO2dCQUNaLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQzthQUNwQztZQUVELHVCQUFDLEtBQUssSUFDRixXQUFXLEVBQUU7b0JBQ1QsS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLE1BQU07aUJBQ2pCLEVBQ0QsUUFBUSxFQUFFLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUMvQixXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFDL0MsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFDckIsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUNoQyxRQUFRLEVBQUUsR0FBRyxFQUFFO29CQUNYLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDOUIsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQixDQUFDLEVBQ0QsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ1osTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNiLENBQUMsR0FDSCxDQUNLLENBQUMsQ0FBQTtJQUNwQixDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8sQ0FBQyx1QkFBQyxRQUFRLE9BQVksQ0FBQyxDQUFBO0lBQ2xDLENBQUM7QUFDTCxDQUFDLENBQUE7QUFFRCxTQUFTLGlCQUFpQixDQUFDLElBQVk7SUFDbkMsT0FBTyxJQUFJLEdBQUcsa0JBQWtCLENBQUE7QUFDcEMsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLE1BQWU7SUFDbEMsU0FBUyxHQUFHLE1BQU0sQ0FBQTtBQUN0QixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWM7SUFDMUIsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsa0JBQTJCLElBQUk7SUFDdEQsSUFBSSxTQUFTLElBQUksS0FBSztRQUFFLE9BQU07SUFDOUIsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BCLElBQUksQ0FBQyxlQUFlO1FBQUUsT0FBTTtBQUNoQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhLEVBQUUsSUFBWSxFQUFFLFFBQWEsRUFBRSxnQkFBd0IsRUFBRTtJQUM5RixXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUN6QixjQUFjLEdBQUcsUUFBUSxDQUFDO0lBQzFCLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN2QixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBYTtJQUN6QixhQUFhLEdBQUcsS0FBSyxDQUFDO0FBQzFCLENBQUM7QUFHRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEVBQUU7SUFDbEMsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQzNDLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUM3QyxPQUFPLENBQ0gsdUJBQUMsUUFBUSxJQUNMLFdBQVcsRUFBRTtZQUNULFlBQVksRUFBRSxVQUFVO1lBQ3hCLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDO1lBQzNCLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzdCLFFBQVEsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBQztZQUN0QyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDOUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU07U0FDOUM7UUFHRCx1QkFBQyxRQUFRLElBQ0wsV0FBVyxFQUFFO2dCQUNULEtBQUssRUFBRSxNQUFNO2dCQUNiLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGNBQWMsRUFBRSxjQUFjO2dCQUM5QixVQUFVLEVBQUUsU0FBUztnQkFDckIsT0FBTyxFQUFFLE1BQU07Z0JBQ2YsUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLGFBQWEsRUFBRSxLQUFLO2FBQ3ZCLEVBQ0QsWUFBWSxFQUFFO2dCQUNWLE9BQU8sRUFBRSxFQUFDLEdBQUcsRUFBRSwyQ0FBMkMsRUFBQztnQkFDM0QsV0FBVyxFQUFFLFNBQVM7YUFDekI7WUFHRCx1QkFBQyxRQUFRLElBQ0wsV0FBVyxFQUFFO29CQUNULEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxLQUFLO29CQUNiLE1BQU0sRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUM7b0JBQ25CLGNBQWMsRUFBRSxRQUFRO2lCQUMzQjtnQkFHRCx1QkFBQyxRQUFRLElBQ0wsV0FBVyxFQUFFO3dCQUNULE1BQU0sRUFBRSxNQUFNO3dCQUNkLEtBQUssRUFBRSxNQUFNO3dCQUNiLGNBQWMsRUFBRSxRQUFRO3FCQUMzQjtvQkFFRCx1QkFBQyxLQUFLLElBQ0YsS0FBSyxFQUFFLDRCQUE0QixFQUNuQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEdBQzFCLENBRUYsQ0FFSixDQUNKLENBQ0osQ0FDZCxDQUFBO0FBQ0wsQ0FBQyxDQUFBO0FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFN0IsU0FBUyxvQkFBb0IsQ0FBQyxNQUFlO0lBQ3pDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQTtBQUM3QixDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxrQkFBMkIsSUFBSTtJQUN4RCxJQUFJLGdCQUFnQixJQUFJLEtBQUs7UUFBRSxPQUFNO0lBQ3JDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzNCLElBQUksQ0FBQyxlQUFlO1FBQUUsT0FBTTtBQUNoQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWE7SUFDekIsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdEVjcywgeyBJbnB1dCwgTGFiZWwsIFVpRW50aXR5IH0gZnJvbSAnQGRjbC9zZGsvcmVhY3QtZWNzJ1xuaW1wb3J0IHsgcmVhbEhlaWdodCwgcmVhbFdpZHRoIH0gZnJvbSBcIi4vZGlhbG9nXCJcbmltcG9ydCB7IENvbG9yNCB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgeyBtb2RhbFNjYWxlLCBtb2RlbEZvbnRTaXplU2NhbGUgfSBmcm9tICcuL3VpJ1xuXG5sZXQgaXNWaXNpYmxlOiBib29sZWFuID0gZmFsc2VcbmxldCBpbnB1dF90aXRsZTogc3RyaW5nID0gXCJcIlxubGV0IGlucHV0X2Rlc2NyaXB0aW9uOiBzdHJpbmcgPSBcIlwiXG5sZXQgY3VycmVudF9pbnB1dDogc3RyaW5nID0gXCJcIlxubGV0IGlucHV0X2NhbGxiYWNrOiBhbnkgPSAoKSA9PiB7XG59XG5cbmZ1bmN0aW9uIGdldFNjYWxlZFNpemUoc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc2l6ZSAqIG1vZGFsU2NhbGVcbn1cblxuLy8gVGhpcyBpcyBVSSBlbGVtZW50IGZvciBpbnB1dGluZyBzdHJpbmcgcHJvbXB0c1xuZXhwb3J0IGNvbnN0IE5wY1V0aWxzSW5wdXRVaSA9ICgpID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IGdldFNjYWxlZFNpemUocmVhbFdpZHRoKDcwMCkpXG4gICAgY29uc3QgaGVpZ2h0ID0gZ2V0U2NhbGVkU2l6ZShyZWFsSGVpZ2h0KDI4NCkpXG4gICAgcmV0dXJuIChcbiAgICAgICAgPFVpRW50aXR5IC8vSW52aXNpYmxlIFBhcmVudFxuICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGdldFNjYWxlZFNpemUod2lkdGgpLFxuICAgICAgICAgICAgICAgIGhlaWdodDogZ2V0U2NhbGVkU2l6ZShoZWlnaHQpLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7Ym90dG9tOiBcIjMwJVwiLCBsZWZ0OiAnNTAlJ30sXG4gICAgICAgICAgICAgICAgbWFyZ2luOiB7IHRvcDogLWhlaWdodCAvIDIsIGxlZnQ6IC13aWR0aCAvIDIgfSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBpc1Zpc2libGUgPyAnZmxleCcgOiAnbm9uZSdcbiAgICAgICAgICAgIH19XG4gICAgICAgID5cblxuICAgICAgICAgICAgPFVpRW50aXR5IC8vRGlhbG9nIEhvbGRlclxuICAgICAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWFyb3VuZCcsXG4gICAgICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdzdHJldGNoJyxcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgICAgICBmbGV4V3JhcDogJ3dyYXAnLFxuICAgICAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93J1xuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmU6IHtzcmM6IFwiaHR0cHM6Ly9pLmliYi5jby84bWN4QlZtL25vdGlmaWNhdGlvbi5wbmdcIn0sXG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCdcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgPFVpRW50aXR5IC8vVE9QXG4gICAgICAgICAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjoge3RvcDogJzIlJ30sXG4gICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcidcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInXG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YDxiPiR7aW5wdXRfdGl0bGV9PC9iPmB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU9e2dldFNjYWxlZEZvbnRTaXplKDI4KX1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L0xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDwvVWlFbnRpdHk+XG5cbiAgICAgICAgICAgICAgICAgICAgPFVpRW50aXR5IC8vQ2xvc2UgaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IHt0b3A6ICc2LjUlJywgcmlnaHQ6ICczJSd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBnZXRTY2FsZWRTaXplKDE3LjUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZ2V0U2NhbGVkU2l6ZSgxNy41KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlSW5wdXQodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlOiB7c3JjOiBcImh0dHBzOi8vaS5pYmIuY28vemZEcFR0Vy9jbG9zZS1CdXR0b24ucG5nXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IENvbG9yNC5XaGl0ZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICA+PC9VaUVudGl0eT5cblxuICAgICAgICAgICAgICAgIDwvVWlFbnRpdHk+XG5cbiAgICAgICAgICAgICAgICA8VWlFbnRpdHkgLy8gZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnOTUlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzIwJScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2A8Yj4ke2lucHV0X2Rlc2NyaXB0aW9ufTwvYj5gfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU9e2dldFNjYWxlZEZvbnRTaXplKDI4KX1cbiAgICAgICAgICAgICAgICAgICAgPjwvTGFiZWw+XG4gICAgICAgICAgICAgICAgPC9VaUVudGl0eT5cblxuICAgICAgICAgICAgICAgIDxVaUVudGl0eSAvL0lucHV0XG4gICAgICAgICAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxNSUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICc4NSUnXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZToge3NyYzogXCJodHRwczovL2kuaWJiLmNvLzVXa2NqS1QvaW5wdXRVaS5wbmdcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnXG4gICAgICAgICAgICAgICAgICAgIH19XG5cbiAgICAgICAgICAgICAgICA+XG5cbiAgICAgICAgICAgICAgICAgICAge2VkaXRJbnB1dFVJKCl9XG5cbiAgICAgICAgICAgICAgICA8L1VpRW50aXR5PlxuXG4gICAgICAgICAgICAgICAgPFVpRW50aXR5IC8vRm9vdGVyXG4gICAgICAgICAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTIlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIC8vdWlCYWNrZ3JvdW5kPXt7dGV4dHVyZU1vZGU6J3N0cmV0Y2gnLCBjb2xvcjogQ29sb3I0LkdyZWVuKCl9fVxuICAgICAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgICAgICA8VWlFbnRpdHkgLy9ZZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7cmlnaHQ6IFwiMjAlXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBnZXRTY2FsZWRTaXplKDE0MCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBnZXRTY2FsZWRTaXplKDQ4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2NhbGxiYWNrKGN1cnJlbnRfaW5wdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlSW5wdXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZToge3NyYzogXCJodHRwczovL2kuaWJiLmNvL1JCNVBOWWoveWVzLUJ1dHRvbi5wbmdcIn0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogQ29sb3I0LldoaXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgID48L1VpRW50aXR5PlxuXG4gICAgICAgICAgICAgICAgICAgIDxVaUVudGl0eSAvL05vXG4gICAgICAgICAgICAgICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVHlwZTogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjoge2xlZnQ6IFwiMjAlXCJ9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBnZXRTY2FsZWRTaXplKDE0MCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBnZXRTY2FsZWRTaXplKDQ4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlSW5wdXQodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmU6IHtzcmM6IFwiaHR0cHM6Ly9pLmliYi5jby9meG1zcWp2L25vQnV0dG9uLnBuZ1wifSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBDb2xvcjQuV2hpdGUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPjwvVWlFbnRpdHk+XG5cbiAgICAgICAgICAgICAgICA8L1VpRW50aXR5PlxuICAgICAgICAgICAgPC9VaUVudGl0eT5cbiAgICAgICAgPC9VaUVudGl0eT5cbiAgICApXG59XG5cbmNvbnN0IGVkaXRJbnB1dFVJID0gKCkgPT4ge1xuICAgIGlmIChpc1Zpc2libGUpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjk1JVwiLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICc4MCUnLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IHtsZWZ0OiBcIjIuNSVcIiwgdG9wOiAnMSUnfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICBmb250U2l6ZT17Z2V0U2NhbGVkRm9udFNpemUoMjApfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17aXNWaXNpYmxlID8gXCJJbnB1dCBoZXJlXCIgOiBcIkVycm9yXCJ9XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPXtDb2xvcjQuV2hpdGUoKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJDb2xvcj17Q29sb3I0LldoaXRlKCl9XG4gICAgICAgICAgICAgICAgICAgIG9uU3VibWl0PXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9jYWxsYmFjayhjdXJyZW50X2lucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlSW5wdXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoeCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25FZGl0KHgpXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvVWlFbnRpdHk+KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAoPFVpRW50aXR5PjwvVWlFbnRpdHk+KVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0U2NhbGVkRm9udFNpemUoc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICByZXR1cm4gc2l6ZSAqIG1vZGVsRm9udFNpemVTY2FsZVxufVxuXG5mdW5jdGlvbiBzZXRWaXNpYmlsaXR5KHN0YXR1czogYm9vbGVhbik6IHZvaWQge1xuICAgIGlzVmlzaWJsZSA9IHN0YXR1c1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbnB1dFZpc2libGUoKSB7XG4gICAgcmV0dXJuIGlzVmlzaWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlSW5wdXQodHJpZ2dlcldhbGtBd2F5OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmIChpc1Zpc2libGUgPT0gZmFsc2UpIHJldHVyblxuICAgIHNldFZpc2liaWxpdHkoZmFsc2UpXG4gICAgaWYgKCF0cmlnZ2VyV2Fsa0F3YXkpIHJldHVyblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlSW5wdXQodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBjYWxsYmFjazogYW55LCBpbml0aWFsX3ZhbHVlOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgaW5wdXRfdGl0bGUgPSB0aXRsZTtcbiAgICBpbnB1dF9kZXNjcmlwdGlvbiA9IHRleHQ7XG4gICAgaW5wdXRfY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICBzZXRWaXNpYmlsaXR5KHRydWUpXG59XG5cbmZ1bmN0aW9uIG9uRWRpdChwYXJhbTogc3RyaW5nKSB7XG4gICAgY3VycmVudF9pbnB1dCA9IHBhcmFtO1xufVxuXG5cbmV4cG9ydCBjb25zdCBOcGNVdGlsc0xvYWRpbmdVaSA9ICgpID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IGdldFNjYWxlZFNpemUocmVhbFdpZHRoKDcwMCkpXG4gICAgY29uc3QgaGVpZ2h0ID0gZ2V0U2NhbGVkU2l6ZShyZWFsSGVpZ2h0KDIwMCkpXG4gICAgcmV0dXJuIChcbiAgICAgICAgPFVpRW50aXR5IC8vSW52aXNpYmxlIFBhcmVudFxuICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGdldFNjYWxlZFNpemUod2lkdGgpLFxuICAgICAgICAgICAgICAgIGhlaWdodDogZ2V0U2NhbGVkU2l6ZShoZWlnaHQpLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB7Ym90dG9tOiBcIjMwJVwiLCBsZWZ0OiAnNTAlJ30sXG4gICAgICAgICAgICAgICAgbWFyZ2luOiB7IHRvcDogLWhlaWdodCAvIDIsIGxlZnQ6IC13aWR0aCAvIDIgfSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBpc0xvYWRpbmdWaXNpYmxlID8gJ2ZsZXgnIDogJ25vbmUnXG4gICAgICAgICAgICB9fVxuICAgICAgICA+XG5cbiAgICAgICAgICAgIDxVaUVudGl0eSAvL0RpYWxvZyBIb2xkZXJcbiAgICAgICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1hcm91bmQnLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnc3RyZXRjaCcsXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgICAgICAgICAgZmxleFdyYXA6ICd3cmFwJyxcbiAgICAgICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdydcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlOiB7c3JjOiBcImh0dHBzOi8vaS5pYmIuY28vOG1jeEJWbS9ub3RpZmljYXRpb24ucG5nXCJ9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cblxuICAgICAgICAgICAgICAgIDxVaUVudGl0eSAvL1RPUFxuICAgICAgICAgICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzk2JScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IHt0b3A6ICcyJSd9LFxuICAgICAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInXG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuXG4gICAgICAgICAgICAgICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPExhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2A8Yj5MT0FESU5HIFJFU1BPTlNFLi4uPC9iPmB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU9e2dldFNjYWxlZEZvbnRTaXplKDM2KX1cbiAgICAgICAgICAgICAgICAgICAgICAgID48L0xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDwvVWlFbnRpdHk+XG5cbiAgICAgICAgICAgICAgICA8L1VpRW50aXR5PlxuICAgICAgICAgICAgPC9VaUVudGl0eT5cbiAgICAgICAgPC9VaUVudGl0eT5cbiAgICApXG59XG5cbmxldCBpc0xvYWRpbmdWaXNpYmxlID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNldExvYWRpbmdWaXNpYmlsaXR5KHN0YXR1czogYm9vbGVhbik6IHZvaWQge1xuICAgIGlzTG9hZGluZ1Zpc2libGUgPSBzdGF0dXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlTG9hZGluZyh0cmlnZ2VyV2Fsa0F3YXk6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKGlzTG9hZGluZ1Zpc2libGUgPT0gZmFsc2UpIHJldHVyblxuICAgIHNldExvYWRpbmdWaXNpYmlsaXR5KGZhbHNlKVxuICAgIGlmICghdHJpZ2dlcldhbGtBd2F5KSByZXR1cm5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUxvYWRpbmcoKSB7XG4gICAgc2V0TG9hZGluZ1Zpc2liaWxpdHkodHJ1ZSlcbn0iXX0=