/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { AppConfigService } from '../app-config/app-config.service'; import { Http } from '@angular/http'; import { Request } from '../_services/request.service'; import { Common } from '../_services/common.service'; import { NgForm } from '@angular/forms'; import { HttpClient, HttpEventType, HttpHeaders, HttpRequest, HttpResponse } from '@angular/common/http'; import { Observable } from 'rxjs'; import QrCode from 'qrcode-reader'; import * as _ from 'lodash'; var UploadAttachmentComponent = /** @class */ (function () { function UploadAttachmentComponent(appConfigService, request, common, http, _http) { var _this = this; this.appConfigService = appConfigService; this.request = request; this.common = common; this.http = http; this._http = _http; this.upLoadType = [ { title: "File", type: 1 }, // {title:"Scan",type:2}, { title: "Link", type: 3 }, { title: "QR Code", type: 4 } ]; this.systemId = '0'; this.RelatedAgency = 'SOC'; this.RecordId = '0'; this.Subject = '-'; this.TypeId = '0'; this.onlyImage = false; this.uploaded = new EventEmitter(); // @ViewChild('myModal') myModal; this.fileList = []; this.fileNameLink = ''; this.fileNameLinkError = ''; this.QrCodeFileName = ''; this.fileNameQr = ''; this.fileNameLinkQr = ''; this.fileNameQrError = ''; this.filter = {}; this.uploadHeaders = { "Authorization": "Basic " + btoa("APPSOC:123456") }; this.isLoading = false; this.isDisabled = false; this.createAuthorizationHeader = function (headers) { }; this.beforeUpload = function (file, _fileList) { return new Observable(function (observer) { /** @type {?} */ var whitelist = [ 'application/pdf', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel', 'application/vnd.msexcel', 'application/csv', 'text/csv', 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'text/plain', 'text/comma-separated-values', 'text/anytext', 'image/png', 'image/jpeg', 'image/gif', 'image/bmp' ]; /** @type {?} */ var isWhitelist = (file && whitelist.indexOf(file.type) > -1); if (!isWhitelist) { setTimeout(function () { _this.fileList = [{ uid: '999', name: 'สามารถอัพโหลดได้เฉพาะไฟล์ pdf , png , jpeg ,gif , text , word , excel , powerpoint', status: 'error', response: 'สามารถอัพโหลดได้เฉพาะไฟล์ pdf , png , jpeg ,gif , text , word , excel , powerpoint', url: null }]; }, 50); observer.complete(); return; } /** @type {?} */ var isLt30M = /** @type {?} */ ((file.size)) / 1024 / 1024 < 30; if (!isLt30M) { _this.fileList = [{ uid: '999', name: 'File must smaller than 30MB!', status: 'error', response: 'File must smaller than 30MB!', url: null }]; observer.complete(); return; } observer.next(isWhitelist && isLt30M); observer.complete(); }); }; this.customReq = function (item) { /** @type {?} */ var formData = new FormData(); // tslint:disable-next-line:no-any formData.append('FileData', /** @type {?} */ (item.file)); formData.append('SystemId', '' + _this.systemId); formData.append('RelatedAgency', _this.RelatedAgency); formData.append('RecordId', _this.RecordId); formData.append('Subject', _this.Subject); formData.append('TypeId', _this.TypeId); /** @type {?} */ var headers = new HttpHeaders(); headers = headers.set('Authorization', 'Basic ' + btoa('APPSOC:123456')); /** @type {?} */ var req = new HttpRequest('POST', item.action, formData, { reportProgress: true, headers: headers }); // req.headers.set('Authorization', 'Basic ' + btoa('APPSOC:123456')); return _this.http.request(req).subscribe(function (event) { if (event.type === HttpEventType.UploadProgress) { if (event.total > 0) { (/** @type {?} */ (event)).percent = event.loaded / event.total * 100; } // console.log("onProgress", event , this.fileList); item.onProgress(event, item.file); } else if (event instanceof HttpResponse) { // console.log("event.body", event.body , this.fileList); if (_this.fileList && _this.fileList.length > 1) { _this.fileList = [_this.fileList[_this.fileList.length - 1]]; } // let res = JSON.parse(event.body); // this.isDisabled = true; // let res = JSON.parse(event.body); // this.isDisabled = true; _this.isDisabled = false; _this.uploaded.emit(event.body); item.onSuccess(event.body, item.file, event); } }, function (err) { console.log(err); item.onError(err, item.file); }); }; this.config = appConfigService.getConfig(); this.url = _.get(this.config, 'apiServers.alfresco.url') || "https://portal-uat.soc.go.th/api/mfec/Alfresco"; this.uploadUrl = _.get(this.config, 'apiServers.alfresco.uploadUrl') || 'https://portal-uat.soc.go.th/microservice-api/gen-processed-file/upload-link-server'; // || "http://127.0.0.1:5500/microservice-api/gen-processed-file/upload-link-server"; } /** * @return {?} */ UploadAttachmentComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; console.log('form', this.form); this.qr = new QrCode(); this.qr.callback = function (err, result) { console.log('callback'); _this.fileNameQrError = ''; /** @type {?} */ var span = document.querySelector('span') || document.createElement('span'); if (result) { console.log(result.result); if (result.result) { _this.fileNameLinkQr = result.result; _this.uploadLinkQr(); } // span.textContent = 'view console'; } else { // span.textContent = 'Error! See error message in console!'; console.error(err); _this.fileNameQrError = _this.QrCodeFileName; _this.QrCodeFileName = ''; } // preview.appendChild(span); }; }; /** * @return {?} */ UploadAttachmentComponent.prototype.uploadLinkQr = /** * @return {?} */ function () { var _this = this; this.isLoading = true; this.fileNameQrError = ''; this._http.post(this.uploadUrl, { SystemId: '' + this.systemId, RelatedAgency: this.RelatedAgency, RecordId: this.RecordId, Subject: this.Subject, TypeId: this.TypeId, link: this.fileNameLinkQr }).map(function (res) { return res.json(); }) .toPromise().then(function (res) { console.log(res); _this.isLoading = false; if (res.resultCode === 20000 && res.data && res.data.file) { _this.fileNameLinkQr = ''; // this.isDisabled = true; // this.isDisabled = true; _this.isDisabled = false; console.log('res.data', res.data.file); _this.fileNameQr = res.data.file.fileName; _this.uploaded.emit(res.data.file); _this.fileNameLink = ''; _this.fileNameLinkError = ''; } else { _this.fileNameQrError = _this.fileNameLinkQr; } }).catch(function (err) { _this.uploaded.emit({}); _this.isLoading = false; _this.fileNameQrError = _this.fileNameLinkQr; console.log(err); }); }; /** * @return {?} */ UploadAttachmentComponent.prototype.btnUpload = /** * @return {?} */ function () { var _this = this; this.isLoading = true; this.fileNameLinkError = ''; this._http.post(this.uploadUrl, { SystemId: '' + this.systemId, RelatedAgency: this.RelatedAgency, RecordId: this.RecordId, Subject: this.Subject, TypeId: this.TypeId, link: this.filter.link }).map(function (res) { return res.json(); }) .toPromise().then(function (res) { console.log(res); _this.isLoading = false; if (res.resultCode === 20000 && res.data && res.data.file) { _this.filter = {}; // this.isDisabled = true; // this.isDisabled = true; _this.isDisabled = false; console.log('res.data', res.data.file); _this.fileNameLink = res.data.file.fileName; _this.uploaded.emit(res.data.file); _this.QrCodeFileName = ''; _this.fileNameQr = ''; _this.fileNameLinkQr = ''; _this.fileNameQrError = ''; } else { _this.fileNameLinkError = _this.filter.link; } }).catch(function (err) { _this.uploaded.emit({}); _this.isLoading = false; _this.fileNameLinkError = _this.filter.link; console.log(err); }); }; /** * @return {?} */ UploadAttachmentComponent.prototype.onQrCodeChange = /** * @return {?} */ function () { /** @type {?} */ var fullPath = document.getElementById('file-upload')['value']; if (fullPath) { /** @type {?} */ var startIndex = (fullPath.indexOf('\\') >= 0 ? fullPath.lastIndexOf('\\') : fullPath.lastIndexOf('/')); /** @type {?} */ var filename = fullPath.substring(startIndex); if (filename.indexOf('\\') === 0 || filename.indexOf('/') === 0) { filename = filename.substring(1); } this.QrCodeFileName = filename; } else { this.QrCodeFileName = ''; } this.fileNameLinkQr = ''; /** @type {?} */ var upload = document.getElementById('file-upload'); /** @type {?} */ var preview = document.getElementById('preview'); /** @type {?} */ var files_ = document.getElementById('file-upload')['files']; // console.log('files_',files_) if (files_) { var _loop_1 = function () { file = files_[i]; imageType = /^image\//; if (!imageType.test(file.type)) { this_1.QrCodeFileName = ''; this_1.fileNameQrError = 'File type not valid'; console.log('File type not valid'); } else { // Read file reader = new FileReader(); /** @type {?} */ var self_1 = this_1; reader.addEventListener('load', function () { /** @type {?} */ var img = document.querySelector('img') || document.createElement('img'); img.src = this.result; // preview.appendChild(img); // Analyse code // preview.appendChild(img); // Analyse code self_1.qr.decode(this.result); }.bind(reader), false); reader.readAsDataURL(file); } }; var this_1 = this, file, imageType, reader; for (var i = 0; i < files_.length; i++) { _loop_1(); } } // console.log("onQrCodeChange",jsqrcode) }; /** * @param {?} file * @return {?} */ UploadAttachmentComponent.prototype.onUploaded = /** * @param {?} file * @return {?} */ function (file) { console.log("file", file); /** @type {?} */ var res = JSON.parse(file.request.response); this.uploaded.emit(res); }; /** * @param {?} e * @return {?} */ UploadAttachmentComponent.prototype.onSelected = /** * @param {?} e * @return {?} */ function (e) { console.log("e", e); console.log('form', this.form); this.form.ngSubmit.emit(); }; /** * @param {?} data * @return {?} */ UploadAttachmentComponent.prototype.onChange = /** * @param {?} data * @return {?} */ function (data) { data.fileList = [data.file]; // console.log("onChange",data); if (data.fileList === 0) { this.isDisabled = false; } }; /** * @return {?} */ UploadAttachmentComponent.prototype.clearValue = /** * @return {?} */ function () { this.isDisabled = false; console.log("clearValue"); this.fileList = []; this.fileNameLink = ''; this.fileNameLinkError = ''; this.QrCodeFileName = ''; this.fileNameQr = ''; this.fileNameLinkQr = ''; this.fileNameQrError = ''; }; UploadAttachmentComponent.decorators = [ { type: Component, args: [{ selector: 'upload-attachment', template: "\n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n \n \n \n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Click to Upload\n \n \n \n \n \n \n \n Click to Upload\n \n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n\n
\n
\n \n {{fileNameLink}}\n \n
\n
\n
\n
\n \n {{fileNameLinkError}}\n \n
\n
\n\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n
\n
\n \n \n {{QrCodeFileName}}\n \n
\n\n
\n
\n \n {{fileNameQr}}\n \n
\n
\n
\n
\n \n {{fileNameQrError}}\n \n
\n
\n
\n
\n
\n
\n
\n
\n\n" }] } ]; /** @nocollapse */ UploadAttachmentComponent.ctorParameters = function () { return [ { type: AppConfigService }, { type: Request }, { type: Common }, { type: HttpClient }, { type: Http } ]; }; UploadAttachmentComponent.propDecorators = { form: [{ type: ViewChild, args: ['f',] }], upLoadType: [{ type: Input }], systemId: [{ type: Input }], RelatedAgency: [{ type: Input }], RecordId: [{ type: Input }], Subject: [{ type: Input }], TypeId: [{ type: Input }], onlyImage: [{ type: Input }], uploaded: [{ type: Output }] }; return UploadAttachmentComponent; }()); export { UploadAttachmentComponent }; if (false) { /** @type {?} */ UploadAttachmentComponent.prototype.form; /** @type {?} */ UploadAttachmentComponent.prototype.upLoadType; /** @type {?} */ UploadAttachmentComponent.prototype.systemId; /** @type {?} */ UploadAttachmentComponent.prototype.RelatedAgency; /** @type {?} */ UploadAttachmentComponent.prototype.RecordId; /** @type {?} */ UploadAttachmentComponent.prototype.Subject; /** @type {?} */ UploadAttachmentComponent.prototype.TypeId; /** @type {?} */ UploadAttachmentComponent.prototype.onlyImage; /** @type {?} */ UploadAttachmentComponent.prototype.uploaded; /** @type {?} */ UploadAttachmentComponent.prototype.fileList; /** @type {?} */ UploadAttachmentComponent.prototype.fileNameLink; /** @type {?} */ UploadAttachmentComponent.prototype.fileNameLinkError; /** @type {?} */ UploadAttachmentComponent.prototype.QrCodeFileName; /** @type {?} */ UploadAttachmentComponent.prototype.fileNameQr; /** @type {?} */ UploadAttachmentComponent.prototype.fileNameLinkQr; /** @type {?} */ UploadAttachmentComponent.prototype.fileNameQrError; /** @type {?} */ UploadAttachmentComponent.prototype.filter; /** @type {?} */ UploadAttachmentComponent.prototype.uploadHeaders; /** @type {?} */ UploadAttachmentComponent.prototype.config; /** @type {?} */ UploadAttachmentComponent.prototype.url; /** @type {?} */ UploadAttachmentComponent.prototype.uploadUrl; /** @type {?} */ UploadAttachmentComponent.prototype.qr; /** @type {?} */ UploadAttachmentComponent.prototype.isLoading; /** @type {?} */ UploadAttachmentComponent.prototype.isDisabled; /** @type {?} */ UploadAttachmentComponent.prototype.createAuthorizationHeader; /** @type {?} */ UploadAttachmentComponent.prototype.beforeUpload; /** @type {?} */ UploadAttachmentComponent.prototype.customReq; /** @type {?} */ UploadAttachmentComponent.prototype.appConfigService; /** @type {?} */ UploadAttachmentComponent.prototype.request; /** @type {?} */ UploadAttachmentComponent.prototype.common; /** @type {?} */ UploadAttachmentComponent.prototype.http; /** @type {?} */ UploadAttachmentComponent.prototype._http; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWF0dGFjaG1lbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vc29jLWFwcC1saWJyYXJ5LyIsInNvdXJjZXMiOlsibGliL3VwbG9hZC1hdHRhY2htZW50L3VwbG9hZC1hdHRhY2htZW50LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxJQUFJLEVBQXFELE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDbkQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxVQUFVLEVBQWEsYUFBYSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFtQixNQUFNLHNCQUFzQixDQUFDO0FBRXBJLE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxNQUFNLE1BQU0sZUFBZSxDQUFDO0FBR25DLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDOztJQXdDeEIsbUNBQW9CLGdCQUFrQyxFQUFVLE9BQWdCLEVBQVMsTUFBYyxFQUFVLElBQWdCLEVBQVMsS0FBVztRQUFySixpQkFLQztRQUxtQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUFTLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBTTswQkFoQzFIO1lBQ3ZCLEVBQUMs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Q0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O1FBSTVCLElBQUcsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUM7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDM0I7S0FDSjs7OztJQUVNLDhDQUFVOzs7O1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFBO1FBRXhCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDOzs7Z0JBaFZqQyxTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IseXpTQUFpRDtpQkFDcEQ7Ozs7Z0JBakJPLGdCQUFnQjtnQkFFaEIsT0FBTztnQkFDUCxNQUFNO2dCQUdOLFVBQVU7Z0JBTFYsSUFBSTs7O3VCQWtCUCxTQUFTLFNBQUMsR0FBRzs2QkFDYixLQUFLOzJCQUtMLEtBQUs7Z0NBQ0wsS0FBSzsyQkFDTCxLQUFLOzBCQUNMLEtBQUs7eUJBQ0wsS0FBSzs0QkFDTCxLQUFLOzJCQUNMLE1BQU07O29DQWhDWDs7U0FtQmEseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FwcENvbmZpZ1NlcnZpY2V9IGZyb20gJy4uL2FwcC1jb25maWcvYXBwLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7SHR0cCwgSGVhZGVycywgUmVzcG9uc2UsIFVSTFNlYXJjaFBhcmFtcywgUmVxdWVzdE9wdGlvbnN9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuaW1wb3J0IHtSZXF1ZXN0fSBmcm9tICcuLi9fc2VydmljZXMvcmVxdWVzdC5zZXJ2aWNlJztcbmltcG9ydCB7Q29tbW9ufSBmcm9tICcuLi9fc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtOZ0Zvcm19IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7VXBsb2FkWEhSQXJnc30gZnJvbSAnbmctem9ycm8tYW50ZCc7XG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBFdmVudCwgSHR0cEV2ZW50VHlwZSwgSHR0cEhlYWRlcnMsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UsSHR0cEVycm9yUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzL1J4JztcbmltcG9ydCB7T2JzZXJ2YWJsZSx0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCBRckNvZGUgZnJvbSAncXJjb2RlLXJlYWRlcic7Ly9saWJzL3FyY29kZVxuLy8gaW1wb3J0IHsgTnpNZXNzYWdlU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvbWVzc2FnZSc7XG5pbXBvcnQgeyBVcGxvYWRGaWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC91cGxvYWQnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3VwbG9hZC1hdHRhY2htZW50JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkLWF0dGFjaG1lbnQuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBVcGxvYWRBdHRhY2htZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBAVmlld0NoaWxkKCdmJykgZm9ybTogTmdGb3JtO1xuICAgIEBJbnB1dCgpIHVwTG9hZFR5cGU6IGFueSA9IFtcbiAgICAgICAge3RpdGxlOiBcIkZpbGVcIiwgdHlwZTogMX0sXG4gICAgICAgIC8vIHt0aXRsZTpcIlNjYW5cIix0eXBlOjJ9LFxuICAgICAgICB7dGl0bGU6IFwiTGlua1wiLCB0eXBlOiAzfSxcbiAgICAgICAge3RpdGxlOiBcIlFSIENvZGVcIiwgdHlwZTogNH1dO1xuICAgIEBJbnB1dCgpIHN5c3RlbUlkOiBhbnkgPSAnMCc7XG4gICAgQElucHV0KCkgUmVsYXRlZEFnZW5jeTogYW55ID0gJ1NPQyc7XG4gICAgQElucHV0KCkgUmVjb3JkSWQ6IGFueSA9ICcwJztcbiAgICBASW5wdXQoKSBTdWJqZWN0OiBhbnkgPSAnLSc7XG4gICAgQElucHV0KCkgVHlwZUlkOiBhbnkgPSAnMCc7XG4gICAgQElucHV0KCkgb25seUltYWdlOiBib29sZWFuID0gZmFsc2U7XG4gICAgQE91dHB1dCgpIHVwbG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIC8vIEBWaWV3Q2hpbGQoJ215TW9kYWwnKSBteU1vZGFsO1xuICAgIGZpbGVMaXN0OiBhbnkgPSBbXTtcbiAgICBmaWxlTmFtZUxpbmsgPSAnJztcbiAgICBmaWxlTmFtZUxpbmtFcnJvciA9ICcnO1xuICAgIFFyQ29kZUZpbGVOYW1lID0gJydcbiAgICBmaWxlTmFtZVFyID0gJyc7XG4gICAgZmlsZU5hbWVMaW5rUXIgPSAnJztcbiAgICBmaWxlTmFtZVFyRXJyb3IgPSAnJztcbiAgICBmaWx0ZXI6IGFueSA9IHt9XG4gICAgdXBsb2FkSGVhZGVyczogYW55ID0ge1xuICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogXCJCYXNpYyBcIiArIGJ0b2EoXCJBUFBTT0M6MTIzNDU2XCIpXG4gICAgfTtcbiAgICAvLyB2YWx1ZTphbnkgPSBbXTtcbiAgICBjb25maWc7XG4gICAgdXJsO1xuICAgIHVwbG9hZFVybDtcbiAgICBxcjtcbiAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICBpc0Rpc2FibGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcENvbmZpZ1NlcnZpY2U6IEFwcENvbmZpZ1NlcnZpY2UsIHByaXZhdGUgcmVxdWVzdDogUmVxdWVzdCwgcHVibGljIGNvbW1vbjogQ29tbW9uLCBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHB1YmxpYyBfaHR0cDogSHR0cCwpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBhcHBDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xuICAgICAgICB0aGlzLnVybCA9IF8uZ2V0KHRoaXMuY29uZmlnLCAnYXBpU2VydmVycy5hbGZyZXNjby51cmwnKSB8fCBcImh0dHBzOi8vcG9ydGFsLXVhdC5zb2MuZ28udGgvYXBpL21mZWMvQWxmcmVzY29cIjtcbiAgICAgICAgdGhpcy51cGxvYWRVcmwgPSBfLmdldCh0aGlzLmNvbmZpZywgJ2FwaVNlcnZlcnMuYWxmcmVzY28udXBsb2FkVXJsJykgfHwgJ2h0dHBzOi8vcG9ydGFsLXVhdC5zb2MuZ28udGgvbWljcm9zZXJ2aWNlLWFwaS9nZW4tcHJvY2Vzc2VkLWZpbGUvdXBsb2FkLWxpbmstc2VydmVyJ1xuICAgICAgICAvLyB8fCBcImh0dHA6Ly8xMjcuMC4wLjE6NTUwMC9taWNyb3NlcnZpY2UtYXBpL2dlbi1wcm9jZXNzZWQtZmlsZS91cGxvYWQtbGluay1zZXJ2ZXJcIjtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Zvcm0nLCB0aGlzLmZvcm0pO1xuICAgICAgICB0aGlzLnFyID0gbmV3IFFyQ29kZSgpO1xuICAgICAgICB0aGlzLnFyLmNhbGxiYWNrID0gKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY2FsbGJhY2snKVxuICAgICAgICAgICAgdGhpcy5maWxlTmFtZVFyRXJyb3IgPSAnJztcbiAgICAgICAgICAgIHZhciBzcGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc3BhbicpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQucmVzdWx0KVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVMaW5rUXIgPSByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZExpbmtRcigpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gc3Bhbi50ZXh0Q29udGVudCA9ICd2aWV3IGNvbnNvbGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3Bhbi50ZXh0Q29udGVudCA9ICdFcnJvciEgU2VlIGVycm9yIG1lc3NhZ2UgaW4gY29uc29sZSEnO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVRckVycm9yID0gdGhpcy5RckNvZGVGaWxlTmFtZVxuICAgICAgICAgICAgICAgIHRoaXMuUXJDb2RlRmlsZU5hbWUgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHByZXZpZXcuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGxvYWRMaW5rUXIoKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5maWxlTmFtZVFyRXJyb3IgPSAnJztcbiAgICAgICAgdGhpcy5faHR0cC5wb3N0KHRoaXMudXBsb2FkVXJsLCB7XG4gICAgICAgICAgICBTeXN0ZW1JZDogJycgKyB0aGlzLnN5c3RlbUlkLFxuICAgICAgICAgICAgUmVsYXRlZEFnZW5jeTogdGhpcy5SZWxhdGVkQWdlbmN5LFxuICAgICAgICAgICAgUmVjb3JkSWQ6IHRoaXMuUmVjb3JkSWQsXG4gICAgICAgICAgICBTdWJqZWN0OiB0aGlzLlN1YmplY3QsXG4gICAgICAgICAgICBUeXBlSWQ6IHRoaXMuVHlwZUlkLFxuICAgICAgICAgICAgbGluazogdGhpcy5maWxlTmFtZUxpbmtRclxuICAgICAgICB9KS5tYXAoKHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcblxuICAgICAgICAgICAgaWYgKHJlcy5yZXN1bHRDb2RlID09PSAyMDAwMCAmJiByZXMuZGF0YSAmJiByZXMuZGF0YS5maWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZUxpbmtRciA9ICcnO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Rpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Jlcy5kYXRhJywgcmVzLmRhdGEuZmlsZSlcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lUXIgPSByZXMuZGF0YS5maWxlLmZpbGVOYW1lXG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZC5lbWl0KHJlcy5kYXRhLmZpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVMaW5rID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZUxpbmtFcnJvciA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lUXJFcnJvciA9IHRoaXMuZmlsZU5hbWVMaW5rUXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRlZC5lbWl0KHt9KTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVRckVycm9yID0gdGhpcy5maWxlTmFtZUxpbmtRclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIGJ0blVwbG9hZCgpIHtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmZpbGVOYW1lTGlua0Vycm9yID0gJyc7XG4gICAgICAgIHRoaXMuX2h0dHAucG9zdCh0aGlzLnVwbG9hZFVybCwge1xuICAgICAgICAgICAgU3lzdGVtSWQ6ICcnICsgdGhpcy5zeXN0ZW1JZCxcbiAgICAgICAgICAgIFJlbGF0ZWRBZ2VuY3k6IHRoaXMuUmVsYXRlZEFnZW5jeSxcbiAgICAgICAgICAgIFJlY29yZElkOiB0aGlzLlJlY29yZElkLFxuICAgICAgICAgICAgU3ViamVjdDogdGhpcy5TdWJqZWN0LFxuICAgICAgICAgICAgVHlwZUlkOiB0aGlzLlR5cGVJZCxcbiAgICAgICAgICAgIGxpbms6IHRoaXMuZmlsdGVyLmxpbmtcbiAgICAgICAgfSkubWFwKChyZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC50b1Byb21pc2UoKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXG5cbiAgICAgICAgICAgIGlmIChyZXMucmVzdWx0Q29kZSA9PT0gMjAwMDAgJiYgcmVzLmRhdGEgJiYgcmVzLmRhdGEuZmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyID0ge307XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygncmVzLmRhdGEnLCByZXMuZGF0YS5maWxlKVxuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVMaW5rID0gcmVzLmRhdGEuZmlsZS5maWxlTmFtZVxuICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWQuZW1pdChyZXMuZGF0YS5maWxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLlFyQ29kZUZpbGVOYW1lID0gJydcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lUXIgPSAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lTGlua1FyID0gJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVFyRXJyb3IgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZUxpbmtFcnJvciA9IHRoaXMuZmlsdGVyLmxpbmtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRlZC5lbWl0KHt9KTtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVMaW5rRXJyb3IgPSB0aGlzLmZpbHRlci5saW5rXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgICAgIH0pXG5cbiAgICB9XG5cbiAgICBvblFyQ29kZUNoYW5nZSgpIHtcbiAgICAgICAgbGV0IGZ1bGxQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkJylbJ3ZhbHVlJ107XG4gICAgICAgIGlmIChmdWxsUGF0aCkge1xuICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAoZnVsbFBhdGguaW5kZXhPZignXFxcXCcpID49IDAgPyBmdWxsUGF0aC5sYXN0SW5kZXhPZignXFxcXCcpIDogZnVsbFBhdGgubGFzdEluZGV4T2YoJy8nKSk7XG4gICAgICAgICAgICB2YXIgZmlsZW5hbWUgPSBmdWxsUGF0aC5zdWJzdHJpbmcoc3RhcnRJbmRleCk7XG4gICAgICAgICAgICBpZiAoZmlsZW5hbWUuaW5kZXhPZignXFxcXCcpID09PSAwIHx8IGZpbGVuYW1lLmluZGV4T2YoJy8nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLlFyQ29kZUZpbGVOYW1lID0gZmlsZW5hbWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuUXJDb2RlRmlsZU5hbWUgPSAnJ1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsZU5hbWVMaW5rUXIgPSAnJztcblxuICAgICAgICB2YXIgdXBsb2FkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkJyk7XG4gICAgICAgIHZhciBwcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXcnKTtcblxuICAgICAgICBsZXQgZmlsZXNfID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZpbGUtdXBsb2FkJylbJ2ZpbGVzJ107XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdmaWxlc18nLGZpbGVzXylcbiAgICAgICAgaWYgKGZpbGVzXylcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXNfLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc19baV07XG4gICAgICAgICAgICAgICAgdmFyIGltYWdlVHlwZSA9IC9eaW1hZ2VcXC8vO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFpbWFnZVR5cGUudGVzdChmaWxlLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUXJDb2RlRmlsZU5hbWUgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlTmFtZVFyRXJyb3IgPSAnRmlsZSB0eXBlIG5vdCB2YWxpZCc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGaWxlIHR5cGUgbm90IHZhbGlkJylcbiAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgIC8vIFJlYWQgZmlsZVxuICAgICAgICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICByZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTaG93IGFzIHByZXZpZXcgaW1hZ2VcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgaW1nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW1nJykgfHwgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgaW1nLnNyYyA9IHRoaXMucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpZXcuYXBwZW5kQ2hpbGQoaW1nKTtcblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEFuYWx5c2UgY29kZVxuICAgICAgICAgICAgICAgICAgICAgIHNlbGYucXIuZGVjb2RlKHRoaXMucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgIH0uYmluZChyZWFkZXIpLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJvblFyQ29kZUNoYW5nZVwiLGpzcXJjb2RlKVxuICAgIH1cblxuXG4gICAgb25VcGxvYWRlZChmaWxlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZmlsZVwiLCBmaWxlKTtcbiAgICAgICAgbGV0IHJlcyA9IEpTT04ucGFyc2UoZmlsZS5yZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy51cGxvYWRlZC5lbWl0KHJlcyk7XG4gICAgfVxuXG4gICAgb25TZWxlY3RlZChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZVwiLCBlKTtcbiAgICAgICAgY29uc29sZS5sb2coJ2Zvcm0nLCB0aGlzLmZvcm0pO1xuICAgICAgICB0aGlzLmZvcm0ubmdTdWJtaXQuZW1pdCgpO1xuICAgIH1cblxuICAgIGNyZWF0ZUF1dGhvcml6YXRpb25IZWFkZXIgPSAoaGVhZGVyczogSHR0cEhlYWRlcnMpID0+IHtcbiAgICB9XG5cbiAgICBiZWZvcmVVcGxvYWQgPSAoZmlsZTphbnksIF9maWxlTGlzdDphbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICAgICAgbGV0IHdoaXRlbGlzdCA9IFtcbiAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAgICAgICAgICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsXG4gICAgICAgICAgICAgICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLFxuICAgICAgICAgICAgICAnYXBwbGljYXRpb24vdm5kLm1zZXhjZWwnLFxuICAgICAgICAgICAgICAnYXBwbGljYXRpb24vY3N2JyxcbiAgICAgICAgICAgICAgJ3RleHQvY3N2JyxcbiAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL21zd29yZCcsXG4gICAgICAgICAgICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcsXG4gICAgICAgICAgICAgICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsXG4gICAgICAgICAgICAgICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwuc2xpZGVzaG93JyxcbiAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nLFxuICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICd0ZXh0L2NvbW1hLXNlcGFyYXRlZC12YWx1ZXMnLFxuICAgICAgICAgICAgICAndGV4dC9hbnl0ZXh0JyxcbiAgICAgICAgICAgICAgJ2ltYWdlL3BuZycsXG4gICAgICAgICAgICAgICdpbWFnZS9qcGVnJyxcbiAgICAgICAgICAgICAgJ2ltYWdlL2dpZicsXG4gICAgICAgICAgICAgICdpbWFnZS9ibXAnXG5cbiAgICAgICAgICAgIF07XG4gICAgICAgICAgY29uc3QgaXNXaGl0ZWxpc3QgPSAoZmlsZSAmJiB3aGl0ZWxpc3QuaW5kZXhPZihmaWxlLnR5cGUpID4gLTEpXG4gICAgICAgICAgaWYoIWlzV2hpdGVsaXN0KXtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlTGlzdCA9IFsge1xuICAgICAgICAgICAgICAgICAgICAgIHVpZDogJzk5OScsXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+C4quC4suC4oeC4suC4o+C4luC4reC4seC4nuC5guC4q+C4peC4lOC5hOC4lOC5ieC5gOC4ieC4nuC4suC4sOC5hOC4n+C4peC5jCAgcGRmICwgcG5nICAsIGpwZWcgICxnaWYgLCB0ZXh0ICwgd29yZCAsIGV4Y2VsICwgcG93ZXJwb2ludCcsXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiAn4Liq4Liy4Lih4Liy4Lij4LiW4Lit4Lix4Lie4LmC4Lir4Lil4LiU4LmE4LiU4LmJ4LmA4LiJ4Lie4Liy4Liw4LmE4Lif4Lil4LmMICBwZGYgLCBwbmcgICwganBlZyAgLGdpZiAsIHRleHQgLCB3b3JkICwgZXhjZWwgLCBwb3dlcnBvaW50JyxcbiAgICAgICAgICAgICAgICAgICAgICB1cmw6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaXNMdDMwTSA9IGZpbGUuc2l6ZSEgLyAxMDI0IC8gMTAyNCA8IDMwO1xuICAgICAgICAgIGlmICghaXNMdDMwTSkge1xuICAgICAgICAgICAgdGhpcy5maWxlTGlzdCA9IFsge1xuICAgICAgICAgICAgICAgICAgdWlkOiAnOTk5JyxcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdGaWxlIG11c3Qgc21hbGxlciB0aGFuIDMwTUIhJyxcbiAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiAnRmlsZSBtdXN0IHNtYWxsZXIgdGhhbiAzME1CIScsXG4gICAgICAgICAgICAgICAgICB1cmw6IG51bGxcbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGlzV2hpdGVsaXN0ICYmIGlzTHQzME0pO1xuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgIGN1c3RvbVJlcSA9IChpdGVtOiBVcGxvYWRYSFJBcmdzKSA9PiB7XG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ0ZpbGVEYXRhJywgaXRlbS5maWxlIGFzIGFueSk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnU3lzdGVtSWQnLCAnJyArIHRoaXMuc3lzdGVtSWQpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ1JlbGF0ZWRBZ2VuY3knLCB0aGlzLlJlbGF0ZWRBZ2VuY3kpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ1JlY29yZElkJywgdGhpcy5SZWNvcmRJZCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnU3ViamVjdCcsIHRoaXMuU3ViamVjdCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnVHlwZUlkJywgdGhpcy5UeXBlSWQpO1xuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGJ0b2EoJ0FQUFNPQzoxMjM0NTYnKSk7XG4gICAgICAgIGxldCByZXEgPSBuZXcgSHR0cFJlcXVlc3QoJ1BPU1QnLCBpdGVtLmFjdGlvbiwgZm9ybURhdGEsIHtcbiAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiB0cnVlLFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVyc1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmVxLmhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBidG9hKCdBUFBTT0M6MTIzNDU2JykpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmVxKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoZXZlbnQ6IEh0dHBFdmVudDx7fT4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudG90YWwgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQgYXMgYW55KS5wZXJjZW50ID0gZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWwgKiAxMDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJvblByb2dyZXNzXCIsIGV2ZW50ICwgdGhpcy5maWxlTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ub25Qcm9ncmVzcyhldmVudCwgaXRlbS5maWxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXZlbnQuYm9keVwiLCBldmVudC5ib2R5ICwgdGhpcy5maWxlTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZmlsZUxpc3QgJiYgdGhpcy5maWxlTGlzdC5sZW5ndGggPiAxKXtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVMaXN0ID0gW3RoaXMuZmlsZUxpc3RbdGhpcy5maWxlTGlzdC5sZW5ndGgtMV1dXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHJlcyA9IEpTT04ucGFyc2UoZXZlbnQuYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNEaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkLmVtaXQoZXZlbnQuYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0ub25TdWNjZXNzKGV2ZW50LmJvZHksIGl0ZW0uZmlsZSwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcblxuICAgICAgICAgICAgICAgIGl0ZW0ub25FcnJvcihlcnIsIGl0ZW0uZmlsZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZShkYXRhKSB7XG4gICAgICAgIGRhdGEuZmlsZUxpc3QgPSBbZGF0YS5maWxlXTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm9uQ2hhbmdlXCIsZGF0YSk7XG5cbiAgICAgICAgaWYoZGF0YS5maWxlTGlzdCA9PT0gMCl7XG4gICAgICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhclZhbHVlKCkge1xuICAgICAgICB0aGlzLmlzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc29sZS5sb2coXCJjbGVhclZhbHVlXCIpXG4gICAgICAgIHRoaXMuZmlsZUxpc3QgPSBbXTtcbiAgICAgICAgdGhpcy5maWxlTmFtZUxpbmsgPSAnJztcbiAgICAgICAgdGhpcy5maWxlTmFtZUxpbmtFcnJvciA9ICcnO1xuICAgICAgICB0aGlzLlFyQ29kZUZpbGVOYW1lID0gJydcblxuICAgICAgICB0aGlzLmZpbGVOYW1lUXIgPSAnJztcbiAgICAgICAgdGhpcy5maWxlTmFtZUxpbmtRciA9ICcnO1xuICAgICAgICB0aGlzLmZpbGVOYW1lUXJFcnJvciA9ICcnO1xuICAgIH1cbn1cbiJdfQ==