ng-cw-v12
Version:
Angular UI component library
666 lines • 139 kB
JavaScript
import { __awaiter } from "tslib";
import { Component, Input, EventEmitter, Output } from '@angular/core';
import Hls from 'hls.js';
import * as i0 from "@angular/core";
import * as i1 from "./local.service";
import * as i2 from "@angular/common";
export class VideoHlsComponent {
constructor(elementRef, ls) {
this.elementRef = elementRef;
this.ls = ls;
this.SHOW_LOADING = "loading...";
this.SHOW_DONE = "done.";
this.isH265 = true;
this.isPlaying = false;
this.muteState = true;
this.isFullScreenBtn = false;
this.networkState = 1; //1:加载中 2:视频地址超时 3:视频地址格式错误 4:初始化组件失败 5:成功
this.glplayerId = 'glplayer' + '_' + new Date().getTime() + '_' + Math.random().toString(36).substring(2, 15);
this.initMissileOk = false;
this.fullscreenHandler = null;
this.canvasStyle = {
marginLeft: 0,
marginTop: 0,
width: 0,
height: 0
};
this.resizeObserver = null;
this.resizeDebounceTimer = null;
this.isInitialResize = true;
this.ncUrl = ''; //视频地址
this.ncErrorTime = 8; //视频地址错误检测时间
this.ncResizeWay = 'default';
this.ncPlaying = new EventEmitter(); //返回播放状态
this.ncLoaded = new EventEmitter(); //返回播放器
this.autoplayMode = false;
this.mutedMode = true;
this.controlsMode = true;
this.playError = false;
//重写console.log来捕获所有输出
this.originalConsoleLog = console.log; // 保存原始 console.log
console.log = (...args) => {
this.originalConsoleLog.apply(console, args);
const message = args.join(' ');
if (message.includes('onReadyShowDone')) {
this.originalConsoleLog('检测到missile初始化成功!');
this.initMissileOk = true;
}
};
// 只在第一次实例化时加载脚本
if (!VideoHlsComponent.h265webjsLoaded) {
this.ls.loadScript('assets/h265webjs-js/h265webjs-v20211104.js');
VideoHlsComponent.h265webjsLoaded = true;
}
}
//自动播放
set ncAutoplay(value) {
this.autoplayMode = value !== null && value !== undefined && value !== false && value !== 'false';
}
//静音
set ncMuted(value) {
this.mutedMode = value !== null && value !== undefined && value !== false && value !== 'false';
}
//隐藏控制栏
set ncControls(value) {
this.controlsMode = value !== null && value !== undefined && value !== false && value !== 'false';
}
ngOnInit() { }
ngAfterViewInit() {
if (this.ls.getFileExtension(this.ncUrl) !== 'm3u8') {
console.error("视频地址格式错误!仅支持m3u8格式!");
this.networkState = 3;
return;
}
this.waitForPlayerLoad();
}
ngOnDestroy() {
// 恢复原始的 console.log
if (this.originalConsoleLog) {
console.log = this.originalConsoleLog;
}
// 移除全屏事件监听器
if (this.fullscreenHandler) {
document.removeEventListener('fullscreenchange', this.fullscreenHandler);
this.fullscreenHandler = null;
}
// 清理ResizeObserver
if (this.resizeObserver) {
this.resizeObserver.disconnect();
this.resizeObserver = null;
}
// 清理防抖定时器
if (this.resizeDebounceTimer) {
clearTimeout(this.resizeDebounceTimer);
this.resizeDebounceTimer = null;
}
// 重置初始化标志和尺寸记录
this.isInitialResize = true;
//销毁 h265webjs player
try {
if (this.player && typeof this.player.release === 'function') {
this.player.release();
}
}
catch (error) {
console.warn('播放器销毁失败:', error);
}
//销毁 hls.js player
this.destroyAll();
}
//等待265webjs加载完成
waitForPlayerLoad() {
if (!window.new265webjs) {
setTimeout(() => {
this.waitForPlayerLoad();
}, 100);
return;
}
//初始化
this.initPlayer();
// 8秒后通过打印台信息检查missile是否初始化成功
setTimeout(() => {
if (!this.initMissileOk) {
console.log("missile初始化失败!");
this.networkState = 4;
}
}, this.ncErrorTime * 1000);
}
//重新加载
reload() {
this.isInitialResize = true;
this.player.release();
const glplayer = this.elementRef.nativeElement.querySelector('#' + this.glplayerId);
const playerCanvas = glplayer.querySelector('canvas');
playerCanvas.remove();
this.initPlayer();
}
//初始化
initPlayer() {
return __awaiter(this, void 0, void 0, function* () {
var token = "base64:QXV0aG9yOmNoYW5neWFubG9uZ3xudW1iZXJ3b2xmLEdpdGh1YjpodHRwczovL2dpdGh1Yi5jb20vbnVtYmVyd29sZixFbWFpbDpwb3JzY2hlZ3QyM0Bmb3htYWlsLmNvbSxRUTo1MzEzNjU4NzIsSG9tZVBhZ2U6aHR0cDovL3h2aWRlby52aWRlbyxEaXNjb3JkOm51bWJlcndvbGYjODY5NCx3ZWNoYXI6bnVtYmVyd29sZjExLEJlaWppbmcsV29ya0luOkJhaWR1";
// var url = "http://182.140.3.24:9999/rtp/51332300001320000001_51332300001320000001/hls.m3u8";//265 canvas
// var url = "https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/hls/xgplayer-demo.m3u8";//264 vjs
// var url = "http://pull-demo.volcfcdnrd.com/live/st-4536521_yzmuhevcd.flv";//265
// var url = "https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv";//264 flvjs
//检查流地址是否可访问
this.networkState = 1;
try {
const isAvailable = yield this.ls.checkStreamUrl(this.ncUrl);
if (!isAvailable) {
this.networkState = 2;
return;
}
}
catch (error) {
this.networkState = 2;
return;
}
let width = this.elementRef.nativeElement.offsetWidth;
let height = this.elementRef.nativeElement.offsetHeight;
console.log("width===========>", width);
console.log("height===========>", height);
var config = {
player: this.glplayerId,
width: width,
height: height,
token: token,
extInfo: {
coreProbePart: 0.4,
probeSize: 8192
}
};
let playerObj = window.new265webjs(this.ncUrl, config);
this.player = playerObj;
//加载missile(如果放在构造函数中加载的话,会产生可能不去加载视频地址导致的初始化失败问题)
if (!VideoHlsComponent.missileLoaded) {
this.ls.loadScript('assets/h265webjs-js/missile.js');
VideoHlsComponent.missileLoaded = true;
}
let playerCont = this.elementRef.nativeElement.querySelector('#player-container');
let controllerCont = this.elementRef.nativeElement.querySelector('#controller');
let progressCont = this.elementRef.nativeElement.querySelector('#progress-contaniner');
let progressContW = progressCont.offsetWidth;
let cachePts = progressCont.querySelector('#cachePts');
let progressPts = progressCont.querySelector('#progressPts');
let progressVoice = this.elementRef.nativeElement.querySelector('#progressVoice');
let playBtn = this.elementRef.nativeElement.querySelector('#playBtn');
let showLabel = this.elementRef.nativeElement.querySelector('#showLabel');
let ptsLabel = this.elementRef.nativeElement.querySelector('#ptsLabel');
let coverToast = this.elementRef.nativeElement.querySelector('#coverLayer');
let coverBtn = this.elementRef.nativeElement.querySelector('#coverLayerBtn');
let muteBtn = this.elementRef.nativeElement.querySelector('#muteBtn');
let fullScreenBtn = this.elementRef.nativeElement.querySelector('#fullScreenBtn');
let mediaInfo = null;
playBtn.disabled = true;
showLabel.textContent = this.SHOW_LOADING;
playerCont.style.width = config.width + 'px';
playerCont.style.height = config.height + 'px';
controllerCont.style.width = config.width + 'px';
//播放方法
let playAction = () => {
if (playerObj.isPlaying()) {
console.log("bar pause============>");
playerObj.pause();
this.isPlaying = false;
coverToast.removeAttribute('hidden');
}
else {
console.log("bar play============>");
playerObj.play();
this.isPlaying = true;
coverToast.setAttribute('hidden', 'hidden');
}
this.ncPlaying.emit(this.isPlaying);
};
playerCont.onmouseover = () => {
if (!this.controlsMode) {
controllerCont.hidden = true;
}
else {
controllerCont.hidden = false;
}
};
controllerCont.hidden = true; //默认隐藏工具栏,不在html中设置是因为前方需要获取宽度
playerCont.onmouseout = () => {
controllerCont.hidden = true;
};
//播放按钮点击事件
playBtn.onclick = () => {
playAction();
};
//静音按钮点击事件
muteBtn.onclick = () => {
// console.log(playerObj.getVolume());
if (this.muteState) {
playerObj.setVoice(1.0);
progressVoice.value = 100;
}
else {
playerObj.setVoice(0.0);
progressVoice.value = 0;
}
this.muteState = !this.muteState;
};
//全屏按钮点击事件
fullScreenBtn.onclick = () => {
if (!this.isFullScreenBtn) {
// 设置当前全屏播放器ID
VideoHlsComponent.currentFullscreenPlayerId = this.glplayerId;
document.documentElement.requestFullscreen();
// 记录canvas的样式用于还原
const glplayer = this.elementRef.nativeElement.querySelector('#' + this.glplayerId);
const playerCanvas = glplayer.querySelector('canvas');
if (playerCanvas) {
this.canvasStyle.marginLeft = parseInt(getComputedStyle(playerCanvas).marginLeft) || 0;
this.canvasStyle.marginTop = parseInt(getComputedStyle(playerCanvas).marginTop) || 0;
this.canvasStyle.width = playerCanvas.offsetWidth;
this.canvasStyle.height = playerCanvas.offsetHeight;
}
}
else {
document.exitFullscreen();
}
};
// 全屏监听
this.fullscreenHandler = (event) => {
// 只处理当前触发全屏的播放器
if (VideoHlsComponent.currentFullscreenPlayerId === this.glplayerId) {
if (document.fullscreenElement) {
const screenWidth = window.screen.width;
const screenHeight = window.screen.height;
this.updatePlayerSize('fullscreen', screenWidth, screenHeight);
this.isFullScreenBtn = true;
// 添加全屏时的样式
playerCont.style.position = 'fixed';
playerCont.style.top = '0';
playerCont.style.left = '0';
playerCont.style.zIndex = '10001';
}
else {
this.updatePlayerSize('normal', config.width, config.height);
this.isFullScreenBtn = false;
// 退出全屏时清除当前全屏播放器ID
VideoHlsComponent.currentFullscreenPlayerId = null;
// 恢复正常样式
playerCont.style.position = 'relative';
playerCont.style.top = 'auto';
playerCont.style.left = 'auto';
playerCont.style.zIndex = 'auto';
}
}
};
document.addEventListener('fullscreenchange', this.fullscreenHandler);
//进度条点击事件
progressCont.addEventListener('click', (e) => {
showLabel.textContent = this.SHOW_LOADING;
let x = e.pageX - progressCont.getBoundingClientRect().left; // or e.offsetX (less support, though)
let y = e.pageY - progressCont.getBoundingClientRect().top; // or e.offsetY
let clickedValue = x * progressCont.max / progressCont.offsetWidth;
playerObj.seek(clickedValue);
});
//进度条音量点击事件
progressVoice.addEventListener('click', (e) => {
let x = e.pageX - progressVoice.getBoundingClientRect().left; // or e.offsetX (less support, though)
let y = e.pageY - progressVoice.getBoundingClientRect().top; // or e.offsetY
let clickedValue = x * progressVoice.max / progressVoice.offsetWidth;
progressVoice.value = clickedValue;
let volume = clickedValue / 100;
playerObj.setVoice(volume);
this.muteState = volume == 0;
});
//进度条开始拖拽事件
playerObj.onSeekStart = (pts) => {
showLabel.textContent = this.SHOW_LOADING + " seek to:" + parseInt(pts);
};
//进度条结束拖拽事件
playerObj.onSeekFinish = () => {
showLabel.textContent = this.SHOW_DONE;
};
//播放结束事件
playerObj.onPlayFinish = () => {
console.log("============= FINISHED ===============");
this.isPlaying = false;
};
//渲染事件
playerObj.onRender = (width, height, imageBufferY, imageBufferB, imageBufferR) => {
console.log("on render");
};
//打开全屏事件
playerObj.onOpenFullScreen = () => {
console.log("onOpenFullScreen");
};
//关闭全屏事件
playerObj.onCloseFullScreen = () => {
console.log("onCloseFullScreen");
};
//进度条结束拖拽事件
playerObj.onSeekFinish = () => {
showLabel.textContent = this.SHOW_DONE;
};
//加载缓存事件
playerObj.onLoadCache = () => {
showLabel.textContent = "Caching...";
};
//加载缓存完成事件
playerObj.onLoadCacheFinshed = () => {
showLabel.textContent = this.SHOW_DONE;
};
//准备完成事件
playerObj.onReadyShowDone = () => {
console.log("onReadyShowDone");
showLabel.textContent = "Cover Img OK";
this.networkState = 5;
};
//加载完成事件
playerObj.onLoadFinish = () => {
mediaInfo = playerObj.mediaInfo();
console.log("mediaInfo===========>", mediaInfo);
if (mediaInfo.meta.isHEVC === false) {
console.log("is not HEVC/H.265 media!");
playerObj.release();
this.isH265 = false;
setTimeout(() => {
this.initVideo();
}, 200);
return;
}
playBtn.disabled = false;
//H265 resize - 使用ResizeObserver监听元素尺寸变化
if (this.isH265) {
this.setupResizeObserver(token, playerCont, controllerCont);
}
//视频类型
if (mediaInfo.videoType == "vod") {
cachePts.max = mediaInfo.meta.durationMs / 1000;
progressCont.max = mediaInfo.meta.durationMs / 1000;
ptsLabel.textContent = this.ls.durationText(0) + '/' + this.ls.durationText(progressCont.max);
}
else {
cachePts.hidden = true;
progressCont.hidden = true;
ptsLabel.textContent = 'LIVE';
}
//封面按钮点击事件
coverBtn.onclick = () => {
playAction();
};
//没有音频
if (mediaInfo.meta.audioNone) {
progressVoice.value = 0;
progressVoice.style.display = 'none';
this.muteState = true;
}
else {
if (this.mutedMode) {
playerObj.setVoice(0.0);
progressVoice.value = 0;
this.muteState = true;
}
else {
playerObj.setVoice(0.5);
progressVoice.value = 50;
this.muteState = false;
}
}
//自动播放
if (this.autoplayMode) {
playAction();
}
else {
coverToast.removeAttribute('hidden');
}
showLabel.textContent = this.SHOW_DONE;
};
//缓存进度事件
playerObj.onCacheProcess = (cPts) => {
try {
let precent = cPts / progressCont.max;
let cacheWidth = precent * progressContW;
cachePts.style.width = cacheWidth + 'px';
}
catch (err) {
console.log(err);
}
};
//播放时间事件
playerObj.onPlayTime = (videoPTS) => {
if (mediaInfo.videoType == "vod") {
let precent = videoPTS / progressCont.max;
let progWidth = precent * progressContW;
progressPts.style.width = progWidth + 'px';
ptsLabel.textContent = this.ls.durationText(videoPTS) + '/' + this.ls.durationText(progressCont.max);
}
else {
ptsLabel.textContent = 'LIVE';
}
};
playerObj.do();
this.ncLoaded.emit(this.player);
});
}
// 设置ResizeObserver监听.video-hls-265尺寸变化
setupResizeObserver(token, playerCont, controllerCont) {
// 清理之前的observer
if (this.resizeObserver) {
this.resizeObserver.disconnect();
}
this.resizeObserver = new ResizeObserver((entries) => {
console.log('resize observer');
// 跳过首次初始化触发
if (this.isInitialResize) {
this.isInitialResize = false;
console.log('resize initial');
return;
}
const entry = entries[0];
const { width, height } = entry.contentRect;
console.log('resize width===========>', width);
console.log('resize height===========>', height);
// 清除之前的防抖定时器
if (this.resizeDebounceTimer) {
clearTimeout(this.resizeDebounceTimer);
console.log('resize debounce cleared');
}
//更改原player-container容器样式
playerCont.style.width = width + 'px';
playerCont.style.height = height + 'px';
//更改控制条controller宽度
controllerCont.style.width = width + 'px';
//更改原glplayer样式
const glplayer = this.elementRef.nativeElement.querySelector('#' + this.glplayerId);
glplayer.style.width = width + 'px';
glplayer.style.height = height + 'px';
//先更改原canvas样式为占满,后面再用新的值更新
const playerCanvas = glplayer.querySelector('canvas');
playerCanvas.style.width = width + 'px';
playerCanvas.style.height = height + 'px';
playerCanvas.style.marginLeft = '0px';
playerCanvas.style.marginTop = '0px';
// 设置防抖,500ms后执行resize逻辑
this.resizeDebounceTimer = setTimeout(() => {
if (this.ncResizeWay == 'default') {
console.log('resize start');
var config = {
player: 'resize-container',
width: width,
height: height,
token: token,
extInfo: {
coreProbePart: 0.4,
probeSize: 8192
}
};
let playerObjForResize = window.new265webjs(this.ncUrl, config);
playerObjForResize.onLoadFinish = () => {
playerObjForResize.play();
console.log('playerObjForResize play');
// 监听canvas样式变化
const glplayerForResize = this.elementRef.nativeElement.querySelector('#resize-container');
const allPlayerCanvasForResize = glplayerForResize.querySelectorAll('canvas');
//这里查询all并使用最后一个canvas是因为可能在监听canvas尺寸变化过程中(还在播放准备中)又有新的play(尺寸又变化了)增加了新的canvas,同时存在多个canvas
//如果不使用最后一个canvas,都会监听第一个canvas,第一个canvas被移除后,后面的尺寸变化监听就是失效了且多余的canvas不会被移除
//总结:存在多个canvas时,会对每个都监听,也就是按顺序执行样式变化更新和清理
const playerCanvasForResize = allPlayerCanvasForResize[allPlayerCanvasForResize.length - 1];
// 使用MutationObserver监听style属性变化
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.type === 'attributes' && mutation.attributeName === 'style') {
const target = mutation.target;
const computedStyle = getComputedStyle(target);
const marginLeft = parseInt(computedStyle.marginLeft) || 0;
const marginTop = parseInt(computedStyle.marginTop) || 0;
// 检查是否出现了margin-top和margin-left属性
if (marginLeft !== 0 || marginTop !== 0) {
const width = target.offsetWidth;
const height = target.offsetHeight;
console.log('检测到canvas样式变化:', { marginLeft, marginTop, width, height });
// 执行清理操作
observer.disconnect();
playerObjForResize.release();
playerCanvasForResize.remove();
//更新原canvas样式
playerCanvas.style.width = width + 'px';
playerCanvas.style.height = height + 'px';
playerCanvas.style.marginLeft = marginLeft + 'px';
playerCanvas.style.marginTop = marginTop + 'px';
console.log('resize end');
}
}
});
});
// 开始监听canvas的style属性变化
observer.observe(playerCanvasForResize, {
attributes: true,
attributeFilter: ['style']
});
};
playerObjForResize.do();
}
else {
this.reload();
}
}, 500); // 500ms防抖延迟
});
// 开始监听video-hls-265元素尺寸变化
const videoHls265Element = this.elementRef.nativeElement.querySelector('.video-hls-265');
this.resizeObserver.observe(videoHls265Element);
}
// 抽取尺寸更新逻辑到单独的方法
updatePlayerSize(mode, width, height) {
const playerCont = this.elementRef.nativeElement.querySelector('#player-container');
const controllerCont = this.elementRef.nativeElement.querySelector('#controller');
const glplayer = this.elementRef.nativeElement.querySelector('#' + this.glplayerId);
playerCont.style.width = width + 'px';
playerCont.style.height = height + 'px';
controllerCont.style.width = width + 'px';
glplayer.style.width = width + 'px';
glplayer.style.height = height + 'px';
// canvas
const playerCanvas = glplayer.querySelector('canvas');
if (playerCanvas) {
if (mode == 'fullscreen') {
playerCanvas.style.width = width + 'px';
playerCanvas.style.height = height + 'px';
playerCanvas.style.marginLeft = '0px';
playerCanvas.style.marginTop = '0px';
}
else {
playerCanvas.style.width = this.canvasStyle.width + 'px';
playerCanvas.style.height = this.canvasStyle.height + 'px';
playerCanvas.style.marginLeft = this.canvasStyle.marginLeft + 'px';
playerCanvas.style.marginTop = this.canvasStyle.marginTop + 'px';
}
}
}
//初始化
initVideo() {
return __awaiter(this, void 0, void 0, function* () {
console.log('启用hls.js!');
this.destroyAll(); //加载前先销毁
this.video = this.elementRef.nativeElement.querySelector('#video'); //获取video
//hls(m3u8)
if (this.video.canPlayType('application/vnd.apple.mpegurl')) {
this.video.src = this.ncUrl;
}
else if (Hls.isSupported()) {
this.hls = new Hls();
this.hls.loadSource(this.ncUrl);
this.hls.attachMedia(this.video);
//错误监听
this.hls.on(Hls.Events.ERROR, (event, data) => {
if (data.details == 'bufferStalledError') {
console.warn('warning:', data.error);
}
else if (data.details == 'fragParsingError') {
console.warn('warning:', data.error);
}
else if (data.details == 'bufferNudgeOnStall') {
console.warn('warning:', data.error);
}
else {
this.playError = true;
console.error('error:', data.details);
console.error('error:', data.error);
}
});
}
//播放监听
this.video.addEventListener('play', () => {
this.ncPlaying.emit(true);
});
//暂停监听
this.video.addEventListener('pause', () => {
this.ncPlaying.emit(false);
});
//返回video对象
this.ncLoaded.emit(this.video);
});
}
//销毁
destroyAll() {
if (this.hls) {
this.hls.destroy();
}
if (this.video) {
this.destroyVideo(this.video);
}
}
destroyVideo(video) {
video.pause();
video.src = '';
video.removeEventListener('play', () => { });
video.removeEventListener('pause', () => { });
video.removeEventListener('loadedmetadata', () => { });
video.remove();
}
}
VideoHlsComponent.currentFullscreenPlayerId = null; //静态属性来记录当前全屏的播放器ID
VideoHlsComponent.h265webjsLoaded = false; // 添加静态变量跟踪脚本加载状态
VideoHlsComponent.missileLoaded = false; // 添加静态变量跟踪missile加载状态
VideoHlsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: VideoHlsComponent, deps: [{ token: i0.ElementRef }, { token: i1.LocalService }], target: i0.ɵɵFactoryTarget.Component });
VideoHlsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: VideoHlsComponent, selector: "nc-video-hls", inputs: { ncUrl: "ncUrl", ncErrorTime: "ncErrorTime", ncAutoplay: "ncAutoplay", ncMuted: "ncMuted", ncControls: "ncControls", ncResizeWay: "ncResizeWay" }, outputs: { ncPlaying: "ncPlaying", ncLoaded: "ncLoaded" }, ngImport: i0, template: "<div class=\"video-hls-265\" *ngIf=\"isH265\">\r\n <!--\u52A0\u8F7D\u3001\u9519\u8BEF\u4FE1\u606F-->\r\n <div class=\"error-container\" *ngIf=\"networkState != 5\">\r\n <!--\u52A0\u8F7D\u4E2D-->\r\n <div class=\"error-text\" *ngIf=\"networkState == 1\">\r\n <div class=\"loading-spinner\"></div>\r\n <div>\u52A0\u8F7D\u4E2D...</div>\r\n </div>\r\n <!--\u9519\u8BEF-->\r\n <div class=\"error-text\" *ngIf=\"networkState == 2 || networkState == 3 || networkState == 4\">\r\n <svg t=\"1724830569178\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\r\n p-id=\"10496\" width=\"64\" height=\"64\">\r\n <path\r\n d=\"M725.333333 469.333333c129.6 0 234.666667 105.066667 234.666667 234.666667s-105.066667 234.666667-234.666667 234.666667-234.666667-105.066667-234.666666-234.666667 105.066667-234.666667 234.666666-234.666667z m128-341.333333a128 128 0 0 1 128 128v294.101333a300.224 300.224 0 0 0-85.312-91.221333L896 426.666667h-59.605333c-34.346667-13.76-71.808-21.333333-111.061334-21.333334v-192H298.666667v597.333334h147.626666a298.453333 298.453333 0 0 0 50.282667 85.354666L170.666667 896a128 128 0 0 1-128-128V256a128 128 0 0 1 128-128h682.666666z m-119.466666 661.333333h-17.066667a21.333333 21.333333 0 0 0-21.333333 21.333334v17.066666a21.333333 21.333333 0 0 0 21.333333 21.333334h17.066667a21.333333 21.333333 0 0 0 21.333333-21.333334V810.666667a21.333333 21.333333 0 0 0-21.333333-21.333334zM213.333333 682.666667H128v85.333333a42.666667 42.666667 0 0 0 39.466667 42.56L170.666667 810.666667h42.666666v-128z m520.533334-128h-17.066667a21.333333 21.333333 0 0 0-21.184 18.837333L695.466667 576v149.333333a21.333333 21.333333 0 0 0 18.837333 21.184L716.8 746.666667h17.066667a21.333333 21.333333 0 0 0 21.184-18.837334L755.2 725.333333v-149.333333a21.333333 21.333333 0 0 0-21.333333-21.333333z m-266.026667-187.114667l2.773333 1.6 114.090667 71.296a298.965333 298.965333 0 0 0-154.432 217.002667 42.24 42.24 0 0 1-24.832-35.584L405.333333 618.666667V405.333333c0-32.426667 34.517333-52.608 62.506667-37.781333zM213.333333 426.666667H128v170.666666h85.333333v-170.666666z m0-213.333334H170.666667a42.666667 42.666667 0 0 0-42.56 39.466667L128 256v85.333333h85.333333v-128z m640 0h-42.666666v128h85.333333v-85.333333a42.666667 42.666667 0 0 0-39.466667-42.56L853.333333 213.333333z\"\r\n fill=\"#cdcdcd\" p-id=\"10497\"></path>\r\n </svg>\r\n <div *ngIf=\"networkState == 2\">\u89C6\u9891\u5730\u5740\u8BBF\u95EE\u8D85\u65F6\uFF0C\u64AD\u653E\u5931\u8D25\uFF01</div>\r\n <div *ngIf=\"networkState == 3\">\u89C6\u9891\u5730\u5740\u683C\u5F0F\u9519\u8BEF\uFF0C\u4EC5\u652F\u6301m3u8\u683C\u5F0F\uFF01</div>\r\n <div *ngIf=\"networkState == 4\">\u521D\u59CB\u5316\u7EC4\u4EF6\u5931\u8D25\uFF0C\u8BF7\u5237\u65B0\u9875\u9762\u91CD\u8BD5\u3002</div>\r\n </div>\r\n </div>\r\n\r\n <!--\u5168\u5C4F\u64AD\u653E\u6309\u94AE-->\r\n <div id=\"coverLayer\" hidden=\"hidden\">\r\n <svg id=\"coverLayerBtn\" t=\"1730859326001\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\" p-id=\"5366\" width=\"48\" height=\"48\">\r\n <path\r\n d=\"M870.2 466.333333l-618.666667-373.28a53.333333 53.333333 0 0 0-80.866666 45.666667v746.56a53.206667 53.206667 0 0 0 80.886666 45.666667l618.666667-373.28a53.333333 53.333333 0 0 0 0-91.333334z\"\r\n fill=\"#ffffff\" p-id=\"5367\"></path>\r\n </svg>\r\n </div>\r\n\r\n <div id=\"player-container\">\r\n <!--\u89C6\u9891\u5BB9\u5668-->\r\n <div [id]=\"glplayerId\" class=\"glplayer\"></div>\r\n <!--\u5DE5\u5177\u680F-->\r\n <div id=\"controller\" class=\"controller\">\r\n\r\n <!--\u8FDB\u5EA6\u6761-->\r\n <div id=\"progress-contaniner\" class=\"progress-common progress-contaniner\">\r\n <div id=\"cachePts\" class=\"progress-common cachePts\"></div>\r\n <div id=\"progressPts\" class=\"progress-common progressPts\"></div>\r\n </div>\r\n\r\n <!--\u64CD\u4F5C\u680F-->\r\n <div id=\"operate-container\" class=\"operate-container\">\r\n <div class=\"left-container\">\r\n <!--\u65F6\u95F4-->\r\n <span id=\"ptsLabel\" class=\"ptsLabel\">00:00:00/00:00:00</span>\r\n <!--\u58F0\u97F3-->\r\n <div class=\"voice-div\">\r\n <span>\r\n <a id=\"muteBtn\" class=\"muteBtn\" href=\"javascript:void(0)\">\r\n <svg *ngIf=\"!muteState\" t=\"1730872283671\" class=\"icon\" viewBox=\"0 0 1024 1024\"\r\n version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1952\" width=\"20\" height=\"20\">\r\n <path\r\n d=\"M789.904 256.006a35.337 35.337 0 0 0-26.856-4.837 35.348 35.348 0 0 0-22.293 15.745c-10.69 16.753-6.085 38.982 10.384 50.116 3.845 2.61 95.493 66.021 95.493 223.695 0 158.078-87.909 221.529-91.385 223.917-16.537 11.266-20.958 33.723-9.931 50.414a35.583 35.583 0 0 0 22.707 15.351 35.58 35.58 0 0 0 26.885-5.339c5.043-3.363 123.277-85.635 123.277-284.382 0-199.051-123.017-281.284-128.281-284.68M678.54 362.663a35.357 35.357 0 0 0-27.125-1.288 35.378 35.378 0 0 0-20.041 18.319c-8.474 17.905-1.265 39.308 16.321 48.436 2.279 1.192 55.866 29.426 55.866 109.94 0 85.97-50.116 114.463-51.758 115.397-17.756 9.141-24.891 30.84-16.023 48.732a35.783 35.783 0 0 0 48.025 16.286c3.739-1.943 91.272-47.911 91.272-180.375 0-127.906-92.615-173.577-96.536-175.481M515.796 800.753l-74.695-67.89-122.264-111.176a37.404 37.404 0 0 0-25.17-9.71l-113.979 0.034-0.37-239.827h150.05a37.423 37.423 0 0 0 32.001-9.072l79.698-72.488 74.688-67.89v578.019h0.041z m44.361-678.294c-9.147-4.028-33.273-10.792-59.747 13.295l-59.31 53.928-118.604 107.814H179.318c-41.107 0.165-74.341 33.546-74.318 74.653v239.862c0 41.16 33.346 74.655 74.318 74.655h99.932L441.1 833.803l59.383 53.963c14.976 13.597 29.165 17.403 40.334 17.403 8.621 0 15.494-2.279 19.454-4.034 9.112-4.029 30.246-17.25 30.246-52.99v-672.84c0-24.685-11.35-44.406-30.36-52.846z m0 0\"\r\n fill=\"#ffffff\" p-id=\"1953\"></path>\r\n </svg>\r\n <svg *ngIf=\"muteState\" t=\"1730872181114\" class=\"icon\" viewBox=\"0 0 1024 1024\"\r\n version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"13389\" width=\"20\"\r\n height=\"20\">\r\n <path\r\n d=\"M515.756 621.32v179.391L441.1 732.859 318.837 621.685a37.46 37.46 0 0 0-25.169-9.714l-113.981 0.036-0.369-239.826h87.299l-74.687-74.687h-12.612c-41.107 0.164-74.341 33.553-74.318 74.651v239.862c0 41.171 33.348 74.651 74.318 74.651h99.929L441.1 833.808l59.382 53.965c14.977 13.596 29.165 17.387 40.332 17.387 8.621 0 15.496-2.26 19.455-4.028 9.113-4.028 30.245-17.241 30.245-52.981V696.08l-74.758-74.76zM846.634 540.729c0 72.792-18.663 125.298-39.116 161.239l52.156 52.161c29.753-45.873 58.512-115.439 58.512-213.436 0-199.056-123.02-281.288-128.283-284.678a35.316 35.316 0 0 0-26.859-4.848 35.397 35.397 0 0 0-22.289 15.747c-10.689 16.749-6.087 38.984 10.384 50.119 3.845 2.605 95.495 66.011 95.495 223.696z\"\r\n fill=\"#ffffff\" p-id=\"13390\"></path>\r\n <path\r\n d=\"M647.697 428.133c2.278 1.185 55.865 29.416 55.865 109.935 0 20.759-3.012 38-7.463 52.47l54.616 54.621c13.733-26.828 24.363-61.51 24.363-107.055 0-127.905-92.616-173.577-96.534-175.472v0.036a35.383 35.383 0 0 0-27.128-1.294 35.349 35.349 0 0 0-20.039 18.316c-8.475 17.916-1.267 39.312 16.32 48.443zM417.558 312.002l23.511-21.378 74.687-67.889V410.2l74.76 74.76V175.313c0-24.695-11.35-44.415-30.359-52.853-9.145-4.028-33.275-10.789-59.747 13.304l-59.309 53.91-76.405 69.456 52.862 52.872zM829.266 866.596c-9.55 0-19.1-3.645-26.39-10.935l-634.53-634.53c-14.58-14.58-14.58-38.2 0-52.78 14.58-14.58 38.2-14.58 52.78 0l634.53 634.529c14.58 14.58 14.58 38.2 0 52.78-7.29 7.291-16.84 10.936-26.39 10.936z\"\r\n fill=\"#ffffff\" p-id=\"13391\"></path>\r\n </svg>\r\n </a>\r\n </span>\r\n <progress id=\"progressVoice\" class=\"progressVoice\" value=\"0\" max=\"100\"></progress>\r\n </div>\r\n </div>\r\n\r\n <div class=\"right-container\">\r\n <!--\u64AD\u653E\u3001\u6682\u505C-->\r\n <div id=\"playBtn\" [title]=\"isPlaying ? '\u6682\u505C' : '\u64AD\u653E'\">\r\n <svg *ngIf=\"!isPlaying\" t=\"1730861815254\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\" p-id=\"8053\" width=\"20\" height=\"20\">\r\n <path\r\n d=\"M780.8 475.733333L285.866667 168.533333c-27.733333-17.066667-64 4.266667-64 36.266667v614.4c0 32 36.266667 53.333333 64 36.266667l492.8-307.2c29.866667-14.933333 29.866667-57.6 2.133333-72.533334z\"\r\n fill=\"#ffffff\" p-id=\"8054\"></path>\r\n </svg>\r\n <svg *ngIf=\"isPlaying\" t=\"1730861393868\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6827\" width=\"20\" height=\"20\">\r\n <path\r\n d=\"M428.539658 833.494155c0 15.954367-13.053294 29.007661-29.007661 29.007661L285.613458 862.501816c-15.954367 0-29.007661-13.053294-29.007661-29.007661l0-639.423111c0-15.954367 13.053294-29.007661 29.007661-29.007661l113.918539 0c15.954367 0 29.007661 13.053294 29.007661 29.007661L428.539658 833.494155z\"\r\n fill=\"#ffffff\" p-id=\"6828\"></path>\r\n <path\r\n d=\"M760.124635 833.494155c0 15.954367-13.053294 29.007661-29.007661 29.007661l-113.918539 0c-15.954367 0-29.007661-13.053294-29.007661-29.007661l0-639.423111c0-15.954367 13.053294-29.007661 29.007661-29.007661l113.918539 0c15.954367 0 29.007661 13.053294 29.007661 29.007661L760.124635 833.494155z\"\r\n fill=\"#ffffff\" p-id=\"6829\"></path>\r\n </svg>\r\n </div>\r\n <!--\u5168\u5C4F-->\r\n <div id=\"fullScreenBtn\" class=\"fullScreenBtn\" [title]=\"isFullScreenBtn ? '\u9000\u51FA\u5168\u5C4F' : '\u5168\u5C4F'\">\r\n <svg *ngIf=\"!isFullScreenBtn\" t=\"1730875130357\" class=\"icon\" viewBox=\"0 0 1024 1024\"\r\n version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"8257\" width=\"20\" height=\"20\">\r\n <path\r\n d=\"M358.4 768H426.666667v85.333333H213.333333v-213.333333h85.333334v68.266667l128-128 59.733333 59.733333-128 128z m345.6 0l-128-128 59.733333-59.733333 132.266667 132.266666V640h85.333333v213.333333h-213.333333v-85.333333h64zM358.4 298.666667l128 128-59.733333 59.733333-128-128V426.666667H213.333333V213.333333h213.333334v85.333334H358.4z m345.6 0H640V213.333333h213.333333v213.333334h-85.333333V354.133333l-132.266667 132.266667-59.733333-59.733333 128-128z\"\r\n fill=\"#ffffff\" p-id=\"8258\"></path>\r\n </svg>\r\n <svg *ngIf=\"isFullScreenBtn\" t=\"1730875137734\" class=\"icon\" viewBox=\"0 0 1024 1024\"\r\n version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"8467\" width=\"20\" height=\"20\">\r\n <path\r\n d=\"M298.666667 631.466667H226.133333v-81.066667h217.6v204.8h-85.333333v-68.266667l-128 128L170.666667 759.466667l128-128z m422.4 0l128 128-59.733334 59.733333-128-128v68.266667h-85.333333V554.666667h217.6v81.066666h-72.533333zM298.666667 341.333333L187.733333 230.4 243.2 170.666667l115.2 115.2V217.6h85.333333v204.8H226.133333V341.333333H298.666667z m430.933333 0h64v81.066667h-217.6V217.6h85.333333v72.533333L780.8 170.666667l59.733333 59.733333L729.6 341.333333z\"\r\n fill=\"#ffffff\" p-id=\"8468\"></path>\r\n </svg>\r\n </div>\r\n <!--\u4FE1\u606F-->\r\n <span id=\"showLabel\" class=\"showLabel\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n\r\n<div style=\"position: fixed;left: 0;top: 10000px;\">\r\n <div id=\"resize-container\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"!isH265\" class=\"video-hls-264\">\r\n <div class=\"playError\" *ngIf=\"playError\">\r\n <svg t=\"1724830569178\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\r\n p-id=\"10496\" width=\"64\" height=\"64\">\r\n <path\r\n d=\"M725.333333 469.333333c129.6 0 234.666667 105.066667 234.666667 234.666667s-105.066667 234.666667-234.666667 234.666667-234.666667-105.066667-234.666666-234.666667 105.066667-234.666667 234.666666-234.666667z m128-341.333333a128 128 0 0 1 128 128v294.101333a300.224 300.224 0 0 0-85.312-91.221333L896 426.666667h-59.605333c-34.346667-13.76-71.808-21.333333-111.061334-21.333334v-192H298.666667v597.333334h147.626666a298.453333 298.453333 0 0 0 50.282667 85.354666L170.666667 896a128 128 0 0 1-128-128V256a128 128 0 0 1 128-128h682.666666z m-119.466666 661.333333h-17.066667a21.333333 21.333333 0 0 0-21.333333 21.333334v17.066666a21.333333 21.333333 0 0 0 21.333333 21.333334h17.066667a21.333333 21.333333 0 0 0 21.333333-21.333334V810.666667a21.333333 21.333333 0 0 0-21.333333-21.333334zM213.333333 682.666667H128v85.333333a42.666667 42.666667 0 0 0 39.466667 42.56L170.666667 810.666667h42.666666v-128z m520.533334-128h-17.066667a21.333333 21.333333 0 0 0-21.184 18.837333L695.466667 576v149.333333a21.333333 21.333333 0 0 0 18.837333 21.184L716.8 746.666667h17.066667a21.333333 21.333333 0 0 0 21.184-18.837334L755.2 725.333333v-149.333333a21.333333 21.333333 0 0 0-21.333333-21.333333z m-266.026667-187.114667l2.773333 1.6 114.090667 71.296a298.965333 298.965333 0 0 0-154.432 217.002667 42.24 42.24 0 0 1-24.832-35.584L405.333333 618.666667V405.333333c0-32.426667 34.517333-52.608 62.506667-37.781333zM213.333333 426.666667H128v170.666666h85.333333v-170.666666z m0-213.333334H170.666667a42.666667 42.666667 0 0 0-42.56 39.466667L128 256v85.333333h85.333333v-128z m640 0h-42.666666v128h85.333333v-85.333333a42.666667 42.666667 0 0 0-39.466667-42.56L853.333333 213.333333z\"\r\n fill=\"#cdcdcd\" p-id=\"10497\"></path>\r\n </svg>\r\n <div class=\"errorText\">\u64AD\u653E\u5931\u8D25</div>\r\n </div>\r\n <video class=\"video\" [ngStyle]=\"{'object-fit': 'contain' }\" crossOrigin=\"anonymous\" [controls]=\"controlsMode\"\r\n [muted]=\"mutedMode\" [autoplay]=\"autoplayMode\" id=\"video\"></video>\r\n</div>", styles: [".video-hls-265{width:100%;height:100%;position:relative}.video-hls-265 .error-container{width:100%;height:100%;position:absolute;top:0px;left:0px;z-index:10000;background-color:#000;display:flex;align-items:center;justify-content:center;color:#fff}.video-hls-265 .error-container .error-text{display:flex;flex-direction:column;justify-content:center;align-items:center}.video-hls-265 .error-container .error-text .loading-spinner{width:40px;height:40px;border:4px solid #f3f3f3;border-top:4px solid #a7a7a7;border-radius:50%;margin:0 auto 10px;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.video-hls-265 #coverLayer{width:100%;height:100%;z-index:10000;position:absolute;top:0px;left:0px;background-color:#00000080}.video-hls-265 #coverLayer #coverLayerBtn{cursor:pointer;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.video-hls-265 #player-container{position:absolute;margin:auto;left:0;right:0;overflow:hidden}.video-hls-265 #player-container .controller{background-color:#0009;width:960px;height:40px;position:absolute;z-index:99999;left:0;bottom:0}.video-hls-265 #player-container .controller .progress-common{border-radius:5px;border:none;margin-bottom:2px}.video-hls-265 #player-container .controller .progress-contaniner{z-index:1000;width:100%;background-color:#666;position:absolute;top:0;height:6px}.video-hls-265 #player-container .controller .progress-contaniner .cachePts{position:absolute;z-index:1001;width:0px;background-color:#d9d9d9}.video-hls-265 #player-container .controller .progress-contaniner .progressPts{position:absolute;z-index:1002;width:0px;height:100%;background-color:#f64f1e}.video-hls-265 #player-container .controller .operate-container{width:100%;height:100%;display:flex;align-items:center;justify-content:space-between}.video-hls-265 #player-container .controller .operate-container .left-container{display:flex;align-items:center}.video-hls-265 #player-container .controller .operate-container .left-container .ptsLabel{font-size:14px;color:#fff;margin-left:5px}.video-hls-265 #player-container .controller .operate-container .left-container .voice-div{color:#fff;margin-left:10px;display:flex;align-items:center}.video-hls-265 #player-container .controller .operate-container .left-container .voice-div .muteBtn{color:#fff;display:flex;align-items:center;opacity:.7}.video-hls-265 #player-container .controller .operate-container .left-container .voice-div .muteBtn:hover{opacity:1}.video-hls-265 #player-container .controller .operate-container .left-container .voice-div .progressVoice{width:100px;height:6px;cursor:pointer;border-radius:5px}.video-hls-265 #player-container .controller .operate-container .left-container .voice-div .progressVoice::-moz-progress-bar{background-color:#d9d9d9}.video-hls-265 #player-container .controller .operate-container .left-container .voice-div .progressVoice::-webkit-progress-value{background-color:#d9d9d9}.video-hls-265 #player-container .controller .operate-container .left-container .voice-div span{color:#fff;margin-right:5px}.video-hls-265 #player-container .controller .operate-container .right-container{display:flex;align-items:center}.video-hls-265 #player-container .controller .operate-container .right-container #playBtn{cursor:pointer;display:flex;align-items:center;justify-content:center;margin-right:5px;opacity:.7}.video-hls-265 #player-container .controller .operate-container .right-container #playBtn:hover{opacity:1}.video-hls-265 #player-container .controller .operate-container .right-container .fullScreenBtn{margin-right:5px;display:flex;align-items:center;cursor:pointer;opacity:.7}.video-hls-265 #player-container .controller .operate-container .right-container .fullScreenBtn:hover{opacity:1}.video-hls-265 #player-container .controller .operate-container .right-container .showLabel{height:18px;font-size:8px;color:#fff;border-bottom:1px solid #666666;padding-top:1px;padding-left:5px;padding-right:5px;margin-right:5px}.video-hls-264{width:100%;height:100%;position:relative}.video-hls-264 .playError{background-color:#000;width:100%;height:100%;position:absolute;left:0;top:0;display:flex;flex-direction:column;justify-content:center;align-items:center;z-index:2}.video-hls-264 .playError .errorText{color:#cdcdcd;font-size:16px;margin-top:10px;letter-spacing:1px}.video-hls-264 .video{width:100%;height:100%}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: VideoHlsComponent, decorators: [{
type: Component,
args: [{
selector: 'nc-video-hls',
templateUrl: './video-hls.component.html',
styleUrls: ['./video-hls.component.less']
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.LocalService }]; }, propDecorators: { ncUrl: [{
type: Input
}], ncErrorTime: [{
type: Input
}], ncAutoplay: [{
type: Input
}], ncMuted: [{
type: Input
}], ncControls: [{
type: Input
}], ncResizeWay: [{
type: Input
}], ncPlaying: [{
type: Output
}], ncLoaded: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlkZW8taGxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvdmlkZW8taGxzL3ZpZGVvLWhscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3ZpZGVvLWhscy92aWRlby1obHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFDLEtBQUssRUFBYSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJILE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQzs7OztBQU96QixNQUFNLE9BQU8saUJBQWlCO0lBaUQ1QixZQUFvQixVQUFzQixFQUFVLEVBQWdCO1FBQWhELGVBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxPQUFFLEdBQUYsRUFBRSxDQUFjO1FBaERwRSxpQkFBWSxHQUFHLFlBQVksQ0FBQztRQUM1QixjQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3BCLFdBQU0sR0FBWSxJQUFJLENBQUM7UUFDdkIsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixjQUFTLEdBQVksSUFBSSxDQUFDO1FBQzFCLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBQ2pDLGlCQUFZLEdBQVcsQ0FBQyxDQUFDLENBQUEsMENBQTBDO1FBRW5FLGVBQVUsR0FBVyxVQUFVLEdBQUcsR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqSCxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUN2QixzQkFBaUIsR0FBb0MsSUFBSSxDQUFDO1FBSzFELGdCQUFXLEdBQVE7WUFDekIsVUFBVSxFQUFFLENBQUM7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RSxpQ0FBZSxHQUFZLEtBQUssQ0FBQyxDQUFDLGlCQUFpQjtBQUNuRCwrQkFBYSxHQUFZLEtBQUssQ0FBQyxDQUFDLHNCQUFzQjs4R0FkMUQsaUJBQWlCO2tHQUFqQixpQkFBaUIsMlFDVDlCLG15ZUFzSU07MkZEN0hPLGlCQUFpQjtrQkFMN0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsY0FBYztvQkFDeEIsV0FBVyxFQUFFLDRCQUE0QjtvQkFDekMsU0FBUyxFQUFFLENBQUMsNEJBQTRCLENBQUM7aUJBQzFDOzRIQTJCVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFTyxVQUFVO3NCQUF0QixLQUFLO2dCQUlPLE9BQU87c0JBQW5CLEtBQUs7Z0JBSU8sVUFBVTtzQkFBdEIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBMb2NhbFNlcnZpY2UgfSBmcm9tICcuL2xvY2FsLnNlcnZpY2UnO1xyXG5pbXBvcnQgSGxzIGZyb20gJ2hscy5qcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLXZpZGVvLWhscycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZGVvLWhscy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdmlkZW8taGxzLmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFZpZGVvSGxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIFNIT1dfTE9BRElORyA9IFwibG9hZGluZy4uLlwiO1xyXG4gIFNIT1dfRE9ORSA9IFwiZG9uZS5cIjtcclxuICBpc0gyNjU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzUGxheWluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG11dGVTdGF0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNGdWxsU2NyZWVuQnRuOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbmV0d29ya1N0YXRlOiBudW1iZXIgPSAxOy8vMe+8muWKoOi9veS4rSAy77ya6KeG6aKR5Zyw5Z2A6LaF5pe2IDPvvJrop4bpopHlnLDlnYDmoLzlvI/plJnor68gNO+8muWIneWni+WMlue7hOS7tuWksei0pSA177ya5oiQ5YqfXHJcbiAgcGxheWVyOiBhbnk7XHJcbiAgZ2xwbGF5ZXJJZDogc3RyaW5nID0gJ2dscGxheWVyJyArICdfJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgJ18nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDE1KTtcclxuICBpbml0TWlzc2lsZU9rOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBmdWxsc2NyZWVuSGFuZGxlcjogKChldmVudDogRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudEZ1bGxzY3JlZW5QbGF5ZXJJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7Ly/pnZnmgIHlsZ7mgKfmnaXorrDlvZXlvZPliY3lhajlsY/nmoTmkq3mlL7lmahJRFxyXG4gIHByaXZhdGUgc3RhdGljIGgyNjV3ZWJqc0xvYWRlZDogYm9vbGVhbiA9IGZhbHNlOyAvLyDmt7vliqDpnZnmgIHlj5jph4/ot5/ouKrohJrmnKzliqDovb3nirbmgIFcclxuICBwcml2YXRlIHN0YXRpYyBtaXNzaWxlTG9hZGVkOiBib29sZWFuID0gZmFsc2U7IC8vIOa3u+WKoOmdmeaAgeWPmOmHj+i3n+i4qm1pc3NpbGXliqDovb3nirbmgIFcclxuICBwcml2YXRlIG9yaWdpbmFsQ29uc29sZUxvZzogYW55OyAvLyDmt7vliqDlsZ7mgKfkv53lrZjljp/lp4sgY29uc29sZS5sb2dcclxuICBwcml2YXRlIGNhbnZhc1N0eWxlOiBhbnkgPSB7XHJcbiAgICBtYXJnaW5MZWZ0OiAwLFxyXG4gICAgbWFyZ2luVG9wOiAwLFxyXG4gICAgd2lkdGg6IDAsXHJcbiAgICBoZWlnaHQ6IDBcclxuICB9O1xyXG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZXNpemVEZWJvdW5jZVRpbWVyOiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgaXNJbml0aWFsUmVzaXplOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgbmNVcmw6IHN0cmluZyA9ICcnOy8v6KeG6aKR5Zyw5Z2AXHJcbiAgQElucHV0KCkgbmNFcnJvclRpbWU6IG51bWJlciA9IDg7Ly/op4bpopHlnLDlnYDplJnor6/mo4DmtYvml7bpl7RcclxuICAvL+iHquWKqOaSreaUvlxyXG4gIEBJbnB1dCgpIHNldCBuY0F1dG9wbGF5KHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLmF1dG9wbGF5TW9kZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICAvL+mdmemfs1xyXG4gIEBJbnB1dCgpIHNldCBuY011dGVkKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLm11dGVkTW9kZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICAvL+makOiXj+aOp+WItuagj1xyXG4gIEBJbnB1dCgpIHNldCBuY0NvbnRyb2xzKHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xzTW9kZSA9IHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IGZhbHNlICYmIHZhbHVlICE9PSAnZmFsc2UnO1xyXG4gIH1cclxuICBASW5wdXQoKSBuY1Jlc2l6ZVdheTogJ3JlbG9hZCcgfCAnZGVmYXVsdCcgPSAnZGVmYXVsdCc7XHJcbiAgQE91dHB1dCgpIG5jUGxheWluZyA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTsvL+i/lOWbnuaSreaUvueKtuaAgVxyXG4gIEBPdXRwdXQoKSBuY0xvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpOy8v6L+U5Zue5pKt5pS+5ZmoXHJcblxyXG4gIGF1dG9wbGF5TW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG11dGVkTW9kZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgY29udHJvbHNNb2RlOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSBsczogTG9jYWxTZXJ2aWNlKSB7XHJcbiAgICAvL+mHjeWGmWNvbnNvbGUubG9n5p2l5o2V6I635omA5pyJ6L6T5Ye6XHJcbiAgICB0aGlzLm9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nOyAvLyDkv53lrZjljp/lp4sgY29uc29sZS5sb2dcclxuICAgIGNvbnNvbGUubG9nID0gKC4uLmFyZ3MpID0+IHtcclxuICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGVMb2cuYXBwbHkoY29uc29sZSwgYXJncyk7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhcmdzLmpvaW4oJyAnKTtcclxuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ29uUmVhZHlTaG93RG9uZScpKSB7XHJcbiAgICAgICAgdGhpcy5vcmlnaW5hbENvbnNvbGVMb2coJ+ajgOa1i+WIsG1pc3NpbGXliJ3lp4vljJbmiJDlip/vvIEnKTtcclxuICAgICAgICB0aGlzLmluaXRNaXNzaWxlT2sgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgLy8g5Y+q5Zyo56ys5LiA5qyh5a6e5L6L5YyW5pe25Yqg6L296ISa5pysXHJcbiAgICBpZiAoIVZpZGVvSGxzQ29tcG9uZW50LmgyNjV3ZWJqc0xvYWRlZCkge1xyXG4gICAgICB0aGlzLmxzLmxvYWRTY3JpcHQoJ2Fzc2V0cy9oMjY1d2VianMtanMvaDI2NXdlYmpzLXYyMDIxMTEwNC5qcycpO1xyXG4gICAgICBWaWRlb0hsc0NvbXBvbmVudC5oMjY1d2VianNMb2FkZWQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7IH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgaWYgKHRoaXMubHMuZ2V0RmlsZUV4dGVuc2lvbih0aGlzLm5jVXJsKSAhPT0gJ20zdTgnKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCLop4bpopHlnLDlnYDmoLzlvI/plJnor6/vvIHku4XmlK/mjIFtM3U45qC85byP77yBXCIpO1xyXG4gICAgICB0aGlzLm5ldHdvcmtTdGF0ZSA9IDM7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLndhaXRGb3JQbGF5ZXJMb2FkKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIC8vIOaBouWkjeWOn+Wni+eahCBjb25zb2xlLmxvZ1xyXG4gICAgaWYgKHRoaXMub3JpZ2luYWxDb25zb2xlTG9nKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nID0gdGhpcy5vcmlnaW5hbENvbnNvbGVMb2c7XHJcbiAgICB9XHJcbiAgICAvLyDnp7vpmaTlhajlsY/kuovku7bnm5HlkKzlmahcclxuICAgIGlmICh0aGlzLmZ1bGxzY3JlZW5IYW5kbGVyKSB7XHJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCB0aGlzLmZ1bGxzY3JlZW5IYW5kbGVyKTtcclxuICAgICAgdGhpcy5mdWxsc2NyZWVuSGFuZGxlciA9IG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyDmuIXnkIZSZXNpemVPYnNlcnZlclxyXG4gICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcclxuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8g5riF55CG6Ziy5oqW5a6a5pe25ZmoXHJcbiAgICBpZiAodGhpcy5yZXNpemVEZWJvdW5jZVRpbWVyKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZURlYm91bmNlVGltZXIpO1xyXG4gICAgICB0aGlzLnJlc2l6ZURlYm91bmNlVGltZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8g6YeN572u5Yid5aeL5YyW5qCH5b+X5ZKM5bC65a+46K6w5b2VXHJcbiAgICB0aGlzLmlzSW5pdGlhbFJlc2l6ZSA9IHRydWU7XHJcbiAgICAvL+mUgOavgSBoMjY1d2VianMgcGxheWVyXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAodGhpcy5wbGF5ZXIgJiYgdHlwZW9mIHRoaXMucGxheWVyLnJlbGVhc2UgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICB0aGlzLnBsYXllci5yZWxlYXNlKCk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2Fybign5pKt5pS+5Zmo6ZSA5q+B5aSx6LSlOicsIGVycm9yKTtcclxuICAgIH1cclxuICAgIC8v6ZSA5q+BIGhscy5qcyBwbGF5ZXJcclxuICAgIHRoaXMuZGVzdHJveUFsbCgpO1xyXG4gIH1cclxuXHJcbiAgLy/nrYnlvoUyNjV3ZWJqc+WKoOi9veWujOaIkFxyXG4gIHByaXZhdGUgd2FpdEZvclBsYXllckxvYWQoKSB7XHJcbiAgICBpZiAoISh3aW5kb3cgYXMgYW55KS5uZXcyNjV3ZWJqcykge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLndhaXRGb3JQbGF5ZXJMb2FkKCk7XHJcbiAgICAgIH0sIDEwMCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvL+WIneWni+WMllxyXG4gICAgdGhpcy5pbml0UGxheWVyKCk7XHJcblxyXG4gICAgLy8gOOenkuWQjumAmui/h+aJk+WNsOWPsOS/oeaBr+ajgOafpW1pc3NpbGXmmK/lkKbliJ3lp4vljJbmiJDlip9cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuaW5pdE1pc3NpbGVPaykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwibWlzc2lsZeWIneWni+WMluWksei0pe+8gVwiKTtcclxuICAgICAgICB0aGlzLm5ldHdvcmtTdGF0ZSA9IDQ7XHJcbiAgICAgIH1cclxuICAgIH0sIHRoaXMubmNFcnJvclRpbWUgKiAxMDAwKVxyXG4gIH1cclxuXHJcbiAgLy/ph43mlrDliqDovb1cclxuICByZWxvYWQoKSB7XHJcbiAgICB0aGlzLmlzSW5pdGlhbFJlc2l6ZSA9IHRydWU7XHJcbiAgICB0aGlzLnBsYXllci5yZWxlYXNlKCk7XHJcbiAgICBjb25zdCBnbHBsYXllciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgdGhpcy5nbHBsYXllcklkKTtcclxuICAgIGNvbnN0IHBsYXllckNhbnZhcyA9IGdscGxheWVyLnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcycpO1xyXG4gICAgcGxheWVyQ2FudmFzLnJlbW92ZSgpO1xyXG4gICAgdGhpcy5pbml0UGxheWVyKCk7XHJcbiAgfVxyXG5cclxuICAvL+WIneWni+WMllxyXG4gIGFzeW5jIGluaXRQbGF5ZXIoKSB7XHJcbiAgICB2YXIgdG9rZW4gPSBcImJhc2U2NDpRWFYwYUc5eU9tTm9ZVzVuZVdGdWJHOXVaM3h1ZFcxaVpYSjNiMnhtTEVkcGRHaDFZanBvZEhSd2N6b3ZMMmRwZEdoMVlpNWpiMjB2Ym5WdFltVnlkMjlzWml4RmJXRnBiRHB3YjNKelkyaGxaM1F5TTBCbWIzaHRZV2xzTG1OdmJTeFJVVG8xTXpFek5qVTROeklzU0c5dFpWQmhaMlU2YUhSMGNEb3ZMM2gyYVdSbGJ5NTJhV1JsYnl4RWFYTmpiM0prT201MWJXSmxjbmR2YkdZak9EWTVOQ3gzWldOb1lYSTZiblZ0WW1WeWQyOXNaakV4TEVKbGFXcHBibWNzVjI5eWEwbHVPa0poYVdSMVwiO1xyXG4gICAgLy8gdmFyIHVybCA9IFwiaHR0cDovLzE4Mi4xNDAuMy4yNDo5OTk5L3J0cC81MTMzMjMwMDAwMTMyMDAwMDAwMV81MTMzMjMwMDAwMTMyMDAwMDAwMS9obHMubTN1OFwiOy8vMjY1IGNhbnZhc1xyXG4gICAgLy8gdmFyIHVybCA9IFwiaHR0cHM6Ly9zZjEtY2RuLXRvcy5odW9zaGFuc3RhdGljLmNvbS9vYmovbWVkaWEtZmUveGdwbGF5ZXJfZG9jX3ZpZGVvL2hscy94Z3BsYXllci1kZW1vLm0zdThcIjsvLzI2NCB2anNcclxuICAgIC8vIHZhciB1cmwgPSBcImh0dHA6Ly9wdWxsLWRlbW8udm9sY2ZjZG5yZC5jb20vbGl2ZS9zdC00NTM2NTIxX3l6bXVoZXZjZC5mbHZcIjsvLzI2NVxyXG4gICAgLy8gdmFyIHVybCA9IFwiaHR0cHM6Ly9zZjEtY2RuLXRvcy5odW9zaGFuc3RhdGljLmNvbS9vYmovbWVkaWEtZmUveGdwbGF5ZXJfZG9jX3ZpZGVvL2Zsdi94Z3BsYXllci1kZW1vLTM2MHAuZmx2XCI7Ly8yNjQgZmx2anNcclxuXHJcbiAgICAvL+ajgOafpea1geWcsOWdgOaYr+WQpuWPr+iuv+mXrlxyXG4gICAgdGhpcy5uZXR3b3JrU3RhdGUgPSAxO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgaXNBdmFpbGFibGUgPSBhd2FpdCB0aGlzLmxzLmNoZWNrU3RyZWFtVXJsKHRoaXMubmNVcmwpO1xyXG4gICAgICBpZiAoIWlzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5uZXR3b3JrU3RhdGUgPSAyO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5uZXR3b3JrU3RhdGUgPSAyO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbiAgICBsZXQgaGVpZ2h0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgY29uc29sZS5sb2coXCJ3aWR0aD09PT09PT09PT09PlwiLCB3aWR0aCk7XHJcbiAgICBjb25zb2xlLmxvZyhcImhlaWdodD09PT09PT09PT09PlwiLCBoZWlnaHQpO1xyXG5cclxuICAgIHZhciBjb25maWcgPSB7XHJcbiAgICAgIHBsYXllcjogdGhpcy5nbHBsYXllcklkLFxyXG4gICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICB0b2tlbjogdG9rZW4sXHJcbiAgICAgIGV4dEluZm86IHtcclxuICAgICAgICBjb3JlUHJvYmVQYXJ0OiAwLjQsXHJcbiAgICAgICAgcHJvYmVTaXplOiA4MTkyXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgbGV0IHBsYXllck9iaiA9ICh3aW5kb3cgYXMgYW55KS5uZXcyNjV3ZWJqcyh0aGlzLm5jVXJsLCBjb25maWcpO1xyXG4gICAgdGhpcy5wbGF5ZXIgPSBwbGF5ZXJPYmo7XHJcblxyXG4gICAgLy/liqDovb1taXNzaWxl77yI5aaC5p6c5pS+5Zyo5p6E6YCg5Ye95pWw5Lit5Yqg6L2955qE6K+d77yM5Lya5Lqn55Sf5Y+v6IO95LiN5Y675Yqg6L296KeG6aKR5Zyw5Z2A5a+86Ie055qE5Yid5aeL5YyW5aSx6LSl6Zeu6aKY77yJXHJcbiAgICBpZiAoIVZpZGVvSGxzQ29tcG9uZW50Lm1pc3NpbGVMb2FkZWQpIHtcclxuICAgICAgdGhpcy5scy5sb2FkU2NyaXB0KCdhc3NldHMvaDI2NXdlYmpzLWpzL21pc3NpbGUuanMnKTtcclxuICAgICAgVmlkZW9IbHNDb21wb25lbnQubWlzc2lsZUxvYWRlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHBsYXllckNvbnQ6IGFueSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwbGF5ZXItY29udGFpbmVyJyk7XHJcbiAgICBsZXQgY29udHJvbGxlckNvbnQ6IGFueSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNjb250cm9sbGVyJyk7XHJcbiAgICBsZXQgcHJvZ3Jlc3NDb250OiBhbnkgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjcHJvZ3Jlc3MtY29udGFuaW5lcicpO1xyXG4gICAgbGV0IHByb2dyZXNzQ29udFcgPSBwcm9ncmVzc0NvbnQub2Zmc2V0V2lkdGg7XHJcbiAgICBsZXQgY2FjaGVQdHM6IGFueSA9IHByb2dyZXNzQ29udC5xdWVyeVNlbGVjdG9yKCcjY2FjaGVQdHMnKTtcclxuICAgIGxldCBwcm9ncmVzc1B0czogYW55ID0gcHJvZ3Jlc3NDb250LnF1ZXJ5U2VsZWN0b3IoJyNwcm9ncmVzc1B0cycpO1xyXG4gICAgbGV0IHByb2dyZXNzVm9pY2U6IGFueSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNwcm9ncmVzc1ZvaWNlJyk7XHJcbiAgICBsZXQgcGxheUJ0bjogYW55ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI3BsYXlCdG4nKTtcclxuICAgIGxldCBzaG93TGFiZWw6IGFueSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzaG93TGFiZWwnKTtcclxuICAgIGxldCBwdHNMYWJlbDogYW55ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI3B0c0xhYmVsJyk7XHJcbiAgICBsZXQgY292ZXJUb2FzdDogYW55ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NvdmVyTGF5ZXInKTtcclxuICAgIGxldCBjb3ZlckJ0bjogYW55ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignI2NvdmVyTGF5ZXJCdG4nKTtcclxuICAgIGxldCBtdXRlQnRuOiBhbnkgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjbXV0ZUJ0bicpO1xyXG4gICAgbGV0IGZ1bGxTY3JlZW5CdG46IGFueSA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmdWxsU2NyZWVuQnRuJyk7XHJcbiAgICBsZXQgbWVkaWFJbmZvOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIHBsYXlCdG4uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgc2hvd0xhYmVsLnRleHRDb250ZW50ID0gdGhpcy5TSE9XX0xPQURJTkc7XHJcbiAgICBwbGF5ZXJDb250LnN0eWxlLndpZHRoID0gY29uZmlnLndpZHRoICsgJ3B4JztcclxuICAgIHBsYXllckNvbnQuc3R5bGUuaGVpZ2h0ID0gY29uZmlnLmhlaWdodCArICdweCc7XHJcbiAgICBjb250cm9sbGVyQ29udC5zdHlsZS53aWR0aCA9IGNvbmZpZy53aWR0aCArICdweCc7XHJcblxyXG4gICAgLy/mkq3mlL7mlrnms5VcclxuICAgIGxldCBwbGF5QWN0aW9uID0gKCkgPT4ge1xyXG4gICAgICBpZiAocGxheWVyT2JqLmlzUGxheWluZygpKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJiYXIgcGF1c2U9PT09PT09PT09PT0+XCIpO1xyXG4gICAgICAgIHBsYXllck9iai5wYXVzZSgpO1xyXG4gICAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XHJcbiAgICAgICAgY292ZXJUb2FzdC5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYmFyIHBsYXk9PT09PT09PT09PT0+XCIpO1xyXG4gICAgICAgIHBsYXllck9iai5wbGF5KCk7XHJcbiAgICAgICAgdGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xyXG4gICAgICAgIGNvdmVyVG9hc3Quc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnaGlkZGVuJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMubmNQbGF5aW5nLmVtaXQodGhpcy5pc1BsYXlpbmcpO1xyXG4gICAgfTtcclxuXHJcbiAgICBwbGF5ZXJDb250Lm9ubW91c2VvdmVyID0gKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuY29udHJvbHNNb2RlKSB7XHJcbiAgICAgICAgY29udHJvbGxlckNvbnQuaGlkZGVuID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb250cm9sbGVyQ29udC5oaWRkZW4gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb250cm9sbGVyQ29udC5oaWRkZW4gPSB0cnVlOy8v6buY6K6k6ZqQ6JeP5bel5YW35qCP77yM5LiN5ZyoaHRtbOS4reiuvue9ruaYr+WboOS4uuWJjeaWuemcgOimgeiOt+WPluWuveW6plxyXG4gICAgcGxheWVyQ29udC5vbm1vdXNlb3V0ID0gKCkgPT4ge1xyXG4gICAgICBjb250cm9sbGVyQ29udC5oaWRkZW4gPSB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvL+aSreaUvuaMiemSrueCueWHu+S6i+S7tlxyXG4gICAgcGxheUJ0bi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICBwbGF5QWN0aW9uKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8v6Z2Z6Z+z5oyJ6ZKu54K55Ye75LqL5Lu2XHJcbiAgICBtdXRlQnRuLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHBsYXllck9iai5nZXRWb2x1bWUoKSk7XHJcbiAgICAgIGlmICh0aGlzLm11dGVTdGF0ZSkge1xyXG4gICAgICAgIHBsYXllck9iai5zZXRWb2ljZSgxLjApO1xyXG4gICAgICAgIHByb2dyZXNzVm9pY2UudmFsdWUgPSAxMDA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGxheWVyT2JqLnNldFZvaWNlKDAuMCk7XHJcbiAgICAgICAgcHJvZ3Jlc3NWb2ljZS52YWx1ZSA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tdXRlU3RhdGUgPSAhdGhpcy5tdXRlU3RhdGU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8v5YWo5bGP5oyJ6ZKu54K55Ye75LqL5Lu2XHJcbiAgICBmdWxsU2NyZWVuQnRuLm9uY2xpY2sgPSAoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5pc0Z1bGxTY3JlZW5CdG4pIHtcclxuICAgICAgICAvLyDorr7nva7lvZPliY3lhajlsY/mkq3mlL7lmahJRFxyXG4gICAgICAgIFZpZGVvSGxzQ29tcG9uZW50LmN1cnJlbnRGdWxsc2NyZWVuUGxheWVySWQgPSB0aGlzLmdscGxheWVySWQ7XHJcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XHJcbiAgICAgICAgLy8g6K6w5b2VY2FudmFz55qE5qC35byP55So5LqO6L+Y5Y6fXHJcbiAgICAgICAgY29uc3QgZ2xwbGF5ZXIgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMuZ2xwbGF5ZXJJZCk7XHJcbiAgICAgICAgY29uc3QgcGxheWVyQ2FudmFzID0gZ2xwbGF5ZXIucXVlcnlTZWxlY3RvcignY2FudmFzJyk7XHJcbiAgICAgICAgaWYgKHBsYXllckNhbnZhcykge1xyXG4gICAgICAgICAgdGhpcy5jYW52YXNTdHlsZS5tYXJnaW5MZWZ0ID0gcGFyc2VJbnQoZ2V0Q29tcHV0ZWRTdHlsZShwbGF5ZXJDYW52YXMpLm1hcmdpbkxlZnQpIHx8IDA7XHJcbiAgICAgICAgICB0aGlzLmNhbnZhc1N0eWxlLm1hcmdpblRvcCA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUocGxheWVyQ2FudmFzKS5tYXJnaW5Ub3ApIHx8IDA7XHJcbiAgICAgICAgICB0aGlzLmNhbnZhc1N0eWxlLndpZHRoID0gcGxheWVyQ2FudmFzLm9mZnNldFdpZHRoO1xyXG4gICAgICAgICAgdGhpcy5jYW52YXNTdHlsZS5oZWlnaHQgPSBwbGF5ZXJDYW52YXMub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIOWFqOWxj+ebkeWQrFxyXG4gICAgdGhpcy5mdWxsc2NyZWVuSGFuZGxlciA9IChldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8g5Y+q5aSE55CG5b2T5YmN6Kem5Y+R5YWo5bGP55qE5pKt5pS+5ZmoXHJcbiAgICAgIGlmIChWaWRlb0hsc0NvbXBvbmVudC5jdXJyZW50RnVsbHNjcmVlblBsYXllcklkID09PSB0aGlzLmdscGxheWVySWQpIHtcclxuICAgICAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcclxuICAgICAgICAgIGNvbnN0IHNjcmVlbldpZHRoID0gd2luZG93LnNjcmVlbi53aWR0aDtcclxuICAgICAgICAgIGNvbnN0IHNjcmVlbkhlaWdodCA9IHdpbmRvdy5zY3JlZW4uaGVpZ2h0O1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVQbGF5ZXJTaXplKCdmdWxsc2NyZWVuJywgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7XHJcbiAgICAgICAgICB0aGlzLmlzRnVsbFNjcmVlbkJ0biA9IHRydWU7XHJcbiAgICAgICAgICAvLyDmt7vliqDlhajlsY/ml7bnmoTmoLflvI9cclxuICAgICAgICAgIHBsYXllckNvbnQuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xyXG4gICAgICAgICAgcGxheWVyQ29udC5zdHlsZS50b3AgPSAnMCc7XHJcbiAgICAgICAgICBwbGF5ZXJDb250LnN0eWxlLmxlZnQgPSAnMCc7XHJcbiAgICAgICAgICBwbGF5ZXJDb250LnN0eWxlLnpJbmRleCA9ICcxMDAwMSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlUGxheWVyU2l6ZSgnbm9ybWFsJywgY29uZmlnLndpZHRoLCBjb25maWcuaGVpZ2h0KTtcclxuICAgICAgICAgIHRoaXMuaXNGdWxsU2NyZWVuQnRuID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyDpgIDlh7rlhajlsY/ml7bmuIXpmaTlvZPliY3lhajlsY/mkq3mlL7lmahJRFxyXG4gICAgICAgICAgVmlkZW9IbHNDb21wb25lbnQuY3VycmVudEZ1bGxzY3JlZW5QbGF5ZXJJZCA9IG51bGw7XHJcbiAgICAgICAgICAvLyDmgaLlpI3mraPluLjmoLflvI9cclxuICAgICAgICAgIHBsYXllckNvbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xyXG4gICAgICAgICAgcGxheWVyQ29udC5zdHlsZS50b3AgPSAnYXV0byc7XHJcbiAgICAgICAgICBwbGF5ZXJDb250LnN0eWxlLmxlZnQgPSAnYXV0byc7XHJcbiAgICAgICAgICBwbGF5ZXJDb250LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgdGhpcy5mdWxsc2NyZWVuSGFuZGxlcik7XHJcblxyXG4gICAgLy/ov5vluqbmnaHngrnlh7vkuovku7ZcclxuICAgIHByb2dyZXNzQ29udC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlOiBhbnkpID0+IHtcclxuICAgICAgc2hvd0xhYmVsLnRleHRDb250ZW50ID0gdGhpcy5TSE9XX0xPQURJTkc7XHJcbiAgICAgIGxldCB4ID0gZS5wYWdlWCAtIHByb2dyZXNzQ29udC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0OyAvLyBvciBlLm9mZnNldFggKGxlc3Mgc3VwcG9ydCwgdGhvdWdoKVxyXG4gICAgICBsZXQgeSA9IGUucGFnZVkgLSBwcm9ncmVzc0NvbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOyAgLy8gb3IgZS5vZmZzZXRZXHJcbiAgICAgIGxldCBjbGlja2VkVmFsdWUgPSB4ICogcHJvZ3Jlc3NDb250Lm1heCAvIHByb2dyZXNzQ29udC5vZmZzZXRXaWR0aDtcclxuICAgICAgcGxheWVyT2JqLnNlZWsoY2xpY2tlZFZhbHVlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8v6L+b5bqm5p2h6Z+z6YeP54K55Ye75LqL5Lu2XHJcbiAgICBwcm9ncmVzc1ZvaWNlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgeCA9IGUucGFnZVggLSBwcm9ncmVzc1ZvaWNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7IC8vIG9yIGUub2Zmc2V0WCAobGVzcyBzdXBwb3J0LCB0aG91Z2gpXHJcbiAgICAgIGxldCB5ID0gZS5wYWdlWSAtIHByb2dyZXNzVm9pY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOyAgLy8gb3IgZS5vZmZzZXRZXHJcbiAgICAgIGxldCBjbGlja2VkVmFsdWUgPSB4ICogcHJvZ3Jlc3NWb2ljZS5tYXggLyBwcm9ncmVzc1ZvaWNlLm9mZnNldFdpZHRoO1xyXG4gICAgICBwcm9ncmVzc1ZvaWNlLnZhbHVlID0gY2xpY2tlZFZhbHVlO1xyXG4gICAgICBsZXQgdm9sdW1lID0gY2xpY2tlZFZhbHVlIC8gMTAwO1xyXG4gICAgICBwbGF5ZXJPYmouc2V0Vm9pY2Uodm9sdW1lKTtcclxuICAgICAgdGhpcy5tdXRlU3RhdGUgPSB2b2x1bWUgPT0gMDtcclxuICAgIH0pO1xyXG5cclxuICAgIC8v6L+b5bqm5p2h5byA5aeL5ouW5ou95LqL5Lu2XHJcbiAgICBwbGF5ZXJPYmoub25TZWVrU3RhcnQgPSAocHRzOiBhbnkpID0+IHtcclxuICAgICAgc2hvd0xhYmVsLnRleHRDb250ZW50ID0gdGhpcy5TSE9XX0xPQURJTkcgKyBcIiBzZWVrIHRvOlwiICsgcGFyc2VJbnQocHRzKTtcclxuICAgIH07XHJcblxyXG4gICAgLy/ov5vluqbmnaHnu5PmnZ/mi5bmi73kuovku7ZcclxuICAgIHBsYXllck9iai5vblNlZWtGaW5pc2ggPSAoKSA9PiB7XHJcbiAgICAgIHNob3dMYWJlbC50ZXh0Q29udGVudCA9IHRoaXMuU0hPV19ET05FO1xyXG4gICAgfTtcclxuXHJcbiAgICAvL+aSreaUvue7k+adn+S6i+S7tlxyXG4gICAgcGxheWVyT2JqLm9uUGxheUZpbmlzaCA9ICgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coXCI9PT09PT09PT09PT09IEZJTklTSEVEID09PT09PT09PT09PT09PVwiKTtcclxuICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcclxuICAgIH07XHJcblxyXG4gICAgLy/muLLmn5Pkuovku7ZcclxuICAgIHBsYXllck9iai5vblJlbmRlciA9ICh3aWR0aDogYW55LCBoZWlnaHQ6IGFueSwgaW1hZ2VCdWZmZXJZOiBhbnksIGltYWdlQnVmZmVyQjogYW55LCBpbWFnZUJ1ZmZlclI6IGFueSkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIm9uIHJlbmRlclwiKTtcclxuICAgIH07XHJcblxyXG4gICAgLy/miZPlvIDlhajlsY/kuovku7ZcclxuICAgIHBsYXllck9iai5vbk9wZW5GdWxsU2NyZWVuID0gKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIm9uT3BlbkZ1bGxTY3JlZW5cIik7XHJcbiAgICB9O1xyXG5cclxuICAgIC8v5YWz6Zet5YWo5bGP5LqL5Lu2XHJcbiAgICBwbGF5ZXJPYmoub25DbG9zZUZ1bGxTY3JlZW4gPSAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwib25DbG9zZUZ1bGxTY3JlZW5cIik7XHJcbiAgICB9O1xyXG5cclxuICAgIC8v6L+b5bqm5p2h57uT5p2f5ouW5ou95LqL5Lu2XHJcbiAgICBwbGF5ZXJPYmoub25TZWVrRmluaXNoID0gKCkgPT4ge1xyXG4gICAgICBzaG93TGFiZWwudGV4dENvbnRlbnQgPSB0aGlzLlNIT1dfRE9ORTtcclxuICAgIH07XHJcblxyXG4gICAgLy/liqDovb3nvJPlrZjkuovku7ZcclxuICAgIHBsYXllck9iai5vbkxvYWRDYWNoZSA9ICgpID0+IHtcclxuICAgICAgc2hvd0xhYmVsLnRleHRDb250ZW50ID0gXCJDYWNoaW5nLi4uXCI7XHJcbiAgICB9O1xyXG5cclxuICAgIC8v5Yqg6L2957yT5a2Y5a6M5oiQ5LqL5Lu2XHJcbiAgICBwbGF5ZXJPYmoub25Mb2FkQ2FjaGVGaW5zaGVkID0gKCkgPT4ge1xyXG4gICAgICBzaG93TGFiZWwudGV4dENvbnRlbnQgPSB0aGlzLlNIT1dfRE9ORTtcclxuICAgIH07XHJcblxyXG4gICAgLy/lh4blpIflrozmiJDkuovku7ZcclxuICAgIHBsYXllck9iai5vblJlYWR5U2hvd0RvbmUgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwib25SZWFkeVNob3dEb25lXCIpO1xyXG4gICAgICBzaG93TGFiZWwudGV4dENvbnRlbnQgPSBcIkNvdmVyIEltZyBPS1wiO1xyXG4gICAgICB0aGlzLm5ldHdvcmtTdGF0ZSA9IDU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8v5Yqg6L295a6M5oiQ5LqL5Lu2XHJcbiAgICBwbGF5ZXJPYmoub25Mb2FkRmluaXNoID0gKCkgPT4ge1xyXG4gICAgICBtZWRpYUluZm8gPSBwbGF5ZXJPYmoubWVkaWFJbmZvKCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwibWVkaWFJbmZvPT09PT09PT09PT0+XCIsIG1lZGlhSW5mbyk7XHJcbiAgICAgIGlmIChtZWRpYUluZm8ubWV0YS5pc0hFVkMgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJpcyBub3QgSEVWQy9ILjI2NSBtZWRpYSFcIik7XHJcbiAgICAgICAgcGxheWVyT2JqLnJlbGVhc2UoKTtcclxuICAgICAgICB0aGlzLmlzSDI2NSA9IGZhbHNlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pbml0VmlkZW8oKTtcclxuICAgICAgICB9LCAyMDApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcGxheUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgLy9IMjY1IHJlc2l6ZSAtIOS9v+eUqFJlc2l6ZU9ic2VydmVy55uR5ZCs5YWD57Sg5bC65a+45Y+Y5YyWXHJcbiAgICAgIGlmICh0aGlzLmlzSDI2NSkge1xyXG4gICAgICAgIHRoaXMuc2V0dXBSZXNpemVPYnNlcnZlcih0b2tlbiwgcGxheWVyQ29udCwgY29udHJvbGxlckNvbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL+inhumikeexu+Wei1xyXG4gICAgICBpZiAobWVkaWFJbmZvLnZpZGVvVHlwZSA9PSBcInZvZFwiKSB7XHJcbiAgICAgICAgY2FjaGVQdHMubWF4ID0gbWVkaWFJbmZvLm1ldGEuZHVyYXRpb25NcyAvIDEwMDA7XHJcbiAgICAgICAgcHJvZ3Jlc3NDb250Lm1heCA9IG1lZGlhSW5mby5tZXRhLmR1cmF0aW9uTXMgLyAxMDAwO1xyXG4gICAgICAgIHB0c0xhYmVsLnRleHRDb250ZW50ID0gdGhpcy5scy5kdXJhdGlvblRleHQoMCkgKyAnLycgKyB0aGlzLmxzLmR1cmF0aW9uVGV4dChwcm9ncmVzc0NvbnQubWF4KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjYWNoZVB0cy5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgIHByb2dyZXNzQ29udC5oaWRkZW4gPSB0cnVlO1xyXG4gICAgICAgIHB0c0xhYmVsLnRleHRDb250ZW50ID0gJ0xJVkUnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL+WwgemdouaMiemSrueCueWHu+S6i+S7tlxyXG4gICAgICBjb3ZlckJ0bi5vbmNsaWNrID0gKCkgPT4ge1xyXG4gICAgICAgIHBsYXlBY3Rpb24oKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8v5rKh5pyJ6Z+z6aKRXHJcbiAgICAgIGlmIChtZWRpYUluZm8ubWV0YS5hdWRpb05vbmUpIHtcclxuICAgICAgICBwcm9ncmVzc1ZvaWNlLnZhbHVlID0gMDtcclxuICAgICAgICBwcm9ncmVzc1ZvaWNlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgdGhpcy5tdXRlU3RhdGUgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm11dGVkTW9kZSkge1xyXG4gICAgICAgICAgcGxheWVyT2JqLnNldFZvaWNlKDAuMCk7XHJcbiAgICAgICAgICBwcm9ncmVzc1ZvaWNlLnZhbHVlID0gMDtcclxuICAgICAgICAgIHRoaXMubXV0ZVN0YXRlID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcGxheWVyT2JqLnNldFZvaWNlKDAuNSk7XHJcbiAgICAgICAgICBwcm9ncmVzc1ZvaWNlLnZhbHVlID0gNTA7XHJcbiAgICAgICAgICB0aGlzLm11dGVTdGF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy/oh6rliqjmkq3mlL5cclxuICAgICAgaWYgKHRoaXMuYXV0b3BsYXlNb2RlKSB7XHJcbiAgICAgICAgcGxheUFjdGlvbigpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvdmVyVG9hc3QucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc2hvd0xhYmVsLnRleHRDb250ZW50ID0gdGhpcy5TSE9XX0RPTkU7XHJcbiAgICB9O1xyXG5cclxuICAgIC8v57yT5a2Y6L+b5bqm5LqL5Lu2XHJcbiAgICBwbGF5ZXJPYmoub25DYWNoZVByb2Nlc3MgPSAoY1B0czogYW55KSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHByZWNlbnQgPSBjUHRzIC8gcHJvZ3Jlc3NDb250Lm1heDtcclxuICAgICAgICBsZXQgY2FjaGVXaWR0aCA9IHByZWNlbnQgKiBwcm9ncmVzc0NvbnRXO1xyXG4gICAgICAgIGNhY2hlUHRzLnN0eWxlLndpZHRoID0gY2FjaGVXaWR0aCArICdweCc7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy/mkq3mlL7ml7bpl7Tkuovku7ZcclxuICAgIHBsYXllck9iai5vblBsYXlUaW1lID0gKHZpZGVvUFRTOiBhbnkpID0+IHtcclxuICAgICAgaWYgKG1lZGlhSW5mby52aWRlb1R5cGUgPT0gXCJ2b2RcIikge1xyXG4gICAgICAgIGxldCBwcmVjZW50ID0gdmlkZW9QVFMgLyBwcm9ncmVzc0NvbnQubWF4O1xyXG4gICAgICAgIGxldCBwcm9nV2lkdGggPSBwcmVjZW50ICogcHJvZ3Jlc3NDb250VztcclxuICAgICAgICBwcm9ncmVzc1B0cy5zdHlsZS53aWR0aCA9IHByb2dXaWR0aCArICdweCc7XHJcbiAgICAgICAgcHRzTGFiZWwudGV4dENvbnRlbnQgPSB0aGlzLmxzLmR1cmF0aW9uVGV4dCh2aWRlb1BUUykgKyAnLycgKyB0aGlzLmxzLmR1cmF0aW9uVGV4dChwcm9ncmVzc0NvbnQubWF4KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwdHNMYWJlbC50ZXh0Q29udGVudCA9ICdMSVZFJztcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBwbGF5ZXJPYmouZG8oKTtcclxuICAgIHRoaXMubmNMb2FkZWQuZW1pdCh0aGlzLnBsYXllcik7XHJcbiAgfVxyXG5cclxuICAvLyDorr7nva5SZXNpemVPYnNlcnZlcuebkeWQrC52aWRlby1obHMtMjY15bC65a+45Y+Y5YyWXHJcbiAgcHJpdmF0ZSBzZXR1cFJlc2l6ZU9ic2VydmVyKHRva2VuOiBzdHJpbmcsIHBsYXllckNvbnQ6IGFueSwgY29udHJvbGxlckNvbnQ6IGFueSkge1xyXG4gICAgLy8g5riF55CG5LmL5YmN55qEb2JzZXJ2ZXJcclxuICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKSB7XHJcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ3Jlc2l6ZSBvYnNlcnZlcicpO1xyXG4gICAgICAvLyDot7Pov4fpppbmrKHliJ3lp4vljJbop6blj5FcclxuICAgICAgaWYgKHRoaXMuaXNJbml0aWFsUmVzaXplKSB7XHJcbiAgICAgICAgdGhpcy5pc0luaXRpYWxSZXNpemUgPSBmYWxzZTtcclxuICAgICAgICBjb25zb2xlLmxvZygncmVzaXplIGluaXRpYWwnKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1swXTtcclxuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBlbnRyeS5jb250ZW50UmVjdDtcclxuICAgICAgY29uc29sZS5sb2coJ3Jlc2l6ZSB3aWR0aD09PT09PT09PT09PicsIHdpZHRoKTtcclxuICAgICAgY29uc29sZS5sb2coJ3Jlc2l6ZSBoZWlnaHQ9PT09PT09PT09PT4nLCBoZWlnaHQpO1xyXG5cclxuICAgICAgLy8g5riF6Zmk5LmL5YmN55qE6Ziy5oqW5a6a5pe25ZmoXHJcbiAgICAgIGlmICh0aGlzLnJlc2l6ZURlYm91bmNlVGltZXIpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXNpemVEZWJvdW5jZVRpbWVyKTtcclxuICAgICAgICBjb25zb2xlLmxvZygncmVzaXplIGRlYm91bmNlIGNsZWFyZWQnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy/mm7TmlLnljp9wbGF5ZXItY29udGFpbmVy5a655Zmo5qC35byPXHJcbiAgICAgIHBsYXllckNvbnQuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XHJcbiAgICAgIHBsYXllckNvbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcclxuICAgICAgLy/mm7TmlLnmjqfliLbmnaFjb250cm9sbGVy5a695bqmXHJcbiAgICAgIGNvbnRyb2xsZXJDb250LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG4gICAgICAvL+abtOaUueWOn2dscGxheWVy5qC35byPXHJcbiAgICAgIGNvbnN0IGdscGxheWVyID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignIycgKyB0aGlzLmdscGxheWVySWQpO1xyXG4gICAgICBnbHBsYXllci5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuICAgICAgZ2xwbGF5ZXIuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcclxuICAgICAgLy/lhYjmm7TmlLnljp9jYW52YXPmoLflvI/kuLrljaDmu6HvvIzlkI7pnaLlho3nlKjmlrDnmoTlgLzmm7TmlrBcclxuICAgICAgY29uc3QgcGxheWVyQ2FudmFzID0gZ2xwbGF5ZXIucXVlcnlTZWxlY3RvcignY2FudmFzJyk7XHJcbiAgICAgIHBsYXllckNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuICAgICAgcGxheWVyQ2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcbiAgICAgIHBsYXllckNhbnZhcy5zdHlsZS5tYXJnaW5MZWZ0ID0gJzBweCc7XHJcbiAgICAgIHBsYXllckNhbnZhcy5zdHlsZS5tYXJnaW5Ub3AgPSAnMHB4JztcclxuXHJcbiAgICAgIC8vIOiuvue9rumYsuaKlu+8jDUwMG1z5ZCO5omn6KGMcmVzaXpl6YC76L6RXHJcbiAgICAgIHRoaXMucmVzaXplRGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm5jUmVzaXplV2F5ID09ICdkZWZhdWx0Jykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ3Jlc2l6ZSBzdGFydCcpO1xyXG5cclxuICAgICAgICAgIHZhciBjb25maWcgPSB7XHJcbiAgICAgICAgICAgIHBsYXllcjogJ3Jlc2l6ZS1jb250YWluZXInLFxyXG4gICAgICAgICAgICB3aWR0aDogd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxyXG4gICAgICAgICAgICB0b2tlbjogdG9rZW4sXHJcbiAgICAgICAgICAgIGV4dEluZm86IHtcclxuICAgICAgICAgICAgICBjb3JlUHJvYmVQYXJ0OiAwLjQsXHJcbiAgICAgICAgICAgICAgcHJvYmVTaXplOiA4MTkyXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgbGV0IHBsYXllck9iakZvclJlc2l6ZSA9ICh3aW5kb3cgYXMgYW55KS5uZXcyNjV3ZWJqcyh0aGlzLm5jVXJsLCBjb25maWcpO1xyXG5cclxuICAgICAgICAgIHBsYXllck9iakZvclJlc2l6ZS5vbkxvYWRGaW5pc2ggPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHBsYXllck9iakZvclJlc2l6ZS5wbGF5KCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwbGF5ZXJPYmpGb3JSZXNpemUgcGxheScpXHJcblxyXG4gICAgICAgICAgICAvLyDnm5HlkKxjYW52YXPmoLflvI/lj5jljJZcclxuICAgICAgICAgICAgY29uc3QgZ2xwbGF5ZXJGb3JSZXNpemUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjcmVzaXplLWNvbnRhaW5lcicpO1xyXG4gICAgICAgICAgICBjb25zdCBhbGxQbGF5ZXJDYW52YXNGb3JSZXNpemUgPSBnbHBsYXllckZvclJlc2l6ZS5xdWVyeVNlbGVjdG9yQWxsKCdjYW52YXMnKTtcclxuICAgICAgICAgICAgLy/ov5nph4zmn6Xor6JhbGzlubbkvb/nlKjmnIDlkI7kuIDkuKpjYW52YXPmmK/lm6DkuLrlj6/og73lnKjnm5HlkKxjYW52YXPlsLrlr7jlj5jljJbov4fnqIvkuK0o6L+Y5Zyo5pKt5pS+5YeG5aSH5LitKeWPiOacieaWsOeahHBsYXko5bC65a+45Y+I5Y+Y5YyW5LqGKeWinuWKoOS6huaWsOeahGNhbnZhc++8jOWQjOaXtuWtmOWcqOWkmuS4qmNhbnZhc1xyXG4gICAgICAgICAgICAvL+WmguaenOS4jeS9v+eUqOacgOWQjuS4gOS4qmNhbnZhc++8jOmDveS8muebkeWQrOesrOS4gOS4qmNhbnZhc++8jOesrOS4gOS4qmNhbnZhc+iiq+enu+mZpOWQju+8jOWQjumdoueahOWwuuWvuOWPmOWMluebkeWQrOWwseaYr+WkseaViOS6huS4lOWkmuS9meeahGNhbnZhc+S4jeS8muiiq+enu+mZpFxyXG4gICAgICAgICAgICAvL+aAu+e7k++8muWtmOWcqOWkmuS4qmNhbnZhc+aXtu+8jOS8muWvueavj+S4qumDveebkeWQrO+8jOS5n+WwseaYr+aMiemhuuW6j+aJp+ihjOagt+W8j+WPmOWMluabtOaWsOWSjOa4heeQhlxyXG4gICAgICAgICAgICBjb25zdCBwbGF5ZXJDYW52YXNGb3JSZXNpemUgPSBhbGxQbGF5ZXJDYW52YXNGb3JSZXNpemVbYWxsUGxheWVyQ2FudmFzRm9yUmVzaXplLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAgICAgLy8g5L2/55SoTXV0YXRpb25PYnNlcnZlcuebkeWQrHN0eWxl5bGe5oCn5Y+Y5YyWXHJcbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG4gICAgICAgICAgICAgIG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAnc3R5bGUnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IG11dGF0aW9uLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KTtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgbWFyZ2luTGVmdCA9IHBhcnNlSW50KGNvbXB1dGVkU3R5bGUubWFyZ2luTGVmdCkgfHwgMDtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgbWFyZ2luVG9wID0gcGFyc2VJbnQoY29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3ApIHx8IDA7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyDmo4Dmn6XmmK/lkKblh7rnjrDkuoZtYXJnaW4tdG9w5ZKMbWFyZ2luLWxlZnTlsZ7mgKdcclxuICAgICAgICAgICAgICAgICAgaWYgKG1hcmdpbkxlZnQgIT09IDAgfHwgbWFyZ2luVG9wICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0YXJnZXQub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGFyZ2V0Lm9mZnNldEhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygn5qOA5rWL5YiwY2FudmFz5qC35byP5Y+Y5YyWOicsIHsgbWFyZ2luTGVmdCwgbWFyZ2luVG9wLCB3aWR0aCwgaGVpZ2h0IH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyDmiafooYzmuIXnkIbmk43kvZxcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyT2JqRm9yUmVzaXplLnJlbGVhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBwbGF5ZXJDYW52YXNGb3JSZXNpemUucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8v5pu05paw5Y6fY2FudmFz5qC35byPXHJcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyQ2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYXllckNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYXllckNhbnZhcy5zdHlsZS5tYXJnaW5MZWZ0ID0gbWFyZ2luTGVmdCArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgcGxheWVyQ2FudmFzLnN0eWxlLm1hcmdpblRvcCA9IG1hcmdpblRvcCArICdweCc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXNpemUgZW5kJyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyDlvIDlp4vnm5HlkKxjYW52YXPnmoRzdHlsZeWxnuaAp+WPmOWMllxyXG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHBsYXllckNhbnZhc0ZvclJlc2l6ZSwge1xyXG4gICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXHJcbiAgICAgICAgICAgICAgYXR0cmlidXRlRmlsdGVyOiBbJ3N0eWxlJ11cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcGxheWVyT2JqRm9yUmVzaXplLmRvKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMucmVsb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCA1MDApOyAvLyA1MDBtc+mYsuaKluW7tui/n1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5byA5aeL55uR5ZCsdmlkZW8taGxzLTI2NeWFg+e0oOWwuuWvuOWPmOWMllxyXG4gICAgY29uc3QgdmlkZW9IbHMyNjVFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnZpZGVvLWhscy0yNjUnKTtcclxuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh2aWRlb0hsczI2NUVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8g5oq95Y+W5bC65a+45pu05paw6YC76L6R5Yiw5Y2V54us55qE5pa55rOVXHJcbiAgcHJpdmF0ZSB1cGRhdGVQbGF5ZXJTaXplKG1vZGU6IHN0cmluZywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHBsYXllckNvbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjcGxheWVyLWNvbnRhaW5lcicpO1xyXG4gICAgY29uc3QgY29udHJvbGxlckNvbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjY29udHJvbGxlcicpO1xyXG4gICAgY29uc3QgZ2xwbGF5ZXIgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMuZ2xwbGF5ZXJJZCk7XHJcblxyXG4gICAgcGxheWVyQ29udC5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuICAgIHBsYXllckNvbnQuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcclxuICAgIGNvbnRyb2xsZXJDb250LnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xyXG4gICAgZ2xwbGF5ZXIuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XHJcbiAgICBnbHBsYXllci5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG5cclxuICAgIC8vIGNhbnZhc1xyXG4gICAgY29uc3QgcGxheWVyQ2FudmFzID0gZ2xwbGF5ZXIucXVlcnlTZWxlY3RvcignY2FudmFzJyk7XHJcbiAgICBpZiAocGxheWVyQ2FudmFzKSB7XHJcbiAgICAgIGlmIChtb2RlID09ICdmdWxsc2NyZWVuJykge1xyXG4gICAgICAgIHBsYXllckNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuICAgICAgICBwbGF5ZXJDYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcclxuICAgICAgICBwbGF5ZXJDYW52YXMuc3R5bGUubWFyZ2luTGVmdCA9ICcwcHgnO1xyXG4gICAgICAgIHBsYXllckNhbnZhcy5zdHlsZS5tYXJnaW5Ub3AgPSAnMHB4JztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwbGF5ZXJDYW52YXMuc3R5bGUud2lkdGggPSB0aGlzLmNhbnZhc1N0eWxlLndpZHRoICsgJ3B4JztcclxuICAgICAgICBwbGF5ZXJDYW52YXMuc3R5bGUuaGVpZ2h0ID0gdGhpcy5jYW52YXNTdHlsZS5oZWlnaHQgKyAncHgnO1xyXG4gICAgICAgIHBsYXllckNhbnZhcy5zdHlsZS5tYXJnaW5MZWZ0ID0gdGhpcy5jYW52YXNTdHlsZS5tYXJnaW5MZWZ0ICsgJ3B4JztcclxuICAgICAgICBwbGF5ZXJDYW52YXMuc3R5bGUubWFyZ2luVG9wID0gdGhpcy5jYW52YXNTdHlsZS5tYXJnaW5Ub3AgKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL2hscy5qc1xyXG4gIHZpZGVvITogSFRNTFZpZGVvRWxlbWVudDtcclxuICBobHMhOiBIbHM7XHJcbiAgcGxheUVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy/liJ3lp4vljJZcclxuICBhc3luYyBpbml0VmlkZW8oKSB7XHJcbiAgICBjb25zb2xlLmxvZygn5ZCv55SoaGxzLmpzIScpXHJcbiAgICB0aGlzLmRlc3Ryb3lBbGwoKTsvL+WKoOi9veWJjeWFiOmUgOavgVxyXG4gICAgdGhpcy52aWRlbyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWRlbycpOy8v6I635Y+WdmlkZW9cclxuXHJcbiAgICAvL2hscyhtM3U4KVxyXG4gICAgaWYgKHRoaXMudmlkZW8uY2FuUGxheVR5cGUoJ2FwcGxpY2F0aW9uL3ZuZC5hcHBsZS5tcGVndXJsJykpIHtcclxuICAgICAgdGhpcy52aWRlby5zcmMgPSB0aGlzLm5jVXJsO1xyXG4gICAgfSBlbHNlIGlmIChIbHMuaXNTdXBwb3J0ZWQoKSkge1xyXG4gICAgICB0aGlzLmhscyA9IG5ldyBIbHMoKTtcclxuICAgICAgdGhpcy5obHMubG9hZFNvdXJjZSh0aGlzLm5jVXJsKTtcclxuICAgICAgdGhpcy5obHMuYXR0YWNoTWVkaWEodGhpcy52aWRlbyk7XHJcbiAgICAgIC8v6ZSZ6K+v55uR5ZCsXHJcbiAgICAgIHRoaXMuaGxzLm9uKEhscy5FdmVudHMuRVJST1IsIChldmVudCwgZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhLmRldGFpbHMgPT0gJ2J1ZmZlclN0YWxsZWRFcnJvcicpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2Fybignd2FybmluZzonLCBkYXRhLmVycm9yKVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5kZXRhaWxzID09ICdmcmFnUGFyc2luZ0Vycm9yJykge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCd3YXJuaW5nOicsIGRhdGEuZXJyb3IpXHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmRldGFpbHMgPT0gJ2J1ZmZlck51ZGdlT25TdGFsbCcpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2Fybignd2FybmluZzonLCBkYXRhLmVycm9yKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnBsYXlFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvcjonLCBkYXRhLmRldGFpbHMpO1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3I6JywgZGF0YS5lcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvL+aSreaUvuebkeWQrFxyXG4gICAgdGhpcy52aWRlby5hZGRFdmVudExpc3RlbmVyKCdwbGF5JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLm5jUGxheWluZy5lbWl0KHRydWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy/mmoLlgZznm5HlkKxcclxuICAgIHRoaXMudmlkZW8uYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMubmNQbGF5aW5nLmVtaXQoZmFsc2UpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy/ov5Tlm552aWRlb+WvueixoVxyXG4gICAgdGhpcy5uY0xvYWRlZC5lbWl0KHRoaXMudmlkZW8pO1xyXG4gIH1cclxuICAvL+mUgOavgVxyXG4gIGRlc3Ryb3lBbGwoKSB7XHJcbiAgICBpZiAodGhpcy5obHMpIHtcclxuICAgICAgdGhpcy5obHMuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMudmlkZW8pIHtcclxuICAgICAgdGhpcy5kZXN0cm95VmlkZW8odGhpcy52aWRlbyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkZXN0cm95VmlkZW8odmlkZW86IEhUTUxWaWRlb0VsZW1lbnQpIHtcclxuICAgIHZpZGVvLnBhdXNlKCk7XHJcbiAgICB2aWRlby5zcmMgPSAnJztcclxuICAgIHZpZGVvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXknLCAoKSA9PiB7IH0pO1xyXG4gICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCAoKSA9PiB7IH0pO1xyXG4gICAgdmlkZW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZGVkbWV0YWRhdGEnLCAoKSA9PiB7IH0pO1xyXG4gICAgdmlkZW8ucmVtb3ZlKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ2aWRlby1obHMtMjY1XCIgKm5nSWY9XCJpc0gyNjVcIj5cclxuICAgIDwhLS3liqDovb3jgIHplJnor6/kv6Hmga8tLT5cclxuICAgIDxkaXYgY2xhc3M9XCJlcnJvci1jb250YWluZXJcIiAqbmdJZj1cIm5ldHdvcmtTdGF0ZSAhPSA1XCI+XHJcbiAgICAgICAgPCEtLeWKoOi9veS4rS0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlcnJvci10ZXh0XCIgKm5nSWY9XCJuZXR3b3JrU3RhdGUgPT0gMVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXY+5Yqg6L295LitLi4uPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLemUmeivry0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJlcnJvci10ZXh0XCIgKm5nSWY9XCJuZXR3b3JrU3RhdGUgPT0gMiB8fCBuZXR3b3JrU3RhdGUgPT0gMyB8fCBuZXR3b3JrU3RhdGUgPT0gNFwiPlxyXG4gICAgICAgICAgICA8c3ZnIHQ9XCIxNzI0ODMwNTY5MTc4XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICBwLWlkPVwiMTA0OTZcIiB3aWR0aD1cIjY0XCIgaGVpZ2h0PVwiNjRcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk03MjUuMzMzMzMzIDQ2OS4zMzMzMzNjMTI5LjYgMCAyMzQuNjY2NjY3IDEwNS4wNjY2NjcgMjM0LjY2NjY2NyAyMzQuNjY2NjY3cy0xMDUuMDY2NjY3IDIzNC42NjY2NjctMjM0LjY2NjY2NyAyMzQuNjY2NjY3LTIzNC42NjY2NjctMTA1LjA2NjY2Ny0yMzQuNjY2NjY2LTIzNC42NjY2NjcgMTA1LjA2NjY2Ny0yMzQuNjY2NjY3IDIzNC42NjY2NjYtMjM0LjY2NjY2N3ogbTEyOC0zNDEuMzMzMzMzYTEyOCAxMjggMCAwIDEgMTI4IDEyOHYyOTQuMTAxMzMzYTMwMC4yMjQgMzAwLjIyNCAwIDAgMC04NS4zMTItOTEuMjIxMzMzTDg5NiA0MjYuNjY2NjY3aC01OS42MDUzMzNjLTM0LjM0NjY2Ny0xMy43Ni03MS44MDgtMjEuMzMzMzMzLTExMS4wNjEzMzQtMjEuMzMzMzM0di0xOTJIMjk4LjY2NjY2N3Y1OTcuMzMzMzM0aDE0Ny42MjY2NjZhMjk4LjQ1MzMzMyAyOTguNDUzMzMzIDAgMCAwIDUwLjI4MjY2NyA4NS4zNTQ2NjZMMTcwLjY2NjY2NyA4OTZhMTI4IDEyOCAwIDAgMS0xMjgtMTI4VjI1NmExMjggMTI4IDAgMCAxIDEyOC0xMjhoNjgyLjY2NjY2NnogbS0xMTkuNDY2NjY2IDY2MS4zMzMzMzNoLTE3LjA2NjY2N2EyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMCAwLTIxLjMzMzMzMyAyMS4zMzMzMzR2MTcuMDY2NjY2YTIxLjMzMzMzMyAyMS4zMzMzMzMgMCAwIDAgMjEuMzMzMzMzIDIxLjMzMzMzNGgxNy4wNjY2NjdhMjEuMzMzMzMzIDIxLjMzMzMzMyAwIDAgMCAyMS4zMzMzMzMtMjEuMzMzMzM0VjgxMC42NjY2NjdhMjEuMzMzMzMzIDIxLjMzMzMzMyAwIDAgMC0yMS4zMzMzMzMtMjEuMzMzMzM0ek0yMTMuMzMzMzMzIDY4Mi42NjY2NjdIMTI4djg1LjMzMzMzM2E0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDM5LjQ2NjY2NyA0Mi41NkwxNzAuNjY2NjY3IDgxMC42NjY2NjdoNDIuNjY2NjY2di0xMjh6IG01MjAuNTMzMzM0LTEyOGgtMTcuMDY2NjY3YTIxLjMzMzMzMyAyMS4zMzMzMzMgMCAwIDAtMjEuMTg0IDE4LjgzNzMzM0w2OTUuNDY2NjY3IDU3NnYxNDkuMzMzMzMzYTIxLjMzMzMzMyAyMS4zMzMzMzMgMCAwIDAgMTguODM3MzMzIDIxLjE4NEw3MTYuOCA3NDYuNjY2NjY3aDE3LjA2NjY2N2EyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMCAwIDIxLjE4NC0xOC44MzczMzRMNzU1LjIgNzI1LjMzMzMzM3YtMTQ5LjMzMzMzM2EyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMCAwLTIxLjMzMzMzMy0yMS4zMzMzMzN6IG0tMjY2LjAyNjY2Ny0xODcuMTE0NjY3bDIuNzczMzMzIDEuNiAxMTQuMDkwNjY3IDcxLjI5NmEyOTguOTY1MzMzIDI5OC45NjUzMzMgMCAwIDAtMTU0LjQzMiAyMTcuMDAyNjY3IDQyLjI0IDQyLjI0IDAgMCAxLTI0LjgzMi0zNS41ODRMNDA1LjMzMzMzMyA2MTguNjY2NjY3VjQwNS4zMzMzMzNjMC0zMi40MjY2NjcgMzQuNTE3MzMzLTUyLjYwOCA2Mi41MDY2NjctMzcuNzgxMzMzek0yMTMuMzMzMzMzIDQyNi42NjY2NjdIMTI4djE3MC42NjY2NjZoODUuMzMzMzMzdi0xNzAuNjY2NjY2eiBtMC0yMTMuMzMzMzM0SDE3MC42NjY2NjdhNDIuNjY2NjY3IDQyLjY2NjY2NyAwIDAgMC00Mi41NiAzOS40NjY2NjdMMTI4IDI1NnY4NS4zMzMzMzNoODUuMzMzMzMzdi0xMjh6IG02NDAgMGgtNDIuNjY2NjY2djEyOGg4NS4zMzMzMzN2LTg1LjMzMzMzM2E0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwLTM5LjQ2NjY2Ny00Mi41Nkw4NTMuMzMzMzMzIDIxMy4zMzMzMzN6XCJcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI2NkY2RjZFwiIHAtaWQ9XCIxMDQ5N1wiPjwvcGF0aD5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJuZXR3b3JrU3RhdGUgPT0gMlwiPuinhumikeWcsOWdgOiuv+mXrui2heaXtu+8jOaSreaUvuWksei0pe+8gTwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibmV0d29ya1N0YXRlID09IDNcIj7op4bpopHlnLDlnYDmoLzlvI/plJnor6/vvIzku4XmlK/mjIFtM3U45qC85byP77yBPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJuZXR3b3JrU3RhdGUgPT0gNFwiPuWIneWni+WMlue7hOS7tuWksei0pe+8jOivt+WIt+aWsOmhtemdoumHjeivleOAgjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLeWFqOWxj+aSreaUvuaMiemSri0tPlxyXG4gICAgPGRpdiBpZD1cImNvdmVyTGF5ZXJcIiBoaWRkZW49XCJoaWRkZW5cIj5cclxuICAgICAgICA8c3ZnIGlkPVwiY292ZXJMYXllckJ0blwiIHQ9XCIxNzMwODU5MzI2MDAxXCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCJcclxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHAtaWQ9XCI1MzY2XCIgd2lkdGg9XCI0OFwiIGhlaWdodD1cIjQ4XCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTg3MC4yIDQ2Ni4zMzMzMzNsLTYxOC42NjY2NjctMzczLjI4YTUzLjMzMzMzMyA1My4zMzMzMzMgMCAwIDAtODAuODY2NjY2IDQ1LjY2NjY2N3Y3NDYuNTZhNTMuMjA2NjY3IDUzLjIwNjY2NyAwIDAgMCA4MC44ODY2NjYgNDUuNjY2NjY3bDYxOC42NjY2NjctMzczLjI4YTUzLjMzMzMzMyA1My4zMzMzMzMgMCAwIDAgMC05MS4zMzMzMzR6XCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjZmZmZmZmXCIgcC1pZD1cIjUzNjdcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGlkPVwicGxheWVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDwhLS3op4bpopHlrrnlmagtLT5cclxuICAgICAgICA8ZGl2IFtpZF09XCJnbHBsYXllcklkXCIgY2xhc3M9XCJnbHBsYXllclwiPjwvZGl2PlxyXG4gICAgICAgIDwhLS3lt6XlhbfmoI8tLT5cclxuICAgICAgICA8ZGl2IGlkPVwiY29udHJvbGxlclwiIGNsYXNzPVwiY29udHJvbGxlclwiPlxyXG5cclxuICAgICAgICAgICAgPCEtLei/m+W6puadoS0tPlxyXG4gICAgICAgICAgICA8ZGl2IGlkPVwicHJvZ3Jlc3MtY29udGFuaW5lclwiIGNsYXNzPVwicHJvZ3Jlc3MtY29tbW9uIHByb2dyZXNzLWNvbnRhbmluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJjYWNoZVB0c1wiIGNsYXNzPVwicHJvZ3Jlc3MtY29tbW9uIGNhY2hlUHRzXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicHJvZ3Jlc3NQdHNcIiBjbGFzcz1cInByb2dyZXNzLWNvbW1vbiBwcm9ncmVzc1B0c1wiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS3mk43kvZzmoI8tLT5cclxuICAgICAgICAgICAgPGRpdiBpZD1cIm9wZXJhdGUtY29udGFpbmVyXCIgY2xhc3M9XCJvcGVyYXRlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLeaXtumXtC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwicHRzTGFiZWxcIiBjbGFzcz1cInB0c0xhYmVsXCI+MDA6MDA6MDAvMDA6MDA6MDA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLeWjsOmfsy0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2b2ljZS1kaXZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBpZD1cIm11dGVCdG5cIiBjbGFzcz1cIm11dGVCdG5cIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIiFtdXRlU3RhdGVcIiB0PVwiMTczMDg3MjI4MzY3MVwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiMTk1MlwiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03ODkuOTA0IDI1Ni4wMDZhMzUuMzM3IDM1LjMzNyAwIDAgMC0yNi44NTYtNC44MzcgMzUuMzQ4IDM1LjM0OCAwIDAgMC0yMi4yOTMgMTUuNzQ1Yy0xMC42OSAxNi43NTMtNi4wODUgMzguOTgyIDEwLjM4NCA1MC4xMTYgMy44NDUgMi42MSA5NS40OTMgNjYuMDIxIDk1LjQ5MyAyMjMuNjk1IDAgMTU4LjA3OC04Ny45MDkgMjIxLjUyOS05MS4zODUgMjIzLjkxNy0xNi41MzcgMTEuMjY2LTIwLjk1OCAzMy43MjMtOS45MzEgNTAuNDE0YTM1LjU4MyAzNS41ODMgMCAwIDAgMjIuNzA3IDE1LjM1MSAzNS41OCAzNS41OCAwIDAgMCAyNi44ODUtNS4zMzljNS4wNDMtMy4zNjMgMTIzLjI3Ny04NS42MzUgMTIzLjI3Ny0yODQuMzgyIDAtMTk5LjA1MS0xMjMuMDE3LTI4MS4yODQtMTI4LjI4MS0yODQuNjhNNjc4LjU0IDM2Mi42NjNhMzUuMzU3IDM1LjM1NyAwIDAgMC0yNy4xMjUtMS4yODggMzUuMzc4IDM1LjM3OCAwIDAgMC0yMC4wNDEgMTguMzE5Yy04LjQ3NCAxNy45MDUtMS4yNjUgMzkuMzA4IDE2LjMyMSA0OC40MzYgMi4yNzkgMS4xOTIgNTUuODY2IDI5LjQyNiA1NS44NjYgMTA5Ljk0IDAgODUuOTctNTAuMTE2IDExNC40NjMtNTEuNzU4IDExNS4zOTctMTcuNzU2IDkuMTQxLTI0Ljg5MSAzMC44NC0xNi4wMjMgNDguNzMyYTM1Ljc4MyAzNS43ODMgMCAwIDAgNDguMDI1IDE2LjI4NmMzLjczOS0xLjk0MyA5MS4yNzItNDcuOTExIDkxLjI3Mi0xODAuMzc1IDAtMTI3LjkwNi05Mi42MTUtMTczLjU3Ny05Ni41MzYtMTc1LjQ4MU01MTUuNzk2IDgwMC43NTNsLTc0LjY5NS02Ny44OS0xMjIuMjY0LTExMS4xNzZhMzcuNDA0IDM3LjQwNCAwIDAgMC0yNS4xNy05LjcxbC0xMTMuOTc5IDAuMDM0LTAuMzctMjM5LjgyN2gxNTAuMDVhMzcuNDIzIDM3LjQyMyAwIDAgMCAzMi4wMDEtOS4wNzJsNzkuNjk4LTcyLjQ4OCA3NC42ODgtNjcuODl2NTc4LjAxOWgwLjA0MXogbTQ0LjM2MS02NzguMjk0Yy05LjE0Ny00LjAyOC0zMy4yNzMtMTAuNzkyLTU5Ljc0NyAxMy4yOTVsLTU5LjMxIDUzLjkyOC0xMTguNjA0IDEwNy44MTRIMTc5LjMxOGMtNDEuMTA3IDAuMTY1LTc0LjM0MSAzMy41NDYtNzQuMzE4IDc0LjY1M3YyMzkuODYyYzAgNDEuMTYgMzMuMzQ2IDc0LjY1NSA3NC4zMTggNzQuNjU1aDk5LjkzMkw0NDEuMSA4MzMuODAzbDU5LjM4MyA1My45NjNjMTQuOTc2IDEzLjU5NyAyOS4xNjUgMTcuNDAzIDQwLjMzNCAxNy40MDMgOC42MjEgMCAxNS40OTQtMi4yNzkgMTkuNDU0LTQuMDM0IDkuMTEyLTQuMDI5IDMwLjI0Ni0xNy4yNSAzMC4yNDYtNTIuOTl2LTY3Mi44NGMwLTI0LjY4NS0xMS4zNS00NC40MDYtMzAuMzYtNTIuODQ2eiBtMCAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjZmZmZmZmXCIgcC1pZD1cIjE5NTNcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIm11dGVTdGF0ZVwiIHQ9XCIxNzMwODcyMTgxMTE0XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHAtaWQ9XCIxMzM4OVwiIHdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIyMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk01MTUuNzU2IDYyMS4zMnYxNzkuMzkxTDQ0MS4xIDczMi44NTkgMzE4LjgzNyA2MjEuNjg1YTM3LjQ2IDM3LjQ2IDAgMCAwLTI1LjE2OS05LjcxNGwtMTEzLjk4MSAwLjAzNi0wLjM2OS0yMzkuODI2aDg3LjI5OWwtNzQuNjg3LTc0LjY4N2gtMTIuNjEyYy00MS4xMDcgMC4xNjQtNzQuMzQxIDMzLjU1My03NC4zMTggNzQuNjUxdjIzOS44NjJjMCA0MS4xNzEgMzMuMzQ4IDc0LjY1MSA3NC4zMTggNzQuNjUxaDk5LjkyOUw0NDEuMSA4MzMuODA4bDU5LjM4MiA1My45NjVjMTQuOTc3IDEzLjU5NiAyOS4xNjUgMTcuMzg3IDQwLjMzMiAxNy4zODcgOC42MjEgMCAxNS40OTYtMi4yNiAxOS40NTUtNC4wMjggOS4xMTMtNC4wMjggMzAuMjQ1LTE3LjI0MSAzMC4yNDUtNTIuOTgxVjY5Ni4wOGwtNzQuNzU4LTc0Ljc2ek04NDYuNjM0IDU0MC43MjljMCA3Mi43OTItMTguNjYzIDEyNS4yOTgtMzkuMTE2IDE2MS4yMzlsNTIuMTU2IDUyLjE2MWMyOS43NTMtNDUuODczIDU4LjUxMi0xMTUuNDM5IDU4LjUxMi0yMTMuNDM2IDAtMTk5LjA1Ni0xMjMuMDItMjgxLjI4OC0xMjguMjgzLTI4NC42NzhhMzUuMzE2IDM1LjMxNiAwIDAgMC0yNi44NTktNC44NDggMzUuMzk3IDM1LjM5NyAwIDAgMC0yMi4yODkgMTUuNzQ3Yy0xMC42ODkgMTYuNzQ5LTYuMDg3IDM4Ljk4NCAxMC4zODQgNTAuMTE5IDMuODQ1IDIuNjA1IDk1LjQ5NSA2Ni4wMTEgOTUuNDk1IDIyMy42OTZ6XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjZmZmZmZmXCIgcC1pZD1cIjEzMzkwXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk02NDcuNjk3IDQyOC4xMzNjMi4yNzggMS4xODUgNTUuODY1IDI5LjQxNiA1NS44NjUgMTA5LjkzNSAwIDIwLjc1OS0zLjAxMiAzOC03LjQ2MyA1Mi40N2w1NC42MTYgNTQuNjIxYzEzLjczMy0yNi44MjggMjQuMzYzLTYxLjUxIDI0LjM2My0xMDcuMDU1IDAtMTI3LjkwNS05Mi42MTYtMTczLjU3Ny05Ni41MzQtMTc1LjQ3MnYwLjAzNmEzNS4zODMgMzUuMzgzIDAgMCAwLTI3LjEyOC0xLjI5NCAzNS4zNDkgMzUuMzQ5IDAgMCAwLTIwLjAzOSAxOC4zMTZjLTguNDc1IDE3LjkxNi0xLjI2NyAzOS4zMTIgMTYuMzIgNDguNDQzek00MTcuNTU4IDMxMi4wMDJsMjMuNTExLTIxLjM3OCA3NC42ODctNjcuODg5VjQxMC4ybDc0Ljc2IDc0Ljc2VjE3NS4zMTNjMC0yNC42OTUtMTEuMzUtNDQuNDE1LTMwLjM1OS01Mi44NTMtOS4xNDUtNC4wMjgtMzMuMjc1LTEwLjc4OS01OS43NDcgMTMuMzA0bC01OS4zMDkgNTMuOTEtNzYuNDA1IDY5LjQ1NiA1Mi44NjIgNTIuODcyek04MjkuMjY2IDg2Ni41OTZjLTkuNTUgMC0xOS4xLTMuNjQ1LTI2LjM5LTEwLjkzNWwtNjM0LjUzLTYzNC41M2MtMTQuNTgtMTQuNTgtMTQuNTgtMzguMiAwLTUyLjc4IDE0LjU4LTE0LjU4IDM4LjItMTQuNTggNTIuNzggMGw2MzQuNTMgNjM0LjUyOWMxNC41OCAxNC41OCAxNC41OCAzOC4yIDAgNTIuNzgtNy4yOSA3LjI5MS0xNi44NCAxMC45MzYtMjYuMzkgMTAuOTM2elwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI2ZmZmZmZlwiIHAtaWQ9XCIxMzM5MVwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3Jlc3MgaWQ9XCJwcm9ncmVzc1ZvaWNlXCIgY2xhc3M9XCJwcm9ncmVzc1ZvaWNlXCIgdmFsdWU9XCIwXCIgbWF4PVwiMTAwXCI+PC9wcm9ncmVzcz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0t5pKt5pS+44CB5pqC5YGcLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cInBsYXlCdG5cIiBbdGl0bGVdPVwiaXNQbGF5aW5nID8gJ+aaguWBnCcgOiAn5pKt5pS+J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzUGxheWluZ1wiIHQ9XCIxNzMwODYxODE1MjU0XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIiB2ZXJzaW9uPVwiMS4xXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiODA1M1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTc4MC44IDQ3NS43MzMzMzNMMjg1Ljg2NjY2NyAxNjguNTMzMzMzYy0yNy43MzMzMzMtMTcuMDY2NjY3LTY0IDQuMjY2NjY3LTY0IDM2LjI2NjY2N3Y2MTQuNGMwIDMyIDM2LjI2NjY2NyA1My4zMzMzMzMgNjQgMzYuMjY2NjY3bDQ5Mi44LTMwNy4yYzI5Ljg2NjY2Ny0xNC45MzMzMzMgMjkuODY2NjY3LTU3LjYgMi4xMzMzMzMtNzIuNTMzMzM0elwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNmZmZmZmZcIiBwLWlkPVwiODA1NFwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc1BsYXlpbmdcIiB0PVwiMTczMDg2MTM5Mzg2OFwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCIgdmVyc2lvbj1cIjEuMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgcC1pZD1cIjY4MjdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk00MjguNTM5NjU4IDgzMy40OTQxNTVjMCAxNS45NTQzNjctMTMuMDUzMjk0IDI5LjAwNzY2MS0yOS4wMDc2NjEgMjkuMDA3NjYxTDI4NS42MTM0NTggODYyLjUwMTgxNmMtMTUuOTU0MzY3IDAtMjkuMDA3NjYxLTEzLjA1MzI5NC0yOS4wMDc2NjEtMjkuMDA3NjYxbDAtNjM5LjQyMzExMWMwLTE1Ljk1NDM2NyAxMy4wNTMyOTQtMjkuMDA3NjYxIDI5LjAwNzY2MS0yOS4wMDc2NjFsMTEzLjkxODUzOSAwYzE1Ljk1NDM2NyAwIDI5LjAwNzY2MSAxMy4wNTMyOTQgMjkuMDA3NjYxIDI5LjAwNzY2MUw0MjguNTM5NjU4IDgzMy40OTQxNTV6XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI2ZmZmZmZlwiIHAtaWQ9XCI2ODI4XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTc2MC4xMjQ2MzUgODMzLjQ5NDE1NWMwIDE1Ljk1NDM2Ny0xMy4wNTMyOTQgMjkuMDA3NjYxLTI5LjAwNzY2MSAyOS4wMDc2NjFsLTExMy45MTg1MzkgMGMtMTUuOTU0MzY3IDAtMjkuMDA3NjYxLTEzLjA1MzI5NC0yOS4wMDc2NjEtMjkuMDA3NjYxbDAtNjM5LjQyMzExMWMwLTE1Ljk1NDM2NyAxMy4wNTMyOTQtMjkuMDA3NjYxIDI5LjAwNzY2MS0yOS4wMDc2NjFsMTEzLjkxODUzOSAwYzE1Ljk1NDM2NyAwIDI5LjAwNzY2MSAxMy4wNTMyOTQgMjkuMDA3NjYxIDI5LjAwNzY2MUw3NjAuMTI0NjM1IDgzMy40OTQxNTV6XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI2ZmZmZmZlwiIHAtaWQ9XCI2ODI5XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0t5YWo5bGPLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImZ1bGxTY3JlZW5CdG5cIiBjbGFzcz1cImZ1bGxTY3JlZW5CdG5cIiBbdGl0bGVdPVwiaXNGdWxsU2NyZWVuQnRuID8gJ+mAgOWHuuWFqOWxjycgOiAn5YWo5bGPJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwiIWlzRnVsbFNjcmVlbkJ0blwiIHQ9XCIxNzMwODc1MTMwMzU3XCIgY2xhc3M9XCJpY29uXCIgdmlld0JveD1cIjAgMCAxMDI0IDEwMjRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwLWlkPVwiODI1N1wiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTM1OC40IDc2OEg0MjYuNjY2NjY3djg1LjMzMzMzM0gyMTMuMzMzMzMzdi0yMTMuMzMzMzMzaDg1LjMzMzMzNHY2OC4yNjY2NjdsMTI4LTEyOCA1OS43MzMzMzMgNTkuNzMzMzMzLTEyOCAxMjh6IG0zNDUuNiAwbC0xMjgtMTI4IDU5LjczMzMzMy01OS43MzMzMzMgMTMyLjI2NjY2NyAxMzIuMjY2NjY2VjY0MGg4NS4zMzMzMzN2MjEzLjMzMzMzM2gtMjEzLjMzMzMzM3YtODUuMzMzMzMzaDY0ek0zNTguNCAyOTguNjY2NjY3bDEyOCAxMjgtNTkuNzMzMzMzIDU5LjczMzMzMy0xMjgtMTI4VjQyNi42NjY2NjdIMjEzLjMzMzMzM1YyMTMuMzMzMzMzaDIxMy4zMzMzMzR2ODUuMzMzMzM0SDM1OC40eiBtMzQ1LjYgMEg2NDBWMjEzLjMzMzMzM2gyMTMuMzMzMzMzdjIxMy4zMzMzMzRoLTg1LjMzMzMzM1YzNTQuMTMzMzMzbC0xMzIuMjY2NjY3IDEzMi4yNjY2NjctNTkuNzMzMzMzLTU5LjczMzMzMyAxMjgtMTI4elwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNmZmZmZmZcIiBwLWlkPVwiODI1OFwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJpc0Z1bGxTY3JlZW5CdG5cIiB0PVwiMTczMDg3NTEzNzczNFwiIGNsYXNzPVwiaWNvblwiIHZpZXdCb3g9XCIwIDAgMTAyNCAxMDI0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgcC1pZD1cIjg0NjdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0yOTguNjY2NjY3IDYzMS40NjY2NjdIMjI2LjEzMzMzM3YtODEuMDY2NjY3aDIxNy42djIwNC44aC04NS4zMzMzMzN2LTY4LjI2NjY2N2wtMTI4IDEyOEwxNzAuNjY2NjY3IDc1OS40NjY2NjdsMTI4LTEyOHogbTQyMi40IDBsMTI4IDEyOC01OS43MzMzMzQgNTkuNzMzMzMzLTEyOC0xMjh2NjguMjY2NjY3aC04NS4zMzMzMzNWNTU0LjY2NjY2N2gyMTcuNnY4MS4wNjY2NjZoLTcyLjUzMzMzM3pNMjk4LjY2NjY2NyAzNDEuMzMzMzMzTDE4Ny43MzMzMzMgMjMwLjQgMjQzLjIgMTcwLjY2NjY2N2wxMTUuMiAxMTUuMlYyMTcuNmg4NS4zMzMzMzN2MjA0LjhIMjI2LjEzMzMzM1YzNDEuMzMzMzMzSDI5OC42NjY2Njd6IG00MzAuOTMzMzMzIDBoNjR2ODEuMDY2NjY3aC0yMTcuNlYyMTcuNmg4NS4zMzMzMzN2NzIuNTMzMzMzTDc4MC44IDE3MC42NjY2NjdsNTkuNzMzMzMzIDU5LjczMzMzM0w3MjkuNiAzNDEuMzMzMzMzelwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNmZmZmZmZcIiBwLWlkPVwiODQ2OFwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLeS/oeaBry0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwic2hvd0xhYmVsXCIgY2xhc3M9XCJzaG93TGFiZWxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG5cclxuPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBmaXhlZDtsZWZ0OiAwO3RvcDogMTAwMDBweDtcIj5cclxuICAgIDxkaXYgaWQ9XCJyZXNpemUtY29udGFpbmVyXCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cIiFpc0gyNjVcIiBjbGFzcz1cInZpZGVvLWhscy0yNjRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwbGF5RXJyb3JcIiAqbmdJZj1cInBsYXlFcnJvclwiPlxyXG4gICAgICAgIDxzdmcgdD1cIjE3MjQ4MzA1NjkxNzhcIiBjbGFzcz1cImljb25cIiB2aWV3Qm94PVwiMCAwIDEwMjQgMTAyNFwiIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgcC1pZD1cIjEwNDk2XCIgd2lkdGg9XCI2NFwiIGhlaWdodD1cIjY0XCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTcyNS4zMzMzMzMgNDY5LjMzMzMzM2MxMjkuNiAwIDIzNC42NjY2NjcgMTA1LjA2NjY2NyAyMzQuNjY2NjY3IDIzNC42NjY2NjdzLTEwNS4wNjY2NjcgMjM0LjY2NjY2Ny0yMzQuNjY2NjY3IDIzNC42NjY2NjctMjM0LjY2NjY2Ny0xMDUuMDY2NjY3LTIzNC42NjY2NjYtMjM0LjY2NjY2NyAxMDUuMDY2NjY3LTIzNC42NjY2NjcgMjM0LjY2NjY2Ni0yMzQuNjY2NjY3eiBtMTI4LTM0MS4zMzMzMzNhMTI4IDEyOCAwIDAgMSAxMjggMTI4djI5NC4xMDEzMzNhMzAwLjIyNCAzMDAuMjI0IDAgMCAwLTg1LjMxMi05MS4yMjEzMzNMODk2IDQyNi42NjY2NjdoLTU5LjYwNTMzM2MtMzQuMzQ2NjY3LTEzLjc2LTcxLjgwOC0yMS4zMzMzMzMtMTExLjA2MTMzNC0yMS4zMzMzMzR2LTE5MkgyOTguNjY2NjY3djU5Ny4zMzMzMzRoMTQ3LjYyNjY2NmEyOTguNDUzMzMzIDI5OC40NTMzMzMgMCAwIDAgNTAuMjgyNjY3IDg1LjM1NDY2NkwxNzAuNjY2NjY3IDg5NmExMjggMTI4IDAgMCAxLTEyOC0xMjhWMjU2YTEyOCAxMjggMCAwIDEgMTI4LTEyOGg2ODIuNjY2NjY2eiBtLTExOS40NjY2NjYgNjYxLjMzMzMzM2gtMTcuMDY2NjY3YTIxLjMzMzMzMyAyMS4zMzMzMzMgMCAwIDAtMjEuMzMzMzMzIDIxLjMzMzMzNHYxNy4wNjY2NjZhMjEuMzMzMzMzIDIxLjMzMzMzMyAwIDAgMCAyMS4zMzMzMzMgMjEuMzMzMzM0aDE3LjA2NjY2N2EyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMCAwIDIxLjMzMzMzMy0yMS4zMzMzMzRWODEwLjY2NjY2N2EyMS4zMzMzMzMgMjEuMzMzMzMzIDAgMCAwLTIxLjMzMzMzMy0yMS4zMzMzMzR6TTIxMy4zMzMzMzMgNjgyLjY2NjY2N0gxMjh2ODUuMzMzMzMzYTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAgMzkuNDY2NjY3IDQyLjU2TDE3MC42NjY2NjcgODEwLjY2NjY2N2g0Mi42NjY2NjZ2LTEyOHogbTUyMC41MzMzMzQtMTI4aC0xNy4wNjY2NjdhMjEuMzMzMzMzIDIxLjMzMzMzMyAwIDAgMC0yMS4xODQgMTguODM3MzMzTDY5NS40NjY2NjcgNTc2djE0OS4zMzMzMzNhMjEuMzMzMzMzIDIxLjMzMzMzMyAwIDAgMCAxOC44MzczMzMgMjEuMTg0TDcxNi44IDc0Ni42NjY2NjdoMTcuMDY2NjY3YTIxLjMzMzMzMyAyMS4zMzMzMzMgMCAwIDAgMjEuMTg0LTE4LjgzNzMzNEw3NTUuMiA3MjUuMzMzMzMzdi0xNDkuMzMzMzMzYTIxLjMzMzMzMyAyMS4zMzMzMzMgMCAwIDAtMjEuMzMzMzMzLTIxLjMzMzMzM3ogbS0yNjYuMDI2NjY3LTE4Ny4xMTQ2NjdsMi43NzMzMzMgMS42IDExNC4wOTA2NjcgNzEuMjk2YTI5OC45NjUzMzMgMjk4Ljk2NTMzMyAwIDAgMC0xNTQuNDMyIDIxNy4wMDI2NjcgNDIuMjQgNDIuMjQgMCAwIDEtMjQuODMyLTM1LjU4NEw0MDUuMzMzMzMzIDYxOC42NjY2NjdWNDA1LjMzMzMzM2MwLTMyLjQyNjY2NyAzNC41MTczMzMtNTIuNjA4IDYyLjUwNjY2Ny0zNy43ODEzMzN6TTIxMy4zMzMzMzMgNDI2LjY2NjY2N0gxMjh2MTcwLjY2NjY2Nmg4NS4zMzMzMzN2LTE3MC42NjY2NjZ6IG0wLTIxMy4zMzMzMzRIMTcwLjY2NjY2N2E0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwLTQyLjU2IDM5LjQ2NjY2N0wxMjggMjU2djg1LjMzMzMzM2g4NS4zMzMzMzN2LTEyOHogbTY0MCAwaC00Mi42NjY2NjZ2MTI4aDg1LjMzMzMzM3YtODUuMzMzMzMzYTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAtMzkuNDY2NjY3LTQyLjU2TDg1My4zMzMzMzMgMjEzLjMzMzMzM3pcIlxyXG4gICAgICAgICAgICAgICAgZmlsbD1cIiNjZGNkY2RcIiBwLWlkPVwiMTA0OTdcIj48L3BhdGg+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yVGV4dFwiPuaSreaUvuWksei0pTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8dmlkZW8gY2xhc3M9XCJ2aWRlb1wiIFtuZ1N0eWxlXT1cInsnb2JqZWN0LWZpdCc6ICdjb250YWluJyB9XCIgY3Jvc3NPcmlnaW49XCJhbm9ueW1vdXNcIiBbY29udHJvbHNdPVwiY29udHJvbHNNb2RlXCJcclxuICAgICAgICBbbXV0ZWRdPVwibXV0ZWRNb2RlXCIgW2F1dG9wbGF5XT1cImF1dG9wbGF5TW9kZVwiIGlkPVwidmlkZW9cIj48L3ZpZGVvPlxyXG48L2Rpdj4iXX0=