@ethlete/query 5.21.1 → 5.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/fesm2022/ethlete-query.mjs +21 -37
  3. package/fesm2022/ethlete-query.mjs.map +1 -1
  4. package/package.json +5 -7
  5. package/esm2022/ethlete-query.mjs +0 -5
  6. package/esm2022/index.mjs +0 -21
  7. package/esm2022/lib/auth/auth-provider.types.mjs +0 -2
  8. package/esm2022/lib/auth/auth-provider.utils.mjs +0 -25
  9. package/esm2022/lib/auth/basic-auth-provider.mjs +0 -15
  10. package/esm2022/lib/auth/bearer-auth-provider.mjs +0 -168
  11. package/esm2022/lib/auth/custom-header-auth-provider.mjs +0 -12
  12. package/esm2022/lib/auth/index.mjs +0 -6
  13. package/esm2022/lib/class-validator/class-validator.types.mjs +0 -2
  14. package/esm2022/lib/class-validator/class-validator.utils.mjs +0 -4
  15. package/esm2022/lib/class-validator/index.mjs +0 -3
  16. package/esm2022/lib/devtools/components/query-devtools/index.mjs +0 -2
  17. package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +0 -297
  18. package/esm2022/lib/devtools/pipes/index.mjs +0 -2
  19. package/esm2022/lib/devtools/pipes/query-short-name.pipe.mjs +0 -24
  20. package/esm2022/lib/devtools/utils/index.mjs +0 -2
  21. package/esm2022/lib/devtools/utils/query-client.utils.mjs +0 -13
  22. package/esm2022/lib/directives/index.mjs +0 -4
  23. package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +0 -56
  24. package/esm2022/lib/directives/infinity-query.directive.mjs +0 -147
  25. package/esm2022/lib/directives/query.directive.mjs +0 -123
  26. package/esm2022/lib/entity/entity-store.mjs +0 -127
  27. package/esm2022/lib/entity/entity.types.mjs +0 -2
  28. package/esm2022/lib/entity/entity.utils.mjs +0 -29
  29. package/esm2022/lib/entity/index.mjs +0 -4
  30. package/esm2022/lib/experimental/bearer-auth-provider-config.mjs +0 -19
  31. package/esm2022/lib/experimental/bearer-auth-provider.mjs +0 -245
  32. package/esm2022/lib/experimental/http-request.mjs +0 -154
  33. package/esm2022/lib/experimental/index.mjs +0 -23
  34. package/esm2022/lib/experimental/paged-query.mjs +0 -194
  35. package/esm2022/lib/experimental/query-client-config.mjs +0 -13
  36. package/esm2022/lib/experimental/query-client.mjs +0 -16
  37. package/esm2022/lib/experimental/query-creator-templates.mjs +0 -33
  38. package/esm2022/lib/experimental/query-creator.mjs +0 -28
  39. package/esm2022/lib/experimental/query-dependencies.mjs +0 -14
  40. package/esm2022/lib/experimental/query-errors.mjs +0 -70
  41. package/esm2022/lib/experimental/query-execute-utils.mjs +0 -54
  42. package/esm2022/lib/experimental/query-execute.mjs +0 -14
  43. package/esm2022/lib/experimental/query-features.mjs +0 -126
  44. package/esm2022/lib/experimental/query-repository.mjs +0 -97
  45. package/esm2022/lib/experimental/query-snapshot.mjs +0 -45
  46. package/esm2022/lib/experimental/query-stack.mjs +0 -65
  47. package/esm2022/lib/experimental/query-state.mjs +0 -20
  48. package/esm2022/lib/experimental/query-utils.mjs +0 -176
  49. package/esm2022/lib/experimental/query.mjs +0 -29
  50. package/esm2022/lib/experimental/secure-query-creator.mjs +0 -15
  51. package/esm2022/lib/experimental/secure-query-execute.mjs +0 -80
  52. package/esm2022/lib/experimental/secure-query.mjs +0 -33
  53. package/esm2022/lib/gql/gql.mjs +0 -23
  54. package/esm2022/lib/gql/index.mjs +0 -2
  55. package/esm2022/lib/infinite-query/index.mjs +0 -4
  56. package/esm2022/lib/infinite-query/infinity-query.mjs +0 -171
  57. package/esm2022/lib/infinite-query/infinity-query.types.mjs +0 -2
  58. package/esm2022/lib/infinite-query/infinity-query.utils.mjs +0 -3
  59. package/esm2022/lib/logger/index.mjs +0 -2
  60. package/esm2022/lib/logger/logger.mjs +0 -16
  61. package/esm2022/lib/query/index.mjs +0 -4
  62. package/esm2022/lib/query/query.mjs +0 -431
  63. package/esm2022/lib/query/query.types.mjs +0 -2
  64. package/esm2022/lib/query/query.utils.mjs +0 -253
  65. package/esm2022/lib/query-client/index.mjs +0 -4
  66. package/esm2022/lib/query-client/query-client.mjs +0 -80
  67. package/esm2022/lib/query-client/query-client.types.mjs +0 -2
  68. package/esm2022/lib/query-client/query-client.utils.mjs +0 -20
  69. package/esm2022/lib/query-creator/index.mjs +0 -3
  70. package/esm2022/lib/query-creator/query-creator.mjs +0 -55
  71. package/esm2022/lib/query-creator/query-creator.types.mjs +0 -2
  72. package/esm2022/lib/query-form/index.mjs +0 -4
  73. package/esm2022/lib/query-form/query-form.mjs +0 -412
  74. package/esm2022/lib/query-form/query-form.types.mjs +0 -2
  75. package/esm2022/lib/query-form/query-form.utils.mjs +0 -97
  76. package/esm2022/lib/query-store/index.mjs +0 -2
  77. package/esm2022/lib/query-store/query-store.mjs +0 -144
  78. package/esm2022/lib/request/index.mjs +0 -4
  79. package/esm2022/lib/request/request.mjs +0 -196
  80. package/esm2022/lib/request/request.types.mjs +0 -2
  81. package/esm2022/lib/request/request.util.mjs +0 -252
  82. package/esm2022/lib/symfony/index.mjs +0 -3
  83. package/esm2022/lib/symfony/symfony.types.mjs +0 -2
  84. package/esm2022/lib/symfony/symfony.utils.mjs +0 -31
  85. package/esm2022/lib/utils/data.utils.mjs +0 -138
  86. package/esm2022/lib/utils/deep-freeze.util.mjs +0 -17
  87. package/esm2022/lib/utils/def.util.mjs +0 -8
  88. package/esm2022/lib/utils/index.mjs +0 -4
