@hestia-earth/ui-components 0.13.1 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/files/files-error.model.mjs +5 -3
- package/esm2020/files/files-form/files-form.component.mjs +3 -3
- package/esm2020/files/files-upload-errors/files-upload-errors.component.mjs +121 -0
- package/esm2020/files/files.module.mjs +8 -4
- package/esm2020/files/index.mjs +2 -1
- package/esm2020/impact-assessments/impact-assessments-products/impact-assessments-products.component.mjs +3 -2
- package/fesm2015/hestia-earth-ui-components.mjs +124 -11
- package/fesm2015/hestia-earth-ui-components.mjs.map +1 -1
- package/fesm2020/hestia-earth-ui-components.mjs +127 -11
- package/fesm2020/hestia-earth-ui-components.mjs.map +1 -1
- package/files/files-error.model.d.ts +1 -1
- package/files/files-upload-errors/files-upload-errors.component.d.ts +66 -0
- package/files/files.module.d.ts +8 -7
- package/files/index.d.ts +1 -0
- package/package.json +2 -1
|
@@ -472,10 +472,10 @@ export class FilesFormComponent {
|
|
|
472
472
|
}
|
|
473
473
|
}
|
|
474
474
|
FilesFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: FilesFormComponent, deps: [{ token: i0.ElementRef }, { token: i1.HeSearchService }, { token: i2.HeUsersService }], target: i0.ɵɵFactoryTarget.Component });
|
|
475
|
-
FilesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: FilesFormComponent, selector: "he-files-form", inputs: { schemas: "schemas", errors: "errors", node: "node", nodeMap: "nodeMap", editable: "editable", errorMode: "errorMode", deepEditable: "deepEditable", errorsEditable: "errorsEditable", showSuggestedDefaultProperties: "showSuggestedDefaultProperties" }, outputs: { nodeChanged: "nodeChanged", nodeErorrResolved: "nodeErorrResolved", nodeErrorAdded: "nodeErrorAdded" }, ngImport: i0, template: "<div class=\"card\">\n <div class=\"card-toggle p-4\" (click)=\"isOpen = !isOpen\" pointer>\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"isOpen\"></fa-icon>\n <span *ngIf=\"nodeProperty\" class=\"is-px-2\"\n [class.has-text-danger]=\"nodeProperty.hasError\"\n [class.has-text-warning]=\"nodeProperty.hasWarning\"\n >\n <he-node-icon [type]=\"nodeProperty.schemaType\"></he-node-icon>\n </span>\n </div>\n\n <ng-container *ngIf=\"editable && isOpen && nodeProperty\">\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n\n <div class=\"card-content\">\n <ng-container *ngIf=\"isOpen\">\n <div class=\"pb-3 mb-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: nodeProperty}\"></ng-container>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"nodeProperty?.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: nodeProperty, edit: true}\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"columns is-multiline\">\n <ng-container *ngFor=\"let property of properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"propertyMap; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<he-maps-drawing-confirm *ngIf=\"!!mapDrawingProperty\"\n [value]=\"mapDrawingProperty.value\" [modes]=\"mapDrawingModes(mapDrawingProperty)\"\n (closed)=\"onMapDrawingClosed($event)\"\n></he-maps-drawing-confirm>\n\n<he-bibliographies-search-confirm *ngIf=\"!!bibliographiesSearchProperty\"\n [search]=\"bibliographiesSearchProperty.value\"\n [searchBy]=\"bibliographiesSearchKey(bibliographiesSearchProperty)\"\n [searchSources]=\"bibliographiesSearchSources\"\n (closed)=\"onBibliographiesSearchClosed($event)\"\n></he-bibliographies-search-confirm>\n\n<ng-template #labelDescription let-property>\n <ng-template #description>\n <span class=\"is-pre-line\">{{property.schema?.description}}</span>\n </ng-template>\n\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"description\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow is-narrow-width\"\n triggers=\"hover\" placement=\"right\" container=\"body\"\n >\n <span>{{property.key}}</span>\n </span>\n</ng-template>\n\n<ng-template #labelDefault let-property>\n <span>{{property.key}}</span>\n</ng-template>\n\n<ng-template #showProperty let-property>\n <ng-container *ngIf=\"(isOpen || property.closedVisible) && !property.isHidden\">\n <div class=\"column is-6\"\n [id]=\"property.fullKey + '_' + property.id\"\n [class.is-12]=\"property.properties.length || !property.key\"\n [ngSwitch]=\"!!property.properties.length\"\n >\n <div class=\"columns is-multiline is-variable is-1\" *ngSwitchCase=\"false\">\n <ng-container *bindOnce=\"property\">\n <div class=\"column is-3 py-1\" *ngIf=\"property.key\">\n <label class=\"label has-text-right-tablet has-text-ellipsis\" [for]=\"property.id\">\n <ng-container\n *ngTemplateOutlet=\"property.schema?.description && editable && property.editable ? labelDescription : labelDefault; context: {$implicit: property}\">\n </ng-container>\n </label>\n </div>\n </ng-container>\n\n <div class=\"column is-9 py-1\" [class.is-12]=\"!property.key\">\n <div class=\"field\">\n <ng-container *ngTemplateOutlet=\"inputForm; context: {$implicit: property}\"></ng-container>\n\n <ng-container *ngIf=\"(editable || errorsEditable) && (property.hasError || property.hasWarning)\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: false}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"panel\" *ngSwitchCase=\"true\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n [class.is-default]=\"!property.changed && !property.hasError && !property.hasWarning\"\n >\n <div class=\"open-group panel-heading py-0\"\n (click)=\"property.isOpen = !property.isOpen\" pointer\n [class.is-open]=\"property.isOpen\"\n [class.has-text-white]=\"(errorMode && property.changed) || property.hasError || property.hasWarning\"\n >\n <div class=\"columns is-mobile is-vcentered\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!property.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"property.isOpen\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">{{property.key}}</span>\n </span>\n <span *ngIf=\"property.schemaType\" class=\"column is-narrow py-1 my-0\">\n <span class=\"tags mb-0 has-addons\">\n <span class=\"tag mb-0 is-light\">Type</span>\n <span class=\"tag mb-0 is-white\">\n <he-schema-version-link linkClass=\"is-small\" [node]=\"{'@type': property.schemaType}\">\n <span>{{property.schemaType}}</span>\n </he-schema-version-link>\n </span>\n </span>\n </span>\n <he-popover-confirm class=\"column is-narrow py-1 my-0 px-0\"\n *ngIf=\"editable && !errorsEditable\"\n ngbTooltip=\"Remove group\" placement=\"top\"\n [message]=\"'<p>This will remove the group completely.</p>' + (property.isRequired ? '<p><u>Warning: this field is required.</u></p>' : '') + '<p>Do you confirm?</p>'\"\n popoverClass=\"px-3\"\n (confirmed)=\"propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\" size=\"sm\"></fa-icon>\n </he-popover-confirm>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" *ngIf=\"property.isOpen\">\n <ng-container [ngSwitch]=\"property.isArray\">\n <div class=\"px-3 pt-4\" *ngIf=\"property.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: true}\"></ng-container>\n </div>\n\n <div class=\"mt-3\" *ngSwitchCase=\"false\">\n <p class=\"help py-1 px-2\" *ngIf=\"editable && !property.editable\">\n To change the {{property.key}}, please delete it first, then add the field again\n </p>\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schema?.title\">\n <p class=\"help py-1 px-2\" *ngSwitchCase=\"'Bibliography'\">\n Search by Title or Document DOI to auto-populate the fields using the Mendeley catalogue\n </p>\n </ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: property}\"></ng-container>\n\n <div class=\"px-3 mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <div class=\"property-group py-2 px-3 mt-2\">\n <div class=\"columns is-multiline mb-0\">\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop2}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"py-2 px-3 mt-2\" *ngSwitchCase=\"true\">\n <div class=\"mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <div class=\"card p-0 my-4\" *ngIf=\"prop2.key\"\n [id]=\"prop2.fullKey + '_' + prop2.id\"\n >\n <div class=\"property-array-number\">\n <div class=\"tags has-addons\">\n <span class=\"tag is-dark\">{{prop2.key}}</span>\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <span class=\"tag is-info\" pointer\n (click)=\"duplicateArrayGroup(property, prop2)\"\n [ngbTooltip]=\"('Duplicate ' + property.key) | pluralize:1\" placement=\"top\"\n >\n <fa-icon icon=\"clone\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== '0'\"\n (click)=\"moveArrayGroupUp(property, prop2)\"\n ngbTooltip=\"Move Up\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-up\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== property.properties.length - 1\"\n (click)=\"moveArrayGroupDown(property, prop2)\"\n ngbTooltip=\"Move Down\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-down\" size=\"sm\"></fa-icon>\n </span>\n <he-popover-confirm class=\"tag is-delete\"\n [ngbTooltip]=\"('Remove ' + property.key) | pluralize:1\" placement=\"top\"\n message=\"This will remove the group completely. Do you confirm?\" position=\"right\"\n (confirmed)=\"removeArrayGroup(property, prop2)\"\n ></he-popover-confirm>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: prop2}\"></ng-container>\n\n <div class=\"px-4 mt-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: prop2}\"></ng-container>\n </div>\n\n <div class=\"px-4 mt-2\" *ngIf=\"prop2.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: prop2, edit: true}\"></ng-container>\n </div>\n\n <div class=\"property-group card-content p-3\">\n <div class=\"columns is-multiline my-0\">\n <ng-container *ngFor=\"let prop3 of prop2.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop3}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <button class=\"button is-info is-small\" type=\"button\"\n (click)=\"addArrayGroup(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n\n <he-node-recommendations buttonClass=\"is-small\"\n [node]=\"node\" [nodeField]=\"property.key\"\n (selectRecommendation)=\"onSelectRecommendation(property, $event)\"\n ></he-node-recommendations>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #inputForm let-property>\n <ng-container *ngIf=\"property.key\">\n <ng-container [ngSwitch]=\"property.suggestions?.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <ng-container *ngTemplateOutlet=\"inputSelect; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"inputInput; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #inputInput let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\"\n [class.has-icons-right]=\"property.loading\"\n >\n <input class=\"input is-small search-input\"\n [class.is-dark]=\"property.key === 'type'\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [type]=\"property.schema?.type === 'number' ? 'number' : 'string'\"\n [id]=\"property.id\"\n name=\"randomname\"\n [readonly]=\"!editable || !property.editable || property.schema?.internal\"\n [placeholder]=\"property.placeholder\"\n [appTagsInput]=\"{enabled: editable && property.editable && property.schema?.type === 'array', items: property.schema?.items, delimiter: ';', allowDuplicates: true, placeholder: property.placeholder}\"\n (change)=\"propertyChanged($event.target.value, property)\"\n\n [pattern]=\"property.schema?.pattern\"\n [required]=\"property.fullKey.endsWith('id') && property.fullKey !== 'id'\"\n [min]=\"property.schema?.minimum\"\n [max]=\"property.schema?.maximum\"\n\n [ngbTypeahead]=\"property | applyPure:propertySuggest\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"property.formatter\"\n [focusFirst]=\"true\"\n (focus)=\"editable && property.editable && typeaheadFocus($event)\"\n (selectItem)=\"suggestionSelected($event.item, property)\"\n >\n\n <span class=\"icon is-small is-right has-text-grey-dark\" [class.is-hidden]=\"!property.loading\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"sm\"></fa-icon>\n </span>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #inputSelect let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n >\n <select\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [id]=\"property.id\"\n name=\"randomname\"\n [disabled]=\"!editable || !property.editable || property.schema?.internal\"\n (change)=\"propertyChanged($event.target.value, property)\"\n >\n <option value=\"\">Select</option>\n <ng-container *bindOnce=\"property.suggestions\">\n <option *ngFor=\"let value of property.suggestions.values; trackBy: trackByIndex\" [value]=\"value\">{{value}}</option>\n </ng-container>\n </select>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #removeFieldAddon let-property>\n <div class=\"control\" *ngIf=\"!errorsEditable && !property.isRequired\">\n <a class=\"button is-small\" title=\"Remove field\"\n [class.is-outlined]=\"!property.changed && (property.hasError || property.hasWarning)\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n (click)=\"$event.stopPropagation(); propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n</ng-template>\n\n<ng-template #inputAddons let-property>\n <ng-container *bindOnce=\"property\">\n <he-popover-confirm class=\"control\"\n *ngIf=\"enableAddError(property)\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\"\n >\n <span class=\"button is-small\">\n <fa-icon icon=\"comments\"></fa-icon>\n </span>\n </he-popover-confirm>\n\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schemaType\">\n <ng-container *ngSwitchCase=\"SchemaType.Actor\">\n <ng-container *ngTemplateOutlet=\"actorAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"SchemaType.Cycle\">\n <ng-container *ngTemplateOutlet=\"cycleAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n\n <div class=\"control\" *ngIf=\"mapDrawingModes(property).length\">\n <button class=\"button is-small\" title=\"Pick on Map\"\n (click)=\"mapDrawingProperty = property\"\n >\n <fa-icon icon=\"map-marked-alt\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"bibliographiesSearchKey(property)\">\n <button class=\"button is-small\" title=\"Advanced Search\"\n (click)=\"bibliographiesSearchProperty = property\"\n >\n <fa-icon icon=\"search\"></fa-icon>\n </button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"removeFieldAddon; context: {$implicit: property}\"></ng-container>\n </ng-container>\n\n <div class=\"control\" *ngIf=\"addPropertyEnabled(property)\">\n <a class=\"button is-small is-danger\" title=\"Add field\"\n (click)=\"$event.stopPropagation(); addMissingProperty(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </a>\n </div>\n <div class=\"control\" *ngIf=\"isRequired(property)\">\n <label class=\"button is-small is-danger\" [for]=\"property.id\"\n ngbTooltip=\"This field is required\" placement=\"top\"\n >\n <fa-icon icon=\"exclamation-triangle\"></fa-icon>\n </label>\n </div>\n <ng-container *ngIf=\"property.externalUrl?.url\">\n <div class=\"control\">\n <a class=\"button is-small\"\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{'is-info': property.key === 'type'}\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\"\n >\n <fa-icon [icon]=\"property.externalUrl.icon || 'external-link-alt'\"></fa-icon>\n </a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"unitConverterEnabled(property)\">\n <div class=\"control\">\n <button class=\"button is-small\" title=\"Open calculator\"\n [ngbPopover]=\"convertUnits\" autoClose=\"outside\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"bottom\" container=\"body\"\n (click)=\"openUnitConverter(p, property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #actorAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === '@id'\">\n <button class=\"button is-small\" title=\"Add myself as Actor\"\n (click)=\"setUserActorId(property)\"\n >\n <fa-icon [icon]=\"['far', 'id-badge']\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #cycleAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === 'cycleDuration'\">\n <button class=\"button is-small\" title=\"Calculate value from startDate and endDate\"\n (click)=\"calculateCycleDuration(property)\"\n [disabled]=\"!calculateCycleDurationEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"property.key === 'startDate'\">\n <button class=\"button is-small\" title=\"Calculate value from endDate and cycleDuration\"\n (click)=\"calculateCycleStartDate(property)\"\n [disabled]=\"!calculateCycleStartDateEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #showNewProperty let-property>\n <header class=\"card-header\" *ngIf=\"editable && property.editable && (property.addPropertyEnabled || deepEditable); else padder\">\n <form class=\"py-3 px-4 is-flex-grow-1\" (submit)=\"addProperty(property)\" novalidate>\n <div class=\"field is-horizontal\">\n <div class=\"field-label is-small\" *bindOnce=\"property\">\n <label class=\"label\" [for]=\"property.id + '_new'\">\n <span>Add new field</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field has-addons\">\n <div class=\"control is-expanded\">\n <input class=\"input is-small\"\n [(ngModel)]=\"property.newProperty\"\n [id]=\"property.id + '_new'\"\n name=\"randomname\"\n placeholder=\"Search and select field from results\"\n\n [ngbTypeahead]=\"property | applyPure:suggestNewProperty\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatNewProperty\"\n [focusFirst]=\"false\"\n [editable]=\"false\"\n (focus)=\"typeaheadFocus($event)\"\n >\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" type=\"submit\"\n [disabled]=\"!property.newProperty || !property.newProperty.name\"\n >\n <fa-icon icon=\"plus\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </header>\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\">\n <p class=\"help\"\n [class.is-danger]=\"property.hasError\"\n [class.is-warning]=\"property.hasWarning\"\n *ngIf=\"property.error\"\n >\n <span class=\"is-pre-wrap\" *bindOnce=\"property.error\" [innerHTML]=\"property.error.message\"></span>\n <a class=\"pl-2\"\n *ngIf=\"edit && errorsEditable && property.error.index >= 0\"\n (click)=\"editError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"edit\"></fa-icon>\n <span>Edit</span>\n </a>\n <a class=\"pl-2\"\n *ngIf=\"(property.hasWarning || errorsEditable) && property.error.index >= 0\"\n (click)=\"resolveError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"check\"></fa-icon>\n <span>Resolved</span>\n </a>\n </p>\n</ng-template>\n\n<ng-template #propertyMap let-property>\n <div class=\"panel is-default\" *ngIf=\"showMap\">\n <div class=\"open-group panel-heading py-0\"\n (click)=\"mapVisible = !mapVisible\" pointer\n [class.is-open]=\"mapVisible\"\n >\n <div class=\"columns is-mobile is-vcentered mb-0\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!mapVisible\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"mapVisible\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">View on Map</span>\n </span>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" [class.is-hidden]=\"!mapVisible\">\n <he-sites-maps [sites]=\"[node]\" [showNotice]=\"false\"></he-sites-maps>\n </div>\n </div>\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n <ng-container *ngIf=\"property.newError && property.editable\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select is-small\">\n <select [(ngModel)]=\"property.newError.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control is-expanded\">\n <textarea class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"\n ></textarea>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #popupErrorForm let-data=\"data\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select\">\n <select [(ngModel)]=\"data.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control\">\n <input class=\"input\"\n [(ngModel)]=\"data.message\"\n placeholder=\"Enter your message here\"\n >\n </div>\n </div>\n</ng-template>\n\n<ng-template #suggestion let-r=\"result\" let-t=\"term\">\n <ngb-highlight\n [title]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [result]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [term]=\"t\"\n ></ngb-highlight>\n</ng-template>\n\n<ng-template #padder>\n <div class=\"pt-1\"></div>\n</ng-template>\n\n<ng-template #convertUnits let-value=\"value\" let-term=\"term\" let-units=\"units\">\n <he-unit-converter [value]=\"value\" [term]=\"term\" [toUnits]=\"units\"></he-unit-converter>\n</ng-template>\n", styles: [".panel.is-default .panel-heading{background-color:#ededed;color:#363636}.card-toggle{left:0;position:absolute;top:0}@media screen and (max-width: 768px){.card-toggle{position:relative}}.card-toggle>fa-icon{display:inline-block;width:10px}.card{overflow:visible}.card .card{box-shadow:2px 2px #36363652,0 0 0 1px #36363652}.card .card>.card-header{box-shadow:0 2px 1px #36363652}.property-array-number{left:-4px;position:absolute;top:-12px}.property-array-number .tag.is-delete{border:1px solid rgba(54,54,54,.32)}.control>.button{height:100%}.is-danger-light{color:#f5758f}he-sites-maps{height:200px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "component", type: i5.NgbHighlight, selector: "ngb-highlight", inputs: ["highlightClass", "result", "term", "accentSensitive"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i5.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i6.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i7.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i8.MapsDrawingConfirmComponent, selector: "he-maps-drawing-confirm", inputs: ["value", "modes", "center", "zoom"], outputs: ["closed"] }, { kind: "component", type: i9.PopoverConfirmComponent, selector: "he-popover-confirm", inputs: ["message", "content", "position", "popoverClass"], outputs: ["confirmed"] }, { kind: "component", type: i10.SchemaVersionLinkComponent, selector: "he-schema-version-link", inputs: ["node", "showExternalLink", "linkClass", "text"] }, { kind: "component", type: i11.UnitConverterComponent, selector: "he-unit-converter", inputs: ["term", "value", "fromUnits", "toUnits"] }, { kind: "directive", type: i12.TagsInputDirective, selector: "[appTagsInput]", inputs: ["appTagsInput"] }, { kind: "component", type: i13.NodeIconComponent, selector: "he-node-icon", inputs: ["type", "size"] }, { kind: "component", type: i14.NodeRecommendationsComponent, selector: "he-node-recommendations", inputs: ["node", "nodeField", "buttonClass"], outputs: ["selectRecommendation"] }, { kind: "component", type: i15.BibliographiesSearchConfirmComponent, selector: "he-bibliographies-search-confirm", inputs: ["search", "searchSources", "searchBibliographies", "searchBy"], outputs: ["closed"] }, { kind: "component", type: i16.SitesMapsComponent, selector: "he-sites-maps", inputs: ["loadPolygons", "sites", "nodes", "center", "zoom", "showNotice"] }, { kind: "pipe", type: i17.ApplyPurePipe, name: "applyPure" }, { kind: "pipe", type: i18.PluralizePipe, name: "pluralize" }] });
|
|
475
|
+
FilesFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.8", type: FilesFormComponent, selector: "he-files-form", inputs: { schemas: "schemas", errors: "errors", node: "node", nodeMap: "nodeMap", editable: "editable", errorMode: "errorMode", deepEditable: "deepEditable", errorsEditable: "errorsEditable", showSuggestedDefaultProperties: "showSuggestedDefaultProperties" }, outputs: { nodeChanged: "nodeChanged", nodeErorrResolved: "nodeErorrResolved", nodeErrorAdded: "nodeErrorAdded" }, ngImport: i0, template: "<div class=\"card\">\n <div class=\"card-toggle p-4\" (click)=\"isOpen = !isOpen\" pointer>\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"isOpen\"></fa-icon>\n <span *ngIf=\"nodeProperty\" class=\"is-px-2\"\n [class.has-text-danger]=\"nodeProperty.hasError\"\n [class.has-text-warning]=\"nodeProperty.hasWarning\"\n >\n <he-node-icon [type]=\"nodeProperty.schemaType\"></he-node-icon>\n </span>\n </div>\n\n <ng-container *ngIf=\"editable && isOpen && nodeProperty\">\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n\n <div class=\"card-content\">\n <ng-container *ngIf=\"isOpen\">\n <div class=\"pb-3 mb-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: nodeProperty}\"></ng-container>\n </div>\n\n <div class=\"py-4 pl-4\" *ngIf=\"nodeProperty?.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: nodeProperty, edit: true}\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"columns is-multiline\">\n <ng-container *ngFor=\"let property of properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"propertyMap; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<he-maps-drawing-confirm *ngIf=\"!!mapDrawingProperty\"\n [value]=\"mapDrawingProperty.value\" [modes]=\"mapDrawingModes(mapDrawingProperty)\"\n (closed)=\"onMapDrawingClosed($event)\"\n></he-maps-drawing-confirm>\n\n<he-bibliographies-search-confirm *ngIf=\"!!bibliographiesSearchProperty\"\n [search]=\"bibliographiesSearchProperty.value\"\n [searchBy]=\"bibliographiesSearchKey(bibliographiesSearchProperty)\"\n [searchSources]=\"bibliographiesSearchSources\"\n (closed)=\"onBibliographiesSearchClosed($event)\"\n></he-bibliographies-search-confirm>\n\n<ng-template #labelDescription let-property>\n <ng-template #description>\n <span class=\"is-pre-line\">{{property.schema?.description}}</span>\n </ng-template>\n\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"description\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow is-narrow-width\"\n triggers=\"hover\" placement=\"right\" container=\"body\"\n >\n <span>{{property.key}}</span>\n </span>\n</ng-template>\n\n<ng-template #labelDefault let-property>\n <span>{{property.key}}</span>\n</ng-template>\n\n<ng-template #showProperty let-property>\n <ng-container *ngIf=\"(isOpen || property.closedVisible) && !property.isHidden\">\n <div class=\"column is-6\"\n [id]=\"property.fullKey + '_' + property.id\"\n [class.is-12]=\"property.properties.length || !property.key\"\n [ngSwitch]=\"!!property.properties.length\"\n >\n <div class=\"columns is-multiline is-variable is-1\" *ngSwitchCase=\"false\">\n <ng-container *bindOnce=\"property\">\n <div class=\"column is-3 py-1\" *ngIf=\"property.key\">\n <label class=\"label has-text-right-tablet has-text-ellipsis\" [for]=\"property.id\">\n <ng-container\n *ngTemplateOutlet=\"property.schema?.description && editable && property.editable ? labelDescription : labelDefault; context: {$implicit: property}\">\n </ng-container>\n </label>\n </div>\n </ng-container>\n\n <div class=\"column is-9 py-1\" [class.is-12]=\"!property.key\">\n <div class=\"field\">\n <ng-container *ngTemplateOutlet=\"inputForm; context: {$implicit: property}\"></ng-container>\n\n <ng-container *ngIf=\"(editable || errorsEditable) && (property.hasError || property.hasWarning)\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: false}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"panel\" *ngSwitchCase=\"true\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n [class.is-default]=\"!property.changed && !property.hasError && !property.hasWarning\"\n >\n <div class=\"open-group panel-heading py-0\"\n (click)=\"property.isOpen = !property.isOpen\" pointer\n [class.is-open]=\"property.isOpen\"\n [class.has-text-white]=\"(errorMode && property.changed) || property.hasError || property.hasWarning\"\n >\n <div class=\"columns is-mobile is-vcentered\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!property.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"property.isOpen\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">{{property.key}}</span>\n </span>\n <span *ngIf=\"property.schemaType\" class=\"column is-narrow py-1 my-0\">\n <span class=\"tags mb-0 has-addons\">\n <span class=\"tag mb-0 is-light\">Type</span>\n <span class=\"tag mb-0 is-white\">\n <he-schema-version-link linkClass=\"is-small\" [node]=\"{'@type': property.schemaType}\">\n <span>{{property.schemaType}}</span>\n </he-schema-version-link>\n </span>\n </span>\n </span>\n <he-popover-confirm class=\"column is-narrow py-1 my-0 px-0\"\n *ngIf=\"editable && !errorsEditable\"\n ngbTooltip=\"Remove group\" placement=\"top\"\n [message]=\"'<p>This will remove the group completely.</p>' + (property.isRequired ? '<p><u>Warning: this field is required.</u></p>' : '') + '<p>Do you confirm?</p>'\"\n popoverClass=\"px-3\"\n (confirmed)=\"propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\" size=\"sm\"></fa-icon>\n </he-popover-confirm>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" *ngIf=\"property.isOpen\">\n <ng-container [ngSwitch]=\"property.isArray\">\n <div class=\"px-3 pt-4\" *ngIf=\"property.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: true}\"></ng-container>\n </div>\n\n <div class=\"mt-3\" *ngSwitchCase=\"false\">\n <p class=\"help py-1 px-2\" *ngIf=\"editable && !property.editable\">\n To change the {{property.key}}, please delete it first, then add the field again\n </p>\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schema?.title\">\n <p class=\"help py-1 px-2\" *ngSwitchCase=\"'Bibliography'\">\n Search by Title or Document DOI to auto-populate the fields using the Mendeley catalogue\n </p>\n </ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: property}\"></ng-container>\n\n <div class=\"px-3 mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <div class=\"property-group py-2 px-3 mt-2\">\n <div class=\"columns is-multiline mb-0\">\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop2}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"py-2 px-3 mt-2\" *ngSwitchCase=\"true\">\n <div class=\"mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <div class=\"card p-0 my-4\" *ngIf=\"prop2.key\"\n [id]=\"prop2.fullKey + '_' + prop2.id\"\n >\n <div class=\"property-array-number\">\n <div class=\"tags has-addons\">\n <span class=\"tag is-dark\">{{prop2.key}}</span>\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <span class=\"tag is-info\" pointer\n (click)=\"duplicateArrayGroup(property, prop2)\"\n [ngbTooltip]=\"('Duplicate ' + property.key) | pluralize:1\" placement=\"top\"\n >\n <fa-icon icon=\"clone\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== '0'\"\n (click)=\"moveArrayGroupUp(property, prop2)\"\n ngbTooltip=\"Move Up\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-up\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== property.properties.length - 1\"\n (click)=\"moveArrayGroupDown(property, prop2)\"\n ngbTooltip=\"Move Down\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-down\" size=\"sm\"></fa-icon>\n </span>\n <he-popover-confirm class=\"tag is-delete\"\n [ngbTooltip]=\"('Remove ' + property.key) | pluralize:1\" placement=\"top\"\n message=\"This will remove the group completely. Do you confirm?\" position=\"right\"\n (confirmed)=\"removeArrayGroup(property, prop2)\"\n ></he-popover-confirm>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: prop2}\"></ng-container>\n\n <div class=\"px-4 mt-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: prop2}\"></ng-container>\n </div>\n\n <div class=\"px-4 mt-2\" *ngIf=\"prop2.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: prop2, edit: true}\"></ng-container>\n </div>\n\n <div class=\"property-group card-content p-3\">\n <div class=\"columns is-multiline my-0\">\n <ng-container *ngFor=\"let prop3 of prop2.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop3}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <button class=\"button is-info is-small\" type=\"button\"\n (click)=\"addArrayGroup(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n\n <he-node-recommendations buttonClass=\"is-small\"\n [node]=\"node\" [nodeField]=\"property.key\"\n (selectRecommendation)=\"onSelectRecommendation(property, $event)\"\n ></he-node-recommendations>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #inputForm let-property>\n <ng-container *ngIf=\"property.key\">\n <ng-container [ngSwitch]=\"property.suggestions?.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <ng-container *ngTemplateOutlet=\"inputSelect; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"inputInput; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #inputInput let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\"\n [class.has-icons-right]=\"property.loading\"\n >\n <input class=\"input is-small search-input\"\n [class.is-dark]=\"property.key === 'type'\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [type]=\"property.schema?.type === 'number' ? 'number' : 'string'\"\n [id]=\"property.id\"\n name=\"randomname\"\n [readonly]=\"!editable || !property.editable || property.schema?.internal\"\n [placeholder]=\"property.placeholder\"\n [appTagsInput]=\"{enabled: editable && property.editable && property.schema?.type === 'array', items: property.schema?.items, delimiter: ';', allowDuplicates: true, placeholder: property.placeholder}\"\n (change)=\"propertyChanged($event.target.value, property)\"\n\n [pattern]=\"property.schema?.pattern\"\n [required]=\"property.fullKey.endsWith('id') && property.fullKey !== 'id'\"\n [min]=\"property.schema?.minimum\"\n [max]=\"property.schema?.maximum\"\n\n [ngbTypeahead]=\"property | applyPure:propertySuggest\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"property.formatter\"\n [focusFirst]=\"true\"\n (focus)=\"editable && property.editable && typeaheadFocus($event)\"\n (selectItem)=\"suggestionSelected($event.item, property)\"\n >\n\n <span class=\"icon is-small is-right has-text-grey-dark\" [class.is-hidden]=\"!property.loading\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"sm\"></fa-icon>\n </span>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #inputSelect let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n >\n <select\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [id]=\"property.id\"\n name=\"randomname\"\n [disabled]=\"!editable || !property.editable || property.schema?.internal\"\n (change)=\"propertyChanged($event.target.value, property)\"\n >\n <option value=\"\">Select</option>\n <ng-container *bindOnce=\"property.suggestions\">\n <option *ngFor=\"let value of property.suggestions.values; trackBy: trackByIndex\" [value]=\"value\">{{value}}</option>\n </ng-container>\n </select>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #removeFieldAddon let-property>\n <div class=\"control\" *ngIf=\"!errorsEditable && !property.isRequired\">\n <a class=\"button is-small\" title=\"Remove field\"\n [class.is-outlined]=\"!property.changed && (property.hasError || property.hasWarning)\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n (click)=\"$event.stopPropagation(); propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n</ng-template>\n\n<ng-template #inputAddons let-property>\n <ng-container *bindOnce=\"property\">\n <he-popover-confirm class=\"control\"\n *ngIf=\"enableAddError(property)\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\"\n >\n <span class=\"button is-small\">\n <fa-icon icon=\"comments\"></fa-icon>\n </span>\n </he-popover-confirm>\n\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schemaType\">\n <ng-container *ngSwitchCase=\"SchemaType.Actor\">\n <ng-container *ngTemplateOutlet=\"actorAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"SchemaType.Cycle\">\n <ng-container *ngTemplateOutlet=\"cycleAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n\n <div class=\"control\" *ngIf=\"mapDrawingModes(property).length\">\n <button class=\"button is-small\" title=\"Pick on Map\"\n (click)=\"mapDrawingProperty = property\"\n >\n <fa-icon icon=\"map-marked-alt\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"bibliographiesSearchKey(property)\">\n <button class=\"button is-small\" title=\"Advanced Search\"\n (click)=\"bibliographiesSearchProperty = property\"\n >\n <fa-icon icon=\"search\"></fa-icon>\n </button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"removeFieldAddon; context: {$implicit: property}\"></ng-container>\n </ng-container>\n\n <div class=\"control\" *ngIf=\"addPropertyEnabled(property)\">\n <a class=\"button is-small is-danger\" title=\"Add field\"\n (click)=\"$event.stopPropagation(); addMissingProperty(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </a>\n </div>\n <div class=\"control\" *ngIf=\"isRequired(property)\">\n <label class=\"button is-small is-danger\" [for]=\"property.id\"\n ngbTooltip=\"This field is required\" placement=\"top\"\n >\n <fa-icon icon=\"exclamation-triangle\"></fa-icon>\n </label>\n </div>\n <ng-container *ngIf=\"property.externalUrl?.url\">\n <div class=\"control\">\n <a class=\"button is-small\"\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{'is-info': property.key === 'type'}\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\"\n >\n <fa-icon [icon]=\"property.externalUrl.icon || 'external-link-alt'\"></fa-icon>\n </a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"unitConverterEnabled(property)\">\n <div class=\"control\">\n <button class=\"button is-small\" title=\"Open calculator\"\n [ngbPopover]=\"convertUnits\" autoClose=\"outside\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"bottom\" container=\"body\"\n (click)=\"openUnitConverter(p, property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #actorAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === '@id'\">\n <button class=\"button is-small\" title=\"Add myself as Actor\"\n (click)=\"setUserActorId(property)\"\n >\n <fa-icon [icon]=\"['far', 'id-badge']\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #cycleAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === 'cycleDuration'\">\n <button class=\"button is-small\" title=\"Calculate value from startDate and endDate\"\n (click)=\"calculateCycleDuration(property)\"\n [disabled]=\"!calculateCycleDurationEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"property.key === 'startDate'\">\n <button class=\"button is-small\" title=\"Calculate value from endDate and cycleDuration\"\n (click)=\"calculateCycleStartDate(property)\"\n [disabled]=\"!calculateCycleStartDateEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #showNewProperty let-property>\n <header class=\"card-header\" *ngIf=\"editable && property.editable && (property.addPropertyEnabled || deepEditable); else padder\">\n <form class=\"py-3 px-4 is-flex-grow-1\" (submit)=\"addProperty(property)\" novalidate>\n <div class=\"field is-horizontal\">\n <div class=\"field-label is-small\" *bindOnce=\"property\">\n <label class=\"label\" [for]=\"property.id + '_new'\">\n <span>Add new field</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field has-addons\">\n <div class=\"control is-expanded\">\n <input class=\"input is-small\"\n [(ngModel)]=\"property.newProperty\"\n [id]=\"property.id + '_new'\"\n name=\"randomname\"\n placeholder=\"Search and select field from results\"\n\n [ngbTypeahead]=\"property | applyPure:suggestNewProperty\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatNewProperty\"\n [focusFirst]=\"false\"\n [editable]=\"false\"\n (focus)=\"typeaheadFocus($event)\"\n >\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" type=\"submit\"\n [disabled]=\"!property.newProperty || !property.newProperty.name\"\n >\n <fa-icon icon=\"plus\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </header>\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\">\n <p class=\"help\"\n [class.is-danger]=\"property.hasError\"\n [class.is-warning]=\"property.hasWarning\"\n *ngIf=\"property.error\"\n >\n <span class=\"is-pre-wrap\" *bindOnce=\"property.error\" [innerHTML]=\"property.error.message\"></span>\n <a class=\"pl-2\"\n *ngIf=\"edit && errorsEditable && property.error.index >= 0\"\n (click)=\"editError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"edit\"></fa-icon>\n <span>Edit</span>\n </a>\n <a class=\"pl-2\"\n *ngIf=\"(property.hasWarning || errorsEditable) && property.error.index >= 0\"\n (click)=\"resolveError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"check\"></fa-icon>\n <span>Resolved</span>\n </a>\n </p>\n</ng-template>\n\n<ng-template #propertyMap let-property>\n <div class=\"panel is-default\" *ngIf=\"showMap\">\n <div class=\"open-group panel-heading py-0\"\n (click)=\"mapVisible = !mapVisible\" pointer\n [class.is-open]=\"mapVisible\"\n >\n <div class=\"columns is-mobile is-vcentered mb-0\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!mapVisible\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"mapVisible\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">View on Map</span>\n </span>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" [class.is-hidden]=\"!mapVisible\">\n <he-sites-maps [sites]=\"[node]\" [showNotice]=\"false\"></he-sites-maps>\n </div>\n </div>\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n <ng-container *ngIf=\"property.newError && property.editable\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select is-small\">\n <select [(ngModel)]=\"property.newError.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control is-expanded\">\n <textarea class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"\n ></textarea>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #popupErrorForm let-data=\"data\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select\">\n <select [(ngModel)]=\"data.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control\">\n <input class=\"input\"\n [(ngModel)]=\"data.message\"\n placeholder=\"Enter your message here\"\n >\n </div>\n </div>\n</ng-template>\n\n<ng-template #suggestion let-r=\"result\" let-t=\"term\">\n <ngb-highlight\n [title]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [result]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [term]=\"t\"\n ></ngb-highlight>\n</ng-template>\n\n<ng-template #padder>\n <div class=\"pt-1\"></div>\n</ng-template>\n\n<ng-template #convertUnits let-value=\"value\" let-term=\"term\" let-units=\"units\">\n <he-unit-converter [value]=\"value\" [term]=\"term\" [toUnits]=\"units\"></he-unit-converter>\n</ng-template>\n", styles: [".panel.is-default .panel-heading{background-color:#ededed;color:#363636}.card-toggle{left:0;position:absolute;top:0}@media screen and (max-width: 768px){.card-toggle{position:relative}}.card-toggle>fa-icon{display:inline-block;width:10px}.card{overflow:visible}.card .card{box-shadow:2px 2px #36363652,0 0 0 1px #36363652}.card .card>.card-header{box-shadow:0 2px 1px #36363652}.property-array-number{left:-4px;position:absolute;top:-12px}.property-array-number .tag.is-delete{border:1px solid rgba(54,54,54,.32)}.control>.button{height:100%}.is-danger-light{color:#f5758f}he-sites-maps{height:200px}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.NgbTypeahead, selector: "input[ngbTypeahead]", inputs: ["autocomplete", "container", "editable", "focusFirst", "inputFormatter", "ngbTypeahead", "resultFormatter", "resultTemplate", "showHint", "placement", "popperOptions", "popupClass"], outputs: ["selectItem"], exportAs: ["ngbTypeahead"] }, { kind: "component", type: i5.NgbHighlight, selector: "ngb-highlight", inputs: ["highlightClass", "result", "term", "accentSensitive"] }, { kind: "directive", type: i5.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i5.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i6.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "directive", type: i7.BindOnceDirective, selector: "[bindOnce]", inputs: ["bindOnce"] }, { kind: "component", type: i8.MapsDrawingConfirmComponent, selector: "he-maps-drawing-confirm", inputs: ["value", "modes", "center", "zoom"], outputs: ["closed"] }, { kind: "component", type: i9.PopoverConfirmComponent, selector: "he-popover-confirm", inputs: ["message", "content", "position", "popoverClass"], outputs: ["confirmed"] }, { kind: "component", type: i10.SchemaVersionLinkComponent, selector: "he-schema-version-link", inputs: ["node", "showExternalLink", "linkClass", "text"] }, { kind: "component", type: i11.UnitConverterComponent, selector: "he-unit-converter", inputs: ["term", "value", "fromUnits", "toUnits"] }, { kind: "directive", type: i12.TagsInputDirective, selector: "[appTagsInput]", inputs: ["appTagsInput"] }, { kind: "component", type: i13.NodeIconComponent, selector: "he-node-icon", inputs: ["type", "size"] }, { kind: "component", type: i14.NodeRecommendationsComponent, selector: "he-node-recommendations", inputs: ["node", "nodeField", "buttonClass"], outputs: ["selectRecommendation"] }, { kind: "component", type: i15.BibliographiesSearchConfirmComponent, selector: "he-bibliographies-search-confirm", inputs: ["search", "searchSources", "searchBibliographies", "searchBy"], outputs: ["closed"] }, { kind: "component", type: i16.SitesMapsComponent, selector: "he-sites-maps", inputs: ["loadPolygons", "sites", "nodes", "center", "zoom", "showNotice"] }, { kind: "pipe", type: i17.ApplyPurePipe, name: "applyPure" }, { kind: "pipe", type: i18.PluralizePipe, name: "pluralize" }] });
|
|
476
476
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImport: i0, type: FilesFormComponent, decorators: [{
|
|
477
477
|
type: Component,
|
|
478
|
-
args: [{ selector: 'he-files-form', template: "<div class=\"card\">\n <div class=\"card-toggle p-4\" (click)=\"isOpen = !isOpen\" pointer>\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"isOpen\"></fa-icon>\n <span *ngIf=\"nodeProperty\" class=\"is-px-2\"\n [class.has-text-danger]=\"nodeProperty.hasError\"\n [class.has-text-warning]=\"nodeProperty.hasWarning\"\n >\n <he-node-icon [type]=\"nodeProperty.schemaType\"></he-node-icon>\n </span>\n </div>\n\n <ng-container *ngIf=\"editable && isOpen && nodeProperty\">\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n\n <div class=\"card-content\">\n <ng-container *ngIf=\"isOpen\">\n <div class=\"pb-3 mb-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: nodeProperty}\"></ng-container>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"nodeProperty?.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: nodeProperty, edit: true}\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"columns is-multiline\">\n <ng-container *ngFor=\"let property of properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"propertyMap; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<he-maps-drawing-confirm *ngIf=\"!!mapDrawingProperty\"\n [value]=\"mapDrawingProperty.value\" [modes]=\"mapDrawingModes(mapDrawingProperty)\"\n (closed)=\"onMapDrawingClosed($event)\"\n></he-maps-drawing-confirm>\n\n<he-bibliographies-search-confirm *ngIf=\"!!bibliographiesSearchProperty\"\n [search]=\"bibliographiesSearchProperty.value\"\n [searchBy]=\"bibliographiesSearchKey(bibliographiesSearchProperty)\"\n [searchSources]=\"bibliographiesSearchSources\"\n (closed)=\"onBibliographiesSearchClosed($event)\"\n></he-bibliographies-search-confirm>\n\n<ng-template #labelDescription let-property>\n <ng-template #description>\n <span class=\"is-pre-line\">{{property.schema?.description}}</span>\n </ng-template>\n\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"description\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow is-narrow-width\"\n triggers=\"hover\" placement=\"right\" container=\"body\"\n >\n <span>{{property.key}}</span>\n </span>\n</ng-template>\n\n<ng-template #labelDefault let-property>\n <span>{{property.key}}</span>\n</ng-template>\n\n<ng-template #showProperty let-property>\n <ng-container *ngIf=\"(isOpen || property.closedVisible) && !property.isHidden\">\n <div class=\"column is-6\"\n [id]=\"property.fullKey + '_' + property.id\"\n [class.is-12]=\"property.properties.length || !property.key\"\n [ngSwitch]=\"!!property.properties.length\"\n >\n <div class=\"columns is-multiline is-variable is-1\" *ngSwitchCase=\"false\">\n <ng-container *bindOnce=\"property\">\n <div class=\"column is-3 py-1\" *ngIf=\"property.key\">\n <label class=\"label has-text-right-tablet has-text-ellipsis\" [for]=\"property.id\">\n <ng-container\n *ngTemplateOutlet=\"property.schema?.description && editable && property.editable ? labelDescription : labelDefault; context: {$implicit: property}\">\n </ng-container>\n </label>\n </div>\n </ng-container>\n\n <div class=\"column is-9 py-1\" [class.is-12]=\"!property.key\">\n <div class=\"field\">\n <ng-container *ngTemplateOutlet=\"inputForm; context: {$implicit: property}\"></ng-container>\n\n <ng-container *ngIf=\"(editable || errorsEditable) && (property.hasError || property.hasWarning)\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: false}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"panel\" *ngSwitchCase=\"true\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n [class.is-default]=\"!property.changed && !property.hasError && !property.hasWarning\"\n >\n <div class=\"open-group panel-heading py-0\"\n (click)=\"property.isOpen = !property.isOpen\" pointer\n [class.is-open]=\"property.isOpen\"\n [class.has-text-white]=\"(errorMode && property.changed) || property.hasError || property.hasWarning\"\n >\n <div class=\"columns is-mobile is-vcentered\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!property.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"property.isOpen\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">{{property.key}}</span>\n </span>\n <span *ngIf=\"property.schemaType\" class=\"column is-narrow py-1 my-0\">\n <span class=\"tags mb-0 has-addons\">\n <span class=\"tag mb-0 is-light\">Type</span>\n <span class=\"tag mb-0 is-white\">\n <he-schema-version-link linkClass=\"is-small\" [node]=\"{'@type': property.schemaType}\">\n <span>{{property.schemaType}}</span>\n </he-schema-version-link>\n </span>\n </span>\n </span>\n <he-popover-confirm class=\"column is-narrow py-1 my-0 px-0\"\n *ngIf=\"editable && !errorsEditable\"\n ngbTooltip=\"Remove group\" placement=\"top\"\n [message]=\"'<p>This will remove the group completely.</p>' + (property.isRequired ? '<p><u>Warning: this field is required.</u></p>' : '') + '<p>Do you confirm?</p>'\"\n popoverClass=\"px-3\"\n (confirmed)=\"propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\" size=\"sm\"></fa-icon>\n </he-popover-confirm>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" *ngIf=\"property.isOpen\">\n <ng-container [ngSwitch]=\"property.isArray\">\n <div class=\"px-3 pt-4\" *ngIf=\"property.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: true}\"></ng-container>\n </div>\n\n <div class=\"mt-3\" *ngSwitchCase=\"false\">\n <p class=\"help py-1 px-2\" *ngIf=\"editable && !property.editable\">\n To change the {{property.key}}, please delete it first, then add the field again\n </p>\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schema?.title\">\n <p class=\"help py-1 px-2\" *ngSwitchCase=\"'Bibliography'\">\n Search by Title or Document DOI to auto-populate the fields using the Mendeley catalogue\n </p>\n </ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: property}\"></ng-container>\n\n <div class=\"px-3 mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <div class=\"property-group py-2 px-3 mt-2\">\n <div class=\"columns is-multiline mb-0\">\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop2}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"py-2 px-3 mt-2\" *ngSwitchCase=\"true\">\n <div class=\"mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <div class=\"card p-0 my-4\" *ngIf=\"prop2.key\"\n [id]=\"prop2.fullKey + '_' + prop2.id\"\n >\n <div class=\"property-array-number\">\n <div class=\"tags has-addons\">\n <span class=\"tag is-dark\">{{prop2.key}}</span>\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <span class=\"tag is-info\" pointer\n (click)=\"duplicateArrayGroup(property, prop2)\"\n [ngbTooltip]=\"('Duplicate ' + property.key) | pluralize:1\" placement=\"top\"\n >\n <fa-icon icon=\"clone\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== '0'\"\n (click)=\"moveArrayGroupUp(property, prop2)\"\n ngbTooltip=\"Move Up\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-up\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== property.properties.length - 1\"\n (click)=\"moveArrayGroupDown(property, prop2)\"\n ngbTooltip=\"Move Down\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-down\" size=\"sm\"></fa-icon>\n </span>\n <he-popover-confirm class=\"tag is-delete\"\n [ngbTooltip]=\"('Remove ' + property.key) | pluralize:1\" placement=\"top\"\n message=\"This will remove the group completely. Do you confirm?\" position=\"right\"\n (confirmed)=\"removeArrayGroup(property, prop2)\"\n ></he-popover-confirm>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: prop2}\"></ng-container>\n\n <div class=\"px-4 mt-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: prop2}\"></ng-container>\n </div>\n\n <div class=\"px-4 mt-2\" *ngIf=\"prop2.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: prop2, edit: true}\"></ng-container>\n </div>\n\n <div class=\"property-group card-content p-3\">\n <div class=\"columns is-multiline my-0\">\n <ng-container *ngFor=\"let prop3 of prop2.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop3}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <button class=\"button is-info is-small\" type=\"button\"\n (click)=\"addArrayGroup(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n\n <he-node-recommendations buttonClass=\"is-small\"\n [node]=\"node\" [nodeField]=\"property.key\"\n (selectRecommendation)=\"onSelectRecommendation(property, $event)\"\n ></he-node-recommendations>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #inputForm let-property>\n <ng-container *ngIf=\"property.key\">\n <ng-container [ngSwitch]=\"property.suggestions?.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <ng-container *ngTemplateOutlet=\"inputSelect; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"inputInput; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #inputInput let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\"\n [class.has-icons-right]=\"property.loading\"\n >\n <input class=\"input is-small search-input\"\n [class.is-dark]=\"property.key === 'type'\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [type]=\"property.schema?.type === 'number' ? 'number' : 'string'\"\n [id]=\"property.id\"\n name=\"randomname\"\n [readonly]=\"!editable || !property.editable || property.schema?.internal\"\n [placeholder]=\"property.placeholder\"\n [appTagsInput]=\"{enabled: editable && property.editable && property.schema?.type === 'array', items: property.schema?.items, delimiter: ';', allowDuplicates: true, placeholder: property.placeholder}\"\n (change)=\"propertyChanged($event.target.value, property)\"\n\n [pattern]=\"property.schema?.pattern\"\n [required]=\"property.fullKey.endsWith('id') && property.fullKey !== 'id'\"\n [min]=\"property.schema?.minimum\"\n [max]=\"property.schema?.maximum\"\n\n [ngbTypeahead]=\"property | applyPure:propertySuggest\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"property.formatter\"\n [focusFirst]=\"true\"\n (focus)=\"editable && property.editable && typeaheadFocus($event)\"\n (selectItem)=\"suggestionSelected($event.item, property)\"\n >\n\n <span class=\"icon is-small is-right has-text-grey-dark\" [class.is-hidden]=\"!property.loading\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"sm\"></fa-icon>\n </span>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #inputSelect let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n >\n <select\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [id]=\"property.id\"\n name=\"randomname\"\n [disabled]=\"!editable || !property.editable || property.schema?.internal\"\n (change)=\"propertyChanged($event.target.value, property)\"\n >\n <option value=\"\">Select</option>\n <ng-container *bindOnce=\"property.suggestions\">\n <option *ngFor=\"let value of property.suggestions.values; trackBy: trackByIndex\" [value]=\"value\">{{value}}</option>\n </ng-container>\n </select>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #removeFieldAddon let-property>\n <div class=\"control\" *ngIf=\"!errorsEditable && !property.isRequired\">\n <a class=\"button is-small\" title=\"Remove field\"\n [class.is-outlined]=\"!property.changed && (property.hasError || property.hasWarning)\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n (click)=\"$event.stopPropagation(); propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n</ng-template>\n\n<ng-template #inputAddons let-property>\n <ng-container *bindOnce=\"property\">\n <he-popover-confirm class=\"control\"\n *ngIf=\"enableAddError(property)\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\"\n >\n <span class=\"button is-small\">\n <fa-icon icon=\"comments\"></fa-icon>\n </span>\n </he-popover-confirm>\n\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schemaType\">\n <ng-container *ngSwitchCase=\"SchemaType.Actor\">\n <ng-container *ngTemplateOutlet=\"actorAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"SchemaType.Cycle\">\n <ng-container *ngTemplateOutlet=\"cycleAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n\n <div class=\"control\" *ngIf=\"mapDrawingModes(property).length\">\n <button class=\"button is-small\" title=\"Pick on Map\"\n (click)=\"mapDrawingProperty = property\"\n >\n <fa-icon icon=\"map-marked-alt\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"bibliographiesSearchKey(property)\">\n <button class=\"button is-small\" title=\"Advanced Search\"\n (click)=\"bibliographiesSearchProperty = property\"\n >\n <fa-icon icon=\"search\"></fa-icon>\n </button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"removeFieldAddon; context: {$implicit: property}\"></ng-container>\n </ng-container>\n\n <div class=\"control\" *ngIf=\"addPropertyEnabled(property)\">\n <a class=\"button is-small is-danger\" title=\"Add field\"\n (click)=\"$event.stopPropagation(); addMissingProperty(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </a>\n </div>\n <div class=\"control\" *ngIf=\"isRequired(property)\">\n <label class=\"button is-small is-danger\" [for]=\"property.id\"\n ngbTooltip=\"This field is required\" placement=\"top\"\n >\n <fa-icon icon=\"exclamation-triangle\"></fa-icon>\n </label>\n </div>\n <ng-container *ngIf=\"property.externalUrl?.url\">\n <div class=\"control\">\n <a class=\"button is-small\"\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{'is-info': property.key === 'type'}\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\"\n >\n <fa-icon [icon]=\"property.externalUrl.icon || 'external-link-alt'\"></fa-icon>\n </a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"unitConverterEnabled(property)\">\n <div class=\"control\">\n <button class=\"button is-small\" title=\"Open calculator\"\n [ngbPopover]=\"convertUnits\" autoClose=\"outside\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"bottom\" container=\"body\"\n (click)=\"openUnitConverter(p, property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #actorAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === '@id'\">\n <button class=\"button is-small\" title=\"Add myself as Actor\"\n (click)=\"setUserActorId(property)\"\n >\n <fa-icon [icon]=\"['far', 'id-badge']\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #cycleAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === 'cycleDuration'\">\n <button class=\"button is-small\" title=\"Calculate value from startDate and endDate\"\n (click)=\"calculateCycleDuration(property)\"\n [disabled]=\"!calculateCycleDurationEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"property.key === 'startDate'\">\n <button class=\"button is-small\" title=\"Calculate value from endDate and cycleDuration\"\n (click)=\"calculateCycleStartDate(property)\"\n [disabled]=\"!calculateCycleStartDateEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #showNewProperty let-property>\n <header class=\"card-header\" *ngIf=\"editable && property.editable && (property.addPropertyEnabled || deepEditable); else padder\">\n <form class=\"py-3 px-4 is-flex-grow-1\" (submit)=\"addProperty(property)\" novalidate>\n <div class=\"field is-horizontal\">\n <div class=\"field-label is-small\" *bindOnce=\"property\">\n <label class=\"label\" [for]=\"property.id + '_new'\">\n <span>Add new field</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field has-addons\">\n <div class=\"control is-expanded\">\n <input class=\"input is-small\"\n [(ngModel)]=\"property.newProperty\"\n [id]=\"property.id + '_new'\"\n name=\"randomname\"\n placeholder=\"Search and select field from results\"\n\n [ngbTypeahead]=\"property | applyPure:suggestNewProperty\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatNewProperty\"\n [focusFirst]=\"false\"\n [editable]=\"false\"\n (focus)=\"typeaheadFocus($event)\"\n >\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" type=\"submit\"\n [disabled]=\"!property.newProperty || !property.newProperty.name\"\n >\n <fa-icon icon=\"plus\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </header>\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\">\n <p class=\"help\"\n [class.is-danger]=\"property.hasError\"\n [class.is-warning]=\"property.hasWarning\"\n *ngIf=\"property.error\"\n >\n <span class=\"is-pre-wrap\" *bindOnce=\"property.error\" [innerHTML]=\"property.error.message\"></span>\n <a class=\"pl-2\"\n *ngIf=\"edit && errorsEditable && property.error.index >= 0\"\n (click)=\"editError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"edit\"></fa-icon>\n <span>Edit</span>\n </a>\n <a class=\"pl-2\"\n *ngIf=\"(property.hasWarning || errorsEditable) && property.error.index >= 0\"\n (click)=\"resolveError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"check\"></fa-icon>\n <span>Resolved</span>\n </a>\n </p>\n</ng-template>\n\n<ng-template #propertyMap let-property>\n <div class=\"panel is-default\" *ngIf=\"showMap\">\n <div class=\"open-group panel-heading py-0\"\n (click)=\"mapVisible = !mapVisible\" pointer\n [class.is-open]=\"mapVisible\"\n >\n <div class=\"columns is-mobile is-vcentered mb-0\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!mapVisible\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"mapVisible\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">View on Map</span>\n </span>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" [class.is-hidden]=\"!mapVisible\">\n <he-sites-maps [sites]=\"[node]\" [showNotice]=\"false\"></he-sites-maps>\n </div>\n </div>\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n <ng-container *ngIf=\"property.newError && property.editable\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select is-small\">\n <select [(ngModel)]=\"property.newError.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control is-expanded\">\n <textarea class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"\n ></textarea>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #popupErrorForm let-data=\"data\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select\">\n <select [(ngModel)]=\"data.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control\">\n <input class=\"input\"\n [(ngModel)]=\"data.message\"\n placeholder=\"Enter your message here\"\n >\n </div>\n </div>\n</ng-template>\n\n<ng-template #suggestion let-r=\"result\" let-t=\"term\">\n <ngb-highlight\n [title]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [result]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [term]=\"t\"\n ></ngb-highlight>\n</ng-template>\n\n<ng-template #padder>\n <div class=\"pt-1\"></div>\n</ng-template>\n\n<ng-template #convertUnits let-value=\"value\" let-term=\"term\" let-units=\"units\">\n <he-unit-converter [value]=\"value\" [term]=\"term\" [toUnits]=\"units\"></he-unit-converter>\n</ng-template>\n", styles: [".panel.is-default .panel-heading{background-color:#ededed;color:#363636}.card-toggle{left:0;position:absolute;top:0}@media screen and (max-width: 768px){.card-toggle{position:relative}}.card-toggle>fa-icon{display:inline-block;width:10px}.card{overflow:visible}.card .card{box-shadow:2px 2px #36363652,0 0 0 1px #36363652}.card .card>.card-header{box-shadow:0 2px 1px #36363652}.property-array-number{left:-4px;position:absolute;top:-12px}.property-array-number .tag.is-delete{border:1px solid rgba(54,54,54,.32)}.control>.button{height:100%}.is-danger-light{color:#f5758f}he-sites-maps{height:200px}\n"] }]
|
|
478
|
+
args: [{ selector: 'he-files-form', template: "<div class=\"card\">\n <div class=\"card-toggle p-4\" (click)=\"isOpen = !isOpen\" pointer>\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"isOpen\"></fa-icon>\n <span *ngIf=\"nodeProperty\" class=\"is-px-2\"\n [class.has-text-danger]=\"nodeProperty.hasError\"\n [class.has-text-warning]=\"nodeProperty.hasWarning\"\n >\n <he-node-icon [type]=\"nodeProperty.schemaType\"></he-node-icon>\n </span>\n </div>\n\n <ng-container *ngIf=\"editable && isOpen && nodeProperty\">\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n\n <div class=\"card-content\">\n <ng-container *ngIf=\"isOpen\">\n <div class=\"pb-3 mb-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: nodeProperty}\"></ng-container>\n </div>\n\n <div class=\"py-4 pl-4\" *ngIf=\"nodeProperty?.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: nodeProperty, edit: true}\"></ng-container>\n </div>\n </ng-container>\n\n <div class=\"columns is-multiline\">\n <ng-container *ngFor=\"let property of properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"propertyMap; context: {$implicit: nodeProperty}\"></ng-container>\n </ng-container>\n </div>\n\n <ng-content></ng-content>\n</div>\n\n<he-maps-drawing-confirm *ngIf=\"!!mapDrawingProperty\"\n [value]=\"mapDrawingProperty.value\" [modes]=\"mapDrawingModes(mapDrawingProperty)\"\n (closed)=\"onMapDrawingClosed($event)\"\n></he-maps-drawing-confirm>\n\n<he-bibliographies-search-confirm *ngIf=\"!!bibliographiesSearchProperty\"\n [search]=\"bibliographiesSearchProperty.value\"\n [searchBy]=\"bibliographiesSearchKey(bibliographiesSearchProperty)\"\n [searchSources]=\"bibliographiesSearchSources\"\n (closed)=\"onBibliographiesSearchClosed($event)\"\n></he-bibliographies-search-confirm>\n\n<ng-template #labelDescription let-property>\n <ng-template #description>\n <span class=\"is-pre-line\">{{property.schema?.description}}</span>\n </ng-template>\n\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"description\" [autoClose]=\"'outside'\" popoverClass=\"is-narrow is-narrow-width\"\n triggers=\"hover\" placement=\"right\" container=\"body\"\n >\n <span>{{property.key}}</span>\n </span>\n</ng-template>\n\n<ng-template #labelDefault let-property>\n <span>{{property.key}}</span>\n</ng-template>\n\n<ng-template #showProperty let-property>\n <ng-container *ngIf=\"(isOpen || property.closedVisible) && !property.isHidden\">\n <div class=\"column is-6\"\n [id]=\"property.fullKey + '_' + property.id\"\n [class.is-12]=\"property.properties.length || !property.key\"\n [ngSwitch]=\"!!property.properties.length\"\n >\n <div class=\"columns is-multiline is-variable is-1\" *ngSwitchCase=\"false\">\n <ng-container *bindOnce=\"property\">\n <div class=\"column is-3 py-1\" *ngIf=\"property.key\">\n <label class=\"label has-text-right-tablet has-text-ellipsis\" [for]=\"property.id\">\n <ng-container\n *ngTemplateOutlet=\"property.schema?.description && editable && property.editable ? labelDescription : labelDefault; context: {$implicit: property}\">\n </ng-container>\n </label>\n </div>\n </ng-container>\n\n <div class=\"column is-9 py-1\" [class.is-12]=\"!property.key\">\n <div class=\"field\">\n <ng-container *ngTemplateOutlet=\"inputForm; context: {$implicit: property}\"></ng-container>\n\n <ng-container *ngIf=\"(editable || errorsEditable) && (property.hasError || property.hasWarning)\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: false}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"panel\" *ngSwitchCase=\"true\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n [class.is-default]=\"!property.changed && !property.hasError && !property.hasWarning\"\n >\n <div class=\"open-group panel-heading py-0\"\n (click)=\"property.isOpen = !property.isOpen\" pointer\n [class.is-open]=\"property.isOpen\"\n [class.has-text-white]=\"(errorMode && property.changed) || property.hasError || property.hasWarning\"\n >\n <div class=\"columns is-mobile is-vcentered\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!property.isOpen\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"property.isOpen\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">{{property.key}}</span>\n </span>\n <span *ngIf=\"property.schemaType\" class=\"column is-narrow py-1 my-0\">\n <span class=\"tags mb-0 has-addons\">\n <span class=\"tag mb-0 is-light\">Type</span>\n <span class=\"tag mb-0 is-white\">\n <he-schema-version-link linkClass=\"is-small\" [node]=\"{'@type': property.schemaType}\">\n <span>{{property.schemaType}}</span>\n </he-schema-version-link>\n </span>\n </span>\n </span>\n <he-popover-confirm class=\"column is-narrow py-1 my-0 px-0\"\n *ngIf=\"editable && !errorsEditable\"\n ngbTooltip=\"Remove group\" placement=\"top\"\n [message]=\"'<p>This will remove the group completely.</p>' + (property.isRequired ? '<p><u>Warning: this field is required.</u></p>' : '') + '<p>Do you confirm?</p>'\"\n popoverClass=\"px-3\"\n (confirmed)=\"propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\" size=\"sm\"></fa-icon>\n </he-popover-confirm>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" *ngIf=\"property.isOpen\">\n <ng-container [ngSwitch]=\"property.isArray\">\n <div class=\"px-3 pt-4\" *ngIf=\"property.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: property, edit: true}\"></ng-container>\n </div>\n\n <div class=\"mt-3\" *ngSwitchCase=\"false\">\n <p class=\"help py-1 px-2\" *ngIf=\"editable && !property.editable\">\n To change the {{property.key}}, please delete it first, then add the field again\n </p>\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schema?.title\">\n <p class=\"help py-1 px-2\" *ngSwitchCase=\"'Bibliography'\">\n Search by Title or Document DOI to auto-populate the fields using the Mendeley catalogue\n </p>\n </ng-container>\n </ng-container>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: property}\"></ng-container>\n\n <div class=\"px-3 mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <div class=\"property-group py-2 px-3 mt-2\">\n <div class=\"columns is-multiline mb-0\">\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop2}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"py-2 px-3 mt-2\" *ngSwitchCase=\"true\">\n <div class=\"mt-1\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: property}\"></ng-container>\n </div>\n\n <ng-container *ngFor=\"let prop2 of property.properties; trackBy: trackByProperty\">\n <div class=\"card p-0 my-4\" *ngIf=\"prop2.key\"\n [id]=\"prop2.fullKey + '_' + prop2.id\"\n >\n <div class=\"property-array-number\">\n <div class=\"tags has-addons\">\n <span class=\"tag is-dark\">{{prop2.key}}</span>\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <span class=\"tag is-info\" pointer\n (click)=\"duplicateArrayGroup(property, prop2)\"\n [ngbTooltip]=\"('Duplicate ' + property.key) | pluralize:1\" placement=\"top\"\n >\n <fa-icon icon=\"clone\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== '0'\"\n (click)=\"moveArrayGroupUp(property, prop2)\"\n ngbTooltip=\"Move Up\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-up\" size=\"sm\"></fa-icon>\n </span>\n <span class=\"tag is-light\" pointer\n *ngIf=\"prop2.key !== property.properties.length - 1\"\n (click)=\"moveArrayGroupDown(property, prop2)\"\n ngbTooltip=\"Move Down\" placement=\"top\"\n >\n <fa-icon icon=\"long-arrow-alt-down\" size=\"sm\"></fa-icon>\n </span>\n <he-popover-confirm class=\"tag is-delete\"\n [ngbTooltip]=\"('Remove ' + property.key) | pluralize:1\" placement=\"top\"\n message=\"This will remove the group completely. Do you confirm?\" position=\"right\"\n (confirmed)=\"removeArrayGroup(property, prop2)\"\n ></he-popover-confirm>\n </ng-container>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"showNewProperty; context: {$implicit: prop2}\"></ng-container>\n\n <div class=\"px-4 mt-2\" *ngIf=\"errorsEditable\">\n <ng-container *ngTemplateOutlet=\"nodeErrorForm; context: {$implicit: prop2}\"></ng-container>\n </div>\n\n <div class=\"px-4 mt-2\" *ngIf=\"prop2.error\">\n <ng-container *ngTemplateOutlet=\"propertyError; context: {property: prop2, edit: true}\"></ng-container>\n </div>\n\n <div class=\"property-group card-content p-3\">\n <div class=\"columns is-multiline my-0\">\n <ng-container *ngFor=\"let prop3 of prop2.properties; trackBy: trackByProperty\">\n <ng-container *ngTemplateOutlet=\"showProperty; context: {$implicit: prop3}\"></ng-container>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"editable && !errorsEditable && property.editable\">\n <button class=\"button is-info is-small\" type=\"button\"\n (click)=\"addArrayGroup(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n <span class=\"pl-1\">{{property.key | pluralize:1}}</span>\n </button>\n\n <he-node-recommendations buttonClass=\"is-small\"\n [node]=\"node\" [nodeField]=\"property.key\"\n (selectRecommendation)=\"onSelectRecommendation(property, $event)\"\n ></he-node-recommendations>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #inputForm let-property>\n <ng-container *ngIf=\"property.key\">\n <ng-container [ngSwitch]=\"property.suggestions?.type\">\n <ng-container *ngSwitchCase=\"'select'\">\n <ng-container *ngTemplateOutlet=\"inputSelect; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <ng-container *ngTemplateOutlet=\"inputInput; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #inputInput let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\"\n [class.has-icons-right]=\"property.loading\"\n >\n <input class=\"input is-small search-input\"\n [class.is-dark]=\"property.key === 'type'\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [type]=\"property.schema?.type === 'number' ? 'number' : 'string'\"\n [id]=\"property.id\"\n name=\"randomname\"\n [readonly]=\"!editable || !property.editable || property.schema?.internal\"\n [placeholder]=\"property.placeholder\"\n [appTagsInput]=\"{enabled: editable && property.editable && property.schema?.type === 'array', items: property.schema?.items, delimiter: ';', allowDuplicates: true, placeholder: property.placeholder}\"\n (change)=\"propertyChanged($event.target.value, property)\"\n\n [pattern]=\"property.schema?.pattern\"\n [required]=\"property.fullKey.endsWith('id') && property.fullKey !== 'id'\"\n [min]=\"property.schema?.minimum\"\n [max]=\"property.schema?.maximum\"\n\n [ngbTypeahead]=\"property | applyPure:propertySuggest\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"property.formatter\"\n [focusFirst]=\"true\"\n (focus)=\"editable && property.editable && typeaheadFocus($event)\"\n (selectItem)=\"suggestionSelected($event.item, property)\"\n >\n\n <span class=\"icon is-small is-right has-text-grey-dark\" [class.is-hidden]=\"!property.loading\">\n <fa-icon icon=\"spinner\" [pulse]=\"true\" size=\"sm\"></fa-icon>\n </span>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #inputSelect let-property>\n <div class=\"field mb-0\" [class.has-addons]=\"hasAddons(property)\">\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth\"\n [class.is-secondary]=\"errorMode && property.changed\"\n [class.is-danger]=\"(!property.changed && property.hasError) || isRequired(property)\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n >\n <select\n [(ngModel)]=\"property.value\" #propertyModel=\"ngModel\"\n [id]=\"property.id\"\n name=\"randomname\"\n [disabled]=\"!editable || !property.editable || property.schema?.internal\"\n (change)=\"propertyChanged($event.target.value, property)\"\n >\n <option value=\"\">Select</option>\n <ng-container *bindOnce=\"property.suggestions\">\n <option *ngFor=\"let value of property.suggestions.values; trackBy: trackByIndex\" [value]=\"value\">{{value}}</option>\n </ng-container>\n </select>\n </div>\n </div>\n <ng-container *ngTemplateOutlet=\"inputAddons; context: {$implicit: property}\"></ng-container>\n </div>\n <p class=\"help is-danger-light\"\n *ngIf=\"!property.hasError && propertyModel.invalid\"\n >\n <span *bindOnce=\"propertyModel.errors\" [innerHTML]=\"formatPropertyError(propertyModel.errors, property)\"></span>\n </p>\n</ng-template>\n\n<ng-template #removeFieldAddon let-property>\n <div class=\"control\" *ngIf=\"!errorsEditable && !property.isRequired\">\n <a class=\"button is-small\" title=\"Remove field\"\n [class.is-outlined]=\"!property.changed && (property.hasError || property.hasWarning)\"\n [class.is-danger]=\"!property.changed && property.hasError\"\n [class.is-warning]=\"!property.changed && property.hasWarning\"\n (click)=\"$event.stopPropagation(); propertyChanged(null, property)\"\n >\n <fa-icon icon=\"times\"></fa-icon>\n </a>\n </div>\n</ng-template>\n\n<ng-template #inputAddons let-property>\n <ng-container *bindOnce=\"property\">\n <he-popover-confirm class=\"control\"\n *ngIf=\"enableAddError(property)\"\n position=\"left\"\n [content]=\"popupErrorForm\"\n (confirmed)=\"addError(property, $event)\"\n >\n <span class=\"button is-small\">\n <fa-icon icon=\"comments\"></fa-icon>\n </span>\n </he-popover-confirm>\n\n <ng-container *ngIf=\"editable && property.editable\">\n <ng-container [ngSwitch]=\"property.schemaType\">\n <ng-container *ngSwitchCase=\"SchemaType.Actor\">\n <ng-container *ngTemplateOutlet=\"actorAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"SchemaType.Cycle\">\n <ng-container *ngTemplateOutlet=\"cycleAddons; context: {$implicit: property}\"></ng-container>\n </ng-container>\n </ng-container>\n\n <div class=\"control\" *ngIf=\"mapDrawingModes(property).length\">\n <button class=\"button is-small\" title=\"Pick on Map\"\n (click)=\"mapDrawingProperty = property\"\n >\n <fa-icon icon=\"map-marked-alt\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"bibliographiesSearchKey(property)\">\n <button class=\"button is-small\" title=\"Advanced Search\"\n (click)=\"bibliographiesSearchProperty = property\"\n >\n <fa-icon icon=\"search\"></fa-icon>\n </button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"removeFieldAddon; context: {$implicit: property}\"></ng-container>\n </ng-container>\n\n <div class=\"control\" *ngIf=\"addPropertyEnabled(property)\">\n <a class=\"button is-small is-danger\" title=\"Add field\"\n (click)=\"$event.stopPropagation(); addMissingProperty(property)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </a>\n </div>\n <div class=\"control\" *ngIf=\"isRequired(property)\">\n <label class=\"button is-small is-danger\" [for]=\"property.id\"\n ngbTooltip=\"This field is required\" placement=\"top\"\n >\n <fa-icon icon=\"exclamation-triangle\"></fa-icon>\n </label>\n </div>\n <ng-container *ngIf=\"property.externalUrl?.url\">\n <div class=\"control\">\n <a class=\"button is-small\"\n [href]=\"property.externalUrl.url + (property.externalUrl.urlParamValue ? property.value : '')\"\n target=\"_blank\"\n [title]=\"property.externalUrl.title\"\n [ngClass]=\"{'is-info': property.key === 'type'}\"\n [attr.disabled]=\"property.externalUrl.urlParamValue && !property.value ? true : null\"\n >\n <fa-icon [icon]=\"property.externalUrl.icon || 'external-link-alt'\"></fa-icon>\n </a>\n </div>\n </ng-container>\n <ng-container *ngIf=\"unitConverterEnabled(property)\">\n <div class=\"control\">\n <button class=\"button is-small\" title=\"Open calculator\"\n [ngbPopover]=\"convertUnits\" autoClose=\"outside\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"bottom\" container=\"body\"\n (click)=\"openUnitConverter(p, property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #actorAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === '@id'\">\n <button class=\"button is-small\" title=\"Add myself as Actor\"\n (click)=\"setUserActorId(property)\"\n >\n <fa-icon [icon]=\"['far', 'id-badge']\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #cycleAddons let-property>\n <div class=\"control\" *ngIf=\"property.key === 'cycleDuration'\">\n <button class=\"button is-small\" title=\"Calculate value from startDate and endDate\"\n (click)=\"calculateCycleDuration(property)\"\n [disabled]=\"!calculateCycleDurationEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"property.key === 'startDate'\">\n <button class=\"button is-small\" title=\"Calculate value from endDate and cycleDuration\"\n (click)=\"calculateCycleStartDate(property)\"\n [disabled]=\"!calculateCycleStartDateEnabled(property)\"\n >\n <fa-icon icon=\"calculator\"></fa-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #showNewProperty let-property>\n <header class=\"card-header\" *ngIf=\"editable && property.editable && (property.addPropertyEnabled || deepEditable); else padder\">\n <form class=\"py-3 px-4 is-flex-grow-1\" (submit)=\"addProperty(property)\" novalidate>\n <div class=\"field is-horizontal\">\n <div class=\"field-label is-small\" *bindOnce=\"property\">\n <label class=\"label\" [for]=\"property.id + '_new'\">\n <span>Add new field</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field has-addons\">\n <div class=\"control is-expanded\">\n <input class=\"input is-small\"\n [(ngModel)]=\"property.newProperty\"\n [id]=\"property.id + '_new'\"\n name=\"randomname\"\n placeholder=\"Search and select field from results\"\n\n [ngbTypeahead]=\"property | applyPure:suggestNewProperty\"\n [resultTemplate]=\"suggestion\"\n [inputFormatter]=\"formatNewProperty\"\n [focusFirst]=\"false\"\n [editable]=\"false\"\n (focus)=\"typeaheadFocus($event)\"\n >\n </div>\n <div class=\"control\">\n <button class=\"button is-small\" type=\"submit\"\n [disabled]=\"!property.newProperty || !property.newProperty.name\"\n >\n <fa-icon icon=\"plus\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </form>\n </header>\n</ng-template>\n\n<ng-template #propertyError let-property=\"property\" let-edit=\"edit\">\n <p class=\"help\"\n [class.is-danger]=\"property.hasError\"\n [class.is-warning]=\"property.hasWarning\"\n *ngIf=\"property.error\"\n >\n <span class=\"is-pre-wrap\" *bindOnce=\"property.error\" [innerHTML]=\"property.error.message\"></span>\n <a class=\"pl-2\"\n *ngIf=\"edit && errorsEditable && property.error.index >= 0\"\n (click)=\"editError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"edit\"></fa-icon>\n <span>Edit</span>\n </a>\n <a class=\"pl-2\"\n *ngIf=\"(property.hasWarning || errorsEditable) && property.error.index >= 0\"\n (click)=\"resolveError(property)\"\n >\n <fa-icon class=\"pr-2\" icon=\"check\"></fa-icon>\n <span>Resolved</span>\n </a>\n </p>\n</ng-template>\n\n<ng-template #propertyMap let-property>\n <div class=\"panel is-default\" *ngIf=\"showMap\">\n <div class=\"open-group panel-heading py-0\"\n (click)=\"mapVisible = !mapVisible\" pointer\n [class.is-open]=\"mapVisible\"\n >\n <div class=\"columns is-mobile is-vcentered mb-0\">\n <span class=\"column is-narrow py-1 my-0\">\n <fa-icon icon=\"angle-down\" [class.is-hidden]=\"!mapVisible\"></fa-icon>\n <fa-icon icon=\"angle-right\" [class.is-hidden]=\"mapVisible\"></fa-icon>\n </span>\n <span class=\"column py-1 my-0\">\n <span class=\"is-size-6\">View on Map</span>\n </span>\n </div>\n </div>\n <div class=\"panel-block is-block p-0\" [class.is-hidden]=\"!mapVisible\">\n <he-sites-maps [sites]=\"[node]\" [showNotice]=\"false\"></he-sites-maps>\n </div>\n </div>\n</ng-template>\n\n<ng-template #nodeErrorForm let-property>\n <ng-container *ngIf=\"property.newError && property.editable\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select is-small\">\n <select [(ngModel)]=\"property.newError.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control is-expanded\">\n <textarea class=\"textarea is-small\"\n [(ngModel)]=\"property.newError.message\"\n placeholder=\"Enter your message here\"\n rows=\"1\"\n ></textarea>\n </div>\n <div class=\"control\">\n <button class=\"button is-small\"\n [disabled]=\"!property.newError.level || !property.newError.message\"\n (click)=\"addError(property, property.newError)\"\n >\n <fa-icon icon=\"plus-circle\"></fa-icon>\n <span class=\"pl-2\">Add</span>\n </button>\n </div>\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #popupErrorForm let-data=\"data\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <div class=\"select\">\n <select [(ngModel)]=\"data.level\">\n <option [value]=\"undefined\">Select Level</option>\n <option value=\"error\">Error</option>\n <option value=\"warning\">Warning</option>\n </select>\n </div>\n </div>\n <div class=\"control\">\n <input class=\"input\"\n [(ngModel)]=\"data.message\"\n placeholder=\"Enter your message here\"\n >\n </div>\n </div>\n</ng-template>\n\n<ng-template #suggestion let-r=\"result\" let-t=\"term\">\n <ngb-highlight\n [title]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [result]=\"r.bibliography?.title || r.bibliography?.documentDOI || r.bibliography?.scopus || r.name\"\n [term]=\"t\"\n ></ngb-highlight>\n</ng-template>\n\n<ng-template #padder>\n <div class=\"pt-1\"></div>\n</ng-template>\n\n<ng-template #convertUnits let-value=\"value\" let-term=\"term\" let-units=\"units\">\n <he-unit-converter [value]=\"value\" [term]=\"term\" [toUnits]=\"units\"></he-unit-converter>\n</ng-template>\n", styles: [".panel.is-default .panel-heading{background-color:#ededed;color:#363636}.card-toggle{left:0;position:absolute;top:0}@media screen and (max-width: 768px){.card-toggle{position:relative}}.card-toggle>fa-icon{display:inline-block;width:10px}.card{overflow:visible}.card .card{box-shadow:2px 2px #36363652,0 0 0 1px #36363652}.card .card>.card-header{box-shadow:0 2px 1px #36363652}.property-array-number{left:-4px;position:absolute;top:-12px}.property-array-number .tag.is-delete{border:1px solid rgba(54,54,54,.32)}.control>.button{height:100%}.is-danger-light{color:#f5758f}he-sites-maps{height:200px}\n"] }]
|
|
479
479
|
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.HeSearchService }, { type: i2.HeUsersService }]; }, propDecorators: { schemas: [{
|
|
480
480
|
type: Input
|
|
481
481
|
}], errors: [{
|
|
@@ -501,4 +501,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.8", ngImpor
|
|
|
501
501
|
}], nodeErrorAdded: [{
|
|
502
502
|
type: Output
|
|
503
503
|
}] } });
|
|
504
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZm9ybS9maWxlcy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFDN0IsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDO0FBQzdCLE9BQU8sRUFBc0IsVUFBVSxFQUFFLFFBQVEsRUFBa0MsTUFBTSxzQkFBc0IsQ0FBQztBQUVoSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsT0FBTyxFQUVMLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUN4QyxxQkFBcUIsRUFDckMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUNsRCxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQzdELFlBQVksRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQ2pILDZCQUE2QixFQUFFLHNCQUFzQixFQUNyRCw4QkFBOEIsRUFBRSx1QkFBdUIs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cEMsS0FBSztnQkFJRSxXQUFXO3NCQURsQixNQUFNO2dCQUdDLGlCQUFpQjtzQkFEeEIsTUFBTTtnQkFHQyxjQUFjO3NCQURyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgbWVyZ2VNYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xuaW1wb3J0IHNldCBmcm9tICdsb2Rhc2guc2V0JztcbmltcG9ydCB7IEpTT04gYXMgSGVzdGlhSnNvbiwgU2NoZW1hVHlwZSwgTm9kZVR5cGUsIEJpYmxpb2dyYXBoeSwgU291cmNlLCBQcm9wZXJ0eSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IGRlZmluaXRpb25zLCBkZWZpbml0aW9uIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9qc29uLXNjaGVtYSc7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5cbmltcG9ydCB7XG4gIElFcnJvclByb3BlcnR5LCBJTm9kZVByb3BlcnR5LFxuICBmb3JtYXRQcm9wZXJ0eUVycm9yLCBwcm9wZXJ0eUVycm9yLCBoYXNFcnJvciwgaGFzV2FybmluZyxcbiAgc3VnZ2VzdGlvblR5cGUsIGRlZmF1bHRTdWdnZXN0aW9uVHlwZSxcbiAgcmVjdXJzaXZlUHJvcGVydGllcywgdHlwZVRvTmV3UHJvcGVydHksIHByb3BlcnR5SWQsXG4gIGlzQWRkUHJvcGVydHlFbmFibGVkLCBub2RlQXZhaWxhYmxlUHJvcGVydGllcywgc29ydFByb3BlcnRpZXMsXG4gIGdyb3VwQ2hhbmdlZCwgcGFyZW50UHJvcGVydHksIHNpYmxpbmdQcm9wZXJ0eSwgdXBkYXRlUHJvcGVydGllcywgcmVmcmVzaFByb3BlcnR5S2V5cywga2V5VG9EYXRhUGF0aCwgZmluZFByb3BlcnR5LFxuICBjYWxjdWxhdGVDeWNsZUR1cmF0aW9uRW5hYmxlZCwgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbixcbiAgY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkLCBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZSwgcGFyc2VOZXdWYWx1ZSwgZm9ybWF0dGVyLCBJTmV3UHJvcGVydHlcbn0gZnJvbSAnLi4vZmlsZXMtZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBJVmFsaWRhdGlvbkVycm9yLCBlcnJvckhhc0Vycm9yLCBlcnJvckhhc1dhcm5pbmcsIGZpbHRlckVycm9yLCBmb3JtYXRFcnJvciB9IGZyb20gJy4uL2ZpbGVzLWVycm9yLm1vZGVsJztcbmltcG9ydCB7IEhlVXNlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXNlcnMvdXNlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBIZVNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWF0Y2hUeXBlLCBtYXRjaFBocmFzZVF1ZXJ5LCBtYXRjaFBocmFzZVByZWZpeFF1ZXJ5LCBtYXRjaEJvb2xQcmVmaXhRdWVyeSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2gubW9kZWwnO1xuaW1wb3J0IHsgc2FmZUpTT05QYXJzZSwgY29weU9iamVjdCB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5cbmNvbnN0IE1JTl9UWVBFQUhFQURfTEVOR1RIID0gMjtcbmNvbnN0IHBvcHVsYXRlVGVybUZpZWxkcyA9IFtcbiAgJ3Rlcm1UeXBlJywgJ3VuaXRzJ1xuXTtcbmNvbnN0IHBvcHVsYXRlVGVybURlZmF1bHRQcm9wZXJ0aWVzID0gW1xuICAnZGVmYXVsdFByb3BlcnRpZXMudGVybS5uYW1lJywgJ2RlZmF1bHRQcm9wZXJ0aWVzLnRlcm0udW5pdHMnLCAnZGVmYXVsdFByb3BlcnRpZXMudmFsdWUnXG5dO1xuXG5jb25zdCBmb3JtYXRQcm9wZXJ0eSA9IChwcm9wOiBQcm9wZXJ0eSkgPT4gKHtcbiAgJ0B0eXBlJzogU2NoZW1hVHlwZS5Qcm9wZXJ0eSxcbiAgLi4ucHJvcCxcbiAgdGVybToge1xuICAgICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sXG4gICAgLi4ucHJvcC50ZXJtXG4gIH1cbn0pO1xuXG5jb25zdCBmb3JtYXRTdWdnZXN0aW9uID0gKHsgZGVmYXVsdFByb3BlcnRpZXMsIC4uLm5vZGUgfTogYW55KSA9PiAoe1xuICAuLi5ub2RlLFxuICAuLi4oZGVmYXVsdFByb3BlcnRpZXM/Lmxlbmd0aCA/IHsgZGVmYXVsdFByb3BlcnRpZXM6IGRlZmF1bHRQcm9wZXJ0aWVzLm1hcChmb3JtYXRQcm9wZXJ0eSkgfSA6IHt9KVxufSk7XG5cbmNvbnN0IGZvcm1hdExpbmtOb2Rlc1ByZWZpeCA9ICdMaW5rIHdpdGgnO1xuXG4vLyBwYXRjaCBlcnJvciB3aGVuIGxpbmsgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5XG5jb25zdCBjbGVhbk5ld1ZhbHVlID0gdmFsdWUgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5pZFxuICAgID8geyAuLi52YWx1ZSwgaWQ6IGNsZWFuTmV3VmFsdWUodmFsdWUuaWQpIH1cbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICA/IHZhbHVlLnN0YXJ0c1dpdGgoZm9ybWF0TGlua05vZGVzUHJlZml4KVxuICAgID8gdmFsdWUuc3BsaXQoJzonKVsxXS50cmltKClcbiAgICA6IHZhbHVlXG4gICAgOiB2YWx1ZTtcblxuY29uc3QgZm9ybWF0TGlua05vZGVzU3VnZ2VzdGlvbnMgPSAobm9kZU1hcDogeyBbdHlwZSBpbiBOb2RlVHlwZV0/OiBzdHJpbmdbXSB9LCB0eXBlOiBOb2RlVHlwZSkgPT5cbiAgKG5vZGVNYXBbdHlwZV0gfHwgW10pLm1hcChpZCA9PiAoeyB0eXBlLCBpZCwgbmFtZTogYCR7Zm9ybWF0TGlua05vZGVzUHJlZml4fSAke3R5cGV9OiAke2lkfWAgfSkpO1xuXG50eXBlIHN1Z2dlc3RGdW5jID0gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+IE9ic2VydmFibGU8YW55W10+O1xuXG5jb25zdCBpbnNlcnRQcm9wZXJ0eSA9IChwcm9wZXJ0aWVzOiBJTm9kZVByb3BlcnR5W10sIGtleTogc3RyaW5nLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4ge1xuICBjb25zdCBleGlzdGluZ1Byb3BlcnR5SW5kZXggPSBwcm9wZXJ0aWVzLmZpbmRJbmRleCh2ID0+IHYuZnVsbEtleSA9PT0ga2V5KTtcbiAgZXhpc3RpbmdQcm9wZXJ0eUluZGV4ID49IDAgPyAocHJvcGVydGllc1tleGlzdGluZ1Byb3BlcnR5SW5kZXhdID0gcHJvcGVydHkpIDogcHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgcHJvcGVydGllcy5zb3J0KHNvcnRQcm9wZXJ0aWVzKTtcbiAgcmV0dXJuIHByb3BlcnRpZXM7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1maWxlcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlcy1mb3JtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRmlsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBzY2hlbWFzPzogZGVmaW5pdGlvbnM7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgZXJyb3JzOiBJVmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgQElucHV0KClcbiAgcHVibGljIG5vZGU/OiBIZXN0aWFKc29uPFNjaGVtYVR5cGU+O1xuICBASW5wdXQoKVxuICBwdWJsaWMgbm9kZU1hcDogeyBbdHlwZSBpbiBOb2RlVHlwZV0/OiBzdHJpbmdbXSB9ID0ge307XG4gIC8qKlxuICAgKiBBbGxvdyBlZGl0aW5nIG5vZGVzIChgZmFsc2VgIGZvciByZWFkb25seSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZWRpdGFibGUgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yTW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGVlcEVkaXRhYmxlID0gdHJ1ZTtcbiAgLyoqXG4gICAqIENhbiBlZGl0IGVycm9ycy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlcnJvcnNFZGl0YWJsZSA9IGZhbHNlO1xuICAvKipcbiAgICogV2hlbiBzZWxlY3RpbmcgdGVybXMsIHdpbGwgc2hvdyBkZWZhdWx0IHByb3BlcnRpZXMgb3Igbm90LlxuICAgKiBTaG91bGQgYmUgYGZhbHNlYCB3aGVuIHVzaW5nIHNjaGVtYSB2YWxpZGF0aW9uLCBhcyBvbmx5IHRoZSBgbmFtZWAgd291bGQgYmUgYWRkZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1N1Z2dlc3RlZERlZmF1bHRQcm9wZXJ0aWVzID0gdHJ1ZTtcblxuICBAT3V0cHV0KClcbiAgcHJpdmF0ZSBub2RlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgdmFsdWU6IGFueSB9PigpO1xuICBAT3V0cHV0KClcbiAgcHJpdmF0ZSBub2RlRXJvcnJSZXNvbHZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KClcbiAgcHJpdmF0ZSBub2RlRXJyb3JBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVZhbGlkYXRpb25FcnJvcj4oKTtcblxuICBwdWJsaWMgTm9kZVR5cGUgPSBOb2RlVHlwZTtcbiAgcHVibGljIFNjaGVtYVR5cGUgPSBTY2hlbWFUeXBlO1xuICBwdWJsaWMgaXNPcGVuID0gdHJ1ZTtcbiAgcHVibGljIG1hcFZpc2libGUgPSBmYWxzZTtcbiAgcHVibGljIGZvcm1hdFByb3BlcnR5RXJyb3IgPSBmb3JtYXRQcm9wZXJ0eUVycm9yO1xuICBwdWJsaWMgbWFwRHJhd2luZ1Byb3BlcnR5PzogSU5vZGVQcm9wZXJ0eTtcbiAgcHVibGljIGJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHk/OiBJTm9kZVByb3BlcnR5O1xuICBwdWJsaWMgbm9kZVByb3BlcnR5PzogSU5vZGVQcm9wZXJ0eTtcbiAgcHVibGljIHByb3BlcnRpZXM6IElOb2RlUHJvcGVydHlbXSA9IFtdO1xuXG4gIHB1YmxpYyBzdWdnZXN0TmV3UHJvcGVydHkgPSAoeyBmdWxsS2V5IH06IElOb2RlUHJvcGVydHkpID0+ICh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KSA9PlxuICAgIHRleHQkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKFxuICAgICAgICB0ZXJtID0+IG9mKHRoaXMubmV3UHJvcGVydGllcyhmaW5kUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBmdWxsS2V5KSB8fCB0aGlzLm5vZGVQcm9wZXJ0eSwgdGVybSkpXG4gICAgICApXG4gICAgKTtcbiAgcHVibGljIGZvcm1hdE5ld1Byb3BlcnR5ID0gKHsgbmFtZSB9OiBJTmV3UHJvcGVydHkpID0+IG5hbWU7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0RXhpc3RpbmdOb2RlID0gKHR5cGU6IE5vZGVUeXBlLCB0ZXJtOiBzdHJpbmcsIHVuaXF1ZUtleSA9ICdAaWQnKSA9PlxuICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgb2YoW10pIDpcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdWdnZXN0KHRlcm0sIHR5cGUsIFtdLCB7XG4gICAgICAgIGJvb2w6IHtcbiAgICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKHR5cGUpXSxcbiAgICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICAgIG1hdGNoUGhyYXNlUXVlcnkodGVybSwgMTAwLCB1bmlxdWVLZXkpLFxuICAgICAgICAgICAgbWF0Y2hQaHJhc2VQcmVmaXhRdWVyeSh0ZXJtLCAyMCwgdW5pcXVlS2V5KSxcbiAgICAgICAgICAgIG1hdGNoQm9vbFByZWZpeFF1ZXJ5KHRlcm0sIDEwLCB1bmlxdWVLZXkpXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaDogMVxuICAgICAgICB9XG4gICAgICB9LCAxMCwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcyk7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0Tm9kZSA9ICh0eXBlOiBOb2RlVHlwZSwgc3VnZ2VzdERlZmF1bHQ/OiBzdWdnZXN0RnVuYykgPT4gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+XG4gICAgKHByb3BlcnR5LnN1Z2dlc3Rpb25zPy5pc1VuaXF1ZUtleSA/IChcbiAgICAgIHRoaXMuc3VnZ2VzdEV4aXN0aW5nTm9kZSh0eXBlLCB0ZXJtLCBwcm9wZXJ0eS5zdWdnZXN0aW9ucy5pc1VuaXF1ZUtleSlcbiAgICApIDogKFxuICAgICAgcHJvcGVydHkuc3VnZ2VzdGlvbnM/LmlzTGlua05vZGUgP1xuICAgICAgICBvZihmb3JtYXRMaW5rTm9kZXNTdWdnZXN0aW9ucyh0aGlzLm5vZGVNYXAsIHR5cGUpKSA6IChcbiAgICAgICAgICBzdWdnZXN0RGVmYXVsdCA/IHN1Z2dlc3REZWZhdWx0KHRlcm0sIHByb3BlcnR5KSA6IG9mKFtdKVxuICAgICAgICApXG4gICAgKSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5tYXAoZm9ybWF0U3VnZ2VzdGlvbikpXG4gICAgKTtcblxuICBwcml2YXRlIHN1Z2dlc3Rlcjoge1xuICAgIFt0eXBlIGluIHN1Z2dlc3Rpb25UeXBlXT86IHN1Z2dlc3RGdW5jO1xuICB9ID0ge1xuICAgIGRlZmF1bHQ6ICh0ZXJtLCBwcm9wZXJ0eSkgPT4gb2YoXG4gICAgICAocHJvcGVydHk/LnN1Z2dlc3Rpb25zPy52YWx1ZXMgfHwgW10pXG4gICAgICAgIC5tYXAodiA9PiBgJHt2fWApXG4gICAgICAgIC5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgLm1hcChuYW1lID0+ICh7IG5hbWUgfSkpXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuQWN0b3JdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkFjdG9yKSxcbiAgICBbTm9kZVR5cGUuQ3ljbGVdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkN5Y2xlKSxcbiAgICBbTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudF06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCksXG4gICAgW05vZGVUeXBlLk9yZ2FuaXNhdGlvbl06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuT3JnYW5pc2F0aW9uKSxcbiAgICBbTm9kZVR5cGUuU2l0ZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU2l0ZSksXG4gICAgW05vZGVUeXBlLlNvdXJjZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU291cmNlLCAodGVybSwgeyBrZXkgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdFNvdXJjZSh0ZXJtLCA1LCBbYGJpYmxpb2dyYXBoeS4ke2tleX1gXSwgW2BiaWJsaW9ncmFwaHkuJHtrZXl9YF0pXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuVGVybV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuVGVybSwgKHRlcm0sIHsgc3VnZ2VzdGlvbnMgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdCh0ZXJtLCBOb2RlVHlwZS5UZXJtLCBzdWdnZXN0aW9ucz8ucXVlcmllcyB8fCBbXSwgbnVsbCwgNSwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcylcbiAgICApXG4gIH07XG4gIHB1YmxpYyBwcm9wZXJ0eVN1Z2dlc3QgPSAoeyBmdWxsS2V5LCBzdWdnZXN0aW9ucyB9OiBJTm9kZVByb3BlcnR5KSA9PiAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHN1Z2dlc3Rpb25zPy50eXBlID09PSBkZWZhdWx0U3VnZ2VzdGlvblR5cGUgPyAwIDogMzAwKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBtZXJnZU1hcCh0ZXJtID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBmaW5kUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBmdWxsS2V5KTtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5Py5lZGl0YWJsZSAmJiBzdWdnZXN0aW9ucz8udHlwZSBpbiB0aGlzLnN1Z2dlc3RlciA/XG4gICAgICAgICAgb2YodGVybSkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiBwcm9wZXJ0eS5sb2FkaW5nID0gdHJ1ZSksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zdWdnZXN0ZXJbc3VnZ2VzdGlvbnM/LnR5cGVdISh0ZXJtLCBwcm9wZXJ0eSkpLFxuICAgICAgICAgICAgdGFwKCgpID0+IHByb3BlcnR5LmxvYWRpbmcgPSBmYWxzZSlcbiAgICAgICAgICApIDpcbiAgICAgICAgICBvZihbXSk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBIZVNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2Vyc1NlcnZpY2U6IEhlVXNlcnNTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc2NoZW1hVHlwZSA9IHRoaXMubm9kZSEudHlwZSB8fCB0aGlzLm5vZGUhWydAdHlwZSddO1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hcyA/IHRoaXMuc2NoZW1hc1tzY2hlbWFUeXBlXSA6IHt9IGFzIGRlZmluaXRpb247XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5lcnJvcnMuZmlsdGVyKGZpbHRlckVycm9yKTtcbiAgICBjb25zdCBlcnJvciA9IHByb3BlcnR5RXJyb3IoZXJyb3JzKSgnJyk7XG4gICAgdGhpcy5ub2RlUHJvcGVydHkgPSB0aGlzLnNjaGVtYXMgPyB7XG4gICAgICBpZDogcHJvcGVydHlJZCgpLFxuICAgICAgc2NoZW1hLFxuICAgICAgc2NoZW1hVHlwZSxcbiAgICAgIGVkaXRhYmxlOiAhIXRoaXMubm9kZSEudHlwZSxcbiAgICAgIGZ1bGxLZXk6ICcnLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHZhbHVlOiB7fSxcbiAgICAgIGVycm9yOiBmb3JtYXRFcnJvcihlcnJvciksXG4gICAgICBoYXNFcnJvcjogZXJyb3JIYXNFcnJvcihlcnJvciksXG4gICAgICBoYXNXYXJuaW5nOiBlcnJvckhhc1dhcm5pbmcoZXJyb3IpLFxuICAgICAgc3VnZ2VzdGlvbnM6IHt9LFxuICAgICAgbmV3UHJvcGVydHk6IHt9LFxuICAgICAgbmV3RXJyb3I6IHsgbGV2ZWw6ICd3YXJuaW5nJyB9LFxuICAgICAgcHJvcGVydGllczogW10sXG4gICAgICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IGlzQWRkUHJvcGVydHlFbmFibGVkKHRoaXMubm9kZSEsIHNjaGVtYVR5cGUsIHNjaGVtYSksXG4gICAgICBmb3JtYXR0ZXI6IGZvcm1hdHRlcignJylcbiAgICB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY3Vyc2VyID0gcmVjdXJzaXZlUHJvcGVydGllcyh0aGlzLnNjaGVtYXMhLCBlcnJvcnMsIHNjaGVtYSwgdGhpcy5kZWVwRWRpdGFibGUpO1xuICAgIHRoaXMucHJvcGVydGllcyA9IHJlY3Vyc2VyKHRoaXMubm9kZSk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIsIF92YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgcHVibGljIHRyYWNrQnlQcm9wZXJ0eShfaW5kZXg6IG51bWJlciwgeyBpZCwgZnVsbEtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFtmdWxsS2V5LCBpZF0uam9pbignXycpO1xuICB9XG5cbiAgcHVibGljIGhhc0FkZG9ucyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBwcm9wZXJ0eSAmJiAoXG4gICAgICB0aGlzLmVuYWJsZUFkZEVycm9yKHByb3BlcnR5KSB8fFxuICAgICAgKHRoaXMuZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUpIHx8XG4gICAgICB0aGlzLmFkZFByb3BlcnR5RW5hYmxlZChwcm9wZXJ0eSkgfHxcbiAgICAgIHRoaXMuaXNSZXF1aXJlZChwcm9wZXJ0eSkgfHxcbiAgICAgIHByb3BlcnR5LmV4dGVybmFsVXJsPy51cmwgfHxcbiAgICAgIHRoaXMubWFwRHJhd2luZ01vZGVzKHByb3BlcnR5KS5sZW5ndGggfHxcbiAgICAgIHRoaXMudW5pdENvbnZlcnRlckVuYWJsZWQocHJvcGVydHkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1JlcXVpcmVkKHsgdmFsdWUsIGlzUmVxdWlyZWQgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBpc1JlcXVpcmVkICYmIGlzRW1wdHkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc3VnZ2VzdFRlcm1GaWVsZHMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnBvcHVsYXRlVGVybUZpZWxkcyxcbiAgICAgIC4uLih0aGlzLnNob3dTdWdnZXN0ZWREZWZhdWx0UHJvcGVydGllcyA/IHBvcHVsYXRlVGVybURlZmF1bHRQcm9wZXJ0aWVzIDogW10pXG4gICAgXTtcbiAgfVxuXG4gIC8vIC0tLSBFcnJvcnNcblxuICBwdWJsaWMgZW5hYmxlQWRkRXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnNFZGl0YWJsZSAmJiAhcHJvcGVydHkuaGFzRXJyb3IgJiYgIXByb3BlcnR5Lmhhc1dhcm5pbmc7XG4gIH1cblxuICBwdWJsaWMgYWRkRXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHksIHsgbWVzc2FnZSwgbGV2ZWwgfTogSUVycm9yUHJvcGVydHkpIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IHByb3BlcnR5LmZ1bGxLZXkuc3BsaXQoJy4nKTtcbiAgICBrZXlzLnBvcCgpO1xuICAgIGNvbnN0IGVycm9yOiBJVmFsaWRhdGlvbkVycm9yID0gcHJvcGVydHkuaXNBZGRlZCA/IHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBsZXZlbDogbGV2ZWwgfHwgJ2Vycm9yJyxcbiAgICAgIGRhdGFQYXRoOiBrZXlUb0RhdGFQYXRoKGtleXMuam9pbignLicpKSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBtaXNzaW5nUHJvcGVydHk6IHByb3BlcnR5LmtleVxuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgbGV2ZWw6IGxldmVsIHx8ICdlcnJvcicsXG4gICAgICBkYXRhUGF0aDoga2V5VG9EYXRhUGF0aChwcm9wZXJ0eS5mdWxsS2V5KVxuICAgIH07XG4gICAgcHJvcGVydHkubmV3RXJyb3IgPSB7IGxldmVsOiAnd2FybmluZycgfTtcbiAgICBwcm9wZXJ0eS5lcnJvciA9IGVycm9yO1xuICAgIHByb3BlcnR5Lmhhc0Vycm9yID0gZXJyb3JIYXNFcnJvcihlcnJvcik7XG4gICAgcHJvcGVydHkuaGFzV2FybmluZyA9IGVycm9ySGFzV2FybmluZyhlcnJvcik7XG4gICAgdGhpcy5ub2RlRXJyb3JBZGRlZC5lbWl0KGVycm9yKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0RXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBwcm9wZXJ0eS5uZXdFcnJvciA9IHByb3BlcnR5LmVycm9yO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gcHJvcGVydHkuZXJyb3I/LmluZGV4O1xuICAgIHByb3BlcnR5LmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHByb3BlcnR5Lmhhc0Vycm9yID0gaGFzRXJyb3IocHJvcGVydHkucHJvcGVydGllcyk7XG4gICAgcHJvcGVydHkuaGFzV2FybmluZyA9IGhhc1dhcm5pbmcocHJvcGVydHkucHJvcGVydGllcyk7XG4gICAgdGhpcy5ub2RlRXJvcnJSZXNvbHZlZC5lbWl0KGluZGV4KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkuZnVsbEtleSk7XG4gIH1cblxuICAvLyAtLS1cblxuICBwdWJsaWMgdHlwZWFoZWFkRm9jdXMoZTogRXZlbnQpIHtcbiAgICBpZiAoZS5idWJibGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dEV2ZW50ID0gbmV3IEV2ZW50KCdpbnB1dCcpO1xuICAgICAgZS50YXJnZXQ/LmRpc3BhdGNoRXZlbnQoaW5wdXRFdmVudCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwdWJsaWMgYWRkUHJvcGVydHlFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgIXRoaXMuZXJyb3JzRWRpdGFibGUgJiYgcHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdQcm9wZXJ0aWVzKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5LCBmaWVsZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IG5vZGVBdmFpbGFibGVQcm9wZXJ0aWVzKHRoaXMubm9kZSEsIHByb3BlcnR5KTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIocHJvcCA9PiBwcm9wLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmllbGQudG9Mb3dlckNhc2UoKSkpXG4gICAgICAubWFwKG5hbWUgPT4gKHsgbmFtZSwgcHJvcDogcHJvcGVydGllc1tuYW1lXSB9KSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGRhdGE6IGFueSwgZWRpdGFibGU/OiBib29sZWFuLCByZXBsYWNlUGFyZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHBhcmVudCA9IHJlcGxhY2VQYXJlbnQgPyBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KSA6IHByb3BlcnR5O1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSByZWN1cnNpdmVQcm9wZXJ0aWVzKFxuICAgICAgdGhpcy5zY2hlbWFzISwgW10sIHRoaXMuc2NoZW1hcyFbdGhpcy5ub2RlIS50eXBlXSwgdGhpcy5kZWVwRWRpdGFibGUsIHBhcmVudC5mdWxsS2V5XG4gICAgKShkYXRhKTtcbiAgICB1cGRhdGVQcm9wZXJ0aWVzKHsgcHJvcGVydGllcyB9LCBwcm9wID0+IHtcbiAgICAgIHByb3AuZWRpdGFibGUgPSB0eXBlb2YgZWRpdGFibGUgPT09ICd1bmRlZmluZWQnID8gcHJvcC5lZGl0YWJsZSA6IGVkaXRhYmxlO1xuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gICAgcGFyZW50LmVkaXRhYmxlID0gdHlwZW9mIGVkaXRhYmxlID09PSAndW5kZWZpbmVkJyA/IHBhcmVudC5lZGl0YWJsZSA6IGVkaXRhYmxlO1xuICAgIHBhcmVudC5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICBwYXJlbnQudmFsdWUgPSBkYXRhO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5Q2hhbmdlZChkYXRhLCBwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN1Z2dlc3Rpb25TZWxlY3RlZCh7ICdAaWQnOiBfaWQsIG5hbWUsIHR5cGUsIGlkLCAuLi5kYXRhIH0sIHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIF9pZCA/XG4gICAgICAvLyBzdWdnZXN0aW9ucyBmcm9tIGV4aXN0aW5nIG5vZGVzXG4gICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgJ0BpZCc6IF9pZCwgJ0B0eXBlJzogcHJvcGVydHkuc3VnZ2VzdGlvbnM/LnR5cGUsIG5hbWUsIC4uLmRhdGEgfSwgZmFsc2UpIDpcbiAgICAgIChcbiAgICAgICAgLy8gc3VnZ2VzdGlvbiBmcm9tIGxpbmtlZCBub2Rlc1xuICAgICAgICB0eXBlICYmIGlkID9cbiAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgdHlwZSwgaWQsIC4uLmRhdGEgfSwgdHJ1ZSkgOlxuICAgICAgICAgIC8vIHN1Z2dlc3Rpb24gYnkgbmFtZSA9PiBlbnVtIHZhbHVlc1xuICAgICAgICAgIHRoaXMucHJvcGVydHlDaGFuZ2VkKG5hbWUsIHByb3BlcnR5KVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRBcnJheUdyb3VwKGFycmF5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuc2NoZW1hcyFbYXJyYXkuc2NoZW1hVHlwZV07XG4gICAgY29uc3QgdmFsdWUgPSBnZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHR5cGVUb05ld1Byb3BlcnR5KFxuICAgICAgdGhpcy5zY2hlbWFzISwgcHJvcCwgcHJvcCwgdmFsdWUsIGAke2FycmF5LmZ1bGxLZXl9WyR7YXJyYXkucHJvcGVydGllcy5sZW5ndGh9XWBcbiAgICApO1xuICAgIGFycmF5LnByb3BlcnRpZXMucHVzaChuZXdQcm9wZXJ0eSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlZC5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgYXJyYXkuZnVsbEtleSk7XG4gIH1cblxuICBwdWJsaWMgZHVwbGljYXRlQXJyYXlHcm91cChhcnJheTogSU5vZGVQcm9wZXJ0eSwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtwcm9wZXJ0eS5rZXk7XG4gICAgY29uc3QgbmV3UHJvcGVydHk6IElOb2RlUHJvcGVydHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHByb3BlcnR5KSk7XG4gICAgbmV3UHJvcGVydHkuaWQgPSBwcm9wZXJ0eUlkKCk7XG4gICAgY29uc3QgdmFsdWUgPSBbLi4uZ2V0KHRoaXMubm9kZSwgYXJyYXkuZnVsbEtleSldO1xuICAgIHZhbHVlLnNwbGljZShpbmRleCwgMCwgc2FmZUpTT05QYXJzZShuZXdQcm9wZXJ0eS52YWx1ZSkpO1xuICAgIGFycmF5LnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAwLCBuZXdQcm9wZXJ0eSk7XG4gICAgLy8gbmVlZCB0byBjaGFuZ2Uga2V5IG9uIGV2ZXJ5IHByb3BlcnRpZXMgcmVjdXJzaXZlbHlcbiAgICByZWZyZXNoUHJvcGVydHlLZXlzKGFycmF5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2VkLmVtaXQoeyBrZXk6IGFycmF5LmZ1bGxLZXksIHZhbHVlIH0pO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBhcnJheS5mdWxsS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBcnJheUdyb3VwKGFycmF5OiBJTm9kZVByb3BlcnR5LCB7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSAra2V5O1xuICAgIGNvbnN0IHZhbHVlID0gWy4uLmdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpXTtcbiAgICB2YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGFycmF5LnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAvLyBuZWVkIHRvIGNoYW5nZSBrZXkgb24gZXZlcnkgcHJvcGVydGllcyByZWN1cnNpdmVseVxuICAgIHJlZnJlc2hQcm9wZXJ0eUtleXMoYXJyYXkpO1xuICAgIHRoaXMubm9kZUNoYW5nZWQuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgLy8gaWYgbm8gbW9yZSB2YWx1ZXMsIHJlbW92ZSBwYXJlbnQgZ3JvdXAgZW50aXJlbHlcbiAgICByZXR1cm4gYXJyYXkucHJvcGVydGllcy5sZW5ndGggPyBudWxsIDogdGhpcy5wcm9wZXJ0eUNoYW5nZWQobnVsbCwgYXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlQXJyYXlHcm91cFRvUG9zaXRpb24oYXJyYXk6IElOb2RlUHJvcGVydHksIGN1cnJlbnRJbmRleDogbnVtYmVyLCBuZXdJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBbLi4uZ2V0KHRoaXMubm9kZSwgYXJyYXkuZnVsbEtleSldO1xuICAgIG1vdmVJdGVtSW5BcnJheSh2YWx1ZSwgY3VycmVudEluZGV4LCBuZXdJbmRleCk7XG4gICAgbW92ZUl0ZW1JbkFycmF5KGFycmF5LnByb3BlcnRpZXMsIGN1cnJlbnRJbmRleCwgbmV3SW5kZXgpO1xuICAgIC8vIG5lZWQgdG8gY2hhbmdlIGtleSBvbiBldmVyeSBwcm9wZXJ0aWVzIHJlY3Vyc2l2ZWx5XG4gICAgcmVmcmVzaFByb3BlcnR5S2V5cyhhcnJheSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlZC5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgYXJyYXkuZnVsbEtleSk7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFycmF5R3JvdXBVcChhcnJheTogSU5vZGVQcm9wZXJ0eSwgeyBrZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gK2tleTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlQXJyYXlHcm91cFRvUG9zaXRpb24oYXJyYXksIGluZGV4LCBpbmRleCAtIDEpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBcnJheUdyb3VwRG93bihhcnJheTogSU5vZGVQcm9wZXJ0eSwgeyBrZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gK2tleTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlQXJyYXlHcm91cFRvUG9zaXRpb24oYXJyYXksIGluZGV4LCBpbmRleCArIDEpO1xuICB9XG5cbiAgcHVibGljIHByb3BlcnR5Q2hhbmdlZCh2YWx1ZTogYW55LCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LmZ1bGxLZXksIHZhbHVlKTtcbiAgICBwcm9wZXJ0eS5hZGRQcm9wZXJ0eUVuYWJsZWQgPSBpc0FkZFByb3BlcnR5RW5hYmxlZChcbiAgICAgIHRoaXMubm9kZSEsIHByb3BlcnR5LnNjaGVtYVR5cGUsIHByb3BlcnR5LnNjaGVtYSEsIHByb3BlcnR5LmZ1bGxLZXlcbiAgICApO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBwcm9wZXJ0eS52YWx1ZSA9IHZhbHVlO1xuICAgICAgcHJvcGVydHkuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3VmFsdWUgPSBjbGVhbk5ld1ZhbHVlKHBhcnNlTmV3VmFsdWUocHJvcGVydHkuc2NoZW1hISwgdmFsdWUpKTtcbiAgICAvLyB0cmlnZ2VyIHJlZnJlc2ggb2Ygbm9kZVxuICAgIGNvbnN0IG5vZGUgPSBjb3B5T2JqZWN0KHRoaXMubm9kZSk7XG4gICAgc2V0KG5vZGUsIHByb3BlcnR5LmZ1bGxLZXksIG5ld1ZhbHVlKTtcbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIC8vIHRyaWdnZXIgZm9yIGxpc3RlbmVyc1xuICAgIHRoaXMubm9kZUNoYW5nZWQuZW1pdCh7IGtleTogcHJvcGVydHkuZnVsbEtleSwgdmFsdWU6IG5ld1ZhbHVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWZhdWx0UHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGtleTogc3RyaW5nLCBkZWY6IGRlZmluaXRpb24pIHtcbiAgICBjb25zdCBub2RlID0gcHJvcGVydHkua2V5ID8gZ2V0KHRoaXMubm9kZSwgcHJvcGVydHkuZnVsbEtleSkgOiB0aGlzLm5vZGU7XG4gICAgY29uc3QgZnVsbEtleSA9IHByb3BlcnR5LmtleSA/IGAke3Byb3BlcnR5LmZ1bGxLZXl9LiR7a2V5fWAgOiBrZXk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHByb3BlcnR5LmtleSA/IHByb3BlcnR5LnByb3BlcnRpZXMgOiB0aGlzLnByb3BlcnRpZXM7XG4gICAgY29uc3QgbmV3UHJvcGVydHkgPSB0eXBlVG9OZXdQcm9wZXJ0eSh0aGlzLnNjaGVtYXMhLCBkZWYsIHRoaXMuc2NoZW1hcyFbcHJvcGVydHkuc2NoZW1hVHlwZV0sIG5vZGUsIGZ1bGxLZXkpO1xuICAgIGluc2VydFByb3BlcnR5KHByb3BlcnRpZXMsIGZ1bGxLZXksIG5ld1Byb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmV3UHJvcGVydHkudmFsdWUsIG5ld1Byb3BlcnR5KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNaXNzaW5nUHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHBhcmVudCA9PT0gcHJvcGVydHkgPyB0aGlzLm5vZGVQcm9wZXJ0eSEgOiBwYXJlbnQ7XG4gICAgY29uc3QgbmV3UHJvcGVydGllcyA9IHRoaXMubmV3UHJvcGVydGllcyhuZXdQcm9wZXJ0eSwgcHJvcGVydHkua2V5KTtcbiAgICBuZXdQcm9wZXJ0eS5uZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnRpZXNbMF07XG4gICAgcmV0dXJuIG5ld1Byb3BlcnR5Lm5ld1Byb3BlcnR5ID8gdGhpcy5hZGRQcm9wZXJ0eShuZXdQcm9wZXJ0eSkgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFkZFByb3BlcnR5KHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgeyBuYW1lLCBwcm9wIH0gPSBwcm9wZXJ0eS5uZXdQcm9wZXJ0eSE7XG4gICAgcHJvcGVydHkubmV3UHJvcGVydHkgPSB7fTtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ0BpZCcgP1xuICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5LCB7ICdAaWQnOiAnJywgdHlwZTogcHJvcGVydHkuc2NoZW1hVHlwZSB9LCB1bmRlZmluZWQsIGZhbHNlKSA6XG4gICAgICB0aGlzLmFkZERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eSwgbmFtZSEsIHByb3AhKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgdmFsdWU6IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWwpIHtcbiAgICBjb25zdCBsYXRpdHVkZSA9IHNpYmxpbmdQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LCAnbGF0aXR1ZGUnKTtcbiAgICBjb25zdCBsb25naXR1ZGUgPSBzaWJsaW5nUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSwgJ2xvbmdpdHVkZScpO1xuICAgIHJldHVybiBbXG4gICAgICBsYXRpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxhdCwgbGF0aXR1ZGUpIDogbnVsbCxcbiAgICAgIGxvbmdpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxuZywgbG9uZ2l0dWRlKSA6IG51bGxcbiAgICBdO1xuICB9XG5cbiAgLy8gTWFwXG5cbiAgcHVibGljIGdldCBzaG93TWFwKCkge1xuICAgIHJldHVybiAoIXRoaXMuZWRpdGFibGUgfHwgdGhpcy5lcnJvck1vZGUpICYmIFtTY2hlbWFUeXBlLlNpdGUsIFNjaGVtYVR5cGUuT3JnYW5pc2F0aW9uXS5pbmNsdWRlcyh0aGlzLm5vZGUhLnR5cGUpO1xuICB9XG5cbiAgcHVibGljIG1hcERyYXdpbmdNb2Rlcyh7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFsnYm91bmRhcnknXS5pbmNsdWRlcyhrZXkpID8gW1xuICAgICAgZ29vZ2xlLm1hcHMuZHJhd2luZy5PdmVybGF5VHlwZS5QT0xZR09OXG4gICAgXSA6IChbXG4gICAgICAnbGF0aXR1ZGUnLCAnbG9uZ2l0dWRlJ1xuICAgIF0uaW5jbHVkZXMoa2V5KSA/IFtcbiAgICAgIGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheVR5cGUuTUFSS0VSXG4gICAgXSA6IFtdKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1hcERyYXdpbmdDbG9zZWQobmV3VmFsdWUpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5O1xuICAgIHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZSddLmluY2x1ZGVzKHByb3BlcnR5IS5rZXkpID9cbiAgICAgIHRoaXMudXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eSEsIG5ld1ZhbHVlKSA6XG4gICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZChuZXdWYWx1ZSwgcHJvcGVydHkhKTtcbiAgfVxuXG4gIC8vIEJpYmxpb2dyYXBoeSBTZWFyY2hcblxuICBwdWJsaWMgYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkoeyBrZXksIHNjaGVtYVR5cGUgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbGlkU2NoZW1hID0gW1NjaGVtYVR5cGUuQmlibGlvZ3JhcGh5XS5pbmNsdWRlcyhzY2hlbWFUeXBlKTtcbiAgICBjb25zdCB2YWxpZUtleSA9IFsndGl0bGUnLCAnZG9jdW1lbnRET0knLCAnc2NvcHVzJ10uaW5jbHVkZXMoa2V5KTtcbiAgICByZXR1cm4gdmFsaWRTY2hlbWEgJiYgdmFsaWVLZXkgPyBrZXkgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCaWJsaW9ncmFwaHkodmFsdWU6IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgdGhpcy5iaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5ISk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoU291cmNlcyA/IHtcbiAgICAgIC4uLnBhcmVudC52YWx1ZSxcbiAgICAgIGJpYmxpb2dyYXBoeTogdmFsdWVcbiAgICB9IDogdmFsdWU7XG4gICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEsIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTb3VyY2UodmFsdWU6IFBhcnRpYWw8U291cmNlPikge1xuICAgIC8vIGNhbm5vdCByZXBsYWNlIGEgdG9wLWxldmVsIHNvdXJjZVxuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hTb3VyY2VzICYmIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YSh0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkhLCB7XG4gICAgICAnQHR5cGUnOiBOb2RlVHlwZS5Tb3VyY2UsXG4gICAgICAuLi52YWx1ZVxuICAgIH0sICEoJ0BpZCcgaW4gdmFsdWUpKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBiaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEuZnVsbEtleS5zcGxpdCgnLicpLmxlbmd0aCA+IDI7XG4gIH1cblxuICBwdWJsaWMgb25CaWJsaW9ncmFwaGllc1NlYXJjaENsb3NlZCh2YWx1ZT86IFBhcnRpYWw8U291cmNlPiB8IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSA9IHZhbHVlID8gKFxuICAgICAgdmFsdWUudHlwZSA9PT0gU2NoZW1hVHlwZS5CaWJsaW9ncmFwaHkgP1xuICAgICAgICB0aGlzLnVwZGF0ZUJpYmxpb2dyYXBoeSh2YWx1ZSkgOlxuICAgICAgICB0aGlzLnVwZGF0ZVNvdXJjZSh2YWx1ZSBhcyBQYXJ0aWFsPFNvdXJjZT4pXG4gICAgKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIEFjdG9yLkBpZFxuXG4gIHB1YmxpYyBhc3luYyBzZXRVc2VyQWN0b3JJZChwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHsgYWN0b3JJZCwgbmFtZSB9ID0gYXdhaXQgdGhpcy51c2Vyc1NlcnZpY2UubG9nZ2VkSW5Vc2VyO1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgJ0BpZCc6IGFjdG9ySWQsICdAdHlwZSc6IE5vZGVUeXBlLkFjdG9yLCBuYW1lIH0sIGZhbHNlKTtcbiAgfVxuXG4gIC8vIEN5Y2xlLmN5Y2xlRHVyYXRpb25cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbih0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQoZHVyYXRpb24sIHByb3BlcnR5KTtcbiAgfVxuXG4gIC8vIEN5Y2xlLnN0YXJ0RGF0ZVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGUodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKHN0YXJ0RGF0ZSwgcHJvcGVydHkpO1xuICB9XG5cbiAgLy8gVW5pdHMgY29udmVydGVyXG5cbiAgcHVibGljIHVuaXRDb252ZXJ0ZXJFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgWyd2YWx1ZScsICdtaW4nLCAnbWF4JywgJ3NkJ10uaW5jbHVkZXMocHJvcGVydHkua2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuVW5pdENvbnZlcnRlcihwb3BvdmVyLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydHkudmFsdWU7XG4gICAgY29uc3QgdGVybVByb3BlcnR5ID0gc2libGluZ1Byb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHksICd0ZXJtJyk7XG4gICAgY29uc3QgdGVybSA9IHNhZmVKU09OUGFyc2UodGVybVByb3BlcnR5Py52YWx1ZSk7XG4gICAgY29uc3QgdW5pdHMgPSB0ZXJtPy51bml0cztcbiAgICByZXR1cm4gcG9wb3Zlci5pc09wZW4oKSA/IHBvcG92ZXIuY2xvc2UoKSA6IHBvcG92ZXIub3Blbih7IHZhbHVlLCB0ZXJtLCB1bml0cyB9KTtcbiAgfVxuXG4gIC8vIFJlY29tbWVuZGF0aW9uc1xuXG4gIHB1YmxpYyBvblNlbGVjdFJlY29tbWVuZGF0aW9uKGFycmF5OiBJTm9kZVByb3BlcnR5LCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuc2NoZW1hcyFbYXJyYXkuc2NoZW1hVHlwZV07XG4gICAgY29uc3QgdmFsdWUgPSBnZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KTtcblxuICAgIGNvbnN0IG5ld1Byb3BlcnR5ID0gdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLCBwcm9wLCB2YWx1ZSwgYCR7YXJyYXkuZnVsbEtleX1bJHthcnJheS5wcm9wZXJ0aWVzLmxlbmd0aH1dYFxuICAgICk7XG4gICAgbmV3UHJvcGVydHkudmFsdWUudGVybSA9IHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH07XG4gICAgdmFsdWVbYXJyYXkucHJvcGVydGllcy5sZW5ndGhdLnRlcm0gPSB7IHR5cGU6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiBpZCB9O1xuXG4gICAgLy8gaW5zZXJ0IFRlcm0gd2l0aCBAaWRcbiAgICBjb25zdCB0ZXJtS2V5ID0gYCR7bmV3UHJvcGVydHkuZnVsbEtleX0udGVybWA7XG4gICAgY29uc3QgdGVybVByb3BlcnR5ID0gbmV3UHJvcGVydHkucHJvcGVydGllcy5maW5kKHAgPT4gcC5rZXkgPT09ICd0ZXJtJykgfHwgdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLnByb3BlcnRpZXMudGVybSwgcHJvcCwgbmV3UHJvcGVydHkudmFsdWUsIHRlcm1LZXlcbiAgICApO1xuICAgIHRlcm1Qcm9wZXJ0eS52YWx1ZSA9IHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH07XG4gICAgdGVybVByb3BlcnR5LnByb3BlcnRpZXMgPSByZWN1cnNpdmVQcm9wZXJ0aWVzKFxuICAgICAgdGhpcy5zY2hlbWFzISwgW10sIHRoaXMuc2NoZW1hcyFbdGhpcy5ub2RlIS50eXBlXSwgdGhpcy5kZWVwRWRpdGFibGUsIHRlcm1LZXlcbiAgICApKHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH0pO1xuICAgIGluc2VydFByb3BlcnR5KG5ld1Byb3BlcnR5LnByb3BlcnRpZXMsIHRlcm1LZXksIHRlcm1Qcm9wZXJ0eSk7XG5cbiAgICAvLyB0ZXJtIGNhbm5vdCBiZSBlZGl0ZWQsIG5lZWQgdG8gcmVtb3ZlIGZpcnN0XG4gICAgdXBkYXRlUHJvcGVydGllcyh0ZXJtUHJvcGVydHksIHAgPT4ge1xuICAgICAgcC5lZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfSk7XG4gICAgdGVybVByb3BlcnR5LmVkaXRhYmxlID0gZmFsc2U7XG5cbiAgICBhcnJheS5wcm9wZXJ0aWVzLnB1c2gobmV3UHJvcGVydHkpO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5Q2hhbmdlZCh2YWx1ZSwgYXJyYXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC10b2dnbGUgcC00XCIgKGNsaWNrKT1cImlzT3BlbiA9ICFpc09wZW5cIiBwb2ludGVyPlxuICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgIDxzcGFuICpuZ0lmPVwibm9kZVByb3BlcnR5XCIgY2xhc3M9XCJpcy1weC0yXCJcbiAgICAgIFtjbGFzcy5oYXMtdGV4dC1kYW5nZXJdPVwibm9kZVByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICAgIFtjbGFzcy5oYXMtdGV4dC13YXJuaW5nXT1cIm5vZGVQcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICA+XG4gICAgICA8aGUtbm9kZS1pY29uIFt0eXBlXT1cIm5vZGVQcm9wZXJ0eS5zY2hlbWFUeXBlXCI+PC9oZS1ub2RlLWljb24+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgaXNPcGVuICYmIG5vZGVQcm9wZXJ0eVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IG5vZGVQcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc09wZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIG1iLTJcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlRXJyb3JGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBub2RlUHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIiAqbmdJZj1cIm5vZGVQcm9wZXJ0eT8uZXJyb3JcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogbm9kZVByb3BlcnR5LCBlZGl0OiB0cnVlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tdWx0aWxpbmVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3BlcnR5IG9mIHByb3BlcnRpZXM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wZXJ0eVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd1Byb3BlcnR5OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzT3BlblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5TWFwOyBjb250ZXh0OiB7JGltcGxpY2l0OiBub2RlUHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuXG48aGUtbWFwcy1kcmF3aW5nLWNvbmZpcm0gKm5nSWY9XCIhIW1hcERyYXdpbmdQcm9wZXJ0eVwiXG4gIFt2YWx1ZV09XCJtYXBEcmF3aW5nUHJvcGVydHkudmFsdWVcIiBbbW9kZXNdPVwibWFwRHJhd2luZ01vZGVzKG1hcERyYXdpbmdQcm9wZXJ0eSlcIlxuICAoY2xvc2VkKT1cIm9uTWFwRHJhd2luZ0Nsb3NlZCgkZXZlbnQpXCJcbj48L2hlLW1hcHMtZHJhd2luZy1jb25maXJtPlxuXG48aGUtYmlibGlvZ3JhcGhpZXMtc2VhcmNoLWNvbmZpcm0gKm5nSWY9XCIhIWJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHlcIlxuICBbc2VhcmNoXT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkudmFsdWVcIlxuICBbc2VhcmNoQnldPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkoYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSlcIlxuICBbc2VhcmNoU291cmNlc109XCJiaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXNcIlxuICAoY2xvc2VkKT1cIm9uQmlibGlvZ3JhcGhpZXNTZWFyY2hDbG9zZWQoJGV2ZW50KVwiXG4+PC9oZS1iaWJsaW9ncmFwaGllcy1zZWFyY2gtY29uZmlybT5cblxuPG5nLXRlbXBsYXRlICNsYWJlbERlc2NyaXB0aW9uIGxldC1wcm9wZXJ0eT5cbiAgPG5nLXRlbXBsYXRlICNkZXNjcmlwdGlvbj5cbiAgICA8c3BhbiBjbGFzcz1cImlzLXByZS1saW5lXCI+e3twcm9wZXJ0eS5zY2hlbWE/LmRlc2NyaXB0aW9ufX08L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPHNwYW5cbiAgICBjbGFzcz1cInRyaWdnZXItcG9wb3ZlclwiXG4gICAgW25nYlBvcG92ZXJdPVwiZGVzY3JpcHRpb25cIiBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvdyBpcy1uYXJyb3ctd2lkdGhcIlxuICAgIHRyaWdnZXJzPVwiaG92ZXJcIiBwbGFjZW1lbnQ9XCJyaWdodFwiIGNvbnRhaW5lcj1cImJvZHlcIlxuICA+XG4gICAgPHNwYW4+e3twcm9wZXJ0eS5rZXl9fTwvc3Bhbj5cbiAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsYWJlbERlZmF1bHQgbGV0LXByb3BlcnR5PlxuICA8c3Bhbj57e3Byb3BlcnR5LmtleX19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzaG93UHJvcGVydHkgbGV0LXByb3BlcnR5PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGlzT3BlbiB8fCBwcm9wZXJ0eS5jbG9zZWRWaXNpYmxlKSAmJiAhcHJvcGVydHkuaXNIaWRkZW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLTZcIlxuICAgICAgW2lkXT1cInByb3BlcnR5LmZ1bGxLZXkgKyAnXycgKyBwcm9wZXJ0eS5pZFwiXG4gICAgICBbY2xhc3MuaXMtMTJdPVwicHJvcGVydHkucHJvcGVydGllcy5sZW5ndGggfHwgIXByb3BlcnR5LmtleVwiXG4gICAgICBbbmdTd2l0Y2hdPVwiISFwcm9wZXJ0eS5wcm9wZXJ0aWVzLmxlbmd0aFwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbXVsdGlsaW5lIGlzLXZhcmlhYmxlIGlzLTFcIiAqbmdTd2l0Y2hDYXNlPVwiZmFsc2VcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqYmluZE9uY2U9XCJwcm9wZXJ0eVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtMyBweS0xXCIgKm5nSWY9XCJwcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGhhcy10ZXh0LXJpZ2h0LXRhYmxldCBoYXMtdGV4dC1lbGxpcHNpc1wiIFtmb3JdPVwicHJvcGVydHkuaWRcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHkuc2NoZW1hPy5kZXNjcmlwdGlvbiAmJiBlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSA/IGxhYmVsRGVzY3JpcHRpb24gOiBsYWJlbERlZmF1bHQ7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtOSBweS0xXCIgW2NsYXNzLmlzLTEyXT1cIiFwcm9wZXJ0eS5rZXlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGVkaXRhYmxlIHx8IGVycm9yc0VkaXRhYmxlKSAmJiAocHJvcGVydHkuaGFzRXJyb3IgfHwgcHJvcGVydHkuaGFzV2FybmluZylcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcGVydHksIGVkaXQ6IGZhbHNlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbFwiICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCJcbiAgICAgICAgW2NsYXNzLmlzLXNlY29uZGFyeV09XCJlcnJvck1vZGUgJiYgcHJvcGVydHkuY2hhbmdlZFwiXG4gICAgICAgIFtjbGFzcy5pcy1kYW5nZXJdPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzRXJyb3JcIlxuICAgICAgICBbY2xhc3MuaXMtd2FybmluZ109XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgICAgW2NsYXNzLmlzLWRlZmF1bHRdPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgIXByb3BlcnR5Lmhhc0Vycm9yICYmICFwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm9wZW4tZ3JvdXAgcGFuZWwtaGVhZGluZyBweS0wXCJcbiAgICAgICAgICAoY2xpY2spPVwicHJvcGVydHkuaXNPcGVuID0gIXByb3BlcnR5LmlzT3BlblwiIHBvaW50ZXJcbiAgICAgICAgICBbY2xhc3MuaXMtb3Blbl09XCJwcm9wZXJ0eS5pc09wZW5cIlxuICAgICAgICAgIFtjbGFzcy5oYXMtdGV4dC13aGl0ZV09XCIoZXJyb3JNb2RlICYmIHByb3BlcnR5LmNoYW5nZWQpIHx8IHByb3BlcnR5Lmhhc0Vycm9yIHx8IHByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbW9iaWxlIGlzLXZjZW50ZXJlZFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IHB5LTEgbXktMFwiPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXByb3BlcnR5LmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJwcm9wZXJ0eS5pc09wZW5cIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbiBweS0xIG15LTBcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1zaXplLTZcIj57e3Byb3BlcnR5LmtleX19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwcm9wZXJ0eS5zY2hlbWFUeXBlXCIgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IHB5LTEgbXktMFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZ3MgbWItMCBoYXMtYWRkb25zXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgbWItMCBpcy1saWdodFwiPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgbWItMCBpcy13aGl0ZVwiPlxuICAgICAgICAgICAgICAgICAgPGhlLXNjaGVtYS12ZXJzaW9uLWxpbmsgbGlua0NsYXNzPVwiaXMtc21hbGxcIiBbbm9kZV09XCJ7J0B0eXBlJzogcHJvcGVydHkuc2NoZW1hVHlwZX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3twcm9wZXJ0eS5zY2hlbWFUeXBlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2hlLXNjaGVtYS12ZXJzaW9uLWxpbms+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8aGUtcG9wb3Zlci1jb25maXJtIGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBweS0xIG15LTAgcHgtMFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiZWRpdGFibGUgJiYgIWVycm9yc0VkaXRhYmxlXCJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlJlbW92ZSBncm91cFwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgIFttZXNzYWdlXT1cIic8cD5UaGlzIHdpbGwgcmVtb3ZlIHRoZSBncm91cCBjb21wbGV0ZWx5LjwvcD4nICsgKHByb3BlcnR5LmlzUmVxdWlyZWQgPyAnPHA+PHU+V2FybmluZzogdGhpcyBmaWVsZCBpcyByZXF1aXJlZC48L3U+PC9wPicgOiAnJykgKyAnPHA+RG8geW91IGNvbmZpcm0/PC9wPidcIlxuICAgICAgICAgICAgICBwb3BvdmVyQ2xhc3M9XCJweC0zXCJcbiAgICAgICAgICAgICAgKGNvbmZpcm1lZCk9XCJwcm9wZXJ0eUNoYW5nZWQobnVsbCwgcHJvcGVydHkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInRpbWVzXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9oZS1wb3BvdmVyLWNvbmZpcm0+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYmxvY2sgaXMtYmxvY2sgcC0wXCIgKm5nSWY9XCJwcm9wZXJ0eS5pc09wZW5cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwcm9wZXJ0eS5pc0FycmF5XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMyBwdC00XCIgKm5nSWY9XCJwcm9wZXJ0eS5lcnJvclwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlFcnJvcjsgY29udGV4dDoge3Byb3BlcnR5OiBwcm9wZXJ0eSwgZWRpdDogdHJ1ZX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImhlbHAgcHktMSBweC0yXCIgKm5nSWY9XCJlZGl0YWJsZSAmJiAhcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICBUbyBjaGFuZ2UgdGhlIHt7cHJvcGVydHkua2V5fX0sIHBsZWFzZSBkZWxldGUgaXQgZmlyc3QsIHRoZW4gYWRkIHRoZSBmaWVsZCBhZ2FpblxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInByb3BlcnR5LnNjaGVtYT8udGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGVscCBweS0xIHB4LTJcIiAqbmdTd2l0Y2hDYXNlPVwiJ0JpYmxpb2dyYXBoeSdcIj5cbiAgICAgICAgICAgICAgICAgICAgU2VhcmNoIGJ5IFRpdGxlIG9yIERvY3VtZW50IERPSSB0byBhdXRvLXBvcHVsYXRlIHRoZSBmaWVsZHMgdXNpbmcgdGhlIE1lbmRlbGV5IGNhdGFsb2d1ZVxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd05ld1Byb3BlcnR5OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMyBtdC0xXCIgKm5nSWY9XCJlcnJvcnNFZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlRXJyb3JGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwIHB5LTIgcHgtMyBtdC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbXVsdGlsaW5lIG1iLTBcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3AyIG9mIHByb3BlcnR5LnByb3BlcnRpZXM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wZXJ0eVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2hvd1Byb3BlcnR5OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wMn1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMiBweC0zIG10LTJcIiAqbmdTd2l0Y2hDYXNlPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiICpuZ0lmPVwiZXJyb3JzRWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3AyIG9mIHByb3BlcnR5LnByb3BlcnRpZXM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wZXJ0eVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHAtMCBteS00XCIgKm5nSWY9XCJwcm9wMi5rZXlcIlxuICAgICAgICAgICAgICAgICAgW2lkXT1cInByb3AyLmZ1bGxLZXkgKyAnXycgKyBwcm9wMi5pZFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWFycmF5LW51bWJlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFncyBoYXMtYWRkb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgaXMtZGFya1wiPnt7cHJvcDIua2V5fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmICFlcnJvcnNFZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgaXMtaW5mb1wiIHBvaW50ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImR1cGxpY2F0ZUFycmF5R3JvdXAocHJvcGVydHksIHByb3AyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cIignRHVwbGljYXRlICcgKyBwcm9wZXJ0eS5rZXkpIHwgcGx1cmFsaXplOjFcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiY2xvbmVcIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBpcy1saWdodFwiIHBvaW50ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9wMi5rZXkgIT09ICcwJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlQXJyYXlHcm91cFVwKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiTW92ZSBVcFwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJsb25nLWFycm93LWFsdC11cFwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWxpZ2h0XCIgcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb3AyLmtleSAhPT0gcHJvcGVydHkucHJvcGVydGllcy5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnJheUdyb3VwRG93bihwcm9wZXJ0eSwgcHJvcDIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIk1vdmUgRG93blwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJsb25nLWFycm93LWFsdC1kb3duXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGhlLXBvcG92ZXItY29uZmlybSBjbGFzcz1cInRhZyBpcy1kZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiVG9vbHRpcF09XCIoJ1JlbW92ZSAnICsgcHJvcGVydHkua2V5KSB8IHBsdXJhbGl6ZToxXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1cIlRoaXMgd2lsbCByZW1vdmUgdGhlIGdyb3VwIGNvbXBsZXRlbHkuIERvIHlvdSBjb25maXJtP1wiIHBvc2l0aW9uPVwicmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZmlybWVkKT1cInJlbW92ZUFycmF5R3JvdXAocHJvcGVydHksIHByb3AyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9oZS1wb3BvdmVyLWNvbmZpcm0+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AyfVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNCBtdC0yXCIgKm5nSWY9XCJlcnJvcnNFZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm9kZUVycm9yRm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcDJ9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgbXQtMlwiICpuZ0lmPVwicHJvcDIuZXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInByb3BlcnR5RXJyb3I7IGNvbnRleHQ6IHtwcm9wZXJ0eTogcHJvcDIsIGVkaXQ6IHRydWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnR5LWdyb3VwIGNhcmQtY29udGVudCBwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbXVsdGlsaW5lIG15LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wMyBvZiBwcm9wMi5wcm9wZXJ0aWVzOyB0cmFja0J5OiB0cmFja0J5UHJvcGVydHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgIWVycm9yc0VkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1pbmZvIGlzLXNtYWxsXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQXJyYXlHcm91cChwcm9wZXJ0eSlcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0xXCI+e3twcm9wZXJ0eS5rZXkgfCBwbHVyYWxpemU6MX19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgPGhlLW5vZGUtcmVjb21tZW5kYXRpb25zIGJ1dHRvbkNsYXNzPVwiaXMtc21hbGxcIlxuICAgICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiIFtub2RlRmllbGRdPVwicHJvcGVydHkua2V5XCJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RSZWNvbW1lbmRhdGlvbik9XCJvblNlbGVjdFJlY29tbWVuZGF0aW9uKHByb3BlcnR5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICA+PC9oZS1ub2RlLXJlY29tbWVuZGF0aW9ucz5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2lucHV0Rm9ybSBsZXQtcHJvcGVydHk+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wZXJ0eS5rZXlcIj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwcm9wZXJ0eS5zdWdnZXN0aW9ucz8udHlwZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3NlbGVjdCdcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0U2VsZWN0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRJbnB1dDsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2lucHV0SW5wdXQgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiZmllbGQgbWItMFwiIFtjbGFzcy5oYXMtYWRkb25zXT1cImhhc0FkZG9ucyhwcm9wZXJ0eSlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiXG4gICAgICBbY2xhc3MuaGFzLWljb25zLXJpZ2h0XT1cInByb3BlcnR5LmxvYWRpbmdcIlxuICAgID5cbiAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0IGlzLXNtYWxsIHNlYXJjaC1pbnB1dFwiXG4gICAgICAgIFtjbGFzcy5pcy1kYXJrXT1cInByb3BlcnR5LmtleSA9PT0gJ3R5cGUnXCJcbiAgICAgICAgW2NsYXNzLmlzLXNlY29uZGFyeV09XCJlcnJvck1vZGUgJiYgcHJvcGVydHkuY2hhbmdlZFwiXG4gICAgICAgIFtjbGFzcy5pcy1kYW5nZXJdPVwiKCFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc0Vycm9yKSB8fCBpc1JlcXVpcmVkKHByb3BlcnR5KVwiXG4gICAgICAgIFtjbGFzcy5pcy13YXJuaW5nXT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuXG4gICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHkudmFsdWVcIiAjcHJvcGVydHlNb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICBbdHlwZV09XCJwcm9wZXJ0eS5zY2hlbWE/LnR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiAnc3RyaW5nJ1wiXG4gICAgICAgIFtpZF09XCJwcm9wZXJ0eS5pZFwiXG4gICAgICAgIG5hbWU9XCJyYW5kb21uYW1lXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cIiFlZGl0YWJsZSB8fCAhcHJvcGVydHkuZWRpdGFibGUgfHwgcHJvcGVydHkuc2NoZW1hPy5pbnRlcm5hbFwiXG4gICAgICAgIFtwbGFjZWhvbGRlcl09XCJwcm9wZXJ0eS5wbGFjZWhvbGRlclwiXG4gICAgICAgIFthcHBUYWdzSW5wdXRdPVwie2VuYWJsZWQ6IGVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlICYmIHByb3BlcnR5LnNjaGVtYT8udHlwZSA9PT0gJ2FycmF5JywgaXRlbXM6IHByb3BlcnR5LnNjaGVtYT8uaXRlbXMsIGRlbGltaXRlcjogJzsnLCBhbGxvd0R1cGxpY2F0ZXM6IHRydWUsIHBsYWNlaG9sZGVyOiBwcm9wZXJ0eS5wbGFjZWhvbGRlcn1cIlxuICAgICAgICAoY2hhbmdlKT1cInByb3BlcnR5Q2hhbmdlZCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eSlcIlxuXG4gICAgICAgIFtwYXR0ZXJuXT1cInByb3BlcnR5LnNjaGVtYT8ucGF0dGVyblwiXG4gICAgICAgIFtyZXF1aXJlZF09XCJwcm9wZXJ0eS5mdWxsS2V5LmVuZHNXaXRoKCdpZCcpICYmIHByb3BlcnR5LmZ1bGxLZXkgIT09ICdpZCdcIlxuICAgICAgICBbbWluXT1cInByb3BlcnR5LnNjaGVtYT8ubWluaW11bVwiXG4gICAgICAgIFttYXhdPVwicHJvcGVydHkuc2NoZW1hPy5tYXhpbXVtXCJcblxuICAgICAgICBbbmdiVHlwZWFoZWFkXT1cInByb3BlcnR5IHwgYXBwbHlQdXJlOnByb3BlcnR5U3VnZ2VzdFwiXG4gICAgICAgIFtyZXN1bHRUZW1wbGF0ZV09XCJzdWdnZXN0aW9uXCJcbiAgICAgICAgW2lucHV0Rm9ybWF0dGVyXT1cInByb3BlcnR5LmZvcm1hdHRlclwiXG4gICAgICAgIFtmb2N1c0ZpcnN0XT1cInRydWVcIlxuICAgICAgICAoZm9jdXMpPVwiZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgdHlwZWFoZWFkRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgIChzZWxlY3RJdGVtKT1cInN1Z2dlc3Rpb25TZWxlY3RlZCgkZXZlbnQuaXRlbSwgcHJvcGVydHkpXCJcbiAgICAgID5cblxuICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsIGlzLXJpZ2h0IGhhcy10ZXh0LWdyZXktZGFya1wiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIXByb3BlcnR5LmxvYWRpbmdcIj5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cInNwaW5uZXJcIiBbcHVsc2VdPVwidHJ1ZVwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPHAgY2xhc3M9XCJoZWxwIGlzLWRhbmdlci1saWdodFwiXG4gICAgKm5nSWY9XCIhcHJvcGVydHkuaGFzRXJyb3IgJiYgcHJvcGVydHlNb2RlbC5pbnZhbGlkXCJcbiAgPlxuICAgIDxzcGFuICpiaW5kT25jZT1cInByb3BlcnR5TW9kZWwuZXJyb3JzXCIgW2lubmVySFRNTF09XCJmb3JtYXRQcm9wZXJ0eUVycm9yKHByb3BlcnR5TW9kZWwuZXJyb3JzLCBwcm9wZXJ0eSlcIj48L3NwYW4+XG4gIDwvcD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRTZWxlY3QgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiZmllbGQgbWItMFwiIFtjbGFzcy5oYXMtYWRkb25zXT1cImhhc0FkZG9ucyhwcm9wZXJ0eSlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbCBpcy1mdWxsd2lkdGhcIlxuICAgICAgICBbY2xhc3MuaXMtc2Vjb25kYXJ5XT1cImVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkXCJcbiAgICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIoIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzRXJyb3IpIHx8IGlzUmVxdWlyZWQocHJvcGVydHkpXCJcbiAgICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICA+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInByb3BlcnR5LnZhbHVlXCIgI3Byb3BlcnR5TW9kZWw9XCJuZ01vZGVsXCJcbiAgICAgICAgICBbaWRdPVwicHJvcGVydHkuaWRcIlxuICAgICAgICAgIG5hbWU9XCJyYW5kb21uYW1lXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRhYmxlIHx8ICFwcm9wZXJ0eS5lZGl0YWJsZSB8fCBwcm9wZXJ0eS5zY2hlbWE/LmludGVybmFsXCJcbiAgICAgICAgICAoY2hhbmdlKT1cInByb3BlcnR5Q2hhbmdlZCgkZXZlbnQudGFyZ2V0LnZhbHVlLCBwcm9wZXJ0eSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdDwvb3B0aW9uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwicHJvcGVydHkuc3VnZ2VzdGlvbnNcIj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHZhbHVlIG9mIHByb3BlcnR5LnN1Z2dlc3Rpb25zLnZhbHVlczsgdHJhY2tCeTogdHJhY2tCeUluZGV4XCIgW3ZhbHVlXT1cInZhbHVlXCI+e3t2YWx1ZX19PC9vcHRpb24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0QWRkb25zOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxwIGNsYXNzPVwiaGVscCBpcy1kYW5nZXItbGlnaHRcIlxuICAgICpuZ0lmPVwiIXByb3BlcnR5Lmhhc0Vycm9yICYmIHByb3BlcnR5TW9kZWwuaW52YWxpZFwiXG4gID5cbiAgICA8c3BhbiAqYmluZE9uY2U9XCJwcm9wZXJ0eU1vZGVsLmVycm9yc1wiIFtpbm5lckhUTUxdPVwiZm9ybWF0UHJvcGVydHlFcnJvcihwcm9wZXJ0eU1vZGVsLmVycm9ycywgcHJvcGVydHkpXCI+PC9zcGFuPlxuICA8L3A+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3JlbW92ZUZpZWxkQWRkb24gbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiIWVycm9yc0VkaXRhYmxlICYmICFwcm9wZXJ0eS5pc1JlcXVpcmVkXCI+XG4gICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIlJlbW92ZSBmaWVsZFwiXG4gICAgICBbY2xhc3MuaXMtb3V0bGluZWRdPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgKHByb3BlcnR5Lmhhc0Vycm9yIHx8IHByb3BlcnR5Lmhhc1dhcm5pbmcpXCJcbiAgICAgIFtjbGFzcy5pcy1kYW5nZXJdPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzRXJyb3JcIlxuICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBwcm9wZXJ0eUNoYW5nZWQobnVsbCwgcHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwidGltZXNcIj48L2ZhLWljb24+XG4gICAgPC9hPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRBZGRvbnMgbGV0LXByb3BlcnR5PlxuICA8bmctY29udGFpbmVyICpiaW5kT25jZT1cInByb3BlcnR5XCI+XG4gICAgPGhlLXBvcG92ZXItY29uZmlybSBjbGFzcz1cImNvbnRyb2xcIlxuICAgICAgKm5nSWY9XCJlbmFibGVBZGRFcnJvcihwcm9wZXJ0eSlcIlxuICAgICAgcG9zaXRpb249XCJsZWZ0XCJcbiAgICAgIFtjb250ZW50XT1cInBvcHVwRXJyb3JGb3JtXCJcbiAgICAgIChjb25maXJtZWQpPVwiYWRkRXJyb3IocHJvcGVydHksICRldmVudClcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCI+XG4gICAgICAgIDxmYS1pY29uIGljb249XCJjb21tZW50c1wiPjwvZmEtaWNvbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2hlLXBvcG92ZXItY29uZmlybT5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicHJvcGVydHkuc2NoZW1hVHlwZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJTY2hlbWFUeXBlLkFjdG9yXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdG9yQWRkb25zOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlNjaGVtYVR5cGUuQ3ljbGVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY3ljbGVBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwibWFwRHJhd2luZ01vZGVzKHByb3BlcnR5KS5sZW5ndGhcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiUGljayBvbiBNYXBcIlxuICAgICAgICAgIChjbGljayk9XCJtYXBEcmF3aW5nUHJvcGVydHkgPSBwcm9wZXJ0eVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwibWFwLW1hcmtlZC1hbHRcIj48L2ZhLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkocHJvcGVydHkpXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkFkdmFuY2VkIFNlYXJjaFwiXG4gICAgICAgICAgKGNsaWNrKT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkgPSBwcm9wZXJ0eVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwic2VhcmNoXCI+PC9mYS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicmVtb3ZlRmllbGRBZGRvbjsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiYWRkUHJvcGVydHlFbmFibGVkKHByb3BlcnR5KVwiPlxuICAgICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGwgaXMtZGFuZ2VyXCIgdGl0bGU9XCJBZGQgZmllbGRcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyBhZGRNaXNzaW5nUHJvcGVydHkocHJvcGVydHkpXCJcbiAgICAgID5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9mYS1pY29uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5BZGQ8L3NwYW4+XG4gICAgICA8L2E+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cImlzUmVxdWlyZWQocHJvcGVydHkpXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJidXR0b24gaXMtc21hbGwgaXMtZGFuZ2VyXCIgW2Zvcl09XCJwcm9wZXJ0eS5pZFwiXG4gICAgICAgIG5nYlRvb2x0aXA9XCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgID5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cImV4Y2xhbWF0aW9uLXRyaWFuZ2xlXCI+PC9mYS1pY29uPlxuICAgICAgPC9sYWJlbD5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvcGVydHkuZXh0ZXJuYWxVcmw/LnVybFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgIFtocmVmXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnVybCArIChwcm9wZXJ0eS5leHRlcm5hbFVybC51cmxQYXJhbVZhbHVlID8gcHJvcGVydHkudmFsdWUgOiAnJylcIlxuICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgW3RpdGxlXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnRpdGxlXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWluZm8nOiBwcm9wZXJ0eS5rZXkgPT09ICd0eXBlJ31cIlxuICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cInByb3BlcnR5LmV4dGVybmFsVXJsLnVybFBhcmFtVmFsdWUgJiYgIXByb3BlcnR5LnZhbHVlID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICA+XG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwuaWNvbiB8fCAnZXh0ZXJuYWwtbGluay1hbHQnXCI+PC9mYS1pY29uPlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidW5pdENvbnZlcnRlckVuYWJsZWQocHJvcGVydHkpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJPcGVuIGNhbGN1bGF0b3JcIlxuICAgICAgICAgIFtuZ2JQb3BvdmVyXT1cImNvbnZlcnRVbml0c1wiIGF1dG9DbG9zZT1cIm91dHNpZGVcIlxuICAgICAgICAgIHRyaWdnZXJzPVwibWFudWFsXCIgI3A9XCJuZ2JQb3BvdmVyXCIgcGxhY2VtZW50PVwiYm90dG9tXCIgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5Vbml0Q29udmVydGVyKHAsIHByb3BlcnR5KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiY2FsY3VsYXRvclwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FjdG9yQWRkb25zIGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ0BpZCdcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJBZGQgbXlzZWxmIGFzIEFjdG9yXCJcbiAgICAgIChjbGljayk9XCJzZXRVc2VyQWN0b3JJZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIFtpY29uXT1cIlsnZmFyJywgJ2lkLWJhZGdlJ11cIj48L2ZhLWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjeWNsZUFkZG9ucyBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJwcm9wZXJ0eS5rZXkgPT09ICdjeWNsZUR1cmF0aW9uJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkNhbGN1bGF0ZSB2YWx1ZSBmcm9tIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZVwiXG4gICAgICAoY2xpY2spPVwiY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbihwcm9wZXJ0eSlcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFjYWxjdWxhdGVDeWNsZUR1cmF0aW9uRW5hYmxlZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJjYWxjdWxhdG9yXCI+PC9mYS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ3N0YXJ0RGF0ZSdcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJDYWxjdWxhdGUgdmFsdWUgZnJvbSBlbmREYXRlIGFuZCBjeWNsZUR1cmF0aW9uXCJcbiAgICAgIChjbGljayk9XCJjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZShwcm9wZXJ0eSlcIlxuICAgICAgW2Rpc2FibGVkXT1cIiFjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBpY29uPVwiY2FsY3VsYXRvclwiPjwvZmEtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Nob3dOZXdQcm9wZXJ0eSBsZXQtcHJvcGVydHk+XG4gIDxoZWFkZXIgY2xhc3M9XCJjYXJkLWhlYWRlclwiICpuZ0lmPVwiZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgKHByb3BlcnR5LmFkZFByb3BlcnR5RW5hYmxlZCB8fCBkZWVwRWRpdGFibGUpOyBlbHNlIHBhZGRlclwiPlxuICAgIDxmb3JtIGNsYXNzPVwicHktMyBweC00IGlzLWZsZXgtZ3Jvdy0xXCIgKHN1Ym1pdCk9XCJhZGRQcm9wZXJ0eShwcm9wZXJ0eSlcIiBub3ZhbGlkYXRlPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGlzLWhvcml6b250YWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsIGlzLXNtYWxsXCIgKmJpbmRPbmNlPVwicHJvcGVydHlcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiIFtmb3JdPVwicHJvcGVydHkuaWQgKyAnX25ldydcIj5cbiAgICAgICAgICAgIDxzcGFuPkFkZCBuZXcgZmllbGQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1ib2R5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0IGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInByb3BlcnR5Lm5ld1Byb3BlcnR5XCJcbiAgICAgICAgICAgICAgICBbaWRdPVwicHJvcGVydHkuaWQgKyAnX25ldydcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJyYW5kb21uYW1lXCJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhbmQgc2VsZWN0IGZpZWxkIGZyb20gcmVzdWx0c1wiXG5cbiAgICAgICAgICAgICAgICBbbmdiVHlwZWFoZWFkXT1cInByb3BlcnR5IHwgYXBwbHlQdXJlOnN1Z2dlc3ROZXdQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgW3Jlc3VsdFRlbXBsYXRlXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICAgICAgICAgIFtpbnB1dEZvcm1hdHRlcl09XCJmb3JtYXROZXdQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgW2ZvY3VzRmlyc3RdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cInR5cGVhaGVhZEZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXByb3BlcnR5Lm5ld1Byb3BlcnR5IHx8ICFwcm9wZXJ0eS5uZXdQcm9wZXJ0eS5uYW1lXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJwbHVzXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkFkZDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG4gIDwvaGVhZGVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwcm9wZXJ0eUVycm9yIGxldC1wcm9wZXJ0eT1cInByb3BlcnR5XCIgbGV0LWVkaXQ9XCJlZGl0XCI+XG4gIDxwIGNsYXNzPVwiaGVscFwiXG4gICAgW2NsYXNzLmlzLWRhbmdlcl09XCJwcm9wZXJ0eS5oYXNFcnJvclwiXG4gICAgW2NsYXNzLmlzLXdhcm5pbmddPVwicHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgKm5nSWY9XCJwcm9wZXJ0eS5lcnJvclwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImlzLXByZS13cmFwXCIgKmJpbmRPbmNlPVwicHJvcGVydHkuZXJyb3JcIiBbaW5uZXJIVE1MXT1cInByb3BlcnR5LmVycm9yLm1lc3NhZ2VcIj48L3NwYW4+XG4gICAgPGEgY2xhc3M9XCJwbC0yXCJcbiAgICAgICpuZ0lmPVwiZWRpdCAmJiBlcnJvcnNFZGl0YWJsZSAmJiBwcm9wZXJ0eS5lcnJvci5pbmRleCA+PSAwXCJcbiAgICAgIChjbGljayk9XCJlZGl0RXJyb3IocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBjbGFzcz1cInByLTJcIiBpY29uPVwiZWRpdFwiPjwvZmEtaWNvbj5cbiAgICAgIDxzcGFuPkVkaXQ8L3NwYW4+XG4gICAgPC9hPlxuICAgIDxhIGNsYXNzPVwicGwtMlwiXG4gICAgICAqbmdJZj1cIihwcm9wZXJ0eS5oYXNXYXJuaW5nIHx8IGVycm9yc0VkaXRhYmxlKSAmJiBwcm9wZXJ0eS5lcnJvci5pbmRleCA+PSAwXCJcbiAgICAgIChjbGljayk9XCJyZXNvbHZlRXJyb3IocHJvcGVydHkpXCJcbiAgICA+XG4gICAgICA8ZmEtaWNvbiBjbGFzcz1cInByLTJcIiBpY29uPVwiY2hlY2tcIj48L2ZhLWljb24+XG4gICAgICA8c3Bhbj5SZXNvbHZlZDwvc3Bhbj5cbiAgICA8L2E+XG4gIDwvcD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcHJvcGVydHlNYXAgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwicGFuZWwgaXMtZGVmYXVsdFwiICpuZ0lmPVwic2hvd01hcFwiPlxuICAgIDxkaXYgY2xhc3M9XCJvcGVuLWdyb3VwIHBhbmVsLWhlYWRpbmcgcHktMFwiXG4gICAgICAoY2xpY2spPVwibWFwVmlzaWJsZSA9ICFtYXBWaXNpYmxlXCIgcG9pbnRlclxuICAgICAgW2NsYXNzLmlzLW9wZW5dPVwibWFwVmlzaWJsZVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtbW9iaWxlIGlzLXZjZW50ZXJlZCBtYi0wXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvdyBweS0xIG15LTBcIj5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtZG93blwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIW1hcFZpc2libGVcIj48L2ZhLWljb24+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cImFuZ2xlLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJtYXBWaXNpYmxlXCI+PC9mYS1pY29uPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uIHB5LTEgbXktMFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtc2l6ZS02XCI+VmlldyBvbiBNYXA8L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ibG9jayBpcy1ibG9jayBwLTBcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFtYXBWaXNpYmxlXCI+XG4gICAgICA8aGUtc2l0ZXMtbWFwcyBbc2l0ZXNdPVwiW25vZGVdXCIgW3Nob3dOb3RpY2VdPVwiZmFsc2VcIj48L2hlLXNpdGVzLW1hcHM+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNub2RlRXJyb3JGb3JtIGxldC1wcm9wZXJ0eT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5Lm5ld0Vycm9yICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtc21hbGxcIj5cbiAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwicHJvcGVydHkubmV3RXJyb3IubGV2ZWxcIj5cbiAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInVuZGVmaW5lZFwiPlNlbGVjdCBMZXZlbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVycm9yXCI+RXJyb3I8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuaW5nXCI+V2FybmluZzwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wgaXMtZXhwYW5kZWRcIj5cbiAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwidGV4dGFyZWEgaXMtc21hbGxcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHkubmV3RXJyb3IubWVzc2FnZVwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIG1lc3NhZ2UgaGVyZVwiXG4gICAgICAgICAgcm93cz1cIjFcIlxuICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFwcm9wZXJ0eS5uZXdFcnJvci5sZXZlbCB8fCAhcHJvcGVydHkubmV3RXJyb3IubWVzc2FnZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZEVycm9yKHByb3BlcnR5LCBwcm9wZXJ0eS5uZXdFcnJvcilcIlxuICAgICAgICA+XG4gICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9mYS1pY29uPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkFkZDwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3BvcHVwRXJyb3JGb3JtIGxldC1kYXRhPVwiZGF0YVwiPlxuICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9uc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0XCI+XG4gICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJkYXRhLmxldmVsXCI+XG4gICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidW5kZWZpbmVkXCI+U2VsZWN0IExldmVsPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVycm9yXCI+RXJyb3I8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwid2FybmluZ1wiPldhcm5pbmc8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXRcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImRhdGEubWVzc2FnZVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgeW91ciBtZXNzYWdlIGhlcmVcIlxuICAgICAgPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3VnZ2VzdGlvbiBsZXQtcj1cInJlc3VsdFwiIGxldC10PVwidGVybVwiPlxuICA8bmdiLWhpZ2hsaWdodFxuICAgIFt0aXRsZV09XCJyLmJpYmxpb2dyYXBoeT8udGl0bGUgfHwgci5iaWJsaW9ncmFwaHk/LmRvY3VtZW50RE9JIHx8IHIuYmlibGlvZ3JhcGh5Py5zY29wdXMgfHwgci5uYW1lXCJcbiAgICBbcmVzdWx0XT1cInIuYmlibGlvZ3JhcGh5Py50aXRsZSB8fCByLmJpYmxpb2dyYXBoeT8uZG9jdW1lbnRET0kgfHwgci5iaWJsaW9ncmFwaHk/LnNjb3B1cyB8fCByLm5hbWVcIlxuICAgIFt0ZXJtXT1cInRcIlxuICA+PC9uZ2ItaGlnaGxpZ2h0PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwYWRkZXI+XG4gIDxkaXYgY2xhc3M9XCJwdC0xXCI+PC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnZlcnRVbml0cyBsZXQtdmFsdWU9XCJ2YWx1ZVwiIGxldC10ZXJtPVwidGVybVwiIGxldC11bml0cz1cInVuaXRzXCI+XG4gIDxoZS11bml0LWNvbnZlcnRlciBbdmFsdWVdPVwidmFsdWVcIiBbdGVybV09XCJ0ZXJtXCIgW3RvVW5pdHNdPVwidW5pdHNcIj48L2hlLXVuaXQtY29udmVydGVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
504
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZXMvZmlsZXMtZm9ybS9maWxlcy1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFDN0IsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFDO0FBQzdCLE9BQU8sRUFBc0IsVUFBVSxFQUFFLFFBQVEsRUFBa0MsTUFBTSxzQkFBc0IsQ0FBQztBQUVoSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsT0FBTyxFQUVMLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUN4QyxxQkFBcUIsRUFDckMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUNsRCxvQkFBb0IsRUFBRSx1QkFBdUIsRUFBRSxjQUFjLEVBQzdELFlBQVksRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQ2pILDZCQUE2QixFQUFFLHNCQUFzQixFQUNyRCw4QkFBOEIsRUFBRSx1QkFBdUIs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cEMsS0FBSztnQkFJRSxXQUFXO3NCQURsQixNQUFNO2dCQUdDLGlCQUFpQjtzQkFEeEIsTUFBTTtnQkFHQyxjQUFjO3NCQURyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY29tcGxleGl0eSAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgbWVyZ2VNYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xuaW1wb3J0IHNldCBmcm9tICdsb2Rhc2guc2V0JztcbmltcG9ydCB7IEpTT04gYXMgSGVzdGlhSnNvbiwgU2NoZW1hVHlwZSwgTm9kZVR5cGUsIEJpYmxpb2dyYXBoeSwgU291cmNlLCBQcm9wZXJ0eSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IGRlZmluaXRpb25zLCBkZWZpbml0aW9uIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9qc29uLXNjaGVtYSc7XG5pbXBvcnQgeyBpc0VtcHR5IH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5cbmltcG9ydCB7XG4gIElFcnJvclByb3BlcnR5LCBJTm9kZVByb3BlcnR5LFxuICBmb3JtYXRQcm9wZXJ0eUVycm9yLCBwcm9wZXJ0eUVycm9yLCBoYXNFcnJvciwgaGFzV2FybmluZyxcbiAgc3VnZ2VzdGlvblR5cGUsIGRlZmF1bHRTdWdnZXN0aW9uVHlwZSxcbiAgcmVjdXJzaXZlUHJvcGVydGllcywgdHlwZVRvTmV3UHJvcGVydHksIHByb3BlcnR5SWQsXG4gIGlzQWRkUHJvcGVydHlFbmFibGVkLCBub2RlQXZhaWxhYmxlUHJvcGVydGllcywgc29ydFByb3BlcnRpZXMsXG4gIGdyb3VwQ2hhbmdlZCwgcGFyZW50UHJvcGVydHksIHNpYmxpbmdQcm9wZXJ0eSwgdXBkYXRlUHJvcGVydGllcywgcmVmcmVzaFByb3BlcnR5S2V5cywga2V5VG9EYXRhUGF0aCwgZmluZFByb3BlcnR5LFxuICBjYWxjdWxhdGVDeWNsZUR1cmF0aW9uRW5hYmxlZCwgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbixcbiAgY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkLCBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZSwgcGFyc2VOZXdWYWx1ZSwgZm9ybWF0dGVyLCBJTmV3UHJvcGVydHlcbn0gZnJvbSAnLi4vZmlsZXMtZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBJVmFsaWRhdGlvbkVycm9yLCBlcnJvckhhc0Vycm9yLCBlcnJvckhhc1dhcm5pbmcsIGZpbHRlckVycm9yLCBmb3JtYXRFcnJvciB9IGZyb20gJy4uL2ZpbGVzLWVycm9yLm1vZGVsJztcbmltcG9ydCB7IEhlVXNlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXNlcnMvdXNlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBIZVNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWF0Y2hUeXBlLCBtYXRjaFBocmFzZVF1ZXJ5LCBtYXRjaFBocmFzZVByZWZpeFF1ZXJ5LCBtYXRjaEJvb2xQcmVmaXhRdWVyeSB9IGZyb20gJy4uLy4uL3NlYXJjaC9zZWFyY2gubW9kZWwnO1xuaW1wb3J0IHsgc2FmZUpTT05QYXJzZSwgY29weU9iamVjdCB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5cbmNvbnN0IE1JTl9UWVBFQUhFQURfTEVOR1RIID0gMjtcbmNvbnN0IHBvcHVsYXRlVGVybUZpZWxkcyA9IFtcbiAgJ3Rlcm1UeXBlJywgJ3VuaXRzJ1xuXTtcbmNvbnN0IHBvcHVsYXRlVGVybURlZmF1bHRQcm9wZXJ0aWVzID0gW1xuICAnZGVmYXVsdFByb3BlcnRpZXMudGVybS5uYW1lJywgJ2RlZmF1bHRQcm9wZXJ0aWVzLnRlcm0udW5pdHMnLCAnZGVmYXVsdFByb3BlcnRpZXMudmFsdWUnXG5dO1xuXG5jb25zdCBmb3JtYXRQcm9wZXJ0eSA9IChwcm9wOiBQcm9wZXJ0eSkgPT4gKHtcbiAgJ0B0eXBlJzogU2NoZW1hVHlwZS5Qcm9wZXJ0eSxcbiAgLi4ucHJvcCxcbiAgdGVybToge1xuICAgICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sXG4gICAgLi4ucHJvcC50ZXJtXG4gIH1cbn0pO1xuXG5jb25zdCBmb3JtYXRTdWdnZXN0aW9uID0gKHsgZGVmYXVsdFByb3BlcnRpZXMsIC4uLm5vZGUgfTogYW55KSA9PiAoe1xuICAuLi5ub2RlLFxuICAuLi4oZGVmYXVsdFByb3BlcnRpZXM/Lmxlbmd0aCA/IHsgZGVmYXVsdFByb3BlcnRpZXM6IGRlZmF1bHRQcm9wZXJ0aWVzLm1hcChmb3JtYXRQcm9wZXJ0eSkgfSA6IHt9KVxufSk7XG5cbmNvbnN0IGZvcm1hdExpbmtOb2Rlc1ByZWZpeCA9ICdMaW5rIHdpdGgnO1xuXG4vLyBwYXRjaCBlcnJvciB3aGVuIGxpbmsgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5XG5jb25zdCBjbGVhbk5ld1ZhbHVlID0gdmFsdWUgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5pZFxuICAgID8geyAuLi52YWx1ZSwgaWQ6IGNsZWFuTmV3VmFsdWUodmFsdWUuaWQpIH1cbiAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcbiAgICA/IHZhbHVlLnN0YXJ0c1dpdGgoZm9ybWF0TGlua05vZGVzUHJlZml4KVxuICAgID8gdmFsdWUuc3BsaXQoJzonKVsxXS50cmltKClcbiAgICA6IHZhbHVlXG4gICAgOiB2YWx1ZTtcblxuY29uc3QgZm9ybWF0TGlua05vZGVzU3VnZ2VzdGlvbnMgPSAobm9kZU1hcDogeyBbdHlwZSBpbiBOb2RlVHlwZV0/OiBzdHJpbmdbXSB9LCB0eXBlOiBOb2RlVHlwZSkgPT5cbiAgKG5vZGVNYXBbdHlwZV0gfHwgW10pLm1hcChpZCA9PiAoeyB0eXBlLCBpZCwgbmFtZTogYCR7Zm9ybWF0TGlua05vZGVzUHJlZml4fSAke3R5cGV9OiAke2lkfWAgfSkpO1xuXG50eXBlIHN1Z2dlc3RGdW5jID0gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+IE9ic2VydmFibGU8YW55W10+O1xuXG5jb25zdCBpbnNlcnRQcm9wZXJ0eSA9IChwcm9wZXJ0aWVzOiBJTm9kZVByb3BlcnR5W10sIGtleTogc3RyaW5nLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4ge1xuICBjb25zdCBleGlzdGluZ1Byb3BlcnR5SW5kZXggPSBwcm9wZXJ0aWVzLmZpbmRJbmRleCh2ID0+IHYuZnVsbEtleSA9PT0ga2V5KTtcbiAgZXhpc3RpbmdQcm9wZXJ0eUluZGV4ID49IDAgPyAocHJvcGVydGllc1tleGlzdGluZ1Byb3BlcnR5SW5kZXhdID0gcHJvcGVydHkpIDogcHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTtcbiAgcHJvcGVydGllcy5zb3J0KHNvcnRQcm9wZXJ0aWVzKTtcbiAgcmV0dXJuIHByb3BlcnRpZXM7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1maWxlcy1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGVzLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlcy1mb3JtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRmlsZXNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgcHJpdmF0ZSBzY2hlbWFzPzogZGVmaW5pdGlvbnM7XG4gIEBJbnB1dCgpXG4gIHByaXZhdGUgZXJyb3JzOiBJVmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgQElucHV0KClcbiAgcHVibGljIG5vZGU/OiBIZXN0aWFKc29uPFNjaGVtYVR5cGU+O1xuICBASW5wdXQoKVxuICBwdWJsaWMgbm9kZU1hcDogeyBbdHlwZSBpbiBOb2RlVHlwZV0/OiBzdHJpbmdbXSB9ID0ge307XG4gIC8qKlxuICAgKiBBbGxvdyBlZGl0aW5nIG5vZGVzIChgZmFsc2VgIGZvciByZWFkb25seSkuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZWRpdGFibGUgPSBmYWxzZTtcbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yTW9kZSA9IGZhbHNlO1xuICBASW5wdXQoKVxuICBwdWJsaWMgZGVlcEVkaXRhYmxlID0gdHJ1ZTtcbiAgLyoqXG4gICAqIENhbiBlZGl0IGVycm9ycy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlcnJvcnNFZGl0YWJsZSA9IGZhbHNlO1xuICAvKipcbiAgICogV2hlbiBzZWxlY3RpbmcgdGVybXMsIHdpbGwgc2hvdyBkZWZhdWx0IHByb3BlcnRpZXMgb3Igbm90LlxuICAgKiBTaG91bGQgYmUgYGZhbHNlYCB3aGVuIHVzaW5nIHNjaGVtYSB2YWxpZGF0aW9uLCBhcyBvbmx5IHRoZSBgbmFtZWAgd291bGQgYmUgYWRkZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvd1N1Z2dlc3RlZERlZmF1bHRQcm9wZXJ0aWVzID0gdHJ1ZTtcblxuICBAT3V0cHV0KClcbiAgcHJpdmF0ZSBub2RlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBrZXk6IHN0cmluZzsgdmFsdWU6IGFueSB9PigpO1xuICBAT3V0cHV0KClcbiAgcHJpdmF0ZSBub2RlRXJvcnJSZXNvbHZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KClcbiAgcHJpdmF0ZSBub2RlRXJyb3JBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8SVZhbGlkYXRpb25FcnJvcj4oKTtcblxuICBwdWJsaWMgTm9kZVR5cGUgPSBOb2RlVHlwZTtcbiAgcHVibGljIFNjaGVtYVR5cGUgPSBTY2hlbWFUeXBlO1xuICBwdWJsaWMgaXNPcGVuID0gdHJ1ZTtcbiAgcHVibGljIG1hcFZpc2libGUgPSBmYWxzZTtcbiAgcHVibGljIGZvcm1hdFByb3BlcnR5RXJyb3IgPSBmb3JtYXRQcm9wZXJ0eUVycm9yO1xuICBwdWJsaWMgbWFwRHJhd2luZ1Byb3BlcnR5PzogSU5vZGVQcm9wZXJ0eTtcbiAgcHVibGljIGJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHk/OiBJTm9kZVByb3BlcnR5O1xuICBwdWJsaWMgbm9kZVByb3BlcnR5PzogSU5vZGVQcm9wZXJ0eTtcbiAgcHVibGljIHByb3BlcnRpZXM6IElOb2RlUHJvcGVydHlbXSA9IFtdO1xuXG4gIHB1YmxpYyBzdWdnZXN0TmV3UHJvcGVydHkgPSAoeyBmdWxsS2V5IH06IElOb2RlUHJvcGVydHkpID0+ICh0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+KSA9PlxuICAgIHRleHQkLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKFxuICAgICAgICB0ZXJtID0+IG9mKHRoaXMubmV3UHJvcGVydGllcyhmaW5kUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBmdWxsS2V5KSB8fCB0aGlzLm5vZGVQcm9wZXJ0eSwgdGVybSkpXG4gICAgICApXG4gICAgKTtcbiAgcHVibGljIGZvcm1hdE5ld1Byb3BlcnR5ID0gKHsgbmFtZSB9OiBJTmV3UHJvcGVydHkpID0+IG5hbWU7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0RXhpc3RpbmdOb2RlID0gKHR5cGU6IE5vZGVUeXBlLCB0ZXJtOiBzdHJpbmcsIHVuaXF1ZUtleSA9ICdAaWQnKSA9PlxuICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgb2YoW10pIDpcbiAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdWdnZXN0KHRlcm0sIHR5cGUsIFtdLCB7XG4gICAgICAgIGJvb2w6IHtcbiAgICAgICAgICBtdXN0OiBbbWF0Y2hUeXBlKHR5cGUpXSxcbiAgICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICAgIG1hdGNoUGhyYXNlUXVlcnkodGVybSwgMTAwLCB1bmlxdWVLZXkpLFxuICAgICAgICAgICAgbWF0Y2hQaHJhc2VQcmVmaXhRdWVyeSh0ZXJtLCAyMCwgdW5pcXVlS2V5KSxcbiAgICAgICAgICAgIG1hdGNoQm9vbFByZWZpeFF1ZXJ5KHRlcm0sIDEwLCB1bmlxdWVLZXkpXG4gICAgICAgICAgXSxcbiAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaDogMVxuICAgICAgICB9XG4gICAgICB9LCAxMCwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcyk7XG5cbiAgcHJpdmF0ZSBzdWdnZXN0Tm9kZSA9ICh0eXBlOiBOb2RlVHlwZSwgc3VnZ2VzdERlZmF1bHQ/OiBzdWdnZXN0RnVuYykgPT4gKHRlcm06IHN0cmluZywgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+XG4gICAgKHByb3BlcnR5LnN1Z2dlc3Rpb25zPy5pc1VuaXF1ZUtleSA/IChcbiAgICAgIHRoaXMuc3VnZ2VzdEV4aXN0aW5nTm9kZSh0eXBlLCB0ZXJtLCBwcm9wZXJ0eS5zdWdnZXN0aW9ucy5pc1VuaXF1ZUtleSlcbiAgICApIDogKFxuICAgICAgcHJvcGVydHkuc3VnZ2VzdGlvbnM/LmlzTGlua05vZGUgP1xuICAgICAgICBvZihmb3JtYXRMaW5rTm9kZXNTdWdnZXN0aW9ucyh0aGlzLm5vZGVNYXAsIHR5cGUpKSA6IChcbiAgICAgICAgICBzdWdnZXN0RGVmYXVsdCA/IHN1Z2dlc3REZWZhdWx0KHRlcm0sIHByb3BlcnR5KSA6IG9mKFtdKVxuICAgICAgICApXG4gICAgKSkucGlwZShcbiAgICAgIG1hcCgocmVzOiBhbnkpID0+IHJlcy5tYXAoZm9ybWF0U3VnZ2VzdGlvbikpXG4gICAgKTtcblxuICBwcml2YXRlIHN1Z2dlc3Rlcjoge1xuICAgIFt0eXBlIGluIHN1Z2dlc3Rpb25UeXBlXT86IHN1Z2dlc3RGdW5jO1xuICB9ID0ge1xuICAgIGRlZmF1bHQ6ICh0ZXJtLCBwcm9wZXJ0eSkgPT4gb2YoXG4gICAgICAocHJvcGVydHk/LnN1Z2dlc3Rpb25zPy52YWx1ZXMgfHwgW10pXG4gICAgICAgIC5tYXAodiA9PiBgJHt2fWApXG4gICAgICAgIC5maWx0ZXIodiA9PiB2LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgLm1hcChuYW1lID0+ICh7IG5hbWUgfSkpXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuQWN0b3JdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkFjdG9yKSxcbiAgICBbTm9kZVR5cGUuQ3ljbGVdOiB0aGlzLnN1Z2dlc3ROb2RlKE5vZGVUeXBlLkN5Y2xlKSxcbiAgICBbTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudF06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCksXG4gICAgW05vZGVUeXBlLk9yZ2FuaXNhdGlvbl06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuT3JnYW5pc2F0aW9uKSxcbiAgICBbTm9kZVR5cGUuU2l0ZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU2l0ZSksXG4gICAgW05vZGVUeXBlLlNvdXJjZV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuU291cmNlLCAodGVybSwgeyBrZXkgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdFNvdXJjZSh0ZXJtLCA1LCBbYGJpYmxpb2dyYXBoeS4ke2tleX1gXSwgW2BiaWJsaW9ncmFwaHkuJHtrZXl9YF0pXG4gICAgKSxcbiAgICBbTm9kZVR5cGUuVGVybV06IHRoaXMuc3VnZ2VzdE5vZGUoTm9kZVR5cGUuVGVybSwgKHRlcm0sIHsgc3VnZ2VzdGlvbnMgfSkgPT5cbiAgICAgIHRlcm0ubGVuZ3RoIDwgTUlOX1RZUEVBSEVBRF9MRU5HVEggP1xuICAgICAgICBvZihbXSkgOlxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3VnZ2VzdCh0ZXJtLCBOb2RlVHlwZS5UZXJtLCBzdWdnZXN0aW9ucz8ucXVlcmllcyB8fCBbXSwgbnVsbCwgNSwgdGhpcy5zdWdnZXN0VGVybUZpZWxkcylcbiAgICApXG4gIH07XG4gIHB1YmxpYyBwcm9wZXJ0eVN1Z2dlc3QgPSAoeyBmdWxsS2V5LCBzdWdnZXN0aW9ucyB9OiBJTm9kZVByb3BlcnR5KSA9PiAodGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPikgPT5cbiAgICB0ZXh0JC5waXBlKFxuICAgICAgZGVib3VuY2VUaW1lKHN1Z2dlc3Rpb25zPy50eXBlID09PSBkZWZhdWx0U3VnZ2VzdGlvblR5cGUgPyAwIDogMzAwKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBtZXJnZU1hcCh0ZXJtID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBmaW5kUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBmdWxsS2V5KTtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5Py5lZGl0YWJsZSAmJiBzdWdnZXN0aW9ucz8udHlwZSBpbiB0aGlzLnN1Z2dlc3RlciA/XG4gICAgICAgICAgb2YodGVybSkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiBwcm9wZXJ0eS5sb2FkaW5nID0gdHJ1ZSksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zdWdnZXN0ZXJbc3VnZ2VzdGlvbnM/LnR5cGVdISh0ZXJtLCBwcm9wZXJ0eSkpLFxuICAgICAgICAgICAgdGFwKCgpID0+IHByb3BlcnR5LmxvYWRpbmcgPSBmYWxzZSlcbiAgICAgICAgICApIDpcbiAgICAgICAgICBvZihbXSk7XG4gICAgICB9KSxcbiAgICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBzZWFyY2hTZXJ2aWNlOiBIZVNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1c2Vyc1NlcnZpY2U6IEhlVXNlcnNTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29uc3Qgc2NoZW1hVHlwZSA9IHRoaXMubm9kZSEudHlwZSB8fCB0aGlzLm5vZGUhWydAdHlwZSddO1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hcyA/IHRoaXMuc2NoZW1hc1tzY2hlbWFUeXBlXSA6IHt9IGFzIGRlZmluaXRpb247XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5lcnJvcnMuZmlsdGVyKGZpbHRlckVycm9yKTtcbiAgICBjb25zdCBlcnJvciA9IHByb3BlcnR5RXJyb3IoZXJyb3JzKSgnJyk7XG4gICAgdGhpcy5ub2RlUHJvcGVydHkgPSB0aGlzLnNjaGVtYXMgPyB7XG4gICAgICBpZDogcHJvcGVydHlJZCgpLFxuICAgICAgc2NoZW1hLFxuICAgICAgc2NoZW1hVHlwZSxcbiAgICAgIGVkaXRhYmxlOiAhIXRoaXMubm9kZSEudHlwZSxcbiAgICAgIGZ1bGxLZXk6ICcnLFxuICAgICAga2V5OiAnJyxcbiAgICAgIHZhbHVlOiB7fSxcbiAgICAgIGVycm9yOiBmb3JtYXRFcnJvcihlcnJvciksXG4gICAgICBoYXNFcnJvcjogZXJyb3JIYXNFcnJvcihlcnJvciksXG4gICAgICBoYXNXYXJuaW5nOiBlcnJvckhhc1dhcm5pbmcoZXJyb3IpLFxuICAgICAgc3VnZ2VzdGlvbnM6IHt9LFxuICAgICAgbmV3UHJvcGVydHk6IHt9LFxuICAgICAgbmV3RXJyb3I6IHsgbGV2ZWw6ICd3YXJuaW5nJyB9LFxuICAgICAgcHJvcGVydGllczogW10sXG4gICAgICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IGlzQWRkUHJvcGVydHlFbmFibGVkKHRoaXMubm9kZSEsIHNjaGVtYVR5cGUsIHNjaGVtYSksXG4gICAgICBmb3JtYXR0ZXI6IGZvcm1hdHRlcignJylcbiAgICB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlY3Vyc2VyID0gcmVjdXJzaXZlUHJvcGVydGllcyh0aGlzLnNjaGVtYXMhLCBlcnJvcnMsIHNjaGVtYSwgdGhpcy5kZWVwRWRpdGFibGUpO1xuICAgIHRoaXMucHJvcGVydGllcyA9IHJlY3Vyc2VyKHRoaXMubm9kZSk7XG4gIH1cblxuICBwdWJsaWMgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIsIF92YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgcHVibGljIHRyYWNrQnlQcm9wZXJ0eShfaW5kZXg6IG51bWJlciwgeyBpZCwgZnVsbEtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFtmdWxsS2V5LCBpZF0uam9pbignXycpO1xuICB9XG5cbiAgcHVibGljIGhhc0FkZG9ucyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBwcm9wZXJ0eSAmJiAoXG4gICAgICB0aGlzLmVuYWJsZUFkZEVycm9yKHByb3BlcnR5KSB8fFxuICAgICAgKHRoaXMuZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUpIHx8XG4gICAgICB0aGlzLmFkZFByb3BlcnR5RW5hYmxlZChwcm9wZXJ0eSkgfHxcbiAgICAgIHRoaXMuaXNSZXF1aXJlZChwcm9wZXJ0eSkgfHxcbiAgICAgIHByb3BlcnR5LmV4dGVybmFsVXJsPy51cmwgfHxcbiAgICAgIHRoaXMubWFwRHJhd2luZ01vZGVzKHByb3BlcnR5KS5sZW5ndGggfHxcbiAgICAgIHRoaXMudW5pdENvbnZlcnRlckVuYWJsZWQocHJvcGVydHkpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1JlcXVpcmVkKHsgdmFsdWUsIGlzUmVxdWlyZWQgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIHJldHVybiBpc1JlcXVpcmVkICYmIGlzRW1wdHkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgc3VnZ2VzdFRlcm1GaWVsZHMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnBvcHVsYXRlVGVybUZpZWxkcyxcbiAgICAgIC4uLih0aGlzLnNob3dTdWdnZXN0ZWREZWZhdWx0UHJvcGVydGllcyA/IHBvcHVsYXRlVGVybURlZmF1bHRQcm9wZXJ0aWVzIDogW10pXG4gICAgXTtcbiAgfVxuXG4gIC8vIC0tLSBFcnJvcnNcblxuICBwdWJsaWMgZW5hYmxlQWRkRXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnNFZGl0YWJsZSAmJiAhcHJvcGVydHkuaGFzRXJyb3IgJiYgIXByb3BlcnR5Lmhhc1dhcm5pbmc7XG4gIH1cblxuICBwdWJsaWMgYWRkRXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHksIHsgbWVzc2FnZSwgbGV2ZWwgfTogSUVycm9yUHJvcGVydHkpIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5cyA9IHByb3BlcnR5LmZ1bGxLZXkuc3BsaXQoJy4nKTtcbiAgICBrZXlzLnBvcCgpO1xuICAgIGNvbnN0IGVycm9yOiBJVmFsaWRhdGlvbkVycm9yID0gcHJvcGVydHkuaXNBZGRlZCA/IHtcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBsZXZlbDogbGV2ZWwgfHwgJ2Vycm9yJyxcbiAgICAgIGRhdGFQYXRoOiBrZXlUb0RhdGFQYXRoKGtleXMuam9pbignLicpKSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBtaXNzaW5nUHJvcGVydHk6IHByb3BlcnR5LmtleVxuICAgICAgfVxuICAgIH0gOiB7XG4gICAgICBtZXNzYWdlLFxuICAgICAgbGV2ZWw6IGxldmVsIHx8ICdlcnJvcicsXG4gICAgICBkYXRhUGF0aDoga2V5VG9EYXRhUGF0aChwcm9wZXJ0eS5mdWxsS2V5KVxuICAgIH07XG4gICAgcHJvcGVydHkubmV3RXJyb3IgPSB7IGxldmVsOiAnd2FybmluZycgfTtcbiAgICBwcm9wZXJ0eS5lcnJvciA9IGVycm9yO1xuICAgIHByb3BlcnR5Lmhhc0Vycm9yID0gZXJyb3JIYXNFcnJvcihlcnJvcik7XG4gICAgcHJvcGVydHkuaGFzV2FybmluZyA9IGVycm9ySGFzV2FybmluZyhlcnJvcik7XG4gICAgdGhpcy5ub2RlRXJyb3JBZGRlZC5lbWl0KGVycm9yKTtcbiAgfVxuXG4gIHB1YmxpYyBlZGl0RXJyb3IocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBwcm9wZXJ0eS5uZXdFcnJvciA9IHByb3BlcnR5LmVycm9yO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmVFcnJvcihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gcHJvcGVydHkuZXJyb3I/LmluZGV4O1xuICAgIHByb3BlcnR5LmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHByb3BlcnR5Lmhhc0Vycm9yID0gaGFzRXJyb3IocHJvcGVydHkucHJvcGVydGllcyk7XG4gICAgcHJvcGVydHkuaGFzV2FybmluZyA9IGhhc1dhcm5pbmcocHJvcGVydHkucHJvcGVydGllcyk7XG4gICAgdGhpcy5ub2RlRXJvcnJSZXNvbHZlZC5lbWl0KGluZGV4KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkuZnVsbEtleSk7XG4gIH1cblxuICAvLyAtLS1cblxuICBwdWJsaWMgdHlwZWFoZWFkRm9jdXMoZTogRXZlbnQpIHtcbiAgICBpZiAoZS5idWJibGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dEV2ZW50ID0gbmV3IEV2ZW50KCdpbnB1dCcpO1xuICAgICAgZS50YXJnZXQ/LmRpc3BhdGNoRXZlbnQoaW5wdXRFdmVudCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwdWJsaWMgYWRkUHJvcGVydHlFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgIXRoaXMuZXJyb3JzRWRpdGFibGUgJiYgcHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdQcm9wZXJ0aWVzKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5LCBmaWVsZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IG5vZGVBdmFpbGFibGVQcm9wZXJ0aWVzKHRoaXMubm9kZSEsIHByb3BlcnR5KTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMocHJvcGVydGllcylcbiAgICAgIC5maWx0ZXIocHJvcCA9PiBwcm9wLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZmllbGQudG9Mb3dlckNhc2UoKSkpXG4gICAgICAubWFwKG5hbWUgPT4gKHsgbmFtZSwgcHJvcDogcHJvcGVydGllc1tuYW1lXSB9KSk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGRhdGE6IGFueSwgZWRpdGFibGU/OiBib29sZWFuLCByZXBsYWNlUGFyZW50ID0gdHJ1ZSkge1xuICAgIGNvbnN0IHBhcmVudCA9IHJlcGxhY2VQYXJlbnQgPyBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KSA6IHByb3BlcnR5O1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSByZWN1cnNpdmVQcm9wZXJ0aWVzKFxuICAgICAgdGhpcy5zY2hlbWFzISwgW10sIHRoaXMuc2NoZW1hcyFbdGhpcy5ub2RlIS50eXBlXSwgdGhpcy5kZWVwRWRpdGFibGUsIHBhcmVudC5mdWxsS2V5XG4gICAgKShkYXRhKTtcbiAgICB1cGRhdGVQcm9wZXJ0aWVzKHsgcHJvcGVydGllcyB9LCBwcm9wID0+IHtcbiAgICAgIHByb3AuZWRpdGFibGUgPSB0eXBlb2YgZWRpdGFibGUgPT09ICd1bmRlZmluZWQnID8gcHJvcC5lZGl0YWJsZSA6IGVkaXRhYmxlO1xuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gICAgcGFyZW50LmVkaXRhYmxlID0gdHlwZW9mIGVkaXRhYmxlID09PSAndW5kZWZpbmVkJyA/IHBhcmVudC5lZGl0YWJsZSA6IGVkaXRhYmxlO1xuICAgIHBhcmVudC5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcbiAgICBwYXJlbnQudmFsdWUgPSBkYXRhO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5Q2hhbmdlZChkYXRhLCBwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN1Z2dlc3Rpb25TZWxlY3RlZCh7ICdAaWQnOiBfaWQsIG5hbWUsIHR5cGUsIGlkLCAuLi5kYXRhIH0sIHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIF9pZCA/XG4gICAgICAvLyBzdWdnZXN0aW9ucyBmcm9tIGV4aXN0aW5nIG5vZGVzXG4gICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgJ0BpZCc6IF9pZCwgJ0B0eXBlJzogcHJvcGVydHkuc3VnZ2VzdGlvbnM/LnR5cGUsIG5hbWUsIC4uLmRhdGEgfSwgZmFsc2UpIDpcbiAgICAgIChcbiAgICAgICAgLy8gc3VnZ2VzdGlvbiBmcm9tIGxpbmtlZCBub2Rlc1xuICAgICAgICB0eXBlICYmIGlkID9cbiAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgdHlwZSwgaWQsIC4uLmRhdGEgfSwgdHJ1ZSkgOlxuICAgICAgICAgIC8vIHN1Z2dlc3Rpb24gYnkgbmFtZSA9PiBlbnVtIHZhbHVlc1xuICAgICAgICAgIHRoaXMucHJvcGVydHlDaGFuZ2VkKG5hbWUsIHByb3BlcnR5KVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRBcnJheUdyb3VwKGFycmF5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuc2NoZW1hcyFbYXJyYXkuc2NoZW1hVHlwZV07XG4gICAgY29uc3QgdmFsdWUgPSBnZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHR5cGVUb05ld1Byb3BlcnR5KFxuICAgICAgdGhpcy5zY2hlbWFzISwgcHJvcCwgcHJvcCwgdmFsdWUsIGAke2FycmF5LmZ1bGxLZXl9WyR7YXJyYXkucHJvcGVydGllcy5sZW5ndGh9XWBcbiAgICApO1xuICAgIGFycmF5LnByb3BlcnRpZXMucHVzaChuZXdQcm9wZXJ0eSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlZC5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgYXJyYXkuZnVsbEtleSk7XG4gIH1cblxuICBwdWJsaWMgZHVwbGljYXRlQXJyYXlHcm91cChhcnJheTogSU5vZGVQcm9wZXJ0eSwgcHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBpbmRleCA9ICtwcm9wZXJ0eS5rZXk7XG4gICAgY29uc3QgbmV3UHJvcGVydHk6IElOb2RlUHJvcGVydHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHByb3BlcnR5KSk7XG4gICAgbmV3UHJvcGVydHkuaWQgPSBwcm9wZXJ0eUlkKCk7XG4gICAgY29uc3QgdmFsdWUgPSBbLi4uZ2V0KHRoaXMubm9kZSwgYXJyYXkuZnVsbEtleSldO1xuICAgIHZhbHVlLnNwbGljZShpbmRleCwgMCwgc2FmZUpTT05QYXJzZShuZXdQcm9wZXJ0eS52YWx1ZSkpO1xuICAgIGFycmF5LnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAwLCBuZXdQcm9wZXJ0eSk7XG4gICAgLy8gbmVlZCB0byBjaGFuZ2Uga2V5IG9uIGV2ZXJ5IHByb3BlcnRpZXMgcmVjdXJzaXZlbHlcbiAgICByZWZyZXNoUHJvcGVydHlLZXlzKGFycmF5KTtcbiAgICB0aGlzLm5vZGVDaGFuZ2VkLmVtaXQoeyBrZXk6IGFycmF5LmZ1bGxLZXksIHZhbHVlIH0pO1xuICAgIHJldHVybiBncm91cENoYW5nZWQodGhpcy5wcm9wZXJ0aWVzLCBhcnJheS5mdWxsS2V5KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBcnJheUdyb3VwKGFycmF5OiBJTm9kZVByb3BlcnR5LCB7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgaW5kZXggPSAra2V5O1xuICAgIGNvbnN0IHZhbHVlID0gWy4uLmdldCh0aGlzLm5vZGUsIGFycmF5LmZ1bGxLZXkpXTtcbiAgICB2YWx1ZS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGFycmF5LnByb3BlcnRpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAvLyBuZWVkIHRvIGNoYW5nZSBrZXkgb24gZXZlcnkgcHJvcGVydGllcyByZWN1cnNpdmVseVxuICAgIHJlZnJlc2hQcm9wZXJ0eUtleXMoYXJyYXkpO1xuICAgIHRoaXMubm9kZUNoYW5nZWQuZW1pdCh7IGtleTogYXJyYXkuZnVsbEtleSwgdmFsdWUgfSk7XG4gICAgLy8gaWYgbm8gbW9yZSB2YWx1ZXMsIHJlbW92ZSBwYXJlbnQgZ3JvdXAgZW50aXJlbHlcbiAgICByZXR1cm4gYXJyYXkucHJvcGVydGllcy5sZW5ndGggPyBudWxsIDogdGhpcy5wcm9wZXJ0eUNoYW5nZWQobnVsbCwgYXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3ZlQXJyYXlHcm91cFRvUG9zaXRpb24oYXJyYXk6IElOb2RlUHJvcGVydHksIGN1cnJlbnRJbmRleDogbnVtYmVyLCBuZXdJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgdmFsdWUgPSBbLi4uZ2V0KHRoaXMubm9kZSwgYXJyYXkuZnVsbEtleSldO1xuICAgIG1vdmVJdGVtSW5BcnJheSh2YWx1ZSwgY3VycmVudEluZGV4LCBuZXdJbmRleCk7XG4gICAgbW92ZUl0ZW1JbkFycmF5KGFycmF5LnByb3BlcnRpZXMsIGN1cnJlbnRJbmRleCwgbmV3SW5kZXgpO1xuICAgIC8vIG5lZWQgdG8gY2hhbmdlIGtleSBvbiBldmVyeSBwcm9wZXJ0aWVzIHJlY3Vyc2l2ZWx5XG4gICAgcmVmcmVzaFByb3BlcnR5S2V5cyhhcnJheSk7XG4gICAgdGhpcy5ub2RlQ2hhbmdlZC5lbWl0KHsga2V5OiBhcnJheS5mdWxsS2V5LCB2YWx1ZSB9KTtcbiAgICByZXR1cm4gZ3JvdXBDaGFuZ2VkKHRoaXMucHJvcGVydGllcywgYXJyYXkuZnVsbEtleSk7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFycmF5R3JvdXBVcChhcnJheTogSU5vZGVQcm9wZXJ0eSwgeyBrZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gK2tleTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlQXJyYXlHcm91cFRvUG9zaXRpb24oYXJyYXksIGluZGV4LCBpbmRleCAtIDEpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBcnJheUdyb3VwRG93bihhcnJheTogSU5vZGVQcm9wZXJ0eSwgeyBrZXkgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGluZGV4ID0gK2tleTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlQXJyYXlHcm91cFRvUG9zaXRpb24oYXJyYXksIGluZGV4LCBpbmRleCArIDEpO1xuICB9XG5cbiAgcHVibGljIHByb3BlcnR5Q2hhbmdlZCh2YWx1ZTogYW55LCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGdyb3VwQ2hhbmdlZCh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LmZ1bGxLZXksIHZhbHVlKTtcbiAgICBwcm9wZXJ0eS5hZGRQcm9wZXJ0eUVuYWJsZWQgPSBpc0FkZFByb3BlcnR5RW5hYmxlZChcbiAgICAgIHRoaXMubm9kZSEsIHByb3BlcnR5LnNjaGVtYVR5cGUsIHByb3BlcnR5LnNjaGVtYSEsIHByb3BlcnR5LmZ1bGxLZXlcbiAgICApO1xuXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBwcm9wZXJ0eS52YWx1ZSA9IHZhbHVlO1xuICAgICAgcHJvcGVydHkuY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3VmFsdWUgPSBjbGVhbk5ld1ZhbHVlKHBhcnNlTmV3VmFsdWUocHJvcGVydHkuc2NoZW1hISwgdmFsdWUpKTtcbiAgICAvLyB0cmlnZ2VyIHJlZnJlc2ggb2Ygbm9kZVxuICAgIGNvbnN0IG5vZGUgPSBjb3B5T2JqZWN0KHRoaXMubm9kZSk7XG4gICAgc2V0KG5vZGUsIHByb3BlcnR5LmZ1bGxLZXksIG5ld1ZhbHVlKTtcbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICAgIC8vIHRyaWdnZXIgZm9yIGxpc3RlbmVyc1xuICAgIHRoaXMubm9kZUNoYW5nZWQuZW1pdCh7IGtleTogcHJvcGVydHkuZnVsbEtleSwgdmFsdWU6IG5ld1ZhbHVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWZhdWx0UHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHksIGtleTogc3RyaW5nLCBkZWY6IGRlZmluaXRpb24pIHtcbiAgICBjb25zdCBub2RlID0gcHJvcGVydHkua2V5ID8gZ2V0KHRoaXMubm9kZSwgcHJvcGVydHkuZnVsbEtleSkgOiB0aGlzLm5vZGU7XG4gICAgY29uc3QgZnVsbEtleSA9IHByb3BlcnR5LmtleSA/IGAke3Byb3BlcnR5LmZ1bGxLZXl9LiR7a2V5fWAgOiBrZXk7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IHByb3BlcnR5LmtleSA/IHByb3BlcnR5LnByb3BlcnRpZXMgOiB0aGlzLnByb3BlcnRpZXM7XG4gICAgY29uc3QgbmV3UHJvcGVydHkgPSB0eXBlVG9OZXdQcm9wZXJ0eSh0aGlzLnNjaGVtYXMhLCBkZWYsIHRoaXMuc2NoZW1hcyFbcHJvcGVydHkuc2NoZW1hVHlwZV0sIG5vZGUsIGZ1bGxLZXkpO1xuICAgIGluc2VydFByb3BlcnR5KHByb3BlcnRpZXMsIGZ1bGxLZXksIG5ld1Byb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQobmV3UHJvcGVydHkudmFsdWUsIG5ld1Byb3BlcnR5KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNaXNzaW5nUHJvcGVydHkocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICBjb25zdCBuZXdQcm9wZXJ0eSA9IHBhcmVudCA9PT0gcHJvcGVydHkgPyB0aGlzLm5vZGVQcm9wZXJ0eSEgOiBwYXJlbnQ7XG4gICAgY29uc3QgbmV3UHJvcGVydGllcyA9IHRoaXMubmV3UHJvcGVydGllcyhuZXdQcm9wZXJ0eSwgcHJvcGVydHkua2V5KTtcbiAgICBuZXdQcm9wZXJ0eS5uZXdQcm9wZXJ0eSA9IG5ld1Byb3BlcnRpZXNbMF07XG4gICAgcmV0dXJuIG5ld1Byb3BlcnR5Lm5ld1Byb3BlcnR5ID8gdGhpcy5hZGRQcm9wZXJ0eShuZXdQcm9wZXJ0eSkgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFkZFByb3BlcnR5KHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3QgeyBuYW1lLCBwcm9wIH0gPSBwcm9wZXJ0eS5uZXdQcm9wZXJ0eSE7XG4gICAgcHJvcGVydHkubmV3UHJvcGVydHkgPSB7fTtcbiAgICByZXR1cm4gbmFtZSA9PT0gJ0BpZCcgP1xuICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHByb3BlcnR5LCB7ICdAaWQnOiAnJywgdHlwZTogcHJvcGVydHkuc2NoZW1hVHlwZSB9LCB1bmRlZmluZWQsIGZhbHNlKSA6XG4gICAgICB0aGlzLmFkZERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eSwgbmFtZSEsIHByb3AhKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgdmFsdWU6IGdvb2dsZS5tYXBzLkxhdExuZ0xpdGVyYWwpIHtcbiAgICBjb25zdCBsYXRpdHVkZSA9IHNpYmxpbmdQcm9wZXJ0eSh0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5LCAnbGF0aXR1ZGUnKTtcbiAgICBjb25zdCBsb25naXR1ZGUgPSBzaWJsaW5nUHJvcGVydHkodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSwgJ2xvbmdpdHVkZScpO1xuICAgIHJldHVybiBbXG4gICAgICBsYXRpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxhdCwgbGF0aXR1ZGUpIDogbnVsbCxcbiAgICAgIGxvbmdpdHVkZSA/IHRoaXMucHJvcGVydHlDaGFuZ2VkKHZhbHVlLmxuZywgbG9uZ2l0dWRlKSA6IG51bGxcbiAgICBdO1xuICB9XG5cbiAgLy8gTWFwXG5cbiAgcHVibGljIGdldCBzaG93TWFwKCkge1xuICAgIHJldHVybiAoIXRoaXMuZWRpdGFibGUgfHwgdGhpcy5lcnJvck1vZGUpICYmIFtTY2hlbWFUeXBlLlNpdGUsIFNjaGVtYVR5cGUuT3JnYW5pc2F0aW9uXS5pbmNsdWRlcyh0aGlzLm5vZGUhLnR5cGUpO1xuICB9XG5cbiAgcHVibGljIG1hcERyYXdpbmdNb2Rlcyh7IGtleSB9OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIFsnYm91bmRhcnknXS5pbmNsdWRlcyhrZXkpID8gW1xuICAgICAgZ29vZ2xlLm1hcHMuZHJhd2luZy5PdmVybGF5VHlwZS5QT0xZR09OXG4gICAgXSA6IChbXG4gICAgICAnbGF0aXR1ZGUnLCAnbG9uZ2l0dWRlJ1xuICAgIF0uaW5jbHVkZXMoa2V5KSA/IFtcbiAgICAgIGdvb2dsZS5tYXBzLmRyYXdpbmcuT3ZlcmxheVR5cGUuTUFSS0VSXG4gICAgXSA6IFtdKTtcbiAgfVxuXG4gIHB1YmxpYyBvbk1hcERyYXdpbmdDbG9zZWQobmV3VmFsdWUpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5O1xuICAgIHRoaXMubWFwRHJhd2luZ1Byb3BlcnR5ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZSddLmluY2x1ZGVzKHByb3BlcnR5IS5rZXkpID9cbiAgICAgIHRoaXMudXBkYXRlUHJvcGVydHlDb29yZGluYXRlcyhwcm9wZXJ0eSEsIG5ld1ZhbHVlKSA6XG4gICAgICB0aGlzLnByb3BlcnR5Q2hhbmdlZChuZXdWYWx1ZSwgcHJvcGVydHkhKTtcbiAgfVxuXG4gIC8vIEJpYmxpb2dyYXBoeSBTZWFyY2hcblxuICBwdWJsaWMgYmlibGlvZ3JhcGhpZXNTZWFyY2hLZXkoeyBrZXksIHNjaGVtYVR5cGUgfTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbGlkU2NoZW1hID0gW1NjaGVtYVR5cGUuQmlibGlvZ3JhcGh5XS5pbmNsdWRlcyhzY2hlbWFUeXBlKTtcbiAgICBjb25zdCB2YWxpZUtleSA9IFsndGl0bGUnLCAnZG9jdW1lbnRET0knLCAnc2NvcHVzJ10uaW5jbHVkZXMoa2V5KTtcbiAgICByZXR1cm4gdmFsaWRTY2hlbWEgJiYgdmFsaWVLZXkgPyBrZXkgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCaWJsaW9ncmFwaHkodmFsdWU6IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIGNvbnN0IHBhcmVudCA9IHBhcmVudFByb3BlcnR5KHRoaXMucHJvcGVydGllcywgdGhpcy5iaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5ISk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoU291cmNlcyA/IHtcbiAgICAgIC4uLnBhcmVudC52YWx1ZSxcbiAgICAgIGJpYmxpb2dyYXBoeTogdmFsdWVcbiAgICB9IDogdmFsdWU7XG4gICAgdGhpcy5yZXBsYWNlUHJvcGVydHlEYXRhKHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEsIG5ld1ZhbHVlLCB0cnVlKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTb3VyY2UodmFsdWU6IFBhcnRpYWw8U291cmNlPikge1xuICAgIC8vIGNhbm5vdCByZXBsYWNlIGEgdG9wLWxldmVsIHNvdXJjZVxuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hTb3VyY2VzICYmIHRoaXMucmVwbGFjZVByb3BlcnR5RGF0YSh0aGlzLmJpYmxpb2dyYXBoaWVzU2VhcmNoUHJvcGVydHkhLCB7XG4gICAgICAnQHR5cGUnOiBOb2RlVHlwZS5Tb3VyY2UsXG4gICAgICAuLi52YWx1ZVxuICAgIH0sICEoJ0BpZCcgaW4gdmFsdWUpKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldCBiaWJsaW9ncmFwaGllc1NlYXJjaFNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSEuZnVsbEtleS5zcGxpdCgnLicpLmxlbmd0aCA+IDI7XG4gIH1cblxuICBwdWJsaWMgb25CaWJsaW9ncmFwaGllc1NlYXJjaENsb3NlZCh2YWx1ZT86IFBhcnRpYWw8U291cmNlPiB8IFBhcnRpYWw8QmlibGlvZ3JhcGh5Pikge1xuICAgIHRoaXMuYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSA9IHZhbHVlID8gKFxuICAgICAgdmFsdWUudHlwZSA9PT0gU2NoZW1hVHlwZS5CaWJsaW9ncmFwaHkgP1xuICAgICAgICB0aGlzLnVwZGF0ZUJpYmxpb2dyYXBoeSh2YWx1ZSkgOlxuICAgICAgICB0aGlzLnVwZGF0ZVNvdXJjZSh2YWx1ZSBhcyBQYXJ0aWFsPFNvdXJjZT4pXG4gICAgKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIEFjdG9yLkBpZFxuXG4gIHB1YmxpYyBhc3luYyBzZXRVc2VyQWN0b3JJZChwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHsgYWN0b3JJZCwgbmFtZSB9ID0gYXdhaXQgdGhpcy51c2Vyc1NlcnZpY2UubG9nZ2VkSW5Vc2VyO1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VQcm9wZXJ0eURhdGEocHJvcGVydHksIHsgJ0BpZCc6IGFjdG9ySWQsICdAdHlwZSc6IE5vZGVUeXBlLkFjdG9yLCBuYW1lIH0sIGZhbHNlKTtcbiAgfVxuXG4gIC8vIEN5Y2xlLmN5Y2xlRHVyYXRpb25cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gIH1cblxuICBwdWJsaWMgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbihwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IGR1cmF0aW9uID0gY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbih0aGlzLnByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eUNoYW5nZWQoZHVyYXRpb24sIHByb3BlcnR5KTtcbiAgfVxuXG4gIC8vIEN5Y2xlLnN0YXJ0RGF0ZVxuXG4gIHB1YmxpYyBjYWxjdWxhdGVDeWNsZVN0YXJ0RGF0ZUVuYWJsZWQocHJvcGVydHk6IElOb2RlUHJvcGVydHkpIHtcbiAgICByZXR1cm4gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGVFbmFibGVkKHRoaXMucHJvcGVydGllcywgcHJvcGVydHkpO1xuICB9XG5cbiAgcHVibGljIGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gY2FsY3VsYXRlQ3ljbGVTdGFydERhdGUodGhpcy5wcm9wZXJ0aWVzLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlDaGFuZ2VkKHN0YXJ0RGF0ZSwgcHJvcGVydHkpO1xuICB9XG5cbiAgLy8gVW5pdHMgY29udmVydGVyXG5cbiAgcHVibGljIHVuaXRDb252ZXJ0ZXJFbmFibGVkKHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgWyd2YWx1ZScsICdtaW4nLCAnbWF4JywgJ3NkJ10uaW5jbHVkZXMocHJvcGVydHkua2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuVW5pdENvbnZlcnRlcihwb3BvdmVyLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbHVlID0gcHJvcGVydHkudmFsdWU7XG4gICAgY29uc3QgdGVybVByb3BlcnR5ID0gc2libGluZ1Byb3BlcnR5KHRoaXMucHJvcGVydGllcywgcHJvcGVydHksICd0ZXJtJyk7XG4gICAgY29uc3QgdGVybSA9IHNhZmVKU09OUGFyc2UodGVybVByb3BlcnR5Py52YWx1ZSk7XG4gICAgY29uc3QgdW5pdHMgPSB0ZXJtPy51bml0cztcbiAgICByZXR1cm4gcG9wb3Zlci5pc09wZW4oKSA/IHBvcG92ZXIuY2xvc2UoKSA6IHBvcG92ZXIub3Blbih7IHZhbHVlLCB0ZXJtLCB1bml0cyB9KTtcbiAgfVxuXG4gIC8vIFJlY29tbWVuZGF0aW9uc1xuXG4gIHB1YmxpYyBvblNlbGVjdFJlY29tbWVuZGF0aW9uKGFycmF5OiBJTm9kZVByb3BlcnR5LCBpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMuc2NoZW1hcyFbYXJyYXkuc2NoZW1hVHlwZV07XG4gICAgY29uc3QgdmFsdWUgPSBnZXQodGhpcy5ub2RlLCBhcnJheS5mdWxsS2V5KTtcblxuICAgIGNvbnN0IG5ld1Byb3BlcnR5ID0gdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLCBwcm9wLCB2YWx1ZSwgYCR7YXJyYXkuZnVsbEtleX1bJHthcnJheS5wcm9wZXJ0aWVzLmxlbmd0aH1dYFxuICAgICk7XG4gICAgbmV3UHJvcGVydHkudmFsdWUudGVybSA9IHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH07XG4gICAgdmFsdWVbYXJyYXkucHJvcGVydGllcy5sZW5ndGhdLnRlcm0gPSB7IHR5cGU6IE5vZGVUeXBlLlRlcm0sICdAaWQnOiBpZCB9O1xuXG4gICAgLy8gaW5zZXJ0IFRlcm0gd2l0aCBAaWRcbiAgICBjb25zdCB0ZXJtS2V5ID0gYCR7bmV3UHJvcGVydHkuZnVsbEtleX0udGVybWA7XG4gICAgY29uc3QgdGVybVByb3BlcnR5ID0gbmV3UHJvcGVydHkucHJvcGVydGllcy5maW5kKHAgPT4gcC5rZXkgPT09ICd0ZXJtJykgfHwgdHlwZVRvTmV3UHJvcGVydHkoXG4gICAgICB0aGlzLnNjaGVtYXMhLCBwcm9wLnByb3BlcnRpZXMudGVybSwgcHJvcCwgbmV3UHJvcGVydHkudmFsdWUsIHRlcm1LZXlcbiAgICApO1xuICAgIHRlcm1Qcm9wZXJ0eS52YWx1ZSA9IHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH07XG4gICAgdGVybVByb3BlcnR5LnByb3BlcnRpZXMgPSByZWN1cnNpdmVQcm9wZXJ0aWVzKFxuICAgICAgdGhpcy5zY2hlbWFzISwgW10sIHRoaXMuc2NoZW1hcyFbdGhpcy5ub2RlIS50eXBlXSwgdGhpcy5kZWVwRWRpdGFibGUsIHRlcm1LZXlcbiAgICApKHsgdHlwZTogTm9kZVR5cGUuVGVybSwgJ0BpZCc6IGlkIH0pO1xuICAgIGluc2VydFByb3BlcnR5KG5ld1Byb3BlcnR5LnByb3BlcnRpZXMsIHRlcm1LZXksIHRlcm1Qcm9wZXJ0eSk7XG5cbiAgICAvLyB0ZXJtIGNhbm5vdCBiZSBlZGl0ZWQsIG5lZWQgdG8gcmVtb3ZlIGZpcnN0XG4gICAgdXBkYXRlUHJvcGVydGllcyh0ZXJtUHJvcGVydHksIHAgPT4ge1xuICAgICAgcC5lZGl0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfSk7XG4gICAgdGVybVByb3BlcnR5LmVkaXRhYmxlID0gZmFsc2U7XG5cbiAgICBhcnJheS5wcm9wZXJ0aWVzLnB1c2gobmV3UHJvcGVydHkpO1xuICAgIHJldHVybiB0aGlzLnByb3BlcnR5Q2hhbmdlZCh2YWx1ZSwgYXJyYXkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICA8ZGl2IGNsYXNzPVwiY2FyZC10b2dnbGUgcC00XCIgKGNsaWNrKT1cImlzT3BlbiA9ICFpc09wZW5cIiBwb2ludGVyPlxuICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgIDxzcGFuICpuZ0lmPVwibm9kZVByb3BlcnR5XCIgY2xhc3M9XCJpcy1weC0yXCJcbiAgICAgIFtjbGFzcy5oYXMtdGV4dC1kYW5nZXJdPVwibm9kZVByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICAgIFtjbGFzcy5oYXMtdGV4dC13YXJuaW5nXT1cIm5vZGVQcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICA+XG4gICAgICA8aGUtbm9kZS1pY29uIFt0eXBlXT1cIm5vZGVQcm9wZXJ0eS5zY2hlbWFUeXBlXCI+PC9oZS1ub2RlLWljb24+XG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgaXNPcGVuICYmIG5vZGVQcm9wZXJ0eVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IG5vZGVQcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc09wZW5cIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYi0zIG1iLTJcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlRXJyb3JGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBub2RlUHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInB5LTQgcGwtNFwiICpuZ0lmPVwibm9kZVByb3BlcnR5Py5lcnJvclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlFcnJvcjsgY29udGV4dDoge3Byb3BlcnR5OiBub2RlUHJvcGVydHksIGVkaXQ6IHRydWV9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLW11bHRpbGluZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcGVydHkgb2YgcHJvcGVydGllczsgdHJhY2tCeTogdHJhY2tCeVByb3BlcnR5XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNPcGVuXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlNYXA7IGNvbnRleHQ6IHskaW1wbGljaXQ6IG5vZGVQcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5cbjxoZS1tYXBzLWRyYXdpbmctY29uZmlybSAqbmdJZj1cIiEhbWFwRHJhd2luZ1Byb3BlcnR5XCJcbiAgW3ZhbHVlXT1cIm1hcERyYXdpbmdQcm9wZXJ0eS52YWx1ZVwiIFttb2Rlc109XCJtYXBEcmF3aW5nTW9kZXMobWFwRHJhd2luZ1Byb3BlcnR5KVwiXG4gIChjbG9zZWQpPVwib25NYXBEcmF3aW5nQ2xvc2VkKCRldmVudClcIlxuPjwvaGUtbWFwcy1kcmF3aW5nLWNvbmZpcm0+XG5cbjxoZS1iaWJsaW9ncmFwaGllcy1zZWFyY2gtY29uZmlybSAqbmdJZj1cIiEhYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eVwiXG4gIFtzZWFyY2hdPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eS52YWx1ZVwiXG4gIFtzZWFyY2hCeV09XCJiaWJsaW9ncmFwaGllc1NlYXJjaEtleShiaWJsaW9ncmFwaGllc1NlYXJjaFByb3BlcnR5KVwiXG4gIFtzZWFyY2hTb3VyY2VzXT1cImJpYmxpb2dyYXBoaWVzU2VhcmNoU291cmNlc1wiXG4gIChjbG9zZWQpPVwib25CaWJsaW9ncmFwaGllc1NlYXJjaENsb3NlZCgkZXZlbnQpXCJcbj48L2hlLWJpYmxpb2dyYXBoaWVzLXNlYXJjaC1jb25maXJtPlxuXG48bmctdGVtcGxhdGUgI2xhYmVsRGVzY3JpcHRpb24gbGV0LXByb3BlcnR5PlxuICA8bmctdGVtcGxhdGUgI2Rlc2NyaXB0aW9uPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtcHJlLWxpbmVcIj57e3Byb3BlcnR5LnNjaGVtYT8uZGVzY3JpcHRpb259fTwvc3Bhbj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8c3BhblxuICAgIGNsYXNzPVwidHJpZ2dlci1wb3BvdmVyXCJcbiAgICBbbmdiUG9wb3Zlcl09XCJkZXNjcmlwdGlvblwiIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCIgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93IGlzLW5hcnJvdy13aWR0aFwiXG4gICAgdHJpZ2dlcnM9XCJob3ZlclwiIHBsYWNlbWVudD1cInJpZ2h0XCIgY29udGFpbmVyPVwiYm9keVwiXG4gID5cbiAgICA8c3Bhbj57e3Byb3BlcnR5LmtleX19PC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xhYmVsRGVmYXVsdCBsZXQtcHJvcGVydHk+XG4gIDxzcGFuPnt7cHJvcGVydHkua2V5fX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Nob3dQcm9wZXJ0eSBsZXQtcHJvcGVydHk+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXNPcGVuIHx8IHByb3BlcnR5LmNsb3NlZFZpc2libGUpICYmICFwcm9wZXJ0eS5pc0hpZGRlblwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtNlwiXG4gICAgICBbaWRdPVwicHJvcGVydHkuZnVsbEtleSArICdfJyArIHByb3BlcnR5LmlkXCJcbiAgICAgIFtjbGFzcy5pcy0xMl09XCJwcm9wZXJ0eS5wcm9wZXJ0aWVzLmxlbmd0aCB8fCAhcHJvcGVydHkua2V5XCJcbiAgICAgIFtuZ1N3aXRjaF09XCIhIXByb3BlcnR5LnByb3BlcnRpZXMubGVuZ3RoXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tdWx0aWxpbmUgaXMtdmFyaWFibGUgaXMtMVwiICpuZ1N3aXRjaENhc2U9XCJmYWxzZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpiaW5kT25jZT1cInByb3BlcnR5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy0zIHB5LTFcIiAqbmdJZj1cInByb3BlcnR5LmtleVwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgaGFzLXRleHQtcmlnaHQtdGFibGV0IGhhcy10ZXh0LWVsbGlwc2lzXCIgW2Zvcl09XCJwcm9wZXJ0eS5pZFwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eS5zY2hlbWE/LmRlc2NyaXB0aW9uICYmIGVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlID8gbGFiZWxEZXNjcmlwdGlvbiA6IGxhYmVsRGVmYXVsdDsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy05IHB5LTFcIiBbY2xhc3MuaXMtMTJdPVwiIXByb3BlcnR5LmtleVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0Rm9ybTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoZWRpdGFibGUgfHwgZXJyb3JzRWRpdGFibGUpICYmIChwcm9wZXJ0eS5oYXNFcnJvciB8fCBwcm9wZXJ0eS5oYXNXYXJuaW5nKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlFcnJvcjsgY29udGV4dDoge3Byb3BlcnR5OiBwcm9wZXJ0eSwgZWRpdDogZmFsc2V9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsXCIgKm5nU3dpdGNoQ2FzZT1cInRydWVcIlxuICAgICAgICBbY2xhc3MuaXMtc2Vjb25kYXJ5XT1cImVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkXCJcbiAgICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNFcnJvclwiXG4gICAgICAgIFtjbGFzcy5pcy13YXJuaW5nXT1cIiFwcm9wZXJ0eS5jaGFuZ2VkICYmIHByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuICAgICAgICBbY2xhc3MuaXMtZGVmYXVsdF09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiAhcHJvcGVydHkuaGFzRXJyb3IgJiYgIXByb3BlcnR5Lmhhc1dhcm5pbmdcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3Blbi1ncm91cCBwYW5lbC1oZWFkaW5nIHB5LTBcIlxuICAgICAgICAgIChjbGljayk9XCJwcm9wZXJ0eS5pc09wZW4gPSAhcHJvcGVydHkuaXNPcGVuXCIgcG9pbnRlclxuICAgICAgICAgIFtjbGFzcy5pcy1vcGVuXT1cInByb3BlcnR5LmlzT3BlblwiXG4gICAgICAgICAgW2NsYXNzLmhhcy10ZXh0LXdoaXRlXT1cIihlcnJvck1vZGUgJiYgcHJvcGVydHkuY2hhbmdlZCkgfHwgcHJvcGVydHkuaGFzRXJyb3IgfHwgcHJvcGVydHkuaGFzV2FybmluZ1wiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tb2JpbGUgaXMtdmNlbnRlcmVkXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3cgcHktMSBteS0wXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhcHJvcGVydHkuaXNPcGVuXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cInByb3BlcnR5LmlzT3BlblwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29sdW1uIHB5LTEgbXktMFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXNpemUtNlwiPnt7cHJvcGVydHkua2V5fX08L3NwYW4+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb3BlcnR5LnNjaGVtYVR5cGVcIiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3cgcHktMSBteS0wXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFncyBtYi0wIGhhcy1hZGRvbnNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBtYi0wIGlzLWxpZ2h0XCI+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBtYi0wIGlzLXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgICA8aGUtc2NoZW1hLXZlcnNpb24tbGluayBsaW5rQ2xhc3M9XCJpcy1zbWFsbFwiIFtub2RlXT1cInsnQHR5cGUnOiBwcm9wZXJ0eS5zY2hlbWFUeXBlfVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3Byb3BlcnR5LnNjaGVtYVR5cGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvaGUtc2NoZW1hLXZlcnNpb24tbGluaz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxoZS1wb3BvdmVyLWNvbmZpcm0gY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IHB5LTEgbXktMCBweC0wXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJlZGl0YWJsZSAmJiAhZXJyb3JzRWRpdGFibGVcIlxuICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiUmVtb3ZlIGdyb3VwXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgW21lc3NhZ2VdPVwiJzxwPlRoaXMgd2lsbCByZW1vdmUgdGhlIGdyb3VwIGNvbXBsZXRlbHkuPC9wPicgKyAocHJvcGVydHkuaXNSZXF1aXJlZCA/ICc8cD48dT5XYXJuaW5nOiB0aGlzIGZpZWxkIGlzIHJlcXVpcmVkLjwvdT48L3A+JyA6ICcnKSArICc8cD5EbyB5b3UgY29uZmlybT88L3A+J1wiXG4gICAgICAgICAgICAgIHBvcG92ZXJDbGFzcz1cInB4LTNcIlxuICAgICAgICAgICAgICAoY29uZmlybWVkKT1cInByb3BlcnR5Q2hhbmdlZChudWxsLCBwcm9wZXJ0eSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwidGltZXNcIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2hlLXBvcG92ZXItY29uZmlybT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ibG9jayBpcy1ibG9jayBwLTBcIiAqbmdJZj1cInByb3BlcnR5LmlzT3BlblwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInByb3BlcnR5LmlzQXJyYXlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0zIHB0LTRcIiAqbmdJZj1cInByb3BlcnR5LmVycm9yXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJwcm9wZXJ0eUVycm9yOyBjb250ZXh0OiB7cHJvcGVydHk6IHByb3BlcnR5LCBlZGl0OiB0cnVlfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgKm5nU3dpdGNoQ2FzZT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGVscCBweS0xIHB4LTJcIiAqbmdJZj1cImVkaXRhYmxlICYmICFwcm9wZXJ0eS5lZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgIFRvIGNoYW5nZSB0aGUge3twcm9wZXJ0eS5rZXl9fSwgcGxlYXNlIGRlbGV0ZSBpdCBmaXJzdCwgdGhlbiBhZGQgdGhlIGZpZWxkIGFnYWluXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwicHJvcGVydHkuc2NoZW1hPy50aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoZWxwIHB5LTEgcHgtMlwiICpuZ1N3aXRjaENhc2U9XCInQmlibGlvZ3JhcGh5J1wiPlxuICAgICAgICAgICAgICAgICAgICBTZWFyY2ggYnkgVGl0bGUgb3IgRG9jdW1lbnQgRE9JIHRvIGF1dG8tcG9wdWxhdGUgdGhlIGZpZWxkcyB1c2luZyB0aGUgTWVuZGVsZXkgY2F0YWxvZ3VlXG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93TmV3UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0zIG10LTFcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vZGVFcnJvckZvcm07IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktZ3JvdXAgcHktMiBweC0zIG10LTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tdWx0aWxpbmUgbWItMFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcDIgb2YgcHJvcGVydHkucHJvcGVydGllczsgdHJhY2tCeTogdHJhY2tCeVByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzaG93UHJvcGVydHk7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3AyfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0yIHB4LTMgbXQtMlwiICpuZ1N3aXRjaENhc2U9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xXCIgKm5nSWY9XCJlcnJvcnNFZGl0YWJsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlRXJyb3JGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcDIgb2YgcHJvcGVydHkucHJvcGVydGllczsgdHJhY2tCeTogdHJhY2tCeVByb3BlcnR5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC0wIG15LTRcIiAqbmdJZj1cInByb3AyLmtleVwiXG4gICAgICAgICAgICAgICAgICBbaWRdPVwicHJvcDIuZnVsbEtleSArICdfJyArIHByb3AyLmlkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktYXJyYXktbnVtYmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWdzIGhhcy1hZGRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBpcy1kYXJrXCI+e3twcm9wMi5rZXl9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgIWVycm9yc0VkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhZyBpcy1pbmZvXCIgcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZHVwbGljYXRlQXJyYXlHcm91cChwcm9wZXJ0eSwgcHJvcDIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlRvb2x0aXBdPVwiKCdEdXBsaWNhdGUgJyArIHByb3BlcnR5LmtleSkgfCBwbHVyYWxpemU6MVwiIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJjbG9uZVwiIHNpemU9XCJzbVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGFnIGlzLWxpZ2h0XCIgcG9pbnRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb3AyLmtleSAhPT0gJzAnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBcnJheUdyb3VwVXAocHJvcGVydHksIHByb3AyKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJNb3ZlIFVwXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImxvbmctYXJyb3ctYWx0LXVwXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0YWcgaXMtbGlnaHRcIiBwb2ludGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvcDIua2V5ICE9PSBwcm9wZXJ0eS5wcm9wZXJ0aWVzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUFycmF5R3JvdXBEb3duKHByb3BlcnR5LCBwcm9wMilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwiTW92ZSBEb3duXCIgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImxvbmctYXJyb3ctYWx0LWRvd25cIiBzaXplPVwic21cIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtcG9wb3Zlci1jb25maXJtIGNsYXNzPVwidGFnIGlzLWRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ2JUb29sdGlwXT1cIignUmVtb3ZlICcgKyBwcm9wZXJ0eS5rZXkpIHwgcGx1cmFsaXplOjFcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPVwiVGhpcyB3aWxsIHJlbW92ZSB0aGUgZ3JvdXAgY29tcGxldGVseS4gRG8geW91IGNvbmZpcm0/XCIgcG9zaXRpb249XCJyaWdodFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maXJtZWQpPVwicmVtb3ZlQXJyYXlHcm91cChwcm9wZXJ0eSwgcHJvcDIpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2hlLXBvcG92ZXItY29uZmlybT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dOZXdQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcDJ9XCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC00IG10LTJcIiAqbmdJZj1cImVycm9yc0VkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub2RlRXJyb3JGb3JtOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wMn1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNCBtdC0yXCIgKm5nSWY9XCJwcm9wMi5lcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicHJvcGVydHlFcnJvcjsgY29udGV4dDoge3Byb3BlcnR5OiBwcm9wMiwgZWRpdDogdHJ1ZX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktZ3JvdXAgY2FyZC1jb250ZW50IHAtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tdWx0aWxpbmUgbXktMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByb3AzIG9mIHByb3AyLnByb3BlcnRpZXM7IHRyYWNrQnk6IHRyYWNrQnlQcm9wZXJ0eVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNob3dQcm9wZXJ0eTsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcDN9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiAhZXJyb3JzRWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLWluZm8gaXMtc21hbGxcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRBcnJheUdyb3VwKHByb3BlcnR5KVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5BZGQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTFcIj57e3Byb3BlcnR5LmtleSB8IHBsdXJhbGl6ZToxfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICA8aGUtbm9kZS1yZWNvbW1lbmRhdGlvbnMgYnV0dG9uQ2xhc3M9XCJpcy1zbWFsbFwiXG4gICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCIgW25vZGVGaWVsZF09XCJwcm9wZXJ0eS5rZXlcIlxuICAgICAgICAgICAgICAgICAgKHNlbGVjdFJlY29tbWVuZGF0aW9uKT1cIm9uU2VsZWN0UmVjb21tZW5kYXRpb24ocHJvcGVydHksICRldmVudClcIlxuICAgICAgICAgICAgICAgID48L2hlLW5vZGUtcmVjb21tZW5kYXRpb25zPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRGb3JtIGxldC1wcm9wZXJ0eT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInByb3BlcnR5LmtleVwiPlxuICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cInByb3BlcnR5LnN1Z2dlc3Rpb25zPy50eXBlXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc2VsZWN0J1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRTZWxlY3Q7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dElucHV0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaW5wdXRJbnB1dCBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZCBtYi0wXCIgW2NsYXNzLmhhcy1hZGRvbnNdPVwiaGFzQWRkb25zKHByb3BlcnR5KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCJcbiAgICAgIFtjbGFzcy5oYXMtaWNvbnMtcmlnaHRdPVwicHJvcGVydHkubG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXQgaXMtc21hbGwgc2VhcmNoLWlucHV0XCJcbiAgICAgICAgW2NsYXNzLmlzLWRhcmtdPVwicHJvcGVydHkua2V5ID09PSAndHlwZSdcIlxuICAgICAgICBbY2xhc3MuaXMtc2Vjb25kYXJ5XT1cImVycm9yTW9kZSAmJiBwcm9wZXJ0eS5jaGFuZ2VkXCJcbiAgICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIoIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzRXJyb3IpIHx8IGlzUmVxdWlyZWQocHJvcGVydHkpXCJcbiAgICAgICAgW2NsYXNzLmlzLXdhcm5pbmddPVwiIXByb3BlcnR5LmNoYW5nZWQgJiYgcHJvcGVydHkuaGFzV2FybmluZ1wiXG5cbiAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS52YWx1ZVwiICNwcm9wZXJ0eU1vZGVsPVwibmdNb2RlbFwiXG4gICAgICAgIFt0eXBlXT1cInByb3BlcnR5LnNjaGVtYT8udHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6ICdzdHJpbmcnXCJcbiAgICAgICAgW2lkXT1cInByb3BlcnR5LmlkXCJcbiAgICAgICAgbmFtZT1cInJhbmRvbW5hbWVcIlxuICAgICAgICBbcmVhZG9ubHldPVwiIWVkaXRhYmxlIHx8ICFwcm9wZXJ0eS5lZGl0YWJsZSB8fCBwcm9wZXJ0eS5zY2hlbWE/LmludGVybmFsXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInByb3BlcnR5LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2FwcFRhZ3NJbnB1dF09XCJ7ZW5hYmxlZDogZWRpdGFibGUgJiYgcHJvcGVydHkuZWRpdGFibGUgJiYgcHJvcGVydHkuc2NoZW1hPy50eXBlID09PSAnYXJyYXknLCBpdGVtczogcHJvcGVydHkuc2NoZW1hPy5pdGVtcywgZGVsaW1pdGVyOiAnOycsIGFsbG93RHVwbGljYXRlczogdHJ1ZSwgcGxhY2Vob2xkZXI6IHByb3BlcnR5LnBsYWNlaG9sZGVyfVwiXG4gICAgICAgIChjaGFuZ2UpPVwicHJvcGVydHlDaGFuZ2VkKCRldmVudC50YXJnZXQudmFsdWUsIHByb3BlcnR5KVwiXG5cbiAgICAgICAgW3BhdHRlcm5dPVwicHJvcGVydHkuc2NoZW1hPy5wYXR0ZXJuXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cInByb3BlcnR5LmZ1bGxLZXkuZW5kc1dpdGgoJ2lkJykgJiYgcHJvcGVydHkuZnVsbEtleSAhPT0gJ2lkJ1wiXG4gICAgICAgIFttaW5dPVwicHJvcGVydHkuc2NoZW1hPy5taW5pbXVtXCJcbiAgICAgICAgW21heF09XCJwcm9wZXJ0eS5zY2hlbWE/Lm1heGltdW1cIlxuXG4gICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwicHJvcGVydHkgfCBhcHBseVB1cmU6cHJvcGVydHlTdWdnZXN0XCJcbiAgICAgICAgW3Jlc3VsdFRlbXBsYXRlXT1cInN1Z2dlc3Rpb25cIlxuICAgICAgICBbaW5wdXRGb3JtYXR0ZXJdPVwicHJvcGVydHkuZm9ybWF0dGVyXCJcbiAgICAgICAgW2ZvY3VzRmlyc3RdPVwidHJ1ZVwiXG4gICAgICAgIChmb2N1cyk9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSAmJiB0eXBlYWhlYWRGb2N1cygkZXZlbnQpXCJcbiAgICAgICAgKHNlbGVjdEl0ZW0pPVwic3VnZ2VzdGlvblNlbGVjdGVkKCRldmVudC5pdGVtLCBwcm9wZXJ0eSlcIlxuICAgICAgPlxuXG4gICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGwgaXMtcmlnaHQgaGFzLXRleHQtZ3JleS1kYXJrXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhcHJvcGVydHkubG9hZGluZ1wiPlxuICAgICAgICA8ZmEtaWNvbiBpY29uPVwic3Bpbm5lclwiIFtwdWxzZV09XCJ0cnVlXCIgc2l6ZT1cInNtXCI+PC9mYS1pY29uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpbnB1dEFkZG9uczsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8cCBjbGFzcz1cImhlbHAgaXMtZGFuZ2VyLWxpZ2h0XCJcbiAgICAqbmdJZj1cIiFwcm9wZXJ0eS5oYXNFcnJvciAmJiBwcm9wZXJ0eU1vZGVsLmludmFsaWRcIlxuICA+XG4gICAgPHNwYW4gKmJpbmRPbmNlPVwicHJvcGVydHlNb2RlbC5lcnJvcnNcIiBbaW5uZXJIVE1MXT1cImZvcm1hdFByb3BlcnR5RXJyb3IocHJvcGVydHlNb2RlbC5lcnJvcnMsIHByb3BlcnR5KVwiPjwvc3Bhbj5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbnB1dFNlbGVjdCBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZCBtYi0wXCIgW2NsYXNzLmhhcy1hZGRvbnNdPVwiaGFzQWRkb25zKHByb3BlcnR5KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0IGlzLXNtYWxsIGlzLWZ1bGx3aWR0aFwiXG4gICAgICAgIFtjbGFzcy5pcy1zZWNvbmRhcnldPVwiZXJyb3JNb2RlICYmIHByb3BlcnR5LmNoYW5nZWRcIlxuICAgICAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cIighcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNFcnJvcikgfHwgaXNSZXF1aXJlZChwcm9wZXJ0eSlcIlxuICAgICAgICBbY2xhc3MuaXMtd2FybmluZ109XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgID5cbiAgICAgICAgPHNlbGVjdFxuICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHkudmFsdWVcIiAjcHJvcGVydHlNb2RlbD1cIm5nTW9kZWxcIlxuICAgICAgICAgIFtpZF09XCJwcm9wZXJ0eS5pZFwiXG4gICAgICAgICAgbmFtZT1cInJhbmRvbW5hbWVcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGFibGUgfHwgIXByb3BlcnR5LmVkaXRhYmxlIHx8IHByb3BlcnR5LnNjaGVtYT8uaW50ZXJuYWxcIlxuICAgICAgICAgIChjaGFuZ2UpPVwicHJvcGVydHlDaGFuZ2VkKCRldmVudC50YXJnZXQudmFsdWUsIHByb3BlcnR5KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0PC9vcHRpb24+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqYmluZE9uY2U9XCJwcm9wZXJ0eS5zdWdnZXN0aW9uc1wiPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgcHJvcGVydHkuc3VnZ2VzdGlvbnMudmFsdWVzOyB0cmFja0J5OiB0cmFja0J5SW5kZXhcIiBbdmFsdWVdPVwidmFsdWVcIj57e3ZhbHVlfX08L29wdGlvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaW5wdXRBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbiAgPHAgY2xhc3M9XCJoZWxwIGlzLWRhbmdlci1saWdodFwiXG4gICAgKm5nSWY9XCIhcHJvcGVydHkuaGFzRXJyb3IgJiYgcHJvcGVydHlNb2RlbC5pbnZhbGlkXCJcbiAgPlxuICAgIDxzcGFuICpiaW5kT25jZT1cInByb3BlcnR5TW9kZWwuZXJyb3JzXCIgW2lubmVySFRNTF09XCJmb3JtYXRQcm9wZXJ0eUVycm9yKHByb3BlcnR5TW9kZWwuZXJyb3JzLCBwcm9wZXJ0eSlcIj48L3NwYW4+XG4gIDwvcD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmVtb3ZlRmllbGRBZGRvbiBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCIhZXJyb3JzRWRpdGFibGUgJiYgIXByb3BlcnR5LmlzUmVxdWlyZWRcIj5cbiAgICA8YSBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiUmVtb3ZlIGZpZWxkXCJcbiAgICAgIFtjbGFzcy5pcy1vdXRsaW5lZF09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiAocHJvcGVydHkuaGFzRXJyb3IgfHwgcHJvcGVydHkuaGFzV2FybmluZylcIlxuICAgICAgW2NsYXNzLmlzLWRhbmdlcl09XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNFcnJvclwiXG4gICAgICBbY2xhc3MuaXMtd2FybmluZ109XCIhcHJvcGVydHkuY2hhbmdlZCAmJiBwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHByb3BlcnR5Q2hhbmdlZChudWxsLCBwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiPjwvZmEtaWNvbj5cbiAgICA8L2E+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpbnB1dEFkZG9ucyBsZXQtcHJvcGVydHk+XG4gIDxuZy1jb250YWluZXIgKmJpbmRPbmNlPVwicHJvcGVydHlcIj5cbiAgICA8aGUtcG9wb3Zlci1jb25maXJtIGNsYXNzPVwiY29udHJvbFwiXG4gICAgICAqbmdJZj1cImVuYWJsZUFkZEVycm9yKHByb3BlcnR5KVwiXG4gICAgICBwb3NpdGlvbj1cImxlZnRcIlxuICAgICAgW2NvbnRlbnRdPVwicG9wdXBFcnJvckZvcm1cIlxuICAgICAgKGNvbmZpcm1lZCk9XCJhZGRFcnJvcihwcm9wZXJ0eSwgJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIj5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cImNvbW1lbnRzXCI+PC9mYS1pY29uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvaGUtcG9wb3Zlci1jb25maXJtPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmIHByb3BlcnR5LmVkaXRhYmxlXCI+XG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwcm9wZXJ0eS5zY2hlbWFUeXBlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlNjaGVtYVR5cGUuQWN0b3JcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0b3JBZGRvbnM7IGNvbnRleHQ6IHskaW1wbGljaXQ6IHByb3BlcnR5fVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiU2NoZW1hVHlwZS5DeWNsZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjeWNsZUFkZG9uczsgY29udGV4dDogeyRpbXBsaWNpdDogcHJvcGVydHl9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJtYXBEcmF3aW5nTW9kZXMocHJvcGVydHkpLmxlbmd0aFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgdGl0bGU9XCJQaWNrIG9uIE1hcFwiXG4gICAgICAgICAgKGNsaWNrKT1cIm1hcERyYXdpbmdQcm9wZXJ0eSA9IHByb3BlcnR5XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJtYXAtbWFya2VkLWFsdFwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJiaWJsaW9ncmFwaGllc1NlYXJjaEtleShwcm9wZXJ0eSlcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiQWR2YW5jZWQgU2VhcmNoXCJcbiAgICAgICAgICAoY2xpY2spPVwiYmlibGlvZ3JhcGhpZXNTZWFyY2hQcm9wZXJ0eSA9IHByb3BlcnR5XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJzZWFyY2hcIj48L2ZhLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyZW1vdmVGaWVsZEFkZG9uOyBjb250ZXh0OiB7JGltcGxpY2l0OiBwcm9wZXJ0eX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCJhZGRQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHkpXCI+XG4gICAgICA8YSBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1kYW5nZXJcIiB0aXRsZT1cIkFkZCBmaWVsZFwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IGFkZE1pc3NpbmdQcm9wZXJ0eShwcm9wZXJ0eSlcIlxuICAgICAgPlxuICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIj48L2ZhLWljb24+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicGwtMlwiPkFkZDwvc3Bhbj5cbiAgICAgIDwvYT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwiaXNSZXF1aXJlZChwcm9wZXJ0eSlcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1kYW5nZXJcIiBbZm9yXT1cInByb3BlcnR5LmlkXCJcbiAgICAgICAgbmdiVG9vbHRpcD1cIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIiBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgPlxuICAgICAgICA8ZmEtaWNvbiBpY29uPVwiZXhjbGFtYXRpb24tdHJpYW5nbGVcIj48L2ZhLWljb24+XG4gICAgICA8L2xhYmVsPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9wZXJ0eS5leHRlcm5hbFVybD8udXJsXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8YSBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgW2hyZWZdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsICsgKHByb3BlcnR5LmV4dGVybmFsVXJsLnVybFBhcmFtVmFsdWUgPyBwcm9wZXJ0eS52YWx1ZSA6ICcnKVwiXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICBbdGl0bGVdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudGl0bGVcIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW5mbyc6IHByb3BlcnR5LmtleSA9PT0gJ3R5cGUnfVwiXG4gICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwicHJvcGVydHkuZXh0ZXJuYWxVcmwudXJsUGFyYW1WYWx1ZSAmJiAhcHJvcGVydHkudmFsdWUgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJwcm9wZXJ0eS5leHRlcm5hbFVybC5pY29uIHx8ICdleHRlcm5hbC1saW5rLWFsdCdcIj48L2ZhLWljb24+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1bml0Q29udmVydGVyRW5hYmxlZChwcm9wZXJ0eSlcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIk9wZW4gY2FsY3VsYXRvclwiXG4gICAgICAgICAgW25nYlBvcG92ZXJdPVwiY29udmVydFVuaXRzXCIgYXV0b0Nsb3NlPVwib3V0c2lkZVwiXG4gICAgICAgICAgdHJpZ2dlcnM9XCJtYW51YWxcIiAjcD1cIm5nYlBvcG92ZXJcIiBwbGFjZW1lbnQ9XCJib3R0b21cIiBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlblVuaXRDb252ZXJ0ZXIocCwgcHJvcGVydHkpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJjYWxjdWxhdG9yXCI+PC9mYS1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYWN0b3JBZGRvbnMgbGV0LXByb3BlcnR5PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwicHJvcGVydHkua2V5ID09PSAnQGlkJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkFkZCBteXNlbGYgYXMgQWN0b3JcIlxuICAgICAgKGNsaWNrKT1cInNldFVzZXJBY3RvcklkKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gW2ljb25dPVwiWydmYXInLCAnaWQtYmFkZ2UnXVwiPjwvZmEtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2N5Y2xlQWRkb25zIGxldC1wcm9wZXJ0eT5cbiAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIiAqbmdJZj1cInByb3BlcnR5LmtleSA9PT0gJ2N5Y2xlRHVyYXRpb24nXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHRpdGxlPVwiQ2FsY3VsYXRlIHZhbHVlIGZyb20gc3RhcnREYXRlIGFuZCBlbmREYXRlXCJcbiAgICAgIChjbGljayk9XCJjYWxjdWxhdGVDeWNsZUR1cmF0aW9uKHByb3BlcnR5KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhbGN1bGF0ZUN5Y2xlRHVyYXRpb25FbmFibGVkKHByb3BlcnR5KVwiXG4gICAgPlxuICAgICAgPGZhLWljb24gaWNvbj1cImNhbGN1bGF0b3JcIj48L2ZhLWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0lmPVwicHJvcGVydHkua2V5ID09PSAnc3RhcnREYXRlJ1wiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIiB0aXRsZT1cIkNhbGN1bGF0ZSB2YWx1ZSBmcm9tIGVuZERhdGUgYW5kIGN5Y2xlRHVyYXRpb25cIlxuICAgICAgKGNsaWNrKT1cImNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlKHByb3BlcnR5KVwiXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlRW5hYmxlZChwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGljb249XCJjYWxjdWxhdG9yXCI+PC9mYS1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc2hvd05ld1Byb3BlcnR5IGxldC1wcm9wZXJ0eT5cbiAgPGhlYWRlciBjbGFzcz1cImNhcmQtaGVhZGVyXCIgKm5nSWY9XCJlZGl0YWJsZSAmJiBwcm9wZXJ0eS5lZGl0YWJsZSAmJiAocHJvcGVydHkuYWRkUHJvcGVydHlFbmFibGVkIHx8IGRlZXBFZGl0YWJsZSk7IGVsc2UgcGFkZGVyXCI+XG4gICAgPGZvcm0gY2xhc3M9XCJweS0zIHB4LTQgaXMtZmxleC1ncm93LTFcIiAoc3VibWl0KT1cImFkZFByb3BlcnR5KHByb3BlcnR5KVwiIG5vdmFsaWRhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaXMtaG9yaXpvbnRhbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwgaXMtc21hbGxcIiAqYmluZE9uY2U9XCJwcm9wZXJ0eVwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCIgW2Zvcl09XCJwcm9wZXJ0eS5pZCArICdfbmV3J1wiPlxuICAgICAgICAgICAgPHNwYW4+QWRkIG5ldyBmaWVsZDwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLWJvZHlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9uc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wgaXMtZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXQgaXMtc21hbGxcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHkubmV3UHJvcGVydHlcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJwcm9wZXJ0eS5pZCArICdfbmV3J1wiXG4gICAgICAgICAgICAgICAgbmFtZT1cInJhbmRvbW5hbWVcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFuZCBzZWxlY3QgZmllbGQgZnJvbSByZXN1bHRzXCJcblxuICAgICAgICAgICAgICAgIFtuZ2JUeXBlYWhlYWRdPVwicHJvcGVydHkgfCBhcHBseVB1cmU6c3VnZ2VzdE5ld1Byb3BlcnR5XCJcbiAgICAgICAgICAgICAgICBbcmVzdWx0VGVtcGxhdGVdPVwic3VnZ2VzdGlvblwiXG4gICAgICAgICAgICAgICAgW2lucHV0Rm9ybWF0dGVyXT1cImZvcm1hdE5ld1Byb3BlcnR5XCJcbiAgICAgICAgICAgICAgICBbZm9jdXNGaXJzdF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2VkaXRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAoZm9jdXMpPVwidHlwZWFoZWFkRm9jdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhcHJvcGVydHkubmV3UHJvcGVydHkgfHwgIXByb3BlcnR5Lm5ld1Byb3BlcnR5Lm5hbWVcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cInBsdXNcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgPC9oZWFkZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Byb3BlcnR5RXJyb3IgbGV0LXByb3BlcnR5PVwicHJvcGVydHlcIiBsZXQtZWRpdD1cImVkaXRcIj5cbiAgPHAgY2xhc3M9XCJoZWxwXCJcbiAgICBbY2xhc3MuaXMtZGFuZ2VyXT1cInByb3BlcnR5Lmhhc0Vycm9yXCJcbiAgICBbY2xhc3MuaXMtd2FybmluZ109XCJwcm9wZXJ0eS5oYXNXYXJuaW5nXCJcbiAgICAqbmdJZj1cInByb3BlcnR5LmVycm9yXCJcbiAgPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtcHJlLXdyYXBcIiAqYmluZE9uY2U9XCJwcm9wZXJ0eS5lcnJvclwiIFtpbm5lckhUTUxdPVwicHJvcGVydHkuZXJyb3IubWVzc2FnZVwiPjwvc3Bhbj5cbiAgICA8YSBjbGFzcz1cInBsLTJcIlxuICAgICAgKm5nSWY9XCJlZGl0ICYmIGVycm9yc0VkaXRhYmxlICYmIHByb3BlcnR5LmVycm9yLmluZGV4ID49IDBcIlxuICAgICAgKGNsaWNrKT1cImVkaXRFcnJvcihwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGNsYXNzPVwicHItMlwiIGljb249XCJlZGl0XCI+PC9mYS1pY29uPlxuICAgICAgPHNwYW4+RWRpdDwvc3Bhbj5cbiAgICA8L2E+XG4gICAgPGEgY2xhc3M9XCJwbC0yXCJcbiAgICAgICpuZ0lmPVwiKHByb3BlcnR5Lmhhc1dhcm5pbmcgfHwgZXJyb3JzRWRpdGFibGUpICYmIHByb3BlcnR5LmVycm9yLmluZGV4ID49IDBcIlxuICAgICAgKGNsaWNrKT1cInJlc29sdmVFcnJvcihwcm9wZXJ0eSlcIlxuICAgID5cbiAgICAgIDxmYS1pY29uIGNsYXNzPVwicHItMlwiIGljb249XCJjaGVja1wiPjwvZmEtaWNvbj5cbiAgICAgIDxzcGFuPlJlc29sdmVkPC9zcGFuPlxuICAgIDwvYT5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwcm9wZXJ0eU1hcCBsZXQtcHJvcGVydHk+XG4gIDxkaXYgY2xhc3M9XCJwYW5lbCBpcy1kZWZhdWx0XCIgKm5nSWY9XCJzaG93TWFwXCI+XG4gICAgPGRpdiBjbGFzcz1cIm9wZW4tZ3JvdXAgcGFuZWwtaGVhZGluZyBweS0wXCJcbiAgICAgIChjbGljayk9XCJtYXBWaXNpYmxlID0gIW1hcFZpc2libGVcIiBwb2ludGVyXG4gICAgICBbY2xhc3MuaXMtb3Blbl09XCJtYXBWaXNpYmxlXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy1tb2JpbGUgaXMtdmNlbnRlcmVkIG1iLTBcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93IHB5LTEgbXktMFwiPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJhbmdsZS1kb3duXCIgW2NsYXNzLmlzLWhpZGRlbl09XCIhbWFwVmlzaWJsZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwiYW5nbGUtcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIm1hcFZpc2libGVcIj48L2ZhLWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2x1bW4gcHktMSBteS0wXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1zaXplLTZcIj5WaWV3IG9uIE1hcDwvc3Bhbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWJsb2NrIGlzLWJsb2NrIHAtMFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIW1hcFZpc2libGVcIj5cbiAgICAgIDxoZS1zaXRlcy1tYXBzIFtzaXRlc109XCJbbm9kZV1cIiBbc2hvd05vdGljZV09XCJmYWxzZVwiPjwvaGUtc2l0ZXMtbWFwcz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI25vZGVFcnJvckZvcm0gbGV0LXByb3BlcnR5PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicHJvcGVydHkubmV3RXJyb3IgJiYgcHJvcGVydHkuZWRpdGFibGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9uc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbFwiPlxuICAgICAgICAgIDxzZWxlY3QgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdFcnJvci5sZXZlbFwiPlxuICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidW5kZWZpbmVkXCI+U2VsZWN0IExldmVsPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXJyb3JcIj5FcnJvcjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIndhcm5pbmdcIj5XYXJuaW5nPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJ0ZXh0YXJlYSBpcy1zbWFsbFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eS5uZXdFcnJvci5tZXNzYWdlXCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgbWVzc2FnZSBoZXJlXCJcbiAgICAgICAgICByb3dzPVwiMVwiXG4gICAgICAgID48L3RleHRhcmVhPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIXByb3BlcnR5Lm5ld0Vycm9yLmxldmVsIHx8ICFwcm9wZXJ0eS5uZXdFcnJvci5tZXNzYWdlXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkRXJyb3IocHJvcGVydHksIHByb3BlcnR5Lm5ld0Vycm9yKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1cy1jaXJjbGVcIj48L2ZhLWljb24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwbC0yXCI+QWRkPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcG9wdXBFcnJvckZvcm0gbGV0LWRhdGE9XCJkYXRhXCI+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cbiAgICAgICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cImRhdGEubGV2ZWxcIj5cbiAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJ1bmRlZmluZWRcIj5TZWxlY3QgTGV2ZWw8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZXJyb3JcIj5FcnJvcjwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuaW5nXCI+V2FybmluZzwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICA8aW5wdXQgY2xhc3M9XCJpbnB1dFwiXG4gICAgICAgIFsobmdNb2RlbCldPVwiZGF0YS5tZXNzYWdlXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIG1lc3NhZ2UgaGVyZVwiXG4gICAgICA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzdWdnZXN0aW9uIGxldC1yPVwicmVzdWx0XCIgbGV0LXQ9XCJ0ZXJtXCI+XG4gIDxuZ2ItaGlnaGxpZ2h0XG4gICAgW3RpdGxlXT1cInIuYmlibGlvZ3JhcGh5Py50aXRsZSB8fCByLmJpYmxpb2dyYXBoeT8uZG9jdW1lbnRET0kgfHwgci5iaWJsaW9ncmFwaHk/LnNjb3B1cyB8fCByLm5hbWVcIlxuICAgIFtyZXN1bHRdPVwici5iaWJsaW9ncmFwaHk/LnRpdGxlIHx8IHIuYmlibGlvZ3JhcGh5Py5kb2N1bWVudERPSSB8fCByLmJpYmxpb2dyYXBoeT8uc2NvcHVzIHx8IHIubmFtZVwiXG4gICAgW3Rlcm1dPVwidFwiXG4gID48L25nYi1oaWdobGlnaHQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3BhZGRlcj5cbiAgPGRpdiBjbGFzcz1cInB0LTFcIj48L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY29udmVydFVuaXRzIGxldC12YWx1ZT1cInZhbHVlXCIgbGV0LXRlcm09XCJ0ZXJtXCIgbGV0LXVuaXRzPVwidW5pdHNcIj5cbiAgPGhlLXVuaXQtY29udmVydGVyIFt2YWx1ZV09XCJ2YWx1ZVwiIFt0ZXJtXT1cInRlcm1cIiBbdG9Vbml0c109XCJ1bml0c1wiPjwvaGUtdW5pdC1jb252ZXJ0ZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|