UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

718 lines (717 loc) 61.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, Output, ViewChild, EventEmitter } from '@angular/core'; import { I18N } from '../../../../../decorator/I18N.decorator'; import { Option } from '../../../../../decorator/Option.decorator'; import { AbstractSelectItems } from '../../../../../component/dataview/input/AbstractSelectItems'; import { NeedFocusService } from '../../../../../service/NeedFocusService.service'; import { EventUtils } from '../../../../../share/utils/EventUtils'; import { CLICK_EVENT, BEFORE_CLICK_EVENT } from '../../../../../share/CustomEventType'; import { FormControl } from '@angular/forms'; import { MatButtonToggle } from '@angular/material'; const /** @type {?} */ TYPE_NAME = "material-toggle-select-items"; export class MaterialToggleSelectItems extends AbstractSelectItems { /** * @param {?} elementRef * @param {?} needFocusService */ constructor(elementRef, needFocusService) { super(elementRef, needFocusService); this.beforeClickEvent = new EventEmitter(); this.clickEvent = new EventEmitter(); this.beforeFocusEvent = new EventEmitter(); this.focusEvent = new EventEmitter(); this.beforeLostFocusEvent = new EventEmitter(); this.lostFocusEvent = new EventEmitter(); this.selectEvent = new EventEmitter(); this.beforeSelectEvent = new EventEmitter(); this.formControl = new FormControl(); this.formControl2 = new FormControl(); this.multiple = false; this._uniqueId = this.randomName(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { setTimeout(() => { this.initEventHandlers(); }, 20); } /** * @param {?} $event * @param {?} index * @return {?} */ setSelectedItem($event, index) { let /** @type {?} */ oldIndexes = this.getSelectedIndexes(); let /** @type {?} */ item = this.getItemAtIndex(index[0]); let /** @type {?} */ oldDatas = []; let /** @type {?} */ newDatas = []; if (oldIndexes !== null && oldIndexes !== undefined && this.multiple) { for (let /** @type {?} */ oldIndex of oldIndexes) { oldDatas.push(this.getItemAtIndex(oldIndex)); newDatas.push(this.getItemAtIndex(oldIndex)); } } if (oldDatas.indexOf(item) === -1) { newDatas.push(item); } else { newDatas.splice(oldDatas.indexOf(item), 1); } this.setSelectedItems(newDatas); } /** * @param {?} selectedItems * @param {?=} $event * @param {?=} fireEvent * @param {?=} fireChangeEvent * @return {?} */ setSelectedItems(selectedItems, $event, fireEvent, fireChangeEvent) { if (selectedItems === null || selectedItems === undefined || !Array.isArray(selectedItems)) { selectedItems = []; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } let /** @type {?} */ sItems = []; let /** @type {?} */ newIndices = []; for (let /** @type {?} */ item of selectedItems) { let /** @type {?} */ idx = this.getItemIndex(item); if (idx >= 0) { newIndices.push(idx); sItems.push(item); } } // Only allow "item" which actually exists. selectedItems = sItems; let /** @type {?} */ oldIndex = this.getSelectedIndexes(); EventUtils.handleBrowserEvent(this, 'beforeSelectEvent', $event, fireEvent, ($event) => { // doEvent this._setSelectedItemsSaveData(selectedItems, true, $event, fireChangeEvent); }, ($event) => { // emitBeforeEvent if (this.multiple === false) { $(this.elementRef.nativeElement).find('mat-button-toggle-group.mat-button-toggle-group.' + this._uniqueId + ' > mat-button-toggle').removeClass('mat-button-toggle-checked'); } this.emitBeforeSelectEvent(oldIndex, newIndices, $event); }, ($event, result) => { // emitAfterEvent if (this.multiple === false) { $(this.elementRef.nativeElement).find('mat-button-toggle-group.mat-button-toggle-group.' + this._uniqueId + '> mat-button-toggle.item-' + +newIndices[0]).addClass('mat-button-toggle-checked'); } this.emitSelectEvent(oldIndex, newIndices, $event); }, ($event) => { // doPrevented if (this.multiple === false) { $(this.elementRef.nativeElement).find('mat-button-toggle-group.mat-button-toggle-group.' + this._uniqueId + '> mat-button-toggle.item-' + oldIndex[0]).addClass('mat-button-toggle-checked'); } this.formControl.setValue(this.getSelectedData()); }); } /** * @return {?} */ getItems() { return this.items; } /** * @return {?} */ isDisableRipple() { return this.disableRipple; } /** * @param {?} disableRipple * @return {?} */ setDisableRipple(disableRipple) { this.disableRipple = disableRipple; } /** * @return {?} */ getDescription() { return this.description; } /** * @param {?} description * @return {?} */ setDescription(description) { this.description = description; } /** * @return {?} */ hasDescription() { if (this.description !== null && typeof this.description === 'string' && this.description !== '') { return true; } return false; } /** * @return {?} */ randomName() { let /** @type {?} */ text = ""; let /** @type {?} */ possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var /** @type {?} */ i = 0; i < 8; i++) { text += possible.charAt(Math.floor(Math.random() * possible.length)); } this._uniqueId = text + '-single'; return this._uniqueId; } /** * @return {?} */ isMultiple() { return this.multiple; } /** * @param {?} multiple * @return {?} */ setMultiple(multiple) { this.multiple = multiple; } /** * @return {?} */ toggle() { this.multiple = !this.multiple; } /** * @return {?} */ isDisabledRipple() { return this.disableRipple; } /** * @param {?} disableRipple * @return {?} */ setDisabledRipple(disableRipple) { this.disableRipple = disableRipple; } /** * @return {?} */ isVertical() { return this.vertical; } /** * @param {?} vertical * @return {?} */ setVertical(vertical) { this.vertical = vertical; } /** * @return {?} */ isChecked() { return this.checked; } /** * @param {?} checked * @return {?} */ setChecked(checked) { this.checked = checked; } /** * @param {?} $event * @return {?} */ onFocusing($event) { this.needFocusService.setFocusingComponent(this, $event); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { this.needFocusService.resetFocusingComponent($event); } /** * @return {?} */ initEventHandlers() { $(this.elementRef.nativeElement).find('button.mat-button-toggle-button').focus(($event) => { this.onFocusing($event); }); $(this.elementRef.nativeElement).find('button.mat-button-toggle-button').blur(($event) => { this.onLostFocusing($event); }); } /** * @param {?} index * @param {?=} $event * @return {?} */ emitBeforeClickEvent(index, $event) { let /** @type {?} */ eventData = { item: this.getItemAtIndex(index), index: index }; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event); if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) { this.beforeClickEvent.emit(ev); } } /** * @param {?} index * @param {?=} $event * @return {?} */ emitClickEvent(index, $event) { let /** @type {?} */ eventData = { item: this.getItemAtIndex(index), index: index }; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event); if (this.clickEvent !== null && this.clickEvent !== undefined) { this.clickEvent.emit(ev); } } /** * @param {?} $event * @param {?} index * @param {?=} fireEvent * @return {?} */ onClick($event, index, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } $event.preventDefault(); EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, ($event) => { // doEvent this.setSelectedItem($event, [index]); }, ($event) => { // emitBeforeEvent this.emitBeforeClickEvent(index, $event); }, ($event, result) => { // emitAfterEvent this.emitClickEvent(index, $event); }, ($event) => { // doPrevented }); } /** * @param {?} $event * @return {?} */ doFocus($event) { if ($(this.elementRef.nativeElement).find('button.mat-button-toggle-button:focus').length <= 0) { $(this.elementRef.nativeElement).find('button.mat-button-toggle-button').focus(); } } /** * @param {?} $event * @return {?} */ doLostFocus($event) { if ($(this.elementRef.nativeElement).find('button.mat-button-toggle-button:focus').length > 0) { $(this.elementRef.nativeElement).find('button.mat-button-toggle-button').blur(); } } /** * @param {?} inputValue * @param {?} results * @return {?} */ onValidationEnd(inputValue, results) { } /** * @param {?} data * @param {?} inputVal * @return {?} */ onDataChange(data, inputVal) { } /** * @return {?} */ getBeforeClickEvent() { return this.beforeClickEvent; } /** * @param {?} event * @return {?} */ setBeforeClickEvent(event) { this.beforeClickEvent = event; } /** * @return {?} */ getClickEvent() { return this.clickEvent; } /** * @param {?} event * @return {?} */ setClickEvent(event) { this.clickEvent = event; } } MaterialToggleSelectItems.TYPE_NAME = TYPE_NAME; MaterialToggleSelectItems.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="material-input material-toggle-select-items"> <mat-button-toggle-group [formControl]="formControl" #group="matButtonToggleGroup" multiple *ngIf="isMultiple() === true && !isDisabled()" [vertical]="isVertical()"> <mat-button-toggle [value]="item.value" *ngFor="let item of getItems(); let i = index" [disabled]="isDisabled()" [disableRipple]="isDisabledRipple()" [checked]="isChecked()" (click)="onClick($event, i)"> <mat-icon>{{ item.label | phx_text }}</mat-icon> </mat-button-toggle> </mat-button-toggle-group> <mat-button-toggle-group #group="matButtonToggleGroup" *ngIf="isMultiple() === false && !isDisabled()" [vertical]="isVertical()" [ngClass]="_uniqueId"> <mat-button-toggle [value]="item.value" [ngClass]="'item-' +i" *ngFor="let item of getItems(); let i = index" [disabled]="isDisabled()" [disableRipple]="isDisabledRipple()" [checked]="isChecked()" (click)="onClick($event, i)"> <mat-icon>{{ item.label | phx_text }}</mat-icon> </mat-button-toggle> </mat-button-toggle-group> <!-- [class.mat-button-toggle-checked]="getOldVal() === item.value" --> <div class="validation" [style.display]="getValidationResultMessage() ? undefined : 'none'" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()"> <ng-template [ngIf]="getValidationResultMessage()" [ngIfElse]="validation_else"> {{getValidationResultMessage() | phx_text}} </ng-template> <ng-template #validation_else> <!-- We've to put whitespace if there is no validation msg to prevent empty dom --> <!-- since if validate msg's <div> dom is empty, the component positioning --> <!-- will be misplaced. --> {{ '&nbsp;' }} </ng-template> </div> <div class="description" [style.display]="getValidationResultMessage() ? 'none' : undefined" [class.normal]="isNormal() && !isDisabled()" [class.success]="isSuccess() && !isDisabled()" [class.warning]="isWarning() && !isDisabled()" [class.error]="isError() && !isDisabled()"> <ng-template [ngIf]="getDescription()" [ngIfElse]="description_else"> {{ getDescription() | phx_text }} </ng-template> <ng-template #description_else> <!-- We've to put whitespace if there is no description to prevent empty dom --> <!-- since if description's <div> dom is empty, the component positioning --> <!-- will be misplaced. --> {{ '&nbsp;' }} </ng-template> </div> <div class="help"> {{getHelp() | phx_text}} </div> </div> `, },] }, ]; /** @nocollapse */ MaterialToggleSelectItems.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, ]; MaterialToggleSelectItems.propDecorators = { "dataParent": [{ type: Input },], "ignoreParentData": [{ type: Input },], "data": [{ type: Input },], "ignoreParentDisabled": [{ type: Input },], "delegateHistory": [{ type: Input },], "onDisabled": [{ type: Input },], "onEnabled": [{ type: Input },], "loadingEnabled": [{ type: Input },], "i18nKey": [{ type: Input },], "bypass": [{ type: Input, args: ['i18nBypass',] },], "options": [{ type: Input },], "disabled": [{ type: Input },], "field": [{ type: Input },], "name": [{ type: Input },], "typeOfData": [{ type: Input },], "readOnly": [{ type: Input },], "help": [{ type: Input },], "dataComparator": [{ type: Input, args: ['comparator',] },], "items": [{ type: Input },], "description": [{ type: Input },], "value": [{ type: Input },], "multiple": [{ type: Input },], "vertical": [{ type: Input },], "disableRipple": [{ type: Input },], "checked": [{ type: Input },], "ran": [{ type: Input },], "loadEvent": [{ type: Output, args: ['phxLoad',] },], "startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },], "endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },], "beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },], "focusEvent": [{ type: Output, args: ['phxFocus',] },], "beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },], "lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },], "beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },], "changeEvent": [{ type: Output, args: ['phxChange',] },], "beforeSelectEvent": [{ type: Output, args: ['phxBeforeSelect',] },], "selectEvent": [{ type: Output, args: ['phxSelect',] },], "beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },], "clickEvent": [{ type: Output, args: ['phxClick',] },], "group": [{ type: ViewChild, args: ['group',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialToggleSelectItems.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialToggleSelectItems.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialToggleSelectItems.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], MaterialToggleSelectItems.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialToggleSelectItems.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialToggleSelectItems.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialToggleSelectItems.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialToggleSelectItems.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], MaterialToggleSelectItems.prototype, "help", void 0); tslib_1.__decorate([ Option('comparator'), tslib_1.__metadata("design:type", Object) ], MaterialToggleSelectItems.prototype, "dataComparator", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Array) ], MaterialToggleSelectItems.prototype, "items", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialToggleSelectItems.prototype, "description", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialToggleSelectItems.prototype, "value", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "multiple", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "vertical", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "disableRipple", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialToggleSelectItems.prototype, "checked", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialToggleSelectItems.prototype, "ran", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeSelect'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "beforeSelectEvent", void 0); tslib_1.__decorate([ Option('select'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "selectEvent", void 0); tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialToggleSelectItems.prototype, "clickEvent", void 0); function MaterialToggleSelectItems_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MaterialToggleSelectItems.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MaterialToggleSelectItems.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MaterialToggleSelectItems.propDecorators; /** @type {?} */ MaterialToggleSelectItems.TYPE_NAME; /** @type {?} */ MaterialToggleSelectItems.prototype.dataParent; /** @type {?} */ MaterialToggleSelectItems.prototype.ignoreParentData; /** @type {?} */ MaterialToggleSelectItems.prototype.data; /** @type {?} */ MaterialToggleSelectItems.prototype.ignoreParentDisabled; /** @type {?} */ MaterialToggleSelectItems.prototype.delegateHistory; /** @type {?} */ MaterialToggleSelectItems.prototype.onDisabled; /** @type {?} */ MaterialToggleSelectItems.prototype.onEnabled; /** @type {?} */ MaterialToggleSelectItems.prototype.loadingEnabled; /** @type {?} */ MaterialToggleSelectItems.prototype.i18nKey; /** @type {?} */ MaterialToggleSelectItems.prototype.bypass; /** @type {?} */ MaterialToggleSelectItems.prototype.options; /** @type {?} */ MaterialToggleSelectItems.prototype.disabled; /** @type {?} */ MaterialToggleSelectItems.prototype.field; /** @type {?} */ MaterialToggleSelectItems.prototype.name; /** @type {?} */ MaterialToggleSelectItems.prototype.typeOfData; /** @type {?} */ MaterialToggleSelectItems.prototype.readOnly; /** @type {?} */ MaterialToggleSelectItems.prototype.help; /** @type {?} */ MaterialToggleSelectItems.prototype.dataComparator; /** @type {?} */ MaterialToggleSelectItems.prototype.items; /** @type {?} */ MaterialToggleSelectItems.prototype.description; /** @type {?} */ MaterialToggleSelectItems.prototype.value; /** @type {?} */ MaterialToggleSelectItems.prototype.multiple; /** @type {?} */ MaterialToggleSelectItems.prototype.vertical; /** @type {?} */ MaterialToggleSelectItems.prototype.disableRipple; /** @type {?} */ MaterialToggleSelectItems.prototype.checked; /** @type {?} */ MaterialToggleSelectItems.prototype.ran; /** @type {?} */ MaterialToggleSelectItems.prototype.formControl; /** @type {?} */ MaterialToggleSelectItems.prototype.formControl2; /** @type {?} */ MaterialToggleSelectItems.prototype.loadEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.startValidateEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.endValidateEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.beforeFocusEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.focusEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.beforeLostFocusEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.lostFocusEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.beforeChangeEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.changeEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.beforeSelectEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.selectEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.beforeClickEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.clickEvent; /** @type {?} */ MaterialToggleSelectItems.prototype.group; /** @type {?} */ MaterialToggleSelectItems.prototype._uniqueId; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0ZXJpYWxUb2dnbGVTZWxlY3RJdGVtcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvTWF0ZXJpYWxUb2dnbGVTZWxlY3RJdGVtcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBaUIsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUUvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFDbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBSW5FLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBELHVCQUFNLFNBQVMsR0FBVyw4QkFBOEIsQ0FBQztBQTZDekQsTUFBTSxnQ0FBaUMsU0FBUSxtQkFBbUI7Ozs7O0lBa0poRSxZQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQ3BFLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFF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TSxDQUFDLGNBQWMsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFJbEMsTUFBTSxDQUFDLGFBQWEsQ0FBQztzQ0FDTSxZQUFZOzs7SUFFdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQztzQ0FDTSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgU2ltcGxlQ2hhbmdlcywgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9JSGFzRGF0YSc7XHJcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgQWJzdHJhY3RTZWxlY3RJdGVtcyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9BYnN0cmFjdFNlbGVjdEl0ZW1zJztcclxuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1ZhbGlkYXRpb25SZXN1bHQnO1xyXG5pbXBvcnQgeyBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL0RlZmF1bHRTZWxlY3RJdGVtTW9kZWwnO1xyXG5pbXBvcnQgeyBJRGF0YUNvbXBhcmF0b3IgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb21wb25lbnQvSURhdGFDb21wYXJhdG9yJztcclxuaW1wb3J0IHsgQ0xJQ0tfRVZFTlQsIEJFRk9SRV9DTElDS19FVkVOVCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBJU2VsZWN0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L2NvbXBvbmVudHMnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Ub2dnbGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XHJcblxyXG5jb25zdCBUWVBFX05BTUU6IHN0cmluZyA9IFwibWF0ZXJpYWwtdG9nZ2xlLXNlbGVjdC1pdGVtc1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcclxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cIm1hdGVyaWFsLWlucHV0IG1hdGVyaWFsLXRvZ2dsZS1zZWxlY3QtaXRlbXNcIj5cclxuICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCIgI2dyb3VwPVwibWF0QnV0dG9uVG9nZ2xlR3JvdXBcIiBtdWx0aXBsZSAqbmdJZj1cImlzTXVsdGlwbGUoKSA9PT0gdHJ1ZSAmJiAhaXNEaXNhYmxlZCgpXCIgW3ZlcnRpY2FsXT1cImlzVmVydGljYWwoKVwiPlxyXG4gICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0SXRlbXMoKTsgbGV0IGkgPSBpbmRleFwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIiBbZGlzYWJsZVJpcHBsZV09XCJpc0Rpc2FibGVkUmlwcGxlKClcIiBbY2hlY2tlZF09XCJpc0NoZWNrZWQoKVwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudCwgaSlcIj5cclxuICAgICAgPG1hdC1pY29uPnt7IGl0ZW0ubGFiZWwgfCBwaHhfdGV4dCB9fTwvbWF0LWljb24+XHJcbiAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XHJcbiAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwICNncm91cD1cIm1hdEJ1dHRvblRvZ2dsZUdyb3VwXCIgKm5nSWY9XCJpc011bHRpcGxlKCkgPT09IGZhbHNlICYmICFpc0Rpc2FibGVkKClcIiBbdmVydGljYWxdPVwiaXNWZXJ0aWNhbCgpXCIgW25nQ2xhc3NdPVwiX3VuaXF1ZUlkXCI+XHJcbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cIml0ZW0udmFsdWVcIiBbbmdDbGFzc109XCInaXRlbS0nICtpXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0SXRlbXMoKTsgbGV0IGkgPSBpbmRleFwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIiBbZGlzYWJsZVJpcHBsZV09XCJpc0Rpc2FibGVkUmlwcGxlKClcIiBbY2hlY2tlZF09XCJpc0NoZWNrZWQoKVwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudCwgaSlcIj5cclxuICAgICAgPG1hdC1pY29uPnt7IGl0ZW0ubGFiZWwgfCBwaHhfdGV4dCB9fTwvbWF0LWljb24+XHJcbiAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XHJcbiAgPCEtLSBbY2xhc3MubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZF09XCJnZXRPbGRWYWwoKSA9PT0gaXRlbS52YWx1ZVwiIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ2YWxpZGF0aW9uXCIgW3N0eWxlLmRpc3BsYXldPVwiZ2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSA/IHVuZGVmaW5lZCA6ICdub25lJ1wiIFtjbGFzcy5ub3JtYWxdPVwiaXNOb3JtYWwoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLnN1Y2Nlc3NdPVwiaXNTdWNjZXNzKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy53YXJuaW5nXT1cImlzV2FybmluZygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3MuZXJyb3JdPVwiaXNFcnJvcigpICYmICFpc0Rpc2FibGVkKClcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRWYWxpZGF0aW9uUmVzdWx0TWVzc2FnZSgpXCIgW25nSWZFbHNlXT1cInZhbGlkYXRpb25fZWxzZVwiPlxyXG4gICAgICAgIHt7Z2V0VmFsaWRhdGlvblJlc3VsdE1lc3NhZ2UoKSB8IHBoeF90ZXh0fX1cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8bmctdGVtcGxhdGUgI3ZhbGlkYXRpb25fZWxzZT5cclxuICAgICAgICA8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gbXNnIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxyXG4gICAgICAgIDwhLS0gc2luY2UgaWYgdmFsaWRhdGUgbXNnJ3MgPGRpdj4gZG9tIGlzIGVtcHR5LCB0aGUgY29tcG9uZW50IHBvc2l0aW9uaW5nIC0tPlxyXG4gICAgICAgIDwhLS0gd2lsbCBiZSBtaXNwbGFjZWQuIC0tPlxyXG4gICAgICAgIHt7ICcmbmJzcDsnIH19XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiIFtzdHlsZS5kaXNwbGF5XT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKCkgPyAnbm9uZScgOiB1bmRlZmluZWRcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5zdWNjZXNzXT1cImlzU3VjY2VzcygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3Mud2FybmluZ109XCJpc1dhcm5pbmcoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLmVycm9yXT1cImlzRXJyb3IoKSAmJiAhaXNEaXNhYmxlZCgpXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXREZXNjcmlwdGlvbigpXCIgW25nSWZFbHNlXT1cImRlc2NyaXB0aW9uX2Vsc2VcIj5cclxuICAgICAgICAgIHt7IGdldERlc2NyaXB0aW9uKCkgfCBwaHhfdGV4dCB9fVxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2Rlc2NyaXB0aW9uX2Vsc2U+XHJcbiAgICAgICAgICA8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIGRlc2NyaXB0aW9uIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxyXG4gICAgICAgICAgPCEtLSBzaW5jZSBpZiBkZXNjcmlwdGlvbidzIDxkaXY+IGRvbSBpcyBlbXB0eSwgdGhlIGNvbXBvbmVudCBwb3NpdGlvbmluZyAtLT5cclxuICAgICAgICAgIDwhLS0gd2lsbCBiZSBtaXNwbGFjZWQuIC0tPlxyXG4gICAgICAgICAge3sgJyZuYnNwOycgfX1cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiaGVscFwiPlxyXG4gICAgICB7e2dldEhlbHAoKSB8IHBoeF90ZXh0fX1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbmAsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXRlcmlhbFRvZ2dsZVNlbGVjdEl0ZW1zIGV4dGVuZHMgQWJzdHJhY3RTZWxlY3RJdGVtcyBpbXBsZW1lbnRzIE9uSW5pdCwgSUhhc0RhdGEge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xyXG5cclxuICAvLyBSZS1kZWNsYXJlIGZpZWxkIHRvIGRlY2xhcmUgbmcgQElucHV0LlxyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERhdGE6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGlnbm9yZVBhcmVudERpc2FibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRlbGVnYXRlSGlzdG9yeTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkRpc2FibGVkOiBGdW5jdGlvbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBvbkVuYWJsZWQ6IEZ1bmN0aW9uO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGxvYWRpbmdFbmFibGVkOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGkxOG5LZXk6IHN0cmluZztcclxuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxyXG4gIEBPcHRpb24oJ2kxOG5CeXBhc3MnKVxyXG4gIHByb3RlY3RlZCBieXBhc3M6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGRpc2FibGVkOiBib29sZWFuO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBmaWVsZDogc3RyaW5nO1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCB0eXBlT2ZEYXRhOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgcmVhZE9ubHk6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGhlbHA6IGFueTtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFNlbGVjdEl0ZW1zXHJcbiAgQElucHV0KCdjb21wYXJhdG9yJylcclxuICBAT3B0aW9uKCdjb21wYXJhdG9yJylcclxuICBwcm90ZWN0ZWQgZGF0YUNvbXBhcmF0b3I6IElEYXRhQ29tcGFyYXRvcjxhbnk+O1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGl0ZW1zOiBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsW107XHJcblxyXG4gIC8vIC0tLSBmcm9tIHNlbGZcclxuICBASTE4TigpXHJcbiAgQE9wdGlvbigpXHJcbiAgQElucHV0KClcclxuICBwcml2YXRlIGRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgdmFsdWU6IGFueTtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBtdWx0aXBsZTogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCB2ZXJ0aWNhbDogYm9vbGVhbjtcclxuICBASW5wdXQoKVxyXG4gIEBPcHRpb24oKVxyXG4gIHByb3RlY3RlZCBkaXNhYmxlUmlwcGxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpXHJcbiAgQE9wdGlvbigpXHJcbiAgcHJvdGVjdGVkIGNoZWNrZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KClcclxuICBAT3B0aW9uKClcclxuICBwcm90ZWN0ZWQgcmFuOiBhbnk7XHJcblxyXG4gIHB1YmxpYyBmb3JtQ29udHJvbDogRm9ybUNvbnRyb2w7XHJcbiAgcHVibGljIGZvcm1Db250cm9sMjogRm9ybUNvbnRyb2w7XHJcblxyXG4gIC8vIFJlLWRlY2xhcmUgZmllbGQgdG8gZGVjbGFyZSBuZyBAT3V0cHV0LlxyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxyXG4gIEBPdXRwdXQoJ3BoeExvYWQnKVxyXG4gIEBPcHRpb24oJ2xvYWQnKVxyXG4gIHByb3RlY3RlZCBsb2FkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0RGF0YVZpZXdcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdElucHV0RGF0YVZpZXdcclxuICBAT3V0cHV0KCdwaHhTdGFydFZhbGlkYXRlJylcclxuICBAT3B0aW9uKCdzdGFydFZhbGlkYXRlJylcclxuICBwcm90ZWN0ZWQgc3RhcnRWYWxpZGF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhFbmRWYWxpZGF0ZScpXHJcbiAgQE9wdGlvbignZW5kVmFsaWRhdGUnKVxyXG4gIHByb3RlY3RlZCBlbmRWYWxpZGF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVGb2N1cycpXHJcbiAgQE9wdGlvbignYmVmb3JlRm9jdXMnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhGb2N1cycpXHJcbiAgQE9wdGlvbignZm9jdXMnKVxyXG4gIHByb3RlY3RlZCBmb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVMb3N0Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhMb3N0Rm9jdXMnKVxyXG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXHJcbiAgcHJvdGVjdGVkIGxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVDaGFuZ2UnKVxyXG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhDaGFuZ2UnKVxyXG4gIEBPcHRpb24oJ2NoYW5nZScpXHJcbiAgcHJvdGVjdGVkIGNoYW5nZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFNlbGVjdEl0ZW1zXHJcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RTZWxlY3RPbmVJdGVtXHJcbiAgQE91dHB1dCgncGh4QmVmb3JlU2VsZWN0JylcclxuICBAT3B0aW9uKCdiZWZvcmVTZWxlY3QnKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVTZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE91dHB1dCgncGh4U2VsZWN0JylcclxuICBAT3B0aW9uKCdzZWxlY3QnKVxyXG4gIHByb3RlY3RlZCBzZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcblxyXG4gIC8vIC0tLSBmcm9tIHNlbGZcclxuICBAT3V0cHV0KCdwaHhCZWZvcmVDbGljaycpXHJcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxyXG4gIHByb3RlY3RlZCBiZWZvcmVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuICBAT3V0cHV0KCdwaHhDbGljaycpXHJcbiAgQE9wdGlvbignY2xpY2snKVxyXG4gIHByb3RlY3RlZCBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnZ3JvdXAnKVxyXG4gIHByaXZhdGUgZ3JvdXA6IE1hdEJ1dHRvblRvZ2dsZTtcclxuICBwdWJsaWMgX3VuaXF1ZUlkOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRG