ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
305 lines • 33.2 kB
JavaScript
import { __decorate } from "tslib";
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { ChangeDetectionStrategy, Component, forwardRef, Input, ViewEncapsulation } from '@angular/core';
import { NG_ASYNC_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
import { of, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { parseExpression } from 'cron-parser';
import { InputBoolean } from 'ng-zorro-antd/core/util';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "ng-zorro-antd/i18n";
import * as i3 from "@angular/common";
import * as i4 from "./cron-expression-label.component";
import * as i5 from "./cron-expression-input.component";
import * as i6 from "./cron-expression-preview.component";
export class NzCronExpressionComponent {
constructor(formBuilder, cdr, i18n) {
this.formBuilder = formBuilder;
this.cdr = cdr;
this.i18n = i18n;
this.nzSize = 'default';
this.nzType = 'linux';
this.nzCollapseDisable = false;
this.nzExtra = null;
this.nzSemantic = null;
this.focus = false;
this.labelFocus = null;
this.validLabel = null;
this.labels = [];
this.nextTimeList = [];
this.destroy$ = new Subject();
this.onChange = () => { };
this.onTouch = () => null;
this.checkValid = (control) => {
if (control.value) {
try {
const cron = [];
this.labels.forEach(label => {
label === this.validLabel ? cron.push(control.value) : cron.push('*');
});
parseExpression(cron.join(' '));
}
catch (err) {
return of({ error: true });
}
}
return of(null);
};
}
convertFormat(value) {
const values = value.split(' ');
const valueObject = {};
this.labels.map((a, b) => {
valueObject[a] = values[b];
});
this.validateForm.patchValue(valueObject);
}
writeValue(value) {
if (value) {
this.convertFormat(value);
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouch = fn;
}
validate() {
if (this.validateForm.valid) {
return of(null);
}
else {
return of({ error: true });
}
}
ngOnInit() {
if (this.nzType === 'spring') {
this.labels = ['second', 'minute', 'hour', 'day', 'month', 'week'];
this.validateForm = this.formBuilder.group({
second: ['0', Validators.required, this.checkValid],
minute: ['*', Validators.required, this.checkValid],
hour: ['*', Validators.required, this.checkValid],
day: ['*', Validators.required, this.checkValid],
month: ['*', Validators.required, this.checkValid],
week: ['*', Validators.required, this.checkValid]
});
}
else {
this.labels = ['minute', 'hour', 'day', 'month', 'week'];
this.validateForm = this.formBuilder.group({
minute: ['*', Validators.required, this.checkValid],
hour: ['*', Validators.required, this.checkValid],
day: ['*', Validators.required, this.checkValid],
month: ['*', Validators.required, this.checkValid],
week: ['*', Validators.required, this.checkValid]
});
}
this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe(() => {
this.locale = this.i18n.getLocaleData('CronExpression');
this.cdr.markForCheck();
});
this.previewDate(this.validateForm.value);
this.validateForm.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => {
this.onChange(Object.values(value).join(' '));
this.previewDate(value);
this.cdr.markForCheck();
});
}
previewDate(value) {
try {
this.interval = parseExpression(Object.values(value).join(' '));
this.nextTimeList = [
this.interval.next().toDate(),
this.interval.next().toDate(),
this.interval.next().toDate(),
this.interval.next().toDate(),
this.interval.next().toDate()
];
}
catch (err) {
return;
}
}
loadMorePreview() {
this.nextTimeList = [
...this.nextTimeList,
this.interval.next().toDate(),
this.interval.next().toDate(),
this.interval.next().toDate(),
this.interval.next().toDate(),
this.interval.next().toDate()
];
this.cdr.markForCheck();
}
focusEffect(value) {
this.focus = true;
this.labelFocus = value;
this.cdr.markForCheck();
}
blurEffect() {
this.focus = false;
this.labelFocus = null;
this.cdr.markForCheck();
}
getValue(item) {
this.validLabel = item.label;
this.validateForm.controls[item.label].patchValue(item.value);
this.cdr.markForCheck();
}
ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}
}
NzCronExpressionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: NzCronExpressionComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.NzI18nService }], target: i0.ɵɵFactoryTarget.Component });
NzCronExpressionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: NzCronExpressionComponent, selector: "nz-cron-expression", inputs: { nzSize: "nzSize", nzType: "nzType", nzCollapseDisable: "nzCollapseDisable", nzExtra: "nzExtra", nzSemantic: "nzSemantic" }, providers: [
{
provide: NG_ASYNC_VALIDATORS,
useExisting: forwardRef(() => NzCronExpressionComponent),
multi: true
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NzCronExpressionComponent),
multi: true
}
], exportAs: ["nzCronExpression"], ngImport: i0, template: `
<div class="ant-cron-expression">
<div class="ant-cron-expression-content">
<div
class="ant-input ant-cron-expression-input-group"
[class.ant-input-lg]="nzSize === 'large'"
[class.ant-input-sm]="nzSize === 'small'"
[class.ant-cron-expression-input-group-focus]="focus"
[class.ant-cron-expression-input-group-error]="!validateForm.valid"
[class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus"
>
<ng-container *ngFor="let label of labels">
<nz-cron-expression-input
[value]="this.validateForm.controls[label].value"
[label]="label"
(focusEffect)="focusEffect($event)"
(blurEffect)="blurEffect()"
(getValue)="getValue($event)"
></nz-cron-expression-input>
</ng-container>
</div>
<div
class="ant-cron-expression-label-group"
[class.ant-input-lg]="nzSize === 'large'"
[class.ant-cron-expression-label-group-default]="nzSize === 'default'"
[class.ant-input-sm]="nzSize === 'small'"
>
<ng-container *ngFor="let label of labels">
<nz-cron-expression-label
[type]="label"
[valid]="this.validateForm.controls[label].valid"
[labelFocus]="labelFocus"
[locale]="locale"
></nz-cron-expression-label>
</ng-container>
</div>
<nz-cron-expression-preview
*ngIf="!nzCollapseDisable"
[TimeList]="nextTimeList"
[visible]="validateForm.valid"
[locale]="locale"
[nzSemantic]="nzSemantic"
(loadMorePreview)="loadMorePreview()"
></nz-cron-expression-preview>
</div>
<div class="ant-cron-expression-map" *ngIf="nzExtra">
<ng-template [ngTemplateOutlet]="nzExtra"></ng-template>
</div>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.NzCronExpressionLabelComponent, selector: "nz-cron-expression-label", inputs: ["type", "valid", "locale", "labelFocus"], exportAs: ["nzCronExpressionLabel"] }, { kind: "component", type: i5.NzCronExpressionInputComponent, selector: "nz-cron-expression-input", inputs: ["value", "label"], outputs: ["focusEffect", "blurEffect", "getValue"], exportAs: ["nzCronExpressionInput"] }, { kind: "component", type: i6.NzCronExpressionPreviewComponent, selector: "nz-cron-expression-preview", inputs: ["TimeList", "visible", "locale", "nzSemantic"], outputs: ["loadMorePreview"], exportAs: ["nzCronExpressionPreview"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
__decorate([
InputBoolean()
], NzCronExpressionComponent.prototype, "nzCollapseDisable", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: NzCronExpressionComponent, decorators: [{
type: Component,
args: [{
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
selector: 'nz-cron-expression',
exportAs: 'nzCronExpression',
template: `
<div class="ant-cron-expression">
<div class="ant-cron-expression-content">
<div
class="ant-input ant-cron-expression-input-group"
[class.ant-input-lg]="nzSize === 'large'"
[class.ant-input-sm]="nzSize === 'small'"
[class.ant-cron-expression-input-group-focus]="focus"
[class.ant-cron-expression-input-group-error]="!validateForm.valid"
[class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus"
>
<ng-container *ngFor="let label of labels">
<nz-cron-expression-input
[value]="this.validateForm.controls[label].value"
[label]="label"
(focusEffect)="focusEffect($event)"
(blurEffect)="blurEffect()"
(getValue)="getValue($event)"
></nz-cron-expression-input>
</ng-container>
</div>
<div
class="ant-cron-expression-label-group"
[class.ant-input-lg]="nzSize === 'large'"
[class.ant-cron-expression-label-group-default]="nzSize === 'default'"
[class.ant-input-sm]="nzSize === 'small'"
>
<ng-container *ngFor="let label of labels">
<nz-cron-expression-label
[type]="label"
[valid]="this.validateForm.controls[label].valid"
[labelFocus]="labelFocus"
[locale]="locale"
></nz-cron-expression-label>
</ng-container>
</div>
<nz-cron-expression-preview
*ngIf="!nzCollapseDisable"
[TimeList]="nextTimeList"
[visible]="validateForm.valid"
[locale]="locale"
[nzSemantic]="nzSemantic"
(loadMorePreview)="loadMorePreview()"
></nz-cron-expression-preview>
</div>
<div class="ant-cron-expression-map" *ngIf="nzExtra">
<ng-template [ngTemplateOutlet]="nzExtra"></ng-template>
</div>
</div>
`,
providers: [
{
provide: NG_ASYNC_VALIDATORS,
useExisting: forwardRef(() => NzCronExpressionComponent),
multi: true
},
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => NzCronExpressionComponent),
multi: true
}
]
}]
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.NzI18nService }]; }, propDecorators: { nzSize: [{
type: Input
}], nzType: [{
type: Input
}], nzCollapseDisable: [{
type: Input
}], nzExtra: [{
type: Input
}], nzSemantic: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi1leHByZXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY3Jvbi1leHByZXNzaW9uL2Nyb24tZXhwcmVzc2lvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBSUwsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFJTCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBSWpCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQWtCLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUc5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7O0FBeUV2RCxNQUFNLE9BQU8seUJBQXlCO0lBb0RwQyxZQUFvQixXQUErQixFQUFVLEdBQXNCLEVBQVUsSUFBbUI7UUFBNUYsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFlO1FBbkR2RyxXQUFNLEdBQXlCLFNBQVMsQ0FBQztRQUN6QyxXQUFNLEdBQXVCLE9BQU8sQ0FBQztRQUNyQixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkQsWUFBTyxHQUE4QixJQUFJLENBQUM7UUFDMUMsZUFBVSxHQUE2QixJQUFJLENBQUM7UUFHckQsVUFBSyxHQUFZLEtBQUssQ0FBQztRQUN2QixlQUFVLEdBQW9CLElBQUksQ0FBQztRQUNuQyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxXQUFNLEdBQWUs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LEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7cUtBRVUsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDbUIsaUJBQWlCO3NCQUF6QyxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQXN5bmNWYWxpZGF0b3IsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVW50eXBlZEZvcm1Hcm91cCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDcm9uRXhwcmVzc2lvbiwgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnY3Jvbi1wYXJzZXInO1xuXG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgTnpDcm9uRXhwcmVzc2lvbkkxOG5JbnRlcmZhY2UsIE56STE4blNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2kxOG4nO1xuXG5pbXBvcnQgeyBDcm9uQ2hhbmdlVHlwZSwgQ3JvblR5cGUsIE56Q3JvbkV4cHJlc3Npb25TaXplLCBUaW1lVHlwZSB9IGZyb20gJy4vdHlwaW5ncyc7XG5cbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc2VsZWN0b3I6ICduei1jcm9uLWV4cHJlc3Npb24nLFxuICBleHBvcnRBczogJ256Q3JvbkV4cHJlc3Npb24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW50LWNyb24tZXhwcmVzc2lvbi1jb250ZW50XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImFudC1pbnB1dCBhbnQtY3Jvbi1leHByZXNzaW9uLWlucHV0LWdyb3VwXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LWxnXT1cIm56U2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1zbV09XCJuelNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtY3Jvbi1leHByZXNzaW9uLWlucHV0LWdyb3VwLWZvY3VzXT1cImZvY3VzXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWNyb24tZXhwcmVzc2lvbi1pbnB1dC1ncm91cC1lcnJvcl09XCIhdmFsaWRhdGVGb3JtLnZhbGlkXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWNyb24tZXhwcmVzc2lvbi1pbnB1dC1ncm91cC1lcnJvci1mb2N1c109XCIhdmFsaWRhdGVGb3JtLnZhbGlkICYmIGZvY3VzXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxhYmVsIG9mIGxhYmVsc1wiPlxuICAgICAgICAgICAgPG56LWNyb24tZXhwcmVzc2lvbi1pbnB1dFxuICAgICAgICAgICAgICBbdmFsdWVdPVwidGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHNbbGFiZWxdLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICAgICAgICAgICAgKGZvY3VzRWZmZWN0KT1cImZvY3VzRWZmZWN0KCRldmVudClcIlxuICAgICAgICAgICAgICAoYmx1ckVmZmVjdCk9XCJibHVyRWZmZWN0KClcIlxuICAgICAgICAgICAgICAoZ2V0VmFsdWUpPVwiZ2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9uei1jcm9uLWV4cHJlc3Npb24taW5wdXQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uLWxhYmVsLWdyb3VwXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LWxnXT1cIm56U2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1jcm9uLWV4cHJlc3Npb24tbGFiZWwtZ3JvdXAtZGVmYXVsdF09XCJuelNpemUgPT09ICdkZWZhdWx0J1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1zbV09XCJuelNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGFiZWwgb2YgbGFiZWxzXCI+XG4gICAgICAgICAgICA8bnotY3Jvbi1leHByZXNzaW9uLWxhYmVsXG4gICAgICAgICAgICAgIFt0eXBlXT1cImxhYmVsXCJcbiAgICAgICAgICAgICAgW3ZhbGlkXT1cInRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2xhYmVsXS52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbEZvY3VzXT1cImxhYmVsRm9jdXNcIlxuICAgICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICA+PC9uei1jcm9uLWV4cHJlc3Npb24tbGFiZWw+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bnotY3Jvbi1leHByZXNzaW9uLXByZXZpZXdcbiAgICAgICAgICAqbmdJZj1cIiFuekNvbGxhcHNlRGlzYWJsZVwiXG4gICAgICAgICAgW1RpbWVMaXN0XT1cIm5leHRUaW1lTGlzdFwiXG4gICAgICAgICAgW3Zpc2libGVdPVwidmFsaWRhdGVGb3JtLnZhbGlkXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgW256U2VtYW50aWNdPVwibnpTZW1hbnRpY1wiXG4gICAgICAgICAgKGxvYWRNb3JlUHJldmlldyk9XCJsb2FkTW9yZVByZXZpZXcoKVwiXG4gICAgICAgID48L256LWNyb24tZXhwcmVzc2lvbi1wcmV2aWV3PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW50LWNyb24tZXhwcmVzc2lvbi1tYXBcIiAqbmdJZj1cIm56RXh0cmFcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm56RXh0cmFcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOekNyb25FeHByZXNzaW9uQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE56Q3JvbkV4cHJlc3Npb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTnpDcm9uRXhwcmVzc2lvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFzeW5jVmFsaWRhdG9yLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBuelNpemU6IE56Q3JvbkV4cHJlc3Npb25TaXplID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBuelR5cGU6ICdsaW51eCcgfCAnc3ByaW5nJyA9ICdsaW51eCc7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekNvbGxhcHNlRGlzYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBuekV4dHJhPzogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpTZW1hbnRpYzogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuICBsb2NhbGUhOiBOekNyb25FeHByZXNzaW9uSTE4bkludGVyZmFjZTtcbiAgZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbGFiZWxGb2N1czogVGltZVR5cGUgfCBudWxsID0gbnVsbDtcbiAgdmFsaWRMYWJlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxhYmVsczogVGltZVR5cGVbXSA9IFtdO1xuICBpbnRlcnZhbCE6IENyb25FeHByZXNzaW9uPGZhbHNlPjtcbiAgbmV4dFRpbWVMaXN0OiBEYXRlW10gPSBbXTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgdmFsaWRhdGVGb3JtITogVW50eXBlZEZvcm1Hcm91cDtcblxuICBvbkNoYW5nZTogTnpTYWZlQW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2g6ICgpID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuXG4gIGNvbnZlcnRGb3JtYXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlLnNwbGl0KCcgJyk7XG4gICAgY29uc3QgdmFsdWVPYmplY3Q6IENyb25UeXBlID0ge307XG4gICAgdGhpcy5sYWJlbHMubWFwKChhLCBiKSA9PiB7XG4gICAgICB2YWx1ZU9iamVjdFthXSA9IHZhbHVlc1tiXTtcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlRm9ybS5wYXRjaFZhbHVlKHZhbHVlT2JqZWN0KTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuY29udmVydEZvcm1hdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IE56U2FmZUFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG5cbiAgdmFsaWRhdGUoKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLnZhbGlkYXRlRm9ybS52YWxpZCkge1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2YoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBpMThuOiBOekkxOG5TZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56VHlwZSA9PT0gJ3NwcmluZycpIHtcbiAgICAgIHRoaXMubGFiZWxzID0gWydzZWNvbmQnLCAnbWludXRlJywgJ2hvdXInLCAnZGF5JywgJ21vbnRoJywgJ3dlZWsnXTtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIHNlY29uZDogWycwJywgVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5jaGVja1ZhbGlkXSxcbiAgICAgICAgbWludXRlOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICBob3VyOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICBkYXk6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIG1vbnRoOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICB3ZWVrOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYWJlbHMgPSBbJ21pbnV0ZScsICdob3VyJywgJ2RheScsICdtb250aCcsICd3ZWVrJ107XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICBtaW51dGU6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIGhvdXI6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIGRheTogWycqJywgVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5jaGVja1ZhbGlkXSxcbiAgICAgICAgbW9udGg6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIHdlZWs6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmkxOG4ubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmkxOG4uZ2V0TG9jYWxlRGF0YSgnQ3JvbkV4cHJlc3Npb24nKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcmV2aWV3RGF0ZSh0aGlzLnZhbGlkYXRlRm9ybS52YWx1ZSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlRm9ybS52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKE9iamVjdC52YWx1ZXModmFsdWUpLmpvaW4oJyAnKSk7XG4gICAgICB0aGlzLnByZXZpZXdEYXRlKHZhbHVlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJldmlld0RhdGUodmFsdWU6IENyb25UeXBlKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaW50ZXJ2YWwgPSBwYXJzZUV4cHJlc3Npb24oT2JqZWN0LnZhbHVlcyh2YWx1ZSkuam9pbignICcpKTtcbiAgICAgIHRoaXMubmV4dFRpbWVMaXN0ID0gW1xuICAgICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKClcbiAgICAgIF07XG4gICAgfSBjYXRjaCAoZXJyOiBOelNhZmVBbnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBsb2FkTW9yZVByZXZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5uZXh0VGltZUxpc3QgPSBbXG4gICAgICAuLi50aGlzLm5leHRUaW1lTGlzdCxcbiAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKClcbiAgICBdO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZm9jdXNFZmZlY3QodmFsdWU6IFRpbWVUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5sYWJlbEZvY3VzID0gdmFsdWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBibHVyRWZmZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLmxhYmVsRm9jdXMgPSBudWxsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0VmFsdWUoaXRlbTogQ3JvbkNoYW5nZVR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkTGFiZWwgPSBpdGVtLmxhYmVsO1xuICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2l0ZW0ubGFiZWxdLnBhdGNoVmFsdWUoaXRlbS52YWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjaGVja1ZhbGlkID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4gPT4ge1xuICAgIGlmIChjb250cm9sLnZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjcm9uOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLmxhYmVscy5mb3JFYWNoKGxhYmVsID0+IHtcbiAgICAgICAgICBsYWJlbCA9PT0gdGhpcy52YWxpZExhYmVsID8gY3Jvbi5wdXNoKGNvbnRyb2wudmFsdWUpIDogY3Jvbi5wdXNoKCcqJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXJzZUV4cHJlc3Npb24oY3Jvbi5qb2luKCcgJykpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBvZih7IGVycm9yOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2YobnVsbCk7XG4gIH07XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=