ngx-month-picker-range
Version:
Esta libreria fue generada con [Angular CLI](https://github.com/angular/angular-cli) version 8.2.9.
647 lines (624 loc) • 67.1 kB
JavaScript
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, Renderer2, ViewChild } from '@angular/core';
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
import { DomHandler } from './domhandler';
export class NgxMonthPickerComponent {
constructor(renderer, cd, elem) {
this.renderer = renderer;
this.cd = cd;
this.elem = elem;
this.mode = 'single' || 'range';
this.inputContainerClass = "calendar-input-container";
this.inputValueClass = "calendar-input-value";
this.calendarContainerClass = "calendar-ui";
this.monthItemClass = "monthItem";
this.edgeClass = "isEdge";
this.notYearClass = "notCurrentYear";
this.inRangeClass = "inRange";
this.lowerEdgeClass = "isLowerEdge";
this.upperEdgeClass = "upperEdgeClass";
this.cleanBtnClass = "clean-btn";
this.acceptBtnClass = "accept-btn";
this.locale = "es-MX";
//@Input('appendTo')
this.appendTo = "body";
this.monthRangeSelected = new EventEmitter();
this.tabindex = 0;
this.onChange = (_) => { };
this.onTouched = () => { };
this.onModelTouched = () => { };
if (!this.placeholder)
this.placeholder = 'Seleccionar...';
}
blurHandler() {
this.focused = false;
this.itemFocused = -1;
this.onTouched();
}
focusHandler() {
this.focused = true;
}
set value(val) {
this._Value = val;
}
get value() {
return this._Value;
}
set itemFocused(val) {
this._itemFocused = val;
}
get itemFocused() {
return this._itemFocused;
}
ngOnInit() {
this.initCalendar();
this.cd.detectChanges();
}
initCalendar() {
this.initYearLabels();
this.initMonthLabels();
this.initViewSlices();
this.initMonthsData();
this.initRangeIndexes();
if (this.value) {
if (!this.value['start']) {
this.currentYearIndex = this.years.findIndex(year => year === this.value.getFullYear());
}
else {
this.currentYearIndex = this.years.findIndex(year => year === this.value['start'].getFullYear());
}
}
else {
this.currentYearIndex = this.years.findIndex(year => year === (new Date()).getFullYear());
}
this.sliceDataIntoView();
}
ngOnChanges(simpleChange) {
if (simpleChange.value) {
this.value = simpleChange.value.currentValue;
}
if (simpleChange.mode) {
this.mode = simpleChange.mode.currentValue;
}
if (simpleChange.placeholder) {
this.placeholder = simpleChange.placeholder.currentValue;
}
if (simpleChange.acceptBtnClass)
this.acceptBtnClass = simpleChange.acceptBtnClass.currentValue;
}
ngAfterContentInit() {
this.renderer.listen(this.elem.nativeElement, "keydown", ($event) => onKeydown($event, this));
}
ngOnDestroy() {
if (this.isOpen) {
this.onShowCalendar();
}
this.renderer.listen(this.elem.nativeElement, "keydown", null);
}
onShowCalendar(event) {
if (this.disabled)
return;
if (event) {
event.stopPropagation();
}
if (!this.isOpen) {
this.show(event);
}
else {
this.hide(event);
}
}
show(event) {
if (event) {
event.stopPropagation();
}
this.initCalendar();
this.isOpen = true;
const selectedStyles = document.querySelectorAll('.calendar-input-container');
selectedStyles.forEach(element => {
if (element.getAttribute('class').includes('active')) {
this.renderer.removeClass(element, 'active');
}
});
const selectedOptions = document.querySelectorAll('.calendar-ui');
selectedOptions.forEach(element => {
this.renderer.setStyle(element, 'display', 'none');
});
this.renderer.addClass(this.calendarInputContainer.nativeElement, 'active');
this.appendOverlay();
this.alignOverlay();
this.renderer.setStyle(this.calendarUI.nativeElement, 'display', 'block');
}
hide(event) {
if (event) {
event.stopPropagation();
}
this.isOpen = false;
this.renderer.removeClass(this.calendarInputContainer.nativeElement, 'active');
this.renderer.setStyle(this.calendarUI.nativeElement, 'display', 'none');
this.restoreOverlayAppend();
}
appendOverlay() {
if (this.appendTo) {
if (this.appendTo === 'body')
document.body.appendChild(this.calendarUI.nativeElement);
else
DomHandler.appendChild(this.calendarUI, this.appendTo);
}
//this.calendarUI.nativeElement.style.width = DomHandler.getWidth(this.containerViewChild.nativeElement) + 'px';
}
restoreOverlayAppend() {
if (this.calendarUI) {
if (this.appendTo) {
this.elem.nativeElement.appendChild(this.calendarUI.nativeElement);
}
}
}
alignOverlay() {
if (this.calendarUI) {
if (this.appendTo)
DomHandler.absolutePosition(this.calendarUI.nativeElement, this.containerViewChild.nativeElement);
else
DomHandler.relativePosition(this.calendarUI.nativeElement, this.containerViewChild.nativeElement);
}
}
onClick(indexClicked) {
if (this.mode === 'single') {
this.rangeIndexes[0] = this.globalIndexOffset + indexClicked;
let fromMonthYear = this.monthsData[this.rangeIndexes[0]];
let initDate = new Date(fromMonthYear.monthYear, fromMonthYear.month, 1);
this.value = initDate;
return;
}
if (this.rangeIndexes[0] !== null && this.rangeIndexes[1] !== null) {
this.clearData();
}
if (this.rangeIndexes[0] === null) {
this.rangeIndexes[0] = this.globalIndexOffset + indexClicked;
}
else if (this.rangeIndexes[1] === null) {
this.rangeIndexes[1] = this.globalIndexOffset + indexClicked;
this.paintRange();
let fromMonthYear = this.monthsData[this.rangeIndexes[0]];
let toMonthYear = this.monthsData[this.rangeIndexes[1]];
let initDate = new Date(fromMonthYear.monthYear, fromMonthYear.month, 1);
let endDate = new Date(toMonthYear.monthYear, toMonthYear.month + 1, 0);
this.value = { start: initDate, end: endDate };
}
else {
this.initRangeIndexes();
this.initMonthsData();
this.onClick(indexClicked);
this.sliceDataIntoView();
}
;
}
;
paintRange() {
this.rangeIndexes.sort((a, b) => a - b);
this.monthsData.forEach((month, index) => {
if ((this.rangeIndexes[0] <= index) && (index <= this.rangeIndexes[1])) {
month.isInRange = true;
}
;
if (this.rangeIndexes[0] === index) {
month.isLowerEdge = true;
}
;
if (this.rangeIndexes[1] === index) {
month.isUpperEdge = true;
}
;
});
}
emitData() {
this.isClosing = true;
this.updateChanges();
this.onTouched();
this.monthRangeSelected.emit(this.value);
this.hide();
}
;
sliceDataIntoView() {
this.globalIndexOffset = this.monthViewSlicesIndexes[this.currentYearIndex];
this.monthDataSlice = this.monthsData.slice(this.globalIndexOffset, this.globalIndexOffset + 24);
}
;
incrementYear() {
if (this.currentYearIndex !== this.years.length - 1) {
this.currentYearIndex++;
this.sliceDataIntoView();
}
;
}
;
decrementYear() {
if (this.currentYearIndex !== 0) {
this.currentYearIndex--;
this.sliceDataIntoView();
}
;
}
;
initRangeIndexes() {
if (this.value) {
this.rangeIndexes = [];
if (this.value['start']) {
this.rangeIndexes.push(this.monthsData.findIndex((v, i) => (v.month === this.value['start'].getMonth() && v.monthYear === this.value['start'].getFullYear())));
if (this.value['end'])
this.rangeIndexes.push(this.monthsData.findIndex((v, i) => (v.month === this.value['end'].getMonth() && v.monthYear === this.value['end'].getFullYear())));
this.paintRange();
}
else {
this.rangeIndexes.push(this.monthsData.findIndex((v, i) => (v.month === this.value.getMonth() && v.monthYear === this.value.getFullYear())));
}
}
else
this.rangeIndexes = [null, null];
}
;
initMonthsData() {
this.monthsData = new Array();
this.years.forEach(year => {
this.months.forEach((month, i) => {
this.monthsData.push({
monthName: month,
month: i,
monthYear: year,
isInRange: false,
isLowerEdge: false,
isUpperEdge: false
});
});
});
}
;
initYearLabels() {
const currentYear = (new Date()).getFullYear();
const range = (start, stop, step) => Array.from({ length: (stop - start) / step + 1 }, (_, i) => start + (i * step));
this.years = range(this.firstYear ? this.firstYear : (currentYear - 5), this.lastYear ? this.lastYear : (currentYear + 5), 1);
}
;
initMonthLabels() {
this.months = new Array(12).fill(0).map((_, i) => {
//console.log(new Date(`${i + 1}/1/1`).toLocaleDateString(this.locale, { month: 'short' }));
return new Date(`${i + 1}/1/1`).toLocaleDateString(this.locale, { month: 'short' });
});
}
;
initViewSlices() {
this.monthViewSlicesIndexes = [];
this.years.forEach((year, index) => {
if (index === 0) {
this.monthViewSlicesIndexes.push(0);
}
else if (index === 1) {
this.monthViewSlicesIndexes.push(6);
}
else
this.monthViewSlicesIndexes.push(this.monthViewSlicesIndexes[index - 1] + 12);
});
}
get valueText() {
let text = "";
let fromMonthYear = this.monthsData[this.rangeIndexes[0]];
let toMonthYear = this.monthsData[this.rangeIndexes[1]];
if (this.mode === 'single') {
if (fromMonthYear) {
text += `${fromMonthYear.monthName}, ${fromMonthYear.monthYear}`;
}
}
else if (fromMonthYear && toMonthYear) {
if (fromMonthYear.monthYear === toMonthYear.monthYear) {
if (fromMonthYear.monthName !== toMonthYear.monthName) {
text += `${fromMonthYear.monthName} - ${toMonthYear.monthName}, ${fromMonthYear.monthYear}`;
}
else {
text += `${fromMonthYear.monthName}, ${fromMonthYear.monthYear}`;
}
}
else {
text += `${fromMonthYear.monthName}, ${fromMonthYear.monthYear} - ${toMonthYear.monthName}, ${toMonthYear.monthYear}`;
}
}
if (text === '') {
text = this.placeholder ? this.placeholder : "Seleccionar...";
}
return text;
}
clearData() {
this.value = undefined;
this.updateChanges();
this.ngOnInit();
}
validate({ value }) {
const isNotValid = this.isRequired && this.value == undefined;
return isNotValid && {
invalid: true
};
}
updateChanges() {
this.onChange(this.value);
}
writeValue(value) {
this.value = value;
this.updateChanges();
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(val) {
this.disabled = val;
}
setReadOnlyState(val) {
this.isReadOnly = val;
}
}
NgxMonthPickerComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-month-picker',
template: `
<div class="calendar-widget" #select>
<div [ngClass]="inputContainerClass" (click)="onShowCalendar($event)" role="listbox" #calendarInputContainer [title]="valueText">
<span [ngClass]="inputValueClass">{{valueText}}</span>
</div>
<div [ngClass]="calendarContainerClass" #calendarUI style="display: none;">
<div class="outerCard">
<div class="topPanel">
<button class="prevYearButton" (click)="decrementYear()">
<i class="arrow arrow-left"></i>
</button>
<span class="yearLabel">{{ years[currentYearIndex] }}</span>
<button class="nextYearButton" (click)="incrementYear()">
<i class="arrow arrow-right"></i>
</button>
</div>
<div class="contentPanel" #calendarContent>
<div (click)="onClick(i)" *ngFor="let month of monthDataSlice; let i = index" [ngClass]="[monthItemClass,
(rangeIndexes[0]===globalIndexOffset+i || rangeIndexes[1]===globalIndexOffset+i) ? edgeClass: '',
(currentYearIndex===0? i > 11:(i < 6 || i > 17)) ? notYearClass : '']">
<div [id]="i" class="monthItemHighlight" [ngClass]="[ month.isInRange ? inRangeClass : '',
month.isLowerEdge ? lowerEdgeClass : '', month.isUpperEdge ? upperEdgeClass : '' ]">
{{ month.monthName }}
</div>
</div>
</div>
<div class="footerPanel">
<a id="cleanBtn" href="javascript:void(0)" [ngClass]="cleanBtnClass" (click)="clearData()">
Limpiar
</a>
<a id="acceptBtn" href="javascript:void(0)" [ngClass]="acceptBtnClass" (click)="emitData()">
Aceptar
</a>
</div>
</div>
</div>
</div>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NgxMonthPickerComponent),
multi: true
},
{
provide: NG_VALIDATORS,
useExisting: NgxMonthPickerComponent,
multi: true
}
],
styles: [`
.calendar-ui {
z-index: 1003;
width: 350px;
background-color: white;
}
.calendar-input-container {
background: #F5F5F6 !important;
border: solid 1px #C2D1D9 !important;
color: #A8B0BA !important;
font-family: "open_sansitalic", sans-serif !important;
line-height: 17px;
min-height: 48px;
display: flex;
align-items: center;
border-radius: 3px;
width: 100%;
font-size: 16px;
letter-spacing: 0;
}
.calendar-input-value {
padding-left: 10px;
padding-right: 10px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.outerCard {
touch-action: none;
overflow: hidden;
width: inherit;
/*height: 350px;*/
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
}
.topPanel {
width: inherit;
height: 44px;
text-align: center;
line-height: 64px;
}
.prevYearButton {
float: left;
}
.nextYearButton {
float: right;
}
button {
width: 64px;
height: 64px;
background: none;
border: none;
margin: 0;
padding: 0;
cursor: pointer;
}
button:focus {
outline: 0;
}
i {
border: solid black;
border-width: 0 3px 3px 0;
display: inline-block;
padding: 6px;
}
.arrow-right {
transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
}
.arrow-left {
transform: rotate(135deg);
-webkit-transform: rotate(135deg);
}
.topPanel.yearLabel {
display: inline-block;
margin: 0 auto;
}
.contentPanel {
padding: 32px 6px;
}
.footerPanel {
display: flex;
}
.monthItem {
display: inline-block;
height: 54px;
width: 54px;
cursor: pointer;
text-align: center;
line-height: 54px;
margin-top: 1px;
margin-bottom: 1px;
}
.monthItem:hover {
border-radius: 100%;
background-color: #F5F5F6;
color: #A8B0BA;
}
.isEdge {
border-radius: 100%;
background-color: #1474a4;
color: white;
}
.inRange {
background-color: #1474a4;
opacity: 0.5;
color: white;
}
.isLowerEdge {
background-color: none;
background: linear-gradient(to right, transparent 50%, #1474a4 50%);
}
.isUpperEdge {
background-color: none;
background: linear-gradient(to right, #1474a4 50%, transparent 50%);
}
.notCurrentYear {
color: #c4cbd6;
}
.clean-btn {
text-decoration: none;
width: 50%;
display: inline-block;
font-weight: 400;
color: #A8B0BA;
background-color: #F5F5F6;
text-align: center;
vertical-align: middle;
user-select: none;
border: 1px solid transparent;
padding: .375rem .75rem;
font-size: 1rem;
line-height: 1.5;
}
.accept-btn {
text-decoration: none;
width: 50%;
display: inline-block;
font-weight: 400;
text-align: center;
vertical-align: middle;
user-select: none;
border: 1px solid transparent;
padding: .375rem .75rem;
font-size: 1rem;
line-height: 1.5;
color: white;
background-color: #1474a4;
}
`]
},] }
];
NgxMonthPickerComponent.ctorParameters = () => [
{ type: Renderer2 },
{ type: ChangeDetectorRef },
{ type: ElementRef }
];
NgxMonthPickerComponent.propDecorators = {
placeholder: [{ type: Input, args: ['placeholder',] }],
isRequired: [{ type: Input, args: ['required',] }],
disabled: [{ type: Input, args: ['disabled',] }],
isReadOnly: [{ type: Input, args: ['readonly',] }],
mode: [{ type: Input, args: ['mode',] }],
firstYear: [{ type: Input, args: ['firstYear',] }],
lastYear: [{ type: Input, args: ['lastYear',] }],
inputContainerClass: [{ type: Input, args: ['inputContainerClass',] }],
inputValueClass: [{ type: Input, args: ['inputValueClass',] }],
calendarContainerClass: [{ type: Input, args: ['inputValueClass',] }],
monthItemClass: [{ type: Input, args: ['monthItemClass',] }],
edgeClass: [{ type: Input, args: ['edgeClass',] }],
notYearClass: [{ type: Input, args: ['notYearClass',] }],
inRangeClass: [{ type: Input, args: ['inRangeClass',] }],
lowerEdgeClass: [{ type: Input, args: ['lowerEdgeClass',] }],
upperEdgeClass: [{ type: Input, args: ['upperEdgeClass',] }],
cleanBtnClass: [{ type: Input, args: ['cleanBtnClass',] }],
acceptBtnClass: [{ type: Input, args: ['acceptBtnClass',] }],
locale: [{ type: Input, args: ['locale',] }],
calendarInputContainer: [{ type: ViewChild, args: ["calendarInputContainer", { static: false },] }],
calendarUI: [{ type: ViewChild, args: ["calendarUI", { static: false },] }],
calendarContent: [{ type: ViewChild, args: ["calendarContent", { static: false },] }],
containerViewChild: [{ type: ViewChild, args: ["select", { static: false },] }],
monthRangeSelected: [{ type: Output }],
tabindex: [{ type: HostBinding, args: ['tabindex',] }],
blurHandler: [{ type: HostListener, args: ['blur',] }],
focusHandler: [{ type: HostListener, args: ['focus',] }]
};
function onKeydown(event, component) {
switch (event.which) {
//down
case 40:
if (!component.isOpen && event.altKey) {
component.onShowCalendar();
component.itemFocused = -1;
}
event.preventDefault();
break;
case 13:
component.onShowCalendar();
component.itemFocused = -1;
event.preventDefault();
break;
case 27:
component.hide();
component.itemFocused = -1;
event.preventDefault();
break;
case 8:
component.clearData();
component.itemFocused = -1;
event.preventDefault();
break;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1vbnRoLXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiQzovVXNlcnMvSnVhbiBNYW51ZWwgTWVuZXNlcy9Eb2N1bWVudHMvR2l0SHViL2xpYnJhcmllcy9wcm9qZWN0cy9uZ3gtbW9udGgtcGlja2VyLXJhbmdlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtbW9udGgtcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTZDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFFLFNBQVMsRUFBaUIsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM5USxPQUFPLEVBQXFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFtTzFDLE1BQU0sT0FBTyx1QkFBdUI7SUFtR2xDLFlBQW9CLFFBQW1CLEVBQVUsRUFBcUIsRUFBVSxJQUFnQjtRQUE1RSxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBNUZqRixTQUFJLEdBQVcsUUFBUSxJQUFJLE9BQU8sQ0FBQztRQUlwQix3QkFBbUIsR0FBVywwQkFBMEIsQ0FBQztRQUM3RCxvQkFBZSxHQUFXLHNCQUFzQixDQUFDO1FBQ2pELDJCQUFzQixHQUFXLGFBQWEsQ0FBQztRQUNoRCxtQkFBYyxHQUFXLFdBQVcsQ0FBQztRQUMxQyxjQUFTLEdBQVcsUUFBUSxDQUFDO1FBQzFCLGlCQUFZLEdBQVcsZ0JBQWdCLENBQUM7UUFDeEMsaUJBQVksR0FBVyxTQUFTLENBQUM7UUFDL0IsbUJBQWMsR0FBVyxhQUFhLENBQUM7UUFDdkMsbUJBQWMsR0FBVyxnQkFBZ0IsQ0FBQztRQUMzQyxrQkFBYSxHQUFXLFdBQVcsQ0FBQztRQUNuQyxtQkFBYyxHQUFXLFlBQVksQ0FBQztRQUU5QyxXQUFNLEdBQVcsT0FBTyxDQUFDO1FBTzFDLHFCQUFxQjtRQUNyQixhQUFRLEdBQVcsTUFBTSxDQUFDO1FBVWhCLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFFakMsYUFBUSxHQUFHLENBQUMsQ0FBQztRQWN0QyxhQUFRLEdBQXFCLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDN0MsY0FBUyxHQUFlLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQW1XbEMsbUJBQWMsR0FBYSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUF6VG5DLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVztZQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7SUFDN0QsQ0FBQztJQXZERCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUdELFlBQVk7UUFDVixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN0QixDQUFDO0lBS0QsSUFBSSxLQUFLLENBQUMsR0FBUTtRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFJLFdBQVcsQ0FBQyxHQUFXO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQTZCRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBTSxJQUFJLENBQUMsS0FBYyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7YUFDbkc7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQzthQUM1RztTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUMzRjtRQUNELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxXQUFXLENBQUMsWUFBMkI7UUFDckMsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FDOUM7UUFDRCxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUU7WUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztTQUM1QztRQUNELElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRTtZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO1NBQzFEO1FBQ0QsSUFBRyxZQUFZLENBQUMsY0FBYztZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUM7SUFDakcsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUVoRyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQU07UUFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFDMUIsSUFBSSxLQUFLLEVBQUU7WUFDVCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xCO2FBQU07WUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxLQUFNO1FBQ1QsSUFBSSxLQUFLLEVBQUU7WUFDVCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDekI7UUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDOUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUMvQixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDOUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNsRSxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBTTtRQUNULElBQUksS0FBSyxFQUFFO1lBQ1QsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFFOUIsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU07Z0JBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7O2dCQUV6RCxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsZ0hBQWdIO0lBQ2xILENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFFaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDcEU7U0FDRjtJQUNILENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQ2YsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7Z0JBRWxHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDckc7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLFlBQVk7UUFDbEIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUM7WUFDN0QsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFMUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1lBQ3RCLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDbEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxZQUFZLENBQUM7U0FDOUQ7YUFDQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQztZQUM3RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEQsSUFBSSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLElBQUksT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO1NBRWhEO2FBQU07WUFDTCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjtRQUFBLENBQUM7SUFDTixDQUFDO0lBQUEsQ0FBQztJQUVGLFVBQVU7UUFDUixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RFLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2FBQ3hCO1lBQUEsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7Z0JBQ2xDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1lBQUEsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7Z0JBQ2xDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1lBQUEsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFBQSxDQUFDO0lBRUYsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUFBLENBQUM7SUFFRixhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ25ELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1lBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1NBQ3pCO1FBQUEsQ0FBQztJQUNKLENBQUM7SUFBQSxDQUFDO0lBRUYsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtTQUN6QjtRQUFBLENBQUM7SUFDSixDQUFDO0lBQUEsQ0FBQztJQUVGLGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25MLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7b0JBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqTCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDbkI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQU0sSUFBSSxDQUFDLEtBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFNLElBQUksQ0FBQyxLQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEs7U0FDRjs7WUFDQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFBQSxDQUFDO0lBRUYsY0FBYztRQUNaLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ25CLFNBQVMsRUFBRSxLQUFLO29CQUNoQixLQUFLLEVBQUUsQ0FBQztvQkFDUixTQUFTLEVBQUUsSUFBSTtvQkFDZixTQUFTLEVBQUUsS0FBSztvQkFDaEIsV0FBVyxFQUFFLEtBQUs7b0JBQ2xCLFdBQVcsRUFBRSxLQUFLO2lCQUNuQixDQUFDLENBQUE7WUFDSixDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFBLENBQUM7SUFFRixjQUFjO1FBQ1osTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNySCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUMvSCxDQUFDO0lBQUEsQ0FBQztJQUVGLGVBQWU7UUFDYixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsNEZBQTRGO1lBQzVGLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDckYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUEsQ0FBQztJQUVGLGNBQWM7UUFDWixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2pDLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtnQkFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQUU7aUJBQ3RELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtnQkFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQUU7O2dCQUN0RCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLGFBQWEsRUFBRTtnQkFDakIsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLFNBQVMsS0FBSyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDbEU7U0FDRjthQUFNLElBQUksYUFBYSxJQUFJLFdBQVcsRUFBRTtZQUN2QyxJQUFJLGFBQWEsQ0FBQyxTQUFTLEtBQUssV0FBVyxDQUFDLFNBQVMsRUFBRTtnQkFDckQsSUFBSSxhQUFhLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxTQUFTLEVBQUU7b0JBQ3JELElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxTQUFTLE1BQU0sV0FBVyxDQUFDLFNBQVMsS0FBSyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUE7aUJBQzVGO3FCQUFNO29CQUNMLElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO2lCQUNsRTthQUNGO2lCQUFNO2dCQUNMLElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxTQUFTLEtBQUssYUFBYSxDQUFDLFNBQVMsTUFBTSxXQUFXLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQTthQUN0SDtTQUNGO1FBQ0QsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFO1lBQ2YsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO1NBQy9EO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUdELFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBZTtRQUM3QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDO1FBQzlELE9BQU8sVUFBVSxJQUFJO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQTtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUV2QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBTztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBTztRQUN2QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsR0FBWTtRQUMzQixJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUN0QixDQUFDO0lBS0QsZ0JBQWdCLENBQUMsR0FBWTtRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztJQUN4QixDQUFDOzs7WUFub0JGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ1I7Z0JBNktELFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHVCQUF1QixDQUFDO3dCQUN0RCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtvQkFDRDt3QkFDRSxPQUFPLEVBQUUsYUFBYTt3QkFDdEIsV0FBVyxFQUFFLHVCQUF1Qjt3QkFDcEMsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7eUJBdkxPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyS1A7YUFhRjs7O1lBcE8rTCxTQUFTO1lBQXJKLGlCQUFpQjtZQUFhLFVBQVU7OzswQkF1T3pGLEtBQUssU0FBQyxhQUFhO3lCQUNuQixLQUFLLFNBQUMsVUFBVTt1QkFDaEIsS0FBSyxTQUFDLFVBQVU7eUJBQ2hCLEtBQUssU0FBQyxVQUFVO21CQUVoQixLQUFLLFNBQUMsTUFBTTt3QkFDWixLQUFLLFNBQUMsV0FBVzt1QkFDakIsS0FBSyxTQUFDLFVBQVU7a0NBRWhCLEtBQUssU0FBQyxxQkFBcUI7OEJBQzNCLEtBQUssU0FBQyxpQkFBaUI7cUNBQ3ZCLEtBQUssU0FBQyxpQkFBaUI7NkJBQ3ZCLEtBQUssU0FBQyxnQkFBZ0I7d0JBQ3RCLEtBQUssU0FBQyxXQUFXOzJCQUNqQixLQUFLLFNBQUMsY0FBYzsyQkFDcEIsS0FBSyxTQUFDLGNBQWM7NkJBQ3BCLEtBQUssU0FBQyxnQkFBZ0I7NkJBQ3RCLEtBQUssU0FBQyxnQkFBZ0I7NEJBQ3RCLEtBQUssU0FBQyxlQUFlOzZCQUNyQixLQUFLLFNBQUMsZ0JBQWdCO3FCQUV0QixLQUFLLFNBQUMsUUFBUTtxQ0FFZCxTQUFTLFNBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO3lCQUNyRCxTQUFTLFNBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs4QkFDekMsU0FBUyxTQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtpQ0FDOUMsU0FBUyxTQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7aUNBYXJDLE1BQU07dUJBRU4sV0FBVyxTQUFDLFVBQVU7MEJBRXRCLFlBQVksU0FBQyxNQUFNOzJCQU9uQixZQUFZLFNBQUMsT0FBTzs7QUFrWHZCLFNBQVMsU0FBUyxDQUFDLEtBQW9CLEVBQUUsU0FBbUM7SUFFMUUsUUFBUSxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQ25CLE1BQU07UUFDTixLQUFLLEVBQUU7WUFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO2dCQUNyQyxTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzNCLFNBQVMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDNUI7WUFFRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFdkIsTUFBTTtRQUNSLEtBQUssRUFBRTtZQUNMLFNBQVMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixTQUFTLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUV2QixNQUFNO1FBQ1IsS0FBSyxFQUFFO1lBQ0wsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLFNBQVMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFM0IsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXZCLE1BQU07UUFDUixLQUFLLENBQUM7WUFDSixTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFdkIsTUFBTTtLQUNUO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiwgVmFsaWRhdG9yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG9tSGFuZGxlciB9IGZyb20gJy4vZG9taGFuZGxlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1tb250aC1waWNrZXInLFxuICB0ZW1wbGF0ZTpgXG4gIDxkaXYgY2xhc3M9XCJjYWxlbmRhci13aWRnZXRcIiAjc2VsZWN0PlxuICAgIDxkaXYgW25nQ2xhc3NdPVwiaW5wdXRDb250YWluZXJDbGFzc1wiIChjbGljayk9XCJvblNob3dDYWxlbmRhcigkZXZlbnQpXCIgcm9sZT1cImxpc3Rib3hcIiAjY2FsZW5kYXJJbnB1dENvbnRhaW5lciBbdGl0bGVdPVwidmFsdWVUZXh0XCI+XG4gICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cImlucHV0VmFsdWVDbGFzc1wiPnt7dmFsdWVUZXh0fX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBbbmdDbGFzc109XCJjYWxlbmRhckNvbnRhaW5lckNsYXNzXCIgI2NhbGVuZGFyVUkgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3V0ZXJDYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9wUGFuZWxcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicHJldlllYXJCdXR0b25cIiAoY2xpY2spPVwiZGVjcmVtZW50WWVhcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYXJyb3cgYXJyb3ctbGVmdFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInllYXJMYWJlbFwiPnt7IHllYXJzW2N1cnJlbnRZZWFySW5kZXhdIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJuZXh0WWVhckJ1dHRvblwiIChjbGljayk9XCJpbmNyZW1lbnRZZWFyKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJhcnJvdyBhcnJvdy1yaWdodFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRQYW5lbFwiICNjYWxlbmRhckNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25DbGljayhpKVwiICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aERhdGFTbGljZTsgbGV0IGkgPSBpbmRleFwiIFtuZ0NsYXNzXT1cIlttb250aEl0ZW1DbGFzcywgXG4gICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2VJbmRleGVzWzBdPT09Z2xvYmFsSW5kZXhPZmZzZXQraSB8fCByYW5nZUluZGV4ZXNbMV09PT1nbG9iYWxJbmRleE9mZnNldCtpKSA/IGVkZ2VDbGFzczogJycsIFxuICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRZZWFySW5kZXg9PT0wPyBpID4gMTE6KGkgPCA2IHx8IGkgPiAxNykpID8gbm90WWVhckNsYXNzIDogJyddXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW2lkXT1cImlcIiBjbGFzcz1cIm1vbnRoSXRlbUhpZ2hsaWdodFwiIFtuZ0NsYXNzXT1cIlsgbW9udGguaXNJblJhbmdlID8gaW5SYW5nZUNsYXNzIDogJycsIFxuICAgICAgICAgICAgICAgICAgICBtb250aC5pc0xvd2VyRWRnZSA/IGxvd2VyRWRnZUNsYXNzIDogJycsIG1vbnRoLmlzVXBwZXJFZGdlID8gdXBwZXJFZGdlQ2xhc3MgOiAnJyBdXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBtb250aC5tb250aE5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXJQYW5lbFwiPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiY2xlYW5CdG5cIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApXCIgW25nQ2xhc3NdPVwiY2xlYW5CdG5DbGFzc1wiIChjbGljayk9XCJjbGVhckRhdGEoKVwiPlxuICAgICAgICAgICAgICAgICAgICBMaW1waWFyXG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDxhIGlkPVwiYWNjZXB0QnRuXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIFtuZ0NsYXNzXT1cImFjY2VwdEJ0bkNsYXNzXCIgKGNsaWNrKT1cImVtaXREYXRhKClcIj5cbiAgICAgICAgICAgICAgICAgICAgQWNlcHRhclxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuICBgLFxuICBzdHlsZXM6W2BcbiAgLmNhbGVuZGFyLXVpIHtcbiAgICB6LWluZGV4OiAxMDAzO1xuICAgIHdpZHRoOiAzNTBweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcbn1cblxuLmNhbGVuZGFyLWlucHV0LWNvbnRhaW5lciB7XG4gICAgYmFja2dyb3VuZDogI0Y1RjVGNiAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogc29saWQgMXB4ICNDMkQxRDkgIWltcG9ydGFudDtcbiAgICBjb2xvcjogI0E4QjBCQSAhaW1wb3J0YW50O1xuICAgIGZvbnQtZmFtaWx5OiBcIm9wZW5fc2Fuc2l0YWxpY1wiLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgbGluZS1oZWlnaHQ6IDE3cHg7XG4gICAgbWluLWhlaWdodDogNDhweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBsZXR0ZXItc3BhY2luZzogMDtcbn1cblxuLmNhbGVuZGFyLWlucHV0LXZhbHVlIHtcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gICAgcGFkZGluZy1yaWdodDogMTBweDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi5vdXRlckNhcmQge1xuICAgIHRvdWNoLWFjdGlvbjogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdpZHRoOiBpbmhlcml0O1xuICAgIC8qaGVpZ2h0OiAzNTBweDsqL1xuICAgIGJveC1zaGFkb3c6IDAgNHB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4yKTtcbn1cblxuLnRvcFBhbmVsIHtcbiAgICB3aWR0aDogaW5oZXJpdDtcbiAgICBoZWlnaHQ6IDQ0cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGxpbmUtaGVpZ2h0OiA2NHB4O1xufVxuXG4ucHJldlllYXJCdXR0b24ge1xuICAgIGZsb2F0OiBsZWZ0O1xufVxuXG4ubmV4dFllYXJCdXR0b24ge1xuICAgIGZsb2F0OiByaWdodDtcbn1cblxuYnV0dG9uIHtcbiAgICB3aWR0aDogNjRweDtcbiAgICBoZWlnaHQ6IDY0cHg7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5idXR0b246Zm9jdXMge1xuICAgIG91dGxpbmU6IDA7XG59XG5cbmkge1xuICAgIGJvcmRlcjogc29saWQgYmxhY2s7XG4gICAgYm9yZGVyLXdpZHRoOiAwIDNweCAzcHggMDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgcGFkZGluZzogNnB4O1xufVxuXG4uYXJyb3ctcmlnaHQge1xuICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpO1xufVxuXG4uYXJyb3ctbGVmdCB7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7XG59XG5cbi50b3BQYW5lbC55ZWFyTGFiZWwge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW46IDAgYXV0bztcbn1cblxuLmNvbnRlbnRQYW5lbCB7XG4gICAgcGFkZGluZzogMzJweCA2cHg7XG59XG5cbi5mb290ZXJQYW5lbCB7XG4gICAgZGlzcGxheTogZmxleDtcbn1cblxuLm1vbnRoSXRlbSB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGhlaWdodDogNTRweDtcbiAgICB3aWR0aDogNTRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGxpbmUtaGVpZ2h0OiA1NHB4O1xuICAgIG1hcmdpbi10b3A6IDFweDtcbiAgICBtYXJnaW4tYm90dG9tOiAxcHg7XG59XG5cbi5tb250aEl0ZW06aG92ZXIge1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI0Y1RjVGNjtcbiAgICBjb2xvcjogI0E4QjBCQTtcbn1cblxuLmlzRWRnZSB7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTQ3NGE0O1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLmluUmFuZ2Uge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxNDc0YTQ7XG4gICAgb3BhY2l0eTogMC41O1xuICAgIGNvbG9yOiB3aGl0ZTtcbn1cblxuLmlzTG93ZXJFZGdlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBub25lO1xuICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgdHJhbnNwYXJlbnQgNTAlLCAjMTQ3NGE0IDUwJSk7XG59XG5cbi5pc1VwcGVyRWRnZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICMxNDc0YTQgNTAlLCB0cmFuc3BhcmVudCA1MCUpO1xufVxuXG4ubm90Q3VycmVudFllYXIge1xuICAgIGNvbG9yOiAjYzRjYmQ2O1xufVxuXG4uY2xlYW4tYnRuIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgd2lkdGg6IDUwJTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBjb2xvcjogI0E4QjBCQTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRjVGNUY2O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHBhZGRpbmc6IC4zNzVyZW0gLjc1cmVtO1xuICAgIGZvbnQtc2l6ZTogMXJlbTtcbiAgICBsaW5lLWhlaWdodDogMS41O1xufVxuXG4uYWNjZXB0LWJ0biB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIHdpZHRoOiA1MCU7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgcGFkZGluZzogLjM3NXJlbSAuNzVyZW07XG4gICAgZm9udC1zaXplOiAxcmVtO1xuICAgIGxpbmUtaGVpZ2h0OiAxLjU7XG4gICAgY29sb3I6IHdoaXRlO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICMxNDc0YTQ7XG59XG4gIGBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5neE1vbnRoUGlja2VyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IE5neE1vbnRoUGlja2VyQ29tcG9uZW50LFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4TW9udGhQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25DaGFuZ2VzIHtcbiBcbiAgQElucHV0KCdwbGFjZWhvbGRlcicpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgncmVxdWlyZWQnKSBpc1JlcXVpcmVkOiBib29sZWFuO1xuICBASW5wdXQoJ2Rpc2FibGVkJykgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgncmVhZG9ubHknKSBpc1JlYWRPbmx5OiBib29sZWFuO1xuXG4gIEBJbnB1dCgnbW9kZScpIG1vZGU6IHN0cmluZyA9ICdzaW5nbGUnIHx8ICdyYW5nZSc7XG4gIEBJbnB1dCgnZmlyc3RZZWFyJykgZmlyc3RZZWFyOiBudW1iZXI7XG4gIEBJbnB1dCgnbGFzdFllYXInKSBsYXN0WWVhcjogbnVtYmVyO1xuXG4gIEBJbnB1dCgnaW5wdXRDb250YWluZXJDbGFzcycpIGlucHV0Q29udGFpbmVyQ2xhc3M6IHN0cmluZyA9IFwiY2FsZW5kYXItaW5wdXQtY29udGFpbmVyXCI7XG4gIEBJbnB1dCgnaW5wdXRWYWx1ZUNsYXNzJykgaW5wdXRWYWx1ZUNsYXNzOiBzdHJpbmcgPSBcImNhbGVuZGFyLWlucHV0LXZhbHVlXCI7IFxuICBASW5wdXQoJ2lucHV0VmFsdWVDbGFzcycpIGNhbGVuZGFyQ29udGFpbmVyQ2xhc3M6IHN0cmluZyA9IFwiY2FsZW5kYXItdWlcIjsgXG4gIEBJbnB1dCgnbW9udGhJdGVtQ2xhc3MnKSBtb250aEl0ZW1DbGFzczogc3RyaW5nID0gXCJtb250aEl0ZW1cIjtcbiAgQElucHV0KCdlZGdlQ2xhc3MnKSBlZGdlQ2xhc3M6IHN0cmluZyA9IFwiaXNFZGdlXCI7XG4gIEBJbnB1dCgnbm90WWVhckNsYXNzJykgbm90WWVhckNsYXNzOiBzdHJpbmcgPSBcIm5vdEN1cnJlbnRZZWFyXCI7XG4gIEBJbnB1dCgnaW5SYW5nZUNsYXNzJykgaW5SYW5nZUNsYXNzOiBzdHJpbmcgPSBcImluUmFuZ2VcIjtcbiAgQElucHV