tnx-shared 5.3.159 → 5.3.160

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.
@@ -2200,7 +2200,7 @@ export class CrudFormComponent extends ComponentBase {
2200
2200
  CrudFormComponent.decorators = [
2201
2201
  { type: Component, args: [{
2202
2202
  selector: 'crud-form',
2203
- template: "<div [class]=\"_styleClass\">\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\n (keydown.shift.tab)=\"preventBlur($event)\">\n <div class=\"p-grid p-col-12\" [class.grid]=\"useGridTemplate\" style=\"margin: 0\">\n <ng-container *ngFor=\"let control of setting.schema\">\n <ng-container *ngTemplateOutlet=\"customControl; context: {\n control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel,\n mdWidth: control.mdWidth, rowSpan: control.rowSpan\n }\">\n </ng-container>\n </ng-container>\n </div>\n </form>\n</div>\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\n</p-contextMenu>\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\n let-rowSpan=\"rowSpan\" let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} row-span-{{rowSpan}} {{control.class}} crud-form-control type-{{control.dataType}}\"\n [class.error]=\"data._errors[control.field].length > 0\"\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\n <div class=\"label\" *ngIf=\"showLabel\">\n <label *ngIf=\"control.label && !control.isHtmlLabel\" [pTooltip]=\"control.fullLabel\"\n tooltipPosition=\"top\">{{control.label}}\n <span *ngIf=\"control.required || control.showIconRequired\" class=\"star-required\">*</span>\n </label>\n <ng-container *ngIf=\"control.label && control.isHtmlLabel\">\n <label [innerHTML]=\"control.label | safeHtml\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">\n </label>\n <span *ngIf=\"control.required || control.showIconRequired\" class=\"star-required\">*</span>\n </ng-container>\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\n </div>\n <ng-container [ngSwitch]=\"control.controlType\">\n <ng-container *ngSwitchCase=\"'label'\">\n <ng-container [ngTemplateOutlet]=\"labelControl\"\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'title'\">\n <label *ngIf=\"!control.isHtml\" [for]=\"control.for\">{{control.text | translate}}</label>\n <label *ngIf=\"control.isHtml\" [innerHTML]=\"control.text | safeHtml\"></label>\n </ng-container>\n <ng-container *ngSwitchCase=\"'text'\">\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\n <input [placeholder]=\"control.placeholder\"\n [required]=\"control.validators && control.validators.required\"\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText\n [type]=\"control.dataFormat\" [max]=\"control.max\" [min]=\"control.min\"\n [maxlength]=\"control.maxLength\" [(ngModel)]=\"data[control.field]\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (key.enter)=\"handleFieldValueChange(control, $event, eventType.ENTER, data, parentPath)\" />\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\n </div>\n <input *ngIf=\"!control.suffFix\" [placeholder]=\"control.placeholder\"\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText [type]=\"control.dataFormat\"\n [max]=\"control.max\" [min]=\"control.min\" [maxlength]=\"control.maxLength\"\n [(ngModel)]=\"data[control.field]\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (key.enter)=\"handleFieldValueChange(control, $event, eventType.ENTER, data, parentPath)\" />\n </ng-container>\n <ng-container *ngSwitchCase=\"'reference-text'\">\n <reference-textbox [control]=\"control\" [value]=\"data[control.field]\" [dataSource]=\"control.dataSource\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"></reference-textbox>\n </ng-container>\n <ng-container *ngSwitchCase=\"'template'\">\n <ng-container [ngTemplateOutlet]=\"control.template\"\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'content'\">\n <div class=\"control-content\">\n <span [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\n </span>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'mask'\">\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\n [maskType]=\"control.maskType\" [autoFormat]=\"control.autoFormat\" [min]=\"control.min\"\n [max]=\"control.max\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-mask>\n </ng-container>\n <ng-container *ngSwitchCase=\"'numberrange'\">\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\" [min]=\"control.min\"\n [max]=\"control.max\" [placeholder]=\"control.placeholder\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (blur)=\"handleFieldValueChange(control, $event, eventType.BLUR, data, parentPath)\">\n </tn-number-picker-range>\n </ng-container>\n <ng-container *ngSwitchCase=\"'money'\">\n <input currencyMask [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\n [(ngModel)]=\"data[control.field]\"\n (ngModelChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\" />\n </ng-container>\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\n [(ngModel)]=\"data[control.field]\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\" />\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea pInputTextarea [rows]=\"control.rows ? control.rows : 5\"\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" [(ngModel)]=\"data[control.field]\"\n [placeholder]=\"control.placeholder\" \n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'editor'\">\n <tn-tinymce *ngIf=\"!checkDisabled(data, control)\"\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\n [placeholder]=\"control.placeholder\" [height]=\"control.height ? control.height : 250\"\n [languageCode]=\"control.languageCode\"\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-tinymce>\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <datetime-picker [disabled]=\"checkDisabled(data, control)\" [control]=\"control\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </datetime-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'autocomplete'\">\n <app-autocomplete-datasource [control]=\"control\"\n [suggestions]=\"data._source[control.field] || control.dataSource\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onValueChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </app-autocomplete-datasource>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetimerange'\">\n <tn-datetime-picker-range [disabled]=\"control.disabled\" [control]=\"control\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-datetime-picker-range>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\" [data]=\"data\"\n [(value)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleChangeDropdown(control, $event, eventType.CHANGE, data, parentPath)\"\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, eventType.HIDE, data, parentPath)\"\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\n </dropdown>\n </ng-container>\n <ng-container *ngSwitchCase=\"'imageuploader'\">\n <app-image-uploader [loadByEntityKey]=\"control.loadByEntityKey\" [entityKey]=\"control.entityKey\"\n [defaultNoImageUrl]=\"'/assets/images/no-image.jpg'\" [multiple]=\"control.multiple\"\n [disabled]=\"control.disabled\" [isAvatar]=\"control.isAvatar\" [(ngModel)]=\"data[control.field]\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\">\n <ng-template *ngIf=\"control.templateItems\" #items let-files>\n <ng-container *ngTemplateOutlet=\"control.templateItems; context: {\n $implicit: files\n }\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"control.templateItem\" #item let-file>\n <ng-container *ngTemplateOutlet=\"control.templateItem; context: {\n $implicit: file\n }\"></ng-container>\n </ng-template>\n </app-image-uploader>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fileManager'\">\n <file-manager *ngIf=\"control.entityKey || data[control.entityKeyField] || control.rootFolderId\"\n [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\n [readonly]=\"control.disabled\" [layout]=\"control.layout\" [rootFolderId]=\"control.rootFolderId\"\n [maxFileSize]=\"control.maxFileSize\" [inTaiLieu]=\"control.inTaiLieu\"\n [inTaiLieuChung]=\"control.inTaiLieuChung\" [copyToFolderId]=\"control.copyToFolderId\"\n [filePickerSetting]=\"control.filePickerSetting\" [dataForm]=\"data\"\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [parentSetting]=\"setting\"\n [(value)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onSelected)=\"control.onSelected($event)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\n </file-manager>\n </ng-container>\n <span *ngSwitchCase=\"'fileUpload'\">\n <file-upload [sharedFolderType]=\"control.sharedFolderType\" [maxFileSize]=\"control.maxFileSize\"\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [control]=\"control\"\n [showDeleteFile]=\"control.showDeleteFile\" [readonly]=\"control.readonly\" [accept]=\"control.accept\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </file-upload>\n </span>\n <span *ngSwitchCase=\"'serviceFileUpload'\">\n <service-file-upload *ngIf=\"control.entityKey || data[control.entityKeyField] || control.rootFolderId\"\n [parentContext]=\"context\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\n [control]=\"control\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onRemove)=\"handleFieldValueChange(control, $event, eventType.DELETED, data, parentPath)\">\n </service-file-upload>\n </span>\n <ng-container *ngSwitchCase=\"'user-picker'\">\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [readOnlyValues]=\"data[control.field + '_readOnly']\" [multiple]=\"control.multiple\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\n </user-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'switch'\">\n <p-inputSwitch [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </p-inputSwitch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <div [class]=\"control.class\" role=\"checkbox-alone\">\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [binary]=\"true\"\n [label]=\"control.isCustomLabel ? control.displayLabel : (!control.hiddenLabel ? control.label : null)\"\n [(ngModel)]=\"data[control.field]\"\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </p-checkbox>\n <!-- <tn-checkbox [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [(ngModel)]=\"data[control.field]\"\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></tn-checkbox> -->\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'button'\">\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\n [label]=\"control.buttonText | translate\" [ngStyle]=\"control.btStyle\" [pTooltip]=\"control.fullLabel\"\n tooltipPosition=\"top\" (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\n </ng-container>\n <ng-container *ngSwitchCase=\"'container'\">\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\n <ng-container *ngFor=\"let subControl of control.controls\">\n <ng-container *ngTemplateOutlet=\"customControl; context: {\n control: subControl,\n data: data[control.field],\n parentPath: path,\n rowIndex: rowIndex,\n path: path + '.' + subControl.field,\n showLabel: subControl.showLabel,\n mdWidth: subControl.mdWidth,\n rowSpan: subControl.rowSpan\n }\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\n </check-box-list>\n </ng-container>\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\n </radio-button-list>\n </ng-container>\n <ng-container *ngSwitchCase=\"'colorPicker'\">\n <tn-color-picker [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-color-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spanControl'\">\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'colorControl'\">\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'address'\">\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\n </address-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\n </autocomplete-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </cocautochuc-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\n </cocautochuc-picker-list>\n </ng-container>\n <ng-container *ngSwitchCase=\"'cocautochuc-picker-new'\">\n <cocautochuc-picker-list-new [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\n </cocautochuc-picker-list-new>\n </ng-container>\n <ng-container *ngSwitchCase=\"'vanban'\">\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnly]=\"control.readOnly\" [loaiVanBan]=\"control.loaiVanBan\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </vanban-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'congviec'\">\n <div>\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </congviec-picker>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'percent'\">\n <div>\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\"\n [autoFormat]=\"control.autoFormat\" [min]=\"0\" [max]=\"100\"\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-mask>\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\n [(ngModel)]=\"data[control.field]\"\n (onSlideEnd)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </p-slider>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'chips'\">\n <p-chips [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onAdd)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onRemove)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></p-chips>\n </ng-container>\n <ng-container *ngSwitchCase=\"'entity-picker'\">\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnly]=\"control.readOnly\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </entity-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'table'\">\n <div [class]=\"control.class\">\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\n <p-table class=\"new-table scr-table table-control\" [value]=\"data[control.field]\"\n [columns]=\"control.headerTemplate\" [responsive]=\"true\" [scrollable]=\"false\"\n [rowTrackBy]=\"trackByFuncId\"\n (onRowReorder)=\"handleRowOrdered(control, $event, eventType.ROW_REORDER, data, parentPath)\">\n <ng-template pTemplate=\"colgroup\">\n <colgroup>\n <col *ngIf=\"control.showNumber\" style=\"width: 40px\" />\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\n <col *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\n [style.width]=\"subControl.width\" />\n </ng-container>\n <col *ngIf=\"control.enableReorderRow\" style=\"width: 30px\" />\n <col *ngIf=\"control.showFunction\" [style.width]=\"control.widthFunctionColumn\" />\n </colgroup>\n </ng-template>\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\n pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\n pTemplate=\"header\" let-rowData let-columns>\n <tr>\n <th *ngIf=\"control.showNumber\" class=\"th-sticky stt\">\n {{ 'TT' |translate}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\n [width]=\"subControl.width\"\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\n style=\"text-align: center;\">\n {{subControl.label}}\n <span *ngIf=\"subControl.required\" class=\"star-required\">*</span>\n <span *ngIf=\"subControl.description\"\n class=\"subControl-description\">({{subControl.description}})</span>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"control.enableReorderRow\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"control.showFunction\" class=\"table-function column-function\">\n <div class=\"cell-header-function\"><span>Ch\u1EE9c n\u0103ng</span></div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\n <tr [pReorderableRow]=\"ri\" [class]=\"rowData.class\"\n (click)=\"handleRowClick(rowData, control)\">\n <td *ngIf=\"control.showNumber\" class=\"stt th-sticky\"\n style=\"text-align: center; vertical-align: inherit\">\n <span>\n {{ri + 1}}\n </span>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\n [class.control-inside]=\"true\" [class]=\"subControl.class\"\n [ngStyle]=\"{'text-align': getTextAlign(subControl.textAlign), 'vertical-align': 'inherit'}\">\n <span class=\"p-column-title\">{{subControl.label}}</span>\n <ng-template [ngIf]=\"getControlType(subControl) != 'column'\">\n <ng-container *ngTemplateOutlet=\"customControl; context: {\n control: subControl,\n data: rowData,\n index: ri,\n tablePath: path,\n parentPath: path + '[' + ri + ']',\n path: path + '[' + ri + '].' + subControl.field,\n showLabel: false,\n mdWidth: 12,\n rowSpan: 1\n }\">\n </ng-container>\n </ng-template>\n <ng-template [ngIf]=\"getControlType(subControl) == 'column'\">\n <span>{{_modelData[control.field][ri][subControl.field]}}</span>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\n pReorderableRowHandle></i>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <td *ngIf=\"control.showFunction\" style=\"text-align: center\"\n class=\"column-function text-center\">\n <div *ngIf=\"!control.rowButtonTemplate\"\n class=\"p-toolbar-group-center button-group\">\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\n icon=\"pi pi-save\" [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\n (click)=\"saveRow(ri, control, path)\"></button>\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\n icon=\"pi pi-pencil\" [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\n (click)=\"editRow(ri, control, path)\"></button>\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\n type=\"button\" pButton\n class=\"p-button-text p-button-danger p-button-rounded\"\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\n (click)=\"deleteRow(ri, control, path)\"></button>\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\n icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-rounded\"\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\n (click)=\"showContextMenu($event, rowData, control)\"></button>\n </div>\n <div *ngIf=\"control.rowButtonTemplate\"\n class=\"p-toolbar-group-center button-group\">\n <ng-container\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: _modelData[control.field][ri], rowIndex: ri, path: path, control: control}\">\n </ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </tr>\n </ng-template>\n <ng-template *ngIf=\"control.summaryTemplate\" pTemplate=\"summary\" let-rowData>\n <ng-container *ngTemplateOutlet=\"control.summaryTemplate; context: {rowData: rowData}\">\n </ng-container>\n </ng-template>\n </p-table>\n </tn-custom-scrollbar>\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\n <span *ngIf=\"control.showDialog\" style=\"font-weight: normal;\">\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\n </p-checkbox>\n </span>\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\n (click)=\"messageRow( -1, control, path)\"></button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"control.template\">\n <ng-container [ngTemplateOutlet]=\"control.template\" [ngTemplateOutletContext]=\"{\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\n }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!control.template\" [ngTemplateOutlet]=\"getComponentByType(control.field)\"\n [ngTemplateOutletContext]=\"{\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\n }\">\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\n </ng-container>\n <div *ngIf=\"control.message\" class=\"control-message\">\n <span [class]=\"control.messageClass\">{{control.message}}</span>\n </div>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #validation let-control=\"control\" let-data=\"data\">\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\n <div class=\"error-container\">\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\n <div class=\"error-item\" *ngIf=\"error\">\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n</ng-template>\n<ng-template #errorMessage let-content=\"content\">\n <div class=\"error-content\">\n <i class=\"pi pi-ban\"></i>\n <span> {{content}}</span>\n </div>\n</ng-template>\n<ng-template #labelControl let-control=\"control\">\n <ng-container>\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.isHtml\" [attr.label-index]=\"control.indexLabel\"\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\n [for]=\"control.for\">{{control.text | translate}}</label>\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.isHtml\" [innerHTML]=\"control.text | safeHtml\"\n [attr.label-index]=\"control.indexLabel\"></label>\n </ng-container>\n</ng-template>\n<ng-template #containerSticky>\n <span class=\"fix-sticky top\"></span>\n <span class=\"fix-sticky right\"></span>\n <span class=\"fix-sticky left\"></span>\n</ng-template>\n<!-- <ng-template #templateCongViecForm let-control=\"control\">\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\n </base-congviec-form>\n</ng-template> -->\n<tn-dialog *ngIf=\"tableFormDialogModel.showEditForm\" #dialog [styleClass]=\"'address-form'\"\n [header]=\"tableFormDialogModel.header | translate\" [popupSize]=\"tableFormDialogModel.popupSize\"\n (onHide)=\"tableFormDialogModel.showEditForm = false\">\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormDialogModel.data\"\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormDialogModel.showEditForm = false\">\n </table-detail-form>\n</tn-dialog>",
2203
+ template: "<div [class]=\"_styleClass\">\n <form #formElement autocomplete=\"off\" autocorrect=\"off\" spellcheck=\"false\"\n [class]=\"'p-grid form-group crud-form' + (formClass ? ' ' + formClass : '')\"\n (keydown.shift.tab)=\"preventBlur($event)\">\n <div class=\"p-grid p-col-12\" [class.grid]=\"useGridTemplate\" style=\"margin: 0\">\n <ng-container *ngFor=\"let control of setting.schema\">\n <ng-container *ngTemplateOutlet=\"customControl; context: {\n control: control, data: _modelData, parentPath: '', path: control.field, showLabel: control.showLabel,\n mdWidth: control.mdWidth, rowSpan: control.rowSpan\n }\">\n </ng-container>\n </ng-container>\n </div>\n </form>\n</div>\n<p-contextMenu #contextMenu [appendTo]=\"'body'\" [model]=\"buttonContexts\">\n</p-contextMenu>\n<ng-template #customControl let-data=\"data\" let-control=\"control\" let-showLabel=\"showLabel\" let-mdWidth=\"mdWidth\"\n let-rowSpan=\"rowSpan\" let-rowIndex=\"index\" let-path=\"path\" let-parentPath=\"parentPath\" let-tablePath=\"tablePath\">\n <div *ngIf=\"!checkHidden(control, data, path)\" id=\"{{path}}-holder\"\n class=\"p-col-{{control.gWidth}} p-md-{{mdWidth}} row-span-{{rowSpan}} {{control.class}} crud-form-control type-{{control.dataType}}\"\n [class.error]=\"data._errors[control.field].length > 0\"\n [class.not-show-in-box-holder]=\"control.showInBox === false\"\n [class.show-in-box-holder]=\"control.showInBox === true\" [ngStyle]=\"control.style\">\n <div class=\"label\" *ngIf=\"showLabel\">\n <label *ngIf=\"control.label && !control.isHtmlLabel\" [pTooltip]=\"control.fullLabel\"\n tooltipPosition=\"top\">{{control.label}}\n <span *ngIf=\"control.required || control.showIconRequired\" class=\"star-required\">*</span>\n </label>\n <ng-container *ngIf=\"control.label && control.isHtmlLabel\">\n <label [innerHTML]=\"control.label | safeHtml\" [pTooltip]=\"control.fullLabel\" tooltipPosition=\"top\">\n </label>\n <span *ngIf=\"control.required || control.showIconRequired\" class=\"star-required\">*</span>\n </ng-container>\n <span *ngIf=\"control.description\" class=\"control-description\">({{control.description}})</span>\n </div>\n <ng-container [ngSwitch]=\"control.controlType\">\n <ng-container *ngSwitchCase=\"'label'\">\n <ng-container [ngTemplateOutlet]=\"labelControl\"\n [ngTemplateOutletContext]=\"{control: control, data: data}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'title'\">\n <label *ngIf=\"!control.isHtml\" [for]=\"control.for\">{{control.text | translate}}</label>\n <label *ngIf=\"control.isHtml\" [innerHTML]=\"control.text | safeHtml\"></label>\n </ng-container>\n <ng-container *ngSwitchCase=\"'text'\">\n <div class=\"p-inputgroup\" *ngIf=\"control.suffFix\">\n <input [placeholder]=\"control.placeholder\"\n [required]=\"control.validators && control.validators.required\"\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText\n [type]=\"control.dataFormat\" [max]=\"control.max\" [min]=\"control.min\"\n [maxlength]=\"control.maxLength\" [(ngModel)]=\"data[control.field]\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (key.enter)=\"handleFieldValueChange(control, $event, eventType.ENTER, data, parentPath)\" />\n <span class=\"p-inputgroup-addon\">({{control.suffFix}})</span>\n </div>\n <input *ngIf=\"!control.suffFix\" [placeholder]=\"control.placeholder\"\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText [type]=\"control.dataFormat\"\n [max]=\"control.max\" [min]=\"control.min\" [maxlength]=\"control.maxLength\"\n [(ngModel)]=\"data[control.field]\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (key.enter)=\"handleFieldValueChange(control, $event, eventType.ENTER, data, parentPath)\" />\n </ng-container>\n <ng-container *ngSwitchCase=\"'reference-text'\">\n <reference-textbox [control]=\"control\" [value]=\"data[control.field]\" [dataSource]=\"control.dataSource\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"></reference-textbox>\n </ng-container>\n <ng-container *ngSwitchCase=\"'template'\">\n <ng-container [ngTemplateOutlet]=\"control.template\"\n [ngTemplateOutletContext]=\"{$implicit: _rootNode, control: control, data: data, tablePath: tablePath, parentPath: parentPath, rowIndex: rowIndex, funcUpdateModel: updateModelFromExternal}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'content'\">\n <div class=\"control-content\">\n <span [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\n </span>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'mask'\">\n <tn-mask [prefix]=\"control.prefix\" [decimalPlaces]=\"control.decimalPlaces\" [suffix]=\"control.suffix\"\n [placeholder]=\"control.placeholder\" [disabled]=\"checkDisabled(data, control)\"\n [maskType]=\"control.maskType\" [autoFormat]=\"control.autoFormat\" [min]=\"control.min\"\n [max]=\"control.max\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-mask>\n </ng-container>\n <ng-container *ngSwitchCase=\"'numberrange'\">\n <tn-number-picker-range [decimalPlaces]=\"control.decimalPlaces\"\n [disabled]=\"checkDisabled(data, control)\" [maskType]=\"control.maskType\" [min]=\"control.min\"\n [max]=\"control.max\" [placeholder]=\"control.placeholder\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (blur)=\"handleFieldValueChange(control, $event, eventType.BLUR, data, parentPath)\">\n </tn-number-picker-range>\n </ng-container>\n <ng-container *ngSwitchCase=\"'money'\">\n <input currencyMask [attr.disabled]=\"checkDisabled(data, control) ? true : null\" pInputText type=\"tel\"\n [options]=\"{prefix: '', thousands: '.', decimal: ',',precision:control.dataFormat === 'money'?0:0 }\"\n [(ngModel)]=\"data[control.field]\"\n (ngModelChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\" />\n </ng-container>\n <ng-container *ngSwitchCase=\"'phoneOrfax'\">\n <input [placeholder]=\"control.dataFormat==='phone'?'(999) 999-9999':'999-999-9999'\"\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" type=\"tel\" pInputText\n [(ngModel)]=\"data[control.field]\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\" />\n </ng-container>\n <ng-container *ngSwitchCase=\"'textarea'\">\n <textarea pInputTextarea [rows]=\"control.rows ? control.rows : 5\"\n [attr.disabled]=\"checkDisabled(data, control) ? true : null\" [(ngModel)]=\"data[control.field]\"\n [placeholder]=\"control.placeholder\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></textarea>\n </ng-container>\n <ng-container *ngSwitchCase=\"'editor'\">\n <tn-tinymce *ngIf=\"!checkDisabled(data, control)\"\n [required]=\"control.validators && control.validators.required\" [mode]=\"control.mode\"\n [placeholder]=\"control.placeholder\" [height]=\"control.height ? control.height : 250\"\n [languageCode]=\"control.languageCode\"\n [disabled]=\"control.disabled || (control.disableCheck && control.disableCheck(model))\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-tinymce>\n <div *ngIf=\"checkDisabled(data, control)\" class=\"html-box\"\n [innerHTML]=\"data[control.field] ? (data[control.field] | safeHtml) : ''\">\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetime'\">\n <datetime-picker [disabled]=\"checkDisabled(data, control)\" [control]=\"control\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </datetime-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'autocomplete'\">\n <app-autocomplete-datasource [control]=\"control\"\n [suggestions]=\"data._source[control.field] || control.dataSource\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onValueChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </app-autocomplete-datasource>\n </ng-container>\n <ng-container *ngSwitchCase=\"'datetimerange'\">\n <tn-datetime-picker-range [disabled]=\"control.disabled\" [control]=\"control\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-datetime-picker-range>\n </ng-container>\n <ng-container *ngSwitchCase=\"'dropdown'\">\n <dropdown [control]=\"control\" [dataSource]=\"getControlDataSource(control, data)\" [data]=\"data\"\n [(value)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleChangeDropdown(control, $event, eventType.CHANGE, data, parentPath)\"\n (onHideSmartEvent)=\"handleChangeDropdown(control, $event, eventType.HIDE, data, parentPath)\"\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\"\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\n </dropdown>\n </ng-container>\n <ng-container *ngSwitchCase=\"'imageuploader'\">\n <app-image-uploader [loadByEntityKey]=\"control.loadByEntityKey\" [entityKey]=\"control.entityKey\"\n [defaultNoImageUrl]=\"'/assets/images/no-image.jpg'\" [multiple]=\"control.multiple\"\n [disabled]=\"control.disabled\" [isAvatar]=\"control.isAvatar\" [(ngModel)]=\"data[control.field]\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\">\n <ng-template *ngIf=\"control.templateItems\" #items let-files>\n <ng-container *ngTemplateOutlet=\"control.templateItems; context: {\n $implicit: files\n }\"></ng-container>\n </ng-template>\n <ng-template *ngIf=\"control.templateItem\" #item let-file>\n <ng-container *ngTemplateOutlet=\"control.templateItem; context: {\n $implicit: file\n }\"></ng-container>\n </ng-template>\n </app-image-uploader>\n </ng-container>\n <ng-container *ngSwitchCase=\"'fileManager'\">\n <file-manager *ngIf=\"control.entityKey || data[control.entityKeyField] || control.rootFolderId\"\n [control]=\"control\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\n [readonly]=\"control.disabled\" [layout]=\"control.layout\" [rootFolderId]=\"control.rootFolderId\"\n [maxFileSize]=\"control.maxFileSize\" [inTaiLieu]=\"control.inTaiLieu\"\n [inTaiLieuChung]=\"control.inTaiLieuChung\" [copyToFolderId]=\"control.copyToFolderId\"\n [filePickerSetting]=\"control.filePickerSetting\" [dataForm]=\"data\"\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [parentSetting]=\"setting\"\n [(value)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onSelected)=\"control.onSelected($event)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\n </file-manager>\n </ng-container>\n <span *ngSwitchCase=\"'fileUpload'\">\n <file-upload [sharedFolderType]=\"control.sharedFolderType\" [maxFileSize]=\"control.maxFileSize\"\n [invalidFileSizeMessageSummary]=\"control.invalidFileSizeMessageSummary\"\n [invalidFileSizeMessageDetail]=\"control.invalidFileSizeMessageDetail\"\n [invalidFileTypeMessageSummary]=\"control.invalidFileTypeMessageSummary\"\n [invalidFileTypeMessageDetail]=\"control.invalidFileTypeMessageDetail\"\n [invalidFileLimitMessageSummary]=\"control.invalidFileLimitMessageSummary\"\n [invalidFileLimitMessageDetail]=\"control.invalidFileLimitMessageDetail\" [control]=\"control\"\n [showDeleteFile]=\"control.showDeleteFile\" [readonly]=\"control.readonly\" [accept]=\"control.accept\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onRemove)=\"handleFieldValueChange(control, $event, eventType.DELETED, data, parentPath)\">\n </file-upload>\n </span>\n <span *ngSwitchCase=\"'serviceFileUpload'\">\n <service-file-upload *ngIf=\"control.entityKey || data[control.entityKeyField] || control.rootFolderId\"\n [parentContext]=\"context\" [serviceCode]=\"control.serviceCode\" [entity]=\"control.entity\"\n [entityKey]=\"control.entityKey ? control.entityKey : data[control.entityKeyField]\"\n [control]=\"control\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onRemove)=\"handleFieldValueChange(control, $event, eventType.DELETED, data, parentPath)\">\n </service-file-upload>\n </span>\n <ng-container *ngSwitchCase=\"'user-picker'\">\n <user-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [readOnlyValues]=\"data[control.field + '_readOnly']\" [multiple]=\"control.multiple\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\n </user-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'switch'\">\n <p-inputSwitch [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </p-inputSwitch>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <div [class]=\"control.class\" role=\"checkbox-alone\">\n <p-checkbox [disabled]=\"checkDisabled(data, control)\" [binary]=\"true\"\n [label]=\"control.isCustomLabel ? control.displayLabel : (!control.hiddenLabel ? control.label : null)\"\n [(ngModel)]=\"data[control.field]\"\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </p-checkbox>\n <!-- <tn-checkbox [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [(ngModel)]=\"data[control.field]\"\n (onChange)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></tn-checkbox> -->\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'button'\">\n <button type=\"button\" pButton [class]=\"control.btClass\" [icon]=\"control.icon\"\n [label]=\"control.buttonText | translate\" [ngStyle]=\"control.btStyle\" [pTooltip]=\"control.fullLabel\"\n tooltipPosition=\"top\" (click)=\"handleButtonClick(control, $event, parentPath)\"></button>\n </ng-container>\n <ng-container *ngSwitchCase=\"'container'\">\n <div class=\"p-grid p-col-12\" style=\"margin: 0\" [class.not-show-in-box]=\"!control.showInBox\"\n [class.show-in-box]=\"control.showInBox\" [ngStyle]=\"control.boxStyle\">\n <ng-container *ngFor=\"let subControl of control.controls\">\n <ng-container *ngTemplateOutlet=\"customControl; context: {\n control: subControl,\n data: data[control.field],\n parentPath: path,\n rowIndex: rowIndex,\n path: path + '.' + subControl.field,\n showLabel: subControl.showLabel,\n mdWidth: subControl.mdWidth,\n rowSpan: subControl.rowSpan\n }\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'checkboxlist'\">\n <check-box-list [control]=\"control\" [dataSource]=\"data._source[control.field] || control.dataSource\"\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\n </check-box-list>\n </ng-container>\n <ng-container *ngSwitchCase=\"'radiobuttonlist'\">\n <radio-button-list [control]=\"control\" [dataSource]=\"control.dataSource\"\n [disabled]=\"checkDisabled(data, control)\" [(value)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (adjustValue)=\"handleAdjustValueDropdownEvent(control, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\"\n (onDataSourceLoaded)=\"handleDataSourceLoaded(control, parentPath, $event)\">\n </radio-button-list>\n </ng-container>\n <ng-container *ngSwitchCase=\"'colorPicker'\">\n <tn-color-picker [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (change)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-color-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spanControl'\">\n <span *ngIf=\"!control.ishtml\">{{data[control.field]}}</span>\n <span *ngIf=\"control.ishtml\" [innerHTML]=\"data[control.field]\"></span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'colorControl'\">\n <span class=\"show-color-control\" [ngStyle]=\"{ backgroundColor: data[control.sourceField]}\"></span>\n </ng-container>\n <ng-container *ngSwitchCase=\"'address'\">\n <address-picker [control]=\"control\" [showSubLabel]=\"control.showSubLabel\"\n [disabled]=\"checkDisabled(data, control)\" [(data)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onSelect)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleControlReadyEvent(control, parentPath)\">\n </address-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'autocomplete-picker'\">\n <autocomplete-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\n </autocomplete-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'cocautochuc'\">\n <cocautochuc-picker [control]=\"control\" [parentOrgId]=\"control.parentOrgId\"\n [disabled]=\"checkDisabled(data, control)\" [parentOrgCode]=\"control.parentOrgCode\"\n [filter]=\"control.filter\" [multiple]=\"control.multiple\" [required]=\"control.required\"\n [isUsingId]=\"control.isUsingId\" [disabledParentItem]=\"control.disabledParentItem\"\n [rootParentId]=\"control.rootParentId\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </cocautochuc-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'cocautochuc-picker'\">\n <cocautochuc-picker-list [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\n </cocautochuc-picker-list>\n </ng-container>\n <ng-container *ngSwitchCase=\"'cocautochuc-picker-new'\">\n <cocautochuc-picker-list-new [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnlyValues]=\"data[control.field + '_readOnly']\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onReady)=\"handleReadyControlPicker(control, parentPath)\">\n </cocautochuc-picker-list-new>\n </ng-container>\n <ng-container *ngSwitchCase=\"'vanban'\">\n <vanban-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnly]=\"control.readOnly\" [loaiVanBan]=\"control.loaiVanBan\"\n [(ngModel)]=\"data[control.field]\" (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </vanban-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'congviec'\">\n <div>\n <congviec-picker [control]=\"control\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </congviec-picker>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'percent'\">\n <div>\n <tn-mask [suffix]=\"'%'\" [placeholder]=\"control.placeholder\" [maskType]=\"'int'\"\n [autoFormat]=\"control.autoFormat\" [min]=\"0\" [max]=\"100\"\n [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </tn-mask>\n <p-slider [step]=\"1\" [min]=\"0\" [max]=\"100\" [disabled]=\"checkDisabled(data, control)\"\n [(ngModel)]=\"data[control.field]\"\n (onSlideEnd)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </p-slider>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'chips'\">\n <p-chips [disabled]=\"checkDisabled(data, control)\" [(ngModel)]=\"data[control.field]\"\n (onAdd)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"\n (onRemove)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\"></p-chips>\n </ng-container>\n <ng-container *ngSwitchCase=\"'entity-picker'\">\n <entity-picker [control]=\"control\" [children]=\"children\" [disabled]=\"checkDisabled(data, control)\"\n [required]=\"control.required\" [readOnly]=\"control.readOnly\" [(ngModel)]=\"data[control.field]\"\n (onInit)=\"handleLoadedControl($event, control, parentPath)\"\n (onChanged)=\"handleFieldValueChange(control, $event, eventType.CHANGE, data, parentPath)\">\n </entity-picker>\n </ng-container>\n <ng-container *ngSwitchCase=\"'table'\">\n <div [class]=\"control.class\">\n <tn-custom-scrollbar class=\"--has-border\" [showScrollHorizontal]=\"true\">\n <p-table class=\"new-table scr-table table-control\" [value]=\"data[control.field]\"\n [columns]=\"control.headerTemplate\" [responsive]=\"true\" [scrollable]=\"false\"\n [rowTrackBy]=\"trackByFuncId\"\n (onRowReorder)=\"handleRowOrdered(control, $event, eventType.ROW_REORDER, data, parentPath)\">\n <ng-template pTemplate=\"colgroup\">\n <colgroup>\n <col *ngIf=\"control.showNumber\" style=\"width: 40px\" />\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\n <col *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\n [style.width]=\"subControl.width\" />\n </ng-container>\n <col *ngIf=\"control.enableReorderRow\" style=\"width: 30px\" />\n <col *ngIf=\"control.showFunction\" [style.width]=\"control.widthFunctionColumn\" />\n </colgroup>\n </ng-template>\n <ng-template *ngIf=\"getComponentByType(_prefixCustomHeader + control.field)\"\n pTemplate=\"header\" let-columns>\n <ng-container\n *ngTemplateOutlet=\"getComponentByType(_prefixCustomHeader + control.field), context: {$implicit: control.headerTemplate, crudForm: this, containerSticky: containerSticky}\">\n </ng-container>\n </ng-template>\n <ng-template *ngIf=\"!getComponentByType(_prefixCustomHeader + control.field)\"\n pTemplate=\"header\" let-rowData let-columns>\n <tr>\n <th *ngIf=\"control.showNumber\" class=\"th-sticky stt\">\n {{ 'TT' |translate}}\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <ng-container *ngFor=\"let subControl of control.rowTemplate\">\n <th *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\n [width]=\"subControl.width\"\n [pTooltip]=\"subControl.fullLabel || subControl.label\" tooltipPosition=\"top\"\n style=\"text-align: center;\">\n {{subControl.label}}\n <span *ngIf=\"subControl.required\" class=\"star-required\">*</span>\n <span *ngIf=\"subControl.description\"\n class=\"subControl-description\">({{subControl.description}})</span>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </ng-container>\n <th *ngIf=\"control.enableReorderRow\">\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n <th *ngIf=\"control.showFunction\" class=\"table-function column-function\">\n <div class=\"cell-header-function\"><span>Ch\u1EE9c n\u0103ng</span></div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-rowData let-ri=\"rowIndex\">\n <tr [pReorderableRow]=\"ri\" [class]=\"rowData.class\"\n (click)=\"handleRowClick(rowData, control)\">\n <td *ngIf=\"control.showNumber\" class=\"stt th-sticky\"\n style=\"text-align: center; vertical-align: inherit\">\n <span>\n {{ri + 1}}\n </span>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <ng-container *ngFor=\"let subControl of control.rowTemplate; let i = index\">\n <td *ngIf=\"subControl && !subControl.hidden && subControl.visibleInList\"\n [class.control-inside]=\"true\" [class]=\"subControl.class\"\n [ngStyle]=\"{'text-align': getTextAlign(subControl.textAlign), 'vertical-align': 'inherit'}\">\n <span class=\"p-column-title\">{{subControl.label}}</span>\n <ng-template [ngIf]=\"getControlType(subControl) != 'column'\">\n <ng-container *ngTemplateOutlet=\"customControl; context: {\n control: subControl,\n data: rowData,\n index: ri,\n tablePath: path,\n parentPath: path + '[' + ri + ']',\n path: path + '[' + ri + '].' + subControl.field,\n showLabel: false,\n mdWidth: 12,\n rowSpan: 1\n }\">\n </ng-container>\n </ng-template>\n <ng-template [ngIf]=\"getControlType(subControl) == 'column'\">\n <span>{{_modelData[control.field][ri][subControl.field]}}</span>\n </ng-template>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </ng-container>\n <td *ngIf=\"control.enableReorderRow\" class=\"no-padding center v-center\">\n <i class=\"fas fa-arrows-alt\" style=\"cursor:pointer; padding: 8px; color: #555;\"\n pReorderableRowHandle></i>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n <td *ngIf=\"control.showFunction\" style=\"text-align: center\"\n class=\"column-function text-center\">\n <div *ngIf=\"!control.rowButtonTemplate\"\n class=\"p-toolbar-group-center button-group\">\n <button *ngIf=\"control.showSave\" [disabled]=\"rowData._disableSave\"\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\n icon=\"pi pi-save\" [pTooltip]=\"'L\u01B0u' | translate\" tooltipPosition=\"top\"\n (click)=\"saveRow(ri, control, path)\"></button>\n <button *ngIf=\"control.showEdit\" [disabled]=\"rowData._disableEdit\"\n type=\"button\" pButton class=\"p-button-text p-button-rounded\"\n icon=\"pi pi-pencil\" [pTooltip]=\"'S\u1EEDa' | translate\" tooltipPosition=\"top\"\n (click)=\"editRow(ri, control, path)\"></button>\n <button *ngIf=\"control.showDelete\" [disabled]=\"rowData._disableDelete\"\n type=\"button\" pButton\n class=\"p-button-text p-button-danger p-button-rounded\"\n icon=\"pi pi-trash\" [pTooltip]=\"'X\u00F3a' | translate\" tooltipPosition=\"top\"\n (click)=\"deleteRow(ri, control, path)\"></button>\n <button *ngIf=\"control.rowButtons\" type=\"button\" pButton\n icon=\"pi pi-ellipsis-v\"\n class=\"link-or-action p-button-text p-button-rounded\"\n pTooltip=\"Ch\u1EE9c n\u0103ng kh\u00E1c\" tooltipPosition=\"top\"\n (click)=\"showContextMenu($event, rowData, control)\"></button>\n </div>\n <div *ngIf=\"control.rowButtonTemplate\"\n class=\"p-toolbar-group-center button-group\">\n <ng-container\n *ngTemplateOutlet=\"control.rowButtonTemplate; context: {rowData: _modelData[control.field][ri], rowIndex: ri, path: path, control: control}\">\n </ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"containerSticky\"></ng-container>\n </td>\n </tr>\n </ng-template>\n <ng-template *ngIf=\"control.summaryTemplate\" pTemplate=\"summary\" let-rowData>\n <ng-container *ngTemplateOutlet=\"control.summaryTemplate; context: {rowData: rowData}\">\n </ng-container>\n </ng-template>\n </p-table>\n </tn-custom-scrollbar>\n <div *ngIf=\"control.showFooter\" class=\"--table-schema-footer\">\n <button *ngIf=\"control.showAdd\" type=\"button\" pButton style=\"width:auto\" label=\"Th\u00EAm m\u1EDBi\"\n icon=\"pi pi-plus\" class=\"p-button-text\" (click)=\"addNewRow(control, path)\"></button>\n <span *ngIf=\"control.showDialog\" style=\"font-weight: normal;\">\n <p-checkbox label=\"M\u1EDF dialog\" [binary]=\"true\" [(ngModel)]=\"control.showEdit\">\n </p-checkbox>\n </span>\n <button *ngIf=\"control.enableAddMulti\" type=\"button\" pButton\n style=\"width:auto; margin-left:10px;\" label=\"Th\u00EAm nhi\u1EC1u\" icon=\"pi pi-clone\"\n class=\"p-button-text\" (click)=\"addMultiRow(control, 5, path)\"></button>\n <button *ngFor=\"let bt of control.footerButtons\" type=\"button\" pButton [class]=\"bt.class\"\n [icon]=\"bt.icon\" [label]=\"bt.label | translate\" style=\"width:auto; margin-left:10px;\"\n (click)=\"messageRow( -1, control, path)\"></button>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngIf=\"control.template\">\n <ng-container [ngTemplateOutlet]=\"control.template\" [ngTemplateOutletContext]=\"{\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\n }\">\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!control.template\" [ngTemplateOutlet]=\"getComponentByType(control.field)\"\n [ngTemplateOutletContext]=\"{\n crudForm: this, data: data, index: rowIndex, parentPath: parentPath, control: control, changeFunc: handleFieldValueChange\n }\">\n </ng-container>\n </ng-container>\n <ng-container *ngTemplateOutlet=\"validation; context: {control: control, data: data}\">\n </ng-container>\n <div *ngIf=\"control.message\" class=\"control-message\">\n <span [class]=\"control.messageClass\">{{control.message}}</span>\n </div>\n </ng-container>\n </div>\n</ng-template>\n<ng-template #validation let-control=\"control\" let-data=\"data\">\n <ng-container *ngIf=\"data._errors[control.field].length > 0\">\n <div class=\"error-container\">\n <ng-container *ngFor=\"let error of data._errors[control.field]\">\n <div class=\"error-item\" *ngIf=\"error\">\n <ng-container [ngTemplateOutlet]=\"errorMessage\" [ngTemplateOutletContext]=\"{content: error}\">\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n</ng-template>\n<ng-template #errorMessage let-content=\"content\">\n <div class=\"error-content\">\n <i class=\"pi pi-ban\"></i>\n <span> {{content}}</span>\n </div>\n</ng-template>\n<ng-template #labelControl let-control=\"control\">\n <ng-container>\n <label [class]=\"getLabelClass(control)\" *ngIf=\"!control.isHtml\" [attr.label-index]=\"control.indexLabel\"\n [pTooltip]=\"control.title\" tooltipPosition=\"top\" tooltipStyleClass=\"wrap\" [escape]=\"false\"\n [for]=\"control.for\">{{control.text | translate}}</label>\n <label [class]=\"getLabelClass(control)\" *ngIf=\"control.isHtml\" [innerHTML]=\"control.text | safeHtml\"\n [attr.label-index]=\"control.indexLabel\"></label>\n </ng-container>\n</ng-template>\n<ng-template #containerSticky>\n <span class=\"fix-sticky top\"></span>\n <span class=\"fix-sticky right\"></span>\n <span class=\"fix-sticky left\"></span>\n</ng-template>\n<!-- <ng-template #templateCongViecForm let-control=\"control\">\n <base-congviec-form [control]=\"control\" [parentSetting]=\"congViecSetting\" [tenCongViec]=\"control.data.tenCongViec\">\n </base-congviec-form>\n</ng-template> -->\n<tn-dialog *ngIf=\"tableFormDialogModel.showEditForm\" #dialog [styleClass]=\"'address-form'\"\n [header]=\"tableFormDialogModel.header | translate\" [popupSize]=\"tableFormDialogModel.popupSize\"\n (onHide)=\"tableFormDialogModel.showEditForm = false\">\n <table-detail-form #formBase [parentSetting]=\"setting\" [schema]=\"tableFormSchema\" [data]=\"tableFormDialogModel.data\"\n (onSaved)=\"handleSavedTableRow($event)\" (onCancel)=\"tableFormDialogModel.showEditForm = false\">\n </table-detail-form>\n</tn-dialog>",
2204
2204
  providers: [ComponentContextService],
2205
2205
  styles: [".label-only{font-weight:700;margin-bottom:1em}div.label{position:relative}div.label .star-required{color:red;position:absolute;padding-left:.2em;padding-top:.1em}th>span.star-required{color:red;padding-left:.2em;padding-top:.3em}div.type-container.not-show-in-box-holder{padding:0}.--table-schema-footer{display:flex;align-items:center;font-weight:600;padding:.5em;background:#f8f9fa;color:#495057;border:1px solid #e9ecef}.show-in-box{border:1px solid #ced4da;border-radius:5px}.not-show-in-box{padding:0}.view-mode div.label{padding-bottom:3px}.view-mode div.label label{font-weight:700;font-size:.85em}.view-mode>span:not(:empty){display:inline-block;width:100%;padding:5px 0}.view-mode.type-table div.label+div{padding:5px 0}td>.view-mode{display:inline-block;padding:.25rem .5rem}td>.view-mode .view-mode{padding:0}.crud-form-control div[role=checkbox-alone]{margin-top:24px}.crud-form-control div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control .label+div[role=checkbox-alone]{margin-top:11px}.crud-form-control.type-table div[role=checkbox-alone]{margin-top:6px;text-align:center}.crud-form-control.type-table div[role=checkbox-alone].mg-top-0{margin-top:0}.crud-form-control.type-table div[role=checkbox-alone].align-left{text-align:left}.crud-form-control.type-title{font-size:1.2rem;font-weight:700;color:#025ba7;border-bottom:1px solid #cfcfcf;text-transform:uppercase;padding:5px;margin-bottom:5px}.crud-form-control.type-title>.label{margin-bottom:0}.control-description,.crud-form-control .subControl-description{font-size:.8rem;font-weight:700;color:#007eff;margin-bottom:5px}.control-description{padding-left:.75rem}.th-sticky{text-align:center!important;z-index:2!important;position:sticky!important;top:0;background:inherit}.th-sticky.stt{left:0}.cell-header-function{display:flex;align-items:center}.cell-header-function>span{text-align:center;flex:1 1}.cell-header-function button{width:24px;height:24px;padding:0;margin:0}.no-value{font-size:.8em}@keyframes fadeIn{0%{opacity:0;top:-25px}to{opacity:1;top:0}}@keyframes shrink{0%{height:0}to{height:20px}}@media screen and (min-width:40.063em){.label-right{padding-left:2em}}::ng-deep crud-form .crud-form-control .tn-check-box-list{margin-top:5px}::ng-deep crud-form .crud-form-control>div.label{margin-bottom:5px;font-size:.9rem;height:1.15em}::ng-deep crud-form .crud-form-control>div.label+*{width:100%}::ng-deep crud-form .crud-form-control>.error-container .error-item{overflow:visible;animation:shrink .1s;min-height:20px;padding-top:5px}::ng-deep crud-form .crud-form-control>.error-container .error-item .error-content{display:flex;position:relative;color:red;font-size:.9em;animation:fadeIn .1s}::ng-deep crud-form .crud-form-control>.error-container .error-item .error-content i{font-size:.9em;display:flex;padding-top:1px}::ng-deep crud-form .crud-form-control>.error-container .error-item .error-content span{display:flex;padding-left:5px}::ng-deep crud-form .crud-form-control .control-message{margin-top:5px;font-size:.9rem}::ng-deep crud-form .crud-form-control .control-message .green{color:#00af00}::ng-deep crud-form .crud-form-control .control-message .red{color:red}::ng-deep crud-form .crud-form-control .control-message .blue{color:#0095ff}::ng-deep crud-form .crud-form-control.no-label>div.label{display:none}::ng-deep crud-form .crud-form-control.error .p-dropdown,::ng-deep crud-form .crud-form-control.error .p-inputtext,::ng-deep crud-form .crud-form-control.error .p-multiselect,::ng-deep crud-form .crud-form-control.error .tn-dropdown,::ng-deep crud-form .crud-form-control.error input,::ng-deep crud-form .crud-form-control.error select,::ng-deep crud-form .crud-form-control.error textarea{border-color:#ff5722!important}::ng-deep crud-form .crud-form-control.error .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep crud-form .crud-form-control.error .p-inputtext:enabled:focus,::ng-deep crud-form .crud-form-control.error .tn-dropdown:not(.p-disabled).p-focus{box-shadow:0 0 0 .2rem #ffc4b3}::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown,::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext,::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) .p-multiselect,::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) .tn-dropdown,::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) input,::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) select,::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) textarea{border-color:#ced4da!important}::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) .p-autocomplete-multiple-container:not(.p-disabled).p-focus,::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) .p-dropdown.tn-dropdown.p-focus,::ng-deep crud-form .crud-form-control.error div.crud-form-control:not(.error) .p-inputtext:enabled:focus{box-shadow:0 0 0 .2rem #a6d5fa}::ng-deep crud-form .crud-form-container{padding:.5rem .5rem 0}::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside,::ng-deep crud-form .p-datatable .p-datatable-tbody tr td.control-inside .show-in-box:not(.crud-form-control),::ng-deep crud-form base-congviec-form crud-form>.crud-form-container{padding:0}@media screen and (min-width:768px){::ng-deep crud-form .grid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr))}::ng-deep crud-form .grid .p-md-1{width:unset;grid-column:span 1}::ng-deep crud-form .grid .p-md-2{width:unset;grid-column:span 2}::ng-deep crud-form .grid .p-md-3{width:unset;grid-column:span 3}::ng-deep crud-form .grid .p-md-4{width:unset;grid-column:span 4}::ng-deep crud-form .grid .p-md-5{width:unset;grid-column:span 5}::ng-deep crud-form .grid .p-md-6{width:unset;grid-column:span 6}::ng-deep crud-form .grid .p-md-7{width:unset;grid-column:span 7}::ng-deep crud-form .grid .p-md-8{width:unset;grid-column:span 8}::ng-deep crud-form .grid .p-md-9{width:unset;grid-column:span 9}::ng-deep crud-form .grid .p-md-10{width:unset;grid-column:span 10}::ng-deep crud-form .grid .p-md-11{width:unset;grid-column:span 11}::ng-deep crud-form .grid .p-md-12{width:unset;grid-column:span 12}::ng-deep crud-form .grid .row-span-1{grid-row:span 1}::ng-deep crud-form .grid .row-span-2{grid-row:span 2}::ng-deep crud-form .grid .row-span-3{grid-row:span 3}::ng-deep crud-form .grid .row-span-4{grid-row:span 4}::ng-deep crud-form .grid .row-span-5{grid-row:span 5}::ng-deep crud-form .grid .row-span-6{grid-row:span 6}::ng-deep crud-form .grid .row-span-7{grid-row:span 7}::ng-deep crud-form .grid .row-span-8{grid-row:span 8}::ng-deep crud-form .grid .row-span-9{grid-row:span 9}::ng-deep crud-form .grid .row-span-10{grid-row:span 10}::ng-deep crud-form .grid .row-span-11{grid-row:span 11}::ng-deep crud-form .grid .row-span-12{grid-row:span 12}::ng-deep crud-form .grid .row-span-13{grid-row:span 13}::ng-deep crud-form .grid .row-span-14{grid-row:span 14}::ng-deep crud-form .grid .row-span-15{grid-row:span 15}::ng-deep crud-form .grid .row-span-16{grid-row:span 16}::ng-deep crud-form .grid .row-span-17{grid-row:span 17}::ng-deep crud-form .grid .row-span-18{grid-row:span 18}::ng-deep crud-form .grid .row-span-19{grid-row:span 19}::ng-deep crud-form .grid .row-span-20{grid-row:span 20}::ng-deep crud-form .grid .row-span-21{grid-row:span 21}::ng-deep crud-form .grid .row-span-22{grid-row:span 22}::ng-deep crud-form .grid .row-span-23{grid-row:span 23}::ng-deep crud-form .grid .row-span-24{grid-row:span 24}::ng-deep crud-form .grid .row-span-25{grid-row:span 25}::ng-deep crud-form .grid .row-span-26{grid-row:span 26}::ng-deep crud-form .grid .row-span-27{grid-row:span 27}::ng-deep crud-form .grid .row-span-28{grid-row:span 28}::ng-deep crud-form .grid .row-span-29{grid-row:span 29}::ng-deep crud-form .grid .row-span-30{grid-row:span 30}::ng-deep crud-form .grid .row-span-31{grid-row:span 31}::ng-deep crud-form .grid .row-span-32{grid-row:span 32}::ng-deep crud-form .grid .row-span-33{grid-row:span 33}::ng-deep crud-form .grid .row-span-34{grid-row:span 34}::ng-deep crud-form .grid .row-span-35{grid-row:span 35}::ng-deep crud-form .grid .row-span-36{grid-row:span 36}::ng-deep crud-form .grid .row-span-37{grid-row:span 37}::ng-deep crud-form .grid .row-span-38{grid-row:span 38}::ng-deep crud-form .grid .row-span-39{grid-row:span 39}::ng-deep crud-form .grid .row-span-40{grid-row:span 40}::ng-deep crud-form .grid .row-span-41{grid-row:span 41}::ng-deep crud-form .grid .row-span-42{grid-row:span 42}::ng-deep crud-form .grid .row-span-43{grid-row:span 43}::ng-deep crud-form .grid .row-span-44{grid-row:span 44}::ng-deep crud-form .grid .row-span-45{grid-row:span 45}::ng-deep crud-form .grid .row-span-46{grid-row:span 46}::ng-deep crud-form .grid .row-span-47{grid-row:span 47}::ng-deep crud-form .grid .row-span-48{grid-row:span 48}::ng-deep crud-form .grid .row-span-49{grid-row:span 49}::ng-deep crud-form .grid .row-span-50{grid-row:span 50}}:host ::ng-deep .tox-tinymce{border:none;border-top:1px solid #ccc;overflow:unset}:host ::ng-deep .tox-tinymce .tox-editor-container{overflow:unset}:host ::ng-deep .tox-tinymce .tox-toolbar{border:1px solid #ccc;border-bottom:none}:host ::ng-deep .tox-tinymce .tox-edit-area{border:1px solid #ccc}:host ::ng-deep .tox-tinymce .tox-edit-area iframe{box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}:host ::ng-deep .tox-tinymce .tox-menubar{border:1px solid #ccc}:host ::ng-deep .tox .tox-edit-area.tinymce-focus{border:1px solid #66afe9;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 3px 0 #66afe9;transition:box-shadow .3s,border-color .3s;transition-property:box-shadow,border-color;transition-duration:.3s,.3s;transition-timing-function:ease,ease;transition-delay:0s,0s}:host ::ng-deep .rq .tox .tox-edit-area{border-left-color:#ff4c46}:host ::ng-deep .table-schema-paging{margin-bottom:40px;display:block}"]
2206
2206
  },] }
@@ -2529,4 +2529,4 @@ export class ControlTreeNode {
2529
2529
  }
2530
2530
  }
2531
2531
  }
