@hestia-earth/ui-components 0.29.2 → 0.29.4
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/common/maps-utils.d.ts +4 -0
- package/common/navigation-menu/navigation-menu.component.d.ts +1 -0
- package/common/node-utils.d.ts +4 -2
- package/common/semver-utils.d.ts +2 -3
- package/common/utils.d.ts +0 -5
- package/cycles/cycles-nodes/cycles-nodes.component.d.ts +1 -1
- package/engine/engine-models-stage-deep/engine-models-stage-deep.component.d.ts +1 -1
- package/engine/engine-models-version-link/engine-models-version-link.component.d.ts +1 -1
- package/engine/engine.service.d.ts +1 -1
- package/esm2022/bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component.mjs +3 -3
- package/esm2022/chart/chart.component.mjs +3 -3
- package/esm2022/chart/line-chart/line-chart.component.mjs +3 -3
- package/esm2022/common/blank-node-state/blank-node-state.component.mjs +3 -3
- package/esm2022/common/clipboard/clipboard.component.mjs +3 -3
- package/esm2022/common/collapsible-box/collapsible-box.component.mjs +3 -3
- package/esm2022/common/data-table/data-table.component.mjs +3 -3
- package/esm2022/common/drawer-container/drawer-container.component.mjs +3 -3
- package/esm2022/common/link-key-value/link-key-value.component.mjs +3 -3
- package/esm2022/common/maps-drawing-confirm/maps-drawing-confirm.component.mjs +3 -3
- package/esm2022/common/maps-utils.mjs +3 -1
- package/esm2022/common/mobile-shell/mobile-shell.component.mjs +3 -3
- package/esm2022/common/navigation-menu/navigation-menu.component.mjs +7 -3
- package/esm2022/common/node-utils.mjs +12 -7
- package/esm2022/common/schema-version-link/schema-version-link.component.mjs +3 -3
- package/esm2022/common/search-extend/search-extend.component.mjs +3 -3
- package/esm2022/common/semver-utils.mjs +3 -4
- package/esm2022/common/shelf-dialog/shelf-dialog.component.mjs +3 -3
- package/esm2022/common/shell/shell.component.mjs +3 -3
- package/esm2022/common/sort-select/sort-select.component.mjs +3 -3
- package/esm2022/common/utils.mjs +1 -9
- package/esm2022/cycles/cycles-completeness/cycles-completeness.component.mjs +3 -3
- package/esm2022/cycles/cycles-nodes/cycles-nodes.component.mjs +5 -5
- package/esm2022/cycles/cycles-nodes-timeline/cycles-nodes-timeline.component.mjs +3 -3
- package/esm2022/engine/engine-models-stage-deep/engine-models-stage-deep.component.mjs +9 -8
- package/esm2022/engine/engine-models-version-link/engine-models-version-link.component.mjs +3 -3
- package/esm2022/engine/engine-requirements-form/engine-requirements-form.component.mjs +3 -3
- package/esm2022/engine/engine.service.mjs +3 -2
- package/esm2022/files/files-error-summary/files-error-summary-item/files-error-summary-item.component.mjs +3 -3
- package/esm2022/files/files-form.model.mjs +3 -2
- package/esm2022/files/files-upload-errors/files-upload-errors.component.mjs +3 -3
- package/esm2022/impact-assessments/impact-assessments-graph/impact-assessments-graph.component.mjs +3 -3
- package/esm2022/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.mjs +3 -3
- package/esm2022/impact-assessments/impact-assessments-products/impact-assessments-products.component.mjs +7 -4
- package/esm2022/node/node-csv-export-confirm/node-csv-export-confirm.component.mjs +3 -3
- package/esm2022/node/node-csv-select-headers/node-csv-select-headers.component.mjs +3 -3
- package/esm2022/node/node-diffs/node-diffs.component.mjs +3 -3
- package/esm2022/node/node-link/node-link.component.mjs +3 -3
- package/esm2022/node/node-logs-file/node-logs-file.component.mjs +3 -3
- package/esm2022/node/node-logs-models/node-logs-models.component.mjs +34 -41
- package/esm2022/node/node-logs-models/node-logs-models.model.mjs +10 -6
- package/esm2022/node/node-missing-lookup-factors/node-missing-lookup-factors.component.mjs +3 -3
- package/esm2022/node/node-recommendations/node-recommendations.component.mjs +3 -3
- package/esm2022/node/node-store.service.mjs +1 -1
- package/esm2022/node/node-value-details/node-value-details.component.mjs +5 -3
- package/esm2022/schema/schema-info/schema-info.component.mjs +3 -3
- package/esm2022/select/select-option/select-option.component.mjs +3 -3
- package/esm2022/select/select-option-group/select-option-group.component.mjs +3 -3
- package/esm2022/select/select.component.mjs +3 -3
- package/esm2022/sites/sites-management-chart/sites-management-chart.component.mjs +8 -12
- package/esm2022/sites/sites-nodes/sites-nodes.component.mjs +6 -5
- package/esm2022/terms/terms-property-content/terms-property-content.component.mjs +3 -3
- package/esm2022/terms/terms-sub-class-of-content/terms-sub-class-of-content.component.mjs +3 -3
- package/esm2022/terms/terms-units-description/terms-units-description.component.mjs +3 -3
- package/fesm2022/hestia-earth-ui-components.mjs +172 -170
- package/fesm2022/hestia-earth-ui-components.mjs.map +1 -1
- package/impact-assessments/impact-assessments-products/impact-assessments-products.component.d.ts +2 -0
- package/node/node-logs-models/node-logs-models.component.d.ts +4 -4
- package/node/node-logs-models/node-logs-models.model.d.ts +1 -1
- package/node/node-store.service.d.ts +1 -1
- package/package.json +1 -1
- package/sites/sites-management-chart/sites-management-chart.component.d.ts +1 -0
- package/sites/sites-nodes/sites-nodes.component.d.ts +2 -1
- package/styles.scss +5 -34
|
@@ -92,7 +92,7 @@ export class CyclesCompletenessComponent {
|
|
|
92
92
|
component.headerKeys.set(headerKeys);
|
|
93
93
|
}
|
|
94
94
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: CyclesCompletenessComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
95
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: CyclesCompletenessComponent, isStandalone: true, selector: "he-cycles-completeness", inputs: { dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"columns is-variable is-align-items-center is-2 m-0\">\n <div class=\"column\">\n @if (selectedView() === View.table) {\n <button class=\"button is-small is-ghost\" (click)=\"showDownload()\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\"
|
|
95
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: CyclesCompletenessComponent, isStandalone: true, selector: "he-cycles-completeness", inputs: { dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"columns is-variable is-align-items-center is-2 m-0\">\n <div class=\"column\">\n @if (selectedView() === View.table) {\n <button class=\"button is-small is-ghost\" (click)=\"showDownload()\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\" />\n </button>\n }\n </div>\n @if (views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\" />\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@switch (selectedView()) {\n @case (View.table) {\n <div class=\"px-3 pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n @for (completeness of completenessKeys(); track completeness) {\n <th [attr.title]=\"completeness\">\n <a [href]=\"schemaBaseUrl + '/Completeness#' + completeness\" target=\"_blank\">\n {{ keyToLabel(completeness) }}\n </a>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(i, cycle); let i = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle\">\n <span>{{ i + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n @for (key of completenessKeys(); track key) {\n <td class=\"is-nowrap\">\n <span>{{ getCompleteness(cycle)[key] ? 'Complete' : 'Incomplete' }}</span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"getCompleteness(cycle)\"\n [key]=\"key\"></he-blank-node-state>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice [dataState]=\"dataState()\"></he-blank-node-state-notice>\n } @else {\n <div class=\"panel-block\">\n <span>No completeness data</span>\n </div>\n }\n </div>\n }\n @case (View.logs) {\n @if (cycles().length > 1) {\n <div class=\"field has-addons pt-2 px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let i = $index) {\n <option [value]=\"i\">{{ i + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"nodeKey\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"></he-node-logs-models>\n }\n }\n}\n", styles: [""], dependencies: [{ kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showDeleted"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "component", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
96
96
|
}
|
|
97
97
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: CyclesCompletenessComponent, decorators: [{
|
|
98
98
|
type: Component,
|
|
@@ -105,6 +105,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
105
105
|
BlankNodeStateNoticeComponent,
|
|
106
106
|
FormsModule,
|
|
107
107
|
NodeLogsModelsComponent
|
|
108
|
-
], template: "<div class=\"columns is-variable is-align-items-center is-2 m-0\">\n <div class=\"column\">\n @if (selectedView() === View.table) {\n <button class=\"button is-small is-ghost\" (click)=\"showDownload()\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\"
|
|
108
|
+
], template: "<div class=\"columns is-variable is-align-items-center is-2 m-0\">\n <div class=\"column\">\n @if (selectedView() === View.table) {\n <button class=\"button is-small is-ghost\" (click)=\"showDownload()\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\" />\n </button>\n }\n </div>\n @if (views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\" />\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@switch (selectedView()) {\n @case (View.table) {\n <div class=\"px-3 pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n @for (completeness of completenessKeys(); track completeness) {\n <th [attr.title]=\"completeness\">\n <a [href]=\"schemaBaseUrl + '/Completeness#' + completeness\" target=\"_blank\">\n {{ keyToLabel(completeness) }}\n </a>\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(i, cycle); let i = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle\">\n <span>{{ i + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n @for (key of completenessKeys(); track key) {\n <td class=\"is-nowrap\">\n <span>{{ getCompleteness(cycle)[key] ? 'Complete' : 'Incomplete' }}</span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"getCompleteness(cycle)\"\n [key]=\"key\"></he-blank-node-state>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice [dataState]=\"dataState()\"></he-blank-node-state-notice>\n } @else {\n <div class=\"panel-block\">\n <span>No completeness data</span>\n </div>\n }\n </div>\n }\n @case (View.logs) {\n @if (cycles().length > 1) {\n <div class=\"field has-addons pt-2 px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let i = $index) {\n <option [value]=\"i\">{{ i + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"nodeKey\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"></he-node-logs-models>\n }\n }\n}\n" }]
|
|
109
109
|
}], ctorParameters: () => [] });
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLWNvbXBsZXRlbmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1jb21wbGV0ZW5lc3MvY3ljbGVzLWNvbXBsZXRlbmVzcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1jb21wbGV0ZW5lc3MvY3ljbGVzLWNvbXBsZXRlbmVzcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFrQixZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBZ0IsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pF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Q0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7K0dBaEZVLDJCQUEyQjttR0FBM0IsMkJBQTJCLGtPQ3ZEeEMsNjhIQXlHQSwwREQzREksZUFBZSw0TUFDZixrQkFBa0IsdUdBQ2xCLGlCQUFpQiw0R0FDakIsdUJBQXVCLG1KQUN2Qiw2QkFBNkIsNEdBQzdCLFdBQVcsNE9BQ1gsdUJBQXVCOzs0RkFHZCwyQkFBMkI7a0JBakJ2QyxTQUFTOytCQUNFLHdCQUF3QixtQkFHakIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsVUFBVTt3QkFDVixlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsaUJBQWlCO3dCQUNqQix1QkFBdUI7d0JBQ3ZCLDZCQUE2Qjt3QkFDN0IsV0FBVzt3QkFDWCx1QkFBdUI7cUJBQ3hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmFJY29uQ29tcG9uZW50IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2FuZ3VsYXItZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHsgSWNvbkRlZmluaXRpb24sIGZhQ2FsY3VsYXRvciwgZmFEb3dubG9hZCwgZmFMaXN0IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcbmltcG9ydCB7IE5nYk1vZGFsLCBOZ2JUb29sdGlwIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgRGF0YVN0YXRlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9hcGknO1xuaW1wb3J0IHsgSUN5Y2xlSlNPTkxELCBOb2RlVHlwZSwgTm9uQmxhbmtOb2Rlc0tleSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IGtleVRvTGFiZWwgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcblxuaW1wb3J0IHsgSGVOb2RlU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgaXNWYWxpZEtleSB9IGZyb20gJy4uLy4uL2NvbW1vbi9ub2RlLXV0aWxzJztcbmltcG9ydCB7IGRlZmF1bHRMYWJlbCwgc2NoZW1hQmFzZVVybCB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBsb2dzS2V5IH0gZnJvbSAnLi4vY3ljbGVzLm1vZGVsJztcbmltcG9ydCB7IE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUxvZ3NNb2RlbHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtbG9ncy1tb2RlbHMvbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmxhbmtOb2RlU3RhdGVOb3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UvYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJsYW5rTm9kZVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL2JsYW5rLW5vZGUtc3RhdGUvYmxhbmstbm9kZS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUxpbmtDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtbGluay9ub2RlLWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50JztcblxuZW51bSBWaWV3IHtcbiAgdGFibGUgPSAnVGFibGUgdmlldycsXG4gIGxvZ3MgPSAnUmVjYWxjdWxhdGlvbnMgbG9ncydcbn1cblxuY29uc3Qgdmlld0ljb246IHtcbiAgW3ZpZXcgaW4gVmlld106IEljb25EZWZpbml0aW9uO1xufSA9IHtcbiAgW1ZpZXcubG9nc106IGZhQ2FsY3VsYXRvcixcbiAgW1ZpZXcudGFibGVdOiBmYUxpc3Rcbn07XG5cbmNvbnN0IGhlYWRlcktleXMgPSBbJ2N5Y2xlLmlkJywgJ2N5Y2xlLkBpZCcsICdjeWNsZS5jb21wbGV0ZW5lc3MuJ107XG5cbi8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBzY2hlbWEgdmVyc2lvbiA8IDE0XG5jb25zdCBnZXRDb21wbGV0ZW5lc3MgPSAoY3ljbGU6IGFueSkgPT4gY3ljbGU/LmNvbXBsZXRlbmVzcyB8fCBjeWNsZT8uZGF0YUNvbXBsZXRlbmVzcyB8fCB7fTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtY3ljbGVzLWNvbXBsZXRlbmVzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jeWNsZXMtY29tcGxldGVuZXNzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3ljbGVzLWNvbXBsZXRlbmVzcy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nYlRvb2x0aXAsXG4gICAgRmFJY29uQ29tcG9uZW50LFxuICAgIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgICBOb2RlTGlua0NvbXBvbmVudCxcbiAgICBCbGFua05vZGVTdGF0ZUNvbXBvbmVudCxcbiAgICBCbGFua05vZGVTdGF0ZU5vdGljZUNvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOb2RlTG9nc01vZGVsc0NvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEN5Y2xlc0NvbXBsZXRlbmVzc0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kYWxTZXJ2aWNlID0gaW5qZWN0KE5nYk1vZGFsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBub2RlU3RvcmVTZXJ2aWNlID0gaW5qZWN0KEhlTm9kZVN0b3JlU2VydmljZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhRG93bmxvYWQgPSBmYURvd25sb2FkO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhU3RhdGUgPSBpbnB1dChEYXRhU3RhdGUub3JpZ2luYWwpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzY2hlbWFCYXNlVXJsID0gc2NoZW1hQmFzZVVybCgpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdExhYmVsID0gZGVmYXVsdExhYmVsO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkga2V5VG9MYWJlbCA9IGtleVRvTGFiZWw7XG4gIHByb3RlY3RlZCByZWFkb25seSBnZXRDb21wbGV0ZW5lc3MgPSBnZXRDb21wbGV0ZW5lc3M7XG4gIHByb3RlY3RlZCByZWFkb25seSBub2RlS2V5ID0gTm9uQmxhbmtOb2Rlc0tleS5jb21wbGV0ZW5lc3M7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFZpZXcgPSBWaWV3O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld0ljb24gPSB2aWV3SWNvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93VmlldyA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICAoe1xuICAgICAgICBbVmlldy5sb2dzXTogIXRoaXMuaXNPcmlnaW5hbCgpLFxuICAgICAgICBbVmlldy50YWJsZV06IHRydWVcbiAgICAgIH0pIGFzIHsgW3ZpZXcgaW4gVmlld106IGJvb2xlYW4gfVxuICApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld3MgPSBjb21wdXRlZCgoKSA9PiBPYmplY3QudmFsdWVzKFZpZXcpLmZpbHRlcih2aWV3ID0+IHRoaXMuc2hvd1ZpZXcoKVt2aWV3XSkgPz8gW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRWaWV3ID0gc2lnbmFsKFZpZXcudGFibGUpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3JpZ2luYWxDeWNsZXMgPSB0b1NpZ25hbChcbiAgICB0aGlzLm5vZGVTdG9yZVNlcnZpY2UuZmluZEJ5U3RhdGUkPElDeWNsZUpTT05MRD4oTm9kZVR5cGUuQ3ljbGUsIERhdGFTdGF0ZS5vcmlnaW5hbClcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWxsQ3ljbGVzID0gdG9TaWduYWwodGhpcy5ub2RlU3RvcmVTZXJ2aWNlLmZpbmQkPElDeWNsZUpTT05MRD4oTm9kZVR5cGUuQ3ljbGUpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGN5Y2xlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbEN5Y2xlcygpPy5tYXAoZGF0YSA9PiBkYXRhW3RoaXMuZGF0YVN0YXRlKCldKSB8fCBbXSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RlZEluZGV4ID0gc2lnbmFsKDApO1xuICBwcml2YXRlIHJlYWRvbmx5IG9naXJpbmFsU2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3JpZ2luYWxDeWNsZXMoKT8uW3RoaXMuc2VsZWN0ZWRJbmRleCgpXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3ljbGVzKCk/Llt0aGlzLnNlbGVjdGVkSW5kZXgoKV0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRMb2dzS2V5ID0gY29tcHV0ZWQoKCkgPT4gbG9nc0tleSh0aGlzLnNlbGVjdGVkQ3ljbGUoKSkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRPcmlnaW5hbFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IGdldENvbXBsZXRlbmVzcyh0aGlzLm9naXJpbmFsU2VsZWN0ZWRDeWNsZSgpKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IGdldENvbXBsZXRlbmVzcyh0aGlzLnNlbGVjdGVkQ3ljbGUoKSkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWROb2RlID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLnNlbGVjdGVkQ3ljbGUoKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4udGhpcy5zZWxlY3RlZEN5Y2xlKCksXG4gICAgICAgICAgJ0B0eXBlJzogTm9kZVR5cGUuQ3ljbGUsXG4gICAgICAgICAgdHlwZTogTm9kZVR5cGUuQ3ljbGUsXG4gICAgICAgICAgZGF0YVN0YXRlOiBEYXRhU3RhdGUucmVjYWxjdWxhdGVkXG4gICAgICAgIH1cbiAgICAgIDogbnVsbFxuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBoYXNEYXRhID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jeWNsZXMoKS5sZW5ndGgpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcmlnaW5hbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGF0YVN0YXRlKCkgPT09IERhdGFTdGF0ZS5vcmlnaW5hbCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbXBsZXRlbmVzc0tleXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIE9iamVjdC5rZXlzKGdldENvbXBsZXRlbmVzcyh0aGlzLnNlbGVjdGVkQ3ljbGUoKSkpLmZpbHRlcihpc1ZhbGlkS2V5KS5zb3J0KClcbiAgKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gbWFrZSBzdXJlIGxvZ3MgZG9lcyBub3QgcmVtYWluIGRpc3BsYXllZCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIG9yaWdpbmFsIHZpZXdcbiAgICAgIGlmICh0aGlzLmlzT3JpZ2luYWwoKSAmJiB0aGlzLnNlbGVjdGVkVmlldygpID09PSBWaWV3LmxvZ3MpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcuc2V0KFZpZXcudGFibGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlJZChfaW5kZXg6IG51bWJlciwgaXRlbTogSUN5Y2xlSlNPTkxEKSB7XG4gICAgcmV0dXJuIGl0ZW1bJ0BpZCddO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdEluZGV4KHsgdGFyZ2V0OiB7IHZhbHVlIH0gfSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleC5zZXQoK3ZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93RG93bmxvYWQoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50KTtcbiAgICBjb25zdCBjb21wb25lbnQgPSBpbnN0YW5jZS5jb21wb25lbnRJbnN0YW5jZSBhcyBOb2RlQ3N2RXhwb3J0Q29uZmlybUNvbXBvbmVudDtcbiAgICBjb21wb25lbnQubm9kZXMuc2V0KHRoaXMuY3ljbGVzKCkpO1xuICAgIGNvbXBvbmVudC5maWxlbmFtZS5zZXQoJ2NvbXBsZXRlbmVzcy5jc3YnKTtcbiAgICBjb21wb25lbnQuaXNVcGxvYWQuc2V0KGZhbHNlKTtcbiAgICBjb21wb25lbnQuaGVhZGVyS2V5cy5zZXQoaGVhZGVyS2V5cyk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLXZhcmlhYmxlIGlzLWFsaWduLWl0ZW1zLWNlbnRlciBpcy0yIG0tMFwiPlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uXCI+XG4gICAgQGlmIChzZWxlY3RlZFZpZXcoKSA9PT0gVmlldy50YWJsZSkge1xuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1naG9zdFwiIChjbGljayk9XCJzaG93RG93bmxvYWQoKVwiPlxuICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYURvd25sb2FkXCIgc2l6ZT1cImxnXCI+PC9mYS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmICh2aWV3cygpPy5sZW5ndGggPiAxKSB7XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICAgIEBmb3IgKHZpZXcgb2Ygdmlld3MoKTsgdHJhY2sgdmlldykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cInNlbGVjdGVkVmlldygpID09PSB2aWV3XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkVmlldy5zZXQodmlldylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwidmlld0ljb25bdmlld11cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1oaWRkZW4tbW9iaWxlXCI+e3sgdmlldyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbkBzd2l0Y2ggKHNlbGVjdGVkVmlldygpKSB7XG4gIEBjYXNlIChWaWV3LnRhYmxlKSB7XG4gICAgPGRpdiBjbGFzcz1cInB4LTMgcGItM1wiPlxuICAgICAgQGlmIChoYXNEYXRhKCkpIHtcbiAgICAgICAgPGhlLWRhdGEtdGFibGUgY2xhc3M9XCJtYi0xIGlzLXNtYWxsXCIgW3NtYWxsXT1cInRydWVcIiBtYXhIZWlnaHQ9XCIzMjBcIj5cbiAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1uYXJyb3cgaXMtc3RyaXBlZFwiPlxuICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJoYXMtdGV4dC13ZWlnaHQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIj48L3RoPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbXBsZXRlbmVzcyBvZiBjb21wbGV0ZW5lc3NLZXlzKCk7IHRyYWNrIGNvbXBsZXRlbmVzcykge1xuICAgICAgICAgICAgICAgICAgPHRoIFthdHRyLnRpdGxlXT1cImNvbXBsZXRlbmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJzY2hlbWFCYXNlVXJsICsgJy9Db21wbGV0ZW5lc3MjJyArIGNvbXBsZXRlbmVzc1wiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7IGtleVRvTGFiZWwoY29tcGxldGVuZXNzKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgIEBmb3IgKGN5Y2xlIG9mIGN5Y2xlcygpOyB0cmFjayB0cmFja0J5SWQoaSwgY3ljbGUpOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiIFthdHRyLnRpdGxlXT1cImRlZmF1bHRMYWJlbChjeWNsZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBbbm9kZV09XCJjeWNsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19LiB7eyBkZWZhdWx0TGFiZWwoY3ljbGUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICBAZm9yIChrZXkgb2YgY29tcGxldGVuZXNzS2V5cygpOyB0cmFjayBrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaXMtbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZ2V0Q29tcGxldGVuZXNzKGN5Y2xlKVtrZXldID8gJ0NvbXBsZXRlJyA6ICdJbmNvbXBsZXRlJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtbC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVdPVwiZ2V0Q29tcGxldGVuZXNzKGN5Y2xlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBba2V5XT1cImtleVwiPjwvaGUtYmxhbmstbm9kZS1zdGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgIDwvaGUtZGF0YS10YWJsZT5cbiAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIj48L2hlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ibG9ja1wiPlxuICAgICAgICAgIDxzcGFuPk5vIGNvbXBsZXRlbmVzcyBkYXRhPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuICBAY2FzZSAoVmlldy5sb2dzKSB7XG4gICAgQGlmIChjeWNsZXMoKS5sZW5ndGggPiAxKSB7XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9ucyBwdC0yIHB4LTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1zdGF0aWMgaXMtc2Vjb25kYXJ5XCI+U2VsZWN0IGEgQ3ljbGU8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtc21hbGwgaXMtZnVsbHdpZHRoIGlzLXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgPHNlbGVjdCAoY2hhbmdlKT1cInNlbGVjdEluZGV4KCRldmVudClcIj5cbiAgICAgICAgICAgICAgQGZvciAodmFsdWUgb2YgY3ljbGVzKCk7IHRyYWNrIHZhbHVlOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImlcIj57eyBpICsgMSB9fS4ge3sgZGVmYXVsdExhYmVsKHZhbHVlKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgQGlmIChzZWxlY3RlZE5vZGUoKSkge1xuICAgICAgPGhlLW5vZGUtbG9ncy1tb2RlbHNcbiAgICAgICAgW25vZGVdPVwic2VsZWN0ZWROb2RlKClcIlxuICAgICAgICBbbm9kZUtleV09XCJub2RlS2V5XCJcbiAgICAgICAgW2xvZ3NLZXldPVwic2VsZWN0ZWRMb2dzS2V5KClcIlxuICAgICAgICBbb3JpZ2luYWxWYWx1ZXNdPVwic2VsZWN0ZWRPcmlnaW5hbFZhbHVlcygpXCJcbiAgICAgICAgW3JlY2FsY3VsYXRlZFZhbHVlc109XCJzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcygpXCI+PC9oZS1ub2RlLWxvZ3MtbW9kZWxzPlxuICAgIH1cbiAgfVxufVxuIl19
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLWNvbXBsZXRlbmVzcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1jb21wbGV0ZW5lc3MvY3ljbGVzLWNvbXBsZXRlbmVzcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1jb21wbGV0ZW5lc3MvY3ljbGVzLWNvbXBsZXRlbmVzcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFrQixZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBZ0IsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2pF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Q0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7K0dBaEZVLDJCQUEyQjttR0FBM0IsMkJBQTJCLGtPQ3ZEeEMsNjdIQXlHQSwwREQzREksZUFBZSw0TUFDZixrQkFBa0IsdUdBQ2xCLGlCQUFpQiw0R0FDakIsdUJBQXVCLG1KQUN2Qiw2QkFBNkIsNEdBQzdCLFdBQVcsNE9BQ1gsdUJBQXVCOzs0RkFHZCwyQkFBMkI7a0JBakJ2QyxTQUFTOytCQUNFLHdCQUF3QixtQkFHakIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsVUFBVTt3QkFDVixlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsaUJBQWlCO3dCQUNqQix1QkFBdUI7d0JBQ3ZCLDZCQUE2Qjt3QkFDN0IsV0FBVzt3QkFDWCx1QkFBdUI7cUJBQ3hCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRmFJY29uQ29tcG9uZW50IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2FuZ3VsYXItZm9udGF3ZXNvbWUnO1xuaW1wb3J0IHsgSWNvbkRlZmluaXRpb24sIGZhQ2FsY3VsYXRvciwgZmFEb3dubG9hZCwgZmFMaXN0IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcbmltcG9ydCB7IE5nYk1vZGFsLCBOZ2JUb29sdGlwIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgRGF0YVN0YXRlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9hcGknO1xuaW1wb3J0IHsgSUN5Y2xlSlNPTkxELCBOb2RlVHlwZSwgTm9uQmxhbmtOb2Rlc0tleSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IGtleVRvTGFiZWwgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcblxuaW1wb3J0IHsgSGVOb2RlU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgaXNWYWxpZEtleSB9IGZyb20gJy4uLy4uL2NvbW1vbi9ub2RlLXV0aWxzJztcbmltcG9ydCB7IGRlZmF1bHRMYWJlbCwgc2NoZW1hQmFzZVVybCB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBsb2dzS2V5IH0gZnJvbSAnLi4vY3ljbGVzLm1vZGVsJztcbmltcG9ydCB7IE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUxvZ3NNb2RlbHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtbG9ncy1tb2RlbHMvbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmxhbmtOb2RlU3RhdGVOb3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UvYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJsYW5rTm9kZVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL2JsYW5rLW5vZGUtc3RhdGUvYmxhbmstbm9kZS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUxpbmtDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtbGluay9ub2RlLWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50JztcblxuZW51bSBWaWV3IHtcbiAgdGFibGUgPSAnVGFibGUgdmlldycsXG4gIGxvZ3MgPSAnUmVjYWxjdWxhdGlvbnMgbG9ncydcbn1cblxuY29uc3Qgdmlld0ljb246IHtcbiAgW3ZpZXcgaW4gVmlld106IEljb25EZWZpbml0aW9uO1xufSA9IHtcbiAgW1ZpZXcubG9nc106IGZhQ2FsY3VsYXRvcixcbiAgW1ZpZXcudGFibGVdOiBmYUxpc3Rcbn07XG5cbmNvbnN0IGhlYWRlcktleXMgPSBbJ2N5Y2xlLmlkJywgJ2N5Y2xlLkBpZCcsICdjeWNsZS5jb21wbGV0ZW5lc3MuJ107XG5cbi8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBzY2hlbWEgdmVyc2lvbiA8IDE0XG5jb25zdCBnZXRDb21wbGV0ZW5lc3MgPSAoY3ljbGU6IGFueSkgPT4gY3ljbGU/LmNvbXBsZXRlbmVzcyB8fCBjeWNsZT8uZGF0YUNvbXBsZXRlbmVzcyB8fCB7fTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtY3ljbGVzLWNvbXBsZXRlbmVzcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jeWNsZXMtY29tcGxldGVuZXNzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY3ljbGVzLWNvbXBsZXRlbmVzcy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nYlRvb2x0aXAsXG4gICAgRmFJY29uQ29tcG9uZW50LFxuICAgIERhdGFUYWJsZUNvbXBvbmVudCxcbiAgICBOb2RlTGlua0NvbXBvbmVudCxcbiAgICBCbGFua05vZGVTdGF0ZUNvbXBvbmVudCxcbiAgICBCbGFua05vZGVTdGF0ZU5vdGljZUNvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBOb2RlTG9nc01vZGVsc0NvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEN5Y2xlc0NvbXBsZXRlbmVzc0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kYWxTZXJ2aWNlID0gaW5qZWN0KE5nYk1vZGFsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBub2RlU3RvcmVTZXJ2aWNlID0gaW5qZWN0KEhlTm9kZVN0b3JlU2VydmljZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhRG93bmxvYWQgPSBmYURvd25sb2FkO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhU3RhdGUgPSBpbnB1dChEYXRhU3RhdGUub3JpZ2luYWwpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzY2hlbWFCYXNlVXJsID0gc2NoZW1hQmFzZVVybCgpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdExhYmVsID0gZGVmYXVsdExhYmVsO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkga2V5VG9MYWJlbCA9IGtleVRvTGFiZWw7XG4gIHByb3RlY3RlZCByZWFkb25seSBnZXRDb21wbGV0ZW5lc3MgPSBnZXRDb21wbGV0ZW5lc3M7XG4gIHByb3RlY3RlZCByZWFkb25seSBub2RlS2V5ID0gTm9uQmxhbmtOb2Rlc0tleS5jb21wbGV0ZW5lc3M7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFZpZXcgPSBWaWV3O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld0ljb24gPSB2aWV3SWNvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93VmlldyA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICAoe1xuICAgICAgICBbVmlldy5sb2dzXTogIXRoaXMuaXNPcmlnaW5hbCgpLFxuICAgICAgICBbVmlldy50YWJsZV06IHRydWVcbiAgICAgIH0pIGFzIHsgW3ZpZXcgaW4gVmlld106IGJvb2xlYW4gfVxuICApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld3MgPSBjb21wdXRlZCgoKSA9PiBPYmplY3QudmFsdWVzKFZpZXcpLmZpbHRlcih2aWV3ID0+IHRoaXMuc2hvd1ZpZXcoKVt2aWV3XSkgPz8gW10pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRWaWV3ID0gc2lnbmFsKFZpZXcudGFibGUpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3JpZ2luYWxDeWNsZXMgPSB0b1NpZ25hbChcbiAgICB0aGlzLm5vZGVTdG9yZVNlcnZpY2UuZmluZEJ5U3RhdGUkPElDeWNsZUpTT05MRD4oTm9kZVR5cGUuQ3ljbGUsIERhdGFTdGF0ZS5vcmlnaW5hbClcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWxsQ3ljbGVzID0gdG9TaWduYWwodGhpcy5ub2RlU3RvcmVTZXJ2aWNlLmZpbmQkPElDeWNsZUpTT05MRD4oTm9kZVR5cGUuQ3ljbGUpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGN5Y2xlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbEN5Y2xlcygpPy5tYXAoZGF0YSA9PiBkYXRhW3RoaXMuZGF0YVN0YXRlKCldKSB8fCBbXSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3RlZEluZGV4ID0gc2lnbmFsKDApO1xuICBwcml2YXRlIHJlYWRvbmx5IG9naXJpbmFsU2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3JpZ2luYWxDeWNsZXMoKT8uW3RoaXMuc2VsZWN0ZWRJbmRleCgpXSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3ljbGVzKCk/Llt0aGlzLnNlbGVjdGVkSW5kZXgoKV0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRMb2dzS2V5ID0gY29tcHV0ZWQoKCkgPT4gbG9nc0tleSh0aGlzLnNlbGVjdGVkQ3ljbGUoKSkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRPcmlnaW5hbFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IGdldENvbXBsZXRlbmVzcyh0aGlzLm9naXJpbmFsU2VsZWN0ZWRDeWNsZSgpKSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IGdldENvbXBsZXRlbmVzcyh0aGlzLnNlbGVjdGVkQ3ljbGUoKSkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWROb2RlID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLnNlbGVjdGVkQ3ljbGUoKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4udGhpcy5zZWxlY3RlZEN5Y2xlKCksXG4gICAgICAgICAgJ0B0eXBlJzogTm9kZVR5cGUuQ3ljbGUsXG4gICAgICAgICAgdHlwZTogTm9kZVR5cGUuQ3ljbGUsXG4gICAgICAgICAgZGF0YVN0YXRlOiBEYXRhU3RhdGUucmVjYWxjdWxhdGVkXG4gICAgICAgIH1cbiAgICAgIDogbnVsbFxuICApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBoYXNEYXRhID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jeWNsZXMoKS5sZW5ndGgpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNPcmlnaW5hbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZGF0YVN0YXRlKCkgPT09IERhdGFTdGF0ZS5vcmlnaW5hbCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbXBsZXRlbmVzc0tleXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIE9iamVjdC5rZXlzKGdldENvbXBsZXRlbmVzcyh0aGlzLnNlbGVjdGVkQ3ljbGUoKSkpLmZpbHRlcihpc1ZhbGlkS2V5KS5zb3J0KClcbiAgKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gbWFrZSBzdXJlIGxvZ3MgZG9lcyBub3QgcmVtYWluIGRpc3BsYXllZCB3aGVuIHN3aXRjaGluZyBiYWNrIHRvIG9yaWdpbmFsIHZpZXdcbiAgICAgIGlmICh0aGlzLmlzT3JpZ2luYWwoKSAmJiB0aGlzLnNlbGVjdGVkVmlldygpID09PSBWaWV3LmxvZ3MpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcuc2V0KFZpZXcudGFibGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlJZChfaW5kZXg6IG51bWJlciwgaXRlbTogSUN5Y2xlSlNPTkxEKSB7XG4gICAgcmV0dXJuIGl0ZW1bJ0BpZCddO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdEluZGV4KHsgdGFyZ2V0OiB7IHZhbHVlIH0gfSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleC5zZXQoK3ZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93RG93bmxvYWQoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50KTtcbiAgICBjb25zdCBjb21wb25lbnQgPSBpbnN0YW5jZS5jb21wb25lbnRJbnN0YW5jZSBhcyBOb2RlQ3N2RXhwb3J0Q29uZmlybUNvbXBvbmVudDtcbiAgICBjb21wb25lbnQubm9kZXMuc2V0KHRoaXMuY3ljbGVzKCkpO1xuICAgIGNvbXBvbmVudC5maWxlbmFtZS5zZXQoJ2NvbXBsZXRlbmVzcy5jc3YnKTtcbiAgICBjb21wb25lbnQuaXNVcGxvYWQuc2V0KGZhbHNlKTtcbiAgICBjb21wb25lbnQuaGVhZGVyS2V5cy5zZXQoaGVhZGVyS2V5cyk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjb2x1bW5zIGlzLXZhcmlhYmxlIGlzLWFsaWduLWl0ZW1zLWNlbnRlciBpcy0yIG0tMFwiPlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uXCI+XG4gICAgQGlmIChzZWxlY3RlZFZpZXcoKSA9PT0gVmlldy50YWJsZSkge1xuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1naG9zdFwiIChjbGljayk9XCJzaG93RG93bmxvYWQoKVwiPlxuICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYURvd25sb2FkXCIgc2l6ZT1cImxnXCIgLz5cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG4gIEBpZiAodmlld3MoKT8ubGVuZ3RoID4gMSkge1xuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9uc1wiPlxuICAgICAgICBAZm9yICh2aWV3IG9mIHZpZXdzKCk7IHRyYWNrIHZpZXcpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJzZWxlY3RlZFZpZXcoKSA9PT0gdmlld1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZFZpZXcuc2V0KHZpZXcpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cInZpZXdJY29uW3ZpZXddXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWhpZGRlbi1tb2JpbGVcIj57eyB2aWV3IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuQHN3aXRjaCAoc2VsZWN0ZWRWaWV3KCkpIHtcbiAgQGNhc2UgKFZpZXcudGFibGUpIHtcbiAgICA8ZGl2IGNsYXNzPVwicHgtMyBwYi0zXCI+XG4gICAgICBAaWYgKGhhc0RhdGEoKSkge1xuICAgICAgICA8aGUtZGF0YS10YWJsZSBjbGFzcz1cIm1iLTEgaXMtc21hbGxcIiBbc21hbGxdPVwidHJ1ZVwiIG1heEhlaWdodD1cIjMyMFwiPlxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIGlzLW5hcnJvdyBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cImhhcy10ZXh0LXdlaWdodC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgQGZvciAoY29tcGxldGVuZXNzIG9mIGNvbXBsZXRlbmVzc0tleXMoKTsgdHJhY2sgY29tcGxldGVuZXNzKSB7XG4gICAgICAgICAgICAgICAgICA8dGggW2F0dHIudGl0bGVdPVwiY29tcGxldGVuZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cInNjaGVtYUJhc2VVcmwgKyAnL0NvbXBsZXRlbmVzcyMnICsgY29tcGxldGVuZXNzXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICAgICAgICAgICAgICAgICAge3sga2V5VG9MYWJlbChjb21wbGV0ZW5lc3MpIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgICAgQGZvciAoY3ljbGUgb2YgY3ljbGVzKCk7IHRyYWNrIHRyYWNrQnlJZChpLCBjeWNsZSk7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0XCIgW2F0dHIudGl0bGVdPVwiZGVmYXVsdExhYmVsKGN5Y2xlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIFtub2RlXT1cImN5Y2xlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaSArIDEgfX0uIHt7IGRlZmF1bHRMYWJlbChjeWNsZSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGtleSBvZiBjb21wbGV0ZW5lc3NLZXlzKCk7IHRyYWNrIGtleSkge1xuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJpcy1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBnZXRDb21wbGV0ZW5lc3MoY3ljbGUpW2tleV0gPyAnQ29tcGxldGUnIDogJ0luY29tcGxldGUnIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxoZS1ibGFuay1ub2RlLXN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFTdGF0ZV09XCJkYXRhU3RhdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJnZXRDb21wbGV0ZW5lc3MoY3ljbGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtrZXldPVwia2V5XCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9oZS1kYXRhLXRhYmxlPlxuICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UgW2RhdGFTdGF0ZV09XCJkYXRhU3RhdGUoKVwiPjwvaGUtYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2U+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJsb2NrXCI+XG4gICAgICAgICAgPHNwYW4+Tm8gY29tcGxldGVuZXNzIGRhdGE8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG4gIEBjYXNlIChWaWV3LmxvZ3MpIHtcbiAgICBAaWYgKGN5Y2xlcygpLmxlbmd0aCA+IDEpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zIHB0LTIgcHgtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsIGlzLXN0YXRpYyBpcy1zZWNvbmRhcnlcIj5TZWxlY3QgYSBDeWNsZTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbCBpcy1mdWxsd2lkdGggaXMtc2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICA8c2VsZWN0IChjaGFuZ2UpPVwic2VsZWN0SW5kZXgoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICBAZm9yICh2YWx1ZSBvZiBjeWNsZXMoKTsgdHJhY2sgdmFsdWU7IGxldCBpID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiaVwiPnt7IGkgKyAxIH19LiB7eyBkZWZhdWx0TGFiZWwodmFsdWUpIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAaWYgKHNlbGVjdGVkTm9kZSgpKSB7XG4gICAgICA8aGUtbm9kZS1sb2dzLW1vZGVsc1xuICAgICAgICBbbm9kZV09XCJzZWxlY3RlZE5vZGUoKVwiXG4gICAgICAgIFtub2RlS2V5XT1cIm5vZGVLZXlcIlxuICAgICAgICBbbG9nc0tleV09XCJzZWxlY3RlZExvZ3NLZXkoKVwiXG4gICAgICAgIFtvcmlnaW5hbFZhbHVlc109XCJzZWxlY3RlZE9yaWdpbmFsVmFsdWVzKClcIlxuICAgICAgICBbcmVjYWxjdWxhdGVkVmFsdWVzXT1cInNlbGVjdGVkUmVjYWxjdWxhdGVkVmFsdWVzKClcIj48L2hlLW5vZGUtbG9ncy1tb2RlbHM+XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -102,7 +102,7 @@ export class CyclesNodesComponent {
|
|
|
102
102
|
this.viewIcon = viewIcon;
|
|
103
103
|
this.showView = computed(() => ({
|
|
104
104
|
[View.chart]: this.selectedNodeKey() === BlankNodesKey.emissions ? this.cycles().length > 1 : this.hasData(),
|
|
105
|
-
[View.logs]: !this.isOriginal(),
|
|
105
|
+
[View.logs]: !this.isOriginal() && this.hasRecalculatedNodes(),
|
|
106
106
|
[View.table]: true,
|
|
107
107
|
[View.timeline]: this.enableTimeline()
|
|
108
108
|
}));
|
|
@@ -135,7 +135,7 @@ export class CyclesNodesComponent {
|
|
|
135
135
|
: null);
|
|
136
136
|
this.isOriginal = computed(() => this.dataState() === DataState.original);
|
|
137
137
|
this.originalValues = computed(() => (this.isOriginal() ? null : this.originalCycles()) || []);
|
|
138
|
-
this.hasRecalculatedNodes = computed(() => this.cycles().some(
|
|
138
|
+
this.hasRecalculatedNodes = computed(() => this.cycles().some(({ aggregated }) => !aggregated));
|
|
139
139
|
this.showSwitchToRecalculated = computed(() => this.isOriginal() && this.hasRecalculatedNodes());
|
|
140
140
|
this.timelineValues = computed(() => filterValuesTimeline(this.selectedCycle()?.[this.selectedNodeKey()] || []));
|
|
141
141
|
this.enableTimeline = computed(() => this.timelineValues().length > 0);
|
|
@@ -201,7 +201,7 @@ export class CyclesNodesComponent {
|
|
|
201
201
|
component.headerKeys.set(this.headerKeys());
|
|
202
202
|
}
|
|
203
203
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: CyclesNodesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
204
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: CyclesNodesComponent, isStandalone: true, selector: "he-cycles-nodes", inputs: { dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null }, nodeKeys: { classPropertyName: "nodeKeys", publicName: "nodeKeys", isSignal: true, isRequired: true, transformFunction: null }, nodeKeyGroup: { classPropertyName: "nodeKeyGroup", publicName: "nodeKeyGroup", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (isGroupNode()) {\n <div class=\"tabs is-mb-1\">\n <ul>\n @for (term of groupNodeTerms(); track term.name) {\n <li [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n }\n </ul>\n </div>\n}\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\">\n <div class=\"column\">\n @if (hasData() && selectedView() === View.table) {\n <button class=\"button is-small is-ghost\" (click)=\"showDownload()\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\"></fa-icon>\n </button>\n }\n </div>\n @if (selectedView() === View.table) {\n <div class=\"column is-narrow\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterTerm.set($event)\"></he-search-extend>\n </div>\n }\n @if (hasData() && views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@if (isNodeKeyAllowed()) {\n @switch (selectedView()) {\n @case (View.table) {\n <div class=\"is-px-3 is-pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n @if (dataKeys().length > 1) {\n <tr class=\"has-text-weight-bold\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @if (data()[dataKey]?.length) {\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n }\n }\n </tr>\n }\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span\n [innerHtml]=\"\n node.value.term.name | ellipsis: 30 | compound: node.value.term.termType\n \"></span>\n </he-node-link>\n </th>\n }\n }\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"schemaBaseUrl + '/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound: node.value.term.termType\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(cycleIndex, cycle); let cycleIndex = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycleNode(cycle)\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <td\n class=\"is-nowrap\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n @if (node.value.values[cycle['@id']]) {\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n placement=\"left\"\n container=\"body\"\n [popoverContext]=\"{ data: node.value.values[cycle['@id']], cycle, key: dataKey }\">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n } @else {\n <span>-</span>\n }\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice\n [dataState]=\"dataState()\"\n [showDeleted]=\"firstNodeKey() === BlankNodesKey.emissions\"></he-blank-node-state-notice>\n } @else {\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n @if (showSwitchToRecalculated()) {\n <span>\n Switch to\n <code>recalculated</code>\n version.\n </span>\n }\n </div>\n }\n </div>\n }\n @case (View.chart) {\n @switch (firstNodeKey()) {\n @case (BlankNodesKey.inputs) {\n <he-cycles-result [cycles]=\"cycles()\"></he-cycles-result>\n }\n @case (BlankNodesKey.emissions) {\n <he-cycles-emissions-chart [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n }\n }\n }\n @case (View.timeline) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"dataState()\"></he-cycles-nodes-timeline>\n <he-blank-node-state-notice [dataState]=\"dataState()\"></he-blank-node-state-notice>\n </div>\n }\n @case (View.logs) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n @if (nodeKeys().length > 1) {\n <div class=\"tabs is-mb-2\">\n <ul>\n @for (nodeKey of nodeKeys(); track nodeKey) {\n <li [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n }\n </ul>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n }\n }\n }\n}\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n @if (cycles().length > 1) {\n <div class=\"field has-addons is-py-2 is-px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let cycleIndex = $index) {\n <option [value]=\"cycleIndex\">{{ cycleIndex + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"], dependencies: [{ kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["valueChange", "search"] }, { kind: "component", type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { kind: "directive", type: NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showDeleted"] }, { kind: "component", type: CyclesResultComponent, selector: "he-cycles-result", inputs: ["cycles"] }, { kind: "component", type: CyclesEmissionsChartComponent, selector: "he-cycles-emissions-chart", inputs: ["cycles"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CyclesNodesTimelineComponent, selector: "he-cycles-nodes-timeline", inputs: ["recalculatedValues", "dataState"] }, { kind: "component", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataState", "dataKey"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: DefaultPipe, name: "default" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
204
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: CyclesNodesComponent, isStandalone: true, selector: "he-cycles-nodes", inputs: { dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null }, nodeKeys: { classPropertyName: "nodeKeys", publicName: "nodeKeys", isSignal: true, isRequired: true, transformFunction: null }, nodeKeyGroup: { classPropertyName: "nodeKeyGroup", publicName: "nodeKeyGroup", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (isGroupNode()) {\n <div class=\"tabs is-mb-1\">\n <ul>\n @for (term of groupNodeTerms(); track term.name) {\n <li [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n }\n </ul>\n </div>\n}\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\">\n <div class=\"column\">\n @if (hasData() && selectedView() === View.table) {\n <button class=\"button is-small is-ghost\" (click)=\"showDownload()\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\" />\n </button>\n }\n </div>\n @if (selectedView() === View.table) {\n <div class=\"column is-narrow\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterTerm.set($event)\" />\n </div>\n }\n @if (views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\" />\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@if (isNodeKeyAllowed()) {\n @switch (selectedView()) {\n @case (View.table) {\n <div class=\"is-px-3 is-pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n @if (dataKeys().length > 1) {\n <tr class=\"has-text-weight-bold\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @if (data()[dataKey]?.length) {\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n }\n }\n </tr>\n }\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span\n [innerHtml]=\"\n node.value.term.name | ellipsis: 30 | compound: node.value.term.termType\n \"></span>\n </he-node-link>\n </th>\n }\n }\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"schemaBaseUrl + '/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound: node.value.term.termType\"></span>\n <he-terms-units-description class=\"is-inline-block is-ml-2\" [term]=\"node.value.term\" />\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(cycleIndex, cycle); let cycleIndex = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycleNode(cycle)\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\" />\n </td>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <td\n class=\"is-nowrap\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n @if (node.value.values[cycle['@id']]) {\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow is-overflow-visible\"\n placement=\"left\"\n container=\"body\"\n [popoverContext]=\"{ data: node.value.values[cycle['@id']], cycle, key: dataKey }\">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\" />\n </span>\n } @else {\n <span>-</span>\n }\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice\n [dataState]=\"dataState()\"\n [showDeleted]=\"firstNodeKey() === BlankNodesKey.emissions\" />\n } @else {\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n @if (showSwitchToRecalculated()) {\n <span>\n Switch to\n <code>recalculated</code>\n version.\n </span>\n }\n </div>\n }\n </div>\n }\n @case (View.chart) {\n @switch (firstNodeKey()) {\n @case (BlankNodesKey.inputs) {\n <he-cycles-result [cycles]=\"cycles()\"></he-cycles-result>\n }\n @case (BlankNodesKey.emissions) {\n <he-cycles-emissions-chart [cycles]=\"cycles()\" />\n }\n }\n }\n @case (View.timeline) {\n <ng-container *ngTemplateOutlet=\"selectCycle\" />\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline [recalculatedValues]=\"timelineValues()\" [dataState]=\"dataState()\" />\n <he-blank-node-state-notice [dataState]=\"dataState()\" />\n </div>\n }\n @case (View.logs) {\n <ng-container *ngTemplateOutlet=\"selectCycle\" />\n @if (nodeKeys().length > 1) {\n <div class=\"tabs is-mb-2\">\n <ul>\n @for (nodeKey of nodeKeys(); track nodeKey) {\n <li [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n }\n </ul>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\" />\n }\n }\n }\n}\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n class=\"is-overflow-visible\"\n [data]=\"data\"\n [dataState]=\"dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\" />\n</ng-template>\n\n<ng-template #selectCycle>\n @if (cycles().length > 1) {\n <div class=\"field has-addons is-py-2 is-px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let cycleIndex = $index) {\n <option [value]=\"cycleIndex\">{{ cycleIndex + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"], dependencies: [{ kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["valueChange", "search"] }, { kind: "component", type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { kind: "directive", type: NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showDeleted"] }, { kind: "component", type: CyclesResultComponent, selector: "he-cycles-result", inputs: ["cycles"] }, { kind: "component", type: CyclesEmissionsChartComponent, selector: "he-cycles-emissions-chart", inputs: ["cycles"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CyclesNodesTimelineComponent, selector: "he-cycles-nodes-timeline", inputs: ["recalculatedValues", "dataState"] }, { kind: "component", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataState", "dataKey"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: DefaultPipe, name: "default" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
205
205
|
}
|
|
206
206
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: CyclesNodesComponent, decorators: [{
|
|
207
207
|
type: Component,
|
|
@@ -228,6 +228,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImpo
|
|
|
228
228
|
EllipsisPipe,
|
|
229
229
|
KeyToLabelPipe,
|
|
230
230
|
PrecisionPipe
|
|
231
|
-
], template: "@if (isGroupNode()) {\n <div class=\"tabs is-mb-1\">\n <ul>\n @for (term of groupNodeTerms(); track term.name) {\n <li [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n }\n </ul>\n </div>\n}\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\">\n <div class=\"column\">\n @if (hasData() && selectedView() === View.table) {\n <button class=\"button is-small is-ghost\" (click)=\"showDownload()\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\"></fa-icon>\n </button>\n }\n </div>\n @if (selectedView() === View.table) {\n <div class=\"column is-narrow\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterTerm.set($event)\"></he-search-extend>\n </div>\n }\n @if (hasData() && views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@if (isNodeKeyAllowed()) {\n @switch (selectedView()) {\n @case (View.table) {\n <div class=\"is-px-3 is-pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n @if (dataKeys().length > 1) {\n <tr class=\"has-text-weight-bold\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @if (data()[dataKey]?.length) {\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n }\n }\n </tr>\n }\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span\n [innerHtml]=\"\n node.value.term.name | ellipsis: 30 | compound: node.value.term.termType\n \"></span>\n </he-node-link>\n </th>\n }\n }\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"schemaBaseUrl + '/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound: node.value.term.termType\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(cycleIndex, cycle); let cycleIndex = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycleNode(cycle)\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <td\n class=\"is-nowrap\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n @if (node.value.values[cycle['@id']]) {\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow\"\n placement=\"left\"\n container=\"body\"\n [popoverContext]=\"{ data: node.value.values[cycle['@id']], cycle, key: dataKey }\">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n } @else {\n <span>-</span>\n }\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice\n [dataState]=\"dataState()\"\n [showDeleted]=\"firstNodeKey() === BlankNodesKey.emissions\"></he-blank-node-state-notice>\n } @else {\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n @if (showSwitchToRecalculated()) {\n <span>\n Switch to\n <code>recalculated</code>\n version.\n </span>\n }\n </div>\n }\n </div>\n }\n @case (View.chart) {\n @switch (firstNodeKey()) {\n @case (BlankNodesKey.inputs) {\n <he-cycles-result [cycles]=\"cycles()\"></he-cycles-result>\n }\n @case (BlankNodesKey.emissions) {\n <he-cycles-emissions-chart [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n }\n }\n }\n @case (View.timeline) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"dataState()\"></he-cycles-nodes-timeline>\n <he-blank-node-state-notice [dataState]=\"dataState()\"></he-blank-node-state-notice>\n </div>\n }\n @case (View.logs) {\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n @if (nodeKeys().length > 1) {\n <div class=\"tabs is-mb-2\">\n <ul>\n @for (nodeKey of nodeKeys(); track nodeKey) {\n <li [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n }\n </ul>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n }\n }\n }\n}\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n @if (cycles().length > 1) {\n <div class=\"field has-addons is-py-2 is-px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let cycleIndex = $index) {\n <option [value]=\"cycleIndex\">{{ cycleIndex + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"] }]
|
|
231
|
+
], template: "@if (isGroupNode()) {\n <div class=\"tabs is-mb-1\">\n <ul>\n @for (term of groupNodeTerms(); track term.name) {\n <li [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n }\n </ul>\n </div>\n}\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\">\n <div class=\"column\">\n @if (hasData() && selectedView() === View.table) {\n <button class=\"button is-small is-ghost\" (click)=\"showDownload()\">\n <fa-icon [icon]=\"faDownload\" size=\"lg\" />\n </button>\n }\n </div>\n @if (selectedView() === View.table) {\n <div class=\"column is-narrow\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterTerm.set($event)\" />\n </div>\n }\n @if (views()?.length > 1) {\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n @for (view of views(); track view) {\n <div class=\"control\">\n <button\n class=\"button is-small\"\n [class.is-selected]=\"selectedView() === view\"\n (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\" />\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n }\n </div>\n </div>\n }\n</div>\n\n@if (isNodeKeyAllowed()) {\n @switch (selectedView()) {\n @case (View.table) {\n <div class=\"is-px-3 is-pb-3\">\n @if (hasData()) {\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n @if (dataKeys().length > 1) {\n <tr class=\"has-text-weight-bold\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @if (data()[dataKey]?.length) {\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n }\n }\n </tr>\n }\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span\n [innerHtml]=\"\n node.value.term.name | ellipsis: 30 | compound: node.value.term.termType\n \"></span>\n </he-node-link>\n </th>\n }\n }\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"schemaBaseUrl + '/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <th\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound: node.value.term.termType\"></span>\n <he-terms-units-description class=\"is-inline-block is-ml-2\" [term]=\"node.value.term\" />\n </th>\n }\n }\n </tr>\n </thead>\n <tbody>\n @for (cycle of cycles(); track trackById(cycleIndex, cycle); let cycleIndex = $index) {\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycleNode(cycle)\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\" />\n </td>\n @for (dataKey of dataKeys(); track dataKey; let dataKeyLast = $last) {\n @for (node of data()[dataKey]; track node.value.term.name; let nodeLast = $last) {\n <td\n class=\"is-nowrap\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n @if (node.value.values[cycle['@id']]) {\n <span\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n autoClose=\"outside\"\n popoverClass=\"is-narrow is-overflow-visible\"\n placement=\"left\"\n container=\"body\"\n [popoverContext]=\"{ data: node.value.values[cycle['@id']], cycle, key: dataKey }\">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\" />\n </span>\n } @else {\n <span>-</span>\n }\n </td>\n }\n }\n </tr>\n }\n </tbody>\n </table>\n </he-data-table>\n <he-blank-node-state-notice\n [dataState]=\"dataState()\"\n [showDeleted]=\"firstNodeKey() === BlankNodesKey.emissions\" />\n } @else {\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n @if (showSwitchToRecalculated()) {\n <span>\n Switch to\n <code>recalculated</code>\n version.\n </span>\n }\n </div>\n }\n </div>\n }\n @case (View.chart) {\n @switch (firstNodeKey()) {\n @case (BlankNodesKey.inputs) {\n <he-cycles-result [cycles]=\"cycles()\"></he-cycles-result>\n }\n @case (BlankNodesKey.emissions) {\n <he-cycles-emissions-chart [cycles]=\"cycles()\" />\n }\n }\n }\n @case (View.timeline) {\n <ng-container *ngTemplateOutlet=\"selectCycle\" />\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline [recalculatedValues]=\"timelineValues()\" [dataState]=\"dataState()\" />\n <he-blank-node-state-notice [dataState]=\"dataState()\" />\n </div>\n }\n @case (View.logs) {\n <ng-container *ngTemplateOutlet=\"selectCycle\" />\n @if (nodeKeys().length > 1) {\n <div class=\"tabs is-mb-2\">\n <ul>\n @for (nodeKey of nodeKeys(); track nodeKey) {\n <li [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n }\n </ul>\n </div>\n }\n @if (selectedNode()) {\n <he-node-logs-models\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\" />\n }\n }\n }\n}\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n class=\"is-overflow-visible\"\n [data]=\"data\"\n [dataState]=\"dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\" />\n</ng-template>\n\n<ng-template #selectCycle>\n @if (cycles().length > 1) {\n <div class=\"field has-addons is-py-2 is-px-3\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n @for (value of cycles(); track value; let cycleIndex = $index) {\n <option [value]=\"cycleIndex\">{{ cycleIndex + 1 }}. {{ defaultLabel(value) }}</option>\n }\n </select>\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"] }]
|
|
232
232
|
}], ctorParameters: () => [] });
|
|
233
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLW5vZGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jeWNsZXMvY3ljbGVzLW5vZGVzL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1ub2Rlcy9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFJTCxRQUFRLEVBSVIsWUFBWSxFQUlaLGFBQWEsRUFFZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0IsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ3JILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ2pHLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBQzNHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHdFQUF3RSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLDRFQUE0RSxDQUFDO0FBQ2xJLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9EQUFvRCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7OztBQUU1RyxJQUFLLElBS0o7QUFMRCxXQUFLLElBQUk7SUFDUCw0QkFBb0IsQ0FBQTtJQUNwQiw0QkFBb0IsQ0FBQTtJQUNwQix3Q0FBZ0MsQ0FBQTtJQUNoQyxvQ0FBNEIsQ0FBQTtBQUM5QixDQUFDLEVBTEksSUFBSSxLQUFKLElBQUksUUFLUjtBQUVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFzQmxELE1BQU0sUUFBUSxHQUVWO0lBQ0YsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVTtJQUN4QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZO0lBQ3pCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU07SUFDcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUztDQUMzQixDQUFDO0FBRUYsTUFBTSxZQUFZLEdBRWQ7SUFDRixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztJQUNoRCxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzlELENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDM0QsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM3RCxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO0NBQ2xFLENBQUM7QUFFRixNQUFNLHNCQUFzQixHQUV4QjtJQUNGLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztDQUNuRCxDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE1BQXdCLEVBQUUsRUFBRSxDQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQU1sRSxNQUFNLENBQU4sSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzVCLHlDQUFtQixDQUFBO0lBQ25CLHlEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUFIVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRzdCO0FBSUQsTUFBTSxjQUFjLEdBQ2xCLENBQUMsS0FBb0IsRUFBRSxFQUFFLENBQ3pCLENBQUMsSUFBa0IsRUFBaUQsRUFBRSxDQUNwRSxJQUFJO0lBQ0YsQ0FBQyxDQUFDO1FBQ0UsR0FBRyxJQUFJO1FBQ1AsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO1FBQ2pCLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxrREFBa0Q7S0FDekU7SUFDSCxDQUFDLENBQUMsSUFBSSxDQUFDO0FBRWIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUE0QixFQUFFLEtBQW9CLEVBQWlCLEVBQUUsQ0FDNUYsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRXZFLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxRQUE0QixFQUFFLE1BQXNCLEVBQUUsSUFBVyxFQUFpQixFQUFFLENBQ2xILE1BQU07S0FDSCxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDWCxjQUFjLENBQUMsS0FBSyxDQUFDLENBQ25CLENBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQzFHLENBQ0Y7S0FDQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFpQ3JCLE1BQU0sT0FBTyxvQkFBb0I7SUFtSC9CO1FBbEhpQixpQkFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QyxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUVuQyxlQUFVLEdBQUcsVUFBVSxDQUFDO1FBRXhCLGNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLGFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFtQixDQUFDO1FBQzdDLGlCQUFZLEdBQUcsS0FBSyxFQUFzQixDQUFDO1FBRTNDLGtCQUFhLEdBQUcsYUFBYSxDQUFDO1FBQzlCLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsb0JBQWUsR0FBRyxNQUFNLENBQUMsU0FBMEIsQ0FBQyxDQUFDO1FBRXJELHNCQUFpQixHQUFHLE1BQU0sQ0FBQyxTQUFpQixDQUFDLENBQUM7UUFFOUMsa0JBQWEsR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUNoQyxrQkFBYSxHQUFHLGFBQWEsQ0FBQztRQUM5QixpQkFBWSxHQUFHLFlBQVksQ0FBQztRQUU1QixlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzdDLFVBQVU7WUFDVixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLG9CQUFvQjtZQUNwQixHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUUsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDL0UsQ0FBQyxDQUFDO1FBRWdCLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixhQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLGFBQVEsR0FBRyxRQUFRLENBQ2xDLEdBQUcsRUFBRSxDQUNILENBQUM7WUFDQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDNUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQy9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUk7WUFDbEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRTtTQUN2QyxDQUFnQyxDQUNwQyxDQUFDO1FBQ2lCLFVBQUssR0FBRyxRQUFRLENBQ2pDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQ3hGLENBQUM7UUFDaUIsaUJBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLGNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBZSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRixrQkFBYSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU1RyxpQ0FBaUM7UUFDZCxtQkFBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDaEQsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixDQUFDLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM3RixDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUN6QixDQUFDO1FBQ2lCLFdBQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ3hDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDNUYsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FDeEIsQ0FBQztRQUVlLGtCQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLDBCQUFxQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLGtCQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsb0JBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEUsMkJBQXNCLEdBQUcsUUFBUSxDQUNsRCxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FDbkUsQ0FBQztRQUNpQiwrQkFBMEIsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckgsMERBQTBEO1FBQ3ZDLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUM5QyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLENBQUMsQ0FBQztnQkFDRSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3ZCLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDdkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLO2dCQUNwQixTQUFTLEVBQUUsU0FBUyxDQUFDLFlBQVk7YUFDbEM7WUFDSCxDQUFDLENBQUMsSUFBSSxDQUNULENBQUM7UUFFZSxlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFMUYseUJBQW9CLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLDZCQUF3QixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUU1RixtQkFBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDaEQsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQzNFLENBQUM7UUFDZSxtQkFBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWhFLHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFckcsaUJBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQzVDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQ25GLENBQUM7UUFDaUIsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsZ0JBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFckYsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWhGLFNBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ3RDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JHLENBQUM7UUFDaUIsYUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFcEQsWUFBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV2RSxvQkFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLGVBQVUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFeEIsZ0JBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUdsRixNQUFNLENBQ0osR0FBRyxFQUFFO1lBQ0gsMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDNUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztRQUVGLE1BQU0sQ0FDSixHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqRixJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztRQUVGLE1BQU0sQ0FDSixHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDM0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQyxFQUNELEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRU8sZUFBZSxDQVdyQixFQUFFLE9BQU8sRUFBSztRQUNkLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUNwQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQ2IsT0FBTyxFQUNQLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFDckIsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUNuQyxDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxjQUFjO1FBQ3BCLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQ3hDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFDYixhQUFhLENBQUMsU0FBUyxFQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLEVBQ3JCLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDbkMsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUE2QixPQUFPLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDcEcsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckUsVUFBVTtZQUNWLGVBQWUsRUFBRSxlQUFlLENBQUMsVUFBVSxDQUFDO1NBQzdDLENBQUMsQ0FBQyxFQUNILENBQUMsaUJBQWlCLENBQUMsRUFDbkIsQ0FBQyxLQUFLLENBQUMsQ0FDUixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUM3RixDQUFDO0lBQ3hCLENBQUM7SUFFUyxTQUFTLENBQUMsTUFBYyxFQUFFLElBQWdDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFUyxXQUFXLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFUyxTQUFTLENBQUMsS0FBaUM7UUFDbkQsT0FBTyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDOUMsQ0FBQztJQUVTLFlBQVk7UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUN2RSxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsaUJBQWtELENBQUM7UUFDOUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDM0MsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQzsrR0EvTVUsb0JBQW9CO21HQUFwQixvQkFBb0Isd2VDOUtqQyxtalZBeVBBLGdQRGxHSSxlQUFlLDRNQUNmLHFCQUFxQix3SkFDckIsa0JBQWtCLHVHQUNsQixpQkFBaUIsNEdBQ2pCLDhCQUE4Qix5R0FDOUIsb0NBQW9DLGlHQUNwQyxVQUFVLDJVQUNWLHVCQUF1QixtSkFDdkIsNkJBQTZCLDZHQUM3QixxQkFBcUIsaUZBQ3JCLDZCQUE2QiwwRkFDN0IsZ0JBQWdCLG9KQUNoQiw0QkFBNEIsa0hBQzVCLHVCQUF1QixxTkFDdkIseUJBQXlCLHVIQUN6QixXQUFXLHVPQUNYLFlBQVksNENBQ1osV0FBVywyQ0FDWCxZQUFZLDRDQUNaLGNBQWMsOENBQ2QsYUFBYTs7NEZBR0osb0JBQW9CO2tCQS9CaEMsU0FBUzsrQkFDRSxpQkFBaUIsbUJBR1YsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsVUFBVTt3QkFDVixlQUFlO3dCQUNmLHFCQUFxQjt3QkFDckIsa0JBQWtCO3dCQUNsQixpQkFBaUI7d0JBQ2pCLDhCQUE4Qjt3QkFDOUIsb0NBQW9DO3dCQUNwQyxVQUFVO3dCQUNWLHVCQUF1Qjt3QkFDdkIsNkJBQTZCO3dCQUM3QixxQkFBcUI7d0JBQ3JCLDZCQUE2Qjt3QkFDN0IsZ0JBQWdCO3dCQUNoQiw0QkFBNEI7d0JBQzVCLHVCQUF1Qjt3QkFDdkIseUJBQXlCO3dCQUN6QixXQUFXO3dCQUNYLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsYUFBYTtxQkFDZCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGFTdGF0ZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvYXBpJztcbmltcG9ydCB7XG4gIElDeWNsZUpTT05MRCxcbiAgSW5wdXQgYXMgSGVzdGlhSW5wdXQsXG4gIFByb2R1Y3QsXG4gIE5vZGVUeXBlLFxuICBBbmltYWwsXG4gIEVtaXNzaW9uLFxuICBQcmFjdGljZSxcbiAgVGVybVRlcm1UeXBlLFxuICBFbWlzc2lvbk1ldGhvZFRpZXIsXG4gIFRlcm0sXG4gIFRyYW5zZm9ybWF0aW9uLFxuICBCbGFua05vZGVzS2V5LFxuICBibGFua05vZGVzVHlwZVxufSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgb3JkZXJCeSBmcm9tICdsb2Rhc2gub3JkZXJieSc7XG5pbXBvcnQgeyBwcm9wZXJ0eVZhbHVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscy9kaXN0L3Rlcm0nO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5pbXBvcnQgeyBGYUljb25Db21wb25lbnQgfSBmcm9tICdAZm9ydGF3ZXNvbWUvYW5ndWxhci1mb250YXdlc29tZSc7XG5pbXBvcnQgeyBOZ2JUb29sdGlwLCBOZ2JQb3BvdmVyLCBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEljb25EZWZpbml0aW9uIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZvbnRhd2Vzb21lLXN2Zy1jb3JlJztcblxuaW1wb3J0IHsgZmlsdGVyQmxhbmtOb2RlLCBtZXRob2RUaWVyT3JkZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbm9kZS11dGlscyc7XG5pbXBvcnQgeyBsb2dzS2V5IH0gZnJvbSAnLi4vY3ljbGVzLm1vZGVsJztcbmltcG9ydCB7IEhlTm9kZVN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uL25vZGUvbm9kZS1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdyb3VwTm9kZXNCeVRlcm0sIElHcm91cGVkS2V5cywgZ3JvdXBwZWRLZXlzIH0gZnJvbSAnLi4vLi4vY29tbW9uL25vZGUtdXRpbHMnO1xuaW1wb3J0IHsgc2NoZW1hQmFzZVVybCwgZGVmYXVsdExhYmVsIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IFByZWNpc2lvblBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vcHJlY2lzaW9uLnBpcGUnO1xuaW1wb3J0IHsgS2V5VG9MYWJlbFBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24va2V5LXRvLWxhYmVsLnBpcGUnO1xuaW1wb3J0IHsgRWxsaXBzaXNQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2VsbGlwc2lzLnBpcGUnO1xuaW1wb3J0IHsgRGVmYXVsdFBpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vZGVmYXVsdC5waXBlJztcbmltcG9ydCB7IENvbXBvdW5kUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb3VuZC5waXBlJztcbmltcG9ydCB7IE5vZGVWYWx1ZURldGFpbHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtdmFsdWUtZGV0YWlscy9ub2RlLXZhbHVlLWRldGFpbHMuY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS9ub2RlLWNzdi1leHBvcnQtY29uZmlybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUxvZ3NNb2RlbHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtbG9ncy1tb2RlbHMvbm9kZS1sb2dzLW1vZGVscy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3ljbGVzTm9kZXNUaW1lbGluZUNvbXBvbmVudCB9IGZyb20gJy4uL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS9jeWNsZXMtbm9kZXMtdGltZWxpbmUuY29tcG9uZW50JztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ3ljbGVzRW1pc3Npb25zQ2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi9jeWNsZXMtZW1pc3Npb25zLWNoYXJ0L2N5Y2xlcy1lbWlzc2lvbnMtY2hhcnQuY29tcG9uZW50JztcbmltcG9ydCB7IEN5Y2xlc1Jlc3VsdENvbXBvbmVudCB9IGZyb20gJy4uL2N5Y2xlcy1yZXN1bHQvY3ljbGVzLXJlc3VsdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmxhbmtOb2RlU3RhdGVOb3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UvYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2UuY29tcG9uZW50JztcbmltcG9ydCB7IEJsYW5rTm9kZVN0YXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tbW9uL2JsYW5rLW5vZGUtc3RhdGUvYmxhbmstbm9kZS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3ljbGVzRnVuY3Rpb25hbFVuaXRNZWFzdXJlQ29tcG9uZW50IH0gZnJvbSAnLi4vY3ljbGVzLWZ1bmN0aW9uYWwtdW5pdC1tZWFzdXJlL2N5Y2xlcy1mdW5jdGlvbmFsLXVuaXQtbWVhc3VyZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGVybXNVbml0c0Rlc2NyaXB0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vdGVybXMvdGVybXMtdW5pdHMtZGVzY3JpcHRpb24vdGVybXMtdW5pdHMtZGVzY3JpcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE5vZGVMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLWxpbmsvbm9kZS1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hFeHRlbmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vc2VhcmNoLWV4dGVuZC9zZWFyY2gtZXh0ZW5kLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBmYUNhbGN1bGF0b3IsIGZhQ2hhcnRCYXIsIGZhRG93bmxvYWQsIGZhTGlzdCwgZmFMaXN0QWx0IH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcblxuZW51bSBWaWV3IHtcbiAgdGFibGUgPSAnVGFibGUgdmlldycsXG4gIGNoYXJ0ID0gJ0NoYXJ0IHZpZXcnLFxuICB0aW1lbGluZSA9ICdPcGVyYXRpb25zIFRpbWVsaW5lJyxcbiAgbG9ncyA9ICdSZWNhbGN1bGF0aW9ucyBsb2dzJ1xufVxuXG5jb25zdCB0aW1lbGluZVRlcm1UeXBlID0gW1Rlcm1UZXJtVHlwZS5vcGVyYXRpb25dO1xuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleTtcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0FuaW1hbCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuYW5pbWFscztcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0VtaXNzaW9uIGV4dGVuZHMgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnM7XG59XG5cbmludGVyZmFjZSBJQ3ljbGVDb25maWdJbnB1dCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuaW5wdXRzO1xufVxuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnUHJhY3RpY2UgZXh0ZW5kcyBJQ3ljbGVDb25maWcge1xuICBub2RlS2V5OiBCbGFua05vZGVzS2V5LnByYWN0aWNlcztcbn1cblxuY29uc3Qgdmlld0ljb246IHtcbiAgW3ZpZXcgaW4gVmlld106IEljb25EZWZpbml0aW9uO1xufSA9IHtcbiAgW1ZpZXcuY2hhcnRdOiBmYUNoYXJ0QmFyLFxuICBbVmlldy5sb2dzXTogZmFDYWxjdWxhdG9yLFxuICBbVmlldy50YWJsZV06IGZhTGlzdCxcbiAgW1ZpZXcudGltZWxpbmVdOiBmYUxpc3RBbHRcbn07XG5cbmNvbnN0IG5vZGVLZXlWaWV3czoge1xuICBbdHlwZSBpbiBCbGFua05vZGVzS2V5XT86IFZpZXdbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmFuaW1hbHNdOiBbVmlldy50YWJsZSwgVmlldy5sb2dzXSxcbiAgW0JsYW5rTm9kZXNLZXkuZW1pc3Npb25zXTogW1ZpZXcudGFibGUsIFZpZXcuY2hhcnQsIFZpZXcubG9nc10sXG4gIFtCbGFua05vZGVzS2V5LmlucHV0c106IFtWaWV3LnRhYmxlLCBWaWV3LmNoYXJ0LCBWaWV3LmxvZ3NdLFxuICBbQmxhbmtOb2Rlc0tleS5wcm9kdWN0c106IFtWaWV3LnRhYmxlLCBWaWV3LmNoYXJ0LCBWaWV3LmxvZ3NdLFxuICBbQmxhbmtOb2Rlc0tleS5wcmFjdGljZXNdOiBbVmlldy50YWJsZSwgVmlldy50aW1lbGluZSwgVmlldy5sb2dzXVxufTtcblxuY29uc3Qgbm9kZUtleUZpbHRlclRlcm1UeXBlczoge1xuICBbdHlwZSBpbiBCbGFua05vZGVzS2V5XT86IFRlcm1UZXJtVHlwZVtdO1xufSA9IHtcbiAgW0JsYW5rTm9kZXNLZXkuZW1pc3Npb25zXTogW1Rlcm1UZXJtVHlwZS5lbWlzc2lvbl1cbn07XG5cbmNvbnN0IGZpbHRlclZhbHVlc1RpbWVsaW5lID0gKHZhbHVlczogYmxhbmtOb2Rlc1R5cGVbXSkgPT5cbiAgdmFsdWVzLmZpbHRlcihwID0+IHRpbWVsaW5lVGVybVR5cGUuaW5jbHVkZXMocC50ZXJtPy50ZXJtVHlwZSkpO1xuXG50eXBlIGdyb3VwZWRFbWlzc2lvbnMgPSB7XG4gIFttZXRob2RUaWVyIGluIEVtaXNzaW9uTWV0aG9kVGllcl06IElHcm91cGVkS2V5czxFbWlzc2lvbj5bXTtcbn07XG5cbmV4cG9ydCBlbnVtIEN5Y2xlTm9kZXNLZXlHcm91cCB7XG4gIGFuaW1hbHMgPSAnYW5pbWFscycsXG4gIHRyYW5zZm9ybWF0aW9ucyA9ICd0cmFuc2Zvcm1hdGlvbnMnXG59XG5cbnR5cGUgZ3JvdXBlZE5vZGUgPSBBbmltYWwgfCBUcmFuc2Zvcm1hdGlvbjtcblxuY29uc3QgY3ljbGVHcm91cE5vZGUgPVxuICAoY3ljbGU/OiBJQ3ljbGVKU09OTEQpID0+XG4gIChub2RlPzogZ3JvdXBlZE5vZGUpOiBncm91cGVkTm9kZSAmIHsgbmFtZTogc3RyaW5nOyAnQGlkJzogc3RyaW5nIH0gPT5cbiAgICBub2RlXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5ub2RlLFxuICAgICAgICAgIG5hbWU6IGN5Y2xlPy5uYW1lLFxuICAgICAgICAgICdAaWQnOiBjeWNsZT8uWydAaWQnXSAvLyBzZXQgQGlkIHNvIHdlIGNhbiBmZXRjaCB0aGUgbG9ncyBmcm9tIHRoZSBDeWNsZVxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG5cbmNvbnN0IGN5Y2xlR3JvdXBOb2RlcyA9IChncm91cEtleTogQ3ljbGVOb2Rlc0tleUdyb3VwLCBjeWNsZT86IElDeWNsZUpTT05MRCk6IGdyb3VwZWROb2RlW10gPT5cbiAgKGN5Y2xlPy5bZ3JvdXBLZXldIHx8IFtdKS5tYXAoY3ljbGVHcm91cE5vZGUoY3ljbGUpKS5maWx0ZXIoQm9vbGVhbik7XG5cbmNvbnN0IGZpbHRlckdyb3VwTm9kZXNCeVRlcm0gPSAoZ3JvdXBLZXk6IEN5Y2xlTm9kZXNLZXlHcm91cCwgY3ljbGVzOiBJQ3ljbGVKU09OTERbXSwgdGVybT86IFRlcm0pOiBncm91cGVkTm9kZVtdID0+XG4gIGN5Y2xlc1xuICAgIC5tYXAoY3ljbGUgPT5cbiAgICAgIGN5Y2xlR3JvdXBOb2RlKGN5Y2xlKShcbiAgICAgICAgKChjeWNsZT8uW2dyb3VwS2V5XSBhcyBncm91cGVkTm9kZVtdKSB8fCBbXSkuZmlsdGVyKEJvb2xlYW4pLmZpbmQobm9kZSA9PiBub2RlLnRlcm0/Lm5hbWUgPT09IHRlcm0/Lm5hbWUpXG4gICAgICApXG4gICAgKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWN5Y2xlcy1ub2RlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jeWNsZXMtbm9kZXMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBOZ2JUb29sdGlwLFxuICAgIEZhSWNvbkNvbXBvbmVudCxcbiAgICBTZWFyY2hFeHRlbmRDb21wb25lbnQsXG4gICAgRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIE5vZGVMaW5rQ29tcG9uZW50LFxuICAgIFRlcm1zVW5pdHNEZXNjcmlwdGlvbkNvbXBvbmVudCxcbiAgICBDeWNsZXNGdW5jdGlvbmFsVW5pdE1lYXN1cmVDb21wb25lbnQsXG4gICAgTmdiUG9wb3ZlcixcbiAgICBCbGFua05vZGVTdGF0ZUNvbXBvbmVudCxcbiAgICBCbGFua05vZGVTdGF0ZU5vdGljZUNvbXBvbmVudCxcbiAgICBDeWNsZXNSZXN1bHRDb21wb25lbnQsXG4gICAgQ3ljbGVzRW1pc3Npb25zQ2hhcnRDb21wb25lbnQsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBDeWNsZXNOb2Rlc1RpbWVsaW5lQ29tcG9uZW50LFxuICAgIE5vZGVMb2dzTW9kZWxzQ29tcG9uZW50LFxuICAgIE5vZGVWYWx1ZURldGFpbHNDb21wb25lbnQsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQ29tcG91bmRQaXBlLFxuICAgIERlZmF1bHRQaXBlLFxuICAgIEVsbGlwc2lzUGlwZSxcbiAgICBLZXlUb0xhYmVsUGlwZSxcbiAgICBQcmVjaXNpb25QaXBlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQ3ljbGVzTm9kZXNDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZSA9IGluamVjdChOZ2JNb2RhbCk7XG4gIHByaXZhdGUgbm9kZVN0b3JlU2VydmljZSA9IGluamVjdChIZU5vZGVTdG9yZVNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmYURvd25sb2FkID0gZmFEb3dubG9hZDtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YVN0YXRlID0gaW5wdXQoRGF0YVN0YXRlLm9yaWdpbmFsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vZGVLZXlzID0gaW5wdXQucmVxdWlyZWQ8QmxhbmtOb2Rlc0tleVtdPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZUtleUdyb3VwID0gaW5wdXQ8Q3ljbGVOb2Rlc0tleUdyb3VwPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBCbGFua05vZGVzS2V5ID0gQmxhbmtOb2Rlc0tleTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpcnN0Tm9kZUtleSA9IGNvbXB1dGVkKCgpID0+IHRoaXMubm9kZUtleXMoKT8uWzBdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkTm9kZUtleSA9IHNpZ25hbCh1bmRlZmluZWQgYXMgQmxhbmtOb2Rlc0tleSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkR3JvdXBUZXJtID0gc2lnbmFsKHVuZGVmaW5lZCBhcyBUZXJtKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2NoZW1hQmFzZVVybCA9IHNjaGVtYUJhc2VVcmwoKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVmYXVsdExhYmVsID0gZGVmYXVsdExhYmVsO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBoZWFkZXJLZXlzID0gY29tcHV0ZWQoKCkgPT4gW1xuICAgICdjeWNsZS5pZCcsXG4gICAgJ2N5Y2xlLkBpZCcsXG4gICAgJ3RyYW5zZm9ybWF0aW9uLmlkJyxcbiAgICAndHJhbnNmb3JtYXRpb24uQGlkJyxcbiAgICAuLi50aGlzLm5vZGVLZXlzKCkuZmxhdE1hcChrZXkgPT4gW2BjeWNsZS4ke2tleX0uYCwgYHRyYW5zZm9ybWF0aW9uLiR7a2V5fS5gXSlcbiAgXSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IFZpZXcgPSBWaWV3O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld0ljb24gPSB2aWV3SWNvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG93VmlldyA9IGNvbXB1dGVkKFxuICAgICgpID0+XG4gICAgICAoe1xuICAgICAgICBbVmlldy5jaGFydF06IHRoaXMuc2VsZWN0ZWROb2RlS2V5KCkgPT09IEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zID8gdGhpcy5jeWNsZXMoKS5sZW5ndGggPiAxIDogdGhpcy5oYXNEYXRhKCksXG4gICAgICAgIFtWaWV3LmxvZ3NdOiAhdGhpcy5pc09yaWdpbmFsKCksXG4gICAgICAgIFtWaWV3LnRhYmxlXTogdHJ1ZSxcbiAgICAgICAgW1ZpZXcudGltZWxpbmVdOiB0aGlzLmVuYWJsZVRpbWVsaW5lKClcbiAgICAgIH0pIGFzIHsgW3ZpZXcgaW4gVmlld106IGJvb2xlYW4gfVxuICApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld3MgPSBjb21wdXRlZChcbiAgICAoKSA9PiBub2RlS2V5Vmlld3NbdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0/LmZpbHRlcih2aWV3ID0+IHRoaXMuc2hvd1ZpZXcoKVt2aWV3XSkgPz8gW11cbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkVmlldyA9IHNpZ25hbChWaWV3LnRhYmxlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxOb2RlcyA9IHRvU2lnbmFsKHRoaXMubm9kZVN0b3JlU2VydmljZS5maW5kJDxJQ3ljbGVKU09OTEQ+KE5vZGVUeXBlLkN5Y2xlKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3JpZ2luYWxOb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbE5vZGVzKCk/Lm1hcChkYXRhID0+IGRhdGFbRGF0YVN0YXRlLm9yaWdpbmFsXSkgfHwgW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnROb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbE5vZGVzKCk/Lm1hcChkYXRhID0+IGRhdGFbdGhpcy5kYXRhU3RhdGUoKV0pIHx8IFtdKTtcblxuICAvLyBjYW4gYmUgQ3ljbGUgb3IgVHJhbnNmb3JtYXRpb25cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yaWdpbmFsQ3ljbGVzID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLm5vZGVLZXlHcm91cCgpXG4gICAgICA/IGZpbHRlckdyb3VwTm9kZXNCeVRlcm0odGhpcy5ub2RlS2V5R3JvdXAoKSwgdGhpcy5vcmlnaW5hbE5vZGVzKCksIHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSlcbiAgICAgIDogdGhpcy5vcmlnaW5hbE5vZGVzKClcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGN5Y2xlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5ub2RlS2V5R3JvdXAoKVxuICAgICAgPyBmaWx0ZXJHcm91cE5vZGVzQnlUZXJtKHRoaXMubm9kZUtleUdyb3VwKCksIHRoaXMuY3VycmVudE5vZGVzKCksIHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSlcbiAgICAgIDogdGhpcy5jdXJyZW50Tm9kZXMoKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRJbmRleCA9IHNpZ25hbCgwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvZ2lyaW5hbFNlbGVjdGVkQ3ljbGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9yaWdpbmFsQ3ljbGVzKCk/Llt0aGlzLnNlbGVjdGVkSW5kZXgoKV0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGVkQ3ljbGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN5Y2xlcygpPy5bdGhpcy5zZWxlY3RlZEluZGV4KCldKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkTG9nc0tleSA9IGNvbXB1dGVkKCgpID0+IGxvZ3NLZXkodGhpcy5zZWxlY3RlZEN5Y2xlKCkpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkT3JpZ2luYWxWYWx1ZXMgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLm9naXJpbmFsU2VsZWN0ZWRDeWNsZSgpPy5bdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0gfHwgW11cbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkUmVjYWxjdWxhdGVkVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3RlZEN5Y2xlKCk/Llt0aGlzLnNlbGVjdGVkTm9kZUtleSgpXSB8fCBbXSk7XG4gIC8vIFRPRE86IGhhbmRsZSB0cmFuc2Zvcm1hdGlvbiBhbmQgbm9uLWluZGV4ZWQgbm9kZXMgb24gQ0VcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkTm9kZSA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5zZWxlY3RlZEN5Y2xlKClcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDeWNsZSgpLFxuICAgICAgICAgICdAdHlwZSc6IE5vZGVUeXBlLkN5Y2xlLFxuICAgICAgICAgIHR5cGU6IE5vZGVUeXBlLkN5Y2xlLFxuICAgICAgICAgIGRhdGFTdGF0ZTogRGF0YVN0YXRlLnJlY2FsY3VsYXRlZFxuICAgICAgICB9XG4gICAgICA6IG51bGxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlzT3JpZ2luYWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRhdGFTdGF0ZSgpID09PSBEYXRhU3RhdGUub3JpZ2luYWwpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9yaWdpbmFsVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuaXNPcmlnaW5hbCgpID8gbnVsbCA6IHRoaXMub3JpZ2luYWxDeWNsZXMoKSkgfHwgW10pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFzUmVjYWxjdWxhdGVkTm9kZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN5Y2xlcygpLnNvbWUoY3ljbGUgPT4gIWN5Y2xlLmFnZ3JlZ2F0ZWQpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTd2l0Y2hUb1JlY2FsY3VsYXRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaXNPcmlnaW5hbCgpICYmIHRoaXMuaGFzUmVjYWxjdWxhdGVkTm9kZXMoKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVsaW5lVmFsdWVzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBmaWx0ZXJWYWx1ZXNUaW1lbGluZSh0aGlzLnNlbGVjdGVkQ3ljbGUoKT8uW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldIHx8IFtdKVxuICApO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZVRpbWVsaW5lID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50aW1lbGluZVZhbHVlcygpLmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpc05vZGVLZXlBbGxvd2VkID0gY29tcHV0ZWQoKCkgPT4gbm9kZUtleVZpZXdzW3RoaXMuZmlyc3ROb2RlS2V5KCldLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRWaWV3KCkpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwZWROb2RlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5vcmlnaW5hbE5vZGVzKCkuZmxhdE1hcChjeWNsZSA9PiBjeWNsZUdyb3VwTm9kZXModGhpcy5ub2RlS2V5R3JvdXAoKSwgY3ljbGUpKVxuICApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ3JvdXBOb2RlVGVybXMgPSBjb21wdXRlZCgoKSA9PiB1bmlxdWUodGhpcy5ncm91cGVkTm9kZXMoKS5tYXAoKHsgdGVybSB9KSA9PiB0ZXJtKSkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNHcm91cE5vZGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vZGVLZXlHcm91cCgpICYmIHRoaXMuZ3JvdXBlZE5vZGVzKCk/Lmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpc0VtaXNzaW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3RlZE5vZGVLZXkoKSA9PT0gQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnMpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmlzRW1pc3Npb24oKVxuICAgICAgPyB0aGlzLmdyb3VwRW1pc3Npb25zKClcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMubm9kZUtleXMoKS5tYXAobm9kZUtleSA9PiBbbm9kZUtleSwgdGhpcy5ncm91cE5vZGVzQnlLZXkoeyBub2RlS2V5IH0pXSkpXG4gICk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhS2V5cyA9IGNvbXB1dGVkKCgpID0+IE9iamVjdC5rZXlzKHRoaXMuZGF0YSgpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhc0RhdGEgPSBjb21wdXRlZCgoKSA9PiBPYmplY3QudmFsdWVzKHRoaXMuZGF0YSgpKS5mbGF0KCkubGVuZ3RoID4gMCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlclRlcm1UeXBlcyA9IGNvbXB1dGVkKCgpID0+IG5vZGVLZXlGaWx0ZXJUZXJtVHlwZXNbdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyVGVybSA9IHNpZ25hbCgnJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNzdkZpbGVuYW1lID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5ub2RlS2V5cygpLmpvaW4oJy0nKX0uY3N2YCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBtYWtlIHN1cmUgbG9ncyBkb2VzIG5vdCByZW1haW4gZGlzcGxheWVkXG4gICAgICAgIGlmICgodGhpcy5pc09yaWdpbmFsKCkgJiYgdGhpcy5zZWxlY3RlZFZpZXcoKSA9PT0gVmlldy5sb2dzKSB8fCAhdGhpcy52aWV3cygpLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRWaWV3KCkpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcuc2V0KFZpZXcudGFibGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkTm9kZUtleSgpIHx8ICF0aGlzLm5vZGVLZXlzKCkuaW5jbHVkZXModGhpcy5zZWxlY3RlZE5vZGVLZXkoKSkpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZUtleS5zZXQodGhpcy5maXJzdE5vZGVLZXkoKSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcuc2V0KFZpZXcudGFibGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkR3JvdXBUZXJtKCkgfHwgIXRoaXMuZ3JvdXBOb2RlVGVybXMoKS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkR3JvdXBUZXJtKCkpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwVGVybS5zZXQodGhpcy5ncm91cE5vZGVUZXJtcygpWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdyb3VwTm9kZXNCeUtleTxcbiAgICBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnLFxuICAgIFIgPSBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnQW5pbWFsXG4gICAgICA/IEFuaW1hbFxuICAgICAgOiBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnRW1pc3Npb25cbiAgICAgICAgPyBFbWlzc2lvblxuICAgICAgICA6IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdJbnB1dFxuICAgICAgICAgID8gSGVzdGlhSW5wdXRcbiAgICAgICAgICA6IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdQcmFjdGljZVxuICAgICAgICAgICAgPyBQcmFjdGljZVxuICAgICAgICAgICAgOiBQcm9kdWN0XG4gID4oeyBub2RlS2V5IH06IFQpOiBJR3JvdXBlZEtleXM8Uj5bXSB7XG4gICAgY29uc3Qgbm9kZXNQZXJDeWNsZSA9IGdyb3VwTm9kZXNCeVRlcm08SUN5Y2xlSlNPTkxEIHwgZ3JvdXBlZE5vZGUsIFI+KFxuICAgICAgdGhpcy5jeWNsZXMoKSxcbiAgICAgIG5vZGVLZXksXG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWVzKCksXG4gICAgICBmaWx0ZXJCbGFua05vZGUodGhpcy5maWx0ZXJUZXJtKCkpXG4gICAgKTtcbiAgICByZXR1cm4gb3JkZXJCeShncm91cHBlZEtleXMobm9kZXNQZXJDeWNsZSksIFsna2V5J10sIFsnYXNjJ10pO1xuICB9XG5cbiAgcHJpdmF0ZSBncm91cEVtaXNzaW9ucygpIHtcbiAgICBjb25zdCBlbWlzc2lvbnNQZXJDeWNsZSA9IGdyb3VwTm9kZXNCeVRlcm08SUN5Y2xlSlNPTkxEIHwgZ3JvdXBlZE5vZGUsIEVtaXNzaW9uPihcbiAgICAgIHRoaXMuY3ljbGVzKCksXG4gICAgICBCbGFua05vZGVzS2V5LmVtaXNzaW9ucyxcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMoKSxcbiAgICAgIGZpbHRlckJsYW5rTm9kZSh0aGlzLmZpbHRlclRlcm0oKSlcbiAgICApO1xuICAgIGNvbnN0IHZhbHVlczogSUdyb3VwZWRLZXlzPEVtaXNzaW9uPltdID0gb3JkZXJCeShncm91cHBlZEtleXMoZW1pc3Npb25zUGVyQ3ljbGUpLCBbJ2tleSddLCBbJ2FzYyddKTtcbiAgICBjb25zdCBtZXRob2RUaWVycyA9IG9yZGVyQnkoXG4gICAgICB1bmlxdWUodmFsdWVzLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZS5tZXRob2RUaWVyKSkubWFwKG1ldGhvZFRpZXIgPT4gKHtcbiAgICAgICAgbWV0aG9kVGllcixcbiAgICAgICAgbWV0aG9kVGllck9yZGVyOiBtZXRob2RUaWVyT3JkZXIobWV0aG9kVGllcilcbiAgICAgIH0pKSxcbiAgICAgIFsnbWV0aG9kVGllck9yZGVyJ10sXG4gICAgICBbJ2FzYyddXG4gICAgKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgbWV0aG9kVGllcnMubWFwKCh7IG1ldGhvZFRpZXIgfSkgPT4gW21ldGhvZFRpZXIsIHZhbHVlcy5maWx0ZXIoKHsgdmFsdWUgfSkgPT4gdmFsdWUubWV0aG9kVGllciA9PT0gbWV0aG9kVGllcildKVxuICAgICkgYXMgZ3JvdXBlZEVtaXNzaW9ucztcbiAgfVxuXG4gIHByb3RlY3RlZCB0cmFja0J5SWQoX2luZGV4OiBudW1iZXIsIGl0ZW06IElDeWNsZUpTT05MRCB8IGdyb3VwZWROb2RlKSB7XG4gICAgcmV0dXJuIGl0ZW1bJ0BpZCddO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdEluZGV4KHsgdGFyZ2V0OiB7IHZhbHVlIH0gfSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleC5zZXQoK3ZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjeWNsZU5vZGUoY3ljbGU6IElDeWNsZUpTT05MRCB8IGdyb3VwZWROb2RlKSB7XG4gICAgcmV0dXJuICd0ZXJtJyBpbiBjeWNsZSA/IGN5Y2xlLnRlcm0gOiBjeWNsZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93RG93bmxvYWQoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50KTtcbiAgICBjb25zdCBjb21wb25lbnQgPSBpbnN0YW5jZS5jb21wb25lbnRJbnN0YW5jZSBhcyBOb2RlQ3N2RXhwb3J0Q29uZmlybUNvbXBvbmVudDtcbiAgICBjb21wb25lbnQubm9kZXMuc2V0KHRoaXMuY3ljbGVzKCkpO1xuICAgIGNvbXBvbmVudC5maWxlbmFtZS5zZXQodGhpcy5jc3ZGaWxlbmFtZSgpKTtcbiAgICBjb21wb25lbnQuaXNVcGxvYWQuc2V0KGZhbHNlKTtcbiAgICBjb21wb25lbnQuaGVhZGVyS2V5cy5zZXQodGhpcy5oZWFkZXJLZXlzKCkpO1xuICB9XG59XG4iLCJAaWYgKGlzR3JvdXBOb2RlKCkpIHtcbiAgPGRpdiBjbGFzcz1cInRhYnMgaXMtbWItMVwiPlxuICAgIDx1bD5cbiAgICAgIEBmb3IgKHRlcm0gb2YgZ3JvdXBOb2RlVGVybXMoKTsgdHJhY2sgdGVybS5uYW1lKSB7XG4gICAgICAgIDxsaSBbY2xhc3MuaXMtYWN0aXZlXT1cInNlbGVjdGVkR3JvdXBUZXJtKCkgPT09IHRlcm1cIj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0ZWRHcm91cFRlcm0uc2V0KHRlcm0pXCI+e3sgdGVybS5uYW1lIH19PC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gIDwvZGl2PlxufVxuXG48ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy12YXJpYWJsZSBpcy1hbGlnbi1pdGVtcy1jZW50ZXIgaXMtMiBpcy1tLTBcIj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgIEBpZiAoaGFzRGF0YSgpICYmIHNlbGVjdGVkVmlldygpID09PSBWaWV3LnRhYmxlKSB7XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsIGlzLWdob3N0XCIgKGNsaWNrKT1cInNob3dEb3dubG9hZCgpXCI+XG4gICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhRG93bmxvYWRcIiBzaXplPVwibGdcIj48L2ZhLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICB9XG4gIDwvZGl2PlxuICBAaWYgKHNlbGVjdGVkVmlldygpID09PSBWaWV3LnRhYmxlKSB7XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgIDxoZS1zZWFyY2gtZXh0ZW5kXG4gICAgICAgIGNsYXNzPVwiaXMtc2Vjb25kYXJ5IGlzLXNtYWxsXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgdGVybXMgYnkgbmFtZVwiXG4gICAgICAgIChzZWFyY2gpPVwiZmlsdGVyVGVybS5zZXQoJGV2ZW50KVwiPjwvaGUtc2VhcmNoLWV4dGVuZD5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKGhhc0RhdGEoKSAmJiB2aWV3cygpPy5sZW5ndGggPiAxKSB7XG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBpcy1uYXJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICAgIEBmb3IgKHZpZXcgb2Ygdmlld3MoKTsgdHJhY2sgdmlldykge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlzLXNlbGVjdGVkXT1cInNlbGVjdGVkVmlldygpID09PSB2aWV3XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGVkVmlldy5zZXQodmlldylcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICAgICAgPGZhLWljb24gW2ljb25dPVwidmlld0ljb25bdmlld11cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2ZhLWljb24+XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1oaWRkZW4tbW9iaWxlXCI+e3sgdmlldyB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbkBpZiAoaXNOb2RlS2V5QWxsb3dlZCgpKSB7XG4gIEBzd2l0Y2ggKHNlbGVjdGVkVmlldygpKSB7XG4gICAgQGNhc2UgKFZpZXcudGFibGUpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1weC0zIGlzLXBiLTNcIj5cbiAgICAgICAgQGlmIChoYXNEYXRhKCkpIHtcbiAgICAgICAgICA8aGUtZGF0YS10YWJsZSBjbGFzcz1cIm1iLTEgaXMtc21hbGxcIiBbc21hbGxdPVwidHJ1ZVwiIG1heEhlaWdodD1cIjMyMFwiPlxuICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZnVsbHdpZHRoIGlzLW5hcnJvdyBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgICBAaWYgKGRhdGFLZXlzKCkubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaGFzLXRleHQtd2VpZ2h0LWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwid2lkdGgtYXV0b1wiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBbY2xhc3MuaXMtaGlkZGVuXT1cImlzR3JvdXBOb2RlKClcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXRhS2V5IG9mIGRhdGFLZXlzKCk7IHRyYWNrIGRhdGFLZXk7IGxldCBkYXRhS2V5TGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGlmIChkYXRhKClbZGF0YUtleV0/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIFthdHRyLmNvbHNwYW5dPVwiZGF0YSgpW2RhdGFLZXldLmxlbmd0aFwiIFtjbGFzcy5oYXMtYm9yZGVyLXJpZ2h0XT1cIiFkYXRhS2V5TGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBkYXRhS2V5IHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJoYXMtdGV4dC13ZWlnaHQtc2VtaWJvbGRcIj5cbiAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJpc0dyb3VwTm9kZSgpXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgdHJhY2sgZGF0YUtleTsgbGV0IGRhdGFLZXlMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAobm9kZSBvZiBkYXRhKClbZGF0YUtleV07IHRyYWNrIG5vZGUudmFsdWUudGVybS5uYW1lOyBsZXQgbm9kZUxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwibm9kZS52YWx1ZS50ZXJtLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiZGF0YUtleXMoKS5sZW5ndGggPiAxICYmICFkYXRhS2V5TGFzdCAmJiBub2RlTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBbbm9kZV09XCJub2RlLnZhbHVlLnRlcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIdG1sXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS52YWx1ZS50ZXJtLm5hbWUgfCBlbGxpcHNpczogMzAgfCBjb21wb3VuZDogbm9kZS52YWx1ZS50ZXJtLnRlcm1UeXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9oZS1ub2RlLWxpbms+XG4gICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaXMtaXRhbGljIGhhcy10ZXh0LXdlaWdodC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0XCI+PC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy1ib3JkZXItcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cImlzR3JvdXBOb2RlKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwic2NoZW1hQmFzZVVybCArICcvQ3ljbGUjZnVuY3Rpb25hbFVuaXQnXCIgdGFyZ2V0PVwiX2JsYW5rXCI+RnVuY3Rpb25hbCB1bml0PC9hPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgdHJhY2sgZGF0YUtleTsgbGV0IGRhdGFLZXlMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAobm9kZSBvZiBkYXRhKClbZGF0YUtleV07IHRyYWNrIG5vZGUudmFsdWUudGVybS5uYW1lOyBsZXQgbm9kZUxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwibm9kZS52YWx1ZS50ZXJtLnVuaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYm9yZGVyLXJpZ2h0XT1cImRhdGFLZXlzKCkubGVuZ3RoID4gMSAmJiAhZGF0YUtleUxhc3QgJiYgbm9kZUxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwibm9kZS52YWx1ZS50ZXJtLnVuaXRzIHwgY29tcG91bmQ6IG5vZGUudmFsdWUudGVybS50ZXJtVHlwZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoZS10ZXJtcy11bml0cy1kZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1tbC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rlcm1dPVwibm9kZS52YWx1ZS50ZXJtXCI+PC9oZS10ZXJtcy11bml0cy1kZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgIEBmb3IgKGN5Y2xlIG9mIGN5Y2xlcygpOyB0cmFjayB0cmFja0J5SWQoY3ljbGVJbmRleCwgY3ljbGUpOyBsZXQgY3ljbGVJbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIiBbYXR0ci50aXRsZV09XCJkZWZhdWx0TGFiZWwoY3ljbGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBbbm9kZV09XCJjeWNsZU5vZGUoY3ljbGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBjeWNsZUluZGV4ICsgMSB9fS4ge3sgZGVmYXVsdExhYmVsKGN5Y2xlKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxoZS1jeWNsZXMtZnVuY3Rpb25hbC11bml0LW1lYXN1cmUgW2N5Y2xlXT1cImN5Y2xlXCI+PC9oZS1jeWNsZXMtZnVuY3Rpb25hbC11bml0LW1lYXN1cmU+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgdHJhY2sgZGF0YUtleTsgbGV0IGRhdGFLZXlMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAZm9yIChub2RlIG9mIGRhdGEoKVtkYXRhS2V5XTsgdHJhY2sgbm9kZS52YWx1ZS50ZXJtLm5hbWU7IGxldCBub2RlTGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLWJvcmRlci1yaWdodF09XCJkYXRhS2V5cygpLmxlbmd0aCA+IDEgJiYgIWRhdGFLZXlMYXN0ICYmIG5vZGVMYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobm9kZS52YWx1ZS52YWx1ZXNbY3ljbGVbJ0BpZCddXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItcG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdiUG9wb3Zlcl09XCJkZXRhaWxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9DbG9zZT1cIm91dHNpZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wb3ZlckNsYXNzPVwiaXMtbmFycm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckNvbnRleHRdPVwieyBkYXRhOiBub2RlLnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLCBjeWNsZSwga2V5OiBkYXRhS2V5IH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHBvaW50ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZShub2RlLnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLnZhbHVlLCBub2RlLnZhbHVlLnRlcm1bJ0BpZCddKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcmVjaXNpb246IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGVmYXVsdDogJy0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVN0YXRlXT1cImRhdGFTdGF0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZS52YWx1ZS52YWx1ZXNbY3ljbGVbJ0BpZCddXS5ub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PVwidmFsdWVcIj48L2hlLWJsYW5rLW5vZGUtc3RhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4tPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvaGUtZGF0YS10YWJsZT5cbiAgICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2VcbiAgICAgICAgICAgIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIlxuICAgICAgICAgICAgW3Nob3dEZWxldGVkXT1cImZpcnN0Tm9kZUtleSgpID09PSBCbGFua05vZGVzS2V5LmVtaXNzaW9uc1wiPjwvaGUtYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2U+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpcy1wdC0zIGhhcy10ZXh0LWNlbnRlcmVkXCI+XG4gICAgICAgICAgICA8c3Bhbj5ObyBkYXRhIGF2YWlsYWJsZTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWZpbHRlclRlcm0oKVwiPm1hdGNoaW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cbiAgICAgICAgICAgIEBpZiAoc2hvd1N3aXRjaFRvUmVjYWxjdWxhdGVkKCkpIHtcbiAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgU3dpdGNoIHRvXG4gICAgICAgICAgICAgICAgPGNvZGU+cmVjYWxjdWxhdGVkPC9jb2RlPlxuICAgICAgICAgICAgICAgIHZlcnNpb24uXG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIEBjYXNlIChWaWV3LmNoYXJ0KSB7XG4gICAgICBAc3dpdGNoIChmaXJzdE5vZGVLZXkoKSkge1xuICAgICAgICBAY2FzZSAoQmxhbmtOb2Rlc0tleS5pbnB1dHMpIHtcbiAgICAgICAgICA8aGUtY3ljbGVzLXJlc3VsdCBbY3ljbGVzXT1cImN5Y2xlcygpXCI+PC9oZS1jeWNsZXMtcmVzdWx0PlxuICAgICAgICB9XG4gICAgICAgIEBjYXNlIChCbGFua05vZGVzS2V5LmVtaXNzaW9ucykge1xuICAgICAgICAgIDxoZS1jeWNsZXMtZW1pc3Npb25zLWNoYXJ0IFtjeWNsZXNdPVwiY3ljbGVzKClcIj48L2hlLWN5Y2xlcy1lbWlzc2lvbnMtY2hhcnQ+XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgQGNhc2UgKFZpZXcudGltZWxpbmUpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RDeWNsZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cImlzLXB4LTMgaXMtcGItM1wiPlxuICAgICAgICA8aGUtY3ljbGVzLW5vZGVzLXRpbWVsaW5lXG4gICAgICAgICAgW3JlY2FsY3VsYXRlZFZhbHVlc109XCJ0aW1lbGluZVZhbHVlcygpXCJcbiAgICAgICAgICBbZGF0YVN0YXRlXT1cImRhdGFTdGF0ZSgpXCI+PC9oZS1jeWNsZXMtbm9kZXMtdGltZWxpbmU+XG4gICAgICAgIDxoZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZSBbZGF0YVN0YXRlXT1cImRhdGFTdGF0ZSgpXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZT5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAY2FzZSAoVmlldy5sb2dzKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0Q3ljbGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIEBpZiAobm9kZUtleXMoKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJzIGlzLW1iLTJcIj5cbiAgICAgICAgICA8dWw+XG4gICAgICAgICAgICBAZm9yIChub2RlS2V5IG9mIG5vZGVLZXlzKCk7IHRyYWNrIG5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgPGxpIFtjbGFzcy5pcy1hY3RpdmVdPVwic2VsZWN0ZWROb2RlS2V5KCkgPT09IG5vZGVLZXlcIj5cbiAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0ZWROb2RlS2V5LnNldChub2RlS2V5KVwiPnt7IG5vZGVLZXkgfCBrZXlUb0xhYmVsIH19PC9hPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgQGlmIChzZWxlY3RlZE5vZGUoKSkge1xuICAgICAgICA8aGUtbm9kZS1sb2dzLW1vZGVsc1xuICAgICAgICAgIFtub2RlXT1cInNlbGVjdGVkTm9kZSgpXCJcbiAgICAgICAgICBbbm9kZUtleV09XCJzZWxlY3RlZE5vZGVLZXkoKVwiXG4gICAgICAgICAgW2xvZ3NLZXldPVwic2VsZWN0ZWRMb2dzS2V5KClcIlxuICAgICAgICAgIFtvcmlnaW5hbFZhbHVlc109XCJzZWxlY3RlZE9yaWdpbmFsVmFsdWVzKClcIlxuICAgICAgICAgIFtyZWNhbGN1bGF0ZWRWYWx1ZXNdPVwic2VsZWN0ZWRSZWNhbGN1bGF0ZWRWYWx1ZXMoKVwiXG4gICAgICAgICAgW2ZpbHRlclRlcm1UeXBlc109XCJmaWx0ZXJUZXJtVHlwZXMoKVwiPjwvaGUtbm9kZS1sb2dzLW1vZGVscz5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuPG5nLXRlbXBsYXRlICNkZXRhaWxzIGxldC1ub2RlPVwiY3ljbGVcIiBsZXQtZGF0YT1cImRhdGFcIiBsZXQta2V5PVwia2V5XCI+XG4gIDxwPlxuICAgIDxiPnt7IGRlZmF1bHRMYWJlbChub2RlKSB9fTwvYj5cbiAgPC9wPlxuICA8aGUtbm9kZS12YWx1ZS1kZXRhaWxzXG4gICAgW2RhdGFdPVwiZGF0YVwiXG4gICAgW2RhdGFTdGF0ZV09XCJkYXRhU3RhdGUoKVwiXG4gICAgW25vZGVUeXBlXT1cIm5vZGVbJ0B0eXBlJ11cIlxuICAgIFtkYXRhS2V5XT1cImtleVwiPjwvaGUtbm9kZS12YWx1ZS1kZXRhaWxzPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzZWxlY3RDeWNsZT5cbiAgQGlmIChjeWNsZXMoKS5sZW5ndGggPiAxKSB7XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnMgaXMtcHktMiBpcy1weC0zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1zdGF0aWMgaXMtc2Vjb25kYXJ5XCI+U2VsZWN0IGEgQ3ljbGU8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtc21hbGwgaXMtZnVsbHdpZHRoIGlzLXNlY29uZGFyeVwiPlxuICAgICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJzZWxlY3RJbmRleCgkZXZlbnQpXCI+XG4gICAgICAgICAgICBAZm9yICh2YWx1ZSBvZiBjeWNsZXMoKTsgdHJhY2sgdmFsdWU7IGxldCBjeWNsZUluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImN5Y2xlSW5kZXhcIj57eyBjeWNsZUluZGV4ICsgMSB9fS4ge3sgZGVmYXVsdExhYmVsKHZhbHVlKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLW5vZGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jeWNsZXMvY3ljbGVzLW5vZGVzL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1ub2Rlcy9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFJTCxRQUFRLEVBSVIsWUFBWSxFQUlaLGFBQWEsRUFFZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8s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Y29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0YVN0YXRlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9hcGknO1xuaW1wb3J0IHtcbiAgSUN5Y2xlSlNPTkxELFxuICBJbnB1dCBhcyBIZXN0aWFJbnB1dCxcbiAgUHJvZHVjdCxcbiAgTm9kZVR5cGUsXG4gIEFuaW1hbCxcbiAgRW1pc3Npb24sXG4gIFByYWN0aWNlLFxuICBUZXJtVGVybVR5cGUsXG4gIEVtaXNzaW9uTWV0aG9kVGllcixcbiAgVGVybSxcbiAgVHJhbnNmb3JtYXRpb24sXG4gIEJsYW5rTm9kZXNLZXksXG4gIGJsYW5rTm9kZXNUeXBlXG59IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCBvcmRlckJ5IGZyb20gJ2xvZGFzaC5vcmRlcmJ5JztcbmltcG9ydCB7IHByb3BlcnR5VmFsdWUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzL2Rpc3QvdGVybSc7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcbmltcG9ydCB7IEZhSWNvbkNvbXBvbmVudCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9hbmd1bGFyLWZvbnRhd2Vzb21lJztcbmltcG9ydCB7IE5nYlRvb2x0aXAsIE5nYlBvcG92ZXIsIE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgSWNvbkRlZmluaXRpb24gfSBmcm9tICdAZm9ydGF3ZXNvbWUvZm9udGF3ZXNvbWUtc3ZnLWNvcmUnO1xuXG5pbXBvcnQgeyBmaWx0ZXJCbGFua05vZGUsIG1ldGhvZFRpZXJPcmRlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9ub2RlLXV0aWxzJztcbmltcG9ydCB7IGxvZ3NLZXkgfSBmcm9tICcuLi9jeWNsZXMubW9kZWwnO1xuaW1wb3J0IHsgSGVOb2RlU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbm9kZS9ub2RlLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ3JvdXBOb2Rlc0J5VGVybSwgSUdyb3VwZWRLZXlzLCBncm91cHBlZEtleXMgfSBmcm9tICcuLi8uLi9jb21tb24vbm9kZS11dGlscyc7XG5pbXBvcnQgeyBzY2hlbWFCYXNlVXJsLCBkZWZhdWx0TGFiZWwgfSBmcm9tICcuLi8uLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgUHJlY2lzaW9uUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9wcmVjaXNpb24ucGlwZSc7XG5pbXBvcnQgeyBLZXlUb0xhYmVsUGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9rZXktdG8tbGFiZWwucGlwZSc7XG5pbXBvcnQgeyBFbGxpcHNpc1BpcGUgfSBmcm9tICcuLi8uLi9jb21tb24vZWxsaXBzaXMucGlwZSc7XG5pbXBvcnQgeyBEZWZhdWx0UGlwZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWZhdWx0LnBpcGUnO1xuaW1wb3J0IHsgQ29tcG91bmRQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2NvbXBvdW5kLnBpcGUnO1xuaW1wb3J0IHsgTm9kZVZhbHVlRGV0YWlsc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL25vZGUvbm9kZS12YWx1ZS1kZXRhaWxzL25vZGUtdmFsdWUtZGV0YWlscy5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUNzdkV4cG9ydENvbmZpcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtY3N2LWV4cG9ydC1jb25maXJtL25vZGUtY3N2LWV4cG9ydC1jb25maXJtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOb2RlTG9nc01vZGVsc0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL25vZGUvbm9kZS1sb2dzLW1vZGVscy9ub2RlLWxvZ3MtbW9kZWxzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDeWNsZXNOb2Rlc1RpbWVsaW5lQ29tcG9uZW50IH0gZnJvbSAnLi4vY3ljbGVzLW5vZGVzLXRpbWVsaW5lL2N5Y2xlcy1ub2Rlcy10aW1lbGluZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDeWNsZXNFbWlzc2lvbnNDaGFydENvbXBvbmVudCB9IGZyb20gJy4uL2N5Y2xlcy1lbWlzc2lvbnMtY2hhcnQvY3ljbGVzLWVtaXNzaW9ucy1jaGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ3ljbGVzUmVzdWx0Q29tcG9uZW50IH0gZnJvbSAnLi4vY3ljbGVzLXJlc3VsdC9jeWNsZXMtcmVzdWx0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCbGFua05vZGVTdGF0ZU5vdGljZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9ibGFuay1ub2RlLXN0YXRlLW5vdGljZS9ibGFuay1ub2RlLXN0YXRlLW5vdGljZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmxhbmtOb2RlU3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vYmxhbmstbm9kZS1zdGF0ZS9ibGFuay1ub2RlLXN0YXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDeWNsZXNGdW5jdGlvbmFsVW5pdE1lYXN1cmVDb21wb25lbnQgfSBmcm9tICcuLi9jeWNsZXMtZnVuY3Rpb25hbC11bml0LW1lYXN1cmUvY3ljbGVzLWZ1bmN0aW9uYWwtdW5pdC1tZWFzdXJlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXJtc1VuaXRzRGVzY3JpcHRpb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi90ZXJtcy90ZXJtcy11bml0cy1kZXNjcmlwdGlvbi90ZXJtcy11bml0cy1kZXNjcmlwdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTm9kZUxpbmtDb21wb25lbnQgfSBmcm9tICcuLi8uLi9ub2RlL25vZGUtbGluay9ub2RlLWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGFUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaEV4dGVuZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZWFyY2gtZXh0ZW5kL3NlYXJjaC1leHRlbmQuY29tcG9uZW50JztcbmltcG9ydCB7IGZhQ2FsY3VsYXRvciwgZmFDaGFydEJhciwgZmFEb3dubG9hZCwgZmFMaXN0LCBmYUxpc3RBbHQgfSBmcm9tICdAZm9ydGF3ZXNvbWUvZnJlZS1zb2xpZC1zdmctaWNvbnMnO1xuXG5lbnVtIFZpZXcge1xuICB0YWJsZSA9ICdUYWJsZSB2aWV3JyxcbiAgY2hhcnQgPSAnQ2hhcnQgdmlldycsXG4gIHRpbWVsaW5lID0gJ09wZXJhdGlvbnMgVGltZWxpbmUnLFxuICBsb2dzID0gJ1JlY2FsY3VsYXRpb25zIGxvZ3MnXG59XG5cbmNvbnN0IHRpbWVsaW5lVGVybVR5cGUgPSBbVGVybVRlcm1UeXBlLm9wZXJhdGlvbl07XG5cbmludGVyZmFjZSBJQ3ljbGVDb25maWcge1xuICBub2RlS2V5OiBCbGFua05vZGVzS2V5O1xufVxuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnQW5pbWFsIGV4dGVuZHMgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleS5hbmltYWxzO1xufVxuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnRW1pc3Npb24gZXh0ZW5kcyBJQ3ljbGVDb25maWcge1xuICBub2RlS2V5OiBCbGFua05vZGVzS2V5LmVtaXNzaW9ucztcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0lucHV0IGV4dGVuZHMgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleS5pbnB1dHM7XG59XG5cbmludGVyZmFjZSBJQ3ljbGVDb25maWdQcmFjdGljZSBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkucHJhY3RpY2VzO1xufVxuXG5jb25zdCB2aWV3SWNvbjoge1xuICBbdmlldyBpbiBWaWV3XTogSWNvbkRlZmluaXRpb247XG59ID0ge1xuICBbVmlldy5jaGFydF06IGZhQ2hhcnRCYXIsXG4gIFtWaWV3LmxvZ3NdOiBmYUNhbGN1bGF0b3IsXG4gIFtWaWV3LnRhYmxlXTogZmFMaXN0LFxuICBbVmlldy50aW1lbGluZV06IGZhTGlzdEFsdFxufTtcblxuY29uc3Qgbm9kZUtleVZpZXdzOiB7XG4gIFt0eXBlIGluIEJsYW5rTm9kZXNLZXldPzogVmlld1tdO1xufSA9IHtcbiAgW0JsYW5rTm9kZXNLZXkuYW5pbWFsc106IFtWaWV3LnRhYmxlLCBWaWV3LmxvZ3NdLFxuICBbQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnNdOiBbVmlldy50YWJsZSwgVmlldy5jaGFydCwgVmlldy5sb2dzXSxcbiAgW0JsYW5rTm9kZXNLZXkuaW5wdXRzXTogW1ZpZXcudGFibGUsIFZpZXcuY2hhcnQsIFZpZXcubG9nc10sXG4gIFtCbGFua05vZGVzS2V5LnByb2R1Y3RzXTogW1ZpZXcudGFibGUsIFZpZXcuY2hhcnQsIFZpZXcubG9nc10sXG4gIFtCbGFua05vZGVzS2V5LnByYWN0aWNlc106IFtWaWV3LnRhYmxlLCBWaWV3LnRpbWVsaW5lLCBWaWV3LmxvZ3NdXG59O1xuXG5jb25zdCBub2RlS2V5RmlsdGVyVGVybVR5cGVzOiB7XG4gIFt0eXBlIGluIEJsYW5rTm9kZXNLZXldPzogVGVybVRlcm1UeXBlW107XG59ID0ge1xuICBbQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnNdOiBbVGVybVRlcm1UeXBlLmVtaXNzaW9uXVxufTtcblxuY29uc3QgZmlsdGVyVmFsdWVzVGltZWxpbmUgPSAodmFsdWVzOiBibGFua05vZGVzVHlwZVtdKSA9PlxuICB2YWx1ZXMuZmlsdGVyKHAgPT4gdGltZWxpbmVUZXJtVHlwZS5pbmNsdWRlcyhwLnRlcm0/LnRlcm1UeXBlKSk7XG5cbnR5cGUgZ3JvdXBlZEVtaXNzaW9ucyA9IHtcbiAgW21ldGhvZFRpZXIgaW4gRW1pc3Npb25NZXRob2RUaWVyXTogSUdyb3VwZWRLZXlzPEVtaXNzaW9uPltdO1xufTtcblxuZXhwb3J0IGVudW0gQ3ljbGVOb2Rlc0tleUdyb3VwIHtcbiAgYW5pbWFscyA9ICdhbmltYWxzJyxcbiAgdHJhbnNmb3JtYXRpb25zID0gJ3RyYW5zZm9ybWF0aW9ucydcbn1cblxudHlwZSBncm91cGVkTm9kZSA9IEFuaW1hbCB8IFRyYW5zZm9ybWF0aW9uO1xuXG5jb25zdCBjeWNsZUdyb3VwTm9kZSA9XG4gIChjeWNsZT86IElDeWNsZUpTT05MRCkgPT5cbiAgKG5vZGU/OiBncm91cGVkTm9kZSk6IGdyb3VwZWROb2RlICYgeyBuYW1lOiBzdHJpbmc7ICdAaWQnOiBzdHJpbmcgfSA9PlxuICAgIG5vZGVcbiAgICAgID8ge1xuICAgICAgICAgIC4uLm5vZGUsXG4gICAgICAgICAgbmFtZTogY3ljbGU/Lm5hbWUsXG4gICAgICAgICAgJ0BpZCc6IGN5Y2xlPy5bJ0BpZCddIC8vIHNldCBAaWQgc28gd2UgY2FuIGZldGNoIHRoZSBsb2dzIGZyb20gdGhlIEN5Y2xlXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcblxuY29uc3QgY3ljbGVHcm91cE5vZGVzID0gKGdyb3VwS2V5OiBDeWNsZU5vZGVzS2V5R3JvdXAsIGN5Y2xlPzogSUN5Y2xlSlNPTkxEKTogZ3JvdXBlZE5vZGVbXSA9PlxuICAoY3ljbGU/Lltncm91cEtleV0gfHwgW10pLm1hcChjeWNsZUdyb3VwTm9kZShjeWNsZSkpLmZpbHRlcihCb29sZWFuKTtcblxuY29uc3QgZmlsdGVyR3JvdXBOb2Rlc0J5VGVybSA9IChncm91cEtleTogQ3ljbGVOb2Rlc0tleUdyb3VwLCBjeWNsZXM6IElDeWNsZUpTT05MRFtdLCB0ZXJtPzogVGVybSk6IGdyb3VwZWROb2RlW10gPT5cbiAgY3ljbGVzXG4gICAgLm1hcChjeWNsZSA9PlxuICAgICAgY3ljbGVHcm91cE5vZGUoY3ljbGUpKFxuICAgICAgICAoKGN5Y2xlPy5bZ3JvdXBLZXldIGFzIGdyb3VwZWROb2RlW10pIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZmluZChub2RlID0+IG5vZGUudGVybT8ubmFtZSA9PT0gdGVybT8ubmFtZSlcbiAgICAgIClcbiAgICApXG4gICAgLmZpbHRlcihCb29sZWFuKTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtY3ljbGVzLW5vZGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nYlRvb2x0aXAsXG4gICAgRmFJY29uQ29tcG9uZW50LFxuICAgIFNlYXJjaEV4dGVuZENvbXBvbmVudCxcbiAgICBEYXRhVGFibGVDb21wb25lbnQsXG4gICAgTm9kZUxpbmtDb21wb25lbnQsXG4gICAgVGVybXNVbml0c0Rlc2NyaXB0aW9uQ29tcG9uZW50LFxuICAgIEN5Y2xlc0Z1bmN0aW9uYWxVbml0TWVhc3VyZUNvbXBvbmVudCxcbiAgICBOZ2JQb3BvdmVyLFxuICAgIEJsYW5rTm9kZVN0YXRlQ29tcG9uZW50LFxuICAgIEJsYW5rTm9kZVN0YXRlTm90aWNlQ29tcG9uZW50LFxuICAgIEN5Y2xlc1Jlc3VsdENvbXBvbmVudCxcbiAgICBDeWNsZXNFbWlzc2lvbnNDaGFydENvbXBvbmVudCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIEN5Y2xlc05vZGVzVGltZWxpbmVDb21wb25lbnQsXG4gICAgTm9kZUxvZ3NNb2RlbHNDb21wb25lbnQsXG4gICAgTm9kZVZhbHVlRGV0YWlsc0NvbXBvbmVudCxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDb21wb3VuZFBpcGUsXG4gICAgRGVmYXVsdFBpcGUsXG4gICAgRWxsaXBzaXNQaXBlLFxuICAgIEtleVRvTGFiZWxQaXBlLFxuICAgIFByZWNpc2lvblBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDeWNsZXNOb2Rlc0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW9kYWxTZXJ2aWNlID0gaW5qZWN0KE5nYk1vZGFsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBub2RlU3RvcmVTZXJ2aWNlID0gaW5qZWN0KEhlTm9kZVN0b3JlU2VydmljZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhRG93bmxvYWQgPSBmYURvd25sb2FkO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhU3RhdGUgPSBpbnB1dChEYXRhU3RhdGUub3JpZ2luYWwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZUtleXMgPSBpbnB1dC5yZXF1aXJlZDxCbGFua05vZGVzS2V5W10+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBub2RlS2V5R3JvdXAgPSBpbnB1dDxDeWNsZU5vZGVzS2V5R3JvdXA+KCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IEJsYW5rTm9kZXNLZXkgPSBCbGFua05vZGVzS2V5O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlyc3ROb2RlS2V5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5ub2RlS2V5cygpPy5bMF0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWROb2RlS2V5ID0gc2lnbmFsKHVuZGVmaW5lZCBhcyBCbGFua05vZGVzS2V5KTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VsZWN0ZWRHcm91cFRlcm0gPSBzaWduYWwodW5kZWZpbmVkIGFzIFRlcm0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzY2hlbWFCYXNlVXJsID0gc2NoZW1hQmFzZVVybCgpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWZhdWx0TGFiZWwgPSBkZWZhdWx0TGFiZWw7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhlYWRlcktleXMgPSBjb21wdXRlZCgoKSA9PiBbXG4gICAgJ2N5Y2xlLmlkJyxcbiAgICAnY3ljbGUuQGlkJyxcbiAgICAndHJhbnNmb3JtYXRpb24uaWQnLFxuICAgICd0cmFuc2Zvcm1hdGlvbi5AaWQnLFxuICAgIC4uLnRoaXMubm9kZUtleXMoKS5mbGF0TWFwKGtleSA9PiBbYGN5Y2xlLiR7a2V5fS5gLCBgdHJhbnNmb3JtYXRpb24uJHtrZXl9LmBdKVxuICBdKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgVmlldyA9IFZpZXc7XG4gIHByb3RlY3RlZCByZWFkb25seSB2aWV3SWNvbiA9IHZpZXdJY29uO1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3dWaWV3ID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgICh7XG4gICAgICAgIFtWaWV3LmNoYXJ0XTogdGhpcy5zZWxlY3RlZE5vZGVLZXkoKSA9PT0gQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnMgPyB0aGlzLmN5Y2xlcygpLmxlbmd0aCA+IDEgOiB0aGlzLmhhc0RhdGEoKSxcbiAgICAgICAgW1ZpZXcubG9nc106ICF0aGlzLmlzT3JpZ2luYWwoKSAmJiB0aGlzLmhhc1JlY2FsY3VsYXRlZE5vZGVzKCksXG4gICAgICAgIFtWaWV3LnRhYmxlXTogdHJ1ZSxcbiAgICAgICAgW1ZpZXcudGltZWxpbmVdOiB0aGlzLmVuYWJsZVRpbWVsaW5lKClcbiAgICAgIH0pIGFzIHsgW3ZpZXcgaW4gVmlld106IGJvb2xlYW4gfVxuICApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmlld3MgPSBjb21wdXRlZChcbiAgICAoKSA9PiBub2RlS2V5Vmlld3NbdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0/LmZpbHRlcih2aWV3ID0+IHRoaXMuc2hvd1ZpZXcoKVt2aWV3XSkgPz8gW11cbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkVmlldyA9IHNpZ25hbChWaWV3LnRhYmxlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9hbGxOb2RlcyA9IHRvU2lnbmFsKHRoaXMubm9kZVN0b3JlU2VydmljZS5maW5kJDxJQ3ljbGVKU09OTEQ+KE5vZGVUeXBlLkN5Y2xlKSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3JpZ2luYWxOb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbE5vZGVzKCk/Lm1hcChkYXRhID0+IGRhdGFbRGF0YVN0YXRlLm9yaWdpbmFsXSkgfHwgW10pO1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnROb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbE5vZGVzKCk/Lm1hcChkYXRhID0+IGRhdGFbdGhpcy5kYXRhU3RhdGUoKV0pIHx8IFtdKTtcblxuICAvLyBjYW4gYmUgQ3ljbGUgb3IgVHJhbnNmb3JtYXRpb25cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG9yaWdpbmFsQ3ljbGVzID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLm5vZGVLZXlHcm91cCgpXG4gICAgICA/IGZpbHRlckdyb3VwTm9kZXNCeVRlcm0odGhpcy5ub2RlS2V5R3JvdXAoKSwgdGhpcy5vcmlnaW5hbE5vZGVzKCksIHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSlcbiAgICAgIDogdGhpcy5vcmlnaW5hbE5vZGVzKClcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGN5Y2xlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5ub2RlS2V5R3JvdXAoKVxuICAgICAgPyBmaWx0ZXJHcm91cE5vZGVzQnlUZXJtKHRoaXMubm9kZUtleUdyb3VwKCksIHRoaXMuY3VycmVudE5vZGVzKCksIHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSlcbiAgICAgIDogdGhpcy5jdXJyZW50Tm9kZXMoKVxuICApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0ZWRJbmRleCA9IHNpZ25hbCgwKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvZ2lyaW5hbFNlbGVjdGVkQ3ljbGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9yaWdpbmFsQ3ljbGVzKCk/Llt0aGlzLnNlbGVjdGVkSW5kZXgoKV0pO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGVkQ3ljbGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmN5Y2xlcygpPy5bdGhpcy5zZWxlY3RlZEluZGV4KCldKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkTG9nc0tleSA9IGNvbXB1dGVkKCgpID0+IGxvZ3NLZXkodGhpcy5zZWxlY3RlZEN5Y2xlKCkpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkT3JpZ2luYWxWYWx1ZXMgPSBjb21wdXRlZChcbiAgICAoKSA9PiB0aGlzLm9naXJpbmFsU2VsZWN0ZWRDeWNsZSgpPy5bdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0gfHwgW11cbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkUmVjYWxjdWxhdGVkVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3RlZEN5Y2xlKCk/Llt0aGlzLnNlbGVjdGVkTm9kZUtleSgpXSB8fCBbXSk7XG4gIC8vIFRPRE86IGhhbmRsZSB0cmFuc2Zvcm1hdGlvbiBhbmQgbm9uLWluZGV4ZWQgbm9kZXMgb24gQ0VcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkTm9kZSA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5zZWxlY3RlZEN5Y2xlKClcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnRoaXMuc2VsZWN0ZWRDeWNsZSgpLFxuICAgICAgICAgICdAdHlwZSc6IE5vZGVUeXBlLkN5Y2xlLFxuICAgICAgICAgIHR5cGU6IE5vZGVUeXBlLkN5Y2xlLFxuICAgICAgICAgIGRhdGFTdGF0ZTogRGF0YVN0YXRlLnJlY2FsY3VsYXRlZFxuICAgICAgICB9XG4gICAgICA6IG51bGxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGlzT3JpZ2luYWwgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRhdGFTdGF0ZSgpID09PSBEYXRhU3RhdGUub3JpZ2luYWwpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9yaWdpbmFsVmFsdWVzID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuaXNPcmlnaW5hbCgpID8gbnVsbCA6IHRoaXMub3JpZ2luYWxDeWNsZXMoKSkgfHwgW10pO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaGFzUmVjYWxjdWxhdGVkTm9kZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuY3ljbGVzKCkuc29tZSgoeyBhZ2dyZWdhdGVkIH06IHsgYWdncmVnYXRlZD86IGFueSB9KSA9PiAhYWdncmVnYXRlZClcbiAgKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3dTd2l0Y2hUb1JlY2FsY3VsYXRlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuaXNPcmlnaW5hbCgpICYmIHRoaXMuaGFzUmVjYWxjdWxhdGVkTm9kZXMoKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVsaW5lVmFsdWVzID0gY29tcHV0ZWQoKCkgPT5cbiAgICBmaWx0ZXJWYWx1ZXNUaW1lbGluZSh0aGlzLnNlbGVjdGVkQ3ljbGUoKT8uW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldIHx8IFtdKVxuICApO1xuICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZVRpbWVsaW5lID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50aW1lbGluZVZhbHVlcygpLmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpc05vZGVLZXlBbGxvd2VkID0gY29tcHV0ZWQoKCkgPT4gbm9kZUtleVZpZXdzW3RoaXMuZmlyc3ROb2RlS2V5KCldLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRWaWV3KCkpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGdyb3VwZWROb2RlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5vcmlnaW5hbE5vZGVzKCkuZmxhdE1hcChjeWNsZSA9PiBjeWNsZUdyb3VwTm9kZXModGhpcy5ub2RlS2V5R3JvdXAoKSwgY3ljbGUpKVxuICApO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ3JvdXBOb2RlVGVybXMgPSBjb21wdXRlZCgoKSA9PiB1bmlxdWUodGhpcy5ncm91cGVkTm9kZXMoKS5tYXAoKHsgdGVybSB9KSA9PiB0ZXJtKSkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNHcm91cE5vZGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm5vZGVLZXlHcm91cCgpICYmIHRoaXMuZ3JvdXBlZE5vZGVzKCk/Lmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBpc0VtaXNzaW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3RlZE5vZGVLZXkoKSA9PT0gQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnMpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmlzRW1pc3Npb24oKVxuICAgICAgPyB0aGlzLmdyb3VwRW1pc3Npb25zKClcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMubm9kZUtleXMoKS5tYXAobm9kZUtleSA9PiBbbm9kZUtleSwgdGhpcy5ncm91cE5vZGVzQnlLZXkoeyBub2RlS2V5IH0pXSkpXG4gICk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhS2V5cyA9IGNvbXB1dGVkKCgpID0+IE9iamVjdC5rZXlzKHRoaXMuZGF0YSgpKSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhc0RhdGEgPSBjb21wdXRlZCgoKSA9PiBPYmplY3QudmFsdWVzKHRoaXMuZGF0YSgpKS5mbGF0KCkubGVuZ3RoID4gMCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZpbHRlclRlcm1UeXBlcyA9IGNvbXB1dGVkKCgpID0+IG5vZGVLZXlGaWx0ZXJUZXJtVHlwZXNbdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyVGVybSA9IHNpZ25hbCgnJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNzdkZpbGVuYW1lID0gY29tcHV0ZWQoKCkgPT4gYCR7dGhpcy5ub2RlS2V5cygpLmpvaW4oJy0nKX0uY3N2YCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyBtYWtlIHN1cmUgbG9ncyBkb2VzIG5vdCByZW1haW4gZGlzcGxheWVkXG4gICAgICAgIGlmICgodGhpcy5pc09yaWdpbmFsKCkgJiYgdGhpcy5zZWxlY3RlZFZpZXcoKSA9PT0gVmlldy5sb2dzKSB8fCAhdGhpcy52aWV3cygpLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRWaWV3KCkpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcuc2V0KFZpZXcudGFibGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkTm9kZUtleSgpIHx8ICF0aGlzLm5vZGVLZXlzKCkuaW5jbHVkZXModGhpcy5zZWxlY3RlZE5vZGVLZXkoKSkpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZUtleS5zZXQodGhpcy5maXJzdE5vZGVLZXkoKSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZpZXcuc2V0KFZpZXcudGFibGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkR3JvdXBUZXJtKCkgfHwgIXRoaXMuZ3JvdXBOb2RlVGVybXMoKS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkR3JvdXBUZXJtKCkpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEdyb3VwVGVybS5zZXQodGhpcy5ncm91cE5vZGVUZXJtcygpWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdyb3VwTm9kZXNCeUtleTxcbiAgICBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnLFxuICAgIFIgPSBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnQW5pbWFsXG4gICAgICA/IEFuaW1hbFxuICAgICAgOiBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnRW1pc3Npb25cbiAgICAgICAgPyBFbWlzc2lvblxuICAgICAgICA6IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdJbnB1dFxuICAgICAgICAgID8gSGVzdGlhSW5wdXRcbiAgICAgICAgICA6IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdQcmFjdGljZVxuICAgICAgICAgICAgPyBQcmFjdGljZVxuICAgICAgICAgICAgOiBQcm9kdWN0XG4gID4oeyBub2RlS2V5IH06IFQpOiBJR3JvdXBlZEtleXM8Uj5bXSB7XG4gICAgY29uc3Qgbm9kZXNQZXJDeWNsZSA9IGdyb3VwTm9kZXNCeVRlcm08SUN5Y2xlSlNPTkxEIHwgZ3JvdXBlZE5vZGUsIFI+KFxuICAgICAgdGhpcy5jeWNsZXMoKSxcbiAgICAgIG5vZGVLZXksXG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWVzKCksXG4gICAgICBmaWx0ZXJCbGFua05vZGUodGhpcy5maWx0ZXJUZXJtKCkpXG4gICAgKTtcbiAgICByZXR1cm4gb3JkZXJCeShncm91cHBlZEtleXMobm9kZXNQZXJDeWNsZSksIFsna2V5J10sIFsnYXNjJ10pO1xuICB9XG5cbiAgcHJpdmF0ZSBncm91cEVtaXNzaW9ucygpIHtcbiAgICBjb25zdCBlbWlzc2lvbnNQZXJDeWNsZSA9IGdyb3VwTm9kZXNCeVRlcm08SUN5Y2xlSlNPTkxEIHwgZ3JvdXBlZE5vZGUsIEVtaXNzaW9uPihcbiAgICAgIHRoaXMuY3ljbGVzKCksXG4gICAgICBCbGFua05vZGVzS2V5LmVtaXNzaW9ucyxcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMoKSxcbiAgICAgIGZpbHRlckJsYW5rTm9kZSh0aGlzLmZpbHRlclRlcm0oKSlcbiAgICApO1xuICAgIGNvbnN0IHZhbHVlczogSUdyb3VwZWRLZXlzPEVtaXNzaW9uPltdID0gb3JkZXJCeShncm91cHBlZEtleXMoZW1pc3Npb25zUGVyQ3ljbGUpLCBbJ2tleSddLCBbJ2FzYyddKTtcbiAgICBjb25zdCBtZXRob2RUaWVycyA9IG9yZGVyQnkoXG4gICAgICB1bmlxdWUodmFsdWVzLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZS5tZXRob2RUaWVyKSkubWFwKG1ldGhvZFRpZXIgPT4gKHtcbiAgICAgICAgbWV0aG9kVGllcixcbiAgICAgICAgbWV0aG9kVGllck9yZGVyOiBtZXRob2RUaWVyT3JkZXIobWV0aG9kVGllcilcbiAgICAgIH0pKSxcbiAgICAgIFsnbWV0aG9kVGllck9yZGVyJ10sXG4gICAgICBbJ2FzYyddXG4gICAgKTtcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgbWV0aG9kVGllcnMubWFwKCh7IG1ldGhvZFRpZXIgfSkgPT4gW21ldGhvZFRpZXIsIHZhbHVlcy5maWx0ZXIoKHsgdmFsdWUgfSkgPT4gdmFsdWUubWV0aG9kVGllciA9PT0gbWV0aG9kVGllcildKVxuICAgICkgYXMgZ3JvdXBlZEVtaXNzaW9ucztcbiAgfVxuXG4gIHByb3RlY3RlZCB0cmFja0J5SWQoX2luZGV4OiBudW1iZXIsIGl0ZW06IElDeWNsZUpTT05MRCB8IGdyb3VwZWROb2RlKSB7XG4gICAgcmV0dXJuIGl0ZW1bJ0BpZCddO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdEluZGV4KHsgdGFyZ2V0OiB7IHZhbHVlIH0gfSkge1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleC5zZXQoK3ZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjeWNsZU5vZGUoY3ljbGU6IElDeWNsZUpTT05MRCB8IGdyb3VwZWROb2RlKSB7XG4gICAgcmV0dXJuICd0ZXJtJyBpbiBjeWNsZSA/IGN5Y2xlLnRlcm0gOiBjeWNsZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93RG93bmxvYWQoKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE5vZGVDc3ZFeHBvcnRDb25maXJtQ29tcG9uZW50KTtcbiAgICBjb25zdCBjb21wb25lbnQgPSBpbnN0YW5jZS5jb21wb25lbnRJbnN0YW5jZSBhcyBOb2RlQ3N2RXhwb3J0Q29uZmlybUNvbXBvbmVudDtcbiAgICBjb21wb25lbnQubm9kZXMuc2V0KHRoaXMuY3ljbGVzKCkpO1xuICAgIGNvbXBvbmVudC5maWxlbmFtZS5zZXQodGhpcy5jc3ZGaWxlbmFtZSgpKTtcbiAgICBjb21wb25lbnQuaXNVcGxvYWQuc2V0KGZhbHNlKTtcbiAgICBjb21wb25lbnQuaGVhZGVyS2V5cy5zZXQodGhpcy5oZWFkZXJLZXlzKCkpO1xuICB9XG59XG4iLCJAaWYgKGlzR3JvdXBOb2RlKCkpIHtcbiAgPGRpdiBjbGFzcz1cInRhYnMgaXMtbWItMVwiPlxuICAgIDx1bD5cbiAgICAgIEBmb3IgKHRlcm0gb2YgZ3JvdXBOb2RlVGVybXMoKTsgdHJhY2sgdGVybS5uYW1lKSB7XG4gICAgICAgIDxsaSBbY2xhc3MuaXMtYWN0aXZlXT1cInNlbGVjdGVkR3JvdXBUZXJtKCkgPT09IHRlcm1cIj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0ZWRHcm91cFRlcm0uc2V0KHRlcm0pXCI+e3sgdGVybS5uYW1lIH19PC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgfVxuICAgIDwvdWw+XG4gIDwvZGl2PlxufVxuXG48ZGl2IGNsYXNzPVwiY29sdW1ucyBpcy12YXJpYWJsZSBpcy1hbGlnbi1pdGVtcy1jZW50ZXIgaXMtMiBpcy1tLTBcIj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgIEBpZiAoaGFzRGF0YSgpICYmIHNlbGVjdGVkVmlldygpID09PSBWaWV3LnRhYmxlKSB7XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsIGlzLWdob3N0XCIgKGNsaWNrKT1cInNob3dEb3dubG9hZCgpXCI+XG4gICAgICAgIDxmYS1pY29uIFtpY29uXT1cImZhRG93bmxvYWRcIiBzaXplPVwibGdcIiAvPlxuICAgICAgPC9idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmIChzZWxlY3RlZFZpZXcoKSA9PT0gVmlldy50YWJsZSkge1xuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93XCI+XG4gICAgICA8aGUtc2VhcmNoLWV4dGVuZFxuICAgICAgICBjbGFzcz1cImlzLXNlY29uZGFyeSBpcy1zbWFsbFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIHRlcm1zIGJ5IG5hbWVcIlxuICAgICAgICAoc2VhcmNoKT1cImZpbHRlclRlcm0uc2V0KCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAodmlld3MoKT8ubGVuZ3RoID4gMSkge1xuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQgaGFzLWFkZG9uc1wiPlxuICAgICAgICBAZm9yICh2aWV3IG9mIHZpZXdzKCk7IHRyYWNrIHZpZXcpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJzZWxlY3RlZFZpZXcoKSA9PT0gdmlld1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RlZFZpZXcuc2V0KHZpZXcpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgICAgIDxmYS1pY29uIFtpY29uXT1cInZpZXdJY29uW3ZpZXddXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLWhpZGRlbi1tb2JpbGVcIj57eyB2aWV3IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuQGlmIChpc05vZGVLZXlBbGxvd2VkKCkpIHtcbiAgQHN3aXRjaCAoc2VsZWN0ZWRWaWV3KCkpIHtcbiAgICBAY2FzZSAoVmlldy50YWJsZSkge1xuICAgICAgPGRpdiBjbGFzcz1cImlzLXB4LTMgaXMtcGItM1wiPlxuICAgICAgICBAaWYgKGhhc0RhdGEoKSkge1xuICAgICAgICAgIDxoZS1kYXRhLXRhYmxlIGNsYXNzPVwibWItMSBpcy1zbWFsbFwiIFtzbWFsbF09XCJ0cnVlXCIgbWF4SGVpZ2h0PVwiMzIwXCI+XG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1mdWxsd2lkdGggaXMtbmFycm93IGlzLXN0cmlwZWRcIj5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIEBpZiAoZGF0YUtleXMoKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJoYXMtdGV4dC13ZWlnaHQtYm9sZFwiPlxuICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvXCI+PC90aD5cbiAgICAgICAgICAgICAgICAgICAgPHRoIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgdHJhY2sgZGF0YUtleTsgbGV0IGRhdGFLZXlMYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGRhdGEoKVtkYXRhS2V5XT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggW2F0dHIuY29sc3Bhbl09XCJkYXRhKClbZGF0YUtleV0ubGVuZ3RoXCIgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiIWRhdGFLZXlMYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRhdGFLZXkgfCBrZXlUb0xhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImhhcy10ZXh0LXdlaWdodC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwid2lkdGgtYXV0byBoYXMtYm9yZGVyLXJpZ2h0XCI+PC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImhhcy1ib3JkZXItcmlnaHRcIiBbY2xhc3MuaXMtaGlkZGVuXT1cImlzR3JvdXBOb2RlKClcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUtleSBvZiBkYXRhS2V5cygpOyB0cmFjayBkYXRhS2V5OyBsZXQgZGF0YUtleUxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yIChub2RlIG9mIGRhdGEoKVtkYXRhS2V5XTsgdHJhY2sgbm9kZS52YWx1ZS50ZXJtLm5hbWU7IGxldCBub2RlTGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJub2RlLnZhbHVlLnRlcm0ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaGFzLWJvcmRlci1yaWdodF09XCJkYXRhS2V5cygpLmxlbmd0aCA+IDEgJiYgIWRhdGFLZXlMYXN0ICYmIG5vZGVMYXN0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIFtub2RlXT1cIm5vZGUudmFsdWUudGVybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbm5lckh0bWxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnZhbHVlLnRlcm0ubmFtZSB8IGVsbGlwc2lzOiAzMCB8IGNvbXBvdW5kOiBub2RlLnZhbHVlLnRlcm0udGVybVR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJpcy1pdGFsaWMgaGFzLXRleHQtd2VpZ2h0LXNlbWlib2xkXCI+XG4gICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJzY2hlbWFCYXNlVXJsICsgJy9DeWNsZSNmdW5jdGlvbmFsVW5pdCdcIiB0YXJnZXQ9XCJfYmxhbmtcIj5GdW5jdGlvbmFsIHVuaXQ8L2E+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgQGZvciAoZGF0YUtleSBvZiBkYXRhS2V5cygpOyB0cmFjayBkYXRhS2V5OyBsZXQgZGF0YUtleUxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICBAZm9yIChub2RlIG9mIGRhdGEoKVtkYXRhS2V5XTsgdHJhY2sgbm9kZS52YWx1ZS50ZXJtLm5hbWU7IGxldCBub2RlTGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHRoXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJub2RlLnZhbHVlLnRlcm0udW5pdHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiZGF0YUtleXMoKS5sZW5ndGggPiAxICYmICFkYXRhS2V5TGFzdCAmJiBub2RlTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCJub2RlLnZhbHVlLnRlcm0udW5pdHMgfCBjb21wb3VuZDogbm9kZS52YWx1ZS50ZXJtLnRlcm1UeXBlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGhlLXRlcm1zLXVuaXRzLWRlc2NyaXB0aW9uIGNsYXNzPVwiaXMtaW5saW5lLWJsb2NrIGlzLW1sLTJcIiBbdGVybV09XCJub2RlLnZhbHVlLnRlcm1cIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgQGZvciAoY3ljbGUgb2YgY3ljbGVzKCk7IHRyYWNrIHRyYWNrQnlJZChjeWNsZUluZGV4LCBjeWNsZSk7IGxldCBjeWNsZUluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiIFthdHRyLnRpdGxlXT1cImRlZmF1bHRMYWJlbChjeWNsZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aGUtbm9kZS1saW5rIFtub2RlXT1cImN5Y2xlTm9kZShjeWNsZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGN5Y2xlSW5kZXggKyAxIH19LiB7eyBkZWZhdWx0TGFiZWwoY3ljbGUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJpc0dyb3VwTm9kZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGhlLWN5Y2xlcy1mdW5jdGlvbmFsLXVuaXQtbWVhc3VyZSBbY3ljbGVdPVwiY3ljbGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICBAZm9yIChkYXRhS2V5IG9mIGRhdGFLZXlzKCk7IHRyYWNrIGRhdGFLZXk7IGxldCBkYXRhS2V5TGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgQGZvciAobm9kZSBvZiBkYXRhKClbZGF0YUtleV07IHRyYWNrIG5vZGUudmFsdWUudGVybS5uYW1lOyBsZXQgbm9kZUxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXMtbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiZGF0YUtleXMoKS5sZW5ndGggPiAxICYmICFkYXRhS2V5TGFzdCAmJiBub2RlTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmlnZ2VyLXBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nYlBvcG92ZXJdPVwiZGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvQ2xvc2U9XCJvdXRzaWRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvdyBpcy1vdmVyZmxvdy12aXNpYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3ZlckNvbnRleHRdPVwieyBkYXRhOiBub2RlLnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLCBjeWNsZSwga2V5OiBkYXRhS2V5IH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHBvaW50ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZShub2RlLnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLnZhbHVlLCBub2RlLnZhbHVlLnRlcm1bJ0BpZCddKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcmVjaXNpb246IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGVmYXVsdDogJy0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVN0YXRlXT1cImRhdGFTdGF0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZS52YWx1ZS52YWx1ZXNbY3ljbGVbJ0BpZCddXS5ub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PVwidmFsdWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+LTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICA8L2hlLWRhdGEtdGFibGU+XG4gICAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlXG4gICAgICAgICAgICBbZGF0YVN0YXRlXT1cImRhdGFTdGF0ZSgpXCJcbiAgICAgICAgICAgIFtzaG93RGVsZXRlZF09XCJmaXJzdE5vZGVLZXkoKSA9PT0gQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnNcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXMtcHQtMyBoYXMtdGV4dC1jZW50ZXJlZFwiPlxuICAgICAgICAgICAgPHNwYW4+Tm8gZGF0YSBhdmFpbGFibGU8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLXBsLTFcIiBbY2xhc3MuaXMtaGlkZGVuXT1cIiFmaWx0ZXJUZXJtKClcIj5tYXRjaGluZyB5b3VyIHNlYXJjaCBjcml0ZXJpYTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XG4gICAgICAgICAgICBAaWYgKHNob3dTd2l0Y2hUb1JlY2FsY3VsYXRlZCgpKSB7XG4gICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIFN3aXRjaCB0b1xuICAgICAgICAgICAgICAgIDxjb2RlPnJlY2FsY3VsYXRlZDwvY29kZT5cbiAgICAgICAgICAgICAgICB2ZXJzaW9uLlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICBAY2FzZSAoVmlldy5jaGFydCkge1xuICAgICAgQHN3aXRjaCAoZmlyc3ROb2RlS2V5KCkpIHtcbiAgICAgICAgQGNhc2UgKEJsYW5rTm9kZXNLZXkuaW5wdXRzKSB7XG4gICAgICAgICAgPGhlLWN5Y2xlcy1yZXN1bHQgW2N5Y2xlc109XCJjeWNsZXMoKVwiPjwvaGUtY3ljbGVzLXJlc3VsdD5cbiAgICAgICAgfVxuICAgICAgICBAY2FzZSAoQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnMpIHtcbiAgICAgICAgICA8aGUtY3ljbGVzLWVtaXNzaW9ucy1jaGFydCBbY3ljbGVzXT1cImN5Y2xlcygpXCIgLz5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBAY2FzZSAoVmlldy50aW1lbGluZSkge1xuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdEN5Y2xlXCIgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJpcy1weC0zIGlzLXBiLTNcIj5cbiAgICAgICAgPGhlLWN5Y2xlcy1ub2Rlcy10aW1lbGluZSBbcmVjYWxjdWxhdGVkVmFsdWVzXT1cInRpbWVsaW5lVmFsdWVzKClcIiBbZGF0YVN0YXRlXT1cImRhdGFTdGF0ZSgpXCIgLz5cbiAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIEBjYXNlIChWaWV3LmxvZ3MpIHtcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RDeWNsZVwiIC8+XG4gICAgICBAaWYgKG5vZGVLZXlzKCkubGVuZ3RoID4gMSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwidGFicyBpcy1tYi0yXCI+XG4gICAgICAgICAgPHVsPlxuICAgICAgICAgICAgQGZvciAobm9kZUtleSBvZiBub2RlS2V5cygpOyB0cmFjayBub2RlS2V5KSB7XG4gICAgICAgICAgICAgIDxsaSBbY2xhc3MuaXMtYWN0aXZlXT1cInNlbGVjdGVkTm9kZUtleSgpID09PSBub2RlS2V5XCI+XG4gICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cInNlbGVjdGVkTm9kZUtleS5zZXQobm9kZUtleSlcIj57eyBub2RlS2V5IHwga2V5VG9MYWJlbCB9fTwvYT5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIEBpZiAoc2VsZWN0ZWROb2RlKCkpIHtcbiAgICAgICAgPGhlLW5vZGUtbG9ncy1tb2RlbHNcbiAgICAgICAgICBbbm9kZV09XCJzZWxlY3RlZE5vZGUoKVwiXG4gICAgICAgICAgW25vZGVLZXldPVwic2VsZWN0ZWROb2RlS2V5KClcIlxuICAgICAgICAgIFtsb2dzS2V5XT1cInNlbGVjdGVkTG9nc0tleSgpXCJcbiAgICAgICAgICBbb3JpZ2luYWxWYWx1ZXNdPVwic2VsZWN0ZWRPcmlnaW5hbFZhbHVlcygpXCJcbiAgICAgICAgICBbcmVjYWxjdWxhdGVkVmFsdWVzXT1cInNlbGVjdGVkUmVjYWxjdWxhdGVkVmFsdWVzKClcIlxuICAgICAgICAgIFtmaWx0ZXJUZXJtVHlwZXNdPVwiZmlsdGVyVGVybVR5cGVzKClcIiAvPlxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG48bmctdGVtcGxhdGUgI2RldGFpbHMgbGV0LW5vZGU9XCJjeWNsZVwiIGxldC1kYXRhPVwiZGF0YVwiIGxldC1rZXk9XCJrZXlcIj5cbiAgPHA+XG4gICAgPGI+e3sgZGVmYXVsdExhYmVsKG5vZGUpIH19PC9iPlxuICA8L3A+XG4gIDxoZS1ub2RlLXZhbHVlLWRldGFpbHNcbiAgICBjbGFzcz1cImlzLW92ZXJmbG93LXZpc2libGVcIlxuICAgIFtkYXRhXT1cImRhdGFcIlxuICAgIFtkYXRhU3RhdGVdPVwiZGF0YVN0YXRlKClcIlxuICAgIFtub2RlVHlwZV09XCJub2RlWydAdHlwZSddXCJcbiAgICBbZGF0YUtleV09XCJrZXlcIiAvPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzZWxlY3RDeWNsZT5cbiAgQGlmIChjeWNsZXMoKS5sZW5ndGggPiAxKSB7XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnMgaXMtcHktMiBpcy1weC0zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1zdGF0aWMgaXMtc2Vjb25kYXJ5XCI+U2VsZWN0IGEgQ3ljbGU8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sIGlzLWV4cGFuZGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtc21hbGwgaXMtZnVsbHdpZHRoIGlzLXNlY29uZGFyeVwiPlxuICAgICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJzZWxlY3RJbmRleCgkZXZlbnQpXCI+XG4gICAgICAgICAgICBAZm9yICh2YWx1ZSBvZiBjeWNsZXMoKTsgdHJhY2sgdmFsdWU7IGxldCBjeWNsZUluZGV4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImN5Y2xlSW5kZXhcIj57eyBjeWNsZUluZGV4ICsgMSB9fS4ge3sgZGVmYXVsdExhYmVsKHZhbHVlKSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19
|