@hestia-earth/ui-components 0.0.1
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/README.md +24 -0
- package/auth/auth.service.d.ts +10 -0
- package/auth/public-api.d.ts +1 -0
- package/bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component.d.ts +40 -0
- package/bibliographies/bibliographies.module.d.ts +10 -0
- package/bibliographies/public-api.d.ts +2 -0
- package/bundles/hestia-earth-ui-components.umd.js +7570 -0
- package/bundles/hestia-earth-ui-components.umd.js.map +1 -0
- package/common/bind-once.directive.d.ts +10 -0
- package/common/blank-node-diffs/blank-node-diffs.component.d.ts +18 -0
- package/common/blank-node-state/blank-node-state.component.d.ts +36 -0
- package/common/blank-node-state-notice/blank-node-state-notice.component.d.ts +9 -0
- package/common/blank-node-value-delta/blank-node-value-delta.component.d.ts +13 -0
- package/common/click-outside.directive.d.ts +10 -0
- package/common/clipboard/clipboard.component.d.ts +16 -0
- package/common/common.module.d.ts +37 -0
- package/common/common.service.d.ts +11 -0
- package/common/default.pipe.d.ts +7 -0
- package/common/ellipsis.pipe.d.ts +7 -0
- package/common/get.pipe.d.ts +7 -0
- package/common/key-to-label.pipe.d.ts +7 -0
- package/common/keys.pipe.d.ts +7 -0
- package/common/link-key-value/link-key-value.component.d.ts +16 -0
- package/common/logs-utils.d.ts +17 -0
- package/common/maps-drawing-confirm/maps-drawing-confirm.component.d.ts +28 -0
- package/common/maps-utils.d.ts +70 -0
- package/common/pluralize.pipe.d.ts +7 -0
- package/common/popover/popover.component.d.ts +16 -0
- package/common/popover-confirm/popover-confirm.component.d.ts +15 -0
- package/common/precision.pipe.d.ts +7 -0
- package/common/public-api.d.ts +30 -0
- package/common/schema-version-link/schema-version-link.component.d.ts +10 -0
- package/common/skeleton-text/skeleton-text.component.d.ts +11 -0
- package/common/social-tags/social-tags.component.d.ts +12 -0
- package/common/tags-input.directive.d.ts +20 -0
- package/common/times.pipe.d.ts +7 -0
- package/common/toast/toast.component.d.ts +19 -0
- package/common/toast.service.d.ts +16 -0
- package/common/unit-converter/unit-converter.component.d.ts +25 -0
- package/common/utils.d.ts +88 -0
- package/cycles/cycles-activity/cycles-activity.component.d.ts +31 -0
- package/cycles/cycles-activity-logs/cycles-activity-logs.component.d.ts +25 -0
- package/cycles/cycles-completeness/cycles-completeness.component.d.ts +14 -0
- package/cycles/cycles-emissions/cycles-emissions.component.d.ts +40 -0
- package/cycles/cycles-emissions-chart/cycles-emissions-chart.component.d.ts +18 -0
- package/cycles/cycles-emissions-logs/cycles-emissions-logs.component.d.ts +23 -0
- package/cycles/cycles-functional-unit-measure/cycles-functional-unit-measure.component.d.ts +8 -0
- package/cycles/cycles-result/cycles-result.component.d.ts +13 -0
- package/cycles/cycles-suggest-form/cycles-suggest-form.component.d.ts +24 -0
- package/cycles/cycles.model.d.ts +7 -0
- package/cycles/cycles.module.d.ts +19 -0
- package/cycles/public-api.d.ts +10 -0
- package/engine/aggregation-engine.service.d.ts +71 -0
- package/engine/engine.service.d.ts +61 -0
- package/engine/public-api.d.ts +2 -0
- package/esm2015/auth/auth.service.js +19 -0
- package/esm2015/auth/public-api.js +2 -0
- package/esm2015/bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component.js +100 -0
- package/esm2015/bibliographies/bibliographies.module.js +30 -0
- package/esm2015/bibliographies/public-api.js +3 -0
- package/esm2015/common/bind-once.directive.js +23 -0
- package/esm2015/common/blank-node-diffs/blank-node-diffs.component.js +47 -0
- package/esm2015/common/blank-node-state/blank-node-state.component.js +90 -0
- package/esm2015/common/blank-node-state-notice/blank-node-state-notice.component.js +27 -0
- package/esm2015/common/blank-node-value-delta/blank-node-value-delta.component.js +41 -0
- package/esm2015/common/click-outside.directive.js +28 -0
- package/esm2015/common/clipboard/clipboard.component.js +69 -0
- package/esm2015/common/common.module.js +144 -0
- package/esm2015/common/common.service.js +29 -0
- package/esm2015/common/default.pipe.js +23 -0
- package/esm2015/common/ellipsis.pipe.js +17 -0
- package/esm2015/common/get.pipe.js +17 -0
- package/esm2015/common/key-to-label.pipe.js +18 -0
- package/esm2015/common/keys.pipe.js +20 -0
- package/esm2015/common/link-key-value/link-key-value.component.js +55 -0
- package/esm2015/common/logs-utils.js +49 -0
- package/esm2015/common/maps-drawing-confirm/maps-drawing-confirm.component.js +89 -0
- package/esm2015/common/maps-utils.js +101 -0
- package/esm2015/common/pluralize.pipe.js +17 -0
- package/esm2015/common/popover/popover.component.js +37 -0
- package/esm2015/common/popover-confirm/popover-confirm.component.js +38 -0
- package/esm2015/common/precision.pipe.js +20 -0
- package/esm2015/common/public-api.js +31 -0
- package/esm2015/common/schema-version-link/schema-version-link.component.js +39 -0
- package/esm2015/common/skeleton-text/skeleton-text.component.js +44 -0
- package/esm2015/common/social-tags/social-tags.component.js +37 -0
- package/esm2015/common/tags-input.directive.js +74 -0
- package/esm2015/common/times.pipe.js +16 -0
- package/esm2015/common/toast/toast.component.js +37 -0
- package/esm2015/common/toast.service.js +36 -0
- package/esm2015/common/unit-converter/unit-converter.component.js +73 -0
- package/esm2015/common/utils.js +245 -0
- package/esm2015/cycles/cycles-activity/cycles-activity.component.js +92 -0
- package/esm2015/cycles/cycles-activity-logs/cycles-activity-logs.component.js +48 -0
- package/esm2015/cycles/cycles-completeness/cycles-completeness.component.js +41 -0
- package/esm2015/cycles/cycles-emissions/cycles-emissions.component.js +121 -0
- package/esm2015/cycles/cycles-emissions-chart/cycles-emissions-chart.component.js +93 -0
- package/esm2015/cycles/cycles-emissions-logs/cycles-emissions-logs.component.js +63 -0
- package/esm2015/cycles/cycles-functional-unit-measure/cycles-functional-unit-measure.component.js +22 -0
- package/esm2015/cycles/cycles-result/cycles-result.component.js +92 -0
- package/esm2015/cycles/cycles-suggest-form/cycles-suggest-form.component.js +83 -0
- package/esm2015/cycles/cycles.model.js +2 -0
- package/esm2015/cycles/cycles.module.js +66 -0
- package/esm2015/cycles/public-api.js +11 -0
- package/esm2015/engine/aggregation-engine.service.js +126 -0
- package/esm2015/engine/engine.service.js +78 -0
- package/esm2015/engine/public-api.js +3 -0
- package/esm2015/files/files-error.model.js +180 -0
- package/esm2015/files/files-form/files-form.component.js +439 -0
- package/esm2015/files/files-form.model.js +548 -0
- package/esm2015/files/files.module.js +42 -0
- package/esm2015/files/public-api.js +3 -0
- package/esm2015/fontawesome/fontawesome.module.js +36 -0
- package/esm2015/fontawesome/public-api.js +2 -0
- package/esm2015/hestia-earth-ui-components.js +5 -0
- package/esm2015/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.js +161 -0
- package/esm2015/impact-assessments/impact-assessments-indicators-chart/impact-assessments-indicators-chart.component.js +142 -0
- package/esm2015/impact-assessments/impact-assessments-products/impact-assessments-products.component.js +252 -0
- package/esm2015/impact-assessments/impact-assessments-products-logs/impact-assessments-products-logs.component.js +68 -0
- package/esm2015/impact-assessments/impact-assessments.model.js +2 -0
- package/esm2015/impact-assessments/impact-assessments.module.js +47 -0
- package/esm2015/impact-assessments/public-api.js +7 -0
- package/esm2015/mendeley/mendeley.service.js +35 -0
- package/esm2015/mendeley/public-api.js +2 -0
- package/esm2015/node/node-csv-export-confirm/node-csv-export-confirm.component.js +65 -0
- package/esm2015/node/node-csv-select-headers/node-csv-select-headers.component.js +119 -0
- package/esm2015/node/node-csv.service.js +24 -0
- package/esm2015/node/node-diffs/node-diffs.component.js +67 -0
- package/esm2015/node/node-diffs/node-diffs.model.js +6 -0
- package/esm2015/node/node-icon/node-icon.component.js +37 -0
- package/esm2015/node/node-link/node-link.component.js +33 -0
- package/esm2015/node/node-logs-file/node-logs-file.component.js +63 -0
- package/esm2015/node/node-logs-models/node-logs-models.component.js +188 -0
- package/esm2015/node/node-missing-lookup-factors/node-missing-lookup-factors.component.js +34 -0
- package/esm2015/node/node-value-details/node-value-details.component.js +46 -0
- package/esm2015/node/node.module.js +67 -0
- package/esm2015/node/node.service.js +113 -0
- package/esm2015/node/public-api.js +13 -0
- package/esm2015/public-api.js +16 -0
- package/esm2015/schema/public-api.js +2 -0
- package/esm2015/schema/schema.service.js +167 -0
- package/esm2015/search/public-api.js +4 -0
- package/esm2015/search/search.model.js +204 -0
- package/esm2015/search/search.module.js +13 -0
- package/esm2015/search/search.service.js +99 -0
- package/esm2015/sites/public-api.js +6 -0
- package/esm2015/sites/sites-maps/sites-maps.component.js +162 -0
- package/esm2015/sites/sites-measurements/sites-measurements.component.js +78 -0
- package/esm2015/sites/sites-measurements-logs/sites-measurements-logs.component.js +63 -0
- package/esm2015/sites/sites.model.js +10 -0
- package/esm2015/sites/sites.module.js +42 -0
- package/esm2015/terms/public-api.js +2 -0
- package/esm2015/terms/terms.model.js +184 -0
- package/esm2015/users/public-api.js +2 -0
- package/esm2015/users/users.service.js +17 -0
- package/fesm2015/hestia-earth-ui-components.js +5920 -0
- package/fesm2015/hestia-earth-ui-components.js.map +1 -0
- package/files/files-error.model.d.ts +40 -0
- package/files/files-form/files-form.component.d.ts +94 -0
- package/files/files-form.model.d.ts +113 -0
- package/files/files.module.d.ts +13 -0
- package/files/public-api.d.ts +2 -0
- package/fontawesome/fontawesome.module.d.ts +10 -0
- package/fontawesome/public-api.d.ts +1 -0
- package/hestia-earth-ui-components.d.ts +5 -0
- package/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.d.ts +28 -0
- package/impact-assessments/impact-assessments-indicators-chart/impact-assessments-indicators-chart.component.d.ts +25 -0
- package/impact-assessments/impact-assessments-products/impact-assessments-products.component.d.ts +77 -0
- package/impact-assessments/impact-assessments-products-logs/impact-assessments-products-logs.component.d.ts +25 -0
- package/impact-assessments/impact-assessments.model.d.ts +6 -0
- package/impact-assessments/impact-assessments.module.d.ts +15 -0
- package/impact-assessments/public-api.d.ts +6 -0
- package/mendeley/mendeley.service.d.ts +25 -0
- package/mendeley/public-api.d.ts +1 -0
- package/node/node-csv-export-confirm/node-csv-export-confirm.component.d.ts +32 -0
- package/node/node-csv-select-headers/node-csv-select-headers.component.d.ts +42 -0
- package/node/node-csv.service.d.ts +9 -0
- package/node/node-diffs/node-diffs.component.d.ts +23 -0
- package/node/node-diffs/node-diffs.model.d.ts +4 -0
- package/node/node-icon/node-icon.component.d.ts +8 -0
- package/node/node-link/node-link.component.d.ts +11 -0
- package/node/node-logs-file/node-logs-file.component.d.ts +31 -0
- package/node/node-logs-models/node-logs-models.component.d.ts +72 -0
- package/node/node-missing-lookup-factors/node-missing-lookup-factors.component.d.ts +14 -0
- package/node/node-value-details/node-value-details.component.d.ts +17 -0
- package/node/node.module.d.ts +20 -0
- package/node/node.service.d.ts +70 -0
- package/node/public-api.d.ts +12 -0
- package/package.json +53 -0
- package/public-api.d.ts +15 -0
- package/schema/public-api.d.ts +1 -0
- package/schema/schema.service.d.ts +51 -0
- package/search/public-api.d.ts +3 -0
- package/search/search.model.d.ts +243 -0
- package/search/search.module.d.ts +7 -0
- package/search/search.service.d.ts +129 -0
- package/sites/public-api.d.ts +5 -0
- package/sites/sites-maps/sites-maps.component.d.ts +35 -0
- package/sites/sites-measurements/sites-measurements.component.d.ts +31 -0
- package/sites/sites-measurements-logs/sites-measurements-logs.component.d.ts +23 -0
- package/sites/sites.model.d.ts +10 -0
- package/sites/sites.module.d.ts +13 -0
- package/styles.scss +197 -0
- package/terms/public-api.d.ts +1 -0
- package/terms/terms.model.d.ts +21 -0
- package/users/public-api.d.ts +1 -0
- package/users/users.service.d.ts +7 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { ReplaySubject } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
let toastId = 0;
|
|
5
|
+
export class ToastService {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.toasts = new ReplaySubject(1);
|
|
8
|
+
}
|
|
9
|
+
success(message, duration = 3000) {
|
|
10
|
+
this.toasts.next({
|
|
11
|
+
id: ++toastId,
|
|
12
|
+
message,
|
|
13
|
+
duration,
|
|
14
|
+
color: 'success',
|
|
15
|
+
showRawMessage: true
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
error(message, showRawMessage = true, duration = 3000) {
|
|
19
|
+
this.toasts.next({
|
|
20
|
+
id: ++toastId,
|
|
21
|
+
message: (`${message}` || '').trim(),
|
|
22
|
+
duration,
|
|
23
|
+
color: 'danger',
|
|
24
|
+
showRawMessage
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
ToastService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ToastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
29
|
+
ToastService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ToastService, providedIn: 'root' });
|
|
30
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ToastService, decorators: [{
|
|
31
|
+
type: Injectable,
|
|
32
|
+
args: [{
|
|
33
|
+
providedIn: 'root'
|
|
34
|
+
}]
|
|
35
|
+
}] });
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tb24vdG9hc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBVXJDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQUtoQixNQUFNLE9BQU8sWUFBWTtJQUh6QjtRQUlFLFdBQU0sR0FBRyxJQUFJLGFBQWEsQ0FBUyxDQUFDLENBQUMsQ0FBQztLQXFCdkM7SUFuQkMsT0FBTyxDQUFDLE9BQWUsRUFBRSxRQUFRLEdBQUcsSUFBSTtRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNmLEVBQUUsRUFBRSxFQUFFLE9BQU87WUFDYixPQUFPO1lBQ1AsUUFBUTtZQUNSLEtBQUssRUFBRSxTQUFTO1lBQ2hCLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBZSxFQUFFLGNBQWMsR0FBRyxJQUFJLEVBQUUsUUFBUSxHQUFHLElBQUk7UUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDZixFQUFFLEVBQUUsRUFBRSxPQUFPO1lBQ2IsT0FBTyxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDcEMsUUFBUTtZQUNSLEtBQUssRUFBRSxRQUFRO1lBQ2YsY0FBYztTQUNmLENBQUMsQ0FBQztJQUNMLENBQUM7OzBHQXJCVSxZQUFZOzhHQUFaLFlBQVksY0FGWCxNQUFNOzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElUb2FzdCB7XG4gIGlkOiBudW1iZXI7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgZHVyYXRpb246IG51bWJlcjtcbiAgY29sb3I6ICdzdWNjZXNzJ3wnZGFuZ2VyJztcbiAgc2hvd1Jhd01lc3NhZ2U/OiBib29sZWFuO1xufVxuXG5sZXQgdG9hc3RJZCA9IDA7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRvYXN0U2VydmljZSB7XG4gIHRvYXN0cyA9IG5ldyBSZXBsYXlTdWJqZWN0PElUb2FzdD4oMSk7XG5cbiAgc3VjY2VzcyhtZXNzYWdlOiBzdHJpbmcsIGR1cmF0aW9uID0gMzAwMCkge1xuICAgIHRoaXMudG9hc3RzLm5leHQoe1xuICAgICAgaWQ6ICsrdG9hc3RJZCxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGNvbG9yOiAnc3VjY2VzcycsXG4gICAgICBzaG93UmF3TWVzc2FnZTogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgZXJyb3IobWVzc2FnZTogc3RyaW5nLCBzaG93UmF3TWVzc2FnZSA9IHRydWUsIGR1cmF0aW9uID0gMzAwMCkge1xuICAgIHRoaXMudG9hc3RzLm5leHQoe1xuICAgICAgaWQ6ICsrdG9hc3RJZCxcbiAgICAgIG1lc3NhZ2U6IChgJHttZXNzYWdlfWAgfHwgJycpLnRyaW0oKSxcbiAgICAgIGR1cmF0aW9uLFxuICAgICAgY29sb3I6ICdkYW5nZXInLFxuICAgICAgc2hvd1Jhd01lc3NhZ2VcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { ConvertUnits, converters, convertValue, isNumber, isBoolean } from '@hestia-earth/utils';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../clipboard/clipboard.component";
|
|
5
|
+
import * as i2 from "@angular/forms";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
import * as i4 from "../keys.pipe";
|
|
8
|
+
const parsePropertyValue = (value) => isNumber(value) ? +value : (isBoolean(value) ? value.toString() === 'true' : value);
|
|
9
|
+
const parseResult = (value) => isNaN(value) ? '' : `${value}`.replace(',', '.');
|
|
10
|
+
export class UnitConverterComponent {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.value = 1;
|
|
13
|
+
this.ConvertUnits = ConvertUnits;
|
|
14
|
+
this.result = '';
|
|
15
|
+
this.arguments = [];
|
|
16
|
+
}
|
|
17
|
+
ngOnInit() {
|
|
18
|
+
return this.updateValue();
|
|
19
|
+
}
|
|
20
|
+
get args() {
|
|
21
|
+
var _a;
|
|
22
|
+
return (((_a = this.term) === null || _a === void 0 ? void 0 : _a.defaultProperties) || []).reduce((prev, prop) => {
|
|
23
|
+
var _a, _b;
|
|
24
|
+
return (Object.assign(Object.assign({}, prev), { [(_b = (_a = prop.term) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.toLowerCase()]: parsePropertyValue(prop.value) }));
|
|
25
|
+
}, {});
|
|
26
|
+
}
|
|
27
|
+
get units() {
|
|
28
|
+
return this.fromUnits ?
|
|
29
|
+
Object.values(ConvertUnits).filter(v => v in converters[this.fromUnits]) :
|
|
30
|
+
[];
|
|
31
|
+
}
|
|
32
|
+
requireArgs(keys) {
|
|
33
|
+
const args = this.args;
|
|
34
|
+
this.arguments = keys.map(key => ({ key, value: args[key] || '' }));
|
|
35
|
+
}
|
|
36
|
+
updateUnits() {
|
|
37
|
+
let requiredKeys = [];
|
|
38
|
+
if (this.fromUnits === ConvertUnits.kg || this.toUnits === ConvertUnits.kg) {
|
|
39
|
+
requiredKeys = ['density'];
|
|
40
|
+
}
|
|
41
|
+
this.requireArgs(requiredKeys);
|
|
42
|
+
return this.updateValue();
|
|
43
|
+
}
|
|
44
|
+
updateValue() {
|
|
45
|
+
if (!this.fromUnits || !this.toUnits) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const args = Object.assign(Object.assign({}, this.args), this.arguments.reduce((prev, { key, value }) => (Object.assign(Object.assign({}, prev), { [key]: value })), {}));
|
|
49
|
+
try {
|
|
50
|
+
this.result = parseResult(convertValue(this.value, this.fromUnits, this.toUnits, args));
|
|
51
|
+
}
|
|
52
|
+
catch (_) { }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
UnitConverterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: UnitConverterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
56
|
+
UnitConverterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: UnitConverterComponent, selector: "he-unit-converter", inputs: { term: "term", value: "value", fromUnits: "fromUnits", toUnits: "toUnits" }, ngImport: i0, template: "<div class=\"columns mb-0\">\n <div class=\"column\">\n <label class=\"label has-text-white\" for=\"value\">Value</label>\n </div>\n <div class=\"column\">\n <label class=\"label has-text-white\" for=\"result\">Convert To</label>\n </div>\n</div>\n\n<div class=\"columns\">\n <div class=\"column\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <input type=\"number\" class=\"input\" [(ngModel)]=\"value\" name=\"value\" id=\"value\"\n (input)=\"updateValue()\"\n >\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-fullwidth\">\n <select [(ngModel)]=\"fromUnits\" name=\"fromUnits\" id=\"fromUnits\"\n (change)=\"updateUnits()\"\n >\n <option [value]=\"undefined\">Unit</option>\n <option *ngFor=\"let unit of ConvertUnits | keys\" [value]=\"unit.value\">{{unit.key}}</option>\n </select>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"column\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <input type=\"string\" class=\"input\" [value]=\"result\" name=\"result\" id=\"result\" readonly>\n </div>\n <div class=\"control\">\n <div class=\"select is-fullwidth\">\n <select [(ngModel)]=\"toUnits\" name=\"toUnits\" id=\"toUnits\"\n (change)=\"updateUnits()\"\n >\n <option [value]=\"undefined\">Unit</option>\n <option *ngFor=\"let unit of units\" [value]=\"unit\">{{unit}}</option>\n </select>\n </div>\n </div>\n <div class=\"control\">\n <he-clipboard clipboardClass=\"button is-white px-2\"\n [value]=\"result\" [disabled]=\"!result\" [hideText]=\"true\"\n ></he-clipboard>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"field is-horizontal\" *ngFor=\"let arg of arguments\">\n <div class=\"field-label is-normal\">\n <label class=\"label has-text-white\" [for]=\"arg.key\">\n <span class=\"is-capitalized\">{{arg.key}}</span>\n <span class=\"has-text-danger pl-1\">*</span>\n </label>\n </div>\n <div class=\"field-body\">\n <div class=\"field\">\n <div class=\"control\">\n <input type=\"string\" class=\"input is-small\"\n [(ngModel)]=\"arg.value\" [id]=\"arg.key\"\n (input)=\"updateValue()\"\n placeholder=\"Required for conversion\"\n >\n </div>\n </div>\n </div>\n</div>\n", styles: [".select{min-width:85px}\n"], components: [{ type: i1.ClipboardComponent, selector: "he-clipboard", inputs: ["value", "disabled", "hideText", "icon", "size", "rotate", "clipboardClass"] }], directives: [{ type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "keys": i4.KeysPipe } });
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: UnitConverterComponent, decorators: [{
|
|
58
|
+
type: Component,
|
|
59
|
+
args: [{
|
|
60
|
+
selector: 'he-unit-converter',
|
|
61
|
+
templateUrl: './unit-converter.component.html',
|
|
62
|
+
styleUrls: ['./unit-converter.component.scss']
|
|
63
|
+
}]
|
|
64
|
+
}], propDecorators: { term: [{
|
|
65
|
+
type: Input
|
|
66
|
+
}], value: [{
|
|
67
|
+
type: Input
|
|
68
|
+
}], fromUnits: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}], toUnits: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}] } });
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC1jb252ZXJ0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1vbi91bml0LWNvbnZlcnRlci91bml0LWNvbnZlcnRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3VuaXQtY29udmVydGVyL3VuaXQtY29udmVydGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBZ0IsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7QUFFaEgsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQ3hDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQ3pCLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUN2RCxDQUFDO0FBRUosTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFZeEYsTUFBTSxPQUFPLHNCQUFzQjtJQUxuQztRQVVTLFVBQUssR0FBRyxDQUFDLENBQUM7UUFNVixpQkFBWSxHQUFHLFlBQVksQ0FBQztRQUM1QixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osY0FBUyxHQUFXLEVBQUUsQ0FBQztLQStDL0I7SUE3Q0MsUUFBUTtRQUNOLE9B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ICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRlcm0gfSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBJQ29udmVydEFyZ3MsIENvbnZlcnRVbml0cywgY29udmVydGVycywgY29udmVydFZhbHVlLCBpc051bWJlciwgaXNCb29sZWFuIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5cbmNvbnN0IHBhcnNlUHJvcGVydHlWYWx1ZSA9ICh2YWx1ZTogYW55KSA9PlxuICBpc051bWJlcih2YWx1ZSkgPyArdmFsdWUgOiAoXG4gICAgaXNCb29sZWFuKHZhbHVlKSA/IHZhbHVlLnRvU3RyaW5nKCkgPT09ICd0cnVlJyA6IHZhbHVlXG4gICk7XG5cbmNvbnN0IHBhcnNlUmVzdWx0ID0gKHZhbHVlOiBudW1iZXIpID0+IGlzTmFOKHZhbHVlKSA/ICcnIDogYCR7dmFsdWV9YC5yZXBsYWNlKCcsJywgJy4nKTtcblxuaW50ZXJmYWNlIElBcmcge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaGUtdW5pdC1jb252ZXJ0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdW5pdC1jb252ZXJ0ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91bml0LWNvbnZlcnRlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVuaXRDb252ZXJ0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKVxuICBwcml2YXRlIHRlcm0/OiBUZXJtO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB2YWx1ZSA9IDE7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmcm9tVW5pdHM/OiBDb252ZXJ0VW5pdHM7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB0b1VuaXRzPzogQ29udmVydFVuaXRzO1xuXG4gIHB1YmxpYyBDb252ZXJ0VW5pdHMgPSBDb252ZXJ0VW5pdHM7XG4gIHB1YmxpYyByZXN1bHQgPSAnJztcbiAgcHVibGljIGFyZ3VtZW50czogSUFyZ1tdID0gW107XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlVmFsdWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGFyZ3MoKSB7XG4gICAgcmV0dXJuICh0aGlzLnRlcm0/LmRlZmF1bHRQcm9wZXJ0aWVzIHx8IFtdKS5yZWR1Y2UoKHByZXYsIHByb3ApID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgW3Byb3AudGVybT8ubmFtZT8udG9Mb3dlckNhc2UoKSFdOiBwYXJzZVByb3BlcnR5VmFsdWUocHJvcC52YWx1ZSlcbiAgICB9KSwge30gYXMgSUNvbnZlcnRBcmdzKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5pdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJvbVVuaXRzID9cbiAgICAgIE9iamVjdC52YWx1ZXMoQ29udmVydFVuaXRzKS5maWx0ZXIodiA9PiB2IGluIGNvbnZlcnRlcnNbdGhpcy5mcm9tVW5pdHMhXSkgOlxuICAgICAgW107XG4gIH1cblxuICBwcml2YXRlIHJlcXVpcmVBcmdzKGtleXM6IChrZXlvZiBJQ29udmVydEFyZ3MpW10pIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5hcmdzO1xuICAgIHRoaXMuYXJndW1lbnRzID0ga2V5cy5tYXAoa2V5ID0+ICh7IGtleSwgdmFsdWU6IGFyZ3Nba2V5XSB8fCAnJyB9KSk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlVW5pdHMoKSB7XG4gICAgbGV0IHJlcXVpcmVkS2V5czogKGtleW9mIElDb252ZXJ0QXJncylbXSA9IFtdO1xuICAgIGlmICh0aGlzLmZyb21Vbml0cyA9PT0gQ29udmVydFVuaXRzLmtnIHx8IHRoaXMudG9Vbml0cyA9PT0gQ29udmVydFVuaXRzLmtnKSB7XG4gICAgICByZXF1aXJlZEtleXMgPSBbJ2RlbnNpdHknXTtcbiAgICB9XG4gICAgdGhpcy5yZXF1aXJlQXJncyhyZXF1aXJlZEtleXMpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZVZhbHVlKCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlVmFsdWUoKSB7XG4gICAgaWYgKCF0aGlzLmZyb21Vbml0cyB8fCAhdGhpcy50b1VuaXRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXJncyA9IHtcbiAgICAgIC4uLnRoaXMuYXJncyxcbiAgICAgIC4uLnRoaXMuYXJndW1lbnRzLnJlZHVjZSgocHJldiwgeyBrZXksIHZhbHVlIH0pID0+ICh7IC4uLnByZXYsIFtrZXldOiB2YWx1ZSB9KSwge30pXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZXN1bHQgPSBwYXJzZVJlc3VsdChjb252ZXJ0VmFsdWUodGhpcy52YWx1ZSwgdGhpcy5mcm9tVW5pdHMsIHRoaXMudG9Vbml0cywgYXJncykpO1xuICAgIH1cbiAgICBjYXRjaCAoXykge31cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbHVtbnMgbWItMFwiPlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uXCI+XG4gICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgaGFzLXRleHQtd2hpdGVcIiBmb3I9XCJ2YWx1ZVwiPlZhbHVlPC9sYWJlbD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW5cIj5cbiAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBoYXMtdGV4dC13aGl0ZVwiIGZvcj1cInJlc3VsdFwiPkNvbnZlcnQgVG88L2xhYmVsPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiY29sdW1uc1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uXCI+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJpbnB1dFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiBuYW1lPVwidmFsdWVcIiBpZD1cInZhbHVlXCJcbiAgICAgICAgICAoaW5wdXQpPVwidXBkYXRlVmFsdWUoKVwiXG4gICAgICAgID5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2wgaXMtZXhwYW5kZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1mdWxsd2lkdGhcIj5cbiAgICAgICAgICA8c2VsZWN0IFsobmdNb2RlbCldPVwiZnJvbVVuaXRzXCIgbmFtZT1cImZyb21Vbml0c1wiIGlkPVwiZnJvbVVuaXRzXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwidXBkYXRlVW5pdHMoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwidW5kZWZpbmVkXCI+VW5pdDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdW5pdCBvZiBDb252ZXJ0VW5pdHMgfCBrZXlzXCIgW3ZhbHVlXT1cInVuaXQudmFsdWVcIj57e3VuaXQua2V5fX08L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8aW5wdXQgdHlwZT1cInN0cmluZ1wiIGNsYXNzPVwiaW5wdXRcIiBbdmFsdWVdPVwicmVzdWx0XCIgbmFtZT1cInJlc3VsdFwiIGlkPVwicmVzdWx0XCIgcmVhZG9ubHk+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3QgaXMtZnVsbHdpZHRoXCI+XG4gICAgICAgICAgPHNlbGVjdCBbKG5nTW9kZWwpXT1cInRvVW5pdHNcIiBuYW1lPVwidG9Vbml0c1wiIGlkPVwidG9Vbml0c1wiXG4gICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVVuaXRzKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cInVuZGVmaW5lZFwiPlVuaXQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHVuaXQgb2YgdW5pdHNcIiBbdmFsdWVdPVwidW5pdFwiPnt7dW5pdH19PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8aGUtY2xpcGJvYXJkIGNsaXBib2FyZENsYXNzPVwiYnV0dG9uIGlzLXdoaXRlIHB4LTJcIlxuICAgICAgICAgIFt2YWx1ZV09XCJyZXN1bHRcIiBbZGlzYWJsZWRdPVwiIXJlc3VsdFwiIFtoaWRlVGV4dF09XCJ0cnVlXCJcbiAgICAgICAgPjwvaGUtY2xpcGJvYXJkPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJmaWVsZCBpcy1ob3Jpem9udGFsXCIgKm5nRm9yPVwibGV0IGFyZyBvZiBhcmd1bWVudHNcIj5cbiAgPGRpdiBjbGFzcz1cImZpZWxkLWxhYmVsIGlzLW5vcm1hbFwiPlxuICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGhhcy10ZXh0LXdoaXRlXCIgW2Zvcl09XCJhcmcua2V5XCI+XG4gICAgICA8c3BhbiBjbGFzcz1cImlzLWNhcGl0YWxpemVkXCI+e3thcmcua2V5fX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImhhcy10ZXh0LWRhbmdlciBwbC0xXCI+Kjwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImZpZWxkLWJvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwic3RyaW5nXCIgY2xhc3M9XCJpbnB1dCBpcy1zbWFsbFwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJhcmcudmFsdWVcIiBbaWRdPVwiYXJnLmtleVwiXG4gICAgICAgICAgKGlucHV0KT1cInVwZGF0ZVZhbHVlKClcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiUmVxdWlyZWQgZm9yIGNvbnZlcnNpb25cIlxuICAgICAgICA+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
const get = require('lodash.get');
|
|
2
|
+
import { getColor } from 'random-material-color';
|
|
3
|
+
import { NodeType, EmissionMethodTier } from '@hestia-earth/schema';
|
|
4
|
+
import { fileToExt } from '@hestia-earth/api';
|
|
5
|
+
export const gitHome = 'https://gitlab.com/hestia-earth';
|
|
6
|
+
export const gitRawBaseUrl = 'https://glcdn.githack.com/hestia-earth';
|
|
7
|
+
export const isChrome = () => window.navigator.userAgent.includes('Chrome');
|
|
8
|
+
export const baseUrl = () => window.location.origin.includes('localhost') ?
|
|
9
|
+
'https://www-dev.hestia.earth' :
|
|
10
|
+
window.location.origin.includes('hestia.earth') ?
|
|
11
|
+
window.location.origin :
|
|
12
|
+
'https://www.hestia.earth';
|
|
13
|
+
export const isExternal = () => baseUrl() !== window.location.origin;
|
|
14
|
+
;
|
|
15
|
+
export const loadScript = (src) => new Promise((resolve, reject) => {
|
|
16
|
+
if (!src || document.body.querySelectorAll('script[src="' + src + '"]').length > 0) {
|
|
17
|
+
return resolve({});
|
|
18
|
+
}
|
|
19
|
+
const script = document.createElement('script');
|
|
20
|
+
script.onload = resolve;
|
|
21
|
+
script.onerror = reject;
|
|
22
|
+
script.src = src;
|
|
23
|
+
document.body.appendChild(script);
|
|
24
|
+
});
|
|
25
|
+
const parseErrorStatus = (error) => ((error === null || error === void 0 ? void 0 : error.statusText) || '').toLowerCase().replace(/\s/g, '-');
|
|
26
|
+
const parseErrorMessage = (error) => get(error, 'error.error', get(error, 'error.message', get(error, 'error', get(error, 'message', error))));
|
|
27
|
+
export const handleAPIError = (error) => {
|
|
28
|
+
try {
|
|
29
|
+
error = parseErrorMessage(error);
|
|
30
|
+
}
|
|
31
|
+
catch (_) { }
|
|
32
|
+
throw error;
|
|
33
|
+
};
|
|
34
|
+
export const errorText = (error) => {
|
|
35
|
+
if (typeof error === 'string') {
|
|
36
|
+
return error;
|
|
37
|
+
}
|
|
38
|
+
const err = parseErrorMessage(error);
|
|
39
|
+
return parseErrorStatus(err) || err;
|
|
40
|
+
};
|
|
41
|
+
export const toFormData = (data, formData = new FormData()) => {
|
|
42
|
+
for (const key in data) {
|
|
43
|
+
if (data.hasOwnProperty(key)) {
|
|
44
|
+
const value = data[key];
|
|
45
|
+
if (typeof value === 'object') {
|
|
46
|
+
formData.append(key, JSON.stringify(value));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
formData.append(key, value);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return formData;
|
|
54
|
+
};
|
|
55
|
+
export const filterParams = (obj) => {
|
|
56
|
+
const res = {};
|
|
57
|
+
Object.keys(obj).sort().forEach(key => {
|
|
58
|
+
const value = obj[key];
|
|
59
|
+
if (value && value !== 'undefined') {
|
|
60
|
+
res[key] = `${value}`;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return res;
|
|
64
|
+
};
|
|
65
|
+
export const toSearchParams = (params = {}) => {
|
|
66
|
+
const searchParams = new URLSearchParams();
|
|
67
|
+
Object.keys(params)
|
|
68
|
+
.filter(key => typeof params[key] !== 'undefined')
|
|
69
|
+
.forEach(key => searchParams.append(key, `${params[key]}`));
|
|
70
|
+
return searchParams;
|
|
71
|
+
};
|
|
72
|
+
export const waitFor = (variable, callback) => {
|
|
73
|
+
if (variable in window) {
|
|
74
|
+
return callback();
|
|
75
|
+
}
|
|
76
|
+
setTimeout(() => waitFor(variable, callback), 100);
|
|
77
|
+
};
|
|
78
|
+
export const bottom = (element) => element.offsetTop + element.getBoundingClientRect().height;
|
|
79
|
+
export const isScrolledBelow = (element) => element ? window.scrollY > bottom(element) : false;
|
|
80
|
+
export const scrollToEl = (id, retries = 0) => {
|
|
81
|
+
const el = document.getElementById(id);
|
|
82
|
+
setTimeout(() => el ? el.scrollIntoView() : (retries < 10 ? scrollToEl(id, retries + 1) : null), 100);
|
|
83
|
+
};
|
|
84
|
+
export const scrollTop = () => window.scrollTo(0, 0);
|
|
85
|
+
export const animateCounter = (total, callback) => {
|
|
86
|
+
let animationDuration = 10;
|
|
87
|
+
const step = Math.pow(10, `${total}`.length - 1);
|
|
88
|
+
const maxSteps = parseInt(`${total / step}`, 10);
|
|
89
|
+
let current = 0;
|
|
90
|
+
const interval = setInterval(() => {
|
|
91
|
+
callback(current);
|
|
92
|
+
current += (step / animationDuration);
|
|
93
|
+
if (current > maxSteps * step) {
|
|
94
|
+
animationDuration = 100;
|
|
95
|
+
}
|
|
96
|
+
if (current > total) {
|
|
97
|
+
callback(total);
|
|
98
|
+
clearInterval(interval);
|
|
99
|
+
}
|
|
100
|
+
}, animationDuration);
|
|
101
|
+
};
|
|
102
|
+
export const safeJSONParse = (value, defaultValue) => {
|
|
103
|
+
try {
|
|
104
|
+
return typeof value === 'string' ? JSON.parse(value) : value;
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
return defaultValue;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
export const safeJSONStringify = (value) => typeof value === 'string' ? value : JSON.stringify(value);
|
|
111
|
+
export const arrayValue = (values, isAverage) => (values || []).reduce((prev, curr) => prev + parseFloat(`${curr}`), 0) / (isAverage ? values.length : 1);
|
|
112
|
+
export const propertyValue = (value, isAverage = false) => typeof value === 'undefined' || value === null ?
|
|
113
|
+
null :
|
|
114
|
+
(Array.isArray(value) ? arrayValue(value, isAverage) : parseFloat(`${value}`));
|
|
115
|
+
export const dataValue = (data, index, property) => {
|
|
116
|
+
try {
|
|
117
|
+
return propertyValue(data[property][index].value);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
;
|
|
124
|
+
;
|
|
125
|
+
export const grouppedKeys = (value) => Object.keys(value).map(key => ({ key, value: value[key] }));
|
|
126
|
+
const concatBlankNodeValue = (value, newValue) => {
|
|
127
|
+
const valueArray = Array.isArray(value) ? value : [value];
|
|
128
|
+
const newValueArray = Array.isArray(newValue) ? newValue : [newValue];
|
|
129
|
+
return [...valueArray, ...newValueArray];
|
|
130
|
+
};
|
|
131
|
+
const methodTierOrder = (methodTier) => [
|
|
132
|
+
EmissionMethodTier.measured,
|
|
133
|
+
EmissionMethodTier['tier 3'],
|
|
134
|
+
EmissionMethodTier['tier 2'],
|
|
135
|
+
EmissionMethodTier['tier 1'],
|
|
136
|
+
EmissionMethodTier.background
|
|
137
|
+
].indexOf(methodTier);
|
|
138
|
+
const isMethodModelAllowed = (node, filterMethod) => !filterMethod || !node['methodModel'] || node['methodModel']['@id'] === filterMethod['@id'];
|
|
139
|
+
export const grouppedValueKeys = [
|
|
140
|
+
'dates', 'sd', 'min', 'max', 'inputs', 'depthUpper', 'depthLower', 'startDate', 'endDate',
|
|
141
|
+
'methodTier', 'methodModel'
|
|
142
|
+
];
|
|
143
|
+
export const groupNodesByTerm = (nodes = [], key, originalValues = [], filterMethod) => {
|
|
144
|
+
const groups = nodes.reduce((prev, node, index) => (node[key] || []).reduce((group, blankNode) => {
|
|
145
|
+
if (!isMethodModelAllowed(blankNode, filterMethod)) {
|
|
146
|
+
return group;
|
|
147
|
+
}
|
|
148
|
+
const nodeId = node['@id'];
|
|
149
|
+
const termId = blankNode.term['@id'];
|
|
150
|
+
group[termId] = group[termId] || {
|
|
151
|
+
term: blankNode.term,
|
|
152
|
+
methodTierOrder: methodTierOrder(blankNode.methodTier),
|
|
153
|
+
values: {},
|
|
154
|
+
originalValues: {}
|
|
155
|
+
};
|
|
156
|
+
group[termId].values[nodeId] = group[termId].values[nodeId] || { index, nodes: [], value: [] };
|
|
157
|
+
group[termId].values[nodeId].nodes.push(blankNode);
|
|
158
|
+
group[termId].values[nodeId].value = concatBlankNodeValue(group[termId].values[nodeId].value, blankNode.value);
|
|
159
|
+
grouppedValueKeys.forEach(arrayKey => {
|
|
160
|
+
const newValue = get(blankNode, arrayKey, []);
|
|
161
|
+
group[termId].values[nodeId][arrayKey] = [
|
|
162
|
+
...(group[termId].values[nodeId][arrayKey] || []),
|
|
163
|
+
...(Array.isArray(newValue) ? newValue : [newValue])
|
|
164
|
+
];
|
|
165
|
+
});
|
|
166
|
+
return group;
|
|
167
|
+
}, prev), {});
|
|
168
|
+
// compile original values
|
|
169
|
+
Object.values(groups).map(group => {
|
|
170
|
+
Object.keys(group.values).map(nodeId => {
|
|
171
|
+
const { index } = group.values[nodeId];
|
|
172
|
+
const termId = group.term['@id'];
|
|
173
|
+
const originalValue = get(originalValues, `[${index}].${key}`, []).filter((val) => val.term['@id'] === termId);
|
|
174
|
+
if (originalValue.length > 0) {
|
|
175
|
+
const value = originalValue.reduce((array, curr) => concatBlankNodeValue(array, curr.value), []);
|
|
176
|
+
group.originalValues[nodeId] = { value: propertyValue(value) };
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
return groups;
|
|
181
|
+
};
|
|
182
|
+
export const sortByFn = (key, asc) => (a, b) => asc ? get(a, key, '').localeCompare(get(b, key, '')) : get(b, key, '').localeCompare(get(a, key, ''));
|
|
183
|
+
export const ellipsis = (text = '', maxlength = 20) => text.length > maxlength ? `${text.substring(0, maxlength)}...` : text;
|
|
184
|
+
const mapsQuery = 'https://www.google.com/maps/search/?api=1&query=';
|
|
185
|
+
export const mapsUrl = (location) => location ? (location.lat && location.lng ?
|
|
186
|
+
`${mapsQuery}${location.lat},${location.lng}` :
|
|
187
|
+
(location.name ? `${mapsQuery}${encodeURI(location.name)}` : undefined)) : undefined;
|
|
188
|
+
export const keyToLabel = (key) => `${key[0].toUpperCase()}${key.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
189
|
+
.replace(/([_])([a-zA-Z])/g, g => ` ${g[1].toUpperCase()}`)
|
|
190
|
+
.substring(1)}`;
|
|
191
|
+
export const toDashCase = (value) => value ?
|
|
192
|
+
value
|
|
193
|
+
// handle dates followed by capital letter
|
|
194
|
+
.replace(/([\d]{4})([A-Z]{1})/g, g => `${g.substring(0, 4)}-${g[4].toLowerCase()}`)
|
|
195
|
+
// handle molecules
|
|
196
|
+
.replace(/([\d]{1}[A-Z]{1})/g, g => g.toLowerCase())
|
|
197
|
+
// handle all capital letters
|
|
198
|
+
.replace(/([A-Z])/g, g => `-${g[0].toLowerCase()}`)
|
|
199
|
+
// handle years
|
|
200
|
+
.replace(/([0-9]{4})/g, g => `-${g}`) :
|
|
201
|
+
null;
|
|
202
|
+
export const nodeTypeToString = (type) => `${type.charAt(0).toLowerCase()}${type.substring(1)}`;
|
|
203
|
+
export const parseNodeType = (type) => Object.values(NodeType).find(v => v.toString().toLowerCase() === (type || '').toLowerCase());
|
|
204
|
+
const nodeDefaultLabel = {
|
|
205
|
+
[NodeType.ImpactAssessment]: ({ name, country, endDate, product }) => name ? name.replace(`${product === null || product === void 0 ? void 0 : product.name}, `, '') : [
|
|
206
|
+
product === null || product === void 0 ? void 0 : product.name,
|
|
207
|
+
country === null || country === void 0 ? void 0 : country.name,
|
|
208
|
+
endDate
|
|
209
|
+
].filter(Boolean).join(', '),
|
|
210
|
+
[NodeType.Site]: ({ name, description }) => name || description
|
|
211
|
+
};
|
|
212
|
+
export const defaultLabel = (node) => node ? (node['@type'] in nodeDefaultLabel ? nodeDefaultLabel[node['@type']](node) : node.name) || node['@id'] || node.id : '';
|
|
213
|
+
export const itemColor = (index) => getColor({ text: `${index}` });
|
|
214
|
+
export const listColor = (_v, index) => itemColor(index);
|
|
215
|
+
export const minutesBefore = (date, minutes = 1) => {
|
|
216
|
+
date.setMinutes(date.getMinutes() - minutes);
|
|
217
|
+
return date;
|
|
218
|
+
};
|
|
219
|
+
export const hoursBefore = (date, hours = 1) => {
|
|
220
|
+
date.setHours(date.getHours() - hours);
|
|
221
|
+
return date;
|
|
222
|
+
};
|
|
223
|
+
export const repeat = (times = 0) => (Array.from(Array(times), Math.random));
|
|
224
|
+
export var DeltaDisplayType;
|
|
225
|
+
(function (DeltaDisplayType) {
|
|
226
|
+
DeltaDisplayType["absolute"] = "absolute";
|
|
227
|
+
DeltaDisplayType["percent"] = "percent";
|
|
228
|
+
})(DeltaDisplayType || (DeltaDisplayType = {}));
|
|
229
|
+
const deltaPerType = {
|
|
230
|
+
[DeltaDisplayType.absolute]: (value, original) => value - original,
|
|
231
|
+
[DeltaDisplayType.percent]: (value, original) => ((value - original) / original) * 100
|
|
232
|
+
};
|
|
233
|
+
const roundValue = (value) => +(`${value}`.substring(0, 10));
|
|
234
|
+
export const delta = (value, originalValue, displayType = DeltaDisplayType.percent) => {
|
|
235
|
+
const vvalue = roundValue(propertyValue(value));
|
|
236
|
+
const voriginalValue = roundValue(propertyValue(originalValue));
|
|
237
|
+
const diff = vvalue === voriginalValue ? 0 : deltaPerType[displayType](vvalue, voriginalValue);
|
|
238
|
+
return Number.isFinite(diff) ? (diff === -0 ? 0 : diff) : 0;
|
|
239
|
+
};
|
|
240
|
+
export const filenameWithoutExt = (filename = '') => {
|
|
241
|
+
const file = fileToExt(filename, '');
|
|
242
|
+
// remove last .
|
|
243
|
+
return file.endsWith('.') ? file.substring(0, file.length - 1) : file;
|
|
244
|
+
};
|
|
245
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUNMLFFBQVEsRUFBb0Usa0JBQWtCLEVBQy9GLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxpQ0FBaUMsQ0FBQztBQUN6RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsd0NBQXdDLENBQUM7QUFFdEUsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUU1RSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzVDLDhCQUE4QixDQUFDLENBQUM7SUFDaEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QiwwQkFBMEIsQ0FBQztBQUVqQyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFBQSxDQUFDO0FBRXRFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFLENBQUMs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QUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEVBQUU7SUFDOUYsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNoRSxNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDL0YsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsUUFBUSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQ2xELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckMsZ0JBQWdCO0lBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3hFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGdldCA9IHJlcXVpcmUoJ2xvZGFzaC5nZXQnKTtcbmltcG9ydCB7IGdldENvbG9yIH0gZnJvbSAncmFuZG9tLW1hdGVyaWFsLWNvbG9yJztcbmltcG9ydCB7XG4gIE5vZGVUeXBlLCBUZXJtLCBKU09OTEQsIElDeWNsZUpTT05MRCwgSVNpdGVKU09OTEQsIElJbXBhY3RBc3Nlc3NtZW50SlNPTkxELCBFbWlzc2lvbk1ldGhvZFRpZXJcbn0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9zY2hlbWEnO1xuaW1wb3J0IHsgZmlsZVRvRXh0IH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9hcGknO1xuXG5leHBvcnQgY29uc3QgZ2l0SG9tZSA9ICdodHRwczovL2dpdGxhYi5jb20vaGVzdGlhLWVhcnRoJztcbmV4cG9ydCBjb25zdCBnaXRSYXdCYXNlVXJsID0gJ2h0dHBzOi8vZ2xjZG4uZ2l0aGFjay5jb20vaGVzdGlhLWVhcnRoJztcblxuZXhwb3J0IGNvbnN0IGlzQ2hyb21lID0gKCkgPT4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoJ0Nocm9tZScpO1xuXG5leHBvcnQgY29uc3QgYmFzZVVybCA9ICgpID0+XG4gIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4uaW5jbHVkZXMoJ2xvY2FsaG9zdCcpID9cbiAgICAnaHR0cHM6Ly93d3ctZGV2Lmhlc3RpYS5lYXJ0aCcgOlxuICAgIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4uaW5jbHVkZXMoJ2hlc3RpYS5lYXJ0aCcpID9cbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gOlxuICAgICAgJ2h0dHBzOi8vd3d3Lmhlc3RpYS5lYXJ0aCc7XG5cbmV4cG9ydCBjb25zdCBpc0V4dGVybmFsID0gKCkgPT4gYmFzZVVybCgpICE9PSB3aW5kb3cubG9jYXRpb24ub3JpZ2luOztcblxuZXhwb3J0IGNvbnN0IGxvYWRTY3JpcHQgPSAoc3JjPzogc3RyaW5nKSA9PiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgaWYgKCFzcmMgfHwgZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHRbc3JjPVwiJyArIHNyYyArICdcIl0nKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHJlc29sdmUoe30pO1xuICB9XG5cbiAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gIHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlO1xuICBzY3JpcHQub25lcnJvciA9IHJlamVjdDtcbiAgc2NyaXB0LnNyYyA9IHNyYztcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xufSk7XG5cbmNvbnN0IHBhcnNlRXJyb3JTdGF0dXMgPSAoZXJyb3I6IGFueSkgPT4gKGVycm9yPy5zdGF0dXNUZXh0IHx8ICcnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCAnLScpO1xuXG5jb25zdCBwYXJzZUVycm9yTWVzc2FnZSA9IChlcnJvcjogYW55KSA9PlxuICBnZXQoZXJyb3IsICdlcnJvci5lcnJvcicsIGdldChlcnJvciwgJ2Vycm9yLm1lc3NhZ2UnLCBnZXQoZXJyb3IsICdlcnJvcicsIGdldChlcnJvciwgJ21lc3NhZ2UnLCBlcnJvcikpKSk7XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVBUElFcnJvciA9IChlcnJvcjogYW55KSA9PiB7XG4gIHRyeSB7XG4gICAgZXJyb3IgPSBwYXJzZUVycm9yTWVzc2FnZShlcnJvcik7XG4gIH1cbiAgY2F0Y2ggKF8pIHsgfVxuICB0aHJvdyBlcnJvcjtcbn07XG5cbmV4cG9ydCBjb25zdCBlcnJvclRleHQgPSAoZXJyb3I6IGFueSk6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG4gIGNvbnN0IGVyciA9IHBhcnNlRXJyb3JNZXNzYWdlKGVycm9yKTtcbiAgcmV0dXJuIHBhcnNlRXJyb3JTdGF0dXMoZXJyKSB8fCBlcnI7XG59O1xuXG5leHBvcnQgY29uc3QgdG9Gb3JtRGF0YSA9IChkYXRhOiBhbnksIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCkpID0+IHtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGF0YVtrZXldO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmb3JtRGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJQYXJhbXMgPSAob2JqOiBhbnkpID0+IHtcbiAgY29uc3QgcmVzOiB7XG4gICAgW3g6IHN0cmluZ106IHN0cmluZztcbiAgfSA9IHt9O1xuICBPYmplY3Qua2V5cyhvYmopLnNvcnQoKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICBpZiAodmFsdWUgJiYgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXNba2V5XSA9IGAke3ZhbHVlfWA7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlcztcbn07XG5cbmV4cG9ydCBjb25zdCB0b1NlYXJjaFBhcmFtcyA9IChwYXJhbXM6IGFueSA9IHt9KSA9PiB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgT2JqZWN0LmtleXMocGFyYW1zKVxuICAgIC5maWx0ZXIoa2V5ID0+IHR5cGVvZiBwYXJhbXNba2V5XSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgLmZvckVhY2goa2V5ID0+IHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBgJHtwYXJhbXNba2V5XX1gKSk7XG4gIHJldHVybiBzZWFyY2hQYXJhbXM7XG59O1xuXG5leHBvcnQgY29uc3Qgd2FpdEZvciA9ICh2YXJpYWJsZTogc3RyaW5nLCBjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4ge1xuICBpZiAodmFyaWFibGUgaW4gd2luZG93KSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cbiAgc2V0VGltZW91dCgoKSA9PiB3YWl0Rm9yKHZhcmlhYmxlLCBjYWxsYmFjayksIDEwMCk7XG59O1xuXG5leHBvcnQgY29uc3QgYm90dG9tID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBlbGVtZW50Lm9mZnNldFRvcCArIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG5leHBvcnQgY29uc3QgaXNTY3JvbGxlZEJlbG93ID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiBlbGVtZW50ID8gd2luZG93LnNjcm9sbFkgPiBib3R0b20oZWxlbWVudCkgOiBmYWxzZTtcblxuZXhwb3J0IGNvbnN0IHNjcm9sbFRvRWwgPSAoaWQ6IHN0cmluZywgcmV0cmllcyA9IDApID0+IHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIHNldFRpbWVvdXQoKCkgPT4gZWwgPyBlbC5zY3JvbGxJbnRvVmlldygpIDogKHJldHJpZXMgPCAxMCA/IHNjcm9sbFRvRWwoaWQsIHJldHJpZXMgKyAxKSA6IG51bGwpLCAxMDApO1xufTtcblxuZXhwb3J0IGNvbnN0IHNjcm9sbFRvcCA9ICgpID0+IHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcblxuZXhwb3J0IGNvbnN0IGFuaW1hdGVDb3VudGVyID0gKHRvdGFsOiBudW1iZXIsIGNhbGxiYWNrOiAoY291bnQ6IG51bWJlcikgPT4gdm9pZCkgPT4ge1xuICBsZXQgYW5pbWF0aW9uRHVyYXRpb24gPSAxMDtcbiAgY29uc3Qgc3RlcCA9IE1hdGgucG93KDEwLCBgJHt0b3RhbH1gLmxlbmd0aCAtIDEpO1xuICBjb25zdCBtYXhTdGVwcyA9IHBhcnNlSW50KGAke3RvdGFsIC8gc3RlcH1gLCAxMCk7XG4gIGxldCBjdXJyZW50ID0gMDtcbiAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgY2FsbGJhY2soY3VycmVudCk7XG4gICAgY3VycmVudCArPSAoc3RlcCAvIGFuaW1hdGlvbkR1cmF0aW9uKTtcbiAgICBpZiAoY3VycmVudCA+IG1heFN0ZXBzICogc3RlcCkge1xuICAgICAgYW5pbWF0aW9uRHVyYXRpb24gPSAxMDA7XG4gICAgfVxuICAgIGlmIChjdXJyZW50ID4gdG90YWwpIHtcbiAgICAgIGNhbGxiYWNrKHRvdGFsKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgIH1cbiAgfSwgYW5pbWF0aW9uRHVyYXRpb24pO1xufTtcblxuZXhwb3J0IGNvbnN0IHNhZmVKU09OUGFyc2UgPSA8VD4odmFsdWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHZhbHVlKSBhcyBUIDogdmFsdWU7XG4gIH1cbiAgY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzYWZlSlNPTlN0cmluZ2lmeSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cbmV4cG9ydCBjb25zdCBhcnJheVZhbHVlID0gKHZhbHVlczogYW55W10sIGlzQXZlcmFnZTogYm9vbGVhbikgPT5cbiAgKHZhbHVlcyB8fCBbXSkucmVkdWNlKChwcmV2OiBudW1iZXIsIGN1cnIpID0+IHByZXYgKyBwYXJzZUZsb2F0KGAke2N1cnJ9YCksIDApIC8gKGlzQXZlcmFnZSA/IHZhbHVlcy5sZW5ndGggOiAxKTtcblxuZXhwb3J0IGNvbnN0IHByb3BlcnR5VmFsdWUgPSAodmFsdWU6IHN0cmluZyB8IG51bWJlciB8ICgoc3RyaW5nIHwgbnVtYmVyKVtdKSwgaXNBdmVyYWdlID0gZmFsc2UpOiBudW1iZXIgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gbnVsbCA/XG4gICAgbnVsbCBhcyBhbnkgOlxuICAgIChcbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpID8gYXJyYXlWYWx1ZSh2YWx1ZSwgaXNBdmVyYWdlKSA6IHBhcnNlRmxvYXQoYCR7dmFsdWV9YClcbiAgICApO1xuXG5leHBvcnQgY29uc3QgZGF0YVZhbHVlID0gKGRhdGE6IGFueSwgaW5kZXg6IG51bWJlciwgcHJvcGVydHk6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBwcm9wZXJ0eVZhbHVlKGRhdGFbcHJvcGVydHldW2luZGV4XS52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElHcm91cGVkTm9kZTxUPiB7XG4gIG5vZGVzOiBUW107XG4gIGluZGV4OiBudW1iZXI7XG4gIHZhbHVlOiBudW1iZXJbXTtcbiAgZGF0ZXM/OiBhbnlbXTtcbiAgc2Q/OiBudW1iZXJbXTtcbiAgbWluPzogbnVtYmVyW107XG4gIG1heD86IG51bWJlcltdO1xuICBpbnB1dHM/OiBhbnlbXTtcbiAgZGVwdGhVcHBlcj86IG51bWJlcltdO1xuICBkZXB0aExvd2VyPzogbnVtYmVyW107XG4gIHN0YXJ0RGF0ZT86IHN0cmluZ1tdO1xuICBlbmREYXRlPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElHcm91cGVkTm9kZXNWYWx1ZXM8VD4ge1xuICBbbm9kZUlkOiBzdHJpbmddOiBJR3JvdXBlZE5vZGU8VD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyb3VwZWROb2Rlc1ZhbHVlPFQ+IHtcbiAgdGVybTogVGVybTtcbiAgLyoqXG4gICAqIEVuYWJsZSBvcmRlcmluZyBueSBtZXRob2RUaWVyXG4gICAqL1xuICBtZXRob2RUaWVyT3JkZXI6IG51bWJlcjtcbiAgdmFsdWVzOiBJR3JvdXBlZE5vZGVzVmFsdWVzPFQ+O1xuICBvcmlnaW5hbFZhbHVlczoge1xuICAgIFtub2RlSWQ6IHN0cmluZ106IHtcbiAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUdyb3VwZWROb2RlczxUPiB7XG4gIFt0ZXJtSWQ6IHN0cmluZ106IElHcm91cGVkTm9kZXNWYWx1ZTxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJR3JvdXBlZEtleXM8VD4ge1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IElHcm91cGVkTm9kZXNWYWx1ZTxUPjtcbn1cblxuZXhwb3J0IGNvbnN0IGdyb3VwcGVkS2V5cyA9IDxUPih2YWx1ZTogSUdyb3VwZWROb2RlczxUPik6IElHcm91cGVkS2V5czxUPltdID0+XG4gIE9iamVjdC5rZXlzKHZhbHVlKS5tYXAoa2V5ID0+ICh7IGtleSwgdmFsdWU6IHZhbHVlW2tleV0gfSkpO1xuXG5jb25zdCBjb25jYXRCbGFua05vZGVWYWx1ZSA9ICh2YWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSA9PiB7XG4gIGNvbnN0IHZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgY29uc3QgbmV3VmFsdWVBcnJheSA9IEFycmF5LmlzQXJyYXkobmV3VmFsdWUpID8gbmV3VmFsdWUgOiBbbmV3VmFsdWVdO1xuICByZXR1cm4gWy4uLnZhbHVlQXJyYXksIC4uLm5ld1ZhbHVlQXJyYXldO1xufTtcblxuY29uc3QgbWV0aG9kVGllck9yZGVyID0gKG1ldGhvZFRpZXI6IEVtaXNzaW9uTWV0aG9kVGllcikgPT4gW1xuICBFbWlzc2lvbk1ldGhvZFRpZXIubWVhc3VyZWQsXG4gIEVtaXNzaW9uTWV0aG9kVGllclsndGllciAzJ10sXG4gIEVtaXNzaW9uTWV0aG9kVGllclsndGllciAyJ10sXG4gIEVtaXNzaW9uTWV0aG9kVGllclsndGllciAxJ10sXG4gIEVtaXNzaW9uTWV0aG9kVGllci5iYWNrZ3JvdW5kXG5dLmluZGV4T2YobWV0aG9kVGllcik7XG5cbmNvbnN0IGlzTWV0aG9kTW9kZWxBbGxvd2VkID0gKG5vZGU6IGFueSwgZmlsdGVyTWV0aG9kPzogVGVybSkgPT5cbiAgIWZpbHRlck1ldGhvZCB8fCAhbm9kZVsnbWV0aG9kTW9kZWwnXSB8fCBub2RlWydtZXRob2RNb2RlbCddWydAaWQnXSA9PT0gZmlsdGVyTWV0aG9kWydAaWQnXTtcblxuZXhwb3J0IGNvbnN0IGdyb3VwcGVkVmFsdWVLZXlzID0gW1xuICAnZGF0ZXMnLCAnc2QnLCAnbWluJywgJ21heCcsICdpbnB1dHMnLCAnZGVwdGhVcHBlcicsICdkZXB0aExvd2VyJywgJ3N0YXJ0RGF0ZScsICdlbmREYXRlJyxcbiAgJ21ldGhvZFRpZXInLCAnbWV0aG9kTW9kZWwnXG5dO1xuXG5leHBvcnQgY29uc3QgZ3JvdXBOb2Rlc0J5VGVybSA9IDxUIGV4dGVuZHMgSUN5Y2xlSlNPTkxEIHwgSUltcGFjdEFzc2Vzc21lbnRKU09OTEQgfCBJU2l0ZUpTT05MRCwgUj4oXG4gIG5vZGVzOiBUW10gPSBbXSxcbiAga2V5OiAnaW1wYWN0cycgfCAnZW1pc3Npb25zUmVzb3VyY2VVc2UnIHwgJ2lucHV0cycgfCAncHJvZHVjdHMnIHwgJ2VtaXNzaW9ucycgfCAnbWVhc3VyZW1lbnRzJyxcbiAgb3JpZ2luYWxWYWx1ZXM6IFRbXSA9IFtdLFxuICBmaWx0ZXJNZXRob2Q/OiBUZXJtXG4pOiBJR3JvdXBlZE5vZGVzPFI+ID0+IHtcbiAgY29uc3QgZ3JvdXBzOiBJR3JvdXBlZE5vZGVzPFI+ID0gbm9kZXMucmVkdWNlKChwcmV2LCBub2RlLCBpbmRleCkgPT4gKG5vZGVba2V5XSB8fCBbXSkucmVkdWNlKChncm91cCwgYmxhbmtOb2RlKSA9PiB7XG4gICAgaWYgKCFpc01ldGhvZE1vZGVsQWxsb3dlZChibGFua05vZGUsIGZpbHRlck1ldGhvZCkpIHtcbiAgICAgIHJldHVybiBncm91cDtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlSWQgPSBub2RlWydAaWQnXTtcbiAgICBjb25zdCB0ZXJtSWQgPSBibGFua05vZGUudGVybVsnQGlkJ107XG4gICAgZ3JvdXBbdGVybUlkXSA9IGdyb3VwW3Rlcm1JZF0gfHwge1xuICAgICAgdGVybTogYmxhbmtOb2RlLnRlcm0sXG4gICAgICBtZXRob2RUaWVyT3JkZXI6IG1ldGhvZFRpZXJPcmRlcihibGFua05vZGUubWV0aG9kVGllciksXG4gICAgICB2YWx1ZXM6IHt9LFxuICAgICAgb3JpZ2luYWxWYWx1ZXM6IHt9XG4gICAgfTtcbiAgICBncm91cFt0ZXJtSWRdLnZhbHVlc1tub2RlSWRdID0gZ3JvdXBbdGVybUlkXS52YWx1ZXNbbm9kZUlkXSB8fCB7IGluZGV4LCBub2RlczogW10sIHZhbHVlOiBbXSB9O1xuICAgIGdyb3VwW3Rlcm1JZF0udmFsdWVzW25vZGVJZF0ubm9kZXMucHVzaChibGFua05vZGUpO1xuICAgIGdyb3VwW3Rlcm1JZF0udmFsdWVzW25vZGVJZF0udmFsdWUgPSBjb25jYXRCbGFua05vZGVWYWx1ZShcbiAgICAgIGdyb3VwW3Rlcm1JZF0udmFsdWVzW25vZGVJZF0udmFsdWUsXG4gICAgICBibGFua05vZGUudmFsdWVcbiAgICApO1xuICAgIGdyb3VwcGVkVmFsdWVLZXlzLmZvckVhY2goYXJyYXlLZXkgPT4ge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBnZXQoYmxhbmtOb2RlLCBhcnJheUtleSwgW10pO1xuICAgICAgZ3JvdXBbdGVybUlkXS52YWx1ZXNbbm9kZUlkXVthcnJheUtleV0gPSBbXG4gICAgICAgIC4uLihncm91cFt0ZXJtSWRdLnZhbHVlc1tub2RlSWRdW2FycmF5S2V5XSB8fCBbXSksXG4gICAgICAgIC4uLihBcnJheS5pc0FycmF5KG5ld1ZhbHVlKSA/IG5ld1ZhbHVlIDogW25ld1ZhbHVlXSlcbiAgICAgIF07XG4gICAgfSk7XG4gICAgcmV0dXJuIGdyb3VwO1xuICB9LCBwcmV2KSwge30gYXMgSUdyb3VwZWROb2RlczxSPik7XG5cbiAgLy8gY29tcGlsZSBvcmlnaW5hbCB2YWx1ZXNcbiAgT2JqZWN0LnZhbHVlcyhncm91cHMpLm1hcChncm91cCA9PiB7XG4gICAgT2JqZWN0LmtleXMoZ3JvdXAudmFsdWVzKS5tYXAobm9kZUlkID0+IHtcbiAgICAgIGNvbnN0IHsgaW5kZXggfSA9IGdyb3VwLnZhbHVlc1tub2RlSWRdO1xuICAgICAgY29uc3QgdGVybUlkID0gZ3JvdXAudGVybVsnQGlkJ107XG4gICAgICBjb25zdCBvcmlnaW5hbFZhbHVlID0gZ2V0KG9yaWdpbmFsVmFsdWVzLCBgWyR7aW5kZXh9XS4ke2tleX1gLCBbXSkuZmlsdGVyKCh2YWw6IGFueSkgPT4gdmFsLnRlcm1bJ0BpZCddID09PSB0ZXJtSWQpO1xuICAgICAgaWYgKG9yaWdpbmFsVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9yaWdpbmFsVmFsdWUucmVkdWNlKChhcnJheTogYW55W10sIGN1cnI6IGFueSkgPT4gY29uY2F0QmxhbmtOb2RlVmFsdWUoXG4gICAgICAgICAgYXJyYXksXG4gICAgICAgICAgY3Vyci52YWx1ZVxuICAgICAgICApLCBbXSk7XG4gICAgICAgIGdyb3VwLm9yaWdpbmFsVmFsdWVzW25vZGVJZF0gPSB7IHZhbHVlOiBwcm9wZXJ0eVZhbHVlKHZhbHVlKSB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gZ3JvdXBzO1xufTtcblxuZXhwb3J0IGNvbnN0IHNvcnRCeUZuID0gKGtleTogc3RyaW5nLCBhc2M6IGJvb2xlYW4pID0+IDxUPihhOiBULCBiOiBUKTogbnVtYmVyID0+XG4gIGFzYyA/IGdldChhLCBrZXksICcnKS5sb2NhbGVDb21wYXJlKGdldChiLCBrZXksICcnKSkgOiBnZXQoYiwga2V5LCAnJykubG9jYWxlQ29tcGFyZShnZXQoYSwga2V5LCAnJykpO1xuXG5leHBvcnQgY29uc3QgZWxsaXBzaXMgPSAodGV4dCA9ICcnLCBtYXhsZW5ndGggPSAyMCkgPT5cbiAgdGV4dC5sZW5ndGggPiBtYXhsZW5ndGggPyBgJHt0ZXh0LnN1YnN0cmluZygwLCBtYXhsZW5ndGgpfS4uLmAgOiB0ZXh0O1xuXG5jb25zdCBtYXBzUXVlcnkgPSAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9tYXBzL3NlYXJjaC8/YXBpPTEmcXVlcnk9JztcblxuZXhwb3J0IGNvbnN0IG1hcHNVcmwgPSAobG9jYXRpb24/OiB7IGxhdD86IG51bWJlcjsgbG5nPzogbnVtYmVyOyBuYW1lPzogc3RyaW5nIH0pID0+XG4gIGxvY2F0aW9uID8gKFxuICAgIGxvY2F0aW9uLmxhdCAmJiBsb2NhdGlvbi5sbmcgP1xuICAgICAgYCR7bWFwc1F1ZXJ5fSR7bG9jYXRpb24ubGF0fSwke2xvY2F0aW9uLmxuZ31gIDpcbiAgICAgIChsb2NhdGlvbi5uYW1lID8gYCR7bWFwc1F1ZXJ5fSR7ZW5jb2RlVVJJKGxvY2F0aW9uLm5hbWUpfWAgOiB1bmRlZmluZWQpXG4gICkgOiB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCBrZXlUb0xhYmVsID0gKGtleTogc3RyaW5nKSA9PlxuICBgJHtrZXlbMF0udG9VcHBlckNhc2UoKX0ke1xuICAgIGtleS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEgJDInKVxuICAgICAgLnJlcGxhY2UoLyhbX10pKFthLXpBLVpdKS9nLCBnID0+IGAgJHtnWzFdLnRvVXBwZXJDYXNlKCl9YClcbiAgICAgIC5zdWJzdHJpbmcoMSlcbiAgfWA7XG5cbmV4cG9ydCBjb25zdCB0b0Rhc2hDYXNlID0gKHZhbHVlPzogc3RyaW5nKSA9PlxuICB2YWx1ZSA/XG4gICAgdmFsdWVcbiAgICAgIC8vIGhhbmRsZSBkYXRlcyBmb2xsb3dlZCBieSBjYXBpdGFsIGxldHRlclxuICAgICAgLnJlcGxhY2UoLyhbXFxkXXs0fSkoW0EtWl17MX0pL2csIGcgPT4gYCR7Zy5zdWJzdHJpbmcoMCwgNCl9LSR7Z1s0XS50b0xvd2VyQ2FzZSgpfWApXG4gICAgICAvLyBoYW5kbGUgbW9sZWN1bGVzXG4gICAgICAucmVwbGFjZSgvKFtcXGRdezF9W0EtWl17MX0pL2csIGcgPT4gZy50b0xvd2VyQ2FzZSgpKVxuICAgICAgLy8gaGFuZGxlIGFsbCBjYXBpdGFsIGxldHRlcnNcbiAgICAgIC5yZXBsYWNlKC8oW0EtWl0pL2csIGcgPT4gYC0ke2dbMF0udG9Mb3dlckNhc2UoKX1gKVxuICAgICAgLy8gaGFuZGxlIHllYXJzXG4gICAgICAucmVwbGFjZSgvKFswLTldezR9KS9nLCBnID0+IGAtJHtnfWApIDpcbiAgICBudWxsO1xuXG5leHBvcnQgY29uc3Qgbm9kZVR5cGVUb1N0cmluZyA9ICh0eXBlOiBOb2RlVHlwZSkgPT4gYCR7dHlwZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKX0ke3R5cGUuc3Vic3RyaW5nKDEpfWA7XG5cbmV4cG9ydCBjb25zdCBwYXJzZU5vZGVUeXBlID0gKHR5cGU6IHN0cmluZykgPT5cbiAgT2JqZWN0LnZhbHVlcyhOb2RlVHlwZSkuZmluZCh2ID0+IHYudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09PSAodHlwZSB8fCAnJykudG9Mb3dlckNhc2UoKSk7XG5cbmNvbnN0IG5vZGVEZWZhdWx0TGFiZWw6IHtcbiAgW3R5cGUgaW4gTm9kZVR5cGVdPzogKGRhdGE6IEpTT05MRDxhbnk+KSA9PiBzdHJpbmc7XG59ID0ge1xuICBbTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudF06ICh7IG5hbWUsIGNvdW50cnksIGVuZERhdGUsIHByb2R1Y3QgfTogSUltcGFjdEFzc2Vzc21lbnRKU09OTEQpID0+XG4gICAgbmFtZSA/IG5hbWUucmVwbGFjZShgJHtwcm9kdWN0Py5uYW1lfSwgYCwgJycpIDogW1xuICAgICAgcHJvZHVjdD8ubmFtZSxcbiAgICAgIGNvdW50cnk/Lm5hbWUsXG4gICAgICBlbmREYXRlXG4gICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKSxcbiAgW05vZGVUeXBlLlNpdGVdOiAoeyBuYW1lLCBkZXNjcmlwdGlvbiB9OiBJU2l0ZUpTT05MRCkgPT4gbmFtZSB8fCBkZXNjcmlwdGlvbiFcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0TGFiZWwgPSAobm9kZT86IGFueSkgPT5cbiAgbm9kZSA/IChcbiAgICBub2RlWydAdHlwZSddIGluIG5vZGVEZWZhdWx0TGFiZWwgPyBub2RlRGVmYXVsdExhYmVsW25vZGVbJ0B0eXBlJ11dKG5vZGUpIDogbm9kZS5uYW1lXG4gICkgfHwgbm9kZVsnQGlkJ10gfHwgbm9kZS5pZCA6ICcnO1xuXG5leHBvcnQgY29uc3QgaXRlbUNvbG9yID0gKGluZGV4OiBudW1iZXIpID0+IGdldENvbG9yKHsgdGV4dDogYCR7aW5kZXh9YCB9KTtcblxuZXhwb3J0IGNvbnN0IGxpc3RDb2xvciA9IDxUPihfdjogVCwgaW5kZXg6IG51bWJlcik6IHN0cmluZyA9PiBpdGVtQ29sb3IoaW5kZXgpO1xuXG5leHBvcnQgY29uc3QgbWludXRlc0JlZm9yZSA9IChkYXRlOiBEYXRlLCBtaW51dGVzID0gMSkgPT4ge1xuICBkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkgLSBtaW51dGVzKTtcbiAgcmV0dXJuIGRhdGU7XG59O1xuXG5leHBvcnQgY29uc3QgaG91cnNCZWZvcmUgPSAoZGF0ZTogRGF0ZSwgaG91cnMgPSAxKSA9PiB7XG4gIGRhdGUuc2V0SG91cnMoZGF0ZS5nZXRIb3VycygpIC0gaG91cnMpO1xuICByZXR1cm4gZGF0ZTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXBlYXQgPSAodGltZXMgPSAwKSA9PiAoQXJyYXkuZnJvbShBcnJheSh0aW1lcyksIE1hdGgucmFuZG9tKSk7XG5cbmV4cG9ydCBlbnVtIERlbHRhRGlzcGxheVR5cGUge1xuICBhYnNvbHV0ZSA9ICdhYnNvbHV0ZScsXG4gIHBlcmNlbnQgPSAncGVyY2VudCdcbn1cblxuY29uc3QgZGVsdGFQZXJUeXBlOiB7XG4gIFt0eXBlIGluIERlbHRhRGlzcGxheVR5cGVdOiAodmFsdWU6IG51bWJlciwgb3JpZ2luYWw6IG51bWJlcikgPT4gbnVtYmVyO1xufSA9IHtcbiAgW0RlbHRhRGlzcGxheVR5cGUuYWJzb2x1dGVdOiAodmFsdWUsIG9yaWdpbmFsKSA9PiB2YWx1ZSAtIG9yaWdpbmFsLFxuICBbRGVsdGFEaXNwbGF5VHlwZS5wZXJjZW50XTogKHZhbHVlLCBvcmlnaW5hbCkgPT4gKCh2YWx1ZSAtIG9yaWdpbmFsKSAvIG9yaWdpbmFsKSAqIDEwMFxufTtcblxuY29uc3Qgcm91bmRWYWx1ZSA9ICh2YWx1ZTogYW55KSA9PiArKGAke3ZhbHVlfWAuc3Vic3RyaW5nKDAsIDEwKSk7XG5cbmV4cG9ydCBjb25zdCBkZWx0YSA9ICh2YWx1ZTogYW55LCBvcmlnaW5hbFZhbHVlOiBhbnksIGRpc3BsYXlUeXBlID0gRGVsdGFEaXNwbGF5VHlwZS5wZXJjZW50KSA9PiB7XG4gIGNvbnN0IHZ2YWx1ZSA9IHJvdW5kVmFsdWUocHJvcGVydHlWYWx1ZSh2YWx1ZSkpO1xuICBjb25zdCB2b3JpZ2luYWxWYWx1ZSA9IHJvdW5kVmFsdWUocHJvcGVydHlWYWx1ZShvcmlnaW5hbFZhbHVlKSk7XG4gIGNvbnN0IGRpZmYgPSB2dmFsdWUgPT09IHZvcmlnaW5hbFZhbHVlID8gMCA6IGRlbHRhUGVyVHlwZVtkaXNwbGF5VHlwZV0odnZhbHVlLCB2b3JpZ2luYWxWYWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUoZGlmZikgPyAoZGlmZiA9PT0gLTAgPyAwIDogZGlmZikgOiAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbGVuYW1lV2l0aG91dEV4dCA9IChmaWxlbmFtZSA9ICcnKSA9PiB7XG4gIGNvbnN0IGZpbGUgPSBmaWxlVG9FeHQoZmlsZW5hbWUsICcnKTtcbiAgLy8gcmVtb3ZlIGxhc3QgLlxuICByZXR1cm4gZmlsZS5lbmRzV2l0aCgnLicpID8gZmlsZS5zdWJzdHJpbmcoMCwgZmlsZS5sZW5ndGggLSAxKSA6IGZpbGU7XG59O1xuIl19
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Component, Input } from '@angular/core';
|
|
3
|
+
import { DataState } from '@hestia-earth/api';
|
|
4
|
+
import { propertyValue, groupNodesByTerm, grouppedKeys } from '../../common/utils';
|
|
5
|
+
import { baseUrl } from '../../common/utils';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@fortawesome/angular-fontawesome";
|
|
8
|
+
import * as i2 from "../../node/node-link/node-link.component";
|
|
9
|
+
import * as i3 from "../cycles-functional-unit-measure/cycles-functional-unit-measure.component";
|
|
10
|
+
import * as i4 from "../../common/blank-node-state/blank-node-state.component";
|
|
11
|
+
import * as i5 from "../../common/blank-node-state-notice/blank-node-state-notice.component";
|
|
12
|
+
import * as i6 from "../cycles-suggest-form/cycles-suggest-form.component";
|
|
13
|
+
import * as i7 from "../cycles-activity-logs/cycles-activity-logs.component";
|
|
14
|
+
import * as i8 from "../../node/node-csv-export-confirm/node-csv-export-confirm.component";
|
|
15
|
+
import * as i9 from "../../node/node-value-details/node-value-details.component";
|
|
16
|
+
import * as i10 from "@angular/common";
|
|
17
|
+
import * as i11 from "@ng-bootstrap/ng-bootstrap";
|
|
18
|
+
import * as i12 from "../../common/ellipsis.pipe";
|
|
19
|
+
import * as i13 from "../../common/default.pipe";
|
|
20
|
+
import * as i14 from "../../common/precision.pipe";
|
|
21
|
+
const orderBy = require('lodash.orderby');
|
|
22
|
+
var View;
|
|
23
|
+
(function (View) {
|
|
24
|
+
View["table"] = "table";
|
|
25
|
+
View["logs"] = "logs";
|
|
26
|
+
})(View || (View = {}));
|
|
27
|
+
export class CyclesActivityComponent {
|
|
28
|
+
constructor() {
|
|
29
|
+
this.originalValues = [];
|
|
30
|
+
this.cycles = [];
|
|
31
|
+
this.enableCompare = true;
|
|
32
|
+
this.baseUrl = baseUrl();
|
|
33
|
+
this.propertyValue = propertyValue;
|
|
34
|
+
this.showDownload = false;
|
|
35
|
+
this.View = View;
|
|
36
|
+
this.selectedView = View.table;
|
|
37
|
+
this.inputs = [];
|
|
38
|
+
this.products = [];
|
|
39
|
+
}
|
|
40
|
+
ngOnChanges(changes) {
|
|
41
|
+
if ('cycles' in changes) {
|
|
42
|
+
return this.update();
|
|
43
|
+
}
|
|
44
|
+
if ('dataState' in changes) {
|
|
45
|
+
this.selectedView = View.table;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
trackById(_index, item) {
|
|
49
|
+
return item['@id'];
|
|
50
|
+
}
|
|
51
|
+
get isOriginal() {
|
|
52
|
+
return this.dataState === DataState.original;
|
|
53
|
+
}
|
|
54
|
+
update() {
|
|
55
|
+
const inputsPerCycle = groupNodesByTerm(this.cycles, 'inputs', this.originalValues);
|
|
56
|
+
this.inputs = orderBy(grouppedKeys(inputsPerCycle), ['key'], ['asc']);
|
|
57
|
+
const productsPerCycle = groupNodesByTerm(this.cycles, 'products', this.originalValues);
|
|
58
|
+
this.products = orderBy(grouppedKeys(productsPerCycle), ['key'], ['asc']);
|
|
59
|
+
}
|
|
60
|
+
togglePopover(popover, context) {
|
|
61
|
+
return popover.isOpen() ? popover.close() : popover.open(context);
|
|
62
|
+
}
|
|
63
|
+
// Add from suggestion
|
|
64
|
+
addCycle(cycle) {
|
|
65
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
this.cycles = [
|
|
67
|
+
...this.cycles,
|
|
68
|
+
cycle
|
|
69
|
+
];
|
|
70
|
+
return this.update();
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
CyclesActivityComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CyclesActivityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
75
|
+
CyclesActivityComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: CyclesActivityComponent, selector: "he-cycles-activity", inputs: { originalValues: "originalValues", cycles: "cycles", dataState: "dataState", enableCompare: "enableCompare" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"inputs.length || products.length; else emptyTable\">\n <div class=\"columns is-variable is-2 m-0\">\n <div class=\"column is-hidden-mobile\"></div>\n <div class=\"column is-narrow\">\n <div class=\"field has-addons\">\n <div class=\"control\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.table\" (click)=\"selectedView = View.table\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"list\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Table view</span>\n </button>\n </div>\n <div class=\"control\" *ngIf=\"!isOriginal && cycles.length === 1\">\n <button class=\"button is-small\" [class.is-active]=\"selectedView === View.logs\" (click)=\"selectedView = View.logs\">\n <span class=\"icon is-small\">\n <fa-icon icon=\"calculator\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span>Recalculations logs</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"px-3 pb-3\" [class.is-hidden]=\"selectedView !== View.table\">\n <div class=\"has-text-right mb-2\">\n <button class=\"button is-dark is-outlined is-small\" (click)=\"showDownload = true\">\n <fa-icon icon=\"download\"></fa-icon>\n <span class=\"pl-2\">Download (CSV)</span>\n </button>\n </div>\n\n <div class=\"table-container data-table-container mb-1\">\n <table class=\"table is-narrow data-table has-children-{{inputs.length + products.length}}\">\n <thead>\n <tr>\n <th class=\"width-auto\"></th>\n <th></th>\n <th *ngFor=\"let product of products\"\n [attr.title]=\"product.value.term.name\"\n >\n <he-node-link [node]=\"product.value.term\">\n <span>{{product.value.term.name | ellipsis:30}}</span>\n </he-node-link>\n </th>\n <th *ngFor=\"let input of inputs\"\n [attr.title]=\"input.value.term.name\"\n >\n <he-node-link [node]=\"input.value.term\">\n <span>{{input.value.term.name | ellipsis:30}}</span>\n </he-node-link>\n </th>\n </tr>\n <tr>\n <th class=\"width-auto\"></th>\n <th>\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n <th *ngFor=\"let product of products\"\n [attr.title]=\"product.value.term.units\"\n >{{product.value.term.units}}</th>\n <th *ngFor=\"let input of inputs\"\n [attr.title]=\"input.value.term.units\"\n >{{input.value.term.units}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let cycle of cycles; trackBy: trackById; let i = index\">\n <td class=\"width-auto\" [attr.title]=\"cycle.name\">\n <he-node-link [node]=\"cycle\">\n <span class=\"is-nowrap has-text-ellipsis\">{{i + 1}}. {{cycle.name || cycle.id}}</span>\n </he-node-link>\n </td>\n <td>\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let product of products\">\n <span *ngIf=\"product.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"togglePopover(p, { data: product.value.values[cycle['@id']], cycle: cycle, key: 'products' })\"\n >\n <span pointer>{{propertyValue(product.value.values[cycle['@id']].value) | precision:3 | default:'-'}}</span>\n <he-blank-node-state class=\"ml-1\"\n [node]=\"product.value.values[cycle['@id']].nodes[0]\"\n key=\"value\"\n ></he-blank-node-state>\n </span>\n </td>\n <td class=\"is-nowrap\" *ngFor=\"let input of inputs\">\n <span *ngIf=\"input.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\" [autoClose]=\"'outside'\"\n triggers=\"manual\" #p=\"ngbPopover\" placement=\"left\" container=\"body\"\n (click)=\"togglePopover(p, { data: input.value.values[cycle['@id']], cycle: cycle, key: 'inputs' })\"\n >\n <span pointer>{{propertyValue(input.value.values[cycle['@id']].value) | precision:3 | default:'-'}}</span>\n <he-blank-node-state class=\"ml-1\"\n [node]=\"input.value.values[cycle['@id']].nodes[0]\"\n key=\"value\"\n ></he-blank-node-state>\n </span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <he-blank-node-state-notice [dataState]=\"dataState\"></he-blank-node-state-notice>\n\n <he-cycles-suggest-form *ngIf=\"enableCompare\" [cycles]=\"cycles\" (cycleAdded)=\"addCycle($event)\"></he-cycles-suggest-form>\n </div>\n\n <he-cycles-activity-logs *ngIf=\"selectedView === View.logs && !isOriginal\"\n [original]=\"originalValues[0]\"\n [recalculated]=\"cycles[0]\"\n ></he-cycles-activity-logs>\n</ng-container>\n\n<he-node-csv-export-confirm *ngIf=\"showDownload\"\n [nodes]=\"cycles\" filename=\"cycle-inputs-products.csv\" [isUpload]=\"false\"\n [headerKeys]=\"['cycle.id', 'cycle.@id', 'cycle.inputs.', 'cycle.products.']\"\n (closed)=\"showDownload = false\"\n></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"panel-block\">\n <span>No activity data</span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p><b>{{node.name}}</b></p>\n <he-node-value-details\n [data]=\"data\" [nodeType]=\"node['@type']\" [dataKey]=\"key\"\n ></he-node-value-details>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}\n"], components: [{ type: i1.FaIconComponent, selector: "fa-icon", inputs: ["classes", "icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { type: i2.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink"] }, { type: i3.CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { type: i4.BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["nodeType", "dataKey", "key", "node", "state"] }, { type: i5.BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showDeleted"] }, { type: i6.CyclesSuggestFormComponent, selector: "he-cycles-suggest-form", inputs: ["cycles"], outputs: ["cycleAdded"] }, { type: i7.CyclesActivityLogsComponent, selector: "he-cycles-activity-logs", inputs: ["original", "recalculated"] }, { type: i8.NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { type: i9.NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i11.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disablePopover", "popoverClass", "openDelay", "closeDelay", "ngbPopover", "popoverTitle"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }], pipes: { "ellipsis": i12.EllipsisPipe, "default": i13.DefaultPipe, "precision": i14.PrecisionPipe } });
|
|
76
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: CyclesActivityComponent, decorators: [{
|
|
77
|
+
type: Component,
|
|
78
|
+
args: [{
|
|
79
|
+
selector: 'he-cycles-activity',
|
|
80
|
+
templateUrl: './cycles-activity.component.html',
|
|
81
|
+
styleUrls: ['./cycles-activity.component.scss']
|
|
82
|
+
}]
|
|
83
|
+
}], propDecorators: { originalValues: [{
|
|
84
|
+
type: Input
|
|
85
|
+
}], cycles: [{
|
|
86
|
+
type: Input
|
|
87
|
+
}], dataState: [{
|
|
88
|
+
type: Input
|
|
89
|
+
}], enableCompare: [{
|
|
90
|
+
type: Input
|
|
91
|
+
}] } });
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLWFjdGl2aXR5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jeWNsZXMvY3ljbGVzLWFjdGl2aXR5L2N5Y2xlcy1hY3Rpdml0eS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1hY3Rpdml0eS9jeWNsZXMtYWN0aXZpdHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE0QixNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFJOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBZ0IsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBSDdDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBSzFDLElBQUssSUFHSjtBQUhELFdBQUssSUFBSTtJQUNQLHVCQUFlLENBQUE7SUFDZixxQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUhJLElBQUksS0FBSixJQUFJLFFBR1I7QUFPRCxNQUFNLE9BQU8sdUJBQXVCO0lBTHBDO1FBT1MsbUJBQWMsR0FBbUIsRUFBRSxDQUFDO1FBRXBDLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBSTVCLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBRXJCLFlBQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUNwQixrQkFBYSxHQUFHLGFBQWEsQ0FBQztRQUM5QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixTQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ1osaUJBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTFCLFdBQU0sR0FBZ0MsRUFBRSxDQUFDO1FBQ3pDLGFBQVEsR0FBNEIsRUFBRSxDQUFDO0tBdUMvQztJQXJDQyxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxRQUFRLElBQUksT0FBTyxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxXQUFXLElBQUksT0FBTyxFQUFFO1lBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUNoQztJQUNILENBQUM7SUFFTSxTQUFTLENBQUMsTUFBYyxFQUFFLElBQWtCO1FBQ2pELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDL0MsQ0FBQztJQUVPLE1BQU07UUFDWixNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBNEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9HLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUF3QixJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0csSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVNLGFBQWEsQ0FBQyxPQUFZLEVBQUUsT0FBWTtRQUM3QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxzQkFBc0I7SUFFVCxRQUFRLENBQUMsS0FBbUI7O1lBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUc7Z0JBQ1osR0FBRyxJQUFJLENBQUMsTUFBTTtnQkFDZCxLQUFLO2FBQ04sQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7S0FBQTs7cUhBdkRVLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLHVNQ2xCcEMsMHJNQStJQTs0RkQ3SGEsdUJBQXVCO2tCQUxuQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLFdBQVcsRUFBRSxrQ0FBa0M7b0JBQy9DLFNBQVMsRUFBRSxDQUFDLGtDQUFrQyxDQUFDO2lCQUNoRDs4QkFHUSxjQUFjO3NCQURwQixLQUFLO2dCQUdDLE1BQU07c0JBRFosS0FBSztnQkFHQyxTQUFTO3NCQURmLEtBQUs7Z0JBR0MsYUFBYTtzQkFEbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YVN0YXRlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9hcGknO1xuaW1wb3J0IHsgSUN5Y2xlSlNPTkxELCBJbnB1dCBhcyBIZXN0aWFJbnB1dCwgUHJvZHVjdCB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmNvbnN0IG9yZGVyQnkgPSByZXF1aXJlKCdsb2Rhc2gub3JkZXJieScpO1xuXG5pbXBvcnQgeyBwcm9wZXJ0eVZhbHVlLCBncm91cE5vZGVzQnlUZXJtLCBJR3JvdXBlZEtleXMsIGdyb3VwcGVkS2V5cyB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBiYXNlVXJsIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcblxuZW51bSBWaWV3IHtcbiAgdGFibGUgPSAndGFibGUnLFxuICBsb2dzID0gJ2xvZ3MnXG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWN5Y2xlcy1hY3Rpdml0eScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jeWNsZXMtYWN0aXZpdHkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jeWNsZXMtYWN0aXZpdHkuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDeWNsZXNBY3Rpdml0eUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvcmlnaW5hbFZhbHVlczogSUN5Y2xlSlNPTkxEW10gPSBbXTtcbiAgQElucHV0KClcbiAgcHVibGljIGN5Y2xlczogSUN5Y2xlSlNPTkxEW10gPSBbXTtcbiAgQElucHV0KClcbiAgcHVibGljIGRhdGFTdGF0ZT86IERhdGFTdGF0ZTtcbiAgQElucHV0KClcbiAgcHVibGljIGVuYWJsZUNvbXBhcmUgPSB0cnVlO1xuXG4gIHB1YmxpYyBiYXNlVXJsID0gYmFzZVVybCgpO1xuICBwdWJsaWMgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWU7XG4gIHB1YmxpYyBzaG93RG93bmxvYWQgPSBmYWxzZTtcbiAgcHVibGljIFZpZXcgPSBWaWV3O1xuICBwdWJsaWMgc2VsZWN0ZWRWaWV3ID0gVmlldy50YWJsZTtcblxuICBwdWJsaWMgaW5wdXRzOiBJR3JvdXBlZEtleXM8SGVzdGlhSW5wdXQ+W10gPSBbXTtcbiAgcHVibGljIHByb2R1Y3RzOiBJR3JvdXBlZEtleXM8UHJvZHVjdD5bXSA9IFtdO1xuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoJ2N5Y2xlcycgaW4gY2hhbmdlcykge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuICAgIGlmICgnZGF0YVN0YXRlJyBpbiBjaGFuZ2VzKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlldyA9IFZpZXcudGFibGU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRyYWNrQnlJZChfaW5kZXg6IG51bWJlciwgaXRlbTogSUN5Y2xlSlNPTkxEKSB7XG4gICAgcmV0dXJuIGl0ZW1bJ0BpZCddO1xuICB9XG5cbiAgcHVibGljIGdldCBpc09yaWdpbmFsKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGFTdGF0ZSA9PT0gRGF0YVN0YXRlLm9yaWdpbmFsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUoKSB7XG4gICAgY29uc3QgaW5wdXRzUGVyQ3ljbGUgPSBncm91cE5vZGVzQnlUZXJtPElDeWNsZUpTT05MRCwgSGVzdGlhSW5wdXQ+KHRoaXMuY3ljbGVzLCAnaW5wdXRzJywgdGhpcy5vcmlnaW5hbFZhbHVlcyk7XG4gICAgdGhpcy5pbnB1dHMgPSBvcmRlckJ5KGdyb3VwcGVkS2V5cyhpbnB1dHNQZXJDeWNsZSksIFsna2V5J10sIFsnYXNjJ10pO1xuICAgIGNvbnN0IHByb2R1Y3RzUGVyQ3ljbGUgPSBncm91cE5vZGVzQnlUZXJtPElDeWNsZUpTT05MRCwgUHJvZHVjdD4odGhpcy5jeWNsZXMsICdwcm9kdWN0cycsIHRoaXMub3JpZ2luYWxWYWx1ZXMpO1xuICAgIHRoaXMucHJvZHVjdHMgPSBvcmRlckJ5KGdyb3VwcGVkS2V5cyhwcm9kdWN0c1BlckN5Y2xlKSwgWydrZXknXSwgWydhc2MnXSk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlUG9wb3Zlcihwb3BvdmVyOiBhbnksIGNvbnRleHQ6IGFueSkge1xuICAgIHJldHVybiBwb3BvdmVyLmlzT3BlbigpID8gcG9wb3Zlci5jbG9zZSgpIDogcG9wb3Zlci5vcGVuKGNvbnRleHQpO1xuICB9XG5cbiAgLy8gQWRkIGZyb20gc3VnZ2VzdGlvblxuXG4gIHB1YmxpYyBhc3luYyBhZGRDeWNsZShjeWNsZTogSUN5Y2xlSlNPTkxEKSB7XG4gICAgdGhpcy5jeWNsZXMgPSBbXG4gICAgICAuLi50aGlzLmN5Y2xlcyxcbiAgICAgIGN5Y2xlXG4gICAgXTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGUoKTtcbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImlucHV0cy5sZW5ndGggfHwgcHJvZHVjdHMubGVuZ3RoOyBlbHNlIGVtcHR5VGFibGVcIj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtdmFyaWFibGUgaXMtMiBtLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLWhpZGRlbi1tb2JpbGVcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvd1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJzZWxlY3RlZFZpZXcgPT09IFZpZXcudGFibGVcIiAoY2xpY2spPVwic2VsZWN0ZWRWaWV3ID0gVmlldy50YWJsZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJsaXN0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+VGFibGUgdmlldzwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCIgKm5nSWY9XCIhaXNPcmlnaW5hbCAmJiBjeWNsZXMubGVuZ3RoID09PSAxXCI+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIFtjbGFzcy5pcy1hY3RpdmVdPVwic2VsZWN0ZWRWaWV3ID09PSBWaWV3LmxvZ3NcIiAoY2xpY2spPVwic2VsZWN0ZWRWaWV3ID0gVmlldy5sb2dzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb24gaXMtc21hbGxcIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImNhbGN1bGF0b3JcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2ZhLWljb24+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj5SZWNhbGN1bGF0aW9ucyBsb2dzPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwicHgtMyBwYi0zXCIgW2NsYXNzLmlzLWhpZGRlbl09XCJzZWxlY3RlZFZpZXcgIT09IFZpZXcudGFibGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGFzLXRleHQtcmlnaHQgbWItMlwiPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1kYXJrIGlzLW91dGxpbmVkIGlzLXNtYWxsXCIgKGNsaWNrKT1cInNob3dEb3dubG9hZCA9IHRydWVcIj5cbiAgICAgICAgPGZhLWljb24gaWNvbj1cImRvd25sb2FkXCI+PC9mYS1pY29uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBsLTJcIj5Eb3dubG9hZCAoQ1NWKTwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbnRhaW5lciBkYXRhLXRhYmxlLWNvbnRhaW5lciBtYi0xXCI+XG4gICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSBpcy1uYXJyb3cgZGF0YS10YWJsZSBoYXMtY2hpbGRyZW4te3tpbnB1dHMubGVuZ3RoICsgcHJvZHVjdHMubGVuZ3RofX1cIj5cbiAgICAgICAgPHRoZWFkPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG9cIj48L3RoPlxuICAgICAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgcHJvZHVjdHNcIlxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJwcm9kdWN0LnZhbHVlLnRlcm0ubmFtZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgW25vZGVdPVwicHJvZHVjdC52YWx1ZS50ZXJtXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3twcm9kdWN0LnZhbHVlLnRlcm0ubmFtZSB8IGVsbGlwc2lzOjMwfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgaW5wdXQgb2YgaW5wdXRzXCJcbiAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwiaW5wdXQudmFsdWUudGVybS5uYW1lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBbbm9kZV09XCJpbnB1dC52YWx1ZS50ZXJtXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3tpbnB1dC52YWx1ZS50ZXJtLm5hbWUgfCBlbGxpcHNpczozMH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvXCI+PC90aD5cbiAgICAgICAgICAgIDx0aD5cbiAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hL0N5Y2xlI2Z1bmN0aW9uYWxVbml0J1wiIHRhcmdldD1cIl9ibGFua1wiPkZ1bmN0aW9uYWwgdW5pdDwvYT5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICA8dGggKm5nRm9yPVwibGV0IHByb2R1Y3Qgb2YgcHJvZHVjdHNcIlxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJwcm9kdWN0LnZhbHVlLnRlcm0udW5pdHNcIlxuICAgICAgICAgICAgPnt7cHJvZHVjdC52YWx1ZS50ZXJtLnVuaXRzfX08L3RoPlxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBpbnB1dCBvZiBpbnB1dHNcIlxuICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJpbnB1dC52YWx1ZS50ZXJtLnVuaXRzXCJcbiAgICAgICAgICAgID57e2lucHV0LnZhbHVlLnRlcm0udW5pdHN9fTwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgY3ljbGUgb2YgY3ljbGVzOyB0cmFja0J5OiB0cmFja0J5SWQ7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndpZHRoLWF1dG9cIiBbYXR0ci50aXRsZV09XCJjeWNsZS5uYW1lXCI+XG4gICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgW25vZGVdPVwiY3ljbGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImlzLW5vd3JhcCBoYXMtdGV4dC1lbGxpcHNpc1wiPnt7aSArIDF9fS4ge3tjeWNsZS5uYW1lIHx8IGN5Y2xlLmlkfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgPGhlLWN5Y2xlcy1mdW5jdGlvbmFsLXVuaXQtbWVhc3VyZSBbY3ljbGVdPVwiY3ljbGVcIj48L2hlLWN5Y2xlcy1mdW5jdGlvbmFsLXVuaXQtbWVhc3VyZT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJpcy1ub3dyYXBcIiAqbmdGb3I9XCJsZXQgcHJvZHVjdCBvZiBwcm9kdWN0c1wiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInByb2R1Y3QudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV07IGVsc2UgZW1wdHlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0cmlnZ2VyLXBvcG92ZXJcIlxuICAgICAgICAgICAgICAgIFtuZ2JQb3BvdmVyXT1cImRldGFpbHNcIiBbYXV0b0Nsb3NlXT1cIidvdXRzaWRlJ1wiXG4gICAgICAgICAgICAgICAgdHJpZ2dlcnM9XCJtYW51YWxcIiAjcD1cIm5nYlBvcG92ZXJcIiBwbGFjZW1lbnQ9XCJsZWZ0XCIgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBvcG92ZXIocCwgeyBkYXRhOiBwcm9kdWN0LnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLCBjeWNsZTogY3ljbGUsIGtleTogJ3Byb2R1Y3RzJyB9KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBwb2ludGVyPnt7cHJvcGVydHlWYWx1ZShwcm9kdWN0LnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLnZhbHVlKSB8IHByZWNpc2lvbjozIHwgZGVmYXVsdDonLSd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZSBjbGFzcz1cIm1sLTFcIlxuICAgICAgICAgICAgICAgICAgW25vZGVdPVwicHJvZHVjdC52YWx1ZS52YWx1ZXNbY3ljbGVbJ0BpZCddXS5ub2Rlc1swXVwiXG4gICAgICAgICAgICAgICAgICBrZXk9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgPjwvaGUtYmxhbmstbm9kZS1zdGF0ZT5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImlzLW5vd3JhcFwiICpuZ0Zvcj1cImxldCBpbnB1dCBvZiBpbnB1dHNcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpbnB1dC52YWx1ZS52YWx1ZXNbY3ljbGVbJ0BpZCddXTsgZWxzZSBlbXB0eVZhbHVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItcG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgW25nYlBvcG92ZXJdPVwiZGV0YWlsc1wiIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiICNwPVwibmdiUG9wb3ZlclwiIHBsYWNlbWVudD1cImxlZnRcIiBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUG9wb3ZlcihwLCB7IGRhdGE6IGlucHV0LnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLCBjeWNsZTogY3ljbGUsIGtleTogJ2lucHV0cycgfSlcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gcG9pbnRlcj57e3Byb3BlcnR5VmFsdWUoaW5wdXQudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV0udmFsdWUpIHwgcHJlY2lzaW9uOjMgfCBkZWZhdWx0OictJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxoZS1ibGFuay1ub2RlLXN0YXRlIGNsYXNzPVwibWwtMVwiXG4gICAgICAgICAgICAgICAgICBbbm9kZV09XCJpbnB1dC52YWx1ZS52YWx1ZXNbY3ljbGVbJ0BpZCddXS5ub2Rlc1swXVwiXG4gICAgICAgICAgICAgICAgICBrZXk9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgPjwvaGUtYmxhbmstbm9kZS1zdGF0ZT5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICA8L2Rpdj5cblxuICAgIDxoZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZSBbZGF0YVN0YXRlXT1cImRhdGFTdGF0ZVwiPjwvaGUtYmxhbmstbm9kZS1zdGF0ZS1ub3RpY2U+XG5cbiAgICA8aGUtY3ljbGVzLXN1Z2dlc3QtZm9ybSAqbmdJZj1cImVuYWJsZUNvbXBhcmVcIiBbY3ljbGVzXT1cImN5Y2xlc1wiIChjeWNsZUFkZGVkKT1cImFkZEN5Y2xlKCRldmVudClcIj48L2hlLWN5Y2xlcy1zdWdnZXN0LWZvcm0+XG4gIDwvZGl2PlxuXG4gIDxoZS1jeWNsZXMtYWN0aXZpdHktbG9ncyAqbmdJZj1cInNlbGVjdGVkVmlldyA9PT0gVmlldy5sb2dzICYmICFpc09yaWdpbmFsXCJcbiAgICBbb3JpZ2luYWxdPVwib3JpZ2luYWxWYWx1ZXNbMF1cIlxuICAgIFtyZWNhbGN1bGF0ZWRdPVwiY3ljbGVzWzBdXCJcbiAgPjwvaGUtY3ljbGVzLWFjdGl2aXR5LWxvZ3M+XG48L25nLWNvbnRhaW5lcj5cblxuPGhlLW5vZGUtY3N2LWV4cG9ydC1jb25maXJtICpuZ0lmPVwic2hvd0Rvd25sb2FkXCJcbiAgW25vZGVzXT1cImN5Y2xlc1wiIGZpbGVuYW1lPVwiY3ljbGUtaW5wdXRzLXByb2R1Y3RzLmNzdlwiIFtpc1VwbG9hZF09XCJmYWxzZVwiXG4gIFtoZWFkZXJLZXlzXT1cIlsnY3ljbGUuaWQnLCAnY3ljbGUuQGlkJywgJ2N5Y2xlLmlucHV0cy4nLCAnY3ljbGUucHJvZHVjdHMuJ11cIlxuICAoY2xvc2VkKT1cInNob3dEb3dubG9hZCA9IGZhbHNlXCJcbj48L2hlLW5vZGUtY3N2LWV4cG9ydC1jb25maXJtPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5VGFibGU+XG4gIDxkaXYgY2xhc3M9XCJwYW5lbC1ibG9ja1wiPlxuICAgIDxzcGFuPk5vIGFjdGl2aXR5IGRhdGE8L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVZhbHVlPlxuICA8c3Bhbj4tPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZXRhaWxzIGxldC1ub2RlPVwiY3ljbGVcIiBsZXQtZGF0YT1cImRhdGFcIiBsZXQta2V5PVwia2V5XCI+XG4gIDxwPjxiPnt7bm9kZS5uYW1lfX08L2I+PC9wPlxuICA8aGUtbm9kZS12YWx1ZS1kZXRhaWxzXG4gICAgW2RhdGFdPVwiZGF0YVwiIFtub2RlVHlwZV09XCJub2RlWydAdHlwZSddXCIgW2RhdGFLZXldPVwia2V5XCJcbiAgPjwvaGUtbm9kZS12YWx1ZS1kZXRhaWxzPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|