@datarailsshared/datarailsshared 1.6.117 → 1.6.119

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.
@@ -59,7 +59,7 @@ function DrDynamicTagComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {
59
59
  } if (rf & 2) {
60
60
  const item_r12 = ctx.item;
61
61
  const ctx_r5 = i0.ɵɵnextContext();
62
- i0.ɵɵclassProp("disabled", ctx_r5.lockedTags.includes((item_r12 == null ? null : item_r12.value) || item_r12));
62
+ i0.ɵɵclassProp("disabled", ctx_r5.isLockedTag((item_r12 == null ? null : item_r12.value) || item_r12));
63
63
  i0.ɵɵadvance(2);
64
64
  i0.ɵɵtextInterpolate((item_r12 == null ? null : item_r12.value) || item_r12);
65
65
  i0.ɵɵadvance(1);
@@ -92,7 +92,7 @@ export class DrDynamicTagComponent {
92
92
  id: this.tagConfig.id,
93
93
  name: this.tagConfig.name,
94
94
  value: $event,
95
- locked: this.lockedTags.includes($event),
95
+ locked: this.isLockedTag($event),
96
96
  };
97
97
  if (!_isNil(this.selectedTag?.locked)) {
98
98
  resultEvent.locked = this.selectedTag.locked;
@@ -104,7 +104,7 @@ export class DrDynamicTagComponent {
104
104
  this.tagChange.emit(resultEvent);
105
105
  }
106
106
  onOptionClick($event, tagValue) {
107
- if (this.lockedTags.includes(tagValue)) {
107
+ if (this.isLockedTag(tagValue)) {
108
108
  $event.stopImmediatePropagation();
109
109
  }
110
110
  }
@@ -141,20 +141,33 @@ export class DrDynamicTagComponent {
141
141
  }
142
142
  getParentValueKey() {
143
143
  return _map(this.connectedTags, (connectedTag) => {
144
- if (_isNumber(connectedTag.value)) {
145
- const momentData = moment.unix(connectedTag.value);
146
- const convertedParentKey = this.parentKeyFormatterFn
147
- ? this.parentKeyFormatterFn(momentData)
148
- : momentData.format(this.parentKeyFormat);
149
- if (momentData.isValid() && convertedParentKey) {
150
- return convertedParentKey;
151
- }
152
- }
153
- return connectedTag.value;
144
+ return this.getSingleParentKey(connectedTag.value);
154
145
  }).join('__');
155
146
  }
147
+ isLockedTag(tagValue) {
148
+ if (!!this.lockedMultipleTags?.length) {
149
+ return this.hasLockedTagInMultiple(tagValue);
150
+ }
151
+ return this.lockedTags.includes(tagValue);
152
+ }
153
+ getSingleParentKey(value) {
154
+ if (_isNumber(value)) {
155
+ const momentData = moment.unix(value);
156
+ const convertedParentKey = this.parentKeyFormatterFn
157
+ ? this.parentKeyFormatterFn(momentData)
158
+ : momentData.format(this.parentKeyFormat);
159
+ if (momentData.isValid() && convertedParentKey) {
160
+ return convertedParentKey;
161
+ }
162
+ }
163
+ return value;
164
+ }
165
+ hasLockedTagInMultiple(selectedTagValue) {
166
+ const parentValueKey = this.getParentValueKey();
167
+ return this.lockedMultipleTags?.some((tag) => tag.value === selectedTagValue && this.getSingleParentKey(tag.parent_tag_value) === parentValueKey);
168
+ }
156
169
  /** @nocollapse */ static { this.ɵfac = function DrDynamicTagComponent_Factory(t) { return new (t || DrDynamicTagComponent)(); }; }
157
- /** @nocollapse */ static { this.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DrDynamicTagComponent, selectors: [["dr-dynamic-tag"]], inputs: { values: "values", tagConfig: "tagConfig", selectedTag: "selectedTag", hideLabel: "hideLabel", lockedTags: "lockedTags", connectedTags: "connectedTags", isDynamicTagAddEnabled: "isDynamicTagAddEnabled", disabled: "disabled", fiscalYearStartsFrom: "fiscalYearStartsFrom", fiscalYearBack: "fiscalYearBack", parentKeyFormat: "parentKeyFormat", parentKeyFormatterFn: "parentKeyFormatterFn", label: "label", hideFavoriteStar: "hideFavoriteStar" }, outputs: { tagChange: "tagChange", tagAdd: "tagAdd" }, features: [i0.ɵɵNgOnChangesFeature], decls: 7, vars: 7, consts: [["class", "dynamic-tag__label", 4, "ngIf"], ["bindLabel", "value", "bindValue", "value", "dropdownClass", "dynamic-tag__select dr-tag__select", 3, "ngModel", "items", "disabled", "ngModelChange"], [4, "ngIf"], ["labelTemplate", ""], ["optionTemplate", ""], [1, "dynamic-tag__label"], ["optionHeaderTemplate", ""], ["bindValue", "value", 3, "values", "dynamicAddLabel", "dynamicValueAdded"], [1, "dynamic-tag__field--label"], [1, "dynamic-tag__field__text"], ["class", "dynamic-tag__field__icon dr-icon-star-fill", 4, "ngIf"], [1, "dynamic-tag__field__icon", "dr-icon-star-fill"], [1, "dynamic-tag__field--option", 3, "click"]], template: function DrDynamicTagComponent_Template(rf, ctx) { if (rf & 1) {
170
+ /** @nocollapse */ static { this.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DrDynamicTagComponent, selectors: [["dr-dynamic-tag"]], inputs: { values: "values", tagConfig: "tagConfig", selectedTag: "selectedTag", hideLabel: "hideLabel", lockedTags: "lockedTags", connectedTags: "connectedTags", isDynamicTagAddEnabled: "isDynamicTagAddEnabled", disabled: "disabled", lockedMultipleTags: "lockedMultipleTags", tagsConfig: "tagsConfig", fiscalYearStartsFrom: "fiscalYearStartsFrom", fiscalYearBack: "fiscalYearBack", parentKeyFormat: "parentKeyFormat", parentKeyFormatterFn: "parentKeyFormatterFn", label: "label", hideFavoriteStar: "hideFavoriteStar" }, outputs: { tagChange: "tagChange", tagAdd: "tagAdd" }, features: [i0.ɵɵNgOnChangesFeature], decls: 7, vars: 7, consts: [["class", "dynamic-tag__label", 4, "ngIf"], ["bindLabel", "value", "bindValue", "value", "dropdownClass", "dynamic-tag__select dr-tag__select", 3, "ngModel", "items", "disabled", "ngModelChange"], [4, "ngIf"], ["labelTemplate", ""], ["optionTemplate", ""], [1, "dynamic-tag__label"], ["optionHeaderTemplate", ""], ["bindValue", "value", 3, "values", "dynamicAddLabel", "dynamicValueAdded"], [1, "dynamic-tag__field--label"], [1, "dynamic-tag__field__text"], ["class", "dynamic-tag__field__icon dr-icon-star-fill", 4, "ngIf"], [1, "dynamic-tag__field__icon", "dr-icon-star-fill"], [1, "dynamic-tag__field--option", 3, "click"]], template: function DrDynamicTagComponent_Template(rf, ctx) { if (rf & 1) {
158
171
  i0.ɵɵtemplate(0, DrDynamicTagComponent_p_0_Template, 2, 1, "p", 0);
159
172
  i0.ɵɵelementStart(1, "dr-select", 1);
160
173
  i0.ɵɵlistener("ngModelChange", function DrDynamicTagComponent_Template_dr_select_ngModelChange_1_listener($event) { return ctx.selectedDynamicTag = $event; })("ngModelChange", function DrDynamicTagComponent_Template_dr_select_ngModelChange_1_listener($event) { return ctx.onTagChanged($event); });
@@ -173,7 +186,7 @@ export class DrDynamicTagComponent {
173
186
  }
174
187
  (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DrDynamicTagComponent, [{
175
188
  type: Component,
176
- args: [{ selector: 'dr-dynamic-tag', template: "<p *ngIf=\"!hideLabel\" class=\"dynamic-tag__label\">{{ label || tagConfig.name }}</p>\n<dr-select\n [(ngModel)]=\"selectedDynamicTag\"\n [class.dynamic-tag__locked]=\"isLockedTagSelected\"\n bindLabel=\"value\"\n bindValue=\"value\"\n [items]=\"currentValues\"\n [disabled]=\"disabled\"\n dropdownClass=\"dynamic-tag__select dr-tag__select\"\n (ngModelChange)=\"onTagChanged($event)\">\n <ng-template #optionHeaderTemplate *ngIf=\"isDynamicTagAddEnabled\">\n <dr-select-add-item\n bindValue=\"value\"\n [values]=\"currentValues\"\n [dynamicAddLabel]=\"' Add new ' + tagConfig.name\"\n (dynamicValueAdded)=\"onDynamicValueAdd($event)\"></dr-select-add-item>\n </ng-template>\n <ng-template #labelTemplate let-item=\"item\">\n <div class=\"dynamic-tag__field--label\">\n <p class=\"dynamic-tag__field__text\">{{ item?.value || item }}</p>\n <i *ngIf=\"item?.is_favorite && !hideFavoriteStar\" class=\"dynamic-tag__field__icon dr-icon-star-fill\"></i>\n </div>\n </ng-template>\n <ng-template #optionTemplate let-item=\"item\">\n <div\n class=\"dynamic-tag__field--option\"\n [class.disabled]=\"lockedTags.includes(item?.value || item)\"\n (click)=\"onOptionClick($event, item?.value || item)\">\n <p class=\"dynamic-tag__field__text\">{{ item?.value || item }}</p>\n <i *ngIf=\"item?.is_favorite\" class=\"dynamic-tag__field__icon dr-icon-star-fill\"></i>\n </div>\n </ng-template>\n</dr-select>\n", styles: [":host{flex-grow:1}.dynamic-tag__label{margin:0 0 4px;color:#0c142b;font-size:14px;font-weight:400;line-height:22px}.dynamic-tag__field{cursor:pointer;height:24px}.dynamic-tag__field--option{cursor:pointer;height:24px;padding:8px 12px;width:100%;display:flex;justify-content:space-between;align-items:center}.dynamic-tag__field--option.disabled{opacity:.5;box-sizing:content-box}.dynamic-tag__field--label{cursor:pointer;height:24px;display:flex;align-items:center}.dynamic-tag__field--label>.dynamic-tag__field__icon{position:absolute;right:25px}.dynamic-tag__field--label>dynamic-tag__field__text{margin:0}.dr-icon-star-fill{color:#f0bc57}::ng-deep dr-select.dynamic-tag__locked>ng-select>.ng-select-container{opacity:.4}::ng-deep .ng-option:has(.dynamic-tag__field--option){padding:0!important}\n"] }]
189
+ args: [{ selector: 'dr-dynamic-tag', template: "<p *ngIf=\"!hideLabel\" class=\"dynamic-tag__label\">{{ label || tagConfig.name }}</p>\n<dr-select\n [(ngModel)]=\"selectedDynamicTag\"\n [class.dynamic-tag__locked]=\"isLockedTagSelected\"\n bindLabel=\"value\"\n bindValue=\"value\"\n [items]=\"currentValues\"\n [disabled]=\"disabled\"\n dropdownClass=\"dynamic-tag__select dr-tag__select\"\n (ngModelChange)=\"onTagChanged($event)\">\n <ng-template #optionHeaderTemplate *ngIf=\"isDynamicTagAddEnabled\">\n <dr-select-add-item\n bindValue=\"value\"\n [values]=\"currentValues\"\n [dynamicAddLabel]=\"' Add new ' + tagConfig.name\"\n (dynamicValueAdded)=\"onDynamicValueAdd($event)\"></dr-select-add-item>\n </ng-template>\n <ng-template #labelTemplate let-item=\"item\">\n <div class=\"dynamic-tag__field--label\">\n <p class=\"dynamic-tag__field__text\">{{ item?.value || item }}</p>\n <i *ngIf=\"item?.is_favorite && !hideFavoriteStar\" class=\"dynamic-tag__field__icon dr-icon-star-fill\"></i>\n </div>\n </ng-template>\n <ng-template #optionTemplate let-item=\"item\">\n <div\n class=\"dynamic-tag__field--option\"\n [class.disabled]=\"isLockedTag(item?.value || item)\"\n (click)=\"onOptionClick($event, item?.value || item)\">\n <p class=\"dynamic-tag__field__text\">{{ item?.value || item }}</p>\n <i *ngIf=\"item?.is_favorite\" class=\"dynamic-tag__field__icon dr-icon-star-fill\"></i>\n </div>\n </ng-template>\n</dr-select>\n", styles: [":host{flex-grow:1}.dynamic-tag__label{margin:0 0 4px;color:#0c142b;font-size:14px;font-weight:400;line-height:22px}.dynamic-tag__field{cursor:pointer;height:24px}.dynamic-tag__field--option{cursor:pointer;height:24px;padding:8px 12px;width:100%;display:flex;justify-content:space-between;align-items:center}.dynamic-tag__field--option.disabled{opacity:.5;box-sizing:content-box}.dynamic-tag__field--label{cursor:pointer;height:24px;display:flex;align-items:center}.dynamic-tag__field--label>.dynamic-tag__field__icon{position:absolute;right:25px}.dynamic-tag__field--label>dynamic-tag__field__text{margin:0}.dr-icon-star-fill{color:#f0bc57}::ng-deep dr-select.dynamic-tag__locked>ng-select>.ng-select-container{opacity:.4}::ng-deep .ng-option:has(.dynamic-tag__field--option){padding:0!important}\n"] }]
177
190
  }], null, { values: [{
178
191
  type: Input
179
192
  }], tagConfig: [{
@@ -190,6 +203,10 @@ export class DrDynamicTagComponent {
190
203
  type: Input
191
204
  }], disabled: [{
192
205
  type: Input
206
+ }], lockedMultipleTags: [{
207
+ type: Input
208
+ }], tagsConfig: [{
209
+ type: Input
193
210
  }], fiscalYearStartsFrom: [{
194
211
  type: Input
195
212
  }], fiscalYearBack: [{
@@ -207,4 +224,4 @@ export class DrDynamicTagComponent {
207
224
  }], tagAdd: [{
208
225
  type: Output
209
226
  }] }); })();
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHItZHluYW1pYy10YWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YXJhaWxzc2hhcmVkL3NyYy9saWIvZHItZHluYW1pYy10YWcvZHItZHluYW1pYy10YWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YXJhaWxzc2hhcmVkL3NyYy9saWIvZHItZHluYW1pYy10YWcvZHItZHluYW1pYy10YWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLE1BQU0sRUFBRSxRQUFRLElBQUksU0FBUyxFQUFFLFFBQVEsSUFBSSxTQUFTLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVuSCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7Ozs7SUNINUIsNEJBQWlEO0lBQUEsWUFBNkI7SUFBQSxpQkFBSTs7O0lBQWpDLGVBQTZCO0lBQTdCLDJEQUE2Qjs7OztJQVd0RSw2Q0FJb0Q7SUFBaEQsdU5BQXFCLGVBQUEsZ0NBQXlCLENBQUEsSUFBQztJQUFDLGlCQUFxQjs7O0lBRnJFLDZDQUF3Qix3REFBQTs7O0lBSGhDLHlIQU1jOzs7SUFJTix3QkFBeUc7OztJQUY3Ryw4QkFBdUMsV0FBQTtJQUNDLFlBQXlCO0lBQUEsaUJBQUk7SUFDakUsaUZBQXlHO0lBQzdHLGlCQUFNOzs7O0lBRmtDLGVBQXlCO0lBQXpCLDRFQUF5QjtJQUN6RCxlQUE0QztJQUE1QyxtR0FBNEM7OztJQVNoRCx3QkFBb0Y7Ozs7SUFMeEYsK0JBR3lEO0lBQXJELHNPQUFTLGVBQUEscUZBQTBDLENBQUEsSUFBQztJQUNwRCw0QkFBb0M7SUFBQSxZQUF5QjtJQUFBLGlCQUFJO0lBQ2pFLGlGQUFvRjtJQUN4RixpQkFBTTs7OztJQUpGLDhHQUEyRDtJQUV2QixlQUF5QjtJQUF6Qiw0RUFBeUI7SUFDekQsZUFBdUI7SUFBdkIscUVBQXVCOztBRG5CdkMsTUFBTSxPQUFPLHFCQUFxQjtJQUxsQztRQVNvQixjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFpQjdCLGNBQVMsR0FBZ0MsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFDM0UsV0FBTSxHQUFtQyxJQUFJLFlBQVksRUFBb0IsQ0FBQztRQU12RSw4QkFBeUIsR0FBRyxNQUFNLENBQUM7UUFDNUMscUJBQWdCLEdBQVcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO0tBK0ZyRTtJQWhIRyxJQUFhLGVBQWUsQ0FBQyxNQUFjO1FBQ3ZDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLHlCQUF5QixDQUFDO0lBQ3JFLENBQUM7SUFpQkQsSUFBVyxlQUFlO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFXLHFCQUFxQjtRQUM1QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQXNCO1FBQ3JDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBYztRQUM5QixNQUFNLFdBQVcsR0FBa0I7WUFDL0IsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJO1lBQ3pCLEtBQUssRUFBRSxNQUFNO1lBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUMzQyxDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ25DLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7U0FDaEQ7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDbEMsV0FBVyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztTQUM5QztRQUVELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxhQUFhLENBQUMsTUFBYSxFQUFFLFFBQXlCO1FBQ3pELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDcEMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLENBQUM7U0FDckM7SUFDTCxDQUFDO0lBRU0saUJBQWlCLENBQUMsTUFBYztRQUNuQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV2RCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7U0FDM0Q7YUFBTTtZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztRQUVqQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU8sc0JBQXNCO1FBQzFCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVPLHFCQUFxQixDQUFDLGFBQWlDLEVBQUUsYUFBOEI7UUFDM0YsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFeEMsSUFBSSxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDN0IsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBZ0IsQ0FBQztZQUN0RixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFnQixDQUFDO1lBQ2pGLE9BQU8sQ0FBQyxlQUFlLElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUN2RTtRQUVELE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxhQUFhLENBQUMsQ0FBQztRQUNqRixPQUFPLENBQUMsZUFBZSxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBVyxDQUFDO0lBQzNELENBQUM7SUFFTyxpQkFBaUI7UUFDckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQzdDLElBQUksU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDL0IsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRW5ELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQjtvQkFDaEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7b0JBQ3ZDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFOUMsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksa0JBQWtCLEVBQUU7b0JBQzVDLE9BQU8sa0JBQWtCLENBQUM7aUJBQzdCO2FBQ0o7WUFFRCxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLENBQUM7eUdBNUhRLHFCQUFxQjttR0FBckIscUJBQXFCO1lDVmxDLGtFQUFrRjtZQUNsRixvQ0FRMkM7WUFQdkMsOEpBQWdDLDhHQU9mLHdCQUFvQixJQVBMO1lBUWhDLGlFQU1jO1lBQ2QsdUhBS2M7WUFDZCx1SEFRYztZQUNsQixpQkFBWTs7WUFoQ1IscUNBQWdCO1lBR2hCLGVBQWlEO1lBQWpELDhEQUFpRDtZQURqRCxnREFBZ0MsNEJBQUEsMEJBQUE7WUFRSSxlQUE0QjtZQUE1QixpREFBNEI7Ozt1RkRBdkQscUJBQXFCO2NBTGpDLFNBQVM7MkJBQ0ksZ0JBQWdCO2dCQUtWLE1BQU07a0JBQXJCLEtBQUs7WUFDVSxTQUFTO2tCQUF4QixLQUFLO1lBQ1UsV0FBVztrQkFBMUIsS0FBSztZQUNVLFNBQVM7a0JBQXhCLEtBQUs7WUFDVSxVQUFVO2tCQUF6QixLQUFLO1lBQ1UsYUFBYTtrQkFBNUIsS0FBSztZQUNVLHNCQUFzQjtrQkFBckMsS0FBSztZQUNVLFFBQVE7a0JBQXZCLEtBQUs7WUFFRyxvQkFBb0I7a0JBQTVCLEtBQUs7WUFDRyxjQUFjO2tCQUF0QixLQUFLO1lBRU8sZUFBZTtrQkFBM0IsS0FBSztZQUlHLG9CQUFvQjtrQkFBNUIsS0FBSztZQUVHLEtBQUs7a0JBQWIsS0FBSztZQUNHLGdCQUFnQjtrQkFBeEIsS0FBSztZQUVJLFNBQVM7a0JBQWxCLE1BQU07WUFDRyxNQUFNO2tCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaW5kIGFzIF9maW5kLCBpc05pbCBhcyBfaXNOaWwsIGlzTnVtYmVyIGFzIF9pc051bWJlciwgaXNPYmplY3QgYXMgX2lzT2JqZWN0LCBtYXAgYXMgX21hcCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJRHluYW1pY1RhZywgSVRhZywgSVRhZ0ZvclNlcnZlciwgVER5bmFtaWNUYWcsIFREeW5hbWljVGFnVmFsdWUgfSBmcm9tICcuLi9tb2RlbHMvc2VydmVyVGFncyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZHItZHluYW1pYy10YWcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kci1keW5hbWljLXRhZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZHItZHluYW1pYy10YWcuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRHJEeW5hbWljVGFnQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsdWVzOiBURHluYW1pY1RhZztcbiAgICBASW5wdXQoKSBwdWJsaWMgdGFnQ29uZmlnOiBJVGFnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZFRhZzogSVRhZ0ZvclNlcnZlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaGlkZUxhYmVsOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGxvY2tlZFRhZ3M6IGFueVtdID0gW107XG4gICAgQElucHV0KCkgcHVibGljIGNvbm5lY3RlZFRhZ3M6IElUYWdGb3JTZXJ2ZXJbXTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNEeW5hbWljVGFnQWRkRW5hYmxlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKSBmaXNjYWxZZWFyU3RhcnRzRnJvbTogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGZpc2NhbFllYXJCYWNrOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgc2V0IHBhcmVudEtleUZvcm1hdChmb3JtYXQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9wYXJlbnRLZXlGb3JtYXQgPSBmb3JtYXQgfHwgdGhpcy5ERUZBVUxUX1BBUkVOVF9LRVlfRk9STUFUO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHBhcmVudEtleUZvcm1hdHRlckZuOiAobW9tZW50RGF0YSkgPT4gc3RyaW5nO1xuXG4gICAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcbiAgICBASW5wdXQoKSBoaWRlRmF2b3JpdGVTdGFyOiBib29sZWFuO1xuXG4gICAgQE91dHB1dCgpIHRhZ0NoYW5nZTogRXZlbnRFbWl0dGVyPElUYWdGb3JTZXJ2ZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxJVGFnRm9yU2VydmVyPigpO1xuICAgIEBPdXRwdXQoKSB0YWdBZGQ6IEV2ZW50RW1pdHRlcjxURHluYW1pY1RhZ1ZhbHVlPiA9IG5ldyBFdmVudEVtaXR0ZXI8VER5bmFtaWNUYWdWYWx1ZT4oKTtcblxuICAgIHB1YmxpYyBzZWxlY3RlZER5bmFtaWNUYWc6IFREeW5hbWljVGFnVmFsdWU7XG4gICAgcHVibGljIGN1cnJlbnRWYWx1ZXM6IFREeW5hbWljVGFnVmFsdWVbXTtcbiAgICBwdWJsaWMgaXNMb2NrZWRUYWdTZWxlY3RlZDogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9QQVJFTlRfS0VZX0ZPUk1BVCA9ICd5eXl5JztcbiAgICBwcml2YXRlIF9wYXJlbnRLZXlGb3JtYXQ6IHN0cmluZyA9IHRoaXMuREVGQVVMVF9QQVJFTlRfS0VZX0ZPUk1BVDtcblxuICAgIHB1YmxpYyBnZXQgcGFyZW50S2V5Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnRLZXlGb3JtYXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc1ByaW1pdGl2ZURhdGFTb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC52YWx1ZXModGhpcy52YWx1ZXMpIHx8IFtdO1xuICAgICAgICByZXR1cm4gIV9pc09iamVjdCh2YWx1ZXNbMF0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlRHluYW1pY1RhZ1ZhbHVlcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRhZ0NoYW5nZWQoJGV2ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzdWx0RXZlbnQ6IElUYWdGb3JTZXJ2ZXIgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy50YWdDb25maWcuaWQsXG4gICAgICAgICAgICBuYW1lOiB0aGlzLnRhZ0NvbmZpZy5uYW1lLFxuICAgICAgICAgICAgdmFsdWU6ICRldmVudCxcbiAgICAgICAgICAgIGxvY2tlZDogdGhpcy5sb2NrZWRUYWdzLmluY2x1ZGVzKCRldmVudCksXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFfaXNOaWwodGhpcy5zZWxlY3RlZFRhZz8ubG9ja2VkKSkge1xuICAgICAgICAgICAgcmVzdWx0RXZlbnQubG9ja2VkID0gdGhpcy5zZWxlY3RlZFRhZy5sb2NrZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIV9pc05pbCh0aGlzLnNlbGVjdGVkVGFnPy5sYWJlbCkpIHtcbiAgICAgICAgICAgIHJlc3VsdEV2ZW50LmxhYmVsID0gdGhpcy5zZWxlY3RlZFRhZy5sYWJlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNMb2NrZWRUYWdTZWxlY3RlZCA9IHJlc3VsdEV2ZW50LmxvY2tlZDtcbiAgICAgICAgdGhpcy50YWdDaGFuZ2UuZW1pdChyZXN1bHRFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uT3B0aW9uQ2xpY2soJGV2ZW50OiBFdmVudCwgdGFnVmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5sb2NrZWRUYWdzLmluY2x1ZGVzKHRhZ1ZhbHVlKSkge1xuICAgICAgICAgICAgJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRHluYW1pY1ZhbHVlQWRkKCRldmVudDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFZhbHVlS2V5ID0gdGhpcy5nZXRQYXJlbnRWYWx1ZUtleSgpO1xuICAgICAgICBjb25zdCBwYXJlbnRWYWx1ZXMgPSB0aGlzLnZhbHVlc1twYXJlbnRWYWx1ZUtleV0gfHwgW107XG5cbiAgICAgICAgaWYgKHRoaXMuaXNQcmltaXRpdmVEYXRhU291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlc1twYXJlbnRWYWx1ZUtleV0gPSBbJGV2ZW50LCAuLi5wYXJlbnRWYWx1ZXNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXNbcGFyZW50VmFsdWVLZXldID0gW3sgdmFsdWU6ICRldmVudCB9LCAuLi5wYXJlbnRWYWx1ZXNdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZER5bmFtaWNUYWcgPSAkZXZlbnQ7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXNbcGFyZW50VmFsdWVLZXldO1xuICAgICAgICB0aGlzLm9uVGFnQ2hhbmdlZCgkZXZlbnQpO1xuICAgICAgICB0aGlzLnRhZ0FkZC5lbWl0KCRldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEeW5hbWljVGFnVmFsdWVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJlbnRWYWx1ZUtleSA9IHRoaXMuZ2V0UGFyZW50VmFsdWVLZXkoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXM/LltwYXJlbnRWYWx1ZUtleV07XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREeW5hbWljVGFnID0gdGhpcy5nZXRTZWxlY3RlZER5bmFtaWNUYWcodGhpcy5jdXJyZW50VmFsdWVzLCB0aGlzLnNlbGVjdGVkVGFnPy52YWx1ZSk7XG4gICAgICAgIHRoaXMub25UYWdDaGFuZ2VkKHRoaXMuc2VsZWN0ZWREeW5hbWljVGFnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlbGVjdGVkRHluYW1pY1RhZyhjdXJyZW50VmFsdWVzOiBURHluYW1pY1RhZ1ZhbHVlW10sIHNlbGVjdGVkVmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGlmICghY3VycmVudFZhbHVlcz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoX2lzT2JqZWN0KGN1cnJlbnRWYWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUZyb21Db25maWcgPSBfZmluZChjdXJyZW50VmFsdWVzLCB7IHZhbHVlOiBzZWxlY3RlZFZhbHVlIH0pIGFzIElEeW5hbWljVGFnO1xuICAgICAgICAgICAgY29uc3QgZmF2b3JpdGVWYWx1ZSA9IF9maW5kKGN1cnJlbnRWYWx1ZXMsIHsgaXNfZmF2b3JpdGU6IHRydWUgfSkgYXMgSUR5bmFtaWNUYWc7XG4gICAgICAgICAgICByZXR1cm4gKHZhbHVlRnJvbUNvbmZpZyB8fCBmYXZvcml0ZVZhbHVlIHx8IGN1cnJlbnRWYWx1ZXNbMF0pLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWVGcm9tQ29uZmlnID0gX2ZpbmQoY3VycmVudFZhbHVlcywgKHZhbHVlKSA9PiB2YWx1ZSA9PT0gc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIHJldHVybiAodmFsdWVGcm9tQ29uZmlnIHx8IGN1cnJlbnRWYWx1ZXNbMF0pIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmVudFZhbHVlS2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBfbWFwKHRoaXMuY29ubmVjdGVkVGFncywgKGNvbm5lY3RlZFRhZykgPT4ge1xuICAgICAgICAgICAgaWYgKF9pc051bWJlcihjb25uZWN0ZWRUYWcudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9tZW50RGF0YSA9IG1vbWVudC51bml4KGNvbm5lY3RlZFRhZy52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRQYXJlbnRLZXkgPSB0aGlzLnBhcmVudEtleUZvcm1hdHRlckZuXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5wYXJlbnRLZXlGb3JtYXR0ZXJGbihtb21lbnREYXRhKVxuICAgICAgICAgICAgICAgICAgICA6IG1vbWVudERhdGEuZm9ybWF0KHRoaXMucGFyZW50S2V5Rm9ybWF0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtb21lbnREYXRhLmlzVmFsaWQoKSAmJiBjb252ZXJ0ZWRQYXJlbnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFBhcmVudEtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0ZWRUYWcudmFsdWU7XG4gICAgICAgIH0pLmpvaW4oJ19fJyk7XG4gICAgfVxufVxuIiwiPHAgKm5nSWY9XCIhaGlkZUxhYmVsXCIgY2xhc3M9XCJkeW5hbWljLXRhZ19fbGFiZWxcIj57eyBsYWJlbCB8fCB0YWdDb25maWcubmFtZSB9fTwvcD5cbjxkci1zZWxlY3RcbiAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRHluYW1pY1RhZ1wiXG4gICAgW2NsYXNzLmR5bmFtaWMtdGFnX19sb2NrZWRdPVwiaXNMb2NrZWRUYWdTZWxlY3RlZFwiXG4gICAgYmluZExhYmVsPVwidmFsdWVcIlxuICAgIGJpbmRWYWx1ZT1cInZhbHVlXCJcbiAgICBbaXRlbXNdPVwiY3VycmVudFZhbHVlc1wiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBkcm9wZG93bkNsYXNzPVwiZHluYW1pYy10YWdfX3NlbGVjdCBkci10YWdfX3NlbGVjdFwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwib25UYWdDaGFuZ2VkKCRldmVudClcIj5cbiAgICA8bmctdGVtcGxhdGUgI29wdGlvbkhlYWRlclRlbXBsYXRlICpuZ0lmPVwiaXNEeW5hbWljVGFnQWRkRW5hYmxlZFwiPlxuICAgICAgICA8ZHItc2VsZWN0LWFkZC1pdGVtXG4gICAgICAgICAgICBiaW5kVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICBbdmFsdWVzXT1cImN1cnJlbnRWYWx1ZXNcIlxuICAgICAgICAgICAgW2R5bmFtaWNBZGRMYWJlbF09XCInIEFkZCBuZXcgJyArIHRhZ0NvbmZpZy5uYW1lXCJcbiAgICAgICAgICAgIChkeW5hbWljVmFsdWVBZGRlZCk9XCJvbkR5bmFtaWNWYWx1ZUFkZCgkZXZlbnQpXCI+PC9kci1zZWxlY3QtYWRkLWl0ZW0+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI2xhYmVsVGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLXRhZ19fZmllbGQtLWxhYmVsXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImR5bmFtaWMtdGFnX19maWVsZF9fdGV4dFwiPnt7IGl0ZW0/LnZhbHVlIHx8IGl0ZW0gfX08L3A+XG4gICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW0/LmlzX2Zhdm9yaXRlICYmICFoaWRlRmF2b3JpdGVTdGFyXCIgY2xhc3M9XCJkeW5hbWljLXRhZ19fZmllbGRfX2ljb24gZHItaWNvbi1zdGFyLWZpbGxcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNvcHRpb25UZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJkeW5hbWljLXRhZ19fZmllbGQtLW9wdGlvblwiXG4gICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwibG9ja2VkVGFncy5pbmNsdWRlcyhpdGVtPy52YWx1ZSB8fCBpdGVtKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25PcHRpb25DbGljaygkZXZlbnQsIGl0ZW0/LnZhbHVlIHx8IGl0ZW0pXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImR5bmFtaWMtdGFnX19maWVsZF9fdGV4dFwiPnt7IGl0ZW0/LnZhbHVlIHx8IGl0ZW0gfX08L3A+XG4gICAgICAgICAgICA8aSAqbmdJZj1cIml0ZW0/LmlzX2Zhdm9yaXRlXCIgY2xhc3M9XCJkeW5hbWljLXRhZ19fZmllbGRfX2ljb24gZHItaWNvbi1zdGFyLWZpbGxcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG48L2RyLXNlbGVjdD5cbiJdfQ==
227
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHItZHluYW1pYy10YWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YXJhaWxzc2hhcmVkL3NyYy9saWIvZHItZHluYW1pYy10YWcvZHItZHluYW1pYy10YWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YXJhaWxzc2hhcmVkL3NyYy9saWIvZHItZHluYW1pYy10YWcvZHItZHluYW1pYy10YWcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFFLElBQUksSUFBSSxLQUFLLEVBQUUsS0FBSyxJQUFJLE1BQU0sRUFBRSxRQUFRLElBQUksU0FBUyxFQUFFLFFBQVEsSUFBSSxTQUFTLEVBQUUsR0FBRyxJQUFJLElBQUksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVuSCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7Ozs7Ozs7SUNINUIsNEJBQWlEO0lBQUEsWUFBNkI7SUFBQSxpQkFBSTs7O0lBQWpDLGVBQTZCO0lBQTdCLDJEQUE2Qjs7OztJQVd0RSw2Q0FJb0Q7SUFBaEQsdU5BQXFCLGVBQUEsZ0NBQXlCLENBQUEsSUFBQztJQUFDLGlCQUFxQjs7O0lBRnJFLDZDQUF3Qix3REFBQTs7O0lBSGhDLHlIQU1jOzs7SUFJTix3QkFBeUc7OztJQUY3Ryw4QkFBdUMsV0FBQTtJQUNDLFlBQXlCO0lBQUEsaUJBQUk7SUFDakUsaUZBQXlHO0lBQzdHLGlCQUFNOzs7O0lBRmtDLGVBQXlCO0lBQXpCLDRFQUF5QjtJQUN6RCxlQUE0QztJQUE1QyxtR0FBNEM7OztJQVNoRCx3QkFBb0Y7Ozs7SUFMeEYsK0JBR3lEO0lBQXJELHNPQUFTLGVBQUEscUZBQTBDLENBQUEsSUFBQztJQUNwRCw0QkFBb0M7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bnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaW5kIGFzIF9maW5kLCBpc05pbCBhcyBfaXNOaWwsIGlzTnVtYmVyIGFzIF9pc051bWJlciwgaXNPYmplY3QgYXMgX2lzT2JqZWN0LCBtYXAgYXMgX21hcCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJRHluYW1pY1RhZywgSVRhZywgSVRhZ0ZvclNlcnZlciwgVER5bmFtaWNUYWcsIFREeW5hbWljVGFnVmFsdWUgfSBmcm9tICcuLi9tb2RlbHMvc2VydmVyVGFncyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBJTXVsdGlwbGVMb2NrZWRUYWcgfSBmcm9tICcuLi9kci10YWdzL2RyLXRhZy50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZHItZHluYW1pYy10YWcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kci1keW5hbWljLXRhZy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZHItZHluYW1pYy10YWcuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRHJEeW5hbWljVGFnQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsdWVzOiBURHluYW1pY1RhZztcbiAgICBASW5wdXQoKSBwdWJsaWMgdGFnQ29uZmlnOiBJVGFnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RlZFRhZzogSVRhZ0ZvclNlcnZlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgaGlkZUxhYmVsOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgcHVibGljIGxvY2tlZFRhZ3M6IGFueVtdID0gW107XG4gICAgQElucHV0KCkgcHVibGljIGNvbm5lY3RlZFRhZ3M6IElUYWdGb3JTZXJ2ZXJbXTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNEeW5hbWljVGFnQWRkRW5hYmxlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgbG9ja2VkTXVsdGlwbGVUYWdzOiBJTXVsdGlwbGVMb2NrZWRUYWdbXTtcbiAgICBASW5wdXQoKSBwdWJsaWMgdGFnc0NvbmZpZzogSVRhZ1tdO1xuXG4gICAgQElucHV0KCkgZmlzY2FsWWVhclN0YXJ0c0Zyb206IG51bWJlcjtcbiAgICBASW5wdXQoKSBmaXNjYWxZZWFyQmFjazogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpIHNldCBwYXJlbnRLZXlGb3JtYXQoZm9ybWF0OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fcGFyZW50S2V5Rm9ybWF0ID0gZm9ybWF0IHx8IHRoaXMuREVGQVVMVF9QQVJFTlRfS0VZX0ZPUk1BVDtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBwYXJlbnRLZXlGb3JtYXR0ZXJGbjogKG1vbWVudERhdGEpID0+IHN0cmluZztcblxuICAgIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaGlkZUZhdm9yaXRlU3RhcjogYm9vbGVhbjtcblxuICAgIEBPdXRwdXQoKSB0YWdDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJVGFnRm9yU2VydmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8SVRhZ0ZvclNlcnZlcj4oKTtcbiAgICBAT3V0cHV0KCkgdGFnQWRkOiBFdmVudEVtaXR0ZXI8VER5bmFtaWNUYWdWYWx1ZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFREeW5hbWljVGFnVmFsdWU+KCk7XG5cbiAgICBwdWJsaWMgc2VsZWN0ZWREeW5hbWljVGFnOiBURHluYW1pY1RhZ1ZhbHVlO1xuICAgIHB1YmxpYyBjdXJyZW50VmFsdWVzOiBURHluYW1pY1RhZ1ZhbHVlW107XG4gICAgcHVibGljIGlzTG9ja2VkVGFnU2VsZWN0ZWQ6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfUEFSRU5UX0tFWV9GT1JNQVQgPSAneXl5eSc7XG4gICAgcHJpdmF0ZSBfcGFyZW50S2V5Rm9ybWF0OiBzdHJpbmcgPSB0aGlzLkRFRkFVTFRfUEFSRU5UX0tFWV9GT1JNQVQ7XG5cbiAgICBwdWJsaWMgZ2V0IHBhcmVudEtleUZvcm1hdCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50S2V5Rm9ybWF0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNQcmltaXRpdmVEYXRhU291cmNlKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKHRoaXMudmFsdWVzKSB8fCBbXTtcbiAgICAgICAgcmV0dXJuICFfaXNPYmplY3QodmFsdWVzWzBdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZUR5bmFtaWNUYWdWYWx1ZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25UYWdDaGFuZ2VkKCRldmVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc3VsdEV2ZW50OiBJVGFnRm9yU2VydmVyID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMudGFnQ29uZmlnLmlkLFxuICAgICAgICAgICAgbmFtZTogdGhpcy50YWdDb25maWcubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiAkZXZlbnQsXG4gICAgICAgICAgICBsb2NrZWQ6IHRoaXMuaXNMb2NrZWRUYWcoJGV2ZW50KSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIV9pc05pbCh0aGlzLnNlbGVjdGVkVGFnPy5sb2NrZWQpKSB7XG4gICAgICAgICAgICByZXN1bHRFdmVudC5sb2NrZWQgPSB0aGlzLnNlbGVjdGVkVGFnLmxvY2tlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghX2lzTmlsKHRoaXMuc2VsZWN0ZWRUYWc/LmxhYmVsKSkge1xuICAgICAgICAgICAgcmVzdWx0RXZlbnQubGFiZWwgPSB0aGlzLnNlbGVjdGVkVGFnLmxhYmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc0xvY2tlZFRhZ1NlbGVjdGVkID0gcmVzdWx0RXZlbnQubG9ja2VkO1xuICAgICAgICB0aGlzLnRhZ0NoYW5nZS5lbWl0KHJlc3VsdEV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb25PcHRpb25DbGljaygkZXZlbnQ6IEV2ZW50LCB0YWdWYWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9ja2VkVGFnKHRhZ1ZhbHVlKSkge1xuICAgICAgICAgICAgJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uRHluYW1pY1ZhbHVlQWRkKCRldmVudDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFZhbHVlS2V5ID0gdGhpcy5nZXRQYXJlbnRWYWx1ZUtleSgpO1xuICAgICAgICBjb25zdCBwYXJlbnRWYWx1ZXMgPSB0aGlzLnZhbHVlc1twYXJlbnRWYWx1ZUtleV0gfHwgW107XG5cbiAgICAgICAgaWYgKHRoaXMuaXNQcmltaXRpdmVEYXRhU291cmNlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlc1twYXJlbnRWYWx1ZUtleV0gPSBbJGV2ZW50LCAuLi5wYXJlbnRWYWx1ZXNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXNbcGFyZW50VmFsdWVLZXldID0gW3sgdmFsdWU6ICRldmVudCB9LCAuLi5wYXJlbnRWYWx1ZXNdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZER5bmFtaWNUYWcgPSAkZXZlbnQ7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXNbcGFyZW50VmFsdWVLZXldO1xuICAgICAgICB0aGlzLm9uVGFnQ2hhbmdlZCgkZXZlbnQpO1xuICAgICAgICB0aGlzLnRhZ0FkZC5lbWl0KCRldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEeW5hbWljVGFnVmFsdWVzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJlbnRWYWx1ZUtleSA9IHRoaXMuZ2V0UGFyZW50VmFsdWVLZXkoKTtcbiAgICAgICAgdGhpcy5jdXJyZW50VmFsdWVzID0gdGhpcy52YWx1ZXM/LltwYXJlbnRWYWx1ZUtleV07XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREeW5hbWljVGFnID0gdGhpcy5nZXRTZWxlY3RlZER5bmFtaWNUYWcodGhpcy5jdXJyZW50VmFsdWVzLCB0aGlzLnNlbGVjdGVkVGFnPy52YWx1ZSk7XG4gICAgICAgIHRoaXMub25UYWdDaGFuZ2VkKHRoaXMuc2VsZWN0ZWREeW5hbWljVGFnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNlbGVjdGVkRHluYW1pY1RhZyhjdXJyZW50VmFsdWVzOiBURHluYW1pY1RhZ1ZhbHVlW10sIHNlbGVjdGVkVmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGlmICghY3VycmVudFZhbHVlcz8ubGVuZ3RoKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoX2lzT2JqZWN0KGN1cnJlbnRWYWx1ZXNbMF0pKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUZyb21Db25maWcgPSBfZmluZChjdXJyZW50VmFsdWVzLCB7IHZhbHVlOiBzZWxlY3RlZFZhbHVlIH0pIGFzIElEeW5hbWljVGFnO1xuICAgICAgICAgICAgY29uc3QgZmF2b3JpdGVWYWx1ZSA9IF9maW5kKGN1cnJlbnRWYWx1ZXMsIHsgaXNfZmF2b3JpdGU6IHRydWUgfSkgYXMgSUR5bmFtaWNUYWc7XG4gICAgICAgICAgICByZXR1cm4gKHZhbHVlRnJvbUNvbmZpZyB8fCBmYXZvcml0ZVZhbHVlIHx8IGN1cnJlbnRWYWx1ZXNbMF0pLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWVGcm9tQ29uZmlnID0gX2ZpbmQoY3VycmVudFZhbHVlcywgKHZhbHVlKSA9PiB2YWx1ZSA9PT0gc2VsZWN0ZWRWYWx1ZSk7XG4gICAgICAgIHJldHVybiAodmFsdWVGcm9tQ29uZmlnIHx8IGN1cnJlbnRWYWx1ZXNbMF0pIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBhcmVudFZhbHVlS2V5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBfbWFwKHRoaXMuY29ubmVjdGVkVGFncywgKGNvbm5lY3RlZFRhZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2luZ2xlUGFyZW50S2V5KGNvbm5lY3RlZFRhZy52YWx1ZSk7XG4gICAgICAgIH0pLmpvaW4oJ19fJyk7XG4gICAgfVxuXG4gICAgaXNMb2NrZWRUYWcodGFnVmFsdWU6IHN0cmluZyB8IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoISF0aGlzLmxvY2tlZE11bHRpcGxlVGFncz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYXNMb2NrZWRUYWdJbk11bHRpcGxlKHRhZ1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2NrZWRUYWdzLmluY2x1ZGVzKHRhZ1ZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFNpbmdsZVBhcmVudEtleSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmIChfaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCBtb21lbnREYXRhID0gbW9tZW50LnVuaXgodmFsdWUpO1xuXG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRQYXJlbnRLZXkgPSB0aGlzLnBhcmVudEtleUZvcm1hdHRlckZuXG4gICAgICAgICAgICAgICAgPyB0aGlzLnBhcmVudEtleUZvcm1hdHRlckZuKG1vbWVudERhdGEpXG4gICAgICAgICAgICAgICAgOiBtb21lbnREYXRhLmZvcm1hdCh0aGlzLnBhcmVudEtleUZvcm1hdCk7XG5cbiAgICAgICAgICAgIGlmIChtb21lbnREYXRhLmlzVmFsaWQoKSAmJiBjb252ZXJ0ZWRQYXJlbnRLZXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVkUGFyZW50S2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFzTG9ja2VkVGFnSW5NdWx0aXBsZShzZWxlY3RlZFRhZ1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgcGFyZW50VmFsdWVLZXkgPSB0aGlzLmdldFBhcmVudFZhbHVlS2V5KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2tlZE11bHRpcGxlVGFncz8uc29tZShcbiAgICAgICAgICAgICh0YWcpID0+IHRhZy52YWx1ZSA9PT0gc2VsZWN0ZWRUYWdWYWx1ZSAmJiB0aGlzLmdldFNpbmdsZVBhcmVudEtleSh0YWcucGFyZW50X3RhZ192YWx1ZSkgPT09IHBhcmVudFZhbHVlS2V5LFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxwICpuZ0lmPVwiIWhpZGVMYWJlbFwiIGNsYXNzPVwiZHluYW1pYy10YWdfX2xhYmVsXCI+e3sgbGFiZWwgfHwgdGFnQ29uZmlnLm5hbWUgfX08L3A+XG48ZHItc2VsZWN0XG4gICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZER5bmFtaWNUYWdcIlxuICAgIFtjbGFzcy5keW5hbWljLXRhZ19fbG9ja2VkXT1cImlzTG9ja2VkVGFnU2VsZWN0ZWRcIlxuICAgIGJpbmRMYWJlbD1cInZhbHVlXCJcbiAgICBiaW5kVmFsdWU9XCJ2YWx1ZVwiXG4gICAgW2l0ZW1zXT1cImN1cnJlbnRWYWx1ZXNcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgZHJvcGRvd25DbGFzcz1cImR5bmFtaWMtdGFnX19zZWxlY3QgZHItdGFnX19zZWxlY3RcIlxuICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVGFnQ2hhbmdlZCgkZXZlbnQpXCI+XG4gICAgPG5nLXRlbXBsYXRlICNvcHRpb25IZWFkZXJUZW1wbGF0ZSAqbmdJZj1cImlzRHluYW1pY1RhZ0FkZEVuYWJsZWRcIj5cbiAgICAgICAgPGRyLXNlbGVjdC1hZGQtaXRlbVxuICAgICAgICAgICAgYmluZFZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgW3ZhbHVlc109XCJjdXJyZW50VmFsdWVzXCJcbiAgICAgICAgICAgIFtkeW5hbWljQWRkTGFiZWxdPVwiJyBBZGQgbmV3ICcgKyB0YWdDb25maWcubmFtZVwiXG4gICAgICAgICAgICAoZHluYW1pY1ZhbHVlQWRkZWQpPVwib25EeW5hbWljVmFsdWVBZGQoJGV2ZW50KVwiPjwvZHItc2VsZWN0LWFkZC1pdGVtPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlICNsYWJlbFRlbXBsYXRlIGxldC1pdGVtPVwiaXRlbVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy10YWdfX2ZpZWxkLS1sYWJlbFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJkeW5hbWljLXRhZ19fZmllbGRfX3RleHRcIj57eyBpdGVtPy52YWx1ZSB8fCBpdGVtIH19PC9wPlxuICAgICAgICAgICAgPGkgKm5nSWY9XCJpdGVtPy5pc19mYXZvcml0ZSAmJiAhaGlkZUZhdm9yaXRlU3RhclwiIGNsYXNzPVwiZHluYW1pYy10YWdfX2ZpZWxkX19pY29uIGRyLWljb24tc3Rhci1maWxsXCI+PC9pPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjb3B0aW9uVGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZHluYW1pYy10YWdfX2ZpZWxkLS1vcHRpb25cIlxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cImlzTG9ja2VkVGFnKGl0ZW0/LnZhbHVlIHx8IGl0ZW0pXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk9wdGlvbkNsaWNrKCRldmVudCwgaXRlbT8udmFsdWUgfHwgaXRlbSlcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiZHluYW1pYy10YWdfX2ZpZWxkX190ZXh0XCI+e3sgaXRlbT8udmFsdWUgfHwgaXRlbSB9fTwvcD5cbiAgICAgICAgICAgIDxpICpuZ0lmPVwiaXRlbT8uaXNfZmF2b3JpdGVcIiBjbGFzcz1cImR5bmFtaWMtdGFnX19maWVsZF9faWNvbiBkci1pY29uLXN0YXItZmlsbFwiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbjwvZHItc2VsZWN0PlxuIl19