@dignite-ng/expand.cms 0.0.38 → 0.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/config/providers/route.provider.mjs +9 -19
- package/esm2022/lib/cms.module.mjs +2 -1
- package/esm2022/lib/components/admin/domains/domains.component.mjs +1 -1
- package/esm2022/lib/components/admin/entries/create.component.mjs +6 -9
- package/esm2022/lib/components/admin/entries/edit.component.mjs +6 -9
- package/esm2022/lib/components/admin/fields/create-field.component.mjs +10 -14
- package/esm2022/lib/components/admin/fields/edit-field.component.mjs +6 -9
- package/esm2022/lib/components/admin/fields/fields.component.mjs +11 -13
- package/esm2022/lib/components/admin/sections/entry-types/create-or-edit.component.mjs +29 -31
- package/esm2022/lib/components/admin/sections/sections.component.mjs +12 -66
- package/esm2022/lib/components/dynamic-form/matrix/matrix-config.component.mjs +3 -3
- package/fesm2022/dignite-ng-expand.cms-config.mjs +8 -18
- package/fesm2022/dignite-ng-expand.cms-config.mjs.map +1 -1
- package/fesm2022/dignite-ng-expand.cms.mjs +76 -144
- package/fesm2022/dignite-ng-expand.cms.mjs.map +1 -1
- package/lib/components/admin/entries/create.component.d.ts +2 -3
- package/lib/components/admin/entries/edit.component.d.ts +2 -3
- package/lib/components/admin/fields/create-field.component.d.ts +1 -3
- package/lib/components/admin/fields/edit-field.component.d.ts +2 -3
- package/lib/components/admin/fields/fields.component.d.ts +1 -3
- package/lib/components/admin/sections/entry-types/create-or-edit.component.d.ts +2 -3
- package/lib/components/admin/sections/sections.component.d.ts +1 -34
- package/package.json +1 -1
|
@@ -194,12 +194,12 @@ class MatrixConfigComponent {
|
|
|
194
194
|
FieldnameInput.patchValue(pinyin);
|
|
195
195
|
}
|
|
196
196
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MatrixConfigComponent, deps: [{ token: i1.FormBuilder }, { token: i2.CmsApiService }, { token: i2.FieldAbstractsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
197
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MatrixConfigComponent, selector: "df-matrix-config", inputs: { type: "type", Entity: "Entity", selected: "selected" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }, { propertyName: "matrixModalModalSubmit", first: true, predicate: ["matrixModalModalSubmit"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"_Entity\">\n <div formGroupName=\"formConfiguration\">\n <div class=\"mb-2\">\n <label class=\"form-label\">{{'Cms::::FormControl:Matrix' | abpLocalization}}</label>\n <div class=\"row\">\n <div class=\"col-md-3\">\n <div class=\"list-group\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::MatrixBlockType' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixBlockType()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixBlockChange(i)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"i===selectMatrixBlockIndex\">\n <div>\n <div>{{item.value.displayName}}</div>\n <div>{{item.value.name}}</div>\n </div>\n <div ngbDropdown class=\"d-inline-block\">\n <button type=\"button\" class=\"btn btn-light btn-sm\" id=\"dropdownBasic1\"\n style=\"z-index: 8;\" ngbDropdownToggle></button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"z-index: 9;\">\n <button ngbDropdownItem\n (click.stop)=\"EditMatrixBlock(item.value)\">{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"DeleteMatrixBlock(i)\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </div>\n </div>\n </button>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"list-group\" *ngIf=\"MatrixBlockTypes?.controls.length>0\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::Fields' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixField()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <ng-container *ngIf=\"i === selectMatrixBlockIndex\">\n <ng-container *ngFor=\"let el of item.controls['fields'].controls;let fi =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixFieldChange(i,fi)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"fi===selectMatrixFieldIndex\">\n <div>\n <div>{{el.value.displayName}}</div>\n <div>{{el.value.name}}</div>\n </div>\n <button type=\"button\"\n (click.stop)=\"deleteMatrixField(item.controls['fields'],fi)\"\n class=\"btn btn-sm btn-li\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-6\" formArrayName=\"MatrixBlockTypes\">\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <div [formGroupName]=\"i\" [hidden]=\"i !== selectMatrixBlockIndex\">\n <div formArrayName=\"fields\">\n <ng-container *ngFor=\"let itemf of item.controls['fields'].controls;let fi =index\">\n <div [formGroupName]=\"fi\" [hidden]=\"fi !== selectMatrixFieldIndex\">\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"MatrixFieldDisplayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"name\">{{'DigniteAbpForms::FieldName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n <div class=\"form-text\">\n {{'DigniteAbpForms::FieldNameHelpText' | abpLocalization}}</div>\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"description\">{{'Cms::Description' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"description\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"formControlName\">{{'Cms::FieldType' | abpLocalization}}</label>\n <select class=\"form-select\" formControlName=\"formControlName\" (change)=\"setConfigComponent()\">\n <ng-container *ngFor=\"let itemC of _FieldControlGroup;let i =index\">\n <option [value]=\"itemC.name\">{{itemC.displayName}}</option>\n </ng-container>\n </select>\n </div>\n <!-- {{itemf.value.formControlName}}----{{item.value|json}} -->\n <ng-container *ngIf=\"itemf.value.formControlName&&itemf\">\n <df-dynamic [type]=\"itemf.value.formControlName\" [entity]=\"itemf\"\n [selected]=\"_selected?_selected['formConfiguration']['MatrixBlockTypes'][i]['fields'][fi]:''\"></df-dynamic>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n\n </div>\n </div>\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\n #submitclick></button>\n </div>\n</form>\n\n\n\n<abp-modal [(visible)]=\"matrixModalOpen\" [busy]=\"modalBusy\" (visibleChange)=\"matrixModalVisibleChange($event)\" >\n <ng-template #abpHeader>\n <h3>{{isMatrixEdit?('AbpUi::Edit' | abpLocalization):('Cms::New' | abpLocalization)}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"matrixModalForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"matrixModalForm\"\n (ngSubmit)=\"createOrEditSave()\">\n <button type=\"submit\" #matrixModalModalSubmit style=\"display: none\"></button>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"displayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"name\">{{'Cms::Name' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\"\n (click)=\"matrixModalModalSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>", styles: [""], 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: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", 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]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.FormSubmitDirective, selector: "form[ngSubmit][formGroup]", inputs: ["debounce", "notValidateOnSubmit", "markAsDirtyWhenSubmit"], outputs: ["ngSubmit"] }, { kind: "directive", type: i4.InitDirective, selector: "[abpInit]", outputs: ["abpInit"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i5.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i6.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i6.ModalCloseDirective, selector: "[abpClose]" }, { kind: "directive", type: i7.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i7.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i7.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i7.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { kind: "component", type: i8.DynamicComponent, selector: "df-dynamic", inputs: ["selected", "type", "entity", "culture", "parentFiledName", "fields"] }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] }); }
|
|
197
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MatrixConfigComponent, selector: "df-matrix-config", inputs: { type: "type", Entity: "Entity", selected: "selected" }, viewQueries: [{ propertyName: "submitclick", first: true, predicate: ["submitclick"], descendants: true, static: true }, { propertyName: "matrixModalModalSubmit", first: true, predicate: ["matrixModalModalSubmit"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"_Entity\">\n <div formGroupName=\"formConfiguration\">\n <div class=\"mb-2\">\n <label class=\"form-label\">{{'Cms::::FormControl:Matrix' | abpLocalization}}</label>\n <div class=\"row\">\n <div class=\"col-md-3\">\n <div class=\"list-group\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::MatrixBlockType' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixBlockType()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixBlockChange(i)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"i===selectMatrixBlockIndex\">\n <div>\n <div>{{item.value.displayName}}</div>\n <div>{{item.value.name}}</div>\n </div>\n <div ngbDropdown class=\"d-inline-block\">\n <button type=\"button\" class=\"btn btn-light btn-sm\" id=\"dropdownBasic1\"\n style=\"z-index: 8;\" ngbDropdownToggle></button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"z-index: 9;\">\n <button ngbDropdownItem\n (click.stop)=\"EditMatrixBlock(item.value)\">{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"DeleteMatrixBlock(i)\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </div>\n </div>\n </button>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"list-group\" *ngIf=\"MatrixBlockTypes?.controls.length>0\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::Fields' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixField()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <ng-container *ngIf=\"i === selectMatrixBlockIndex\">\n <ng-container *ngFor=\"let el of item.controls['fields'].controls;let fi =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixFieldChange(i,fi)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"fi===selectMatrixFieldIndex\">\n <div>\n <div>{{el.value.displayName}}</div>\n <div>{{el.value.name}}</div>\n </div>\n <button type=\"button\"\n (click.stop)=\"deleteMatrixField(item.controls['fields'],fi)\"\n class=\"btn btn-sm btn-li\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-6\" formArrayName=\"MatrixBlockTypes\">\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <div [formGroupName]=\"i\" [hidden]=\"i !== selectMatrixBlockIndex\">\n <div formArrayName=\"fields\">\n <ng-container *ngFor=\"let itemf of item.controls['fields'].controls;let fi =index\">\n <div [formGroupName]=\"fi\" [hidden]=\"fi !== selectMatrixFieldIndex\">\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"MatrixFieldDisplayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"name\">{{'DigniteAbpForms::FieldName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n <div class=\"form-text\">\n {{'DigniteAbpForms::FieldNameHelpText' | abpLocalization}}</div>\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"description\">{{'Cms::Description' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"description\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"formControlName\">{{'Cms::FieldType' | abpLocalization}}</label>\n <select class=\"form-select\" formControlName=\"formControlName\" (change)=\"setConfigComponent()\">\n <ng-container *ngFor=\"let itemC of _FieldControlGroup;let i =index\">\n <option [value]=\"itemC.name\">{{itemC.displayName}}</option>\n </ng-container>\n </select>\n </div>\n <ng-container *ngIf=\"itemf.value.formControlName&&itemf\">\n <df-dynamic [type]=\"itemf.value.formControlName\" [entity]=\"itemf\"\n [selected]=\"_selected?_selected['formConfiguration']['MatrixBlockTypes'][i]['fields'][fi]:''\"></df-dynamic>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n\n </div>\n </div>\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\n #submitclick></button>\n </div>\n</form>\n\n\n\n<abp-modal [(visible)]=\"matrixModalOpen\" [busy]=\"modalBusy\" (visibleChange)=\"matrixModalVisibleChange($event)\" >\n <ng-template #abpHeader>\n <h3>{{isMatrixEdit?('AbpUi::Edit' | abpLocalization):('Cms::New' | abpLocalization)}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"matrixModalForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"matrixModalForm\"\n (ngSubmit)=\"createOrEditSave()\">\n <button type=\"submit\" #matrixModalModalSubmit style=\"display: none\"></button>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"displayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"name\">{{'Cms::Name' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\"\n (click)=\"matrixModalModalSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>", styles: [""], 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: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", 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]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "directive", type: i4.FormSubmitDirective, selector: "form[ngSubmit][formGroup]", inputs: ["debounce", "notValidateOnSubmit", "markAsDirtyWhenSubmit"], outputs: ["ngSubmit"] }, { kind: "directive", type: i4.InitDirective, selector: "[abpInit]", outputs: ["abpInit"] }, { kind: "directive", type: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "directive", type: i5.ValidationGroupDirective, selector: "[formGroup],[formGroupName]", exportAs: ["validationGroup"] }, { kind: "directive", type: i5.ValidationDirective, selector: "[formControl],[formControlName]", exportAs: ["validationDirective"] }, { kind: "component", type: i6.ButtonComponent, selector: "abp-button", inputs: ["buttonId", "buttonClass", "buttonType", "formName", "iconClass", "loading", "disabled", "attributes"], outputs: ["click", "focus", "blur", "abpClick", "abpFocus", "abpBlur"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "directive", type: i6.ModalCloseDirective, selector: "[abpClose]" }, { kind: "directive", type: i7.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i7.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i7.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "directive", type: i7.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }, { kind: "component", type: i8.DynamicComponent, selector: "df-dynamic", inputs: ["selected", "type", "entity", "culture", "parentFiledName", "fields"] }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }] }); }
|
|
198
198
|
}
|
|
199
199
|
export { MatrixConfigComponent };
|
|
200
200
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MatrixConfigComponent, decorators: [{
|
|
201
201
|
type: Component,
|
|
202
|
-
args: [{ selector: 'df-matrix-config', template: "<form [formGroup]=\"_Entity\">\n <div formGroupName=\"formConfiguration\">\n <div class=\"mb-2\">\n <label class=\"form-label\">{{'Cms::::FormControl:Matrix' | abpLocalization}}</label>\n <div class=\"row\">\n <div class=\"col-md-3\">\n <div class=\"list-group\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::MatrixBlockType' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixBlockType()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixBlockChange(i)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"i===selectMatrixBlockIndex\">\n <div>\n <div>{{item.value.displayName}}</div>\n <div>{{item.value.name}}</div>\n </div>\n <div ngbDropdown class=\"d-inline-block\">\n <button type=\"button\" class=\"btn btn-light btn-sm\" id=\"dropdownBasic1\"\n style=\"z-index: 8;\" ngbDropdownToggle></button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"z-index: 9;\">\n <button ngbDropdownItem\n (click.stop)=\"EditMatrixBlock(item.value)\">{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"DeleteMatrixBlock(i)\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </div>\n </div>\n </button>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"list-group\" *ngIf=\"MatrixBlockTypes?.controls.length>0\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::Fields' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixField()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <ng-container *ngIf=\"i === selectMatrixBlockIndex\">\n <ng-container *ngFor=\"let el of item.controls['fields'].controls;let fi =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixFieldChange(i,fi)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"fi===selectMatrixFieldIndex\">\n <div>\n <div>{{el.value.displayName}}</div>\n <div>{{el.value.name}}</div>\n </div>\n <button type=\"button\"\n (click.stop)=\"deleteMatrixField(item.controls['fields'],fi)\"\n class=\"btn btn-sm btn-li\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-6\" formArrayName=\"MatrixBlockTypes\">\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <div [formGroupName]=\"i\" [hidden]=\"i !== selectMatrixBlockIndex\">\n <div formArrayName=\"fields\">\n <ng-container *ngFor=\"let itemf of item.controls['fields'].controls;let fi =index\">\n <div [formGroupName]=\"fi\" [hidden]=\"fi !== selectMatrixFieldIndex\">\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"MatrixFieldDisplayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"name\">{{'DigniteAbpForms::FieldName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n <div class=\"form-text\">\n {{'DigniteAbpForms::FieldNameHelpText' | abpLocalization}}</div>\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"description\">{{'Cms::Description' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"description\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"formControlName\">{{'Cms::FieldType' | abpLocalization}}</label>\n <select class=\"form-select\" formControlName=\"formControlName\" (change)=\"setConfigComponent()\">\n <ng-container *ngFor=\"let itemC of _FieldControlGroup;let i =index\">\n <option [value]=\"itemC.name\">{{itemC.displayName}}</option>\n </ng-container>\n </select>\n </div>\n <!-- {{itemf.value.formControlName}}----{{item.value|json}} -->\n <ng-container *ngIf=\"itemf.value.formControlName&&itemf\">\n <df-dynamic [type]=\"itemf.value.formControlName\" [entity]=\"itemf\"\n [selected]=\"_selected?_selected['formConfiguration']['MatrixBlockTypes'][i]['fields'][fi]:''\"></df-dynamic>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n\n </div>\n </div>\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\n #submitclick></button>\n </div>\n</form>\n\n\n\n<abp-modal [(visible)]=\"matrixModalOpen\" [busy]=\"modalBusy\" (visibleChange)=\"matrixModalVisibleChange($event)\" >\n <ng-template #abpHeader>\n <h3>{{isMatrixEdit?('AbpUi::Edit' | abpLocalization):('Cms::New' | abpLocalization)}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"matrixModalForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"matrixModalForm\"\n (ngSubmit)=\"createOrEditSave()\">\n <button type=\"submit\" #matrixModalModalSubmit style=\"display: none\"></button>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"displayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"name\">{{'Cms::Name' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\"\n (click)=\"matrixModalModalSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>" }]
|
|
202
|
+
args: [{ selector: 'df-matrix-config', template: "<form [formGroup]=\"_Entity\">\n <div formGroupName=\"formConfiguration\">\n <div class=\"mb-2\">\n <label class=\"form-label\">{{'Cms::::FormControl:Matrix' | abpLocalization}}</label>\n <div class=\"row\">\n <div class=\"col-md-3\">\n <div class=\"list-group\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::MatrixBlockType' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixBlockType()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixBlockChange(i)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"i===selectMatrixBlockIndex\">\n <div>\n <div>{{item.value.displayName}}</div>\n <div>{{item.value.name}}</div>\n </div>\n <div ngbDropdown class=\"d-inline-block\">\n <button type=\"button\" class=\"btn btn-light btn-sm\" id=\"dropdownBasic1\"\n style=\"z-index: 8;\" ngbDropdownToggle></button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"z-index: 9;\">\n <button ngbDropdownItem\n (click.stop)=\"EditMatrixBlock(item.value)\">{{'AbpUi::Edit' | abpLocalization}}</button>\n <button ngbDropdownItem\n (click.stop)=\"DeleteMatrixBlock(i)\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </div>\n </div>\n </button>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-3\">\n <div class=\"list-group\" *ngIf=\"MatrixBlockTypes?.controls.length>0\">\n <li class=\"list-group-item d-flex align-items-center justify-content-between\"\n aria-current=\"true\">\n {{'Cms::Fields' | abpLocalization}}\n <button class=\"btn btn-light btn-sm p-0\" (click.stop)=\"addMatrixField()\">\n <i class=\"fas fa-plus-circle p-1\"></i>\n </button>\n </li>\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <ng-container *ngIf=\"i === selectMatrixBlockIndex\">\n <ng-container *ngFor=\"let el of item.controls['fields'].controls;let fi =index\">\n <button type=\"button\" (click.stop)=\"selectMatrixFieldChange(i,fi)\"\n class=\"list-group-item d-flex align-items-center justify-content-between list-group-item-action \"\n [class.active]=\"fi===selectMatrixFieldIndex\">\n <div>\n <div>{{el.value.displayName}}</div>\n <div>{{el.value.name}}</div>\n </div>\n <button type=\"button\"\n (click.stop)=\"deleteMatrixField(item.controls['fields'],fi)\"\n class=\"btn btn-sm btn-li\">{{'AbpUi::Delete' | abpLocalization}}</button>\n </button>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </div>\n <div class=\"col-md-6\" formArrayName=\"MatrixBlockTypes\">\n <ng-container *ngFor=\"let item of MatrixBlockTypes.controls;let i =index\">\n <div [formGroupName]=\"i\" [hidden]=\"i !== selectMatrixBlockIndex\">\n <div formArrayName=\"fields\">\n <ng-container *ngFor=\"let itemf of item.controls['fields'].controls;let fi =index\">\n <div [formGroupName]=\"fi\" [hidden]=\"fi !== selectMatrixFieldIndex\">\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"MatrixFieldDisplayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"name\">{{'DigniteAbpForms::FieldName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n <div class=\"form-text\">\n {{'DigniteAbpForms::FieldNameHelpText' | abpLocalization}}</div>\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"description\">{{'Cms::Description' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"description\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\"\n for=\"formControlName\">{{'Cms::FieldType' | abpLocalization}}</label>\n <select class=\"form-select\" formControlName=\"formControlName\" (change)=\"setConfigComponent()\">\n <ng-container *ngFor=\"let itemC of _FieldControlGroup;let i =index\">\n <option [value]=\"itemC.name\">{{itemC.displayName}}</option>\n </ng-container>\n </select>\n </div>\n <ng-container *ngIf=\"itemf.value.formControlName&&itemf\">\n <df-dynamic [type]=\"itemf.value.formControlName\" [entity]=\"itemf\"\n [selected]=\"_selected?_selected['formConfiguration']['MatrixBlockTypes'][i]['fields'][fi]:''\"></df-dynamic>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </div>\n\n </div>\n </div>\n <button type=\"submit\" (abpInit)=\"submitclick?.nativeElement?.click()\" style=\"display: none;\"\n #submitclick></button>\n </div>\n</form>\n\n\n\n<abp-modal [(visible)]=\"matrixModalOpen\" [busy]=\"modalBusy\" (visibleChange)=\"matrixModalVisibleChange($event)\" >\n <ng-template #abpHeader>\n <h3>{{isMatrixEdit?('AbpUi::Edit' | abpLocalization):('Cms::New' | abpLocalization)}}</h3>\n </ng-template>\n <ng-template #abpBody>\n <ng-template #loaderRef>\n <div class=\"text-center\"><i class=\"fa fa-pulse fa-spinner\" aria-hidden=\"true\"></i></div>\n </ng-template>\n <ng-container *ngIf=\"matrixModalForm; else loaderRef\">\n <form class=\"sites-modal-form\" #myForm=\"ngForm\" [formGroup]=\"matrixModalForm\"\n (ngSubmit)=\"createOrEditSave()\">\n <button type=\"submit\" #matrixModalModalSubmit style=\"display: none\"></button>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"displayName\">{{'Cms::DisplayName' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"displayName\"\n (blur)=\"displayNameInputBlur($event)\">\n </div>\n <div class=\"mb-2\">\n <label class=\"form-label\" for=\"name\">{{'Cms::Name' | abpLocalization}}</label>\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\n </div>\n </form>\n </ng-container>\n </ng-template>\n <ng-template #abpFooter>\n <button type=\"button\" class=\"btn btn-secondary\" abpClose>{{'AbpUi::Close' | abpLocalization}}</button>\n <abp-button iconClass=\"fa fa-check\"\n (click)=\"matrixModalModalSubmit.nativeElement.click()\">{{'AbpUi::Save' | abpLocalization}}</abp-button>\n </ng-template>\n</abp-modal>" }]
|
|
203
203
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.CmsApiService }, { type: i2.FieldAbstractsService }]; }, propDecorators: { type: [{
|
|
204
204
|
type: Input
|
|
205
205
|
}], Entity: [{
|
|
@@ -213,4 +213,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
213
213
|
type: ViewChild,
|
|
214
214
|
args: ['matrixModalModalSubmit', { static: false }]
|
|
215
215
|
}] } });
|
|
216
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LWNvbmZpZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9tYXRyaXgvbWF0cml4LWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9tYXRyaXgvbWF0cml4LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQWUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7QUFHakUsTUFLYSxxQkFBcUI7SUFFaEMsWUFDVSxFQUFlLEVBQ2YsY0FBNkIsRUFDN0Isc0JBQTZDO1FBRjdDLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBK0V2RCxZQUFZO1FBQ1osb0JBQWUsR0FBWSxLQUFLLENBQUE7UUFDaEMsZ0JBQWdCO1FBQ2hCLHNCQUFpQixHQUFRLEtBQUssQ0FBQTtRQUU5Qix5QkFBeUI7UUFDekIsY0FBUyxHQUFZLEtBQUssQ0FBQTtRQVExQixlQUFlO1FBQ2YsMkJBQXNCLEdBQVEsQ0FBQyxDQUFBO1FBRS9CLHFCQUFxQjtRQUNyQiwyQkFBc0IsR0FBUSxDQUFDLENBQUE7SUFoRzNCLENBQUM7SUFNTCxJQUNXLElBQUksQ0FBQyxDQUFNO1FBQ3BCLElB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QkFVc0MsV0FBVztzQkFBdEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQTBEYyxzQkFBc0I7c0JBQTdFLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgVmlld0NoaWxkLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdHJpeENvbmZpZywgTWF0cml4SXRlbUNvbmZpZyB9IGZyb20gJy4vbWF0cml4LWNvbmZpZyc7XG5pbXBvcnQgeyBDbXNBcGlTZXJ2aWNlLCBGaWVsZEFic3RyYWN0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RmLW1hdHJpeC1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0cml4LWNvbmZpZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdHJpeC1jb25maWcuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRyaXhDb25maWdDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgX0Ntc0FwaVNlcnZpY2U6IENtc0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfRmllbGRBYnN0cmFjdHNTZXJ2aWNlOiBGaWVsZEFic3RyYWN0c1NlcnZpY2UsXG4gICkgeyB9XG5cbiAgLyoq6KGo5Y2V5o6n5Lu257uEICovXG4gIF9GaWVsZENvbnRyb2xHcm91cDogYW55W11cbiAgLyoq6KGo5Y2V5o6n5Lu257G75Z6LICovXG4gIF90eXBlOiBhbnlcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB0eXBlKHY6IGFueSkge1xuICAgIHRoaXMuX3R5cGUgPSB2XG4gICAgdGhpcy5kYXRhTG9hZGVkKClcbiAgfVxuICAvKirooajljZXlrp7kvZMgKi9cbiAgX0VudGl0eTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgRW50aXR5KHY6IEZvcm1Hcm91cCkge1xuICAgIHRoaXMuX0VudGl0eSA9IHY7XG4gICAgdGhpcy5kYXRhTG9hZGVkKClcbiAgfVxuXG5cbiAgLyoq6YCJ5oup55qE6KGo5Y2V5L+h5oGvICovXG4gIF9zZWxlY3RlZDogYW55XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQodjogYW55KSB7XG5cbiAgICBpZiAodikge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB2XG4gICAgICB0aGlzLmRhdGFMb2FkZWQoKVxuICAgIH1cbiAgfVxuXG5cbiAgQFZpZXdDaGlsZCgnc3VibWl0Y2xpY2snLCB7IHN0YXRpYzogdHJ1ZSB9KSBzdWJtaXRjbGljazogRWxlbWVudFJlZjtcblxuICBhc3luYyBkYXRhTG9hZGVkKCkge1xuICAgIGlmICh0aGlzLl9FbnRpdHkgJiYgdGhpcy5fdHlwZSkge1xuICAgICAgYXdhaXQgdGhpcy5BZnRlckluaXQoKVxuICAgICAgdGhpcy5zdWJtaXRjbGljay5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgQWZ0ZXJJbml0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgdGhpcy5fRmllbGRDb250cm9sR3JvdXAgPSB0aGlzLl9GaWVsZEFic3RyYWN0c1NlcnZpY2UuZ2V0RXhjbHVkZUFzc2lnbkNvbnRyb2wodGhpcy5fdHlwZSlcbiAgICAgIHRoaXMuX0VudGl0eS5zZXRDb250cm9sKCdmb3JtQ29uZmlndXJhdGlvbicsIHRoaXMuZmIuZ3JvdXAobmV3IE1hdHJpeENvbmZpZygpKSlcbiAgICAgIGF3YWl0IHRoaXMuc2V0U2VsZWN0VmFsdWUoKVxuICAgICAgdGhpcy5mb3JtQ29uZmlndXJhdGlvbi5wYXRjaFZhbHVlKHRoaXMuX3NlbGVjdGVkLmZvcm1Db25maWd1cmF0aW9uKVxuICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgIH0pXG4gIH1cblxuXG4gIHNldFNlbGVjdFZhbHVlKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkICYmIHRoaXMuX3NlbGVjdGVkLmZvcm1Db250cm9sTmFtZSA9PSB0aGlzLl90eXBlKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkLmZvcm1Db25maWd1cmF0aW9uWydNYXRyaXhCbG9ja1R5cGVzJ10uZm9yRWFjaCgoKGVsLCBpbmRleCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkTWF0cml4QmxvY2tUeXBlSXRlbShlbClcbiAgICAgICAgICBlbC5maWVsZHMuZm9yRWFjaCgoZWxmLCBpbmRleGYpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0cml4RmllbGRJdGVtKGVsZiwgaW5kZXgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkpXG4gICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgIH1cblxuICAgIH0pXG4gIH1cblxuICAvKirojrflj5booajljZXphY3nva4gKi9cbiAgZ2V0IGZvcm1Db25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9FbnRpdHkuZ2V0KCdmb3JtQ29uZmlndXJhdGlvbicpIGFzIEZvcm1Hcm91cFxuICB9XG5cbiAgLyoq6I635Y+W6KGo5Y2V6YWN572u5LiL55qE55+p6Zi15Z2X6KGo5Y2V5pWw57uEICovXG4gIGdldCBNYXRyaXhCbG9ja1R5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWd1cmF0aW9uLmNvbnRyb2xzWydNYXRyaXhCbG9ja1R5cGVzJ10gYXMgRm9ybUFycmF5XG4gIH1cblxuXG4gIC8qKuaooeaAgeahhi3nirbmgIEgKi9cbiAgbWF0cml4TW9kYWxPcGVuOiBib29sZWFuID0gZmFsc2VcbiAgLyoq5qih5oCB5qGGLeaYr+WQpuato+WcqOe8lui+kSAqL1xuICBpc01hdHJpeE1vZGFsRWRpdDogYW55ID0gZmFsc2VcblxuICAvKirmqKHmgIHmoYYt55So5LqO56Gu5a6a5qih5oCB55qE57mB5b+Z54q25oCB5piv5ZCm5Li655yfICovXG4gIG1vZGFsQnVzeTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoq5qih5oCB5qGGLeihqOWNlSAqL1xuICBtYXRyaXhNb2RhbEZvcm06IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuICAvKirooajljZXmjqfku7bmqKHmnb8t55So5LqO5ZyoZm9ybeWkluaPkOS6pHN1Ym1pdCAqL1xuICBAVmlld0NoaWxkKCdtYXRyaXhNb2RhbE1vZGFsU3VibWl0JywgeyBzdGF0aWM6IGZhbHNlIH0pIG1hdHJpeE1vZGFsTW9kYWxTdWJtaXQ6IEVsZW1lbnRSZWY7XG5cbiAgLyoq55+p6Zi15Z2XLemAieaLqeeahOS4i+aghyAqL1xuICBzZWxlY3RNYXRyaXhCbG9ja0luZGV4OiBhbnkgPSAwXG5cbiAgLyoq55+p6Zi15Z2XLemAieaLqeeahOefqemYteS4i+Wtl+auteeahOS4i+aghyAqL1xuICBzZWxlY3RNYXRyaXhGaWVsZEluZGV4OiBhbnkgPSAwXG5cbiAgLyoq5qih5oCB5qGGLeeKtuaAgeaUueWPmCAqL1xuICBtYXRyaXhNb2RhbFZpc2libGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICB0aGlzLmlzTWF0cml4TW9kYWxFZGl0ID0gZmFsc2VcbiAgICAgIHRoaXMubWF0cml4TW9kYWxGb3JtID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuXG4gIC8qKuefqemYteWdly0t5paw5aKeLeaJk+W8gOaooeaAgeahhiAqL1xuICBhZGRNYXRyaXhCbG9ja1R5cGUoKSB7XG4gICAgdGhpcy5tYXRyaXhNb2RhbEZvcm0gPSB0aGlzLmZiLmdyb3VwKG5ldyBNYXRyaXhJdGVtQ29uZmlnKCkpXG4gICAgdGhpcy5tYXRyaXhNb2RhbE9wZW4gPSB0cnVlXG4gIH1cblxuXG5cbiAgLyoq5qih5oCB5qGGLS3nn6npmLXooajljZXkv53lrZjmj5DkuqQgKi9cbiAgY3JlYXRlT3JFZGl0U2F2ZSgpIHtcbiAgICBsZXQgaW5wdXQgPSB0aGlzLm1hdHJpeE1vZGFsRm9ybS52YWx1ZVxuICAgIGlmICghdGhpcy5tYXRyaXhNb2RhbEZvcm0udmFsaWQpIHJldHVyblxuICAgIGlmICh0aGlzLmlzTWF0cml4TW9kYWxFZGl0KSB7XG4gICAgICBsZXQgTWF0cml4QmxvY2tUeXBlc0l0ZW0gPSB0aGlzLk1hdHJpeEJsb2NrVHlwZXMuYXQodGhpcy5zZWxlY3RNYXRyaXhCbG9ja0luZGV4KSBhcyBGb3JtR3JvdXBcbiAgICAgIE1hdHJpeEJsb2NrVHlwZXNJdGVtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi5pbnB1dFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRNYXRyaXhCbG9ja1R5cGVJdGVtKGlucHV0KVxuICAgIH1cbiAgICB0aGlzLm1hdHJpeE1vZGFsT3BlbiA9IGZhbHNlXG4gIH1cbiAgLyoq5paw5aKe55+p6Zi15Z2XLeWQkeaVsOe7hOihqOWNleS4reWinuWKoOmhuSAqL1xuICBhZGRNYXRyaXhCbG9ja1R5cGVJdGVtKGlucHV0KSB7XG4gICAgdGhpcy5NYXRyaXhCbG9ja1R5cGVzLnB1c2gobmV3IEZvcm1Hcm91cCh7XG4gICAgICBkaXNwbGF5TmFtZTogbmV3IEZvcm1Db250cm9sKGlucHV0LmRpc3BsYXlOYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIG5hbWU6IG5ldyBGb3JtQ29udHJvbChpbnB1dC5uYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGZpZWxkczogbmV3IEZvcm1BcnJheShbXSlcbiAgICB9KSlcbiAgfVxuICAvKirnvJbovpHnn6npmLXlnZcgKi9cbiAgRWRpdE1hdHJpeEJsb2NrKGlucHV0KSB7XG4gICAgdGhpcy5tYXRyaXhNb2RhbEZvcm0gPSB0aGlzLmZiLmdyb3VwKG5ldyBNYXRyaXhJdGVtQ29uZmlnKCkpXG4gICAgdGhpcy5tYXRyaXhNb2RhbEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAuLi5pbnB1dFxuICAgIH0pXG4gICAgdGhpcy5tYXRyaXhNb2RhbE9wZW4gPSB0cnVlXG4gICAgdGhpcy5pc01hdHJpeE1vZGFsRWRpdCA9IHRydWVcbiAgfVxuXG4gIC8qKuWIoOmZpOefqemYteWdlyAqL1xuICBEZWxldGVNYXRyaXhCbG9jayhpbmRleCkge1xuICAgIHRoaXMuTWF0cml4QmxvY2tUeXBlcy5yZW1vdmVBdChpbmRleClcbiAgfVxuXG4gIC8qKuefqemYteWdly3pgInmi6kgKi9cbiAgc2VsZWN0TWF0cml4QmxvY2tDaGFuZ2UoaW5kZXgpIHtcbiAgICB0aGlzLnNlbGVjdE1hdHJpeEJsb2NrSW5kZXggPSBpbmRleFxuICB9XG5cbiAgLyoq55+p6Zi15a2X5q61LeaWsOWiniAqL1xuICBhZGRNYXRyaXhGaWVsZCgpIHtcbiAgICB0aGlzLmFkZE1hdHJpeEZpZWxkSXRlbSgnJywgdGhpcy5zZWxlY3RNYXRyaXhCbG9ja0luZGV4KVxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgbGV0IE1hdHJpeEJsb2NrVHlwZXNJdGVtRm9ybSA9IHRoaXMuTWF0cml4QmxvY2tUeXBlcy5hdCh0aGlzLnNlbGVjdE1hdHJpeEJsb2NrSW5kZXgpIGFzIEZvcm1Hcm91cFxuICAgIGxldCBNYXRyaXhGaWVsZEl0ZW1Gb3JtID0gTWF0cml4QmxvY2tUeXBlc0l0ZW1Gb3JtLmdldCgnZmllbGRzJykgYXMgRm9ybUFycmF5XG4gICAgdGhpcy5zZWxlY3RNYXRyaXhGaWVsZENoYW5nZSgwLCBNYXRyaXhGaWVsZEl0ZW1Gb3JtLmxlbmd0aCAtIDEpXG5cbiAgfVxuICAvKirnn6npmLXlrZfmrrUt5paw5aKe55+p6Zi15a2X5q616aG5ICovXG4gIGFkZE1hdHJpeEZpZWxkSXRlbShpbnB1dDogYW55ID0gJycsIHNlbGVjdE1hdHJpeEJsb2NrSW5kZXgpIHtcbiAgICAvKirnn6npmLXkuIvmoIfnmoTnn6npmLXpoblGb3JtICovXG4gICAgbGV0IE1hdHJpeEJsb2NrVHlwZXNJdGVtRm9ybSA9IHRoaXMuTWF0cml4QmxvY2tUeXBlcy5hdChzZWxlY3RNYXRyaXhCbG9ja0luZGV4KSBhcyBGb3JtR3JvdXBcbiAgICBsZXQgTWF0cml4RmllbGRJdGVtRm9ybSA9IE1hdHJpeEJsb2NrVHlwZXNJdGVtRm9ybS5nZXQoJ2ZpZWxkcycpIGFzIEZvcm1BcnJheVxuICAgIE1hdHJpeEZpZWxkSXRlbUZvcm0ucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8qKuWtl+auteWQjeensCBEaXNwbGF5IG5hbWUgb2YgdGhpcyBmaWVsZCAqL1xuICAgICAgZGlzcGxheU5hbWU6IFtpbnB1dC5kaXNwbGF5TmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIC8qKuWtl+auteWUr+S4gOWQjeensCBVbmlxdWUgTmFtZSovXG4gICAgICBuYW1lOiBbaW5wdXQubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIC8qKuaPj+i/sCDor7TmmI4gKi9cbiAgICAgIGRlc2NyaXB0aW9uOiBbaW5wdXQuZGVzY3JpcHRpb24sIFtdXSxcbiAgICAgIC8qKkZpZWxkVHlwZeWtl+auteexu+WeiyDooajljZXmjqfku7blkI3np7AgKi9cbiAgICAgIGZvcm1Db250cm9sTmFtZTogW2lucHV0LmZvcm1Db250cm9sTmFtZSB8fCAnVGV4dEVkaXQnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgLy/liqjmgIHooajljZXphY3nva5cbiAgICAgIGZvcm1Db25maWd1cmF0aW9uOiBuZXcgRm9ybUdyb3VwKHt9KSxcbiAgICB9KSlcbiAgICAvL1xuICB9XG5cbiAgLyoq5Yig6Zmk55+p6Zi15a2X5q616aG5ICovXG4gIGRlbGV0ZU1hdHJpeEZpZWxkKE1hdHJpeEZpZWxkRm9ybSwgaW5kZXgpIHtcbiAgICBNYXRyaXhGaWVsZEZvcm0ucmVtb3ZlQXQoaW5kZXgpXG4gICAgdGhpcy5zZWxlY3RNYXRyaXhGaWVsZEluZGV4ID0gMFxuICB9XG5cbiAgLyoq55+p6Zi15a2X5q61LemAieaLqSAqL1xuICBzZWxlY3RNYXRyaXhGaWVsZENoYW5nZShNYXRyaXhCbG9ja0luZGV4LCBNYXRyaXhGaWVsZEluZGV4KSB7XG4gICAgdGhpcy5zZWxlY3RNYXRyaXhGaWVsZEluZGV4ID0gTWF0cml4RmllbGRJbmRleFxuICB9XG5cbiAgZ2V0IG5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhNb2RhbEZvcm0/LmdldCgnbmFtZScpXG4gIH1cbiAgZ2V0IEZpZWxkbmFtZUlucHV0KCkge1xuICAgIGxldCBNYXRyaXhCbG9ja1R5cGVzSXRlbUZvcm0gPSB0aGlzLk1hdHJpeEJsb2NrVHlwZXMuYXQodGhpcy5zZWxlY3RNYXRyaXhCbG9ja0luZGV4KSBhcyBGb3JtR3JvdXBcbiAgICBsZXQgTWF0cml4RmllbGRJdGVtRm9ybSA9IE1hdHJpeEJsb2NrVHlwZXNJdGVtRm9ybS5nZXQoJ2ZpZWxkcycpIGFzIEZvcm1BcnJheVxuICAgIHJldHVybiBNYXRyaXhGaWVsZEl0ZW1Gb3JtLmF0KHRoaXMuc2VsZWN0TWF0cml4RmllbGRJbmRleCkuZ2V0KCduYW1lJylcbiAgfVxuXG4gIC8qKuefqemYtWRpc3BsYXlOYW1lSW5wdXTlrZfmrrXlpLHljrvnhKbngrkgKi9cbiAgZGlzcGxheU5hbWVJbnB1dEJsdXIoZXZlbnQpIHtcbiAgICBsZXQgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcbiAgICBsZXQgcGlueWluID0gdGhpcy5fQ21zQXBpU2VydmljZS5jaGluZXNlVG9QaW55aW4odmFsdWUpXG4gICAgbGV0IG5hbWVJbnB1dCA9IHRoaXMubmFtZUlucHV0XG4gICAgaWYgKG5hbWVJbnB1dC52YWx1ZSkgcmV0dXJuXG4gICAgbmFtZUlucHV0LnBhdGNoVmFsdWUocGlueWluKVxuICB9XG4gIC8qKuefqemYtWRpc3BsYXlOYW1lSW5wdXTlrZfmrrXlpLHljrvnhKbngrkgKi9cbiAgTWF0cml4RmllbGREaXNwbGF5TmFtZUlucHV0Qmx1cihldmVudCkge1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgIGxldCBwaW55aW4gPSB0aGlzLl9DbXNBcGlTZXJ2aWNlLmNoaW5lc2VUb1Bpbnlpbih2YWx1ZSlcbiAgICBsZXQgRmllbGRuYW1lSW5wdXQgPSB0aGlzLkZpZWxkbmFtZUlucHV0XG4gICAgaWYgKEZpZWxkbmFtZUlucHV0LnZhbHVlKSByZXR1cm5cbiAgICBGaWVsZG5hbWVJbnB1dC5wYXRjaFZhbHVlKHBpbnlpbilcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJfRW50aXR5XCI+XG4gICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiZm9ybUNvbmZpZ3VyYXRpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydDbXM6Ojo6Rm9ybUNvbnRyb2w6TWF0cml4JyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWN1cnJlbnQ9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ21zOjpNYXRyaXhCbG9ja1R5cGUnIHwgYWJwTG9jYWxpemF0aW9ufX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gcC0wXCIgKGNsaWNrLnN0b3ApPVwiYWRkTWF0cml4QmxvY2tUeXBlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1cy1jaXJjbGUgcC0xXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgTWF0cml4QmxvY2tUeXBlcy5jb250cm9scztsZXQgaSA9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2suc3RvcCk9XCJzZWxlY3RNYXRyaXhCbG9ja0NoYW5nZShpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbGlzdC1ncm91cC1pdGVtLWFjdGlvbiBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImk9PT1zZWxlY3RNYXRyaXhCbG9ja0luZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS52YWx1ZS5kaXNwbGF5TmFtZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS52YWx1ZS5uYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIGlkPVwiZHJvcGRvd25CYXNpYzFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiei1pbmRleDogODtcIiBuZ2JEcm9wZG93blRvZ2dsZT48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCIgc3R5bGU9XCJ6LWluZGV4OiA5O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljay5zdG9wKT1cIkVkaXRNYXRyaXhCbG9jayhpdGVtLnZhbHVlKVwiPnt7J0FicFVpOjpFZGl0JyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiRGVsZXRlTWF0cml4QmxvY2soaSlcIj57eydBYnBVaTo6RGVsZXRlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwXCIgKm5nSWY9XCJNYXRyaXhCbG9ja1R5cGVzPy5jb250cm9scy5sZW5ndGg+MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtY3VycmVudD1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydDbXM6OkZpZWxkcycgfCBhYnBMb2NhbGl6YXRpb259fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBwLTBcIiAoY2xpY2suc3RvcCk9XCJhZGRNYXRyaXhGaWVsZCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXMtY2lyY2xlIHAtMVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIE1hdHJpeEJsb2NrVHlwZXMuY29udHJvbHM7bGV0IGkgPWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgPT09IHNlbGVjdE1hdHJpeEJsb2NrSW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWwgb2YgaXRlbS5jb250cm9sc1snZmllbGRzJ10uY29udHJvbHM7bGV0IGZpID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrLnN0b3ApPVwic2VsZWN0TWF0cml4RmllbGRDaGFuZ2UoaSxmaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbGlzdC1ncm91cC1pdGVtLWFjdGlvbiBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZmk9PT1zZWxlY3RNYXRyaXhGaWVsZEluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2VsLnZhbHVlLmRpc3BsYXlOYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2VsLnZhbHVlLm5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljay5zdG9wKT1cImRlbGV0ZU1hdHJpeEZpZWxkKGl0ZW0uY29udHJvbHNbJ2ZpZWxkcyddLGZpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlcIj57eydBYnBVaTo6RGVsZXRlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgZm9ybUFycmF5TmFtZT1cIk1hdHJpeEJsb2NrVHlwZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBNYXRyaXhCbG9ja1R5cGVzLmNvbnRyb2xzO2xldCBpID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgW2hpZGRlbl09XCJpICE9PSBzZWxlY3RNYXRyaXhCbG9ja0luZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiZmllbGRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW1mIG9mIGl0ZW0uY29udHJvbHNbJ2ZpZWxkcyddLmNvbnRyb2xzO2xldCBmaSA9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwiZmlcIiBbaGlkZGVuXT1cImZpICE9PSBzZWxlY3RNYXRyaXhGaWVsZEluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJkaXNwbGF5TmFtZVwiPnt7J0Ntczo6RGlzcGxheU5hbWUnIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIk1hdHJpeEZpZWxkRGlzcGxheU5hbWVJbnB1dEJsdXIoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwibmFtZVwiPnt7J0RpZ25pdGVBYnBGb3Jtczo6RmllbGROYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0RpZ25pdGVBYnBGb3Jtczo6RmllbGROYW1lSGVscFRleHQnIHwgYWJwTG9jYWxpemF0aW9ufX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcj1cImRlc2NyaXB0aW9uXCI+e3snQ21zOjpEZXNjcmlwdGlvbicgfCBhYnBMb2NhbGl6YXRpb259fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcj1cImZvcm1Db250cm9sTmFtZVwiPnt7J0Ntczo6RmllbGRUeXBlJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9ybUNvbnRyb2xOYW1lXCIgKGNoYW5nZSk9XCJzZXRDb25maWdDb21wb25lbnQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbUMgb2YgX0ZpZWxkQ29udHJvbEdyb3VwO2xldCBpID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIml0ZW1DLm5hbWVcIj57e2l0ZW1DLmRpc3BsYXlOYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHt7aXRlbWYudmFsdWUuZm9ybUNvbnRyb2xOYW1lfX0tLS0te3tpdGVtLnZhbHVlfGpzb259fSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbWYudmFsdWUuZm9ybUNvbnRyb2xOYW1lJiZpdGVtZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGYtZHluYW1pYyBbdHlwZV09XCJpdGVtZi52YWx1ZS5mb3JtQ29udHJvbE5hbWVcIiBbZW50aXR5XT1cIml0ZW1mXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJfc2VsZWN0ZWQ/X3NlbGVjdGVkWydmb3JtQ29uZmlndXJhdGlvbiddWydNYXRyaXhCbG9ja1R5cGVzJ11baV1bJ2ZpZWxkcyddW2ZpXTonJ1wiPjwvZGYtZHluYW1pYz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAoYWJwSW5pdCk9XCJzdWJtaXRjbGljaz8ubmF0aXZlRWxlbWVudD8uY2xpY2soKVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIlxuICAgICAgICAgICAgI3N1Ym1pdGNsaWNrPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9mb3JtPlxuXG5cblxuPGFicC1tb2RhbCBbKHZpc2libGUpXT1cIm1hdHJpeE1vZGFsT3BlblwiIFtidXN5XT1cIm1vZGFsQnVzeVwiICh2aXNpYmxlQ2hhbmdlKT1cIm1hdHJpeE1vZGFsVmlzaWJsZUNoYW5nZSgkZXZlbnQpXCIgPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPlxuICAgICAgICA8aDM+e3tpc01hdHJpeEVkaXQ/KCdBYnBVaTo6RWRpdCcgfCBhYnBMb2NhbGl6YXRpb24pOignQ21zOjpOZXcnIHwgYWJwTG9jYWxpemF0aW9uKX19PC9oMz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNsb2FkZXJSZWY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj48aSBjbGFzcz1cImZhIGZhLXB1bHNlIGZhLXNwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXRyaXhNb2RhbEZvcm07IGVsc2UgbG9hZGVyUmVmXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cInNpdGVzLW1vZGFsLWZvcm1cIiAjbXlGb3JtPVwibmdGb3JtXCIgW2Zvcm1Hcm91cF09XCJtYXRyaXhNb2RhbEZvcm1cIlxuICAgICAgICAgICAgICAgIChuZ1N1Ym1pdCk9XCJjcmVhdGVPckVkaXRTYXZlKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAjbWF0cml4TW9kYWxNb2RhbFN1Ym1pdCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiZGlzcGxheU5hbWVcIj57eydDbXM6OkRpc3BsYXlOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJkaXNwbGF5TmFtZUlucHV0Qmx1cigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cIm5hbWVcIj57eydDbXM6Ok5hbWUnIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGFicENsb3NlPnt7J0FicFVpOjpDbG9zZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxuICAgICAgICA8YWJwLWJ1dHRvbiBpY29uQ2xhc3M9XCJmYSBmYS1jaGVja1wiXG4gICAgICAgICAgICAoY2xpY2spPVwibWF0cml4TW9kYWxNb2RhbFN1Ym1pdC5uYXRpdmVFbGVtZW50LmNsaWNrKClcIj57eydBYnBVaTo6U2F2ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYWJwLWJ1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9hYnAtbW9kYWw+Il19
|
|
216
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cml4LWNvbmZpZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9tYXRyaXgvbWF0cml4LWNvbmZpZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbXMvc3JjL2xpYi9jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9tYXRyaXgvbWF0cml4LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsU0FBUyxHQUFHLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQWUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7QUFHakUsTUFLYSxxQkFBcUI7SUFFaEMsWUFDVSxFQUFlLEVBQ2YsY0FBNkIsRUFDN0Isc0JBQTZDO1FBRjdDLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBK0V2RCxZQUFZO1FBQ1osb0JBQWUsR0FBWSxLQUFLLENBQUE7UUFDaEMsZ0JBQWdCO1FBQ2hCLHNCQUFpQixHQUFRLEtBQUssQ0FBQTtRQUU5Qix5QkFBeUI7UUFDekIsY0FBUyxHQUFZLEtBQUssQ0FBQTtRQVExQixlQUFlO1FBQ2YsMkJBQXNCLEdBQVEsQ0FBQyxDQUFBO1FBRS9CLHFCQUFxQjtRQUNyQiwyQkFBc0IsR0FBUSxDQUFDLENBQUE7SUFoRzNCLENBQUM7SUFNTCxJQUNXLElBQUksQ0FBQyxDQUFNO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFBO1FBQ2QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQ25CLENBQUM7SUFHRCxJQUNXLE1BQU0sQ0FBQyxDQUFZO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUNuQixDQUFDO0lBS0QsSUFDVyxRQUFRLENBQUMsQ0FBTTtRQUV4QixJQUFJLENBQUMsRUFBRTtZQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFBO1lBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtTQUNsQjtJQUNILENBQUM7SUFLRCxLQUFLLENBQUMsVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1lBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDNUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDekYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUE7WUFDL0UsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7WUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDbkUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2YsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBR0QsY0FBYztRQUNaLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2xFLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDMUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFBO29CQUMvQixFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRTt3QkFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtvQkFDckMsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7YUFDZDtRQUVILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELFlBQVk7SUFDWixJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFjLENBQUE7SUFDM0QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQWMsQ0FBQTtJQUN6RSxDQUFDO0lBdUJELGNBQWM7SUFDZCx3QkFBd0IsQ0FBQyxLQUFLO1FBQzVCLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFBO1lBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFBO1lBQ2hDLE9BQU07U0FDUDtJQUNILENBQUM7SUFHRCxtQkFBbUI7SUFDbkIsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7SUFDN0IsQ0FBQztJQUlELG1CQUFtQjtJQUNuQixnQkFBZ0I7UUFDZCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQTtRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLO1lBQUUsT0FBTTtRQUN2QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLG9CQUFvQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFjLENBQUE7WUFDN0Ysb0JBQW9CLENBQUMsVUFBVSxDQUFDO2dCQUM5QixHQUFHLEtBQUs7YUFDVCxDQUFDLENBQUE7U0FDSDthQUFNO1lBQ0wsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQ25DO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUE7SUFDOUIsQ0FBQztJQUNELHFCQUFxQjtJQUNyQixzQkFBc0IsQ0FBQyxLQUFLO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUM7WUFDdkMsV0FBVyxFQUFFLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNwRSxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3RELE1BQU0sRUFBRSxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDMUIsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDO0lBQ0QsV0FBVztJQUNYLGVBQWUsQ0FBQyxLQUFLO1FBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7WUFDOUIsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQTtJQUMvQixDQUFDO0lBRUQsV0FBVztJQUNYLGlCQUFpQixDQUFDLEtBQUs7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQsWUFBWTtJQUNaLHVCQUF1QixDQUFDLEtBQUs7UUFDM0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQTtJQUNyQyxDQUFDO0lBRUQsYUFBYTtJQUNiLGNBQWM7UUFDWixJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO1FBQ3hELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQWMsQ0FBQTtRQUNqRyxJQUFJLG1CQUFtQixHQUFHLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQWMsQ0FBQTtRQUM3RSxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQTtJQUVqRSxDQUFDO0lBQ0Qsa0JBQWtCO0lBQ2xCLGtCQUFrQixDQUFDLFFBQWEsRUFBRSxFQUFFLHNCQUFzQjtRQUN4RCxrQkFBa0I7UUFDbEIsSUFBSSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFjLENBQUE7UUFDNUYsSUFBSSxtQkFBbUIsR0FBRyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFjLENBQUE7UUFDN0UsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3JDLHFDQUFxQztZQUNyQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZELHVCQUF1QjtZQUN2QixJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3pDLFdBQVc7WUFDWCxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUNwQywwQkFBMEI7WUFDMUIsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0UsUUFBUTtZQUNSLGlCQUFpQixFQUFFLElBQUksU0FBUyxDQUFDLEVBQUUsQ0FBQztTQUNyQyxDQUFDLENBQUMsQ0FBQTtRQUNILEVBQUU7SUFDSixDQUFDO0lBRUQsYUFBYTtJQUNiLGlCQUFpQixDQUFDLGVBQWUsRUFBRSxLQUFLO1FBQ3RDLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRUQsYUFBYTtJQUNiLHVCQUF1QixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQjtRQUN4RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUE7SUFDaEQsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDMUMsQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixJQUFJLHdCQUF3QixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFjLENBQUE7UUFDakcsSUFBSSxtQkFBbUIsR0FBRyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFjLENBQUE7UUFDN0UsT0FBTyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFFRCw4QkFBOEI7SUFDOUIsb0JBQW9CLENBQUMsS0FBSztRQUN4QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUM5QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2RCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO1FBQzlCLElBQUksU0FBUyxDQUFDLEtBQUs7WUFBRSxPQUFNO1FBQzNCLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUNELDhCQUE4QjtJQUM5QiwrQkFBK0IsQ0FBQyxLQUFLO1FBQ25DLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFBO1FBQzlCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3ZELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUE7UUFDeEMsSUFBSSxjQUFjLENBQUMsS0FBSztZQUFFLE9BQU07UUFDaEMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuQyxDQUFDOytHQXBPVSxxQkFBcUI7bUdBQXJCLHFCQUFxQix1V0NYbEMsaTBUQWtKWTs7U0R2SUMscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0Usa0JBQWtCO2tLQWlCakIsSUFBSTtzQkFEZCxLQUFLO2dCQVFLLE1BQU07c0JBRGhCLEtBQUs7Z0JBVUssUUFBUTtzQkFEbEIsS0FBSztnQkFVc0MsV0FBVztzQkFBdEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQTBEYyxzQkFBc0I7c0JBQTdFLFNBQVM7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgVmlld0NoaWxkLCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdHJpeENvbmZpZywgTWF0cml4SXRlbUNvbmZpZyB9IGZyb20gJy4vbWF0cml4LWNvbmZpZyc7XG5pbXBvcnQgeyBDbXNBcGlTZXJ2aWNlLCBGaWVsZEFic3RyYWN0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RmLW1hdHJpeC1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0cml4LWNvbmZpZy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdHJpeC1jb25maWcuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRyaXhDb25maWdDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgX0Ntc0FwaVNlcnZpY2U6IENtc0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfRmllbGRBYnN0cmFjdHNTZXJ2aWNlOiBGaWVsZEFic3RyYWN0c1NlcnZpY2UsXG4gICkgeyB9XG5cbiAgLyoq6KGo5Y2V5o6n5Lu257uEICovXG4gIF9GaWVsZENvbnRyb2xHcm91cDogYW55W11cbiAgLyoq6KGo5Y2V5o6n5Lu257G75Z6LICovXG4gIF90eXBlOiBhbnlcbiAgQElucHV0KClcbiAgcHVibGljIHNldCB0eXBlKHY6IGFueSkge1xuICAgIHRoaXMuX3R5cGUgPSB2XG4gICAgdGhpcy5kYXRhTG9hZGVkKClcbiAgfVxuICAvKirooajljZXlrp7kvZMgKi9cbiAgX0VudGl0eTogRm9ybUdyb3VwIHwgdW5kZWZpbmVkXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgRW50aXR5KHY6IEZvcm1Hcm91cCkge1xuICAgIHRoaXMuX0VudGl0eSA9IHY7XG4gICAgdGhpcy5kYXRhTG9hZGVkKClcbiAgfVxuXG5cbiAgLyoq6YCJ5oup55qE6KGo5Y2V5L+h5oGvICovXG4gIF9zZWxlY3RlZDogYW55XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWQodjogYW55KSB7XG5cbiAgICBpZiAodikge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSB2XG4gICAgICB0aGlzLmRhdGFMb2FkZWQoKVxuICAgIH1cbiAgfVxuXG5cbiAgQFZpZXdDaGlsZCgnc3VibWl0Y2xpY2snLCB7IHN0YXRpYzogdHJ1ZSB9KSBzdWJtaXRjbGljazogRWxlbWVudFJlZjtcblxuICBhc3luYyBkYXRhTG9hZGVkKCkge1xuICAgIGlmICh0aGlzLl9FbnRpdHkgJiYgdGhpcy5fdHlwZSkge1xuICAgICAgYXdhaXQgdGhpcy5BZnRlckluaXQoKVxuICAgICAgdGhpcy5zdWJtaXRjbGljay5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgQWZ0ZXJJbml0KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgdGhpcy5fRmllbGRDb250cm9sR3JvdXAgPSB0aGlzLl9GaWVsZEFic3RyYWN0c1NlcnZpY2UuZ2V0RXhjbHVkZUFzc2lnbkNvbnRyb2wodGhpcy5fdHlwZSlcbiAgICAgIHRoaXMuX0VudGl0eS5zZXRDb250cm9sKCdmb3JtQ29uZmlndXJhdGlvbicsIHRoaXMuZmIuZ3JvdXAobmV3IE1hdHJpeENvbmZpZygpKSlcbiAgICAgIGF3YWl0IHRoaXMuc2V0U2VsZWN0VmFsdWUoKVxuICAgICAgdGhpcy5mb3JtQ29uZmlndXJhdGlvbi5wYXRjaFZhbHVlKHRoaXMuX3NlbGVjdGVkLmZvcm1Db25maWd1cmF0aW9uKVxuICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgIH0pXG4gIH1cblxuXG4gIHNldFNlbGVjdFZhbHVlKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0cykgPT4ge1xuICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkICYmIHRoaXMuX3NlbGVjdGVkLmZvcm1Db250cm9sTmFtZSA9PSB0aGlzLl90eXBlKSB7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkLmZvcm1Db25maWd1cmF0aW9uWydNYXRyaXhCbG9ja1R5cGVzJ10uZm9yRWFjaCgoKGVsLCBpbmRleCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkTWF0cml4QmxvY2tUeXBlSXRlbShlbClcbiAgICAgICAgICBlbC5maWVsZHMuZm9yRWFjaCgoZWxmLCBpbmRleGYpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkTWF0cml4RmllbGRJdGVtKGVsZiwgaW5kZXgpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkpXG4gICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgIH1cblxuICAgIH0pXG4gIH1cblxuICAvKirojrflj5booajljZXphY3nva4gKi9cbiAgZ2V0IGZvcm1Db25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9FbnRpdHkuZ2V0KCdmb3JtQ29uZmlndXJhdGlvbicpIGFzIEZvcm1Hcm91cFxuICB9XG5cbiAgLyoq6I635Y+W6KGo5Y2V6YWN572u5LiL55qE55+p6Zi15Z2X6KGo5Y2V5pWw57uEICovXG4gIGdldCBNYXRyaXhCbG9ja1R5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db25maWd1cmF0aW9uLmNvbnRyb2xzWydNYXRyaXhCbG9ja1R5cGVzJ10gYXMgRm9ybUFycmF5XG4gIH1cblxuXG4gIC8qKuaooeaAgeahhi3nirbmgIEgKi9cbiAgbWF0cml4TW9kYWxPcGVuOiBib29sZWFuID0gZmFsc2VcbiAgLyoq5qih5oCB5qGGLeaYr+WQpuato+WcqOe8lui+kSAqL1xuICBpc01hdHJpeE1vZGFsRWRpdDogYW55ID0gZmFsc2VcblxuICAvKirmqKHmgIHmoYYt55So5LqO56Gu5a6a5qih5oCB55qE57mB5b+Z54q25oCB5piv5ZCm5Li655yfICovXG4gIG1vZGFsQnVzeTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoq5qih5oCB5qGGLeihqOWNlSAqL1xuICBtYXRyaXhNb2RhbEZvcm06IEZvcm1Hcm91cCB8IHVuZGVmaW5lZDtcblxuICAvKirooajljZXmjqfku7bmqKHmnb8t55So5LqO5ZyoZm9ybeWkluaPkOS6pHN1Ym1pdCAqL1xuICBAVmlld0NoaWxkKCdtYXRyaXhNb2RhbE1vZGFsU3VibWl0JywgeyBzdGF0aWM6IGZhbHNlIH0pIG1hdHJpeE1vZGFsTW9kYWxTdWJtaXQ6IEVsZW1lbnRSZWY7XG5cbiAgLyoq55+p6Zi15Z2XLemAieaLqeeahOS4i+aghyAqL1xuICBzZWxlY3RNYXRyaXhCbG9ja0luZGV4OiBhbnkgPSAwXG5cbiAgLyoq55+p6Zi15Z2XLemAieaLqeeahOefqemYteS4i+Wtl+auteeahOS4i+aghyAqL1xuICBzZWxlY3RNYXRyaXhGaWVsZEluZGV4OiBhbnkgPSAwXG5cbiAgLyoq5qih5oCB5qGGLeeKtuaAgeaUueWPmCAqL1xuICBtYXRyaXhNb2RhbFZpc2libGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICB0aGlzLmlzTWF0cml4TW9kYWxFZGl0ID0gZmFsc2VcbiAgICAgIHRoaXMubWF0cml4TW9kYWxGb3JtID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuXG4gIC8qKuefqemYteWdly0t5paw5aKeLeaJk+W8gOaooeaAgeahhiAqL1xuICBhZGRNYXRyaXhCbG9ja1R5cGUoKSB7XG4gICAgdGhpcy5tYXRyaXhNb2RhbEZvcm0gPSB0aGlzLmZiLmdyb3VwKG5ldyBNYXRyaXhJdGVtQ29uZmlnKCkpXG4gICAgdGhpcy5tYXRyaXhNb2RhbE9wZW4gPSB0cnVlXG4gIH1cblxuXG5cbiAgLyoq5qih5oCB5qGGLS3nn6npmLXooajljZXkv53lrZjmj5DkuqQgKi9cbiAgY3JlYXRlT3JFZGl0U2F2ZSgpIHtcbiAgICBsZXQgaW5wdXQgPSB0aGlzLm1hdHJpeE1vZGFsRm9ybS52YWx1ZVxuICAgIGlmICghdGhpcy5tYXRyaXhNb2RhbEZvcm0udmFsaWQpIHJldHVyblxuICAgIGlmICh0aGlzLmlzTWF0cml4TW9kYWxFZGl0KSB7XG4gICAgICBsZXQgTWF0cml4QmxvY2tUeXBlc0l0ZW0gPSB0aGlzLk1hdHJpeEJsb2NrVHlwZXMuYXQodGhpcy5zZWxlY3RNYXRyaXhCbG9ja0luZGV4KSBhcyBGb3JtR3JvdXBcbiAgICAgIE1hdHJpeEJsb2NrVHlwZXNJdGVtLnBhdGNoVmFsdWUoe1xuICAgICAgICAuLi5pbnB1dFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRNYXRyaXhCbG9ja1R5cGVJdGVtKGlucHV0KVxuICAgIH1cbiAgICB0aGlzLm1hdHJpeE1vZGFsT3BlbiA9IGZhbHNlXG4gIH1cbiAgLyoq5paw5aKe55+p6Zi15Z2XLeWQkeaVsOe7hOihqOWNleS4reWinuWKoOmhuSAqL1xuICBhZGRNYXRyaXhCbG9ja1R5cGVJdGVtKGlucHV0KSB7XG4gICAgdGhpcy5NYXRyaXhCbG9ja1R5cGVzLnB1c2gobmV3IEZvcm1Hcm91cCh7XG4gICAgICBkaXNwbGF5TmFtZTogbmV3IEZvcm1Db250cm9sKGlucHV0LmRpc3BsYXlOYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIG5hbWU6IG5ldyBGb3JtQ29udHJvbChpbnB1dC5uYW1lLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGZpZWxkczogbmV3IEZvcm1BcnJheShbXSlcbiAgICB9KSlcbiAgfVxuICAvKirnvJbovpHnn6npmLXlnZcgKi9cbiAgRWRpdE1hdHJpeEJsb2NrKGlucHV0KSB7XG4gICAgdGhpcy5tYXRyaXhNb2RhbEZvcm0gPSB0aGlzLmZiLmdyb3VwKG5ldyBNYXRyaXhJdGVtQ29uZmlnKCkpXG4gICAgdGhpcy5tYXRyaXhNb2RhbEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAuLi5pbnB1dFxuICAgIH0pXG4gICAgdGhpcy5tYXRyaXhNb2RhbE9wZW4gPSB0cnVlXG4gICAgdGhpcy5pc01hdHJpeE1vZGFsRWRpdCA9IHRydWVcbiAgfVxuXG4gIC8qKuWIoOmZpOefqemYteWdlyAqL1xuICBEZWxldGVNYXRyaXhCbG9jayhpbmRleCkge1xuICAgIHRoaXMuTWF0cml4QmxvY2tUeXBlcy5yZW1vdmVBdChpbmRleClcbiAgfVxuXG4gIC8qKuefqemYteWdly3pgInmi6kgKi9cbiAgc2VsZWN0TWF0cml4QmxvY2tDaGFuZ2UoaW5kZXgpIHtcbiAgICB0aGlzLnNlbGVjdE1hdHJpeEJsb2NrSW5kZXggPSBpbmRleFxuICB9XG5cbiAgLyoq55+p6Zi15a2X5q61LeaWsOWiniAqL1xuICBhZGRNYXRyaXhGaWVsZCgpIHtcbiAgICB0aGlzLmFkZE1hdHJpeEZpZWxkSXRlbSgnJywgdGhpcy5zZWxlY3RNYXRyaXhCbG9ja0luZGV4KVxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgbGV0IE1hdHJpeEJsb2NrVHlwZXNJdGVtRm9ybSA9IHRoaXMuTWF0cml4QmxvY2tUeXBlcy5hdCh0aGlzLnNlbGVjdE1hdHJpeEJsb2NrSW5kZXgpIGFzIEZvcm1Hcm91cFxuICAgIGxldCBNYXRyaXhGaWVsZEl0ZW1Gb3JtID0gTWF0cml4QmxvY2tUeXBlc0l0ZW1Gb3JtLmdldCgnZmllbGRzJykgYXMgRm9ybUFycmF5XG4gICAgdGhpcy5zZWxlY3RNYXRyaXhGaWVsZENoYW5nZSgwLCBNYXRyaXhGaWVsZEl0ZW1Gb3JtLmxlbmd0aCAtIDEpXG5cbiAgfVxuICAvKirnn6npmLXlrZfmrrUt5paw5aKe55+p6Zi15a2X5q616aG5ICovXG4gIGFkZE1hdHJpeEZpZWxkSXRlbShpbnB1dDogYW55ID0gJycsIHNlbGVjdE1hdHJpeEJsb2NrSW5kZXgpIHtcbiAgICAvKirnn6npmLXkuIvmoIfnmoTnn6npmLXpoblGb3JtICovXG4gICAgbGV0IE1hdHJpeEJsb2NrVHlwZXNJdGVtRm9ybSA9IHRoaXMuTWF0cml4QmxvY2tUeXBlcy5hdChzZWxlY3RNYXRyaXhCbG9ja0luZGV4KSBhcyBGb3JtR3JvdXBcbiAgICBsZXQgTWF0cml4RmllbGRJdGVtRm9ybSA9IE1hdHJpeEJsb2NrVHlwZXNJdGVtRm9ybS5nZXQoJ2ZpZWxkcycpIGFzIEZvcm1BcnJheVxuICAgIE1hdHJpeEZpZWxkSXRlbUZvcm0ucHVzaCh0aGlzLmZiLmdyb3VwKHtcbiAgICAgIC8qKuWtl+auteWQjeensCBEaXNwbGF5IG5hbWUgb2YgdGhpcyBmaWVsZCAqL1xuICAgICAgZGlzcGxheU5hbWU6IFtpbnB1dC5kaXNwbGF5TmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIC8qKuWtl+auteWUr+S4gOWQjeensCBVbmlxdWUgTmFtZSovXG4gICAgICBuYW1lOiBbaW5wdXQubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgIC8qKuaPj+i/sCDor7TmmI4gKi9cbiAgICAgIGRlc2NyaXB0aW9uOiBbaW5wdXQuZGVzY3JpcHRpb24sIFtdXSxcbiAgICAgIC8qKkZpZWxkVHlwZeWtl+auteexu+WeiyDooajljZXmjqfku7blkI3np7AgKi9cbiAgICAgIGZvcm1Db250cm9sTmFtZTogW2lucHV0LmZvcm1Db250cm9sTmFtZSB8fCAnVGV4dEVkaXQnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgLy/liqjmgIHooajljZXphY3nva5cbiAgICAgIGZvcm1Db25maWd1cmF0aW9uOiBuZXcgRm9ybUdyb3VwKHt9KSxcbiAgICB9KSlcbiAgICAvL1xuICB9XG5cbiAgLyoq5Yig6Zmk55+p6Zi15a2X5q616aG5ICovXG4gIGRlbGV0ZU1hdHJpeEZpZWxkKE1hdHJpeEZpZWxkRm9ybSwgaW5kZXgpIHtcbiAgICBNYXRyaXhGaWVsZEZvcm0ucmVtb3ZlQXQoaW5kZXgpXG4gICAgdGhpcy5zZWxlY3RNYXRyaXhGaWVsZEluZGV4ID0gMFxuICB9XG5cbiAgLyoq55+p6Zi15a2X5q61LemAieaLqSAqL1xuICBzZWxlY3RNYXRyaXhGaWVsZENoYW5nZShNYXRyaXhCbG9ja0luZGV4LCBNYXRyaXhGaWVsZEluZGV4KSB7XG4gICAgdGhpcy5zZWxlY3RNYXRyaXhGaWVsZEluZGV4ID0gTWF0cml4RmllbGRJbmRleFxuICB9XG5cbiAgZ2V0IG5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXRyaXhNb2RhbEZvcm0/LmdldCgnbmFtZScpXG4gIH1cbiAgZ2V0IEZpZWxkbmFtZUlucHV0KCkge1xuICAgIGxldCBNYXRyaXhCbG9ja1R5cGVzSXRlbUZvcm0gPSB0aGlzLk1hdHJpeEJsb2NrVHlwZXMuYXQodGhpcy5zZWxlY3RNYXRyaXhCbG9ja0luZGV4KSBhcyBGb3JtR3JvdXBcbiAgICBsZXQgTWF0cml4RmllbGRJdGVtRm9ybSA9IE1hdHJpeEJsb2NrVHlwZXNJdGVtRm9ybS5nZXQoJ2ZpZWxkcycpIGFzIEZvcm1BcnJheVxuICAgIHJldHVybiBNYXRyaXhGaWVsZEl0ZW1Gb3JtLmF0KHRoaXMuc2VsZWN0TWF0cml4RmllbGRJbmRleCkuZ2V0KCduYW1lJylcbiAgfVxuXG4gIC8qKuefqemYtWRpc3BsYXlOYW1lSW5wdXTlrZfmrrXlpLHljrvnhKbngrkgKi9cbiAgZGlzcGxheU5hbWVJbnB1dEJsdXIoZXZlbnQpIHtcbiAgICBsZXQgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWVcbiAgICBsZXQgcGlueWluID0gdGhpcy5fQ21zQXBpU2VydmljZS5jaGluZXNlVG9QaW55aW4odmFsdWUpXG4gICAgbGV0IG5hbWVJbnB1dCA9IHRoaXMubmFtZUlucHV0XG4gICAgaWYgKG5hbWVJbnB1dC52YWx1ZSkgcmV0dXJuXG4gICAgbmFtZUlucHV0LnBhdGNoVmFsdWUocGlueWluKVxuICB9XG4gIC8qKuefqemYtWRpc3BsYXlOYW1lSW5wdXTlrZfmrrXlpLHljrvnhKbngrkgKi9cbiAgTWF0cml4RmllbGREaXNwbGF5TmFtZUlucHV0Qmx1cihldmVudCkge1xuICAgIGxldCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgIGxldCBwaW55aW4gPSB0aGlzLl9DbXNBcGlTZXJ2aWNlLmNoaW5lc2VUb1Bpbnlpbih2YWx1ZSlcbiAgICBsZXQgRmllbGRuYW1lSW5wdXQgPSB0aGlzLkZpZWxkbmFtZUlucHV0XG4gICAgaWYgKEZpZWxkbmFtZUlucHV0LnZhbHVlKSByZXR1cm5cbiAgICBGaWVsZG5hbWVJbnB1dC5wYXRjaFZhbHVlKHBpbnlpbilcbiAgfVxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJfRW50aXR5XCI+XG4gICAgPGRpdiBmb3JtR3JvdXBOYW1lPVwiZm9ybUNvbmZpZ3VyYXRpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydDbXM6Ojo6Rm9ybUNvbnRyb2w6TWF0cml4JyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWN1cnJlbnQ9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ21zOjpNYXRyaXhCbG9ja1R5cGUnIHwgYWJwTG9jYWxpemF0aW9ufX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gcC0wXCIgKGNsaWNrLnN0b3ApPVwiYWRkTWF0cml4QmxvY2tUeXBlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtcGx1cy1jaXJjbGUgcC0xXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgTWF0cml4QmxvY2tUeXBlcy5jb250cm9scztsZXQgaSA9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2suc3RvcCk9XCJzZWxlY3RNYXRyaXhCbG9ja0NoYW5nZShpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbGlzdC1ncm91cC1pdGVtLWFjdGlvbiBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImk9PT1zZWxlY3RNYXRyaXhCbG9ja0luZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS52YWx1ZS5kaXNwbGF5TmFtZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS52YWx1ZS5uYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbVwiIGlkPVwiZHJvcGRvd25CYXNpYzFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiei1pbmRleDogODtcIiBuZ2JEcm9wZG93blRvZ2dsZT48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd25NZW51IGFyaWEtbGFiZWxsZWRieT1cImRyb3Bkb3duQmFzaWMxXCIgc3R5bGU9XCJ6LWluZGV4OiA5O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmdiRHJvcGRvd25JdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljay5zdG9wKT1cIkVkaXRNYXRyaXhCbG9jayhpdGVtLnZhbHVlKVwiPnt7J0FicFVpOjpFZGl0JyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuZ2JEcm9wZG93bkl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrLnN0b3ApPVwiRGVsZXRlTWF0cml4QmxvY2soaSlcIj57eydBYnBVaTo6RGVsZXRlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwXCIgKm5nSWY9XCJNYXRyaXhCbG9ja1R5cGVzPy5jb250cm9scy5sZW5ndGg+MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtY3VycmVudD1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydDbXM6OkZpZWxkcycgfCBhYnBMb2NhbGl6YXRpb259fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBwLTBcIiAoY2xpY2suc3RvcCk9XCJhZGRNYXRyaXhGaWVsZCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXBsdXMtY2lyY2xlIHAtMVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIE1hdHJpeEJsb2NrVHlwZXMuY29udHJvbHM7bGV0IGkgPWluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImkgPT09IHNlbGVjdE1hdHJpeEJsb2NrSW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZWwgb2YgaXRlbS5jb250cm9sc1snZmllbGRzJ10uY29udHJvbHM7bGV0IGZpID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrLnN0b3ApPVwic2VsZWN0TWF0cml4RmllbGRDaGFuZ2UoaSxmaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gbGlzdC1ncm91cC1pdGVtLWFjdGlvbiBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZmk9PT1zZWxlY3RNYXRyaXhGaWVsZEluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2VsLnZhbHVlLmRpc3BsYXlOYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2VsLnZhbHVlLm5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljay5zdG9wKT1cImRlbGV0ZU1hdHJpeEZpZWxkKGl0ZW0uY29udHJvbHNbJ2ZpZWxkcyddLGZpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlcIj57eydBYnBVaTo6RGVsZXRlJyB8IGFicExvY2FsaXphdGlvbn19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgZm9ybUFycmF5TmFtZT1cIk1hdHJpeEJsb2NrVHlwZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBNYXRyaXhCbG9ja1R5cGVzLmNvbnRyb2xzO2xldCBpID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCJpXCIgW2hpZGRlbl09XCJpICE9PSBzZWxlY3RNYXRyaXhCbG9ja0luZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiZmllbGRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW1mIG9mIGl0ZW0uY29udHJvbHNbJ2ZpZWxkcyddLmNvbnRyb2xzO2xldCBmaSA9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwiZmlcIiBbaGlkZGVuXT1cImZpICE9PSBzZWxlY3RNYXRyaXhGaWVsZEluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJkaXNwbGF5TmFtZVwiPnt7J0Ntczo6RGlzcGxheU5hbWUnIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibHVyKT1cIk1hdHJpeEZpZWxkRGlzcGxheU5hbWVJbnB1dEJsdXIoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwibmFtZVwiPnt7J0RpZ25pdGVBYnBGb3Jtczo6RmllbGROYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0RpZ25pdGVBYnBGb3Jtczo6RmllbGROYW1lSGVscFRleHQnIHwgYWJwTG9jYWxpemF0aW9ufX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcj1cImRlc2NyaXB0aW9uXCI+e3snQ21zOjpEZXNjcmlwdGlvbicgfCBhYnBMb2NhbGl6YXRpb259fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcj1cImZvcm1Db250cm9sTmFtZVwiPnt7J0Ntczo6RmllbGRUeXBlJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZm9ybUNvbnRyb2xOYW1lPVwiZm9ybUNvbnRyb2xOYW1lXCIgKGNoYW5nZSk9XCJzZXRDb25maWdDb21wb25lbnQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbUMgb2YgX0ZpZWxkQ29udHJvbEdyb3VwO2xldCBpID1pbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIml0ZW1DLm5hbWVcIj57e2l0ZW1DLmRpc3BsYXlOYW1lfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbWYudmFsdWUuZm9ybUNvbnRyb2xOYW1lJiZpdGVtZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGYtZHluYW1pYyBbdHlwZV09XCJpdGVtZi52YWx1ZS5mb3JtQ29udHJvbE5hbWVcIiBbZW50aXR5XT1cIml0ZW1mXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJfc2VsZWN0ZWQ/X3NlbGVjdGVkWydmb3JtQ29uZmlndXJhdGlvbiddWydNYXRyaXhCbG9ja1R5cGVzJ11baV1bJ2ZpZWxkcyddW2ZpXTonJ1wiPjwvZGYtZHluYW1pYz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAoYWJwSW5pdCk9XCJzdWJtaXRjbGljaz8ubmF0aXZlRWxlbWVudD8uY2xpY2soKVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIlxuICAgICAgICAgICAgI3N1Ym1pdGNsaWNrPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9mb3JtPlxuXG5cblxuPGFicC1tb2RhbCBbKHZpc2libGUpXT1cIm1hdHJpeE1vZGFsT3BlblwiIFtidXN5XT1cIm1vZGFsQnVzeVwiICh2aXNpYmxlQ2hhbmdlKT1cIm1hdHJpeE1vZGFsVmlzaWJsZUNoYW5nZSgkZXZlbnQpXCIgPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwSGVhZGVyPlxuICAgICAgICA8aDM+e3tpc01hdHJpeEVkaXQ/KCdBYnBVaTo6RWRpdCcgfCBhYnBMb2NhbGl6YXRpb24pOignQ21zOjpOZXcnIHwgYWJwTG9jYWxpemF0aW9uKX19PC9oMz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNsb2FkZXJSZWY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIj48aSBjbGFzcz1cImZhIGZhLXB1bHNlIGZhLXNwaW5uZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+PC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtYXRyaXhNb2RhbEZvcm07IGVsc2UgbG9hZGVyUmVmXCI+XG4gICAgICAgICAgICA8Zm9ybSBjbGFzcz1cInNpdGVzLW1vZGFsLWZvcm1cIiAjbXlGb3JtPVwibmdGb3JtXCIgW2Zvcm1Hcm91cF09XCJtYXRyaXhNb2RhbEZvcm1cIlxuICAgICAgICAgICAgICAgIChuZ1N1Ym1pdCk9XCJjcmVhdGVPckVkaXRTYXZlKClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAjbWF0cml4TW9kYWxNb2RhbFN1Ym1pdCBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCIgZm9yPVwiZGlzcGxheU5hbWVcIj57eydDbXM6OkRpc3BsYXlOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkaXNwbGF5TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJkaXNwbGF5TmFtZUlucHV0Qmx1cigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIGZvcj1cIm5hbWVcIj57eydDbXM6Ok5hbWUnIHwgYWJwTG9jYWxpemF0aW9ufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGFicENsb3NlPnt7J0FicFVpOjpDbG9zZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYnV0dG9uPlxuICAgICAgICA8YWJwLWJ1dHRvbiBpY29uQ2xhc3M9XCJmYSBmYS1jaGVja1wiXG4gICAgICAgICAgICAoY2xpY2spPVwibWF0cml4TW9kYWxNb2RhbFN1Ym1pdC5uYXRpdmVFbGVtZW50LmNsaWNrKClcIj57eydBYnBVaTo6U2F2ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvYWJwLWJ1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9hYnAtbW9kYWw+Il19
|
|
@@ -2,7 +2,6 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { APP_INITIALIZER, NgModule } from '@angular/core';
|
|
3
3
|
import { RoutesService } from '@abp/ng.core';
|
|
4
4
|
import { SettingTabsService } from '@abp/ng.setting-management/config';
|
|
5
|
-
import { DomainsComponent } from '@dignite-ng/expand.cms';
|
|
6
5
|
|
|
7
6
|
// import { DomainsComponent } from '@dignite-ng/expand.cms';
|
|
8
7
|
const CMS_ROUTE_PROVIDERS = [
|
|
@@ -15,14 +14,14 @@ const CMS_ROUTE_PROVIDERS = [
|
|
|
15
14
|
];
|
|
16
15
|
function configureRoutes(routesService, settingTabs) {
|
|
17
16
|
return () => {
|
|
18
|
-
settingTabs.add([
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
]);
|
|
17
|
+
// settingTabs.add([
|
|
18
|
+
// {
|
|
19
|
+
// name: 'Cms::Domain',
|
|
20
|
+
// order: 1,
|
|
21
|
+
// requiredPolicy: 'CmsAdmin.Domain',
|
|
22
|
+
// component: DomainsComponent,
|
|
23
|
+
// },
|
|
24
|
+
// ]);
|
|
26
25
|
routesService.add([
|
|
27
26
|
{
|
|
28
27
|
path: '/cms',
|
|
@@ -56,15 +55,6 @@ function configureRoutes(routesService, settingTabs) {
|
|
|
56
55
|
order: 1,
|
|
57
56
|
requiredPolicy: 'CmsAdmin.Field',
|
|
58
57
|
},
|
|
59
|
-
// {
|
|
60
|
-
// path: '/cms/admin/sites',
|
|
61
|
-
// name: eCmsRouteNames.Sites,
|
|
62
|
-
// parentName:eCmsRouteNames.Settings,
|
|
63
|
-
// iconClass: 'fas fa fa-globe ',
|
|
64
|
-
// layout: eLayoutType.application,
|
|
65
|
-
// order: 2,
|
|
66
|
-
// requiredPolicy:'CmsAdmin.Site',
|
|
67
|
-
// },
|
|
68
58
|
{
|
|
69
59
|
path: '/cms/admin/sections',
|
|
70
60
|
name: "Cms::Sections" /* eCmsRouteNames.Sections */,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dignite-ng-expand.cms-config.mjs","sources":["../../../projects/cms/config/src/providers/route.provider.ts","../../../projects/cms/config/src/cms-config.module.ts","../../../projects/cms/config/src/dignite-ng-expand.cms-config.ts"],"sourcesContent":["import { eLayoutType, RoutesService } from '@abp/ng.core';\r\nimport { APP_INITIALIZER } from '@angular/core';\r\nimport { eCmsRouteNames } from '../enums/route-names';\r\nimport {
|
|
1
|
+
{"version":3,"file":"dignite-ng-expand.cms-config.mjs","sources":["../../../projects/cms/config/src/providers/route.provider.ts","../../../projects/cms/config/src/cms-config.module.ts","../../../projects/cms/config/src/dignite-ng-expand.cms-config.ts"],"sourcesContent":["import { eLayoutType, RoutesService } from '@abp/ng.core';\r\nimport { APP_INITIALIZER } from '@angular/core';\r\nimport { eCmsRouteNames } from '../enums/route-names';\r\nimport { SettingTabsService } from '@abp/ng.setting-management/config';\r\n// import { DomainsComponent } from '@dignite-ng/expand.cms';\r\n\r\n\r\nexport const CMS_ROUTE_PROVIDERS = [\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: configureRoutes,\r\n deps: [RoutesService, SettingTabsService],\r\n multi: true,\r\n },\r\n];\r\n\r\n\r\nexport function configureRoutes(routesService: RoutesService, settingTabs: SettingTabsService) {\r\n return () => {\r\n // settingTabs.add([\r\n // {\r\n // name: 'Cms::Domain',\r\n // order: 1,\r\n // requiredPolicy: 'CmsAdmin.Domain',\r\n // component: DomainsComponent,\r\n // },\r\n // ]);\r\n routesService.add([\r\n {\r\n path: '/cms',\r\n name: eCmsRouteNames.Cms,\r\n iconClass: 'bi-archive-fill',\r\n layout: eLayoutType.application,\r\n requiredPolicy: 'CmsAdmin.Entry || CmsAdmin.Field || CmsAdmin.Site || CmsAdmin.Section',\r\n },\r\n {\r\n path: '/cms/admin/entries',\r\n name: eCmsRouteNames.Entries,\r\n parentName: eCmsRouteNames.Cms,\r\n iconClass: 'bi-file-earmark-text-fill',\r\n layout: eLayoutType.application,\r\n requiredPolicy: 'CmsAdmin.Entry',\r\n },\r\n {\r\n path: '',\r\n name: eCmsRouteNames.Settings,\r\n parentName: eCmsRouteNames.Cms,\r\n iconClass: 'fas fa fa-cog',\r\n layout: eLayoutType.application,\r\n requiredPolicy: 'CmsAdmin.Field || CmsAdmin.Section',\r\n },\r\n {\r\n path: '/cms/admin/fields',\r\n name: eCmsRouteNames.Fields,\r\n parentName: eCmsRouteNames.Settings,\r\n iconClass: 'bi-file-earmark-text-fill',\r\n layout: eLayoutType.application,\r\n order: 1,\r\n requiredPolicy: 'CmsAdmin.Field',\r\n },\r\n {\r\n path: '/cms/admin/sections',\r\n name: eCmsRouteNames.Sections,\r\n parentName: eCmsRouteNames.Settings,\r\n iconClass: 'bi bi-menu-button-wide-fill',\r\n layout: eLayoutType.application,\r\n order: 3,\r\n requiredPolicy: 'CmsAdmin.Section',\r\n },\r\n ]);\r\n };\r\n}\r\n","import { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { CMS_ROUTE_PROVIDERS } from './providers/route.provider';\r\n\r\n@NgModule()\r\nexport class CmsConfigModule {\r\n static forRoot(): ModuleWithProviders<CmsConfigModule> {\r\n return {\r\n ngModule: CmsConfigModule,\r\n providers: [CMS_ROUTE_PROVIDERS],\r\n };\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAIA;AAGa,MAAA,mBAAmB,GAAG;AACjC,IAAA;AACE,QAAA,OAAO,EAAE,eAAe;AACxB,QAAA,UAAU,EAAE,eAAe;AAC3B,QAAA,IAAI,EAAE,CAAC,aAAa,EAAE,kBAAkB,CAAC;AACzC,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA;EACD;AAGc,SAAA,eAAe,CAAC,aAA4B,EAAE,WAA+B,EAAA;AAC3F,IAAA,OAAO,MAAK;;;;;;;;;QASV,aAAa,CAAC,GAAG,CAAC;AAChB,YAAA;AACE,gBAAA,IAAI,EAAE,MAAM;AACZ,gBAAA,IAAI,EAAoB,eAAA;AACxB,gBAAA,SAAS,EAAE,iBAAiB;AAC5B,gBAAA,MAAM,EAAyB,aAAA;AAC/B,gBAAA,cAAc,EAAE,uEAAuE;AACxF,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,oBAAoB;AAC1B,gBAAA,IAAI,EAAwB,wBAAA;AAC5B,gBAAA,UAAU,EAAoB,eAAA;AAC9B,gBAAA,SAAS,EAAE,2BAA2B;AACtC,gBAAA,MAAM,EAAyB,aAAA;AAC/B,gBAAA,cAAc,EAAE,gBAAgB;AACjC,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,EAAE;AACR,gBAAA,IAAI,EAAyB,oBAAA;AAC7B,gBAAA,UAAU,EAAoB,eAAA;AAC9B,gBAAA,SAAS,EAAE,eAAe;AAC1B,gBAAA,MAAM,EAAyB,aAAA;AAC/B,gBAAA,cAAc,EAAE,qCAAqC;AACtD,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,mBAAmB;AACzB,gBAAA,IAAI,EAAuB,aAAA;AAC3B,gBAAA,UAAU,EAAyB,oBAAA;AACnC,gBAAA,SAAS,EAAE,2BAA2B;AACtC,gBAAA,MAAM,EAAyB,aAAA;AAC/B,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,cAAc,EAAE,gBAAgB;AACjC,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,qBAAqB;AAC3B,gBAAA,IAAI,EAAyB,eAAA;AAC7B,gBAAA,UAAU,EAAyB,oBAAA;AACnC,gBAAA,SAAS,EAAE,6BAA6B;AACxC,gBAAA,MAAM,EAAyB,aAAA;AAC/B,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,cAAc,EAAE,kBAAkB;AACnC,aAAA;AACF,SAAA,CAAC,CAAC;AACL,KAAC,CAAC;AACJ;;ACpEA,MACa,eAAe,CAAA;AAC1B,IAAA,OAAO,OAAO,GAAA;QACZ,OAAO;AACL,YAAA,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,CAAC,mBAAmB,CAAC;SACjC,CAAC;KACH;+GANU,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;gHAAf,eAAe,EAAA,CAAA,CAAA,EAAA;gHAAf,eAAe,EAAA,CAAA,CAAA,EAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,QAAQ;;;ACHT;;AAEG;;;;"}
|