@openmrs/ngx-formentry 19.0.1-pre.489 → 19.0.1-pre.497
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/components/input/label.component.d.ts +1 -1
- package/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.d.ts +1 -1
- package/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.d.ts +1 -1
- package/components/number-input/number-input.component.d.ts +1 -1
- package/components/select/select.component.d.ts +1 -1
- package/fesm2022/openmrs-ngx-formentry.mjs +412 -380
- package/fesm2022/openmrs-ngx-formentry.mjs.map +1 -1
- package/form-entry/form-entry.module.d.ts +2 -2
- package/form-entry/form-factory/form.factory.d.ts +2 -2
- package/form-entry/helpers/js-expression-helper.d.ts +2 -2
- package/form-entry/services/form-schema-compiler.service.d.ts +2 -0
- package/form-entry/value-adapters/obs.adapter.d.ts +0 -1
- package/form-entry/value-adapters/person-attribute.adapter.d.ts +3 -3
- package/lib/index.d.ts +1 -1
- package/package.json +10 -12
- package/esm2022/abstract-controls-extension/afe-control-type.mjs +0 -8
- package/esm2022/abstract-controls-extension/afe-form-array.mjs +0 -89
- package/esm2022/abstract-controls-extension/afe-form-control.mjs +0 -91
- package/esm2022/abstract-controls-extension/afe-form-group.mjs +0 -66
- package/esm2022/abstract-controls-extension/control-extensions.mjs +0 -5
- package/esm2022/abstract-controls-extension/index.mjs +0 -5
- package/esm2022/abstract-controls-extension/value-change.listener.mjs +0 -2
- package/esm2022/change-tracking/control-relation.mjs +0 -44
- package/esm2022/change-tracking/control-relations.mjs +0 -32
- package/esm2022/components/afe-ng-select.component.mjs +0 -101
- package/esm2022/components/appointments-overview/appointments-overview.component.mjs +0 -116
- package/esm2022/components/check-box/checkbox.component.mjs +0 -110
- package/esm2022/components/check-box/checkbox.module.mjs +0 -19
- package/esm2022/components/custom-component-wrapper/custom-component-wrapper..module.mjs +0 -22
- package/esm2022/components/custom-component-wrapper/custom-component-wrapper.component.mjs +0 -21
- package/esm2022/components/custom-control-wrapper/custom-control-wrapper..module.mjs +0 -23
- package/esm2022/components/custom-control-wrapper/custom-control-wrapper.component.mjs +0 -68
- package/esm2022/components/date-time-picker/date-picker/date-picker.component.mjs +0 -188
- package/esm2022/components/date-time-picker/date-time-picker.component.mjs +0 -115
- package/esm2022/components/date-time-picker/date-time-picker.module.mjs +0 -48
- package/esm2022/components/date-time-picker/index.mjs +0 -9
- package/esm2022/components/date-time-picker/picker-modal/modal.component.mjs +0 -25
- package/esm2022/components/date-time-picker/pipes/moment.pipe.mjs +0 -17
- package/esm2022/components/date-time-picker/time-picker/time-picker.component.mjs +0 -121
- package/esm2022/components/file-upload/file-upload.component.mjs +0 -109
- package/esm2022/components/file-upload/file-upload.module.mjs +0 -37
- package/esm2022/components/file-upload/secure.pipe.mjs +0 -101
- package/esm2022/components/input/input.directive.mjs +0 -78
- package/esm2022/components/input/input.module.mjs +0 -23
- package/esm2022/components/input/label.component.mjs +0 -263
- package/esm2022/components/input/text-area.directive.mjs +0 -58
- package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.component.mjs +0 -87
- package/esm2022/components/ngx-datetime-picker/ngx-datetime-picker.module.mjs +0 -40
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-adapter.class.mjs +0 -114
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/date-time-format.class.mjs +0 -7
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-adapter.class.mjs +0 -347
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time-format.class.mjs +0 -16
- package/esm2022/components/ngx-pick-datetime/lib/date-time/adapter/native-date-time.module.mjs +0 -39
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-body.component.mjs +0 -142
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-month-view.component.mjs +0 -439
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-multi-year-view.component.mjs +0 -373
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar-year-view.component.mjs +0 -367
- package/esm2022/components/ngx-pick-datetime/lib/date-time/calendar.component.mjs +0 -342
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-inline.component.mjs +0 -259
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-container.component.mjs +0 -392
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-input.directive.mjs +0 -614
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-intl.service.mjs +0 -65
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker-trigger.directive.mjs +0 -70
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.animations.mjs +0 -21
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time-picker.component.mjs +0 -522
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.class.mjs +0 -166
- package/esm2022/components/ngx-pick-datetime/lib/date-time/date-time.module.mjs +0 -97
- package/esm2022/components/ngx-pick-datetime/lib/date-time/numberedFixLen.pipe.mjs +0 -28
- package/esm2022/components/ngx-pick-datetime/lib/date-time/timer-box.component.mjs +0 -90
- package/esm2022/components/ngx-pick-datetime/lib/date-time/timer.component.mjs +0 -292
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-config.class.mjs +0 -56
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-container.component.mjs +0 -243
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog-ref.class.mjs +0 -119
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.module.mjs +0 -26
- package/esm2022/components/ngx-pick-datetime/lib/dialog/dialog.service.mjs +0 -233
- package/esm2022/components/ngx-pick-datetime/lib/utils/index.mjs +0 -5
- package/esm2022/components/ngx-pick-datetime/lib/utils/object.utils.mjs +0 -26
- package/esm2022/components/ngx-remote-select/ngx-remote-select.component.mjs +0 -151
- package/esm2022/components/ngx-remote-select/ngx-remote-select.module.mjs +0 -22
- package/esm2022/components/ngx-tabset/components/ngx-tab-set.component.mjs +0 -74
- package/esm2022/components/ngx-tabset/components/tab.component.mjs +0 -33
- package/esm2022/components/ngx-tabset/directives/hover-class.directive.mjs +0 -30
- package/esm2022/components/ngx-tabset/modules/ngx-tabset.module.mjs +0 -38
- package/esm2022/components/number-input/number-input.component.mjs +0 -254
- package/esm2022/components/number-input/number-input.module.mjs +0 -21
- package/esm2022/components/number-input/number.directive.mjs +0 -22
- package/esm2022/components/radio-button/radio.component.mjs +0 -98
- package/esm2022/components/radio-button/radio.module.mjs +0 -19
- package/esm2022/components/select/optgroup.directive.mjs +0 -19
- package/esm2022/components/select/option.directive.mjs +0 -19
- package/esm2022/components/select/select.component.mjs +0 -182
- package/esm2022/components/select/select.module.mjs +0 -23
- package/esm2022/components/workspace-launcher/workspace-launcher.component.mjs +0 -26
- package/esm2022/components/workspace-launcher/workspace-launcher.module.mjs +0 -19
- package/esm2022/form-entry/control-alerts/alert-helpers.mjs +0 -40
- package/esm2022/form-entry/control-alerts/can-generate-alert.mjs +0 -2
- package/esm2022/form-entry/control-calculators/can-calculate.mjs +0 -2
- package/esm2022/form-entry/control-hiders-disablers/can-disable.mjs +0 -2
- package/esm2022/form-entry/control-hiders-disablers/can-hide.mjs +0 -2
- package/esm2022/form-entry/control-hiders-disablers/disabler-helper.mjs +0 -32
- package/esm2022/form-entry/control-hiders-disablers/hider-helpers.mjs +0 -41
- package/esm2022/form-entry/data-sources/data-sources.mjs +0 -30
- package/esm2022/form-entry/data-sources/dummy-data-source.mjs +0 -104
- package/esm2022/form-entry/directives/collapse-animations.mjs +0 -11
- package/esm2022/form-entry/directives/collapse.directive.mjs +0 -172
- package/esm2022/form-entry/directives/historical-value.directive.mjs +0 -68
- package/esm2022/form-entry/error-renderer/error-renderer.component.mjs +0 -53
- package/esm2022/form-entry/expression-runner/expression-runner.mjs +0 -170
- package/esm2022/form-entry/form-entry.module.mjs +0 -194
- package/esm2022/form-entry/form-factory/control-relations.factory.mjs +0 -238
- package/esm2022/form-entry/form-factory/form-control.service.mjs +0 -118
- package/esm2022/form-entry/form-factory/form-node.mjs +0 -99
- package/esm2022/form-entry/form-factory/form.factory.mjs +0 -144
- package/esm2022/form-entry/form-factory/form.mjs +0 -190
- package/esm2022/form-entry/form-factory/hiders-disablers.factory.mjs +0 -68
- package/esm2022/form-entry/form-factory/index.mjs +0 -7
- package/esm2022/form-entry/form-factory/question.factory.mjs +0 -1123
- package/esm2022/form-entry/form-factory/show-messages.factory.mjs +0 -31
- package/esm2022/form-entry/form-factory/validation.factory.mjs +0 -182
- package/esm2022/form-entry/form-renderer/form-renderer.component.mjs +0 -277
- package/esm2022/form-entry/helpers/historical-expression-helper-service.mjs +0 -42
- package/esm2022/form-entry/helpers/historical-field-helper-service.mjs +0 -39
- package/esm2022/form-entry/helpers/js-expression-helper.mjs +0 -314
- package/esm2022/form-entry/helpers/risk-dataset-table.mjs +0 -247
- package/esm2022/form-entry/pipes/time-ago.pipe.mjs +0 -110
- package/esm2022/form-entry/question-models/checkbox.model.mjs +0 -11
- package/esm2022/form-entry/question-models/conditional-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/custom-control-question.model.mjs +0 -10
- package/esm2022/form-entry/question-models/date-question.mjs +0 -12
- package/esm2022/form-entry/question-models/date-validation.model.mjs +0 -10
- package/esm2022/form-entry/question-models/decimal-validation.model.mjs +0 -19
- package/esm2022/form-entry/question-models/diagnosis-question.mjs +0 -12
- package/esm2022/form-entry/question-models/disallow-decimals-validation.model.mjs +0 -18
- package/esm2022/form-entry/question-models/file-upload-question.mjs +0 -13
- package/esm2022/form-entry/question-models/group-question.mjs +0 -12
- package/esm2022/form-entry/question-models/index.mjs +0 -24
- package/esm2022/form-entry/question-models/interfaces/base-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/checkbox-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/data-source.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/date-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/diagnosis-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/file-upload-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/group-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/multi-select-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/nested-questions.mjs +0 -7
- package/esm2022/form-entry/question-models/interfaces/radio-button-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/remote-select-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/repeating-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/select-option.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/select-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/test-order-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/text-area-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/text-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/ui-select-question-options.mjs +0 -2
- package/esm2022/form-entry/question-models/interfaces/workspace-launcher-options.mjs +0 -2
- package/esm2022/form-entry/question-models/js-expression-validation.model.mjs +0 -8
- package/esm2022/form-entry/question-models/max-length-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/max-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/min-length-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/min-validation.model.mjs +0 -9
- package/esm2022/form-entry/question-models/models.mjs +0 -13
- package/esm2022/form-entry/question-models/multi-select-question.mjs +0 -11
- package/esm2022/form-entry/question-models/pair.model.mjs +0 -7
- package/esm2022/form-entry/question-models/question-base.mjs +0 -26
- package/esm2022/form-entry/question-models/radio-button.model.mjs +0 -12
- package/esm2022/form-entry/question-models/remote-select-question.mjs +0 -12
- package/esm2022/form-entry/question-models/rendering-type.mjs +0 -9
- package/esm2022/form-entry/question-models/repeating-question.mjs +0 -11
- package/esm2022/form-entry/question-models/select-option.mjs +0 -7
- package/esm2022/form-entry/question-models/select-question.mjs +0 -12
- package/esm2022/form-entry/question-models/test-order-question.mjs +0 -15
- package/esm2022/form-entry/question-models/text-area-input-question.mjs +0 -13
- package/esm2022/form-entry/question-models/text-input-question.mjs +0 -10
- package/esm2022/form-entry/question-models/ui-select-question.mjs +0 -11
- package/esm2022/form-entry/question-models/validation.model.mjs +0 -7
- package/esm2022/form-entry/question-models/workspace-launcher.model.mjs +0 -15
- package/esm2022/form-entry/services/debug-mode.service.mjs +0 -24
- package/esm2022/form-entry/services/form-errors.service.mjs +0 -21
- package/esm2022/form-entry/services/form-schema-compiler.service.mjs +0 -248
- package/esm2022/form-entry/services/historical-encounter-data.service.mjs +0 -172
- package/esm2022/form-entry/validators/conditional-answered.validator.mjs +0 -46
- package/esm2022/form-entry/validators/conditional-required.validator.mjs +0 -40
- package/esm2022/form-entry/validators/date.validator.mjs +0 -18
- package/esm2022/form-entry/validators/disallow-decimals.validator.mjs +0 -15
- package/esm2022/form-entry/validators/future-date-restriction.validator.mjs +0 -21
- package/esm2022/form-entry/validators/js-expression.validator.mjs +0 -26
- package/esm2022/form-entry/validators/max-date.validator.mjs +0 -23
- package/esm2022/form-entry/validators/max-length.validator.mjs +0 -17
- package/esm2022/form-entry/validators/max.validator.mjs +0 -21
- package/esm2022/form-entry/validators/min-date.validator.mjs +0 -23
- package/esm2022/form-entry/validators/min-length.validator.mjs +0 -17
- package/esm2022/form-entry/validators/min.validator.mjs +0 -21
- package/esm2022/form-entry/validators/required.validator.mjs +0 -11
- package/esm2022/form-entry/validators/validations.mjs +0 -5
- package/esm2022/form-entry/value-adapters/diagnosis.adapter.mjs +0 -241
- package/esm2022/form-entry/value-adapters/encounter.adapter.mjs +0 -190
- package/esm2022/form-entry/value-adapters/obs-adapter-helper.mjs +0 -559
- package/esm2022/form-entry/value-adapters/obs.adapter.mjs +0 -542
- package/esm2022/form-entry/value-adapters/order.adapter.mjs +0 -186
- package/esm2022/form-entry/value-adapters/patient-identifier.adapter.mjs +0 -77
- package/esm2022/form-entry/value-adapters/person-attribute.adapter.mjs +0 -88
- package/esm2022/form-entry/value-adapters/value.adapter.mjs +0 -2
- package/esm2022/lib/index.mjs +0 -59
- package/esm2022/openmrs-ngx-formentry.mjs +0 -5
- package/esm2022/public_api.mjs +0 -2
- package/esm2022/shared.module.mjs +0 -21
- /package/components/custom-component-wrapper/{custom-component-wrapper..module.d.ts → custom-component-wrapper.module.d.ts} +0 -0
- /package/components/custom-control-wrapper/{custom-control-wrapper..module.d.ts → custom-control-wrapper.module.d.ts} +0 -0
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import * as _ from 'lodash';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class HistoricalFieldHelperService {
|
|
5
|
-
getDisplayTextFromOptions(question, valueProperty, displayProperty) {
|
|
6
|
-
let displayText = '';
|
|
7
|
-
const historicalValue = question.historicalDataValue;
|
|
8
|
-
if (_.isArray(historicalValue.value)) {
|
|
9
|
-
let valueConverted = 0;
|
|
10
|
-
_.each(historicalValue.value, (val) => {
|
|
11
|
-
_.each(question.options, (option) => {
|
|
12
|
-
if (option[valueProperty] === val) {
|
|
13
|
-
if (valueConverted === 0) {
|
|
14
|
-
displayText = displayText + option[displayProperty];
|
|
15
|
-
}
|
|
16
|
-
else {
|
|
17
|
-
displayText = displayText + ', ' + option[displayProperty];
|
|
18
|
-
}
|
|
19
|
-
valueConverted++;
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
_.each(question.options, (option) => {
|
|
26
|
-
if (option[valueProperty] === historicalValue.value) {
|
|
27
|
-
displayText = option[displayProperty];
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
return displayText;
|
|
32
|
-
}
|
|
33
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HistoricalFieldHelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
34
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HistoricalFieldHelperService }); }
|
|
35
|
-
}
|
|
36
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HistoricalFieldHelperService, decorators: [{
|
|
37
|
-
type: Injectable
|
|
38
|
-
}] });
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yaWNhbC1maWVsZC1oZWxwZXItc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1mb3JtZW50cnkvc3JjL2Zvcm0tZW50cnkvaGVscGVycy9oaXN0b3JpY2FsLWZpZWxkLWhlbHBlci1zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRzNDLE1BQU0sT0FBTyw0QkFBNEI7SUFDaEMseUJBQXlCLENBQzlCLFFBQXNCLEVBQ3RCLGFBQXFCLEVBQ3JCLGVBQXVCO1FBRXZCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUM7UUFDckQsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDcEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ2xDLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs0QkFDekIsV0FBVyxHQUFHLFdBQVcsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ3RELENBQUM7NkJBQU0sQ0FBQzs0QkFDTixXQUFXLEdBQUcsV0FBVyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQzdELENBQUM7d0JBQ0QsY0FBYyxFQUFFLENBQUM7b0JBQ25CLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDcEQsV0FBVyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDeEMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7K0dBOUJVLDRCQUE0QjttSEFBNUIsNEJBQTRCOzs0RkFBNUIsNEJBQTRCO2tCQUR4QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUXVlc3Rpb25CYXNlIH0gZnJvbSAnLi4vcXVlc3Rpb24tbW9kZWxzL3F1ZXN0aW9uLWJhc2UnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSGlzdG9yaWNhbEZpZWxkSGVscGVyU2VydmljZSB7XG4gIHB1YmxpYyBnZXREaXNwbGF5VGV4dEZyb21PcHRpb25zKFxuICAgIHF1ZXN0aW9uOiBRdWVzdGlvbkJhc2UsXG4gICAgdmFsdWVQcm9wZXJ0eTogc3RyaW5nLFxuICAgIGRpc3BsYXlQcm9wZXJ0eTogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IGRpc3BsYXlUZXh0ID0gJyc7XG4gICAgY29uc3QgaGlzdG9yaWNhbFZhbHVlID0gcXVlc3Rpb24uaGlzdG9yaWNhbERhdGFWYWx1ZTtcbiAgICBpZiAoXy5pc0FycmF5KGhpc3RvcmljYWxWYWx1ZS52YWx1ZSkpIHtcbiAgICAgIGxldCB2YWx1ZUNvbnZlcnRlZCA9IDA7XG4gICAgICBfLmVhY2goaGlzdG9yaWNhbFZhbHVlLnZhbHVlLCAodmFsKSA9PiB7XG4gICAgICAgIF8uZWFjaChxdWVzdGlvbi5vcHRpb25zLCAob3B0aW9uKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvblt2YWx1ZVByb3BlcnR5XSA9PT0gdmFsKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVDb252ZXJ0ZWQgPT09IDApIHtcbiAgICAgICAgICAgICAgZGlzcGxheVRleHQgPSBkaXNwbGF5VGV4dCArIG9wdGlvbltkaXNwbGF5UHJvcGVydHldO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGlzcGxheVRleHQgPSBkaXNwbGF5VGV4dCArICcsICcgKyBvcHRpb25bZGlzcGxheVByb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlQ29udmVydGVkKys7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfLmVhY2gocXVlc3Rpb24ub3B0aW9ucywgKG9wdGlvbikgPT4ge1xuICAgICAgICBpZiAob3B0aW9uW3ZhbHVlUHJvcGVydHldID09PSBoaXN0b3JpY2FsVmFsdWUudmFsdWUpIHtcbiAgICAgICAgICBkaXNwbGF5VGV4dCA9IG9wdGlvbltkaXNwbGF5UHJvcGVydHldO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpc3BsYXlUZXh0O1xuICB9XG59XG4iXX0=
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
import * as _ from 'lodash';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { southEastAsiaCvdRiskTables } from './risk-dataset-table';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class JsExpressionHelper {
|
|
6
|
-
calcBMI(height, weight) {
|
|
7
|
-
let r;
|
|
8
|
-
if (height && weight) {
|
|
9
|
-
r = (weight / (((height / 100) * height) / 100)).toFixed(1);
|
|
10
|
-
}
|
|
11
|
-
return height && weight ? parseFloat(r) : null;
|
|
12
|
-
}
|
|
13
|
-
calcBSA(height, weight) {
|
|
14
|
-
let result;
|
|
15
|
-
if (height && weight) {
|
|
16
|
-
result = Math.sqrt((height * weight) / 3600).toFixed(2);
|
|
17
|
-
}
|
|
18
|
-
return height && weight ? parseFloat(result) : null;
|
|
19
|
-
}
|
|
20
|
-
calcBMIForAgeZscore(bmiForAgeRef, height, weight) {
|
|
21
|
-
let bmi;
|
|
22
|
-
const maxAgeInDays = 1856;
|
|
23
|
-
if (height && weight) {
|
|
24
|
-
bmi = (weight / (((height / 100) * height) / 100)).toFixed(1);
|
|
25
|
-
}
|
|
26
|
-
const refSectionObject = _.first(bmiForAgeRef);
|
|
27
|
-
let formattedSDValue;
|
|
28
|
-
if (refSectionObject) {
|
|
29
|
-
const refObjectValues = Object.keys(refSectionObject)
|
|
30
|
-
.map((key) => refSectionObject[key])
|
|
31
|
-
.map((x) => x);
|
|
32
|
-
const refObjectKeys = Object.keys(refSectionObject);
|
|
33
|
-
const minimumValue = refObjectValues[1];
|
|
34
|
-
const minReferencePoint = [];
|
|
35
|
-
if (bmi < minimumValue) {
|
|
36
|
-
minReferencePoint.push(minimumValue);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
_.forEach(refObjectValues, (value) => {
|
|
40
|
-
if (value <= bmi) {
|
|
41
|
-
minReferencePoint.push(value);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
const lastReferenceValue = _.last(minReferencePoint);
|
|
46
|
-
const lastValueIndex = _.findIndex(refObjectValues, (o) => {
|
|
47
|
-
return o === lastReferenceValue;
|
|
48
|
-
});
|
|
49
|
-
const SDValue = refObjectKeys[lastValueIndex];
|
|
50
|
-
formattedSDValue = SDValue.replace('SD', '');
|
|
51
|
-
if (formattedSDValue.includes('neg')) {
|
|
52
|
-
formattedSDValue = formattedSDValue.substring(1, 0);
|
|
53
|
-
formattedSDValue = '-' + formattedSDValue;
|
|
54
|
-
}
|
|
55
|
-
if (formattedSDValue === 'S' ||
|
|
56
|
-
formattedSDValue === 'L' ||
|
|
57
|
-
formattedSDValue === 'M' ||
|
|
58
|
-
formattedSDValue === '-5') {
|
|
59
|
-
formattedSDValue = '-4';
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return bmi && refSectionObject ? formattedSDValue : null;
|
|
63
|
-
}
|
|
64
|
-
calcWeightForHeightZscore(weightForHeightRef, height, weight) {
|
|
65
|
-
let refSection;
|
|
66
|
-
let formattedSDValue;
|
|
67
|
-
if (height && weight) {
|
|
68
|
-
height = parseFloat(height).toFixed(1);
|
|
69
|
-
}
|
|
70
|
-
const standardHeightMin = 45;
|
|
71
|
-
const standardMaxHeight = 110;
|
|
72
|
-
if (height < standardHeightMin || height > standardMaxHeight) {
|
|
73
|
-
formattedSDValue = -4;
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
refSection = _.filter(weightForHeightRef, (refObject) => {
|
|
77
|
-
return parseFloat(refObject['Length']).toFixed(1) === height;
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
const refSectionObject = _.first(refSection);
|
|
81
|
-
if (refSectionObject) {
|
|
82
|
-
const refObjectValues = Object.keys(refSectionObject)
|
|
83
|
-
.map((key) => refSectionObject[key])
|
|
84
|
-
.map((x) => x);
|
|
85
|
-
const refObjectKeys = Object.keys(refSectionObject);
|
|
86
|
-
const minimumValue = refObjectValues[1];
|
|
87
|
-
const minReferencePoint = [];
|
|
88
|
-
if (weight < minimumValue) {
|
|
89
|
-
minReferencePoint.push(minimumValue);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
_.forEach(refObjectValues, (value) => {
|
|
93
|
-
if (value <= weight) {
|
|
94
|
-
minReferencePoint.push(value);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
const lastReferenceValue = _.last(minReferencePoint);
|
|
99
|
-
const lastValueIndex = _.findIndex(refObjectValues, (o) => {
|
|
100
|
-
return o === lastReferenceValue;
|
|
101
|
-
});
|
|
102
|
-
const SDValue = refObjectKeys[lastValueIndex];
|
|
103
|
-
formattedSDValue = SDValue.replace('SD', '');
|
|
104
|
-
if (formattedSDValue.includes('neg')) {
|
|
105
|
-
formattedSDValue = formattedSDValue.substring(1, 0);
|
|
106
|
-
formattedSDValue = '-' + formattedSDValue;
|
|
107
|
-
}
|
|
108
|
-
if (formattedSDValue === 'S' ||
|
|
109
|
-
formattedSDValue === 'L' ||
|
|
110
|
-
formattedSDValue === 'M' ||
|
|
111
|
-
formattedSDValue === '-5') {
|
|
112
|
-
formattedSDValue = '-4';
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return height && weight ? formattedSDValue : null;
|
|
116
|
-
}
|
|
117
|
-
calcHeightForAgeZscore(heightForAgeRef, height, weight) {
|
|
118
|
-
const refSectionObject = _.first(heightForAgeRef);
|
|
119
|
-
let formattedSDValue;
|
|
120
|
-
if (refSectionObject) {
|
|
121
|
-
const refObjectValues = Object.keys(refSectionObject)
|
|
122
|
-
.map((key) => refSectionObject[key])
|
|
123
|
-
.map((x) => x);
|
|
124
|
-
const refObjectKeys = Object.keys(refSectionObject);
|
|
125
|
-
const minimumValue = refObjectValues[1];
|
|
126
|
-
const minReferencePoint = [];
|
|
127
|
-
if (height < minimumValue) {
|
|
128
|
-
minReferencePoint.push(minimumValue);
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
_.forEach(refObjectValues, (value) => {
|
|
132
|
-
if (value <= height) {
|
|
133
|
-
minReferencePoint.push(value);
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
const lastReferenceValue = _.last(minReferencePoint);
|
|
138
|
-
const lastValueIndex = _.findIndex(refObjectValues, (o) => {
|
|
139
|
-
return o === lastReferenceValue;
|
|
140
|
-
});
|
|
141
|
-
const SDValue = refObjectKeys[lastValueIndex];
|
|
142
|
-
formattedSDValue = SDValue.replace('SD', '');
|
|
143
|
-
if (formattedSDValue.includes('neg')) {
|
|
144
|
-
formattedSDValue = formattedSDValue.substring(1, 0);
|
|
145
|
-
formattedSDValue = '-' + formattedSDValue;
|
|
146
|
-
}
|
|
147
|
-
if (formattedSDValue === 'S' ||
|
|
148
|
-
formattedSDValue === 'L' ||
|
|
149
|
-
formattedSDValue === 'M' ||
|
|
150
|
-
formattedSDValue === '-5') {
|
|
151
|
-
formattedSDValue = '-4';
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return height && weight && refSectionObject ? formattedSDValue : null;
|
|
155
|
-
}
|
|
156
|
-
calcSouthEastAsiaNonLabCVDRisk(sex, smoker, age, sbp, bmi) {
|
|
157
|
-
const hasValidValues = typeof sex === 'string' &&
|
|
158
|
-
typeof smoker === 'boolean' &&
|
|
159
|
-
typeof age === 'number' &&
|
|
160
|
-
typeof sbp === 'number' &&
|
|
161
|
-
typeof bmi === 'number';
|
|
162
|
-
if (!hasValidValues) {
|
|
163
|
-
return null;
|
|
164
|
-
}
|
|
165
|
-
// Bin functions
|
|
166
|
-
const getAgeBin = (age) => Math.floor((Math.min(Math.max(40, age), 74) - 40) / 5);
|
|
167
|
-
const getSbpBin = (sbp) => Math.max(0, Math.floor((Math.min(sbp, 180) - 120) / 20) + 1);
|
|
168
|
-
const getBmiBin = (bmi) => Math.max(0, Math.floor((Math.min(bmi, 35) - 20) / 5) + 1);
|
|
169
|
-
// Variables
|
|
170
|
-
const sexIdx = sex === 'M' ? 0 : 1;
|
|
171
|
-
const smokerIdx = smoker ? 1 : 0;
|
|
172
|
-
const ageIdx = 6 - getAgeBin(age);
|
|
173
|
-
const bmiIdx = getBmiBin(bmi);
|
|
174
|
-
const sbpIdx = 4 - getSbpBin(sbp);
|
|
175
|
-
return southEastAsiaCvdRiskTables[sexIdx][smokerIdx][ageIdx][sbpIdx][bmiIdx];
|
|
176
|
-
}
|
|
177
|
-
isEmpty(val) {
|
|
178
|
-
if (val === undefined ||
|
|
179
|
-
val === null ||
|
|
180
|
-
val === '' ||
|
|
181
|
-
val === 'null' ||
|
|
182
|
-
val === 'undefined') {
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
if (Array.isArray(val) && val.length === 0) {
|
|
186
|
-
return true;
|
|
187
|
-
}
|
|
188
|
-
return false;
|
|
189
|
-
}
|
|
190
|
-
arrayContains(array, members) {
|
|
191
|
-
if (Array.isArray(members)) {
|
|
192
|
-
if (members.length === 0) {
|
|
193
|
-
return true;
|
|
194
|
-
}
|
|
195
|
-
let contains = true;
|
|
196
|
-
for (let i = 0; i < members.length; i++) {
|
|
197
|
-
const val = members[i];
|
|
198
|
-
if (array.indexOf(val) === -1) {
|
|
199
|
-
contains = false;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return contains;
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
return array.indexOf(members) !== -1;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
extractRepeatingGroupValues(key, array) {
|
|
209
|
-
const values = array.map(function (item) {
|
|
210
|
-
return item[key];
|
|
211
|
-
});
|
|
212
|
-
return values;
|
|
213
|
-
}
|
|
214
|
-
formatDate(value, format, offset) {
|
|
215
|
-
format = format || 'yyyy-MM-dd';
|
|
216
|
-
offset = offset || '+0300';
|
|
217
|
-
if (!(value instanceof Date)) {
|
|
218
|
-
value = new Date(value);
|
|
219
|
-
if (value === null || value === undefined) {
|
|
220
|
-
throw new Error('DateFormatException: value passed ' + 'is not a valid date');
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return value; // TODO implement this
|
|
224
|
-
// return $filter('date')(value, format, offset);
|
|
225
|
-
}
|
|
226
|
-
arrayContainsAny(array, members) {
|
|
227
|
-
if (Array.isArray(members)) {
|
|
228
|
-
if (members.length === 0) {
|
|
229
|
-
return true;
|
|
230
|
-
}
|
|
231
|
-
let contains = false;
|
|
232
|
-
for (let i = 0; i < members.length; i++) {
|
|
233
|
-
const val = members[i];
|
|
234
|
-
if (array.indexOf(val) !== -1) {
|
|
235
|
-
contains = true;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return contains;
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
return array.indexOf(members) !== -1;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Takes a target control, an encounter and concept uuid. If the target control has a value it returns it
|
|
246
|
-
* otherwise it tries to find it in the encounter. Finally it returns null of it can't find either of them.
|
|
247
|
-
* @param targetControl
|
|
248
|
-
* @param rawEncounter
|
|
249
|
-
* @param uuid
|
|
250
|
-
* @returns
|
|
251
|
-
*/
|
|
252
|
-
getObsFromControlOrEncounter(targetControl, rawEncounter, uuid) {
|
|
253
|
-
const findObs = (obs, uuid) => {
|
|
254
|
-
let result;
|
|
255
|
-
obs?.some((o) => (result =
|
|
256
|
-
o?.concept?.uuid === uuid ? o : findObs(o.groupMembers || [], uuid)));
|
|
257
|
-
return result;
|
|
258
|
-
};
|
|
259
|
-
const obsValue = findObs(rawEncounter?.obs, uuid)?.value;
|
|
260
|
-
return !!targetControl
|
|
261
|
-
? targetControl
|
|
262
|
-
: typeof obsValue === 'object'
|
|
263
|
-
? obsValue.uuid
|
|
264
|
-
: !!obsValue
|
|
265
|
-
? obsValue
|
|
266
|
-
: null;
|
|
267
|
-
}
|
|
268
|
-
doesNotMatchExpression(regexString, val) {
|
|
269
|
-
if (!val || ['undefined', 'null', ''].includes(val.toString())) {
|
|
270
|
-
return true;
|
|
271
|
-
}
|
|
272
|
-
const pattern = new RegExp(regexString);
|
|
273
|
-
if (!pattern.test(val)) {
|
|
274
|
-
return true;
|
|
275
|
-
}
|
|
276
|
-
return false;
|
|
277
|
-
}
|
|
278
|
-
calcGravida(parityTerm, parityAbortion) {
|
|
279
|
-
let gravida = 0;
|
|
280
|
-
if (Number.isInteger(parityTerm)) {
|
|
281
|
-
gravida += parityTerm + 1;
|
|
282
|
-
}
|
|
283
|
-
if (Number.isInteger(parityAbortion)) {
|
|
284
|
-
gravida += parityAbortion + 1;
|
|
285
|
-
}
|
|
286
|
-
if (Number.isInteger(parityTerm) && Number.isInteger(parityAbortion)) {
|
|
287
|
-
gravida = parityTerm + parityAbortion + 1;
|
|
288
|
-
}
|
|
289
|
-
return gravida;
|
|
290
|
-
}
|
|
291
|
-
get helperFunctions() {
|
|
292
|
-
const helper = this;
|
|
293
|
-
return {
|
|
294
|
-
arrayContainsAny: helper.arrayContainsAny,
|
|
295
|
-
calcBMI: helper.calcBMI,
|
|
296
|
-
calcBMIForAgeZscore: helper.calcBMIForAgeZscore,
|
|
297
|
-
calcWeightForHeightZscore: helper.calcWeightForHeightZscore,
|
|
298
|
-
calcHeightForAgeZscore: helper.calcHeightForAgeZscore,
|
|
299
|
-
calcSouthEastAsiaNonLabCVDRisk: helper.calcSouthEastAsiaNonLabCVDRisk,
|
|
300
|
-
isEmpty: helper.isEmpty,
|
|
301
|
-
arrayContains: helper.arrayContains,
|
|
302
|
-
extractRepeatingGroupValues: helper.extractRepeatingGroupValues,
|
|
303
|
-
getObsFromControlOrEncounter: helper.getObsFromControlOrEncounter,
|
|
304
|
-
doesNotMatchExpression: helper.doesNotMatchExpression,
|
|
305
|
-
calcGravida: helper.calcGravida
|
|
306
|
-
};
|
|
307
|
-
}
|
|
308
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsExpressionHelper, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
309
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsExpressionHelper }); }
|
|
310
|
-
}
|
|
311
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: JsExpressionHelper, decorators: [{
|
|
312
|
-
type: Injectable
|
|
313
|
-
}] });
|
|
314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMtZXhwcmVzc2lvbi1oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZm9ybWVudHJ5L3NyYy9mb3JtLWVudHJ5L2hlbHBlcnMvanMtZXhwcmVzc2lvbi1oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFHbEUsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU07UUFDcEIsSUFBSSxDQUFDLENBQUM7UUFDTixJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNyQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pELENBQUM7SUFFRCxPQUFPLENBQUMsTUFBYyxFQUFFLE1BQWM7UUFDcEMsSUFBSSxNQUFNLENBQUM7UUFDWCxJQUFJLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNyQixNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFB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LENBQUM7UUFDcEIsT0FBTztZQUNMLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0I7WUFDekMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUI7WUFDL0MseUJBQXlCLEVBQUUsTUFBTSxDQUFDLHlCQUF5QjtZQUMzRCxzQkFBc0IsRUFBRSxNQUFNLENBQUMsc0JBQXNCO1lBQ3JELDhCQUE4QixFQUFFLE1BQU0sQ0FBQyw4QkFBOEI7WUFDckUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtZQUNuQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsMkJBQTJCO1lBQy9ELDRCQUE0QixFQUFFLE1BQU0sQ0FBQyw0QkFBNEI7WUFDakUsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLHNCQUFzQjtZQUNyRCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7U0FDaEMsQ0FBQztJQUNKLENBQUM7K0dBbldVLGtCQUFrQjttSEFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgc291dGhFYXN0QXNpYUN2ZFJpc2tUYWJsZXMgfSBmcm9tICcuL3Jpc2stZGF0YXNldC10YWJsZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKc0V4cHJlc3Npb25IZWxwZXIge1xuICBjYWxjQk1JKGhlaWdodCwgd2VpZ2h0KSB7XG4gICAgbGV0IHI7XG4gICAgaWYgKGhlaWdodCAmJiB3ZWlnaHQpIHtcbiAgICAgIHIgPSAod2VpZ2h0IC8gKCgoaGVpZ2h0IC8gMTAwKSAqIGhlaWdodCkgLyAxMDApKS50b0ZpeGVkKDEpO1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0ICYmIHdlaWdodCA/IHBhcnNlRmxvYXQocikgOiBudWxsO1xuICB9XG5cbiAgY2FsY0JTQShoZWlnaHQ6IG51bWJlciwgd2VpZ2h0OiBudW1iZXIpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChoZWlnaHQgJiYgd2VpZ2h0KSB7XG4gICAgICByZXN1bHQgPSBNYXRoLnNxcnQoKGhlaWdodCAqIHdlaWdodCkgLyAzNjAwKS50b0ZpeGVkKDIpO1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0ICYmIHdlaWdodCA/IHBhcnNlRmxvYXQocmVzdWx0KSA6IG51bGw7XG4gIH1cblxuICBjYWxjQk1JRm9yQWdlWnNjb3JlKGJtaUZvckFnZVJlZiwgaGVpZ2h0LCB3ZWlnaHQpIHtcbiAgICBsZXQgYm1pO1xuICAgIGNvbnN0IG1heEFnZUluRGF5cyA9IDE4NTY7XG4gICAgaWYgKGhlaWdodCAmJiB3ZWlnaHQpIHtcbiAgICAgIGJtaSA9ICh3ZWlnaHQgLyAoKChoZWlnaHQgLyAxMDApICogaGVpZ2h0KSAvIDEwMCkpLnRvRml4ZWQoMSk7XG4gICAgfVxuICAgIGNvbnN0IHJlZlNlY3Rpb25PYmplY3QgPSBfLmZpcnN0KGJtaUZvckFnZVJlZik7XG4gICAgbGV0IGZvcm1hdHRlZFNEVmFsdWU7XG4gICAgaWYgKHJlZlNlY3Rpb25PYmplY3QpIHtcbiAgICAgIGNvbnN0IHJlZk9iamVjdFZhbHVlcyA9IE9iamVjdC5rZXlzKHJlZlNlY3Rpb25PYmplY3QpXG4gICAgICAgIC5tYXAoKGtleSkgPT4gcmVmU2VjdGlvbk9iamVjdFtrZXldKVxuICAgICAgICAubWFwKCh4KSA9PiB4KTtcbiAgICAgIGNvbnN0IHJlZk9iamVjdEtleXMgPSBPYmplY3Qua2V5cyhyZWZTZWN0aW9uT2JqZWN0KTtcbiAgICAgIGNvbnN0IG1pbmltdW1WYWx1ZSA9IHJlZk9iamVjdFZhbHVlc1sxXTtcbiAgICAgIGNvbnN0IG1pblJlZmVyZW5jZVBvaW50ID0gW107XG4gICAgICBpZiAoYm1pIDwgbWluaW11bVZhbHVlKSB7XG4gICAgICAgIG1pblJlZmVyZW5jZVBvaW50LnB1c2gobWluaW11bVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF8uZm9yRWFjaChyZWZPYmplY3RWYWx1ZXMsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh2YWx1ZSA8PSBibWkpIHtcbiAgICAgICAgICAgIG1pblJlZmVyZW5jZVBvaW50LnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsYXN0UmVmZXJlbmNlVmFsdWUgPSBfLmxhc3QobWluUmVmZXJlbmNlUG9pbnQpO1xuICAgICAgY29uc3QgbGFzdFZhbHVlSW5kZXggPSBfLmZpbmRJbmRleChyZWZPYmplY3RWYWx1ZXMsIChvKSA9PiB7XG4gICAgICAgIHJldHVybiBvID09PSBsYXN0UmVmZXJlbmNlVmFsdWU7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IFNEVmFsdWUgPSByZWZPYmplY3RLZXlzW2xhc3RWYWx1ZUluZGV4XTtcbiAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSBTRFZhbHVlLnJlcGxhY2UoJ1NEJywgJycpO1xuICAgICAgaWYgKGZvcm1hdHRlZFNEVmFsdWUuaW5jbHVkZXMoJ25lZycpKSB7XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSBmb3JtYXR0ZWRTRFZhbHVlLnN1YnN0cmluZygxLCAwKTtcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9ICctJyArIGZvcm1hdHRlZFNEVmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJ1MnIHx8XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPT09ICdMJyB8fFxuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID09PSAnTScgfHxcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJy01J1xuICAgICAgKSB7XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSAnLTQnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBibWkgJiYgcmVmU2VjdGlvbk9iamVjdCA/IGZvcm1hdHRlZFNEVmFsdWUgOiBudWxsO1xuICB9XG4gIGNhbGNXZWlnaHRGb3JIZWlnaHRac2NvcmUod2VpZ2h0Rm9ySGVpZ2h0UmVmLCBoZWlnaHQsIHdlaWdodCkge1xuICAgIGxldCByZWZTZWN0aW9uO1xuICAgIGxldCBmb3JtYXR0ZWRTRFZhbHVlO1xuICAgIGlmIChoZWlnaHQgJiYgd2VpZ2h0KSB7XG4gICAgICBoZWlnaHQgPSBwYXJzZUZsb2F0KGhlaWdodCkudG9GaXhlZCgxKTtcbiAgICB9XG4gICAgY29uc3Qgc3RhbmRhcmRIZWlnaHRNaW4gPSA0NTtcbiAgICBjb25zdCBzdGFuZGFyZE1heEhlaWdodCA9IDExMDtcbiAgICBpZiAoaGVpZ2h0IDwgc3RhbmRhcmRIZWlnaHRNaW4gfHwgaGVpZ2h0ID4gc3RhbmRhcmRNYXhIZWlnaHQpIHtcbiAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSAtNDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmU2VjdGlvbiA9IF8uZmlsdGVyKHdlaWdodEZvckhlaWdodFJlZiwgKHJlZk9iamVjdCkgPT4ge1xuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChyZWZPYmplY3RbJ0xlbmd0aCddKS50b0ZpeGVkKDEpID09PSBoZWlnaHQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZWZTZWN0aW9uT2JqZWN0ID0gXy5maXJzdChyZWZTZWN0aW9uKTtcbiAgICBpZiAocmVmU2VjdGlvbk9iamVjdCkge1xuICAgICAgY29uc3QgcmVmT2JqZWN0VmFsdWVzID0gT2JqZWN0LmtleXMocmVmU2VjdGlvbk9iamVjdClcbiAgICAgICAgLm1hcCgoa2V5KSA9PiByZWZTZWN0aW9uT2JqZWN0W2tleV0pXG4gICAgICAgIC5tYXAoKHgpID0+IHgpO1xuICAgICAgY29uc3QgcmVmT2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzKHJlZlNlY3Rpb25PYmplY3QpO1xuICAgICAgY29uc3QgbWluaW11bVZhbHVlID0gcmVmT2JqZWN0VmFsdWVzWzFdO1xuICAgICAgY29uc3QgbWluUmVmZXJlbmNlUG9pbnQgPSBbXTtcbiAgICAgIGlmICh3ZWlnaHQgPCBtaW5pbXVtVmFsdWUpIHtcbiAgICAgICAgbWluUmVmZXJlbmNlUG9pbnQucHVzaChtaW5pbXVtVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgXy5mb3JFYWNoKHJlZk9iamVjdFZhbHVlcywgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHZhbHVlIDw9IHdlaWdodCkge1xuICAgICAgICAgICAgbWluUmVmZXJlbmNlUG9pbnQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhc3RSZWZlcmVuY2VWYWx1ZSA9IF8ubGFzdChtaW5SZWZlcmVuY2VQb2ludCk7XG4gICAgICBjb25zdCBsYXN0VmFsdWVJbmRleCA9IF8uZmluZEluZGV4KHJlZk9iamVjdFZhbHVlcywgKG8pID0+IHtcbiAgICAgICAgcmV0dXJuIG8gPT09IGxhc3RSZWZlcmVuY2VWYWx1ZTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgU0RWYWx1ZSA9IHJlZk9iamVjdEtleXNbbGFzdFZhbHVlSW5kZXhdO1xuICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9IFNEVmFsdWUucmVwbGFjZSgnU0QnLCAnJyk7XG4gICAgICBpZiAoZm9ybWF0dGVkU0RWYWx1ZS5pbmNsdWRlcygnbmVnJykpIHtcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9IGZvcm1hdHRlZFNEVmFsdWUuc3Vic3RyaW5nKDEsIDApO1xuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID0gJy0nICsgZm9ybWF0dGVkU0RWYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJ1MnIHx8XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPT09ICdMJyB8fFxuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID09PSAnTScgfHxcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJy01J1xuICAgICAgKSB7XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSAnLTQnO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoZWlnaHQgJiYgd2VpZ2h0ID8gZm9ybWF0dGVkU0RWYWx1ZSA6IG51bGw7XG4gIH1cblxuICBjYWxjSGVpZ2h0Rm9yQWdlWnNjb3JlKGhlaWdodEZvckFnZVJlZiwgaGVpZ2h0LCB3ZWlnaHQpIHtcbiAgICBjb25zdCByZWZTZWN0aW9uT2JqZWN0ID0gXy5maXJzdChoZWlnaHRGb3JBZ2VSZWYpO1xuICAgIGxldCBmb3JtYXR0ZWRTRFZhbHVlO1xuICAgIGlmIChyZWZTZWN0aW9uT2JqZWN0KSB7XG4gICAgICBjb25zdCByZWZPYmplY3RWYWx1ZXMgPSBPYmplY3Qua2V5cyhyZWZTZWN0aW9uT2JqZWN0KVxuICAgICAgICAubWFwKChrZXkpID0+IHJlZlNlY3Rpb25PYmplY3Rba2V5XSlcbiAgICAgICAgLm1hcCgoeCkgPT4geCk7XG4gICAgICBjb25zdCByZWZPYmplY3RLZXlzID0gT2JqZWN0LmtleXMocmVmU2VjdGlvbk9iamVjdCk7XG4gICAgICBjb25zdCBtaW5pbXVtVmFsdWUgPSByZWZPYmplY3RWYWx1ZXNbMV07XG4gICAgICBjb25zdCBtaW5SZWZlcmVuY2VQb2ludCA9IFtdO1xuICAgICAgaWYgKGhlaWdodCA8IG1pbmltdW1WYWx1ZSkge1xuICAgICAgICBtaW5SZWZlcmVuY2VQb2ludC5wdXNoKG1pbmltdW1WYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfLmZvckVhY2gocmVmT2JqZWN0VmFsdWVzLCAodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodmFsdWUgPD0gaGVpZ2h0KSB7XG4gICAgICAgICAgICBtaW5SZWZlcmVuY2VQb2ludC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdFJlZmVyZW5jZVZhbHVlID0gXy5sYXN0KG1pblJlZmVyZW5jZVBvaW50KTtcbiAgICAgIGNvbnN0IGxhc3RWYWx1ZUluZGV4ID0gXy5maW5kSW5kZXgocmVmT2JqZWN0VmFsdWVzLCAobykgPT4ge1xuICAgICAgICByZXR1cm4gbyA9PT0gbGFzdFJlZmVyZW5jZVZhbHVlO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBTRFZhbHVlID0gcmVmT2JqZWN0S2V5c1tsYXN0VmFsdWVJbmRleF07XG4gICAgICBmb3JtYXR0ZWRTRFZhbHVlID0gU0RWYWx1ZS5yZXBsYWNlKCdTRCcsICcnKTtcbiAgICAgIGlmIChmb3JtYXR0ZWRTRFZhbHVlLmluY2x1ZGVzKCduZWcnKSkge1xuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID0gZm9ybWF0dGVkU0RWYWx1ZS5zdWJzdHJpbmcoMSwgMCk7XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPSAnLScgKyBmb3JtYXR0ZWRTRFZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPT09ICdTJyB8fFxuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID09PSAnTCcgfHxcbiAgICAgICAgZm9ybWF0dGVkU0RWYWx1ZSA9PT0gJ00nIHx8XG4gICAgICAgIGZvcm1hdHRlZFNEVmFsdWUgPT09ICctNSdcbiAgICAgICkge1xuICAgICAgICBmb3JtYXR0ZWRTRFZhbHVlID0gJy00JztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaGVpZ2h0ICYmIHdlaWdodCAmJiByZWZTZWN0aW9uT2JqZWN0ID8gZm9ybWF0dGVkU0RWYWx1ZSA6IG51bGw7XG4gIH1cblxuICBjYWxjU291dGhFYXN0QXNpYU5vbkxhYkNWRFJpc2soXG4gICAgc2V4OiAnTScgfCAnRicsXG4gICAgc21va2VyPzogYm9vbGVhbixcbiAgICBhZ2U/OiBudW1iZXIsXG4gICAgc2JwPzogbnVtYmVyLFxuICAgIGJtaT86IG51bWJlclxuICApIHtcbiAgICBjb25zdCBoYXNWYWxpZFZhbHVlcyA9XG4gICAgICB0eXBlb2Ygc2V4ID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIHNtb2tlciA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgICB0eXBlb2YgYWdlID09PSAnbnVtYmVyJyAmJlxuICAgICAgdHlwZW9mIHNicCA9PT0gJ251bWJlcicgJiZcbiAgICAgIHR5cGVvZiBibWkgPT09ICdudW1iZXInO1xuXG4gICAgaWYgKCFoYXNWYWxpZFZhbHVlcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIEJpbiBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRBZ2VCaW4gPSAoYWdlKSA9PlxuICAgICAgTWF0aC5mbG9vcigoTWF0aC5taW4oTWF0aC5tYXgoNDAsIGFnZSksIDc0KSAtIDQwKSAvIDUpO1xuICAgIGNvbnN0IGdldFNicEJpbiA9IChzYnApID0+XG4gICAgICBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChNYXRoLm1pbihzYnAsIDE4MCkgLSAxMjApIC8gMjApICsgMSk7XG4gICAgY29uc3QgZ2V0Qm1pQmluID0gKGJtaSkgPT5cbiAgICAgIE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKE1hdGgubWluKGJtaSwgMzUpIC0gMjApIC8gNSkgKyAxKTtcblxuICAgIC8vIFZhcmlhYmxlc1xuICAgIGNvbnN0IHNleElkeCA9IHNleCA9PT0gJ00nID8gMCA6IDE7XG4gICAgY29uc3Qgc21va2VySWR4ID0gc21va2VyID8gMSA6IDA7XG4gICAgY29uc3QgYWdlSWR4ID0gNiAtIGdldEFnZUJpbihhZ2UpO1xuICAgIGNvbnN0IGJtaUlkeCA9IGdldEJtaUJpbihibWkpO1xuICAgIGNvbnN0IHNicElkeCA9IDQgLSBnZXRTYnBCaW4oc2JwKTtcblxuICAgIHJldHVybiBzb3V0aEVhc3RBc2lhQ3ZkUmlza1RhYmxlc1tzZXhJZHhdW3Ntb2tlcklkeF1bYWdlSWR4XVtzYnBJZHhdW1xuICAgICAgYm1pSWR4XG4gICAgXTtcbiAgfVxuXG4gIGlzRW1wdHkodmFsKSB7XG4gICAgaWYgKFxuICAgICAgdmFsID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHZhbCA9PT0gbnVsbCB8fFxuICAgICAgdmFsID09PSAnJyB8fFxuICAgICAgdmFsID09PSAnbnVsbCcgfHxcbiAgICAgIHZhbCA9PT0gJ3VuZGVmaW5lZCdcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgdmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFycmF5Q29udGFpbnMoYXJyYXksIG1lbWJlcnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZW1iZXJzKSkge1xuICAgICAgaWYgKG1lbWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBsZXQgY29udGFpbnMgPSB0cnVlO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsID0gbWVtYmVyc1tpXTtcbiAgICAgICAgaWYgKGFycmF5LmluZGV4T2YodmFsKSA9PT0gLTEpIHtcbiAgICAgICAgICBjb250YWlucyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb250YWlucztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFycmF5LmluZGV4T2YobWVtYmVycykgIT09IC0xO1xuICAgIH1cbiAgfVxuICBleHRyYWN0UmVwZWF0aW5nR3JvdXBWYWx1ZXMoa2V5LCBhcnJheSkge1xuICAgIGNvbnN0IHZhbHVlcyA9IGFycmF5Lm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuIGl0ZW1ba2V5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9XG4gIGZvcm1hdERhdGUodmFsdWUsIGZvcm1hdCwgb2Zmc2V0KSB7XG4gICAgZm9ybWF0ID0gZm9ybWF0IHx8ICd5eXl5LU1NLWRkJztcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgJyswMzAwJztcblxuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdEYXRlRm9ybWF0RXhjZXB0aW9uOiB2YWx1ZSBwYXNzZWQgJyArICdpcyBub3QgYSB2YWxpZCBkYXRlJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTsgLy8gVE9ETyBpbXBsZW1lbnQgdGhpc1xuICAgIC8vIHJldHVybiAkZmlsdGVyKCdkYXRlJykodmFsdWUsIGZvcm1hdCwgb2Zmc2V0KTtcbiAgfVxuXG4gIGFycmF5Q29udGFpbnNBbnkoYXJyYXksIG1lbWJlcnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZW1iZXJzKSkge1xuICAgICAgaWYgKG1lbWJlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgbGV0IGNvbnRhaW5zID0gZmFsc2U7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB2YWwgPSBtZW1iZXJzW2ldO1xuICAgICAgICBpZiAoYXJyYXkuaW5kZXhPZih2YWwpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnRhaW5zID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRhaW5zO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXJyYXkuaW5kZXhPZihtZW1iZXJzKSAhPT0gLTE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgdGFyZ2V0IGNvbnRyb2wsIGFuIGVuY291bnRlciBhbmQgY29uY2VwdCB1dWlkLiBJZiB0aGUgdGFyZ2V0IGNvbnRyb2wgaGFzIGEgdmFsdWUgaXQgcmV0dXJucyBpdFxuICAgKiBvdGhlcndpc2UgaXQgdHJpZXMgdG8gZmluZCBpdCBpbiB0aGUgZW5jb3VudGVyLiBGaW5hbGx5IGl0IHJldHVybnMgbnVsbCBvZiBpdCBjYW4ndCBmaW5kIGVpdGhlciBvZiB0aGVtLlxuICAgKiBAcGFyYW0gdGFyZ2V0Q29udHJvbFxuICAgKiBAcGFyYW0gcmF3RW5jb3VudGVyXG4gICAqIEBwYXJhbSB1dWlkXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRPYnNGcm9tQ29udHJvbE9yRW5jb3VudGVyKHRhcmdldENvbnRyb2wsIHJhd0VuY291bnRlciwgdXVpZCk6IGFueSB7XG4gICAgY29uc3QgZmluZE9icyA9IChvYnMsIHV1aWQpID0+IHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBvYnM/LnNvbWUoXG4gICAgICAgIChvKSA9PlxuICAgICAgICAgIChyZXN1bHQgPVxuICAgICAgICAgICAgbz8uY29uY2VwdD8udXVpZCA9PT0gdXVpZCA/IG8gOiBmaW5kT2JzKG8uZ3JvdXBNZW1iZXJzIHx8IFtdLCB1dWlkKSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgY29uc3Qgb2JzVmFsdWUgPSBmaW5kT2JzKHJhd0VuY291bnRlcj8ub2JzLCB1dWlkKT8udmFsdWU7XG4gICAgcmV0dXJuICEhdGFyZ2V0Q29udHJvbFxuICAgICAgPyB0YXJnZXRDb250cm9sXG4gICAgICA6IHR5cGVvZiBvYnNWYWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgID8gb2JzVmFsdWUudXVpZFxuICAgICAgOiAhIW9ic1ZhbHVlXG4gICAgICA/IG9ic1ZhbHVlXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBkb2VzTm90TWF0Y2hFeHByZXNzaW9uKFxuICAgIHJlZ2V4U3RyaW5nOiBzdHJpbmcsXG4gICAgdmFsOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdmFsIHx8IFsndW5kZWZpbmVkJywgJ251bGwnLCAnJ10uaW5jbHVkZXModmFsLnRvU3RyaW5nKCkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAocmVnZXhTdHJpbmcpO1xuICAgIGlmICghcGF0dGVybi50ZXN0KHZhbCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjYWxjR3JhdmlkYShwYXJpdHlUZXJtLCBwYXJpdHlBYm9ydGlvbikge1xuICAgIGxldCBncmF2aWRhID0gMDtcblxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHBhcml0eVRlcm0pKSB7XG4gICAgICBncmF2aWRhICs9IHBhcml0eVRlcm0gKyAxO1xuICAgIH1cblxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKHBhcml0eUFib3J0aW9uKSkge1xuICAgICAgZ3JhdmlkYSArPSBwYXJpdHlBYm9ydGlvbiArIDE7XG4gICAgfVxuXG4gICAgaWYgKE51bWJlci5pc0ludGVnZXIocGFyaXR5VGVybSkgJiYgTnVtYmVyLmlzSW50ZWdlcihwYXJpdHlBYm9ydGlvbikpIHtcbiAgICAgIGdyYXZpZGEgPSBwYXJpdHlUZXJtICsgcGFyaXR5QWJvcnRpb24gKyAxO1xuICAgIH1cblxuICAgIHJldHVybiBncmF2aWRhO1xuICB9XG5cbiAgZ2V0IGhlbHBlckZ1bmN0aW9ucygpIHtcbiAgICBjb25zdCBoZWxwZXIgPSB0aGlzO1xuICAgIHJldHVybiB7XG4gICAgICBhcnJheUNvbnRhaW5zQW55OiBoZWxwZXIuYXJyYXlDb250YWluc0FueSxcbiAgICAgIGNhbGNCTUk6IGhlbHBlci5jYWxjQk1JLFxuICAgICAgY2FsY0JNSUZvckFnZVpzY29yZTogaGVscGVyLmNhbGNCTUlGb3JBZ2Vac2NvcmUsXG4gICAgICBjYWxjV2VpZ2h0Rm9ySGVpZ2h0WnNjb3JlOiBoZWxwZXIuY2FsY1dlaWdodEZvckhlaWdodFpzY29yZSxcbiAgICAgIGNhbGNIZWlnaHRGb3JBZ2Vac2NvcmU6IGhlbHBlci5jYWxjSGVpZ2h0Rm9yQWdlWnNjb3JlLFxuICAgICAgY2FsY1NvdXRoRWFzdEFzaWFOb25MYWJDVkRSaXNrOiBoZWxwZXIuY2FsY1NvdXRoRWFzdEFzaWFOb25MYWJDVkRSaXNrLFxuICAgICAgaXNFbXB0eTogaGVscGVyLmlzRW1wdHksXG4gICAgICBhcnJheUNvbnRhaW5zOiBoZWxwZXIuYXJyYXlDb250YWlucyxcbiAgICAgIGV4dHJhY3RSZXBlYXRpbmdHcm91cFZhbHVlczogaGVscGVyLmV4dHJhY3RSZXBlYXRpbmdHcm91cFZhbHVlcyxcbiAgICAgIGdldE9ic0Zyb21Db250cm9sT3JFbmNvdW50ZXI6IGhlbHBlci5nZXRPYnNGcm9tQ29udHJvbE9yRW5jb3VudGVyLFxuICAgICAgZG9lc05vdE1hdGNoRXhwcmVzc2lvbjogaGVscGVyLmRvZXNOb3RNYXRjaEV4cHJlc3Npb24sXG4gICAgICBjYWxjR3JhdmlkYTogaGVscGVyLmNhbGNHcmF2aWRhXG4gICAgfTtcbiAgfVxufVxuIl19
|