@rangertechnologies/ngnxt 2.1.68 → 2.1.69

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.
@@ -39,94 +39,110 @@ export class CustomDropdownComponent {
39
39
  valueField;
40
40
  subscription;
41
41
  apiObj;
42
+ uniqueKey;
42
43
  ngOnInit() {
44
+ }
45
+ getOptions() {
46
+ console.log('test click');
43
47
  // console.log('inside oninit of custom-dropdown of ' + this.id);
44
48
  // console.log(this.apiMeta);
45
49
  //VD 07Aug24 - isDependentField change
50
+ // VD 25Oct24 - changes
46
51
  this.placeholder = this.placeholder ? this.placeholder : '---Select option---';
47
- if (this.apiMeta !== undefined) {
48
- this.apiObj = JSON.parse(this.apiMeta);
49
- if (!this.apiObj.isDependentField) {
50
- this.options = [];
51
- this.labelField = this.apiObj.field;
52
- // VD 09Sep24- setup the query param for api call
53
- let fullEndPoint;
54
- if (this.apiObj.endpoint) {
55
- if (this.apiObj.queryValueReference && this.apiObj.queryField) {
56
- // process the end point with query param
57
- let queryReferences = this.apiObj.queryValueReference.split(',');
58
- let queryParams = [];
59
- // Iterate over queryReferences and find the corresponding element in referenceData
60
- queryReferences.forEach(reference => {
61
- // Find the element in referenceData that matches the current reference
62
- let matchingElement = this.question?.referenceQueryData.find(element => element.Reference_Field__c === reference);
63
- // If a matching element is found, get its input value and create a query parameter
64
- if (matchingElement) {
65
- queryParams.push(`${reference}=${matchingElement.input}`);
66
- }
67
- });
68
- fullEndPoint = this.apiObj.endpoint + '?' + queryParams.join('&');
69
- console.log(fullEndPoint);
70
- }
71
- else {
72
- // if no query param get the actual endPoint
73
- fullEndPoint = this.apiObj.endpoint;
74
- }
75
- // VD 19JAN24 - added one more param for authentication
76
- this.dataService.apiResponse(fullEndPoint)?.subscribe((apiResponse) => {
77
- // HA 18-JAN-24 Assigned apiresponse directly if we have the response in array also
78
- // VD 19JAN24 - if response has key with value(which is array)
79
- let responses;
80
- if (this.apiObj.variable) {
81
- // VD 21May24 - handling multiple child objects
82
- // VD 22May24 - used common service file
83
- responses = this.dataService.getValue(apiResponse, this.apiObj.variable);
84
- let results = [];
85
- // HA 19JAN24 To avoid undefined error in console
86
- for (let i = 0; i < responses?.length; i++) {
87
- var resp = responses[i];
88
- results.push(resp);
89
- }
90
- this.options = results;
52
+ const cachedOptions = localStorage.getItem(this.uniqueKey);
53
+ if (cachedOptions) {
54
+ this.options = JSON.parse(cachedOptions);
55
+ }
56
+ else {
57
+ if (this.apiMeta !== undefined) {
58
+ this.apiObj = JSON.parse(this.apiMeta);
59
+ if (!this.apiObj.isDependentField) {
60
+ this.options = [];
61
+ this.labelField = this.apiObj.field;
62
+ // VD 09Sep24- setup the query param for api call
63
+ let fullEndPoint;
64
+ if (this.apiObj.endpoint) {
65
+ if (this.apiObj.queryValueReference && this.apiObj.queryField) {
66
+ // process the end point with query param
67
+ let queryReferences = this.apiObj.queryValueReference.split(',');
68
+ let queryParams = [];
69
+ // Iterate over queryReferences and find the corresponding element in referenceData
70
+ queryReferences.forEach(reference => {
71
+ // Find the element in referenceData that matches the current reference
72
+ let matchingElement = this.question?.referenceQueryData.find(element => element.Reference_Field__c === reference);
73
+ // If a matching element is found, get its input value and create a query parameter
74
+ if (matchingElement) {
75
+ queryParams.push(`${reference}=${matchingElement.input}`);
76
+ }
77
+ });
78
+ fullEndPoint = this.apiObj.endpoint + '?' + queryParams.join('&');
79
+ console.log(fullEndPoint);
91
80
  }
92
- else { // VD 19JAN24 - if response has value(which is array) only
93
- responses = apiResponse;
94
- this.options = responses;
81
+ else {
82
+ // if no query param get the actual endPoint
83
+ fullEndPoint = this.apiObj.endpoint;
95
84
  }
96
- // Reference https://www.npmjs.com/package/@ng-select/ng-select
97
- });
98
- }
99
- }
100
- // VD NOV23 - handle the dependent update for dropdown
101
- // // VD 09Sep24- push the dependent field values for dropdown
102
- let sourceId = this.apiObj.sourceQuestionId;
103
- if (sourceId && this.apiObj.variable || this.apiObj.valueField) {
104
- // Subscribe for the changes
105
- this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
106
- if (changeValue != undefined) {
107
- // console.log('inside subscription for the change');
108
- if (changeValue.valueObj != undefined && changeValue.fromQuestionId == this.apiObj.sourceQuestionId) {
109
- // this.selectedValue = changeValue.valueObj[this.apiObj.valueField];
110
- // let value ={};
111
- // value['name'] = this.selectedValue;
85
+ // VD 19JAN24 - added one more param for authentication
86
+ this.dataService.apiResponse(fullEndPoint)?.subscribe((apiResponse) => {
87
+ // HA 18-JAN-24 Assigned apiresponse directly if we have the response in array also
88
+ // VD 19JAN24 - if response has key with value(which is array)
89
+ this.uniqueKey = apiResponse[this.apiObj.uniqueKey];
112
90
  let responses;
113
91
  if (this.apiObj.variable) {
114
- responses = this.dataService.getValue(changeValue.valueObj, this.apiObj.variable);
92
+ // VD 21May24 - handling multiple child objects
93
+ // VD 22May24 - used common service file
94
+ responses = this.dataService.getValue(apiResponse, this.apiObj.variable);
115
95
  let results = [];
96
+ // HA 19JAN24 To avoid undefined error in console
116
97
  for (let i = 0; i < responses?.length; i++) {
117
98
  var resp = responses[i];
118
99
  results.push(resp);
119
100
  }
120
101
  this.options = results;
121
102
  }
122
- else {
123
- responses = changeValue.valueObj;
103
+ else { // VD 19JAN24 - if response has value(which is array) only
104
+ responses = apiResponse;
124
105
  this.options = responses;
125
106
  }
126
- }
127
- this.changeService.confirmChange(this.apiObj.sourceQuestionId);
107
+ // VD 25Oct24 - Store fetched options in local storage
108
+ if (this.uniqueKey) {
109
+ localStorage.setItem(this.uniqueKey, JSON.stringify(this.options));
110
+ }
111
+ // Reference https://www.npmjs.com/package/@ng-select/ng-select
112
+ });
128
113
  }
129
- });
114
+ }
115
+ // VD NOV23 - handle the dependent update for dropdown
116
+ // // VD 09Sep24- push the dependent field values for dropdown
117
+ let sourceId = this.apiObj.sourceQuestionId;
118
+ if (sourceId && this.apiObj.variable || this.apiObj.valueField) {
119
+ // Subscribe for the changes
120
+ this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
121
+ if (changeValue != undefined) {
122
+ // console.log('inside subscription for the change');
123
+ if (changeValue.valueObj != undefined && changeValue.fromQuestionId == this.apiObj.sourceQuestionId) {
124
+ // this.selectedValue = changeValue.valueObj[this.apiObj.valueField];
125
+ // let value ={};
126
+ // value['name'] = this.selectedValue;
127
+ let responses;
128
+ if (this.apiObj.variable) {
129
+ responses = this.dataService.getValue(changeValue.valueObj, this.apiObj.variable);
130
+ let results = [];
131
+ for (let i = 0; i < responses?.length; i++) {
132
+ var resp = responses[i];
133
+ results.push(resp);
134
+ }
135
+ this.options = results;
136
+ }
137
+ else {
138
+ responses = changeValue.valueObj;
139
+ this.options = responses;
140
+ }
141
+ }
142
+ this.changeService.confirmChange(this.apiObj.sourceQuestionId);
143
+ }
144
+ });
145
+ }
130
146
  }
131
147
  }
132
148
  }
@@ -146,11 +162,11 @@ export class CustomDropdownComponent {
146
162
  }
147
163
  }
148
164
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CustomDropdownComponent, deps: [{ token: i1.ChangeService }, { token: i2.DataService }, { token: i3.I18nService }], target: i0.ɵɵFactoryTarget.Component });
149
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CustomDropdownComponent, selector: "app-custom-dropdown", inputs: { options: "options", placeholder: "placeholder", apiMeta: "apiMeta", selectedValue: "selectedValue", progressBar: "progressBar", id: "id", readOnly: "readOnly", errorMessage: "errorMessage", error: "error", fromShengel: "fromShengel", question: "question", referenceField: "referenceField", token: "token" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.Value__c\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.Value__c }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option *ngFor=\"let option of options\" [value]=\"apiObj !== undefined && !apiObj.isDependentField ? option : option.Value__c\">{{ apiObj !== undefined && !apiObj.isDependentField ? option[labelField] : option.Value__c }}</ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.NgSelectComponent, selector: "ng-select", inputs: ["markFirst", "dropdownPosition", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "bufferAmount", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "readonly", "searchWhileComposing", "minTermLength", "keyDownFn", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "bindLabel", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "virtualScroll", "openOnEnter", "appendTo", "bindValue", "appearance", "maxSelectedItems", "groupBy", "groupValue", "tabIndex", "typeahead"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "component", type: i6.ɵr, selector: "ng-option", inputs: ["disabled", "value"] }] });
165
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CustomDropdownComponent, selector: "app-custom-dropdown", inputs: { options: "options", placeholder: "placeholder", apiMeta: "apiMeta", selectedValue: "selectedValue", progressBar: "progressBar", id: "id", readOnly: "readOnly", errorMessage: "errorMessage", error: "error", fromShengel: "fromShengel", question: "question", referenceField: "referenceField", token: "token" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.Value__c\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.Value__c }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<!-- VD 25Oct24 - changes-->\n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (click) = \"getOptions()\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option *ngFor=\"let option of options\" [value]=\"apiObj !== undefined && !apiObj.isDependentField ? option : option.Value__c\">{{ apiObj !== undefined && !apiObj.isDependentField ? option[labelField] : option.Value__c }}</ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.NgSelectComponent, selector: "ng-select", inputs: ["markFirst", "dropdownPosition", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "bufferAmount", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "readonly", "searchWhileComposing", "minTermLength", "keyDownFn", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "bindLabel", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "virtualScroll", "openOnEnter", "appendTo", "bindValue", "appearance", "maxSelectedItems", "groupBy", "groupValue", "tabIndex", "typeahead"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "component", type: i6.ɵr, selector: "ng-option", inputs: ["disabled", "value"] }] });
150
166
  }
