UNPKG

@ecip/system

Version:
323 lines 37.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component } from '@angular/core'; import { NzModalRef, NzMessageService } from 'ng-zorro-antd'; import { _HttpClient } from '@delon/theme'; import { FormBuilder, Validators } from '@angular/forms'; import { Observable } from 'rxjs'; import { UserService, AppsService, ResourceService } from "@ecip/service"; import { CacheService } from "@delon/cache"; export class SystemResourceEditComponent { /** * @param {?} modal * @param {?} msgSrv * @param {?} resourceService * @param {?} userService * @param {?} appsService * @param {?} http * @param {?} fb * @param {?} cacheService */ constructor(modal, msgSrv, resourceService, userService, appsService, http, fb, cacheService) { this.modal = modal; this.msgSrv = msgSrv; this.resourceService = resourceService; this.userService = userService; this.appsService = appsService; this.http = http; this.fb = fb; this.cacheService = cacheService; this.record = {}; this.isViewpermission = false; this.defaultpermission = false; this.loading = false; this.stateList = this.cacheService.get(`api/dict/type/enableState`); this.typeSrcList = this.cacheService.get(`api/dict/type/typeSrc`); this.urlTargetList = this.cacheService.get(`api/dict/type/urlTarget`); this.typeNodeList = this.cacheService.get(`api/dict/type/typeNode`); this.codeAsyncValidator = (/** * @param {?} control * @return {?} */ (control) => Observable.create((/** * @param {?} observer * @return {?} */ (observer) => { if (!control.value) { observer.next(null); observer.complete(); return; } this.resourceService.checkCode({ code: control.value, id: this.record.id }).subscribe((/** * @param {?} res * @return {?} */ (res) => { if (res.valid === true) { observer.next(null); } else { observer.next({ error: true, duplicated: true }); } observer.complete(); })); }))); } /** * @return {?} */ ngOnInit() { this.loading = true; /*this.appsService.getList().subscribe(appList => { this.optionList = appList; });*/ this.typeSrcList.subscribe((/** * @param {?} res * @return {?} */ res => { if (res) { this.typeSrc = res[0]; } })); this.urlTargetList.subscribe((/** * @param {?} res * @return {?} */ res => { if (res) { this.urlTarget = res[0]; } })); this.typeNodeList.subscribe((/** * @param {?} res * @return {?} */ res => { if (res) { this.typeNode = res[0]; } })); /** @type {?} */ let flagBreadcrumb; /** @type {?} */ let flagMenuGroup; /** @type {?} */ let nodeLevel; /** @type {?} */ let pid = null; /** @type {?} */ let path = ''; if (!this.record.id) { if (this.isRoot) { nodeLevel = 0; flagBreadcrumb = false; flagMenuGroup = true; } else { this.isViewpermission = this.parent.typeNode !== 2; flagBreadcrumb = true; flagMenuGroup = false; pid = this.parent.id; /** @type {?} */ let parentPath = this.parent.path; if (!parentPath) { //id逗号分隔,从下到上 path = `,${this.parent.id},`; } else { path = `,${this.parent.id}${this.parent.path}`; } nodeLevel = this.parent.nodeLevel + 1; } } else { this.isViewpermission = this.record.typeNode !== 2; } this.form = this.fb.group({ appId: [this.appId, []], code: [null, [Validators.required], [this.codeAsyncValidator]], rsrcName: [null, [Validators.required]], deptId: [null, []], pid: [pid, []], path: [path, []], typeSrc: [this.typeSrc ? this.typeSrc.value : '', [Validators.required]], typeNode: [this.typeNode ? this.typeNode.value : '', [Validators.required]], url: [null, []], urlTarget: [this.urlTarget ? this.urlTarget.value : '', []], rsrcIcon: [null, []], rsrcStatus: [1, [Validators.required]], flagBreadcrumb: [flagBreadcrumb, [Validators.required]], flagMenuGroup: [flagMenuGroup, [Validators.required]], sortNm: [0, [Validators.required]], permission: [null, []], beginTime: [null, []], endTime: [null, []], nodeLevel: [nodeLevel, []], defaultpermission: [false, [Validators.required]], }); if (!this.record.id) { return; } this.resourceService.getById(this.record.id).subscribe((/** * @param {?} res * @return {?} */ (res) => { this.form.patchValue(res); // this.form.patchValue({code: res.code}); this.i = res; })); } /** * @param {?} c1 * @param {?} c2 * @return {?} */ compareNumStr(c1, c2) { return c1 == c2; } /** * @return {?} */ submit() { for (const i in this.form.controls) { this.form.controls[i].markAsDirty(); this.form.controls[i].updateValueAndValidity(); } if (this.form.invalid) return; if (!this.record.id) { //新增 this.resourceService.post(this.form.value).subscribe((/** * @param {?} res * @return {?} */ (res) => { this.msgSrv.success('保存成功'); if (this.form.value.defaultpermission) { this.resourceService.addDefaultPermission(res).subscribe((/** * @param {?} data * @return {?} */ (data) => { res.children = []; data.forEach((/** * @param {?} it * @return {?} */ it => { res.children.push(it); })); })); } this.modal.close(res); })); return; } //修改 this.resourceService.put(this.record.id, this.form.value).subscribe((/** * @param {?} res * @return {?} */ (res) => { this.msgSrv.success('保存成功'); // 是否新增默认权限 if (this.form.value.defaultpermission) { // 新增默认权限 this.resourceService.addDefaultPermission(res).subscribe((/** * @return {?} */ () => { })); } this.modal.close({ result: res, addFlag: this.form.value.defaultpermission }); })); } /** * @return {?} */ close() { this.modal.destroy(); } } SystemResourceEditComponent.decorators = [ { type: Component, args: [{ selector: 'app-system-resource-edit', template: "<div class=\"modal-header\">\r\n <div *ngIf=\"!record.id\" class=\"modal-title\">\u65B0\u589E\u4FE1\u606F</div>\r\n <div *ngIf=\"record.id\" class=\"modal-title\">\u7F16\u8F91 {{ record.account }} \u4FE1\u606F</div>\r\n</div>\r\n<nz-spin *ngIf=\"!i && !record.id\" class=\"modal-spin\"></nz-spin>\r\n<form *ngIf=\"!record.id || record.id && i\" nz-form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"code\">\u7F16\u7801</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"code\">\r\n <nz-form-explain *ngIf=\"form.get('code').dirty && form.get('code').errors || form.get('code').pending \">\r\n <ng-container *ngIf=\"form.get('code').hasError('required')\">\r\n \u8BF7\u8F93\u5165\u7F16\u7801\r\n </ng-container>\r\n <ng-container *ngIf=\"form.get('code').hasError('duplicated')\">\r\n \u7F16\u7801\u5DF2\u5B58\u5728\r\n </ng-container>\r\n <ng-container *ngIf=\"form.get('code').pending\">\r\n \u6821\u9A8C\u4E2D...\r\n </ng-container>\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzFor=\"urlTarget\">url\u7C7B\u578B</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <nz-select [compareWith]=\"compareNumStr\" nzAllowClear formControlName=\"urlTarget\">\r\n <nz-option *ngFor=\"let urlTarget of urlTargetList | async\" [nzValue]=\"urlTarget.value\" [nzLabel]=\"urlTarget.label\"></nz-option>\r\n </nz-select>\r\n <nz-form-explain *ngIf=\"form.get('urlTarget').dirty && form.get('urlTarget').errors\">\r\n \u8BF7\u9009\u62E9url\u7C7B\u578B\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"rsrcName\">\u8D44\u6E90\u540D\u79F0</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"rsrcName\">\r\n <nz-form-explain *ngIf=\"form.get('rsrcName').dirty && form.get('rsrcName').errors\">\r\n \u8BF7\u8F93\u5165\u8D44\u6E90\u540D\u79F0\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"typeSrc\">\u8D44\u6E90\u5206\u7C7B</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <nz-select [compareWith]=\"compareNumStr\" nzAllowClear formControlName=\"typeSrc\">\r\n <nz-option *ngFor=\"let typeSrc of typeSrcList | async\" [nzValue]=\"typeSrc.value\" [nzLabel]=\"typeSrc.label\"></nz-option>\r\n </nz-select>\r\n <nz-form-explain *ngIf=\"form.get('typeSrc').dirty && form.get('typeSrc').errors\">\r\n \u8BF7\u9009\u62E9\u8D44\u6E90\u5206\u7C7B\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"typeNode\">\u8D44\u6E90\u7C7B\u578B</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <nz-select [compareWith]=\"compareNumStr\" nzAllowClear formControlName=\"typeNode\">\r\n <nz-option *ngFor=\"let typeNode of typeNodeList | async\" [nzValue]=\"typeNode.value\" [nzLabel]=\"typeNode.label\"></nz-option>\r\n </nz-select>\r\n <nz-form-explain *ngIf=\"form.get('typeNode').dirty && form.get('typeNode').errors\">\r\n \u8BF7\u9009\u62E9\u8D44\u6E90\u7C7B\u578B\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzFor=\"url\">URL</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"url\">\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzFor=\"rsrcIcon\">\u8D44\u6E90\u6837\u5F0F</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"rsrcIcon\">\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzFor=\"permission\">\u6743\u9650\u6807\u5FD7</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"permission\">\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"flagBreadcrumb\">\u663E\u793A\u5728\u9762\u5305\u5C51</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\">\r\n <nz-radio-group formControlName=\"flagBreadcrumb\">\r\n <label nz-radio [nzValue]=\"true\">\u663E\u793A</label>\r\n <label nz-radio [nzValue]=\"false\">\u4E0D\u663E\u793A</label>\r\n </nz-radio-group>\r\n <nz-form-explain *ngIf=\"form.get('flagBreadcrumb').dirty && form.get('flagBreadcrumb').errors\">\r\n \u8BF7\u9009\u62E9\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"flagMenuGroup\">\u662F\u5426\u83DC\u5355\u7EC4</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\">\r\n <nz-radio-group formControlName=\"flagMenuGroup\">\r\n <label nz-radio [nzValue]=\"true\">\u662F</label>\r\n <label nz-radio [nzValue]=\"false\">\u5426</label>\r\n </nz-radio-group>\r\n <nz-form-explain *ngIf=\"form.get('flagMenuGroup').dirty && form.get('flagMenuGroup').errors\">\r\n \u8BF7\u9009\u62E9\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n <div nz-row>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"sortNm\">\u6392\u5E8F</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\" nzHasFeedback>\r\n <input nz-input formControlName=\"sortNm\">\r\n <nz-form-explain *ngIf=\"form.get('sortNm').dirty && form.get('sortNm').errors\">\r\n \u8BF7\u8F93\u5165\u6392\u5E8F\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"rsrcStatus\">\u542F\u7528\u72B6\u6001</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\">\r\n <nz-radio-group formControlName=\"rsrcStatus\">\r\n <label nz-radio *ngFor=\"let state of stateList | async\" [nzValue]=\"state.value\">{{state.label}}</label>\r\n </nz-radio-group>\r\n <nz-form-explain *ngIf=\"form.get('rsrcStatus').dirty && form.get('rsrcStatus').errors\">\r\n \u8BF7\u9009\u62E9\u542F\u7528\u72B6\u6001\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n\r\n <div nz-row *ngIf=\"this.isViewpermission\">\r\n <div nz-col nzSpan=\"12\">\r\n <nz-form-item>\r\n <nz-form-label nzXs=\"24\" nzSm=\"7\" nzRequired nzFor=\"defaultpermission\">\u65B0\u589E\u9ED8\u8BA4\u6743\u9650</nz-form-label>\r\n <nz-form-control nzXs=\"24\" nzSm=\"12\" nzMd=\"10\">\r\n <nz-radio-group formControlName=\"defaultpermission\">\r\n <label nz-radio [nzValue]=\"true\">\u662F</label>\r\n <label nz-radio [nzValue]=\"false\">\u5426</label>\r\n </nz-radio-group>\r\n <nz-form-explain *ngIf=\"form.get('defaultpermission').dirty && form.get('defaultpermission').errors\">\r\n \u8BF7\u9009\u62E9\r\n </nz-form-explain>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal-footer\">\r\n <button nz-button type=\"button\" (click)=\"close()\">\u5173\u95ED</button>\r\n <button nz-button type=\"submit\" [disabled]=\"!form.valid\" nzType=\"primary\" [nzLoading]=\"http.loading\">\u4FDD\u5B58</button>\r\n </div>\r\n</form>\r\n" }] } ]; /** @nocollapse */ SystemResourceEditComponent.ctorParameters = () => [ { type: NzModalRef }, { type: NzMessageService }, { type: ResourceService }, { type: UserService }, { type: AppsService }, { type: _HttpClient }, { type: FormBuilder }, { type: CacheService } ]; if (false) { /** @type {?} */ SystemResourceEditComponent.prototype.record; /** @type {?} */ SystemResourceEditComponent.prototype.i; /** @type {?} */ SystemResourceEditComponent.prototype.appId; /** @type {?} */ SystemResourceEditComponent.prototype.isRoot; /** @type {?} */ SystemResourceEditComponent.prototype.isViewpermission; /** @type {?} */ SystemResourceEditComponent.prototype.form; /** @type {?} */ SystemResourceEditComponent.prototype.defaultpermission; /** @type {?} */ SystemResourceEditComponent.prototype.parent; /** @type {?} */ SystemResourceEditComponent.prototype.loading; /** @type {?} */ SystemResourceEditComponent.prototype.stateList; /** @type {?} */ SystemResourceEditComponent.prototype.typeSrcList; /** @type {?} */ SystemResourceEditComponent.prototype.urlTargetList; /** @type {?} */ SystemResourceEditComponent.prototype.typeNodeList; /** @type {?} */ SystemResourceEditComponent.prototype.typeSrc; /** @type {?} */ SystemResourceEditComponent.prototype.urlTarget; /** @type {?} */ SystemResourceEditComponent.prototype.typeNode; /** @type {?} */ SystemResourceEditComponent.prototype.codeAsyncValidator; /** * @type {?} * @private */ SystemResourceEditComponent.prototype.modal; /** @type {?} */ SystemResourceEditComponent.prototype.msgSrv; /** @type {?} */ SystemResourceEditComponent.prototype.resourceService; /** @type {?} */ SystemResourceEditComponent.prototype.userService; /** @type {?} */ SystemResourceEditComponent.prototype.appsService; /** @type {?} */ SystemResourceEditComponent.prototype.http; /** * @type {?} * @private */ SystemResourceEditComponent.prototype.fb; /** * @type {?} * @private */ SystemResourceEditComponent.prototype.cacheService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZWNpcC9zeXN0ZW0vIiwic291cmNlcyI6WyJzcmMvcmVzb3VyY2UvZWRpdC9lZGl0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUE4QixXQUFXLEVBQUUsVUFBVSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDakcsT0FBTyxFQUE0QixVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFM0QsT0FBTyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFNMUMsTUFBTSxPQUFPLDJCQUEyQjs7Ozs7Ozs7Ozs7SUFvQnRDLFlBQ1UsS0FBaUIsRUFDbEIsTUFBd0IsRUFDeEIsZUFBZ0MsRUFDaEMsV0FBd0IsRUFDeEIsV0FBd0IsRUFDeEIsSUFBaUIsRUFDaEIsRUFBZSxFQUNmLFlBQTBCO1FBUDFCLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFDeEIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFNBQUksR0FBSixJQUFJLENBQWE7UUFDaEIsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBM0JwQyxXQUFNLEdBQVEsRUFBRSxDQUFDO1FBSWpCLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUVsQyxzQkFBaUIsR0FB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QixDQUFDOzs7WUFoTEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLHlyU0FBb0M7YUFDckM7Ozs7WUFYUSxVQUFVO1lBQUUsZ0JBQWdCO1lBS0gsZUFBZTtZQUF6QyxXQUFXO1lBQUUsV0FBVztZQUp2QixXQUFXO1lBQ2lCLFdBQVc7WUFJeEMsWUFBWTs7OztJQU9sQiw2Q0FBaUI7O0lBQ2pCLHdDQUFPOztJQUNQLDRDQUFXOztJQUNYLDZDQUFnQjs7SUFDaEIsdURBQWtDOztJQUNsQywyQ0FBZ0I7O0lBQ2hCLHdEQUFtQzs7SUFDbkMsNkNBQU87O0lBRVAsOENBQXlCOztJQUN6QixnREFBK0Q7O0lBQy9ELGtEQUE2RDs7SUFDN0Qsb0RBQWlFOztJQUNqRSxtREFBK0Q7O0lBRS9ELDhDQUFhOztJQUNiLGdEQUFlOztJQUNmLCtDQUFjOztJQXFHZCx5REFlSzs7Ozs7SUFqSEgsNENBQXlCOztJQUN6Qiw2Q0FBK0I7O0lBQy9CLHNEQUF1Qzs7SUFDdkMsa0RBQStCOztJQUMvQixrREFBK0I7O0lBQy9CLDJDQUF3Qjs7Ozs7SUFDeEIseUNBQXVCOzs7OztJQUN2QixtREFBa0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOek1vZGFsUmVmLCBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZCc7XHJcbmltcG9ydCB7IF9IdHRwQ2xpZW50IH0gZnJvbSAnQGRlbG9uL3RoZW1lJztcclxuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3JzLCBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzLCBGb3JtQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2ZXIsIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1VzZXJTZXJ2aWNlLCBBcHBzU2VydmljZSwgUmVzb3VyY2VTZXJ2aWNlfSBmcm9tIFwiQGVjaXAvc2VydmljZVwiO1xyXG5pbXBvcnQge0NhY2hlU2VydmljZX0gZnJvbSBcIkBkZWxvbi9jYWNoZVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtc3lzdGVtLXJlc291cmNlLWVkaXQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0LmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFN5c3RlbVJlc291cmNlRWRpdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgcmVjb3JkOiBhbnkgPSB7fTtcclxuICBpOiBhbnk7XHJcbiAgYXBwSWQ6IGFueTtcclxuICBpc1Jvb3Q6IGJvb2xlYW47XHJcbiAgaXNWaWV3cGVybWlzc2lvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZvcm06IEZvcm1Hcm91cDtcclxuICBkZWZhdWx0cGVybWlzc2lvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHBhcmVudDtcclxuXHJcbiAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHN0YXRlTGlzdCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldChgYXBpL2RpY3QvdHlwZS9lbmFibGVTdGF0ZWApO1xyXG4gIHR5cGVTcmNMaXN0ID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KGBhcGkvZGljdC90eXBlL3R5cGVTcmNgKTtcclxuICB1cmxUYXJnZXRMaXN0ID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KGBhcGkvZGljdC90eXBlL3VybFRhcmdldGApO1xyXG4gIHR5cGVOb2RlTGlzdCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldChgYXBpL2RpY3QvdHlwZS90eXBlTm9kZWApO1xyXG5cclxuICB0eXBlU3JjOiBhbnk7XHJcbiAgdXJsVGFyZ2V0OiBhbnk7XHJcbiAgdHlwZU5vZGU6IGFueTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG1vZGFsOiBOek1vZGFsUmVmLFxyXG4gICAgcHVibGljIG1zZ1NydjogTnpNZXNzYWdlU2VydmljZSxcclxuICAgIHB1YmxpYyByZXNvdXJjZVNlcnZpY2U6IFJlc291cmNlU2VydmljZSxcclxuICAgIHB1YmxpYyB1c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgYXBwc1NlcnZpY2U6IEFwcHNTZXJ2aWNlLFxyXG4gICAgcHVibGljIGh0dHA6IF9IdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAvKnRoaXMuYXBwc1NlcnZpY2UuZ2V0TGlzdCgpLnN1YnNjcmliZShhcHBMaXN0ID0+IHtcclxuICAgICAgdGhpcy5vcHRpb25MaXN0ID0gYXBwTGlzdDtcclxuICAgIH0pOyovXHJcbiAgICB0aGlzLnR5cGVTcmNMaXN0LnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy50eXBlU3JjID0gcmVzWzBdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMudXJsVGFyZ2V0TGlzdC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHRoaXMudXJsVGFyZ2V0ID0gcmVzWzBdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMudHlwZU5vZGVMaXN0LnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgdGhpcy50eXBlTm9kZSA9IHJlc1swXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBsZXQgZmxhZ0JyZWFkY3J1bWIgO1xyXG4gICAgbGV0IGZsYWdNZW51R3JvdXA7XHJcbiAgICBsZXQgbm9kZUxldmVsO1xyXG4gICAgbGV0IHBpZCA9IG51bGw7XHJcbiAgICBsZXQgcGF0aCA9ICcnO1xyXG4gICAgaWYgKCF0aGlzLnJlY29yZC5pZCkge1xyXG4gICAgICBpZiAodGhpcy5pc1Jvb3QpIHtcclxuICAgICAgICBub2RlTGV2ZWwgPSAwO1xyXG4gICAgICAgIGZsYWdCcmVhZGNydW1iID0gZmFsc2U7XHJcbiAgICAgICAgZmxhZ01lbnVHcm91cCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc1ZpZXdwZXJtaXNzaW9uID0gdGhpcy5wYXJlbnQudHlwZU5vZGUgIT09IDI7XHJcbiAgICAgICAgZmxhZ0JyZWFkY3J1bWIgPSB0cnVlO1xyXG4gICAgICAgIGZsYWdNZW51R3JvdXAgPSBmYWxzZTtcclxuICAgICAgICBwaWQgPSB0aGlzLnBhcmVudC5pZDtcclxuICAgICAgICBsZXQgcGFyZW50UGF0aCA9IHRoaXMucGFyZW50LnBhdGg7XHJcbiAgICAgICAgaWYgKCFwYXJlbnRQYXRoKSB7IC8vaWTpgJflj7fliIbpmpTvvIzku47kuIvliLDkuIpcclxuICAgICAgICAgIHBhdGggPSBgLCR7dGhpcy5wYXJlbnQuaWR9LGA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHBhdGggPSBgLCR7dGhpcy5wYXJlbnQuaWR9JHt0aGlzLnBhcmVudC5wYXRofWA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlTGV2ZWwgPSB0aGlzLnBhcmVudC5ub2RlTGV2ZWwgKyAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMuaXNWaWV3cGVybWlzc2lvbiA9IHRoaXMucmVjb3JkLnR5cGVOb2RlICE9PSAyO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgYXBwSWQ6IFt0aGlzLmFwcElkLCBbXV0sXHJcbiAgICAgIGNvZGU6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIFt0aGlzLmNvZGVBc3luY1ZhbGlkYXRvcl1dLFxyXG4gICAgICByc3JjTmFtZTogW251bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGRlcHRJZDogW251bGwsIFtdXSxcclxuICAgICAgcGlkOiBbcGlkLCBbXV0sXHJcbiAgICAgIHBhdGg6IFtwYXRoLCBbXV0sXHJcbiAgICAgIHR5cGVTcmM6IFt0aGlzLnR5cGVTcmMgPyB0aGlzLnR5cGVTcmMudmFsdWUgOiAnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgdHlwZU5vZGU6IFt0aGlzLnR5cGVOb2RlID8gdGhpcy50eXBlTm9kZS52YWx1ZSA6ICcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICB1cmw6IFtudWxsLCBbXV0sXHJcbiAgICAgIHVybFRhcmdldDogW3RoaXMudXJsVGFyZ2V0ID8gdGhpcy51cmxUYXJnZXQudmFsdWUgOiAnJywgW11dLFxyXG4gICAgICByc3JjSWNvbjogW251bGwsIFtdXSxcclxuICAgICAgcnNyY1N0YXR1czogWzEsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGZsYWdCcmVhZGNydW1iOiBbZmxhZ0JyZWFkY3J1bWIsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGZsYWdNZW51R3JvdXA6IFtmbGFnTWVudUdyb3VwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBzb3J0Tm06IFswLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBwZXJtaXNzaW9uOiBbbnVsbCwgW11dLFxyXG4gICAgICBiZWdpblRpbWU6IFtudWxsLCBbXV0sXHJcbiAgICAgIGVuZFRpbWU6IFtudWxsLCBbXV0sXHJcbiAgICAgIG5vZGVMZXZlbDogW25vZGVMZXZlbCwgW11dLFxyXG4gICAgICBkZWZhdWx0cGVybWlzc2lvbjogW2ZhbHNlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLnJlY29yZC5pZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlc291cmNlU2VydmljZS5nZXRCeUlkKHRoaXMucmVjb3JkLmlkKS5zdWJzY3JpYmUoKHJlczphbnkpID0+IHtcclxuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUocmVzKTtcclxuICAgICAgLy8gdGhpcy5mb3JtLnBhdGNoVmFsdWUoe2NvZGU6IHJlcy5jb2RlfSk7XHJcbiAgICAgIHRoaXMuaSA9IHJlcztcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29tcGFyZU51bVN0cihjMTogYW55LCBjMjogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gYzEgPT0gYzI7XHJcbiAgfVxyXG5cclxuICBjb2RlQXN5bmNWYWxpZGF0b3IgPSAoY29udHJvbDogRm9ybUNvbnRyb2wpID0+XHJcbiAgICBPYnNlcnZhYmxlLmNyZWF0ZSgob2JzZXJ2ZXI6IE9ic2VydmVyPFZhbGlkYXRpb25FcnJvcnM+KSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuY2hlY2tDb2RlKHtjb2RlOiBjb250cm9sLnZhbHVlLCBpZDogdGhpcy5yZWNvcmQuaWR9KS5zdWJzY3JpYmUoKHJlczphbnkpPT4ge1xyXG4gICAgICAgIGlmIChyZXMudmFsaWQgPT09IHRydWUpIHtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBlcnJvcjogdHJ1ZSwgZHVwbGljYXRlZDogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgc3VibWl0KCkge1xyXG4gICAgZm9yIChjb25zdCBpIGluIHRoaXMuZm9ybS5jb250cm9scykge1xyXG4gICAgICB0aGlzLmZvcm0uY29udHJvbHNbaV0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2ldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkgcmV0dXJuO1xyXG4gICAgaWYgKCF0aGlzLnJlY29yZC5pZCkge1xyXG4gICAgICAvL+aWsOWinlxyXG4gICAgICB0aGlzLnJlc291cmNlU2VydmljZS5wb3N0KHRoaXMuZm9ybS52YWx1ZSkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMubXNnU3J2LnN1Y2Nlc3MoJ+S/neWtmOaIkOWKnycpO1xyXG4gICAgICAgIGlmKHRoaXMuZm9ybS52YWx1ZS5kZWZhdWx0cGVybWlzc2lvbil7XHJcbiAgICAgICAgICB0aGlzLnJlc291cmNlU2VydmljZS5hZGREZWZhdWx0UGVybWlzc2lvbihyZXMpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJlcy5jaGlsZHJlbiA9IFtdO1xyXG4gICAgICAgICAgICBkYXRhLmZvckVhY2goaXQgPT4ge1xyXG4gICAgICAgICAgICAgIHJlcy5jaGlsZHJlbi5wdXNoKGl0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tb2RhbC5jbG9zZShyZXMpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy/kv67mlLlcclxuICAgIHRoaXMucmVzb3VyY2VTZXJ2aWNlLnB1dCh0aGlzLnJlY29yZC5pZCwgdGhpcy5mb3JtLnZhbHVlICkuc3Vic2NyaWJlKCAocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5tc2dTcnYuc3VjY2Vzcygn5L+d5a2Y5oiQ5YqfJyk7XHJcbiAgICAgIC8vIOaYr+WQpuaWsOWinum7mOiupOadg+mZkFxyXG4gICAgICBpZih0aGlzLmZvcm0udmFsdWUuZGVmYXVsdHBlcm1pc3Npb24pe1xyXG4gICAgICAgIC8vIOaWsOWinum7mOiupOadg+mZkFxyXG4gICAgICAgIHRoaXMucmVzb3VyY2VTZXJ2aWNlLmFkZERlZmF1bHRQZXJtaXNzaW9uKHJlcykuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm1vZGFsLmNsb3NlKHtyZXN1bHQ6IHJlcywgYWRkRmxhZzogdGhpcy5mb3JtLnZhbHVlLmRlZmF1bHRwZXJtaXNzaW9ufSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy5tb2RhbC5kZXN0cm95KCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==