ng-configcat-publicapi-ui 3.0.7 → 3.1.0

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.
Files changed (68) hide show
  1. package/esm2022/lib/_directives/input-display-normalizer.directive.mjs +38 -0
  2. package/esm2022/lib/_services/form-helper.mjs +104 -0
  3. package/{esm2020 → esm2022}/lib/_services/public-api.service.mjs +6 -6
  4. package/esm2022/lib/_services/setting-list-form-helper.mjs +171 -0
  5. package/esm2022/lib/authorization/authorization.component.mjs +62 -0
  6. package/{esm2020 → esm2022}/lib/base/base-select.component.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/base/base.component.mjs +5 -5
  8. package/{esm2020 → esm2022}/lib/configuration.mjs +4 -4
  9. package/{esm2020 → esm2022}/lib/dialogs/delete-setting-dialog/delete-setting-dialog.component.mjs +6 -6
  10. package/esm2022/lib/dialogs/expand-dialog/expand-dialog.component.mjs +80 -0
  11. package/esm2022/lib/dialogs/reason-dialog/reason-dialog.component.mjs +36 -0
  12. package/{esm2020 → esm2022}/lib/dialogs/save-snackbar/save-snackbar.component.mjs +5 -5
  13. package/esm2022/lib/ng-configcat-publicapi-ui.module.mjs +179 -0
  14. package/esm2022/lib/selects/config-select/config-select.component.mjs +60 -0
  15. package/esm2022/lib/selects/environment-select/environment-select.component.mjs +47 -0
  16. package/esm2022/lib/selects/product-select/product-select.component.mjs +40 -0
  17. package/esm2022/lib/selects/setting-select/setting-select.component.mjs +47 -0
  18. package/esm2022/lib/setting-item/setting-item.component.mjs +116 -0
  19. package/esm2022/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +81 -0
  20. package/esm2022/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +293 -0
  21. package/{esm2020 → esm2022}/lib/setting-list/setting/setting.component.mjs +5 -5
  22. package/esm2022/lib/setting-list/setting/value/value.component.mjs +37 -0
  23. package/esm2022/lib/setting-list/setting-list.component.mjs +194 -0
  24. package/{fesm2020 → fesm2022}/ng-configcat-publicapi-ui.mjs +163 -163
  25. package/{fesm2020 → fesm2022}/ng-configcat-publicapi-ui.mjs.map +1 -1
  26. package/lib/_services/setting-list-form-helper.d.ts +1 -1
  27. package/lib/authorization/authorization.component.d.ts +1 -1
  28. package/lib/base/base-select.component.d.ts +1 -1
  29. package/lib/base/base.component.d.ts +1 -1
  30. package/lib/selects/config-select/config-select.component.d.ts +1 -1
  31. package/lib/selects/environment-select/environment-select.component.d.ts +1 -1
  32. package/lib/selects/product-select/product-select.component.d.ts +1 -1
  33. package/lib/selects/setting-select/setting-select.component.d.ts +1 -1
  34. package/lib/setting-item/setting-item.component.d.ts +1 -1
  35. package/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.d.ts +1 -1
  36. package/lib/setting-list/setting/rollout-rules/rollout-rules.component.d.ts +2 -2
  37. package/lib/setting-list/setting/setting.component.d.ts +1 -1
  38. package/lib/setting-list/setting/value/value.component.d.ts +1 -1
  39. package/lib/setting-list/setting-list.component.d.ts +1 -1
  40. package/package.json +9 -15
  41. package/public-api.scss +15 -1
  42. package/esm2020/lib/_directives/input-display-normalizer.directive.mjs +0 -38
  43. package/esm2020/lib/_services/form-helper.mjs +0 -104
  44. package/esm2020/lib/_services/setting-list-form-helper.mjs +0 -171
  45. package/esm2020/lib/authorization/authorization.component.mjs +0 -62
  46. package/esm2020/lib/dialogs/expand-dialog/expand-dialog.component.mjs +0 -80
  47. package/esm2020/lib/dialogs/reason-dialog/reason-dialog.component.mjs +0 -36
  48. package/esm2020/lib/ng-configcat-publicapi-ui.module.mjs +0 -179
  49. package/esm2020/lib/selects/config-select/config-select.component.mjs +0 -60
  50. package/esm2020/lib/selects/environment-select/environment-select.component.mjs +0 -47
  51. package/esm2020/lib/selects/product-select/product-select.component.mjs +0 -40
  52. package/esm2020/lib/selects/setting-select/setting-select.component.mjs +0 -47
  53. package/esm2020/lib/setting-item/setting-item.component.mjs +0 -116
  54. package/esm2020/lib/setting-list/setting/rollout-percentage-items/rollout-percentage-items.component.mjs +0 -81
  55. package/esm2020/lib/setting-list/setting/rollout-rules/rollout-rules.component.mjs +0 -293
  56. package/esm2020/lib/setting-list/setting/value/value.component.mjs +0 -37
  57. package/esm2020/lib/setting-list/setting-list.component.mjs +0 -194
  58. package/fesm2015/ng-configcat-publicapi-ui.mjs +0 -1786
  59. package/fesm2015/ng-configcat-publicapi-ui.mjs.map +0 -1
  60. /package/{esm2020 → esm2022}/lib/_directives/index.mjs +0 -0
  61. /package/{esm2020 → esm2022}/lib/_models/deleteSettingModel.mjs +0 -0
  62. /package/{esm2020 → esm2022}/lib/_models/index.mjs +0 -0
  63. /package/{esm2020 → esm2022}/lib/_models/settingValuesModel.mjs +0 -0
  64. /package/{esm2020 → esm2022}/lib/_models/updateSettingValuesModel.mjs +0 -0
  65. /package/{esm2020 → esm2022}/lib/_services/index.mjs +0 -0
  66. /package/{esm2020 → esm2022}/lib/_services/platform-helper.mjs +0 -0
  67. /package/{esm2020 → esm2022}/ng-configcat-publicapi-ui.mjs +0 -0
  68. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -0,0 +1,293 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { moveItemInArray } from '@angular/cdk/drag-drop';
