UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

342 lines 36.8 kB
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 { NgForOf, NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, forwardRef, inject, Input, ViewEncapsulation } from '@angular/core'; import { NG_ASYNC_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { of } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { parseExpression } from 'cron-parser'; import { NzDestroyService } from 'ng-zorro-antd/core/services'; import { InputBoolean } from 'ng-zorro-antd/core/util'; import { NzCronExpressionInputComponent } from './cron-expression-input.component'; import { NzCronExpressionLabelComponent } from './cron-expression-label.component'; import { NzCronExpressionPreviewComponent } from './cron-expression-preview.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "ng-zorro-antd/i18n"; function labelsOfType(type) { if (type === 'spring') { return ['second', 'minute', 'hour', 'day', 'month', 'week']; } return ['minute', 'hour', 'day', 'month', 'week']; } export class NzCronExpressionComponent { convertFormat(value) { const values = value.split(' '); const valueObject = this.labels.reduce((obj, label, idx) => { obj[label] = values[idx]; return obj; }, {}); 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 }); } } setDisabledState(isDisabled) { this.nzDisabled = (this.isNzDisableFirstChange && this.nzDisabled) || isDisabled; this.isNzDisableFirstChange = false; this.cdr.markForCheck(); } 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.nzBorderless = false; this.nzDisabled = false; this.focus = false; this.labelFocus = null; this.labels = labelsOfType(this.nzType); this.nextTimeList = []; this.isNzDisableFirstChange = true; this.destroy$ = inject(NzDestroyService); this.onChange = () => { }; this.onTouch = () => null; this.checkValid = (control) => { if (control.value) { try { const cron = []; this.labels.forEach(label => { cron.push(control.value[label]); }); parseExpression(cron.join(' ')); } catch (err) { return { error: true }; } } return null; }; this.validateForm = this.formBuilder.nonNullable.group({ second: ['0', Validators.required], minute: ['*', Validators.required], hour: ['*', Validators.required], day: ['*', Validators.required], month: ['*', Validators.required], week: ['*', Validators.required] }, { validators: this.checkValid }); } ngOnInit() { this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe(() => { this.locale = this.i18n.getLocaleData('CronExpression'); this.cdr.markForCheck(); }); this.cronFormType(); 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(); }); } ngOnChanges(changes) { const { nzType } = changes; if (nzType) { this.labels = labelsOfType(this.nzType); this.cronFormType(); } } cronFormType() { if (this.nzType === 'spring') { this.validateForm.controls.second.enable(); } else { this.validateForm.controls.second.disable(); } } 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.validateForm.controls[item.label].patchValue(item.value); this.cdr.markForCheck(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: NzCronExpressionComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.NzI18nService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: NzCronExpressionComponent, isStandalone: true, selector: "nz-cron-expression", inputs: { nzSize: "nzSize", nzType: "nzType", nzCollapseDisable: "nzCollapseDisable", nzExtra: "nzExtra", nzSemantic: "nzSemantic", nzBorderless: "nzBorderless", nzDisabled: "nzDisabled" }, providers: [ { provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true }, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true }, NzDestroyService ], exportAs: ["nzCronExpression"], usesOnChanges: true, 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-input-borderless]="nzBorderless" [class.ant-cron-expression-input-group-focus]="focus && !nzBorderless" [class.ant-input-status-error]="!validateForm.valid && !nzBorderless" [class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus && !nzBorderless" [class.ant-input-disabled]="nzDisabled" > <ng-container *ngFor="let label of labels"> <nz-cron-expression-input [value]="this.validateForm.controls[label].value" [label]="label" [disabled]="nzDisabled" (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" [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: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: NzCronExpressionInputComponent, selector: "nz-cron-expression-input", inputs: ["value", "label", "disabled"], outputs: ["focusEffect", "blurEffect", "getValue"], exportAs: ["nzCronExpressionInput"] }, { kind: "component", type: NzCronExpressionLabelComponent, selector: "nz-cron-expression-label", inputs: ["type", "locale", "labelFocus"], exportAs: ["nzCronExpressionLabel"] }, { kind: "component", type: NzCronExpressionPreviewComponent, selector: "nz-cron-expression-preview", inputs: ["TimeList", "visible", "locale", "nzSemantic"], outputs: ["loadMorePreview"], exportAs: ["nzCronExpressionPreview"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } __decorate([ InputBoolean() ], NzCronExpressionComponent.prototype, "nzCollapseDisable", void 0); __decorate([ InputBoolean() ], NzCronExpressionComponent.prototype, "nzBorderless", void 0); __decorate([ InputBoolean() ], NzCronExpressionComponent.prototype, "nzDisabled", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", 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-input-borderless]="nzBorderless" [class.ant-cron-expression-input-group-focus]="focus && !nzBorderless" [class.ant-input-status-error]="!validateForm.valid && !nzBorderless" [class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus && !nzBorderless" [class.ant-input-disabled]="nzDisabled" > <ng-container *ngFor="let label of labels"> <nz-cron-expression-input [value]="this.validateForm.controls[label].value" [label]="label" [disabled]="nzDisabled" (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" [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 }, NzDestroyService ], imports: [ NgForOf, NzCronExpressionInputComponent, NzCronExpressionLabelComponent, NzCronExpressionPreviewComponent, NgIf, NgTemplateOutlet ], standalone: true }] }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.NzI18nService }], propDecorators: { nzSize: [{ type: Input }], nzType: [{ type: Input }], nzCollapseDisable: [{ type: Input }], nzExtra: [{ type: Input }], nzSemantic: [{ type: Input }], nzBorderless: [{ type: Input }], nzDisabled: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi1leHByZXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY3Jvbi1leHByZXNzaW9uL2Nyb24tZXhwcmVzc2lvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBS0wsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFPTCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBR2pCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRS9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUd2RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7OztBQUd2RixTQUFTLFlBQVksQ0FBQyxJQUEwQjtJQUM5QyxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDckIsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENB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QWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtRFQ7b0JBQ0QsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxtQkFBbUI7NEJBQzVCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDBCQUEwQixDQUFDOzRCQUN4RCxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0QsZ0JBQWdCO3FCQUNqQjtvQkFDRCxPQUFPLEVBQUU7d0JBQ1AsT0FBTzt3QkFDUCw4QkFBOEI7d0JBQzlCLDhCQUE4Qjt3QkFDOUIsZ0NBQWdDO3dCQUNoQyxJQUFJO3dCQUNKLGdCQUFnQjtxQkFDakI7b0JBQ0QsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzRJQUtVLE1BQU07c0JBQWQsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ21CLGlCQUFpQjtzQkFBekMsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDbUIsWUFBWTtzQkFBcEMsS0FBSztnQkFDbUIsVUFBVTtzQkFBbEMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IE5nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEFzeW5jVmFsaWRhdG9yLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUJ1aWxkZXIsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JGbixcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDcm9uRXhwcmVzc2lvbiwgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnY3Jvbi1wYXJzZXInO1xuXG5pbXBvcnQgeyBOekRlc3Ryb3lTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3NlcnZpY2VzJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcbmltcG9ydCB7IE56Q3JvbkV4cHJlc3Npb25JMThuSW50ZXJmYWNlLCBOekkxOG5TZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pMThuJztcblxuaW1wb3J0IHsgTnpDcm9uRXhwcmVzc2lvbklucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9jcm9uLWV4cHJlc3Npb24taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IE56Q3JvbkV4cHJlc3Npb25MYWJlbENvbXBvbmVudCB9IGZyb20gJy4vY3Jvbi1leHByZXNzaW9uLWxhYmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOekNyb25FeHByZXNzaW9uUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4vY3Jvbi1leHByZXNzaW9uLXByZXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IENyb24sIENyb25DaGFuZ2VUeXBlLCBDcm9uVmFsdWUsIE56Q3JvbkV4cHJlc3Npb25TaXplLCBOekNyb25FeHByZXNzaW9uVHlwZSwgVGltZVR5cGUgfSBmcm9tICcuL3R5cGluZ3MnO1xuXG5mdW5jdGlvbiBsYWJlbHNPZlR5cGUodHlwZTogTnpDcm9uRXhwcmVzc2lvblR5cGUpOiBUaW1lVHlwZVtdIHtcbiAgaWYgKHR5cGUgPT09ICdzcHJpbmcnKSB7XG4gICAgcmV0dXJuIFsnc2Vjb25kJywgJ21pbnV0ZScsICdob3VyJywgJ2RheScsICdtb250aCcsICd3ZWVrJ107XG4gIH1cbiAgcmV0dXJuIFsnbWludXRlJywgJ2hvdXInLCAnZGF5JywgJ21vbnRoJywgJ3dlZWsnXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzZWxlY3RvcjogJ256LWNyb24tZXhwcmVzc2lvbicsXG4gIGV4cG9ydEFzOiAnbnpDcm9uRXhwcmVzc2lvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImFudC1jcm9uLWV4cHJlc3Npb25cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYW50LWlucHV0IGFudC1jcm9uLWV4cHJlc3Npb24taW5wdXQtZ3JvdXBcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtaW5wdXQtbGddPVwibnpTaXplID09PSAnbGFyZ2UnXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LXNtXT1cIm56U2l6ZSA9PT0gJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1ib3JkZXJsZXNzXT1cIm56Qm9yZGVybGVzc1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1jcm9uLWV4cHJlc3Npb24taW5wdXQtZ3JvdXAtZm9jdXNdPVwiZm9jdXMgJiYgIW56Qm9yZGVybGVzc1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1zdGF0dXMtZXJyb3JdPVwiIXZhbGlkYXRlRm9ybS52YWxpZCAmJiAhbnpCb3JkZXJsZXNzXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWNyb24tZXhwcmVzc2lvbi1pbnB1dC1ncm91cC1lcnJvci1mb2N1c109XCIhdmFsaWRhdGVGb3JtLnZhbGlkICYmIGZvY3VzICYmICFuekJvcmRlcmxlc3NcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtaW5wdXQtZGlzYWJsZWRdPVwibnpEaXNhYmxlZFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBsYWJlbHNcIj5cbiAgICAgICAgICAgIDxuei1jcm9uLWV4cHJlc3Npb24taW5wdXRcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cInRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2xhYmVsXS52YWx1ZVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJsYWJlbFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJuekRpc2FibGVkXCJcbiAgICAgICAgICAgICAgKGZvY3VzRWZmZWN0KT1cImZvY3VzRWZmZWN0KCRldmVudClcIlxuICAgICAgICAgICAgICAoYmx1ckVmZmVjdCk9XCJibHVyRWZmZWN0KClcIlxuICAgICAgICAgICAgICAoZ2V0VmFsdWUpPVwiZ2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9uei1jcm9uLWV4cHJlc3Npb24taW5wdXQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uLWxhYmVsLWdyb3VwXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LWxnXT1cIm56U2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1jcm9uLWV4cHJlc3Npb24tbGFiZWwtZ3JvdXAtZGVmYXVsdF09XCJuelNpemUgPT09ICdkZWZhdWx0J1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1zbV09XCJuelNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGFiZWwgb2YgbGFiZWxzXCI+XG4gICAgICAgICAgICA8bnotY3Jvbi1leHByZXNzaW9uLWxhYmVsXG4gICAgICAgICAgICAgIFt0eXBlXT1cImxhYmVsXCJcbiAgICAgICAgICAgICAgW2xhYmVsRm9jdXNdPVwibGFiZWxGb2N1c1wiXG4gICAgICAgICAgICAgIFtsb2NhbGVdPVwibG9jYWxlXCJcbiAgICAgICAgICAgID48L256LWNyb24tZXhwcmVzc2lvbi1sYWJlbD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuei1jcm9uLWV4cHJlc3Npb24tcHJldmlld1xuICAgICAgICAgICpuZ0lmPVwiIW56Q29sbGFwc2VEaXNhYmxlXCJcbiAgICAgICAgICBbVGltZUxpc3RdPVwibmV4dFRpbWVMaXN0XCJcbiAgICAgICAgICBbdmlzaWJsZV09XCJ2YWxpZGF0ZUZvcm0udmFsaWRcIlxuICAgICAgICAgIFtsb2NhbGVdPVwibG9jYWxlXCJcbiAgICAgICAgICBbbnpTZW1hbnRpY109XCJuelNlbWFudGljXCJcbiAgICAgICAgICAobG9hZE1vcmVQcmV2aWV3KT1cImxvYWRNb3JlUHJldmlldygpXCJcbiAgICAgICAgPjwvbnotY3Jvbi1leHByZXNzaW9uLXByZXZpZXc+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uLW1hcFwiICpuZ0lmPVwibnpFeHRyYVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibnpFeHRyYVwiPjwvbmctdGVtcGxhdGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE56Q3JvbkV4cHJlc3Npb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnpDcm9uRXhwcmVzc2lvbkNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH0sXG4gICAgTnpEZXN0cm95U2VydmljZVxuICBdLFxuICBpbXBvcnRzOiBbXG4gICAgTmdGb3JPZixcbiAgICBOekNyb25FeHByZXNzaW9uSW5wdXRDb21wb25lbnQsXG4gICAgTnpDcm9uRXhwcmVzc2lvbkxhYmVsQ29tcG9uZW50LFxuICAgIE56Q3JvbkV4cHJlc3Npb25QcmV2aWV3Q29tcG9uZW50LFxuICAgIE5nSWYsXG4gICAgTmdUZW1wbGF0ZU91dGxldFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE56Q3JvbkV4cHJlc3Npb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFzeW5jVmFsaWRhdG9yIHtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256Qm9yZGVybGVzczogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpEaXNhYmxlZDogQm9vbGVhbklucHV0O1xuXG4gIEBJbnB1dCgpIG56U2l6ZTogTnpDcm9uRXhwcmVzc2lvblNpemUgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIG56VHlwZTogTnpDcm9uRXhwcmVzc2lvblR5cGUgPSAnbGludXgnO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDb2xsYXBzZURpc2FibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbnpFeHRyYT86IFRlbXBsYXRlUmVmPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG56U2VtYW50aWM6IFRlbXBsYXRlUmVmPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekJvcmRlcmxlc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56RGlzYWJsZWQgPSBmYWxzZTtcblxuICBsb2NhbGUhOiBOekNyb25FeHByZXNzaW9uSTE4bkludGVyZmFjZTtcbiAgZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbGFiZWxGb2N1czogVGltZVR5cGUgfCBudWxsID0gbnVsbDtcbiAgbGFiZWxzOiBUaW1lVHlwZVtdID0gbGFiZWxzT2ZUeXBlKHRoaXMubnpUeXBlKTtcbiAgaW50ZXJ2YWwhOiBDcm9uRXhwcmVzc2lvbjxmYWxzZT47XG4gIG5leHRUaW1lTGlzdDogRGF0ZVtdID0gW107XG4gIHByaXZhdGUgaXNOekRpc2FibGVGaXJzdENoYW5nZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBpbmplY3QoTnpEZXN0cm95U2VydmljZSk7XG5cbiAgdmFsaWRhdGVGb3JtOiBGb3JtR3JvdXA8UmVjb3JkPFRpbWVUeXBlLCBGb3JtQ29udHJvbDxDcm9uVmFsdWU+Pj47XG5cbiAgb25DaGFuZ2U6IE56U2FmZUFueSA9ICgpID0+IHt9O1xuICBvblRvdWNoOiAoKSA9PiB2b2lkID0gKCkgPT4gbnVsbDtcblxuICBjb252ZXJ0Rm9ybWF0KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZS5zcGxpdCgnICcpO1xuICAgIGNvbnN0IHZhbHVlT2JqZWN0ID0gdGhpcy5sYWJlbHMucmVkdWNlKChvYmosIGxhYmVsLCBpZHgpID0+IHtcbiAgICAgIG9ialtsYWJlbF0gPSB2YWx1ZXNbaWR4XTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSwge30gYXMgQ3Jvbik7XG4gICAgdGhpcy52YWxpZGF0ZUZvcm0ucGF0Y2hWYWx1ZSh2YWx1ZU9iamVjdCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNvbnZlcnRGb3JtYXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IE56U2FmZUFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBOelNhZmVBbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgfVxuXG4gIHZhbGlkYXRlKCk6IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHtcbiAgICBpZiAodGhpcy52YWxpZGF0ZUZvcm0udmFsaWQpIHtcbiAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9mKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5uekRpc2FibGVkID0gKHRoaXMuaXNOekRpc2FibGVGaXJzdENoYW5nZSAmJiB0aGlzLm56RGlzYWJsZWQpIHx8IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5pc056RGlzYWJsZUZpcnN0Q2hhbmdlID0gZmFsc2U7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBpMThuOiBOekkxOG5TZXJ2aWNlXG4gICkge1xuICAgIHRoaXMudmFsaWRhdGVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ub25OdWxsYWJsZS5ncm91cChcbiAgICAgIHtcbiAgICAgICAgc2Vjb25kOiBbJzAnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgbWludXRlOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgaG91cjogWycqJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIGRheTogWycqJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG1vbnRoOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgd2VlazogWycqJywgVmFsaWRhdG9ycy5yZXF1aXJlZF1cbiAgICAgIH0sXG4gICAgICB7IHZhbGlkYXRvcnM6IHRoaXMuY2hlY2tWYWxpZCB9XG4gICAgKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaTE4bi5sb2NhbGVDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmxvY2FsZSA9IHRoaXMuaTE4bi5nZXRMb2NhbGVEYXRhKCdDcm9uRXhwcmVzc2lvbicpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jcm9uRm9ybVR5cGUoKTtcbiAgICB0aGlzLnByZXZpZXdEYXRlKHRoaXMudmFsaWRhdGVGb3JtLnZhbHVlKTtcblxuICAgIHRoaXMudmFsaWRhdGVGb3JtLnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIHRoaXMub25DaGFuZ2UoT2JqZWN0LnZhbHVlcyh2YWx1ZSkuam9pbignICcpKTtcbiAgICAgIHRoaXMucHJldmlld0RhdGUodmFsdWUpO1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgeyBuelR5cGUgfSA9IGNoYW5nZXM7XG5cbiAgICBpZiAobnpUeXBlKSB7XG4gICAgICB0aGlzLmxhYmVscyA9IGxhYmVsc09mVHlwZSh0aGlzLm56VHlwZSk7XG4gICAgICB0aGlzLmNyb25Gb3JtVHlwZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNyb25Gb3JtVHlwZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uelR5cGUgPT09ICdzcHJpbmcnKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybS5jb250cm9scy5zZWNvbmQuZW5hYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzLnNlY29uZC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJldmlld0RhdGUodmFsdWU6IENyb24pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5pbnRlcnZhbCA9IHBhcnNlRXhwcmVzc2lvbihPYmplY3QudmFsdWVzKHZhbHVlKS5qb2luKCcgJykpO1xuICAgICAgdGhpcy5uZXh0VGltZUxpc3QgPSBbXG4gICAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKVxuICAgICAgXTtcbiAgICB9IGNhdGNoIChlcnI6IE56U2FmZUFueSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGxvYWRNb3JlUHJldmlldygpOiB2b2lkIHtcbiAgICB0aGlzLm5leHRUaW1lTGlzdCA9IFtcbiAgICAgIC4uLnRoaXMubmV4dFRpbWVMaXN0LFxuICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKVxuICAgIF07XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBmb2N1c0VmZmVjdCh2YWx1ZTogVGltZVR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzID0gdHJ1ZTtcbiAgICB0aGlzLmxhYmVsRm9jdXMgPSB2YWx1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGJsdXJFZmZlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMubGFiZWxGb2N1cyA9IG51bGw7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXRWYWx1ZShpdGVtOiBDcm9uQ2hhbmdlVHlwZSk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2l0ZW0ubGFiZWxdLnBhdGNoVmFsdWUoaXRlbS52YWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjaGVja1ZhbGlkOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgaWYgKGNvbnRyb2wudmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNyb246IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRoaXMubGFiZWxzLmZvckVhY2gobGFiZWwgPT4ge1xuICAgICAgICAgIGNyb24ucHVzaChjb250cm9sLnZhbHVlW2xhYmVsXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXJzZUV4cHJlc3Npb24oY3Jvbi5qb2luKCcgJykpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xufVxuIl19