@@ -1,412 +0,0 @@
1
- import { DestroyRef, NgZone, assertInInjectionContext, inject, isDevMode } from '@angular/core';
2
- import { toObservable, toSignal } from '@angular/core/rxjs-interop';
3
- import { FormGroup } from '@angular/forms';
4
- import { ActivatedRoute, Router } from '@angular/router';
5
- import { ET_PROPERTY_REMOVED, clone, createDestroy, equal, injectQueryParamChanges, injectQueryParams, } from '@ethlete/core';
6
- import { BehaviorSubject, Subject, debounceTime, map, merge, of, switchMap, takeUntil, tap, timer } from 'rxjs';
7
- import { transformToBoolean, transformToNumber } from './query-form.utils';
8
- const ET_ARR_PREFIX = 'ET_ARR__';
9
- export class QueryField {
10
- get control() {
11
- return this.data.control;
12
- }
13
- constructor(data) {
14
- this.data = data;
15
- }
16
- }
17
- const IGNORED_FILTER_COUNT_FIELDS = ['page', 'skip', 'take', 'limit', 'sort', 'sortBy', 'sortOrder', 'query', 'search'];
18
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
- export class QueryForm {
20
- get _formValue() {
21
- return this.form.getRawValue();
22
- }
23
- get _form() {
24
- return this.form;
25
- }
26
- get controls() {
27
- return this.form.controls;
28
- }
29
- get value() {
30
- return this._changes$.value.currentValue;
31
- }
32
- get defaultFormValue() {
33
- return Object.entries(this._defaultValues).reduce((acc, [key]) => {
34
- acc[key] = this._getDefaultValue(key);
35
- return acc;
36
- }, {});
37
- }
38
- // with prefix eg. page should become ${prefix}-page
39
- constructor(_fields, _options) {
40
- this._fields = _fields;
41
- this._options = _options;
42
- this._destroy$ = createDestroy();
43
- this._unobserveTrigger$ = new Subject();
44
- this._router = inject(Router);
45
- this._activatedRoute = inject(ActivatedRoute);
46
- this._defaultValues = this._extractDefaultValues();
47
- this._zone = inject(NgZone);
48
- this._didValueChanges$ = new Subject();
49
- this._isObserving = false;
50
- this._skipNextResets = false;
51
- this._queryParamChanges$ = toObservable(injectQueryParamChanges());
52
- this._queryParams = injectQueryParams();
53
- /**
54
- * The angular form group that contains all the fields.
55
- *
56
- * **Do not** use any of the following methods on this form group:
57
- * - `setValue`: Use `QueryForm.setValue` instead.
58
- * - `patchValue`: Use `QueryForm.patchValue` instead.
59
- * - `valueChanges`: Use `QueryForm.changes$` instead.
60
- * - `value`: Use `QueryForm.value` instead.
61
- * - `controls`: Use `QueryForm.controls` instead.
62
- */
63
- this.form = this._setupFormGroup();
64
- this._lastFormValue$ = new BehaviorSubject(null);
65
- this._currentFormValue$ = new BehaviorSubject(this._formValue);
66
- this._changes$ = new BehaviorSubject({
67
- previousValue: null,
68
- currentValue: this.form.getRawValue(),
69
- });
70
- this.changes$ = this._changes$.asObservable();
71
- this.currentValue$ = this._changes$.pipe(map(({ currentValue }) => currentValue));
72
- this.previousValue$ = this._changes$.pipe(map(({ previousValue }) => previousValue));
73
- this.changes = toSignal(this.changes$);
74
- this.currentValue = toSignal(this.currentValue$);
75
- this.previousValue = toSignal(this.previousValue$);
76
- /**
77
- * The number of active filters.
78
- *
79
- * Excludes the following fields by default:
80
- * - `page`
81
- * - `skip`
82
- * - `take`
83
- * - `limit`
84
- * - `sort`
85
- * - `sortBy`
86
- * - `sortOrder`
87
- * - `query`
88
- * - `search`
89
- */
90
- this.activeFilterCount$ = this.changes$.pipe(map(({ currentValue }) => Object.entries(currentValue)
91
- .map(([key, value]) => {
92
- if (IGNORED_FILTER_COUNT_FIELDS.includes(key) || this._fields[key]?.data.skipInFilterCount) {
93
- return true;
94
- }
95
- return this._isDefaultValue(key, value);
96
- })
97
- .filter((v) => v === false).length));
98
- assertInInjectionContext(QueryForm);
99
- inject(DestroyRef).onDestroy(() => this._cleanup());
100
- }
101
- observe(options) {
102
- if (this._isObserving) {
103
- if (isDevMode()) {
104
- console.warn('QueryForm.observe() was called multiple times. This is not supported.');
105
- }
106
- return this;
107
- }
108
- this._isObserving = true;
109
- if (options?.syncOnNavigation !== false) {
110
- const didChanges = this.setFormValueFromUrlQueryParams({
111
- queryParams: this._queryParams(),
112
- });
113
- if (didChanges) {
114
- this._handleFormChange(true);
115
- }
116
- }
117
- merge(...Object.values(this._fields).map((field) => field.control.valueChanges), this._didValueChanges$)
118
- .pipe(debounceTime(0), tap(() => {
119
- this._handleFormChange();
120
- }), takeUntil(this._destroy$), takeUntil(this._unobserveTrigger$))
121
- .subscribe();
122
- let changedFieldsInLastResetLoop = [];
123
- let currentUniqueChangedFields = [];
124
- this._currentFormValue$
125
- .pipe(map((currentValue) => {
126
- return {
127
- previousValue: clone(this._lastFormValue$.value),
128
- currentValue: clone(currentValue),
129
- };
130
- }), tap(({ currentValue, previousValue }) => {
131
- if (options?.writeToQueryParams !== false) {
132
- this._syncViaUrlQueryParams(currentValue, options?.replaceUrl);
133
- }
134
- const didResetValues = this._skipNextResets
135
- ? false
136
- : this._handleQueryFormResets(previousValue ?? null, currentValue);
137
- this._skipNextResets = false;
138
- const changedFields = Object.keys(currentValue).filter((key) => !equal(previousValue?.[key], currentValue[key]));
139
- if (changedFieldsInLastResetLoop.length) {
140
- changedFields.push(...changedFieldsInLastResetLoop);
141
- changedFieldsInLastResetLoop = [];
142
- }
143
- if (didResetValues) {
144
- this._didValueChanges$.next(true);
145
- changedFieldsInLastResetLoop = changedFields;
146
- }
147
- currentUniqueChangedFields = [...new Set(changedFields)];
148
- }), switchMap(({ currentValue, previousValue }) => {
149
- if (changedFieldsInLastResetLoop.length)
150
- return of(null).pipe(map(() => ({ currentValue, previousValue })));
151
- const debounceValues = currentUniqueChangedFields.map((key) => {
152
- const field = this._fields[key];
153
- if (!field)
154
- return null;
155
- if (field.data.disableDebounceIfFalsy === true && !currentValue[key]) {
156
- return null;
157
- }
158
- return field.data.debounce ?? null;
159
- });
160
- currentUniqueChangedFields = [];
161
- if (debounceValues.some((v) => v === null) || !debounceValues.length) {
162
- return of(null).pipe(map(() => ({ currentValue, previousValue })));
163
- }
164
- const shortestDebounceTime = Math.min(...debounceValues.filter((v) => v !== null));
165
- return timer(shortestDebounceTime).pipe(map(() => ({ currentValue, previousValue })));
166
- }), tap(({ currentValue, previousValue }) => {
167
- if (changedFieldsInLastResetLoop.length)
168
- return;
169
- this._changes$.next({
170
- previousValue: previousValue ?? null,
171
- currentValue: currentValue,
172
- });
173
- }), takeUntil(this._destroy$), takeUntil(this._unobserveTrigger$))
174
- .subscribe();
175
- if (options?.syncOnNavigation !== false) {
176
- this._queryParamChanges$
177
- .pipe(takeUntil(this._destroy$), takeUntil(this._unobserveTrigger$), tap((changes) => {
178
- const didValueChanges = this.setFormValueFromUrlQueryParams({ queryParams: changes });
179
- if (didValueChanges) {
180
- this._didValueChanges$.next(true);
181
- }
182
- }))
183
- .subscribe();
184
- }
185
- return this;
186
- }
187
- _handleQueryFormResets(previousValue, currentValue) {
188
- let didResetValues = false;
189
- for (const formFieldKey in this._fields) {
190
- const field = this._fields[formFieldKey];
191
- if (!field)
192
- continue;
193
- const resets = field.data.isResetBy;
194
- if (!resets)
195
- continue;
196
- const resetConditionKeys = Array.isArray(resets) ? resets : [resets];
197
- for (const resetConditionKey of resetConditionKeys) {
198
- if (!(resetConditionKey in this._fields)) {
199
- if (isDevMode()) {
200
- console.warn(`The field "${resetConditionKey}" is not defined in the QueryForm. Is it a typo?`, this);
201
- }
202
- continue;
203
- }
204
- if (previousValue &&
205
- currentValue &&
206
- !equal(previousValue[resetConditionKey], currentValue[resetConditionKey])) {
207
- const defaultValueForKeyToReset = this._getDefaultValue(formFieldKey);
208
- const currentValueForKeyToReset = currentValue[formFieldKey];
209
- if (equal(defaultValueForKeyToReset, currentValueForKeyToReset)) {
210
- continue;
211
- }
212
- this.form.controls[formFieldKey].setValue(defaultValueForKeyToReset);
213
- didResetValues = true;
214
- break;
215
- }
216
- }
217
- }
218
- return didResetValues;
219
- }
220
- unobserve() {
221
- this._unobserveTrigger$.next(true);
222
- this._cleanup();
223
- }
224
- setFormValueFromUrlQueryParams(options) {
225
- let didValueChanges = false;
226
- for (const [key, field] of Object.entries(this._fields)) {
227
- const value = options.queryParams[this._transformKeyToQueryParam(key)];
228
- const valueDoesNotExist = value === undefined;
229
- if (valueDoesNotExist)
230
- continue;
231
- const valueGotRemoved = value === ET_PROPERTY_REMOVED;
232
- if (valueGotRemoved) {
233
- field.control.setValue(this._getDefaultValue(key), { emitEvent: false });
234
- didValueChanges = true;
235
- continue;
236
- }
237
- let deserializedValue = value;
238
- if (field.data.queryParamToValueTransformFn) {
239
- deserializedValue = field.data.queryParamToValueTransformFn(value);
240
- }
241
- else if (!field.data.skipAutoTransform) {
242
- const defaultIsNum = this._getDefaultValue(key) === 'number';
243
- const valueIsNum = !isNaN(Number(value));
244
- const valueContainsWhitespace = typeof value === 'string' && value.trim() !== value;
245
- const valueHasLeadingZero = typeof value === 'string' && value.startsWith('0');
246
- const valueEndsWithDot = typeof value === 'string' && value.endsWith('.');
247
- const defaultIsBool = this._getDefaultValue(key) === 'boolean';
248
- const valueIsBool = value === 'true' || value === 'false';
249
- if (defaultIsNum || (valueIsNum && !valueContainsWhitespace && !valueHasLeadingZero && !valueEndsWithDot)) {
250
- deserializedValue = transformToNumber(value);
251
- }
252
- else if (defaultIsBool || valueIsBool) {
253
- deserializedValue = transformToBoolean(value);
254
- }
255
- }
256
- const valueIsEqualToCurrent = equal(deserializedValue, field.control.value);
257
- if (valueIsEqualToCurrent)
258
- continue;
259
- field.control.setValue(deserializedValue, { emitEvent: false });
260
- didValueChanges = true;
261
- }
262
- return didValueChanges;
263
- }
264
- setValue(value, options) {
265
- this._form._setValue(value, options);
266
- if (options?.skipResets) {
267
- this._skipNextResets = true;
268
- }
269
- }
270
- patchValue(value, options) {
271
- this._form._patchValue(value, options);
272
- if (options?.skipResets) {
273
- this._skipNextResets = true;
274
- }
275
- }
276
- resetFieldToDefault(key, options) {
277
- const defaultValue = this._getDefaultValue(key);
278
- this.form.controls[key].setValue(defaultValue);
279
- if (options?.skipResets) {
280
- this._skipNextResets = true;
281
- }
282
- }
283
- resetFieldsToDefault(keys, options) {
284
- const defaults = keys.reduce((acc, key) => {
285
- acc[key] = this._getDefaultValue(key);
286
- return acc;
287
- }, {});
288
- this.patchValue(defaults);
289
- if (options?.skipResets) {
290
- this._skipNextResets = true;
291
- }
292
- }
293
- resetAllFieldsToDefault(options) {
294
- const keys = Object.keys(this._fields);
295
- if (options?.skipFields) {
296
- for (const key of options.skipFields) {
297
- const index = keys.indexOf(key);
298
- if (index !== -1) {
299
- keys.splice(index, 1);
300
- }
301
- }
302
- }
303
- this.resetFieldsToDefault(keys, options);
304
- }
305
- _getDefaultValue(key) {
306
- const val = this._defaultValues[key];
307
- if (typeof val === 'string' && val.startsWith(ET_ARR_PREFIX)) {
308
- return JSON.parse(val.slice(ET_ARR_PREFIX.length));
309
- }
310
- else if (typeof val === 'function') {
311
- return val();
312
- }
313
- return val ?? null;
314
- }
315
- _transformKeyToQueryParam(key) {
316
- if (!this._options?.queryParamPrefix)
317
- return key;
318
- const prefix = typeof this._options?.queryParamPrefix === 'string'
319
- ? this._options.queryParamPrefix
320
- : this._options.queryParamPrefix();
321
- return `${prefix}-${key}`;
322
- }
323
- _isDefaultValue(key, value) {
324
- const normalizedValue = Array.isArray(value) ? `${ET_ARR_PREFIX}${JSON.stringify(value)}` : value;
325
- return this._getDefaultValue(key) === normalizedValue;
326
- }
327
- _setupFormGroup() {
328
- const group = new FormGroup({});
329
- for (const [key, field] of Object.entries(this._fields)) {
330
- group.addControl(key, field.control);
331
- }
332
- group._patchValue = group.patchValue;
333
- group._setValue = group.setValue;
334
- group.patchValue = this.patchValue.bind(this);
335
- group.setValue = this.setValue.bind(this);
336
- return group;
337
- }
338
- _extractDefaultValues() {
339
- const defaultValues = {};
340
- for (const [key, field] of Object.entries(this._fields)) {
341
- const value = field.data.defaultValue !== undefined ? field.data.defaultValue : field.control.value;
342
- if (Array.isArray(value)) {
343
- defaultValues[key] = `${ET_ARR_PREFIX}${JSON.stringify(value)}`;
344
- }
345
- else {
346
- defaultValues[key] = value;
347
- }
348
- }
349
- return defaultValues;
350
- }
351
- _syncViaUrlQueryParams(values, replaceUrl) {
352
- const queryParams = { ...clone(this._activatedRoute.snapshot.queryParams) };
353
- for (const [key, value] of Object.entries(values)) {
354
- const queryParamKey = this._transformKeyToQueryParam(key);
355
- const field = this._fields[key];
356
- if (!field) {
357
- continue;
358
- }
359
- const isDefault = this._isDefaultValue(key, value);
360
- const writeDefaultToUrl = field.data.appendDefaultValueToUrl === true;
361
- const writeToUrl = field.data.appendToUrl !== false;
362
- if (!writeToUrl || (isDefault && !writeDefaultToUrl)) {
363
- queryParams[queryParamKey] = undefined;
364
- }
365
- else {
366
- queryParams[queryParamKey] = field.data.valueToQueryParamTransformFn
367
- ? field.data.valueToQueryParamTransformFn?.(value)
368
- : value;
369
- }
370
- }
371
- this._zone.run(() => {
372
- queueMicrotask(() => {
373
- this._router.navigate([], {
374
- queryParams,
375
- replaceUrl,
376
- queryParamsHandling: 'merge',
377
- });
378
- });
379
- });
380
- }
381
- _handleFormChange(forceOverwrite = false) {
382
- const currentVal = clone(this._currentFormValue$.value);
383
- const newVal = clone(this._formValue);
384
- if (equal(currentVal, newVal)) {
385
- return;
386
- }
387
- if (forceOverwrite) {
388
- this._lastFormValue$.next(newVal);
389
- }
390
- else {
391
- this._lastFormValue$.next(currentVal);
392
- }
393
- this._currentFormValue$.next(newVal);
394
- }
395
- _cleanup() {
396
- const queryParamKeys = Object.keys(this._fields);
397
- const queryParams = queryParamKeys.reduce((acc, key) => {
398
- acc[this._transformKeyToQueryParam(key)] = undefined;
399
- return acc;
400
- }, {});
401
- this._zone.run(() => {
402
- queueMicrotask(() => {
403
- this._router.navigate([], {
404
- queryParams,
405
- replaceUrl: true,
406
- queryParamsHandling: 'merge',
407
- });
408
- });
409
- });
410
- }
411
- }
412
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9xdWVyeS1mb3JtL3F1ZXJ5LWZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRyxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsS0FBSyxFQUNMLGFBQWEsRUFDYixLQUFLLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBVWhILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNFLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQztBQUVqQyxNQUFNLE9BQU8sVUFBVTtJQUNyQixJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQzNCLENBQUM7SUFFRCxZQUFtQixJQUEwQjtRQUExQixTQUFJLEdBQUosSUFBSSxDQUFzQjtJQUFHLENBQUM7Q0FDbEQ7QUFFRCxNQUFNLDJCQUEyQixHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFN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Q0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNsQixjQUFjLENBQUMsR0FBRyxFQUFFO2dCQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7b0JBQ3hCLFdBQVc7b0JBQ1gsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLG1CQUFtQixFQUFFLE9BQU87aUJBQzdCLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXN0cm95UmVmLCBOZ1pvbmUsIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCwgaW5qZWN0LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEVUX1BST1BFUlRZX1JFTU9WRUQsXG4gIGNsb25lLFxuICBjcmVhdGVEZXN0cm95LFxuICBlcXVhbCxcbiAgaW5qZWN0UXVlcnlQYXJhbUNoYW5nZXMsXG4gIGluamVjdFF1ZXJ5UGFyYW1zLFxufSBmcm9tICdAZXRobGV0ZS9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgZGVib3VuY2VUaW1lLCBtYXAsIG1lcmdlLCBvZiwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFF1ZXJ5RmllbGRPcHRpb25zLFxuICBRdWVyeUZvcm1Hcm91cCxcbiAgUXVlcnlGb3JtR3JvdXBDb250cm9scyxcbiAgUXVlcnlGb3JtT2JzZXJ2ZU9wdGlvbnMsXG4gIFF1ZXJ5Rm9ybVZhbHVlLFxuICBRdWVyeUZvcm1WYWx1ZUV2ZW50LFxuICBRdWVyeUZvcm1Xcml0ZU9wdGlvbnMsXG59IGZyb20gJy4vcXVlcnktZm9ybS50eXBlcyc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1Ub0Jvb2xlYW4sIHRyYW5zZm9ybVRvTnVtYmVyIH0gZnJvbSAnLi9xdWVyeS1mb3JtLnV0aWxzJztcblxuY29uc3QgRVRfQVJSX1BSRUZJWCA9ICdFVF9BUlJfXyc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUZpZWxkPFQ+IHtcbiAgZ2V0IGNvbnRyb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5jb250cm9sO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHVibGljIGRhdGE6IFF1ZXJ5RmllbGRPcHRpb25zPFQ+KSB7fVxufVxuXG5jb25zdCBJR05PUkVEX0ZJTFRFUl9DT1VOVF9GSUVMRFMgPSBbJ3BhZ2UnLCAnc2tpcCcsICd0YWtlJywgJ2xpbWl0JywgJ3NvcnQnLCAnc29ydEJ5JywgJ3NvcnRPcmRlcicsICdxdWVyeScsICdzZWFyY2gnXTtcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUZvcm1PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgcHJlZml4IHRvIHVzZSBmb3IgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IGhhdmUgbXVsdGlwbGUgcXVlcnkgZm9ybXMgb24gdGhlIHNhbWUgcGFnZS5cbiAgICovXG4gIHF1ZXJ5UGFyYW1QcmVmaXg/OiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIEFueVF1ZXJ5Rm9ybSA9IFF1ZXJ5Rm9ybTxhbnk+O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIFF1ZXJ5Rm9ybTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgUXVlcnlGaWVsZDxhbnk+Pj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IGNyZWF0ZURlc3Ryb3koKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdW5vYnNlcnZlVHJpZ2dlciQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZhdGVkUm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0VmFsdWVzID0gdGhpcy5fZXh0cmFjdERlZmF1bHRWYWx1ZXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kaWRWYWx1ZUNoYW5nZXMkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBwcml2YXRlIF9pc09ic2VydmluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9za2lwTmV4dFJlc2V0cyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3F1ZXJ5UGFyYW1DaGFuZ2VzJCA9IHRvT2JzZXJ2YWJsZShpbmplY3RRdWVyeVBhcmFtQ2hhbmdlcygpKTtcbiAgcHJpdmF0ZSBfcXVlcnlQYXJhbXMgPSBpbmplY3RRdWVyeVBhcmFtcygpO1xuXG4gIC8qKlxuICAgKiBUaGUgYW5ndWxhciBmb3JtIGdyb3VwIHRoYXQgY29udGFpbnMgYWxsIHRoZSBmaWVsZHMuXG4gICAqXG4gICAqICoqRG8gbm90KiogdXNlIGFueSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb24gdGhpcyBmb3JtIGdyb3VwOlxuICAgKiAtIGBzZXRWYWx1ZWA6IFVzZSBgUXVlcnlGb3JtLnNldFZhbHVlYCBpbnN0ZWFkLlxuICAgKiAtIGBwYXRjaFZhbHVlYDogVXNlIGBRdWVyeUZvcm0ucGF0Y2hWYWx1ZWAgaW5zdGVhZC5cbiAgICogLSBgdmFsdWVDaGFuZ2VzYDogVXNlIGBRdWVyeUZvcm0uY2hhbmdlcyRgIGluc3RlYWQuXG4gICAqIC0gYHZhbHVlYDogVXNlIGBRdWVyeUZvcm0udmFsdWVgIGluc3RlYWQuXG4gICAqIC0gYGNvbnRyb2xzYDogVXNlIGBRdWVyeUZvcm0uY29udHJvbHNgIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBmb3JtID0gdGhpcy5fc2V0dXBGb3JtR3JvdXAoKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9sYXN0Rm9ybVZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UXVlcnlGb3JtVmFsdWU8VD4gfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY3VycmVudEZvcm1WYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5Rm9ybVZhbHVlPFQ+Pih0aGlzLl9mb3JtVmFsdWUpO1xuXG4gIHByaXZhdGUgZ2V0IF9mb3JtVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFF1ZXJ5Rm9ybVZhbHVlPFQ+O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2Zvcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybSBhcyB1bmtub3duIGFzIFF1ZXJ5Rm9ybUdyb3VwO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5Rm9ybVZhbHVlRXZlbnQ8VD4+KHtcbiAgICBwcmV2aW91c1ZhbHVlOiBudWxsLFxuICAgIGN1cnJlbnRWYWx1ZTogdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkgYXMgUXVlcnlGb3JtVmFsdWU8VD4sXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGNoYW5nZXMkID0gdGhpcy5fY2hhbmdlcyQuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IGN1cnJlbnRWYWx1ZSQgPSB0aGlzLl9jaGFuZ2VzJC5waXBlKG1hcCgoeyBjdXJyZW50VmFsdWUgfSkgPT4gY3VycmVudFZhbHVlKSk7XG4gIHJlYWRvbmx5IHByZXZpb3VzVmFsdWUkID0gdGhpcy5fY2hhbmdlcyQucGlwZShtYXAoKHsgcHJldmlvdXNWYWx1ZSB9KSA9PiBwcmV2aW91c1ZhbHVlKSk7XG5cbiAgcmVhZG9ubHkgY2hhbmdlcyA9IHRvU2lnbmFsKHRoaXMuY2hhbmdlcyQpO1xuICByZWFkb25seSBjdXJyZW50VmFsdWUgPSB0b1NpZ25hbCh0aGlzLmN1cnJlbnRWYWx1ZSQpO1xuICByZWFkb25seSBwcmV2aW91c1ZhbHVlID0gdG9TaWduYWwodGhpcy5wcmV2aW91c1ZhbHVlJCk7XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgYWN0aXZlIGZpbHRlcnMuXG4gICAqXG4gICAqIEV4Y2x1ZGVzIHRoZSBmb2xsb3dpbmcgZmllbGRzIGJ5IGRlZmF1bHQ6XG4gICAqIC0gYHBhZ2VgXG4gICAqIC0gYHNraXBgXG4gICAqIC0gYHRha2VgXG4gICAqIC0gYGxpbWl0YFxuICAgKiAtIGBzb3J0YFxuICAgKiAtIGBzb3J0QnlgXG4gICAqIC0gYHNvcnRPcmRlcmBcbiAgICogLSBgcXVlcnlgXG4gICAqIC0gYHNlYXJjaGBcbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZUZpbHRlckNvdW50JCA9IHRoaXMuY2hhbmdlcyQucGlwZShcbiAgICBtYXAoXG4gICAgICAoeyBjdXJyZW50VmFsdWUgfSkgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY3VycmVudFZhbHVlKVxuICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgaWYgKElHTk9SRURfRklMVEVSX0NPVU5UX0ZJRUxEUy5pbmNsdWRlcyhrZXkpIHx8IHRoaXMuX2ZpZWxkc1trZXldPy5kYXRhLnNraXBJbkZpbHRlckNvdW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNEZWZhdWx0VmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKCh2KSA9PiB2ID09PSBmYWxzZSkubGVuZ3RoLFxuICAgICksXG4gICk7XG5cbiAgZ2V0IGNvbnRyb2xzKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0uY29udHJvbHM7XG4gIH1cblxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZXMkLnZhbHVlLmN1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIGdldCBkZWZhdWx0Rm9ybVZhbHVlKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLl9kZWZhdWx0VmFsdWVzKS5yZWR1Y2UoKGFjYywgW2tleV0pID0+IHtcbiAgICAgIGFjY1trZXkgYXMga2V5b2YgUXVlcnlGb3JtVmFsdWU8VD5dID0gdGhpcy5fZ2V0RGVmYXVsdFZhbHVlKGtleSk7XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgUXVlcnlGb3JtVmFsdWU8VD4pO1xuICB9XG5cbiAgLy8gd2l0aCBwcmVmaXggZWcuIHBhZ2Ugc2hvdWxkIGJlY29tZSAke3ByZWZpeH0tcGFnZVxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZHM6IFQsXG4gICAgcHJpdmF0ZSBfb3B0aW9ucz86IFF1ZXJ5Rm9ybU9wdGlvbnMsXG4gICkge1xuICAgIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dChRdWVyeUZvcm0pO1xuXG4gICAgaW5qZWN0KERlc3Ryb3lSZWYpLm9uRGVzdHJveSgoKSA9PiB0aGlzLl9jbGVhbnVwKCkpO1xuICB9XG5cbiAgb2JzZXJ2ZShvcHRpb25zPzogUXVlcnlGb3JtT2JzZXJ2ZU9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5faXNPYnNlcnZpbmcpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1F1ZXJ5Rm9ybS5vYnNlcnZlKCkgd2FzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5faXNPYnNlcnZpbmcgPSB0cnVlO1xuXG4gICAgaWYgKG9wdGlvbnM/LnN5bmNPbk5hdmlnYXRpb24gIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBkaWRDaGFuZ2VzID0gdGhpcy5zZXRGb3JtVmFsdWVGcm9tVXJsUXVlcnlQYXJhbXMoe1xuICAgICAgICBxdWVyeVBhcmFtczogdGhpcy5fcXVlcnlQYXJhbXMoKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlkQ2hhbmdlcykge1xuICAgICAgICB0aGlzLl9oYW5kbGVGb3JtQ2hhbmdlKHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lcmdlKC4uLk9iamVjdC52YWx1ZXModGhpcy5fZmllbGRzKS5tYXAoKGZpZWxkKSA9PiBmaWVsZC5jb250cm9sLnZhbHVlQ2hhbmdlcyksIHRoaXMuX2RpZFZhbHVlQ2hhbmdlcyQpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUZvcm1DaGFuZ2UoKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl91bm9ic2VydmVUcmlnZ2VyJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBsZXQgY2hhbmdlZEZpZWxkc0luTGFzdFJlc2V0TG9vcDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgY3VycmVudFVuaXF1ZUNoYW5nZWRGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0aGlzLl9jdXJyZW50Rm9ybVZhbHVlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmFsdWU6IGNsb25lKHRoaXMuX2xhc3RGb3JtVmFsdWUkLnZhbHVlKSxcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogY2xvbmUoY3VycmVudFZhbHVlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKCh7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LndyaXRlVG9RdWVyeVBhcmFtcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N5bmNWaWFVcmxRdWVyeVBhcmFtcyhjdXJyZW50VmFsdWUsIG9wdGlvbnM/LnJlcGxhY2VVcmwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRpZFJlc2V0VmFsdWVzID0gdGhpcy5fc2tpcE5leHRSZXNldHNcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogdGhpcy5faGFuZGxlUXVlcnlGb3JtUmVzZXRzKHByZXZpb3VzVmFsdWUgPz8gbnVsbCwgY3VycmVudFZhbHVlKTtcblxuICAgICAgICAgIHRoaXMuX3NraXBOZXh0UmVzZXRzID0gZmFsc2U7XG5cbiAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzID0gT2JqZWN0LmtleXMoY3VycmVudFZhbHVlKS5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5KSA9PiAhZXF1YWwocHJldmlvdXNWYWx1ZT8uW2tleV0sIGN1cnJlbnRWYWx1ZVtrZXldKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGNoYW5nZWRGaWVsZHNJbkxhc3RSZXNldExvb3AubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFuZ2VkRmllbGRzLnB1c2goLi4uY2hhbmdlZEZpZWxkc0luTGFzdFJlc2V0TG9vcCk7XG4gICAgICAgICAgICBjaGFuZ2VkRmllbGRzSW5MYXN0UmVzZXRMb29wID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRpZFJlc2V0VmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWRWYWx1ZUNoYW5nZXMkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBjaGFuZ2VkRmllbGRzSW5MYXN0UmVzZXRMb29wID0gY2hhbmdlZEZpZWxkcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjdXJyZW50VW5pcXVlQ2hhbmdlZEZpZWxkcyA9IFsuLi5uZXcgU2V0KGNoYW5nZWRGaWVsZHMpXTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoeyBjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUgfSkgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2VkRmllbGRzSW5MYXN0UmVzZXRMb29wLmxlbmd0aCkgcmV0dXJuIG9mKG51bGwpLnBpcGUobWFwKCgpID0+ICh7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSB9KSkpO1xuXG4gICAgICAgICAgY29uc3QgZGVib3VuY2VWYWx1ZXMgPSBjdXJyZW50VW5pcXVlQ2hhbmdlZEZpZWxkcy5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9maWVsZHNba2V5XTtcblxuICAgICAgICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC5kYXRhLmRpc2FibGVEZWJvdW5jZUlmRmFsc3kgPT09IHRydWUgJiYgIWN1cnJlbnRWYWx1ZVtrZXldKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmllbGQuZGF0YS5kZWJvdW5jZSA/PyBudWxsO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY3VycmVudFVuaXF1ZUNoYW5nZWRGaWVsZHMgPSBbXTtcblxuICAgICAgICAgIGlmIChkZWJvdW5jZVZhbHVlcy5zb21lKCh2KSA9PiB2ID09PSBudWxsKSB8fCAhZGVib3VuY2VWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCkucGlwZShtYXAoKCkgPT4gKHsgY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlIH0pKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2hvcnRlc3REZWJvdW5jZVRpbWUgPSBNYXRoLm1pbiguLi5kZWJvdW5jZVZhbHVlcy5maWx0ZXIoKHYpOiB2IGlzIG51bWJlciA9PiB2ICE9PSBudWxsKSk7XG5cbiAgICAgICAgICByZXR1cm4gdGltZXIoc2hvcnRlc3REZWJvdW5jZVRpbWUpLnBpcGUobWFwKCgpID0+ICh7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSB9KSkpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKCh7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGNoYW5nZWRGaWVsZHNJbkxhc3RSZXNldExvb3AubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICB0aGlzLl9jaGFuZ2VzJC5uZXh0KHtcbiAgICAgICAgICAgIHByZXZpb3VzVmFsdWU6IHByZXZpb3VzVmFsdWUgPz8gbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogY3VycmVudFZhbHVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX3Vub2JzZXJ2ZVRyaWdnZXIkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGlmIChvcHRpb25zPy5zeW5jT25OYXZpZ2F0aW9uICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcXVlcnlQYXJhbUNoYW5nZXMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX3Vub2JzZXJ2ZVRyaWdnZXIkKSxcbiAgICAgICAgICB0YXAoKGNoYW5nZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRpZFZhbHVlQ2hhbmdlcyA9IHRoaXMuc2V0Rm9ybVZhbHVlRnJvbVVybFF1ZXJ5UGFyYW1zKHsgcXVlcnlQYXJhbXM6IGNoYW5nZXMgfSk7XG5cbiAgICAgICAgICAgIGlmIChkaWRWYWx1ZUNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5fZGlkVmFsdWVDaGFuZ2VzJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZVF1ZXJ5Rm9ybVJlc2V0cyhwcmV2aW91c1ZhbHVlOiBRdWVyeUZvcm1WYWx1ZTxUPiB8IG51bGwsIGN1cnJlbnRWYWx1ZTogUXVlcnlGb3JtVmFsdWU8VD4pIHtcbiAgICBsZXQgZGlkUmVzZXRWYWx1ZXMgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgZm9ybUZpZWxkS2V5IGluIHRoaXMuX2ZpZWxkcykge1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9maWVsZHNbZm9ybUZpZWxkS2V5XTtcblxuICAgICAgaWYgKCFmaWVsZCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHJlc2V0cyA9IGZpZWxkLmRhdGEuaXNSZXNldEJ5O1xuXG4gICAgICBpZiAoIXJlc2V0cykgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHJlc2V0Q29uZGl0aW9uS2V5cyA9IEFycmF5LmlzQXJyYXkocmVzZXRzKSA/IHJlc2V0cyA6IFtyZXNldHNdO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlc2V0Q29uZGl0aW9uS2V5IG9mIHJlc2V0Q29uZGl0aW9uS2V5cykge1xuICAgICAgICBpZiAoIShyZXNldENvbmRpdGlvbktleSBpbiB0aGlzLl9maWVsZHMpKSB7XG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFRoZSBmaWVsZCBcIiR7cmVzZXRDb25kaXRpb25LZXl9XCIgaXMgbm90IGRlZmluZWQgaW4gdGhlIFF1ZXJ5Rm9ybS4gSXMgaXQgYSB0eXBvP2AsIHRoaXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXZpb3VzVmFsdWUgJiZcbiAgICAgICAgICBjdXJyZW50VmFsdWUgJiZcbiAgICAgICAgICAhZXF1YWwocHJldmlvdXNWYWx1ZVtyZXNldENvbmRpdGlvbktleV0sIGN1cnJlbnRWYWx1ZVtyZXNldENvbmRpdGlvbktleV0pXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZUZvcktleVRvUmVzZXQgPSB0aGlzLl9nZXREZWZhdWx0VmFsdWUoZm9ybUZpZWxkS2V5KTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVGb3JLZXlUb1Jlc2V0ID0gY3VycmVudFZhbHVlW2Zvcm1GaWVsZEtleV07XG5cbiAgICAgICAgICBpZiAoZXF1YWwoZGVmYXVsdFZhbHVlRm9yS2V5VG9SZXNldCwgY3VycmVudFZhbHVlRm9yS2V5VG9SZXNldCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1tmb3JtRmllbGRLZXldLnNldFZhbHVlKGRlZmF1bHRWYWx1ZUZvcktleVRvUmVzZXQpO1xuXG4gICAgICAgICAgZGlkUmVzZXRWYWx1ZXMgPSB0cnVlO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGlkUmVzZXRWYWx1ZXM7XG4gIH1cblxuICB1bm9ic2VydmUoKSB7XG4gICAgdGhpcy5fdW5vYnNlcnZlVHJpZ2dlciQubmV4dCh0cnVlKTtcbiAgICB0aGlzLl9jbGVhbnVwKCk7XG4gIH1cblxuICBzZXRGb3JtVmFsdWVGcm9tVXJsUXVlcnlQYXJhbXMob3B0aW9uczogeyBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkge1xuICAgIGxldCBkaWRWYWx1ZUNoYW5nZXMgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2ZpZWxkcykpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy5xdWVyeVBhcmFtc1t0aGlzLl90cmFuc2Zvcm1LZXlUb1F1ZXJ5UGFyYW0oa2V5KV07XG5cbiAgICAgIGNvbnN0IHZhbHVlRG9lc05vdEV4aXN0ID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHZhbHVlRG9lc05vdEV4aXN0KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgdmFsdWVHb3RSZW1vdmVkID0gdmFsdWUgPT09IEVUX1BST1BFUlRZX1JFTU9WRUQ7XG5cbiAgICAgIGlmICh2YWx1ZUdvdFJlbW92ZWQpIHtcbiAgICAgICAgZmllbGQuY29udHJvbC5zZXRWYWx1ZSh0aGlzLl9nZXREZWZhdWx0VmFsdWUoa2V5KSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICBkaWRWYWx1ZUNoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGRlc2VyaWFsaXplZFZhbHVlID0gdmFsdWU7XG5cbiAgICAgIGlmIChmaWVsZC5kYXRhLnF1ZXJ5UGFyYW1Ub1ZhbHVlVHJhbnNmb3JtRm4pIHtcbiAgICAgICAgZGVzZXJpYWxpemVkVmFsdWUgPSBmaWVsZC5kYXRhLnF1ZXJ5UGFyYW1Ub1ZhbHVlVHJhbnNmb3JtRm4odmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICghZmllbGQuZGF0YS5za2lwQXV0b1RyYW5zZm9ybSkge1xuICAgICAgICBjb25zdCBkZWZhdWx0SXNOdW0gPSB0aGlzLl9nZXREZWZhdWx0VmFsdWUoa2V5KSA9PT0gJ251bWJlcic7XG4gICAgICAgIGNvbnN0IHZhbHVlSXNOdW0gPSAhaXNOYU4oTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIGNvbnN0IHZhbHVlQ29udGFpbnNXaGl0ZXNwYWNlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgIT09IHZhbHVlO1xuICAgICAgICBjb25zdCB2YWx1ZUhhc0xlYWRpbmdaZXJvID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCcwJyk7XG4gICAgICAgIGNvbnN0IHZhbHVlRW5kc1dpdGhEb3QgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCcuJyk7XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdElzQm9vbCA9IHRoaXMuX2dldERlZmF1bHRWYWx1ZShrZXkpID09PSAnYm9vbGVhbic7XG4gICAgICAgIGNvbnN0IHZhbHVlSXNCb29sID0gdmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gJ2ZhbHNlJztcblxuICAgICAgICBpZiAoZGVmYXVsdElzTnVtIHx8ICh2YWx1ZUlzTnVtICYmICF2YWx1ZUNvbnRhaW5zV2hpdGVzcGFjZSAmJiAhdmFsdWVIYXNMZWFkaW5nWmVybyAmJiAhdmFsdWVFbmRzV2l0aERvdCkpIHtcbiAgICAgICAgICBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHRyYW5zZm9ybVRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0SXNCb29sIHx8IHZhbHVlSXNCb29sKSB7XG4gICAgICAgICAgZGVzZXJpYWxpemVkVmFsdWUgPSB0cmFuc2Zvcm1Ub0Jvb2xlYW4odmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlSXNFcXVhbFRvQ3VycmVudCA9IGVxdWFsKGRlc2VyaWFsaXplZFZhbHVlLCBmaWVsZC5jb250cm9sLnZhbHVlKTtcblxuICAgICAgaWYgKHZhbHVlSXNFcXVhbFRvQ3VycmVudCkgY29udGludWU7XG5cbiAgICAgIGZpZWxkLmNvbnRyb2wuc2V0VmFsdWUoZGVzZXJpYWxpemVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGRpZFZhbHVlQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpZFZhbHVlQ2hhbmdlcztcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBRdWVyeUZvcm1WYWx1ZTxUPiwgb3B0aW9ucz86IFF1ZXJ5Rm9ybVdyaXRlT3B0aW9ucykge1xuICAgIHRoaXMuX2Zvcm0uX3NldFZhbHVlKHZhbHVlLCBvcHRpb25zKTtcblxuICAgIGlmIChvcHRpb25zPy5za2lwUmVzZXRzKSB7XG4gICAgICB0aGlzLl9za2lwTmV4dFJlc2V0cyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcGF0Y2hWYWx1ZSh2YWx1ZTogUGFydGlhbDxRdWVyeUZvcm1WYWx1ZTxUPj4sIG9wdGlvbnM/OiBRdWVyeUZvcm1Xcml0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLl9mb3JtLl9wYXRjaFZhbHVlKHZhbHVlLCBvcHRpb25zKTtcblxuICAgIGlmIChvcHRpb25zPy5za2lwUmVzZXRzKSB7XG4gICAgICB0aGlzLl9za2lwTmV4dFJlc2V0cyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRGaWVsZFRvRGVmYXVsdChrZXk6IGtleW9mIFF1ZXJ5Rm9ybVZhbHVlPFQ+LCBvcHRpb25zPzogUXVlcnlGb3JtV3JpdGVPcHRpb25zKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy5fZ2V0RGVmYXVsdFZhbHVlKGtleSBhcyBzdHJpbmcpO1xuXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzW2tleV0uc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTtcblxuICAgIGlmIChvcHRpb25zPy5za2lwUmVzZXRzKSB7XG4gICAgICB0aGlzLl9za2lwTmV4dFJlc2V0cyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRGaWVsZHNUb0RlZmF1bHQoa2V5czogKGtleW9mIFF1ZXJ5Rm9ybVZhbHVlPFQ+KVtdLCBvcHRpb25zPzogUXVlcnlGb3JtV3JpdGVPcHRpb25zKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBrZXlzLnJlZHVjZShcbiAgICAgIChhY2MsIGtleSkgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IHRoaXMuX2dldERlZmF1bHRWYWx1ZShrZXkgYXMgc3RyaW5nKTtcblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFBhcnRpYWw8UXVlcnlGb3JtVmFsdWU8VD4+LFxuICAgICk7XG5cbiAgICB0aGlzLnBhdGNoVmFsdWUoZGVmYXVsdHMpO1xuXG4gICAgaWYgKG9wdGlvbnM/LnNraXBSZXNldHMpIHtcbiAgICAgIHRoaXMuX3NraXBOZXh0UmVzZXRzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXNldEFsbEZpZWxkc1RvRGVmYXVsdChvcHRpb25zPzogUXVlcnlGb3JtV3JpdGVPcHRpb25zICYgeyBza2lwRmllbGRzPzogKGtleW9mIFF1ZXJ5Rm9ybVZhbHVlPFQ+KVtdIH0pIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5fZmllbGRzKSBhcyAoa2V5b2YgUXVlcnlGb3JtVmFsdWU8VD4pW107XG5cbiAgICBpZiAob3B0aW9ucz8uc2tpcEZpZWxkcykge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3B0aW9ucy5za2lwRmllbGRzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0ga2V5cy5pbmRleE9mKGtleSk7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGtleXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucmVzZXRGaWVsZHNUb0RlZmF1bHQoa2V5cywgb3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIF9nZXREZWZhdWx0VmFsdWUoa2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCB2YWwgPSB0aGlzLl9kZWZhdWx0VmFsdWVzW2tleV07XG5cbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnN0YXJ0c1dpdGgoRVRfQVJSX1BSRUZJWCkpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbC5zbGljZShFVF9BUlJfUFJFRklYLmxlbmd0aCkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHZhbCgpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWwgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX3RyYW5zZm9ybUtleVRvUXVlcnlQYXJhbShrZXk6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5fb3B0aW9ucz8ucXVlcnlQYXJhbVByZWZpeCkgcmV0dXJuIGtleTtcblxuICAgIGNvbnN0IHByZWZpeCA9XG4gICAgICB0eXBlb2YgdGhpcy5fb3B0aW9ucz8ucXVlcnlQYXJhbVByZWZpeCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyB0aGlzLl9vcHRpb25zLnF1ZXJ5UGFyYW1QcmVmaXhcbiAgICAgICAgOiB0aGlzLl9vcHRpb25zLnF1ZXJ5UGFyYW1QcmVmaXgoKTtcblxuICAgIHJldHVybiBgJHtwcmVmaXh9LSR7a2V5fWA7XG4gIH1cblxuICBwcml2YXRlIF9pc0RlZmF1bHRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IGAke0VUX0FSUl9QUkVGSVh9JHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCA6IHZhbHVlO1xuXG4gICAgcmV0dXJuIHRoaXMuX2dldERlZmF1bHRWYWx1ZShrZXkpID09PSBub3JtYWxpemVkVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cEZvcm1Hcm91cCgpIHtcbiAgICBjb25zdCBncm91cCA9IG5ldyBGb3JtR3JvdXAoe30gYXMgUXVlcnlGb3JtR3JvdXBDb250cm9sczxUPikgYXMgdW5rbm93biBhcyBRdWVyeUZvcm1Hcm91cDtcblxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2ZpZWxkcykpIHtcbiAgICAgIGdyb3VwLmFkZENvbnRyb2woa2V5LCBmaWVsZC5jb250cm9sKTtcbiAgICB9XG5cbiAgICBncm91cC5fcGF0Y2hWYWx1ZSA9IGdyb3VwLnBhdGNoVmFsdWU7XG4gICAgZ3JvdXAuX3NldFZhbHVlID0gZ3JvdXAuc2V0VmFsdWU7XG5cbiAgICBncm91cC5wYXRjaFZhbHVlID0gdGhpcy5wYXRjaFZhbHVlLmJpbmQodGhpcyk7XG4gICAgZ3JvdXAuc2V0VmFsdWUgPSB0aGlzLnNldFZhbHVlLmJpbmQodGhpcyk7XG5cbiAgICByZXR1cm4gZ3JvdXAgYXMgdW5rbm93biBhcyBGb3JtR3JvdXA8UXVlcnlGb3JtR3JvdXBDb250cm9sczxUPj47XG4gIH1cblxuICBwcml2YXRlIF9leHRyYWN0RGVmYXVsdFZhbHVlcygpIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fZmllbGRzKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5kYXRhLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gZmllbGQuZGF0YS5kZWZhdWx0VmFsdWUgOiBmaWVsZC5jb250cm9sLnZhbHVlO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlc1trZXldID0gYCR7RVRfQVJSX1BSRUZJWH0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jVmlhVXJsUXVlcnlQYXJhbXModmFsdWVzOiBRdWVyeUZvcm1WYWx1ZTxUPiwgcmVwbGFjZVVybD86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHsgLi4uY2xvbmUodGhpcy5fYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMpIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZXMpKSB7XG4gICAgICBjb25zdCBxdWVyeVBhcmFtS2V5ID0gdGhpcy5fdHJhbnNmb3JtS2V5VG9RdWVyeVBhcmFtKGtleSk7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2ZpZWxkc1trZXldO1xuXG4gICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0RlZmF1bHQgPSB0aGlzLl9pc0RlZmF1bHRWYWx1ZShrZXksIHZhbHVlKTtcbiAgICAgIGNvbnN0IHdyaXRlRGVmYXVsdFRvVXJsID0gZmllbGQuZGF0YS5hcHBlbmREZWZhdWx0VmFsdWVUb1VybCA9PT0gdHJ1ZTtcbiAgICAgIGNvbnN0IHdyaXRlVG9VcmwgPSBmaWVsZC5kYXRhLmFwcGVuZFRvVXJsICE9PSBmYWxzZTtcblxuICAgICAgaWYgKCF3cml0ZVRvVXJsIHx8IChpc0RlZmF1bHQgJiYgIXdyaXRlRGVmYXVsdFRvVXJsKSkge1xuICAgICAgICBxdWVyeVBhcmFtc1txdWVyeVBhcmFtS2V5XSA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zW3F1ZXJ5UGFyYW1LZXldID0gZmllbGQuZGF0YS52YWx1ZVRvUXVlcnlQYXJhbVRyYW5zZm9ybUZuXG4gICAgICAgICAgPyBmaWVsZC5kYXRhLnZhbHVlVG9RdWVyeVBhcmFtVHJhbnNmb3JtRm4/Lih2YWx1ZSlcbiAgICAgICAgICA6IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgICAgcXVlcnlQYXJhbXMsXG4gICAgICAgICAgcmVwbGFjZVVybCxcbiAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlRm9ybUNoYW5nZShmb3JjZU92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgY3VycmVudFZhbCA9IGNsb25lKHRoaXMuX2N1cnJlbnRGb3JtVmFsdWUkLnZhbHVlKTtcbiAgICBjb25zdCBuZXdWYWwgPSBjbG9uZSh0aGlzLl9mb3JtVmFsdWUpO1xuXG4gICAgaWYgKGVxdWFsKGN1cnJlbnRWYWwsIG5ld1ZhbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZm9yY2VPdmVyd3JpdGUpIHtcbiAgICAgIHRoaXMuX2xhc3RGb3JtVmFsdWUkLm5leHQobmV3VmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbGFzdEZvcm1WYWx1ZSQubmV4dChjdXJyZW50VmFsKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50Rm9ybVZhbHVlJC5uZXh0KG5ld1ZhbCk7XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbnVwKCkge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1LZXlzID0gT2JqZWN0LmtleXModGhpcy5fZmllbGRzKTtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHF1ZXJ5UGFyYW1LZXlzLnJlZHVjZShcbiAgICAgIChhY2MsIGtleSkgPT4ge1xuICAgICAgICBhY2NbdGhpcy5fdHJhbnNmb3JtS2V5VG9RdWVyeVBhcmFtKGtleSldID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICk7XG4gICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgICAgICBxdWVyeVBhcmFtcyxcbiAgICAgICAgICByZXBsYWNlVXJsOiB0cnVlLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9xdWVyeS1mb3JtL3F1ZXJ5LWZvcm0udHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBRdWVyeUZpZWxkIH0gZnJvbSAnLi9xdWVyeS1mb3JtJztcblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUZpZWxkT3B0aW9uczxUID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgKiBXaWxsIGJlIHNldCB0byB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgZm9ybSBjb250cm9sIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAqIElmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgY2FsbGVkIHRvIGdldCB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZT86IFQgfCAoKCkgPT4gVCkgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBEZWJvdW5jZSB0aW1lIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIGRlYm91bmNlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiAgV2hldGhlciB0aGUgZGVib3VuY2Ugc2hvdWxkIG5vdCBiZSBhcHBsaWVkIGlmIHRoZSB2YWx1ZSBpcyBmYWxzeS5cbiAgICogIFRoaXMgaXMgdXNlZnVsIGZvciBmaWVsZHMgdGhhdCBjYW4gYmUgY2xlYXJlZCBsaWtlIGEgc2VhcmNoIGZpZWxkLlxuICAgKlxuICAgKiAgQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRpc2FibGVEZWJvdW5jZUlmRmFsc3k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBjb250cm9sIGZvciB0aGUgZmllbGQuXG4gICAqL1xuICBjb250cm9sOiBGb3JtQ29udHJvbDxUIHwgbnVsbD47XG5cbiAgLyoqXG4gICAqIEFwcGVuZCB0aGUgZmllbGQncyB2YWx1ZSB0byB0aGUgdXJsLlxuICAgKlxuICAgKiBUaGUgZmllbGQgd29udCBiZSBhcHBlbmRlZCB0byB0aGUgdXJsIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gICAqIC0gSXQgaXMgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIGBhcHBlbmREZWZhdWx0VmFsdWVUb1VybGAgaXMgYGZhbHNlYFxuICAgKiAtIEl0IGlzIGFuIGVtcHR5IHN0cmluZ1xuICAgKiAtIEl0IGlzIGBudWxsYFxuICAgKiAtIEl0IGlzIGB1bmRlZmluZWRgXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGFwcGVuZFRvVXJsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXBwZW5kIHRoZSBmaWVsZCdzIHZhbHVlIHRvIHRoZSB1cmwgZXZlbiBpZiBpdCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICogV2lsbCBiZSBpZ25vcmVkIGlmIGBhcHBlbmRUb1VybGAgaXMgYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGFwcGVuZERlZmF1bHRWYWx1ZVRvVXJsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmVzZXQgdGhlIGZpZWxkJ3MgdmFsdWUgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaWYgb25lIG9yIG1vcmUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZHMgYXJlIGNoYW5nZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEdpdmVuIHRoaXMgZmllbGQgaXMgYSBgcGFnZWAgZmllbGQsIHRoZSBmaWVsZCB3aWxsIGJlIHJlc2V0IGlmIHRoZSBgbGltaXRgLCBgcXVlcnlgIG9yIGBzZWFyY2hgIGZpZWxkcyBhcmUgY2hhbmdlZC5cbiAgICogWydsaW1pdCcsICdxdWVyeScsICdzZWFyY2gnXVxuICAgKi9cbiAgaXNSZXNldEJ5Pzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBjaGFuZ2UgdGhlIGNvdW50IG9mIGN1cnJlbnQgYWN0aXZlIGZpbHRlcnMuXG4gICAqXG4gICAqIFdpbGwgYmUgYHRydWVgIGZvciB0aGVzZSBjb21tb24gZmllbGRzOlxuICAgKiAtIGBwYWdlYFxuICAgKiAtIGBza2lwYFxuICAgKiAtIGB0YWtlYFxuICAgKiAtIGBsaW1pdGBcbiAgICogLSBgc29ydGBcbiAgICogLSBgc29ydEJ5YFxuICAgKiAtIGBzb3J0T3JkZXJgXG4gICAqIC0gYHF1ZXJ5YFxuICAgKiAtIGBzZWFyY2hgXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwSW5GaWx0ZXJDb3VudD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBmaWVsZCdzIHN0cmluZyB2YWx1ZSBpcyB0cmFuc2Zvcm1lZCB0byBpdCdzIG1hdGNoaW5nIHByaW1pdGl2ZSB0eXBlLlxuICAgKiBNZWFuaW5nIHRoYXQgYSBzdHJpbmcgYCd0cnVlJ2Agd2lsbCBiZSB0cmFuc2Zvcm1lZCB0byBhIGJvb2xlYW4gYHRydWVgIGFuZCBhIHN0cmluZyBgJzUnYCB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvIGEgbnVtYmVyIGA1YC5cbiAgICogSWYgdGhpcyBpcyBzZXQgdG8gYHRydWVgLCB0aGUgZmllbGQncyB2YWx1ZSB3aWxsIG5vdCBiZSB0cmFuc2Zvcm1lZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHNraXBBdXRvVHJhbnNmb3JtPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIHRoZSB2YWx1ZSBnb3R0ZW4gZnJvbSB0aGUgdXJsIHF1ZXJ5IHBhcmFtcyB0byBhIHZhbHVlIHJlcXVpcmVkIGJ5IHRoZSBmaWVsZC5cbiAgICogRS5nLiBmb3IgYSBudW1iZXIgZmllbGQsIHRoZSB2YWx1ZSBmcm9tIHRoZSB1cmwgcXVlcnkgcGFyYW1zIGlzIGEgc3RyaW5nLCBidXQgdGhlIGZpZWxkIHJlcXVpcmVzIGEgbnVtYmVyLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGNvbW1vbiB0cmFuc2Zvcm1hdGlvbnMgYXJlIGFscmVhZHkgaW1wbGVtZW50ZWQ6XG4gICAqIC0gYHRyYW5zZm9ybVRvU3RyaW5nYFxuICAgKiAtIGB0cmFuc2Zvcm1Ub1N0cmluZ0FycmF5YFxuICAgKiAtIGB0cmFuc2Zvcm1Ub051bWJlcmBcbiAgICogLSBgdHJhbnNmb3JtVG9OdW1iZXJBcnJheWBcbiAgICogLSBgdHJhbnNmb3JtVG9Cb29sZWFuYFxuICAgKiAtIGB0cmFuc2Zvcm1Ub0Jvb2xlYW5BcnJheWBcbiAgICogLSBgdHJhbnNmb3JtVG9EYXRlYCAoZXhwZWN0cyBhIHN0cmluZyBpbiB0aGUgZGVmYXVsdCBqcyBmb3JtYXQpXG4gICAqIC0gYHRyYW5zZm9ybVRvRGF0ZUFycmF5YCAoZXhwZWN0cyBzdHJpbmdzIGluIHRoZSBkZWZhdWx0IGpzIGZvcm1hdClcbiAgICogLSBgdHJhbnNmb3JtVG9Tb3J0YCAoZXhwZWN0cyBhIHN0cmluZyBpbiB0aGUgZm9ybWF0IGBmaWVsZDpkaXJlY3Rpb25gKVxuICAgKi9cbiAgcXVlcnlQYXJhbVRvVmFsdWVUcmFuc2Zvcm1Gbj86ICh2YWw6IHVua25vd24pID0+IFQgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHRvIGEgdmFsdWUgdGhhdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIHVybCBxdWVyeSBwYXJhbXMuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgY29tbW9uIHRyYW5zZm9ybWF0aW9ucyBhcmUgYWxyZWFkeSBpbXBsZW1lbnRlZDpcbiAgICogLSBgdHJhbnNmb3JtVG9Tb3J0UXVlcnlQYXJhbWAgKHJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYGZpZWxkYCBhbmQgYGRpcmVjdGlvbmAgcHJvcGVydGllcylcbiAgICovXG4gIHZhbHVlVG9RdWVyeVBhcmFtVHJhbnNmb3JtRm4/OiAodmFsOiBUIHwgbnVsbCkgPT4gdW5rbm93bjtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIFF1ZXJ5Rm9ybUdyb3VwQ29udHJvbHM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFF1ZXJ5RmllbGQ8YW55Pj4+ID0ge1xuICBbUHJvcGVydHkgaW4ga2V5b2YgVF06IFRbUHJvcGVydHldWydjb250cm9sJ107XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgUXVlcnlGb3JtVmFsdWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFF1ZXJ5RmllbGQ8YW55Pj4+ID0ge1xuICBbUHJvcGVydHkgaW4ga2V5b2YgVF06IFRbUHJvcGVydHldWydjb250cm9sJ11bJ3ZhbHVlJ107XG59O1xuXG5leHBvcnQgdHlwZSBRdWVyeUZvcm1PZjxUIGV4dGVuZHMgRm9ybUdyb3VwPiA9IHtcbiAgW0sgaW4ga2V5b2YgVFsnY29udHJvbHMnXV06IFF1ZXJ5RmllbGQ8VFsnY29udHJvbHMnXVtLXVsndmFsdWUnXT47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Rm9ybUdyb3VwIGV4dGVuZHMgRm9ybUdyb3VwIHtcbiAgX3NldFZhbHVlOiBGb3JtR3JvdXBbJ3NldFZhbHVlJ107XG4gIF9wYXRjaFZhbHVlOiBGb3JtR3JvdXBbJ3BhdGNoVmFsdWUnXTtcbiAgc2V0VmFsdWUodmFsdWU6IHVua25vd24sIG9wdGlvbnM/OiBRdWVyeUZvcm1Xcml0ZU9wdGlvbnMpOiB2b2lkO1xuICBwYXRjaFZhbHVlKHZhbHVlOiB1bmtub3duLCBvcHRpb25zPzogUXVlcnlGb3JtV3JpdGVPcHRpb25zKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUZvcm1PYnNlcnZlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb3JtIHZhbHVlIHNob3VsZCBiZSBzeW5jZWQgdG8gdGhlIHVybCBxdWVyeSBwYXJhbXMuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHdyaXRlVG9RdWVyeVBhcmFtcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZvcm0gdmFsdWUgc2hvdWxkIGJlIHVwZGF0ZWQgd2hlbiB0aGUgdXJsIHF1ZXJ5IHBhcmFtcyBjaGFuZ2UuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHN5bmNPbk5hdmlnYXRpb24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCB0aGUgbmF2aWdhdGlvbiB3aWxsIG5vdCBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGJyb3dzZXIncyBoaXN0b3J5LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVwbGFjZVVybD86IGJvb2xlYW47XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Rm9ybVZhbHVlRXZlbnQ8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFF1ZXJ5RmllbGQ8YW55Pj4+IHtcbiAgcHJldmlvdXNWYWx1ZTogUXVlcnlGb3JtVmFsdWU8VD4gfCBudWxsO1xuICBjdXJyZW50VmFsdWU6IFF1ZXJ5Rm9ybVZhbHVlPFQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Rm9ybVdyaXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGVhY2ggY2hhbmdlIG9ubHkgYWZmZWN0cyB0aGlzIGNvbnRyb2wsIGFuZCBub3QgaXRzIHBhcmVudC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG9ubHlTZWxmPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kIGB2YWx1ZUNoYW5nZXNgXG4gICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgdmFsdWUgaXMgdXBkYXRlZC5cbiAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIHRoZSBgcmVzZXRCeWAgY29uZGl0aW9ucyB3aWxsIGJlIGlnbm9yZWQgZm9yIHRoaXMgd3JpdGUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwUmVzZXRzPzogYm9vbGVhbjtcbn1cbiJdfQ==
@@ -1,97 +0,0 @@
1
- export const transformToString = (value) => {
2
- if (typeof value === 'string') {
3
- return value;
4
- }
5
- return null;
6
- };
7
- export const transformToStringArray = (value) => {
8
- if (Array.isArray(value)) {
9
- return value.map(transformToString).filter(Boolean);
10
- }
11
- else if (typeof value === 'string') {
12
- return [transformToString(value)];
13
- }
14
- return null;
15
- };
16
- export const transformToNumber = (value) => {
17
- if (typeof value === 'number') {
18
- return value;
19
- }
20
- if (typeof value === 'string') {
21
- return Number(value);
22
- }
23
- return null;
24
- };
25
- export const transformToNumberArray = (value) => {
26
- if (Array.isArray(value)) {
27
- return value.map(transformToNumber).filter((item) => item !== null);
28
- }
29
- else if (typeof value === 'number') {
30
- return [value];
31
- }
32
- return null;
33
- };
34
- export const transformToBoolean = (value) => {
35
- if (typeof value === 'boolean') {
36
- return value;
37
- }
38
- if (typeof value === 'string') {
39
- return value === 'true' || value === '1';
40
- }
41
- return null;
42
- };
43
- export const transformToBooleanArray = (value) => {
44
- if (Array.isArray(value)) {
45
- return value.map(transformToBoolean).filter((item) => item !== null);
46
- }
47
- else if (typeof value === 'string' || typeof value === 'boolean') {
48
- return [transformToBoolean(value)];
49
- }
50
- return null;
51
- };
52
- export const transformToDate = (value) => {
53
- if (value instanceof Date) {
54
- return value;
55
- }
56
- if (typeof value === 'string') {
57
- const date = new Date(value);
58
- if (isNaN(date.getTime())) {
59
- return null;
60
- }
61
- return date;
62
- }
63
- return null;
64
- };
65
- export const transformToDateArray = (value) => {
66
- if (Array.isArray(value)) {
67
- return value.map(transformToDate).filter((item) => item !== null);
68
- }
69
- else if (typeof value === 'string' || value instanceof Date) {
70
- return [transformToDate(value)];
71
- }
72
- return null;
73
- };
74
- export const transformToSort = (value) => {
75
- if (typeof value === 'string') {
76
- const [active, direction] = value.split(':');
77
- if (!active) {
78
- return null;
79
- }
80
- return {
81
- active,
82
- direction: direction,
83
- };
84
- }
85
- return null;
86
- };
87
- export const transformToSortQueryParam = (value) => {
88
- if (typeof value === 'string') {
89
- return value;
90
- }
91
- if (value && typeof value === 'object' && 'active' in value && 'direction' in value) {
92
- const valAsSort = value;
93
- return valAsSort.direction ? `${valAsSort.active}:${valAsSort.direction}` : null;
94
- }
95
- return null;
96
- };
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9xdWVyeS1mb3JtL3F1ZXJ5LWZvcm0udXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFjLEVBQUUsRUFBRTtJQUNsRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFjLEVBQUUsRUFBRTtJQUN2RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFhLENBQUM7SUFDbEUsQ0FBQztTQUFNLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDckMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFhLENBQUM7SUFDaEQsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFjLEVBQUUsRUFBRTtJQUNsRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzlCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUYsTUFBTSxD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QUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0MsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTztZQUNMLE1BQU07WUFDTixTQUFTLEVBQUUsU0FBMkI7U0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUU7SUFDMUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxXQUFXLElBQUksS0FBSyxFQUFFLENBQUM7UUFDcEYsTUFBTSxTQUFTLEdBQUcsS0FHakIsQ0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ25GLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Ub1N0cmluZyA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVRvU3RyaW5nQXJyYXkgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCh0cmFuc2Zvcm1Ub1N0cmluZykuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gW3RyYW5zZm9ybVRvU3RyaW5nKHZhbHVlKV0gYXMgc3RyaW5nW107XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Ub051bWJlciA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVRvTnVtYmVyQXJyYXkgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCh0cmFuc2Zvcm1Ub051bWJlcikuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBudWxsKSBhcyBudW1iZXJbXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIFt2YWx1ZV0gYXMgbnVtYmVyW107XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Ub0Jvb2xlYW4gPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAndHJ1ZScgfHwgdmFsdWUgPT09ICcxJztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Ub0Jvb2xlYW5BcnJheSA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKHRyYW5zZm9ybVRvQm9vbGVhbikuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBudWxsKSBhcyBib29sZWFuW107XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBbdHJhbnNmb3JtVG9Cb29sZWFuKHZhbHVlKV0gYXMgYm9vbGVhbltdO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtVG9EYXRlID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuXG4gICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtVG9EYXRlQXJyYXkgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCh0cmFuc2Zvcm1Ub0RhdGUpLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAhPT0gbnVsbCkgYXMgRGF0ZVtdO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIFt0cmFuc2Zvcm1Ub0RhdGUodmFsdWUpXSBhcyBEYXRlW107XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1Ub1NvcnQgPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBbYWN0aXZlLCBkaXJlY3Rpb25dID0gdmFsdWUuc3BsaXQoJzonKTtcblxuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZlLFxuICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24gYXMgJ2FzYycgfCAnZGVzYycsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVRvU29ydFF1ZXJ5UGFyYW0gPSAodmFsdWU6IHVua25vd24pID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgJ2FjdGl2ZScgaW4gdmFsdWUgJiYgJ2RpcmVjdGlvbicgaW4gdmFsdWUpIHtcbiAgICBjb25zdCB2YWxBc1NvcnQgPSB2YWx1ZSBhcyB7XG4gICAgICBhY3RpdmU6IHN0cmluZztcbiAgICAgIGRpcmVjdGlvbjogJ2FzYycgfCAnZGVzYyc7XG4gICAgfTtcblxuICAgIHJldHVybiB2YWxBc1NvcnQuZGlyZWN0aW9uID8gYCR7dmFsQXNTb3J0LmFjdGl2ZX06JHt2YWxBc1NvcnQuZGlyZWN0aW9ufWAgOiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuIl19
@@ -1,2 +0,0 @@
1
- export * from './query-store';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcXVlcnktc3RvcmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3F1ZXJ5LXN0b3JlJztcbiJdfQ==