4
+ import { valid } from 'semver';
5
+ import { ExpandDialogComponent } from '../../../dialogs/expand-dialog/expand-dialog.component';
6
+ import { SettingType, RolloutRuleComparator, SegmentComparator } from 'ng-configcat-publicapi';
7
+ import { FormHelper } from '../../../_services/form-helper';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/material/dialog";
10
+ import * as i2 from "../../../_services/setting-list-form-helper";
11
+ import * as i3 from "@angular/common";
12
+ import * as i4 from "@angular/forms";
13
+ import * as i5 from "@angular/material/core";
14
+ import * as i6 from "@angular/material/input";
15
+ import * as i7 from "@angular/material/icon";
16
+ import * as i8 from "@angular/material/tooltip";
17
+ import * as i9 from "@angular/material/chips";
18
+ import * as i10 from "@angular/material/autocomplete";
19
+ import * as i11 from "@angular/cdk/drag-drop";
20
+ import * as i12 from "../value/value.component";
21
+ import * as i13 from "../../../_directives/input-display-normalizer.directive";
22
+ export class RolloutRulesComponent {
23
+ constructor(dialog, settingListFormHelper) {
24
+ this.dialog = dialog;
25
+ this.settingListFormHelper = settingListFormHelper;
26
+ this.readOnly = false;
27
+ this.SettingType = SettingType;
28
+ this.defaultComparisonAttributes = ['Identifier', 'Email', 'Country'];
29
+ this.rolloutRuleComparators = [
30
+ { value: RolloutRuleComparator.IsOneOf, label: 'IS ONE OF (cleartext)' },
31
+ { value: RolloutRuleComparator.IsNotOneOf, label: 'IS NOT ONE OF (cleartext)' },
32
+ { value: RolloutRuleComparator.Contains, label: 'CONTAINS (cleartext)' },
33
+ { value: RolloutRuleComparator.DoesNotContain, label: 'DOES NOT CONTAIN (cleartext)' },
34
+ { value: RolloutRuleComparator.SemVerIsOneOf, label: 'IS ONE OF (SemVer)' },
35
+ { value: RolloutRuleComparator.SemVerIsNotOneOf, label: 'IS NOT ONE OF (SemVer)' },
36
+ { value: RolloutRuleComparator.SemVerLess, label: '< (SemVer)' },
37
+ { value: RolloutRuleComparator.SemVerLessOrEquals, label: '<= (SemVer)' },
38
+ { value: RolloutRuleComparator.SemVerGreater, label: '> (SemVer)' },
39
+ { value: RolloutRuleComparator.SemVerGreaterOrEquals, label: '>= (SemVer)' },
40
+ { value: RolloutRuleComparator.NumberEquals, label: '= (Number)' },
41
+ { value: RolloutRuleComparator.NumberDoesNotEqual, label: '!= (Number)' },
42
+ { value: RolloutRuleComparator.NumberLess, label: '< (Number)' },
43
+ { value: RolloutRuleComparator.NumberLessOrEquals, label: '<= (Number)' },
44
+ { value: RolloutRuleComparator.NumberGreater, label: '> (Number)' },
45
+ { value: RolloutRuleComparator.NumberGreaterOrEquals, label: '>= (Number)' },
46
+ { value: RolloutRuleComparator.SensitiveIsOneOf, label: 'IS ONE OF (hashed)' },
47
+ { value: RolloutRuleComparator.SensitiveIsNotOneOf, label: 'IS NOT ONE OF (hashed)' },
48
+ ];
49
+ this.segmentComparators = [
50
+ { value: SegmentComparator.IsIn, label: 'IS IN SEGMENT' },
51
+ { value: SegmentComparator.IsNotIn, label: 'IS NOT IN SEGMENT' },
52
+ ];
53
+ }
54
+ setting() {
55
+ return this.formGroup.get('setting')?.value;
56
+ }
57
+ rolloutRules() {
58
+ return this.formGroup.get('rolloutRules');
59
+ }
60
+ comparisonAttributes() {
61
+ return this.formGroup.root.get('comparisonAttributes')?.value;
62
+ }
63
+ removeRule(index) {
64
+ this.rolloutRules().removeAt(index);
65
+ this.rolloutRules().markAsDirty();
66
+ }
67
+ onDrop(event) {
68
+ const rolloutRules = this.rolloutRules().controls;
69
+ moveItemInArray(rolloutRules, event.previousIndex, event.currentIndex);
70
+ this.formGroup.markAsDirty();
71
+ }
72
+ attributeChanged(event, comparisonAttribute) {
73
+ if (this.defaultComparisonAttributes.indexOf(event.value) !== -1) {
74
+ if (comparisonAttribute.value !== event.value) {
75
+ comparisonAttribute.setValue(event.value);
76
+ this.formGroup.markAsDirty();
77
+ }
78
+ }
79
+ else {
80
+ if (comparisonAttribute.value !== '') {
81
+ comparisonAttribute.setValue('');
82
+ this.formGroup.markAsDirty();
83
+ }
84
+ }
85
+ }
86
+ getPlaceHolder(rolloutRule) {
87
+ if (!rolloutRule.controls.comparisonAttribute.value) {
88
+ return '';
89
+ }
90
+ switch (rolloutRule.controls.comparator.value) {
91
+ case RolloutRuleComparator.IsOneOf:
92
+ case RolloutRuleComparator.IsNotOneOf:
93
+ case RolloutRuleComparator.SensitiveIsOneOf:
94
+ case RolloutRuleComparator.SensitiveIsNotOneOf:
95
+ switch (rolloutRule.controls.comparisonAttribute.value.toLowerCase()) {
96
+ case 'identifier':
97
+ return 'e.g: user_id1, user_id2, user_id3';
98
+ case 'email':
99
+ return 'e.g: jane@example.com, john@example.com';
100
+ case 'country':
101
+ return 'e.g: France, Brazil';
102
+ default:
103
+ return 'e.g: value1, value2, value3';
104
+ }
105
+ case RolloutRuleComparator.Contains:
106
+ case RolloutRuleComparator.DoesNotContain:
107
+ switch (rolloutRule.controls.comparisonAttribute.value.toLowerCase()) {
108
+ case 'identifier':
109
+ return 'part-of-id';
110
+ case 'email':
111
+ return 'e.g: @example.com';
112
+ case 'country':
113
+ return 'e.g: United';
114
+ default:
115
+ return 'e.g: any-part-of-your-value-string';
116
+ }
117
+ case RolloutRuleComparator.SemVerIsOneOf:
118
+ case RolloutRuleComparator.SemVerIsNotOneOf:
119
+ return 'e.g: 1.0.0, 2.0.1';
120
+ case RolloutRuleComparator.SemVerLessOrEquals:
121
+ case RolloutRuleComparator.SemVerLess:
122
+ case RolloutRuleComparator.SemVerGreater:
123
+ case RolloutRuleComparator.SemVerGreaterOrEquals:
124
+ return 'e.g: 1.0.0';
125
+ case RolloutRuleComparator.NumberEquals:
126
+ case RolloutRuleComparator.NumberDoesNotEqual:
127
+ case RolloutRuleComparator.NumberLess:
128
+ case RolloutRuleComparator.NumberLessOrEquals:
129
+ case RolloutRuleComparator.NumberGreater:
130
+ case RolloutRuleComparator.NumberGreaterOrEquals:
131
+ return 'e.g: 42';
132
+ }
133
+ return '';
134
+ }
135
+ getComparisonValueType(rolloutRule) {
136
+ return this.settingListFormHelper.getComparisonValueType(rolloutRule.controls.comparator.value);
137
+ }
138
+ getInfoClass(rolloutRule) {
139
+ if (!rolloutRule.controls.comparisonAttribute.value) {
140
+ return 'info';
141
+ }
142
+ switch (rolloutRule.controls.comparator.value) {
143
+ case RolloutRuleComparator.IsOneOf:
144
+ case RolloutRuleComparator.IsNotOneOf:
145
+ case RolloutRuleComparator.Contains:
146
+ case RolloutRuleComparator.DoesNotContain:
147
+ return 'warn';
148
+ default:
149
+ return 'info';
150
+ }
151
+ }
152
+ getInfoTooltip(rolloutRule) {
153
+ if (!rolloutRule.controls.comparisonAttribute.value) {
154
+ return 'Learn more about comparators';
155
+ }
156
+ switch (rolloutRule.controls.comparator.value) {
157
+ case RolloutRuleComparator.IsOneOf:
158
+ case RolloutRuleComparator.IsNotOneOf:
159
+ case RolloutRuleComparator.Contains:
160
+ case RolloutRuleComparator.DoesNotContain:
161
+ return 'Consider using sensitive text comparators. Click to learn more.';
162
+ default:
163
+ return 'Click to learn more about comparators';
164
+ }
165
+ }
166
+ comparatorChanged(rolloutRule) {
167
+ let validators = [];
168
+ switch (rolloutRule.controls.comparator.value) {
169
+ case RolloutRuleComparator.IsOneOf:
170
+ case RolloutRuleComparator.IsNotOneOf:
171
+ case RolloutRuleComparator.SensitiveIsOneOf:
172
+ case RolloutRuleComparator.SensitiveIsNotOneOf:
173
+ case RolloutRuleComparator.Contains:
174
+ case RolloutRuleComparator.DoesNotContain:
175
+ validators = [Validators.required, Validators.maxLength(65535)];
176
+ break;
177
+ case RolloutRuleComparator.SemVerIsOneOf:
178
+ case RolloutRuleComparator.SemVerIsNotOneOf:
179
+ validators = [Validators.required, this.validateSemVerList];
180
+ break;
181
+ case RolloutRuleComparator.SemVerLessOrEquals:
182
+ case RolloutRuleComparator.SemVerLess:
183
+ case RolloutRuleComparator.SemVerGreater:
184
+ case RolloutRuleComparator.SemVerGreaterOrEquals:
185
+ validators = [Validators.required, this.validateSemVer];
186
+ break;
187
+ case RolloutRuleComparator.NumberEquals:
188
+ case RolloutRuleComparator.NumberDoesNotEqual:
189
+ case RolloutRuleComparator.NumberLess:
190
+ case RolloutRuleComparator.NumberLessOrEquals:
191
+ case RolloutRuleComparator.NumberGreater:
192
+ case RolloutRuleComparator.NumberGreaterOrEquals:
193
+ validators = [Validators.required, Validators.min(-1.79769313486232E+308), Validators.max(1.79769313486232E+308)];
194
+ break;
195
+ }
196
+ rolloutRule.controls.comparisonValue.setValidators(validators);
197
+ if (this.getComparisonValueType(rolloutRule) === "number") {
198
+ const oldValue = rolloutRule.controls.comparisonValue.value;
199
+ rolloutRule.controls.comparisonValue.setValue(FormHelper.normalizeNumberStoredAsString(rolloutRule.controls.comparisonValue.value));
200
+ if (oldValue !== rolloutRule.controls.comparisonValue.value) {
201
+ rolloutRule.controls.comparisonValue.markAsTouched();
202
+ }
203
+ }
204
+ rolloutRule.controls.comparisonValue.updateValueAndValidity();
205
+ }
206
+ isListType(rolloutRule) {
207
+ switch (rolloutRule.controls.comparator.value) {
208
+ case RolloutRuleComparator.IsOneOf:
209
+ case RolloutRuleComparator.IsNotOneOf:
210
+ case RolloutRuleComparator.SensitiveIsOneOf:
211
+ case RolloutRuleComparator.SensitiveIsNotOneOf:
212
+ case RolloutRuleComparator.SemVerIsOneOf:
213
+ case RolloutRuleComparator.SemVerIsNotOneOf:
214
+ return true;
215
+ default:
216
+ return false;
217
+ }
218
+ }
219
+ validateSemVer(c) {
220
+ if (valid(c.value) === null) {
221
+ return {
222
+ validateSemVer: {
223
+ valid: false
224
+ }
225
+ };
226
+ }
227
+ return null;
228
+ }
229
+ validateSemVerList(c) {
230
+ if (!c.value) {
231
+ return {
232
+ validateSemVerList: {
233
+ valid: false
234
+ }
235
+ };
236
+ }
237
+ const semvers = c.value.split(',').map((s) => s.trim());
238
+ if (semvers.find((s) => s && s !== '' && valid(s) === null)) {
239
+ return {
240
+ validateSemVerList: {
241
+ valid: false
242
+ }
243
+ };
244
+ }
245
+ return null;
246
+ }
247
+ popOut(rolloutRule) {
248
+ this.dialog.open(ExpandDialogComponent, {
249
+ width: '640px',
250
+ data: {
251
+ control: rolloutRule.controls.comparisonValue,
252
+ multiline: this.isListType(rolloutRule)
253
+ }
254
+ });
255
+ }
256
+ trackByIndex(index) {
257
+ return index;
258
+ }
259
+ getRolloutRuleValueFormControl(rolloutRule) {
260
+ return rolloutRule.controls.value;
261
+ }
262
+ getRolloutRuleComparisonValueFormControl(rolloutRule) {
263
+ return rolloutRule.controls.comparisonValue;
264
+ }
265
+ getRolloutRuleComparisonAttributeFormControl(rolloutRule) {
266
+ return rolloutRule.controls.comparisonAttribute;
267
+ }
268
+ getRolloutRuleTypeFormControl(rolloutRule) {
269
+ return rolloutRule.controls.type;
270
+ }
271
+ getRolloutRuleComparatorFormControl(rolloutRule) {
272
+ return rolloutRule.controls.comparator;
273
+ }
274
+ getRolloutRuleSegmentComparatorFormControl(rolloutRule) {
275
+ return rolloutRule.controls.segmentComparator;
276
+ }
277
+ getRolloutRuleSegmentIdFormControl(rolloutRule) {
278
+ return rolloutRule.controls.segmentId;
279
+ }
280
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: RolloutRulesComponent, deps: [{ token: i1.MatDialog }, { token: i2.SettingListFormHelper }], target: i0.ɵɵFactoryTarget.Component }); }
281
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: RolloutRulesComponent, selector: "configcat-rollout-rules", inputs: { formGroup: "formGroup", readOnly: "readOnly", segments: "segments" }, ngImport: i0, template: "<div [formGroup]=\"formGroup\">\n <div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"readOnly\"\n [cdkDropListData]=\"rolloutRules().controls\">\n <div *ngFor=\"let rolloutRule of rolloutRules().controls; trackBy: trackByIndex; let i = index\" cdkDrag>\n <div class=\"targeting-row\">\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 0\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user's</a>\n </div>\n\n <select class=\"custom-select attribute-select\" matTooltip=\"Comparison attribute\"\n matTooltipPosition=\"above\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\"\n [disabled]=\"readOnly\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === getRolloutRuleComparisonAttributeFormControl(rolloutRule).value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) === -1\">\n Custom\n </option>\n </select>\n\n\n <span class=\"attribute-span\" matTooltip=\"Custom user attribute\" matTooltipPosition=\"above\"\n [hidden]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) !== -1\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid\">*</span>\n <input\n [ngClass]=\"{'invalid': getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid}\"\n type=\"text\" matInput [matAutocomplete]=\"auto\"\n [formControl]=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule)\" class=\"attribute\"\n placeholder=\"e.g. Eye color\">\n </span>\n\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of comparisonAttributes()\" [value]=\"option\">\n {{option}}\n </mat-option>\n </mat-autocomplete>\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select\" [formControl]=\"getRolloutRuleComparatorFormControl(rolloutRule)\"\n matTooltip=\"Comparator\" matTooltipPosition=\"above\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"CONFIDENTIAL TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(16, 18)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(0, 4)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"SEMANTIC VERSION\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(4, 10)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"NUMBER\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(10, 16)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n </select>\n <div [class]=\"getInfoClass(rolloutRule)\" [matTooltip]=\"getInfoTooltip(rolloutRule)\">\n <a href=\"https://configcat.com/docs/advanced/targeting/#comparator\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <mat-icon>info</mat-icon>\n </a>\n </div>\n </div>\n\n <div class=\"comparison-value\">\n <span class=\"error\"\n *ngIf=\"getRolloutRuleComparisonValueFormControl(rolloutRule).invalid\">*</span>\n\n <input [ngClass]=\"{'invalid': getRolloutRuleComparisonValueFormControl(rolloutRule).invalid}\"\n [formControl]=\"getRolloutRuleComparisonValueFormControl(rolloutRule)\"\n [type]=\"getComparisonValueType(rolloutRule)\" [placeholder]=\"getPlaceHolder(rolloutRule)\"\n matTooltip=\"Comparison value\" matTooltipPosition=\"above\" inputDisplayNormalizer>\n <div class=\"expand\" matTooltip=\"Pop-out Editor\" matTooltipPosition=\"above\"\n (click)=\"popOut(rolloutRule)\" *ngIf=\"getComparisonValueType(rolloutRule)==='text'\">\n <mat-icon>height</mat-icon>\n </div>\n </div>\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 1\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user</a>\n </div>\n\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select segment-comparator\"\n [formControl]=\"getRolloutRuleSegmentComparatorFormControl(rolloutRule)\"\n matTooltip=\"Segment comparator\" matTooltipPosition=\"above\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n </div>\n\n <div class=\"select-wrapper\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleSegmentIdFormControl(rolloutRule).invalid\">*</span>\n <select class=\"custom-select segment-select\"\n [formControl]=\"getRolloutRuleSegmentIdFormControl(rolloutRule)\" matTooltip=\"Segment\"\n matTooltipPosition=\"above\"\n [ngClass]=\"{'invalid': getRolloutRuleSegmentIdFormControl(rolloutRule).invalid}\">\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\">\n {{segment.name}}\n </option>\n </select>\n </div>\n\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-set>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-set>\n </div>\n\n <configcat-value class=\"served-value\"\n [valueFormControl]=\"getRolloutRuleValueFormControl(rolloutRule)\" [setting]=\"setting()\">\n </configcat-value>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.targeting-row{border:1px solid #d5d5d5;background-color:#fff;margin:1em;display:flex;position:relative;padding:.5em 0}.targeting-row:hover{background-color:#dbedff}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px;border-radius:50%;background-color:#fff;height:18px;width:18px}.targeting-row .info a{color:#0068f0;opacity:.5}.targeting-row .info a:hover{opacity:1}.targeting-row .info mat-icon{font-size:18px;height:18px;width:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:166px;height:18px;width:18px;border-radius:50%;background-color:#fff}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px;height:18px;width:18px}.custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;height:30px;min-height:30px;line-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.custom-select:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields{justify-content:left;max-width:1060px;flex-grow:100}.fields .if{display:flex;align-items:center}.fields .if>*{margin:0 .5em}.fields .if .spacing{margin-right:41px}.fields .if .user-link{width:40px}.fields .if .chip{font-size:12px;background-color:#67b1fc3d}.fields .attribute-span{margin-left:.5em;display:flex;align-items:center}.fields .attribute-span[hidden]{display:none}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;flex-grow:100;min-width:170px;padding:0 30px 0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300;font-size:13.3px}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin:0 5px}.fields .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.fields .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.fields .delete:hover mat-icon{opacity:1}.fields .drag-handle{position:absolute;cursor:-webkit-grab;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .segment-comparator,.fields .segment-select{margin-left:0;margin-right:.5em}.fields .segment-more mat-icon{position:relative;top:3px;cursor:pointer;font-size:16px;height:16px;width:16px;color:#797979;margin-top:3px}.fields .comparison-value{flex-grow:100;min-width:150px;display:flex;align-items:center;margin-left:.5em;margin-right:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;min-width:150px;flex-grow:100;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value input[type=text]{padding-right:30px}.fields .comparison-value input:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields .comparison-value .invalid{border:1px solid #ff5252}.fields .comparison-value .expand{position:relative;height:24px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.fields .comparison-value .expand mat-icon{transform:rotate(45deg)}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 2px 0 5px}.value .serve .chip{font-size:12px;background-color:#67b1fc3d}.value .served-value{margin:3px 0}.flex{display:flex;flex-wrap:wrap;align-items:center}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 920px){.value .served-value{margin:3px 7px 3px 0}.targeting-row .fields .drag-handle{left:-18px}}@media (max-width: 410px){.value .served-value{margin:7px 7px 3px 4px}}@media (max-width: 510px){.fields .comparison-value .error{display:none}}@media (max-width: 650px){.targeting-row{flex-direction:column}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:7px 7px 0}.targeting-row .fields .comparison-value{margin:7px}.targeting-row .fields .comparison-value input{margin:0 4px 0 0}.targeting-row .fields .attribute-span{margin:7px 7px 0}.targeting-row .fields .if{font-size:12px}.targeting-row .fields .if .spacing{margin-right:3px}}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i9.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["role", "id", "aria-label", "aria-description", "value", "color", "removable", "highlighted", "disableRipple", "disabled", "tabIndex"], outputs: ["removed", "destroyed"], exportAs: ["matChip"] }, { kind: "component", type: i9.MatChipSet, selector: "mat-chip-set", inputs: ["disabled", "role", "tabIndex"] }, { kind: "component", type: i10.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "directive", type: i10.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: i11.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i11.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i11.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i12.ValueComponent, selector: "configcat-value", inputs: ["valueFormControl", "setting"] }, { kind: "directive", type: i13.InputDisplayNormalizerDirective, selector: "input[inputDisplayNormalizer]" }] }); }
282
+ }
283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: RolloutRulesComponent, decorators: [{
284
+ type: Component,
285
+ args: [{ selector: 'configcat-rollout-rules', template: "<div [formGroup]=\"formGroup\">\n <div cdkDropList (cdkDropListDropped)=\"onDrop($event)\" [cdkDropListDisabled]=\"readOnly\"\n [cdkDropListData]=\"rolloutRules().controls\">\n <div *ngFor=\"let rolloutRule of rolloutRules().controls; trackBy: trackByIndex; let i = index\" cdkDrag>\n <div class=\"targeting-row\">\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 0\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user's</a>\n </div>\n\n <select class=\"custom-select attribute-select\" matTooltip=\"Comparison attribute\"\n matTooltipPosition=\"above\"\n (change)=\"attributeChanged($event.target, getRolloutRuleComparisonAttributeFormControl(rolloutRule))\"\n [disabled]=\"readOnly\">\n <option *ngFor=\"let comparisonAttribute of defaultComparisonAttributes\"\n [selected]=\"comparisonAttribute === getRolloutRuleComparisonAttributeFormControl(rolloutRule).value\">\n {{comparisonAttribute}}</option>\n <option\n [selected]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) === -1\">\n Custom\n </option>\n </select>\n\n\n <span class=\"attribute-span\" matTooltip=\"Custom user attribute\" matTooltipPosition=\"above\"\n [hidden]=\"defaultComparisonAttributes.indexOf(getRolloutRuleComparisonAttributeFormControl(rolloutRule).value) !== -1\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid\">*</span>\n <input\n [ngClass]=\"{'invalid': getRolloutRuleComparisonAttributeFormControl(rolloutRule).invalid}\"\n type=\"text\" matInput [matAutocomplete]=\"auto\"\n [formControl]=\"getRolloutRuleComparisonAttributeFormControl(rolloutRule)\" class=\"attribute\"\n placeholder=\"e.g. Eye color\">\n </span>\n\n <mat-autocomplete #auto=\"matAutocomplete\">\n <mat-option *ngFor=\"let option of comparisonAttributes()\" [value]=\"option\">\n {{option}}\n </mat-option>\n </mat-autocomplete>\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select\" [formControl]=\"getRolloutRuleComparatorFormControl(rolloutRule)\"\n matTooltip=\"Comparator\" matTooltipPosition=\"above\"\n (change)=\"comparatorChanged(rolloutRule)\">\n <optgroup label=\"CONFIDENTIAL TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(16, 18)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"TEXT\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(0, 4)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"SEMANTIC VERSION\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(4, 10)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n <optgroup label=\"NUMBER\">\n <option *ngFor=\"let comparator of rolloutRuleComparators.slice(10, 16)\"\n [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </optgroup>\n </select>\n <div [class]=\"getInfoClass(rolloutRule)\" [matTooltip]=\"getInfoTooltip(rolloutRule)\">\n <a href=\"https://configcat.com/docs/advanced/targeting/#comparator\" target=\"_blank\"\n rel=\"noopener noreferrer\">\n <mat-icon>info</mat-icon>\n </a>\n </div>\n </div>\n\n <div class=\"comparison-value\">\n <span class=\"error\"\n *ngIf=\"getRolloutRuleComparisonValueFormControl(rolloutRule).invalid\">*</span>\n\n <input [ngClass]=\"{'invalid': getRolloutRuleComparisonValueFormControl(rolloutRule).invalid}\"\n [formControl]=\"getRolloutRuleComparisonValueFormControl(rolloutRule)\"\n [type]=\"getComparisonValueType(rolloutRule)\" [placeholder]=\"getPlaceHolder(rolloutRule)\"\n matTooltip=\"Comparison value\" matTooltipPosition=\"above\" inputDisplayNormalizer>\n <div class=\"expand\" matTooltip=\"Pop-out Editor\" matTooltipPosition=\"above\"\n (click)=\"popOut(rolloutRule)\" *ngIf=\"getComparisonValueType(rolloutRule)==='text'\">\n <mat-icon>height</mat-icon>\n </div>\n </div>\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n <div class=\"fields flex\" *ngIf=\"getRolloutRuleTypeFormControl(rolloutRule).value === 1\">\n <div class=\"drag-handle\" cdkDragHandle matTooltip=\"Drag here to reorder\" matTooltipPosition=\"above\"\n *ngIf=\"!readOnly\">\n <mat-icon>drag_indicator</mat-icon>\n </div>\n <div class=\"if\">\n <mat-chip-set [class.spacing]=\"i === 0\">\n <mat-chip class=\"chip\">{{ i === 0 ? 'IF' : 'ELSE IF' }}</mat-chip>\n </mat-chip-set>\n <a href=\"https://configcat.com/docs/advanced/user-object\" target=\"_blank\"\n rel=\"noopener noreferrer\">user</a>\n </div>\n\n\n <div class=\"select-wrapper\">\n <select class=\"custom-select segment-comparator\"\n [formControl]=\"getRolloutRuleSegmentComparatorFormControl(rolloutRule)\"\n matTooltip=\"Segment comparator\" matTooltipPosition=\"above\">\n <option *ngFor=\"let comparator of segmentComparators\" [ngValue]=\"comparator.value\">\n {{comparator.label}}\n </option>\n </select>\n </div>\n\n <div class=\"select-wrapper\">\n <span class=\"attribute-error\"\n *ngIf=\"getRolloutRuleSegmentIdFormControl(rolloutRule).invalid\">*</span>\n <select class=\"custom-select segment-select\"\n [formControl]=\"getRolloutRuleSegmentIdFormControl(rolloutRule)\" matTooltip=\"Segment\"\n matTooltipPosition=\"above\"\n [ngClass]=\"{'invalid': getRolloutRuleSegmentIdFormControl(rolloutRule).invalid}\">\n <option *ngFor=\"let segment of segments\" [ngValue]=\"segment.segmentId\">\n {{segment.name}}\n </option>\n </select>\n </div>\n\n\n <div class=\"delete\" matTooltip=\"Remove targeting rule\" *ngIf=\"!readOnly\" (click)=\"removeRule(i)\">\n <mat-icon>cancel</mat-icon>\n </div>\n </div>\n\n\n <div class=\"value flex\">\n <div class=\"serve\" *ngIf=\"setting().settingType !== SettingType.Boolean\">\n <mat-chip-set>\n <mat-chip class=\"chip\">Serve:</mat-chip>\n </mat-chip-set>\n </div>\n\n <configcat-value class=\"served-value\"\n [valueFormControl]=\"getRolloutRuleValueFormControl(rolloutRule)\" [setting]=\"setting()\">\n </configcat-value>\n </div>\n </div>\n </div>\n </div>\n</div>", styles: [".cdk-drop-list-dragging .cdk-drag{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-animating{transition:transform .3s cubic-bezier(0,0,.2,1)}.targeting-row{border:1px solid #d5d5d5;background-color:#fff;margin:1em;display:flex;position:relative;padding:.5em 0}.targeting-row:hover{background-color:#dbedff}.targeting-row .select-wrapper{position:relative}.targeting-row .info{position:absolute;cursor:pointer;top:-8px;left:166px;border-radius:50%;background-color:#fff;height:18px;width:18px}.targeting-row .info a{color:#0068f0;opacity:.5}.targeting-row .info a:hover{opacity:1}.targeting-row .info mat-icon{font-size:18px;height:18px;width:18px}.targeting-row .warn{position:absolute;cursor:pointer;top:-8px;left:166px;height:18px;width:18px;border-radius:50%;background-color:#fff}.targeting-row .warn a{color:#fdc67f}.targeting-row .warn a:hover{color:#ff9200}.targeting-row .warn mat-icon{font-size:18px;height:18px;width:18px}.custom-select{margin-left:.5em;width:170px;background-color:#fff;border:1px solid #e5e5e5;height:30px;min-height:30px;line-height:30px;min-width:170px;font-size:.8em;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.custom-select:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields{justify-content:left;max-width:1060px;flex-grow:100}.fields .if{display:flex;align-items:center}.fields .if>*{margin:0 .5em}.fields .if .spacing{margin-right:41px}.fields .if .user-link{width:40px}.fields .if .chip{font-size:12px;background-color:#67b1fc3d}.fields .attribute-span{margin-left:.5em;display:flex;align-items:center}.fields .attribute-span[hidden]{display:none}.fields .attribute{width:170px;background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;flex-grow:100;min-width:170px;padding:0 30px 0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300;font-size:13.3px}.fields .invalid{border:1px solid #ff5252}.fields .attribute-error{color:#ff5252;margin:0 5px}.fields .delete{position:absolute;cursor:pointer;top:-9px;right:-10px;z-index:999;border-radius:50%;background-color:#fff;height:20px;width:20px;color:#ed5251}.fields .delete mat-icon{font-size:20px;height:20px;width:20px;opacity:.5}.fields .delete:hover mat-icon{opacity:1}.fields .drag-handle{position:absolute;cursor:-webkit-grab;cursor:-moz-grab;left:-20px;top:14px}.fields .drag-handle mat-icon{font-size:20px}.fields .attribute-select{min-width:100px;width:100px;margin-left:0}.fields .segment-comparator,.fields .segment-select{margin-left:0;margin-right:.5em}.fields .segment-more mat-icon{position:relative;top:3px;cursor:pointer;font-size:16px;height:16px;width:16px;color:#797979;margin-top:3px}.fields .comparison-value{flex-grow:100;min-width:150px;display:flex;align-items:center;margin-left:.5em;margin-right:.5em}.fields .comparison-value .error{color:#ff5252;margin:0 5px}.fields .comparison-value input{background-color:#fff;border:1px solid #e5e5e5;margin:3px 0;min-height:28px;min-width:150px;flex-grow:100;padding:0 5px;font-family:Montserrat,Roboto,Helvetica Neue,sans-serif;font-weight:300}.fields .comparison-value input[type=text]{padding-right:30px}.fields .comparison-value input:focus{outline-color:#e5e5e5;outline-offset:-1px}.fields .comparison-value .invalid{border:1px solid #ff5252}.fields .comparison-value .expand{position:relative;height:24px;cursor:pointer;margin-left:-28px;z-index:1;color:#b3b3b3;background-color:#fff}.fields .comparison-value .expand mat-icon{transform:rotate(45deg)}.value{margin-left:auto;flex-wrap:nowrap}.value .serve{margin:0 2px 0 5px}.value .serve .chip{font-size:12px;background-color:#67b1fc3d}.value .served-value{margin:3px 0}.flex{display:flex;flex-wrap:wrap;align-items:center}@media (max-width: 1200px){.targeting-row{flex-wrap:wrap}.targeting-row .fields{max-width:500px}}@media (max-width: 920px){.value .served-value{margin:3px 7px 3px 0}.targeting-row .fields .drag-handle{left:-18px}}@media (max-width: 410px){.value .served-value{margin:7px 7px 3px 4px}}@media (max-width: 510px){.fields .comparison-value .error{display:none}}@media (max-width: 650px){.targeting-row{flex-direction:column}.targeting-row .help{left:161px}.targeting-row .fields{flex-direction:column;align-items:stretch}.targeting-row .fields .custom-select{margin:7px 7px 0}.targeting-row .fields .comparison-value{margin:7px}.targeting-row .fields .comparison-value input{margin:0 4px 0 0}.targeting-row .fields .attribute-span{margin:7px 7px 0}.targeting-row .fields .if{font-size:12px}.targeting-row .fields .if .spacing{margin-right:3px}}\n"] }]
286
+ }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.SettingListFormHelper }], propDecorators: { formGroup: [{
287
+ type: Input
288
+ }], readOnly: [{
289
+ type: Input
290
+ }], segments: [{
291
+ type: Input
292
+ }] } });
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sbG91dC1ydWxlcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1jb25maWdjYXQtcHVibGljYXBpLXVpL3NyYy9saWIvc2V0dGluZy1saXN0L3NldHRpbmcvcm9sbG91dC1ydWxlcy9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbmZpZ2NhdC1wdWJsaWNhcGktdWkvc3JjL2xpYi9zZXR0aW5nLWxpc3Qvc2V0dGluZy9yb2xsb3V0LXJ1bGVzL3JvbGxvdXQtcnVsZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUEwRCxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUUvRixPQUFPLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFvQixpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRWpILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBTzVELE1BQU0sT0FBTyxxQkFBcUI7SUF1Q2hDLFlBQ1UsTUFBaUIsRUFDakIscUJBQTRDO1FBRDVDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQXRDN0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUcxQixnQkFBVyxHQUFHLFdBQVcsQ0FBQztRQUUxQixnQ0FBMkIsR0FBRyxDQUFDLFlBQVks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LENBQUM7OEdBNVNVLHFCQUFxQjtrR0FBckIscUJBQXFCLCtJQ2ZsQywwdVRBbUtNOzsyRkRwSk8scUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLHlCQUF5QjtrSEFNMUIsU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtQXJyYXksIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IHZhbGlkIH0gZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IEV4cGFuZERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2RpYWxvZ3MvZXhwYW5kLWRpYWxvZy9leHBhbmQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgU2V0dGluZ1R5cGUsIFJvbGxvdXRSdWxlQ29tcGFyYXRvciwgU2VnbWVudExpc3RNb2RlbCwgU2VnbWVudENvbXBhcmF0b3IgfSBmcm9tICduZy1jb25maWdjYXQtcHVibGljYXBpJztcbmltcG9ydCB7IFNldHRpbmdMaXN0Rm9ybUhlbHBlciB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy9zZXR0aW5nLWxpc3QtZm9ybS1oZWxwZXInO1xuaW1wb3J0IHsgRm9ybUhlbHBlciB9IGZyb20gJy4uLy4uLy4uL19zZXJ2aWNlcy9mb3JtLWhlbHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NvbmZpZ2NhdC1yb2xsb3V0LXJ1bGVzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JvbGxvdXQtcnVsZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yb2xsb3V0LXJ1bGVzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUm9sbG91dFJ1bGVzQ29tcG9uZW50IHtcblxuICBASW5wdXQoKSBmb3JtR3JvdXAhOiBVbnR5cGVkRm9ybUdyb3VwO1xuICBASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBzZWdtZW50cyE6IFNlZ21lbnRMaXN0TW9kZWxbXTtcblxuICBTZXR0aW5nVHlwZSA9IFNldHRpbmdUeXBlO1xuXG4gIGRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcyA9IFsnSWRlbnRpZmllcicsICdFbWFpbCcsICdDb3VudHJ5J107XG5cbiAgcm9sbG91dFJ1bGVDb21wYXJhdG9ycyA9IFtcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZiwgbGFiZWw6ICdJUyBPTkUgT0YgKGNsZWFydGV4dCknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2YsIGxhYmVsOiAnSVMgTk9UIE9ORSBPRiAoY2xlYXJ0ZXh0KScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuQ29udGFpbnMsIGxhYmVsOiAnQ09OVEFJTlMgKGNsZWFydGV4dCknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluLCBsYWJlbDogJ0RPRVMgTk9UIENPTlRBSU4gKGNsZWFydGV4dCknIH0sXG5cbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNPbmVPZiwgbGFiZWw6ICdJUyBPTkUgT0YgKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzTm90T25lT2YsIGxhYmVsOiAnSVMgTk9UIE9ORSBPRiAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyTGVzcywgbGFiZWw6ICc8IChTZW1WZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzT3JFcXVhbHMsIGxhYmVsOiAnPD0gKFNlbVZlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXIsIGxhYmVsOiAnPiAoU2VtVmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlck9yRXF1YWxzLCBsYWJlbDogJz49IChTZW1WZXIpJyB9LFxuXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckVxdWFscywgbGFiZWw6ICc9IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJEb2VzTm90RXF1YWwsIGxhYmVsOiAnIT0gKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3MsIGxhYmVsOiAnPCAoTnVtYmVyKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzLCBsYWJlbDogJzw9IChOdW1iZXIpJyB9LFxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyLCBsYWJlbDogJz4gKE51bWJlciknIH0sXG4gICAgeyB2YWx1ZTogUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFscywgbGFiZWw6ICc+PSAoTnVtYmVyKScgfSxcblxuICAgIHsgdmFsdWU6IFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mLCBsYWJlbDogJ0lTIE9ORSBPRiAoaGFzaGVkKScgfSxcbiAgICB7IHZhbHVlOiBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZiwgbGFiZWw6ICdJUyBOT1QgT05FIE9GIChoYXNoZWQpJyB9LFxuICBdO1xuXG4gIHNlZ21lbnRDb21wYXJhdG9ycyA9IFtcbiAgICB7IHZhbHVlOiBTZWdtZW50Q29tcGFyYXRvci5Jc0luLCBsYWJlbDogJ0lTIElOIFNFR01FTlQnIH0sXG4gICAgeyB2YWx1ZTogU2VnbWVudENvbXBhcmF0b3IuSXNOb3RJbiwgbGFiZWw6ICdJUyBOT1QgSU4gU0VHTUVOVCcgfSxcbiAgXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgc2V0dGluZ0xpc3RGb3JtSGVscGVyOiBTZXR0aW5nTGlzdEZvcm1IZWxwZXIpIHsgfVxuXG4gIHNldHRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLmdldCgnc2V0dGluZycpPy52YWx1ZTtcbiAgfVxuXG4gIHJvbGxvdXRSdWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtR3JvdXAuZ2V0KCdyb2xsb3V0UnVsZXMnKSBhcyBVbnR5cGVkRm9ybUFycmF5O1xuICB9XG5cbiAgY29tcGFyaXNvbkF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybUdyb3VwLnJvb3QuZ2V0KCdjb21wYXJpc29uQXR0cmlidXRlcycpPy52YWx1ZTtcbiAgfVxuXG4gIHJlbW92ZVJ1bGUoaW5kZXg6IGFueSkge1xuICAgIHRoaXMucm9sbG91dFJ1bGVzKCkucmVtb3ZlQXQoaW5kZXgpO1xuICAgIHRoaXMucm9sbG91dFJ1bGVzKCkubWFya0FzRGlydHkoKTtcbiAgfVxuXG4gIG9uRHJvcChldmVudDogYW55KSB7XG4gICAgY29uc3Qgcm9sbG91dFJ1bGVzID0gdGhpcy5yb2xsb3V0UnVsZXMoKS5jb250cm9scztcbiAgICBtb3ZlSXRlbUluQXJyYXkocm9sbG91dFJ1bGVzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgIHRoaXMuZm9ybUdyb3VwLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICBhdHRyaWJ1dGVDaGFuZ2VkKGV2ZW50OiBhbnksIGNvbXBhcmlzb25BdHRyaWJ1dGU6IFVudHlwZWRGb3JtQ29udHJvbCkge1xuICAgIGlmICh0aGlzLmRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKGV2ZW50LnZhbHVlKSAhPT0gLTEpIHtcbiAgICAgIGlmIChjb21wYXJpc29uQXR0cmlidXRlLnZhbHVlICE9PSBldmVudC52YWx1ZSkge1xuICAgICAgICBjb21wYXJpc29uQXR0cmlidXRlLnNldFZhbHVlKGV2ZW50LnZhbHVlKTtcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAubWFya0FzRGlydHkoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUgIT09ICcnKSB7XG4gICAgICAgIGNvbXBhcmlzb25BdHRyaWJ1dGUuc2V0VmFsdWUoJycpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFBsYWNlSG9sZGVyKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBpZiAoIXJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpIHtcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzTm90T25lT2Y6XG4gICAgICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvbkF0dHJpYnV0ZS52YWx1ZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAnaWRlbnRpZmllcic6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogdXNlcl9pZDEsIHVzZXJfaWQyLCB1c2VyX2lkMyc7XG4gICAgICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IGphbmVAZXhhbXBsZS5jb20sIGpvaG5AZXhhbXBsZS5jb20nO1xuICAgICAgICAgIGNhc2UgJ2NvdW50cnknOlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IEZyYW5jZSwgQnJhemlsJztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICdlLmc6IHZhbHVlMSwgdmFsdWUyLCB2YWx1ZTMnO1xuICAgICAgICB9XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Db250YWluczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkRvZXNOb3RDb250YWluOlxuICAgICAgICBzd2l0Y2ggKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgJ2lkZW50aWZpZXInOlxuICAgICAgICAgICAgcmV0dXJuICdwYXJ0LW9mLWlkJztcbiAgICAgICAgICBjYXNlICdlbWFpbCc6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogQGV4YW1wbGUuY29tJztcbiAgICAgICAgICBjYXNlICdjb3VudHJ5JzpcbiAgICAgICAgICAgIHJldHVybiAnZS5nOiBVbml0ZWQnO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gJ2UuZzogYW55LXBhcnQtb2YteW91ci12YWx1ZS1zdHJpbmcnO1xuICAgICAgICB9XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVySXNOb3RPbmVPZjpcbiAgICAgICAgcmV0dXJuICdlLmc6IDEuMC4wLCAyLjAuMSc7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzT3JFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgcmV0dXJuICdlLmc6IDEuMC4wJztcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckVxdWFsczpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckRvZXNOb3RFcXVhbDpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckxlc3M6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzT3JFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJHcmVhdGVyOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlck9yRXF1YWxzOlxuICAgICAgICByZXR1cm4gJ2UuZzogNDInO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldENvbXBhcmlzb25WYWx1ZVR5cGUocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLnNldHRpbmdMaXN0Rm9ybUhlbHBlci5nZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmF0b3IudmFsdWUpO1xuICB9XG5cbiAgZ2V0SW5mb0NsYXNzKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBpZiAoIXJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUpIHtcbiAgICAgIHJldHVybiAnaW5mbyc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW46XG4gICAgICAgIHJldHVybiAnd2Fybic7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ2luZm8nO1xuICAgIH1cbiAgfVxuXG4gIGdldEluZm9Ub29sdGlwKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICBpZiAoIXJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUudmFsdWUpIHtcbiAgICAgIHJldHVybiAnTGVhcm4gbW9yZSBhYm91dCBjb21wYXJhdG9ycyc7XG4gICAgfVxuXG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLkNvbnRhaW5zOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuRG9lc05vdENvbnRhaW46XG4gICAgICAgIHJldHVybiAnQ29uc2lkZXIgdXNpbmcgc2Vuc2l0aXZlIHRleHQgY29tcGFyYXRvcnMuIENsaWNrIHRvIGxlYXJuIG1vcmUuJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnQ2xpY2sgdG8gbGVhcm4gbW9yZSBhYm91dCBjb21wYXJhdG9ycyc7XG4gICAgfVxuICB9XG5cbiAgY29tcGFyYXRvckNoYW5nZWQocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIGxldCB2YWxpZGF0b3JzOiBhbnlbXSA9IFtdO1xuXG4gICAgc3dpdGNoIChyb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJhdG9yLnZhbHVlKSB7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Jc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbnNpdGl2ZUlzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc05vdE9uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuQ29udGFpbnM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5Eb2VzTm90Q29udGFpbjpcbiAgICAgICAgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg2NTUzNSldO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc05vdE9uZU9mOlxuICAgICAgICB2YWxpZGF0b3JzID0gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMudmFsaWRhdGVTZW1WZXJMaXN0XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzT3JFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2VtVmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLnZhbGlkYXRlU2VtVmVyXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJFcXVhbHM6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJEb2VzTm90RXF1YWw6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5OdW1iZXJMZXNzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyTGVzc09yRXF1YWxzOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuTnVtYmVyR3JlYXRlcjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLk51bWJlckdyZWF0ZXJPckVxdWFsczpcbiAgICAgICAgdmFsaWRhdG9ycyA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigtMS43OTc2OTMxMzQ4NjIzMkUrMzA4KSwgVmFsaWRhdG9ycy5tYXgoMS43OTc2OTMxMzQ4NjIzMkUrMzA4KV07XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgIGlmICh0aGlzLmdldENvbXBhcmlzb25WYWx1ZVR5cGUocm9sbG91dFJ1bGUpID09PSBcIm51bWJlclwiKSB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS52YWx1ZTtcbiAgICAgIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS5zZXRWYWx1ZShGb3JtSGVscGVyLm5vcm1hbGl6ZU51bWJlclN0b3JlZEFzU3RyaW5nKHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZS52YWx1ZSkpO1xuICAgICAgaWYgKG9sZFZhbHVlICE9PSByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUudmFsdWUpIHtcbiAgICAgICAgcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyaXNvblZhbHVlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIGlzTGlzdFR5cGUocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHN3aXRjaCAocm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvci52YWx1ZSkge1xuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuSXNPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLklzTm90T25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW5zaXRpdmVJc09uZU9mOlxuICAgICAgY2FzZSBSb2xsb3V0UnVsZUNvbXBhcmF0b3IuU2Vuc2l0aXZlSXNOb3RPbmVPZjpcbiAgICAgIGNhc2UgUm9sbG91dFJ1bGVDb21wYXJhdG9yLlNlbVZlcklzT25lT2Y6XG4gICAgICBjYXNlIFJvbGxvdXRSdWxlQ29tcGFyYXRvci5TZW1WZXJJc05vdE9uZU9mOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVNlbVZlcihjOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcblxuICAgIGlmICh2YWxpZChjLnZhbHVlKSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWRhdGVTZW1WZXI6IHtcbiAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhbGlkYXRlU2VtVmVyTGlzdChjOiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcbiAgICBpZiAoIWMudmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbGlkYXRlU2VtVmVyTGlzdDoge1xuICAgICAgICAgIHZhbGlkOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlbXZlcnMgPSBjLnZhbHVlLnNwbGl0KCcsJykubWFwKChzOiBhbnkpID0+IHMudHJpbSgpKTtcbiAgICBpZiAoc2VtdmVycy5maW5kKChzOiBhbnkpID0+IHMgJiYgcyAhPT0gJycgJiYgdmFsaWQocykgPT09IG51bGwpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZGF0ZVNlbVZlckxpc3Q6IHtcbiAgICAgICAgICB2YWxpZDogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHBvcE91dChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgdGhpcy5kaWFsb2cub3BlbihFeHBhbmREaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNjQwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICBjb250cm9sOiByb2xsb3V0UnVsZS5jb250cm9scy5jb21wYXJpc29uVmFsdWUsXG4gICAgICAgIG11bHRpbGluZTogdGhpcy5pc0xpc3RUeXBlKHJvbGxvdXRSdWxlKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVWYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMudmFsdWUgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25WYWx1ZSBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZTogYW55KSB7XG4gICAgcmV0dXJuIHJvbGxvdXRSdWxlLmNvbnRyb2xzLmNvbXBhcmlzb25BdHRyaWJ1dGUgYXMgVW50eXBlZEZvcm1Db250cm9sO1xuICB9XG5cbiAgZ2V0Um9sbG91dFJ1bGVUeXBlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy50eXBlIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGdldFJvbGxvdXRSdWxlQ29tcGFyYXRvckZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMuY29tcGFyYXRvciBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICBnZXRSb2xsb3V0UnVsZVNlZ21lbnRDb21wYXJhdG9yRm9ybUNvbnRyb2wocm9sbG91dFJ1bGU6IGFueSkge1xuICAgIHJldHVybiByb2xsb3V0UnVsZS5jb250cm9scy5zZWdtZW50Q29tcGFyYXRvciBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIH1cblxuICBnZXRSb2xsb3V0UnVsZVNlZ21lbnRJZEZvcm1Db250cm9sKHJvbGxvdXRSdWxlOiBhbnkpIHtcbiAgICByZXR1cm4gcm9sbG91dFJ1bGUuY29udHJvbHMuc2VnbWVudElkIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgfVxufVxuIiwiPGRpdiBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiPlxuICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3AoJGV2ZW50KVwiIFtjZGtEcm9wTGlzdERpc2FibGVkXT1cInJlYWRPbmx5XCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0RGF0YV09XCJyb2xsb3V0UnVsZXMoKS5jb250cm9sc1wiPlxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb2xsb3V0UnVsZSBvZiByb2xsb3V0UnVsZXMoKS5jb250cm9sczsgdHJhY2tCeTogdHJhY2tCeUluZGV4OyBsZXQgaSA9IGluZGV4XCIgY2RrRHJhZz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YXJnZXRpbmctcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcyBmbGV4XCIgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZVR5cGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUgPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlXCIgY2RrRHJhZ0hhbmRsZSBtYXRUb29sdGlwPVwiRHJhZyBoZXJlIHRvIHJlb3JkZXJcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFyZWFkT25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLXNldCBbY2xhc3Muc3BhY2luZ109XCJpID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPnt7IGkgPT09IDAgPyAnSUYnIDogJ0VMU0UgSUYnIH19PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtc2V0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL2FkdmFuY2VkL3VzZXItb2JqZWN0XCIgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+dXNlcidzPC9hPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdCBhdHRyaWJ1dGUtc2VsZWN0XCIgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gYXR0cmlidXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiYXR0cmlidXRlQ2hhbmdlZCgkZXZlbnQudGFyZ2V0LCBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZWFkT25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyaXNvbkF0dHJpYnV0ZSBvZiBkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJjb21wYXJpc29uQXR0cmlidXRlID09PSBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmlzb25BdHRyaWJ1dGV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJkZWZhdWx0Q29tcGFyaXNvbkF0dHJpYnV0ZXMuaW5kZXhPZihnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUpID09PSAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRyaWJ1dGUtc3BhblwiIG1hdFRvb2x0aXA9XCJDdXN0b20gdXNlciBhdHRyaWJ1dGVcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGlkZGVuXT1cImRlZmF1bHRDb21wYXJpc29uQXR0cmlidXRlcy5pbmRleE9mKGdldFJvbGxvdXRSdWxlQ29tcGFyaXNvbkF0dHJpYnV0ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKS52YWx1ZSkgIT09IC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF0dHJpYnV0ZS1lcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiBnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25BdHRyaWJ1dGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgW21hdEF1dG9jb21wbGV0ZV09XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uQXR0cmlidXRlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCIgY2xhc3M9XCJhdHRyaWJ1dGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiZS5nLiBFeWUgY29sb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlICNhdXRvPVwibWF0QXV0b2NvbXBsZXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGNvbXBhcmlzb25BdHRyaWJ1dGVzKClcIiBbdmFsdWVdPVwib3B0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb259fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdFwiIFtmb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZUNvbXBhcmF0b3JGb3JtQ29udHJvbChyb2xsb3V0UnVsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDb21wYXJhdG9yXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiY29tcGFyYXRvckNoYW5nZWQocm9sbG91dFJ1bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGdyb3VwIGxhYmVsPVwiQ09ORklERU5USUFMIFRFWFRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyYXRvciBvZiByb2xsb3V0UnVsZUNvbXBhcmF0b3JzLnNsaWNlKDE2LCAxOClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb21wYXJhdG9yLmxhYmVsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRncm91cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9XCJURVhUXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygcm9sbG91dFJ1bGVDb21wYXJhdG9ycy5zbGljZSgwLCA0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJjb21wYXJhdG9yLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIlNFTUFOVElDIFZFUlNJT05cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgY29tcGFyYXRvciBvZiByb2xsb3V0UnVsZUNvbXBhcmF0b3JzLnNsaWNlKDQsIDEwKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJjb21wYXJhdG9yLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIk5VTUJFUlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjb21wYXJhdG9yIG9mIHJvbGxvdXRSdWxlQ29tcGFyYXRvcnMuc2xpY2UoMTAsIDE2KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJjb21wYXJhdG9yLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJnZXRJbmZvQ2xhc3Mocm9sbG91dFJ1bGUpXCIgW21hdFRvb2x0aXBdPVwiZ2V0SW5mb1Rvb2x0aXAocm9sbG91dFJ1bGUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL2FkdmFuY2VkL3RhcmdldGluZy8jY29tcGFyYXRvclwiIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGFyaXNvbi12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlcnJvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZUNvbXBhcmlzb25WYWx1ZUZvcm1Db250cm9sKHJvbGxvdXRSdWxlKS5pbnZhbGlkXCI+Kjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IFtuZ0NsYXNzXT1cInsnaW52YWxpZCc6IGdldFJvbGxvdXRSdWxlQ29tcGFyaXNvblZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpLmludmFsaWR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZ2V0Um9sbG91dFJ1bGVDb21wYXJpc29uVmFsdWVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlXT1cImdldENvbXBhcmlzb25WYWx1ZVR5cGUocm9sbG91dFJ1bGUpXCIgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlSG9sZGVyKHJvbGxvdXRSdWxlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNvbXBhcmlzb24gdmFsdWVcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiIGlucHV0RGlzcGxheU5vcm1hbGl6ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhwYW5kXCIgbWF0VG9vbHRpcD1cIlBvcC1vdXQgRWRpdG9yXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYWJvdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJwb3BPdXQocm9sbG91dFJ1bGUpXCIgKm5nSWY9XCJnZXRDb21wYXJpc29uVmFsdWVUeXBlKHJvbGxvdXRSdWxlKT09PSd0ZXh0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5oZWlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZWxldGVcIiBtYXRUb29sdGlwPVwiUmVtb3ZlIHRhcmdldGluZyBydWxlXCIgKm5nSWY9XCIhcmVhZE9ubHlcIiAoY2xpY2spPVwicmVtb3ZlUnVsZShpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcyBmbGV4XCIgKm5nSWY9XCJnZXRSb2xsb3V0UnVsZVR5cGVGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkudmFsdWUgPT09IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyYWctaGFuZGxlXCIgY2RrRHJhZ0hhbmRsZSBtYXRUb29sdGlwPVwiRHJhZyBoZXJlIHRvIHJlb3JkZXJcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFyZWFkT25seVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwLXNldCBbY2xhc3Muc3BhY2luZ109XCJpID09PSAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPnt7IGkgPT09IDAgPyAnSUYnIDogJ0VMU0UgSUYnIH19PC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXAtc2V0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vY29uZmlnY2F0LmNvbS9kb2NzL2FkdmFuY2VkL3VzZXItb2JqZWN0XCIgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+dXNlcjwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJjdXN0b20tc2VsZWN0IHNlZ21lbnQtY29tcGFyYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlU2VnbWVudENvbXBhcmF0b3JGb3JtQ29udHJvbChyb2xsb3V0UnVsZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTZWdtZW50IGNvbXBhcmF0b3JcIiBtYXRUb29sdGlwUG9zaXRpb249XCJhYm92ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGNvbXBhcmF0b3Igb2Ygc2VnbWVudENvbXBhcmF0b3JzXCIgW25nVmFsdWVdPVwiY29tcGFyYXRvci52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbXBhcmF0b3IubGFiZWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdHRyaWJ1dGUtZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0Um9sbG91dFJ1bGVTZWdtZW50SWRGb3JtQ29udHJvbChyb2xsb3V0UnVsZSkuaW52YWxpZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiY3VzdG9tLXNlbGVjdCBzZWdtZW50LXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImdldFJvbGxvdXRSdWxlU2VnbWVudElkRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCIgbWF0VG9vbHRpcD1cIlNlZ21lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImFib3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ludmFsaWQnOiBnZXRSb2xsb3V0UnVsZVNlZ21lbnRJZEZvcm1Db250cm9sKHJvbGxvdXRSdWxlKS5pbnZhbGlkfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNlZ21lbnQgb2Ygc2VnbWVudHNcIiBbbmdWYWx1ZV09XCJzZWdtZW50LnNlZ21lbnRJZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NlZ21lbnQubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVsZXRlXCIgbWF0VG9vbHRpcD1cIlJlbW92ZSB0YXJnZXRpbmcgcnVsZVwiICpuZ0lmPVwiIXJlYWRPbmx5XCIgKGNsaWNrKT1cInJlbW92ZVJ1bGUoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlIGZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZlXCIgKm5nSWY9XCJzZXR0aW5nKCkuc2V0dGluZ1R5cGUgIT09IFNldHRpbmdUeXBlLkJvb2xlYW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1zZXQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIGNsYXNzPVwiY2hpcFwiPlNlcnZlOjwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLXNldD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ2NhdC12YWx1ZSBjbGFzcz1cInNlcnZlZC12YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVGb3JtQ29udHJvbF09XCJnZXRSb2xsb3V0UnVsZVZhbHVlRm9ybUNvbnRyb2wocm9sbG91dFJ1bGUpXCIgW3NldHRpbmddPVwic2V0dGluZygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvY29uZmlnY2F0LXZhbHVlPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19