UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

394 lines 57.7 kB
import { __decorate, __metadata } from "tslib"; import { Component, ElementRef, Injector, Input, ViewChild } from '@angular/core'; import { Logging } from '@microsoft/windows-admin-center-sdk/core/diagnostics/logging'; import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom'; import { SmeSchemaProperty } from '../../../schema/schema-decorator'; import { SimplePropertySchemaFieldLoaderComponent } from '../../../schema/schema-field-host.component'; import { SchemaPrimitiveType } from '../../../schema/schema-models'; import { ValidationAlertSeverity } from '../../validation-alert/validation-alert'; import { SmeInternalFormFieldComponent } from '../form-field.component'; import { WebkitFileSystem } from './webkitFileSystem'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "../form-field-accessor.directive"; import * as i3 from "../form-field-validator.directive"; import * as i4 from "../form-field-async-validator.directive"; import * as i5 from "@angular/common"; import * as i6 from "../../../../directives/disabled/disabled.directive"; import * as i7 from "../../../drop-zone/drop-zone.component"; import * as i8 from "../../../tooltip/tooltip.directive"; import * as i9 from "../../validation-alert/validation-alert.component"; import * as i10 from "../../fieldset/fieldset.directive"; import * as i11 from "../../form-field-layout/form-field-layout.component"; import * as i12 from "../../../../pipes/byte-unit-converter-pipe"; import * as i13 from "../../../../pipes/format-pipe"; const _c0 = ["file"]; const _c1 = ["type", "file"]; function FileFormFieldComponent_ng_container_16_div_1_Template(rf, ctx) { if (rf & 1) { const _r6 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div", 12); i0.ɵɵelement(1, "div", 13); i0.ɵɵelementStart(2, "div", 14)(3, "label", 15); i0.ɵɵtext(4); i0.ɵɵelementEnd(); i0.ɵɵelementStart(5, "label", 15); i0.ɵɵtext(6); i0.ɵɵpipe(7, "smeByteUnitConverter"); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(8, "button", 16); i0.ɵɵlistener("click", function FileFormFieldComponent_ng_container_16_div_1_Template_button_click_8_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const i_r4 = restoredCtx.index; const ctx_r5 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r5.removeItemAt(i_r4)); }); i0.ɵɵpipe(9, "smeFormat"); i0.ɵɵelement(10, "span", 17); i0.ɵɵelementEnd()(); } if (rf & 2) { const file_r3 = ctx.$implicit; const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵadvance(1); i0.ɵɵclassProp("sme-icon-openFile", !ctx_r2.isDirectory(file_r3))("sme-icon-openFolderHorizontal", ctx_r2.isDirectory(file_r3)); i0.ɵɵadvance(3); i0.ɵɵtextInterpolate(file_r3.name); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(7, 9, file_r3.size, 1024), " "); i0.ɵɵadvance(2); i0.ɵɵproperty("title", ctx_r2.strings.MsftSmeShell.Angular.Form.File.removeButtonTooltip)("smeDisabled", ctx_r2.loadingOrDisabled); i0.ɵɵattribute("aria-label", i0.ɵɵpipeBind2(9, 12, ctx_r2.strings.MsftSmeShell.Angular.Form.File.removeButtonAriaLabelFormat, file_r3.name)); } } function FileFormFieldComponent_ng_container_16_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, FileFormFieldComponent_ng_container_16_div_1_Template, 11, 15, "div", 11); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵproperty("ngForOf", ctx_r1.files); } } /* eslint-disable max-len */ /* eslint-enable max-len */ export class FileFormFieldLoaderComponent extends SimplePropertySchemaFieldLoaderComponent { } /** @nocollapse */ FileFormFieldLoaderComponent.ɵfac = /** @pureOrBreakMyCode */ function () { let ɵFileFormFieldLoaderComponent_BaseFactory; return function FileFormFieldLoaderComponent_Factory(t) { return (ɵFileFormFieldLoaderComponent_BaseFactory || (ɵFileFormFieldLoaderComponent_BaseFactory = i0.ɵɵgetInheritedFactory(FileFormFieldLoaderComponent)))(t || FileFormFieldLoaderComponent); }; }(); /** @nocollapse */ FileFormFieldLoaderComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: FileFormFieldLoaderComponent, selectors: [["ng-component"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 12, consts: [["type", "file", 3, "ngModel", "name", "label", "description", "required", "readonly", "disabled", "multiple", "fileTypes", "pendingMessage", "customAsyncValidateDisabled", "customAsyncValidateDebounceTime", "ngModelChange", "customValidate", "customAsyncValidate"], ["field", ""]], template: function FileFormFieldLoaderComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "sme-form-field", 0, 1); i0.ɵɵlistener("ngModelChange", function FileFormFieldLoaderComponent_Template_sme_form_field_ngModelChange_0_listener($event) { return ctx.data = $event; })("customValidate", function FileFormFieldLoaderComponent_Template_sme_form_field_customValidate_0_listener($event) { return ctx.resolveFunction(ctx.propertySchema.customValidation)($event); })("customAsyncValidate", function FileFormFieldLoaderComponent_Template_sme_form_field_customAsyncValidate_0_listener($event) { return ctx.propertySchema.customAsyncValidation && ctx.resolveFunction(ctx.propertySchema.customAsyncValidation.handler)($event); }); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵproperty("ngModel", ctx.data)("name", ctx.propertySchema.name)("label", ctx.localize(ctx.propertySchema.label))("description", ctx.localize(ctx.propertySchema.description))("required", ctx.propertySchema.required)("readonly", !!ctx.evalExpression(ctx.propertySchema.readonlyCondition))("disabled", !!(ctx.propertySchema.disabledCondition && ctx.evalExpression(ctx.propertySchema.disabledCondition)))("multiple", ctx.propertySchema.options.multiple)("fileTypes", ctx.propertySchema.options.fileTypes)("pendingMessage", ctx.propertySchema.customAsyncValidation && ctx.localize(ctx.propertySchema.customAsyncValidation.pendingMessage))("customAsyncValidateDisabled", ctx.shouldCustomAsyncValidationBeDisabled())("customAsyncValidateDebounceTime", ctx.propertySchema.customAsyncValidation && +ctx.propertySchema.customAsyncValidation.handler); } }, dependencies: function () { return [i1.NgControlStatus, i1.RequiredValidator, i1.NgModel, FileFormFieldComponent, i2.FormFieldAccessorDirective, i3.FormFieldValidatorDirective, i4.FormFieldAsyncValidatorDirective]; }, encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FileFormFieldLoaderComponent, [{ type: Component, args: [{ template: ` <sme-form-field #field type="file" [(ngModel)]="data" [name]="propertySchema.name" [label]="localize(propertySchema.label)" [description]="localize(propertySchema.description)" [required]="propertySchema.required" [readonly]="!!evalExpression(propertySchema.readonlyCondition)" [disabled]="!!(propertySchema.disabledCondition && evalExpression(propertySchema.disabledCondition))" [multiple]="propertySchema.options.multiple" [fileTypes]="propertySchema.options.fileTypes" (customValidate)="resolveFunction(propertySchema.customValidation)($event)" (customAsyncValidate)="propertySchema.customAsyncValidation && resolveFunction(propertySchema.customAsyncValidation.handler)($event)" [pendingMessage]="propertySchema.customAsyncValidation && localize(propertySchema.customAsyncValidation.pendingMessage)" [customAsyncValidateDisabled]="shouldCustomAsyncValidationBeDisabled()" [customAsyncValidateDebounceTime]="propertySchema.customAsyncValidation && +propertySchema.customAsyncValidation.handler" ></sme-form-field> ` }] }], null, null); })(); /** * Accessible file field implementation */ let FileFormFieldComponent = class FileFormFieldComponent extends SmeInternalFormFieldComponent { /** * Initializes a new instance of the FileFormFieldComponent */ constructor(injector) { super(injector); this.placeholder = this.strings.MsftSmeShell.Angular.Form.File.placeholder; } /** * The source name to use for logging */ get logSourceName() { return 'FileFormFieldComponent'; } /** * The aria label for this instance */ get ariaLabel() { return this.getMergedDescriptionLabel(); } /** * gets the file count label */ get fileCountLabel() { return this.hasFiles ? this.hasMultipleFiles ? this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.plural.format(this.files.length) : this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.singular : this.multiple ? this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.multipleEnabled.none : this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.none; } /** * gets aria-label text */ get ariaLabelText() { let labelText = this.buttonLabel || (this.multiple ? this.strings.MsftSmeShell.Angular.Form.File.buttonText.plural : this.strings.MsftSmeShell.Angular.Form.File.buttonText.singular); if (this.required) { // Append the announced label with "Required" if the field is marked as required const requiredLabel = this.strings.MsftSmeShell.Angular.Common.Form.Validation.Required.label; labelText = labelText.concat(requiredLabel); } return this.hasFiles ? this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.plural.format(this.files.length).concat(labelText) : labelText; } /** * Indicates if there are any files selected */ get files() { return Array.isArray(this.value) ? this.value : !!this.value ? [this.value] : []; } /** * Indicates if there are any files selected */ get hasFiles() { return this.multiple ? Array.isArray(this.value) && this.value.length > 0 : !!this.value; } /** * Indicates if there are multiple files selected */ get hasMultipleFiles() { return this.hasFiles && Array.isArray(this.value) && this.value.length > 1; } /** * Indicates if there are any file type restrictions */ get hasFileTypes() { return !!this.fileTypes && this.fileTypes.length > 0; } /** * Returns a formatted accept property for our file input */ get acceptedFileTypes() { return this.fileTypes ? this.fileTypes.join(', ') : ''; } get directoryUploadSupported() { return !!DataTransferItem.prototype.webkitGetAsEntry; } reset() { this.fileInput.nativeElement.value = null; super.reset(); } /** * Occurs when the file input has changed */ onFileChanged() { this.updateValue(MsftSme.getValue(this.fileInput, 'nativeElement.files')); } /** * Occurs when the there is a drop onto this control */ onDrop(data) { // if we dropped something other than a file, then just update value to an empty list if (data.files.length === 0 || data.items.length === 0) { this.updateValue([]); return; } if (!this.directoryUploadSupported) { // If webkit is not supported, there is no reliable way to detect folders being dropped without excluding some file types. // both Edge and Chrome fully support this api. So we should be good as far a our supported browser matrix is concerned. this.updateValue(data.files); } const fileSystem = new WebkitFileSystem(data.items); this.activeDroppedFileSystem = fileSystem; fileSystem.getFileList().subscribe({ next: files => { if (this.activeDroppedFileSystem === fileSystem) { this.updateValue(files); } }, error: error => { Logging.logError(this.logSourceName, 'An Error occurred resolving dropped files', { error: error }); } }); } /** * Updates the controls value to reflect dropped or browsed files */ updateValue(files) { this.activeDroppedFileSystem = null; if (MsftSme.isNullOrUndefined(files)) { this.value = this.multiple ? [] : null; } else if (this.multiple) { const fileArray = []; for (let i = 0; i < files.length; i++) { fileArray.push(files[i]); } this.value = fileArray; } else { this.value = files[0]; } this.ngModel.control.updateValueAndValidity(); this.fileInput.nativeElement.value = null; } /** * Removes an item at the given index */ removeItemAt(index) { if (Array.isArray(this.value)) { this.value.splice(index, 1); this.value = [...this.value]; } else { this.value = null; } const firstFocusable = Dom.getFirstFocusableDescendent(this.hostElement.nativeElement); if (firstFocusable) { firstFocusable.focus(); } } /** * Creates the idBag used by this component to store unique element ids. * id values will be assigned be the @see BaseComponent super class. */ createIdBag() { return { detailsSpan: '' }; } isDirectory(file) { return !!file[WebkitFileSystem.isDirectoryPropertyName]; } /** * Performs validation that is internal to this control * @param c The form control attached to this instance */ validate(c) { // Stop if there are no files, fallback to super validation if (!this.hasFiles) { return super.validate(c); } // Check for invalid file entries for (let i = 0; i < this.files.length; i++) { const file = this.files[i]; // dont allow directories if (this.isDirectory(file)) { return { noDirectories: { message: this.strings.MsftSmeShell.Angular.Form.File.directoriesNotAllowed, valid: false, severity: ValidationAlertSeverity.Error } }; } // Do not allow invalid file types if (this.hasFileTypes) { const segments = file.name.split('.'); let extension = segments.length > 1 ? MsftSme.last(segments) : null; if (extension) { extension = `.${extension}`; } if (!this.fileTypes.some(type => type === file.type || (extension !== null && type === extension))) { let message; if (extension || file.type) { message = this.strings.MsftSmeShell.Angular.Form.File.invalidFileTypeFormat.format(extension || file.type); } else { message = this.strings.MsftSmeShell.Angular.Form.File.invalidFileUnknownTypeFormat.format(file.name); } return { invalidFileType: { message: message, valid: false, severity: ValidationAlertSeverity.Error } }; } } } return super.validate(c); } }; /** @nocollapse */ FileFormFieldComponent.ɵfac = function FileFormFieldComponent_Factory(t) { return new (t || FileFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ FileFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: FileFormFieldComponent, selectors: [["sme-form-field", "type", "file"]], viewQuery: function FileFormFieldComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fileInput = _t.first); } }, inputs: { multiple: "multiple", fileTypes: "fileTypes", buttonLabel: "buttonLabel" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c1, decls: 18, vars: 19, consts: [[3, "formField"], [1, "sme-file-drop-zone", "sme-subform-indent-none", "sme-subform-no-bottom-margin"], [1, "sme-padding-inset-xs", "sme-margin-bottom-xs", "sme-arrange-stack-v", 3, "smeDrop"], [1, "sme-file-input", "sme-margin-bottom-xxs"], ["type", "file", 1, "sme-layout-none", 3, "disabled", "change"], ["file", ""], ["type", "button", 1, "sme-button-primary", "sme-button-auto-width", "sme-margin-right-xs", 3, "smeDisabled", "click"], [1, "sme-position-flex-align-center"], [1, "sme-margin-bottom-xs"], [4, "ngIf"], [3, "alert"], ["class", "sme-arrange-stack-h sme-margin-bottom-xs", 4, "ngFor", "ngForOf"], [1, "sme-arrange-stack-h", "sme-margin-bottom-xs"], [1, "sme-position-flex-none", "sme-icon", "sme-icon-size-lg"], [1, "sme-position-flex-auto", "sme-padding-left-sm", "sme-arrange-stack-v"], [1, "sme-position-flex-auto", "sme-arrange-ellipsis", "sme-padding-inset-none"], ["type", "button", 1, "sme-button-trigger", "sme-position-flex-none", "sme-button-auto-width", "sme-focus-zone", 3, "title", "smeDisabled", "click"], [1, "sme-icon", "sme-icon-cancel", "sme-color-red"]], template: function FileFormFieldComponent_Template(rf, ctx) { if (rf & 1) { const _r7 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "fieldset", 1)(2, "sme-drop-zone", 2); i0.ɵɵlistener("smeDrop", function FileFormFieldComponent_Template_sme_drop_zone_smeDrop_2_listener($event) { return ctx.onDrop($event); }); i0.ɵɵelementStart(3, "div", 3)(4, "input", 4, 5); i0.ɵɵlistener("change", function FileFormFieldComponent_Template_input_change_4_listener() { return ctx.onFileChanged(); }); i0.ɵɵelementEnd(); i0.ɵɵelementStart(6, "button", 6); i0.ɵɵlistener("click", function FileFormFieldComponent_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r7); const _r0 = i0.ɵɵreference(5); return i0.ɵɵresetView(_r0.click()); }); i0.ɵɵtext(7); i0.ɵɵelementEnd(); i0.ɵɵelementStart(8, "b", 7); i0.ɵɵtext(9); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(10, "p"); i0.ɵɵtext(11); i0.ɵɵpipe(12, "smeFormat"); i0.ɵɵpipe(13, "smeFormat"); i0.ɵɵelementEnd()(); i0.ɵɵelementStart(14, "p", 8); i0.ɵɵtext(15); i0.ɵɵelementEnd(); i0.ɵɵtemplate(16, FileFormFieldComponent_ng_container_16_Template, 2, 1, "ng-container", 9); i0.ɵɵelementEnd(); i0.ɵɵelement(17, "sme-validation-alert", 10); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵproperty("formField", ctx); i0.ɵɵadvance(1); i0.ɵɵattribute("aria-label", ctx.ariaLabel); i0.ɵɵadvance(3); i0.ɵɵproperty("disabled", ctx.loadingOrDisabled); i0.ɵɵattribute("multiple", ctx.multiple || undefined)("accept", ctx.hasFileTypes ? ctx.acceptedFileTypes : undefined); i0.ɵɵadvance(2); i0.ɵɵproperty("smeDisabled", ctx.loadingOrDisabled); i0.ɵɵattribute("aria-label", ctx.ariaLabelText); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate1(" ", ctx.buttonLabel || (ctx.multiple ? ctx.strings.MsftSmeShell.Angular.Form.File.buttonText.plural : ctx.strings.MsftSmeShell.Angular.Form.File.buttonText.singular), " "); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", ctx.multiple ? ctx.strings.MsftSmeShell.Angular.Form.File.dragDropText.plural : ctx.strings.MsftSmeShell.Angular.Form.File.dragDropText.singular, " "); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate(ctx.hasFileTypes ? i0.ɵɵpipeBind2(12, 13, ctx.strings.MsftSmeShell.Angular.Form.File.allowedFileTypesFormat, ctx.acceptedFileTypes) : i0.ɵɵpipeBind2(13, 16, ctx.strings.MsftSmeShell.Angular.Form.File.allowedFileTypesFormat, ctx.strings.MsftSmeShell.Angular.Form.File.allFileTypes)); i0.ɵɵadvance(4); i0.ɵɵtextInterpolate(ctx.fileCountLabel); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.hasFiles); i0.ɵɵadvance(1); i0.ɵɵproperty("alert", ctx.alert); } }, dependencies: [i5.NgForOf, i5.NgIf, i6.DisabledDirective, i7.DropZoneComponent, i8.TooltipDirective, i9.ValidationAlertComponent, i10.FieldsetDirective, i11.FormFieldLayoutComponent, i12.ByteUnitConverterPipe, i13.FormatPipe], encapsulation: 2 }); FileFormFieldComponent = __decorate([ SmeSchemaProperty({ type: SchemaPrimitiveType.File, format: 'default', isDefaultFormat: true, description: 'A file upload control binding to file data.', loaderComponent: FileFormFieldLoaderComponent }), __metadata("design:paramtypes", [Injector]) ], FileFormFieldComponent); export { FileFormFieldComponent }; (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FileFormFieldComponent, [{ type: Component, args: [{ selector: 'sme-form-field[type="file"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <fieldset [attr.aria-label]=\"ariaLabel\"\r\n class=\"sme-file-drop-zone sme-subform-indent-none sme-subform-no-bottom-margin\">\r\n <sme-drop-zone class=\"sme-padding-inset-xs sme-margin-bottom-xs sme-arrange-stack-v\" (smeDrop)=\"onDrop($event)\">\r\n <div class=\"sme-file-input sme-margin-bottom-xxs\">\r\n <input #file type=\"file\" class=\"sme-layout-none\" [disabled]=\"loadingOrDisabled\" (change)=\"onFileChanged()\"\r\n [attr.multiple]=\"multiple || undefined\" [attr.accept]=\"hasFileTypes ? acceptedFileTypes : undefined\">\r\n <button type=\"button\" [smeDisabled]=\"loadingOrDisabled\"\r\n class=\"sme-button-primary sme-button-auto-width sme-margin-right-xs\" (click)=\"file.click()\" [attr.aria-label]=\"ariaLabelText\">\r\n {{ buttonLabel || ( multiple\r\n ? strings.MsftSmeShell.Angular.Form.File.buttonText.plural\r\n : strings.MsftSmeShell.Angular.Form.File.buttonText.singular )\r\n }}\r\n </button>\r\n <b class=\"sme-position-flex-align-center\">\r\n {{\r\n multiple\r\n ? strings.MsftSmeShell.Angular.Form.File.dragDropText.plural\r\n : strings.MsftSmeShell.Angular.Form.File.dragDropText.singular\r\n }}\r\n </b>\r\n </div>\r\n <p>{{ hasFileTypes ? (strings.MsftSmeShell.Angular.Form.File.allowedFileTypesFormat | smeFormat:acceptedFileTypes)\r\n : ( strings.MsftSmeShell.Angular.Form.File.allowedFileTypesFormat | smeFormat:strings.MsftSmeShell.Angular.Form.File.allFileTypes) }}</p>\r\n </sme-drop-zone>\r\n <p class=\"sme-margin-bottom-xs\">{{fileCountLabel}}</p>\r\n\r\n <ng-container *ngIf=\"hasFiles\">\r\n <div *ngFor=\"let file of files; let i = index\" class=\"sme-arrange-stack-h sme-margin-bottom-xs\">\r\n <div class=\"sme-position-flex-none sme-icon sme-icon-size-lg\" [class.sme-icon-openFile]=\"!isDirectory(file)\"\r\n [class.sme-icon-openFolderHorizontal]=\"isDirectory(file)\"></div>\r\n <div class=\"sme-position-flex-auto sme-padding-left-sm sme-arrange-stack-v\">\r\n <label class=\"sme-position-flex-auto sme-arrange-ellipsis sme-padding-inset-none\">{{ file.name }}</label>\r\n <label class=\"sme-position-flex-auto sme-arrange-ellipsis sme-padding-inset-none\">\r\n {{file.size | smeByteUnitConverter:1024}}\r\n </label>\r\n </div>\r\n <button type=\"button\" class=\"sme-button-trigger sme-position-flex-none sme-button-auto-width sme-focus-zone\"\r\n (click)=\"removeItemAt(i)\"\r\n [attr.aria-label]=\"strings.MsftSmeShell.Angular.Form.File.removeButtonAriaLabelFormat | smeFormat:file.name\"\r\n [title]=\"strings.MsftSmeShell.Angular.Form.File.removeButtonTooltip\" [smeDisabled]=\"loadingOrDisabled\">\r\n <span class=\"sme-icon sme-icon-cancel sme-color-red\"></span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </fieldset>\r\n <sme-validation-alert [alert]=\"alert\"></sme-validation-alert>\r\n</sme-form-field-layout>\r\n" }] }], function () { return [{ type: i0.Injector }]; }, { fileInput: [{ type: ViewChild, args: ['file'] }], multiple: [{ type: Input }], fileTypes: [{ type: Input }], buttonLabel: [{ type: Input }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1mb3JtLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2Zvcm0vZm9ybS1maWVsZC9maWxlL2ZpbGUtZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvZmlsZS9maWxlLWZvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN2RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BHLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDbUJoRCwrQkFBZ0c7SUFDOUYsMEJBQ3FFO0lBQ3JFLCtCQUE0RSxnQkFBQTtJQUNRLFlBQWU7SUFBQSxpQkFBUTtJQUN6RyxpQ0FBa0Y7SUFDaEYsWUFDRjs7SUFBQSxpQkFBUSxFQUFBO0lBRVYsa0NBRytHO0lBRnZHLHdPQUFTLGVB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LDRDQUE2RDtRQUMvRCxpQkFBd0I7O1FBL0NELCtCQUFrQjtRQUM3QixlQUE2QjtRQUE3QiwyQ0FBNkI7UUFJZ0IsZUFBOEI7UUFBOUIsZ0RBQThCO1FBQ3hFLHFEQUF1QyxnRUFBQTtRQUN4QixlQUFpQztRQUFqQyxtREFBaUM7UUFDNkMsK0NBQWlDO1FBQ25JLGVBSUY7UUFKRSxrTUFJRjtRQUVFLGVBS0Y7UUFMRSxpTEFLRjtRQUVDLGVBQ29JO1FBRHBJLDhTQUNvSTtRQUV6RyxlQUFrQjtRQUFsQix3Q0FBa0I7UUFFbkMsZUFBYztRQUFkLG1DQUFjO1FBbUJULGVBQWU7UUFBZixpQ0FBZTs7QUREMUIsc0JBQXNCO0lBWGxDLGlCQUFpQixDQUFDO1FBQ2YsSUFBSSxFQUFFLG1CQUFtQixDQUFDLElBQUk7UUFDOUIsTUFBTSxFQUFFLFNBQVM7UUFDakIsZUFBZSxFQUFFLElBQUk7UUFDckIsV0FBVyxFQUFFLDZDQUE2QztRQUMxRCxlQUFlLEVBQUUsNEJBQTRCO0tBQ2hELENBQUM7cUNBMEhnQixRQUFRO0dBckhiLHNCQUFzQixDQTJRbEM7U0EzUVksc0JBQXNCO3VGQUF0QixzQkFBc0I7Y0FKbEMsU0FBUzsyQkFDSSw2QkFBNkI7MkRBZ0JoQyxTQUFTO2tCQURmLFNBQVM7bUJBQUMsTUFBTTtZQU9WLFFBQVE7a0JBRGQsS0FBSztZQU9DLFNBQVM7a0JBRGYsS0FBSztZQU9DLFdBQVc7a0JBRGpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RpYWdub3N0aWNzL2xvZ2dpbmcnO1xyXG5pbXBvcnQgeyBEb20gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RvbS9kb20nO1xyXG5pbXBvcnQgeyBTbWVTY2hlbWFQcm9wZXJ0eSB9IGZyb20gJy4uLy4uLy4uL3NjaGVtYS9zY2hlbWEtZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgU2ltcGxlUHJvcGVydHlTY2hlbWFGaWVsZExvYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NjaGVtYS9zY2hlbWEtZmllbGQtaG9zdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTY2hlbWFQcmltaXRpdmVUeXBlIH0gZnJvbSAnLi4vLi4vLi4vc2NoZW1hL3NjaGVtYS1tb2RlbHMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uQWxlcnRzLCBWYWxpZGF0aW9uQWxlcnRTZXZlcml0eSB9IGZyb20gJy4uLy4uL3ZhbGlkYXRpb24tYWxlcnQvdmFsaWRhdGlvbi1hbGVydCc7XHJcbmltcG9ydCB7IFNtZUludGVybmFsRm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBXZWJraXRGaWxlU3lzdGVtIH0gZnJvbSAnLi93ZWJraXRGaWxlU3lzdGVtJztcclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgPHNtZS1mb3JtLWZpZWxkICNmaWVsZCB0eXBlPVwiZmlsZVwiIFsobmdNb2RlbCldPVwiZGF0YVwiIFtuYW1lXT1cInByb3BlcnR5U2NoZW1hLm5hbWVcIiBbbGFiZWxdPVwibG9jYWxpemUocHJvcGVydHlTY2hlbWEubGFiZWwpXCJcclxuICAgICAgICBbZGVzY3JpcHRpb25dPVwibG9jYWxpemUocHJvcGVydHlTY2hlbWEuZGVzY3JpcHRpb24pXCIgW3JlcXVpcmVkXT1cInByb3BlcnR5U2NoZW1hLnJlcXVpcmVkXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwiISFldmFsRXhwcmVzc2lvbihwcm9wZXJ0eVNjaGVtYS5yZWFkb25seUNvbmRpdGlvbilcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhIShwcm9wZXJ0eVNjaGVtYS5kaXNhYmxlZENvbmRpdGlvbiAmJiBldmFsRXhwcmVzc2lvbihwcm9wZXJ0eVNjaGVtYS5kaXNhYmxlZENvbmRpdGlvbikpXCJcclxuICAgICAgICBbbXVsdGlwbGVdPVwicHJvcGVydHlTY2hlbWEub3B0aW9ucy5tdWx0aXBsZVwiIFtmaWxlVHlwZXNdPVwicHJvcGVydHlTY2hlbWEub3B0aW9ucy5maWxlVHlwZXNcIlxyXG4gICAgICAgIChjdXN0b21WYWxpZGF0ZSk9XCJyZXNvbHZlRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEuY3VzdG9tVmFsaWRhdGlvbikoJGV2ZW50KVwiXHJcbiAgICAgICAgKGN1c3RvbUFzeW5jVmFsaWRhdGUpPVwicHJvcGVydHlTY2hlbWEuY3VzdG9tQXN5bmNWYWxpZGF0aW9uICYmIHJlc29sdmVGdW5jdGlvbihwcm9wZXJ0eVNjaGVtYS5jdXN0b21Bc3luY1ZhbGlkYXRpb24uaGFuZGxlcikoJGV2ZW50KVwiXHJcbiAgICAgICAgW3BlbmRpbmdNZXNzYWdlXT1cInByb3BlcnR5U2NoZW1hLmN1c3RvbUFzeW5jVmFsaWRhdGlvbiAmJiBsb2NhbGl6ZShwcm9wZXJ0eVNjaGVtYS5jdXN0b21Bc3luY1ZhbGlkYXRpb24ucGVuZGluZ01lc3NhZ2UpXCJcclxuICAgICAgICBbY3VzdG9tQXN5bmNWYWxpZGF0ZURpc2FibGVkXT1cInNob3VsZEN1c3RvbUFzeW5jVmFsaWRhdGlvbkJlRGlzYWJsZWQoKVwiXHJcbiAgICAgICAgW2N1c3RvbUFzeW5jVmFsaWRhdGVEZWJvdW5jZVRpbWVdPVwicHJvcGVydHlTY2hlbWEuY3VzdG9tQXN5bmNWYWxpZGF0aW9uICYmICtwcm9wZXJ0eVNjaGVtYS5jdXN0b21Bc3luY1ZhbGlkYXRpb24uaGFuZGxlclwiXHJcbiAgICAgICAgPjwvc21lLWZvcm0tZmllbGQ+XHJcbiAgICBgXHJcbn0pXHJcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xyXG5leHBvcnQgY2xhc3MgRmlsZUZvcm1GaWVsZExvYWRlckNvbXBvbmVudCBleHRlbmRzIFNpbXBsZVByb3BlcnR5U2NoZW1hRmllbGRMb2FkZXJDb21wb25lbnQge1xyXG59XHJcblxyXG4vKipcclxuICogQWNjZXNzaWJsZSBmaWxlIGZpZWxkIGltcGxlbWVudGF0aW9uXHJcbiAqL1xyXG5AU21lU2NoZW1hUHJvcGVydHkoe1xyXG4gICAgdHlwZTogU2NoZW1hUHJpbWl0aXZlVHlwZS5GaWxlLFxyXG4gICAgZm9ybWF0OiAnZGVmYXVsdCcsXHJcbiAgICBpc0RlZmF1bHRGb3JtYXQ6IHRydWUsXHJcbiAgICBkZXNjcmlwdGlvbjogJ0EgZmlsZSB1cGxvYWQgY29udHJvbCBiaW5kaW5nIHRvIGZpbGUgZGF0YS4nLFxyXG4gICAgbG9hZGVyQ29tcG9uZW50OiBGaWxlRm9ybUZpZWxkTG9hZGVyQ29tcG9uZW50XHJcbn0pXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtZm9ybS1maWVsZFt0eXBlPVwiZmlsZVwiXScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsZUZvcm1GaWVsZENvbXBvbmVudCBleHRlbmRzIFNtZUludGVybmFsRm9ybUZpZWxkQ29tcG9uZW50PEZpbGUgfCBGaWxlW10+IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnRmlsZUZvcm1GaWVsZENvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmlsZSBpbnB1dCBwYXJ0IG9mIHRoaXMgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdmaWxlJylcclxuICAgIHB1YmxpYyBmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCBtdWx0aXBsZSBmaWxlcyBhcmUgYWxsb3dlZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIG11bHRpcGxlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIGZpbGVzIHRoYXQgYXJlIGFsbG93ZWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmaWxlVHlwZXM6IHN0cmluZ1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxhYmVsIHRvIHVzZSBvbiB0aGUgc2VsZWN0IGJ1dHRvblxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGJ1dHRvbkxhYmVsOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBhY3RpdmVEcm9wcGVkRmlsZVN5c3RlbTogV2Via2l0RmlsZVN5c3RlbTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBhcmlhIGxhYmVsIGZvciB0aGlzIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVyZ2VkRGVzY3JpcHRpb25MYWJlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZ2V0cyB0aGUgZmlsZSBjb3VudCBsYWJlbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGZpbGVDb3VudExhYmVsKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhhc0ZpbGVzXHJcbiAgICAgICAgICAgID8gdGhpcy5oYXNNdWx0aXBsZUZpbGVzXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Gb3JtLkZpbGUuc2VsZWN0ZWRGaWxlc0Zvcm1hdC5wbHVyYWwuZm9ybWF0KHRoaXMuZmlsZXMubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5GaWxlLnNlbGVjdGVkRmlsZXNGb3JtYXQuc2luZ3VsYXJcclxuICAgICAgICAgICAgOiB0aGlzLm11bHRpcGxlXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Gb3JtLkZpbGUuc2VsZWN0ZWRGaWxlc0Zvcm1hdC5tdWx0aXBsZUVuYWJsZWQubm9uZVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5GaWxlLnNlbGVjdGVkRmlsZXNGb3JtYXQubm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGdldHMgYXJpYS1sYWJlbCB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXJpYUxhYmVsVGV4dCgpIHtcclxuICAgICAgICBsZXQgbGFiZWxUZXh0ID0gdGhpcy5idXR0b25MYWJlbCB8fCAodGhpcy5tdWx0aXBsZVxyXG4gICAgICAgICAgICA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Gb3JtLkZpbGUuYnV0dG9uVGV4dC5wbHVyYWxcclxuICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5GaWxlLmJ1dHRvblRleHQuc2luZ3VsYXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yZXF1aXJlZCkge1xyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIGFubm91bmNlZCBsYWJlbCB3aXRoIFwiUmVxdWlyZWRcIiBpZiB0aGUgZmllbGQgaXMgbWFya2VkIGFzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkTGFiZWwgPSAgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNvbW1vbi5Gb3JtLlZhbGlkYXRpb24uUmVxdWlyZWQubGFiZWw7XHJcbiAgICAgICAgICAgIGxhYmVsVGV4dCA9IGxhYmVsVGV4dC5jb25jYXQocmVxdWlyZWRMYWJlbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5oYXNGaWxlc1xyXG4gICAgICAgICAgICA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Gb3JtLkZpbGUuc2VsZWN0ZWRGaWxlc0Zvcm1hdC5wbHVyYWwuZm9ybWF0KHRoaXMuZmlsZXMubGVuZ3RoKS5jb25jYXQobGFiZWxUZXh0KVxyXG4gICAgICAgICAgICA6IGxhYmVsVGV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgYW55IGZpbGVzIHNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZmlsZXMoKTogRmlsZVtdIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWUgOiAhIXRoaXMudmFsdWUgPyBbdGhpcy52YWx1ZV0gOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgYW55IGZpbGVzIHNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaGFzRmlsZXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMCA6ICEhdGhpcy52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZmlsZXMgc2VsZWN0ZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgaGFzTXVsdGlwbGVGaWxlcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oYXNGaWxlcyAmJiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgYW55IGZpbGUgdHlwZSByZXN0cmljdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBoYXNGaWxlVHlwZXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maWxlVHlwZXMgJiYgdGhpcy5maWxlVHlwZXMubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgYWNjZXB0IHByb3BlcnR5IGZvciBvdXIgZmlsZSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGFjY2VwdGVkRmlsZVR5cGVzKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZVR5cGVzID8gdGhpcy5maWxlVHlwZXMuam9pbignLCAnKSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZGlyZWN0b3J5VXBsb2FkU3VwcG9ydGVkKCkge1xyXG4gICAgICAgIHJldHVybiAhIURhdGFUcmFuc2Zlckl0ZW0ucHJvdG90eXBlLndlYmtpdEdldEFzRW50cnk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRmlsZUZvcm1GaWVsZENvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3JcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkZvcm0uRmlsZS5wbGFjZWhvbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9jY3VycyB3aGVuIHRoZSBmaWxlIGlucHV0IGhhcyBjaGFuZ2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkZpbGVDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoTXNmdFNtZS5nZXRWYWx1ZSh0aGlzLmZpbGVJbnB1dCwgJ25hdGl2ZUVsZW1lbnQuZmlsZXMnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiB0aGUgdGhlcmUgaXMgYSBkcm9wIG9udG8gdGhpcyBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRyb3AoZGF0YTogRGF0YVRyYW5zZmVyKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgZHJvcHBlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGZpbGUsIHRoZW4ganVzdCB1cGRhdGUgdmFsdWUgdG8gYW4gZW1wdHkgbGlzdFxyXG4gICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCA9PT0gMCB8fCBkYXRhLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKFtdKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmRpcmVjdG9yeVVwbG9hZFN1cHBvcnRlZCkge1xyXG4gICAgICAgICAgICAvLyBJZiB3ZWJraXQgaXMgbm90IHN1cHBvcnRlZCwgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGRldGVjdCBmb2xkZXJzIGJlaW5nIGRyb3BwZWQgd2l0aG91dCBleGNsdWRpbmcgc29tZSBmaWxlIHR5cGVzLlxyXG4gICAgICAgICAgICAvLyBib3RoIEVkZ2UgYW5kIENocm9tZSBmdWxseSBzdXBwb3J0IHRoaXMgYXBpLiBTbyB3ZSBzaG91bGQgYmUgZ29vZCBhcyBmYXIgYSBvdXIgc3VwcG9ydGVkIGJyb3dzZXIgbWF0cml4IGlzIGNvbmNlcm5lZC5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShkYXRhLmZpbGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbGVTeXN0ZW0gPSBuZXcgV2Via2l0RmlsZVN5c3RlbShkYXRhLml0ZW1zKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZURyb3BwZWRGaWxlU3lzdGVtID0gZmlsZVN5c3RlbTtcclxuICAgICAgICBmaWxlU3lzdGVtLmdldEZpbGVMaXN0KCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogZmlsZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJvcHBlZEZpbGVTeXN0ZW0gPT09IGZpbGVTeXN0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKGZpbGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIExvZ2dpbmcubG9nRXJyb3IodGhpcy5sb2dTb3VyY2VOYW1lLCAnQW4gRXJyb3Igb2NjdXJyZWQgcmVzb2x2aW5nIGRyb3BwZWQgZmlsZXMnLCB7IGVycm9yOiBlcnJvciB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgY29udHJvbHMgdmFsdWUgdG8gcmVmbGVjdCBkcm9wcGVkIG9yIGJyb3dzZWQgZmlsZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWx1ZShmaWxlczogRmlsZUxpc3QgfCBGaWxlW10pIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZURyb3BwZWRGaWxlU3lzdGVtID0gbnVsbDtcclxuICAgICAgICBpZiAoTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChmaWxlcykpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubXVsdGlwbGUgPyBbXSA6IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVBcnJheTogRmlsZVtdID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGZpbGVBcnJheS5wdXNoKGZpbGVzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gZmlsZUFycmF5O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBmaWxlc1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5uZ01vZGVsLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbiBpdGVtIGF0IHRoZSBnaXZlbiBpbmRleFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlSXRlbUF0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZV07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaXJzdEZvY3VzYWJsZSA9IERvbS5nZXRGaXJzdEZvY3VzYWJsZURlc2NlbmRlbnQodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICBpZiAoZmlyc3RGb2N1c2FibGUpIHtcclxuICAgICAgICAgICAgZmlyc3RGb2N1c2FibGUuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqIGlkIHZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIGJlIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgc3VwZXIgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkZXRhaWxzU3Bhbj