angular-schedule
Version:
A simple and light schedule package for angular.
910 lines (894 loc) • 66.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/scheduler.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild, ElementRef, Input, Output, EventEmitter, ViewChildren, QueryList, ChangeDetectionStrategy, Inject, TemplateRef, ViewContainerRef, } from '@angular/core';
import { USER_OPTIONS } from './lib.config.token';
import { fromEvent } from 'rxjs';
import { Overlay } from '@angular/cdk/overlay';
import { TemplatePortal } from '@angular/cdk/portal';
import { take, filter } from 'rxjs/operators';
export class SchedulerComponent {
/**
* @param {?} libConfig
* @param {?} elementRef
* @param {?} overlay
* @param {?} viewContainerRef
*/
constructor(libConfig, elementRef, overlay, viewContainerRef) {
this.libConfig = libConfig;
this.elementRef = elementRef;
this.overlay = overlay;
this.viewContainerRef = viewContainerRef;
this.isSelecting = false;
this.finishedSelecting = new EventEmitter();
this.editInfo = new EventEmitter();
this.excludedDay = new EventEmitter();
this.includedDay = new EventEmitter();
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.showBy) {
this.generateAllDates();
}
}
/**
* @return {?}
*/
ngOnInit() { }
/**
* @return {?}
*/
ngAfterViewInit() {
this.scrollToToday();
}
/**
* @return {?}
*/
generateAllDates() {
/** @type {?} */
const CURRENT_MONTH = new Date().getMonth();
/** @type {?} */
const CURRENT_YEAR = new Date().getFullYear();
/** @type {?} */
const MONTHS_IN_PAST = this.libConfig.monthsInPast || 4;
/** @type {?} */
const MONTHS_IN_FUTURE = this.libConfig.monthsInFuture || 12;
/** @type {?} */
let pastMonth = CURRENT_MONTH - MONTHS_IN_PAST < 0
? CURRENT_MONTH - MONTHS_IN_PAST + 12
: CURRENT_MONTH - MONTHS_IN_PAST;
/** @type {?} */
let pastYear = pastMonth >= 9 ? CURRENT_YEAR - 1 : CURRENT_YEAR;
/** @type {?} */
const TO_DATE = this.calculateToDate(CURRENT_YEAR, CURRENT_MONTH, MONTHS_IN_FUTURE);
/** @type {?} */
const DATEOBJ = [];
while (pastYear <= TO_DATE.getFullYear()) {
/** @type {?} */
const FRAME = pastYear === TO_DATE.getFullYear() ? TO_DATE.getMonth() : 11;
if (this.showBy === 'day') {
for (let index = pastMonth; index <= FRAME; index++) {
DATEOBJ.push({
month: new Date(Date.UTC(pastYear, pastMonth, 1)),
weekDays: this.generateDates(pastYear, pastMonth),
});
pastMonth = pastMonth === 11 ? 0 : pastMonth + 1;
}
}
else {
DATEOBJ.push({
month: new Date(Date.UTC(pastYear, pastMonth, 1)),
weekDays: this.generateMonths(pastYear, pastMonth, FRAME),
});
for (let index = pastMonth; index <= FRAME; index++) {
pastMonth = pastMonth === 11 ? 0 : pastMonth + 1;
}
}
pastYear += 1;
}
this.days = DATEOBJ;
}
/**
* @param {?} year
* @param {?} month
* @param {?} toMonths
* @return {?}
*/
calculateToDate(year, month, toMonths) {
/** @type {?} */
const NEW_MONTH = month + toMonths > 12 ? (month + toMonths) % 12 : month + toMonths;
/** @type {?} */
const ADD_TO_YEAR = month + toMonths > 12 ? Math.floor((month + toMonths) / 12) : 0;
return new Date(Date.UTC(year + ADD_TO_YEAR, NEW_MONTH, 1));
}
/**
* @param {?} year
* @param {?} month
* @return {?}
*/
generateDates(year, month) {
/** @type {?} */
const DATEOBJ = new Date(Date.UTC(year, month, 1));
/** @type {?} */
const WEEKDAYS = [];
while (DATEOBJ.getMonth() === month) {
WEEKDAYS.push(new Date(DATEOBJ));
DATEOBJ.setDate(DATEOBJ.getDate() + 1);
}
return WEEKDAYS;
}
/**
* @param {?} day
* @return {?}
*/
excludeIncludeCheck(day) {
return false;
}
/**
* @param {?} start
* @param {?} end
* @param {?} current
* @return {?}
*/
calculateFromTo(start, end, current) {
/** @type {?} */
const FROM = new Date(start);
/** @type {?} */
const TO = new Date(end);
/** @type {?} */
const CHECK = new Date(current);
/** @type {?} */
const SKIP_DAYS = this.libConfig.skipDays || [0, 6];
if (this.showBy === 'day') {
return (CHECK >= FROM && CHECK <= TO && !SKIP_DAYS.includes(CHECK.getDay()));
}
return CHECK >= FROM && CHECK <= TO;
}
/**
* @param {?} start
* @param {?} end
* @param {?} current
* @return {?}
*/
isDayOff(start, end, current) {
/** @type {?} */
const FROM = new Date(start);
/** @type {?} */
const TO = new Date(end);
/** @type {?} */
const CHECK = new Date(current);
/** @type {?} */
const SKIP_DAYS = this.libConfig.skipDays || [0, 6];
return (CHECK >= FROM &&
CHECK <= TO &&
SKIP_DAYS.includes(CHECK.getDay()) &&
this.showBy !== 'month');
}
/**
* @param {?} ev
* @return {?}
*/
enter(ev) {
if (this.isSelecting) {
if (ev.target.classList.contains('selected')) {
ev.target.classList.remove('selected');
if (ev.target.parentNode.nextSibling.lastChild.classList.contains('selected')) {
ev.target.parentNode.nextSibling.lastChild.classList.remove('selected');
}
}
else {
ev.target.classList.add('selected');
if (!ev.target.parentNode.previousSibling.lastChild.classList.contains('selected')) {
ev.target.parentNode.previousSibling.lastChild.classList.add('selected');
}
}
}
}
/**
* @param {?} ev
* @param {?} day
* @param {?} user
* @return {?}
*/
startSelect(ev, day, user) {
// tslint:disable-next-line:curly
if (ev.button !== 0)
return;
this.startUser = user;
this.isSelecting = true;
ev.target.classList.add('selected');
this.startDay = day;
}
/**
* @param {?} ev
* @param {?} endDay
* @param {?} user
* @return {?}
*/
endSelect(ev, endDay, user) {
if (this.startUser !== user) {
throw "Start and end row doesn't match! You might have started selecting in one row and ended up in another one.";
}
// tslint:disable-next-line:curly
if (ev.button !== 0)
return;
ev.target.classList.add('selected');
this.isSelecting = false;
this.selections.forEach((/**
* @param {?} el
* @return {?}
*/
(el) => el.nativeElement.classList.remove('selected')));
/** @type {?} */
const DATA = {
endDay: ((/** @type {?} */ (endDay))).toISOString(),
user,
startDay: this.startDay.toISOString(),
};
this.finishedSelecting.emit(DATA);
}
/**
* @param {?} ev
* @return {?}
*/
reCalc(ev) {
if (this.isSelecting) {
/** @type {?} */
const RECT = this.container.nativeElement.getBoundingClientRect();
/** @type {?} */
const X = ev.clientX - RECT.left;
if (X > 1000) {
this.container.nativeElement.scrollLeft += 40;
}
}
}
/**
* @return {?}
*/
scrollToToday() {
/** @type {?} */
const ELEM = (/** @type {?} */ (this.elementRef.nativeElement.querySelector('.bottomData__title.today')));
ELEM.scrollIntoView();
}
/**
* @param {?} year
* @param {?} month
* @param {?} toMonth
* @return {?}
*/
generateMonths(year, month, toMonth) {
/** @type {?} */
let counter = month;
/** @type {?} */
let months = [];
while (counter <= toMonth) {
((/** @type {?} */ (months))) = [...months, new Date(Date.UTC(year, counter, 1))];
counter++;
}
return months;
}
/**
* @param {?} ev
* @param {?} user
* @param {?} project
* @param {?} weekday
* @return {?}
*/
open(ev, user, project, weekday) {
if (this.showBy === 'day') {
const { x, y } = ev;
ev.preventDefault();
this.close();
/** @type {?} */
const positionStrategy = this.overlay
.position()
.flexibleConnectedTo({ x, y })
.withPositions([
{
originX: 'end',
originY: 'bottom',
overlayX: 'end',
overlayY: 'top',
},
]);
this.overlayRef = this.overlay.create({
positionStrategy,
scrollStrategy: this.overlay.scrollStrategies.close(),
});
this.overlayRef.attach(new TemplatePortal(this.userMenu, this.viewContainerRef, {
$implicit: { user, project, weekday },
}));
this.sub = fromEvent(document, 'click')
.pipe(filter((/**
* @param {?} event
* @return {?}
*/
(event) => {
/** @type {?} */
const clickTarget = (/** @type {?} */ (event.target));
return (!!this.overlayRef &&
!this.overlayRef.overlayElement.contains(clickTarget));
})), take(1))
.subscribe((/**
* @return {?}
*/
() => this.close()));
}
}
/**
* @return {?}
*/
close() {
this.sub && this.sub.unsubscribe();
if (this.overlayRef) {
this.overlayRef.dispose();
this.overlayRef = null;
}
}
/**
* @param {?} data
* @return {?}
*/
excludeDay(data) {
this.close();
this.excludedDay.emit(data);
}
/**
* @param {?} data
* @return {?}
*/
includeDay(data) {
this.close();
this.includedDay.emit(data);
}
/**
* @param {?} day
* @return {?}
*/
isToday(day) {
return new Date(day).toDateString() === new Date().toDateString();
}
/**
* @param {?} index
* @param {?} el
* @return {?}
*/
trackPersons(index, el) {
return el.id;
}
/**
* @param {?} index
* @return {?}
*/
trackMonths(index) {
return index;
}
/**
* @param {?} index
* @return {?}
*/
trackDays(index) {
return index;
}
/**
* @param {?} index
* @param {?} el
* @return {?}
*/
trackData(index, el) {
return el.id;
}
}
SchedulerComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-scheduler',
template: `
<button
*ngIf="libConfig?.showToday"
class="scrollToToday"
(click)="scrollToToday()"
>
{{ todayButtonLabel || 'Today' }}
</button>
<div class="table">
<div class="left">
<div class="spacer"></div>
<div
*ngFor="let person of persons; trackBy: trackPersons"
[ngStyle]="{
height:
person.data.length * 30 >= 60
? (person?.data.length + 3) * 30 + 'px'
: '100px'
}"
class="who"
>
<strong>{{ person?.name }}</strong>
<br />
<small [innerText]="person?.departments || ''"></small>
</div>
</div>
<div #container class="right">
<div class="header">
<div
*ngFor="let day of days; trackBy: trackMonths"
class="headerData"
>
<div class="topData">
<strong
>{{
showBy === 'day'
? (day.month | date: 'MMM yyyy')
: (day.month | date: 'yyyy')
}}
</strong>
</div>
<div class="bottomData">
<div
class="bottomData__title"
*ngFor="let weekday of day?.weekDays; trackBy: trackDays"
[class.today]="isToday(weekday)"
>
<strong>{{
showBy === 'day'
? (weekday | date: 'dd EEE')
: (weekday | date: 'MMMM')
}}</strong>
</div>
</div>
</div>
</div>
<div>
<div
class="pos-rel"
*ngFor="let person of persons; let i = index; trackBy: trackPersons"
>
<div *ngFor="let day of days; trackBy: trackMonths" class="body">
<div
class="bodyData"
[ngStyle]="{
height:
person?.data.length * 30 >= 60
? (person?.data.length + 3) * 30 + 'px'
: '100px',
'background-color': isToday(weekday)
? 'rgba(241, 229, 188, .5)'
: '#fff'
}"
*ngFor="let weekday of day?.weekDays; trackBy: trackDays"
>
<label
class="projectLabel"
*ngFor="let project of person?.data; trackBy: trackData"
>
<span
(contextmenu)="open($event, person.id, project, weekday)"
[showTooltip]="libConfig?.showTooltip"
[tooltip]="project?.description || ''"
[placement]="placement"
[delay]="delay"
[ngStyle]="{ backgroundColor: project?.color }"
*ngIf="
(calculateFromTo(project?.from, project?.to, weekday) &&
!project?.excludeDays.includes(weekday)) ||
project?.includeDays.includes(weekday)
"
(click)="
editInfo.emit({ person: person?.id, project: project })
"
>{{ project?.name }} {{ project?.hours }}</span
>
<span
(contextmenu)="
open($event, person.id, project, weekday);
$event.preventDefault()
"
*ngIf="
(isDayOff(project?.from, project?.to, weekday) &&
!project?.includeDays.includes(weekday)) ||
project?.excludeDays.includes(weekday)
"
class="dayOff"
>
{{ dayOffLabel || 'Day off' }}</span
>
</label>
<div
#selectionDiv
class="selectionDiv"
(mousedown)="startSelect($event, weekday, person?.id)"
(mouseenter)="enter($event)"
(mousemove)="reCalc($event)"
(mouseup)="endSelect($event, weekday, person?.id)"
[ngStyle]="{
width: '100%',
height:
person.data.length * 30 >= 60
? (person?.data.length + 3) * 30 -
person?.data.length * 30 +
'px'
: 100 - person?.data.length * 30 + 'px'
}"
></div>
</div>
</div>
</div>
</div>
</div>
</div>
<ng-template #userMenu let-data>
<section class="user-menu">
<div
*ngIf="
(calculateFromTo(
data?.project?.from,
data?.project?.to,
data?.weekday
) &&
!data?.project?.excludeDays.includes(data?.weekday)) ||
data?.project?.includeDays.includes(data?.weekday)
"
(click)="excludeDay(data)"
>
Exclude day
</div>
<div
*ngIf="
(isDayOff(data?.project?.from, data?.project?.to, data?.weekday) &&
!data?.project?.includeDays.includes(data?.weekday)) ||
data?.project?.excludeDays.includes(data?.weekday)
"
(click)="includeDay(data)"
>
Include day
</div>
</section>
</ng-template>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [`
* {
box-sizing: border-box;
border-collapse: collapse;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.table {
border: 1px solid #d5d5d5;
background-color: #f5f5f5;
border-spacing: 0;
display: flex;
}
.table .spacer {
width: 300px;
height: 70px;
border: 1px solid #d5d5d5;
}
.table .who {
height: 100px;
padding: 8px 16px;
border: 1px solid #d5d5d5;
background-color: #fff;
}
.table .who strong {
font-size: 16px;
color: #1a1a1a;
}
.table .right {
overflow-x: auto;
overflow-y: hidden;
}
.table .right .header {
display: flex;
}
.table .right .header .topData {
height: 40px;
display: flex;
align-items: center;
justify-content: center;
border-right: 1px solid #d5d5d5;
border-left: 1px solid #d5d5d5;
}
.table .right .header .bottomData {
height: 30px;
display: flex;
}
.table .right .header .bottomData__title {
font-size: 12px;
font-weight: 600;
color: #1a1a1a;
border: 1px solid #d5d5d5;
width: 100px;
min-width: 100px;
padding: 9px;
text-align: left;
}
.pos-rel {
display: flex;
}
.selected {
background-color: #f7f9fa;
border-bottom: 2px solid #dce2e6;
border-top: 2px solid #dce2e6;
border-left-color: transparent;
border-right-color: transparent;
}
.selected:first-of-type {
border-left-color: #dce2e6;
}
.body {
display: flex;
position: relative;
}
.bodyData {
background-color: #fff;
border: 1px solid #d5d5d5;
height: 100px;
width: 100px;
min-width: 100px;
}
.projectLabel {
position: relative;
margin-bottom: 5px;
display: block;
height: 25px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.projectLabel span {
color: #fff;
width: 100%;
display: block;
padding: 5px;
font-size: 12px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
position: relative;
}
.dayOff {
background: #f2f0eb 0% 0% no-repeat padding-box;
color: #27241d !important;
}
.today {
background-color: rgba(241, 229, 188, 0.5);
}
.scrollToToday {
background: #f2f0eb 0% 0% no-repeat padding-box;
border-radius: 4px;
border: 0;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
letter-spacing: 0px;
color: #27241d;
font-size: 14px;
line-height: 21px;
padding: 0 15px;
margin-bottom: 10px;
}
.ng-tooltip {
position: absolute;
max-width: 150px;
font-size: 14px;
text-align: center;
color: #f8f8f2;
padding: 3px 8px;
background: #282a36;
border-radius: 4px;
z-index: 1000;
opacity: 0;
}
.ng-tooltip:after {
content: '';
position: absolute;
border-style: solid;
}
.ng-tooltip-top:after {
top: 100%;
left: 50%;
margin-left: -5px;
border-width: 5px;
border-color: black transparent transparent transparent;
}
.ng-tooltip-bottom:after {
bottom: 100%;
left: 50%;
margin-left: -5px;
border-width: 5px;
border-color: transparent transparent black transparent;
}
.ng-tooltip-left:after {
top: 50%;
left: 100%;
margin-top: -5px;
border-width: 5px;
border-color: transparent transparent transparent black;
}
.ng-tooltip-right:after {
top: 50%;
right: 100%;
margin-top: -5px;
border-width: 5px;
border-color: transparent black transparent transparent;
}
.ng-tooltip-show {
opacity: 1;
}
.my-menu {
background-color: #fff;
border: 1px solid rosybrown;
padding: 20px;
}
.user-menu {
background-color: #fafafa;
padding: 4pt;
font-size: 10pt;
z-index: 1000;
box-shadow: 0 0 12pt rgba(0, 0, 0, 0.25);
border-radius: 4pt;
padding: 0.5em 0 0.5em 0;
animation: fadeIn 0.1s ease-out;
opacity: 1;
display: block;
}
.user-menu hr {
border: none;
border-bottom: 1px solid #eee;
}
.user-menu div {
cursor: pointer;
display: block;
text-decoration: none;
color: #333;
padding: 0.5em 2em 0.5em 0.75em;
max-width: 18em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.user-menu div:hover {
background-color: #333;
color: #fff;
}
.user-menu div::before {
content: '';
float: left;
margin-right: 0.75em;
width: 0.5em;
height: 1em;
display: inline-block;
}
/* Animatinons */
@-webkit-keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@-webkit-keyframes fadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
@keyframes fadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
.is-fadingIn {
-webkit-animation: fadeIn 0.1s ease-out;
animation: fadeIn 0.1s ease-out;
opacity: 1;
display: block;
}
.is-fadingOut {
-webkit-animation: fadeOut 0.1s ease-out;
animation: fadeOut 0.1s ease-out;
opacity: 0;
display: block;
}
`]
}] }
];
/** @nocollapse */
SchedulerComponent.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [USER_OPTIONS,] }] },
{ type: ElementRef },
{ type: Overlay },
{ type: ViewContainerRef }
];
SchedulerComponent.propDecorators = {
container: [{ type: ViewChild, args: ['container', { static: true },] }],
userMenu: [{ type: ViewChild, args: ['userMenu', { static: true },] }],
selections: [{ type: ViewChildren, args: ['selectionDiv',] }],
persons: [{ type: Input }],
showBy: [{ type: Input }],
delay: [{ type: Input }],
dayOffLabel: [{ type: Input }],
todayButtonLabel: [{ type: Input }],
placement: [{ type: Input }],
finishedSelecting: [{ type: Output }],
editInfo: [{ type: Output }],
excludedDay: [{ type: Output }],
includedDay: [{ type: Output }]
};
if (false) {
/** @type {?} */
SchedulerComponent.prototype.days;
/** @type {?} */
SchedulerComponent.prototype.isSelecting;
/** @type {?} */
SchedulerComponent.prototype.startDay;
/** @type {?} */
SchedulerComponent.prototype.startUser;
/** @type {?} */
SchedulerComponent.prototype.sub;
/** @type {?} */
SchedulerComponent.prototype.overlayRef;
/** @type {?} */
SchedulerComponent.prototype.container;
/** @type {?} */
SchedulerComponent.prototype.userMenu;
/** @type {?} */
SchedulerComponent.prototype.selections;
/** @type {?} */
SchedulerComponent.prototype.persons;
/** @type {?} */
SchedulerComponent.prototype.showBy;
/** @type {?} */
SchedulerComponent.prototype.delay;
/** @type {?} */
SchedulerComponent.prototype.dayOffLabel;
/** @type {?} */
SchedulerComponent.prototype.todayButtonLabel;
/** @type {?} */
SchedulerComponent.prototype.placement;
/** @type {?} */
SchedulerComponent.prototype.finishedSelecting;
/** @type {?} */
SchedulerComponent.prototype.editInfo;
/** @type {?} */
SchedulerComponent.prototype.excludedDay;
/** @type {?} */
SchedulerComponent.prototype.includedDay;
/** @type {?} */
SchedulerComponent.prototype.libConfig;
/**
* @type {?}
* @private
*/
SchedulerComponent.prototype.elementRef;
/** @type {?} */
SchedulerComponent.prototype.overlay;
/** @type {?} */
SchedulerComponent.prototype.viewContainerRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXItc2NoZWR1bGUvIiwic291cmNlcyI6WyJsaWIvc2NoZWR1bGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULHVCQUF1QixFQUV2QixNQUFNLEVBR04sV0FBVyxFQUNYLGdCQUFnQixHQUNoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBcWM5QyxNQUFNLE9BQU8sa0JBQWtCOzs7Ozs7O0lBcUI5QixZQUM4QixTQUFvQixFQUN6QyxVQUFzQixFQUN2QixPQUFnQixFQUNoQixnQkFBa0M7UUFIWixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3pDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdkIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBdkIxQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQWNWLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc1JDO2FBR0Y7Ozs7NENBdUJFLE1BQU0sU0FBQyxZQUFZO1lBN2VyQixVQUFVO1lBZ0JVLE9BQU87WUFKM0IsZ0JBQWdCOzs7d0JBa2RmLFNBQVMsU0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO3VCQUN2QyxTQUFTLFNBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTt5QkFDdEMsWUFBWSxTQUFDLGNBQWM7c0JBQzNCLEtBQUs7cUJBQ0wsS0FBSztvQkFDTCxLQUFLOzBCQUNMLEtBQUs7K0JBQ0wsS0FBSzt3QkFDTCxLQUFLO2dDQUNMLE1BQU07dUJBQ04sTUFBTTswQkFDTixNQUFNOzBCQUNOLE1BQU07Ozs7SUFsQlAsa0NBQVk7O0lBQ1oseUNBQW9COztJQUNwQixzQ0FBZTs7SUFDZix1Q0FBa0I7O0lBQ2xCLGlDQUFrQjs7SUFDbEIsd0NBQThCOztJQUM5Qix1Q0FBZ0U7O0lBQ2hFLHNDQUFvRTs7SUFDcEUsd0NBQXlEOztJQUN6RCxxQ0FBMkI7O0lBQzNCLG9DQUFpQzs7SUFDakMsbUNBQXVCOztJQUN2Qix5Q0FBNkI7O0lBQzdCLDhDQUFrQzs7SUFDbEMsdUNBQXVDOztJQUN2QywrQ0FBaUQ7O0lBQ2pELHNDQUF3Qzs7SUFDeEMseUNBQTJDOztJQUMzQyx5Q0FBMkM7O0lBRzFDLHVDQUFpRDs7Ozs7SUFDakQsd0NBQThCOztJQUM5QixxQ0FBdUI7O0lBQ3ZCLDhDQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0T25Jbml0LFxuXHRWaWV3Q2hpbGQsXG5cdEVsZW1lbnRSZWYsXG5cdElucHV0LFxuXHRPdXRwdXQsXG5cdEV2ZW50RW1pdHRlcixcblx0Vmlld0NoaWxkcmVuLFxuXHRRdWVyeUxpc3QsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRBZnRlclZpZXdJbml0LFxuXHRJbmplY3QsXG5cdE9uQ2hhbmdlcyxcblx0U2ltcGxlQ2hhbmdlcyxcblx0VGVtcGxhdGVSZWYsXG5cdFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVVNFUl9PUFRJT05TIH0gZnJvbSAnLi9saWIuY29uZmlnLnRva2VuJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPdmVybGF5UmVmLCBPdmVybGF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IHRha2UsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERheSwgUGVyc29uLCBTaG93QnksIFBsYWNlbWVudCwgTGliQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd4LXNjaGVkdWxlcicsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGJ1dHRvblxuXHRcdFx0Km5nSWY9XCJsaWJDb25maWc/LnNob3dUb2RheVwiXG5cdFx0XHRjbGFzcz1cInNjcm9sbFRvVG9kYXlcIlxuXHRcdFx0KGNsaWNrKT1cInNjcm9sbFRvVG9kYXkoKVwiXG5cdFx0PlxuXHRcdFx0e3sgdG9kYXlCdXR0b25MYWJlbCB8fCAnVG9kYXknIH19XG5cdFx0PC9idXR0b24+XG5cdFx0PGRpdiBjbGFzcz1cInRhYmxlXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwibGVmdFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XG5cdFx0XHRcdDxkaXZcblx0XHRcdFx0XHQqbmdGb3I9XCJsZXQgcGVyc29uIG9mIHBlcnNvbnM7IHRyYWNrQnk6IHRyYWNrUGVyc29uc1wiXG5cdFx0XHRcdFx0W25nU3R5bGVdPVwie1xuXHRcdFx0XHRcdFx0aGVpZ2h0OlxuXHRcdFx0XHRcdFx0XHRwZXJzb24uZGF0YS5sZW5ndGggKiAzMCA+PSA2MFxuXHRcdFx0XHRcdFx0XHRcdD8gKHBlcnNvbj8uZGF0YS5sZW5ndGggKyAzKSAqIDMwICsgJ3B4J1xuXHRcdFx0XHRcdFx0XHRcdDogJzEwMHB4J1xuXHRcdFx0XHRcdH1cIlxuXHRcdFx0XHRcdGNsYXNzPVwid2hvXCJcblx0XHRcdFx0PlxuXHRcdFx0XHRcdDxzdHJvbmc+e3sgcGVyc29uPy5uYW1lIH19PC9zdHJvbmc+XG5cdFx0XHRcdFx0PGJyIC8+XG5cdFx0XHRcdFx0PHNtYWxsIFtpbm5lclRleHRdPVwicGVyc29uPy5kZXBhcnRtZW50cyB8fCAnJ1wiPjwvc21hbGw+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2ICNjb250YWluZXIgY2xhc3M9XCJyaWdodFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG5cdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IGRheSBvZiBkYXlzOyB0cmFja0J5OiB0cmFja01vbnRoc1wiXG5cdFx0XHRcdFx0XHRjbGFzcz1cImhlYWRlckRhdGFcIlxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0b3BEYXRhXCI+XG5cdFx0XHRcdFx0XHRcdDxzdHJvbmdcblx0XHRcdFx0XHRcdFx0XHQ+e3tcblx0XHRcdFx0XHRcdFx0XHRcdHNob3dCeSA9PT0gJ2RheSdcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAoZGF5Lm1vbnRoIHwgZGF0ZTogJ01NTSB5eXl5Jylcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiAoZGF5Lm1vbnRoIHwgZGF0ZTogJ3l5eXknKVxuXHRcdFx0XHRcdFx0XHRcdH19XG5cdFx0XHRcdFx0XHRcdDwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYm90dG9tRGF0YVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJib3R0b21EYXRhX190aXRsZVwiXG5cdFx0XHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHdlZWtkYXkgb2YgZGF5Py53ZWVrRGF5czsgdHJhY2tCeTogdHJhY2tEYXlzXCJcblx0XHRcdFx0XHRcdFx0XHRbY2xhc3MudG9kYXldPVwiaXNUb2RheSh3ZWVrZGF5KVwiXG5cdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHQ8c3Ryb25nPnt7XG5cdFx0XHRcdFx0XHRcdFx0XHRzaG93QnkgPT09ICdkYXknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD8gKHdlZWtkYXkgfCBkYXRlOiAnZGQgRUVFJylcblx0XHRcdFx0XHRcdFx0XHRcdFx0OiAod2Vla2RheSB8IGRhdGU6ICdNTU1NJylcblx0XHRcdFx0XHRcdFx0XHR9fTwvc3Ryb25nPlxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdj5cblx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRjbGFzcz1cInBvcy1yZWxcIlxuXHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHBlcnNvbiBvZiBwZXJzb25zOyBsZXQgaSA9IGluZGV4OyB0cmFja0J5OiB0cmFja1BlcnNvbnNcIlxuXHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzOyB0cmFja0J5OiB0cmFja01vbnRoc1wiIGNsYXNzPVwiYm9keVwiPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJib2R5RGF0YVwiXG5cdFx0XHRcdFx0XHRcdFx0W25nU3R5bGVdPVwie1xuXHRcdFx0XHRcdFx0XHRcdFx0aGVpZ2h0OlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwZXJzb24/LmRhdGEubGVuZ3RoICogMzAgPj0gNjBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ/IChwZXJzb24/LmRhdGEubGVuZ3RoICsgMykgKiAzMCArICdweCdcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6ICcxMDBweCcsXG5cdFx0XHRcdFx0XHRcdFx0XHQnYmFja2dyb3VuZC1jb2xvcic6IGlzVG9kYXkod2Vla2RheSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0PyAncmdiYSgyNDEsIDIyOSwgMTg4LCAuNSknXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDogJyNmZmYnXG5cdFx0XHRcdFx0XHRcdFx0fVwiXG5cdFx0XHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHdlZWtkYXkgb2YgZGF5Py53ZWVrRGF5czsgdHJhY2tCeTogdHJhY2tEYXlzXCJcblx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdDxsYWJlbFxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJwcm9qZWN0TGFiZWxcIlxuXHRcdFx0XHRcdFx0XHRcdFx0Km5nRm9yPVwibGV0IHByb2plY3Qgb2YgcGVyc29uPy5kYXRhOyB0cmFja0J5OiB0cmFja0RhdGFcIlxuXHRcdFx0XHRcdFx0XHRcdD5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChjb250ZXh0bWVudSk9XCJvcGVuKCRldmVudCwgcGVyc29uLmlkLCBwcm9qZWN0LCB3ZWVrZGF5KVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtzaG93VG9vbHRpcF09XCJsaWJDb25maWc/LnNob3dUb29sdGlwXCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0W3Rvb2x0aXBdPVwicHJvamVjdD8uZGVzY3JpcHRpb24gfHwgJydcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRbcGxhY2VtZW50XT1cInBsYWNlbWVudFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtkZWxheV09XCJkZWxheVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZENvbG9yOiBwcm9qZWN0Py5jb2xvciB9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Km5nSWY9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoY2FsY3VsYXRlRnJvbVRvKHByb2plY3Q/LmZyb20sIHByb2plY3Q/LnRvLCB3ZWVrZGF5KSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IXByb2plY3Q/LmV4Y2x1ZGVEYXlzLmluY2x1ZGVzKHdlZWtkYXkpKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2plY3Q/LmluY2x1ZGVEYXlzLmluY2x1ZGVzKHdlZWtkYXkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChjbGljayk9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRlZGl0SW5mby5lbWl0KHsgcGVyc29uOiBwZXJzb24/LmlkLCBwcm9qZWN0OiBwcm9qZWN0IH0pXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFwiXG5cdFx0XHRcdFx0XHRcdFx0XHRcdD57eyBwcm9qZWN0Py5uYW1lIH19IHt7IHByb2plY3Q/LmhvdXJzIH19PC9zcGFuXG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cblx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdChjb250ZXh0bWVudSk9XCJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvcGVuKCRldmVudCwgcGVyc29uLmlkLCBwcm9qZWN0LCB3ZWVrZGF5KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkZXZlbnQucHJldmVudERlZmF1bHQoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQqbmdJZj1cIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdChpc0RheU9mZihwcm9qZWN0Py5mcm9tLCBwcm9qZWN0Py50bywgd2Vla2RheSkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCFwcm9qZWN0Py5pbmNsdWRlRGF5cy5pbmNsdWRlcyh3ZWVrZGF5KSkgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9qZWN0Py5leGNsdWRlRGF5cy5pbmNsdWRlcyh3ZWVrZGF5KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjbGFzcz1cImRheU9mZlwiXG5cdFx0XHRcdFx0XHRcdFx0XHQ+XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHt7IGRheU9mZkxhYmVsIHx8ICdEYXkgb2ZmJyB9fTwvc3BhblxuXHRcdFx0XHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0XHRcdDwvbGFiZWw+XG5cdFx0XHRcdFx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0I3NlbGVjdGlvbkRpdlxuXHRcdFx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJzZWxlY3Rpb25EaXZcIlxuXHRcdFx0XHRcdFx0XHRcdFx0KG1vdXNlZG93bik9XCJzdGFydFNlbGVjdCgkZXZlbnQsIHdlZWtkYXksIHBlcnNvbj8uaWQpXCJcblx0XHRcdFx0XHRcdFx0XHRcdChtb3VzZWVudGVyKT1cImVudGVyKCRldmVudClcIlxuXHRcdFx0XHRcdFx0XHRcdFx0KG1vdXNlbW92ZSk9XCJyZUNhbGMoJGV2ZW50KVwiXG5cdFx0XHRcdFx0XHRcdFx0XHQobW91c2V1cCk9XCJlbmRTZWxlY3QoJGV2ZW50LCB3ZWVrZGF5LCBwZXJzb24/LmlkKVwiXG5cdFx0XHRcdFx0XHRcdFx0XHRbbmdTdHlsZV09XCJ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpZHRoOiAnMTAwJScsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhlaWdodDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwZXJzb24uZGF0YS5sZW5ndGggKiAzMCA+PSA2MFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PyAocGVyc29uPy5kYXRhLmxlbmd0aCArIDMpICogMzAgLVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICBwZXJzb24/LmRhdGEubGVuZ3RoICogMzAgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICAncHgnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ6IDEwMCAtIHBlcnNvbj8uZGF0YS5sZW5ndGggKiAzMCArICdweCdcblx0XHRcdFx0XHRcdFx0XHRcdH1cIlxuXHRcdFx0XHRcdFx0XHRcdD48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblxuXHRcdDxuZy10ZW1wbGF0ZSAjdXNlck1lbnUgbGV0LWRhdGE+XG5cdFx0XHQ8c2VjdGlvbiBjbGFzcz1cInVzZXItbWVudVwiPlxuXHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0Km5nSWY9XCJcblx0XHRcdFx0XHRcdChjYWxjdWxhdGVGcm9tVG8oXG5cdFx0XHRcdFx0XHRcdGRhdGE/LnByb2plY3Q/LmZyb20sXG5cdFx0XHRcdFx0XHRcdGRhdGE/LnByb2plY3Q/LnRvLFxuXHRcdFx0XHRcdFx0XHRkYXRhPy53ZWVrZGF5XG5cdFx0XHRcdFx0XHQpICYmXG5cdFx0XHRcdFx0XHRcdCFkYXRhPy5wcm9qZWN0Py5leGNsdWRlRGF5cy5pbmNsdWRlcyhkYXRhPy53ZWVrZGF5KSkgfHxcblx0XHRcdFx0XHRcdGRhdGE/LnByb2plY3Q/LmluY2x1ZGVEYXlzLmluY2x1ZGVzKGRhdGE/LndlZWtkYXkpXG5cdFx0XHRcdFx0XCJcblx0XHRcdFx0XHQoY2xpY2spPVwiZXhjbHVkZURheShkYXRhKVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHRFeGNsdWRlIGRheVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdlxuXHRcdFx0XHRcdCpuZ0lmPVwiXG5cdFx0XHRcdFx0XHQoaXNEYXlPZmYoZGF0YT8ucHJvamVjdD8uZnJvbSwgZGF0YT8ucHJvamVjdD8udG8sIGRhdGE/LndlZWtkYXkpICYmXG5cdFx0XHRcdFx0XHRcdCFkYXRhPy5wcm9qZWN0Py5pbmNsdWRlRGF5cy5pbmNsdWRlcyhkYXRhPy53ZWVrZGF5KSkgfHxcblx0XHRcdFx0XHRcdGRhdGE/LnByb2plY3Q/LmV4Y2x1ZGVEYXlzLmluY2x1ZGVzKGRhdGE/LndlZWtkYXkpXG5cdFx0XHRcdFx0XCJcblx0XHRcdFx0XHQoY2xpY2spPVwiaW5jbHVkZURheShkYXRhKVwiXG5cdFx0XHRcdD5cblx0XHRcdFx0XHRJbmNsdWRlIGRheVxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvc2VjdGlvbj5cblx0XHQ8L25nLXRlbXBsYXRlPlxuXHRgLFxuXHRzdHlsZXM6IFtcblx0XHRgXG5cdFx0XHQqIHtcblx0XHRcdFx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcblx0XHRcdFx0Ym9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcblx0XHRcdFx0LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0LW1vei11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0LW1zLXVzZXItc2VsZWN0OiBub25lO1xuXHRcdFx0XHR1c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdH1cblx0XHRcdC50YWJsZSB7XG5cdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG5cdFx0XHRcdGJvcmRlci1zcGFjaW5nOiAwO1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0fVxuXHRcdFx0LnRhYmxlIC5zcGFjZXIge1xuXHRcdFx0XHR3aWR0aDogMzAwcHg7XG5cdFx0XHRcdGhlaWdodDogNzBweDtcblx0XHRcdFx0Ym9yZGVyOiAxcHggc29saWQgI2Q1ZDVkNTtcblx0XHRcdH1cblx0XHRcdC50YWJsZSAud2hvIHtcblx0XHRcdFx0aGVpZ2h0OiAxMDBweDtcblx0XHRcdFx0cGFkZGluZzogOHB4IDE2cHg7XG5cdFx0XHRcdGJvcmRlcjogMXB4IHNvbGlkICNkNWQ1ZDU7XG5cdFx0XHRcdGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG5cdFx0XHR9XG5cdFx0XHQudGFibGUgLndobyBzdHJvbmcge1xuXHRcdFx0XHRmb250LXNpemU6IDE2cHg7XG5cdFx0XHRcdGNvbG9yOiAjMWExYTFhO1xuXHRcdFx0fVxuXG5cdFx0XHQudGFibGUgLnJpZ2h0IHtcblx0XHRcdFx0b3ZlcmZsb3cteDogYXV0bztcblx0XHRcdFx0b3ZlcmZsb3cteTogaGlkZGVuO1xuXHRcdFx0fVxuXHRcdFx0LnRhYmxlIC5yaWdodCAuaGVhZGVyIHtcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdH1cblx0XHRcdC50YWJsZSAucmlnaHQgLmhlYWRlciAudG9wRGF0YSB7XG5cdFx0XHRcdGhlaWdodDogNDBweDtcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdFx0YWxpZ24taXRlbXM6IGNlbnRlcjtcblx0XHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdFx0XHRcdGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkNWQ1ZDU7XG5cdFx0XHRcdGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2Q1ZDVkNTtcblx0XHRcdH1cblx0XHRcdC50YWJsZSAucmlnaHQgLmhlYWRlciAuYm90dG9tRGF0YSB7XG5cdFx0XHRcdGhlaWdodDogMzBweDtcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdH1cblx0XHRcdC50YWJsZSAucmlnaHQgLmhlYWRlciAuYm90dG9tRGF0YV9fdGl0bGUge1xuXHRcdFx0XHRmb250LXNpemU6IDEycHg7XG5cdFx0XHRcdGZvbnQtd2VpZ2h0OiA2MDA7XG5cdFx0XHRcdGNvbG9yOiAjMWExYTFhO1xuXHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1O1xuXHRcdFx0XHR3aWR0aDogMTAwcHg7XG5cdFx0XHRcdG1pbi13aWR0aDogMTAwcHg7XG5cdFx0XHRcdHBhZGRpbmc6IDlweDtcblx0XHRcdFx0dGV4dC1hbGlnbjogbGVmdDtcblx0XHRcdH1cblxuXHRcdFx0LnBvcy1yZWwge1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0fVxuXHRcdFx0LnNlbGVjdGVkIHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogI2Y3ZjlmYTtcblx0XHRcdFx0Ym9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNkY2UyZTY7XG5cdFx0XHRcdGJvcmRlci10b3A6IDJweCBzb2xpZCAjZGNlMmU2O1xuXHRcdFx0XHRib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0XHRcdGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XG5cdFx0XHR9XG5cdFx0XHQuc2VsZWN0ZWQ6Zmlyc3Qtb2YtdHlwZSB7XG5cdFx0XHRcdGJvcmRlci1sZWZ0LWNvbG9yOiAjZGNlMmU2O1xuXHRcdFx0fVxuXHRcdFx0LmJvZHkge1xuXHRcdFx0XHRkaXNwbGF5OiBmbGV4O1xuXHRcdFx0XHRwb3NpdGlvbjogcmVsYXRpdmU7XG5cdFx0XHR9XG5cdFx0XHQuYm9keURhdGEge1xuXHRcdFx0XHRiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuXHRcdFx0XHRib3JkZXI6IDFweCBzb2xpZCAjZDVkNWQ1O1xuXHRcdFx0XHRoZWlnaHQ6IDEwMHB4O1xuXHRcdFx0XHR3aWR0aDogMTAwcHg7XG5cdFx0XHRcdG1pbi13aWR0aDogMTAwcHg7XG5cdFx0XHR9XG5cdFx0XHQucHJvamVjdExhYmVsIHtcblx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0XHRtYXJnaW4tYm90dG9tOiA1cHg7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRoZWlnaHQ6IDI1cHg7XG5cdFx0XHRcdC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG5cdFx0XHRcdC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG5cdFx0XHRcdC1tcy11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0dXNlci1zZWxlY3Q6IG5vbmU7XG5cdFx0XHR9XG5cdFx0XHQucHJvamVjdExhYmVsIHNwYW4ge1xuXHRcdFx0XHRjb2xvcjogI2ZmZjtcblx0XHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRcdGRpc3BsYXk6IGJsb2NrO1xuXHRcdFx0XHRwYWRkaW5nOiA1cHg7XG5cdFx0XHRcdGZvbnQtc2l6ZTogMTJweDtcblx0XHRcdFx0LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0LW1vei11c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0LW1zLXVzZXItc2VsZWN0OiBub25lO1xuXHRcdFx0XHR1c2VyLXNlbGVjdDogbm9uZTtcblx0XHRcdFx0cG9zaXRpb246IHJlbGF0aXZlO1xuXHRcdFx0fVxuXHRcdFx0LmRheU9mZiB7XG5cdFx0XHRcdGJhY2tncm91bmQ6ICNmMmYwZWIgMCUgMCUgbm8tcmVwZWF0IHBhZGRpbmctYm94O1xuXHRcdFx0XHRjb2xvcjogIzI3MjQxZCAhaW1wb3J0YW50O1xuXHRcdFx0fVxuXHRcdFx0LnRvZGF5IHtcblx0XHRcdFx0YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNDEsIDIyOSwgMTg4LCAwLjUpO1xuXHRcdFx0fVxuXHRcdFx0LnNjcm9sbFRvVG9kYXkge1xuXHRcdFx0XHRiYWNrZ3JvdW5kOiAjZjJmMGViIDAlIDAlIG5vLXJlcGVhdCBwYWRkaW5nLWJveDtcblx0XHRcdFx0Ym9yZGVyLXJhZGl1czogNHB4O1xuXHRcdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRcdGhlaWdodDogMzZweDtcblx0XHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdFx0YWxpZ24taXRlbXM6I