UNPKG

ngx-tencent-im

Version:
131 lines 35.4 kB
import { Component, ChangeDetectionStrategy, ViewChild } from '@angular/core'; import { Validators } from '@angular/forms'; import { debounceTime, distinctUntilChanged } from 'rxjs/operators'; import { MESSAGE_STATUS, TIM_TYPES } from '../../shared.data'; import { showAction } from '../../store/actions'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@ngrx/store"; import * as i3 from "ng-zorro-antd/modal"; import * as i4 from "../../tim-helper.service"; import * as i5 from "ng-zorro-antd/form"; import * as i6 from "ng-zorro-antd/select"; import * as i7 from "ng-zorro-antd/radio"; import * as i8 from "ng-zorro-antd/button"; import * as i9 from "ng-zorro-antd/grid"; import * as i10 from "ng-zorro-antd/input"; import * as i11 from "@angular/common"; import * as i12 from "ng-zorro-antd/core/wave"; import * as i13 from "ng-zorro-antd/core/transition-patch"; export class CreateGroupComponent { constructor(fb, store, cd, modalRef, timeHelper) { this.fb = fb; this.store = store; this.cd = cd; this.modalRef = modalRef; this.timeHelper = timeHelper; this.captchaTooltipIcon = { type: 'info-circle', theme: 'twotone' }; this.groupTypeOption = [ { label: 'Work', value: TIM_TYPES.GRP_WORK }, { label: 'Public', value: TIM_TYPES.GRP_PUBLIC }, { label: 'Meeting', value: TIM_TYPES.GRP_MEETING }, { label: 'AVChatRoom', value: TIM_TYPES.GRP_AVCHATROOM }, ]; this.memberListOfOption = []; this.loading = false; } ngOnInit() { this.validateForm = this.fb.group({ groupID: [null, []], name: [null, [Validators.required]], type: [TIM_TYPES.GRP_WORK, [Validators.required]], avatar: [null, []], introduction: [], notification: [null, []], joinOption: [{ value: 'FreeAccess', disabled: true }, []], memberList: [[], []] }); this.validateForm.get('type').valueChanges.subscribe((value) => { switch (value) { case TIM_TYPES.GRP_WORK: this.validateForm.get('joinOption').disable(); this.validateForm.get('memberList').enable(); break; case TIM_TYPES.GRP_PUBLIC: this.validateForm.get('joinOption').enable(); this.validateForm.get('memberList').enable(); break; case TIM_TYPES.GRP_MEETING: this.validateForm.get('joinOption').disable(); this.validateForm.get('memberList').enable(); break; case TIM_TYPES.GRP_AVCHATROOM: this.validateForm.get('joinOption').disable(); this.validateForm.get('memberList').disable(); break; default: break; } }); this.nzSelect.nzOnSearch.pipe(debounceTime(600), distinctUntilChanged()) .subscribe((res) => { this.handleSearchUser(res); }); } handleSearchUser(userID) { if (userID !== '') { this.loading = true; this.timeHelper.tim.getUserProfile({ userIDList: [userID] }).then(({ data }) => { this.memberListOfOption = data.map(item => item.userID); this.loading = false; this.cd.markForCheck(); }).catch((error) => { this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.error, message: error.message })); }); } } submitForm() { for (const i in this.validateForm.controls) { this.validateForm.controls[i].markAsDirty(); this.validateForm.controls[i].updateValueAndValidity(); } this.timeHelper.tim.createGroup(this.getOptions()).then((imResponse) => { this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.success, message: `群组:${imResponse.data.group.name}创建成功` })); this.modalRef.destroy(); }).catch(error => { this.store.dispatch(showAction({ msgType: MESSAGE_STATUS.error, message: error.message })); }); } getOptions() { let options = { ...this.validateForm.value, memberList: this.validateForm.value.memberList.map(userID => ({ userID })) }; if ([TIM_TYPES.GRP_WORK, TIM_TYPES.GRP_AVCHATROOM].includes(this.validateForm.value.type)) { delete options.joinOption; } return options; } } CreateGroupComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: CreateGroupComponent, deps: [{ token: i1.FormBuilder }, { token: i2.Store }, { token: i0.ChangeDetectorRef }, { token: i3.NzModalRef }, { token: i4.TimHelperService }], target: i0.ɵɵFactoryTarget.Component }); CreateGroupComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: CreateGroupComponent, selector: "im-create-group", viewQueries: [{ propertyName: "nzSelect", first: true, predicate: ["search"], descendants: true, static: true }], ngImport: i0, template: "<form nz-form [formGroup]=\"validateForm\" (ngSubmit)=\"submitForm()\">\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\" nzFor=\"groupID\">\u7FA4ID</nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <input nz-input formControlName=\"groupID\" id=\"groupID\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\" nzRequired>\r\n <span>\u7FA4\u540D\u79F0</span>\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\" nzErrorTip=\"\u8BF7\u8F93\u5165\u540D\u79F0!\">\r\n <input nz-input formControlName=\"name\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\" nzRequired>\u7FA4\u7C7B\u578B\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <nz-select formControlName=\"type\">\r\n <nz-option *ngFor=\"let item of groupTypeOption\" [nzLabel]=\"item.label\"\r\n [nzValue]=\"item.value\">\r\n </nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\" nzFor=\"avatar\">\u7FA4\u5934\u50CF\u5730\u5740</nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <input nz-input id=\"avatar\" formControlName=\"avatar\" placeholder=\"avatar\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\">\u7FA4\u7B80\u4ECB</nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <textarea nz-input formControlName=\"introduction\" placeholder=\"\u7FA4\u7B80\u4ECB\" [maxlength]=\"240\"\r\n [nzAutosize]=\"{ minRows: 3, maxRows: 5 }\"></textarea>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\">\u7FA4\u516C\u544A\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <textarea nz-input formControlName=\"notification\" placeholder=\"\u7FA4\u516C\u544A\" [maxlength]=\"300\"\r\n [nzAutosize]=\"{ minRows: 3, maxRows: 5 }\"></textarea>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\">\u52A0\u7FA4\u65B9\u5F0F\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <nz-radio-group formControlName=\"joinOption\">\r\n <label nz-radio nzValue=\"FreeAccess\">\u81EA\u7531\u52A0\u7FA4</label>\r\n <label nz-radio nzValue=\"NeedPermission\">\u9700\u8981\u9A8C\u8BC1</label>\r\n <label nz-radio nzValue=\"DisableApply\">\u7981\u6B62\u52A0\u7FA4</label>\r\n </nz-radio-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\">\u7FA4\u6210\u5458\u5217\u8868\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <nz-select #search nzMode=\"multiple\" [nzLoading]=\"loading\" nzPlaceHolder=\"\u8BF7\u8F93\u5165\u7FA4\u6210\u5458 userID\"\r\n formControlName=\"memberList\">\r\n <nz-option *ngFor=\"let item of memberListOfOption\" [nzLabel]=\"item\" [nzValue]=\"item\">\r\n </nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item nz-row nzJustify=\"center\">\r\n <nz-form-control [nzSpan]=\"12\" nzPush=\"8\">\r\n <button nz-button nzType=\"primary\">\u7ACB\u5373\u521B\u5EFA</button>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"12\">\r\n <button nz-button nzType=\"default\" type=\"button\" (click)=\"modalRef.destroy()\">\u53D6\u6D88</button>\r\n </nz-form-control>\r\n </nz-form-item>\r\n</form>\r\n", styles: [""], components: [{ type: i5.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { type: i5.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon"], exportAs: ["nzFormLabel"] }, { type: i5.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { type: i6.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { type: i6.NzOptionComponent, selector: "nz-option", inputs: ["nzLabel", "nzValue", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { type: i7.NzRadioGroupComponent, selector: "nz-radio-group", inputs: ["nzDisabled", "nzButtonStyle", "nzSize", "nzName"], exportAs: ["nzRadioGroup"] }, { type: i7.NzRadioComponent, selector: "[nz-radio],[nz-radio-button]", inputs: ["nzValue", "nzDisabled", "nzAutoFocus"], exportAs: ["nzRadio"] }, { type: i8.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon"], exportAs: ["nzForm"] }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { type: i9.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { type: i10.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "disabled"], exportAs: ["nzInput"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.NzAutosizeDirective, selector: "textarea[nzAutosize]", inputs: ["nzAutosize"], exportAs: ["nzAutosize"] }, { type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { type: i12.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i13.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: CreateGroupComponent, decorators: [{ type: Component, args: [{ selector: 'im-create-group', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form nz-form [formGroup]=\"validateForm\" (ngSubmit)=\"submitForm()\">\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\" nzFor=\"groupID\">\u7FA4ID</nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <input nz-input formControlName=\"groupID\" id=\"groupID\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\" nzRequired>\r\n <span>\u7FA4\u540D\u79F0</span>\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\" nzErrorTip=\"\u8BF7\u8F93\u5165\u540D\u79F0!\">\r\n <input nz-input formControlName=\"name\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\" nzRequired>\u7FA4\u7C7B\u578B\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <nz-select formControlName=\"type\">\r\n <nz-option *ngFor=\"let item of groupTypeOption\" [nzLabel]=\"item.label\"\r\n [nzValue]=\"item.value\">\r\n </nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\" nzFor=\"avatar\">\u7FA4\u5934\u50CF\u5730\u5740</nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <input nz-input id=\"avatar\" formControlName=\"avatar\" placeholder=\"avatar\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\">\u7FA4\u7B80\u4ECB</nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <textarea nz-input formControlName=\"introduction\" placeholder=\"\u7FA4\u7B80\u4ECB\" [maxlength]=\"240\"\r\n [nzAutosize]=\"{ minRows: 3, maxRows: 5 }\"></textarea>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\">\u7FA4\u516C\u544A\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <textarea nz-input formControlName=\"notification\" placeholder=\"\u7FA4\u516C\u544A\" [maxlength]=\"300\"\r\n [nzAutosize]=\"{ minRows: 3, maxRows: 5 }\"></textarea>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\">\u52A0\u7FA4\u65B9\u5F0F\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <nz-radio-group formControlName=\"joinOption\">\r\n <label nz-radio nzValue=\"FreeAccess\">\u81EA\u7531\u52A0\u7FA4</label>\r\n <label nz-radio nzValue=\"NeedPermission\">\u9700\u8981\u9A8C\u8BC1</label>\r\n <label nz-radio nzValue=\"DisableApply\">\u7981\u6B62\u52A0\u7FA4</label>\r\n </nz-radio-group>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label [nzSm]=\"6\" [nzXs]=\"24\">\u7FA4\u6210\u5458\u5217\u8868\r\n </nz-form-label>\r\n <nz-form-control [nzSm]=\"14\" [nzXs]=\"24\">\r\n <nz-select #search nzMode=\"multiple\" [nzLoading]=\"loading\" nzPlaceHolder=\"\u8BF7\u8F93\u5165\u7FA4\u6210\u5458 userID\"\r\n formControlName=\"memberList\">\r\n <nz-option *ngFor=\"let item of memberListOfOption\" [nzLabel]=\"item\" [nzValue]=\"item\">\r\n </nz-option>\r\n </nz-select>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item nz-row nzJustify=\"center\">\r\n <nz-form-control [nzSpan]=\"12\" nzPush=\"8\">\r\n <button nz-button nzType=\"primary\">\u7ACB\u5373\u521B\u5EFA</button>\r\n </nz-form-control>\r\n <nz-form-control [nzSpan]=\"12\">\r\n <button nz-button nzType=\"default\" type=\"button\" (click)=\"modalRef.destroy()\">\u53D6\u6D88</button>\r\n </nz-form-control>\r\n </nz-form-item>\r\n</form>\r\n", styles: [""] }] }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.Store }, { type: i0.ChangeDetectorRef }, { type: i3.NzModalRef }, { type: i4.TimHelperService }]; }, propDecorators: { nzSelect: [{ type: ViewChild, args: ['search', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZW5jZW50LWltL3NyYy9ncm91cC9jcmVhdGUtZ3JvdXAvY3JlYXRlLWdyb3VwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10ZW5jZW50LWltL3NyYy9ncm91cC9jcmVhdGUtZ3JvdXAvY3JlYXRlLWdyb3VwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsdUJBQXVCLEVBQW1DLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBU2pELE1BQU0sT0FBTyxvQkFBb0I7SUFxQi9CLFlBQ1UsRUFBZSxFQUNmLEtBQVksRUFDWixFQUFxQixFQUN0QixRQUFvQixFQUNuQixVQUE0QjtRQUo1QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDbkIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUF2QnRDLHVCQUFrQixHQUFRO1lBQ3hCLElBQUksRUFBRSxhQUFhO1lBQ25CLEtBQUssRUFBRSxTQUFTO1NBQ2pCLENBQUM7UUFFRixvQkFBZSxHQUFHO1lBQ2hCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FB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QU07OE1BcUJBLFFBQVE7c0JBQXRELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBOek1vZGFsUmVmIH0gZnJvbSAnbmctem9ycm8tYW50ZC9tb2RhbCc7XHJcbmltcG9ydCB7IE56U2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnbmctem9ycm8tYW50ZC9zZWxlY3QnO1xyXG5cclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcblxyXG5pbXBvcnQgeyBNRVNTQUdFX1NUQVRVUywgVElNX1RZUEVTIH0gZnJvbSAnLi4vLi4vc2hhcmVkLmRhdGEnO1xyXG5pbXBvcnQgeyBzaG93QWN0aW9uIH0gZnJvbSAnLi4vLi4vc3RvcmUvYWN0aW9ucyc7XHJcbmltcG9ydCB7IFRpbUhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi90aW0taGVscGVyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpbS1jcmVhdGUtZ3JvdXAnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jcmVhdGUtZ3JvdXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NyZWF0ZS1ncm91cC5jb21wb25lbnQubGVzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgdmFsaWRhdGVGb3JtITogRm9ybUdyb3VwO1xyXG5cclxuICBjYXB0Y2hhVG9vbHRpcEljb246IGFueSA9IHtcclxuICAgIHR5cGU6ICdpbmZvLWNpcmNsZScsXHJcbiAgICB0aGVtZTogJ3R3b3RvbmUnXHJcbiAgfTtcclxuXHJcbiAgZ3JvdXBUeXBlT3B0aW9uID0gW1xyXG4gICAgeyBsYWJlbDogJ1dvcmsnLCB2YWx1ZTogVElNX1RZUEVTLkdSUF9XT1JLIH0sXHJcbiAgICB7IGxhYmVsOiAnUHVibGljJywgdmFsdWU6IFRJTV9UWVBFUy5HUlBfUFVCTElDIH0sXHJcbiAgICB7IGxhYmVsOiAnTWVldGluZycsIHZhbHVlOiBUSU1fVFlQRVMuR1JQX01FRVRJTkcgfSxcclxuICAgIHsgbGFiZWw6ICdBVkNoYXRSb29tJywgdmFsdWU6IFRJTV9UWVBFUy5HUlBfQVZDSEFUUk9PTSB9LFxyXG4gIF07XHJcblxyXG4gIG1lbWJlckxpc3RPZk9wdGlvbiA9IFtdO1xyXG5cclxuICBsb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgbnpTZWxlY3Q6IE56U2VsZWN0Q29tcG9uZW50O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmUsXHJcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyBtb2RhbFJlZjogTnpNb2RhbFJlZixcclxuICAgIHByaXZhdGUgdGltZUhlbHBlcjogVGltSGVscGVyU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy52YWxpZGF0ZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgZ3JvdXBJRDogW251bGwsIFtdXSxcclxuICAgICAgbmFtZTogW251bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIHR5cGU6IFtUSU1fVFlQRVMuR1JQX1dPUkssIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGF2YXRhcjogW251bGwsIFtdXSxcclxuICAgICAgaW50cm9kdWN0aW9uOiBbXSxcclxuICAgICAgbm90aWZpY2F0aW9uOiBbbnVsbCwgW11dLFxyXG4gICAgICBqb2luT3B0aW9uOiBbeyB2YWx1ZTogJ0ZyZWVBY2Nlc3MnLCBkaXNhYmxlZDogdHJ1ZSB9LCBbXV0sXHJcbiAgICAgIG1lbWJlckxpc3Q6IFtbXSwgW11dXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnZhbGlkYXRlRm9ybS5nZXQoJ3R5cGUnKS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZTogVElNX1RZUEVTKSA9PiB7XHJcbiAgICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICBjYXNlIFRJTV9UWVBFUy5HUlBfV09SSzpcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmdldCgnam9pbk9wdGlvbicpLmRpc2FibGUoKTtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmdldCgnbWVtYmVyTGlzdCcpLmVuYWJsZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBUSU1fVFlQRVMuR1JQX1BVQkxJQzpcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmdldCgnam9pbk9wdGlvbicpLmVuYWJsZSgpO1xyXG4gICAgICAgICAgdGhpcy52YWxpZGF0ZUZvcm0uZ2V0KCdtZW1iZXJMaXN0JykuZW5hYmxlKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFRJTV9UWVBFUy5HUlBfTUVFVElORzpcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmdldCgnam9pbk9wdGlvbicpLmRpc2FibGUoKTtcclxuICAgICAgICAgIHRoaXMudmFsaWRhdGVGb3JtLmdldCgnbWVtYmVyTGlzdCcpLmVuYWJsZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBUSU1fVFlQRVMuR1JQX0FWQ0hBVFJPT006XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRm9ybS5nZXQoJ2pvaW5PcHRpb24nKS5kaXNhYmxlKCk7XHJcbiAgICAgICAgICB0aGlzLnZhbGlkYXRlRm9ybS5nZXQoJ21lbWJlckxpc3QnKS5kaXNhYmxlKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm56U2VsZWN0Lm56T25TZWFyY2gucGlwZShkZWJvdW5jZVRpbWUoNjAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSlcclxuICAgICAgLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcclxuICAgICAgICB0aGlzLmhhbmRsZVNlYXJjaFVzZXIocmVzKTtcclxuICAgICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgaGFuZGxlU2VhcmNoVXNlcih1c2VySUQ6IHN0cmluZykge1xyXG4gICAgaWYgKHVzZXJJRCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy50aW1lSGVscGVyLnRpbS5nZXRVc2VyUHJvZmlsZSh7IHVzZXJJRExpc3Q6IFt1c2VySURdIH0pLnRoZW4oKHsgZGF0YSB9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZW1iZXJMaXN0T2ZPcHRpb24gPSBkYXRhLm1hcChpdGVtID0+IGl0ZW0udXNlcklEKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KS5jYXRjaCgoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goc2hvd0FjdGlvbih7XHJcbiAgICAgICAgICBtc2dUeXBlOiBNRVNTQUdFX1NUQVRVUy5lcnJvcixcclxuICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcclxuICAgICAgICB9KSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHN1Ym1pdEZvcm0oKTogdm9pZCB7XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gdGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHMpIHtcclxuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHNbaV0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHNbaV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGltZUhlbHBlci50aW0uY3JlYXRlR3JvdXAodGhpcy5nZXRPcHRpb25zKCkpLnRoZW4oKGltUmVzcG9uc2UpID0+IHtcclxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcclxuICAgICAgICBzaG93QWN0aW9uKHtcclxuICAgICAgICAgIG1zZ1R5cGU6IE1FU1NBR0VfU1RBVFVTLnN1Y2Nlc3MsXHJcbiAgICAgICAgICBtZXNzYWdlOiBg576k57uE77ya44CQJHtpbVJlc3BvbnNlLmRhdGEuZ3JvdXAubmFtZX3jgJHliJvlu7rmiJDlip9gXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICB0aGlzLm1vZGFsUmVmLmRlc3Ryb3koKTtcclxuICAgIH0pLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcclxuICAgICAgICBzaG93QWN0aW9uKHtcclxuICAgICAgICAgIG1zZ1R5cGU6IE1FU1NBR0VfU1RBVFVTLmVycm9yLFxyXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZVxyXG4gICAgICAgIH0pKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3B0aW9ucygpIHtcclxuICAgIGxldCBvcHRpb25zID0ge1xyXG4gICAgICAuLi50aGlzLnZhbGlkYXRlRm9ybS52YWx1ZSxcclxuICAgICAgbWVtYmVyTGlzdDogdGhpcy52YWxpZGF0ZUZvcm0udmFsdWUubWVtYmVyTGlzdC5tYXAodXNlcklEID0+ICh7IHVzZXJJRCB9KSlcclxuICAgIH07XHJcbiAgICBpZiAoW1RJTV9UWVBFUy5HUlBfV09SSywgVElNX1RZUEVTLkdSUF9BVkNIQVRST09NXS5pbmNsdWRlcyh0aGlzLnZhbGlkYXRlRm9ybS52YWx1ZS50eXBlKSkge1xyXG4gICAgICBkZWxldGUgb3B0aW9ucy5qb2luT3B0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgfVxyXG5cclxufVxyXG4iLCI8Zm9ybSBuei1mb3JtIFtmb3JtR3JvdXBdPVwidmFsaWRhdGVGb3JtXCIgKG5nU3VibWl0KT1cInN1Ym1pdEZvcm0oKVwiPlxyXG4gIDxuei1mb3JtLWl0ZW0+XHJcbiAgICA8bnotZm9ybS1sYWJlbCBbbnpTbV09XCI2XCIgW256WHNdPVwiMjRcIiBuekZvcj1cImdyb3VwSURcIj7nvqRJRDwvbnotZm9ybS1sYWJlbD5cclxuICAgIDxuei1mb3JtLWNvbnRyb2wgW256U21dPVwiMTRcIiBbbnpYc109XCIyNFwiPlxyXG4gICAgICA8aW5wdXQgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZ3JvdXBJRFwiIGlkPVwiZ3JvdXBJRFwiIC8+XHJcbiAgICA8L256LWZvcm0tY29udHJvbD5cclxuICA8L256LWZvcm0taXRlbT5cclxuICA8bnotZm9ybS1pdGVtPlxyXG4gICAgPG56LWZvcm0tbGFiZWwgW256U21dPVwiNlwiIFtuelhzXT1cIjI0XCIgbnpSZXF1aXJlZD5cclxuICAgICAgPHNwYW4+576k5ZCN56ewPC9zcGFuPlxyXG4gICAgPC9uei1mb3JtLWxhYmVsPlxyXG4gICAgPG56LWZvcm0tY29udHJvbCBbbnpTbV09XCIxNFwiIFtuelhzXT1cIjI0XCIgbnpFcnJvclRpcD1cIuivt+i+k+WFpeWQjeensCFcIj5cclxuICAgICAgPGlucHV0IG56LWlucHV0IGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIiAvPlxyXG4gICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgPG56LWZvcm0taXRlbT5cclxuICAgIDxuei1mb3JtLWxhYmVsIFtuelNtXT1cIjZcIiBbbnpYc109XCIyNFwiIG56UmVxdWlyZWQ+576k57G75Z6LXHJcbiAgICA8L256LWZvcm0tbGFiZWw+XHJcbiAgICA8bnotZm9ybS1jb250cm9sIFtuelNtXT1cIjE0XCIgW256WHNdPVwiMjRcIj5cclxuICAgICAgPG56LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJ0eXBlXCI+XHJcbiAgICAgICAgPG56LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBncm91cFR5cGVPcHRpb25cIiBbbnpMYWJlbF09XCJpdGVtLmxhYmVsXCJcclxuICAgICAgICAgIFtuelZhbHVlXT1cIml0ZW0udmFsdWVcIj5cclxuICAgICAgICA8L256LW9wdGlvbj5cclxuICAgICAgPC9uei1zZWxlY3Q+XHJcbiAgICA8L256LWZvcm0tY29udHJvbD5cclxuICA8L256LWZvcm0taXRlbT5cclxuICA8bnotZm9ybS1pdGVtPlxyXG4gICAgPG56LWZvcm0tbGFiZWwgW256U21dPVwiNlwiIFtuelhzXT1cIjI0XCIgbnpGb3I9XCJhdmF0YXJcIj7nvqTlpLTlg4/lnLDlnYA8L256LWZvcm0tbGFiZWw+XHJcbiAgICA8bnotZm9ybS1jb250cm9sIFtuelNtXT1cIjE0XCIgW256WHNdPVwiMjRcIj5cclxuICAgICAgPGlucHV0IG56LWlucHV0IGlkPVwiYXZhdGFyXCIgZm9ybUNvbnRyb2xOYW1lPVwiYXZhdGFyXCIgcGxhY2Vob2xkZXI9XCJhdmF0YXJcIiAvPlxyXG4gICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgPG56LWZvcm0taXRlbT5cclxuICAgIDxuei1mb3JtLWxhYmVsIFtuelNtXT1cIjZcIiBbbnpYc109XCIyNFwiPue+pOeugOS7izwvbnotZm9ybS1sYWJlbD5cclxuICAgIDxuei1mb3JtLWNvbnRyb2wgW256U21dPVwiMTRcIiBbbnpYc109XCIyNFwiPlxyXG4gICAgICA8dGV4dGFyZWEgbnotaW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiaW50cm9kdWN0aW9uXCIgcGxhY2Vob2xkZXI9XCLnvqTnroDku4tcIiBbbWF4bGVuZ3RoXT1cIjI0MFwiXHJcbiAgICAgICAgW256QXV0b3NpemVdPVwieyBtaW5Sb3dzOiAzLCBtYXhSb3dzOiA1IH1cIj48L3RleHRhcmVhPlxyXG4gICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgPG56LWZvcm0taXRlbT5cclxuICAgIDxuei1mb3JtLWxhYmVsIFtuelNtXT1cIjZcIiBbbnpYc109XCIyNFwiPue+pOWFrOWRilxyXG4gICAgPC9uei1mb3JtLWxhYmVsPlxyXG4gICAgPG56LWZvcm0tY29udHJvbCBbbnpTbV09XCIxNFwiIFtuelhzXT1cIjI0XCI+XHJcbiAgICAgIDx0ZXh0YXJlYSBuei1pbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJub3RpZmljYXRpb25cIiBwbGFjZWhvbGRlcj1cIue+pOWFrOWRilwiIFttYXhsZW5ndGhdPVwiMzAwXCJcclxuICAgICAgICBbbnpBdXRvc2l6ZV09XCJ7IG1pblJvd3M6IDMsIG1heFJvd3M6IDUgfVwiPjwvdGV4dGFyZWE+XHJcbiAgICA8L256LWZvcm0tY29udHJvbD5cclxuICA8L256LWZvcm0taXRlbT5cclxuICA8bnotZm9ybS1pdGVtPlxyXG4gICAgPG56LWZvcm0tbGFiZWwgW256U21dPVwiNlwiIFtuelhzXT1cIjI0XCI+5Yqg576k5pa55byPXHJcbiAgICA8L256LWZvcm0tbGFiZWw+XHJcbiAgICA8bnotZm9ybS1jb250cm9sIFtuelNtXT1cIjE0XCIgW256WHNdPVwiMjRcIj5cclxuICAgICAgPG56LXJhZGlvLWdyb3VwIGZvcm1Db250cm9sTmFtZT1cImpvaW5PcHRpb25cIj5cclxuICAgICAgICA8bGFiZWwgbnotcmFkaW8gbnpWYWx1ZT1cIkZyZWVBY2Nlc3NcIj7oh6rnlLHliqDnvqQ8L2xhYmVsPlxyXG4gICAgICAgIDxsYWJlbCBuei1yYWRpbyBuelZhbHVlPVwiTmVlZFBlcm1pc3Npb25cIj7pnIDopoHpqozor4E8L2xhYmVsPlxyXG4gICAgICAgIDxsYWJlbCBuei1yYWRpbyBuelZhbHVlPVwiRGlzYWJsZUFwcGx5XCI+56aB5q2i5Yqg576kPC9sYWJlbD5cclxuICAgICAgPC9uei1yYWRpby1ncm91cD5cclxuICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gIDwvbnotZm9ybS1pdGVtPlxyXG4gIDxuei1mb3JtLWl0ZW0+XHJcbiAgICA8bnotZm9ybS1sYWJlbCBbbnpTbV09XCI2XCIgW256WHNdPVwiMjRcIj7nvqTmiJDlkZjliJfooahcclxuICAgIDwvbnotZm9ybS1sYWJlbD5cclxuICAgIDxuei1mb3JtLWNvbnRyb2wgW256U21dPVwiMTRcIiBbbnpYc109XCIyNFwiPlxyXG4gICAgICA8bnotc2VsZWN0ICNzZWFyY2ggbnpNb2RlPVwibXVsdGlwbGVcIiBbbnpMb2FkaW5nXT1cImxvYWRpbmdcIiBuelBsYWNlSG9sZGVyPVwi6K+36L6T5YWl576k5oiQ5ZGYIHVzZXJJRFwiXHJcbiAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWVtYmVyTGlzdFwiPlxyXG4gICAgICAgIDxuei1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWVtYmVyTGlzdE9mT3B0aW9uXCIgW256TGFiZWxdPVwiaXRlbVwiIFtuelZhbHVlXT1cIml0ZW1cIj5cclxuICAgICAgICA8L256LW9wdGlvbj5cclxuICAgICAgPC9uei1zZWxlY3Q+XHJcbiAgICA8L256LWZvcm0tY29udHJvbD5cclxuICA8L256LWZvcm0taXRlbT5cclxuXHJcbiAgPG56LWZvcm0taXRlbSBuei1yb3cgbnpKdXN0aWZ5PVwiY2VudGVyXCI+XHJcbiAgICA8bnotZm9ybS1jb250cm9sIFtuelNwYW5dPVwiMTJcIiBuelB1c2g9XCI4XCI+XHJcbiAgICAgIDxidXR0b24gbnotYnV0dG9uIG56VHlwZT1cInByaW1hcnlcIj7nq4vljbPliJvlu7o8L2J1dHRvbj5cclxuICAgIDwvbnotZm9ybS1jb250cm9sPlxyXG4gICAgPG56LWZvcm0tY29udHJvbCBbbnpTcGFuXT1cIjEyXCI+XHJcbiAgICAgIDxidXR0b24gbnotYnV0dG9uIG56VHlwZT1cImRlZmF1bHRcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1vZGFsUmVmLmRlc3Ryb3koKVwiPuWPlua2iDwvYnV0dG9uPlxyXG4gICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgPC9uei1mb3JtLWl0ZW0+XHJcbjwvZm9ybT5cclxuIl19