@ifsworld/granite-components 10.0.0 → 11.0.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.
- package/README.md +4 -28
- package/date-picker/lib/date-picker-base.d.ts +1 -1
- package/date-picker/lib/date-picker-trigger-for.directive.d.ts +1 -1
- package/date-picker/lib/date-picker.component.d.ts +1 -1
- package/date-picker/lib/date-range-picker.component.d.ts +1 -1
- package/{esm2020 → esm2022}/date-picker/lib/date-picker-base.mjs +4 -4
- package/{esm2020 → esm2022}/date-picker/lib/date-picker-trigger-for.directive.mjs +4 -4
- package/esm2022/date-picker/lib/date-picker.component.mjs +30 -0
- package/{esm2020 → esm2022}/date-picker/lib/date-picker.module.mjs +21 -21
- package/esm2022/date-picker/lib/date-range-picker.component.mjs +46 -0
- package/{esm2020 → esm2022}/lib/arrange-grid/arrange-grid-item.component.mjs +12 -12
- package/{esm2020 → esm2022}/lib/arrange-grid/arrange-grid.component.mjs +7 -7
- package/{esm2020 → esm2022}/lib/arrange-grid/arrange-grid.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/badge/badge.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/badge/badge.module.mjs +5 -5
- package/esm2022/lib/badge/testing/badge.harness.mjs +25 -0
- package/esm2022/lib/button/button.component.mjs +87 -0
- package/{esm2020 → esm2022}/lib/button/button.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/checkbox/checkbox-group.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/checkbox/checkbox.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/checkbox/checkbox.module.mjs +5 -5
- package/esm2022/lib/chips/chip-input.mjs +195 -0
- package/esm2022/lib/chips/chip-list.component.mjs +567 -0
- package/esm2022/lib/chips/chip.component.mjs +287 -0
- package/{esm2020 → esm2022}/lib/chips/chips.module.mjs +9 -9
- package/{esm2020 → esm2022}/lib/core/common-behaviors/disabled.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core/core.module.mjs +11 -11
- package/esm2022/lib/core/devices/client-input-desktop.directive.mjs +29 -0
- package/esm2022/lib/core/devices/client-input-touch.directive.mjs +29 -0
- package/esm2022/lib/core/devices/client-output-desktop.directive.mjs +29 -0
- package/esm2022/lib/core/devices/client-output-touch.directive.mjs +29 -0
- package/{esm2020 → esm2022}/lib/core/pipes/pure-pipes.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/core/pipes/title.pipe.mjs +4 -4
- package/{esm2020 → esm2022}/lib/core/radio-checkbox-base.mjs +4 -4
- package/{esm2020 → esm2022}/lib/grid/grid.component.mjs +7 -7
- package/{esm2020 → esm2022}/lib/grid/grid.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/icon/icon.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/icon/icon.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/input-field/input-field.component.mjs +5 -5
- package/{esm2020 → esm2022}/lib/input-field/input-field.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/label/label.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/label/label.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/menu/divider.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/menu/menu-base.mjs +4 -4
- package/{esm2020 → esm2022}/lib/menu/menu-item.component.mjs +6 -6
- package/{esm2020 → esm2022}/lib/menu/menu-touch-close.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/menu/menu-touch-title.component.mjs +6 -6
- package/esm2022/lib/menu/menu-trigger-for.directive.mjs +704 -0
- package/esm2022/lib/menu/menu.component.mjs +30 -0
- package/{esm2020 → esm2022}/lib/menu/menu.module.mjs +17 -17
- package/esm2022/lib/menu/testing/menu.harness.mjs +109 -0
- package/{esm2020 → esm2022}/lib/menu/title.directive.mjs +4 -4
- package/{esm2020 → esm2022}/lib/radio-button/radio-button.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/radio-button/radio-button.module.mjs +5 -5
- package/{esm2020 → esm2022}/lib/radio-button/radio-group.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/toggle-switch/toggle-switch.component.mjs +4 -4
- package/{esm2020 → esm2022}/lib/toggle-switch/toggle-switch.module.mjs +5 -5
- package/{esm2020 → esm2022}/table/lib/cell/cell-align/cell-align-classes.directive.mjs +4 -4
- package/{esm2020 → esm2022}/table/lib/cell/cell.mjs +4 -4
- package/{esm2020 → esm2022}/table/lib/cell/table-data-cell.component.mjs +5 -5
- package/{esm2020 → esm2022}/table/lib/cell/table-header-cell.component.mjs +4 -4
- package/{esm2020 → esm2022}/table/lib/column/table-column.directive.mjs +4 -4
- package/esm2022/table/lib/table-constants.library.mjs +9 -0
- package/{esm2020 → esm2022}/table/lib/table.component.mjs +4 -4
- package/{esm2020 → esm2022}/table/lib/table.module.mjs +9 -9
- package/{esm2020 → esm2022}/tooltip/lib/tooltip-constants.library.mjs +2 -2
- package/{esm2020 → esm2022}/tooltip/lib/tooltip-trigger-for.directive.mjs +4 -4
- package/{esm2020 → esm2022}/tooltip/lib/tooltip.component.mjs +5 -5
- package/{esm2020 → esm2022}/tooltip/lib/tooltip.module.mjs +5 -5
- package/fesm2022/ifsworld-granite-components-date-picker.mjs +396 -0
- package/{fesm2020 → fesm2022}/ifsworld-granite-components-date-picker.mjs.map +1 -1
- package/fesm2022/ifsworld-granite-components-table.mjs +190 -0
- package/{fesm2015 → fesm2022}/ifsworld-granite-components-table.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ifsworld-granite-components-tooltip.mjs +12 -12
- package/{fesm2020 → fesm2022}/ifsworld-granite-components-tooltip.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ifsworld-granite-components.mjs +340 -341
- package/fesm2022/ifsworld-granite-components.mjs.map +1 -0
- package/lib/arrange-grid/arrange-grid-item.component.d.ts +5 -5
- package/lib/arrange-grid/arrange-grid.component.d.ts +3 -3
- package/lib/badge/badge.component.d.ts +1 -1
- package/lib/button/button.component.d.ts +2 -2
- package/lib/checkbox/checkbox.component.d.ts +1 -1
- package/lib/chips/chip-input.d.ts +9 -9
- package/lib/chips/chip-list.component.d.ts +33 -33
- package/lib/chips/chip.component.d.ts +22 -22
- package/lib/core/radio-checkbox-base.d.ts +1 -1
- package/lib/grid/grid.component.d.ts +2 -2
- package/lib/icon/icon.component.d.ts +1 -1
- package/lib/input-field/input-field.component.d.ts +1 -1
- package/lib/label/label.component.d.ts +1 -1
- package/lib/menu/divider.directive.d.ts +1 -1
- package/lib/menu/menu-base.d.ts +1 -1
- package/lib/menu/menu-item.component.d.ts +1 -1
- package/lib/menu/menu-trigger-for.directive.d.ts +1 -1
- package/lib/radio-button/radio-button.component.d.ts +1 -1
- package/lib/toggle-switch/toggle-switch.component.d.ts +1 -1
- package/package.json +21 -40
- package/table/lib/cell/cell-align/cell-align-classes.directive.d.ts +1 -1
- package/table/lib/cell/cell.d.ts +1 -1
- package/table/lib/cell/table-data-cell.component.d.ts +1 -1
- package/table/lib/column/table-column.directive.d.ts +1 -1
- package/table/lib/table.component.d.ts +1 -1
- package/tooltip/lib/tooltip-trigger-for.directive.d.ts +1 -1
- package/esm2020/date-picker/lib/date-picker.component.mjs +0 -30
- package/esm2020/date-picker/lib/date-range-picker.component.mjs +0 -46
- package/esm2020/lib/badge/testing/badge.harness.mjs +0 -25
- package/esm2020/lib/button/button.component.mjs +0 -87
- package/esm2020/lib/chips/chip-input.mjs +0 -195
- package/esm2020/lib/chips/chip-list.component.mjs +0 -567
- package/esm2020/lib/chips/chip.component.mjs +0 -287
- package/esm2020/lib/core/devices/client-input-desktop.directive.mjs +0 -29
- package/esm2020/lib/core/devices/client-input-touch.directive.mjs +0 -29
- package/esm2020/lib/core/devices/client-output-desktop.directive.mjs +0 -29
- package/esm2020/lib/core/devices/client-output-touch.directive.mjs +0 -29
- package/esm2020/lib/menu/menu-trigger-for.directive.mjs +0 -705
- package/esm2020/lib/menu/menu.component.mjs +0 -30
- package/esm2020/lib/menu/testing/menu.harness.mjs +0 -109
- package/esm2020/table/lib/table-constants.library.mjs +0 -9
- package/fesm2015/ifsworld-granite-components-date-picker.mjs +0 -401
- package/fesm2015/ifsworld-granite-components-date-picker.mjs.map +0 -1
- package/fesm2015/ifsworld-granite-components-table.mjs +0 -190
- package/fesm2015/ifsworld-granite-components-tooltip.mjs +0 -169
- package/fesm2015/ifsworld-granite-components-tooltip.mjs.map +0 -1
- package/fesm2015/ifsworld-granite-components.mjs +0 -4133
- package/fesm2015/ifsworld-granite-components.mjs.map +0 -1
- package/fesm2020/ifsworld-granite-components-date-picker.mjs +0 -396
- package/fesm2020/ifsworld-granite-components-table.mjs +0 -190
- package/fesm2020/ifsworld-granite-components-table.mjs.map +0 -1
- package/fesm2020/ifsworld-granite-components.mjs.map +0 -1
- /package/{esm2020 → esm2022}/date-picker/ifsworld-granite-components-date-picker.mjs +0 -0
- /package/{esm2020 → esm2022}/date-picker/index.mjs +0 -0
- /package/{esm2020 → esm2022}/ifsworld-granite-components.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/animation.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/client-environment.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/theme.library.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/types.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/menu/menu-desktop-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/menu/menu-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/menu/menu-panel.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/menu/menu-positions.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/menu/menu-touch-animations.mjs +0 -0
- /package/{esm2020 → esm2022}/table/ifsworld-granite-components-table.mjs +0 -0
- /package/{esm2020 → esm2022}/table/index.mjs +0 -0
- /package/{esm2020 → esm2022}/table/lib/table.types.mjs +0 -0
- /package/{esm2020 → esm2022}/tooltip/ifsworld-granite-components-tooltip.mjs +0 -0
- /package/{esm2020 → esm2022}/tooltip/index.mjs +0 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
2
|
+
import { BACKSPACE, ENTER, hasModifierKey, TAB } from '@angular/cdk/keycodes';
|
|
3
|
+
import { Directive, ElementRef, EventEmitter, Input, Output, } from '@angular/core';
|
|
4
|
+
import { GraniteChipListComponent } from './chip-list.component';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
let nextUniqueId = 0;
|
|
7
|
+
export class GraniteChipInputDirective {
|
|
8
|
+
/** Register input for chip list */
|
|
9
|
+
set graniteChipInputFor(value) {
|
|
10
|
+
if (value) {
|
|
11
|
+
this._chipList = value;
|
|
12
|
+
this._chipList.registerInput(this);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Whether or not the chipEnd event will be emitted when the input is blurred.
|
|
17
|
+
*/
|
|
18
|
+
get graniteChipInputAddOnBlur() {
|
|
19
|
+
return this._addOnBlur;
|
|
20
|
+
}
|
|
21
|
+
set graniteChipInputAddOnBlur(value) {
|
|
22
|
+
this._addOnBlur = coerceBooleanProperty(value);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Whether this is a required field, currently we use it only for setting aria-required.
|
|
26
|
+
*/
|
|
27
|
+
get required() {
|
|
28
|
+
return this._required;
|
|
29
|
+
}
|
|
30
|
+
set required(value) {
|
|
31
|
+
this._required = coerceBooleanProperty(value);
|
|
32
|
+
}
|
|
33
|
+
/** Whether the input is disabled. */
|
|
34
|
+
get disabled() {
|
|
35
|
+
return this._disabled || (this._chipList && this._chipList.disabled);
|
|
36
|
+
}
|
|
37
|
+
set disabled(value) {
|
|
38
|
+
this._disabled = coerceBooleanProperty(value);
|
|
39
|
+
}
|
|
40
|
+
/** Whether the input is empty. */
|
|
41
|
+
get empty() {
|
|
42
|
+
return !this.inputElement.value;
|
|
43
|
+
}
|
|
44
|
+
constructor(_elementRef) {
|
|
45
|
+
this._elementRef = _elementRef;
|
|
46
|
+
/** Unique id for the input. */
|
|
47
|
+
this.id = `granite-chip-list-input-${nextUniqueId++}`;
|
|
48
|
+
/** The input's placeholder text. */
|
|
49
|
+
this.placeholder = '';
|
|
50
|
+
/** Emitted when a chip is to be added. */
|
|
51
|
+
this.graniteChipInputTokenEnd = new EventEmitter();
|
|
52
|
+
/**
|
|
53
|
+
* The list of key codes that will trigger a chipEnd event.
|
|
54
|
+
*
|
|
55
|
+
* Defaults to `[ENTER]`.
|
|
56
|
+
*/
|
|
57
|
+
this.graniteChipInputSeparatorKeyCodes = [
|
|
58
|
+
ENTER,
|
|
59
|
+
];
|
|
60
|
+
this._addOnBlur = true;
|
|
61
|
+
this.focused = false;
|
|
62
|
+
this._disabled = false;
|
|
63
|
+
this.inputElement = this._elementRef.nativeElement;
|
|
64
|
+
}
|
|
65
|
+
ngOnChanges() {
|
|
66
|
+
this._chipList.stateChanges.next();
|
|
67
|
+
}
|
|
68
|
+
ngOnDestroy() {
|
|
69
|
+
this.graniteChipInputTokenEnd.complete();
|
|
70
|
+
}
|
|
71
|
+
ngAfterContentInit() {
|
|
72
|
+
this._focusLastChipOnBackspace = this.empty;
|
|
73
|
+
}
|
|
74
|
+
/** Utility method to make host definition/tests more clear. */
|
|
75
|
+
_keydown(event) {
|
|
76
|
+
if (event) {
|
|
77
|
+
// Allow the user's focus to escape when they're tabbing forward. Note that we don't
|
|
78
|
+
// want to do this when going backwards, because focus should go back to the first chip.
|
|
79
|
+
if (event.keyCode === TAB && !hasModifierKey(event, 'shiftKey')) {
|
|
80
|
+
this._chipList._allowFocusEscape();
|
|
81
|
+
}
|
|
82
|
+
// To prevent the user from accidentally deleting chips when pressing BACKSPACE continuously,
|
|
83
|
+
// We focus the last chip on backspace only after the user has released the backspace button,
|
|
84
|
+
// and the input is empty (see behaviour in _keyup)
|
|
85
|
+
if (event.keyCode === BACKSPACE && this._focusLastChipOnBackspace) {
|
|
86
|
+
this._chipList._keyManager.setLastItemActive();
|
|
87
|
+
event.preventDefault();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
this._focusLastChipOnBackspace = false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this._emitChipEnd(event);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Pass events to the keyboard manager. Available here for tests.
|
|
98
|
+
*/
|
|
99
|
+
_keyup(event) {
|
|
100
|
+
// Allow user to move focus to chips next time he presses backspace
|
|
101
|
+
if (!this._focusLastChipOnBackspace &&
|
|
102
|
+
event.keyCode === BACKSPACE &&
|
|
103
|
+
this.empty) {
|
|
104
|
+
this._focusLastChipOnBackspace = true;
|
|
105
|
+
event.preventDefault();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** Checks to see if the blur should emit the (chipEnd) event. */
|
|
109
|
+
_blur() {
|
|
110
|
+
if (this.graniteChipInputAddOnBlur) {
|
|
111
|
+
this._emitChipEnd();
|
|
112
|
+
}
|
|
113
|
+
this.focused = false;
|
|
114
|
+
// Blur the chip list if it is not focused
|
|
115
|
+
if (!this._chipList.focused) {
|
|
116
|
+
this._chipList._blur();
|
|
117
|
+
}
|
|
118
|
+
this._chipList.stateChanges.next();
|
|
119
|
+
}
|
|
120
|
+
_focus() {
|
|
121
|
+
this.focused = true;
|
|
122
|
+
this._focusLastChipOnBackspace = this.empty;
|
|
123
|
+
this._chipList.stateChanges.next();
|
|
124
|
+
}
|
|
125
|
+
/** Checks to see if the (chipEnd) event needs to be emitted. */
|
|
126
|
+
_emitChipEnd(event) {
|
|
127
|
+
if (!this.inputElement.value && !!event) {
|
|
128
|
+
this._chipList._keydown(event);
|
|
129
|
+
}
|
|
130
|
+
if (!event || this._isSeparatorKey(event)) {
|
|
131
|
+
this.graniteChipInputTokenEnd.emit({
|
|
132
|
+
input: this.inputElement,
|
|
133
|
+
value: this.inputElement.value,
|
|
134
|
+
chipInput: this,
|
|
135
|
+
});
|
|
136
|
+
event?.preventDefault();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
_onInput() {
|
|
140
|
+
// Let chip list know whenever the value changes.
|
|
141
|
+
this._chipList.stateChanges.next();
|
|
142
|
+
}
|
|
143
|
+
/** Focuses the input (called from parent level). */
|
|
144
|
+
setFocus(options) {
|
|
145
|
+
this.inputElement.focus(options);
|
|
146
|
+
}
|
|
147
|
+
/** Clears the input */
|
|
148
|
+
clear() {
|
|
149
|
+
this.inputElement.value = '';
|
|
150
|
+
this._focusLastChipOnBackspace = true;
|
|
151
|
+
}
|
|
152
|
+
/** Checks whether a keycode is one of the configured separators. */
|
|
153
|
+
_isSeparatorKey(event) {
|
|
154
|
+
return (!hasModifierKey(event) &&
|
|
155
|
+
new Set(this.graniteChipInputSeparatorKeyCodes).has(event.keyCode));
|
|
156
|
+
}
|
|
157
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GraniteChipInputDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
158
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: GraniteChipInputDirective, selector: "input[graniteChipInputFor]", inputs: { id: "id", placeholder: "placeholder", graniteChipInputFor: "graniteChipInputFor", graniteChipInputSeparatorKeyCodes: "graniteChipInputSeparatorKeyCodes", graniteChipInputAddOnBlur: "graniteChipInputAddOnBlur", required: "required", disabled: "disabled" }, outputs: { graniteChipInputTokenEnd: "graniteChipInputTokenEnd" }, host: { listeners: { "keydown": "_keydown($event)", "keyup": "_keyup($event)", "blur": "_blur()", "focus": "_focus()", "input": "_onInput()" }, properties: { "id": "id", "attr.disabled": "disabled || null", "attr.placeholder": "placeholder || null", "attr.aria-required": "required || null" }, classAttribute: "granite-chip-input" }, exportAs: ["graniteChipInput", "graniteChipInputFor"], usesOnChanges: true, ngImport: i0 }); }
|
|
159
|
+
}
|
|
160
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GraniteChipInputDirective, decorators: [{
|
|
161
|
+
type: Directive,
|
|
162
|
+
args: [{
|
|
163
|
+
selector: 'input[graniteChipInputFor]',
|
|
164
|
+
exportAs: 'graniteChipInput, graniteChipInputFor',
|
|
165
|
+
host: {
|
|
166
|
+
class: 'granite-chip-input',
|
|
167
|
+
'[id]': 'id',
|
|
168
|
+
'[attr.disabled]': 'disabled || null',
|
|
169
|
+
'[attr.placeholder]': 'placeholder || null',
|
|
170
|
+
'[attr.aria-required]': 'required || null',
|
|
171
|
+
'(keydown)': '_keydown($event)',
|
|
172
|
+
'(keyup)': '_keyup($event)',
|
|
173
|
+
'(blur)': '_blur()',
|
|
174
|
+
'(focus)': '_focus()',
|
|
175
|
+
'(input)': '_onInput()',
|
|
176
|
+
},
|
|
177
|
+
}]
|
|
178
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { id: [{
|
|
179
|
+
type: Input
|
|
180
|
+
}], placeholder: [{
|
|
181
|
+
type: Input
|
|
182
|
+
}], graniteChipInputTokenEnd: [{
|
|
183
|
+
type: Output
|
|
184
|
+
}], graniteChipInputFor: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], graniteChipInputSeparatorKeyCodes: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}], graniteChipInputAddOnBlur: [{
|
|
189
|
+
type: Input
|
|
190
|
+
}], required: [{
|
|
191
|
+
type: Input
|
|
192
|
+
}], disabled: [{
|
|
193
|
+
type: Input
|
|
194
|
+
}] } });
|
|
195
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpcC1pbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZ3Jhbml0ZS1jb21wb25lbnRzL3NyYy9saWIvY2hpcHMvY2hpcC1pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBeUJqRSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7QUFrQnJCLE1BQU0sT0FBTyx5QkFBeUI7SUFhcEMsbUNBQW1DO0lBQ25DLElBQ0ksbUJBQW1CLENBQUMsS0FBK0I7UUFDckQsSUFBSSxLQUFLLEVBQUU7WUFDVCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFZRDs7T0FFRztJQUNILElBQ0kseUJBQXlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSx5QkFBeUIsQ0FBQyxLQUFjO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUdEOztPQUVHO0lBQ0gsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFjO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdB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ImltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBCQUNLU1BBQ0UsIEVOVEVSLCBoYXNNb2RpZmllcktleSwgVEFCIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHcmFuaXRlQ2hpcExpc3RDb21wb25lbnQgfSBmcm9tICcuL2NoaXAtbGlzdC5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdyYW5pdGVDaGlwVGV4dENvbnRyb2wge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0ZXh0IGNvbnRyb2wuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgdGV4dCBjb250cm9sJ3MgcGxhY2Vob2xkZXIgdGV4dC4gKi9cbiAgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhlIHRleHQgY29udHJvbCBoYXMgYnJvd3NlciBmb2N1cy4gKi9cbiAgZm9jdXNlZDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHRleHQgY29udHJvbCBpcyBlbXB0eS4gKi9cbiAgZW1wdHk6IGJvb2xlYW47XG4gIC8qKiBGb2N1c2VzIHRoZSB0ZXh0IGNvbnRyb2wuICovXG4gIHNldEZvY3VzKG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpOiB2b2lkO1xufVxuXG4vKiogUmVwcmVzZW50cyBhbiBpbnB1dCBldmVudCBvbiBhIGBncmFuaXRlQ2hpcElucHV0YC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3Jhbml0ZUNoaXBJbnB1dEV2ZW50IHtcbiAgLyoqIFRoZSBuYXRpdmUgYDxpbnB1dD5gIGVsZW1lbnQgdGhhdCB0aGUgZXZlbnQgaXMgYmVpbmcgZmlyZWQgZm9yLiAqL1xuICBpbnB1dDogSFRNTElucHV0RWxlbWVudDtcbiAgLyoqIFRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQuICovXG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGNoaXAgaW5wdXQgdGhhdCBlbWl0dGVkIHRoZSBldmVudC4gKi9cbiAgY2hpcElucHV0OiBHcmFuaXRlQ2hpcElucHV0RGlyZWN0aXZlO1xufVxuXG5sZXQgbmV4dFVuaXF1ZUlkID0gMDtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbZ3Jhbml0ZUNoaXBJbnB1dEZvcl0nLFxuICBleHBvcnRBczogJ2dyYW5pdGVDaGlwSW5wdXQsIGdyYW5pdGVDaGlwSW5wdXRGb3InLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdncmFuaXRlLWNoaXAtaW5wdXQnLFxuICAgICdbaWRdJzogJ2lkJyxcbiAgICAnW2F0dHIuZGlzYWJsZWRdJzogJ2Rpc2FibGVkIHx8IG51bGwnLFxuICAgICdbYXR0ci5wbGFjZWhvbGRlcl0nOiAncGxhY2Vob2xkZXIgfHwgbnVsbCcsXG4gICAgJ1thdHRyLmFyaWEtcmVxdWlyZWRdJzogJ3JlcXVpcmVkIHx8IG51bGwnLFxuICAgICcoa2V5ZG93biknOiAnX2tleWRvd24oJGV2ZW50KScsXG4gICAgJyhrZXl1cCknOiAnX2tleXVwKCRldmVudCknLFxuICAgICcoYmx1ciknOiAnX2JsdXIoKScsXG4gICAgJyhmb2N1cyknOiAnX2ZvY3VzKCknLFxuICAgICcoaW5wdXQpJzogJ19vbklucHV0KCknLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBHcmFuaXRlQ2hpcElucHV0RGlyZWN0aXZlXG4gIGltcGxlbWVudHMgR3Jhbml0ZUNoaXBUZXh0Q29udHJvbCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXRcbntcbiAgLyoqIFVuaXF1ZSBpZCBmb3IgdGhlIGlucHV0LiAqL1xuICBASW5wdXQoKSBpZDogc3RyaW5nID0gYGdyYW5pdGUtY2hpcC1saXN0LWlucHV0LSR7bmV4dFVuaXF1ZUlkKyt9YDtcblxuICAvKiogVGhlIGlucHV0J3MgcGxhY2Vob2xkZXIgdGV4dC4gKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gYSBjaGlwIGlzIHRvIGJlIGFkZGVkLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgZ3Jhbml0ZUNoaXBJbnB1dFRva2VuRW5kID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPEdyYW5pdGVDaGlwSW5wdXRFdmVudD4oKTtcblxuICAvKiogUmVnaXN0ZXIgaW5wdXQgZm9yIGNoaXAgbGlzdCAqL1xuICBASW5wdXQoKVxuICBzZXQgZ3Jhbml0ZUNoaXBJbnB1dEZvcih2YWx1ZTogR3Jhbml0ZUNoaXBMaXN0Q29tcG9uZW50KSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9jaGlwTGlzdCA9IHZhbHVlO1xuICAgICAgdGhpcy5fY2hpcExpc3QucmVnaXN0ZXJJbnB1dCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Yga2V5IGNvZGVzIHRoYXQgd2lsbCB0cmlnZ2VyIGEgY2hpcEVuZCBldmVudC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYFtFTlRFUl1gLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ3Jhbml0ZUNoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzOiByZWFkb25seSBudW1iZXJbXSB8IFJlYWRvbmx5U2V0PG51bWJlcj4gPSBbXG4gICAgRU5URVIsXG4gIF0gYXMgY29uc3Q7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBjaGlwRW5kIGV2ZW50IHdpbGwgYmUgZW1pdHRlZCB3aGVuIHRoZSBpbnB1dCBpcyBibHVycmVkLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGdyYW5pdGVDaGlwSW5wdXRBZGRPbkJsdXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZE9uQmx1cjtcbiAgfVxuICBzZXQgZ3Jhbml0ZUNoaXBJbnB1dEFkZE9uQmx1cih2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FkZE9uQmx1ciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FkZE9uQmx1cjogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBhIHJlcXVpcmVkIGZpZWxkLCBjdXJyZW50bHkgd2UgdXNlIGl0IG9ubHkgZm9yIHNldHRpbmcgYXJpYS1yZXF1aXJlZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cbiAgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG5cbiAgLyoqIFRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCB0byB3aGljaCB0aGlzIGRpcmVjdGl2ZSBpcyBhdHRhY2hlZC4gKi9cbiAgcmVhZG9ubHkgaW5wdXRFbGVtZW50ITogSFRNTElucHV0RWxlbWVudDtcbiAgX2NoaXBMaXN0OiBHcmFuaXRlQ2hpcExpc3RDb21wb25lbnQ7XG4gIGZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgX3JlcXVpcmVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBXaGV0aGVyIHRoZSBpbnB1dCBpcyBkaXNhYmxlZC4gKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCAodGhpcy5fY2hpcExpc3QgJiYgdGhpcy5fY2hpcExpc3QuZGlzYWJsZWQpO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSBpbnB1dCBpcyBlbXB0eS4gKi9cbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIHByZXZlbnQgZm9jdXMgbW92aW5nIHRvIGNoaXBzIHdoaWxlIHVzZXIgaXMgaG9sZGluZyBiYWNrc3BhY2UgKi9cbiAgcHJpdmF0ZSBfZm9jdXNMYXN0Q2hpcE9uQmFja3NwYWNlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50Pikge1xuICAgIHRoaXMuaW5wdXRFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGlwTGlzdC5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5ncmFuaXRlQ2hpcElucHV0VG9rZW5FbmQuY29tcGxldGUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9mb2N1c0xhc3RDaGlwT25CYWNrc3BhY2UgPSB0aGlzLmVtcHR5O1xuICB9XG5cbiAgLyoqIFV0aWxpdHkgbWV0aG9kIHRvIG1ha2UgaG9zdCBkZWZpbml0aW9uL3Rlc3RzIG1vcmUgY2xlYXIuICovXG4gIF9rZXlkb3duKGV2ZW50PzogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudCkge1xuICAgICAgLy8gQWxsb3cgdGhlIHVzZXIncyBmb2N1cyB0byBlc2NhcGUgd2hlbiB0aGV5J3JlIHRhYmJpbmcgZm9yd2FyZC4gTm90ZSB0aGF0IHdlIGRvbid0XG4gICAgICAvLyB3YW50IHRvIGRvIHRoaXMgd2hlbiBnb2luZyBiYWNrd2FyZHMsIGJlY2F1c2UgZm9jdXMgc2hvdWxkIGdvIGJhY2sgdG8gdGhlIGZpcnN0IGNoaXAuXG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gVEFCICYmICFoYXNNb2RpZmllcktleShldmVudCwgJ3NoaWZ0S2V5JykpIHtcbiAgICAgICAgdGhpcy5fY2hpcExpc3QuX2FsbG93Rm9jdXNFc2NhcGUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gVG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGFjY2lkZW50YWxseSBkZWxldGluZyBjaGlwcyB3aGVuIHByZXNzaW5nIEJBQ0tTUEFDRSBjb250aW51b3VzbHksXG4gICAgICAvLyBXZSBmb2N1cyB0aGUgbGFzdCBjaGlwIG9uIGJhY2tzcGFjZSBvbmx5IGFmdGVyIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGUgYmFja3NwYWNlIGJ1dHRvbixcbiAgICAgIC8vIGFuZCB0aGUgaW5wdXQgaXMgZW1wdHkgKHNlZSBiZWhhdmlvdXIgaW4gX2tleXVwKVxuICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEJBQ0tTUEFDRSAmJiB0aGlzLl9mb2N1c0xhc3RDaGlwT25CYWNrc3BhY2UpIHtcbiAgICAgICAgdGhpcy5fY2hpcExpc3QuX2tleU1hbmFnZXIuc2V0TGFzdEl0ZW1BY3RpdmUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZm9jdXNMYXN0Q2hpcE9uQmFja3NwYWNlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdENoaXBFbmQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhc3MgZXZlbnRzIHRvIHRoZSBrZXlib2FyZCBtYW5hZ2VyLiBBdmFpbGFibGUgaGVyZSBmb3IgdGVzdHMuXG4gICAqL1xuICBfa2V5dXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBBbGxvdyB1c2VyIHRvIG1vdmUgZm9jdXMgdG8gY2hpcHMgbmV4dCB0aW1lIGhlIHByZXNzZXMgYmFja3NwYWNlXG4gICAgaWYgKFxuICAgICAgIXRoaXMuX2ZvY3VzTGFzdENoaXBPbkJhY2tzcGFjZSAmJlxuICAgICAgZXZlbnQua2V5Q29kZSA9PT0gQkFDS1NQQUNFICYmXG4gICAgICB0aGlzLmVtcHR5XG4gICAgKSB7XG4gICAgICB0aGlzLl9mb2N1c0xhc3RDaGlwT25CYWNrc3BhY2UgPSB0cnVlO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgYmx1ciBzaG91bGQgZW1pdCB0aGUgKGNoaXBFbmQpIGV2ZW50LiAqL1xuICBfYmx1cigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmFuaXRlQ2hpcElucHV0QWRkT25CbHVyKSB7XG4gICAgICB0aGlzLl9lbWl0Q2hpcEVuZCgpO1xuICAgIH1cbiAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAvLyBCbHVyIHRoZSBjaGlwIGxpc3QgaWYgaXQgaXMgbm90IGZvY3VzZWRcbiAgICBpZiAoIXRoaXMuX2NoaXBMaXN0LmZvY3VzZWQpIHtcbiAgICAgIHRoaXMuX2NoaXBMaXN0Ll9ibHVyKCk7XG4gICAgfVxuICAgIHRoaXMuX2NoaXBMaXN0LnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBfZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICB0aGlzLl9mb2N1c0xhc3RDaGlwT25CYWNrc3BhY2UgPSB0aGlzLmVtcHR5O1xuICAgIHRoaXMuX2NoaXBMaXN0LnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICAvKiogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgKGNoaXBFbmQpIGV2ZW50IG5lZWRzIHRvIGJlIGVtaXR0ZWQuICovXG4gIF9lbWl0Q2hpcEVuZChldmVudD86IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlICYmICEhZXZlbnQpIHtcbiAgICAgIHRoaXMuX2NoaXBMaXN0Ll9rZXlkb3duKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIWV2ZW50IHx8IHRoaXMuX2lzU2VwYXJhdG9yS2V5KGV2ZW50KSkge1xuICAgICAgdGhpcy5ncmFuaXRlQ2hpcElucHV0VG9rZW5FbmQuZW1pdCh7XG4gICAgICAgIGlucHV0OiB0aGlzLmlucHV0RWxlbWVudCxcbiAgICAgICAgdmFsdWU6IHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlLFxuICAgICAgICBjaGlwSW5wdXQ6IHRoaXMsXG4gICAgICB9KTtcblxuICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgX29uSW5wdXQoKTogdm9pZCB7XG4gICAgLy8gTGV0IGNoaXAgbGlzdCBrbm93IHdoZW5ldmVyIHRoZSB2YWx1ZSBjaGFuZ2VzLlxuICAgIHRoaXMuX2NoaXBMaXN0LnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICAvKiogRm9jdXNlcyB0aGUgaW5wdXQgKGNhbGxlZCBmcm9tIHBhcmVudCBsZXZlbCkuICovXG4gIHNldEZvY3VzKG9wdGlvbnM/OiBGb2N1c09wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0RWxlbWVudC5mb2N1cyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBDbGVhcnMgdGhlIGlucHV0ICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgdGhpcy5fZm9jdXNMYXN0Q2hpcE9uQmFja3NwYWNlID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBDaGVja3Mgd2hldGhlciBhIGtleWNvZGUgaXMgb25lIG9mIHRoZSBjb25maWd1cmVkIHNlcGFyYXRvcnMuICovXG4gIHByaXZhdGUgX2lzU2VwYXJhdG9yS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICFoYXNNb2RpZmllcktleShldmVudCkgJiZcbiAgICAgIG5ldyBTZXQodGhpcy5ncmFuaXRlQ2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXMpLmhhcyhldmVudC5rZXlDb2RlKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|