@ctrl/ngx-emoji-mart 8.1.0 → 9.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 +39 -14
- package/anchors.component.d.ts +1 -1
- package/category.component.d.ts +3 -3
- package/esm2022/anchors.component.mjs +100 -0
- package/esm2022/category.component.mjs +409 -0
- package/esm2022/emoji-frequently.service.mjs +90 -0
- package/esm2022/emoji-search.service.mjs +178 -0
- package/esm2022/ngx-emoji/emoji.component.mjs +299 -0
- package/esm2022/ngx-emoji/emoji.module.mjs +17 -0
- package/esm2022/ngx-emoji/emoji.service.mjs +145 -0
- package/esm2022/picker.component.mjs +522 -0
- package/esm2022/picker.module.mjs +40 -0
- package/esm2022/preview.component.mjs +206 -0
- package/esm2022/search.component.mjs +175 -0
- package/esm2022/skins.component.mjs +107 -0
- package/{fesm2020 → fesm2022}/ctrl-ngx-emoji-mart-ngx-emoji.mjs +81 -68
- package/{fesm2020 → fesm2022}/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/ctrl-ngx-emoji-mart.mjs +327 -261
- package/fesm2022/ctrl-ngx-emoji-mart.mjs.map +1 -0
- package/ngx-emoji/emoji.component.d.ts +10 -9
- package/ngx-emoji/emoji.module.d.ts +1 -2
- package/package.json +8 -16
- package/picker.component.d.ts +2 -2
- package/picker.module.d.ts +1 -4
- package/preview.component.d.ts +2 -2
- package/search.component.d.ts +1 -1
- package/skins.component.d.ts +2 -2
- package/esm2020/anchors.component.mjs +0 -83
- package/esm2020/category.component.mjs +0 -386
- package/esm2020/emoji-frequently.service.mjs +0 -88
- package/esm2020/emoji-search.service.mjs +0 -177
- package/esm2020/ngx-emoji/emoji.component.mjs +0 -283
- package/esm2020/ngx-emoji/emoji.module.mjs +0 -18
- package/esm2020/ngx-emoji/emoji.service.mjs +0 -144
- package/esm2020/picker.component.mjs +0 -508
- package/esm2020/picker.module.mjs +0 -49
- package/esm2020/preview.component.mjs +0 -187
- package/esm2020/search.component.mjs +0 -165
- package/esm2020/skins.component.mjs +0 -108
- package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs +0 -34325
- package/fesm2015/ctrl-ngx-emoji-mart-ngx-emoji.mjs.map +0 -1
- package/fesm2015/ctrl-ngx-emoji-mart.mjs +0 -1763
- package/fesm2015/ctrl-ngx-emoji-mart.mjs.map +0 -1
- package/fesm2020/ctrl-ngx-emoji-mart.mjs.map +0 -1
- /package/{esm2020 → esm2022}/ctrl-ngx-emoji-mart.mjs +0 -0
- /package/{esm2020 → esm2022}/ngx-emoji/ctrl-ngx-emoji-mart-ngx-emoji.mjs +0 -0
- /package/{esm2020 → esm2022}/ngx-emoji/data/categories.mjs +0 -0
- /package/{esm2020 → esm2022}/ngx-emoji/data/data.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/ngx-emoji/data/emojis.mjs +0 -0
- /package/{esm2020 → esm2022}/ngx-emoji/data/skins.mjs +0 -0
- /package/{esm2020 → esm2022}/ngx-emoji/index.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/svgs/index.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
@@ -0,0 +1,522 @@
|
|
1
|
+
import { CommonModule, isPlatformBrowser } from '@angular/common';
|
2
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Output, PLATFORM_ID, ViewChild, ViewChildren, } from '@angular/core';
|
3
|
+
import { categories, } from '@ctrl/ngx-emoji-mart/ngx-emoji';
|
4
|
+
import { CategoryComponent } from './category.component';
|
5
|
+
import { PreviewComponent } from './preview.component';
|
6
|
+
import { SearchComponent } from './search.component';
|
7
|
+
import * as icons from './svgs';
|
8
|
+
import { measureScrollbar } from './utils';
|
9
|
+
import { AnchorsComponent } from './anchors.component';
|
10
|
+
import * as i0 from "@angular/core";
|
11
|
+
import * as i1 from "./emoji-frequently.service";
|
12
|
+
import * as i2 from "@angular/common";
|
13
|
+
const I18N = {
|
14
|
+
search: 'Search',
|
15
|
+
emojilist: 'List of emoji',
|
16
|
+
notfound: 'No Emoji Found',
|
17
|
+
clear: 'Clear',
|
18
|
+
categories: {
|
19
|
+
search: 'Search Results',
|
20
|
+
recent: 'Frequently Used',
|
21
|
+
people: 'Smileys & People',
|
22
|
+
nature: 'Animals & Nature',
|
23
|
+
foods: 'Food & Drink',
|
24
|
+
activity: 'Activity',
|
25
|
+
places: 'Travel & Places',
|
26
|
+
objects: 'Objects',
|
27
|
+
symbols: 'Symbols',
|
28
|
+
flags: 'Flags',
|
29
|
+
custom: 'Custom',
|
30
|
+
},
|
31
|
+
skintones: {
|
32
|
+
1: 'Default Skin Tone',
|
33
|
+
2: 'Light Skin Tone',
|
34
|
+
3: 'Medium-Light Skin Tone',
|
35
|
+
4: 'Medium Skin Tone',
|
36
|
+
5: 'Medium-Dark Skin Tone',
|
37
|
+
6: 'Dark Skin Tone',
|
38
|
+
},
|
39
|
+
};
|
40
|
+
class PickerComponent {
|
41
|
+
ngZone;
|
42
|
+
renderer;
|
43
|
+
ref;
|
44
|
+
frequently;
|
45
|
+
platformId;
|
46
|
+
perLine = 9;
|
47
|
+
totalFrequentLines = 4;
|
48
|
+
i18n = {};
|
49
|
+
style = {};
|
50
|
+
title = 'Emoji Mart™';
|
51
|
+
emoji = 'department_store';
|
52
|
+
darkMode = !!(typeof matchMedia === 'function' && matchMedia('(prefers-color-scheme: dark)').matches);
|
53
|
+
color = '#ae65c5';
|
54
|
+
hideObsolete = true;
|
55
|
+
/** all categories shown */
|
56
|
+
categories = [];
|
57
|
+
/** used to temporarily draw categories */
|
58
|
+
activeCategories = [];
|
59
|
+
set = 'apple';
|
60
|
+
skin = 1;
|
61
|
+
/** Renders the native unicode emoji */
|
62
|
+
isNative = false;
|
63
|
+
emojiSize = 24;
|
64
|
+
sheetSize = 64;
|
65
|
+
emojisToShowFilter;
|
66
|
+
showPreview = true;
|
67
|
+
emojiTooltip = false;
|
68
|
+
autoFocus = false;
|
69
|
+
custom = [];
|
70
|
+
hideRecent = true;
|
71
|
+
imageUrlFn;
|
72
|
+
include;
|
73
|
+
exclude;
|
74
|
+
notFoundEmoji = 'sleuth_or_spy';
|
75
|
+
categoriesIcons = icons.categories;
|
76
|
+
searchIcons = icons.search;
|
77
|
+
useButton = false;
|
78
|
+
enableFrequentEmojiSort = false;
|
79
|
+
enableSearch = true;
|
80
|
+
showSingleCategory = false;
|
81
|
+
virtualize = false;
|
82
|
+
virtualizeOffset = 0;
|
83
|
+
recent;
|
84
|
+
emojiClick = new EventEmitter();
|
85
|
+
emojiSelect = new EventEmitter();
|
86
|
+
skinChange = new EventEmitter();
|
87
|
+
scrollRef;
|
88
|
+
previewRef;
|
89
|
+
searchRef;
|
90
|
+
categoryRefs;
|
91
|
+
scrollHeight = 0;
|
92
|
+
clientHeight = 0;
|
93
|
+
clientWidth = 0;
|
94
|
+
selected;
|
95
|
+
nextScroll;
|
96
|
+
scrollTop;
|
97
|
+
firstRender = true;
|
98
|
+
previewEmoji = null;
|
99
|
+
animationFrameRequestId = null;
|
100
|
+
NAMESPACE = 'emoji-mart';
|
101
|
+
measureScrollbar = 0;
|
102
|
+
RECENT_CATEGORY = {
|
103
|
+
id: 'recent',
|
104
|
+
name: 'Recent',
|
105
|
+
emojis: null,
|
106
|
+
};
|
107
|
+
SEARCH_CATEGORY = {
|
108
|
+
id: 'search',
|
109
|
+
name: 'Search',
|
110
|
+
emojis: null,
|
111
|
+
anchor: false,
|
112
|
+
};
|
113
|
+
CUSTOM_CATEGORY = {
|
114
|
+
id: 'custom',
|
115
|
+
name: 'Custom',
|
116
|
+
emojis: [],
|
117
|
+
};
|
118
|
+
scrollListener;
|
119
|
+
backgroundImageFn = (set, sheetSize) => `https://unpkg.com/emoji-datasource-${this.set}@6.0.1/img/${this.set}/sheets-256/${this.sheetSize}.png`;
|
120
|
+
constructor(ngZone, renderer, ref, frequently, platformId) {
|
121
|
+
this.ngZone = ngZone;
|
122
|
+
this.renderer = renderer;
|
123
|
+
this.ref = ref;
|
124
|
+
this.frequently = frequently;
|
125
|
+
this.platformId = platformId;
|
126
|
+
}
|
127
|
+
ngOnInit() {
|
128
|
+
// measure scroll
|
129
|
+
this.measureScrollbar = measureScrollbar();
|
130
|
+
this.i18n = { ...I18N, ...this.i18n };
|
131
|
+
this.i18n.categories = { ...I18N.categories, ...this.i18n.categories };
|
132
|
+
this.skin =
|
133
|
+
JSON.parse((isPlatformBrowser(this.platformId) && localStorage.getItem(`${this.NAMESPACE}.skin`)) ||
|
134
|
+
'null') || this.skin;
|
135
|
+
const allCategories = [...categories];
|
136
|
+
if (this.custom.length > 0) {
|
137
|
+
this.CUSTOM_CATEGORY.emojis = this.custom.map(emoji => {
|
138
|
+
return {
|
139
|
+
...emoji,
|
140
|
+
// `<Category />` expects emoji to have an `id`.
|
141
|
+
id: emoji.shortNames[0],
|
142
|
+
custom: true,
|
143
|
+
};
|
144
|
+
});
|
145
|
+
allCategories.push(this.CUSTOM_CATEGORY);
|
146
|
+
}
|
147
|
+
if (this.include !== undefined) {
|
148
|
+
allCategories.sort((a, b) => {
|
149
|
+
if (this.include.indexOf(a.id) > this.include.indexOf(b.id)) {
|
150
|
+
return 1;
|
151
|
+
}
|
152
|
+
return -1;
|
153
|
+
});
|
154
|
+
}
|
155
|
+
for (const category of allCategories) {
|
156
|
+
const isIncluded = this.include && this.include.length ? this.include.indexOf(category.id) > -1 : true;
|
157
|
+
const isExcluded = this.exclude && this.exclude.length ? this.exclude.indexOf(category.id) > -1 : false;
|
158
|
+
if (!isIncluded || isExcluded) {
|
159
|
+
continue;
|
160
|
+
}
|
161
|
+
if (this.emojisToShowFilter) {
|
162
|
+
const newEmojis = [];
|
163
|
+
const { emojis } = category;
|
164
|
+
for (let emojiIndex = 0; emojiIndex < emojis.length; emojiIndex++) {
|
165
|
+
const emoji = emojis[emojiIndex];
|
166
|
+
if (this.emojisToShowFilter(emoji)) {
|
167
|
+
newEmojis.push(emoji);
|
168
|
+
}
|
169
|
+
}
|
170
|
+
if (newEmojis.length) {
|
171
|
+
const newCategory = {
|
172
|
+
emojis: newEmojis,
|
173
|
+
name: category.name,
|
174
|
+
id: category.id,
|
175
|
+
};
|
176
|
+
this.categories.push(newCategory);
|
177
|
+
}
|
178
|
+
}
|
179
|
+
else {
|
180
|
+
this.categories.push(category);
|
181
|
+
}
|
182
|
+
this.categoriesIcons = { ...icons.categories, ...this.categoriesIcons };
|
183
|
+
this.searchIcons = { ...icons.search, ...this.searchIcons };
|
184
|
+
}
|
185
|
+
const includeRecent = this.include && this.include.length
|
186
|
+
? this.include.indexOf(this.RECENT_CATEGORY.id) > -1
|
187
|
+
: true;
|
188
|
+
const excludeRecent = this.exclude && this.exclude.length
|
189
|
+
? this.exclude.indexOf(this.RECENT_CATEGORY.id) > -1
|
190
|
+
: false;
|
191
|
+
if (includeRecent && !excludeRecent) {
|
192
|
+
this.hideRecent = false;
|
193
|
+
this.categories.unshift(this.RECENT_CATEGORY);
|
194
|
+
}
|
195
|
+
if (this.categories[0]) {
|
196
|
+
this.categories[0].first = true;
|
197
|
+
}
|
198
|
+
this.categories.unshift(this.SEARCH_CATEGORY);
|
199
|
+
this.selected = this.categories.filter(category => category.first)[0].name;
|
200
|
+
// Need to be careful if small number of categories
|
201
|
+
const categoriesToLoadFirst = Math.min(this.categories.length, 3);
|
202
|
+
this.setActiveCategories((this.activeCategories = this.categories.slice(0, categoriesToLoadFirst)));
|
203
|
+
// Trim last active category
|
204
|
+
const lastActiveCategoryEmojis = this.categories[categoriesToLoadFirst - 1].emojis.slice();
|
205
|
+
this.categories[categoriesToLoadFirst - 1].emojis = lastActiveCategoryEmojis.slice(0, 60);
|
206
|
+
setTimeout(() => {
|
207
|
+
// Restore last category
|
208
|
+
this.categories[categoriesToLoadFirst - 1].emojis = lastActiveCategoryEmojis;
|
209
|
+
this.setActiveCategories(this.categories);
|
210
|
+
// The `setTimeout` will trigger the change detection, but since we're inside
|
211
|
+
// the OnPush component we can run change detection locally starting from this
|
212
|
+
// component and going down to the children.
|
213
|
+
this.ref.detectChanges();
|
214
|
+
isPlatformBrowser(this.platformId) &&
|
215
|
+
this.ngZone.runOutsideAngular(() => {
|
216
|
+
// The `updateCategoriesSize` doesn't change properties that are used
|
217
|
+
// in templates, thus this is run in the context of the root zone to avoid
|
218
|
+
// running change detection.
|
219
|
+
requestAnimationFrame(() => {
|
220
|
+
this.updateCategoriesSize();
|
221
|
+
});
|
222
|
+
});
|
223
|
+
});
|
224
|
+
this.ngZone.runOutsideAngular(() => {
|
225
|
+
// DOM events that are listened by Angular inside the template trigger change detection
|
226
|
+
// and also wrapped into additional functions that call `markForCheck()`. We listen `scroll`
|
227
|
+
// in the context of the root zone since it will not trigger change detection each time
|
228
|
+
// the `scroll` event is dispatched.
|
229
|
+
this.scrollListener = this.renderer.listen(this.scrollRef.nativeElement, 'scroll', () => {
|
230
|
+
this.handleScroll();
|
231
|
+
});
|
232
|
+
});
|
233
|
+
}
|
234
|
+
ngOnDestroy() {
|
235
|
+
this.scrollListener?.();
|
236
|
+
// This is called here because the component might be destroyed
|
237
|
+
// but there will still be a `requestAnimationFrame` callback in the queue
|
238
|
+
// that calls `detectChanges()` on the `ViewRef`. This will lead to a runtime
|
239
|
+
// exception if the `detectChanges()` is called after the `ViewRef` is destroyed.
|
240
|
+
this.cancelAnimationFrame();
|
241
|
+
}
|
242
|
+
setActiveCategories(categoriesToMakeActive) {
|
243
|
+
if (this.showSingleCategory) {
|
244
|
+
this.activeCategories = categoriesToMakeActive.filter(x => x.name === this.selected || x === this.SEARCH_CATEGORY);
|
245
|
+
}
|
246
|
+
else {
|
247
|
+
this.activeCategories = categoriesToMakeActive;
|
248
|
+
}
|
249
|
+
}
|
250
|
+
updateCategoriesSize() {
|
251
|
+
this.categoryRefs.forEach(component => component.memoizeSize());
|
252
|
+
if (this.scrollRef) {
|
253
|
+
const target = this.scrollRef.nativeElement;
|
254
|
+
this.scrollHeight = target.scrollHeight;
|
255
|
+
this.clientHeight = target.clientHeight;
|
256
|
+
this.clientWidth = target.clientWidth;
|
257
|
+
}
|
258
|
+
}
|
259
|
+
handleAnchorClick($event) {
|
260
|
+
this.updateCategoriesSize();
|
261
|
+
this.selected = $event.category.name;
|
262
|
+
this.setActiveCategories(this.categories);
|
263
|
+
if (this.SEARCH_CATEGORY.emojis) {
|
264
|
+
this.handleSearch(null);
|
265
|
+
this.searchRef?.clear();
|
266
|
+
this.handleAnchorClick($event);
|
267
|
+
return;
|
268
|
+
}
|
269
|
+
const component = this.categoryRefs.find(n => n.id === $event.category.id);
|
270
|
+
if (component) {
|
271
|
+
let { top } = component;
|
272
|
+
if ($event.category.first) {
|
273
|
+
top = 0;
|
274
|
+
}
|
275
|
+
else {
|
276
|
+
top += 1;
|
277
|
+
}
|
278
|
+
this.scrollRef.nativeElement.scrollTop = top;
|
279
|
+
}
|
280
|
+
this.nextScroll = $event.category.name;
|
281
|
+
// handle component scrolling to load emojis
|
282
|
+
for (const category of this.categories) {
|
283
|
+
const componentToScroll = this.categoryRefs.find(({ id }) => id === category.id);
|
284
|
+
componentToScroll?.handleScroll(this.scrollRef.nativeElement.scrollTop);
|
285
|
+
}
|
286
|
+
}
|
287
|
+
categoryTrack(index, item) {
|
288
|
+
return item.id;
|
289
|
+
}
|
290
|
+
handleScroll(noSelectionChange = false) {
|
291
|
+
if (this.nextScroll) {
|
292
|
+
this.selected = this.nextScroll;
|
293
|
+
this.nextScroll = undefined;
|
294
|
+
this.ref.detectChanges();
|
295
|
+
return;
|
296
|
+
}
|
297
|
+
if (!this.scrollRef) {
|
298
|
+
return;
|
299
|
+
}
|
300
|
+
if (this.showSingleCategory) {
|
301
|
+
return;
|
302
|
+
}
|
303
|
+
let activeCategory;
|
304
|
+
if (this.SEARCH_CATEGORY.emojis) {
|
305
|
+
activeCategory = this.SEARCH_CATEGORY;
|
306
|
+
}
|
307
|
+
else {
|
308
|
+
const target = this.scrollRef.nativeElement;
|
309
|
+
// check scroll is not at bottom
|
310
|
+
if (target.scrollTop === 0) {
|
311
|
+
// hit the TOP
|
312
|
+
activeCategory = this.categories.find(n => n.first === true);
|
313
|
+
}
|
314
|
+
else if (target.scrollHeight - target.scrollTop === this.clientHeight) {
|
315
|
+
// scrolled to bottom activate last category
|
316
|
+
activeCategory = this.categories[this.categories.length - 1];
|
317
|
+
}
|
318
|
+
else {
|
319
|
+
// scrolling
|
320
|
+
for (const category of this.categories) {
|
321
|
+
const component = this.categoryRefs.find(({ id }) => id === category.id);
|
322
|
+
const active = component?.handleScroll(target.scrollTop);
|
323
|
+
if (active) {
|
324
|
+
activeCategory = category;
|
325
|
+
}
|
326
|
+
}
|
327
|
+
}
|
328
|
+
this.scrollTop = target.scrollTop;
|
329
|
+
}
|
330
|
+
// This will allow us to run the change detection only when the category changes.
|
331
|
+
if (!noSelectionChange && activeCategory && activeCategory.name !== this.selected) {
|
332
|
+
this.selected = activeCategory.name;
|
333
|
+
this.ref.detectChanges();
|
334
|
+
}
|
335
|
+
else if (noSelectionChange) {
|
336
|
+
this.ref.detectChanges();
|
337
|
+
}
|
338
|
+
}
|
339
|
+
handleSearch($emojis) {
|
340
|
+
this.SEARCH_CATEGORY.emojis = $emojis;
|
341
|
+
for (const component of this.categoryRefs.toArray()) {
|
342
|
+
if (component.name === 'Search') {
|
343
|
+
component.emojis = $emojis;
|
344
|
+
component.updateDisplay($emojis ? 'block' : 'none');
|
345
|
+
}
|
346
|
+
else {
|
347
|
+
component.updateDisplay($emojis ? 'none' : 'block');
|
348
|
+
}
|
349
|
+
}
|
350
|
+
this.scrollRef.nativeElement.scrollTop = 0;
|
351
|
+
this.handleScroll();
|
352
|
+
}
|
353
|
+
handleEnterKey($event, emoji) {
|
354
|
+
if (!emoji) {
|
355
|
+
if (this.SEARCH_CATEGORY.emojis !== null && this.SEARCH_CATEGORY.emojis.length) {
|
356
|
+
emoji = this.SEARCH_CATEGORY.emojis[0];
|
357
|
+
if (emoji) {
|
358
|
+
this.emojiSelect.emit({ $event, emoji });
|
359
|
+
}
|
360
|
+
else {
|
361
|
+
return;
|
362
|
+
}
|
363
|
+
}
|
364
|
+
}
|
365
|
+
if (!this.hideRecent && !this.recent && emoji) {
|
366
|
+
this.frequently.add(emoji);
|
367
|
+
}
|
368
|
+
const component = this.categoryRefs.toArray()[1];
|
369
|
+
if (component && this.enableFrequentEmojiSort) {
|
370
|
+
component.updateRecentEmojis();
|
371
|
+
component.ref.markForCheck();
|
372
|
+
}
|
373
|
+
}
|
374
|
+
handleEmojiOver($event) {
|
375
|
+
if (!this.showPreview || !this.previewRef) {
|
376
|
+
return;
|
377
|
+
}
|
378
|
+
const emojiData = this.CUSTOM_CATEGORY.emojis.find((customEmoji) => customEmoji.id === $event.emoji.id);
|
379
|
+
if (emojiData) {
|
380
|
+
$event.emoji = { ...emojiData };
|
381
|
+
}
|
382
|
+
this.previewEmoji = $event.emoji;
|
383
|
+
this.cancelAnimationFrame();
|
384
|
+
this.ref.detectChanges();
|
385
|
+
}
|
386
|
+
handleEmojiLeave() {
|
387
|
+
if (!this.showPreview || !this.previewRef) {
|
388
|
+
return;
|
389
|
+
}
|
390
|
+
// Note: `handleEmojiLeave` will be invoked outside of the Angular zone because of the `mouseleave`
|
391
|
+
// event set up outside of the Angular zone in `ngx-emoji`. See `setupMouseLeaveListener`.
|
392
|
+
// This is done explicitly because we don't have to run redundant change detection since we
|
393
|
+
// would still want to leave the Angular zone here when scheduling animation frame.
|
394
|
+
this.animationFrameRequestId = requestAnimationFrame(() => {
|
395
|
+
this.previewEmoji = null;
|
396
|
+
this.ref.detectChanges();
|
397
|
+
});
|
398
|
+
}
|
399
|
+
handleEmojiClick($event) {
|
400
|
+
this.emojiClick.emit($event);
|
401
|
+
this.emojiSelect.emit($event);
|
402
|
+
this.handleEnterKey($event.$event, $event.emoji);
|
403
|
+
}
|
404
|
+
handleSkinChange(skin) {
|
405
|
+
this.skin = skin;
|
406
|
+
localStorage.setItem(`${this.NAMESPACE}.skin`, String(skin));
|
407
|
+
this.skinChange.emit(skin);
|
408
|
+
}
|
409
|
+
getWidth() {
|
410
|
+
if (this.style && this.style.width) {
|
411
|
+
return this.style.width;
|
412
|
+
}
|
413
|
+
return this.perLine * (this.emojiSize + 12) + 12 + 2 + this.measureScrollbar + 'px';
|
414
|
+
}
|
415
|
+
cancelAnimationFrame() {
|
416
|
+
if (this.animationFrameRequestId !== null) {
|
417
|
+
cancelAnimationFrame(this.animationFrameRequestId);
|
418
|
+
this.animationFrameRequestId = null;
|
419
|
+
}
|
420
|
+
}
|
421
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: PickerComponent, deps: [{ token: i0.NgZone }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.EmojiFrequentlyService }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
|
422
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: PickerComponent, isStandalone: true, selector: "emoji-mart", inputs: { perLine: "perLine", totalFrequentLines: "totalFrequentLines", i18n: "i18n", style: "style", title: "title", emoji: "emoji", darkMode: "darkMode", color: "color", hideObsolete: "hideObsolete", categories: "categories", activeCategories: "activeCategories", set: "set", skin: "skin", isNative: "isNative", emojiSize: "emojiSize", sheetSize: "sheetSize", emojisToShowFilter: "emojisToShowFilter", showPreview: "showPreview", emojiTooltip: "emojiTooltip", autoFocus: "autoFocus", custom: "custom", hideRecent: "hideRecent", imageUrlFn: "imageUrlFn", include: "include", exclude: "exclude", notFoundEmoji: "notFoundEmoji", categoriesIcons: "categoriesIcons", searchIcons: "searchIcons", useButton: "useButton", enableFrequentEmojiSort: "enableFrequentEmojiSort", enableSearch: "enableSearch", showSingleCategory: "showSingleCategory", virtualize: "virtualize", virtualizeOffset: "virtualizeOffset", recent: "recent", backgroundImageFn: "backgroundImageFn" }, outputs: { emojiClick: "emojiClick", emojiSelect: "emojiSelect", skinChange: "skinChange" }, viewQueries: [{ propertyName: "scrollRef", first: true, predicate: ["scrollRef"], descendants: true, static: true }, { propertyName: "previewRef", first: true, predicate: PreviewComponent, descendants: true }, { propertyName: "searchRef", first: true, predicate: SearchComponent, descendants: true }, { propertyName: "categoryRefs", predicate: CategoryComponent, descendants: true }], ngImport: i0, template: "<section\n class=\"emoji-mart {{ darkMode ? 'emoji-mart-dark' : '' }}\"\n [style.width]=\"getWidth()\"\n [ngStyle]=\"style\"\n>\n <div class=\"emoji-mart-bar\">\n <emoji-mart-anchors\n [categories]=\"categories\"\n (anchorClick)=\"handleAnchorClick($event)\"\n [color]=\"color\"\n [selected]=\"selected\"\n [i18n]=\"i18n\"\n [icons]=\"categoriesIcons\"\n ></emoji-mart-anchors>\n </div>\n <emoji-search\n *ngIf=\"enableSearch\"\n [i18n]=\"i18n\"\n (searchResults)=\"handleSearch($event)\"\n (enterKey)=\"handleEnterKey($event)\"\n [include]=\"include\"\n [exclude]=\"exclude\"\n [custom]=\"custom\"\n [autoFocus]=\"autoFocus\"\n [icons]=\"searchIcons\"\n [emojisToShowFilter]=\"emojisToShowFilter\"\n ></emoji-search>\n <section #scrollRef class=\"emoji-mart-scroll\" [attr.aria-label]=\"i18n.emojilist\">\n <emoji-category\n *ngFor=\"let category of activeCategories; let idx = index; trackBy: categoryTrack\"\n [id]=\"category.id\"\n [name]=\"category.name\"\n [emojis]=\"category.emojis\"\n [perLine]=\"perLine\"\n [totalFrequentLines]=\"totalFrequentLines\"\n [hasStickyPosition]=\"isNative\"\n [i18n]=\"i18n\"\n [hideObsolete]=\"hideObsolete\"\n [notFoundEmoji]=\"notFoundEmoji\"\n [custom]=\"category.id === RECENT_CATEGORY.id ? CUSTOM_CATEGORY.emojis : undefined\"\n [recent]=\"category.id === RECENT_CATEGORY.id ? recent : undefined\"\n [virtualize]=\"virtualize\"\n [virtualizeOffset]=\"virtualizeOffset\"\n [emojiIsNative]=\"isNative\"\n [emojiSkin]=\"skin\"\n [emojiSize]=\"emojiSize\"\n [emojiSet]=\"set\"\n [emojiSheetSize]=\"sheetSize\"\n [emojiForceSize]=\"isNative\"\n [emojiTooltip]=\"emojiTooltip\"\n [emojiBackgroundImageFn]=\"backgroundImageFn\"\n [emojiImageUrlFn]=\"imageUrlFn\"\n [emojiUseButton]=\"useButton\"\n (emojiOverOutsideAngular)=\"handleEmojiOver($event)\"\n (emojiLeaveOutsideAngular)=\"handleEmojiLeave()\"\n (emojiClick)=\"handleEmojiClick($event)\"\n ></emoji-category>\n </section>\n <div class=\"emoji-mart-bar\" *ngIf=\"showPreview\">\n <emoji-preview\n [attr.title]=\"title\"\n [emoji]=\"previewEmoji\"\n [idleEmoji]=\"emoji\"\n [emojiIsNative]=\"isNative\"\n [emojiSize]=\"38\"\n [emojiSkin]=\"skin\"\n [emojiSet]=\"set\"\n [i18n]=\"i18n\"\n [emojiSheetSize]=\"sheetSize\"\n [emojiBackgroundImageFn]=\"backgroundImageFn\"\n [emojiImageUrlFn]=\"imageUrlFn\"\n (skinChange)=\"handleSkinChange($event)\"\n ></emoji-preview>\n </div>\n</section>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: AnchorsComponent, selector: "emoji-mart-anchors", inputs: ["categories", "color", "selected", "i18n", "icons"], outputs: ["anchorClick"] }, { kind: "component", type: SearchComponent, selector: "emoji-search", inputs: ["maxResults", "autoFocus", "i18n", "include", "exclude", "custom", "icons", "emojisToShowFilter"], outputs: ["searchResults", "enterKey"] }, { kind: "component", type: PreviewComponent, selector: "emoji-preview", inputs: ["title", "emoji", "idleEmoji", "i18n", "emojiIsNative", "emojiSkin", "emojiSize", "emojiSet", "emojiSheetSize", "emojiBackgroundImageFn", "emojiImageUrlFn"], outputs: ["skinChange"] }, { kind: "component", type: CategoryComponent, selector: "emoji-category", inputs: ["emojis", "hasStickyPosition", "name", "perLine", "totalFrequentLines", "recent", "custom", "i18n", "id", "hideObsolete", "notFoundEmoji", "virtualize", "virtualizeOffset", "emojiIsNative", "emojiSkin", "emojiSize", "emojiSet", "emojiSheetSize", "emojiForceSize", "emojiTooltip", "emojiBackgroundImageFn", "emojiImageUrlFn", "emojiUseButton"], outputs: ["emojiClick", "emojiOverOutsideAngular", "emojiLeaveOutsideAngular"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
423
|
+
}
|
424
|
+
export { PickerComponent };
|
425
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: PickerComponent, decorators: [{
|
426
|
+
type: Component,
|
427
|
+
args: [{ selector: 'emoji-mart', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, standalone: true, imports: [CommonModule, AnchorsComponent, SearchComponent, PreviewComponent, CategoryComponent], template: "<section\n class=\"emoji-mart {{ darkMode ? 'emoji-mart-dark' : '' }}\"\n [style.width]=\"getWidth()\"\n [ngStyle]=\"style\"\n>\n <div class=\"emoji-mart-bar\">\n <emoji-mart-anchors\n [categories]=\"categories\"\n (anchorClick)=\"handleAnchorClick($event)\"\n [color]=\"color\"\n [selected]=\"selected\"\n [i18n]=\"i18n\"\n [icons]=\"categoriesIcons\"\n ></emoji-mart-anchors>\n </div>\n <emoji-search\n *ngIf=\"enableSearch\"\n [i18n]=\"i18n\"\n (searchResults)=\"handleSearch($event)\"\n (enterKey)=\"handleEnterKey($event)\"\n [include]=\"include\"\n [exclude]=\"exclude\"\n [custom]=\"custom\"\n [autoFocus]=\"autoFocus\"\n [icons]=\"searchIcons\"\n [emojisToShowFilter]=\"emojisToShowFilter\"\n ></emoji-search>\n <section #scrollRef class=\"emoji-mart-scroll\" [attr.aria-label]=\"i18n.emojilist\">\n <emoji-category\n *ngFor=\"let category of activeCategories; let idx = index; trackBy: categoryTrack\"\n [id]=\"category.id\"\n [name]=\"category.name\"\n [emojis]=\"category.emojis\"\n [perLine]=\"perLine\"\n [totalFrequentLines]=\"totalFrequentLines\"\n [hasStickyPosition]=\"isNative\"\n [i18n]=\"i18n\"\n [hideObsolete]=\"hideObsolete\"\n [notFoundEmoji]=\"notFoundEmoji\"\n [custom]=\"category.id === RECENT_CATEGORY.id ? CUSTOM_CATEGORY.emojis : undefined\"\n [recent]=\"category.id === RECENT_CATEGORY.id ? recent : undefined\"\n [virtualize]=\"virtualize\"\n [virtualizeOffset]=\"virtualizeOffset\"\n [emojiIsNative]=\"isNative\"\n [emojiSkin]=\"skin\"\n [emojiSize]=\"emojiSize\"\n [emojiSet]=\"set\"\n [emojiSheetSize]=\"sheetSize\"\n [emojiForceSize]=\"isNative\"\n [emojiTooltip]=\"emojiTooltip\"\n [emojiBackgroundImageFn]=\"backgroundImageFn\"\n [emojiImageUrlFn]=\"imageUrlFn\"\n [emojiUseButton]=\"useButton\"\n (emojiOverOutsideAngular)=\"handleEmojiOver($event)\"\n (emojiLeaveOutsideAngular)=\"handleEmojiLeave()\"\n (emojiClick)=\"handleEmojiClick($event)\"\n ></emoji-category>\n </section>\n <div class=\"emoji-mart-bar\" *ngIf=\"showPreview\">\n <emoji-preview\n [attr.title]=\"title\"\n [emoji]=\"previewEmoji\"\n [idleEmoji]=\"emoji\"\n [emojiIsNative]=\"isNative\"\n [emojiSize]=\"38\"\n [emojiSkin]=\"skin\"\n [emojiSet]=\"set\"\n [i18n]=\"i18n\"\n [emojiSheetSize]=\"sheetSize\"\n [emojiBackgroundImageFn]=\"backgroundImageFn\"\n [emojiImageUrlFn]=\"imageUrlFn\"\n (skinChange)=\"handleSkinChange($event)\"\n ></emoji-preview>\n </div>\n</section>\n" }]
|
428
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.EmojiFrequentlyService }, { type: undefined, decorators: [{
|
429
|
+
type: Inject,
|
430
|
+
args: [PLATFORM_ID]
|
431
|
+
}] }]; }, propDecorators: { perLine: [{
|
432
|
+
type: Input
|
433
|
+
}], totalFrequentLines: [{
|
434
|
+
type: Input
|
435
|
+
}], i18n: [{
|
436
|
+
type: Input
|
437
|
+
}], style: [{
|
438
|
+
type: Input
|
439
|
+
}], title: [{
|
440
|
+
type: Input
|
441
|
+
}], emoji: [{
|
442
|
+
type: Input
|
443
|
+
}], darkMode: [{
|
444
|
+
type: Input
|
445
|
+
}], color: [{
|
446
|
+
type: Input
|
447
|
+
}], hideObsolete: [{
|
448
|
+
type: Input
|
449
|
+
}], categories: [{
|
450
|
+
type: Input
|
451
|
+
}], activeCategories: [{
|
452
|
+
type: Input
|
453
|
+
}], set: [{
|
454
|
+
type: Input
|
455
|
+
}], skin: [{
|
456
|
+
type: Input
|
457
|
+
}], isNative: [{
|
458
|
+
type: Input
|
459
|
+
}], emojiSize: [{
|
460
|
+
type: Input
|
461
|
+
}], sheetSize: [{
|
462
|
+
type: Input
|
463
|
+
}], emojisToShowFilter: [{
|
464
|
+
type: Input
|
465
|
+
}], showPreview: [{
|
466
|
+
type: Input
|
467
|
+
}], emojiTooltip: [{
|
468
|
+
type: Input
|
469
|
+
}], autoFocus: [{
|
470
|
+
type: Input
|
471
|
+
}], custom: [{
|
472
|
+
type: Input
|
473
|
+
}], hideRecent: [{
|
474
|
+
type: Input
|
475
|
+
}], imageUrlFn: [{
|
476
|
+
type: Input
|
477
|
+
}], include: [{
|
478
|
+
type: Input
|
479
|
+
}], exclude: [{
|
480
|
+
type: Input
|
481
|
+
}], notFoundEmoji: [{
|
482
|
+
type: Input
|
483
|
+
}], categoriesIcons: [{
|
484
|
+
type: Input
|
485
|
+
}], searchIcons: [{
|
486
|
+
type: Input
|
487
|
+
}], useButton: [{
|
488
|
+
type: Input
|
489
|
+
}], enableFrequentEmojiSort: [{
|
490
|
+
type: Input
|
491
|
+
}], enableSearch: [{
|
492
|
+
type: Input
|
493
|
+
}], showSingleCategory: [{
|
494
|
+
type: Input
|
495
|
+
}], virtualize: [{
|
496
|
+
type: Input
|
497
|
+
}], virtualizeOffset: [{
|
498
|
+
type: Input
|
499
|
+
}], recent: [{
|
500
|
+
type: Input
|
501
|
+
}], emojiClick: [{
|
502
|
+
type: Output
|
503
|
+
}], emojiSelect: [{
|
504
|
+
type: Output
|
505
|
+
}], skinChange: [{
|
506
|
+
type: Output
|
507
|
+
}], scrollRef: [{
|
508
|
+
type: ViewChild,
|
509
|
+
args: ['scrollRef', { static: true }]
|
510
|
+
}], previewRef: [{
|
511
|
+
type: ViewChild,
|
512
|
+
args: [PreviewComponent, { static: false }]
|
513
|
+
}], searchRef: [{
|
514
|
+
type: ViewChild,
|
515
|
+
args: [SearchComponent, { static: false }]
|
516
|
+
}], categoryRefs: [{
|
517
|
+
type: ViewChildren,
|
518
|
+
args: [CategoryComponent]
|
519
|
+
}], backgroundImageFn: [{
|
520
|
+
type: Input
|
521
|
+
}] } });
|
522
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvcGlja2VyL3BpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi9zcmMvbGliL3BpY2tlci9waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xFLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUlMLE1BQU0sRUFDTixXQUFXLEVBR1gsU0FBUyxFQUNULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsVUFBVSxHQUtYLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sS0FBSyxLQUFLLE1BQU0sUUFBUSxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUV2RCxNQUFNLElBQUksR0FBUTtJQUNoQixNQUFNLEVBQUUsUUFBUTtJQUNoQixTQUFTLEVBQUUsZUFBZTtJQUMxQixRQUFRLEVBQUUsZ0JBQWdCO0lBQzFCLEtBQUssRUFBRSxPQUFPO0lBQ2QsVUFBVSxFQUFFO1FBQ1YsTUFBTSxFQUFFLGdCQUFnQjtRQUN4QixNQUFNLEVBQUUsaUJBQWlCO1FBQ3pCLE1BQU0sRUFBRSxrQkFBa0I7UUFDMUIsTUFBTSxFQUFFLGtCQUFrQjtRQUMxQixLQUFLLEVBQUUsY0FBYztRQUNy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QjtzQkFBMUIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNJLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUMyQyxTQUFTO3NCQUExRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ1EsVUFBVTtzQkFBekQsU0FBUzt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ0MsU0FBUztzQkFBdkQsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUNaLFlBQVk7c0JBQTVDLFlBQVk7dUJBQUMsaUJBQWlCO2dCQStCL0IsaUJBQWlCO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFBMQVRGT1JNX0lELFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q2hpbGRyZW4sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1xuICBjYXRlZ29yaWVzLFxuICBFbW9qaSxcbiAgRW1vamlDYXRlZ29yeSxcbiAgRW1vamlEYXRhLFxuICBFbW9qaUV2ZW50LFxufSBmcm9tICdAY3RybC9uZ3gtZW1vamktbWFydC9uZ3gtZW1vamknO1xuaW1wb3J0IHsgQ2F0ZWdvcnlDb21wb25lbnQgfSBmcm9tICcuL2NhdGVnb3J5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbW9qaUZyZXF1ZW50bHlTZXJ2aWNlIH0gZnJvbSAnLi9lbW9qaS1mcmVxdWVudGx5LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4vcHJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VhcmNoQ29tcG9uZW50IH0gZnJvbSAnLi9zZWFyY2guY29tcG9uZW50JztcbmltcG9ydCAqIGFzIGljb25zIGZyb20gJy4vc3Zncyc7XG5pbXBvcnQgeyBtZWFzdXJlU2Nyb2xsYmFyIH0gZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCB7IEFuY2hvcnNDb21wb25lbnQgfSBmcm9tICcuL2FuY2hvcnMuY29tcG9uZW50JztcblxuY29uc3QgSTE4TjogYW55ID0ge1xuICBzZWFyY2g6ICdTZWFyY2gnLFxuICBlbW9qaWxpc3Q6ICdMaXN0IG9mIGVtb2ppJyxcbiAgbm90Zm91bmQ6ICdObyBFbW9qaSBGb3VuZCcsXG4gIGNsZWFyOiAnQ2xlYXInLFxuICBjYXRlZ29yaWVzOiB7XG4gICAgc2VhcmNoOiAnU2VhcmNoIFJlc3VsdHMnLFxuICAgIHJlY2VudDogJ0ZyZXF1ZW50bHkgVXNlZCcsXG4gICAgcGVvcGxlOiAnU21pbGV5cyAmIFBlb3BsZScsXG4gICAgbmF0dXJlOiAnQW5pbWFscyAmIE5hdHVyZScsXG4gICAgZm9vZHM6ICdGb29kICYgRHJpbmsnLFxuICAgIGFjdGl2aXR5OiAnQWN0aXZpdHknLFxuICAgIHBsYWNlczogJ1RyYXZlbCAmIFBsYWNlcycsXG4gICAgb2JqZWN0czogJ09iamVjdHMnLFxuICAgIHN5bWJvbHM6ICdTeW1ib2xzJyxcbiAgICBmbGFnczogJ0ZsYWdzJyxcbiAgICBjdXN0b206ICdDdXN0b20nLFxuICB9LFxuICBza2ludG9uZXM6IHtcbiAgICAxOiAnRGVmYXVsdCBTa2luIFRvbmUnLFxuICAgIDI6ICdMaWdodCBTa2luIFRvbmUnLFxuICAgIDM6ICdNZWRpdW0tTGlnaHQgU2tpbiBUb25lJyxcbiAgICA0OiAnTWVkaXVtIFNraW4gVG9uZScsXG4gICAgNTogJ01lZGl1bS1EYXJrIFNraW4gVG9uZScsXG4gICAgNjogJ0RhcmsgU2tpbiBUb25lJyxcbiAgfSxcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Vtb2ppLW1hcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGlja2VyLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBBbmNob3JzQ29tcG9uZW50LCBTZWFyY2hDb21wb25lbnQsIFByZXZpZXdDb21wb25lbnQsIENhdGVnb3J5Q29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwZXJMaW5lID0gOTtcbiAgQElucHV0KCkgdG90YWxGcmVxdWVudExpbmVzID0gNDtcbiAgQElucHV0KCkgaTE4bjogYW55ID0ge307XG4gIEBJbnB1dCgpIHN0eWxlOiBhbnkgPSB7fTtcbiAgQElucHV0KCkgdGl0bGUgPSAnRW1vamkgTWFydOKEoic7XG4gIEBJbnB1dCgpIGVtb2ppID0gJ2RlcGFydG1lbnRfc3RvcmUnO1xuICBASW5wdXQoKSBkYXJrTW9kZSA9ICEhKFxuICAgIHR5cGVvZiBtYXRjaE1lZGlhID09PSAnZnVuY3Rpb24nICYmIG1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzXG4gICk7XG4gIEBJbnB1dCgpIGNvbG9yID0gJyNhZTY1YzUnO1xuICBASW5wdXQoKSBoaWRlT2Jzb2xldGUgPSB0cnVlO1xuICAvKiogYWxsIGNhdGVnb3JpZXMgc2hvd24gKi9cbiAgQElucHV0KCkgY2F0ZWdvcmllczogRW1vamlDYXRlZ29yeVtdID0gW107XG4gIC8qKiB1c2VkIHRvIHRlbXBvcmFyaWx5IGRyYXcgY2F0ZWdvcmllcyAqL1xuICBASW5wdXQoKSBhY3RpdmVDYXRlZ29yaWVzOiBFbW9qaUNhdGVnb3J5W10gPSBbXTtcbiAgQElucHV0KCkgc2V0OiBFbW9qaVsnc2V0J10gPSAnYXBwbGUnO1xuICBASW5wdXQoKSBza2luOiBFbW9qaVsnc2tpbiddID0gMTtcbiAgLyoqIFJlbmRlcnMgdGhlIG5hdGl2ZSB1bmljb2RlIGVtb2ppICovXG4gIEBJbnB1dCgpIGlzTmF0aXZlOiBFbW9qaVsnaXNOYXRpdmUnXSA9IGZhbHNlO1xuICBASW5wdXQoKSBlbW9qaVNpemU6IEVtb2ppWydzaXplJ10gPSAyNDtcbiAgQElucHV0KCkgc2hlZXRTaXplOiBFbW9qaVsnc2hlZXRTaXplJ10gPSA2NDtcbiAgQElucHV0KCkgZW1vamlzVG9TaG93RmlsdGVyPzogKHg6IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvd1ByZXZpZXcgPSB0cnVlO1xuICBASW5wdXQoKSBlbW9qaVRvb2x0aXAgPSBmYWxzZTtcbiAgQElucHV0KCkgYXV0b0ZvY3VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIGN1c3RvbTogYW55W10gPSBbXTtcbiAgQElucHV0KCkgaGlkZVJlY2VudCA9IHRydWU7XG4gIEBJbnB1dCgpIGltYWdlVXJsRm46IEVtb2ppWydpbWFnZVVybEZuJ107XG4gIEBJbnB1dCgpIGluY2x1ZGU/OiBzdHJpbmdbXTtcbiAgQElucHV0KCkgZXhjbHVkZT86IHN0cmluZ1tdO1xuICBASW5wdXQoKSBub3RGb3VuZEVtb2ppID0gJ3NsZXV0aF9vcl9zcHknO1xuICBASW5wdXQoKSBjYXRlZ29yaWVzSWNvbnMgPSBpY29ucy5jYXRlZ29yaWVzO1xuICBASW5wdXQoKSBzZWFyY2hJY29ucyA9IGljb25zLnNlYXJjaDtcbiAgQElucHV0KCkgdXNlQnV0dG9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVuYWJsZUZyZXF1ZW50RW1vamlTb3J0ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGVuYWJsZVNlYXJjaCA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dTaW5nbGVDYXRlZ29yeSA9IGZhbHNlO1xuICBASW5wdXQoKSB2aXJ0dWFsaXplID0gZmFsc2U7XG4gIEBJbnB1dCgpIHZpcnR1YWxpemVPZmZzZXQgPSAwO1xuICBASW5wdXQoKSByZWNlbnQ/OiBzdHJpbmdbXTtcbiAgQE91dHB1dCgpIGVtb2ppQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGVtb2ppU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBza2luQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxFbW9qaVsnc2tpbiddPigpO1xuICBAVmlld0NoaWxkKCdzY3JvbGxSZWYnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIHNjcm9sbFJlZiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoUHJldmlld0NvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIHByZXZpZXdSZWY/OiBQcmV2aWV3Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKFNlYXJjaENvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIHNlYXJjaFJlZj86IFNlYXJjaENvbXBvbmVudDtcbiAgQFZpZXdDaGlsZHJlbihDYXRlZ29yeUNvbXBvbmVudCkgY2F0ZWdvcnlSZWZzITogUXVlcnlMaXN0PENhdGVnb3J5Q29tcG9uZW50PjtcbiAgc2Nyb2xsSGVpZ2h0ID0gMDtcbiAgY2xpZW50SGVpZ2h0ID0gMDtcbiAgY2xpZW50V2lkdGggPSAwO1xuICBzZWxlY3RlZD86IHN0cmluZztcbiAgbmV4dFNjcm9sbD86IHN0cmluZztcbiAgc2Nyb2xsVG9wPzogbnVtYmVyO1xuICBmaXJzdFJlbmRlciA9IHRydWU7XG4gIHByZXZpZXdFbW9qaTogRW1vamlEYXRhIHwgbnVsbCA9IG51bGw7XG4gIGFuaW1hdGlvbkZyYW1lUmVxdWVzdElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgTkFNRVNQQUNFID0gJ2Vtb2ppLW1hcnQnO1xuICBtZWFzdXJlU2Nyb2xsYmFyID0gMDtcbiAgUkVDRU5UX0NBVEVHT1JZOiBFbW9qaUNhdGVnb3J5ID0ge1xuICAgIGlkOiAncmVjZW50JyxcbiAgICBuYW1lOiAnUmVjZW50JyxcbiAgICBlbW9qaXM6IG51bGwsXG4gIH07XG4gIFNFQVJDSF9DQVRFR09SWTogRW1vamlDYXRlZ29yeSA9IHtcbiAgICBpZDogJ3NlYXJjaCcsXG4gICAgbmFtZTogJ1NlYXJjaCcsXG4gICAgZW1vamlzOiBudWxsLFxuICAgIGFuY2hvcjogZmFsc2UsXG4gIH07XG4gIENVU1RPTV9DQVRFR09SWTogRW1vamlDYXRlZ29yeSA9IHtcbiAgICBpZDogJ2N1c3RvbScsXG4gICAgbmFtZTogJ0N1c3RvbScsXG4gICAgZW1vamlzOiBbXSxcbiAgfTtcbiAgcHJpdmF0ZSBzY3JvbGxMaXN0ZW5lciE6ICgpID0+IHZvaWQ7XG5cbiAgQElucHV0KClcbiAgYmFja2dyb3VuZEltYWdlRm46IEVtb2ppWydiYWNrZ3JvdW5kSW1hZ2VGbiddID0gKHNldDogc3RyaW5nLCBzaGVldFNpemU6IG51bWJlcikgPT5cbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vZW1vamktZGF0YXNvdXJjZS0ke3RoaXMuc2V0fUA2LjAuMS9pbWcvJHt0aGlzLnNldH0vc2hlZXRzLTI1Ni8ke3RoaXMuc2hlZXRTaXplfS5wbmdgO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIGZyZXF1ZW50bHk6IEVtb2ppRnJlcXVlbnRseVNlcnZpY2UsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBzdHJpbmcsXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBtZWFzdXJlIHNjcm9sbFxuICAgIHRoaXMubWVhc3VyZVNjcm9sbGJhciA9IG1lYXN1cmVTY3JvbGxiYXIoKTtcblxuICAgIHRoaXMuaTE4biA9IHsgLi4uSTE4TiwgLi4udGhpcy5pMThuIH07XG4gICAgdGhpcy5pMThuLmNhdGVnb3JpZXMgPSB7IC4uLkkxOE4uY2F0ZWdvcmllcywgLi4udGhpcy5pMThuLmNhdGVnb3JpZXMgfTtcbiAgICB0aGlzLnNraW4gPVxuICAgICAgSlNPTi5wYXJzZShcbiAgICAgICAgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiYgbG9jYWxTdG9yYWdlLmdldEl0ZW0oYCR7dGhpcy5OQU1FU1BBQ0V9LnNraW5gKSkgfHxcbiAgICAgICAgICAnbnVsbCcsXG4gICAgICApIHx8IHRoaXMuc2tpbjtcblxuICAgIGNvbnN0IGFsbENhdGVnb3JpZXMgPSBbLi4uY2F0ZWdvcmllc107XG5cbiAgICBpZiAodGhpcy5jdXN0b20ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5DVVNUT01fQ0FURUdPUlkuZW1vamlzID0gdGhpcy5jdXN0b20ubWFwKGVtb2ppID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5lbW9qaSxcbiAgICAgICAgICAvLyBgPENhdGVnb3J5IC8+YCBleHBlY3RzIGVtb2ppIHRvIGhhdmUgYW4gYGlkYC5cbiAgICAgICAgICBpZDogZW1vamkuc2hvcnROYW1lc1swXSxcbiAgICAgICAgICBjdXN0b206IHRydWUsXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgYWxsQ2F0ZWdvcmllcy5wdXNoKHRoaXMuQ1VTVE9NX0NBVEVHT1JZKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbmNsdWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFsbENhdGVnb3JpZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbmNsdWRlIS5pbmRleE9mKGEuaWQpID4gdGhpcy5pbmNsdWRlIS5pbmRleE9mKGIuaWQpKSB7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBhbGxDYXRlZ29yaWVzKSB7XG4gICAgICBjb25zdCBpc0luY2x1ZGVkID1cbiAgICAgICAgdGhpcy5pbmNsdWRlICYmIHRoaXMuaW5jbHVkZS5sZW5ndGggPyB0aGlzLmluY2x1ZGUuaW5kZXhPZihjYXRlZ29yeS5pZCkgPiAtMSA6IHRydWU7XG4gICAgICBjb25zdCBpc0V4Y2x1ZGVkID1cbiAgICAgICAgdGhpcy5leGNsdWRlICYmIHRoaXMuZXhjbHVkZS5sZW5ndGggPyB0aGlzLmV4Y2x1ZGUuaW5kZXhPZihjYXRlZ29yeS5pZCkgPiAtMSA6IGZhbHNlO1xuICAgICAgaWYgKCFpc0luY2x1ZGVkIHx8IGlzRXhjbHVkZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmVtb2ppc1RvU2hvd0ZpbHRlcikge1xuICAgICAgICBjb25zdCBuZXdFbW9qaXMgPSBbXTtcblxuICAgICAgICBjb25zdCB7IGVtb2ppcyB9ID0gY2F0ZWdvcnk7XG4gICAgICAgIGZvciAobGV0IGVtb2ppSW5kZXggPSAwOyBlbW9qaUluZGV4IDwgZW1vamlzIS5sZW5ndGg7IGVtb2ppSW5kZXgrKykge1xuICAgICAgICAgIGNvbnN0IGVtb2ppID0gZW1vamlzIVtlbW9qaUluZGV4XTtcbiAgICAgICAgICBpZiAodGhpcy5lbW9qaXNUb1Nob3dGaWx0ZXIoZW1vamkpKSB7XG4gICAgICAgICAgICBuZXdFbW9qaXMucHVzaChlbW9qaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5ld0Vtb2ppcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBuZXdDYXRlZ29yeSA9IHtcbiAgICAgICAgICAgIGVtb2ppczogbmV3RW1vamlzLFxuICAgICAgICAgICAgbmFtZTogY2F0ZWdvcnkubmFtZSxcbiAgICAgICAgICAgIGlkOiBjYXRlZ29yeS5pZCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzLnB1c2gobmV3Q2F0ZWdvcnkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhdGVnb3JpZXMucHVzaChjYXRlZ29yeSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2F0ZWdvcmllc0ljb25zID0geyAuLi5pY29ucy5jYXRlZ29yaWVzLCAuLi50aGlzLmNhdGVnb3JpZXNJY29ucyB9O1xuICAgICAgdGhpcy5zZWFyY2hJY29ucyA9IHsgLi4uaWNvbnMuc2VhcmNoLCAuLi50aGlzLnNlYXJjaEljb25zIH07XG4gICAgfVxuXG4gICAgY29uc3QgaW5jbHVkZVJlY2VudCA9XG4gICAgICB0aGlzLmluY2x1ZGUgJiYgdGhpcy5pbmNsdWRlLmxlbmd0aFxuICAgICAgICA/IHRoaXMuaW5jbHVkZS5pbmRleE9mKHRoaXMuUkVDRU5UX0NBVEVHT1JZLmlkKSA+IC0xXG4gICAgICAgIDogdHJ1ZTtcbiAgICBjb25zdCBleGNsdWRlUmVjZW50ID1cbiAgICAgIHRoaXMuZXhjbHVkZSAmJiB0aGlzLmV4Y2x1ZGUubGVuZ3RoXG4gICAgICAgID8gdGhpcy5leGNsdWRlLmluZGV4T2YodGhpcy5SRUNFTlRfQ0FURUdPUlkuaWQpID4gLTFcbiAgICAgICAgOiBmYWxzZTtcbiAgICBpZiAoaW5jbHVkZVJlY2VudCAmJiAhZXhjbHVkZVJlY2VudCkge1xuICAgICAgdGhpcy5oaWRlUmVjZW50ID0gZmFsc2U7XG4gICAgICB0aGlzLmNhdGVnb3JpZXMudW5zaGlmdCh0aGlzLlJFQ0VOVF9DQVRFR09SWSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2F0ZWdvcmllc1swXSkge1xuICAgICAgdGhpcy5jYXRlZ29yaWVzWzBdLmZpcnN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmNhdGVnb3JpZXMudW5zaGlmdCh0aGlzLlNFQVJDSF9DQVRFR09SWSk7XG4gICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoY2F0ZWdvcnkgPT4gY2F0ZWdvcnkuZmlyc3QpWzBdLm5hbWU7XG5cbiAgICAvLyBOZWVkIHRvIGJlIGNhcmVmdWwgaWYgc21hbGwgbnVtYmVyIG9mIGNhdGVnb3JpZXNcbiAgICBjb25zdCBjYXRlZ29yaWVzVG9Mb2FkRmlyc3QgPSBNYXRoLm1pbih0aGlzLmNhdGVnb3JpZXMubGVuZ3RoLCAzKTtcbiAgICB0aGlzLnNldEFjdGl2ZUNhdGVnb3JpZXMoXG4gICAgICAodGhpcy5hY3RpdmVDYXRlZ29yaWVzID0gdGhpcy5jYXRlZ29yaWVzLnNsaWNlKDAsIGNhdGVnb3JpZXNUb0xvYWRGaXJzdCkpLFxuICAgICk7XG5cbiAgICAvLyBUcmltIGxhc3QgYWN0aXZlIGNhdGVnb3J5XG4gICAgY29uc3QgbGFzdEFjdGl2ZUNhdGVnb3J5RW1vamlzID0gdGhpcy5jYXRlZ29yaWVzW2NhdGVnb3JpZXNUb0xvYWRGaXJzdCAtIDFdLmVtb2ppcyEuc2xpY2UoKTtcbiAgICB0aGlzLmNhdGVnb3JpZXNbY2F0ZWdvcmllc1RvTG9hZEZpcnN0IC0gMV0uZW1vamlzID0gbGFzdEFjdGl2ZUNhdGVnb3J5RW1vamlzLnNsaWNlKDAsIDYwKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gUmVzdG9yZSBsYXN0IGNhdGVnb3J5XG4gICAgICB0aGlzLmNhdGVnb3JpZXNbY2F0ZWdvcmllc1RvTG9hZEZpcnN0IC0gMV0uZW1vamlzID0gbGFzdEFjdGl2ZUNhdGVnb3J5RW1vamlzO1xuICAgICAgdGhpcy5zZXRBY3RpdmVDYXRlZ29yaWVzKHRoaXMuY2F0ZWdvcmllcyk7XG4gICAgICAvLyBUaGUgYHNldFRpbWVvdXRgIHdpbGwgdHJpZ2dlciB0aGUgY2hhbmdlIGRldGVjdGlvbiwgYnV0IHNpbmNlIHdlJ3JlIGluc2lkZVxuICAgICAgLy8gdGhlIE9uUHVzaCBjb21wb25lbnQgd2UgY2FuIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGxvY2FsbHkgc3RhcnRpbmcgZnJvbSB0aGlzXG4gICAgICAvLyBjb21wb25lbnQgYW5kIGdvaW5nIGRvd24gdG8gdGhlIGNoaWxkcmVuLlxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmXG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAvLyBUaGUgYHVwZGF0ZUNhdGVnb3JpZXNTaXplYCBkb2Vzbid0IGNoYW5nZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWRcbiAgICAgICAgICAvLyBpbiB0ZW1wbGF0ZXMsIHRodXMgdGhpcyBpcyBydW4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJvb3Qgem9uZSB0byBhdm9pZFxuICAgICAgICAgIC8vIHJ1bm5pbmcgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDYXRlZ29yaWVzU2l6ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIC8vIERPTSBldmVudHMgdGhhdCBhcmUgbGlzdGVuZWQgYnkgQW5ndWxhciBpbnNpZGUgdGhlIHRlbXBsYXRlIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgICAgLy8gYW5kIGFsc28gd3JhcHBlZCBpbnRvIGFkZGl0aW9uYWwgZnVuY3Rpb25zIHRoYXQgY2FsbCBgbWFya0ZvckNoZWNrKClgLiBXZSBsaXN0ZW4gYHNjcm9sbGBcbiAgICAgIC8vIGluIHRoZSBjb250ZXh0IG9mIHRoZSByb290IHpvbmUgc2luY2UgaXQgd2lsbCBub3QgdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIGVhY2ggdGltZVxuICAgICAgLy8gdGhlIGBzY3JvbGxgIGV2ZW50IGlzIGRpc3BhdGNoZWQuXG4gICAgICB0aGlzLnNjcm9sbExpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5zY3JvbGxSZWYubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVTY3JvbGwoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGxMaXN0ZW5lcj8uKCk7XG4gICAgLy8gVGhpcyBpcyBjYWxsZWQgaGVyZSBiZWNhdXNlIHRoZSBjb21wb25lbnQgbWlnaHQgYmUgZGVzdHJveWVkXG4gICAgLy8gYnV0IHRoZXJlIHdpbGwgc3RpbGwgYmUgYSBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCBjYWxsYmFjayBpbiB0aGUgcXVldWVcbiAgICAvLyB0aGF0IGNhbGxzIGBkZXRlY3RDaGFuZ2VzKClgIG9uIHRoZSBgVmlld1JlZmAuIFRoaXMgd2lsbCBsZWFkIHRvIGEgcnVudGltZVxuICAgIC8vIGV4Y2VwdGlvbiBpZiB0aGUgYGRldGVjdENoYW5nZXMoKWAgaXMgY2FsbGVkIGFmdGVyIHRoZSBgVmlld1JlZmAgaXMgZGVzdHJveWVkLlxuICAgIHRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUoKTtcbiAgfVxuXG4gIHNldEFjdGl2ZUNhdGVnb3JpZXMoY2F0ZWdvcmllc1RvTWFrZUFjdGl2ZTogQXJyYXk8RW1vamlDYXRlZ29yeT4pIHtcbiAgICBpZiAodGhpcy5zaG93U2luZ2xlQ2F0ZWdvcnkpIHtcbiAgICAgIHRoaXMuYWN0aXZlQ2F0ZWdvcmllcyA9IGNhdGVnb3JpZXNUb01ha2VBY3RpdmUuZmlsdGVyKFxuICAgICAgICB4ID0+IHgubmFtZSA9PT0gdGhpcy5zZWxlY3RlZCB8fCB4ID09PSB0aGlzLlNFQVJDSF9DQVRFR09SWSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWN0aXZlQ2F0ZWdvcmllcyA9IGNhdGVnb3JpZXNUb01ha2VBY3RpdmU7XG4gICAgfVxuICB9XG4gIHVwZGF0ZUNhdGVnb3JpZXNTaXplKCkge1xuICAgIHRoaXMuY2F0ZWdvcnlSZWZzLmZvckVhY2goY29tcG9uZW50ID0+IGNvbXBvbmVudC5tZW1vaXplU2l6ZSgpKTtcblxuICAgIGlmICh0aGlzLnNjcm9sbFJlZikge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5zY3JvbGxSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIHRoaXMuc2Nyb2xsSGVpZ2h0ID0gdGFyZ2V0LnNjcm9sbEhlaWdodDtcbiAgICAgIHRoaXMuY2xpZW50SGVpZ2h0ID0gdGFyZ2V0LmNsaWVudEhlaWdodDtcbiAgICAgIHRoaXMuY2xpZW50V2lkdGggPSB0YXJnZXQuY2xpZW50V2lkdGg7XG4gICAgfVxuICB9XG4gIGhhbmRsZUFuY2hvckNsaWNrKCRldmVudDogeyBjYXRlZ29yeTogRW1vamlDYXRlZ29yeTsgaW5kZXg6IG51bWJlciB9KSB7XG4gICAgdGhpcy51cGRhdGVDYXRlZ29yaWVzU2l6ZSgpO1xuICAgIHRoaXMuc2VsZWN0ZWQgPSAkZXZlbnQuY2F0ZWdvcnkubmFtZTtcbiAgICB0aGlzLnNldEFjdGl2ZUNhdGVnb3JpZXModGhpcy5jYXRlZ29yaWVzKTtcblxuICAgIGlmICh0aGlzLlNFQVJDSF9DQVRFR09SWS5lbW9qaXMpIHtcbiAgICAgIHRoaXMuaGFuZGxlU2VhcmNoKG51bGwpO1xuICAgICAgdGhpcy5zZWFyY2hSZWY/LmNsZWFyKCk7XG4gICAgICB0aGlzLmhhbmRsZUFuY2hvckNsaWNrKCRldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jYXRlZ29yeVJlZnMuZmluZChuID0+IG4uaWQgPT09ICRldmVudC5jYXRlZ29yeS5pZCk7XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgbGV0IHsgdG9wIH0gPSBjb21wb25lbnQ7XG5cbiAgICAgIGlmICgkZXZlbnQuY2F0ZWdvcnkuZmlyc3QpIHtcbiAgICAgICAgdG9wID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcCArPSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5zY3JvbGxSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0b3A7XG4gICAgfVxuICAgIHRoaXMubmV4dFNjcm9sbCA9ICRldmVudC5jYXRlZ29yeS5uYW1lO1xuXG4gICAgLy8gaGFuZGxlIGNvbXBvbmVudCBzY3JvbGxpbmcgdG8gbG9hZCBlbW9qaXNcbiAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMuY2F0ZWdvcmllcykge1xuICAgICAgY29uc3QgY29tcG9uZW50VG9TY3JvbGwgPSB0aGlzLmNhdGVnb3J5UmVmcy5maW5kKCh7IGlkIH0pID0+IGlkID09PSBjYXRlZ29yeS5pZCk7XG4gICAgICBjb21wb25lbnRUb1Njcm9sbD8uaGFuZGxlU2Nyb2xsKHRoaXMuc2Nyb2xsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wKTtcbiAgICB9XG4gIH1cbiAgY2F0ZWdvcnlUcmFjayhpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpIHtcbiAgICByZXR1cm4gaXRlbS5pZDtcbiAgfVxuICBoYW5kbGVTY3JvbGwobm9TZWxlY3Rpb25DaGFuZ2UgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLm5leHRTY3JvbGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm5leHRTY3JvbGw7XG4gICAgICB0aGlzLm5leHRTY3JvbGwgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5zY3JvbGxSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvd1NpbmdsZUNhdGVnb3J5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGFjdGl2ZUNhdGVnb3J5OiBFbW9qaUNhdGVnb3J5IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLlNFQVJDSF9DQVRFR09SWS5lbW9qaXMpIHtcbiAgICAgIGFjdGl2ZUNhdGVnb3J5ID0gdGhpcy5TRUFSQ0hfQ0FURUdPUlk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuc2Nyb2xsUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAvLyBjaGVjayBzY3JvbGwgaXMgbm90IGF0IGJvdHRvbVxuICAgICAgaWYgKHRhcmdldC5zY3JvbGxUb3AgPT09IDApIHtcbiAgICAgICAgLy8gaGl0IHRoZSBUT1BcbiAgICAgICAgYWN0aXZlQ2F0ZWdvcnkgPSB0aGlzLmNhdGVnb3JpZXMuZmluZChuID0+IG4uZmlyc3QgPT09IHRydWUpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQuc2Nyb2xsSGVpZ2h0IC0gdGFyZ2V0LnNjcm9sbFRvcCA9PT0gdGhpcy5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgLy8gc2Nyb2xsZWQgdG8gYm90dG9tIGFjdGl2YXRlIGxhc3QgY2F0ZWdvcnlcbiAgICAgICAgYWN0aXZlQ2F0ZWdvcnkgPSB0aGlzLmNhdGVnb3JpZXNbdGhpcy5jYXRlZ29yaWVzLmxlbmd0aCAtIDFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc2Nyb2xsaW5nXG4gICAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgdGhpcy5jYXRlZ29yaWVzKSB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jYXRlZ29yeVJlZnMuZmluZCgoeyBpZCB9KSA9PiBpZCA9PT0gY2F0ZWdvcnkuaWQpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IGNvbXBvbmVudD8uaGFuZGxlU2Nyb2xsKHRhcmdldC5zY3JvbGxUb3ApO1xuICAgICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIGFjdGl2ZUNhdGVnb3J5ID0gY2F0ZWdvcnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbFRvcDtcbiAgICB9XG4gICAgLy8gVGhpcyB3aWxsIGFsbG93IHVzIHRvIHJ1biB0aGUgY2hhbmdlIGRldGVjdGlvbiBvbmx5IHdoZW4gdGhlIGNhdGVnb3J5IGNoYW5nZXMuXG4gICAgaWYgKCFub1NlbGVjdGlvbkNoYW5nZSAmJiBhY3RpdmVDYXRlZ29yeSAmJiBhY3RpdmVDYXRlZ29yeS5uYW1lICE9PSB0aGlzLnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gYWN0aXZlQ2F0ZWdvcnkubmFtZTtcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9IGVsc2UgaWYgKG5vU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG4gIGhhbmRsZVNlYXJjaCgkZW1vamlzOiBhbnlbXSB8IG51bGwpIHtcbiAgICB0aGlzLlNFQVJDSF9DQVRFR09SWS5lbW9qaXMgPSAkZW1vamlzO1xuICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHRoaXMuY2F0ZWdvcnlSZWZzLnRvQXJyYXkoKSkge1xuICAgICAgaWYgKGNvbXBvbmVudC5uYW1lID09PSAnU2VhcmNoJykge1xuICAgICAgICBjb21wb25lbnQuZW1vamlzID0gJGVtb2ppcztcbiAgICAgICAgY29tcG9uZW50LnVwZGF0ZURpc3BsYXkoJGVtb2ppcyA/ICdibG9jaycgOiAnbm9uZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LnVwZGF0ZURpc3BsYXkoJGVtb2ppcyA/ICdub25lJyA6ICdibG9jaycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2Nyb2xsUmVmLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcbiAgICB0aGlzLmhhbmRsZVNjcm9sbCgpO1xuICB9XG5cbiAgaGFuZGxlRW50ZXJLZXkoJGV2ZW50OiBFdmVudCwgZW1vamk/OiBFbW9qaURhdGEpIHtcbiAgICBpZiAoIWVtb2ppKSB7XG4gICAgICBpZiAodGhpcy5TRUFSQ0hfQ0FURUdPUlkuZW1vamlzICE9PSBudWxsICYmIHRoaXMuU0VBUkNIX0NBVEVHT1JZLmVtb2ppcy5sZW5ndGgpIHtcbiAgICAgICAgZW1vamkgPSB0aGlzLlNFQVJDSF9DQVRFR09SWS5lbW9qaXNbMF07XG4gICAgICAgIGlmIChlbW9qaSkge1xuICAgICAgICAgIHRoaXMuZW1vamlTZWxlY3QuZW1pdCh7ICRldmVudCwgZW1vamkgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhpZGVSZWNlbnQgJiYgIXRoaXMucmVjZW50ICYmIGVtb2ppKSB7XG4gICAgICB0aGlzLmZyZXF1ZW50bHkuYWRkKGVtb2ppKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNhdGVnb3J5UmVmcy50b0FycmF5KClbMV07XG4gICAgaWYgKGNvbXBvbmVudCAmJiB0aGlzLmVuYWJsZUZyZXF1ZW50RW1vamlTb3J0KSB7XG4gICAgICBjb21wb25lbnQudXBkYXRlUmVjZW50RW1vamlzKCk7XG4gICAgICBjb21wb25lbnQucmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuICBoYW5kbGVFbW9qaU92ZXIoJGV2ZW50OiBFbW9qaUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnNob3dQcmV2aWV3IHx8ICF0aGlzLnByZXZpZXdSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlbW9qaURhdGEgPSB0aGlzLkNVU1RPTV9DQVRFR09SWS5lbW9qaXMhLmZpbmQoXG4gICAgICAoY3VzdG9tRW1vamk6IGFueSkgPT4gY3VzdG9tRW1vamkuaWQgPT09ICRldmVudC5lbW9qaS5pZCxcbiAgICApO1xuICAgIGlmIChlbW9qaURhdGEpIHtcbiAgICAgICRldmVudC5lbW9qaSA9IHsgLi4uZW1vamlEYXRhIH07XG4gICAgfVxuXG4gICAgdGhpcy5wcmV2aWV3RW1vamkgPSAkZXZlbnQuZW1vamk7XG4gICAgdGhpcy5jYW5jZWxBbmltYXRpb25GcmFtZSgpO1xuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuICBoYW5kbGVFbW9qaUxlYXZlKCkge1xuICAgIGlmICghdGhpcy5zaG93UHJldmlldyB8fCAhdGhpcy5wcmV2aWV3UmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIE5vdGU6IGBoYW5kbGVFbW9qaUxlYXZlYCB3aWxsIGJlIGludm9rZWQgb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lIGJlY2F1c2Ugb2YgdGhlIGBtb3VzZWxlYXZlYFxuICAgIC8vICAgICAgIGV2ZW50IHNldCB1cCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUgaW4gYG5neC1lbW9qaWAuIFNlZSBgc2V0dXBNb3VzZUxlYXZlTGlzdGVuZXJgLlxuICAgIC8vICAgICAgIFRoaXMgaXMgZG9uZSBleHBsaWNpdGx5IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0byBydW4gcmVkdW5kYW50IGNoYW5nZSBkZXRlY3Rpb24gc2luY2Ugd2VcbiAgICAvLyAgICAgICB3b3VsZCBzdGlsbCB3YW50IHRvIGxlYXZlIHRoZSBBbmd1bGFyIHpvbmUgaGVyZSB3aGVuIHNjaGVkdWxpbmcgYW5pbWF0aW9uIGZyYW1lLlxuICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVSZXF1ZXN0SWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGhpcy5wcmV2aWV3RW1vamkgPSBudWxsO1xuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG4gIGhhbmRsZUVtb2ppQ2xpY2soJGV2ZW50OiBFbW9qaUV2ZW50KSB7XG4gICAgdGhpcy5lbW9qaUNsaWNrLmVtaXQoJGV2ZW50KTtcbiAgICB0aGlzLmVtb2ppU2VsZWN0LmVtaXQoJGV2ZW50KTtcbiAgICB0aGlzLmhhbmRsZUVudGVyS2V5KCRldmVudC4kZXZlbnQsICRldmVudC5lbW9qaSk7XG4gIH1cbiAgaGFuZGxlU2tpbkNoYW5nZShza2luOiBFbW9qaVsnc2tpbiddKSB7XG4gICAgdGhpcy5za2luID0gc2tpbjtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgJHt0aGlzLk5BTUVTUEFDRX0uc2tpbmAsIFN0cmluZyhza2luKSk7XG4gICAgdGhpcy5za2luQ2hhbmdlLmVtaXQoc2tpbik7XG4gIH1cbiAgZ2V0V2lkdGgoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zdHlsZSAmJiB0aGlzLnN0eWxlLndpZHRoKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHlsZS53aWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGVyTGluZSAqICh0aGlzLmVtb2ppU2l6ZSArIDEyKSArIDEyICsgMiArIHRoaXMubWVhc3VyZVNjcm9sbGJhciArICdweCc7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuaW1hdGlvbkZyYW1lUmVxdWVzdElkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lUmVxdWVzdElkKTtcbiAgICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVSZXF1ZXN0SWQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwiPHNlY3Rpb25cbiAgY2xhc3M9XCJlbW9qaS1tYXJ0IHt7IGRhcmtNb2RlID8gJ2Vtb2ppLW1hcnQtZGFyaycgOiAnJyB9fVwiXG4gIFtzdHlsZS53aWR0aF09XCJnZXRXaWR0aCgpXCJcbiAgW25nU3R5bGVdPVwic3R5bGVcIlxuPlxuICA8ZGl2IGNsYXNzPVwiZW1vamktbWFydC1iYXJcIj5cbiAgICA8ZW1vamktbWFydC1hbmNob3JzXG4gICAgICBbY2F0ZWdvcmllc109XCJjYXRlZ29yaWVzXCJcbiAgICAgIChhbmNob3JDbGljayk9XCJoYW5kbGVBbmNob3JDbGljaygkZXZlbnQpXCJcbiAgICAgIFtjb2xvcl09XCJjb2xvclwiXG4gICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRcIlxuICAgICAgW2kxOG5dPVwiaTE4blwiXG4gICAgICBbaWNvbnNdPVwiY2F0ZWdvcmllc0ljb25zXCJcbiAgICA+PC9lbW9qaS1tYXJ0LWFuY2hvcnM+XG4gIDwvZGl2PlxuICA8ZW1vamktc2VhcmNoXG4gICAgKm5nSWY9XCJlbmFibGVTZWFyY2hcIlxuICAgIFtpMThuXT1cImkxOG5cIlxuICAgIChzZWFyY2hSZXN1bHRzKT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCJcbiAgICAoZW50ZXJLZXkpPVwiaGFuZGxlRW50ZXJLZXkoJGV2ZW50KVwiXG4gICAgW2luY2x1ZGVdPVwiaW5jbHVkZVwiXG4gICAgW2V4Y2x1ZGVdPVwiZXhjbHVkZVwiXG4gICAgW2N1c3RvbV09XCJjdXN0b21cIlxuICAgIFthdXRvRm9jdXNdPVwiYXV0b0ZvY3VzXCJcbiAgICBbaWNvbnNdPVwic2VhcmNoSWNvbnNcIlxuICAgIFtlbW9qaXNUb1Nob3dGaWx0ZXJdPVwiZW1vamlzVG9TaG93RmlsdGVyXCJcbiAgPjwvZW1vamktc2VhcmNoPlxuICA8c2VjdGlvbiAjc2Nyb2xsUmVmIGNsYXNzPVwiZW1vamktbWFydC1zY3JvbGxcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImkxOG4uZW1vamlsaXN0XCI+XG4gICAgPGVtb2ppLWNhdGVnb3J5XG4gICAgICAqbmdGb3I9XCJsZXQgY2F0ZWdvcnkgb2YgYWN0aXZlQ2F0ZWdvcmllczsgbGV0IGlkeCA9IGluZGV4OyB0cmFja0J5OiBjYXRlZ29yeVRyYWNrXCJcbiAgICAgIFtpZF09XCJjYXRlZ29yeS5pZFwiXG4gICAgICBbbmFtZV09XCJjYXRlZ29yeS5uYW1lXCJcbiAgICAgIFtlbW9qaXNdPVwiY2F0ZWdvcnkuZW1vamlzXCJcbiAgICAgIFtwZXJMaW5lXT1cInBlckxpbmVcIlxuICAgICAgW3RvdGFsRnJlcXVlbnRMaW5lc109XCJ0b3RhbEZyZXF1ZW50TGluZXNcIlxuICAgICAgW2hhc1N0aWNreVBvc2l0aW9uXT1cImlzTmF0aXZlXCJcbiAgICAgIFtpMThuXT1cImkxOG5cIlxuICAgICAgW2hpZGVPYnNvbGV0ZV09XCJoaWRlT2Jzb2xldGVcIlxuICAgICAgW25vdEZvdW5kRW1vamldPVwibm90Rm91bmRFbW9qaVwiXG4gICAgICBbY3VzdG9tXT1cImNhdGVnb3J5LmlkID09PSBSRUNFTlRfQ0FURUdPUlkuaWQgPyBDVVNUT01fQ0FURUdPUlkuZW1vamlzIDogdW5kZWZpbmVkXCJcbiAgICAgIFtyZWNlbnRdPVwiY2F0ZWdvcnkuaWQgPT09IFJFQ0VOVF9DQVRFR09SWS5pZCA/IHJlY2VudCA6IHVuZGVmaW5lZFwiXG4gICAgICBbdmlydHVhbGl6ZV09XCJ2aXJ0dWFsaXplXCJcbiAgICAgIFt2aXJ0dWFsaXplT2Zmc2V0XT1cInZpcnR1YWxpemVPZmZzZXRcIlxuICAgICAgW2Vtb2ppSXNOYXRpdmVdPVwiaXNOYXRpdmVcIlxuICAgICAgW2Vtb2ppU2tpbl09XCJza2luXCJcbiAgICAgIFtlbW9qaVNpemVdPVwiZW1vamlTaXplXCJcbiAgICAgIFtlbW9qaVNldF09XCJzZXRcIlxuICAgICAgW2Vtb2ppU2hlZXRTaXplXT1cInNoZWV0U2l6ZVwiXG4gICAgICBbZW1vamlGb3JjZVNpemVdPVwiaXNOYXRpdmVcIlxuICAgICAgW2Vtb2ppVG9vbHRpcF09XCJlbW9qaVRvb2x0aXBcIlxuICAgICAgW2Vtb2ppQmFja2dyb3VuZEltYWdlRm5dPVwiYmFja2dyb3VuZEltYWdlRm5cIlxuICAgICAgW2Vtb2ppSW1hZ2VVcmxGbl09XCJpbWFnZVVybEZuXCJcbiAgICAgIFtlbW9qaVVzZUJ1dHRvbl09XCJ1c2VCdXR0b25cIlxuICAgICAgKGVtb2ppT3Zlck91dHNpZGVBbmd1bGFyKT1cImhhbmRsZUVtb2ppT3ZlcigkZXZlbnQpXCJcbiAgICAgIChlbW9qaUxlYXZlT3V0c2lkZUFuZ3VsYXIpPVwiaGFuZGxlRW1vamlMZWF2ZSgpXCJcbiAgICAgIChlbW9qaUNsaWNrKT1cImhhbmRsZUVtb2ppQ2xpY2soJGV2ZW50KVwiXG4gICAgPjwvZW1vamktY2F0ZWdvcnk+XG4gIDwvc2VjdGlvbj5cbiAgPGRpdiBjbGFzcz1cImVtb2ppLW1hcnQtYmFyXCIgKm5nSWY9XCJzaG93UHJldmlld1wiPlxuICAgIDxlbW9qaS1wcmV2aWV3XG4gICAgICBbYXR0ci50aXRsZV09XCJ0aXRsZVwiXG4gICAgICBbZW1vamldPVwicHJldmlld0Vtb2ppXCJcbiAgICAgIFtpZGxlRW1vamldPVwiZW1vamlcIlxuICAgICAgW2Vtb2ppSXNOYXRpdmVdPVwiaXNOYXRpdmVcIlxuICAgICAgW2Vtb2ppU2l6ZV09XCIzOFwiXG4gICAgICBbZW1vamlTa2luXT1cInNraW5cIlxuICAgICAgW2Vtb2ppU2V0XT1cInNldFwiXG4gICAgICBbaTE4bl09XCJpMThuXCJcbiAgICAgIFtlbW9qaVNoZWV0U2l6ZV09XCJzaGVldFNpemVcIlxuICAgICAgW2Vtb2ppQmFja2dyb3VuZEltYWdlRm5dPVwiYmFja2dyb3VuZEltYWdlRm5cIlxuICAgICAgW2Vtb2ppSW1hZ2VVcmxGbl09XCJpbWFnZVVybEZuXCJcbiAgICAgIChza2luQ2hhbmdlKT1cImhhbmRsZVNraW5DaGFuZ2UoJGV2ZW50KVwiXG4gICAgPjwvZW1vamktcHJldmlldz5cbiAgPC9kaXY+XG48L3NlY3Rpb24+XG4iXX0=
|