151
167
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CustomDropdownComponent, decorators: [{
152
168
  type: Component,
153
- args: [{ selector: 'app-custom-dropdown', template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.Value__c\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.Value__c }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option *ngFor=\"let option of options\" [value]=\"apiObj !== undefined && !apiObj.isDependentField ? option : option.Value__c\">{{ apiObj !== undefined && !apiObj.isDependentField ? option[labelField] : option.Value__c }}</ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"] }]
169
+ args: [{ selector: 'app-custom-dropdown', template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.Value__c\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.Value__c }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<!-- VD 25Oct24 - changes-->\n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (click) = \"getOptions()\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option *ngFor=\"let option of options\" [value]=\"apiObj !== undefined && !apiObj.isDependentField ? option : option.Value__c\">{{ apiObj !== undefined && !apiObj.isDependentField ? option[labelField] : option.Value__c }}</ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"] }]
154
170
  }], ctorParameters: function () { return [{ type: i1.ChangeService }, { type: i2.DataService }, { type: i3.I18nService }]; }, propDecorators: { options: [{
155
171
  type: Input
156
172
  }], placeholder: [{
@@ -180,4 +196,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
180
196
  }], valueChange: [{
181
197
  type: Output
182
198
  }] } });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2N1c3RvbS1kcm9wZG93bi9jdXN0b20tZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLWRyb3Bkb3duL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFTLEtBQUssRUFBQyxNQUFNLEVBQUMsWUFBWSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBR3RGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7QUFZMUQsTUFBTSxPQUFPLHVCQUF1QjtJQWlCeEI7SUFDQTtJQUNEO0lBbEJBLE9BQU8sQ0FBVztJQUNsQixXQUFXLENBQVM7SUFDcEIsT0FBTyxDQUFTO0lBQ2hCLGFBQWEsQ0FBUztJQUN0QixXQUFXLENBQVU7SUFDckIsRUFBRSxDQUFRO0lBQ1YsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLCtCQUErQjtJQUNqRCxZQUFZLENBQVM7SUFDckIsS0FBSyxDQUFLO0lBQ1YsV0FBVyxHQUFZLEtBQUssQ0FBQztJQUM3QixRQUFRLENBQUs7SUFDYixjQUFjLENBQVE7SUFDdEIsS0FBSyxDQUFRLENBQUksc0NBQXNDO0lBQ3RELFdBQVcsR0FBZ0MsSUFBSSxZQUFZLEVBQWlCLENBQUM7SUFDdkYsZUFBZSxHQUFZLEVBQUUsQ0FBQztJQUM5QixZQUNVLGFBQTRCLEVBQzVCLFdBQXdCLEVBQ3pCLFdBQXdCO1FBRnZCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFh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QyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIseURBQXlEO1FBQ3pELElBQUcsS0FBSyxFQUFDO1lBQ1AsSUFBSSxDQUFDLGVBQWUsR0FBRSxFQUFFLENBQUM7U0FDMUI7SUFDSCxDQUFDO3dHQXpJVSx1QkFBdUI7NEZBQXZCLHVCQUF1QixrYUNmcEMsbWtEQTJCQTs7NEZEWmEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHFCQUFxQjt3SkFLdEIsT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LElucHV0LE91dHB1dCxFdmVudEVtaXR0ZXIsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFQSU1ldGEgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2FwaW1ldGEnO1xuaW1wb3J0IHsgQ2hhbmdlV3JhcHBlciB9IGZyb20gJy4uLy4uL21vZGVsL2NoYW5nZVdyYXBwZXInO1xuaW1wb3J0IHsgQ2hhbmdlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NoYW5nZS5zZXJ2aWNlJztcbi8vIEhBIDE5REVDMjMgaW1wb3J0ZWQgdHJhbnNsYXRpb24gc2VydmljZVxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi9pMThuLnNlcnZpY2UnO1xuLy8gVkQgMjNKQU4yNCB1c2VkIHNlcnZpY2UgZmlsZSBmb3IgY2FsbG91dFxuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kYXRhLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY3VzdG9tLWRyb3Bkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ3VzdG9tRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBvcHRpb25zOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgYXBpTWV0YTogc3RyaW5nO1xuICBASW5wdXQoKSBzZWxlY3RlZFZhbHVlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHByb2dyZXNzQmFyOiBib29sZWFuO1xuICBASW5wdXQoKSBpZDpzdHJpbmc7XG4gIEBJbnB1dCgpIHJlYWRPbmx5ID0gZmFsc2U7IC8vIFZEIDEySnVuMjQgLSByZWFkb25seSBjaGFuZ2VcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGVycm9yOmFueTtcbiAgQElucHV0KCkgZnJvbVNoZW5nZWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcXVlc3Rpb246YW55O1xuICBASW5wdXQoKSByZWZlcmVuY2VGaWVsZDpzdHJpbmc7XG4gIEBJbnB1dCgpIHRva2VuOnN0cmluZzsgICAgLy8gVkQgMTlKQU4yNCAtIGdldHRpbmcgdG9rZW4gYXMgaW5wdXRcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Q2hhbmdlV3JhcHBlcj4gPSBuZXcgRXZlbnRFbWl0dGVyPENoYW5nZVdyYXBwZXI+KCk7XG4gIGludmFsaWRGaWVsZElkczpzdHJpbmdbXSA9IFtdO1xuICBjb25zdHJ1Y3RvciggXG4gICAgcHJpdmF0ZSBjaGFuZ2VTZXJ2aWNlOiBDaGFuZ2VTZXJ2aWNlLCBcbiAgICBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSxcbiAgICBwdWJsaWMgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlLFxuICAgICAgICApIHsgXG4gICAgdGhpcy5jaGFuZ2VTZXJ2aWNlLnN1Ym1pdFZhbGlkYXRlJC5zdWJzY3JpYmUoKGRhdGEpPT57XG4gICAgICAvLyB0byBnZXQgdGhlIGVycm9yIG1lc3NhZ2UncyBmaWVsZCBpZCdzXG4gICAgICB0aGlzLmludmFsaWRGaWVsZElkcy5wdXNoKGRhdGEpO1xuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgbGFiZWxGaWVsZDogc3RyaW5nO1xuICBwdWJsaWMgdmFsdWVGaWVsZDogc3RyaW5nO1xuICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHVibGljIGFwaU9iajpBUElNZXRhO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgb25pbml0IG9mIGN1c3RvbS1kcm9wZG93biBvZiAnICsgdGhpcy5pZCk7XG4gICAgLy8gY29uc29sZS5sb2codGhpcy5hcGlNZXRhKTtcbiAgICAvL1ZEIDA3QXVnMjQgLSBpc0RlcGVuZGVudEZpZWxkIGNoYW5nZVxuICAgIHRoaXMucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyID8gdGhpcy5wbGFjZWhvbGRlciA6ICctLS1TZWxlY3Qgb3B0aW9uLS0tJztcbiAgICBpZih0aGlzLmFwaU1ldGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hcGlPYmogPSBKU09OLnBhcnNlKHRoaXMuYXBpTWV0YSk7XG4gICAgICBpZighdGhpcy5hcGlPYmouaXNEZXBlbmRlbnRGaWVsZCl7XG4gICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcbiAgICAgIHRoaXMubGFiZWxGaWVsZCA9IHRoaXMuYXBpT2JqLmZpZWxkO1xuICAgICAgLy8gVkQgMDlTZXAyNC0gc2V0dXAgdGhlIHF1ZXJ5IHBhcmFtIGZvciBhcGkgY2FsbFxuICAgICAgbGV0IGZ1bGxFbmRQb2ludCA7XG4gICAgICBpZih0aGlzLmFwaU9iai5lbmRwb2ludCl7XG4gICAgICAgIGlmKHRoaXMuYXBpT2JqLnF1ZXJ5VmFsdWVSZWZlcmVuY2UgJiYgdGhpcy5hcGlPYmoucXVlcnlGaWVsZCl7XG4gICAgICAgICAgLy8gcHJvY2VzcyB0aGUgZW5kIHBvaW50IHdpdGggcXVlcnkgcGFyYW1cbiAgICAgICAgICBsZXQgcXVlcnlSZWZlcmVuY2VzID0gdGhpcy5hcGlPYmoucXVlcnlWYWx1ZVJlZmVyZW5jZS5zcGxpdCgnLCcpO1xuICAgICAgICAgIGxldCBxdWVyeVBhcmFtcyA9IFtdO1xuICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBxdWVyeVJlZmVyZW5jZXMgYW5kIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiByZWZlcmVuY2VEYXRhXG4gICAgICAgICAgcXVlcnlSZWZlcmVuY2VzLmZvckVhY2gocmVmZXJlbmNlID0+IHtcbiAgICAgICAgICAgICAgLy8gRmluZCB0aGUgZWxlbWVudCBpbiByZWZlcmVuY2VEYXRhIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCByZWZlcmVuY2VcbiAgICAgICAgICAgICAgbGV0IG1hdGNoaW5nRWxlbWVudCA9IHRoaXMucXVlc3Rpb24/LnJlZmVyZW5jZVF1ZXJ5RGF0YS5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5SZWZlcmVuY2VfRmllbGRfX2MgPT09IHJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgIC8vIElmIGEgbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZCwgZ2V0IGl0cyBpbnB1dCB2YWx1ZSBhbmQgY3JlYXRlIGEgcXVlcnkgcGFyYW1ldGVyXG4gICAgICAgICAgICAgIGlmIChtYXRjaGluZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYCR7cmVmZXJlbmNlfT0ke21hdGNoaW5nRWxlbWVudC5pbnB1dH1gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgICAgIGZ1bGxFbmRQb2ludCA9IHRoaXMuYXBpT2JqLmVuZHBvaW50ICsgJz8nICsgcXVlcnlQYXJhbXMuam9pbignJicpO1xuICAgICAgICAgICAgIGNvbnNvbGUubG9nKGZ1bGxFbmRQb2ludCk7XG4gICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgLy8gaWYgbm8gcXVlcnkgcGFyYW0gZ2V0IHRoZSBhY3R1YWwgZW5kUG9pbnRcbiAgICAgICAgICAgICBmdWxsRW5kUG9pbnQgPSB0aGlzLmFwaU9iai5lbmRwb2ludDtcbiAgICAgICAgfVxuICAgICAgICAvLyBWRCAxOUpBTjI0IC0gYWRkZWQgb25lIG1vcmUgcGFyYW0gZm9yIGF1dGhlbnRpY2F0aW9uXG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2UuYXBpUmVzcG9uc2UoZnVsbEVuZFBvaW50KT8uc3Vic2NyaWJlKChhcGlSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIC8vIEhBIDE4LUpBTi0yNCBBc3NpZ25lZCBhcGlyZXNwb25zZSBkaXJlY3RseSBpZiB3ZSBoYXZlIHRoZSByZXNwb25zZSBpbiBhcnJheSBhbHNvXG4gICAgICAgICAgLy8gVkQgMTlKQU4yNCAtIGlmIHJlc3BvbnNlIGhhcyBrZXkgd2l0aCB2YWx1ZSh3aGljaCBpcyBhcnJheSlcbiAgICAgICAgICBsZXQgcmVzcG9uc2VzO1xuICAgICAgICAgIGlmKHRoaXMuYXBpT2JqLnZhcmlhYmxlKXtcbiAgICAgICAgICAgIC8vIFZEIDIxTWF5MjQgLSBoYW5kbGluZyBtdWx0aXBsZSBjaGlsZCBvYmplY3RzXG4gICAgICAgICAgICAvLyBWRCAyMk1heTI0IC0gdXNlZCBjb21tb24gc2VydmljZSBmaWxlXG4gICAgICAgICAgICByZXNwb25zZXMgPSB0aGlzLmRhdGFTZXJ2aWNlLmdldFZhbHVlKGFwaVJlc3BvbnNlLHRoaXMuYXBpT2JqLnZhcmlhYmxlKTtcbiAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgICAgICAvLyBIQSAxOUpBTjI0IFRvIGF2b2lkIHVuZGVmaW5lZCBlcnJvciBpbiBjb25zb2xlXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlcz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIHJlc3AgPSByZXNwb25zZXNbaV07XG4gICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXNwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHJlc3VsdHM7XG4gICAgICAgICAgfWVsc2V7ICAvLyBWRCAxOUpBTjI0IC0gaWYgcmVzcG9uc2UgaGFzIHZhbHVlKHdoaWNoIGlzIGFycmF5KSBvbmx5XG4gICAgICAgICAgICByZXNwb25zZXMgPSBhcGlSZXNwb25zZTtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHJlc3BvbnNlcztcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVmZXJlbmNlIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BuZy1zZWxlY3Qvbmctc2VsZWN0XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAgICAgLy8gVkQgTk9WMjMgLSBoYW5kbGUgdGhlIGRlcGVuZGVudCB1cGRhdGUgZm9yIGRyb3Bkb3duXG4gICAgICAvLyAvLyBWRCAwOVNlcDI0LSBwdXNoIHRoZSBkZXBlbmRlbnQgZmllbGQgdmFsdWVzIGZvciBkcm9wZG93blxuICAgICAgbGV0IHNvdXJjZUlkID0gdGhpcy5hcGlPYmouc291cmNlUXVlc3Rpb25JZDtcbiAgICAgIGlmKHNvdXJjZUlkICYmIHRoaXMuYXBpT2JqLnZhcmlhYmxlIHx8IHRoaXMuYXBpT2JqLnZhbHVlRmllbGQpe1xuICAgICAgICAvLyBTdWJzY3JpYmUgZm9yIHRoZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5jaGFuZ2VTZXJ2aWNlLmNoYW5nZUFubm91bmNlZCQuc3Vic2NyaWJlKFxuICAgICAgICAgIChjaGFuZ2VWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYoY2hhbmdlVmFsdWUgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdpbnNpZGUgc3Vic2NyaXB0aW9uIGZvciB0aGUgY2hhbmdlJyk7XG4gICAgICAgICAgICAgIGlmKGNoYW5nZVZhbHVlLnZhbHVlT2JqICE9IHVuZGVmaW5lZCAmJiBjaGFuZ2VWYWx1ZS5mcm9tUXVlc3Rpb25JZCA9PSB0aGlzLmFwaU9iai5zb3VyY2VRdWVzdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgLy8gIHRoaXMuc2VsZWN0ZWRWYWx1ZSA9IGNoYW5nZVZhbHVlLnZhbHVlT2JqW3RoaXMuYXBpT2JqLnZhbHVlRmllbGRdO1xuICAgICAgICAgICAgICAgIC8vICBsZXQgdmFsdWUgPXt9O1xuICAgICAgICAgICAgICAgIC8vICB2YWx1ZVsnbmFtZSddID0gdGhpcy5zZWxlY3RlZFZhbHVlO1xuICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2VzO1xuICAgICAgICAgICAgICAgICBpZih0aGlzLmFwaU9iai52YXJpYWJsZSl7XG4gICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShjaGFuZ2VWYWx1ZS52YWx1ZU9iaix0aGlzLmFwaU9iai52YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlcz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwID0gcmVzcG9uc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3ApO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSByZXN1bHRzO1xuICAgICAgICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICAgICByZXNwb25zZXMgPSBjaGFuZ2VWYWx1ZS52YWx1ZU9iajtcbiAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSByZXNwb25zZXM7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VydmljZS5jb25maXJtQ2hhbmdlKHRoaXMuYXBpT2JqLnNvdXJjZVF1ZXN0aW9uSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbi8vIFZEIDIyTWF5MjQgLSB1c2VkIGNvbW1vbiBzZXJ2aWNlIGZpbGVcblxuICBzZWxlY3RDaGFuZ2UoZXZlbnQ6YW55KSB7XG4gICAgY29uc29sZS5sb2coJ2luc2lkZSBzZWxlY3RDaGFuZ2UgZnJvbSAnICsgdGhpcy5pZCk7XG4gICAgLy8gY29uc29sZS5sb2coZXZlbnQpO1xuICAgIGxldCBjaGFuZ2UgPSBuZXcgQ2hhbmdlV3JhcHBlcigpOyAvLyBDaGFuZ2VXcmFwcGVyID0gSlNPTi5wYXJzZSgne30nKTtcbiAgICBjaGFuZ2UuZnJvbVF1ZXN0aW9uSWQgPSB0aGlzLmlkO1xuICAgIGNoYW5nZS52YWx1ZU9iaiA9IGV2ZW50ID8gZXZlbnQgOiAnJztcbiAgICBjaGFuZ2UucmVmZXJlbmNlRmllbGQgPSB0aGlzLnJlZmVyZW5jZUZpZWxkO1xuICAgIGNoYW5nZS5zZWxlY3RlZE9iaiA9IGV2ZW50ID8gZXZlbnRbdGhpcy5sYWJlbEZpZWxkXSA6ICcnO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChjaGFuZ2UpO1xuICAgIC8vIG9uY2UgZ290IHZhbHVlIGluIGRyb3Bkb3duIHJlbW92ZSB0aGUgZXJyb3IgdmFsaWRhdGlvblxuICAgIGlmKGV2ZW50KXtcbiAgICAgIHRoaXMuaW52YWxpZEZpZWxkSWRzID1bXTtcbiAgICB9XG4gIH1cbn1cbiIsIjwhLS0gSEEgMTgtSkFOLTI0IENvbW1lbnRpbmcgdGhlc2UgbGluZXMgYXMgd2UgZG9uJ3QgaGF2ZSB0byB1c2Ugc2hlbmdlbCBoZXJlIC0tPlxuPCEtLSA8c2VsZWN0XG4gIFtuZ0NsYXNzXT1cIntcbiAgICAnZHQtbGluZSBkcERvd24gZG93biBteXQtZHJvcGJveCBteXQtYm9yZGVyLXIgbXl0LWZvbnQxJzogcHJvZ3Jlc3NCYXIsXG4gICAgJ2N1c3RvbS1zZWxlY3QnOiAhcHJvZ3Jlc3NCYXJcbiAgfVwiIGNsYXNzPVwiY3VzdG9tLXNlbGVjdCBtci1zbS0yIGRkLWhlaWdodFwiIFxuICBbaWRdPVwiaWRcIiBcbiAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFZhbHVlXCJcbiAgKGNoYW5nZSk9XCJzZWxlY3RDaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSk7XCIgXG4gIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJlcnJvciA/ICdyZWQnIDogJyM4NTg1ODUnXCJcbiAgW3N0eWxlLmNvbG9yXT1cImVycm9yID8gJ3JlZCcgOiAnJ1wiPlxuICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHRpb25zXCIgW3ZhbHVlXT1cInRoaXMuYXBpTWV0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9uLnRpdGxlIDogb3B0aW9uLlZhbHVlX19jXCIgY2xhc3M9XCJvcHRpb25cIj57eyB0aGlzLmFwaU1ldGEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbi50aXRsZSA6IG9wdGlvbi5WYWx1ZV9fYyB9fTwvb3B0aW9uPlxuICAgIDxvcHRpb24gKm5nSWY9XCJlcnJvck1lc3NhZ2VcIiB2YWx1ZT1cIlwiIGRpc2FibGVkIGhpZGRlbj57eyBlcnJvck1lc3NhZ2UgfX08L29wdGlvbj5cbjwvc2VsZWN0PiAtLT5cbjwhLS0gLy8gVkQgMTJKdW4yNCAtIHJlYWRvbmx5IGNoYW5nZS0tPlxuPCEtLSBWRCAwMUF1ZzI0IC0gdmFsaWRhdGlvbiBjaGFuZ2UtLT5cbjwhLS0gVkQgMDdBdWcyNCAtIGlzRGVwZW5kZW50RmllbGQgY2hhbmdlLS0+XG48bmctc2VsZWN0XG4gICAgICAgICAgICBbY2xhc3NdPVwiaW52YWxpZEZpZWxkSWRzLmluY2x1ZGVzKGlkKSB8fCBlcnJvciA/ICdzaGVuZ2VsLWN1c3RvbS1zZWxlY3QgaW52YWxpZCcgOiAnc2hlbmdlbC1jdXN0b20tc2VsZWN0J1wiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVmFsdWVcIiBcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbaWRdPVwiaWRcIj5cbiAgPG5nLW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIiBbdmFsdWVdPVwiYXBpT2JqICE9PSB1bmRlZmluZWQgJiYgIWFwaU9iai5pc0RlcGVuZGVudEZpZWxkID8gb3B0aW9uIDogb3B0aW9uLlZhbHVlX19jXCI+e3sgYXBpT2JqICE9PSB1bmRlZmluZWQgJiYgIWFwaU9iai5pc0RlcGVuZGVudEZpZWxkID8gb3B0aW9uW2xhYmVsRmllbGRdIDogb3B0aW9uLlZhbHVlX19jICB9fTwvbmctb3B0aW9uPiBcbjwvbmctc2VsZWN0PlxuPHNwYW4gKm5nSWY9XCJlcnJvciB8fCBpbnZhbGlkRmllbGRJZHMuaW5jbHVkZXMoaWQpXCIgY2xhc3M9XCJlcnJvci1tc2dcIj57e2Vycm9yTWVzc2FnZX19PC9zcGFuPlxuIl19
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9jb21wb25lbnRzL2N1c3RvbS1kcm9wZG93bi9jdXN0b20tZHJvcGRvd24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvY3VzdG9tLWRyb3Bkb3duL2N1c3RvbS1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFTLEtBQUssRUFBQyxNQUFNLEVBQUMsWUFBWSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBR3RGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7QUFZMUQsTUFBTSxPQUFPLHVCQUF1QjtJQWlCeEI7SUFDQTtJQUNEO0lBbEJBLE9BQU8sQ0FBVztJQUNsQixXQUFXLENBQVM7SUFDcEIsT0FBTyxDQUFTO0lBQ2hCLGFBQWEsQ0FBUztJQUN0QixXQUFXLENBQVU7SUFDckIsRUFBRSxDQUFRO0lBQ1YsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLCtCQUErQjtJQUNqRCxZQUFZLENBQVM7SUFDckIsS0FBSyxDQUFLO0lBQ1YsV0FBVyxHQUFZLEtBQUssQ0FBQztJQUM3QixRQUFRLENBQUs7SUFDYixjQUFjLENBQVE7SUFDdEIsS0FBSyxDQUFRLENBQUksc0NBQXNDO0lBQ3RELFdBQVcsR0FBZ0MsSUFBSSxZQUFZLEVBQWlCLENBQUM7SUFDdkYsZUFBZSxHQUFZLEVBQUUsQ0FBQztJQUM5QixZQUNVLGFBQTRCLEVBQzVCLFdBQXdCLEVBQ3pCLFdBQXdCO1FBRnZCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3pCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBRS9CLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBQyxFQUFFO1lBQ25ELHdDQUF3QztZQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFTSxVQUFVLENBQVM7SUFDbkIsVUFBVSxDQUFTO0lBQzFCLFlBQVksQ0FBZTtJQUNwQixNQUFNLENBQVM7SUFDZixTQUFTLENBQVE7SUFFeEIsUUFBUTtJQUVSLENBQUM7SUFDRCxVQUFVO1FBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQixpRUFBaUU7UUFDakUsNkJBQTZCO1FBQzdCLHNDQUFzQztRQUN0Qyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQztRQUMvRSxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRCxJQUFJLGFBQWEsRUFBRTtZQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDMUM7YUFBSztZQUNKLElBQUcsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFDO29CQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztvQkFDcEMsaURBQWlEO29CQUNqRCxJQUFJLFlBQVksQ0FBRTtvQkFDbEIsSUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBQzt3QkFDdEIsSUFBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFDOzRCQUMzRCx5Q0FBeUM7NEJBQ3pDLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUNqRSxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7NEJBQ3JCLG1GQUFtRjs0QkFDbkYsZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtnQ0FDaEMsdUVBQXVFO2dDQUN2RSxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLENBQUMsQ0FBQztnQ0FDbEgsbUZBQW1GO2dDQUNuRixJQUFJLGVBQWUsRUFBRTtvQ0FDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsSUFBSSxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztpQ0FDN0Q7NEJBQ0wsQ0FBQyxDQUFDLENBQUM7NEJBQ0EsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUNsRSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO3lCQUM5Qjs2QkFBSzs0QkFDSCw0Q0FBNEM7NEJBQzFDLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQzt5QkFDeEM7d0JBQ0QsdURBQXVEO3dCQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTs0QkFDcEUsbUZBQW1GOzRCQUNuRiw4REFBOEQ7NEJBQzlELElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7NEJBQ25ELElBQUksU0FBUyxDQUFDOzRCQUNkLElBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUM7Z0NBQ3RCLCtDQUErQztnQ0FDL0Msd0NBQXdDO2dDQUN4QyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0NBQ3hFLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztnQ0FDakIsaURBQWlEO2dDQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQ0FDMUMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29DQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lDQUNwQjtnQ0FDRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQzs2QkFDeEI7aUNBQUksRUFBRywwREFBMEQ7Z0NBQ2hFLFNBQVMsR0FBRyxXQUFXLENBQUM7Z0NBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDOzZCQUMxQjs0QkFDRCxzREFBc0Q7NEJBQ3RELElBQUcsSUFBSSxDQUFDLFNBQVMsRUFBQztnQ0FDaEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7NkJBQ3BFOzRCQUNELCtEQUErRDt3QkFDakUsQ0FBQyxDQUFDLENBQUE7cUJBQ0g7aUJBQ0Y7Z0JBQ0Msc0RBQXNEO2dCQUN0RCw4REFBOEQ7Z0JBQzlELElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzVDLElBQUcsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFDO29CQUM1RCw0QkFBNEI7b0JBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQy9ELENBQUMsV0FBVyxFQUFFLEVBQUU7d0JBQ2QsSUFBRyxXQUFXLElBQUksU0FBUyxFQUFFOzRCQUMzQixxREFBcUQ7NEJBQ3JELElBQUcsV0FBVyxDQUFDLFFBQVEsSUFBSSxTQUFTLElBQUksV0FBVyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO2dDQUNsRyxzRUFBc0U7Z0NBQ3RFLGtCQUFrQjtnQ0FDbEIsdUNBQXVDO2dDQUN0QyxJQUFJLFNBQVMsQ0FBQztnQ0FDZCxJQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFDO29DQUN0QixTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29DQUNqRixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7b0NBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dDQUMxQyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7d0NBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUNBQ3BCO29DQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO2lDQUN4QjtxQ0FBSTtvQ0FDSCxTQUFTLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztvQ0FDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7aUNBQzFCOzZCQUNEOzRCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzt5QkFDaEU7b0JBQ0gsQ0FBQyxDQUNGLENBQUM7aUJBQ0g7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUNILHdDQUF3QztJQUV0QyxZQUFZLENBQUMsS0FBUztRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRCxzQkFBc0I7UUFDdEIsSUFBSSxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDLG9DQUFvQztRQUN0RSxNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM1QyxNQUFNLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLHlEQUF5RDtRQUN6RCxJQUFHLEtBQUssRUFBQztZQUNQLElBQUksQ0FBQyxlQUFlLEdBQUUsRUFBRSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQzt3R0F6SlUsdUJBQXVCOzRGQUF2Qix1QkFBdUIsa2FDZnBDLHlvREE2QkE7OzRGRGRhLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxxQkFBcUI7d0pBS3RCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCxJbnB1dCxPdXRwdXQsRXZlbnRFbWl0dGVyLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBUElNZXRhIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hcGltZXRhJztcbmltcG9ydCB7IENoYW5nZVdyYXBwZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9jaGFuZ2VXcmFwcGVyJztcbmltcG9ydCB7IENoYW5nZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jaGFuZ2Uuc2VydmljZSc7XG4vLyBIQSAxOURFQzIzIGltcG9ydGVkIHRyYW5zbGF0aW9uIHNlcnZpY2VcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaTE4bi5zZXJ2aWNlJztcbi8vIFZEIDIzSkFOMjQgdXNlZCBzZXJ2aWNlIGZpbGUgZm9yIGNhbGxvdXRcbmltcG9ydCB7IERhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZGF0YS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWN1c3RvbS1kcm9wZG93bicsXG4gIHRlbXBsYXRlVXJsOiAnLi9jdXN0b20tZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jdXN0b20tZHJvcGRvd24uY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIEN1c3RvbURyb3Bkb3duQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgb3B0aW9uczogc3RyaW5nW107XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGFwaU1ldGE6IHN0cmluZztcbiAgQElucHV0KCkgc2VsZWN0ZWRWYWx1ZTogc3RyaW5nO1xuICBASW5wdXQoKSBwcm9ncmVzc0JhcjogYm9vbGVhbjtcbiAgQElucHV0KCkgaWQ6c3RyaW5nO1xuICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlOyAvLyBWRCAxMkp1bjI0IC0gcmVhZG9ubHkgY2hhbmdlXG4gIEBJbnB1dCgpIGVycm9yTWVzc2FnZTogc3RyaW5nO1xuICBASW5wdXQoKSBlcnJvcjphbnk7XG4gIEBJbnB1dCgpIGZyb21TaGVuZ2VsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHF1ZXN0aW9uOmFueTtcbiAgQElucHV0KCkgcmVmZXJlbmNlRmllbGQ6c3RyaW5nO1xuICBASW5wdXQoKSB0b2tlbjpzdHJpbmc7ICAgIC8vIFZEIDE5SkFOMjQgLSBnZXR0aW5nIHRva2VuIGFzIGlucHV0XG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPENoYW5nZVdyYXBwZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFuZ2VXcmFwcGVyPigpO1xuICBpbnZhbGlkRmllbGRJZHM6c3RyaW5nW10gPSBbXTtcbiAgY29uc3RydWN0b3IoIFxuICAgIHByaXZhdGUgY2hhbmdlU2VydmljZTogQ2hhbmdlU2VydmljZSwgXG4gICAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UsXG4gICAgcHVibGljIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICAgICAgKSB7IFxuICAgIHRoaXMuY2hhbmdlU2VydmljZS5zdWJtaXRWYWxpZGF0ZSQuc3Vic2NyaWJlKChkYXRhKT0+e1xuICAgICAgLy8gdG8gZ2V0IHRoZSBlcnJvciBtZXNzYWdlJ3MgZmllbGQgaWQnc1xuICAgICAgdGhpcy5pbnZhbGlkRmllbGRJZHMucHVzaChkYXRhKTtcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIGxhYmVsRmllbGQ6IHN0cmluZztcbiAgcHVibGljIHZhbHVlRmllbGQ6IHN0cmluZztcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBhcGlPYmo6QVBJTWV0YTtcbiAgcHVibGljIHVuaXF1ZUtleTpzdHJpbmc7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgXG4gIH1cbiAgZ2V0T3B0aW9ucygpe1xuICAgIGNvbnNvbGUubG9nKCd0ZXN0IGNsaWNrJyk7XG4gICAgLy8gY29uc29sZS5sb2coJ2luc2lkZSBvbmluaXQgb2YgY3VzdG9tLWRyb3Bkb3duIG9mICcgKyB0aGlzLmlkKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmFwaU1ldGEpO1xuICAgIC8vVkQgMDdBdWcyNCAtIGlzRGVwZW5kZW50RmllbGQgY2hhbmdlXG4gICAgLy8gVkQgMjVPY3QyNCAtIGNoYW5nZXNcbiAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlciA/IHRoaXMucGxhY2Vob2xkZXIgOiAnLS0tU2VsZWN0IG9wdGlvbi0tLSc7XG4gICAgY29uc3QgY2FjaGVkT3B0aW9ucyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMudW5pcXVlS2V5KTtcbiAgICBpZiAoY2FjaGVkT3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zID0gSlNPTi5wYXJzZShjYWNoZWRPcHRpb25zKTtcbiAgICB9ZWxzZSB7XG4gICAgICBpZih0aGlzLmFwaU1ldGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmFwaU9iaiA9IEpTT04ucGFyc2UodGhpcy5hcGlNZXRhKTtcbiAgICAgICAgaWYoIXRoaXMuYXBpT2JqLmlzRGVwZW5kZW50RmllbGQpe1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5sYWJlbEZpZWxkID0gdGhpcy5hcGlPYmouZmllbGQ7XG4gICAgICAgIC8vIFZEIDA5U2VwMjQtIHNldHVwIHRoZSBxdWVyeSBwYXJhbSBmb3IgYXBpIGNhbGxcbiAgICAgICAgbGV0IGZ1bGxFbmRQb2ludCA7XG4gICAgICAgIGlmKHRoaXMuYXBpT2JqLmVuZHBvaW50KXtcbiAgICAgICAgICBpZih0aGlzLmFwaU9iai5xdWVyeVZhbHVlUmVmZXJlbmNlICYmIHRoaXMuYXBpT2JqLnF1ZXJ5RmllbGQpe1xuICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgZW5kIHBvaW50IHdpdGggcXVlcnkgcGFyYW1cbiAgICAgICAgICAgIGxldCBxdWVyeVJlZmVyZW5jZXMgPSB0aGlzLmFwaU9iai5xdWVyeVZhbHVlUmVmZXJlbmNlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICBsZXQgcXVlcnlQYXJhbXMgPSBbXTtcbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBxdWVyeVJlZmVyZW5jZXMgYW5kIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiByZWZlcmVuY2VEYXRhXG4gICAgICAgICAgICBxdWVyeVJlZmVyZW5jZXMuZm9yRWFjaChyZWZlcmVuY2UgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgaW4gcmVmZXJlbmNlRGF0YSB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgcmVmZXJlbmNlXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoaW5nRWxlbWVudCA9IHRoaXMucXVlc3Rpb24/LnJlZmVyZW5jZVF1ZXJ5RGF0YS5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5SZWZlcmVuY2VfRmllbGRfX2MgPT09IHJlZmVyZW5jZSk7XG4gICAgICAgICAgICAgICAgLy8gSWYgYSBtYXRjaGluZyBlbGVtZW50IGlzIGZvdW5kLCBnZXQgaXRzIGlucHV0IHZhbHVlIGFuZCBjcmVhdGUgYSBxdWVyeSBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hpbmdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYCR7cmVmZXJlbmNlfT0ke21hdGNoaW5nRWxlbWVudC5pbnB1dH1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgIGZ1bGxFbmRQb2ludCA9IHRoaXMuYXBpT2JqLmVuZHBvaW50ICsgJz8nICsgcXVlcnlQYXJhbXMuam9pbignJicpO1xuICAgICAgICAgICAgICAgY29uc29sZS5sb2coZnVsbEVuZFBvaW50KTtcbiAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICAgLy8gaWYgbm8gcXVlcnkgcGFyYW0gZ2V0IHRoZSBhY3R1YWwgZW5kUG9pbnRcbiAgICAgICAgICAgICAgIGZ1bGxFbmRQb2ludCA9IHRoaXMuYXBpT2JqLmVuZHBvaW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBWRCAxOUpBTjI0IC0gYWRkZWQgb25lIG1vcmUgcGFyYW0gZm9yIGF1dGhlbnRpY2F0aW9uXG4gICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5hcGlSZXNwb25zZShmdWxsRW5kUG9pbnQpPy5zdWJzY3JpYmUoKGFwaVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAvLyBIQSAxOC1KQU4tMjQgQXNzaWduZWQgYXBpcmVzcG9uc2UgZGlyZWN0bHkgaWYgd2UgaGF2ZSB0aGUgcmVzcG9uc2UgaW4gYXJyYXkgYWxzb1xuICAgICAgICAgICAgLy8gVkQgMTlKQU4yNCAtIGlmIHJlc3BvbnNlIGhhcyBrZXkgd2l0aCB2YWx1ZSh3aGljaCBpcyBhcnJheSlcbiAgICAgICAgICAgIHRoaXMudW5pcXVlS2V5ID0gYXBpUmVzcG9uc2VbdGhpcy5hcGlPYmoudW5pcXVlS2V5XVxuICAgICAgICAgICAgbGV0IHJlc3BvbnNlcztcbiAgICAgICAgICAgIGlmKHRoaXMuYXBpT2JqLnZhcmlhYmxlKXtcbiAgICAgICAgICAgICAgLy8gVkQgMjFNYXkyNCAtIGhhbmRsaW5nIG11bHRpcGxlIGNoaWxkIG9iamVjdHNcbiAgICAgICAgICAgICAgLy8gVkQgMjJNYXkyNCAtIHVzZWQgY29tbW9uIHNlcnZpY2UgZmlsZVxuICAgICAgICAgICAgICByZXNwb25zZXMgPSB0aGlzLmRhdGFTZXJ2aWNlLmdldFZhbHVlKGFwaVJlc3BvbnNlLHRoaXMuYXBpT2JqLnZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcbiAgICAgICAgICAgICAgLy8gSEEgMTlKQU4yNCBUbyBhdm9pZCB1bmRlZmluZWQgZXJyb3IgaW4gY29uc29sZVxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3BvbnNlcz8ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzcCA9IHJlc3BvbnNlc1tpXTtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzcCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gcmVzdWx0cztcbiAgICAgICAgICAgIH1lbHNleyAgLy8gVkQgMTlKQU4yNCAtIGlmIHJlc3BvbnNlIGhhcyB2YWx1ZSh3aGljaCBpcyBhcnJheSkgb25seVxuICAgICAgICAgICAgICByZXNwb25zZXMgPSBhcGlSZXNwb25zZTtcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gcmVzcG9uc2VzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVkQgMjVPY3QyNCAtIFN0b3JlIGZldGNoZWQgb3B0aW9ucyBpbiBsb2NhbCBzdG9yYWdlXG4gICAgICAgICAgICBpZih0aGlzLnVuaXF1ZUtleSl7XG4gICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMudW5pcXVlS2V5LCBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9Abmctc2VsZWN0L25nLXNlbGVjdFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICAgLy8gVkQgTk9WMjMgLSBoYW5kbGUgdGhlIGRlcGVuZGVudCB1cGRhdGUgZm9yIGRyb3Bkb3duXG4gICAgICAgIC8vIC8vIFZEIDA5U2VwMjQtIHB1c2ggdGhlIGRlcGVuZGVudCBmaWVsZCB2YWx1ZXMgZm9yIGRyb3Bkb3duXG4gICAgICAgIGxldCBzb3VyY2VJZCA9IHRoaXMuYXBpT2JqLnNvdXJjZVF1ZXN0aW9uSWQ7XG4gICAgICAgIGlmKHNvdXJjZUlkICYmIHRoaXMuYXBpT2JqLnZhcmlhYmxlIHx8IHRoaXMuYXBpT2JqLnZhbHVlRmllbGQpe1xuICAgICAgICAgIC8vIFN1YnNjcmliZSBmb3IgdGhlIGNoYW5nZXNcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY2hhbmdlU2VydmljZS5jaGFuZ2VBbm5vdW5jZWQkLnN1YnNjcmliZShcbiAgICAgICAgICAgIChjaGFuZ2VWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgICBpZihjaGFuZ2VWYWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnaW5zaWRlIHN1YnNjcmlwdGlvbiBmb3IgdGhlIGNoYW5nZScpO1xuICAgICAgICAgICAgICAgIGlmKGNoYW5nZVZhbHVlLnZhbHVlT2JqICE9IHVuZGVmaW5lZCAmJiBjaGFuZ2VWYWx1ZS5mcm9tUXVlc3Rpb25JZCA9PSB0aGlzLmFwaU9iai5zb3VyY2VRdWVzdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgICAvLyAgdGhpcy5zZWxlY3RlZFZhbHVlID0gY2hhbmdlVmFsdWUudmFsdWVPYmpbdGhpcy5hcGlPYmoudmFsdWVGaWVsZF07XG4gICAgICAgICAgICAgICAgICAvLyAgbGV0IHZhbHVlID17fTtcbiAgICAgICAgICAgICAgICAgIC8vICB2YWx1ZVsnbmFtZSddID0gdGhpcy5zZWxlY3RlZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZXM7XG4gICAgICAgICAgICAgICAgICAgaWYodGhpcy5hcGlPYmoudmFyaWFibGUpe1xuICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gdGhpcy5kYXRhU2VydmljZS5nZXRWYWx1ZShjaGFuZ2VWYWx1ZS52YWx1ZU9iaix0aGlzLmFwaU9iai52YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwb25zZXM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwID0gcmVzcG9uc2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzcCk7XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzID0gY2hhbmdlVmFsdWUudmFsdWVPYmo7XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSByZXNwb25zZXM7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlU2VydmljZS5jb25maXJtQ2hhbmdlKHRoaXMuYXBpT2JqLnNvdXJjZVF1ZXN0aW9uSWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuLy8gVkQgMjJNYXkyNCAtIHVzZWQgY29tbW9uIHNlcnZpY2UgZmlsZVxuXG4gIHNlbGVjdENoYW5nZShldmVudDphbnkpIHtcbiAgICBjb25zb2xlLmxvZygnaW5zaWRlIHNlbGVjdENoYW5nZSBmcm9tICcgKyB0aGlzLmlkKTtcbiAgICAvLyBjb25zb2xlLmxvZyhldmVudCk7XG4gICAgbGV0IGNoYW5nZSA9IG5ldyBDaGFuZ2VXcmFwcGVyKCk7IC8vIENoYW5nZVdyYXBwZXIgPSBKU09OLnBhcnNlKCd7fScpO1xuICAgIGNoYW5nZS5mcm9tUXVlc3Rpb25JZCA9IHRoaXMuaWQ7XG4gICAgY2hhbmdlLnZhbHVlT2JqID0gZXZlbnQgPyBldmVudCA6ICcnO1xuICAgIGNoYW5nZS5yZWZlcmVuY2VGaWVsZCA9IHRoaXMucmVmZXJlbmNlRmllbGQ7XG4gICAgY2hhbmdlLnNlbGVjdGVkT2JqID0gZXZlbnQgPyBldmVudFt0aGlzLmxhYmVsRmllbGRdIDogJyc7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KGNoYW5nZSk7XG4gICAgLy8gb25jZSBnb3QgdmFsdWUgaW4gZHJvcGRvd24gcmVtb3ZlIHRoZSBlcnJvciB2YWxpZGF0aW9uXG4gICAgaWYoZXZlbnQpe1xuICAgICAgdGhpcy5pbnZhbGlkRmllbGRJZHMgPVtdO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLSBIQSAxOC1KQU4tMjQgQ29tbWVudGluZyB0aGVzZSBsaW5lcyBhcyB3ZSBkb24ndCBoYXZlIHRvIHVzZSBzaGVuZ2VsIGhlcmUgLS0+XG48IS0tIDxzZWxlY3RcbiAgW25nQ2xhc3NdPVwie1xuICAgICdkdC1saW5lIGRwRG93biBkb3duIG15dC1kcm9wYm94IG15dC1ib3JkZXItciBteXQtZm9udDEnOiBwcm9ncmVzc0JhcixcbiAgICAnY3VzdG9tLXNlbGVjdCc6ICFwcm9ncmVzc0JhclxuICB9XCIgY2xhc3M9XCJjdXN0b20tc2VsZWN0IG1yLXNtLTIgZGQtaGVpZ2h0XCIgXG4gIFtpZF09XCJpZFwiIFxuICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVmFsdWVcIlxuICAoY2hhbmdlKT1cInNlbGVjdENoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKTtcIiBcbiAgW3N0eWxlLmJvcmRlckNvbG9yXT1cImVycm9yID8gJ3JlZCcgOiAnIzg1ODU4NSdcIlxuICBbc3R5bGUuY29sb3JdPVwiZXJyb3IgPyAncmVkJyA6ICcnXCI+XG4gICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIiBbdmFsdWVdPVwidGhpcy5hcGlNZXRhICE9PSB1bmRlZmluZWQgPyBvcHRpb24udGl0bGUgOiBvcHRpb24uVmFsdWVfX2NcIiBjbGFzcz1cIm9wdGlvblwiPnt7IHRoaXMuYXBpTWV0YSAhPT0gdW5kZWZpbmVkID8gb3B0aW9uLnRpdGxlIDogb3B0aW9uLlZhbHVlX19jIH19PC9vcHRpb24+XG4gICAgPG9wdGlvbiAqbmdJZj1cImVycm9yTWVzc2FnZVwiIHZhbHVlPVwiXCIgZGlzYWJsZWQgaGlkZGVuPnt7IGVycm9yTWVzc2FnZSB9fTwvb3B0aW9uPlxuPC9zZWxlY3Q+IC0tPlxuPCEtLSAvLyBWRCAxMkp1bjI0IC0gcmVhZG9ubHkgY2hhbmdlLS0+XG48IS0tIFZEIDAxQXVnMjQgLSB2YWxpZGF0aW9uIGNoYW5nZS0tPlxuPCEtLSBWRCAwN0F1ZzI0IC0gaXNEZXBlbmRlbnRGaWVsZCBjaGFuZ2UtLT5cbjwhLS0gVkQgMjVPY3QyNCAtIGNoYW5nZXMtLT5cbjxuZy1zZWxlY3RcbiAgICAgICAgICAgIFtjbGFzc109XCJpbnZhbGlkRmllbGRJZHMuaW5jbHVkZXMoaWQpIHx8IGVycm9yID8gJ3NoZW5nZWwtY3VzdG9tLXNlbGVjdCBpbnZhbGlkJyA6ICdzaGVuZ2VsLWN1c3RvbS1zZWxlY3QnXCJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRWYWx1ZVwiIFxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZWFkT25seVwiXG4gICAgICAgICAgICAoY2xpY2spID0gXCJnZXRPcHRpb25zKClcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbaWRdPVwiaWRcIj5cbiAgPG5nLW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdGlvbnNcIiBbdmFsdWVdPVwiYXBpT2JqICE9PSB1bmRlZmluZWQgJiYgIWFwaU9iai5pc0RlcGVuZGVudEZpZWxkID8gb3B0aW9uIDogb3B0aW9uLlZhbHVlX19jXCI+e3sgYXBpT2JqICE9PSB1bmRlZmluZWQgJiYgIWFwaU9iai5pc0RlcGVuZGVudEZpZWxkID8gb3B0aW9uW2xhYmVsRmllbGRdIDogb3B0aW9uLlZhbHVlX19jICB9fTwvbmctb3B0aW9uPiBcbjwvbmctc2VsZWN0PlxuPHNwYW4gKm5nSWY9XCJlcnJvciB8fCBpbnZhbGlkRmllbGRJZHMuaW5jbHVkZXMoaWQpXCIgY2xhc3M9XCJlcnJvci1tc2dcIj57e2Vycm9yTWVzc2FnZX19PC9zcGFuPlxuIl19
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpbWV0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9pbnRlcmZhY2VzL2FwaW1ldGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQVBJTWV0YSB7XG4gICAgLy8gVkQgTk92MjMgLSBhZGRlZCB2YXJpYWJsZXMgZm9yIGRlcGVuZGVudCB1cGRhdGVcbiAgICBzb3VyY2VRdWVzdGlvbklkOnN0cmluZztcbiAgICB2YWx1ZUZpZWxkOnN0cmluZztcbiAgICBsYWJlbEZpZWxkOnN0cmluZztcbiAgICBlbmRwb2ludDogc3RyaW5nO1xuICAgIHZhcmlhYmxlOiBzdHJpbmc7XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICAvL1ZEIDA3QXVnMjQgLSBpc0RlcGVuZGVudEZpZWxkIGNoYW5nZVxuICAgIGlzRGVwZW5kZW50RmllbGQ6Ym9vbGVhbjtcbiAgICBkZXBlbmRlbnRWYWx1ZTpzdHJpbmc7XG4gICAgLy8gVkQgMDlTZXAyNCAtIHF1ZXJ5UGFyYW0gY2hhbmdlcyBmb3IgYXBpIGRhdGEgXG4gICAgcXVlcnlGaWVsZDpzdHJpbmc7XG4gICAgcXVlcnlWYWx1ZVJlZmVyZW5jZTpzdHJpbmc7XG5cbn1cbiJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpbWV0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1hcHAvc3JjL2xpYi9pbnRlcmZhY2VzL2FwaW1ldGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQVBJTWV0YSB7XG4gICAgLy8gVkQgTk92MjMgLSBhZGRlZCB2YXJpYWJsZXMgZm9yIGRlcGVuZGVudCB1cGRhdGVcbiAgICBzb3VyY2VRdWVzdGlvbklkOnN0cmluZztcbiAgICB2YWx1ZUZpZWxkOnN0cmluZztcbiAgICBsYWJlbEZpZWxkOnN0cmluZztcbiAgICBlbmRwb2ludDogc3RyaW5nO1xuICAgIHZhcmlhYmxlOiBzdHJpbmc7XG4gICAgZmllbGQ6IHN0cmluZztcbiAgICAvL1ZEIDA3QXVnMjQgLSBpc0RlcGVuZGVudEZpZWxkIGNoYW5nZVxuICAgIGlzRGVwZW5kZW50RmllbGQ6Ym9vbGVhbjtcbiAgICBkZXBlbmRlbnRWYWx1ZTpzdHJpbmc7XG4gICAgLy8gVkQgMDlTZXAyNCAtIHF1ZXJ5UGFyYW0gY2hhbmdlcyBmb3IgYXBpIGRhdGEgXG4gICAgcXVlcnlGaWVsZDpzdHJpbmc7XG4gICAgcXVlcnlWYWx1ZVJlZmVyZW5jZTpzdHJpbmc7XG4gICAgLy9WRCAyNW9jdC0yNCAtIGNoYW5nZXMobmVlZCB0byBkb2N1bWVudClcbiAgICB1bmlxdWVLZXk6IHN0cmluZztcblxufVxuIl19
@@ -1821,94 +1821,110 @@ class CustomDropdownComponent {
1821
1821
  valueField;
1822
1822
  subscription;
1823
1823
  apiObj;
1824
+ uniqueKey;
1824
1825
  ngOnInit() {
1826
+ }
1827
+ getOptions() {
1828
+ console.log('test click');
1825
1829
  // console.log('inside oninit of custom-dropdown of ' + this.id);
1826
1830
  // console.log(this.apiMeta);
1827
1831
  //VD 07Aug24 - isDependentField change
1832
+ // VD 25Oct24 - changes
1828
1833
  this.placeholder = this.placeholder ? this.placeholder : '---Select option---';
1829
- if (this.apiMeta !== undefined) {
1830
- this.apiObj = JSON.parse(this.apiMeta);
1831
- if (!this.apiObj.isDependentField) {
1832
- this.options = [];
1833
- this.labelField = this.apiObj.field;
1834
- // VD 09Sep24- setup the query param for api call
1835
- let fullEndPoint;
1836
- if (this.apiObj.endpoint) {
1837
- if (this.apiObj.queryValueReference && this.apiObj.queryField) {
1838
- // process the end point with query param
1839
- let queryReferences = this.apiObj.queryValueReference.split(',');
1840
- let queryParams = [];
1841
- // Iterate over queryReferences and find the corresponding element in referenceData
1842
- queryReferences.forEach(reference => {
1843
- // Find the element in referenceData that matches the current reference
1844
- let matchingElement = this.question?.referenceQueryData.find(element => element.Reference_Field__c === reference);
1845
- // If a matching element is found, get its input value and create a query parameter
1846
- if (matchingElement) {
1847
- queryParams.push(`${reference}=${matchingElement.input}`);
1848
- }
1849
- });
1850
- fullEndPoint = this.apiObj.endpoint + '?' + queryParams.join('&');
1851
- console.log(fullEndPoint);
1852
- }
1853
- else {
1854
- // if no query param get the actual endPoint
1855
- fullEndPoint = this.apiObj.endpoint;
1856
- }
1857
- // VD 19JAN24 - added one more param for authentication
1858
- this.dataService.apiResponse(fullEndPoint)?.subscribe((apiResponse) => {
1859
- // HA 18-JAN-24 Assigned apiresponse directly if we have the response in array also
1860
- // VD 19JAN24 - if response has key with value(which is array)
1861
- let responses;
1862
- if (this.apiObj.variable) {
1863
- // VD 21May24 - handling multiple child objects
1864
- // VD 22May24 - used common service file
1865
- responses = this.dataService.getValue(apiResponse, this.apiObj.variable);
1866
- let results = [];
1867
- // HA 19JAN24 To avoid undefined error in console
1868
- for (let i = 0; i < responses?.length; i++) {
1869
- var resp = responses[i];
1870
- results.push(resp);
1871
- }
1872
- this.options = results;
1834
+ const cachedOptions = localStorage.getItem(this.uniqueKey);
1835
+ if (cachedOptions) {
1836
+ this.options = JSON.parse(cachedOptions);
1837
+ }
1838
+ else {
1839
+ if (this.apiMeta !== undefined) {
1840
+ this.apiObj = JSON.parse(this.apiMeta);
1841
+ if (!this.apiObj.isDependentField) {
1842
+ this.options = [];
1843
+ this.labelField = this.apiObj.field;
1844
+ // VD 09Sep24- setup the query param for api call
1845
+ let fullEndPoint;
1846
+ if (this.apiObj.endpoint) {
1847
+ if (this.apiObj.queryValueReference && this.apiObj.queryField) {
1848
+ // process the end point with query param
1849
+ let queryReferences = this.apiObj.queryValueReference.split(',');
1850
+ let queryParams = [];
1851
+ // Iterate over queryReferences and find the corresponding element in referenceData
1852
+ queryReferences.forEach(reference => {
1853
+ // Find the element in referenceData that matches the current reference
1854
+ let matchingElement = this.question?.referenceQueryData.find(element => element.Reference_Field__c === reference);
1855
+ // If a matching element is found, get its input value and create a query parameter
1856
+ if (matchingElement) {
1857
+ queryParams.push(`${reference}=${matchingElement.input}`);
1858
+ }
1859
+ });
1860
+ fullEndPoint = this.apiObj.endpoint + '?' + queryParams.join('&');
1861
+ console.log(fullEndPoint);
1873
1862
  }
1874
- else { // VD 19JAN24 - if response has value(which is array) only
1875
- responses = apiResponse;
1876
- this.options = responses;
1863
+ else {
1864
+ // if no query param get the actual endPoint
1865
+ fullEndPoint = this.apiObj.endpoint;
1877
1866
  }
1878
- // Reference https://www.npmjs.com/package/@ng-select/ng-select
1879
- });
1880
- }
1881
- }
1882
- // VD NOV23 - handle the dependent update for dropdown
1883
- // // VD 09Sep24- push the dependent field values for dropdown
1884
- let sourceId = this.apiObj.sourceQuestionId;
1885
- if (sourceId && this.apiObj.variable || this.apiObj.valueField) {
1886
- // Subscribe for the changes
1887
- this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
1888
- if (changeValue != undefined) {
1889
- // console.log('inside subscription for the change');
1890
- if (changeValue.valueObj != undefined && changeValue.fromQuestionId == this.apiObj.sourceQuestionId) {
1891
- // this.selectedValue = changeValue.valueObj[this.apiObj.valueField];
1892
- // let value ={};
1893
- // value['name'] = this.selectedValue;
1867
+ // VD 19JAN24 - added one more param for authentication
1868
+ this.dataService.apiResponse(fullEndPoint)?.subscribe((apiResponse) => {
1869
+ // HA 18-JAN-24 Assigned apiresponse directly if we have the response in array also
1870
+ // VD 19JAN24 - if response has key with value(which is array)
1871
+ this.uniqueKey = apiResponse[this.apiObj.uniqueKey];
1894
1872
  let responses;
1895
1873
  if (this.apiObj.variable) {
1896
- responses = this.dataService.getValue(changeValue.valueObj, this.apiObj.variable);
1874
+ // VD 21May24 - handling multiple child objects
1875
+ // VD 22May24 - used common service file
1876
+ responses = this.dataService.getValue(apiResponse, this.apiObj.variable);
1897
1877
  let results = [];
1878
+ // HA 19JAN24 To avoid undefined error in console
1898
1879
  for (let i = 0; i < responses?.length; i++) {
1899
1880
  var resp = responses[i];
1900
1881
  results.push(resp);
1901
1882
  }
1902
1883
  this.options = results;
1903
1884
  }
1904
- else {
1905
- responses = changeValue.valueObj;
1885
+ else { // VD 19JAN24 - if response has value(which is array) only
1886
+ responses = apiResponse;
1906
1887
  this.options = responses;
1907
1888
  }
1908
- }
1909
- this.changeService.confirmChange(this.apiObj.sourceQuestionId);
1889
+ // VD 25Oct24 - Store fetched options in local storage
1890
+ if (this.uniqueKey) {
1891
+ localStorage.setItem(this.uniqueKey, JSON.stringify(this.options));
1892
+ }
1893
+ // Reference https://www.npmjs.com/package/@ng-select/ng-select
1894
+ });
1910
1895
  }
1911
- });
1896
+ }
1897
+ // VD NOV23 - handle the dependent update for dropdown
1898
+ // // VD 09Sep24- push the dependent field values for dropdown
1899
+ let sourceId = this.apiObj.sourceQuestionId;
1900
+ if (sourceId && this.apiObj.variable || this.apiObj.valueField) {
1901
+ // Subscribe for the changes
1902
+ this.subscription = this.changeService.changeAnnounced$.subscribe((changeValue) => {
1903
+ if (changeValue != undefined) {
1904
+ // console.log('inside subscription for the change');
1905
+ if (changeValue.valueObj != undefined && changeValue.fromQuestionId == this.apiObj.sourceQuestionId) {
1906
+ // this.selectedValue = changeValue.valueObj[this.apiObj.valueField];
1907
+ // let value ={};
1908
+ // value['name'] = this.selectedValue;
1909
+ let responses;
1910
+ if (this.apiObj.variable) {
1911
+ responses = this.dataService.getValue(changeValue.valueObj, this.apiObj.variable);
1912
+ let results = [];
1913
+ for (let i = 0; i < responses?.length; i++) {
1914
+ var resp = responses[i];
1915
+ results.push(resp);
1916
+ }
1917
+ this.options = results;
1918
+ }
1919
+ else {
1920
+ responses = changeValue.valueObj;
1921
+ this.options = responses;
1922
+ }
1923
+ }
1924
+ this.changeService.confirmChange(this.apiObj.sourceQuestionId);
1925
+ }
1926
+ });
1927
+ }
1912
1928
  }
1913
1929
  }
1914
1930
  }
@@ -1928,11 +1944,11 @@ class CustomDropdownComponent {
1928
1944
  }
1929
1945
  }
1930
1946
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CustomDropdownComponent, deps: [{ token: ChangeService }, { token: DataService }, { token: I18nService }], target: i0.ɵɵFactoryTarget.Component });
1931
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CustomDropdownComponent, selector: "app-custom-dropdown", inputs: { options: "options", placeholder: "placeholder", apiMeta: "apiMeta", selectedValue: "selectedValue", progressBar: "progressBar", id: "id", readOnly: "readOnly", errorMessage: "errorMessage", error: "error", fromShengel: "fromShengel", question: "question", referenceField: "referenceField", token: "token" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.Value__c\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.Value__c }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option *ngFor=\"let option of options\" [value]=\"apiObj !== undefined && !apiObj.isDependentField ? option : option.Value__c\">{{ apiObj !== undefined && !apiObj.isDependentField ? option[labelField] : option.Value__c }}</ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.NgSelectComponent, selector: "ng-select", inputs: ["markFirst", "dropdownPosition", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "bufferAmount", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "readonly", "searchWhileComposing", "minTermLength", "keyDownFn", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "bindLabel", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "virtualScroll", "openOnEnter", "appendTo", "bindValue", "appearance", "maxSelectedItems", "groupBy", "groupValue", "tabIndex", "typeahead"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "component", type: i6.ɵr, selector: "ng-option", inputs: ["disabled", "value"] }] });
1947
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CustomDropdownComponent, selector: "app-custom-dropdown", inputs: { options: "options", placeholder: "placeholder", apiMeta: "apiMeta", selectedValue: "selectedValue", progressBar: "progressBar", id: "id", readOnly: "readOnly", errorMessage: "errorMessage", error: "error", fromShengel: "fromShengel", question: "question", referenceField: "referenceField", token: "token" }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.Value__c\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.Value__c }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<!-- VD 25Oct24 - changes-->\n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (click) = \"getOptions()\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option *ngFor=\"let option of options\" [value]=\"apiObj !== undefined && !apiObj.isDependentField ? option : option.Value__c\">{{ apiObj !== undefined && !apiObj.isDependentField ? option[labelField] : option.Value__c }}</ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.NgSelectComponent, selector: "ng-select", inputs: ["markFirst", "dropdownPosition", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "bufferAmount", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "readonly", "searchWhileComposing", "minTermLength", "keyDownFn", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "bindLabel", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "virtualScroll", "openOnEnter", "appendTo", "bindValue", "appearance", "maxSelectedItems", "groupBy", "groupValue", "tabIndex", "typeahead"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "component", type: i6.ɵr, selector: "ng-option", inputs: ["disabled", "value"] }] });
1932
1948
  }