2532
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RueC1zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQ0gsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4Qiw4QkFBOEIsRUFDOUIsaUNBQWlDLEVBQ2pDLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLDJCQUEyQixFQUMzQixlQUFlLEVBQ2YsZUFBZSxFQUNmLGVBQWUsRUFDZixtQkFB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QUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixPQUFPO1NBQ1Y7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzFIO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFVO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxZQUFZLFdBQVcsRUFBRTtZQUNyQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckM7YUFDSSxJQUFJLElBQUksQ0FBQyxPQUFPLFlBQVksZUFBZSxFQUFFO1lBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3hHO2FBQ0k7WUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUN0QjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCBqUXVlcnlfIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UgfSBmcm9tICduZ3gtZGV2aWNlLWRldGVjdG9yJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvY29udGV4dG1lbnUnO1xuXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XG5pbXBvcnQgeyBGb3JtU3RhdGUsIEtleUZsYXNoU2hvdyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gICAgQWRkcmVzc0NvbnRyb2xTY2hlbWEsXG4gICAgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSxcbiAgICBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hLFxuICAgIEJ1dHRvbkNvbnRyb2xTY2hlbWEsXG4gICAgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSxcbiAgICBDaGVja2JveENvbnRyb2xTY2hlbWEsXG4gICAgQ2hpcHNDb250cm9sU2NoZW1hLFxuICAgIENvQ2F1VG9DaHVjQ29udHJvbFNjaGVtYSxcbiAgICBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWEsXG4gICAgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hTmV3LFxuICAgIENvbG9yQ29udHJvbFNjaGVtYSxcbiAgICBDb2xvclBpY2tlckNvbnRyb2xTY2hlbWEsXG4gICAgQ29sdW1uU2NoZW1hQmFzZSxcbiAgICBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEsXG4gICAgQ29udGFpbmVyU2NoZW1hLFxuICAgIENydWRGb3JtU2V0dGluZyxcbiAgICBDcnVkTGlzdFNldHRpbmcsXG4gICAgQ3VzdG9tQ29udHJvbFNjaGVtYSxcbiAgICBEYXRlVGltZUNvbnRyb2xTY2hlbWEsXG4gICAgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEsXG4gICAgRGlhbG9nTW9kZWwsXG4gICAgRHJvcGRvd25Db250cm9sU2NoZW1hLFxuICAgIEVkaXRvckNvbnRyb2xTY2hlbWEsXG4gICAgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSxcbiAgICBFdmVudERhdGEsXG4gICAgRXZlbnRUeXBlLFxuICAgIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSxcbiAgICBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSxcbiAgICBGaWxlVXBsb2FkTW9kZSxcbiAgICBGb3JtQ29udHJvbEJhc2UsXG4gICAgRm9ybUNvbnRyb2xCYXNlV2l0aFNlcnZpY2UsXG4gICAgRm9ybVNjaGVtYUJhc2UsXG4gICAgSW1hZ2VVcGxvYWRlckNvbnRyb2xTY2hlbWEsXG4gICAgS2V5VmFsdWVDb250cm9sU2NoZW1hLFxuICAgIExhYmVsU2NoZW1hLFxuICAgIE1hc2tDb250cm9sU2NoZW1hLFxuICAgIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSxcbiAgICBPcGVyYXRvcixcbiAgICBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hLFxuICAgIFBlcmNlbnRDb250cm9sU2NoZW1hLFxuICAgIFBvcHVwU2l6ZSxcbiAgICBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hLFxuICAgIFJlZmVyZW5jZVRleHRDb250cm9sU2NoZW1hLFxuICAgIFNwYW5Db250cm9sU2NoZW1hLFxuICAgIFN3aXRjaENvbnRyb2xTY2hlbWEsXG4gICAgVGFibGVTY2hlbWEsXG4gICAgVGVtcGxhdGVDb250cm9sU2NoZW1hLFxuICAgIFRleHRBbGlnbixcbiAgICBUZXh0QXJlYUNvbnRyb2xTY2hlbWEsXG4gICAgVGV4dENvbnRyb2xTY2hlbWEsXG4gICAgVGl0bGVTY2hlbWEsXG4gICAgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEsXG4gICAgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSxcbiAgICBXcmFwUGlja2VyQ29udHJvbFNjaGVtYVxufSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Zvcm0tc2NoZW1hJztcbmltcG9ydCB7IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2wsIFJlZ2V4U3BsaXRGaWVsZEJ5SXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0L2NvbW1vbic7XG5pbXBvcnQgeyBLZXlGdW5jdGlvblJlbG9hZCB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2NvbW1vbic7XG5pbXBvcnQgeyBLZXlWYWx1ZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdHlwZXMnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcbmltcG9ydCB7IENydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3J1ZC5zZXJ2aWNlJztcbmltcG9ydCB7IEVudGl0eVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktcGlja2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFzdGVyRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYXN0ZXItZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEcm9wZG93blNlcnZpY2UgfSBmcm9tICcuLi8uLi9kcm9wZG93bi9zZXJ2aWNlcy9kcm9wZG93bi5zZXJ2aWNlJztcbmltcG9ydCB7IGJhc2VUcmluaEt5LCBnZXRSZWdleFJlc3VsdCwgZ2V0U3RyaW5nRGlzcGxheVZhbHVlLCBsb29wQ3Vyc29yRnVuY3Rpb24gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBHbWFpbENvcnJlY3RvciwgTG93ZXJDb3JyZWN0b3IgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb3JyZWN0b3JzJztcbmltcG9ydCB7XG4gICAgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IsXG4gICAgQ2hlY2tEdXBsaWNhdGVWYWxpZGF0b3IsXG4gICAgQ29tcGFyZVZhbGlkYXRvcixcbiAgICBEYXRlQ29tcGFyZVZhbGlkYXRvcixcbiAgICBFbWFpbFZhbGlkYXRvcixcbiAgICBOdW1iZXJDb21wYXJlVmFsaWRhdG9yLFxuICAgIE51bWJlck9ubHlWYWxpZGF0b3IsXG4gICAgUGFzc3dvcmRWYWxpZGF0b3IsXG4gICAgUGhvbmVOdW1iZXJWYWxpZGF0b3IsXG4gICAgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IsXG4gICAgUmVxdWlyZWRWYWxpZGF0b3IsXG4gICAgU2FtZVZhbHVlVmFsaWRhdG9yXG59IGZyb20gJy4vLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNMaXRlcmFsT2JqZWN0LCBtZXJnZUpTT04gfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvZW52aXJvbm1lbnQtc2NoZW1hJztcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLy4uLy4uLy4uL21vZGVscy9ncmlkLWluZm8nO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XG5cbi8vIGZpeCBmb3IgYnVpbGQgcHJvZFxuY29uc3QgalF1ZXJ5ID0galF1ZXJ5XztcblxuY29uc3Qgb3BlcmF0b3JDb250cmFzdCA9IHtcbiAgICBbT3BlcmF0b3IuZ3JlYXRlcl06IE9wZXJhdG9yLmxvd2VyLFxuICAgIFtPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXTogT3BlcmF0b3IubG93ZXJUaGFuRXF1YWwsXG4gICAgW09wZXJhdG9yLmxvd2VyXTogT3BlcmF0b3IuZ3JlYXRlcixcbiAgICBbT3BlcmF0b3IubG93ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NydWQtZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NydWQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbQ29tcG9uZW50Q29udGV4dFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIENydWRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgICBAVmlld0NoaWxkKCdmb3JtRWxlbWVudCcpIGZvcm1FbGVtZW50OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRleHRNZW51JywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbnRleHRNZW51OiBDb250ZXh0TWVudTtcbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBjaGlsZHJlbjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgLy8gQFZpZXdDaGlsZCgndGVtcGxhdGVDb25nVmllY0Zvcm0nLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IHRlbXBsYXRlQ29uZ1ZpZWNGb3JtKHZhbHVlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgLy8gICAgIHRoaXMudGVtcGxhdGVzW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gdmFsdWU7XG4gICAgLy8gfTtcblxuICAgIEBJbnB1dCgpIHNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcbiAgICBASW5wdXQoKSBjb250ZXh0OiBDb21wb25lbnRDb250ZXh0U2VydmljZTtcblxuICAgIEBJbnB1dCgpIGZpbGVzVXBsb2FkZWQgPSBbXTtcbiAgICBASW5wdXQoKSBpc1ZpZXdNb2RlID0gZmFsc2U7XG4gICAgQElucHV0KCkgZGlzYWJsZUtleXByZXNzQ29udHJvbCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGRpc2FibGVDYWNoaW5nID0gZmFsc2U7XG4gICAgX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCBjcnVkLWZvcm0tY29udGFpbmVyJztcbiAgICBASW5wdXQoKSBzZXQgc3R5bGVDbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCBjcnVkLWZvcm0tY29udGFpbmVyJztcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgKz0gYCAke3ZhbHVlfWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKSB1c2VHcmlkVGVtcGxhdGUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBmb3JtSWQgPSAnJztcbiAgICBASW5wdXQoKSBmb3JtQ2xhc3MgPSAnJztcbiAgICBASW5wdXQoKSBhdXRvRm9jdXMgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHRyYXBGb2N1cyA9IHRydWU7XG5cbiAgICBASW5wdXQoKSBzZXQgZGF0YSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuY2FuUHJpbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX21pbmltaXplZERhdGEgIT0gdmFsdWUgJiYgaXNMaXRlcmFsT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbigpO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhID0gbWVyZ2VKU09OKHRoaXMuX21vZGVsRGF0YSwgdmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5yZUluaXRDb250cm9sTW9kZWxBbmRSb290Tm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWREYXRhRWRpdE9sZCAmJiB0aGlzLmxvYWRlZERhdGFFZGl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5QcmludCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0NhblByaW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhID0ge307XG4gICAgICAgICAgICB0aGlzLnJlSW5pdENvbnRyb2xNb2RlbEFuZFJvb3ROb2RlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQElucHV0KCkgZm9ybVN0YXRlOiBGb3JtU3RhdGUgPSBGb3JtU3RhdGUuRURJVDtcblxuICAgIEBPdXRwdXQoKSBvbkZvcm1SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkNvbnRyb2xSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkFsbENvbnRyb2xSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbk1vZGVsQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBkYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RXZlbnREYXRhPiA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnREYXRhPigpO1xuICAgIEBPdXRwdXQoKSBvbkFmdGVyVHJpbmhLeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgX3Jvb3ROb2RlOiBDb250cm9sVHJlZU5vZGU7XG4gICAgX21pbmltaXplZERhdGE6IGFueTtcbiAgICBfbW9kZWxEYXRhOiBhbnkgPSB7fTtcbiAgICBfdW5zdWJzY3JpYmVBbGwgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgX2luVmFsaWRGb3JtID0gZmFsc2U7XG4gICAgZXZlbnRUeXBlID0gRXZlbnRUeXBlO1xuXG4gICAgLy8gRG9jIHR1IGNhdSBoaW5oIHRoYW0gc28gaGUgdGhvbmdcbiAgICBsaW1pdFNpemUgPSAwO1xuICAgIGZvcm1Db250cm9sczogS2V5VmFsdWVUeXBlID0ge307XG4gICAgZnVuY0NoZWNrVW5pcXVlRmllbGQ6IGFueSA9IHt9O1xuICAgIGJlZm9yZURhdGE6IGFueSA9IHt9O1xuICAgIGZpcnN0RGl2SG9sZGVyOiBhbnk7XG4gICAgY2FjaGVkVmFsdWVzID0ge307XG4gICAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT47IH0gPSB7fTtcbiAgICBfcHJlZml4Q3VzdG9tSGVhZGVyID0gJ2N1c3RvbUhlYWRlcl8nO1xuICAgIGNvbmdWaWVjU2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nO1xuXG4gICAgbG9hZGVkRGF0YUVkaXRPbGQgPSBmYWxzZTtcbiAgICBsb2FkZWREYXRhRWRpdCA9IGZhbHNlO1xuICAgIGNhblByaW50ID0gZmFsc2U7XG5cbiAgICB0YWJsZUZvcm1EaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XG4gICAgICAgIHBvcHVwU2l6ZTogbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiAxMTAwLCBoZWlnaHQ6IDY1MCB9KVxuICAgIH0pO1xuICAgIHRhYmxlRm9ybUN1cnJlbnRSb3c6IG51bWJlcjtcbiAgICB0YWJsZUZvcm1TY2hlbWE6IEZvcm1TY2hlbWFCYXNlW10gPSBbXTtcbiAgICB0YWJsZUZvcm1DdXJyZW50SW5mbzogYW55ID0ge307XG5cbiAgICBidXR0b25Db250ZXh0czogTWVudUl0ZW1bXSA9IFtdO1xuICAgIHJvd0RhdGFDdXJyZW50OiBhbnkgPSB7fTtcbiAgICBjb250cm9sTmVlZENoZWNrUmVhZHk6IEZvcm1TY2hlbWFCYXNlW10gPSBbXTtcbiAgICByZWFkeVN0YXR1czogYW55ID0ge307XG4gICAgZmllbGRQYXJlbnRGaWVsZCA9ICdwYXJlbnRGaWVsZCc7XG4gICAgd2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0OiBhbnk7XG4gICAgcHVibGljIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcbiAgICBwdWJsaWMgX21hc3RlckRhdGFTZXJ2aWNlOiBNYXN0ZXJEYXRhU2VydmljZTtcbiAgICBwdWJsaWMgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHVibGljIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZSxcbiAgICAgICAgcHVibGljIF9kZXZpY2VEZXRlY3RvclNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfZHJvcGRvd25TZXJ2aWNlOiBEcm9wZG93blNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIHB1YmxpYyBfZW50aXR5UGlja2VyU2VydmljZTogRW50aXR5UGlja2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfbW9kdWxlQ29uZmlnOiBNb2R1bGVDb25maWdTZXJ2aWNlLFxuICAgICkge1xuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTm90aWZpZXJTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTWFzdGVyRGF0YVNlcnZpY2UpO1xuICAgICAgICB0aGlzLl91c2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChVc2VyU2VydmljZSk7XG5cbiAgICAgICAgLy8gR2V0IENvbmZpZ3VyYXRpb25TeXN0ZW1cbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UuZ2V0Q29uZmlnQnlDb2RlKCdTaXplT2ZGaWxlJykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbWl0U2l6ZSA9IE51bWJlcihyZXNwb25zZSkgKiAxMDAwICogMTAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmhpZGRlblRyaW5oS3kpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3ByaW50RmlsZUlkJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdGaWxlJyxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuQ2hlY2s6IChtb2RlbCwgY3VycmVudE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbW9kZWwucHJpbnRGaWxlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdExvYWQoKTtcbiAgICB9XG5cbiAgICBzd2l0Y2hWaWV3TW9kZShyZWFkb25seVZpZXcgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuaXNWaWV3TW9kZSA9IHJlYWRvbmx5VmlldztcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoY29udHJvbCwgdGhpcy5pc1ZpZXdNb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5pbml0TG9hZCgpO1xuICAgIH1cblxuICAgIGNsZWFuKCkge1xuICAgICAgICB0aGlzLmNsZWFuTW9kZWwodGhpcy5fbW9kZWxEYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFuTW9kZWwobW9kZWwpIHtcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1vZGVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnX3N0YXR1cycpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsW2tleV1bc10gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnX2Vycm9ycycpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsW2tleV1bc10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhbk1vZGVsKG1vZGVsW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vZGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhbk1vZGVsKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVJbml0Q29udHJvbE1vZGVsQW5kUm9vdE5vZGUoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb290Tm9kZU9sZCA9IHRoaXMuX3Jvb3ROb2RlO1xuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlLnNldENydWRGb3JtKHRoaXMpO1xuICAgICAgICBpZiAocm9vdE5vZGVPbGQpIHtcbiAgICAgICAgICAgIHJvb3ROb2RlT2xkLmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5fcm9vdE5vZGUuY2hpbGROb2Rlcy5maW5kKHEgPT4gcS5tb2RlbFBhdGggPT0gbm9kZS5tb2RlbFBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld05vZGUuY29tcG9uZW50ID0gbm9kZS5jb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLFxuICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5NT0RFTF9DSEFOR0VELFxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZWQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNaW5pbWl6ZURhdGEobW9kZWwpIHtcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcbiAgICAgICAgICAgIGlmIChtb2RlbC5fZHJvcGRvd252YWx1ZSAhPSBudWxsICYmIG1vZGVsLl9kcm9wZG93bnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFttb2RlbC5fZHJvcGRvd252YWx1ZV0gPT0gbnVsbCA/IG1vZGVsWyd2YWx1ZSddIDogbW9kZWxbbW9kZWwuX2Ryb3Bkb3dudmFsdWVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKG1vZGVsW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xuICAgICAgICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcbiAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLmdldE1pbmltaXplRGF0YShpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGVsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRMb2FkKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5zY2hlbWEpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zY2hlbWEubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIHRo4buxYyBoaeG7h24gc2F1IGPDuW5nIGtoaSBtb2RlbCDEkcOjIGluaXQgeG9uZyB2w6AgY8OhYyBz4buxIGtp4buHbiBhZGQgcm93IHRo4buxYyBoaeG7h24geG9uZ1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5GT1JNX1JFQURZLFxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdChmb3JtRXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRTY2hlbWEoKTtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDYWNoaW5nICYmICF0aGlzLl9tb2RlbERhdGEuaWQpIHRoaXMuYXBwbHlDYWNoZWRWYWx1ZXMoKTtcbiAgICAgICAgdGhpcy5zZXREYXRhRGVmYXVsdCgpO1xuXG4gICAgICAgIC8vIHRo4buxYyBoaeG7h24gc2F1IGPDuW5nIGtoaSBtb2RlbCDEkcOjIGluaXQgeG9uZyB2w6AgY8OhYyBz4buxIGtp4buHbiBhZGQgcm93IHRo4buxYyBoaeG7h24geG9uZ1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1FdmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkZPUk1fUkVBRFksXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vbkZvcm1SZWFkeS5lbWl0KGZvcm1FdmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFNjaGVtYSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoY29udHJvbCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XG4gICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3IoY29udHJvbCk7XG4gICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShjb250cm9sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xuICAgICAgICB0aGlzLmluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgY29udHJvbC5maWVsZCk7XG5cbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcbiAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgX3BhcmVudFBhdGggPSBwYXJlbnRQYXRoICsgJy4nICsgX3BhcmVudFBhdGg7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSB8fCAhKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFkZE1vcmUgPSBjb250cm9sLmluaXRSb3dDb3VudCAtIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChhZGRNb3JlID4gMCAmJiAhcGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIHRo4buxYyBoaeG7h24gc2F1IGPDuW5nIGtoaSB04bqldCBj4bqjIG1vZGVsIMSRw6MgaW5pdCB4b25nXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlbERhdGEuaWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNdWx0aVJvdyhjb250cm9sLCBhZGRNb3JlLCBfcGFyZW50UGF0aCwgJ2luaXQnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChpdGVtLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCArICdbJyArIGkgKyAnXScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID09IG51bGwgfHwgIWlzTGl0ZXJhbE9iamVjdChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2Uge1xuICAgICAgICAvLyAgICAgLy8gaWYgKCFwYXJlbnRNb2RlbC5oYXNPd25Qcm9wZXJ0eShjb250cm9sLmZpZWxkKSAmJiBjb250cm9sLmZpZWxkICE9IG51bGwpIHtcbiAgICAgICAgLy8gICAgIC8vICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuZGVmYXVsdFZhbHVlO1xuICAgICAgICAvLyAgICAgLy8gfVxuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgaW5pdENvbnRyb2xEZWZhdWx0VmFsdWVGcm9tRXh0ZXJuYWwoKSB7XG4gICAgICAgIC8vIGNvbnN0IHNjaGVtYUR5bmFtaWNzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XG4gICAgICAgICAgICAvLyBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEN1c3RvbUNvbnRyb2xTY2hlbWFcbiAgICAgICAgICAgIC8vICAgICAmJiB0aGlzLmNoZWNrSXNEeW5hbWljQ29udHJvbChjb250cm9sKVxuICAgICAgICAgICAgLy8gKSB7XG4gICAgICAgICAgICAvLyAgICAgc2NoZW1hRHluYW1pY3MucHVzaChjb250cm9sKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBU4bqhbSB0aOG7nWkgayByZW5kZXIgbHXDtG4gdMOqbiBjw7RuZyB2aeG7h2MgdHJvbmcgZm9ybSBpbml0LCB2w6wgxJFhbmcgayBraeG7g20gc2/DoXQgZGMga2hpIG7DoG8gdOG6pXQgY+G6oyBjb250cm9sIHJlYWR5XG4gICAgICAgIC8vIHNjaGVtYUR5bmFtaWNzLmZvckVhY2goc2NoZW1hID0+IHtcbiAgICAgICAgLy8gICAgIHRoaXMucmVuZGVyVGVuQ29uZ1ZpZWModGhpcy5fbW9kZWxEYXRhLCBzY2hlbWEpO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBpbml0Q29udHJvbERlZmF1bHRWYWx1ZShwYXJlbnRNb2RlbCwgY29udHJvbCwgcGFyZW50UGF0aD8pIHtcbiAgICAgICAgdGhpcy5pbml0UHJpdmF0ZURhdGEocGFyZW50TW9kZWwsIGNvbnRyb2wuZmllbGQpO1xuXG4gICAgICAgIGxldCBfcGFyZW50UGF0aCA9IGNvbnRyb2wuZmllbGQ7XG4gICAgICAgIGlmIChwYXJlbnRQYXRoICE9IG51bGwpIF9wYXJlbnRQYXRoID0gcGFyZW50UGF0aCArICcuJyArIF9wYXJlbnRQYXRoO1xuXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmICghcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gfHwgIShwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhZGRNb3JlID0gY29udHJvbC5pbml0Um93Q291bnQgLSBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsLmhhc093blByb3BlcnR5KGNvbnRyb2wuZmllbGQpICYmIGNvbnRyb2wuZmllbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuYXV0b0Rpc3BsYXlGaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbFswXS52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0UHJpdmF0ZURhdGEocGFyZW50TW9kZWwsIGZpZWxkKSB7XG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3NvdXJjZSkgcGFyZW50TW9kZWwuX3NvdXJjZSA9IHt9O1xuXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3N0YXR1cykgcGFyZW50TW9kZWwuX3N0YXR1cyA9IHt9O1xuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9lcnJvcnMpIHBhcmVudE1vZGVsLl9lcnJvcnMgPSB7fTtcblxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zdGF0dXNbZmllbGRdKSBwYXJlbnRNb2RlbC5fc3RhdHVzW2ZpZWxkXSA9IHt9O1xuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9lcnJvcnNbZmllbGRdKSBwYXJlbnRNb2RlbC5fZXJyb3JzW2ZpZWxkXSA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyByZUluaXRDb250cm9sU2NoZW1hKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbFNjaGVtYShjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlLnNldENydWRGb3JtKHRoaXMpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1FdmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkZPUk1fUkVBRFksXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vbkZvcm1SZWFkeS5lbWl0KGZvcm1FdmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdENvbnRyb2xTY2hlbWEoc2NoZW1hOiBGb3JtU2NoZW1hQmFzZSwgcGFyZW50SWQ/KSB7XG4gICAgICAgIGlmIChzY2hlbWEuZGlzYWJsZWQgIT0gdHJ1ZSkge1xuICAgICAgICAgICAgc2NoZW1hLmRpc2FibGVkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1ZpZXdNb2RlKSB7XG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEubGFiZWwgJiYgIXNjaGVtYS5mdWxsTGFiZWwpIHtcbiAgICAgICAgICAgIHNjaGVtYS5mdWxsTGFiZWwgPSBzY2hlbWEubGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYVsnaXNSZWFkb25seSddKSB7XG4gICAgICAgICAgICBzY2hlbWEuY2xhc3MgKz0gJyBjb250cm9sLWRpc2FibGVkICc7XG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEuaXNIb3Jpem9udGFsbHlMYWJlbCkge1xuICAgICAgICAgICAgc2NoZW1hLmNsYXNzICs9ICcgY29udHJvbC1kLWZsZXggJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYVxuICAgICAgICAgICAgfHwgc2NoZW1hIGluc3RhbmNlb2YgTGFiZWxTY2hlbWFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzY2hlbWEuc2hvd0xhYmVsID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXNjaGVtYS5maWVsZCkge1xuICAgICAgICAgICAgICAgIHNjaGVtYS5maWVsZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYS5maWVsZCkge1xuICAgICAgICAgICAgbGV0IGtleSA9IHNjaGVtYS5maWVsZDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRJZCAhPSBudWxsKSBrZXkgPSBwYXJlbnRJZCArICcuJyArIGtleTtcbiAgICAgICAgICAgIHNjaGVtYS51bmlxdWVGaWVsZCA9IGtleTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2xzW2tleV0gPSBzY2hlbWE7XG4gICAgICAgIH1cblxuICAgICAgICBzY2hlbWFbJ2NvbnRyb2xUeXBlJ10gPSB0aGlzLmdldENvbnRyb2xUeXBlKHNjaGVtYSk7XG4gICAgICAgIHNjaGVtYVsnZGF0YVR5cGUnXSA9IHRoaXMuZ2V0Vmlld01vZGVEYXRhVHlwZShzY2hlbWEpO1xuXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XG4gICAgICAgICAgICBpZiAoIWNvbnRyb2wud2lkdGhGdW5jdGlvbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIGxldCBidXR0b25Db3VudCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd1NhdmUpIGJ1dHRvbkNvdW50Kys7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0VkaXQpIGJ1dHRvbkNvdW50Kys7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0RlbGV0ZSkgYnV0dG9uQ291bnQrKztcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5yb3dCdXR0b25zKSBidXR0b25Db3VudCsrO1xuICAgICAgICAgICAgICAgIC8vIDIuMzU3IGzDoCBjaGnhu4F1IHLhu5luZyBj4bunYSBt4buXaSBidXR0b24sIDEgbMOgIHBhZGRpbmcgdHLDoWkgcGjhuqNpIDAuNXJlbVxuICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gMi4zNTcgKiBidXR0b25Db3VudCArIDE7XG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoIDwgNikge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sLndpZHRoRnVuY3Rpb25Db2x1bW4gPSBgNi4zcmVtYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wud2lkdGhGdW5jdGlvbkNvbHVtbiA9IGAke3dpZHRofXJlbWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICBzdWJDb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF0gPSBjb250cm9sLnVuaXF1ZUZpZWxkO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgc2NoZW1hLnVuaXF1ZUZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmxvYWRPbkluaXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHJvcGRvd25Db250cm9sU2NoZW1hLmFsbG93TG9hZERhdGFXaGVuUGFyZW50TnVsbCkge1xuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYVsnY291bnRQYXJlbnRIYXNWYWx1ZSddID0gMDtcbiAgICAgICAgICAgICAgICAvLyBLaeG7g20gdHJhIHBhcmVudCBjw7MgdmFsdWUgY2jGsGEsIG7hur91IGPDsyByIHRow6wgxJHhu4MgcGFyZW50IHRyaWdnZXIgbG9hZCBjaOG7qSBrIHThu7EgbG9hZFxuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycy5mb3JFYWNoKGJpbmRpbmdGaWx0ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW2JpbmRpbmdGaWx0ZXIuc291cmNlRmllbGRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWFbJ2NvdW50UGFyZW50SGFzVmFsdWUnXSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTuG6v3UgcGFyZW50IMSR4buBdSBrIGPDsyB2YWx1ZSB0aMOsIMSR4buDIHThu7EgbG9hZFxuICAgICAgICAgICAgICAgIGlmICghZHJvcGRvd25Db250cm9sU2NoZW1hWydjb3VudFBhcmVudEhhc1ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmxvYWRPbkluaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcbiAgICAgICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEuZmlsdGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgdXNlclBpY2tlckNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIHVzZXJQaWNrZXJDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgc3ViQ29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdID0gY29udHJvbC51bmlxdWVGaWVsZDtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGNvbnRyb2wudW5pcXVlRmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZUNvbnRyb2xTY2hlbWEgPSA8QXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYT5zY2hlbWE7XG4gICAgICAgICAgICBhdXRvY29tcGxldGVDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIHNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDdXN0b21Db250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja0lzVGFza0NvbnRyb2woc2NoZW1hKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZ1ZpZWNTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZ1ZpZWNTZXR0aW5nLmlzV29ya2Zsb3dUcmVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzY2hlbWEuZGF0YS5maWVsZFBhcmVudEZvclRhc2tzID0gW107XG4gICAgICAgICAgICAgICAgbG9vcEN1cnNvckZ1bmN0aW9uKFxuICAgICAgICAgICAgICAgICAgICBnZXRSZWdleFJlc3VsdChzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWUsIFJlZ2V4U3BsaXRGaWVsZEJ5SXRlbSwgZXhlY1Jlc3VsdCA9PiBleGVjUmVzdWx0WzFdKSxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmRhdGEuZmllbGRQYXJlbnRGb3JUYXNrcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYUNoaWxkID0gdGhpcy5zZXR0aW5nLnNjaGVtYS5maW5kKHEgPT4gcS5maWVsZCA9PSBmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hQ2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZU9uQ2hhbmdlRXZlbnQoc2NoZW1hQ2hpbGQsIChldnQ6IEV2ZW50RGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRlbkNvbmdWaWVjKGV2dC5yb290TW9kZWwsIHNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlQ29udHJvbFNjaGVtYShzY2hlbWE6IEZvcm1TY2hlbWFCYXNlLCBkaXNhYmxlZCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFzY2hlbWEuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHNjaGVtYS5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgZGlzYWJsZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGRpc2FibGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tJc1Rhc2tDb250cm9sKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLmZpZWxkID09IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xcbiAgICAgICAgICAgICYmIHNjaGVtYS5kYXRhXG4gICAgICAgICAgICAmJiBzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWU7XG4gICAgfVxuXG4gICAgcmVuZGVyVGVuQ29uZ1ZpZWMobW9kZWw6IGFueSwgc2NoZW1hOiBDdXN0b21Db250cm9sU2NoZW1hKSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZVRleHQgPSBzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWU7XG4gICAgICAgIHNjaGVtYS5kYXRhLmZpZWxkUGFyZW50Rm9yVGFza3MuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVRleHQgPSB0ZW1wbGF0ZVRleHQucmVwbGFjZShge3tpdGVtLiR7ZmllbGR9fX1gLCBnZXRTdHJpbmdEaXNwbGF5VmFsdWUobW9kZWxbZmllbGRdKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY2hlbWEuZGF0YS50ZW5Db25nVmllYyA9IHRlbXBsYXRlVGV4dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzY2hlbWE6IGFueSkge1xuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzdWJDb250cm9sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgaWYgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIGlmIChkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XG4gICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gc291cmNlRmllbGQpO1xuICAgICAgICAgICAgaWYgKCFmaWx0ZXIuc3ViRmllbGRcbiAgICAgICAgICAgICAgICAmJiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hIHx8IHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyLnN1YkZpZWxkID0gc2NoZW1hLnZhbHVlRmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtYXJrZWRDb250cm9sID0ge307XG4gICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93blJlY3Vyc2l2ZShkcm9wZG93bkNvbnRyb2xTY2hlbWEsIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycywgbWFya2VkQ29udHJvbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGNoaWxkRHJvcGRvd246IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsIHRtcEZpbHRlcnM6IEZpbHRlcltdLCBtYXJrZWRDb250cm9sKSB7XG4gICAgICAgIGlmICh0bXBGaWx0ZXJzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRtcEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnREcm9wZG93biA9IHRoaXMuZm9ybUNvbnRyb2xzW3NvdXJjZUZpZWxkXTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50RHJvcGRvd24gJiYgIW1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24gaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXSA9IChldmVudDogRXZlbnREYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duWydjb3VudFBhcmVudEhhc1ZhbHVlJ10gJiYgY2hpbGREcm9wZG93blsnY291bnRQYXJlbnRIYXNWYWx1ZSddID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93blsnY291bnRQYXJlbnRIYXNWYWx1ZSddLS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5lZWRHZXREYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLmFsbG93TG9hZERhdGFXaGVuUGFyZW50TnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnQuZXZlbnRUeXBlID09IHRoaXMuZXZlbnRUeXBlLkFESlVTVF9WQUxVRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEdldERhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnZhbHVlID09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LnZhbHVlID09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBldmVudC52YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLl9jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQucmVzZXRDb250cm9sKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkR2V0RGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRHZXREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fY3J1ZFNlcnZpY2UuZ2V0RmlsdGVyRnJvbVRlbXBsYXRlKHRtcEZpbHRlcnMsIGV2ZW50LnBhcmVudE1vZGVsLCBldmVudC5yb290TW9kZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghKHBhcmVudERyb3Bkb3duIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJlbnREcm9wZG93bi5fY29tcG9uZW50ICYmIHBhcmVudERyb3Bkb3duLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YShmaWx0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50ICYmIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZU9uQ2hhbmdlRXZlbnQocGFyZW50RHJvcGRvd24sIChldmVudDogRXZlbnREYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93biwgZmlsdGVyLmZpbHRlcnMsIG1hcmtlZENvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRNb3JlT25DaGFuZ2VFdmVudChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIG5ld09uQ2hhbmdlKSB7XG4gICAgICAgIGlmIChjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFRyaWdnZXJMb2FkQ2hpbGQgPSBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQ7XG4gICAgICAgICAgICBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9sZFRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG1wRmllbGRPbGRPbkNoYW5nZSA9ICdvbGRPbkNoYW5nZSc7XG4gICAgICAgIGlmIChjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbC5vbkNoYW5nZWQ7XG4gICAgICAgICAgICAgICAgY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXSA9IG9sZE9uQ2hhbmdlO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkT25DaGFuZ2UgPSBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkanVzdGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRFdmVudCA9IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25BZGp1c3RlZFZhbHVlID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25BZGp1c3RlZFZhbHVlID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UpIHtcbiAgICAgICAgaWYgKCFzY2hlbWEuY29ycmVjdG9ycykgc2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcblxuICAgICAgICBpZiAoIXNjaGVtYS52YWxpZGF0b3JzKSBzY2hlbWEudmFsaWRhdG9ycyA9IFtdO1xuXG4gICAgICAgIGlmIChzY2hlbWEucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IFJlcXVpcmVkVmFsaWRhdG9yKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAoc2NoZW1hLnZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCBzY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRTY2hlbWEgPSAoPFRleHRDb250cm9sU2NoZW1hPnNjaGVtYSk7XG4gICAgICAgICAgICBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdudW1iZXInIHx8IHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnYW1vdW50Jykge1xuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBOdW1iZXJPbmx5VmFsaWRhdG9yKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdtb25leScgfHwgdGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdtb25leWludCcpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdlbWFpbCcpIHtcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgRW1haWxWYWxpZGF0b3IoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRleHRTY2hlbWEuY29ycmVjdG9ycykgdGV4dFNjaGVtYS5jb3JyZWN0b3JzID0gW107XG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS5jb3JyZWN0b3JzLnB1c2gobmV3IEdtYWlsQ29ycmVjdG9yKCkpO1xuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBMb3dlckNvcnJlY3RvcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAncGhvbmUnIHx8IHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnZmF4Jykge1xuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBQaG9uZU51bWJlclZhbGlkYXRvcigpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRleHRTY2hlbWEudmFsaWRhdG9ycykge1xuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCB0ZXh0U2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHN1YkNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVTY2hlbWEgPSAoPERhdGVUaW1lQ29udHJvbFNjaGVtYT5zY2hlbWEpO1xuICAgICAgICAgICAgaWYgKGRhdGVUaW1lU2NoZW1hLnZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgICAgICBkYXRlVGltZVNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yIHx8IHZhbGlkYXRvciBpbnN0YW5jZW9mIENvbXBhcmVWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydCh2YWxpZGF0b3IsIGRhdGVUaW1lU2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc3ViQ29udHJvbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgQ2hlY2tEdXBsaWNhdGVWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDaGVja0R1cGxpY2F0ZShzY2hlbWEsIHZhbGlkYXRvci5nZXREdXBsaWNhdGVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSwgdmFsaWRhdG9yLmdldERlZmF1bHRGaWx0ZXJzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvclJlcXVpcmVkcyhzY2hlbWEsIHZhbGlkYXRvci5nZXRSZXF1aXJlZEZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2FtZVZhbHVlVmFsaWRhdG9ycyhzY2hlbWEsIHZhbGlkYXRvci5nZXRTYW1lRmllbGRzKCksIHZhbGlkYXRvci5nZXRNZXNzYWdlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUGFzc3dvcmRWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5fdXNlclNlcnZpY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KFxuICAgICAgICB2YWxpZGF0b3I6IERhdGVDb21wYXJlVmFsaWRhdG9yIHwgTnVtYmVyQ29tcGFyZVZhbGlkYXRvciB8IENvbXBhcmVWYWxpZGF0b3IsXG4gICAgICAgIHNjaGVtYTogRGF0ZVRpbWVDb250cm9sU2NoZW1hIHwgVGV4dENvbnRyb2xTY2hlbWEgfCBNYXNrQ29udHJvbFNjaGVtYVxuICAgICkge1xuICAgICAgICBjb25zdCBjb21wYXJlVW5pcXVlRmllbGQgPSB2YWxpZGF0b3IuY29tcGFyZVVuaXF1ZUZpZWxkO1xuICAgICAgICBpZiAoc2NoZW1hLnVuaXF1ZUZpZWxkID09IGNvbXBhcmVVbmlxdWVGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3JDb21wYXJlID0gdmFsaWRhdG9yLmdldE9wZXJhdG9yQ29tcGFyZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hQ29tcGFyZSA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2NvbXBhcmVVbmlxdWVGaWVsZF0pO1xuICAgICAgICAgICAgaWYgKHNjaGVtYUNvbXBhcmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnNvbWUocCA9PiBwIGluc3RhbmNlb2YgQ29tcGFyZVZhbGlkYXRvclxuICAgICAgICAgICAgICAgICAgICAmJiBwLmNvbXBhcmVVbmlxdWVGaWVsZCA9PSBzY2hlbWEudW5pcXVlRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBEYXRlQ29tcGFyZVZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IERhdGVDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IE51bWJlckNvbXBhcmVWYWxpZGF0b3Iob3BlcmF0b3JDb250cmFzdFtvcGVyYXRvckNvbXBhcmVdLCBzY2hlbWEudW5pcXVlRmllbGQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVWYWxpZGF0b3JDaGVja0R1cGxpY2F0ZShzY2hlbWE6IEZvcm1Db250cm9sQmFzZSwgZmllbGRPdGhlcjogc3RyaW5nW10sIG1lc3NhZ2U6IHN0cmluZywgZGVmYXVsdEZpbHRlcnM6IEZpbHRlcltdKSB7XG4gICAgICAgIGlmIChmaWVsZE90aGVyLmluZGV4T2Yoc2NoZW1hLnVuaXF1ZUZpZWxkKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hT3RoZXIgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tmaWVsZF0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl9jb21tb25TZXJ2aWNlLmlzU2FtZUFycmF5KHRtcEZpZWxkcywgcC5nZXREdXBsaWNhdGVGaWVsZHMoKSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF92YWxpZGF0b3IgPSBuZXcgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IodG1wRmllbGRzLCBtZXNzYWdlLCBkZWZhdWx0RmlsdGVycyk7XG4gICAgICAgICAgICAgICAgICAgIF92YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmaWVsZE90aGVyLmluZGV4T2Yoc2NoZW1hLnVuaXF1ZUZpZWxkKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hT3RoZXIgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tmaWVsZF0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl9jb21tb25TZXJ2aWNlLmlzU2FtZUFycmF5KHRtcEZpZWxkcywgcC5nZXRSZXF1aXJlZEZpZWxkcygpKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBzY2hlbWFPdGhlci52YWxpZGF0b3JzLnB1c2goX3ZhbGlkYXRvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVTYW1lVmFsdWVWYWxpZGF0b3JzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmaWVsZE90aGVyLmluZGV4T2Yoc2NoZW1hLnVuaXF1ZUZpZWxkKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hT3RoZXIgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tmaWVsZF0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBTYW1lVmFsdWVWYWxpZGF0b3JcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0U2FtZUZpZWxkcygpKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBTYW1lVmFsdWVWYWxpZGF0b3IodG1wRmllbGRzLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREYXRhRGVmYXVsdCgpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nRGF0YURlZmF1bHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5ERUZBVUxUX0RBVEEpO1xuICAgICAgICBjb25zdCBnZXRTZXR0aW5nRGF0YURlZmF1bHQgPSB0aGlzLl9tb2R1bGVDb25maWcuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQuc2V0dGluZ0RhdGFEZWZhdWx0O1xuICAgICAgICBpZiAoc3RyaW5nRGF0YURlZmF1bHQgJiYgKHRoaXMuX21vZGVsRGF0YSAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUNhY2hlID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSAoPERyb3Bkb3duQ29udHJvbFNjaGVtYT5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGNvbnRyb2wuZmllbGQgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRTZXR0aW5nRGF0YURlZmF1bHQpIHsgLy8gbOG6pXkgY+G6pXUgaMOsbmggZmllbGQgbWFwUGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRNYXBHZXRDYWNoZSA9IGdldFNldHRpbmdEYXRhRGVmYXVsdFtjb250cm9sLmZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZE1hcEdldENhY2hlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGZpZWxkTWFwR2V0Q2FjaGUgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGF0YUNhY2hlW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhQ2FjaGVbKDxGb3JtU2NoZW1hQmFzZT5pdGVtKS5maWVsZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhWyg8Rm9ybVNjaGVtYUJhc2U+aXRlbSkuZmllbGRdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5mdW5jdGlvbi5tb2RpZnlEYXRhQWZ0ZXJHZXRDYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmZ1bmN0aW9uLm1vZGlmeURhdGFBZnRlckdldENhY2hlKHRoaXMuX21vZGVsRGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5Q2FjaGVkVmFsdWVzKCkge1xuICAgICAgICB0aGlzLmdldENhY2hlZFZhbHVlc0Zyb21TdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKHRoaXMuX21vZGVsRGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDYWNoZWRWYWx1ZVRvTW9kZWwobW9kZWwsIHVuaXF1ZUtleUNvbnRyb2w/OiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBtb2RlbCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkICE9ICdfZXJyb3JzJyAmJiBmaWVsZCAhPSAnX3N0YXR1cycgJiYgZmllbGQgIT0gJ19zb3VyY2UnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YlVuaXF1ZUtleUNvbnRyb2w6IHN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlS2V5Q29udHJvbCAhPSBudWxsICYmIHVuaXF1ZUtleUNvbnRyb2wgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YlVuaXF1ZUtleUNvbnRyb2wgPSB1bmlxdWVLZXlDb250cm9sICsgJy4nICsgZmllbGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdWJVbmlxdWVLZXlDb250cm9sID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sc1tzdWJVbmlxdWVLZXlDb250cm9sXTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzdWJQYXRoO1xuICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViUGF0aCA9IHBhdGggKyAnLicgKyBmaWVsZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YlBhdGggPSBmaWVsZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdWJNb2RlbCA9IG1vZGVsW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3ViTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKGl0ZW0sIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGggKyAnWycgKyBpbmRleCArICddJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzTGl0ZXJhbE9iamVjdChzdWJNb2RlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYWNoZWRWYWx1ZVRvTW9kZWwoc3ViTW9kZWwsIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250cm9sLmVuYWJsZUNhY2hpbmcgJiYgdGhpcy5jYWNoZWRWYWx1ZXMuaGFzT3duUHJvcGVydHkoc3ViUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxbZmllbGRdID0gdGhpcy5jYWNoZWRWYWx1ZXNbc3ViUGF0aF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYWNoZWRWYWx1ZXNGcm9tU3RvcmFnZSgpIHtcbiAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xuICAgICAgICBpZiAoY2FjaGVkVmFsdWVzKSB7XG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjYWNoZWRWYWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVkVmFsdWVzID0gZWxlbWVudC52YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZUNhY2hlVmFsdWVzVG9TdG9yYWdlKCkge1xuICAgICAgICBsZXQgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xuICAgICAgICBpZiAoIWNhY2hlZFZhbHVlcykgY2FjaGVkVmFsdWVzID0gW107XG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICBpZiAodGhpcy5mb3JtSWQpIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuZm9ybUlkO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNhY2hlZFZhbHVlc1tpXTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWVzID0gdGhpcy5jYWNoZWRWYWx1ZXM7XG4gICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNoZWNrRXhpc3QpIHtcbiAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwYXRobmFtZTogcGF0aE5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiB0aGlzLmNhY2hlZFZhbHVlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVkVmFsdWVzJywgSlNPTi5zdHJpbmdpZnkoY2FjaGVkVmFsdWVzKSk7XG4gICAgfVxuXG4gICAgdHJpZ2dlckNoYW5nZShmaWVsZFBhdGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkUGF0aCk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICBpZiAoY29udHJvbCAmJiBjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIG51bGwsICd0cmlnZ2VyJywgY3VycmVudE5vZGUucGFyZW50TW9kZWwsIGN1cnJlbnROb2RlLnBhcmVudE1vZGVsUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzICYmICF0aGlzLnJvb3RDb250ZXh0LmRhdGEuZmxhZ3MuaGFzRm9jdXNpbmdDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0Q29udHJvbCgpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmRhdGEuZmxhZ3MuaGFzRm9jdXNpbmdDb250cm9sID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSwgODAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SXNMb2FkZWREYXRhRWRpdCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0T2xkID0gdGhpcy5sb2FkZWREYXRhRWRpdDtcbiAgICAgICAgdGhpcy5sb2FkZWREYXRhRWRpdCA9IHZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgaGFuZGxlUm93Q2xpY2socm93RGF0YTogYW55LCBjb250cm9sOiBhbnkpIHtcbiAgICAgICAgaWYgKGNvbnRyb2wub25Sb3dDbGljaykge1xuICAgICAgICAgICAgY29udHJvbC5vblJvd0NsaWNrKHJvd0RhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbnRyb2xUeXBlKGNvbnRyb2w6IGFueSkge1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRpdGxlU2NoZW1hKSByZXR1cm4gJ3RpdGxlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYSkgcmV0dXJuICdsYWJlbCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3BhbkNvbnRyb2xTY2hlbWEpIHJldHVybiAnc3BhbkNvbnRyb2wnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSByZXR1cm4gJ21hc2snO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdudW1iZXJyYW5nZSc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRDb250cm9sID0gPFRleHRDb250cm9sU2NoZW1hPmNvbnRyb2w7XG4gICAgICAgICAgICBpZiAodGV4dENvbnRyb2wuaXNSZWFkb25seSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnY29udGVudCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xuICAgICAgICAgICAgICAgIHx8IHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdtb25leWludCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdwaG9uZSdcbiAgICAgICAgICAgICAgICB8fCB0ZXh0Q29udHJvbC5kYXRhRm9ybWF0ID09PSAnZmF4J1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwaG9uZU9yZmF4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBSZWZlcmVuY2VUZXh0Q29udHJvbFNjaGVtYSkgcmV0dXJuICdyZWZlcmVuY2UtdGV4dCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGVtcGxhdGVDb250cm9sU2NoZW1hKSByZXR1cm4gJ3RlbXBsYXRlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZVJhbmdlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkYXRldGltZXJhbmdlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWUnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FkZHJlc3MnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkcm9wZG93bic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRWRpdG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdlZGl0b3InO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHRBcmVhQ29udHJvbFNjaGVtYSkgcmV0dXJuICd0ZXh0YXJlYSc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgV3JhcFBpY2tlckNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiAnY29tbW9uLXBpY2tlcic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGjhuqNpIMSR4buDIGTDsm5nIGTGsOG7m2kg4bufIGLDqm4gdHLDqm4gVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgdsOsIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgOiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnYXV0b2NvbXBsZXRlLXBpY2tlcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAndXNlci1waWNrZXInO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVudGl0eVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZW50aXR5LXBpY2tlcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuICdvcmdhbml6YXRpb24tcGlja2VyJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYU5ldykge1xuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yy1waWNrZXItbmV3JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yy1waWNrZXInO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29DYXVUb0NodWNDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2NvY2F1dG9jaHVjJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnYXV0b2NvbXBsZXRlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTd2l0Y2hDb250cm9sU2NoZW1hKSByZXR1cm4gJ3N3aXRjaCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94JztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja0JveExpc3RDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94bGlzdCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuICdyYWRpb2J1dHRvbmxpc3QnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgSW1hZ2VVcGxvYWRlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnaW1hZ2V1cGxvYWRlcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLm1vZGUgPT0gRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVVwbG9hZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ3NlcnZpY2VGaWxlVXBsb2FkJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdmaWxlTWFuYWdlcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yUGlja2VyJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkgcmV0dXJuICd0YWJsZSc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSByZXR1cm4gJ2NvbnRhaW5lcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQnV0dG9uQ29udHJvbFNjaGVtYSkgcmV0dXJuICdidXR0b24nO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFZhbkJhblBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAndmFuYmFuJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29uZ3ZpZWMnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFBlcmNlbnRDb250cm9sU2NoZW1hKSByZXR1cm4gJ3BlcmNlbnQnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoaXBzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjaGlwcyc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sdW1uU2NoZW1hQmFzZSkgcmV0dXJuICdjb2x1bW4nO1xuICAgICAgICByZXR1cm4gJ2N1c3RvbSc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFZpZXdNb2RlRGF0YVR5cGUoY29udHJvbCkge1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRpdGxlU2NoZW1hKSByZXR1cm4gJ3RpdGxlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYSkgcmV0dXJuICdsYWJlbCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHJldHVybiAnbWFzayc7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVDb250cm9sID0gPERhdGVUaW1lQ29udHJvbFNjaGVtYT5jb250cm9sO1xuICAgICAgICAgICAgaWYgKGRhdGVDb250cm9sLnNob3dUaW1lKSByZXR1cm4gJ2RhdGV0aW1lJztcbiAgICAgICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2h0bWwnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXInO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYVxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrYm94Q29udHJvbFNjaGVtYVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYVxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWFcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAnaGFzRGF0YVNvdXJjZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wubW9kZSA9PSBGaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlVXBsb2FkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVNlcnZpY2VVcGxvYWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2ZpbGVNYW5hZ2VyJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuaXNSZWFkb25seSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnY29udGVudCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXknIHx8IGNvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5aW50Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yUGlja2VyJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkgcmV0dXJuICd0YWJsZSc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgS2V5VmFsdWVDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FwcC1rZXktdmFsdWUnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuICdjb250YWluZXInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH1cblxuICAgIGFzeW5jIHZhbGlkYXRlRm9ybShzZXRWYWxpZGF0ZUZvcm0gPSB0cnVlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmIChzZXRWYWxpZGF0ZUZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMuX2luVmFsaWRGb3JtID0gZmFsc2U7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwodGhpcy5fcm9vdE5vZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2luVmFsaWRGb3JtKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCk7XG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1vZGVsKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2YgY3VycmVudE5vZGUuY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGUuY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuY2hpbGROb2RlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrSGlkZGVuKGNoaWxkTm9kZS5jb250cm9sLCBjaGlsZE5vZGUucGFyZW50TW9kZWwsIGNoaWxkTm9kZS5tb2RlbFBhdGgpKSBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNoaWxkTm9kZSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pblZhbGlkRm9ybSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVNb2RlbChjaGlsZE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtQ29udHJvbChmaWVsZFBhdGgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgY29udHJvbE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkUGF0aCk7XG4gICAgICAgIGlmIChjb250cm9sTm9kZSkge1xuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNvbnRyb2xOb2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBoYW5kbGVDaGFuZ2VEcm9wZG93bihjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGV2ZW50PywgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pIHtcbiAgICAgICAgaWYgKGNvbnRyb2wubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gdGhpcy5ldmVudFR5cGUuSElERSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCBldmVudCwgdGhpcy5ldmVudFR5cGUuQ0hBTkdFLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCBldmVudCwgZXZlbnRUeXBlLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIMSQ4buDIG5ndXnDqm4gaMOgbSBk4bqhbmcgYXJyb3cgZnVuY3Rpb24gdsOsIGPDsyAxIHPhu5EgZm9ybSBraMOhYyBn4buNaVxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlID0gYXN5bmMgKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykgPT4ge1xuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTtcblxuICAgICAgICAvLyByb3cgaW4gdGFibGVcbiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgcGFyZW50TW9kZWwgPSBwYXJlbnROb2RlLm1vZGVsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcblxuICAgICAgICAvLyBhdXRvIGNvcnJlY3QgdmFsdWVcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIGN1cnJlbnROb2RlLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgLy8gdmFsaWRhdGUgdmFsdWVcbiAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZShjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgaWYgKCFidWJibGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXG4gICAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQoZXZlbnREYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYnViYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlLnBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLnBhcmVudE5vZGUgIT0gcGFyZW50Tm9kZS5yb290Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKHBhcmVudE5vZGUuY29udHJvbCwgZXZlbnQsIGV2ZW50VHlwZSwgcGFyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsLCBwYXJlbnROb2RlLnBhcmVudE5vZGUubW9kZWxQYXRoLCBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiBjb250cm9sLmVuYWJsZUNhY2hpbmcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVDb250cm9sVmFsdWUoY29udHJvbCwgdmFsdWUsIHBhcmVudFBhdGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udHJvbC5vbkFmdGVyQ2hhbmdlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWZ0ZXJDaGFuZ2VkKGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoZXZlbnREYXRhKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQga2hpIGRyb3Bkb3duIMSRaeG7gXUgY2jhu4luaCB2YWx1ZSB04burIHJhdyB2YWx1ZSBk4bqhbmcgZ3VpZCB8IGludCB8IC4uLiA9PiBvYmplY3Qga2nhu4N1IHt2YWx1ZTogZ3VpZCB8IGludCB8IC4uLiwgLi4uIFsxIHPhu5EgdHLGsOG7nW5nIGtow6FjXX1cbiAgICAgKiBAcGFyYW0gY29udHJvbFxuICAgICAqIEBwYXJhbSBwYXJlbnRQYXRoXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUFkanVzdFZhbHVlRHJvcGRvd25FdmVudChjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hLCBwYXJlbnRQYXRoPykge1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuQURKVVNUX1ZBTFVFLFxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlRGF0YVNvdXJjZUxvYWRDb21wbGV0ZShjb250cm9sOiBGb3JtQ29udHJvbEJhc2VXaXRoU2VydmljZSwgcGFyZW50UGF0aCwgZGF0YVNvdXJjZSkge1xuXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkZWQoY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hLCBwYXJlbnRQYXRoLCBkYXRhRnJvbURyb3Bkb3duOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgY3VycmVudE5vZGUsXG4gICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkRBVEFTT1VSQ0VfTE9BREVELFxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXMsXG4gICAgICAgICAgICBkYXRhOiBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgPyBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgOiBkYXRhRnJvbURyb3Bkb3duLmRhdGFTb3VyY2VcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZW50RGF0YVsnZWxtJ10gPSBkYXRhRnJvbURyb3Bkb3duLmVsbTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVN0YXRlID09IEZvcm1TdGF0ZS5BRERcbiAgICAgICAgICAgICYmIGNvbnRyb2wuYXV0b0Rpc3BsYXlGaXJzdFxuICAgICAgICAgICAgJiYgZXZlbnREYXRhLmRhdGEubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gfHwgIXRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gW2V2ZW50RGF0YS5kYXRhWzBdW2NvbnRyb2wudmFsdWVGaWVsZF1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IGV2ZW50RGF0YS5kYXRhWzBdW2NvbnRyb2wudmFsdWVGaWVsZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaChldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGhhbmRsZVJlYWR5Q29udHJvbFBpY2tlcihjb250cm9sOiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hIHwgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgfCBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGg/KSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQoY29udHJvbCwgcGFyZW50UGF0aCk7XG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxuICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5SRUFEWSxcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29udHJvbC5vblJlYWR5KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25SZWFkeShldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlTG9hZGVkQ29udHJvbChfY29tcG9uZW50OiBhbnksIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50UGF0aD8pIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XG4gICAgICAgIGlmIChfY29tcG9uZW50ICYmIGN1cnJlbnROb2RlKSB7XG4gICAgICAgICAgICBfY29tcG9uZW50LmN1cnJlbnROb2RlID0gY3VycmVudE5vZGU7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5jb21wb25lbnQgPSBfY29tcG9uZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50UGF0aD8pIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgIHBhcmVudE5vZGUubW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSA9IHRydWU7XG4gICAgICAgIHRoaXMub25Db250cm9sUmVhZHkuZW1pdChjb250cm9sLmZpZWxkKTtcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsRGF0YVtLZXlGbGFzaFNob3ddKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50UGF0aCkgeyAvLyDEkG/huqFuIGNvZGUgdHJvbmcgYmxvY2sgaWYgbsOgeSBjaMawYSBjaHXhuqluLCB04bqhbSB0aOG7nWkgY29kZSB0aOG6vyDEkeG6v24ga2hpIGfhurdwIGNhc2UgbsOgeSB0aMOsIHhlbSBs4bqhaSBzYXVcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudFBhdGh9LiR7Y29udHJvbC5maWVsZH1gXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake2NvbnRyb2wuZmllbGR9YF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGVja0NhblByaW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0NhblByaW50KCkge1xuICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd10gJiYgdGhpcy5jYW5QcmludCkge1xuICAgICAgICAgICAgdGhpcy53YWl0UmVhZHlBbmRQcmludCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2FpdFJlYWR5QW5kUHJpbnQoKSB7XG4gICAgICAgIGNvbnN0IHJlYWR5QWxsID0gdGhpcy5jaGVja1JlYWR5QWxsKCk7XG4gICAgICAgIGlmICh0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVhZHlBbGwpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XTtcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xuICAgICAgICAgICAgdGhpcy5fcHJpbnRQZGZCeVNjaGVtYSh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UsIHRoaXMuX21pbmltaXplZERhdGEsIHRoaXMuc2V0dGluZy5zY2hlbWEpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnJywgZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnVOG6oW8gZmlsZSB0aMOgbmggY8O0bmcnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YS5wcmludEZpbGVJZCA9IHJlcy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5fY29tbW9uU2VydmljZS5jbG9uZU9iamVjdCh0aGlzLl9taW5pbWl6ZWREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlV2FpdEJveCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuX21vZHVsZUNvbmZpZy5nZXRDb25maWcoKS5lbnZpcm9ubWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZVRyaW5oS3koZW52aXJvbm1lbnQsIHRoaXMuc2V0dGluZywgdGhpcy5fbW9kZWxEYXRhLCByZXMuZGF0YSwgdGhpcy5fbm90aWZpZXJTZXJ2aWNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQWZ0ZXJUcmluaEt5LmVtaXQoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnQoKTtcbiAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1vZGVsVGFibGVTY2hlbWFCeUNoaWxkU2NoZW1hKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSkge1xuICAgICAgICBjb25zdCBjb250cm9sVGFibGUgPSB0aGlzLmZvcm1Db250cm9sc1tjb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF1dO1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2xUYWJsZS5maWVsZF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1JlYWR5QWxsKCk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLmhpZGRlbiB8fCAhdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRGaWVsZCA9IGNvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXTtcbiAgICAgICAgICAgIC8vIE7hur91IGzDoCBmaWVsZCB0cm9uZyB0YWJsZSBzY2hlbWFcbiAgICAgICAgICAgIGlmIChwYXJlbnRGaWVsZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyck1vZGVsQ3VuZ0xldmVsID0gdGhpcy5nZXRNb2RlbFRhYmxlU2NoZW1hQnlDaGlsZFNjaGVtYShjb250cm9sKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJyTW9kZWxDdW5nTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJNb2RlbEN1bmdMZXZlbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudEZpZWxkfVske2l9XS4ke2NvbnRyb2wuZmllbGR9YF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5yZWFkeVN0YXR1c1tgJHtjb250cm9sLmZpZWxkfWBdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZU1vZGVsRnJvbUV4dGVybmFsID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgfTtcblxuICAgIC8vIFBo4bqjaSDEkeG7gyBhcnJvdyBmdW5jdGlvbiB2w6wgY8OzIGV4cG9ydCByYSBjaG8gbeG7mXQgc+G7kSB0ZW1wbGF0ZSBz4butIGThu6VuZ1xuICAgIGZpcmVNb2RlbENoYW5nZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xuICAgICAgICB0aGlzLmRhdGFDaGFuZ2UuZW1pdCh0aGlzLl9taW5pbWl6ZWREYXRhKTtcbiAgICB9O1xuXG4gICAgcHVibGljIGhhbmRsZUJ1dHRvbkNsaWNrKGNvbnRyb2w6IEJ1dHRvbkNvbnRyb2xTY2hlbWEsIGV2ZW50LCBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGlmIChjb250cm9sLm9uQ2xpY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNsaWNrKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkNMSUNLLFxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY29ycmVjdFZhbHVlKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcbiAgICAgICAgbGV0IHJlID0gY3VycmVudE5vZGUudmFsdWU7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmNvcnJlY3RvcnMgJiYgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ycmVjdG9yID0gY29udHJvbC5jb3JyZWN0b3JzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5BVVRPX0NPUlJFQ1QsXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmUgPSBjb3JyZWN0b3IuY29ycmVjdChldmVudERhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZTtcbiAgICB9XG5cbiAgICAvLyB0cnVlIGzDoCB0aOG7j2EgbcOjbiwgZmFsc2UgbMOgIGtow7RuZyB0aOG7j2EgbcOjbiAo4bueIGPhuqVwIGhp4buHbiB04bqhaSBjaOG7qSBjaMawYSBraeG7g20gdHJhIGPhuqVwIGNvbilcbiAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUsIGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYVxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWFcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYVxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhcGFyZW50Tm9kZS5tb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gY3VycmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbC5fZXJyb3JzW2N1cnJlbnROb2RlLmZpZWxkXTtcbiAgICAgICAgICAgIGlmICghZXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVycm9ycy5zcGxpY2UoMCwgZXJyb3JzLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWxpZGF0b3JzICYmIGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sLnZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gY29udHJvbC52YWxpZGF0b3JzW2ldO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5WQUxJREFURSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IHZhbGlkYXRvci52YWxpZGF0ZShldmVudERhdGEpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IHZhbGlkYXRvci5nZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuaW5kZXhPZihlcnIpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEVycm9yKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGQpO1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RyxrDhu51uZyBk4buvIGxp4buHdSBraMO0bmcgdOG7k24gdOG6oWknKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvcnMgPSBub2RlLnBhcmVudE5vZGUubW9kZWwuX2Vycm9yc1tub2RlLmZpZWxkXTtcbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgIH1cblxuICAgIHNldEVycm9yKGZpZWxkOiBzdHJpbmcgfCBzdHJpbmdbXSwgZXJyb3I6IHN0cmluZykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goaXRlbSA9PiB0aGlzLl9zZXRFcnJvcihpdGVtLCBlcnJvcikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2V0RXJyb3IoZmllbGQsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3JlbW92ZUVycm9yKGZpZWxkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGQpO1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RyxrDhu51uZyBk4buvIGxp4buHdSBraMO0bmcgdOG7k24gdOG6oWknKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnBhcmVudE5vZGUubW9kZWwuX2Vycm9yc1tub2RlLmZpZWxkXSA9IFtdO1xuICAgIH1cblxuICAgIHJlbW92ZUVycm9yKGZpZWxkOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goaXRlbSA9PiB0aGlzLl9yZW1vdmVFcnJvcihpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVFcnJvcihmaWVsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNhY2hlQ29udHJvbFZhbHVlKGNvbnRyb2wsIHZhbHVlLCBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuZW5hYmxlQ2FjaGluZykge1xuICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXNbcGFyZW50UGF0aCArICcuJyArIGNvbnRyb2wuZmllbGRdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDb21wb25lbnRCeVR5cGUodGVtcGxhdGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdID0gdGhpcy5fY29tbW9uU2VydmljZS5maW5kVGVtcGxhdGVGcm9tTGlzdCh0aGlzLmNoaWxkcmVuLCB0ZW1wbGF0ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVtSW5BcnJheUJ5VmFsdWUoYXJyYXksIHYsIGNvbnRyb2wpIHtcbiAgICAgICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmdW5jR2V0TGFiZWwgPSBjb250cm9sLmZ1bmNHZXRMYWJlbDtcbiAgICAgICAgaWYgKGZ1bmNHZXRMYWJlbCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmdW5jR2V0TGFiZWwgPSBpdGVtID0+IGl0ZW1bY29udHJvbC5kaXNwbGF5RmllbGRdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCB2QXJyID0gdjtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICAgICAgICAgIHZBcnIgPSB2LnRvU3RyaW5nKCkuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZBcnIubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGFycmF5LmZpbmQoeCA9PiB4W2NvbnRyb2wudmFsdWVGaWVsZF0gPT0gdik7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmNHZXRMYWJlbChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2QXJyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuZmlsdGVyKHAgPT4gdkFyci5zb21lKHEgPT4gcSA9PSBwW2NvbnRyb2wudmFsdWVGaWVsZF0pKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gZnVuY0dldExhYmVsKGl0ZW0pKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbUluQXJyYXlCeVRleHRWYWx1ZShhcnJheSwgdikge1xuICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHYgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGFycmF5IGluc3RhbmNlb2YgQXJyYXlcbiAgICAgICAgICAgICYmIGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdi5qb2luKCc7ICcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWRkcmVzc0Rpc3BsYXlUZXh0KHNlbGVjdGVkVmFsdWUpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFiZWxDbGFzcyhjb250cm9sKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBgbGFiZWwtY29udHJvbGA7XG4gICAgICAgIGlmIChjb250cm9sLmluZGV4TGFiZWwpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnIGhhdmVJbmRleCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvVmlldyhlbGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICBpZiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGgxOiBhbnkgPSBlbGUuY2xvc2VzdCgnZGl2W2lkJD1cXCctaG9sZGVyXFwnXScpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChoMSAmJiBoMS5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaDEgPSBoMS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoMS50YWdOYW1lID09PSAnRElWJykgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGgxICYmIGgxLnNjcm9sbEludG9WaWV3KSBoMS5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogLSBTZXQgRm9jdXMgY29udHJvbFxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICovXG5cbiAgICBwcml2YXRlIGZvY3VzRmlyc3RDb250cm9sKCkge1xuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgZGl2cyA9IGZvcm1FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Rpdi5jcnVkLWZvcm0tY29udHJvbCcpO1xuICAgICAgICBpZiAoZGl2cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3REaXZIb2xkZXIgPSBkaXY7XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaW5wdXQ6bm90KFt0eXBlPWZpbGVdKTpub3QoW3R5cGU9aGlkZGVuXSk6bm90KC5pbnB1dC1jYWxlbmRhciknKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVmlldyhmaXJzdENvbnRyb2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gdGhpcy5maXJzdERpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgJiYgZmlyc3RDb250cm9sLmlkLmluZGV4T2YoJ3RpbnktYW5ndWxhcicpICE9IDBcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KGZpcnN0Q29udHJvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2JvZHknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRlcHJlY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aW55bWNlLWZvY3VzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCkge1xuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgZGl2LmVycm9yYDtcbiAgICAgICAgY29uc3QgZGl2SG9sZGVyID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIGlmIChkaXZIb2xkZXIpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVmlldyhmaXJzdENvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gZGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgJiYgZmlyc3RDb250cm9sLmlkLmluZGV4T2YoJ3RpbnktYW5ndWxhcicpICE9IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnYm9keScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcHJldmVudEJsdXIoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHJhcEZvY3VzKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICB3aGlsZSAodGFyZ2V0IHx8IHRhcmdldC50YWdOYW1lID09ICdGT1JNJykge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaWQuZW5kc1dpdGgoJy1ob2xkZXInKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCA9PSB0aGlzLmZpcnN0RGl2SG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDb250cm9sID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCA9PSBldmVudC50YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWaXNpYmxlKGVsZW0pIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChzdHlsZS52aXNpYmlsaXR5ICE9PSAndmlzaWJsZScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCtzdHlsZS5vcGFjaXR5IDwgMC4xKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsZW0ub2Zmc2V0V2lkdGhcbiAgICAgICAgICAgICsgZWxlbS5vZmZzZXRIZWlnaHRcbiAgICAgICAgICAgICsgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgICAgICsgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICAgICAgICAgICAgPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbUNlbnRlciA9IHtcbiAgICAgICAgICAgIHg6IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIGVsZW0ub2Zmc2V0V2lkdGggLyAyLFxuICAgICAgICAgICAgeTogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBlbGVtLm9mZnNldEhlaWdodCAvIDJcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcG9pbnRDb250YWluZXIgPSA8YW55PihcbiAgICAgICAgICAgIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZWxlbUNlbnRlci54LCBlbGVtQ2VudGVyLnkpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwb2ludENvbnRhaW5lcikge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGlmIChwb2ludENvbnRhaW5lciA9PT0gZWxlbSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XG4gICAgICAgICAgICB9IHdoaWxlICgocG9pbnRDb250YWluZXIgPSBwb2ludENvbnRhaW5lci5wYXJlbnROb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dEZWxldGVDb25maXJtKCkudGhlbihhc3luYyBycyA9PiB7XG4gICAgICAgICAgICBpZiAoIXJzKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XG4gICAgICAgICAgICBjb25zdCB0b0RlbGV0ZVJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XG5cbiAgICAgICAgICAgIGxldCB0b0RlbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0aW5nKSB7XG4gICAgICAgICAgICAgICAgdG9EZWxldGUgPSBjb250cm9sLm9uRGVsZXRpbmcobmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5ERUxFVElORyxcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9EZWxldGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLlRBQkxFX0NIQU5HRUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkFmdGVyQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFmdGVyQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLlRBQkxFX0NIQU5HRUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25EZWxldGVkKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuREVMRVRFRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZE5ld1JvdyhcbiAgICAgICAgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCwgZXZlbnRUeXBlPywgZGlzYWJsZU9wZW5EaWFsb2c6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgaW5pdERhdGE6IGFueSA9IHt9LCBmaXJlRXZlbnRGaW5pc2ggPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmIChjb250cm9sLnNob3dFZGl0ICYmICFkaXNhYmxlT3BlbkRpYWxvZykge1xuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1EaWFsb2dNb2RlbC5oZWFkZXIgPSBgVGjDqm0gbeG7m2kgJHtjb250cm9sLmxhYmVsfWA7XG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybURpYWxvZ01vZGVsLnBvcHVwU2l6ZSA9IGNvbnRyb2wucG9wdXBTaXplO1xuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID0gLTE7XG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybURpYWxvZ01vZGVsLmRhdGEgPSB7fTtcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8gPSB7XG4gICAgICAgICAgICAgICAgY29udHJvbCxcbiAgICAgICAgICAgICAgICB0YWJsZVBhdGgsXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1EaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0YWJsZU5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSB0YWJsZVBhdGggKyAnWycgKyBpbmRleCArICddJztcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gaW5pdERhdGE7XG5cbiAgICAgICAgLy8gVGjDqm0gaWQgxJHhu4MgbmfEg24gcmVuZGVyIGxpw6puIHThu6VjXG4gICAgICAgIGlmIChjb250cm9sLmF1dG9HZW5lcmF0ZUlkICYmICghdGhpcy5fY29tbW9uU2VydmljZS5pc1ZhbGlkR3VpZChpbml0RGF0YS5pZCkpKSB7XG4gICAgICAgICAgICBkYXRhLmlkID0gdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZShkYXRhLCBzdWJDb250cm9sLCBwYXJlbnRQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0b0FkZCA9IHRydWU7XG4gICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRvQWRkID0gY29udHJvbC5vbkFkZGluZyhuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuQURESU5HLFxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICB0b0FkZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvQWRkICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnB1c2goZGF0YSk7XG4gICAgICAgICAgICB0YWJsZU5vZGUucmVpbml0Q2hpbGROb2RlcyhmaXJlRXZlbnRGaW5pc2gpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlICE9IHRoaXMuZXZlbnRUeXBlLklOSVQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuVEFCTEVfQ0hBTkdFRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWZ0ZXJDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFmdGVyQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuVEFCTEVfQ0hBTkdFRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGRlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuQURERUQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTXVsdGlSb3coY29udHJvbCwgbGVuZ3RoLCB0YWJsZVBhdGgsIGV2ZW50VHlwZT8pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZGROZXdSb3coY29udHJvbCwgdGFibGVQYXRoLCBldmVudFR5cGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgaGFuZGxlU2F2ZWRUYWJsZVJvdyhkYXRhKSB7XG4gICAgICAgIHRoaXMudGFibGVGb3JtRGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvLmNvbnRyb2w7XG4gICAgICAgIGNvbnN0IHRhYmxlUGF0aCA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8udGFibGVQYXRoO1xuICAgICAgICBjb25zdCBldmVudFR5cGUgPSB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvLmV2ZW50VHlwZTtcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xuICAgICAgICBpZiAodGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID4gLTEpIHtcbiAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbFt0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3ddID0geyAuLi50YWJsZU5vZGUubW9kZWxbdGhpcy50YWJsZUZvcm1DdXJyZW50Um93XSwgLi4uZGF0YSB9O1xuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVOb2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHRhYmxlUGF0aCArICdbJyArIGluZGV4ICsgJ10nO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0b0FkZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGluZykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gY29udHJvbC5vbkFkZGluZyhuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuQURESU5HLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodG9BZGQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcblxuICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT0gdGhpcy5ldmVudFR5cGUuSU5JVCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3dOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25DaGFuZ2VkKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5UQUJMRV9DSEFOR0VELFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWZ0ZXJDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWZ0ZXJDaGFuZ2VkKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5UQUJMRV9DSEFOR0VELFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkZGVkKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5BRERFRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlUm93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcbiAgICAgICAgY29uc3QgY3VyZW50Um93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcbiAgICAgICAgaWYgKGNvbnRyb2wub25TYXZlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25TYXZlKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLlNBVkUsXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWRpdFJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xuICAgICAgICB0aGlzLnRhYmxlRm9ybURpYWxvZ01vZGVsLmhlYWRlciA9IGBT4butYSAke2NvbnRyb2wubGFiZWx9YDtcbiAgICAgICAgdGhpcy50YWJsZUZvcm1TY2hlbWEgPSBjb250cm9sLnJvd1RlbXBsYXRlO1xuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSBpbmRleDtcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xuICAgICAgICBjb25zdCB0b0RlbGV0ZVJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XG4gICAgICAgIHRoaXMudGFibGVGb3JtRGlhbG9nTW9kZWwuZGF0YSA9IHRvRGVsZXRlUm93Tm9kZS52YWx1ZTtcbiAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mbyA9IHtcbiAgICAgICAgICAgIGNvbnRyb2wsXG4gICAgICAgICAgICB0YWJsZVBhdGgsXG4gICAgICAgICAgICBpbmRleFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRhYmxlRm9ybURpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZVJvd09yZGVyZWQoY29udHJvbDogVGFibGVTY2hlbWEsIGV2dCwgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xuICAgICAgICBsZXQgY3VycmVudE5vZGU7XG5cbiAgICAgICAgLy8gcm93IGluIHRhYmxlXG4gICAgICAgIGlmIChjb250cm9sID09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhcmVudE1vZGVsID0gcGFyZW50Tm9kZS5tb2RlbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gY3VycmVudE5vZGUudmFsdWU7XG5cbiAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXG4gICAgICAgIHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUoY3VycmVudE5vZGUpO1xuICAgICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgY3VycmVudE5vZGUsXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXG4gICAgICAgICAgICBzb3VyY2VOb2RlOiBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLFxuICAgICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb250cm9sLm9uUmVvcmRlcmVkKSB7XG4gICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVvcmRlcmVkKGV2ZW50RGF0YSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0NvbnRleHRNZW51KGV2dCwgcm93RGF0YSwgY29udHJvbDogVGFibGVTY2hlbWEpIHtcbiAgICAgICAgdGhpcy5yb3dEYXRhQ3VycmVudCA9IHJvd0RhdGE7XG4gICAgICAgIHRoaXMuYnV0dG9uQ29udGV4dHMgPSBhd2FpdCBjb250cm9sLnJvd0J1dHRvbnMocm93RGF0YSk7XG4gICAgICAgIGlmICghdGhpcy5idXR0b25Db250ZXh0cyB8fCB0aGlzLmJ1dHRvbkNvbnRleHRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvd0NvbnRleHRNZW51KGV2dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvd0NvbnRleHRNZW51KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZ0KTtcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWVzc2FnZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGN1cmVudFJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XG4gICAgICAgIGlmIChjb250cm9sLm9uTWVzc2FnZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uTWVzc2FnZShuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogY3VyZW50Um93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5NRVNTQUdFLFxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUYWJsZUZ1bmN0aW9uQ29sdW1uV2lkdGgoY29udHJvbDogVGFibGVTY2hlbWEpIHtcbiAgICAgICAgbGV0IG5lID0gNTA7XG4gICAgICAgIGlmIChjb250cm9sLnNob3dEZWxldGUpIG5lICs9IDMwO1xuICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCkgbmUgKz0gMzA7XG4gICAgICAgIGlmIChjb250cm9sLnNob3dTYXZlKSBuZSArPSAzMDtcbiAgICAgICAgaWYgKGNvbnRyb2wucm93QnV0dG9ucykgbmUgKz0gMzA7XG4gICAgICAgIHJldHVybiBuZSArICdweCc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1hc2tCeVR5cGUobWFza1R5cGUpIHtcbiAgICAgICAgaWYgKG1hc2tUeXBlID09ICdkZWNpbWFsJykge1xuICAgICAgICAgICAgcmV0dXJuICdkb3Rfc2VwYXJhdG9yLjUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRleHRBbGlnbih0ZXh0QWxpZ246IG51bWJlcikge1xuICAgICAgICBzd2l0Y2ggKHRleHRBbGlnbikge1xuICAgICAgICAgICAgY2FzZSBUZXh0QWxpZ24uQ2VudGVyOlxuICAgICAgICAgICAgICAgIHJldHVybiAnY2VudGVyJztcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLkxlZnQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLlJpZ2h0OlxuICAgICAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tEaXNhYmxlZChkYXRhOiBhbnksIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSkge1xuICAgICAgICByZXR1cm4gZGF0YS5fc3RhdHVzW2NvbnRyb2wuZmllbGRdICYmIChkYXRhLl9zdGF0dXNbY29udHJvbC5maWVsZF0uZGlzYWJsZWQgPT09IHRydWUgfHwgKGRhdGEuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5kaXNhYmxlZCA9PT0gdW5kZWZpbmVkICYmIGNvbnRyb2wuZGlzYWJsZWQpKTtcbiAgICB9XG5cbiAgICBjaGVja0hpZGRlbihjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIHBhcmVudE1vZGVsOiBhbnksIHBhdGg6IHN0cmluZykge1xuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBudWxsO1xuICAgICAgICBpZiAocGF0aCAmJiBjb250cm9sWydub2RlcyddKSB7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGNvbnRyb2xbJ25vZGVzJ11bcGF0aF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRyb2xbJ19oaWRkZW4nXSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdICE9IHVuZGVmaW5lZCAmJiAocGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5oaWRkZW4gPT09IHRydWVcbiAgICAgICAgICAgIHx8IChwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmhpZGRlbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgJiYgKGNvbnRyb2wuaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIHx8IChjb250cm9sLmhpZGRlbkNoZWNrICYmIGNvbnRyb2wuaGlkZGVuQ2hlY2sodGhpcy5fbWluaW1pemVkRGF0YSwgY3VycmVudE5vZGUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkpO1xuICAgICAgICBjdXJyZW50Tm9kZVsnX2hpZGRlbiddID0gISFyZXN1bHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZ2V0Q29udGV4dFRkKGNvbnRyb2wsIHJvd0RhdGEsIGluZGV4LCB0YWJsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRyb2wsXG4gICAgICAgICAgICBkYXRhOiByb3dEYXRhLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICB0YWJsZVBhdGgsXG4gICAgICAgICAgICBwYXJlbnRQYXRoOiBgJHt0YWJsZVBhdGh9WyR7aW5kZXh9XWAsXG4gICAgICAgICAgICBwYXRoOiBgJHt0YWJsZVBhdGh9WyR7aW5kZXh9XS4ke2NvbnRyb2wuZmllbGR9YCxcbiAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXG4gICAgICAgICAgICBtZFdpZHRoOiAxMlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc01vYmlsZU9yVGFibGV0KCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzTW9iaWxlKClcbiAgICAgICAgICAgIHx8IHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc1RhYmxldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQ2FjaGVWYWx1ZXNUb1N0b3JhZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2V0dGluZ3MoZXZlbnQpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hT2xkZXN0KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19PTERFU1QsIG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hTmV3ZXN0KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19ORVdFU1QsIG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hTmV4dChldnQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVYVCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFQcmV2KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19QUkVWLCBudWxsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaChldnQpIHtcblxuICAgIH1cblxuICAgIGdldENvbnRyb2xEYXRhU291cmNlKGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSwgZGF0YTogYW55KSB7XG4gICAgICAgIGlmIChkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGRhdGEuX3NvdXJjZVtjb250cm9sLmZpZWxkXTtcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlO1xuICAgICAgICBpZiAoY29udHJvbC5kYXRhU291cmNlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHJldHVybiBjb250cm9sLmRhdGFTb3VyY2UoKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyUmVsb2FkKGZpZWxkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXTtcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5iaW5kaW5nRmlsdGVycyAmJiBjb250cm9sLmJpbmRpbmdGaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoY29udHJvbC5iaW5kaW5nRmlsdGVyc1swXS5maWVsZCk7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogcGFyZW50Tm9kZSxcbiAgICAgICAgICAgICAgICBzb3VyY2VFdmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBwYXJlbnROb2RlLFxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuQ0hBTkdFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUocGFyZW50Tm9kZSk7XG4gICAgICAgICAgICAvLyBhdXRvIGNvcnJlY3QgdmFsdWVcbiAgICAgICAgICAgIHBhcmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGNvbnRyb2xbS2V5RnVuY3Rpb25SZWxvYWRdKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbFtLZXlGdW5jdGlvblJlbG9hZF0oZXZlbnREYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wuX2NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLl9jb21wb25lbnQuZ2V0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sLl9jb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnRyb2xUcmVlTm9kZSB7XG4gICAgbW9kZWxQYXRoOiBzdHJpbmc7XG4gICAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgcGFyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xuICAgIHJvb3ROb2RlOiBDb250cm9sVHJlZU5vZGU7XG4gICAgY2hpbGROb2RlczogQ29udHJvbFRyZWVOb2RlW10gPSBbXTtcbiAgICBoYXNTY2hlbWEgPSB0cnVlO1xuICAgIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZTtcbiAgICBfY29tcG9uZW50OiBhbnk7XG4gICAgZm9ybUNvbnRyb2xzO1xuICAgIGtleXNQbHVzOiBzdHJpbmdbXTtcbiAgICBpc1Jvb3ROb2RlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50O1xuICAgIHByaXZhdGUgY2hpbGROb2RlRGljID0ge307XG4gICAgcHJpdmF0ZSBkYXRhOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogYW55LCBzY2hlbWFzOiBLZXlWYWx1ZVR5cGUsIGZpZWxkPywgcGFyZW50Tm9kZT86IENvbnRyb2xUcmVlTm9kZSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSBzY2hlbWFzO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUubW9kZWxQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJy4nICsgZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IHBhcmVudE5vZGUuc2NoZW1hUGF0aCArICcuJyArIGZpZWxkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZmllbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxQYXRoID0gcGFyZW50Tm9kZS5tb2RlbFBhdGggKyAnWycgKyBmaWVsZCArICddJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1NjaGVtYSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWxQYXRoID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gZmllbGQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSBwYXJlbnROb2RlLnJvb3ROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290Tm9kZSA9IHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICAgIGlmICh0aGlzLmhhc1NjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250cm9sWydub2RlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xbJ25vZGVzJ11bdGhpcy5tb2RlbFBhdGhdID0gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzW3RoaXMuc2NoZW1hUGF0aF07XG4gICAgICAgIGxldCBrZXlzUGx1cyA9IFtdO1xuICAgICAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAga2V5c1BsdXMgPSBzY2hlbWEuY29udHJvbHMuZmlsdGVyKHEgPT4gcS5maWVsZCkubWFwKHEgPT4gcS5maWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLnJvd1RlbXBsYXRlLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYVBhdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUm9vdE5vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzU2NoZW1hID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gc2NoZW1hc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS51bmlxdWVGaWVsZCA9PSBpdGVtLmZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzUGx1cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleXNQbHVzID0ga2V5c1BsdXM7XG4gICAgICAgIHRoaXMucmVpbml0Q2hpbGROb2RlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWluaXRDaGlsZE5vZGVzKGZpcmVFdmVudEZpbmlzaCA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5jaGlsZE5vZGVzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuY2hpbGROb2RlRGljID0ge307XG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXModGhpcy5kYXRhLCB0aGlzLmZvcm1Db250cm9scywgdGhpcy5rZXlzUGx1cyk7XG4gICAgICAgIGlmIChmaXJlRXZlbnRGaW5pc2ggJiYgdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hICYmIHRoaXMuY29udHJvbC5vblRhYmxlRmluaXNoSW5pdCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICAgICAgc291cmNlTm9kZTogdGhpcyxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcyxcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IEV2ZW50VHlwZS5UQUJMRV9GSU5JU0hfSU5JVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wub25UYWJsZUZpbmlzaEluaXQoZXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdENoaWxkTm9kZXMobW9kZWw6IGFueSwgc2NoZW1hczogW10sIGtleXNQbHVzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xuICAgICAgICAgICAgY29uc3QgYWxsS2V5ID0gbmV3IFNldChbLi4ua2V5c1BsdXMsIC4uLk9iamVjdC5rZXlzKG1vZGVsKV0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSAnX3N0YXR1cycgJiYga2V5ICE9ICdfZXJyb3JzJyAmJiBrZXkgIT0gJ19zb3VyY2UnICYmIGtleSAhPSBLZXlGbGFzaFNob3cpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZShtb2RlbFtrZXldLCBzY2hlbWFzLCBrZXksIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZURpY1tjaGlsZE5vZGUuZmllbGRdID0gY2hpbGROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNhdSBraGkgxJHDoyBpbml0IHhvbmcgbm9kZSBjaG8gcm93IHRow6wgZmlyZSBldmVudCBjaG8gY8OhYyBjb250cm9sIHRyb25nIHJvd1xuICAgICAgICAgICAgLy8gVGjGsOG7nW5nIGTDuW5nIHbhu5tpIG3hu6VjIMSRw61jaCBj4bqnbiBkaXNhYmxlZCwgaGlkZGVuIGPDoWMgY29udHJvbCBj4bunYSByb3cga2hpIGPDsyBuaHUgY+G6p3VcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLmZvckVhY2goXyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfLmNvbnRyb2wgJiYgXy5jb250cm9sLm9uUm93Tm9kZUZpbmlzaEluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IF8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IF8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBFdmVudFR5cGUuUk9XX0ZJTklTSF9JTklUXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uY29udHJvbC5vblJvd05vZGVGaW5pc2hJbml0KGV2ZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBpZiAobW9kZWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKGl0ZW0sIHNjaGVtYXMsIGksIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUucGFyZW50Tm9kZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2RlRGljW2NoaWxkTm9kZS5maWVsZF0gPSBjaGlsZE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2hpbGROb2RlKGZpZWxkKTogQ29udHJvbFRyZWVOb2RlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlRGljW2ZpZWxkXTtcbiAgICB9XG5cbiAgICBzZXRDcnVkRm9ybShjcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fY3J1ZEZvcm0gPSBjcnVkRm9ybTtcbiAgICB9XG5cbiAgICBnZXQgY3J1ZEZvcm0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLl9jcnVkRm9ybTtcbiAgICB9XG5cbiAgICBnZXQgcGFyZW50TW9kZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUubW9kZWw7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldCBwYXJlbnRNb2RlbFBhdGgoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUubW9kZWxQYXRoO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgcGFyZW50Q29udHJvbCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgbW9kZWwodmFsKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBjb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnQ7XG4gICAgfVxuXG4gICAgc2V0IGNvbXBvbmVudCh2YWwpIHtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50ID0gdmFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRIaWRkZW4oZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSkge1xuICAgICAgICAgICAgZmllbGQuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGYsIGhpZGRlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGlkZGVuRmllbGQoZmllbGQsIGhpZGRlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEhpZGRlbkZpZWxkKGZpZWxkOiBzdHJpbmcsIGhpZGRlbjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFByaXZhdGVTdGF0dXMoZmllbGQsICdoaWRkZW4nLCBoaWRkZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZChmaWVsZDogc3RyaW5nIHwgc3RyaW5nW10sIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNhYmxlZEZpZWxkKGYsIGRpc2FibGVkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXREaXNhYmxlZEZpZWxkKGZpZWxkLCBkaXNhYmxlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERpc2FibGVkRmllbGQoZmllbGQ6IHN0cmluZywgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRQcml2YXRlU3RhdHVzKGZpZWxkLCAnZGlzYWJsZWQnLCBkaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRQcml2YXRlU3RhdHVzKGZpZWxkOiBzdHJpbmcsIHByb3A6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgoYCR7dGhpcy5tb2RlbFBhdGh9LiR7ZmllbGR9YCk7XG4gICAgICAgICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZC5zcGxpdCgnLicpLnBvcCgpO1xuICAgICAgICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUuZGF0YS5fc3RhdHVzW2xhc3RGaWVsZF1bcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5fc3RhdHVzW2ZpZWxkXVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5vZGVCeVBhdGgobW9kZWxQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcbiAgICAgICAgaWYgKG1vZGVsUGF0aCA9PSBudWxsIHx8IG1vZGVsUGF0aCA9PT0gJycpIHJldHVybiB0aGlzLnJvb3ROb2RlO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5UcmVlKHRoaXMucm9vdE5vZGUsIG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5U2NoZW1hUGF0aChzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcbiAgICAgICAgaWYgKHNjaGVtYVBhdGggPT0gbnVsbCB8fCBzY2hlbWFQYXRoID09PSAnJykgcmV0dXJuIHRoaXMucm9vdE5vZGU7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRTY2hlbWFJblRyZWUodGhpcy5yb290Tm9kZSwgc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBtb2RlbFBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xuICAgICAgICBpZiAobm9kZS5tb2RlbFBhdGggIT0gbnVsbCAmJiBub2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpID09IG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUubW9kZWxQYXRoICE9IG51bGwgJiYgbW9kZWxQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuZmluZEluVHJlZShjaGlsZE5vZGUsIG1vZGVsUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZSkgcmV0dXJuIHJlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRTY2hlbWFJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcbiAgICAgICAgaWYgKG5vZGUuc2NoZW1hUGF0aCAhPSBudWxsICYmIG5vZGUuc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpID09IHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLnNjaGVtYVBhdGggIT0gbnVsbCAmJiBzY2hlbWFQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLnNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSB0aGlzLmZpbmRTY2hlbWFJblRyZWUoY2hpbGROb2RlLCBzY2hlbWFQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlKSByZXR1cm4gcmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREYXRhU291cmNlVGFibGVTY2hlbWEocGF0aDogc3RyaW5nLCBkYXRhU291cmNlOiBhbnlbXSkge1xuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgocGF0aCk7XG4gICAgICAgIHRhYmxlTm9kZS5zZXREYXRhU291cmNlSW50ZXJuYWwoZGF0YVNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERhdGFTb3VyY2VJbnRlcm5hbChkYXRhU291cmNlOiBhbnlbXSkge1xuICAgICAgICBpZiAoISh0aGlzLmNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RlbC5zcGxpY2UoMCwgdGhpcy5tb2RlbC5sZW5ndGgpO1xuICAgICAgICBpZiAoZGF0YVNvdXJjZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yZWluaXRDaGlsZE5vZGVzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlLl9jcnVkRm9ybS5hZGROZXdSb3codGhpcy5jb250cm9sLCB0aGlzLm1vZGVsUGF0aCwgbnVsbCwgdHJ1ZSwgZGF0YVNvdXJjZVtpXSwgaSA9PSBkYXRhU291cmNlLmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5jb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YVNvdXJjZUludGVybmFsKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUodGhpcy5wYXJlbnROb2RlLmRhdGEsIHRoaXMuY29udHJvbCwgdGhpcy5wYXJlbnROb2RlLm1vZGVsUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
2532
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3J1ZC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RueC1zaGFyZWQvc3JjL2xpYi9jb21wb25lbnRzL2NydWQvY3J1ZC1mb3JtL2NydWQtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFSCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9CLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQ0gsb0JBQW9CLEVBQ3BCLHlCQUF5QixFQUN6QiwrQkFBK0IsRUFDL0IsbUJBQW1CLEVBQ25CLHlCQUF5QixFQUN6QixxQkFBcUIsRUFDckIsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4Qiw4QkFBOEIsRUFDOUIsaUNBQWlDLEVBQ2pDLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsZ0JBQWdCLEVBQ2hCLDJCQUEyQixFQUMzQixlQUFlLEVBQ2YsZUFBZSxFQUNmLGVBQWUsRUFDZixtQkFB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QUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixPQUFPO1NBQ1Y7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzFIO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFVO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxZQUFZLFdBQVcsRUFBRTtZQUNyQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckM7YUFDSSxJQUFJLElBQUksQ0FBQyxPQUFPLFlBQVksZUFBZSxFQUFFO1lBQzlDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1lBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3hHO2FBQ0k7WUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUN0QjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCBqUXVlcnlfIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgeyBEZXZpY2VEZXRlY3RvclNlcnZpY2UgfSBmcm9tICduZ3gtZGV2aWNlLWRldGVjdG9yJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcbmltcG9ydCB7IENvbnRleHRNZW51IH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvY29udGV4dG1lbnUnO1xuXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb21wb25lbnQtYmFzZSc7XG5pbXBvcnQgeyBGb3JtU3RhdGUsIEtleUZsYXNoU2hvdyB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gICAgQWRkcmVzc0NvbnRyb2xTY2hlbWEsXG4gICAgQXV0b0NvbXBsZXRlQ29udHJvbFNjaGVtYSxcbiAgICBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hLFxuICAgIEJ1dHRvbkNvbnRyb2xTY2hlbWEsXG4gICAgQ2hlY2tCb3hMaXN0Q29udHJvbFNjaGVtYSxcbiAgICBDaGVja2JveENvbnRyb2xTY2hlbWEsXG4gICAgQ2hpcHNDb250cm9sU2NoZW1hLFxuICAgIENvQ2F1VG9DaHVjQ29udHJvbFNjaGVtYSxcbiAgICBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWEsXG4gICAgQ29DYXVUb0NodWNQaWNrZXJDb250cm9sU2NoZW1hTmV3LFxuICAgIENvbG9yQ29udHJvbFNjaGVtYSxcbiAgICBDb2xvclBpY2tlckNvbnRyb2xTY2hlbWEsXG4gICAgQ29sdW1uU2NoZW1hQmFzZSxcbiAgICBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEsXG4gICAgQ29udGFpbmVyU2NoZW1hLFxuICAgIENydWRGb3JtU2V0dGluZyxcbiAgICBDcnVkTGlzdFNldHRpbmcsXG4gICAgQ3VzdG9tQ29udHJvbFNjaGVtYSxcbiAgICBEYXRlVGltZUNvbnRyb2xTY2hlbWEsXG4gICAgRGF0ZVRpbWVSYW5nZUNvbnRyb2xTY2hlbWEsXG4gICAgRGlhbG9nTW9kZWwsXG4gICAgRHJvcGRvd25Db250cm9sU2NoZW1hLFxuICAgIEVkaXRvckNvbnRyb2xTY2hlbWEsXG4gICAgRW50aXR5UGlja2VyQ29udHJvbFNjaGVtYSxcbiAgICBFdmVudERhdGEsXG4gICAgRXZlbnRUeXBlLFxuICAgIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSxcbiAgICBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSxcbiAgICBGaWxlVXBsb2FkTW9kZSxcbiAgICBGb3JtQ29udHJvbEJhc2UsXG4gICAgRm9ybUNvbnRyb2xCYXNlV2l0aFNlcnZpY2UsXG4gICAgRm9ybVNjaGVtYUJhc2UsXG4gICAgSW1hZ2VVcGxvYWRlckNvbnRyb2xTY2hlbWEsXG4gICAgS2V5VmFsdWVDb250cm9sU2NoZW1hLFxuICAgIExhYmVsU2NoZW1hLFxuICAgIE1hc2tDb250cm9sU2NoZW1hLFxuICAgIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSxcbiAgICBPcGVyYXRvcixcbiAgICBPcmdhbml6YXRpb25QaWNrZXJDb250cm9sU2NoZW1hLFxuICAgIFBlcmNlbnRDb250cm9sU2NoZW1hLFxuICAgIFBvcHVwU2l6ZSxcbiAgICBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hLFxuICAgIFJlZmVyZW5jZVRleHRDb250cm9sU2NoZW1hLFxuICAgIFNwYW5Db250cm9sU2NoZW1hLFxuICAgIFN3aXRjaENvbnRyb2xTY2hlbWEsXG4gICAgVGFibGVTY2hlbWEsXG4gICAgVGVtcGxhdGVDb250cm9sU2NoZW1hLFxuICAgIFRleHRBbGlnbixcbiAgICBUZXh0QXJlYUNvbnRyb2xTY2hlbWEsXG4gICAgVGV4dENvbnRyb2xTY2hlbWEsXG4gICAgVGl0bGVTY2hlbWEsXG4gICAgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEsXG4gICAgVmFuQmFuUGlja2VyQ29udHJvbFNjaGVtYSxcbiAgICBXcmFwUGlja2VyQ29udHJvbFNjaGVtYVxufSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2Zvcm0tc2NoZW1hJztcbmltcG9ydCB7IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2wsIFJlZ2V4U3BsaXRGaWVsZEJ5SXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0L2NvbW1vbic7XG5pbXBvcnQgeyBLZXlGdW5jdGlvblJlbG9hZCB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2NvbW1vbic7XG5pbXBvcnQgeyBLZXlWYWx1ZVR5cGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvdHlwZXMnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcbmltcG9ydCB7IENydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3J1ZC5zZXJ2aWNlJztcbmltcG9ydCB7IEVudGl0eVBpY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lbnRpdHktcGlja2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWFzdGVyRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tYXN0ZXItZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbm90aWZpZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEcm9wZG93blNlcnZpY2UgfSBmcm9tICcuLi8uLi9kcm9wZG93bi9zZXJ2aWNlcy9kcm9wZG93bi5zZXJ2aWNlJztcbmltcG9ydCB7IGJhc2VUcmluaEt5LCBnZXRSZWdleFJlc3VsdCwgZ2V0U3RyaW5nRGlzcGxheVZhbHVlLCBsb29wQ3Vyc29yRnVuY3Rpb24gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBHbWFpbENvcnJlY3RvciwgTG93ZXJDb3JyZWN0b3IgfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvYmFzZS9jb3JyZWN0b3JzJztcbmltcG9ydCB7XG4gICAgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IsXG4gICAgQ2hlY2tEdXBsaWNhdGVWYWxpZGF0b3IsXG4gICAgQ29tcGFyZVZhbGlkYXRvcixcbiAgICBEYXRlQ29tcGFyZVZhbGlkYXRvcixcbiAgICBFbWFpbFZhbGlkYXRvcixcbiAgICBOdW1iZXJDb21wYXJlVmFsaWRhdG9yLFxuICAgIE51bWJlck9ubHlWYWxpZGF0b3IsXG4gICAgUGFzc3dvcmRWYWxpZGF0b3IsXG4gICAgUGhvbmVOdW1iZXJWYWxpZGF0b3IsXG4gICAgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IsXG4gICAgUmVxdWlyZWRWYWxpZGF0b3IsXG4gICAgU2FtZVZhbHVlVmFsaWRhdG9yXG59IGZyb20gJy4vLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgaXNBcnJheSwgaXNMaXRlcmFsT2JqZWN0LCBtZXJnZUpTT04gfSBmcm9tICcuLy4uLy4uLy4uL2NsYXNzZXMvZW52aXJvbm1lbnQtc2NoZW1hJztcbmltcG9ydCB7IENvbUN0eENvbnN0YW50cyB9IGZyb20gJy4vLi4vLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XG5pbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLy4uLy4uLy4uL21vZGVscy9ncmlkLWluZm8nO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XG5cbi8vIGZpeCBmb3IgYnVpbGQgcHJvZFxuY29uc3QgalF1ZXJ5ID0galF1ZXJ5XztcblxuY29uc3Qgb3BlcmF0b3JDb250cmFzdCA9IHtcbiAgICBbT3BlcmF0b3IuZ3JlYXRlcl06IE9wZXJhdG9yLmxvd2VyLFxuICAgIFtPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXTogT3BlcmF0b3IubG93ZXJUaGFuRXF1YWwsXG4gICAgW09wZXJhdG9yLmxvd2VyXTogT3BlcmF0b3IuZ3JlYXRlcixcbiAgICBbT3BlcmF0b3IubG93ZXJUaGFuRXF1YWxdOiBPcGVyYXRvci5ncmVhdGVyVGhhbkVxdWFsXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NydWQtZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NydWQtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY3J1ZC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbQ29tcG9uZW50Q29udGV4dFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIENydWRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgICBAVmlld0NoaWxkKCdmb3JtRWxlbWVudCcpIGZvcm1FbGVtZW50OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRleHRNZW51JywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbnRleHRNZW51OiBDb250ZXh0TWVudTtcbiAgICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBjaGlsZHJlbjogUXVlcnlMaXN0PFRlbXBsYXRlUmVmPGFueT4+O1xuXG4gICAgLy8gQFZpZXdDaGlsZCgndGVtcGxhdGVDb25nVmllY0Zvcm0nLCB7IHN0YXRpYzogZmFsc2UgfSkgc2V0IHRlbXBsYXRlQ29uZ1ZpZWNGb3JtKHZhbHVlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgLy8gICAgIHRoaXMudGVtcGxhdGVzW0ZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xdID0gdmFsdWU7XG4gICAgLy8gfTtcblxuICAgIEBJbnB1dCgpIHNldHRpbmc6IENydWRGb3JtU2V0dGluZyA9IG5ldyBDcnVkRm9ybVNldHRpbmcoKTtcbiAgICBASW5wdXQoKSBjb250ZXh0OiBDb21wb25lbnRDb250ZXh0U2VydmljZTtcblxuICAgIEBJbnB1dCgpIGZpbGVzVXBsb2FkZWQgPSBbXTtcbiAgICBASW5wdXQoKSBpc1ZpZXdNb2RlID0gZmFsc2U7XG4gICAgQElucHV0KCkgZGlzYWJsZUtleXByZXNzQ29udHJvbCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGRpc2FibGVDYWNoaW5nID0gZmFsc2U7XG4gICAgX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCBjcnVkLWZvcm0tY29udGFpbmVyJztcbiAgICBASW5wdXQoKSBzZXQgc3R5bGVDbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgPSAncC1mbHVpZCBjcnVkLWZvcm0tY29udGFpbmVyJztcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0eWxlQ2xhc3MgKz0gYCAke3ZhbHVlfWA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKSB1c2VHcmlkVGVtcGxhdGUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBmb3JtSWQgPSAnJztcbiAgICBASW5wdXQoKSBmb3JtQ2xhc3MgPSAnJztcbiAgICBASW5wdXQoKSBhdXRvRm9jdXMgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHRyYXBGb2N1cyA9IHRydWU7XG5cbiAgICBASW5wdXQoKSBzZXQgZGF0YSh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuY2FuUHJpbnQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX21pbmltaXplZERhdGEgIT0gdmFsdWUgJiYgaXNMaXRlcmFsT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbigpO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhID0gbWVyZ2VKU09OKHRoaXMuX21vZGVsRGF0YSwgdmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5yZUluaXRDb250cm9sTW9kZWxBbmRSb290Tm9kZSgpO1xuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKHRoaXMuX21vZGVsRGF0YSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkZWREYXRhRWRpdE9sZCAmJiB0aGlzLmxvYWRlZERhdGFFZGl0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5QcmludCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0NhblByaW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhID0ge307XG4gICAgICAgICAgICB0aGlzLnJlSW5pdENvbnRyb2xNb2RlbEFuZFJvb3ROb2RlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgQElucHV0KCkgZm9ybVN0YXRlOiBGb3JtU3RhdGUgPSBGb3JtU3RhdGUuRURJVDtcblxuICAgIEBPdXRwdXQoKSBvbkZvcm1SZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkNvbnRyb2xSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbkFsbENvbnRyb2xSZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBvbk1vZGVsQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBkYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RXZlbnREYXRhPiA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnREYXRhPigpO1xuICAgIEBPdXRwdXQoKSBvbkFmdGVyVHJpbmhLeSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgX3Jvb3ROb2RlOiBDb250cm9sVHJlZU5vZGU7XG4gICAgX21pbmltaXplZERhdGE6IGFueTtcbiAgICBfbW9kZWxEYXRhOiBhbnkgPSB7fTtcbiAgICBfdW5zdWJzY3JpYmVBbGwgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgX2luVmFsaWRGb3JtID0gZmFsc2U7XG4gICAgZXZlbnRUeXBlID0gRXZlbnRUeXBlO1xuXG4gICAgLy8gRG9jIHR1IGNhdSBoaW5oIHRoYW0gc28gaGUgdGhvbmdcbiAgICBsaW1pdFNpemUgPSAwO1xuICAgIGZvcm1Db250cm9sczogS2V5VmFsdWVUeXBlID0ge307XG4gICAgZnVuY0NoZWNrVW5pcXVlRmllbGQ6IGFueSA9IHt9O1xuICAgIGJlZm9yZURhdGE6IGFueSA9IHt9O1xuICAgIGZpcnN0RGl2SG9sZGVyOiBhbnk7XG4gICAgY2FjaGVkVmFsdWVzID0ge307XG4gICAgdGVtcGxhdGVzOiB7IFtrZXk6IHN0cmluZ106IFRlbXBsYXRlUmVmPGFueT47IH0gPSB7fTtcbiAgICBfcHJlZml4Q3VzdG9tSGVhZGVyID0gJ2N1c3RvbUhlYWRlcl8nO1xuICAgIGNvbmdWaWVjU2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nO1xuXG4gICAgbG9hZGVkRGF0YUVkaXRPbGQgPSBmYWxzZTtcbiAgICBsb2FkZWREYXRhRWRpdCA9IGZhbHNlO1xuICAgIGNhblByaW50ID0gZmFsc2U7XG5cbiAgICB0YWJsZUZvcm1EaWFsb2dNb2RlbCA9IG5ldyBEaWFsb2dNb2RlbCh7XG4gICAgICAgIHBvcHVwU2l6ZTogbmV3IFBvcHVwU2l6ZSh7IHdpZHRoOiAxMTAwLCBoZWlnaHQ6IDY1MCB9KVxuICAgIH0pO1xuICAgIHRhYmxlRm9ybUN1cnJlbnRSb3c6IG51bWJlcjtcbiAgICB0YWJsZUZvcm1TY2hlbWE6IEZvcm1TY2hlbWFCYXNlW10gPSBbXTtcbiAgICB0YWJsZUZvcm1DdXJyZW50SW5mbzogYW55ID0ge307XG5cbiAgICBidXR0b25Db250ZXh0czogTWVudUl0ZW1bXSA9IFtdO1xuICAgIHJvd0RhdGFDdXJyZW50OiBhbnkgPSB7fTtcbiAgICBjb250cm9sTmVlZENoZWNrUmVhZHk6IEZvcm1TY2hlbWFCYXNlW10gPSBbXTtcbiAgICByZWFkeVN0YXR1czogYW55ID0ge307XG4gICAgZmllbGRQYXJlbnRGaWVsZCA9ICdwYXJlbnRGaWVsZCc7XG4gICAgd2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0OiBhbnk7XG4gICAgcHVibGljIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcbiAgICBwdWJsaWMgX21hc3RlckRhdGFTZXJ2aWNlOiBNYXN0ZXJEYXRhU2VydmljZTtcbiAgICBwdWJsaWMgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHVibGljIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgX2NydWRTZXJ2aWNlOiBDcnVkU2VydmljZSxcbiAgICAgICAgcHVibGljIF9kZXZpY2VEZXRlY3RvclNlcnZpY2U6IERldmljZURldGVjdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfZHJvcGRvd25TZXJ2aWNlOiBEcm9wZG93blNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgIHB1YmxpYyBfZW50aXR5UGlja2VyU2VydmljZTogRW50aXR5UGlja2VyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfbW9kdWxlQ29uZmlnOiBNb2R1bGVDb25maWdTZXJ2aWNlLFxuICAgICkge1xuICAgICAgICBzdXBlcihfaW5qZWN0b3IpO1xuICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTm90aWZpZXJTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTWFzdGVyRGF0YVNlcnZpY2UpO1xuICAgICAgICB0aGlzLl91c2VyU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChVc2VyU2VydmljZSk7XG5cbiAgICAgICAgLy8gR2V0IENvbmZpZ3VyYXRpb25TeXN0ZW1cbiAgICAgICAgdGhpcy5fbWFzdGVyRGF0YVNlcnZpY2UuZ2V0Q29uZmlnQnlDb2RlKCdTaXplT2ZGaWxlJykudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbWl0U2l6ZSA9IE51bWJlcihyZXNwb25zZSkgKiAxMDAwICogMTAwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmhpZGRlblRyaW5oS3kpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dGluZy5zY2hlbWEucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEoe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3ByaW50RmlsZUlkJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdGaWxlJyxcbiAgICAgICAgICAgICAgICAgICAgbW9kZTogRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgaGlkZGVuQ2hlY2s6IChtb2RlbCwgY3VycmVudE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbW9kZWwucHJpbnRGaWxlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5pdExvYWQoKTtcbiAgICB9XG5cbiAgICBzd2l0Y2hWaWV3TW9kZShyZWFkb25seVZpZXcgPSB0cnVlKSB7XG4gICAgICAgIHRoaXMuaXNWaWV3TW9kZSA9IHJlYWRvbmx5VmlldztcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoY29udHJvbCwgdGhpcy5pc1ZpZXdNb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5pbml0TG9hZCgpO1xuICAgIH1cblxuICAgIGNsZWFuKCkge1xuICAgICAgICB0aGlzLmNsZWFuTW9kZWwodGhpcy5fbW9kZWxEYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFuTW9kZWwobW9kZWwpIHtcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1vZGVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnX3N0YXR1cycpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsW2tleV1bc10gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PSAnX2Vycm9ycycpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzIGluIG1vZGVsW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsW2tleV1bc10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhbk1vZGVsKG1vZGVsW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1vZGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhbk1vZGVsKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVJbml0Q29udHJvbE1vZGVsQW5kUm9vdE5vZGUoKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwodGhpcy5fbW9kZWxEYXRhLCBjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb290Tm9kZU9sZCA9IHRoaXMuX3Jvb3ROb2RlO1xuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlLnNldENydWRGb3JtKHRoaXMpO1xuICAgICAgICBpZiAocm9vdE5vZGVPbGQpIHtcbiAgICAgICAgICAgIHJvb3ROb2RlT2xkLmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdOb2RlID0gdGhpcy5fcm9vdE5vZGUuY2hpbGROb2Rlcy5maW5kKHEgPT4gcS5tb2RlbFBhdGggPT0gbm9kZS5tb2RlbFBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld05vZGUuY29tcG9uZW50ID0gbm9kZS5jb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgY3VycmVudE5vZGU6IHRoaXMuX3Jvb3ROb2RlLFxuICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5NT0RFTF9DSEFOR0VELFxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMub25Nb2RlbENoYW5nZWQuZW1pdChldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNaW5pbWl6ZURhdGEobW9kZWwpIHtcbiAgICAgICAgaWYgKGlzTGl0ZXJhbE9iamVjdChtb2RlbCkpIHtcbiAgICAgICAgICAgIGlmIChtb2RlbC5fZHJvcGRvd252YWx1ZSAhPSBudWxsICYmIG1vZGVsLl9kcm9wZG93bnZhbHVlICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFttb2RlbC5fZHJvcGRvd252YWx1ZV0gPT0gbnVsbCA/IG1vZGVsWyd2YWx1ZSddIDogbW9kZWxbbW9kZWwuX2Ryb3Bkb3dudmFsdWVdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBtb2RlbCkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gJ19zdGF0dXMnICYmIGtleSAhPSAnX2Vycm9ycycgJiYga2V5ICE9ICdfc291cmNlJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0TWluaW1pemVEYXRhKG1vZGVsW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0FycmF5KG1vZGVsKSkge1xuICAgICAgICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW9kZWwpIHtcbiAgICAgICAgICAgICAgICBhcnIucHVzaCh0aGlzLmdldE1pbmltaXplRGF0YShpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1vZGVsICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBtb2RlbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRMb2FkKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2V0dGluZy5zY2hlbWEpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zY2hlbWEubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIHRo4buxYyBoaeG7h24gc2F1IGPDuW5nIGtoaSBtb2RlbCDEkcOjIGluaXQgeG9uZyB2w6AgY8OhYyBz4buxIGtp4buHbiBhZGQgcm93IHRo4buxYyBoaeG7h24geG9uZ1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUV2ZW50ID0gbmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5GT1JNX1JFQURZLFxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMub25Gb3JtUmVhZHkuZW1pdChmb3JtRXZlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRTY2hlbWEoKTtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVDYWNoaW5nICYmICF0aGlzLl9tb2RlbERhdGEuaWQpIHRoaXMuYXBwbHlDYWNoZWRWYWx1ZXMoKTtcbiAgICAgICAgdGhpcy5zZXREYXRhRGVmYXVsdCgpO1xuXG4gICAgICAgIC8vIHRo4buxYyBoaeG7h24gc2F1IGPDuW5nIGtoaSBtb2RlbCDEkcOjIGluaXQgeG9uZyB2w6AgY8OhYyBz4buxIGtp4buHbiBhZGQgcm93IHRo4buxYyBoaeG7h24geG9uZ1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1FdmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkZPUk1fUkVBRFksXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vbkZvcm1SZWFkeS5lbWl0KGZvcm1FdmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFNjaGVtYSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuc2V0dGluZy5zY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoY29udHJvbCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XG4gICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3IoY29udHJvbCk7XG4gICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShjb250cm9sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZSh0aGlzLl9tb2RlbERhdGEsIHRoaXMuZm9ybUNvbnRyb2xzKTtcbiAgICAgICAgdGhpcy5fcm9vdE5vZGUuc2V0Q3J1ZEZvcm0odGhpcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0Q29udHJvbE1vZGVsKHBhcmVudE1vZGVsLCBjb250cm9sLCBwYXJlbnRQYXRoPykge1xuICAgICAgICB0aGlzLmluaXRQcml2YXRlRGF0YShwYXJlbnRNb2RlbCwgY29udHJvbC5maWVsZCk7XG5cbiAgICAgICAgbGV0IF9wYXJlbnRQYXRoID0gY29udHJvbC5maWVsZDtcbiAgICAgICAgaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgX3BhcmVudFBhdGggPSBwYXJlbnRQYXRoICsgJy4nICsgX3BhcmVudFBhdGg7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSB8fCAhKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFkZE1vcmUgPSBjb250cm9sLmluaXRSb3dDb3VudCAtIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLmxlbmd0aDtcbiAgICAgICAgICAgIGlmIChhZGRNb3JlID4gMCAmJiAhcGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIHRo4buxYyBoaeG7h24gc2F1IGPDuW5nIGtoaSB04bqldCBj4bqjIG1vZGVsIMSRw6MgaW5pdCB4b25nXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlbERhdGEuaWQpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNdWx0aVJvdyhjb250cm9sLCBhZGRNb3JlLCBfcGFyZW50UGF0aCwgJ2luaXQnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChpdGVtLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCArICdbJyArIGkgKyAnXScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID09IG51bGwgfHwgIWlzTGl0ZXJhbE9iamVjdChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5jb250cm9scykge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xNb2RlbChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGVsc2Uge1xuICAgICAgICAvLyAgICAgLy8gaWYgKCFwYXJlbnRNb2RlbC5oYXNPd25Qcm9wZXJ0eShjb250cm9sLmZpZWxkKSAmJiBjb250cm9sLmZpZWxkICE9IG51bGwpIHtcbiAgICAgICAgLy8gICAgIC8vICAgICBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9IGNvbnRyb2wuZGVmYXVsdFZhbHVlO1xuICAgICAgICAvLyAgICAgLy8gfVxuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgaW5pdENvbnRyb2xEZWZhdWx0VmFsdWVGcm9tRXh0ZXJuYWwoKSB7XG4gICAgICAgIC8vIGNvbnN0IHNjaGVtYUR5bmFtaWNzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLnNldHRpbmcuc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XG4gICAgICAgICAgICAvLyBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEN1c3RvbUNvbnRyb2xTY2hlbWFcbiAgICAgICAgICAgIC8vICAgICAmJiB0aGlzLmNoZWNrSXNEeW5hbWljQ29udHJvbChjb250cm9sKVxuICAgICAgICAgICAgLy8gKSB7XG4gICAgICAgICAgICAvLyAgICAgc2NoZW1hRHluYW1pY3MucHVzaChjb250cm9sKTtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBU4bqhbSB0aOG7nWkgayByZW5kZXIgbHXDtG4gdMOqbiBjw7RuZyB2aeG7h2MgdHJvbmcgZm9ybSBpbml0LCB2w6wgxJFhbmcgayBraeG7g20gc2/DoXQgZGMga2hpIG7DoG8gdOG6pXQgY+G6oyBjb250cm9sIHJlYWR5XG4gICAgICAgIC8vIHNjaGVtYUR5bmFtaWNzLmZvckVhY2goc2NoZW1hID0+IHtcbiAgICAgICAgLy8gICAgIHRoaXMucmVuZGVyVGVuQ29uZ1ZpZWModGhpcy5fbW9kZWxEYXRhLCBzY2hlbWEpO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBpbml0Q29udHJvbERlZmF1bHRWYWx1ZShwYXJlbnRNb2RlbCwgY29udHJvbCwgcGFyZW50UGF0aD8pIHtcbiAgICAgICAgdGhpcy5pbml0UHJpdmF0ZURhdGEocGFyZW50TW9kZWwsIGNvbnRyb2wuZmllbGQpO1xuXG4gICAgICAgIGxldCBfcGFyZW50UGF0aCA9IGNvbnRyb2wuZmllbGQ7XG4gICAgICAgIGlmIChwYXJlbnRQYXRoICE9IG51bGwpIF9wYXJlbnRQYXRoID0gcGFyZW50UGF0aCArICcuJyArIF9wYXJlbnRQYXRoO1xuXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmICghcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gfHwgIShwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhZGRNb3JlID0gY29udHJvbC5pbml0Um93Q291bnQgLSBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoYWRkTW9yZSA+IDAgJiYgIXBhcmVudE1vZGVsLl9zdGF0dXNbY29udHJvbC5maWVsZF0ucmVhZHkpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUoaXRlbSwgc3ViQ29udHJvbCwgX3BhcmVudFBhdGggKyAnWycgKyBpICsgJ10nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmIChwYXJlbnRNb2RlbFtjb250cm9sLmZpZWxkXSA9PSBudWxsIHx8ICFpc0xpdGVyYWxPYmplY3QocGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0pKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50TW9kZWxbY29udHJvbC5maWVsZF0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sRGVmYXVsdFZhbHVlKHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdLCBzdWJDb250cm9sLCBfcGFyZW50UGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXBhcmVudE1vZGVsLmhhc093blByb3BlcnR5KGNvbnRyb2wuZmllbGQpICYmIGNvbnRyb2wuZmllbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmRlZmF1bHRWYWx1ZSAhPT0gbnVsbCAmJiBjb250cm9sLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuYXV0b0Rpc3BsYXlGaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udHJvbC5fY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBjb250cm9sLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyb2wuX2NvbXBvbmVudC5kYXRhU291cmNlSW50ZXJuYWwubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsW2NvbnRyb2wuZmllbGRdID0gY29udHJvbC5fY29tcG9uZW50LmRhdGFTb3VyY2VJbnRlcm5hbFswXS52YWx1ZVtjb250cm9sLnZhbHVlRmllbGRdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0UHJpdmF0ZURhdGEocGFyZW50TW9kZWwsIGZpZWxkKSB7XG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3NvdXJjZSkgcGFyZW50TW9kZWwuX3NvdXJjZSA9IHt9O1xuXG4gICAgICAgIGlmICghcGFyZW50TW9kZWwuX3N0YXR1cykgcGFyZW50TW9kZWwuX3N0YXR1cyA9IHt9O1xuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9lcnJvcnMpIHBhcmVudE1vZGVsLl9lcnJvcnMgPSB7fTtcblxuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9zdGF0dXNbZmllbGRdKSBwYXJlbnRNb2RlbC5fc3RhdHVzW2ZpZWxkXSA9IHt9O1xuICAgICAgICBpZiAoIXBhcmVudE1vZGVsLl9lcnJvcnNbZmllbGRdKSBwYXJlbnRNb2RlbC5fZXJyb3JzW2ZpZWxkXSA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyByZUluaXRDb250cm9sU2NoZW1hKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbFNjaGVtYShjb250cm9sKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yb290Tm9kZSA9IG5ldyBDb250cm9sVHJlZU5vZGUodGhpcy5fbW9kZWxEYXRhLCB0aGlzLmZvcm1Db250cm9scyk7XG4gICAgICAgIHRoaXMuX3Jvb3ROb2RlLnNldENydWRGb3JtKHRoaXMpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1FdmVudCA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0aGlzLl9yb290Tm9kZSxcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkZPUk1fUkVBRFksXG4gICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vbkZvcm1SZWFkeS5lbWl0KGZvcm1FdmVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdENvbnRyb2xTY2hlbWEoc2NoZW1hOiBGb3JtU2NoZW1hQmFzZSwgcGFyZW50SWQ/KSB7XG4gICAgICAgIGlmIChzY2hlbWEuZGlzYWJsZWQgIT0gdHJ1ZSkge1xuICAgICAgICAgICAgc2NoZW1hLmRpc2FibGVkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc1ZpZXdNb2RlKSB7XG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEubGFiZWwgJiYgIXNjaGVtYS5mdWxsTGFiZWwpIHtcbiAgICAgICAgICAgIHNjaGVtYS5mdWxsTGFiZWwgPSBzY2hlbWEubGFiZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNjaGVtYVsnaXNSZWFkb25seSddKSB7XG4gICAgICAgICAgICBzY2hlbWEuY2xhc3MgKz0gJyBjb250cm9sLWRpc2FibGVkICc7XG4gICAgICAgICAgICBzY2hlbWEuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEuaXNIb3Jpem9udGFsbHlMYWJlbCkge1xuICAgICAgICAgICAgc2NoZW1hLmNsYXNzICs9ICcgY29udHJvbC1kLWZsZXggJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUaXRsZVNjaGVtYVxuICAgICAgICAgICAgfHwgc2NoZW1hIGluc3RhbmNlb2YgTGFiZWxTY2hlbWFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBzY2hlbWEuc2hvd0xhYmVsID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXNjaGVtYS5maWVsZCkge1xuICAgICAgICAgICAgICAgIHNjaGVtYS5maWVsZCA9IHRoaXMuX2NvbW1vblNlcnZpY2UuZ3VpZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYS5maWVsZCkge1xuICAgICAgICAgICAgbGV0IGtleSA9IHNjaGVtYS5maWVsZDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRJZCAhPSBudWxsKSBrZXkgPSBwYXJlbnRJZCArICcuJyArIGtleTtcbiAgICAgICAgICAgIHNjaGVtYS51bmlxdWVGaWVsZCA9IGtleTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2xzW2tleV0gPSBzY2hlbWE7XG4gICAgICAgIH1cblxuICAgICAgICBzY2hlbWFbJ2NvbnRyb2xUeXBlJ10gPSB0aGlzLmdldENvbnRyb2xUeXBlKHNjaGVtYSk7XG4gICAgICAgIHNjaGVtYVsnZGF0YVR5cGUnXSA9IHRoaXMuZ2V0Vmlld01vZGVEYXRhVHlwZShzY2hlbWEpO1xuXG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XG4gICAgICAgICAgICBpZiAoIWNvbnRyb2wud2lkdGhGdW5jdGlvbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIGxldCBidXR0b25Db3VudCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd1NhdmUpIGJ1dHRvbkNvdW50Kys7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0VkaXQpIGJ1dHRvbkNvdW50Kys7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuc2hvd0RlbGV0ZSkgYnV0dG9uQ291bnQrKztcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5yb3dCdXR0b25zKSBidXR0b25Db3VudCsrO1xuICAgICAgICAgICAgICAgIC8vIDIuMzU3IGzDoCBjaGnhu4F1IHLhu5luZyBj4bunYSBt4buXaSBidXR0b24sIDEgbMOgIHBhZGRpbmcgdHLDoWkgcGjhuqNpIDAuNXJlbVxuICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gMi4zNTcgKiBidXR0b25Db3VudCArIDE7XG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoIDwgNikge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sLndpZHRoRnVuY3Rpb25Db2x1bW4gPSBgNi4zcmVtYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wud2lkdGhGdW5jdGlvbkNvbHVtbiA9IGAke3dpZHRofXJlbWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICBzdWJDb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF0gPSBjb250cm9sLnVuaXF1ZUZpZWxkO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgc2NoZW1hLnVuaXF1ZUZpZWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcbiAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghZHJvcGRvd25Db250cm9sU2NoZW1hLmJpbmRpbmdGaWx0ZXJzKSB7XG4gICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmxvYWRPbkluaXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZHJvcGRvd25Db250cm9sU2NoZW1hLmFsbG93TG9hZERhdGFXaGVuUGFyZW50TnVsbCkge1xuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYVsnY291bnRQYXJlbnRIYXNWYWx1ZSddID0gMDtcbiAgICAgICAgICAgICAgICAvLyBLaeG7g20gdHJhIHBhcmVudCBjw7MgdmFsdWUgY2jGsGEsIG7hur91IGPDsyByIHRow6wgxJHhu4MgcGFyZW50IHRyaWdnZXIgbG9hZCBjaOG7qSBrIHThu7EgbG9hZFxuICAgICAgICAgICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycy5mb3JFYWNoKGJpbmRpbmdGaWx0ZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW2JpbmRpbmdGaWx0ZXIuc291cmNlRmllbGRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWFbJ2NvdW50UGFyZW50SGFzVmFsdWUnXSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gTuG6v3UgcGFyZW50IMSR4buBdSBrIGPDsyB2YWx1ZSB0aMOsIMSR4buDIHThu7EgbG9hZFxuICAgICAgICAgICAgICAgIGlmICghZHJvcGRvd25Db250cm9sU2NoZW1hWydjb3VudFBhcmVudEhhc1ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd25Db250cm9sU2NoZW1hLmxvYWRPbkluaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kZXZpY2VEZXRlY3RvclNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcbiAgICAgICAgICAgICAgICBkcm9wZG93bkNvbnRyb2xTY2hlbWEuZmlsdGVyID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgdXNlclBpY2tlckNvbnRyb2xTY2hlbWEgPSA8RHJvcGRvd25Db250cm9sU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIHVzZXJQaWNrZXJDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgc3ViQ29udHJvbFt0aGlzLmZpZWxkUGFyZW50RmllbGRdID0gY29udHJvbC51bmlxdWVGaWVsZDtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGNvbnRyb2wudW5pcXVlRmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZUNvbnRyb2xTY2hlbWEgPSA8QXV0b0NvbXBsZXRlUGlja2VyQ29udHJvbFNjaGVtYT5zY2hlbWE7XG4gICAgICAgICAgICBhdXRvY29tcGxldGVDb250cm9sU2NoZW1hLnJldHVyblR5cGUgPSAnb2JqZWN0JztcbiAgICAgICAgICAgIHRoaXMuY29udHJvbE5lZWRDaGVja1JlYWR5LnB1c2goc2NoZW1hKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkucHVzaChzY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIHNjaGVtYS5maXJlQ2FsbEJhY2tJbnNpZGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDdXN0b21Db250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jaGVja0lzVGFza0NvbnRyb2woc2NoZW1hKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZ1ZpZWNTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZ1ZpZWNTZXR0aW5nLmlzV29ya2Zsb3dUcmVlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzY2hlbWEuZGF0YS5maWVsZFBhcmVudEZvclRhc2tzID0gW107XG4gICAgICAgICAgICAgICAgbG9vcEN1cnNvckZ1bmN0aW9uKFxuICAgICAgICAgICAgICAgICAgICBnZXRSZWdleFJlc3VsdChzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWUsIFJlZ2V4U3BsaXRGaWVsZEJ5SXRlbSwgZXhlY1Jlc3VsdCA9PiBleGVjUmVzdWx0WzFdKSxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmRhdGEuZmllbGRQYXJlbnRGb3JUYXNrcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjaGVtYUNoaWxkID0gdGhpcy5zZXR0aW5nLnNjaGVtYS5maW5kKHEgPT4gcS5maWVsZCA9PSBmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hQ2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZU9uQ2hhbmdlRXZlbnQoc2NoZW1hQ2hpbGQsIChldnQ6IEV2ZW50RGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclRlbkNvbmdWaWVjKGV2dC5yb290TW9kZWwsIHNjaGVtYSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkaXNhYmxlQ29udHJvbFNjaGVtYShzY2hlbWE6IEZvcm1TY2hlbWFCYXNlLCBkaXNhYmxlZCA9IHRydWUpIHtcbiAgICAgICAgaWYgKCFzY2hlbWEuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHNjaGVtYS5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxUYWJsZVNjaGVtYT5zY2hlbWE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCwgZGlzYWJsZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVDb250cm9sU2NoZW1hKHN1YkNvbnRyb2wsIGRpc2FibGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tJc1Rhc2tDb250cm9sKHNjaGVtYSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLmZpZWxkID09IEZpZWxkRGVmaW5lSXNUYXNrRm9ybUNvbnRyb2xcbiAgICAgICAgICAgICYmIHNjaGVtYS5kYXRhXG4gICAgICAgICAgICAmJiBzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWU7XG4gICAgfVxuXG4gICAgcmVuZGVyVGVuQ29uZ1ZpZWMobW9kZWw6IGFueSwgc2NoZW1hOiBDdXN0b21Db250cm9sU2NoZW1hKSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZVRleHQgPSBzY2hlbWEuZGF0YS5fX3RlbXBsYXRlVGFza05hbWU7XG4gICAgICAgIHNjaGVtYS5kYXRhLmZpZWxkUGFyZW50Rm9yVGFza3MuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICB0ZW1wbGF0ZVRleHQgPSB0ZW1wbGF0ZVRleHQucmVwbGFjZShge3tpdGVtLiR7ZmllbGR9fX1gLCBnZXRTdHJpbmdEaXNwbGF5VmFsdWUobW9kZWxbZmllbGRdKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzY2hlbWEuZGF0YS50ZW5Db25nVmllYyA9IHRlbXBsYXRlVGV4dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzY2hlbWE6IGFueSkge1xuICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8VGFibGVTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRCaW5kaW5nQ29udHJvbFNjaGVtYShzdWJDb250cm9sKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxEcm9wZG93bkNvbnRyb2xTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgaWYgKGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93bihkcm9wZG93bkNvbnRyb2xTY2hlbWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duQ29udHJvbFNjaGVtYSA9IDxBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIGlmIChkcm9wZG93bkNvbnRyb2xTY2hlbWEuYmluZGluZ0ZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSA8Q29udGFpbmVyU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0QmluZGluZ0NvbnRyb2xTY2hlbWEoc3ViQ29udHJvbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJpbmRPbkNoYW5nZVRvRHJvcGRvd24oZHJvcGRvd25Db250cm9sU2NoZW1hOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hKSB7XG4gICAgICAgIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycy5mb3JFYWNoKGZpbHRlciA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2V0dGluZy5zY2hlbWEuZmluZChxID0+IHEuZmllbGQgPT0gc291cmNlRmllbGQpO1xuICAgICAgICAgICAgaWYgKCFmaWx0ZXIuc3ViRmllbGRcbiAgICAgICAgICAgICAgICAmJiAoc2NoZW1hIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hIHx8IHNjaGVtYSBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyLnN1YkZpZWxkID0gc2NoZW1hLnZhbHVlRmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtYXJrZWRDb250cm9sID0ge307XG4gICAgICAgIHRoaXMuYmluZE9uQ2hhbmdlVG9Ecm9wZG93blJlY3Vyc2l2ZShkcm9wZG93bkNvbnRyb2xTY2hlbWEsIGRyb3Bkb3duQ29udHJvbFNjaGVtYS5iaW5kaW5nRmlsdGVycywgbWFya2VkQ29udHJvbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kT25DaGFuZ2VUb0Ryb3Bkb3duUmVjdXJzaXZlKGNoaWxkRHJvcGRvd246IERyb3Bkb3duQ29udHJvbFNjaGVtYSB8IEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEsIHRtcEZpbHRlcnM6IEZpbHRlcltdLCBtYXJrZWRDb250cm9sKSB7XG4gICAgICAgIGlmICh0bXBGaWx0ZXJzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRtcEZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWVsZCA9IGZpbHRlci5zb3VyY2VGaWVsZDtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnREcm9wZG93biA9IHRoaXMuZm9ybUNvbnRyb2xzW3NvdXJjZUZpZWxkXTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50RHJvcGRvd24gJiYgIW1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlZENvbnRyb2xbc291cmNlRmllbGRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24gaW5zdGFuY2VvZiBEcm9wZG93bkNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXSA9IChldmVudDogRXZlbnREYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duWydjb3VudFBhcmVudEhhc1ZhbHVlJ10gJiYgY2hpbGREcm9wZG93blsnY291bnRQYXJlbnRIYXNWYWx1ZSddID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGREcm9wZG93blsnY291bnRQYXJlbnRIYXNWYWx1ZSddLS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5lZWRHZXREYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLmFsbG93TG9hZERhdGFXaGVuUGFyZW50TnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXZlbnQuZXZlbnRUeXBlID09IHRoaXMuZXZlbnRUeXBlLkFESlVTVF9WQUxVRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZEdldERhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnZhbHVlID09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2ZW50LnZhbHVlID09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZXZlbnQudmFsdWUgaW5zdGFuY2VvZiBBcnJheSAmJiBldmVudC52YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERyb3Bkb3duLl9jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQucmVzZXRDb250cm9sKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkR2V0RGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRHZXREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fY3J1ZFNlcnZpY2UuZ2V0RmlsdGVyRnJvbVRlbXBsYXRlKHRtcEZpbHRlcnMsIGV2ZW50LnBhcmVudE1vZGVsLCBldmVudC5yb290TW9kZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghKHBhcmVudERyb3Bkb3duIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJlbnREcm9wZG93bi5fY29tcG9uZW50ICYmIHBhcmVudERyb3Bkb3duLl9jb21wb25lbnQuX2hhc0xvYWRlZERhdGFzb3VyY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duLl9jb21wb25lbnQuZ2V0RGF0YShmaWx0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGREcm9wZG93bi5fY29tcG9uZW50ICYmIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRHJvcGRvd24uX2NvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTW9yZU9uQ2hhbmdlRXZlbnQocGFyZW50RHJvcGRvd24sIChldmVudDogRXZlbnREYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZERyb3Bkb3duW0tleUZ1bmN0aW9uUmVsb2FkXShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRPbkNoYW5nZVRvRHJvcGRvd25SZWN1cnNpdmUoY2hpbGREcm9wZG93biwgZmlsdGVyLmZpbHRlcnMsIG1hcmtlZENvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRNb3JlT25DaGFuZ2VFdmVudChjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIG5ld09uQ2hhbmdlKSB7XG4gICAgICAgIGlmIChjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IG9sZFRyaWdnZXJMb2FkQ2hpbGQgPSBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQ7XG4gICAgICAgICAgICBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9sZFRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQgPSBhc3luYyAoZXZlbnQ6IEV2ZW50RGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ld09uQ2hhbmdlKGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG1wRmllbGRPbGRPbkNoYW5nZSA9ICdvbGRPbkNoYW5nZSc7XG4gICAgICAgIGlmIChjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9sZE9uQ2hhbmdlID0gY29udHJvbC5vbkNoYW5nZWQ7XG4gICAgICAgICAgICAgICAgY29udHJvbFt0bXBGaWVsZE9sZE9uQ2hhbmdlXSA9IG9sZE9uQ2hhbmdlO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcbiAgICAgICAgICAgICAgICBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkT25DaGFuZ2UgPSBjb250cm9sW3RtcEZpZWxkT2xkT25DaGFuZ2VdO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25DaGFuZ2VkID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkT25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLnRyaWdnZXJMb2FkQ2hpbGQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uQ2hhbmdlZCA9IGNvbnRyb2wudHJpZ2dlckxvYWRDaGlsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkanVzdGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRFdmVudCA9IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25BZGp1c3RlZFZhbHVlID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb2xkRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXdPbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25BZGp1c3RlZFZhbHVlID0gYXN5bmMgKGV2ZW50OiBFdmVudERhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3T25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc2NoZW1hOiBGb3JtQ29udHJvbEJhc2UpIHtcbiAgICAgICAgaWYgKCFzY2hlbWEuY29ycmVjdG9ycykgc2NoZW1hLmNvcnJlY3RvcnMgPSBbXTtcblxuICAgICAgICBpZiAoIXNjaGVtYS52YWxpZGF0b3JzKSBzY2hlbWEudmFsaWRhdG9ycyA9IFtdO1xuXG4gICAgICAgIGlmIChzY2hlbWEucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIHNjaGVtYS52YWxpZGF0b3JzLnB1c2gobmV3IFJlcXVpcmVkVmFsaWRhdG9yKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAoc2NoZW1hLnZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCBzY2hlbWEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRTY2hlbWEgPSAoPFRleHRDb250cm9sU2NoZW1hPnNjaGVtYSk7XG4gICAgICAgICAgICBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdudW1iZXInIHx8IHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnYW1vdW50Jykge1xuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBOdW1iZXJPbmx5VmFsaWRhdG9yKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdtb25leScgfHwgdGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdtb25leWludCcpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGV4dFNjaGVtYS5kYXRhRm9ybWF0ID09ICdlbWFpbCcpIHtcbiAgICAgICAgICAgICAgICB0ZXh0U2NoZW1hLnZhbGlkYXRvcnMucHVzaChuZXcgRW1haWxWYWxpZGF0b3IoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRleHRTY2hlbWEuY29ycmVjdG9ycykgdGV4dFNjaGVtYS5jb3JyZWN0b3JzID0gW107XG4gICAgICAgICAgICAgICAgdGV4dFNjaGVtYS5jb3JyZWN0b3JzLnB1c2gobmV3IEdtYWlsQ29ycmVjdG9yKCkpO1xuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEuY29ycmVjdG9ycy5wdXNoKG5ldyBMb3dlckNvcnJlY3RvcigpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAncGhvbmUnIHx8IHRleHRTY2hlbWEuZGF0YUZvcm1hdCA9PSAnZmF4Jykge1xuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5wdXNoKG5ldyBQaG9uZU51bWJlclZhbGlkYXRvcigpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRleHRTY2hlbWEudmFsaWRhdG9ycykge1xuICAgICAgICAgICAgICAgIHRleHRTY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBOdW1iZXJDb21wYXJlVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvckNvbXBhcmVSZXZlcnQodmFsaWRhdG9yLCB0ZXh0U2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hKSB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gPFRhYmxlU2NoZW1hPnNjaGVtYTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViQ29udHJvbCBvZiBjb250cm9sLnJvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0VmFsaWRhdG9yQW5kQ29ycmVjdG9yKHN1YkNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIERhdGVUaW1lQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgZGF0ZVRpbWVTY2hlbWEgPSAoPERhdGVUaW1lQ29udHJvbFNjaGVtYT5zY2hlbWEpO1xuICAgICAgICAgICAgaWYgKGRhdGVUaW1lU2NoZW1hLnZhbGlkYXRvcnMpIHtcbiAgICAgICAgICAgICAgICBkYXRlVGltZVNjaGVtYS52YWxpZGF0b3JzLmZvckVhY2godmFsaWRhdG9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIERhdGVDb21wYXJlVmFsaWRhdG9yIHx8IHZhbGlkYXRvciBpbnN0YW5jZW9mIENvbXBhcmVWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVmFsaWRhdG9yQ29tcGFyZVJldmVydCh2YWxpZGF0b3IsIGRhdGVUaW1lU2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IDxDb250YWluZXJTY2hlbWE+c2NoZW1hO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRWYWxpZGF0b3JBbmRDb3JyZWN0b3Ioc3ViQ29udHJvbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzY2hlbWEudmFsaWRhdG9ycy5mb3JFYWNoKHZhbGlkYXRvciA9PiB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgQ2hlY2tEdXBsaWNhdGVWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIENoZWNrRHVwbGljYXRlRmllbGRzVmFsaWRhdG9yKSB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnNldEJhc2VTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVWYWxpZGF0b3JDaGVja0R1cGxpY2F0ZShzY2hlbWEsIHZhbGlkYXRvci5nZXREdXBsaWNhdGVGaWVsZHMoKSwgdmFsaWRhdG9yLmdldE1lc3NhZ2UoKSwgdmFsaWRhdG9yLmdldERlZmF1bHRGaWx0ZXJzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUmVxdWlyZWRGaWVsZHNWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVZhbGlkYXRvclJlcXVpcmVkcyhzY2hlbWEsIHZhbGlkYXRvci5nZXRSZXF1aXJlZEZpZWxkcygpLCB2YWxpZGF0b3IuZ2V0TWVzc2FnZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbGlkYXRvciBpbnN0YW5jZW9mIFNhbWVWYWx1ZVZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU2FtZVZhbHVlVmFsaWRhdG9ycyhzY2hlbWEsIHZhbGlkYXRvci5nZXRTYW1lRmllbGRzKCksIHZhbGlkYXRvci5nZXRNZXNzYWdlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgUGFzc3dvcmRWYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5fdXNlclNlcnZpY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVWYWxpZGF0b3JDb21wYXJlUmV2ZXJ0KFxuICAgICAgICB2YWxpZGF0b3I6IERhdGVDb21wYXJlVmFsaWRhdG9yIHwgTnVtYmVyQ29tcGFyZVZhbGlkYXRvciB8IENvbXBhcmVWYWxpZGF0b3IsXG4gICAgICAgIHNjaGVtYTogRGF0ZVRpbWVDb250cm9sU2NoZW1hIHwgVGV4dENvbnRyb2xTY2hlbWEgfCBNYXNrQ29udHJvbFNjaGVtYVxuICAgICkge1xuICAgICAgICBjb25zdCBjb21wYXJlVW5pcXVlRmllbGQgPSB2YWxpZGF0b3IuY29tcGFyZVVuaXF1ZUZpZWxkO1xuICAgICAgICBpZiAoc2NoZW1hLnVuaXF1ZUZpZWxkID09IGNvbXBhcmVVbmlxdWVGaWVsZCkge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdTY2hlbWEgY+G6pXUgaMOsbmggYuG7iyBs4buXaScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0b3JDb21wYXJlID0gdmFsaWRhdG9yLmdldE9wZXJhdG9yQ29tcGFyZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2NoZW1hQ29tcGFyZSA9IDxGb3JtQ29udHJvbEJhc2U+KHRoaXMuZm9ybUNvbnRyb2xzW2NvbXBhcmVVbmlxdWVGaWVsZF0pO1xuICAgICAgICAgICAgaWYgKHNjaGVtYUNvbXBhcmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnU2NoZW1hIGPhuqV1IGjDrG5oIGLhu4sgbOG7l2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnNvbWUocCA9PiBwIGluc3RhbmNlb2YgQ29tcGFyZVZhbGlkYXRvclxuICAgICAgICAgICAgICAgICAgICAmJiBwLmNvbXBhcmVVbmlxdWVGaWVsZCA9PSBzY2hlbWEudW5pcXVlRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBEYXRlQ29tcGFyZVZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IERhdGVDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgTnVtYmVyQ29tcGFyZVZhbGlkYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hQ29tcGFyZS52YWxpZGF0b3JzLnB1c2gobmV3IE51bWJlckNvbXBhcmVWYWxpZGF0b3Iob3BlcmF0b3JDb250cmFzdFtvcGVyYXRvckNvbXBhcmVdLCBzY2hlbWEudW5pcXVlRmllbGQpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUNvbXBhcmUudmFsaWRhdG9ycy5wdXNoKG5ldyBDb21wYXJlVmFsaWRhdG9yKG9wZXJhdG9yQ29udHJhc3Rbb3BlcmF0b3JDb21wYXJlXSwgc2NoZW1hLnVuaXF1ZUZpZWxkKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVWYWxpZGF0b3JDaGVja0R1cGxpY2F0ZShzY2hlbWE6IEZvcm1Db250cm9sQmFzZSwgZmllbGRPdGhlcjogc3RyaW5nW10sIG1lc3NhZ2U6IHN0cmluZywgZGVmYXVsdEZpbHRlcnM6IEZpbHRlcltdKSB7XG4gICAgICAgIGlmIChmaWVsZE90aGVyLmluZGV4T2Yoc2NoZW1hLnVuaXF1ZUZpZWxkKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hT3RoZXIgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tmaWVsZF0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBDaGVja0R1cGxpY2F0ZUZpZWxkc1ZhbGlkYXRvclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl9jb21tb25TZXJ2aWNlLmlzU2FtZUFycmF5KHRtcEZpZWxkcywgcC5nZXREdXBsaWNhdGVGaWVsZHMoKSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF92YWxpZGF0b3IgPSBuZXcgQ2hlY2tEdXBsaWNhdGVGaWVsZHNWYWxpZGF0b3IodG1wRmllbGRzLCBtZXNzYWdlLCBkZWZhdWx0RmlsdGVycyk7XG4gICAgICAgICAgICAgICAgICAgIF92YWxpZGF0b3Iuc2V0QmFzZVNlcnZpY2UodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKTtcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY3JlYXRlVmFsaWRhdG9yUmVxdWlyZWRzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmaWVsZE90aGVyLmluZGV4T2Yoc2NoZW1hLnVuaXF1ZUZpZWxkKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hT3RoZXIgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tmaWVsZF0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvclxuICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl9jb21tb25TZXJ2aWNlLmlzU2FtZUFycmF5KHRtcEZpZWxkcywgcC5nZXRSZXF1aXJlZEZpZWxkcygpKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBSZXF1aXJlZEZpZWxkc1ZhbGlkYXRvcih0bXBGaWVsZHMsIG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBzY2hlbWFPdGhlci52YWxpZGF0b3JzLnB1c2goX3ZhbGlkYXRvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVTYW1lVmFsdWVWYWxpZGF0b3JzKHNjaGVtYTogRm9ybUNvbnRyb2xCYXNlLCBmaWVsZE90aGVyOiBzdHJpbmdbXSwgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmaWVsZE90aGVyLmluZGV4T2Yoc2NoZW1hLnVuaXF1ZUZpZWxkKSA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NjaGVtYSBj4bqldSBow6xuaCBi4buLIGzhu5dpJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBbLi4uZmllbGRPdGhlciwgc2NoZW1hLmZpZWxkXTtcbiAgICAgICAgICAgIGZpZWxkT3RoZXIuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hT3RoZXIgPSA8Rm9ybUNvbnRyb2xCYXNlPih0aGlzLmZvcm1Db250cm9sc1tmaWVsZF0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRtcEZpZWxkcyA9IGZpZWxkcy5maWx0ZXIocCA9PiBwICE9IHNjaGVtYU90aGVyLmZpZWxkKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYU90aGVyLnZhbGlkYXRvcnMuc29tZShwID0+IHAgaW5zdGFuY2VvZiBTYW1lVmFsdWVWYWxpZGF0b3JcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fY29tbW9uU2VydmljZS5pc1NhbWVBcnJheSh0bXBGaWVsZHMsIHAuZ2V0U2FtZUZpZWxkcygpKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgX3ZhbGlkYXRvciA9IG5ldyBTYW1lVmFsdWVWYWxpZGF0b3IodG1wRmllbGRzLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hT3RoZXIudmFsaWRhdG9ycy5wdXNoKF92YWxpZGF0b3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREYXRhRGVmYXVsdCgpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nRGF0YURlZmF1bHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDb21DdHhDb25zdGFudHMuTE9DQUxTVE9SQUdFX0tFWS5ERUZBVUxUX0RBVEEpO1xuICAgICAgICBjb25zdCBnZXRTZXR0aW5nRGF0YURlZmF1bHQgPSB0aGlzLl9tb2R1bGVDb25maWcuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQuc2V0dGluZ0RhdGFEZWZhdWx0O1xuICAgICAgICBpZiAoc3RyaW5nRGF0YURlZmF1bHQgJiYgKHRoaXMuX21vZGVsRGF0YSAmJiAhdGhpcy5fbW9kZWxEYXRhLmlkKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUNhY2hlID0gSlNPTi5wYXJzZShzdHJpbmdEYXRhRGVmYXVsdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgRHJvcGRvd25Db250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSAoPERyb3Bkb3duQ29udHJvbFNjaGVtYT5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGNvbnRyb2wuZmllbGQgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBkYXRhQ2FjaGVba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnZXRTZXR0aW5nRGF0YURlZmF1bHQpIHsgLy8gbOG6pXkgY+G6pXUgaMOsbmggZmllbGQgbWFwUGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRNYXBHZXRDYWNoZSA9IGdldFNldHRpbmdEYXRhRGVmYXVsdFtjb250cm9sLmZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZE1hcEdldENhY2hlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gKGZpZWxkTWFwR2V0Q2FjaGUgKyAoY29udHJvbC52YWx1ZUZpZWxkID09ICdpZCcgPyAnJyA6IGNvbnRyb2wudmFsdWVGaWVsZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGF0YUNhY2hlW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkYXRhQ2FjaGVbKDxGb3JtU2NoZW1hQmFzZT5pdGVtKS5maWVsZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhWyg8Rm9ybVNjaGVtYUJhc2U+aXRlbSkuZmllbGRdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5mdW5jdGlvbi5tb2RpZnlEYXRhQWZ0ZXJHZXRDYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmZ1bmN0aW9uLm1vZGlmeURhdGFBZnRlckdldENhY2hlKHRoaXMuX21vZGVsRGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFwcGx5Q2FjaGVkVmFsdWVzKCkge1xuICAgICAgICB0aGlzLmdldENhY2hlZFZhbHVlc0Zyb21TdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKHRoaXMuX21vZGVsRGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDYWNoZWRWYWx1ZVRvTW9kZWwobW9kZWwsIHVuaXF1ZUtleUNvbnRyb2w/OiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcpIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBtb2RlbCkge1xuICAgICAgICAgICAgaWYgKGZpZWxkICE9ICdfZXJyb3JzJyAmJiBmaWVsZCAhPSAnX3N0YXR1cycgJiYgZmllbGQgIT0gJ19zb3VyY2UnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1YlVuaXF1ZUtleUNvbnRyb2w6IHN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlS2V5Q29udHJvbCAhPSBudWxsICYmIHVuaXF1ZUtleUNvbnRyb2wgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YlVuaXF1ZUtleUNvbnRyb2wgPSB1bmlxdWVLZXlDb250cm9sICsgJy4nICsgZmllbGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdWJVbmlxdWVLZXlDb250cm9sID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sc1tzdWJVbmlxdWVLZXlDb250cm9sXTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRyb2wpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCBzdWJQYXRoO1xuICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViUGF0aCA9IHBhdGggKyAnLicgKyBmaWVsZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YlBhdGggPSBmaWVsZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdWJNb2RlbCA9IG1vZGVsW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICBpZiAoc3ViTW9kZWwgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3ViTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2FjaGVkVmFsdWVUb01vZGVsKGl0ZW0sIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGggKyAnWycgKyBpbmRleCArICddJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzTGl0ZXJhbE9iamVjdChzdWJNb2RlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDYWNoZWRWYWx1ZVRvTW9kZWwoc3ViTW9kZWwsIHN1YlVuaXF1ZUtleUNvbnRyb2wsIHN1YlBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb250cm9sLmVuYWJsZUNhY2hpbmcgJiYgdGhpcy5jYWNoZWRWYWx1ZXMuaGFzT3duUHJvcGVydHkoc3ViUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxbZmllbGRdID0gdGhpcy5jYWNoZWRWYWx1ZXNbc3ViUGF0aF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYWNoZWRWYWx1ZXNGcm9tU3RvcmFnZSgpIHtcbiAgICAgICAgY29uc3QgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xuICAgICAgICBpZiAoY2FjaGVkVmFsdWVzKSB7XG4gICAgICAgICAgICBsZXQgcGF0aE5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1JZCkgcGF0aE5hbWUgKz0gJy8nICsgdGhpcy5mb3JtSWQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjYWNoZWRWYWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF0aG5hbWUgPT09IHBhdGhOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVkVmFsdWVzID0gZWxlbWVudC52YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZUNhY2hlVmFsdWVzVG9TdG9yYWdlKCkge1xuICAgICAgICBsZXQgY2FjaGVkVmFsdWVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2FjaGVkVmFsdWVzJykpO1xuICAgICAgICBpZiAoIWNhY2hlZFZhbHVlcykgY2FjaGVkVmFsdWVzID0gW107XG4gICAgICAgIGxldCBjaGVja0V4aXN0ID0gZmFsc2U7XG4gICAgICAgIGxldCBwYXRoTmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICBpZiAodGhpcy5mb3JtSWQpIHBhdGhOYW1lICs9ICcvJyArIHRoaXMuZm9ybUlkO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNhY2hlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNhY2hlZFZhbHVlc1tpXTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnBhdGhuYW1lID09PSBwYXRoTmFtZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWVzID0gdGhpcy5jYWNoZWRWYWx1ZXM7XG4gICAgICAgICAgICAgICAgY2hlY2tFeGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNoZWNrRXhpc3QpIHtcbiAgICAgICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwYXRobmFtZTogcGF0aE5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiB0aGlzLmNhY2hlZFZhbHVlc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY2FjaGVkVmFsdWVzJywgSlNPTi5zdHJpbmdpZnkoY2FjaGVkVmFsdWVzKSk7XG4gICAgfVxuXG4gICAgdHJpZ2dlckNoYW5nZShmaWVsZFBhdGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkUGF0aCk7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICBpZiAoY29udHJvbCAmJiBjdXJyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKGNvbnRyb2wsIG51bGwsICd0cmlnZ2VyJywgY3VycmVudE5vZGUucGFyZW50TW9kZWwsIGN1cnJlbnROb2RlLnBhcmVudE1vZGVsUGF0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuYXV0b0ZvY3VzICYmICF0aGlzLnJvb3RDb250ZXh0LmRhdGEuZmxhZ3MuaGFzRm9jdXNpbmdDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5kYXRhLmZsYWdzLmhhc0ZvY3VzaW5nQ29udHJvbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0ZpcnN0Q29udHJvbCgpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmRhdGEuZmxhZ3MuaGFzRm9jdXNpbmdDb250cm9sID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSwgODAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SXNMb2FkZWREYXRhRWRpdCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmxvYWRlZERhdGFFZGl0T2xkID0gdGhpcy5sb2FkZWREYXRhRWRpdDtcbiAgICAgICAgdGhpcy5sb2FkZWREYXRhRWRpdCA9IHZhbHVlO1xuICAgIH1cbiAgICBwdWJsaWMgaGFuZGxlUm93Q2xpY2socm93RGF0YTogYW55LCBjb250cm9sOiBhbnkpIHtcbiAgICAgICAgaWYgKGNvbnRyb2wub25Sb3dDbGljaykge1xuICAgICAgICAgICAgY29udHJvbC5vblJvd0NsaWNrKHJvd0RhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbnRyb2xUeXBlKGNvbnRyb2w6IGFueSkge1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRpdGxlU2NoZW1hKSByZXR1cm4gJ3RpdGxlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYSkgcmV0dXJuICdsYWJlbCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgU3BhbkNvbnRyb2xTY2hlbWEpIHJldHVybiAnc3BhbkNvbnRyb2wnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE1hc2tDb250cm9sU2NoZW1hKSByZXR1cm4gJ21hc2snO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIE51bWJlclJhbmdlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdudW1iZXJyYW5nZSc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dENvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRleHRDb250cm9sID0gPFRleHRDb250cm9sU2NoZW1hPmNvbnRyb2w7XG4gICAgICAgICAgICBpZiAodGV4dENvbnRyb2wuaXNSZWFkb25seSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnY29udGVudCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGV4dENvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5J1xuICAgICAgICAgICAgICAgIHx8IHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdtb25leWludCdcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRleHRDb250cm9sLmRhdGFGb3JtYXQgPT09ICdwaG9uZSdcbiAgICAgICAgICAgICAgICB8fCB0ZXh0Q29udHJvbC5kYXRhRm9ybWF0ID09PSAnZmF4J1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdwaG9uZU9yZmF4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBSZWZlcmVuY2VUZXh0Q29udHJvbFNjaGVtYSkgcmV0dXJuICdyZWZlcmVuY2UtdGV4dCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGVtcGxhdGVDb250cm9sU2NoZW1hKSByZXR1cm4gJ3RlbXBsYXRlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZVJhbmdlQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkYXRldGltZXJhbmdlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnZGF0ZXRpbWUnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEFkZHJlc3NDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FkZHJlc3MnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYSkgcmV0dXJuICdkcm9wZG93bic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRWRpdG9yQ29udHJvbFNjaGVtYSkgcmV0dXJuICdlZGl0b3InO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHRBcmVhQ29udHJvbFNjaGVtYSkgcmV0dXJuICd0ZXh0YXJlYSc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgV3JhcFBpY2tlckNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIHJldHVybiAnY29tbW9uLXBpY2tlcic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGjhuqNpIMSR4buDIGTDsm5nIGTGsOG7m2kg4bufIGLDqm4gdHLDqm4gVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgdsOsIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEgOiBVc2VyUGlja2VyQ29udHJvbFNjaGVtYVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnYXV0b2NvbXBsZXRlLXBpY2tlcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAndXNlci1waWNrZXInO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEVudGl0eVBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnZW50aXR5LXBpY2tlcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuICdvcmdhbml6YXRpb24tcGlja2VyJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYU5ldykge1xuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yy1waWNrZXItbmV3JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvQ2F1VG9DaHVjUGlja2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuICdjb2NhdXRvY2h1Yy1waWNrZXInO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29DYXVUb0NodWNDb250cm9sU2NoZW1hKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2NvY2F1dG9jaHVjJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEF1dG9Db21wbGV0ZUNvbnRyb2xTY2hlbWEpIHJldHVybiAnYXV0b2NvbXBsZXRlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTd2l0Y2hDb250cm9sU2NoZW1hKSByZXR1cm4gJ3N3aXRjaCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94JztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDaGVja0JveExpc3RDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NoZWNrYm94bGlzdCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgUmFkaW9CdXR0b25MaXN0Q29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuICdyYWRpb2J1dHRvbmxpc3QnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgSW1hZ2VVcGxvYWRlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnaW1hZ2V1cGxvYWRlcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZVVwbG9hZENvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLm1vZGUgPT0gRmlsZVVwbG9hZE1vZGUudXNpbmdGaWxlSW5zdGFuY2VJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVVwbG9hZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJ3NlcnZpY2VGaWxlVXBsb2FkJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkgcmV0dXJuICdmaWxlTWFuYWdlcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yUGlja2VyJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkgcmV0dXJuICd0YWJsZSc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSByZXR1cm4gJ2NvbnRhaW5lcic7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQnV0dG9uQ29udHJvbFNjaGVtYSkgcmV0dXJuICdidXR0b24nO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFZhbkJhblBpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAndmFuYmFuJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb25nVmllY1BpY2tlckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29uZ3ZpZWMnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFBlcmNlbnRDb250cm9sU2NoZW1hKSByZXR1cm4gJ3BlcmNlbnQnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENoaXBzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdjaGlwcyc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sdW1uU2NoZW1hQmFzZSkgcmV0dXJuICdjb2x1bW4nO1xuICAgICAgICByZXR1cm4gJ2N1c3RvbSc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFZpZXdNb2RlRGF0YVR5cGUoY29udHJvbCkge1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRpdGxlU2NoZW1hKSByZXR1cm4gJ3RpdGxlJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbFNjaGVtYSkgcmV0dXJuICdsYWJlbCc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgTWFza0NvbnRyb2xTY2hlbWEpIHJldHVybiAnbWFzayc7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBEYXRlVGltZUNvbnRyb2xTY2hlbWEpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGVDb250cm9sID0gPERhdGVUaW1lQ29udHJvbFNjaGVtYT5jb250cm9sO1xuICAgICAgICAgICAgaWYgKGRhdGVDb250cm9sLnNob3dUaW1lKSByZXR1cm4gJ2RhdGV0aW1lJztcbiAgICAgICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBFZGl0b3JDb250cm9sU2NoZW1hKSByZXR1cm4gJ2h0bWwnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ3VzZXInO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb250cm9sIGluc3RhbmNlb2YgU3dpdGNoQ29udHJvbFNjaGVtYVxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrYm94Q29udHJvbFNjaGVtYVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYVxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIENoZWNrQm94TGlzdENvbnRyb2xTY2hlbWFcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hXG4gICAgICAgICAgICB8fCBjb250cm9sIGluc3RhbmNlb2YgT3JnYW5pemF0aW9uUGlja2VyQ29udHJvbFNjaGVtYVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiAnaGFzRGF0YVNvdXJjZSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGaWxlVXBsb2FkQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wubW9kZSA9PSBGaWxlVXBsb2FkTW9kZS51c2luZ0ZpbGVJbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlVXBsb2FkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZVNlcnZpY2VVcGxvYWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRmlsZU1hbmFnZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2ZpbGVNYW5hZ2VyJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYSkgcmV0dXJuICdhZGRyZXNzJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0Q29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuaXNSZWFkb25seSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnY29udGVudCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29udHJvbC5kYXRhRm9ybWF0ID09PSAnbW9uZXknIHx8IGNvbnRyb2wuZGF0YUZvcm1hdCA9PT0gJ21vbmV5aW50Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiAnbW9uZXknO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQ29sb3JQaWNrZXJDb250cm9sU2NoZW1hKSByZXR1cm4gJ2NvbG9yUGlja2VyJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBDb2xvckNvbnRyb2xTY2hlbWEpIHJldHVybiAnY29sb3JDb250cm9sJztcbiAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkgcmV0dXJuICd0YWJsZSc7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgS2V5VmFsdWVDb250cm9sU2NoZW1hKSByZXR1cm4gJ2FwcC1rZXktdmFsdWUnO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbnRhaW5lclNjaGVtYSkge1xuICAgICAgICAgICAgcmV0dXJuICdjb250YWluZXInO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIH1cblxuICAgIGFzeW5jIHZhbGlkYXRlRm9ybShzZXRWYWxpZGF0ZUZvcm0gPSB0cnVlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmIChzZXRWYWxpZGF0ZUZvcm0pIHtcbiAgICAgICAgICAgIHRoaXMuX2luVmFsaWRGb3JtID0gZmFsc2U7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnZhbGlkYXRlTW9kZWwodGhpcy5fcm9vdE5vZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2luVmFsaWRGb3JtKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCk7XG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1vZGVsKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZE5vZGUgb2YgY3VycmVudE5vZGUuY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGUuY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUuY2hpbGROb2RlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrSGlkZGVuKGNoaWxkTm9kZS5jb250cm9sLCBjaGlsZE5vZGUucGFyZW50TW9kZWwsIGNoaWxkTm9kZS5tb2RlbFBhdGgpKSBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNoaWxkTm9kZSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pblZhbGlkRm9ybSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVNb2RlbChjaGlsZE5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgdmFsaWRhdGVGb3JtQ29udHJvbChmaWVsZFBhdGgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgY29udHJvbE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKGZpZWxkUGF0aCk7XG4gICAgICAgIGlmIChjb250cm9sTm9kZSkge1xuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLnZhbGlkYXRlKGNvbnRyb2xOb2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBhc3luYyBoYW5kbGVDaGFuZ2VEcm9wZG93bihjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEsIGV2ZW50PywgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pIHtcbiAgICAgICAgaWYgKGNvbnRyb2wubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gdGhpcy5ldmVudFR5cGUuSElERSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCBldmVudCwgdGhpcy5ldmVudFR5cGUuQ0hBTkdFLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmllbGRWYWx1ZUNoYW5nZShjb250cm9sLCBldmVudCwgZXZlbnRUeXBlLCBwYXJlbnRNb2RlbCwgcGFyZW50UGF0aCwgc291cmNlTm9kZSwgYnViYmxlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIMSQ4buDIG5ndXnDqm4gaMOgbSBk4bqhbmcgYXJyb3cgZnVuY3Rpb24gdsOsIGPDsyAxIHPhu5EgZm9ybSBraMOhYyBn4buNaVxuICAgICAqL1xuICAgIHB1YmxpYyBoYW5kbGVGaWVsZFZhbHVlQ2hhbmdlID0gYXN5bmMgKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgZXZlbnQ/LCBldmVudFR5cGU/LCBwYXJlbnRNb2RlbD8sIHBhcmVudFBhdGg/LCBzb3VyY2VOb2RlPywgYnViYmxlPykgPT4ge1xuICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgIGxldCBjdXJyZW50Tm9kZTtcblxuICAgICAgICAvLyByb3cgaW4gdGFibGVcbiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkge1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlO1xuICAgICAgICAgICAgY29udHJvbCA9IGN1cnJlbnROb2RlLmNvbnRyb2w7XG4gICAgICAgICAgICBwYXJlbnROb2RlID0gcGFyZW50Tm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgcGFyZW50TW9kZWwgPSBwYXJlbnROb2RlLm1vZGVsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsdWUgPSBjdXJyZW50Tm9kZS52YWx1ZTtcblxuICAgICAgICAvLyBhdXRvIGNvcnJlY3QgdmFsdWVcbiAgICAgICAgdmFsdWUgPSB0aGlzLmNvcnJlY3RWYWx1ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIGN1cnJlbnROb2RlLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgLy8gdmFsaWRhdGUgdmFsdWVcbiAgICAgICAgYXdhaXQgdGhpcy52YWxpZGF0ZShjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgaWYgKCFidWJibGUpIHtcbiAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBldmVudCxcbiAgICAgICAgICAgIHNvdXJjZU5vZGU6IHNvdXJjZU5vZGUgfHwgY3VycmVudE5vZGUsXG4gICAgICAgICAgICBldmVudFR5cGUsXG4gICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkNoYW5nZWQoZXZlbnREYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghYnViYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlLnBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLnBhcmVudE5vZGUgIT0gcGFyZW50Tm9kZS5yb290Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWVsZFZhbHVlQ2hhbmdlKHBhcmVudE5vZGUuY29udHJvbCwgZXZlbnQsIGV2ZW50VHlwZSwgcGFyZW50Tm9kZS5wYXJlbnROb2RlLm1vZGVsLCBwYXJlbnROb2RlLnBhcmVudE5vZGUubW9kZWxQYXRoLCBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZyAmJiBjb250cm9sLmVuYWJsZUNhY2hpbmcpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVDb250cm9sVmFsdWUoY29udHJvbCwgdmFsdWUsIHBhcmVudFBhdGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udHJvbC5vbkFmdGVyQ2hhbmdlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWZ0ZXJDaGFuZ2VkKGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoZXZlbnREYXRhKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQga2hpIGRyb3Bkb3duIMSRaeG7gXUgY2jhu4luaCB2YWx1ZSB04burIHJhdyB2YWx1ZSBk4bqhbmcgZ3VpZCB8IGludCB8IC4uLiA9PiBvYmplY3Qga2nhu4N1IHt2YWx1ZTogZ3VpZCB8IGludCB8IC4uLiwgLi4uIFsxIHPhu5EgdHLGsOG7nW5nIGtow6FjXX1cbiAgICAgKiBAcGFyYW0gY29udHJvbFxuICAgICAqIEBwYXJhbSBwYXJlbnRQYXRoXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUFkanVzdFZhbHVlRHJvcGRvd25FdmVudChjb250cm9sOiBEcm9wZG93bkNvbnRyb2xTY2hlbWEgfCBSYWRpb0J1dHRvbkxpc3RDb250cm9sU2NoZW1hLCBwYXJlbnRQYXRoPykge1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcbiAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZShjb250cm9sLmZpZWxkKTtcbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuQURKVVNUX1ZBTFVFLFxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGp1c3RlZFZhbHVlKGV2ZW50RGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlRGF0YVNvdXJjZUxvYWRDb21wbGV0ZShjb250cm9sOiBGb3JtQ29udHJvbEJhc2VXaXRoU2VydmljZSwgcGFyZW50UGF0aCwgZGF0YVNvdXJjZSkge1xuXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZURhdGFTb3VyY2VMb2FkZWQoY29udHJvbDogRHJvcGRvd25Db250cm9sU2NoZW1hLCBwYXJlbnRQYXRoLCBkYXRhRnJvbURyb3Bkb3duOiBhbnkpIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgY3VycmVudE5vZGUsXG4gICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkRBVEFTT1VSQ0VfTE9BREVELFxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXMsXG4gICAgICAgICAgICBkYXRhOiBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgPyBkYXRhRnJvbURyb3Bkb3duLnJhd0RhdGFTb3VyY2UgOiBkYXRhRnJvbURyb3Bkb3duLmRhdGFTb3VyY2VcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZW50RGF0YVsnZWxtJ10gPSBkYXRhRnJvbURyb3Bkb3duLmVsbTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybVN0YXRlID09IEZvcm1TdGF0ZS5BRERcbiAgICAgICAgICAgICYmIGNvbnRyb2wuYXV0b0Rpc3BsYXlGaXJzdFxuICAgICAgICAgICAgJiYgZXZlbnREYXRhLmRhdGEubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9tb2RlbERhdGFbY29udHJvbC5maWVsZF0gfHwgIXRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdID0gW2V2ZW50RGF0YS5kYXRhWzBdW2NvbnRyb2wudmFsdWVGaWVsZF1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsRGF0YVtjb250cm9sLmZpZWxkXSA9IGV2ZW50RGF0YS5kYXRhWzBdW2NvbnRyb2wudmFsdWVGaWVsZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLmNhbGxiYWNrRGF0YUZpbmlzaChldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIGFzeW5jIGhhbmRsZVJlYWR5Q29udHJvbFBpY2tlcihjb250cm9sOiBBdXRvQ29tcGxldGVQaWNrZXJDb250cm9sU2NoZW1hIHwgVXNlclBpY2tlckNvbnRyb2xTY2hlbWEgfCBDb0NhdVRvQ2h1Y1BpY2tlckNvbnRyb2xTY2hlbWEsIHBhcmVudFBhdGg/KSB7XG4gICAgICAgIHRoaXMuaGFuZGxlQ29udHJvbFJlYWR5RXZlbnQoY29udHJvbCwgcGFyZW50UGF0aCk7XG4gICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xuICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlKGNvbnRyb2wuZmllbGQpO1xuICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlLFxuICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5SRUFEWSxcbiAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY29udHJvbC5vblJlYWR5KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25SZWFkeShldmVudERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlTG9hZGVkQ29udHJvbChfY29tcG9uZW50OiBhbnksIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50UGF0aD8pIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XG4gICAgICAgIGlmIChfY29tcG9uZW50ICYmIGN1cnJlbnROb2RlKSB7XG4gICAgICAgICAgICBfY29tcG9uZW50LmN1cnJlbnROb2RlID0gY3VycmVudE5vZGU7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5jb21wb25lbnQgPSBfY29tcG9uZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZUNvbnRyb2xSZWFkeUV2ZW50KGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSwgcGFyZW50UGF0aD8pIHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgIHBhcmVudE5vZGUubW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5yZWFkeSA9IHRydWU7XG4gICAgICAgIHRoaXMub25Db250cm9sUmVhZHkuZW1pdChjb250cm9sLmZpZWxkKTtcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsRGF0YVtLZXlGbGFzaFNob3ddKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50UGF0aCkgeyAvLyDEkG/huqFuIGNvZGUgdHJvbmcgYmxvY2sgaWYgbsOgeSBjaMawYSBjaHXhuqluLCB04bqhbSB0aOG7nWkgY29kZSB0aOG6vyDEkeG6v24ga2hpIGfhurdwIGNhc2UgbsOgeSB0aMOsIHhlbSBs4bqhaSBzYXVcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudFBhdGh9LiR7Y29udHJvbC5maWVsZH1gXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWR5U3RhdHVzW2Ake2NvbnRyb2wuZmllbGR9YF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGVja0NhblByaW50KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0NhblByaW50KCkge1xuICAgICAgICBpZiAodGhpcy5fbW9kZWxEYXRhW0tleUZsYXNoU2hvd10gJiYgdGhpcy5jYW5QcmludCkge1xuICAgICAgICAgICAgdGhpcy53YWl0UmVhZHlBbmRQcmludCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2FpdFJlYWR5QW5kUHJpbnQoKSB7XG4gICAgICAgIGNvbnN0IHJlYWR5QWxsID0gdGhpcy5jaGVja1JlYWR5QWxsKCk7XG4gICAgICAgIGlmICh0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2FpdFJlYWR5QW5kUHJpbnRUaW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVhZHlBbGwpIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9tb2RlbERhdGFbS2V5Rmxhc2hTaG93XTtcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xuICAgICAgICAgICAgdGhpcy5fcHJpbnRQZGZCeVNjaGVtYSh0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UsIHRoaXMuX21pbmltaXplZERhdGEsIHRoaXMuc2V0dGluZy5zY2hlbWEpXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzLCAnJywgZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnVOG6oW8gZmlsZSB0aMOgbmggY8O0bmcnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWluaW1pemVkRGF0YS5wcmludEZpbGVJZCA9IHJlcy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9taW5pbWl6ZWREYXRhID0gdGhpcy5fY29tbW9uU2VydmljZS5jbG9uZU9iamVjdCh0aGlzLl9taW5pbWl6ZWREYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlV2FpdEJveCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuX21vZHVsZUNvbmZpZy5nZXRDb25maWcoKS5lbnZpcm9ubWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZVRyaW5oS3koZW52aXJvbm1lbnQsIHRoaXMuc2V0dGluZywgdGhpcy5fbW9kZWxEYXRhLCByZXMuZGF0YSwgdGhpcy5fbm90aWZpZXJTZXJ2aWNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQWZ0ZXJUcmluaEt5LmVtaXQoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLndhaXRSZWFkeUFuZFByaW50VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2FpdFJlYWR5QW5kUHJpbnQoKTtcbiAgICAgICAgICAgIH0sIDEwMCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE1vZGVsVGFibGVTY2hlbWFCeUNoaWxkU2NoZW1hKGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSkge1xuICAgICAgICBjb25zdCBjb250cm9sVGFibGUgPSB0aGlzLmZvcm1Db250cm9sc1tjb250cm9sW3RoaXMuZmllbGRQYXJlbnRGaWVsZF1dO1xuICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2xUYWJsZS5maWVsZF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1JlYWR5QWxsKCk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5jb250cm9sTmVlZENoZWNrUmVhZHkpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLmhpZGRlbiB8fCAhdGhpcy5fbW9kZWxEYXRhW2NvbnRyb2wuZmllbGRdKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRGaWVsZCA9IGNvbnRyb2xbdGhpcy5maWVsZFBhcmVudEZpZWxkXTtcbiAgICAgICAgICAgIC8vIE7hur91IGzDoCBmaWVsZCB0cm9uZyB0YWJsZSBzY2hlbWFcbiAgICAgICAgICAgIGlmIChwYXJlbnRGaWVsZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyck1vZGVsQ3VuZ0xldmVsID0gdGhpcy5nZXRNb2RlbFRhYmxlU2NoZW1hQnlDaGlsZFNjaGVtYShjb250cm9sKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJyTW9kZWxDdW5nTGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJNb2RlbEN1bmdMZXZlbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlYWR5U3RhdHVzW2Ake3BhcmVudEZpZWxkfVske2l9XS4ke2NvbnRyb2wuZmllbGR9YF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5yZWFkeVN0YXR1c1tgJHtjb250cm9sLmZpZWxkfWBdKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHVwZGF0ZU1vZGVsRnJvbUV4dGVybmFsID0gKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5zZXR0aW5nLnNjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbE1vZGVsKHRoaXMuX21vZGVsRGF0YSwgY29udHJvbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgfTtcblxuICAgIC8vIFBo4bqjaSDEkeG7gyBhcnJvdyBmdW5jdGlvbiB2w6wgY8OzIGV4cG9ydCByYSBjaG8gbeG7mXQgc+G7kSB0ZW1wbGF0ZSBz4butIGThu6VuZ1xuICAgIGZpcmVNb2RlbENoYW5nZWQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX21pbmltaXplZERhdGEgPSB0aGlzLmdldE1pbmltaXplRGF0YSh0aGlzLl9tb2RlbERhdGEpO1xuICAgICAgICB0aGlzLmRhdGFDaGFuZ2UuZW1pdCh0aGlzLl9taW5pbWl6ZWREYXRhKTtcbiAgICB9O1xuXG4gICAgcHVibGljIGhhbmRsZUJ1dHRvbkNsaWNrKGNvbnRyb2w6IEJ1dHRvbkNvbnRyb2xTY2hlbWEsIGV2ZW50LCBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGlmIChjb250cm9sLm9uQ2xpY2spIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5vbkNsaWNrKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLkNMSUNLLFxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY29ycmVjdFZhbHVlKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUpIHtcbiAgICAgICAgbGV0IHJlID0gY3VycmVudE5vZGUudmFsdWU7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICBpZiAoY29udHJvbCAmJiBjb250cm9sLmNvcnJlY3RvcnMgJiYgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udHJvbC5jb3JyZWN0b3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ycmVjdG9yID0gY29udHJvbC5jb3JyZWN0b3JzW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5BVVRPX0NPUlJFQ1QsXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmUgPSBjb3JyZWN0b3IuY29ycmVjdChldmVudERhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZTtcbiAgICB9XG5cbiAgICAvLyB0cnVlIGzDoCB0aOG7j2EgbcOjbiwgZmFsc2UgbMOgIGtow7RuZyB0aOG7j2EgbcOjbiAo4bueIGPhuqVwIGhp4buHbiB04bqhaSBjaOG7qSBjaMawYSBraeG7g20gdHJhIGPhuqVwIGNvbilcbiAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlKGN1cnJlbnROb2RlOiBDb250cm9sVHJlZU5vZGUsIGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIERyb3Bkb3duQ29udHJvbFNjaGVtYVxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIFJhZGlvQnV0dG9uTGlzdENvbnRyb2xTY2hlbWFcbiAgICAgICAgICAgIHx8IGNvbnRyb2wgaW5zdGFuY2VvZiBBZGRyZXNzQ29udHJvbFNjaGVtYVxuICAgICAgICAgICAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZpbGVNYW5hZ2VyQ29udHJvbFNjaGVtYSkge1xuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiAhcGFyZW50Tm9kZS5tb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLnJlYWR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gY3VycmVudE5vZGUucGFyZW50Tm9kZS5tb2RlbC5fZXJyb3JzW2N1cnJlbnROb2RlLmZpZWxkXTtcbiAgICAgICAgICAgIGlmICghZXJyb3JzKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVycm9ycy5zcGxpY2UoMCwgZXJyb3JzLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWxpZGF0b3JzICYmIGNvbnRyb2wudmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sLnZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gY29udHJvbC52YWxpZGF0b3JzW2ldO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5WQUxJREFURSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IHZhbGlkYXRvci52YWxpZGF0ZShldmVudERhdGEpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IHZhbGlkYXRvci5nZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMuaW5kZXhPZihlcnIpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldEVycm9yKGZpZWxkOiBzdHJpbmcsIGVycm9yOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGQpO1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RyxrDhu51uZyBk4buvIGxp4buHdSBraMO0bmcgdOG7k24gdOG6oWknKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvcnMgPSBub2RlLnBhcmVudE5vZGUubW9kZWwuX2Vycm9yc1tub2RlLmZpZWxkXTtcbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgIH1cblxuICAgIHNldEVycm9yKGZpZWxkOiBzdHJpbmcgfCBzdHJpbmdbXSwgZXJyb3I6IHN0cmluZykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goaXRlbSA9PiB0aGlzLl9zZXRFcnJvcihpdGVtLCBlcnJvcikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2V0RXJyb3IoZmllbGQsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3JlbW92ZUVycm9yKGZpZWxkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoZmllbGQpO1xuICAgICAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1RyxrDhu51uZyBk4buvIGxp4buHdSBraMO0bmcgdOG7k24gdOG6oWknKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnBhcmVudE5vZGUubW9kZWwuX2Vycm9yc1tub2RlLmZpZWxkXSA9IFtdO1xuICAgIH1cblxuICAgIHJlbW92ZUVycm9yKGZpZWxkOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goaXRlbSA9PiB0aGlzLl9yZW1vdmVFcnJvcihpdGVtKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVFcnJvcihmaWVsZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNhY2hlQ29udHJvbFZhbHVlKGNvbnRyb2wsIHZhbHVlLCBwYXJlbnRQYXRoKSB7XG4gICAgICAgIGlmIChjb250cm9sICYmIGNvbnRyb2wuZW5hYmxlQ2FjaGluZykge1xuICAgICAgICAgICAgdGhpcy5jYWNoZWRWYWx1ZXNbcGFyZW50UGF0aCArICcuJyArIGNvbnRyb2wuZmllbGRdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDb21wb25lbnRCeVR5cGUodGVtcGxhdGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdID0gdGhpcy5fY29tbW9uU2VydmljZS5maW5kVGVtcGxhdGVGcm9tTGlzdCh0aGlzLmNoaWxkcmVuLCB0ZW1wbGF0ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlc1t0ZW1wbGF0ZU5hbWVdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJdGVtSW5BcnJheUJ5VmFsdWUoYXJyYXksIHYsIGNvbnRyb2wpIHtcbiAgICAgICAgaWYgKHYgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmdW5jR2V0TGFiZWwgPSBjb250cm9sLmZ1bmNHZXRMYWJlbDtcbiAgICAgICAgaWYgKGZ1bmNHZXRMYWJlbCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmdW5jR2V0TGFiZWwgPSBpdGVtID0+IGl0ZW1bY29udHJvbC5kaXNwbGF5RmllbGRdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcnJheSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCB2QXJyID0gdjtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICAgICAgICAgIHZBcnIgPSB2LnRvU3RyaW5nKCkuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZBcnIubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGFycmF5LmZpbmQoeCA9PiB4W2NvbnRyb2wudmFsdWVGaWVsZF0gPT0gdik7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmNHZXRMYWJlbChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2QXJyLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuZmlsdGVyKHAgPT4gdkFyci5zb21lKHEgPT4gcSA9PSBwW2NvbnRyb2wudmFsdWVGaWVsZF0pKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gZnVuY0dldExhYmVsKGl0ZW0pKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SXRlbUluQXJyYXlCeVRleHRWYWx1ZShhcnJheSwgdikge1xuICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHYgPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGFycmF5IGluc3RhbmNlb2YgQXJyYXlcbiAgICAgICAgICAgICYmIGFycmF5Lmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdi5qb2luKCc7ICcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWRkcmVzc0Rpc3BsYXlUZXh0KHNlbGVjdGVkVmFsdWUpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGFiZWxDbGFzcyhjb250cm9sKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBgbGFiZWwtY29udHJvbGA7XG4gICAgICAgIGlmIChjb250cm9sLmluZGV4TGFiZWwpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnIGhhdmVJbmRleCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvVmlldyhlbGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgICBpZiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGgxOiBhbnkgPSBlbGUuY2xvc2VzdCgnZGl2W2lkJD1cXCctaG9sZGVyXFwnXScpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChoMSAmJiBoMS5wcmV2aW91c1NpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaDEgPSBoMS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoMS50YWdOYW1lID09PSAnRElWJykgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGgxICYmIGgxLnNjcm9sbEludG9WaWV3KSBoMS5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogLSBTZXQgRm9jdXMgY29udHJvbFxuICAgICAqIEBwYXJhbSBvcHRpb25zXG4gICAgICovXG5cbiAgICBwcml2YXRlIGZvY3VzRmlyc3RDb250cm9sKCkge1xuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgZGl2cyA9IGZvcm1FbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Rpdi5jcnVkLWZvcm0tY29udHJvbCcpO1xuICAgICAgICBpZiAoZGl2cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkaXYgb2YgZGl2cykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3REaXZIb2xkZXIgPSBkaXY7XG4gICAgICAgICAgICAgICAgbGV0IGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaW5wdXQ6bm90KFt0eXBlPWZpbGVdKTpub3QoW3R5cGU9aGlkZGVuXSk6bm90KC5pbnB1dC1jYWxlbmRhciknKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVmlldyhmaXJzdENvbnRyb2wpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gdGhpcy5maXJzdERpdkhvbGRlci5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgJiYgZmlyc3RDb250cm9sLmlkLmluZGV4T2YoJ3RpbnktYW5ndWxhcicpICE9IDBcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbCA9IHRoaXMuZmlyc3REaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgalF1ZXJ5KGZpcnN0Q29udHJvbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ2JvZHknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRlcHJlY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udHJvbC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aW55bWNlLWZvY3VzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNUb0ZpcnN0RXJyb3JDb250cm9sKCkge1xuICAgICAgICBjb25zdCBmb3JtRWxlbWVudCA9IHRoaXMuZm9ybUVsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBgZGl2LmVycm9yYDtcbiAgICAgICAgY29uc3QgZGl2SG9sZGVyID0gZm9ybUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIGlmIChkaXZIb2xkZXIpIHtcbiAgICAgICAgICAgIGxldCBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVmlldyhmaXJzdENvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZmlyc3RDb250cm9sID0gZGl2SG9sZGVyLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJyk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgJiYgZmlyc3RDb250cm9sLmlkLmluZGV4T2YoJ3RpbnktYW5ndWxhcicpICE9IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdENvbnRyb2wgPSBkaXZIb2xkZXIucXVlcnlTZWxlY3RvcignaWZyYW1lJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeShmaXJzdENvbnRyb2wpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRzKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnYm9keScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250cm9sLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGlueW1jZS1mb2N1cydcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcHJldmVudEJsdXIoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudHJhcEZvY3VzKSB7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICB3aGlsZSAodGFyZ2V0IHx8IHRhcmdldC50YWdOYW1lID09ICdGT1JNJykge1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaWQuZW5kc1dpdGgoJy1ob2xkZXInKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCA9PSB0aGlzLmZpcnN0RGl2SG9sZGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDb250cm9sID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0Q29udHJvbCA9PSBldmVudC50YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWaXNpYmxlKGVsZW0pIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW0pO1xuICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChzdHlsZS52aXNpYmlsaXR5ICE9PSAndmlzaWJsZScpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKCtzdHlsZS5vcGFjaXR5IDwgMC4xKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsZW0ub2Zmc2V0V2lkdGhcbiAgICAgICAgICAgICsgZWxlbS5vZmZzZXRIZWlnaHRcbiAgICAgICAgICAgICsgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHRcbiAgICAgICAgICAgICsgZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aFxuICAgICAgICAgICAgPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbUNlbnRlciA9IHtcbiAgICAgICAgICAgIHg6IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIGVsZW0ub2Zmc2V0V2lkdGggLyAyLFxuICAgICAgICAgICAgeTogZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyBlbGVtLm9mZnNldEhlaWdodCAvIDJcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcG9pbnRDb250YWluZXIgPSA8YW55PihcbiAgICAgICAgICAgIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZWxlbUNlbnRlci54LCBlbGVtQ2VudGVyLnkpXG4gICAgICAgICk7XG4gICAgICAgIGlmIChwb2ludENvbnRhaW5lcikge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIGlmIChwb2ludENvbnRhaW5lciA9PT0gZWxlbSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XG4gICAgICAgICAgICB9IHdoaWxlICgocG9pbnRDb250YWluZXIgPSBwb2ludENvbnRhaW5lci5wYXJlbnROb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVSb3coaW5kZXgsIGNvbnRyb2w6IFRhYmxlU2NoZW1hLCB0YWJsZVBhdGgpIHtcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dEZWxldGVDb25maXJtKCkudGhlbihhc3luYyBycyA9PiB7XG4gICAgICAgICAgICBpZiAoIXJzKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XG4gICAgICAgICAgICBjb25zdCB0b0RlbGV0ZVJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XG5cbiAgICAgICAgICAgIGxldCB0b0RlbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0aW5nKSB7XG4gICAgICAgICAgICAgICAgdG9EZWxldGUgPSBjb250cm9sLm9uRGVsZXRpbmcobmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5ERUxFVElORyxcbiAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodG9EZWxldGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZU1vZGVsQ2hhbmdlZCgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25DaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLlRBQkxFX0NIQU5HRUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkFmdGVyQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFmdGVyQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IHRvRGVsZXRlUm93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLlRBQkxFX0NIQU5HRUQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkRlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25EZWxldGVkKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogdG9EZWxldGVSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuREVMRVRFRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZE5ld1JvdyhcbiAgICAgICAgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCwgZXZlbnRUeXBlPywgZGlzYWJsZU9wZW5EaWFsb2c6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgaW5pdERhdGE6IGFueSA9IHt9LCBmaXJlRXZlbnRGaW5pc2ggPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmIChjb250cm9sLnNob3dFZGl0ICYmICFkaXNhYmxlT3BlbkRpYWxvZykge1xuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1EaWFsb2dNb2RlbC5oZWFkZXIgPSBgVGjDqm0gbeG7m2kgJHtjb250cm9sLmxhYmVsfWA7XG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybVNjaGVtYSA9IGNvbnRyb2wucm93VGVtcGxhdGU7XG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybURpYWxvZ01vZGVsLnBvcHVwU2l6ZSA9IGNvbnRyb2wucG9wdXBTaXplO1xuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID0gLTE7XG4gICAgICAgICAgICB0aGlzLnRhYmxlRm9ybURpYWxvZ01vZGVsLmRhdGEgPSB7fTtcbiAgICAgICAgICAgIHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8gPSB7XG4gICAgICAgICAgICAgICAgY29udHJvbCxcbiAgICAgICAgICAgICAgICB0YWJsZVBhdGgsXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy50YWJsZUZvcm1EaWFsb2dNb2RlbC5zaG93RWRpdEZvcm0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0YWJsZU5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSB0YWJsZVBhdGggKyAnWycgKyBpbmRleCArICddJztcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gaW5pdERhdGE7XG5cbiAgICAgICAgLy8gVGjDqm0gaWQgxJHhu4MgbmfEg24gcmVuZGVyIGxpw6puIHThu6VjXG4gICAgICAgIGlmIChjb250cm9sLmF1dG9HZW5lcmF0ZUlkICYmICghdGhpcy5fY29tbW9uU2VydmljZS5pc1ZhbGlkR3VpZChpbml0RGF0YS5pZCkpKSB7XG4gICAgICAgICAgICBkYXRhLmlkID0gdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHN1YkNvbnRyb2wgb2YgY29udHJvbC5yb3dUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5pbml0Q29udHJvbERlZmF1bHRWYWx1ZShkYXRhLCBzdWJDb250cm9sLCBwYXJlbnRQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0b0FkZCA9IHRydWU7XG4gICAgICAgIGlmIChjb250cm9sLm9uQWRkaW5nKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRvQWRkID0gY29udHJvbC5vbkFkZGluZyhuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuQURESU5HLFxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICB0b0FkZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvQWRkICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnB1c2goZGF0YSk7XG4gICAgICAgICAgICB0YWJsZU5vZGUucmVpbml0Q2hpbGROb2RlcyhmaXJlRXZlbnRGaW5pc2gpO1xuXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlICE9IHRoaXMuZXZlbnRUeXBlLklOSVQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbmV3Um93Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgocGFyZW50UGF0aCk7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuVEFCTEVfQ0hBTkdFRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWZ0ZXJDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFmdGVyQ2hhbmdlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuVEFCTEVfQ0hBTkdFRCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRlZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25BZGRlZChuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBuZXdSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuQURERUQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTXVsdGlSb3coY29udHJvbCwgbGVuZ3RoLCB0YWJsZVBhdGgsIGV2ZW50VHlwZT8pIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZGROZXdSb3coY29udHJvbCwgdGFibGVQYXRoLCBldmVudFR5cGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgaGFuZGxlU2F2ZWRUYWJsZVJvdyhkYXRhKSB7XG4gICAgICAgIHRoaXMudGFibGVGb3JtRGlhbG9nTW9kZWwuc2hvd0VkaXRGb3JtID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvLmNvbnRyb2w7XG4gICAgICAgIGNvbnN0IHRhYmxlUGF0aCA9IHRoaXMudGFibGVGb3JtQ3VycmVudEluZm8udGFibGVQYXRoO1xuICAgICAgICBjb25zdCBldmVudFR5cGUgPSB0aGlzLnRhYmxlRm9ybUN1cnJlbnRJbmZvLmV2ZW50VHlwZTtcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xuICAgICAgICBpZiAodGhpcy50YWJsZUZvcm1DdXJyZW50Um93ID4gLTEpIHtcbiAgICAgICAgICAgIHRhYmxlTm9kZS5tb2RlbFt0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3ddID0geyAuLi50YWJsZU5vZGUubW9kZWxbdGhpcy50YWJsZUZvcm1DdXJyZW50Um93XSwgLi4uZGF0YSB9O1xuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVOb2RlLmNoaWxkTm9kZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50UGF0aCA9IHRhYmxlUGF0aCArICdbJyArIGluZGV4ICsgJ10nO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJDb250cm9sIG9mIGNvbnRyb2wucm93VGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRDb250cm9sTW9kZWwoZGF0YSwgc3ViQ29udHJvbCwgcGFyZW50UGF0aCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0b0FkZCA9IHRydWU7XG4gICAgICAgICAgICBpZiAoY29udHJvbC5vbkFkZGluZykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gY29udHJvbC5vbkFkZGluZyhuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgfHwgdGhpcy5ldmVudFR5cGUuQURESU5HLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIHRvQWRkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodG9BZGQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLm1vZGVsLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgdGFibGVOb2RlLnJlaW5pdENoaWxkTm9kZXMoKTtcblxuICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGUgIT0gdGhpcy5ldmVudFR5cGUuSU5JVCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVNb2RlbENoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdSb3dOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aChwYXJlbnRQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5vbkNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbnRyb2wub25DaGFuZ2VkKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5UQUJMRV9DSEFOR0VELFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLm9uQWZ0ZXJDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uQWZ0ZXJDaGFuZ2VkKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5UQUJMRV9DSEFOR0VELFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wub25BZGRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29udHJvbC5vbkFkZGVkKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlOiB0YWJsZU5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogbmV3Um93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSB8fCB0aGlzLmV2ZW50VHlwZS5BRERFRCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzYXZlUm93KGluZGV4LCBjb250cm9sOiBUYWJsZVNjaGVtYSwgdGFibGVQYXRoKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlTm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgodGFibGVQYXRoKTtcbiAgICAgICAgY29uc3QgY3VyZW50Um93Tm9kZSA9IHRhYmxlTm9kZS5jaGlsZE5vZGVzW2luZGV4XTtcbiAgICAgICAgaWYgKGNvbnRyb2wub25TYXZlKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wub25TYXZlKG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGFibGVOb2RlLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBjdXJlbnRSb3dOb2RlLFxuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IHRoaXMuZXZlbnRUeXBlLlNBVkUsXG4gICAgICAgICAgICAgICAgICAgIGNydWRGb3JtOiB0aGlzXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWRpdFJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xuICAgICAgICB0aGlzLnRhYmxlRm9ybURpYWxvZ01vZGVsLmhlYWRlciA9IGBT4butYSAke2NvbnRyb2wubGFiZWx9YDtcbiAgICAgICAgdGhpcy50YWJsZUZvcm1TY2hlbWEgPSBjb250cm9sLnJvd1RlbXBsYXRlO1xuICAgICAgICB0aGlzLnRhYmxlRm9ybUN1cnJlbnRSb3cgPSBpbmRleDtcbiAgICAgICAgY29uc3QgdGFibGVOb2RlID0gdGhpcy5fcm9vdE5vZGUuZ2V0Tm9kZUJ5UGF0aCh0YWJsZVBhdGgpO1xuICAgICAgICBjb25zdCB0b0RlbGV0ZVJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XG4gICAgICAgIHRoaXMudGFibGVGb3JtRGlhbG9nTW9kZWwuZGF0YSA9IHRvRGVsZXRlUm93Tm9kZS52YWx1ZTtcbiAgICAgICAgdGhpcy50YWJsZUZvcm1DdXJyZW50SW5mbyA9IHtcbiAgICAgICAgICAgIGNvbnRyb2wsXG4gICAgICAgICAgICB0YWJsZVBhdGgsXG4gICAgICAgICAgICBpbmRleFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnRhYmxlRm9ybURpYWxvZ01vZGVsLnNob3dFZGl0Rm9ybSA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhbmRsZVJvd09yZGVyZWQoY29udHJvbDogVGFibGVTY2hlbWEsIGV2dCwgZXZlbnRUeXBlPywgcGFyZW50TW9kZWw/LCBwYXJlbnRQYXRoPywgc291cmNlTm9kZT8sIGJ1YmJsZT8pIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHBhcmVudFBhdGgpO1xuICAgICAgICBsZXQgY3VycmVudE5vZGU7XG5cbiAgICAgICAgLy8gcm93IGluIHRhYmxlXG4gICAgICAgIGlmIChjb250cm9sID09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGNvbnRyb2wgPSBjdXJyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIHBhcmVudE1vZGVsID0gcGFyZW50Tm9kZS5tb2RlbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gcGFyZW50Tm9kZS5nZXRDaGlsZE5vZGUoY29udHJvbC5maWVsZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gY3VycmVudE5vZGUudmFsdWU7XG5cbiAgICAgICAgLy8gYXV0byBjb3JyZWN0IHZhbHVlXG4gICAgICAgIHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUoY3VycmVudE5vZGUpO1xuICAgICAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgY3VycmVudE5vZGUsXG4gICAgICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsXG4gICAgICAgICAgICBzb3VyY2VOb2RlOiBzb3VyY2VOb2RlIHx8IGN1cnJlbnROb2RlLFxuICAgICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgICAgY3J1ZEZvcm06IHRoaXNcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjb250cm9sLm9uUmVvcmRlcmVkKSB7XG4gICAgICAgICAgICBhd2FpdCBjb250cm9sLm9uUmVvcmRlcmVkKGV2ZW50RGF0YSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWJ1YmJsZSkge1xuICAgICAgICAgICAgdGhpcy5maXJlTW9kZWxDaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KGV2ZW50RGF0YSk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd0NvbnRleHRNZW51KGV2dCwgcm93RGF0YSwgY29udHJvbDogVGFibGVTY2hlbWEpIHtcbiAgICAgICAgdGhpcy5yb3dEYXRhQ3VycmVudCA9IHJvd0RhdGE7XG4gICAgICAgIHRoaXMuYnV0dG9uQ29udGV4dHMgPSBhd2FpdCBjb250cm9sLnJvd0J1dHRvbnMocm93RGF0YSk7XG4gICAgICAgIGlmICghdGhpcy5idXR0b25Db250ZXh0cyB8fCB0aGlzLmJ1dHRvbkNvbnRleHRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2hvd0NvbnRleHRNZW51KGV2dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2hvd0NvbnRleHRNZW51KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHRNZW51LnNob3coZXZ0KTtcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbWVzc2FnZVJvdyhpbmRleCwgY29udHJvbDogVGFibGVTY2hlbWEsIHRhYmxlUGF0aCkge1xuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLl9yb290Tm9kZS5nZXROb2RlQnlQYXRoKHRhYmxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGN1cmVudFJvd05vZGUgPSB0YWJsZU5vZGUuY2hpbGROb2Rlc1tpbmRleF07XG4gICAgICAgIGlmIChjb250cm9sLm9uTWVzc2FnZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sLm9uTWVzc2FnZShuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IHRhYmxlTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlTm9kZTogY3VyZW50Um93Tm9kZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0aGlzLmV2ZW50VHlwZS5NRVNTQUdFLFxuICAgICAgICAgICAgICAgICAgICBjcnVkRm9ybTogdGhpc1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUYWJsZUZ1bmN0aW9uQ29sdW1uV2lkdGgoY29udHJvbDogVGFibGVTY2hlbWEpIHtcbiAgICAgICAgbGV0IG5lID0gNTA7XG4gICAgICAgIGlmIChjb250cm9sLnNob3dEZWxldGUpIG5lICs9IDMwO1xuICAgICAgICBpZiAoY29udHJvbC5zaG93RWRpdCkgbmUgKz0gMzA7XG4gICAgICAgIGlmIChjb250cm9sLnNob3dTYXZlKSBuZSArPSAzMDtcbiAgICAgICAgaWYgKGNvbnRyb2wucm93QnV0dG9ucykgbmUgKz0gMzA7XG4gICAgICAgIHJldHVybiBuZSArICdweCc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1hc2tCeVR5cGUobWFza1R5cGUpIHtcbiAgICAgICAgaWYgKG1hc2tUeXBlID09ICdkZWNpbWFsJykge1xuICAgICAgICAgICAgcmV0dXJuICdkb3Rfc2VwYXJhdG9yLjUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRleHRBbGlnbih0ZXh0QWxpZ246IG51bWJlcikge1xuICAgICAgICBzd2l0Y2ggKHRleHRBbGlnbikge1xuICAgICAgICAgICAgY2FzZSBUZXh0QWxpZ24uQ2VudGVyOlxuICAgICAgICAgICAgICAgIHJldHVybiAnY2VudGVyJztcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLkxlZnQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgICAgICAgIGNhc2UgVGV4dEFsaWduLlJpZ2h0OlxuICAgICAgICAgICAgICAgIHJldHVybiAncmlnaHQnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2hlY2tEaXNhYmxlZChkYXRhOiBhbnksIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZSkge1xuICAgICAgICByZXR1cm4gZGF0YS5fc3RhdHVzW2NvbnRyb2wuZmllbGRdICYmIChkYXRhLl9zdGF0dXNbY29udHJvbC5maWVsZF0uZGlzYWJsZWQgPT09IHRydWUgfHwgKGRhdGEuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5kaXNhYmxlZCA9PT0gdW5kZWZpbmVkICYmIGNvbnRyb2wuZGlzYWJsZWQpKTtcbiAgICB9XG5cbiAgICBjaGVja0hpZGRlbihjb250cm9sOiBGb3JtQ29udHJvbEJhc2UsIHBhcmVudE1vZGVsOiBhbnksIHBhdGg6IHN0cmluZykge1xuICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBudWxsO1xuICAgICAgICBpZiAocGF0aCAmJiBjb250cm9sWydub2RlcyddKSB7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGNvbnRyb2xbJ25vZGVzJ11bcGF0aF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRyb2xbJ19oaWRkZW4nXSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdICE9IHVuZGVmaW5lZCAmJiAocGFyZW50TW9kZWwuX3N0YXR1c1tjb250cm9sLmZpZWxkXS5oaWRkZW4gPT09IHRydWVcbiAgICAgICAgICAgIHx8IChwYXJlbnRNb2RlbC5fc3RhdHVzW2NvbnRyb2wuZmllbGRdLmhpZGRlbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgJiYgKGNvbnRyb2wuaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIHx8IChjb250cm9sLmhpZGRlbkNoZWNrICYmIGNvbnRyb2wuaGlkZGVuQ2hlY2sodGhpcy5fbWluaW1pemVkRGF0YSwgY3VycmVudE5vZGUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkpO1xuICAgICAgICBjdXJyZW50Tm9kZVsnX2hpZGRlbiddID0gISFyZXN1bHQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZ2V0Q29udGV4dFRkKGNvbnRyb2wsIHJvd0RhdGEsIGluZGV4LCB0YWJsZVBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRyb2wsXG4gICAgICAgICAgICBkYXRhOiByb3dEYXRhLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICB0YWJsZVBhdGgsXG4gICAgICAgICAgICBwYXJlbnRQYXRoOiBgJHt0YWJsZVBhdGh9WyR7aW5kZXh9XWAsXG4gICAgICAgICAgICBwYXRoOiBgJHt0YWJsZVBhdGh9WyR7aW5kZXh9XS4ke2NvbnRyb2wuZmllbGR9YCxcbiAgICAgICAgICAgIHNob3dMYWJlbDogZmFsc2UsXG4gICAgICAgICAgICBtZFdpZHRoOiAxMlxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc01vYmlsZU9yVGFibGV0KCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5fZGV2aWNlRGV0ZWN0b3JTZXJ2aWNlLmlzTW9iaWxlKClcbiAgICAgICAgICAgIHx8IHRoaXMuX2RldmljZURldGVjdG9yU2VydmljZS5pc1RhYmxldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlQ2FjaGluZykge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQ2FjaGVWYWx1ZXNUb1N0b3JhZ2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uU2V0dGluZ3MoZXZlbnQpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hT2xkZXN0KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19PTERFU1QsIG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hTmV3ZXN0KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19ORVdFU1QsIG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhYmxlU2NoZW1hTmV4dChldnQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuQ09NTU9OLlRBQkxFX1NDSEVNQV9QQUdJTkdfTkVYVCwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uVGFibGVTY2hlbWFQcmV2KGV2dCkge1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5DT01NT04uVEFCTEVfU0NIRU1BX1BBR0lOR19QUkVWLCBudWxsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaChldnQpIHtcblxuICAgIH1cblxuICAgIGdldENvbnRyb2xEYXRhU291cmNlKGNvbnRyb2w6IERyb3Bkb3duQ29udHJvbFNjaGVtYSwgZGF0YTogYW55KSB7XG4gICAgICAgIGlmIChkYXRhLl9zb3VyY2VbY29udHJvbC5maWVsZF0gaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGRhdGEuX3NvdXJjZVtjb250cm9sLmZpZWxkXTtcbiAgICAgICAgaWYgKGNvbnRyb2wuZGF0YVNvdXJjZSBpbnN0YW5jZW9mIEFycmF5KSByZXR1cm4gY29udHJvbC5kYXRhU291cmNlO1xuICAgICAgICBpZiAoY29udHJvbC5kYXRhU291cmNlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHJldHVybiBjb250cm9sLmRhdGFTb3VyY2UoKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyUmVsb2FkKGZpZWxkOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2xzW2ZpZWxkXTtcbiAgICAgICAgaWYgKGNvbnRyb2wgJiYgY29udHJvbC5iaW5kaW5nRmlsdGVycyAmJiBjb250cm9sLmJpbmRpbmdGaWx0ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuX3Jvb3ROb2RlLmdldE5vZGVCeVBhdGgoY29udHJvbC5iaW5kaW5nRmlsdGVyc1swXS5maWVsZCk7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBuZXcgRXZlbnREYXRhKHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogcGFyZW50Tm9kZSxcbiAgICAgICAgICAgICAgICBzb3VyY2VFdmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICBzb3VyY2VOb2RlOiBwYXJlbnROb2RlLFxuICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogdGhpcy5ldmVudFR5cGUuQ0hBTkdFXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5jb3JyZWN0VmFsdWUocGFyZW50Tm9kZSk7XG4gICAgICAgICAgICAvLyBhdXRvIGNvcnJlY3QgdmFsdWVcbiAgICAgICAgICAgIHBhcmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgaWYgKGNvbnRyb2xbS2V5RnVuY3Rpb25SZWxvYWRdKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbFtLZXlGdW5jdGlvblJlbG9hZF0oZXZlbnREYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbnRyb2wuX2NvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLl9jb21wb25lbnQuZ2V0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sLl9jb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbnRyb2xUcmVlTm9kZSB7XG4gICAgbW9kZWxQYXRoOiBzdHJpbmc7XG4gICAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICAgIGZpZWxkOiBzdHJpbmc7XG4gICAgcGFyZW50Tm9kZTogQ29udHJvbFRyZWVOb2RlO1xuICAgIHJvb3ROb2RlOiBDb250cm9sVHJlZU5vZGU7XG4gICAgY2hpbGROb2RlczogQ29udHJvbFRyZWVOb2RlW10gPSBbXTtcbiAgICBoYXNTY2hlbWEgPSB0cnVlO1xuICAgIGNvbnRyb2w6IEZvcm1Db250cm9sQmFzZTtcbiAgICBfY29tcG9uZW50OiBhbnk7XG4gICAgZm9ybUNvbnRyb2xzO1xuICAgIGtleXNQbHVzOiBzdHJpbmdbXTtcbiAgICBpc1Jvb3ROb2RlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfY3J1ZEZvcm06IENydWRGb3JtQ29tcG9uZW50O1xuICAgIHByaXZhdGUgY2hpbGROb2RlRGljID0ge307XG4gICAgcHJpdmF0ZSBkYXRhOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbDogYW55LCBzY2hlbWFzOiBLZXlWYWx1ZVR5cGUsIGZpZWxkPywgcGFyZW50Tm9kZT86IENvbnRyb2xUcmVlTm9kZSkge1xuICAgICAgICB0aGlzLmRhdGEgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5mb3JtQ29udHJvbHMgPSBzY2hlbWFzO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUubW9kZWxQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsUGF0aCA9IHBhcmVudE5vZGUubW9kZWxQYXRoICsgJy4nICsgZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hUGF0aCA9IHBhcmVudE5vZGUuc2NoZW1hUGF0aCArICcuJyArIGZpZWxkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZmllbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWxQYXRoID0gcGFyZW50Tm9kZS5tb2RlbFBhdGggKyAnWycgKyBmaWVsZCArICddJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gcGFyZW50Tm9kZS5zY2hlbWFQYXRoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1NjaGVtYSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWxQYXRoID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2hlbWFQYXRoID0gZmllbGQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUgPSBwYXJlbnROb2RlLnJvb3ROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb290Tm9kZSA9IHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICAgIGlmICh0aGlzLmhhc1NjaGVtYSkge1xuICAgICAgICAgICAgdGhpcy5jb250cm9sID0gc2NoZW1hc1t0aGlzLnNjaGVtYVBhdGhdO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jb250cm9sWydub2RlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbFsnbm9kZXMnXSA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xbJ25vZGVzJ11bdGhpcy5tb2RlbFBhdGhdID0gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzW3RoaXMuc2NoZW1hUGF0aF07XG4gICAgICAgIGxldCBrZXlzUGx1cyA9IFtdO1xuICAgICAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgICAgICBpZiAoc2NoZW1hIGluc3RhbmNlb2YgQ29udGFpbmVyU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAga2V5c1BsdXMgPSBzY2hlbWEuY29udHJvbHMuZmlsdGVyKHEgPT4gcS5maWVsZCkubWFwKHEgPT4gcS5maWVsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkge1xuICAgICAgICAgICAgICAgIGtleXNQbHVzID0gc2NoZW1hLnJvd1RlbXBsYXRlLmZpbHRlcihxID0+IHEuZmllbGQpLm1hcChxID0+IHEuZmllbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnNjaGVtYVBhdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzUm9vdE5vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzU2NoZW1hID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gc2NoZW1hc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS51bmlxdWVGaWVsZCA9PSBpdGVtLmZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzUGx1cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmtleXNQbHVzID0ga2V5c1BsdXM7XG4gICAgICAgIHRoaXMucmVpbml0Q2hpbGROb2RlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWluaXRDaGlsZE5vZGVzKGZpcmVFdmVudEZpbmlzaCA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5jaGlsZE5vZGVzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMuY2hpbGROb2RlRGljID0ge307XG4gICAgICAgIHRoaXMuaW5pdENoaWxkTm9kZXModGhpcy5kYXRhLCB0aGlzLmZvcm1Db250cm9scywgdGhpcy5rZXlzUGx1cyk7XG4gICAgICAgIGlmIChmaXJlRXZlbnRGaW5pc2ggJiYgdGhpcy5jb250cm9sICYmIHRoaXMuY29udHJvbCBpbnN0YW5jZW9mIFRhYmxlU2NoZW1hICYmIHRoaXMuY29udHJvbC5vblRhYmxlRmluaXNoSW5pdCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gbmV3IEV2ZW50RGF0YSh7XG4gICAgICAgICAgICAgICAgc291cmNlTm9kZTogdGhpcyxcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZTogdGhpcyxcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IEV2ZW50VHlwZS5UQUJMRV9GSU5JU0hfSU5JVFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wub25UYWJsZUZpbmlzaEluaXQoZXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdENoaWxkTm9kZXMobW9kZWw6IGFueSwgc2NoZW1hczogW10sIGtleXNQbHVzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoaXNMaXRlcmFsT2JqZWN0KG1vZGVsKSkge1xuICAgICAgICAgICAgY29uc3QgYWxsS2V5ID0gbmV3IFNldChbLi4ua2V5c1BsdXMsIC4uLk9iamVjdC5rZXlzKG1vZGVsKV0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSAnX3N0YXR1cycgJiYga2V5ICE9ICdfZXJyb3JzJyAmJiBrZXkgIT0gJ19zb3VyY2UnICYmIGtleSAhPSBLZXlGbGFzaFNob3cpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGROb2RlID0gbmV3IENvbnRyb2xUcmVlTm9kZShtb2RlbFtrZXldLCBzY2hlbWFzLCBrZXksIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZXMucHVzaChjaGlsZE5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoaWxkTm9kZURpY1tjaGlsZE5vZGUuZmllbGRdID0gY2hpbGROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNhdSBraGkgxJHDoyBpbml0IHhvbmcgbm9kZSBjaG8gcm93IHRow6wgZmlyZSBldmVudCBjaG8gY8OhYyBjb250cm9sIHRyb25nIHJvd1xuICAgICAgICAgICAgLy8gVGjGsOG7nW5nIGTDuW5nIHbhu5tpIG3hu6VjIMSRw61jaCBj4bqnbiBkaXNhYmxlZCwgaGlkZGVuIGPDoWMgY29udHJvbCBj4bunYSByb3cga2hpIGPDsyBuaHUgY+G6p3VcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLmZvckVhY2goXyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfLmNvbnRyb2wgJiYgXy5jb250cm9sLm9uUm93Tm9kZUZpbmlzaEluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IG5ldyBFdmVudERhdGEoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU5vZGU6IF8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGU6IF8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiBFdmVudFR5cGUuUk9XX0ZJTklTSF9JTklUXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uY29udHJvbC5vblJvd05vZGVGaW5pc2hJbml0KGV2ZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXJyYXkobW9kZWwpKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBpZiAobW9kZWwubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtb2RlbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSBuZXcgQ29udHJvbFRyZWVOb2RlKGl0ZW0sIHNjaGVtYXMsIGksIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBjaGlsZE5vZGUucGFyZW50Tm9kZSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2RlRGljW2NoaWxkTm9kZS5maWVsZF0gPSBjaGlsZE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2hpbGROb2RlKGZpZWxkKTogQ29udHJvbFRyZWVOb2RlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGROb2RlRGljW2ZpZWxkXTtcbiAgICB9XG5cbiAgICBzZXRDcnVkRm9ybShjcnVkRm9ybTogQ3J1ZEZvcm1Db21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5fY3J1ZEZvcm0gPSBjcnVkRm9ybTtcbiAgICB9XG5cbiAgICBnZXQgY3J1ZEZvcm0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLl9jcnVkRm9ybTtcbiAgICB9XG5cbiAgICBnZXQgcGFyZW50TW9kZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUubW9kZWw7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldCBwYXJlbnRNb2RlbFBhdGgoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHJldHVybiB0aGlzLnBhcmVudE5vZGUubW9kZWxQYXRoO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgcGFyZW50Q29udHJvbCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Tm9kZSkgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5jb250cm9sO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgbW9kZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgbW9kZWwodmFsKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuZmllbGRdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gdmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHZhbHVlKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnROb2RlLmRhdGFbdGhpcy5maWVsZF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUuZGF0YVt0aGlzLmZpZWxkXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBjb21wb25lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnQ7XG4gICAgfVxuXG4gICAgc2V0IGNvbXBvbmVudCh2YWwpIHtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50ID0gdmFsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRIaWRkZW4oZmllbGQ6IHN0cmluZyB8IHN0cmluZ1tdLCBoaWRkZW46IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkKSkge1xuICAgICAgICAgICAgZmllbGQuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhpZGRlbkZpZWxkKGYsIGhpZGRlbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGlkZGVuRmllbGQoZmllbGQsIGhpZGRlbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEhpZGRlbkZpZWxkKGZpZWxkOiBzdHJpbmcsIGhpZGRlbjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFByaXZhdGVTdGF0dXMoZmllbGQsICdoaWRkZW4nLCBoaWRkZW4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZChmaWVsZDogc3RyaW5nIHwgc3RyaW5nW10sIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXREaXNhYmxlZEZpZWxkKGYsIGRpc2FibGVkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXREaXNhYmxlZEZpZWxkKGZpZWxkLCBkaXNhYmxlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldERpc2FibGVkRmllbGQoZmllbGQ6IHN0cmluZywgZGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRQcml2YXRlU3RhdHVzKGZpZWxkLCAnZGlzYWJsZWQnLCBkaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRQcml2YXRlU3RhdHVzKGZpZWxkOiBzdHJpbmcsIHByb3A6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZE5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgoYCR7dGhpcy5tb2RlbFBhdGh9LiR7ZmllbGR9YCk7XG4gICAgICAgICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZC5zcGxpdCgnLicpLnBvcCgpO1xuICAgICAgICAgICAgY2hpbGROb2RlLnBhcmVudE5vZGUuZGF0YS5fc3RhdHVzW2xhc3RGaWVsZF1bcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5fc3RhdHVzW2ZpZWxkXVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5vZGVCeVBhdGgobW9kZWxQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcbiAgICAgICAgaWYgKG1vZGVsUGF0aCA9PSBudWxsIHx8IG1vZGVsUGF0aCA9PT0gJycpIHJldHVybiB0aGlzLnJvb3ROb2RlO1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5UcmVlKHRoaXMucm9vdE5vZGUsIG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Tm9kZUJ5U2NoZW1hUGF0aChzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcbiAgICAgICAgaWYgKHNjaGVtYVBhdGggPT0gbnVsbCB8fCBzY2hlbWFQYXRoID09PSAnJykgcmV0dXJuIHRoaXMucm9vdE5vZGU7XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRTY2hlbWFJblRyZWUodGhpcy5yb290Tm9kZSwgc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBtb2RlbFBhdGgpOiBDb250cm9sVHJlZU5vZGUge1xuICAgICAgICBpZiAobm9kZS5tb2RlbFBhdGggIT0gbnVsbCAmJiBub2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpID09IG1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGROb2Rlcykge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGUubW9kZWxQYXRoICE9IG51bGwgJiYgbW9kZWxQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLm1vZGVsUGF0aC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IHRoaXMuZmluZEluVHJlZShjaGlsZE5vZGUsIG1vZGVsUGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZSkgcmV0dXJuIHJlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRTY2hlbWFJblRyZWUobm9kZTogQ29udHJvbFRyZWVOb2RlLCBzY2hlbWFQYXRoKTogQ29udHJvbFRyZWVOb2RlIHtcbiAgICAgICAgaWYgKG5vZGUuc2NoZW1hUGF0aCAhPSBudWxsICYmIG5vZGUuc2NoZW1hUGF0aC50b0xvd2VyQ2FzZSgpID09IHNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLnNjaGVtYVBhdGggIT0gbnVsbCAmJiBzY2hlbWFQYXRoLnN0YXJ0c1dpdGgoY2hpbGROb2RlLnNjaGVtYVBhdGgudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmUgPSB0aGlzLmZpbmRTY2hlbWFJblRyZWUoY2hpbGROb2RlLCBzY2hlbWFQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlKSByZXR1cm4gcmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREYXRhU291cmNlVGFibGVTY2hlbWEocGF0aDogc3RyaW5nLCBkYXRhU291cmNlOiBhbnlbXSkge1xuICAgICAgICBjb25zdCB0YWJsZU5vZGUgPSB0aGlzLmdldE5vZGVCeVBhdGgocGF0aCk7XG4gICAgICAgIHRhYmxlTm9kZS5zZXREYXRhU291cmNlSW50ZXJuYWwoZGF0YVNvdXJjZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERhdGFTb3VyY2VJbnRlcm5hbChkYXRhU291cmNlOiBhbnlbXSkge1xuICAgICAgICBpZiAoISh0aGlzLmNvbnRyb2wgaW5zdGFuY2VvZiBUYWJsZVNjaGVtYSkpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tb2RlbC5zcGxpY2UoMCwgdGhpcy5tb2RlbC5sZW5ndGgpO1xuICAgICAgICBpZiAoZGF0YVNvdXJjZS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5yZWluaXRDaGlsZE5vZGVzKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhU291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlLl9jcnVkRm9ybS5hZGROZXdSb3codGhpcy5jb250cm9sLCB0aGlzLm1vZGVsUGF0aCwgbnVsbCwgdHJ1ZSwgZGF0YVNvdXJjZVtpXSwgaSA9PSBkYXRhU291cmNlLmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5jb250cm9sIGluc3RhbmNlb2YgVGFibGVTY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YVNvdXJjZUludGVybmFsKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmNvbnRyb2wgaW5zdGFuY2VvZiBDb250YWluZXJTY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5kYXRhW3RoaXMuY29udHJvbC5maWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY3J1ZEZvcm0uaW5pdENvbnRyb2xEZWZhdWx0VmFsdWUodGhpcy5wYXJlbnROb2RlLmRhdGEsIHRoaXMuY29udHJvbCwgdGhpcy5wYXJlbnROb2RlLm1vZGVsUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vZGVsID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=