dcl-npc-toolkit
Version:
A collection of tools for creating Non-Player-Characters (NPCs). These are capable of having conversations with the player, and play different animations.
449 lines • 65.1 kB
JavaScript
import ReactEcs, { UiEntity } from '@dcl/sdk/react-ecs';
import { engine, UiCanvasInformation } from '@dcl/sdk/ecs';
import { buttonClick, displayButton, displayDialog, displayFirstButtonContainer, displayImage, displayPortrait, displaySecondButtonContainer, displaySkipable, getButtonText, getbuttonSize, getFontSize, getButtonFontSize, getImage, getImageAtlasMapping, getLeftClickTheme, getPortrait, getSkipableTheme, getText, getTextColor, getTextPosition, getTheme, handleDialogClick, imageHeight, imageWidth, portraitHeight, portraitWidth, positionImageX, positionImageY, positionPortaitX, positionPortaitY, realHeight, realWidth, skipDialogs, getWindowHeight } from './dialog';
import { sourcesComponentsCoordinates } from './uiResources';
import { activeNPC } from './npc';
export let lightTheme = 'https://decentraland.org/images/ui/light-atlas-v3.png';
export let darkTheme = 'https://decentraland.org/images/ui/dark-atlas-v3.png';
export let bubblesTexture = 'https://decentraland.org/images/ui/dialog-bubbles.png';
export let section = {
...sourcesComponentsCoordinates.backgrounds.NPCDialog,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let skipButtonSection = {
...sourcesComponentsCoordinates.buttons.F,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let skipButtonSectionBlack = {
...sourcesComponentsCoordinates.buttons.FBlack,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let leftClickSection = {
...sourcesComponentsCoordinates.icons.ClickWhite,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let leftClickSectionbBlack = {
...sourcesComponentsCoordinates.icons.ClickDark,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let primaryButtonSection = {
...sourcesComponentsCoordinates.buttons.E,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let secondaryButtonSection = {
...sourcesComponentsCoordinates.buttons.F,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let darkButtonSection = {
...sourcesComponentsCoordinates.buttons.buttonF,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let darkButtonCorner = {
...sourcesComponentsCoordinates.buttons.buttonFCorner,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let darkButtonEdge = {
...sourcesComponentsCoordinates.buttons.buttonFEdge,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let redButtonSection = {
...sourcesComponentsCoordinates.buttons.buttonE,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let redButtonCorner = {
...sourcesComponentsCoordinates.buttons.buttonECorner,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let redButtonEdge = {
...sourcesComponentsCoordinates.buttons.buttonEEdge,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
let modalScale = 1;
let modelFontSizeScale = 1;
let modalTextWrapScale = 1;
let timer = 0;
let canvasInfoTimer = 0.5;
let scaleSystemAlreadyAdded = false;
export function UIScaleUpdate() {
if (scaleSystemAlreadyAdded)
return;
scaleSystemAlreadyAdded = true;
engine.addSystem((dt) => {
timer += dt;
if (timer <= canvasInfoTimer)
return;
timer = 0;
const uiCanvasInfo = UiCanvasInformation.getOrNull(engine.RootEntity);
if (!uiCanvasInfo)
return;
const newScaleFactor = Math.min(uiCanvasInfo.width / 1920, uiCanvasInfo.height / 1080);
if (newScaleFactor !== modalScale) {
modalScale = newScaleFactor;
modelFontSizeScale = newScaleFactor;
modalTextWrapScale = newScaleFactor;
}
});
}
function getScaledSize(size) {
return size * modalScale;
}
function getScaledFontSize(size) {
return size * modelFontSizeScale;
}
function getScaledTextWrap(size) {
return size * modalTextWrapScale;
}
function getScaledButtonWidth(button) {
return typeof (getbuttonSize(button)) === 'number' ? getScaledSize(getbuttonSize(button)) : 'auto';
}
export const NpcUtilsUi = () => {
UIScaleUpdate();
const width = getScaledSize(realWidth(700));
const height = getScaledSize(realHeight(284));
return (ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayDialog() ? 'flex' : 'none',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
positionType: 'absolute',
position: { bottom: '10%', left: '50%' },
margin: { top: -height / 2, left: -width / 2 },
padding: { top: getScaledSize(40), bottom: getScaledSize(40) },
width,
height: typeof (getWindowHeight()) === 'number' ? getWindowHeight() : 'auto',
minHeight: getScaledSize(25)
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
positionType: 'absolute',
position: { top: 0, left: 0 },
width: '100%',
height: '100%'
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(section)
}, onMouseDown: () => {
handleDialogClick();
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayPortrait() ? 'flex' : 'none',
width: getScaledSize(portraitWidth()),
height: getScaledSize(portraitHeight()),
positionType: 'absolute',
position: {
bottom: getScaledSize(positionPortaitY()),
left: getScaledSize(positionPortaitX())
}
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getPortrait()
}
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayImage() ? 'flex' : 'none',
width: getScaledSize(imageWidth()),
height: getScaledSize(imageHeight()),
positionType: 'absolute',
position: { bottom: positionImageY(), right: positionImageX() }
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getImage()
}
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displaySkipable() ? 'flex' : 'none',
width: getScaledSize(15),
height: getScaledSize(15),
positionType: 'absolute',
position: { bottom: '7%', left: '25%' }
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(getSkipableTheme())
}, onMouseDown: () => {
skipDialogs(activeNPC);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
display: 'flex',
positionType: 'absolute',
alignSelf: 'center',
position: { left: '110%' }
}, uiText: {
value: 'Skip',
color: getTextColor(),
fontSize: getScaledFontSize(12)
} })),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: 'flex',
width: getScaledSize(24),
height: getScaledSize(36),
positionType: 'absolute',
position: { bottom: '5%', right: '2%' }
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(getLeftClickTheme())
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: 'auto',
alignSelf: 'flex-start',
alignItems: 'flex-start',
justifyContent: 'flex-start',
flexDirection: 'row',
position: getTextPosition(),
display: 'flex',
flexGrow: 1,
minHeight: 100
}, uiText: {
value: getText(),
color: getTextColor(),
fontSize: getScaledFontSize(getFontSize()),
textAlign: 'middle-left'
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledSize(300),
height: getScaledSize(50),
alignItems: 'center',
flexDirection: 'row',
justifyContent: 'space-around',
display: displayFirstButtonContainer() ? 'flex' : 'none',
} },
ReactEcs.createElement(UiEntity, { onMouseDown: () => {
buttonClick(0);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonCorner)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(300),
height: getScaledSize(45),
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-start',
alignContent: 'flex-start',
display: displayButton(1) ? 'flex' : 'none',
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonSection)
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledSize(25),
height: getScaledSize(25),
margin: { right: getScaledSize(5) },
positionType: 'absolute'
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(secondaryButtonSection)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
overflow: 'hidden',
maxWidth: getScaledSize(217),
padding: { right: getScaledSize(5) },
margin: { left: getScaledSize(30) }
}, uiText: { value: getButtonText(0), fontSize: getScaledFontSize(getButtonFontSize(0)), textAlign: 'middle-left', textWrap: 'nowrap' } })),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
margin: { right: '5%' },
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonEdge)
} })),
ReactEcs.createElement(UiEntity, { onMouseDown: () => {
buttonClick(1);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(redButtonCorner)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(300),
height: getScaledSize(45),
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-start',
alignContent: 'flex-start',
display: displayButton(2) ? 'flex' : 'none',
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(redButtonSection)
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledSize(25),
height: getScaledSize(25),
margin: { right: getScaledSize(5) },
positionType: 'absolute',
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(primaryButtonSection)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(217),
overflow: 'hidden',
padding: { right: getScaledSize(5) },
margin: { left: getScaledSize(30) }
}, uiText: { value: getButtonText(1), fontSize: getScaledFontSize(getButtonFontSize(1)), textAlign: 'middle-left', textWrap: 'nowrap' } })),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(redButtonEdge)
} }))),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledSize(300),
height: getScaledSize(50),
alignItems: 'center',
flexDirection: 'row',
justifyContent: 'space-around',
margin: { top: getScaledSize(20) },
display: displaySecondButtonContainer() ? 'flex' : 'none',
} },
ReactEcs.createElement(UiEntity, { onMouseDown: () => {
buttonClick(3);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonCorner)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(300),
overflow: 'hidden',
height: getScaledSize(45),
alignItems: 'center',
justifyContent: 'center',
alignContent: 'flex-start',
display: displayButton(3) ? 'flex' : 'none'
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonSection)
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(252),
overflow: 'hidden',
}, uiText: { value: getButtonText(2), fontSize: getScaledFontSize(getButtonFontSize(2)), textAlign: 'middle-left', textWrap: 'nowrap' } })),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
margin: { right: '5%' },
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonEdge)
} })),
ReactEcs.createElement(UiEntity, { onMouseDown: () => {
buttonClick(4);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonCorner)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(300),
overflow: 'hidden',
height: getScaledSize(45),
alignItems: 'center',
justifyContent: 'center',
alignContent: 'flex-start',
display: displayButton(4) ? 'flex' : 'none',
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonSection)
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(252),
overflow: 'hidden',
}, uiText: { value: getButtonText(3), fontSize: getScaledFontSize(getButtonFontSize(3)), textAlign: 'middle-left', textWrap: 'nowrap' } })),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonEdge)
} })))));
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdWkudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sUUFBUSxFQUFFLEVBQW1DLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3hGLE9BQU8sRUFBRSxNQUFNLEVBQVUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDbEUsT0FBTyxFQUNMLFdBQVcsRUFFWCxhQUFhLEVBQ2IsYUFBYSxFQUNiLDJCQUEyQixFQUMzQixZQUFZLEVBQ1osZUFBZSxFQUNmLDRCQUE0QixFQUM1QixlQUFlLEVBQ2YsYUFBYSxFQUNiLGFBQWEsRUFDYixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLFFBQVEsRUFDUixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFlBQVksRUFDWixlQUFlLEVBQ2YsUUFBUSxFQUNSLGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsVUFBVSxFQUNWLGNBQWMsRUFDZCxhQUFhLEVBQ2IsY0FBYyxFQUNkLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBR2hCLFVBQVUsRUFDVixTQUFTLEVBQ1QsV0FBVyxFQUNYLGVBQWUsRUFDaEIsTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQzVELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFFakMsTUFBTSxDQUFDLElBQUksVUFBVSxHQUFHLHVEQUF1RCxDQUFBO0FBQy9FLE1BQU0sQ0FBQyxJQUFJLFNBQVMsR0FBRyxzREFBc0QsQ0FBQTtBQUU3RSxNQUFNLENBQUMsSUFBSSxjQUFjLEdBQUcsdURBQXVELENBQUE7QUFFbkYsTUFBTSxDQUFDLElBQUksT0FBTyxHQUFHO0lBQ25CLEdBQUcsNEJBQTRCLENBQUMsV0FBVyxDQUFDLFNBQVM7SUFDckQsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixHQUFHO0lBQzdCLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixHQUFHO0lBQ2xDLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxDQUFDLE1BQU07SUFDOUMsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLGdCQUFnQixHQUFHO0lBQzVCLEdBQUcsNEJBQTRCLENBQUMsS0FBSyxDQUFDLFVBQVU7SUFDaEQsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixHQUFHO0lBQ2xDLEdBQUcsNEJBQTRCLENBQUMsS0FBSyxDQUFDLFNBQVM7SUFDL0MsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLG9CQUFvQixHQUFHO0lBQ2hDLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFDckQsVUFBVSxFQUFFLDRCQUE0QixDQUFDLFVBQVU7Q0FDcEQsQ0FBQTtBQUVELE1BQU0sQ0FBQyxJQUFJLHNCQUFzQixHQUFHO0lBQ2xDLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsV0FBVyxFQUFFLDRCQUE0QixDQUFDLFdBQVc7SUFD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LEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FDcEksQ0FFTztnQkFDWCx1QkFBQyxRQUFRLElBQ1AsV0FBVyxFQUFFO3dCQUNYLE1BQU0sRUFBRSxNQUFNO3dCQUNkLEtBQUssRUFBRSxhQUFhLENBQUMsRUFBRSxDQUFDO3FCQUN6QixFQUNELFlBQVksRUFBRTt3QkFDWixXQUFXLEVBQUUsU0FBUzt3QkFDdEIsT0FBTyxFQUFFOzRCQUNQLEdBQUcsRUFBRSxRQUFRLEVBQUU7eUJBQ2hCO3dCQUNELEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxjQUFjLENBQUM7cUJBQzFDLEdBQ0QsQ0FDTyxDQUNGLENBQ0YsQ0FDWixDQUFBO0FBQ0gsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29sb3I0IH0gZnJvbSAnQGRjbC9zZGsvbWF0aCdcbmltcG9ydCBSZWFjdEVjcywgeyBCdXR0b24sIExhYmVsLCBSZWFjdEVjc1JlbmRlcmVyLCBVaUVudGl0eSB9IGZyb20gJ0BkY2wvc2RrL3JlYWN0LWVjcydcbmltcG9ydCB7IGVuZ2luZSwgRW50aXR5LCBVaUNhbnZhc0luZm9ybWF0aW9uIH0gZnJvbSAnQGRjbC9zZGsvZWNzJ1xuaW1wb3J0IHtcbiAgYnV0dG9uQ2xpY2ssXG4gIGNvbmZpcm1UZXh0LFxuICBkaXNwbGF5QnV0dG9uLFxuICBkaXNwbGF5RGlhbG9nLFxuICBkaXNwbGF5Rmlyc3RCdXR0b25Db250YWluZXIsXG4gIGRpc3BsYXlJbWFnZSxcbiAgZGlzcGxheVBvcnRyYWl0LFxuICBkaXNwbGF5U2Vjb25kQnV0dG9uQ29udGFpbmVyLFxuICBkaXNwbGF5U2tpcGFibGUsXG4gIGdldEJ1dHRvblRleHQsXG4gIGdldGJ1dHRvblNpemUsXG4gIGdldEZvbnRTaXplLFxuICBnZXRCdXR0b25Gb250U2l6ZSxcbiAgZ2V0SW1hZ2UsXG4gIGdldEltYWdlQXRsYXNNYXBwaW5nLFxuICBnZXRMZWZ0Q2xpY2tUaGVtZSxcbiAgZ2V0UG9ydHJhaXQsXG4gIGdldFNraXBhYmxlVGhlbWUsXG4gIGdldFRleHQsXG4gIGdldFRleHRDb2xvcixcbiAgZ2V0VGV4dFBvc2l0aW9uLFxuICBnZXRUaGVtZSxcbiAgaGFuZGxlRGlhbG9nQ2xpY2ssXG4gIGltYWdlSGVpZ2h0LFxuICBpbWFnZVdpZHRoLFxuICBwb3J0cmFpdEhlaWdodCxcbiAgcG9ydHJhaXRXaWR0aCxcbiAgcG9zaXRpb25JbWFnZVgsXG4gIHBvc2l0aW9uSW1hZ2VZLFxuICBwb3NpdGlvblBvcnRhaXRYLFxuICBwb3NpdGlvblBvcnRhaXRZLFxuICBwb3NpdGlvblRleHRYLFxuICBwb3NpdGlvblRleHRZLFxuICByZWFsSGVpZ2h0LFxuICByZWFsV2lkdGgsXG4gIHNraXBEaWFsb2dzLFxuICBnZXRXaW5kb3dIZWlnaHRcbn0gZnJvbSAnLi9kaWFsb2cnXG5pbXBvcnQgeyBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzIH0gZnJvbSAnLi91aVJlc291cmNlcydcbmltcG9ydCB7IGFjdGl2ZU5QQyB9IGZyb20gJy4vbnBjJ1xuXG5leHBvcnQgbGV0IGxpZ2h0VGhlbWUgPSAnaHR0cHM6Ly9kZWNlbnRyYWxhbmQub3JnL2ltYWdlcy91aS9saWdodC1hdGxhcy12My5wbmcnXG5leHBvcnQgbGV0IGRhcmtUaGVtZSA9ICdodHRwczovL2RlY2VudHJhbGFuZC5vcmcvaW1hZ2VzL3VpL2RhcmstYXRsYXMtdjMucG5nJ1xuXG5leHBvcnQgbGV0IGJ1YmJsZXNUZXh0dXJlID0gJ2h0dHBzOi8vZGVjZW50cmFsYW5kLm9yZy9pbWFnZXMvdWkvZGlhbG9nLWJ1YmJsZXMucG5nJ1xuXG5leHBvcnQgbGV0IHNlY3Rpb24gPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYmFja2dyb3VuZHMuTlBDRGlhbG9nLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgc2tpcEJ1dHRvblNlY3Rpb24gPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5GLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgc2tpcEJ1dHRvblNlY3Rpb25CbGFjayA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLkZCbGFjayxcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IGxlZnRDbGlja1NlY3Rpb24gPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuaWNvbnMuQ2xpY2tXaGl0ZSxcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IGxlZnRDbGlja1NlY3Rpb25iQmxhY2sgPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuaWNvbnMuQ2xpY2tEYXJrLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgcHJpbWFyeUJ1dHRvblNlY3Rpb24gPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5FLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgc2Vjb25kYXJ5QnV0dG9uU2VjdGlvbiA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLkYsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCBkYXJrQnV0dG9uU2VjdGlvbiA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLmJ1dHRvbkYsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCBkYXJrQnV0dG9uQ29ybmVyID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuYnV0dG9uRkNvcm5lcixcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IGRhcmtCdXR0b25FZGdlID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuYnV0dG9uRkVkZ2UsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCByZWRCdXR0b25TZWN0aW9uID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuYnV0dG9uRSxcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IHJlZEJ1dHRvbkNvcm5lciA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLmJ1dHRvbkVDb3JuZXIsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCByZWRCdXR0b25FZGdlID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuYnV0dG9uRUVkZ2UsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxubGV0IG1vZGFsU2NhbGUgPSAxXG5sZXQgbW9kZWxGb250U2l6ZVNjYWxlID0gMVxubGV0IG1vZGFsVGV4dFdyYXBTY2FsZSA9IDFcblxuLy8gZXhwb3J0IGZ1bmN0aW9uIHNldHVwTlBDVWlTY2FsaW5nKGluTW9kYWxTY2FsZTogbnVtYmVyLCBpbkZvbnRTaXplOiBudW1iZXIsIGluTW9kYWxUZXh0V3JhcFNjYWxlOiBudW1iZXIpIHtcbi8vICAgbW9kYWxTY2FsZSA9IGluTW9kYWxTY2FsZVxuLy8gICBtb2RlbEZvbnRTaXplU2NhbGUgPSBpbkZvbnRTaXplXG4vLyAgIG1vZGFsVGV4dFdyYXBTY2FsZSA9IGluTW9kYWxUZXh0V3JhcFNjYWxlXG4vLyAgIGNvbnNvbGUubG9nKFxuLy8gICAgICdOUEMtVE9PTEtJVCcsXG4vLyAgICAgJ1NjYWxlIFVJOicsXG4vLyAgICAgbW9kYWxTY2FsZSxcbi8vICAgICAnVGV4dEZvbnRTaXplOicsXG4vLyAgICAgbW9kZWxGb250U2l6ZVNjYWxlLFxuLy8gICAgICdUZXh0V3JhcFNjYWxpbmc6Jyxcbi8vICAgICBtb2RhbFRleHRXcmFwU2NhbGVcbi8vICAgKVxuLy8gfVxuXG5sZXQgdGltZXIgPSAwXG5sZXQgY2FudmFzSW5mb1RpbWVyID0gMC41XG5sZXQgc2NhbGVTeXN0ZW1BbHJlYWR5QWRkZWQgPSBmYWxzZVxuXG5leHBvcnQgZnVuY3Rpb24gVUlTY2FsZVVwZGF0ZSgpIHtcblxuICBpZihzY2FsZVN5c3RlbUFscmVhZHlBZGRlZCkgcmV0dXJuXG4gIHNjYWxlU3lzdGVtQWxyZWFkeUFkZGVkID0gdHJ1ZVxuXG4gIGVuZ2luZS5hZGRTeXN0ZW0oKGR0KSA9PiB7XG4gICAgdGltZXIgKz0gZHRcblxuICAgIGlmICh0aW1lciA8PSBjYW52YXNJbmZvVGltZXIpIHJldHVyblxuICAgIHRpbWVyID0gMFxuXG4gICAgY29uc3QgdWlDYW52YXNJbmZvID0gVWlDYW52YXNJbmZvcm1hdGlvbi5nZXRPck51bGwoZW5naW5lLlJvb3RFbnRpdHkpXG5cbiAgICBpZiAoIXVpQ2FudmFzSW5mbykgcmV0dXJuXG5cbiAgICBjb25zdCBuZXdTY2FsZUZhY3RvciA9IE1hdGgubWluKHVpQ2FudmFzSW5mby53aWR0aCAvIDE5MjAsIHVpQ2FudmFzSW5mby5oZWlnaHQgLyAxMDgwKVxuXG4gICAgaWYgKG5ld1NjYWxlRmFjdG9yICE9PSBtb2RhbFNjYWxlKSB7XG4gICAgICBtb2RhbFNjYWxlID0gbmV3U2NhbGVGYWN0b3JcbiAgICAgIG1vZGVsRm9udFNpemVTY2FsZSA9IG5ld1NjYWxlRmFjdG9yXG4gICAgICBtb2RhbFRleHRXcmFwU2NhbGUgPSBuZXdTY2FsZUZhY3RvclxuICAgIH1cbiAgfSlcblxufVxuXG5cbmZ1bmN0aW9uIGdldFNjYWxlZFNpemUoc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNpemUgKiBtb2RhbFNjYWxlXG59XG5mdW5jdGlvbiBnZXRTY2FsZWRGb250U2l6ZShzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gc2l6ZSAqIG1vZGVsRm9udFNpemVTY2FsZVxufVxuZnVuY3Rpb24gZ2V0U2NhbGVkVGV4dFdyYXAoc2l6ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNpemUgKiBtb2RhbFRleHRXcmFwU2NhbGVcbn1cbmZ1bmN0aW9uIGdldFNjYWxlZEJ1dHRvbldpZHRoKGJ1dHRvbjogbnVtYmVyKSB7XG4gIHJldHVybiB0eXBlb2YgKGdldGJ1dHRvblNpemUoYnV0dG9uKSkgPT09ICdudW1iZXInID8gZ2V0U2NhbGVkU2l6ZShnZXRidXR0b25TaXplKGJ1dHRvbikgYXMgbnVtYmVyKSA6ICdhdXRvJ1xufVxuXG5leHBvcnQgY29uc3QgTnBjVXRpbHNVaSA9ICgpID0+IHtcblxuICBVSVNjYWxlVXBkYXRlKClcblxuICBjb25zdCB3aWR0aCA9IGdldFNjYWxlZFNpemUocmVhbFdpZHRoKDcwMCkpXG4gIGNvbnN0IGhlaWdodCA9IGdldFNjYWxlZFNpemUocmVhbEhlaWdodCgyODQpKVxuXG4gIHJldHVybiAoXG4gICAgPFVpRW50aXR5XG4gICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICBkaXNwbGF5OiBkaXNwbGF5RGlhbG9nKCkgPyAnZmxleCcgOiAnbm9uZScsXG4gICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogJzEwJScsIGxlZnQ6ICc1MCUnIH0sXG4gICAgICAgIG1hcmdpbjogeyB0b3A6IC1oZWlnaHQgLyAyLCBsZWZ0OiAtd2lkdGggLyAyIH0sXG4gICAgICAgIHBhZGRpbmc6IHsgdG9wOiBnZXRTY2FsZWRTaXplKDQwKSwgYm90dG9tOiBnZXRTY2FsZWRTaXplKDQwKSB9LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0eXBlb2YgKGdldFdpbmRvd0hlaWdodCgpKSA9PT0gJ251bWJlcicgPyBnZXRXaW5kb3dIZWlnaHQoKSBhcyBudW1iZXIgOiAnYXV0bydcbiAgICAgICAgLCBcbiAgICAgICAgbWluSGVpZ2h0OiBnZXRTY2FsZWRTaXplKDI1KVxuICAgICAgfX1cbiAgICA+XG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9zaXRpb246IHsgdG9wOiAwLCBsZWZ0OiAwIH0sXG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgICB9fVxuICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgIHNyYzogZ2V0VGhlbWUoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhzZWN0aW9uKVxuICAgICAgICB9fVxuICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgIGhhbmRsZURpYWxvZ0NsaWNrKClcbiAgICAgICAgfX1cbiAgICAgIC8+XG5cbiAgICAgIDxVaUVudGl0eVxuICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgIGRpc3BsYXk6IGRpc3BsYXlQb3J0cmFpdCgpID8gJ2ZsZXgnIDogJ25vbmUnLFxuICAgICAgICAgIHdpZHRoOiBnZXRTY2FsZWRTaXplKHBvcnRyYWl0V2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBnZXRTY2FsZWRTaXplKHBvcnRyYWl0SGVpZ2h0KCkpLFxuICAgICAgICAgIHBvc2l0aW9uVHlwZTogJ2Fic29sdXRlJyxcbiAgICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgICAgYm90dG9tOiBnZXRTY2FsZWRTaXplKHBvc2l0aW9uUG9ydGFpdFkoKSksXG4gICAgICAgICAgICBsZWZ0OiBnZXRTY2FsZWRTaXplKHBvc2l0aW9uUG9ydGFpdFgoKSlcbiAgICAgICAgICB9XG4gICAgICAgIH19XG4gICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgc3JjOiBnZXRQb3J0cmFpdCgpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHV2czogZ2V0SW1hZ2VBdGxhc01hcHBpbmcoc2tpcEJ1dHRvblNlY3Rpb24pLFxuICAgICAgICB9fVxuICAgICAgLz5cblxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgZGlzcGxheTogZGlzcGxheUltYWdlKCkgPyAnZmxleCcgOiAnbm9uZScsXG4gICAgICAgICAgd2lkdGg6IGdldFNjYWxlZFNpemUoaW1hZ2VXaWR0aCgpKSxcbiAgICAgICAgICBoZWlnaHQ6IGdldFNjYWxlZFNpemUoaW1hZ2VIZWlnaHQoKSksXG4gICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogcG9zaXRpb25JbWFnZVkoKSwgcmlnaHQ6IHBvc2l0aW9uSW1hZ2VYKCkgfVxuICAgICAgICB9fVxuICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgIHNyYzogZ2V0SW1hZ2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB1dnM6IGdldEltYWdlQXRsYXNNYXBwaW5nKHNraXBCdXR0b25TZWN0aW9uKSxcbiAgICAgICAgfX1cbiAgICAgIC8+XG5cbiAgICAgIDxVaUVudGl0eVxuICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgIGRpc3BsYXk6IGRpc3BsYXlTa2lwYWJsZSgpID8gJ2ZsZXgnIDogJ25vbmUnLFxuICAgICAgICAgIHdpZHRoOiBnZXRTY2FsZWRTaXplKDE1KSxcbiAgICAgICAgICBoZWlnaHQ6IGdldFNjYWxlZFNpemUoMTUpLFxuICAgICAgICAgIHBvc2l0aW9uVHlwZTogJ2Fic29sdXRlJyxcbiAgICAgICAgICBwb3NpdGlvbjogeyBib3R0b206ICc3JScsIGxlZnQ6ICcyNSUnIH1cbiAgICAgICAgfX1cbiAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgICBzcmM6IGdldFRoZW1lKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHV2czogZ2V0SW1hZ2VBdGxhc01hcHBpbmcoZ2V0U2tpcGFibGVUaGVtZSgpKVxuICAgICAgICB9fVxuICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgIHNraXBEaWFsb2dzKGFjdGl2ZU5QQylcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICAgIHBvc2l0aW9uVHlwZTogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIGFsaWduU2VsZjogJ2NlbnRlcicsXG4gICAgICAgICAgICBwb3NpdGlvbjogeyBsZWZ0OiAnMTEwJScgfVxuICAgICAgICAgIH19XG4gICAgICAgICAgdWlUZXh0PXt7XG4gICAgICAgICAgICB2YWx1ZTogJ1NraXAnLFxuICAgICAgICAgICAgY29sb3I6IGdldFRleHRDb2xvcigpLFxuICAgICAgICAgICAgZm9udFNpemU6IGdldFNjYWxlZEZvbnRTaXplKDEyKVxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICA8L1VpRW50aXR5PlxuXG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgd2lkdGg6IGdldFNjYWxlZFNpemUoMjQpLFxuICAgICAgICAgIGhlaWdodDogZ2V0U2NhbGVkU2l6ZSgzNiksXG4gICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogJzUlJywgcmlnaHQ6ICcyJScgfVxuICAgICAgICB9fVxuICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgIHNyYzogZ2V0VGhlbWUoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhnZXRMZWZ0Q2xpY2tUaGVtZSgpKVxuICAgICAgICB9fVxuICAgICAgLz5cblxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICBhbGlnblNlbGY6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnZmxleC1zdGFydCcsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgICBwb3NpdGlvbjogZ2V0VGV4dFBvc2l0aW9uKCksXG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGZsZXhHcm93OiAxLFxuICAgICAgICAgIG1pbkhlaWdodDogMTAwXG4gICAgICAgIH19XG4gICAgICAgIHVpVGV4dD17e1xuICAgICAgICAgIHZhbHVlOiBnZXRUZXh0KCksXG4gICAgICAgICAgY29sb3I6IGdldFRleHRDb2xvcigpLFxuICAgICAgICAgIGZvbnRTaXplOiBnZXRTY2FsZWRGb250U2l6ZShnZXRGb250U2l6ZSgpKSxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdtaWRkbGUtbGVmdCdcbiAgICAgICAgfX1cbiAgICAgIC8+XG5cbiAgICAgIDxVaUVudGl0eVxuICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgIHdpZHRoOiBnZXRTY2FsZWRTaXplKDMwMCksXG4gICAgICAgICAgaGVpZ2h0OiBnZXRTY2FsZWRTaXplKDUwKSxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ3NwYWNlLWFyb3VuZCcsXG4gICAgICAgICAgZGlzcGxheTogZGlzcGxheUZpcnN0QnV0dG9uQ29udGFpbmVyKCkgPyAnZmxleCcgOiAnbm9uZScsXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHsvKiBCdXR0b24xIChUb3AtTGVmdCkgKi99XG4gICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiB7XG4gICAgICAgICAgICBidXR0b25DbGljaygwKVxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICB3aWR0aDogZ2V0U2NhbGVkU2l6ZSgxMiksXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgICAgICBzcmM6IGdldFRoZW1lKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhkYXJrQnV0dG9uQ29ybmVyKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgd2lkdGg6ICAnYXV0bycsXG4gICAgICAgICAgICAgIG1heFdpZHRoOiBnZXRTY2FsZWRTaXplKDMwMCksXG4gICAgICAgICAgICAgIGhlaWdodDogZ2V0U2NhbGVkU2l6ZSg0NSksXG4gICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICAgICAgYWxpZ25Db250ZW50OiAnZmxleC1zdGFydCcsXG4gICAgICAgICAgICAgIGRpc3BsYXk6IGRpc3BsYXlCdXR0b24oMSkgPyAnZmxleCcgOiAnbm9uZScsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgICAgICBzcmM6IGdldFRoZW1lKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhkYXJrQnV0dG9uU2VjdGlvbilcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICBnZXRTY2FsZWRTaXplKDI1KSxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGdldFNjYWxlZFNpemUoMjUpLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogeyByaWdodDogZ2V0U2NhbGVkU2l6ZSg1KSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uVHlwZTogJ2Fic29sdXRlJ1xuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgICAgICAgIHNyYzogZ2V0VGhlbWUoKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhzZWNvbmRhcnlCdXR0b25TZWN0aW9uKVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiBnZXRTY2FsZWRTaXplKDIxNyksXG4gICAgICAgICAgICAgICAgcGFkZGluZzogeyByaWdodDogZ2V0U2NhbGVkU2l6ZSg1KSB9LFxuICAgICAgICAgICAgICAgIG1hcmdpbjogeyBsZWZ0OiBnZXRTY2FsZWRTaXplKDMwKSB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHVpVGV4dD17eyB2YWx1ZTogZ2V0QnV0dG9uVGV4dCgwKSwgZm9udFNpemU6IGdldFNjYWxlZEZvbnRTaXplKGdldEJ1dHRvbkZvbnRTaXplKDApKSwgdGV4dEFsaWduOiAnbWlkZGxlLWxlZnQnLCB0ZXh0V3JhcDogJ25vd3JhcCcgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9VaUVudGl0eT5cbiAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICB3aWR0aDogIGdldFNjYWxlZFNpemUoMTIpLFxuICAgICAgICAgICAgICBtYXJnaW46IHsgcmlnaHQ6ICc1JScgfSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgICAgIHNyYzogZ2V0VGhlbWUoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB1dnM6IGdldEltYWdlQXRsYXNNYXBwaW5nKGRhcmtCdXR0b25FZGdlKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1VpRW50aXR5PlxuXG4gICAgICAgIHsvKiBCdXR0b24yIChUb3AtUmlnaHQpICovfVxuICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICBvbk1vdXNlRG93bj17KCkgPT4ge1xuICAgICAgICAgICAgYnV0dG9uQ2xpY2soMSlcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgd2lkdGg6IGdldFNjYWxlZFNpemUoMTIpLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgICAgICAgc3JjOiBnZXRUaGVtZSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHV2czogZ2V0SW1hZ2VBdGxhc01hcHBpbmcocmVkQnV0dG9uQ29ybmVyKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgd2lkdGg6ICAnYXV0bycsXG4gICAgICAgICAgICAgIG1heFdpZHRoOiBnZXRTY2FsZWRTaXplKDMwMCksXG4gICAgICAgICAgICAgIGhlaWdodDogZ2V0U2NhbGVkU2l6ZSg0NSksXG4gICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICAgICAgYWxpZ25Db250ZW50OiAnZmxleC1zdGFydCcsXG4gICAgICAgICAgICAgIGRpc3BsYXk6IGRpc3BsYXlCdXR0b24oMikgPyAnZmxleCcgOiAnbm9uZScsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgICAgICBzcmM6IGdldFRoZW1lKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhyZWRCdXR0b25TZWN0aW9uKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgICB3aWR0aDogIGdldFNjYWxlZFNpemUoMjUpLFxuICAgICAgICAgICAgICAgIGhlaWdodDogZ2V0U2NhbGVkU2l6ZSgyNSksXG4gICAgICAgICAgICAgICAgbWFyZ2luOiB7IHJpZ2h0OiBnZXRTY2FsZWRTaXplKDUpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgICAgICAgIHNyYzogZ2V0VGhlbWUoKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhwcmltYXJ5QnV0dG9uU2VjdGlvbilcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgICB3aWR0aDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiBnZXRTY2FsZWRTaXplKDIxNyksXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IHsgcmlnaHQ6IGdldFNjYWxlZFNpemUoNSkgfSxcbiAgICAgICAgICAgICAgICBtYXJnaW46IHsgbGVmdDogZ2V0U2NhbGVkU2l6ZSgzMCkgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICB1aVRleHQ9e3sgdmFsdWU6IGdldEJ1dHRvblRleHQoMSksIGZvbnRTaXplOiBnZXRTY2FsZWRGb250U2l6ZShnZXRCdXR0b25Gb250U2l6ZSgxKSksIHRleHRBbGlnbjogJ21pZGRsZS1sZWZ0JywgdGV4dFdyYXA6ICdub3dyYXAnIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvVWlFbnRpdHk+XG4gICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgICAgd2lkdGg6ICBnZXRTY2FsZWRTaXplKDEyKSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgICAgIHNyYzogZ2V0VGhlbWUoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB1dnM6IGdldEltYWdlQXRsYXNNYXBwaW5nKHJlZEJ1dHRvbkVkZ2UpXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVWlFbnRpdHk+XG4gICAgICA8L1VpRW50aXR5PlxuXG4gICAgICB7LyogU2Vjb25kIHJvdyBvZiBidXR0b25zICovfVxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgd2lkdGg6IGdldFNjYWxlZFNpemUoMzAwKSxcbiAgICAgICAgICBoZWlnaHQ6IGdldFNjYWxlZFNpemUoNTApLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYXJvdW5kJyxcbiAgICAgICAgICBtYXJnaW46IHsgdG9wOiBnZXRTY2FsZWRTaXplKDIwKSB9LFxuICAgICAgICAgIGRpc3BsYXk6IGRpc3BsYXlTZWNvbmRCdXR0b25Db250YWluZXIoKSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgey8qIEJ1dHRvbjMgKi99XG4gICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiB7XG4gICAgICAgICAgICBidXR0b25DbGljaygzKVxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICB3aWR0aDogZ2V0U2NhbGVkU2l6ZSgxMiksXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgICAgICBzcmM6IGdldFRoZW1lKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhkYXJrQnV0dG9uQ29ybmVyKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IGdldFNjYWxlZFNpemUoMzAwKSxcbiAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGdldFNjYWxlZFNpemUoNDUpLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBhbGlnbkNvbnRlbnQ6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICAgICAgZGlzcGxheTogZGlzcGxheUJ1dHRvbigzKSA/ICdmbGV4JyA6ICdub25lJ1xuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgICAgICAgc3JjOiBnZXRUaGVtZSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHV2czogZ2V0SW1hZ2VBdGxhc01hcHBpbmcoZGFya0J1dHRvblNlY3Rpb24pXG4gICAgICAgICAgICB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6IGdldFNjYWxlZFNpemUoMjUyKSxcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHVpVGV4dD17eyB2YWx1ZTogZ2V0QnV0dG9uVGV4dCgyKSwgZm9udFNpemU6IGdldFNjYWxlZEZvbnRTaXplKGdldEJ1dHRvbkZvbnRTaXplKDIpKSwgdGV4dEFsaWduOiAnbWlkZGxlLWxlZnQnLCB0ZXh0V3JhcDogJ25vd3JhcCcgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9VaUVudGl0eT5cbiAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICB3aWR0aDogZ2V0U2NhbGVkU2l6ZSgxMiksXG4gICAgICAgICAgICAgIG1hcmdpbjogeyByaWdodDogJzUlJyB9LFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgICAgICAgc3JjOiBnZXRUaGVtZSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHV2czogZ2V0SW1hZ2VBdGxhc01hcHBpbmcoZGFya0J1dHRvbkVkZ2UpXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvVWlFbnRpdHk+XG5cbiAgICAgICAgey8qIEJ1dHRvbjQgKi99XG4gICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgIG9uTW91c2VEb3duPXsoKSA9PiB7XG4gICAgICAgICAgICBidXR0b25DbGljayg0KVxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICB3aWR0aDogZ2V0U2NhbGVkU2l6ZSgxMiksXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgICAgICBzcmM6IGdldFRoZW1lKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhkYXJrQnV0dG9uQ29ybmVyKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IGdldFNjYWxlZFNpemUoMzAwKSxcbiAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGdldFNjYWxlZFNpemUoNDUpLFxuICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICBhbGlnbkNvbnRlbnQ6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICAgICAgZGlzcGxheTogZGlzcGxheUJ1dHRvbig0KSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgICAgIHNyYzogZ2V0VGhlbWUoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB1dnM6IGdldEltYWdlQXRsYXNNYXBwaW5nKGRhcmtCdXR0b25TZWN0aW9uKVxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICAgICAgICB3aWR0aDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIG1heFdpZHRoOiBnZXRTY2FsZWRTaXplKDI1MiksXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICB1aVRleHQ9e3sgdmFsdWU6IGdldEJ1dHRvblRleHQoMyksIGZvbnRTaXplOiBnZXRTY2FsZWRGb250U2l6ZShnZXRCdXR0b25Gb250U2l6ZSgzKSksIHRleHRBbGlnbjogJ21pZGRsZS1sZWZ0JywgdGV4dFdyYXA6ICdub3dyYXAnIH19XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgXG4gICAgICAgICAgPC9VaUVudGl0eT5cbiAgICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICB3aWR0aDogZ2V0U2NhbGVkU2l6ZSgxMiksXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgICAgICBzcmM6IGdldFRoZW1lKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhkYXJrQnV0dG9uRWRnZSlcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9VaUVudGl0eT5cbiAgICAgIDwvVWlFbnRpdHk+XG4gICAgPC9VaUVudGl0eT5cbiAgKVxufVxuIl19