1933
1949
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CustomDropdownComponent, decorators: [{
1934
1950
  type: Component,
1935
- args: [{ selector: 'app-custom-dropdown', template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.Value__c\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.Value__c }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option *ngFor=\"let option of options\" [value]=\"apiObj !== undefined && !apiObj.isDependentField ? option : option.Value__c\">{{ apiObj !== undefined && !apiObj.isDependentField ? option[labelField] : option.Value__c }}</ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"] }]
1951
+ args: [{ selector: 'app-custom-dropdown', template: "<!-- HA 18-JAN-24 Commenting these lines as we don't have to use shengel here -->\n<!-- <select\n [ngClass]=\"{\n 'dt-line dpDown down myt-dropbox myt-border-r myt-font1': progressBar,\n 'custom-select': !progressBar\n }\" class=\"custom-select mr-sm-2 dd-height\" \n [id]=\"id\" \n [(ngModel)]=\"selectedValue\"\n (change)=\"selectChange($event.target.value);\" \n [style.borderColor]=\"error ? 'red' : '#858585'\"\n [style.color]=\"error ? 'red' : ''\">\n <option *ngFor=\"let option of options\" [value]=\"this.apiMeta !== undefined ? option.title : option.Value__c\" class=\"option\">{{ this.apiMeta !== undefined ? option.title : option.Value__c }}</option>\n <option *ngIf=\"errorMessage\" value=\"\" disabled hidden>{{ errorMessage }}</option>\n</select> -->\n<!-- // VD 12Jun24 - readonly change-->\n<!-- VD 01Aug24 - validation change-->\n<!-- VD 07Aug24 - isDependentField change-->\n<!-- VD 25Oct24 - changes-->\n<ng-select\n [class]=\"invalidFieldIds.includes(id) || error ? 'shengel-custom-select invalid' : 'shengel-custom-select'\"\n [(ngModel)]=\"selectedValue\" \n [placeholder]=\"placeholder\"\n [disabled]=\"readOnly\"\n (click) = \"getOptions()\"\n (change)=\"selectChange($event)\"\n [id]=\"id\">\n <ng-option *ngFor=\"let option of options\" [value]=\"apiObj !== undefined && !apiObj.isDependentField ? option : option.Value__c\">{{ apiObj !== undefined && !apiObj.isDependentField ? option[labelField] : option.Value__c }}</ng-option> \n</ng-select>\n<span *ngIf=\"error || invalidFieldIds.includes(id)\" class=\"error-msg\">{{errorMessage}}</span>\n", styles: [".ng-select{width:100%}.invalid{border:1px solid red!important}\n"] }]
1936
1952
  }], ctorParameters: function () { return [{ type: ChangeService }, { type: DataService }, { type: I18nService }]; }, propDecorators: { options: [{
1937
1953
  type: Input
1938
1954
  }], placeholder: [{