ngx-speculoos 6.0.0 → 7.2.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 (36) hide show
  1. package/README.md +403 -42
  2. package/esm2020/jasmine-matchers.mjs +2 -0
  3. package/esm2020/lib/component-tester.mjs +147 -0
  4. package/esm2020/lib/matchers.mjs +283 -0
  5. package/esm2020/lib/mock.mjs +25 -0
  6. package/esm2020/lib/route.mjs +319 -0
  7. package/{esm2015/lib/test-button.js → esm2020/lib/test-button.mjs} +0 -0
  8. package/esm2020/lib/test-element-querier.mjs +140 -0
  9. package/esm2020/lib/test-element.mjs +142 -0
  10. package/{esm2015/lib/test-html-element.js → esm2020/lib/test-html-element.mjs} +0 -0
  11. package/{esm2015/lib/test-input.js → esm2020/lib/test-input.mjs} +0 -0
  12. package/{esm2015/lib/test-select.js → esm2020/lib/test-select.mjs} +0 -0
  13. package/{esm2015/lib/test-textarea.js → esm2020/lib/test-textarea.mjs} +0 -0
  14. package/{esm2015/ngx-speculoos.js → esm2020/ngx-speculoos.mjs} +0 -0
  15. package/{esm2015/public_api.js → esm2020/public_api.mjs} +2 -1
  16. package/fesm2015/ngx-speculoos.mjs +1257 -0
  17. package/fesm2015/ngx-speculoos.mjs.map +1 -0
  18. package/{fesm2015/ngx-speculoos.js → fesm2020/ngx-speculoos.mjs} +436 -22
  19. package/fesm2020/ngx-speculoos.mjs.map +1 -0
  20. package/jasmine-matchers.d.ts +5 -0
  21. package/lib/component-tester.d.ts +87 -49
  22. package/lib/mock.d.ts +10 -0
  23. package/lib/route.d.ts +149 -0
  24. package/lib/test-element-querier.d.ts +15 -15
  25. package/lib/test-element.d.ts +87 -49
  26. package/package.json +24 -11
  27. package/public_api.d.ts +1 -0
  28. package/bundles/ngx-speculoos.umd.js +0 -1259
  29. package/bundles/ngx-speculoos.umd.js.map +0 -1
  30. package/esm2015/jasmine-matchers.js +0 -2
  31. package/esm2015/lib/component-tester.js +0 -96
  32. package/esm2015/lib/matchers.js +0 -244
  33. package/esm2015/lib/route.js +0 -81
  34. package/esm2015/lib/test-element-querier.js +0 -129
  35. package/esm2015/lib/test-element.js +0 -91
  36. package/fesm2015/ngx-speculoos.js.map +0 -1
@@ -0,0 +1,319 @@
1
+ import { ActivatedRoute, ActivatedRouteSnapshot, convertToParamMap } from '@angular/router';
2
+ import { BehaviorSubject, map } from 'rxjs';
3
+ /**
4
+ * Creates a fake partial ActivatedRoute for tests.
5
+ *
6
+ * If you pass params, then the created route's paramMap will contain the same values.
7
+ * The same goes for queryParams and queryParamMap.
8
+ *
9
+ * If you pass a parent route and a snapshot, and the passed snapshot doesn't have a parent, then the snapshot's
10
+ * parent will be set to the parent route snapshot. This allows the code under test to use
11
+ * `route.parent.snapshot` or `route.snapshot.parent`.
12
+ *
13
+ * If you pass a snapshot with a parent, but don't pass a parent or pass a parent without snapshot, then the route's
14
+ * parent snapshot will be set to the given snapshot's parent. This allows the code under test to use
15
+ * `route.parent.snapshot` or `route.snapshot.parent`.
16
+ *
17
+ * @returns a partially populated, fake ActivatedRoute, depending on what you passed in
18
+ * @deprecated favor stubRoute, which creates an easier to use and more logical stub
19
+ */
20
+ export function fakeRoute(options) {
21
+ const result = {
22
+ url: options.url,
23
+ params: options.params,
24
+ paramMap: options.params && options.params.pipe(map(params => convertToParamMap(params))),
25
+ queryParams: options.queryParams,
26
+ queryParamMap: options.queryParams && options.queryParams.pipe(map(params => convertToParamMap(params))),
27
+ fragment: options.fragment,
28
+ data: options.data,
29
+ outlet: options.outlet,
30
+ component: options.component,
31
+ snapshot: options.snapshot,
32
+ routeConfig: options.routeConfig,
33
+ root: options.root,
34
+ parent: options.parent,
35
+ firstChild: options.firstChild,
36
+ children: options.children,
37
+ pathFromRoot: options.pathFromRoot
38
+ };
39
+ for (let route = result; route; route = route.parent) {
40
+ if (route.parent && route.parent.snapshot && !route.snapshot) {
41
+ // eslint-disable-next-line deprecation/deprecation
42
+ route.snapshot = fakeSnapshot({});
43
+ }
44
+ if (route.parent && route.parent.snapshot && !route.snapshot.parent) {
45
+ route.snapshot.parent = route.parent.snapshot;
46
+ }
47
+ if (route.snapshot && route.snapshot.parent && !route.parent) {
48
+ // eslint-disable-next-line deprecation/deprecation
49
+ route.parent = fakeRoute({});
50
+ }
51
+ if (route.snapshot && route.snapshot.parent && route.parent && !route.parent.snapshot) {
52
+ route.parent.snapshot = route.snapshot.parent;
53
+ }
54
+ }
55
+ return result;
56
+ }
57
+ /**
58
+ * Creates a fake partial ActivatedRouteSnapshot for tests.
59
+ *
60
+ * If you pass params, then the created snapshot's paramMap will contain the same values.
61
+ * The same goes for queryParams and queryParamMap.
62
+ *
63
+ * @returns a partially populated, fake ActivatedRoute, depending on what you passed in
64
+ * @deprecated favor stubRoute, which creates an easier to use and more logical stub for both the route and its snapshot
65
+ */
66
+ export function fakeSnapshot(options) {
67
+ return {
68
+ url: options.url,
69
+ params: options.params,
70
+ paramMap: options.params && convertToParamMap(options.params),
71
+ queryParams: options.queryParams,
72
+ queryParamMap: options.queryParams && convertToParamMap(options.queryParams),
73
+ fragment: options.fragment,
74
+ data: options.data,
75
+ outlet: options.outlet,
76
+ component: options.component,
77
+ routeConfig: options.routeConfig,
78
+ root: options.root,
79
+ parent: options.parent,
80
+ firstChild: options.firstChild,
81
+ children: options.children,
82
+ pathFromRoot: options.pathFromRoot
83
+ };
84
+ }
85
+ class ActivatedRouteSnapshotStub extends ActivatedRouteSnapshot {
86
+ constructor() {
87
+ super();
88
+ this._parent = null;
89
+ this._firstChild = null;
90
+ this._children = [];
91
+ this._pathFromRoot = [];
92
+ this._routeConfig = null;
93
+ this._root = this;
94
+ }
95
+ get parent() {
96
+ return this._parent;
97
+ }
98
+ set parent(value) {
99
+ this._parent = value;
100
+ }
101
+ get root() {
102
+ return this._root;
103
+ }
104
+ set root(value) {
105
+ this._root = value;
106
+ }
107
+ get firstChild() {
108
+ return this._firstChild;
109
+ }
110
+ set firstChild(value) {
111
+ this._firstChild = value;
112
+ }
113
+ get children() {
114
+ return this._children;
115
+ }
116
+ set children(value) {
117
+ this._children = value;
118
+ }
119
+ get pathFromRoot() {
120
+ return this._pathFromRoot;
121
+ }
122
+ set pathFromRoot(value) {
123
+ this._pathFromRoot = value;
124
+ }
125
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
126
+ // @ts-ignore
127
+ get routeConfig() {
128
+ return this._routeConfig;
129
+ }
130
+ set routeConfig(route) {
131
+ this._routeConfig = route;
132
+ }
133
+ }
134
+ /**
135
+ * A stub for ActivatedRoute. It behaves almost the same way as the actual ActivatedRoute, exposing a snapshot
136
+ * and observables for the params, query params etc., which are kept in sync.
137
+ *
138
+ * In addition, this stub allows simulating a navigation by changing the params, the query params, the fragment, etc.
139
+ * When that happens, the snapshot is modified, then the relevant observables emit the new values.
140
+ *
141
+ * There are some things that don't really work the same way as the real ActivatedRoute though:
142
+ * - the handling of the firstChild and of the children is entirely under the tester's responsibility. Setting the parent
143
+ * of a route stub does not add this route to the children of its parent, for example.
144
+ * - when changing the params, query params, fragment, etc., their associated observable emits unconditionally, instead of
145
+ * first checking if the value is actually different from before. It's thus the responsibility of the tester to not
146
+ * change the values if they're the same as before.
147
+ */
148
+ export class ActivatedRouteStub extends ActivatedRoute {
149
+ /**
150
+ * Constructs a new instance, based on the given options.
151
+ * If an option is not provided (or if no option is provided at all), then the route has a default value for this option
152
+ * (empty parameters for example, null fragment, etc.)
153
+ * If no parent is passed, then this route has no parent and is thus set as the root. Otherwise, the root and the path
154
+ * from root are created based on the root and path from root of the given parent route.
155
+ */
156
+ constructor(options) {
157
+ super();
158
+ const snapshot = new ActivatedRouteSnapshotStub();
159
+ this.snapshot = snapshot;
160
+ this._firstChild = options?.firstChild ?? null;
161
+ this._children = options?.children ?? [];
162
+ this._parent = options?.parent ?? null;
163
+ this._root = this.parent?.root ?? this;
164
+ this._pathFromRoot = this.parent ? [...this.parent.pathFromRoot, this] : [this];
165
+ snapshot.params = options?.params ?? {};
166
+ snapshot.queryParams = options?.queryParams ?? {};
167
+ snapshot.data = options?.data ?? {};
168
+ snapshot.fragment = options?.fragment ?? null;
169
+ snapshot.url = options?.url ?? [];
170
+ snapshot.routeConfig = options?.routeConfig ?? null;
171
+ snapshot.firstChild = this.firstChild?.snapshot ?? null;
172
+ snapshot.children = this.children?.map(route => route.snapshot) ?? [];
173
+ snapshot.parent = this.parent?.snapshot ?? null;
174
+ snapshot.root = this.root.snapshot;
175
+ snapshot.pathFromRoot = this.pathFromRoot.map(route => route.snapshot);
176
+ this.paramsSubject = new BehaviorSubject(this.snapshot.params);
177
+ this.queryParamsSubject = new BehaviorSubject(this.snapshot.queryParams);
178
+ this.dataSubject = new BehaviorSubject(this.snapshot.data);
179
+ this.fragmentSubject = new BehaviorSubject(this.snapshot.fragment);
180
+ this.urlSubject = new BehaviorSubject(this.snapshot.url);
181
+ this.params = this.paramsSubject.asObservable();
182
+ this.queryParams = this.queryParamsSubject.asObservable();
183
+ this.data = this.dataSubject.asObservable();
184
+ this.fragment = this.fragmentSubject.asObservable();
185
+ this.url = this.urlSubject.asObservable();
186
+ }
187
+ get root() {
188
+ return this._root;
189
+ }
190
+ get parent() {
191
+ return this._parent;
192
+ }
193
+ get pathFromRoot() {
194
+ return this._pathFromRoot;
195
+ }
196
+ get firstChild() {
197
+ return this._firstChild;
198
+ }
199
+ get children() {
200
+ return this._children;
201
+ }
202
+ get routeConfig() {
203
+ return this.snapshot.routeConfig;
204
+ }
205
+ /**
206
+ * Triggers a navigation with the given new parameters. All the other parts (query params etc.) stay as the are.
207
+ * This is a shortcut to `triggerNavigation` that can be used to only change the parameters.
208
+ */
209
+ setParams(params) {
210
+ this.triggerNavigation({ params });
211
+ }
212
+ /**
213
+ * Triggers a navigation with the given new parameter. The other parameters, as well as all the other parts (query params etc.)
214
+ * stay as the are.
215
+ * This is a shortcut to `triggerNavigation` that can be used to only change one parameter.
216
+ */
217
+ setParam(name, value) {
218
+ this.setParams({ ...this.snapshot.params, [name]: value });
219
+ }
220
+ /**
221
+ * Triggers a navigation with the given new query parameters. All the other parts (params etc.) stay as the are.
222
+ * This is a shortcut to `triggerNavigation` that can be used to only change the query parameters.
223
+ */
224
+ setQueryParams(queryParams) {
225
+ this.triggerNavigation({ queryParams });
226
+ }
227
+ /**
228
+ * Triggers a navigation with the given new parameter. The other query parameters, as well as all the other parts (params etc.)
229
+ * stay as the are.
230
+ * This is a shortcut to `triggerNavigation` that can be used to only change one query parameter.
231
+ */
232
+ setQueryParam(name, value) {
233
+ this.setQueryParams({ ...this.snapshot.queryParams, [name]: value });
234
+ }
235
+ /**
236
+ * Triggers a navigation with the given new data. The other parameters, as well as all the other parts (params etc.)
237
+ * stay as the are.
238
+ * This is a shortcut to `triggerNavigation` that can be used to only change the data.
239
+ */
240
+ setData(data) {
241
+ this.triggerNavigation({ data });
242
+ }
243
+ /**
244
+ * Triggers a navigation with the given new data item. The other data, as well as all the other parts (params etc.)
245
+ * stay as the are.
246
+ * This is a shortcut to `triggerNavigation` that can be used to only change one data item.
247
+ */
248
+ setDataItem(name, value) {
249
+ this.setData({ ...this.snapshot.data, [name]: value });
250
+ }
251
+ /**
252
+ * Triggers a navigation with the given new fragment. The other parts (params etc.) stay as the are.
253
+ * This is a shortcut to `triggerNavigation` that can be used to only change the fragment.
254
+ */
255
+ setFragment(fragment) {
256
+ this.triggerNavigation({ fragment });
257
+ }
258
+ /**
259
+ * Triggers a navigation with the given new url. The other parts (params etc.) stay as the are.
260
+ * This is a shortcut to `triggerNavigation` that can be used to only change the url.
261
+ */
262
+ setUrl(url) {
263
+ this.triggerNavigation({ url });
264
+ }
265
+ /**
266
+ * Triggers a navigation based on the given options. If an option is undefined or null, it's ignored. Except for fragment, which is only
267
+ * ignored if it's undefined, because null is a valid value for a fragment.
268
+ *
269
+ * The non-ignored values are used to change the snapshot of the route. Once the snapshot has been modified,
270
+ * the observables corresponding to the updated parts emit the new value.
271
+ *
272
+ * So, setting params and query params will make the params and queryParams observables emit, but not the fragment, data and
273
+ * url observables for example. This is consistent to how the router behaves.
274
+ */
275
+ triggerNavigation(options) {
276
+ // set the snapshot first
277
+ if (options.params) {
278
+ this.snapshot.params = options.params;
279
+ }
280
+ if (options.queryParams) {
281
+ this.snapshot.queryParams = options.queryParams;
282
+ }
283
+ if (options.fragment !== undefined) {
284
+ this.snapshot.fragment = options.fragment;
285
+ }
286
+ if (options.data) {
287
+ this.snapshot.data = options.data;
288
+ }
289
+ if (options.url) {
290
+ this.snapshot.url = options.url;
291
+ }
292
+ // then emit everything that has changed
293
+ if (options.params) {
294
+ this.paramsSubject.next(this.snapshot.params);
295
+ }
296
+ if (options.queryParams) {
297
+ this.queryParamsSubject.next(this.snapshot.queryParams);
298
+ }
299
+ if (options.fragment !== undefined) {
300
+ this.fragmentSubject.next(this.snapshot.fragment);
301
+ }
302
+ if (options.data) {
303
+ this.dataSubject.next(this.snapshot.data);
304
+ }
305
+ if (options.url) {
306
+ this.urlSubject.next(this.snapshot.url);
307
+ }
308
+ }
309
+ toString() {
310
+ return 'ActivatedRouteStub';
311
+ }
312
+ }
313
+ /**
314
+ * Creates a new ActivatedRouteStub, by calling its constructor.
315
+ */
316
+ export function stubRoute(options) {
317
+ return new ActivatedRouteStub(options);
318
+ }
319
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBbUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3SCxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUd4RDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsT0E0QnpCO0lBQ0MsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1FBQ3RCLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDekYsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLGFBQWEsRUFBRSxPQUFPLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1FBQzFCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtRQUNsQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07UUFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1FBQzVCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDaEMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FB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LElBQUksQ0FBQztTQUNuQztRQUNELElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7U0FDakM7UUFFRCx3Q0FBd0M7UUFDeEMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDL0M7UUFDRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUFtQztJQUMzRCxPQUFPLElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBjb252ZXJ0VG9QYXJhbU1hcCwgRGF0YSwgUGFyYW1zLCBSb3V0ZSwgVXJsU2VnbWVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIG1hcCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmYWtlIHBhcnRpYWwgQWN0aXZhdGVkUm91dGUgZm9yIHRlc3RzLlxuICpcbiAqIElmIHlvdSBwYXNzIHBhcmFtcywgdGhlbiB0aGUgY3JlYXRlZCByb3V0ZSdzIHBhcmFtTWFwIHdpbGwgY29udGFpbiB0aGUgc2FtZSB2YWx1ZXMuXG4gKiBUaGUgc2FtZSBnb2VzIGZvciBxdWVyeVBhcmFtcyBhbmQgcXVlcnlQYXJhbU1hcC5cbiAqXG4gKiBJZiB5b3UgcGFzcyBhIHBhcmVudCByb3V0ZSBhbmQgYSBzbmFwc2hvdCwgYW5kIHRoZSBwYXNzZWQgc25hcHNob3QgZG9lc24ndCBoYXZlIGEgcGFyZW50LCB0aGVuIHRoZSBzbmFwc2hvdCdzXG4gKiBwYXJlbnQgd2lsbCBiZSBzZXQgdG8gdGhlIHBhcmVudCByb3V0ZSBzbmFwc2hvdC4gVGhpcyBhbGxvd3MgdGhlIGNvZGUgdW5kZXIgdGVzdCB0byB1c2VcbiAqIGByb3V0ZS5wYXJlbnQuc25hcHNob3RgIG9yIGByb3V0ZS5zbmFwc2hvdC5wYXJlbnRgLlxuICpcbiAqIElmIHlvdSBwYXNzIGEgc25hcHNob3Qgd2l0aCBhIHBhcmVudCwgYnV0IGRvbid0IHBhc3MgYSBwYXJlbnQgb3IgcGFzcyBhIHBhcmVudCB3aXRob3V0IHNuYXBzaG90LCB0aGVuIHRoZSByb3V0ZSdzXG4gKiBwYXJlbnQgc25hcHNob3Qgd2lsbCBiZSBzZXQgdG8gdGhlIGdpdmVuIHNuYXBzaG90J3MgcGFyZW50LiBUaGlzIGFsbG93cyB0aGUgY29kZSB1bmRlciB0ZXN0IHRvIHVzZVxuICogYHJvdXRlLnBhcmVudC5zbmFwc2hvdGAgb3IgYHJvdXRlLnNuYXBzaG90LnBhcmVudGAuXG4gKlxuICogQHJldHVybnMgYSBwYXJ0aWFsbHkgcG9wdWxhdGVkLCBmYWtlIEFjdGl2YXRlZFJvdXRlLCBkZXBlbmRpbmcgb24gd2hhdCB5b3UgcGFzc2VkIGluXG4gKiBAZGVwcmVjYXRlZCBmYXZvciBzdHViUm91dGUsIHdoaWNoIGNyZWF0ZXMgYW4gZWFzaWVyIHRvIHVzZSBhbmQgbW9yZSBsb2dpY2FsIHN0dWJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZha2VSb3V0ZShvcHRpb25zOiB7XG4gIHVybD86IE9ic2VydmFibGU8VXJsU2VnbWVudFtdPjtcbiAgLyoqIEFuIG9ic2VydmFibGUgb2YgdGhlIG1hdHJpeCBwYXJhbWV0ZXJzIHNjb3BlZCB0byB0aGlzIHJvdXRlICovXG4gIHBhcmFtcz86IE9ic2VydmFibGU8UGFyYW1zPjtcbiAgLyoqIEFuIG9ic2VydmFibGUgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgc2hhcmVkIGJ5IGFsbCB0aGUgcm91dGVzICovXG4gIHF1ZXJ5UGFyYW1zPzogT2JzZXJ2YWJsZTxQYXJhbXM+O1xuICAvKiogQW4gb2JzZXJ2YWJsZSBvZiB0aGUgVVJMIGZyYWdtZW50IHNoYXJlZCBieSBhbGwgdGhlIHJvdXRlcyAqL1xuICBmcmFnbWVudD86IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgLyoqIEFuIG9ic2VydmFibGUgb2YgdGhlIHN0YXRpYyBhbmQgcmVzb2x2ZWQgZGF0YSBvZiB0aGlzIHJvdXRlLiAqL1xuICBkYXRhPzogT2JzZXJ2YWJsZTxEYXRhPjtcbiAgLyoqIFRoZSBvdXRsZXQgbmFtZSBvZiB0aGUgcm91dGUuIEl0J3MgYSBjb25zdGFudCAqL1xuICBvdXRsZXQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgY29tcG9uZW50IG9mIHRoZSByb3V0ZS4gSXQncyBhIGNvbnN0YW50ICovXG4gIGNvbXBvbmVudD86IFR5cGU8dW5rbm93bj4gfCBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGN1cnJlbnQgc25hcHNob3Qgb2YgdGhpcyByb3V0ZSAqL1xuICBzbmFwc2hvdD86IEFjdGl2YXRlZFJvdXRlU25hcHNob3Q7XG4gIC8qKiBUaGUgY29uZmlndXJhdGlvbiB1c2VkIHRvIG1hdGNoIHRoaXMgcm91dGUgKi9cbiAgcm91dGVDb25maWc/OiBSb3V0ZSB8IG51bGw7XG4gIC8qKiBUaGUgcm9vdCBvZiB0aGUgcm91dGVyIHN0YXRlICovXG4gIHJvb3Q/OiBBY3RpdmF0ZWRSb3V0ZTtcbiAgLyoqIFRoZSBwYXJlbnQgb2YgdGhpcyByb3V0ZSBpbiB0aGUgcm91dGVyIHN0YXRlIHRyZWUgKi9cbiAgcGFyZW50PzogQWN0aXZhdGVkUm91dGUgfCBudWxsO1xuICAvKiogVGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgcm91dGUgaW4gdGhlIHJvdXRlciBzdGF0ZSB0cmVlICovXG4gIGZpcnN0Q2hpbGQ/OiBBY3RpdmF0ZWRSb3V0ZTtcbiAgLyoqIFRoZSBjaGlsZHJlbiBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBjaGlsZHJlbj86IEFjdGl2YXRlZFJvdXRlW107XG4gIC8qKiBUaGUgcGF0aCBmcm9tIHRoZSByb290IG9mIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSB0byB0aGlzIHJvdXRlICovXG4gIHBhdGhGcm9tUm9vdD86IEFjdGl2YXRlZFJvdXRlW107XG59KTogQWN0aXZhdGVkUm91dGUge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgdXJsOiBvcHRpb25zLnVybCxcbiAgICBwYXJhbXM6IG9wdGlvbnMucGFyYW1zLFxuICAgIHBhcmFtTWFwOiBvcHRpb25zLnBhcmFtcyAmJiBvcHRpb25zLnBhcmFtcy5waXBlKG1hcChwYXJhbXMgPT4gY29udmVydFRvUGFyYW1NYXAocGFyYW1zKSkpLFxuICAgIHF1ZXJ5UGFyYW1zOiBvcHRpb25zLnF1ZXJ5UGFyYW1zLFxuICAgIHF1ZXJ5UGFyYW1NYXA6IG9wdGlvbnMucXVlcnlQYXJhbXMgJiYgb3B0aW9ucy5xdWVyeVBhcmFtcy5waXBlKG1hcChwYXJhbXMgPT4gY29udmVydFRvUGFyYW1NYXAocGFyYW1zKSkpLFxuICAgIGZyYWdtZW50OiBvcHRpb25zLmZyYWdtZW50LFxuICAgIGRhdGE6IG9wdGlvbnMuZGF0YSxcbiAgICBvdXRsZXQ6IG9wdGlvbnMub3V0bGV0LFxuICAgIGNvbXBvbmVudDogb3B0aW9ucy5jb21wb25lbnQsXG4gICAgc25hcHNob3Q6IG9wdGlvbnMuc25hcHNob3QsXG4gICAgcm91dGVDb25maWc6IG9wdGlvbnMucm91dGVDb25maWcsXG4gICAgcm9vdDogb3B0aW9ucy5yb290LFxuICAgIHBhcmVudDogb3B0aW9ucy5wYXJlbnQsXG4gICAgZmlyc3RDaGlsZDogb3B0aW9ucy5maXJzdENoaWxkLFxuICAgIGNoaWxkcmVuOiBvcHRpb25zLmNoaWxkcmVuLFxuICAgIHBhdGhGcm9tUm9vdDogb3B0aW9ucy5wYXRoRnJvbVJvb3RcbiAgfSBhcyBBY3RpdmF0ZWRSb3V0ZTtcblxuICBmb3IgKGxldCByb3V0ZTogbnVsbCB8IEFjdGl2YXRlZFJvdXRlID0gcmVzdWx0OyByb3V0ZTsgcm91dGUgPSByb3V0ZS5wYXJlbnQpIHtcbiAgICBpZiAocm91dGUucGFyZW50ICYmIHJvdXRlLnBhcmVudC5zbmFwc2hvdCAmJiAhcm91dGUuc25hcHNob3QpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICAgICAgcm91dGUuc25hcHNob3QgPSBmYWtlU25hcHNob3Qoe30pO1xuICAgIH1cbiAgICBpZiAocm91dGUucGFyZW50ICYmIHJvdXRlLnBhcmVudC5zbmFwc2hvdCAmJiAhcm91dGUuc25hcHNob3QucGFyZW50KSB7XG4gICAgICAocm91dGUuc25hcHNob3QgYXMgT21pdDxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCAncGFyZW50Jz4gJiB7IHBhcmVudDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB9KS5wYXJlbnQgPSByb3V0ZS5wYXJlbnQuc25hcHNob3Q7XG4gICAgfVxuXG4gICAgaWYgKHJvdXRlLnNuYXBzaG90ICYmIHJvdXRlLnNuYXBzaG90LnBhcmVudCAmJiAhcm91dGUucGFyZW50KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgIChyb3V0ZSBhcyBPbWl0PEFjdGl2YXRlZFJvdXRlLCAncGFyZW50Jz4gJiB7IHBhcmVudDogQWN0aXZhdGVkUm91dGUgfSkucGFyZW50ID0gZmFrZVJvdXRlKHt9KTtcbiAgICB9XG4gICAgaWYgKHJvdXRlLnNuYXBzaG90ICYmIHJvdXRlLnNuYXBzaG90LnBhcmVudCAmJiByb3V0ZS5wYXJlbnQgJiYgIXJvdXRlLnBhcmVudC5zbmFwc2hvdCkge1xuICAgICAgcm91dGUucGFyZW50LnNuYXBzaG90ID0gcm91dGUuc25hcHNob3QucGFyZW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZha2UgcGFydGlhbCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IGZvciB0ZXN0cy5cbiAqXG4gKiBJZiB5b3UgcGFzcyBwYXJhbXMsIHRoZW4gdGhlIGNyZWF0ZWQgc25hcHNob3QncyBwYXJhbU1hcCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLlxuICogVGhlIHNhbWUgZ29lcyBmb3IgcXVlcnlQYXJhbXMgYW5kIHF1ZXJ5UGFyYW1NYXAuXG4gKlxuICogQHJldHVybnMgYSBwYXJ0aWFsbHkgcG9wdWxhdGVkLCBmYWtlIEFjdGl2YXRlZFJvdXRlLCBkZXBlbmRpbmcgb24gd2hhdCB5b3UgcGFzc2VkIGluXG4gKiBAZGVwcmVjYXRlZCBmYXZvciBzdHViUm91dGUsIHdoaWNoIGNyZWF0ZXMgYW4gZWFzaWVyIHRvIHVzZSBhbmQgbW9yZSBsb2dpY2FsIHN0dWIgZm9yIGJvdGggdGhlIHJvdXRlIGFuZCBpdHMgc25hcHNob3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZha2VTbmFwc2hvdChvcHRpb25zOiB7XG4gIHVybD86IFVybFNlZ21lbnRbXTtcbiAgLyoqIFRoZSBtYXRyaXggcGFyYW1ldGVycyBzY29wZWQgdG8gdGhpcyByb3V0ZSAqL1xuICBwYXJhbXM/OiBQYXJhbXM7XG4gIC8qKiBUaGUgcXVlcnkgcGFyYW1ldGVycyBzaGFyZWQgYnkgYWxsIHRoZSByb3V0ZXMgKi9cbiAgcXVlcnlQYXJhbXM/OiBQYXJhbXM7XG4gIC8qKiBUaGUgVVJMIGZyYWdtZW50IHNoYXJlZCBieSBhbGwgdGhlIHJvdXRlcyAqL1xuICBmcmFnbWVudD86IHN0cmluZztcbiAgLyoqIFRoZSBzdGF0aWMgYW5kIHJlc29sdmVkIGRhdGEgb2YgdGhpcyByb3V0ZSAqL1xuICBkYXRhPzogRGF0YTtcbiAgLyoqIFRoZSBvdXRsZXQgbmFtZSBvZiB0aGUgcm91dGUgKi9cbiAgb3V0bGV0Pzogc3RyaW5nO1xuICAvKiogVGhlIGNvbXBvbmVudCBvZiB0aGUgcm91dGUgKi9cbiAgY29tcG9uZW50PzogVHlwZTx1bmtub3duPiB8IHN0cmluZyB8IG51bGw7XG4gIC8qKiBUaGUgY29uZmlndXJhdGlvbiB1c2VkIHRvIG1hdGNoIHRoaXMgcm91dGUgKi9cbiAgcm91dGVDb25maWc/OiBSb3V0ZTtcbiAgLyoqIFRoZSByb290IG9mIHRoZSByb3V0ZXIgc3RhdGUgKi9cbiAgcm9vdD86IEFjdGl2YXRlZFJvdXRlU25hcHNob3Q7XG4gIC8qKiBUaGUgcGFyZW50IG9mIHRoaXMgcm91dGUgaW4gdGhlIHJvdXRlciBzdGF0ZSB0cmVlICovXG4gIHBhcmVudD86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsO1xuICAvKiogVGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgcm91dGUgaW4gdGhlIHJvdXRlciBzdGF0ZSB0cmVlICovXG4gIGZpcnN0Q2hpbGQ/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbDtcbiAgLyoqIFRoZSBjaGlsZHJlbiBvZiB0aGlzIHJvdXRlIGluIHRoZSByb3V0ZXIgc3RhdGUgdHJlZSAqL1xuICBjaGlsZHJlbj86IEFjdGl2YXRlZFJvdXRlU25hcHNob3RbXTtcbiAgLyoqIFRoZSBwYXRoIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHJvdXRlciBzdGF0ZSB0cmVlIHRvIHRoaXMgcm91dGUgKi9cbiAgcGF0aEZyb21Sb290PzogQWN0aXZhdGVkUm91dGVTbmFwc2hvdFtdO1xufSk6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Qge1xuICByZXR1cm4ge1xuICAgIHVybDogb3B0aW9ucy51cmwsXG4gICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICBwYXJhbU1hcDogb3B0aW9ucy5wYXJhbXMgJiYgY29udmVydFRvUGFyYW1NYXAob3B0aW9ucy5wYXJhbXMpLFxuICAgIHF1ZXJ5UGFyYW1zOiBvcHRpb25zLnF1ZXJ5UGFyYW1zLFxuICAgIHF1ZXJ5UGFyYW1NYXA6IG9wdGlvbnMucXVlcnlQYXJhbXMgJiYgY29udmVydFRvUGFyYW1NYXAob3B0aW9ucy5xdWVyeVBhcmFtcyksXG4gICAgZnJhZ21lbnQ6IG9wdGlvbnMuZnJhZ21lbnQsXG4gICAgZGF0YTogb3B0aW9ucy5kYXRhLFxuICAgIG91dGxldDogb3B0aW9ucy5vdXRsZXQsXG4gICAgY29tcG9uZW50OiBvcHRpb25zLmNvbXBvbmVudCxcbiAgICByb3V0ZUNvbmZpZzogb3B0aW9ucy5yb3V0ZUNvbmZpZyxcbiAgICByb290OiBvcHRpb25zLnJvb3QsXG4gICAgcGFyZW50OiBvcHRpb25zLnBhcmVudCxcbiAgICBmaXJzdENoaWxkOiBvcHRpb25zLmZpcnN0Q2hpbGQsXG4gICAgY2hpbGRyZW46IG9wdGlvbnMuY2hpbGRyZW4sXG4gICAgcGF0aEZyb21Sb290OiBvcHRpb25zLnBhdGhGcm9tUm9vdFxuICB9IGFzIEFjdGl2YXRlZFJvdXRlU25hcHNob3Q7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHdoZW4gY3JlYXRpbmcgYW4gQWN0aXZhdGVkUm91dGVTdHViLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2YXRlZFJvdXRlU3R1Yk9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgcGFyYW1zPzogUGFyYW1zO1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgcXVlcnlQYXJhbXM/OiBQYXJhbXM7XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGRhdGEgb2YgdGhlIHJvdXRlXG4gICAqL1xuICBkYXRhPzogRGF0YTtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIGZyYWdtZW50IG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgZnJhZ21lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgdXJsIG9mIHRoZSByb3V0ZVxuICAgKi9cbiAgdXJsPzogVXJsU2VnbWVudFtdO1xuICAvKipcbiAgICogVGhlIHBhcmVudCBvZiB0aGUgcm91dGVcbiAgICovXG4gIHBhcmVudD86IEFjdGl2YXRlZFJvdXRlU3R1YiB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgY2hpbGQgb2YgdGhlIHJvdXRlXG4gICAqL1xuICBmaXJzdENoaWxkPzogQWN0aXZhdGVkUm91dGVTdHViIHwgbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBjaGlsZHJlbiBvZiB0aGUgcm91dGVcbiAgICovXG4gIGNoaWxkcmVuPzogQWN0aXZhdGVkUm91dGVTdHViW10gfCBudWxsO1xuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHJvdXRlXG4gICAqL1xuICByb3V0ZUNvbmZpZz86IFJvdXRlIHwgbnVsbDtcbn1cblxuY2xhc3MgQWN0aXZhdGVkUm91dGVTbmFwc2hvdFN0dWIgZXh0ZW5kcyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgcHJpdmF0ZSBfcGFyZW50OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3Jvb3Q6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Q7XG4gIHByaXZhdGUgX2ZpcnN0Q2hpbGQ6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfY2hpbGRyZW46IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+ID0gW107XG4gIHByaXZhdGUgX3BhdGhGcm9tUm9vdDogQXJyYXk8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD4gPSBbXTtcbiAgcHJpdmF0ZSBfcm91dGVDb25maWc6IFJvdXRlIHwgbnVsbCA9IG51bGw7XG5cbiAgZ2V0IHBhcmVudCgpOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuXG4gIHNldCBwYXJlbnQodmFsdWU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsKSB7XG4gICAgdGhpcy5fcGFyZW50ID0gdmFsdWU7XG4gIH1cblxuICBnZXQgcm9vdCgpOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdDtcbiAgfVxuXG4gIHNldCByb290KHZhbHVlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KSB7XG4gICAgdGhpcy5fcm9vdCA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGZpcnN0Q2hpbGQoKTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9maXJzdENoaWxkO1xuICB9XG5cbiAgc2V0IGZpcnN0Q2hpbGQodmFsdWU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfCBudWxsKSB7XG4gICAgdGhpcy5fZmlyc3RDaGlsZCA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGNoaWxkcmVuKCk6IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW47XG4gIH1cblxuICBzZXQgY2hpbGRyZW4odmFsdWU6IEFycmF5PEFjdGl2YXRlZFJvdXRlU25hcHNob3Q+KSB7XG4gICAgdGhpcy5fY2hpbGRyZW4gPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBwYXRoRnJvbVJvb3QoKTogQXJyYXk8QWN0aXZhdGVkUm91dGVTbmFwc2hvdD4ge1xuICAgIHJldHVybiB0aGlzLl9wYXRoRnJvbVJvb3Q7XG4gIH1cblxuICBzZXQgcGF0aEZyb21Sb290KHZhbHVlOiBBcnJheTxBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90Pikge1xuICAgIHRoaXMuX3BhdGhGcm9tUm9vdCA9IHZhbHVlO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAvLyBAdHMtaWdub3JlXG4gIGdldCByb3V0ZUNvbmZpZygpOiBSb3V0ZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yb3V0ZUNvbmZpZztcbiAgfVxuXG4gIHNldCByb3V0ZUNvbmZpZyhyb3V0ZTogUm91dGUgfCBudWxsKSB7XG4gICAgdGhpcy5fcm91dGVDb25maWcgPSByb3V0ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcm9vdCA9IHRoaXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHN0dWIgZm9yIEFjdGl2YXRlZFJvdXRlLiBJdCBiZWhhdmVzIGFsbW9zdCB0aGUgc2FtZSB3YXkgYXMgdGhlIGFjdHVhbCBBY3RpdmF0ZWRSb3V0ZSwgZXhwb3NpbmcgYSBzbmFwc2hvdFxuICogYW5kIG9ic2VydmFibGVzIGZvciB0aGUgcGFyYW1zLCBxdWVyeSBwYXJhbXMgZXRjLiwgd2hpY2ggYXJlIGtlcHQgaW4gc3luYy5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgdGhpcyBzdHViIGFsbG93cyBzaW11bGF0aW5nIGEgbmF2aWdhdGlvbiBieSBjaGFuZ2luZyB0aGUgcGFyYW1zLCB0aGUgcXVlcnkgcGFyYW1zLCB0aGUgZnJhZ21lbnQsIGV0Yy5cbiAqIFdoZW4gdGhhdCBoYXBwZW5zLCB0aGUgc25hcHNob3QgaXMgbW9kaWZpZWQsIHRoZW4gdGhlIHJlbGV2YW50IG9ic2VydmFibGVzIGVtaXQgdGhlIG5ldyB2YWx1ZXMuXG4gKlxuICogVGhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgZG9uJ3QgcmVhbGx5IHdvcmsgdGhlIHNhbWUgd2F5IGFzIHRoZSByZWFsIEFjdGl2YXRlZFJvdXRlIHRob3VnaDpcbiAqIC0gdGhlIGhhbmRsaW5nIG9mIHRoZSBmaXJzdENoaWxkIGFuZCBvZiB0aGUgY2hpbGRyZW4gaXMgZW50aXJlbHkgdW5kZXIgdGhlIHRlc3RlcidzIHJlc3BvbnNpYmlsaXR5LiBTZXR0aW5nIHRoZSBwYXJlbnRcbiAqICAgb2YgYSByb3V0ZSBzdHViIGRvZXMgbm90IGFkZCB0aGlzIHJvdXRlIHRvIHRoZSBjaGlsZHJlbiBvZiBpdHMgcGFyZW50LCBmb3IgZXhhbXBsZS5cbiAqIC0gd2hlbiBjaGFuZ2luZyB0aGUgcGFyYW1zLCBxdWVyeSBwYXJhbXMsIGZyYWdtZW50LCBldGMuLCB0aGVpciBhc3NvY2lhdGVkIG9ic2VydmFibGUgZW1pdHMgdW5jb25kaXRpb25hbGx5LCBpbnN0ZWFkIG9mXG4gKiAgIGZpcnN0IGNoZWNraW5nIGlmIHRoZSB2YWx1ZSBpcyBhY3R1YWxseSBkaWZmZXJlbnQgZnJvbSBiZWZvcmUuIEl0J3MgdGh1cyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHRlc3RlciB0byBub3RcbiAqICAgY2hhbmdlIHRoZSB2YWx1ZXMgaWYgdGhleSdyZSB0aGUgc2FtZSBhcyBiZWZvcmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3RpdmF0ZWRSb3V0ZVN0dWIgZXh0ZW5kcyBBY3RpdmF0ZWRSb3V0ZSB7XG4gIHByaXZhdGUgX2ZpcnN0Q2hpbGQ6IEFjdGl2YXRlZFJvdXRlU3R1YiB8IG51bGw7XG4gIHByaXZhdGUgX2NoaWxkcmVuOiBBcnJheTxBY3RpdmF0ZWRSb3V0ZVN0dWI+O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFBhcmFtcz47XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVlcnlQYXJhbXNTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8UGFyYW1zPjtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PERhdGE+O1xuICBwcml2YXRlIHJlYWRvbmx5IGZyYWdtZW50U3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+O1xuICBwcml2YXRlIHJlYWRvbmx5IHVybFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxBcnJheTxVcmxTZWdtZW50Pj47XG5cbiAgcHJpdmF0ZSBfcGFyZW50OiBBY3RpdmF0ZWRSb3V0ZVN0dWIgfCBudWxsO1xuICBwcml2YXRlIF9yb290OiBBY3RpdmF0ZWRSb3V0ZVN0dWI7XG4gIHByaXZhdGUgX3BhdGhGcm9tUm9vdDogQXJyYXk8QWN0aXZhdGVkUm91dGVTdHViPjtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSwgYmFzZWQgb24gdGhlIGdpdmVuIG9wdGlvbnMuXG4gICAqIElmIGFuIG9wdGlvbiBpcyBub3QgcHJvdmlkZWQgKG9yIGlmIG5vIG9wdGlvbiBpcyBwcm92aWRlZCBhdCBhbGwpLCB0aGVuIHRoZSByb3V0ZSBoYXMgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIG9wdGlvblxuICAgKiAoZW1wdHkgcGFyYW1ldGVycyBmb3IgZXhhbXBsZSwgbnVsbCBmcmFnbWVudCwgZXRjLilcbiAgICogSWYgbm8gcGFyZW50IGlzIHBhc3NlZCwgdGhlbiB0aGlzIHJvdXRlIGhhcyBubyBwYXJlbnQgYW5kIGlzIHRodXMgc2V0IGFzIHRoZSByb290LiBPdGhlcndpc2UsIHRoZSByb290IGFuZCB0aGUgcGF0aFxuICAgKiBmcm9tIHJvb3QgYXJlIGNyZWF0ZWQgYmFzZWQgb24gdGhlIHJvb3QgYW5kIHBhdGggZnJvbSByb290IG9mIHRoZSBnaXZlbiBwYXJlbnQgcm91dGUuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogQWN0aXZhdGVkUm91dGVTdHViT3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBzbmFwc2hvdCA9IG5ldyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90U3R1YigpO1xuICAgIHRoaXMuc25hcHNob3QgPSBzbmFwc2hvdDtcblxuICAgIHRoaXMuX2ZpcnN0Q2hpbGQgPSBvcHRpb25zPy5maXJzdENoaWxkID8/IG51bGw7XG4gICAgdGhpcy5fY2hpbGRyZW4gPSBvcHRpb25zPy5jaGlsZHJlbiA/PyBbXTtcbiAgICB0aGlzLl9wYXJlbnQgPSBvcHRpb25zPy5wYXJlbnQgPz8gbnVsbDtcbiAgICB0aGlzLl9yb290ID0gdGhpcy5wYXJlbnQ/LnJvb3QgPz8gdGhpcztcbiAgICB0aGlzLl9wYXRoRnJvbVJvb3QgPSB0aGlzLnBhcmVudCA/IFsuLi50aGlzLnBhcmVudC5wYXRoRnJvbVJvb3QsIHRoaXNdIDogW3RoaXNdO1xuXG4gICAgc25hcHNob3QucGFyYW1zID0gb3B0aW9ucz8ucGFyYW1zID8/IHt9O1xuICAgIHNuYXBzaG90LnF1ZXJ5UGFyYW1zID0gb3B0aW9ucz8ucXVlcnlQYXJhbXMgPz8ge307XG4gICAgc25hcHNob3QuZGF0YSA9IG9wdGlvbnM/LmRhdGEgPz8ge307XG4gICAgc25hcHNob3QuZnJhZ21lbnQgPSBvcHRpb25zPy5mcmFnbWVudCA/PyBudWxsO1xuICAgIHNuYXBzaG90LnVybCA9IG9wdGlvbnM/LnVybCA/PyBbXTtcbiAgICBzbmFwc2hvdC5yb3V0ZUNvbmZpZyA9IG9wdGlvbnM/LnJvdXRlQ29uZmlnID8/IG51bGw7XG5cbiAgICBzbmFwc2hvdC5maXJzdENoaWxkID0gdGhpcy5maXJzdENoaWxkPy5zbmFwc2hvdCA/PyBudWxsO1xuICAgIHNuYXBzaG90LmNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbj8ubWFwKHJvdXRlID0+IHJvdXRlLnNuYXBzaG90KSA/PyBbXTtcbiAgICBzbmFwc2hvdC5wYXJlbnQgPSB0aGlzLnBhcmVudD8uc25hcHNob3QgPz8gbnVsbDtcbiAgICBzbmFwc2hvdC5yb290ID0gdGhpcy5yb290LnNuYXBzaG90O1xuICAgIHNuYXBzaG90LnBhdGhGcm9tUm9vdCA9IHRoaXMucGF0aEZyb21Sb290Lm1hcChyb3V0ZSA9PiByb3V0ZS5zbmFwc2hvdCk7XG5cbiAgICB0aGlzLnBhcmFtc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhcmFtcz4odGhpcy5zbmFwc2hvdC5wYXJhbXMpO1xuICAgIHRoaXMucXVlcnlQYXJhbXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQYXJhbXM+KHRoaXMuc25hcHNob3QucXVlcnlQYXJhbXMpO1xuICAgIHRoaXMuZGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGE+KHRoaXMuc25hcHNob3QuZGF0YSk7XG4gICAgdGhpcy5mcmFnbWVudFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyB8IG51bGw+KHRoaXMuc25hcHNob3QuZnJhZ21lbnQpO1xuICAgIHRoaXMudXJsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXJyYXk8VXJsU2VnbWVudD4+KHRoaXMuc25hcHNob3QudXJsKTtcblxuICAgIHRoaXMucGFyYW1zID0gdGhpcy5wYXJhbXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMucXVlcnlQYXJhbXMgPSB0aGlzLnF1ZXJ5UGFyYW1zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuZnJhZ21lbnQgPSB0aGlzLmZyYWdtZW50U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnVybCA9IHRoaXMudXJsU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGdldCByb290KCkge1xuICAgIHJldHVybiB0aGlzLl9yb290O1xuICB9XG5cbiAgZ2V0IHBhcmVudCgpOiBBY3RpdmF0ZWRSb3V0ZVN0dWIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50O1xuICB9XG5cbiAgZ2V0IHBhdGhGcm9tUm9vdCgpOiBBcnJheTxBY3RpdmF0ZWRSb3V0ZVN0dWI+IHtcbiAgICByZXR1cm4gdGhpcy5fcGF0aEZyb21Sb290O1xuICB9XG5cbiAgZ2V0IGZpcnN0Q2hpbGQoKTogQWN0aXZhdGVkUm91dGVTdHViIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBnZXQgY2hpbGRyZW4oKTogQXJyYXk8QWN0aXZhdGVkUm91dGVTdHViPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICB9XG5cbiAgZ2V0IHJvdXRlQ29uZmlnKCk6IFJvdXRlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc25hcHNob3Qucm91dGVDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdpdGggdGhlIGdpdmVuIG5ldyBwYXJhbWV0ZXJzLiBBbGwgdGhlIG90aGVyIHBhcnRzIChxdWVyeSBwYXJhbXMgZXRjLikgc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIHRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIHNldFBhcmFtcyhwYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgIHRoaXMudHJpZ2dlck5hdmlnYXRpb24oeyBwYXJhbXMgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdpdGggdGhlIGdpdmVuIG5ldyBwYXJhbWV0ZXIuIFRoZSBvdGhlciBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIGFsbCB0aGUgb3RoZXIgcGFydHMgKHF1ZXJ5IHBhcmFtcyBldGMuKVxuICAgKiBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2Ugb25lIHBhcmFtZXRlci5cbiAgICovXG4gIHB1YmxpYyBzZXRQYXJhbShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFBhcmFtcyh7IC4uLnRoaXMuc25hcHNob3QucGFyYW1zLCBbbmFtZV06IHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgcXVlcnkgcGFyYW1ldGVycy4gQWxsIHRoZSBvdGhlciBwYXJ0cyAocGFyYW1zIGV0Yy4pIHN0YXkgYXMgdGhlIGFyZS5cbiAgICogVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGB0cmlnZ2VyTmF2aWdhdGlvbmAgdGhhdCBjYW4gYmUgdXNlZCB0byBvbmx5IGNoYW5nZSB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBzZXRRdWVyeVBhcmFtcyhxdWVyeVBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyTmF2aWdhdGlvbih7IHF1ZXJ5UGFyYW1zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgcGFyYW1ldGVyLiBUaGUgb3RoZXIgcXVlcnkgcGFyYW1ldGVycywgYXMgd2VsbCBhcyBhbGwgdGhlIG90aGVyIHBhcnRzIChwYXJhbXMgZXRjLilcbiAgICogc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIG9uZSBxdWVyeSBwYXJhbWV0ZXIuXG4gICAqL1xuICBwdWJsaWMgc2V0UXVlcnlQYXJhbShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFF1ZXJ5UGFyYW1zKHsgLi4udGhpcy5zbmFwc2hvdC5xdWVyeVBhcmFtcywgW25hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIG5hdmlnYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmV3IGRhdGEuIFRoZSBvdGhlciBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIGFsbCB0aGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKVxuICAgKiBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2UgdGhlIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgc2V0RGF0YShkYXRhOiBEYXRhKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyTmF2aWdhdGlvbih7IGRhdGEgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBuYXZpZ2F0aW9uIHdpdGggdGhlIGdpdmVuIG5ldyBkYXRhIGl0ZW0uIFRoZSBvdGhlciBkYXRhLCBhcyB3ZWxsIGFzIGFsbCB0aGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKVxuICAgKiBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2Ugb25lIGRhdGEgaXRlbS5cbiAgICovXG4gIHB1YmxpYyBzZXREYXRhSXRlbShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRhKHsgLi4udGhpcy5zbmFwc2hvdC5kYXRhLCBbbmFtZV06IHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgZnJhZ21lbnQuIFRoZSBvdGhlciBwYXJ0cyAocGFyYW1zIGV0Yy4pICBzdGF5IGFzIHRoZSBhcmUuXG4gICAqIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBgdHJpZ2dlck5hdmlnYXRpb25gIHRoYXQgY2FuIGJlIHVzZWQgdG8gb25seSBjaGFuZ2UgdGhlIGZyYWdtZW50LlxuICAgKi9cbiAgcHVibGljIHNldEZyYWdtZW50KGZyYWdtZW50OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy50cmlnZ2VyTmF2aWdhdGlvbih7IGZyYWdtZW50IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiB3aXRoIHRoZSBnaXZlbiBuZXcgdXJsLiBUaGUgb3RoZXIgcGFydHMgKHBhcmFtcyBldGMuKSAgc3RheSBhcyB0aGUgYXJlLlxuICAgKiBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYHRyaWdnZXJOYXZpZ2F0aW9uYCB0aGF0IGNhbiBiZSB1c2VkIHRvIG9ubHkgY2hhbmdlIHRoZSB1cmwuXG4gICAqL1xuICBwdWJsaWMgc2V0VXJsKHVybDogQXJyYXk8VXJsU2VnbWVudD4pOiB2b2lkIHtcbiAgICB0aGlzLnRyaWdnZXJOYXZpZ2F0aW9uKHsgdXJsIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgbmF2aWdhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gb3B0aW9ucy4gSWYgYW4gb3B0aW9uIGlzIHVuZGVmaW5lZCBvciBudWxsLCBpdCdzIGlnbm9yZWQuIEV4Y2VwdCBmb3IgZnJhZ21lbnQsIHdoaWNoIGlzIG9ubHlcbiAgICogaWdub3JlZCBpZiBpdCdzIHVuZGVmaW5lZCwgYmVjYXVzZSBudWxsIGlzIGEgdmFsaWQgdmFsdWUgZm9yIGEgZnJhZ21lbnQuXG4gICAqXG4gICAqIFRoZSBub24taWdub3JlZCB2YWx1ZXMgYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSBzbmFwc2hvdCBvZiB0aGUgcm91dGUuIE9uY2UgdGhlIHNuYXBzaG90IGhhcyBiZWVuIG1vZGlmaWVkLFxuICAgKiB0aGUgb2JzZXJ2YWJsZXMgY29ycmVzcG9uZGluZyB0byB0aGUgdXBkYXRlZCBwYXJ0cyBlbWl0IHRoZSBuZXcgdmFsdWUuXG4gICAqXG4gICAqIFNvLCBzZXR0aW5nIHBhcmFtcyBhbmQgcXVlcnkgcGFyYW1zIHdpbGwgbWFrZSB0aGUgcGFyYW1zIGFuZCBxdWVyeVBhcmFtcyBvYnNlcnZhYmxlcyBlbWl0LCBidXQgbm90IHRoZSBmcmFnbWVudCwgZGF0YSBhbmRcbiAgICogdXJsIG9ic2VydmFibGVzIGZvciBleGFtcGxlLiBUaGlzIGlzIGNvbnNpc3RlbnQgdG8gaG93IHRoZSByb3V0ZXIgYmVoYXZlcy5cbiAgICovXG4gIHB1YmxpYyB0cmlnZ2VyTmF2aWdhdGlvbihvcHRpb25zOiB7XG4gICAgcGFyYW1zPzogUGFyYW1zO1xuICAgIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAgIGZyYWdtZW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBkYXRhPzogRGF0YSB8IG51bGw7XG4gICAgdXJsPzogQXJyYXk8VXJsU2VnbWVudD4gfCBudWxsO1xuICB9KTogdm9pZCB7XG4gICAgLy8gc2V0IHRoZSBzbmFwc2hvdCBmaXJzdFxuICAgIGlmIChvcHRpb25zLnBhcmFtcykge1xuICAgICAgdGhpcy5zbmFwc2hvdC5wYXJhbXMgPSBvcHRpb25zLnBhcmFtcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMucXVlcnlQYXJhbXMpIHtcbiAgICAgIHRoaXMuc25hcHNob3QucXVlcnlQYXJhbXMgPSBvcHRpb25zLnF1ZXJ5UGFyYW1zO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5mcmFnbWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNuYXBzaG90LmZyYWdtZW50ID0gb3B0aW9ucy5mcmFnbWVudDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgdGhpcy5zbmFwc2hvdC5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy51cmwpIHtcbiAgICAgIHRoaXMuc25hcHNob3QudXJsID0gb3B0aW9ucy51cmw7XG4gICAgfVxuXG4gICAgLy8gdGhlbiBlbWl0IGV2ZXJ5dGhpbmcgdGhhdCBoYXMgY2hhbmdlZFxuICAgIGlmIChvcHRpb25zLnBhcmFtcykge1xuICAgICAgdGhpcy5wYXJhbXNTdWJqZWN0Lm5leHQodGhpcy5zbmFwc2hvdC5wYXJhbXMpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5xdWVyeVBhcmFtcykge1xuICAgICAgdGhpcy5xdWVyeVBhcmFtc1N1YmplY3QubmV4dCh0aGlzLnNuYXBzaG90LnF1ZXJ5UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZnJhZ21lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5mcmFnbWVudFN1YmplY3QubmV4dCh0aGlzLnNuYXBzaG90LmZyYWdtZW50KTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KHRoaXMuc25hcHNob3QuZGF0YSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnVybCkge1xuICAgICAgdGhpcy51cmxTdWJqZWN0Lm5leHQodGhpcy5zbmFwc2hvdC51cmwpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiAnQWN0aXZhdGVkUm91dGVTdHViJztcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgQWN0aXZhdGVkUm91dGVTdHViLCBieSBjYWxsaW5nIGl0cyBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0dWJSb3V0ZShvcHRpb25zPzogQWN0aXZhdGVkUm91dGVTdHViT3B0aW9ucyk6IEFjdGl2YXRlZFJvdXRlU3R1YiB7XG4gIHJldHVybiBuZXcgQWN0aXZhdGVkUm91dGVTdHViKG9wdGlvbnMpO1xufVxuIl19
@@ -0,0 +1,140 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { TestButton } from './test-button';
3
+ import { TestSelect } from './test-select';
4
+ import { TestElement } from './test-element';
5
+ import { TestTextArea } from './test-textarea';
6
+ import { TestInput } from './test-input';
7
+ import { TestHtmlElement } from './test-html-element';
8
+ import { By } from '@angular/platform-browser';
9
+ /**
10
+ * @internal
11
+ */
12
+ export class TestElementQuerier {
13
+ constructor(tester, root) {
14
+ this.tester = tester;
15
+ this.root = root;
16
+ }
17
+ static wrap(childDebugElement, tester) {
18
+ const childElement = childDebugElement.nativeElement;
19
+ if (childElement instanceof HTMLButtonElement) {
20
+ return new TestButton(tester, childDebugElement);
21
+ }
22
+ else if (childElement instanceof HTMLInputElement) {
23
+ return new TestInput(tester, childDebugElement);
24
+ }
25
+ else if (childElement instanceof HTMLSelectElement) {
26
+ return new TestSelect(tester, childDebugElement);
27
+ }
28
+ else if (childElement instanceof HTMLTextAreaElement) {
29
+ return new TestTextArea(tester, childDebugElement);
30
+ }
31
+ else if (childElement instanceof HTMLElement) {
32
+ return new TestHtmlElement(tester, childDebugElement);
33
+ }
34
+ else {
35
+ return new TestElement(tester, childDebugElement);
36
+ }
37
+ }
38
+ /**
39
+ * Gets the first element matching the given selector and wraps it into a TestElement. The actual type
40
+ * of the returned value is the TestElement subclass matching the type of the found element. So, if the
41
+ * matched element is an input for example, the method will return a TestInput. You can thus use
42
+ * `tester.element('#some-input') as TestInput`.
43
+ * @param selector a CSS or directive selector
44
+ * @returns the wrapped element, or null if no element matches the selector.
45
+ */
46
+ element(selector) {
47
+ const childElement = this.query(selector);
48
+ return childElement && TestElementQuerier.wrap(childElement, this.tester);
49
+ }
50
+ /**
51
+ * Gets all the elements matching the given selector and wraps them into a TestElement. The actual type
52
+ * of the returned elements is the TestElement subclass matching the type of the found element. So, if the
53
+ * matched elements are inputs for example, the method will return an array of TestInput. You can thus use
54
+ * `tester.elements('input') as Array<TestInput>`.
55
+ * @param selector a CSS or directive selector
56
+ * @returns the array of matched elements, empty if no element was matched
57
+ */
58
+ elements(selector) {
59
+ const childElements = this.queryAll(selector);
60
+ return childElements.map(debugElement => TestElementQuerier.wrap(debugElement, this.tester));
61
+ }
62
+ /**
63
+ * Gets the first input matched by the given selector. Throws an Error if the matched element isn't actually an input.
64
+ * @param selector a CSS or directive selector
65
+ * @returns the wrapped input, or null if no element was matched
66
+ */
67
+ input(selector) {
68
+ const childElement = this.query(selector);
69
+ if (!childElement) {
70
+ return null;
71
+ }
72
+ else if (!(childElement.nativeElement instanceof HTMLInputElement)) {
73
+ throw new Error(`Element with selector ${selector} is not an HTMLInputElement`);
74
+ }
75
+ return new TestInput(this.tester, childElement);
76
+ }
77
+ /**
78
+ * Gets the first select matched by the given selector. Throws an Error if the matched element isn't actually a select.
79
+ * @param selector a CSS or directive selector
80
+ * @returns the wrapped select, or null if no element was matched
81
+ */
82
+ select(selector) {
83
+ const childElement = this.query(selector);
84
+ if (!childElement) {
85
+ return null;
86
+ }
87
+ else if (!(childElement.nativeElement instanceof HTMLSelectElement)) {
88
+ throw new Error(`Element with selector ${selector} is not an HTMLSelectElement`);
89
+ }
90
+ return new TestSelect(this.tester, childElement);
91
+ }
92
+ /**
93
+ * Gets the first textarea matched by the given selector
94
+ * @param selector a CSS or directive selector
95
+ * @returns the wrapped textarea, or null if no element was matched. Throws an Error if the matched element isn't actually a textarea.
96
+ * @throws {Error} if the matched element isn't actually a textarea
97
+ */
98
+ textarea(selector) {
99
+ const childElement = this.query(selector);
100
+ if (!childElement) {
101
+ return null;
102
+ }
103
+ else if (!(childElement.nativeElement instanceof HTMLTextAreaElement)) {
104
+ throw new Error(`Element with selector ${selector} is not an HTMLTextAreaElement`);
105
+ }
106
+ return new TestTextArea(this.tester, childElement);
107
+ }
108
+ /**
109
+ * Gets the first button matched by the given selector. Throws an Error if the matched element isn't actually a button.
110
+ * @param selector a CSS or directive selector
111
+ * @returns the wrapped button, or null if no element was matched
112
+ */
113
+ button(selector) {
114
+ const childElement = this.query(selector);
115
+ if (!childElement) {
116
+ return null;
117
+ }
118
+ else if (!(childElement.nativeElement instanceof HTMLButtonElement)) {
119
+ throw new Error(`Element with selector ${selector} is not an HTMLButtonElement`);
120
+ }
121
+ return new TestButton(this.tester, childElement);
122
+ }
123
+ query(selector) {
124
+ if (typeof selector === 'string') {
125
+ return this.root.query(By.css(selector));
126
+ }
127
+ else {
128
+ return this.root.query(By.directive(selector));
129
+ }
130
+ }
131
+ queryAll(selector) {
132
+ if (typeof selector === 'string') {
133
+ return this.root.queryAll(By.css(selector));
134
+ }
135
+ else {
136
+ return this.root.queryAll(By.directive(selector));
137
+ }
138
+ }
139
+ }
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1lbGVtZW50LXF1ZXJpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc3BlY3Vsb29zL3NyYy9saWIvdGVzdC1lbGVtZW50LXF1ZXJpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3RELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFBb0IsTUFBZ0MsRUFBVSxJQUFrQjtRQUE1RCxXQUFNLEdBQU4sTUFBTSxDQUEwQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWM7SUFBRyxDQUFDO0lBRXBGLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQStCLEVBQUUsTUFBZ0M7UUFDM0UsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsYUFBYSxDQUFDO1FBQ3JELElBQUksWUFBWSxZQUFZLGlCQUFpQixFQUFFO1lBQzdDLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDbEQ7YUFBTSxJQUFJLFlBQVksWUFBWSxnQkFBZ0IsRUFBRTtZQUNuRCxPQUFPLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1NBQ2pEO2FBQU0sSUFBSSxZQUFZLFlBQVksaUJBQWlCLEVBQUU7WUFDcEQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUNsRDthQUFNLElBQUksWUFBWSxZQUFZLG1CQUFtQixFQUFFO1lBQ3RELE9BQU8sSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDcEQ7YUFBTSxJQUFJLFlBQVksWUFBWSxXQUFXLEVBQUU7WUFDOUMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0wsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsT0FBTyxDQUFDLFFBQTRCO1FBQ2xDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsT0FBTyxZQUFZLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxRQUFRLENBQUMsUUFBNEI7UUFDbkMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxPQUFPLGFBQWEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFFBQTRCO1FBQ2hDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQztTQUNiO2FBQU0sSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsWUFBWSxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsNkJBQTZCLENBQUMsQ0FBQztTQUNqRjtRQUNELE9BQU8sSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxRQUE0QjtRQUNqQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLFlBQVksaUJBQWlCLENBQUMsRUFBRTtZQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixRQUFRLDhCQUE4QixDQUFDLENBQUM7U0FDbEY7UUFDRCxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUSxDQUFDLFFBQTRCO1FBQ25DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQztTQUNiO2FBQU0sSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsWUFBWSxtQkFBbUIsQ0FBQyxFQUFFO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsZ0NBQWdDLENBQUMsQ0FBQztTQUNwRjtRQUNELE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxRQUE0QjtRQUNqQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLFlBQVksaUJBQWlCLENBQUMsRUFBRTtZQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixRQUFRLDhCQUE4QixDQUFDLENBQUM7U0FDbEY7UUFDRCxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUE0QjtRQUN4QyxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNoQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUMxQzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRU8sUUFBUSxDQUFDLFFBQTRCO1FBQzNDLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1NBQzdDO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IFRlc3RCdXR0b24gfSBmcm9tICcuL3Rlc3QtYnV0dG9uJztcbmltcG9ydCB7IFRlc3RTZWxlY3QgfSBmcm9tICcuL3Rlc3Qtc2VsZWN0JztcbmltcG9ydCB7IFRlc3RFbGVtZW50IH0gZnJvbSAnLi90ZXN0LWVsZW1lbnQnO1xuaW1wb3J0IHsgVGVzdFRleHRBcmVhIH0gZnJvbSAnLi90ZXN0LXRleHRhcmVhJztcbmltcG9ydCB7IFRlc3RJbnB1dCB9IGZyb20gJy4vdGVzdC1pbnB1dCc7XG5pbXBvcnQgeyBUZXN0SHRtbEVsZW1lbnQgfSBmcm9tICcuL3Rlc3QtaHRtbC1lbGVtZW50JztcbmltcG9ydCB7IENvbXBvbmVudFRlc3RlciB9IGZyb20gJy4vY29tcG9uZW50LXRlc3Rlcic7XG5pbXBvcnQgeyBEZWJ1Z0VsZW1lbnQsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJ5IH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXN0RWxlbWVudFF1ZXJpZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRlc3RlcjogQ29tcG9uZW50VGVzdGVyPHVua25vd24+LCBwcml2YXRlIHJvb3Q6IERlYnVnRWxlbWVudCkge31cblxuICBzdGF0aWMgd3JhcChjaGlsZERlYnVnRWxlbWVudDogRGVidWdFbGVtZW50LCB0ZXN0ZXI6IENvbXBvbmVudFRlc3Rlcjx1bmtub3duPik6IFRlc3RFbGVtZW50IHtcbiAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSBjaGlsZERlYnVnRWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChjaGlsZEVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQnV0dG9uRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0QnV0dG9uKHRlc3RlciwgY2hpbGREZWJ1Z0VsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGRFbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0SW5wdXQodGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjaGlsZEVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0U2VsZWN0KHRlc3RlciwgY2hpbGREZWJ1Z0VsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoY2hpbGRFbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0VGV4dEFyZWEodGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjaGlsZEVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG5ldyBUZXN0SHRtbEVsZW1lbnQodGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgVGVzdEVsZW1lbnQodGVzdGVyLCBjaGlsZERlYnVnRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgbWF0Y2hpbmcgdGhlIGdpdmVuIHNlbGVjdG9yIGFuZCB3cmFwcyBpdCBpbnRvIGEgVGVzdEVsZW1lbnQuIFRoZSBhY3R1YWwgdHlwZVxuICAgKiBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIFRlc3RFbGVtZW50IHN1YmNsYXNzIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHRoZSBmb3VuZCBlbGVtZW50LiBTbywgaWYgdGhlXG4gICAqIG1hdGNoZWQgZWxlbWVudCBpcyBhbiBpbnB1dCBmb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBhIFRlc3RJbnB1dC4gWW91IGNhbiB0aHVzIHVzZVxuICAgKiBgdGVzdGVyLmVsZW1lbnQoJyNzb21lLWlucHV0JykgYXMgVGVzdElucHV0YC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIG9yIGRpcmVjdGl2ZSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB0aGUgd3JhcHBlZCBlbGVtZW50LCBvciBudWxsIGlmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXG4gICAqL1xuICBlbGVtZW50KHNlbGVjdG9yOiBzdHJpbmcgfCBUeXBlPGFueT4pOiBUZXN0RWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IHRoaXMucXVlcnkoc2VsZWN0b3IpO1xuICAgIHJldHVybiBjaGlsZEVsZW1lbnQgJiYgVGVzdEVsZW1lbnRRdWVyaWVyLndyYXAoY2hpbGRFbGVtZW50LCB0aGlzLnRlc3Rlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbGwgdGhlIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBzZWxlY3RvciBhbmQgd3JhcHMgdGhlbSBpbnRvIGEgVGVzdEVsZW1lbnQuIFRoZSBhY3R1YWwgdHlwZVxuICAgKiBvZiB0aGUgcmV0dXJuZWQgZWxlbWVudHMgaXMgdGhlIFRlc3RFbGVtZW50IHN1YmNsYXNzIG1hdGNoaW5nIHRoZSB0eXBlIG9mIHRoZSBmb3VuZCBlbGVtZW50LiBTbywgaWYgdGhlXG4gICAqIG1hdGNoZWQgZWxlbWVudHMgYXJlIGlucHV0cyBmb3IgZXhhbXBsZSwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBhbiBhcnJheSBvZiBUZXN0SW5wdXQuIFlvdSBjYW4gdGh1cyB1c2VcbiAgICogYHRlc3Rlci5lbGVtZW50cygnaW5wdXQnKSBhcyBBcnJheTxUZXN0SW5wdXQ+YC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIG9yIGRpcmVjdGl2ZSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB0aGUgYXJyYXkgb2YgbWF0Y2hlZCBlbGVtZW50cywgZW1wdHkgaWYgbm8gZWxlbWVudCB3YXMgbWF0Y2hlZFxuICAgKi9cbiAgZWxlbWVudHMoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IEFycmF5PFRlc3RFbGVtZW50PiB7XG4gICAgY29uc3QgY2hpbGRFbGVtZW50cyA9IHRoaXMucXVlcnlBbGwoc2VsZWN0b3IpO1xuICAgIHJldHVybiBjaGlsZEVsZW1lbnRzLm1hcChkZWJ1Z0VsZW1lbnQgPT4gVGVzdEVsZW1lbnRRdWVyaWVyLndyYXAoZGVidWdFbGVtZW50LCB0aGlzLnRlc3RlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpcnN0IGlucHV0IG1hdGNoZWQgYnkgdGhlIGdpdmVuIHNlbGVjdG9yLiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIG1hdGNoZWQgZWxlbWVudCBpc24ndCBhY3R1YWxseSBhbiBpbnB1dC5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIG9yIGRpcmVjdGl2ZSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB0aGUgd3JhcHBlZCBpbnB1dCwgb3IgbnVsbCBpZiBubyBlbGVtZW50IHdhcyBtYXRjaGVkXG4gICAqL1xuICBpbnB1dChzZWxlY3Rvcjogc3RyaW5nIHwgVHlwZTxhbnk+KTogVGVzdElucHV0IHwgbnVsbCB7XG4gICAgY29uc3QgY2hpbGRFbGVtZW50ID0gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgaWYgKCFjaGlsZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoIShjaGlsZEVsZW1lbnQubmF0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgd2l0aCBzZWxlY3RvciAke3NlbGVjdG9yfSBpcyBub3QgYW4gSFRNTElucHV0RWxlbWVudGApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRlc3RJbnB1dCh0aGlzLnRlc3RlciwgY2hpbGRFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaXJzdCBzZWxlY3QgbWF0Y2hlZCBieSB0aGUgZ2l2ZW4gc2VsZWN0b3IuIFRocm93cyBhbiBFcnJvciBpZiB0aGUgbWF0Y2hlZCBlbGVtZW50IGlzbid0IGFjdHVhbGx5IGEgc2VsZWN0LlxuICAgKiBAcGFyYW0gc2VsZWN0b3IgYSBDU1Mgb3IgZGlyZWN0aXZlIHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHRoZSB3cmFwcGVkIHNlbGVjdCwgb3IgbnVsbCBpZiBubyBlbGVtZW50IHdhcyBtYXRjaGVkXG4gICAqL1xuICBzZWxlY3Qoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IFRlc3RTZWxlY3QgfCBudWxsIHtcbiAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSB0aGlzLnF1ZXJ5KHNlbGVjdG9yKTtcbiAgICBpZiAoIWNoaWxkRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmICghKGNoaWxkRWxlbWVudC5uYXRpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgd2l0aCBzZWxlY3RvciAke3NlbGVjdG9yfSBpcyBub3QgYW4gSFRNTFNlbGVjdEVsZW1lbnRgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXN0U2VsZWN0KHRoaXMudGVzdGVyLCBjaGlsZEVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGZpcnN0IHRleHRhcmVhIG1hdGNoZWQgYnkgdGhlIGdpdmVuIHNlbGVjdG9yXG4gICAqIEBwYXJhbSBzZWxlY3RvciBhIENTUyBvciBkaXJlY3RpdmUgc2VsZWN0b3JcbiAgICogQHJldHVybnMgdGhlIHdyYXBwZWQgdGV4dGFyZWEsIG9yIG51bGwgaWYgbm8gZWxlbWVudCB3YXMgbWF0Y2hlZC4gVGhyb3dzIGFuIEVycm9yIGlmIHRoZSBtYXRjaGVkIGVsZW1lbnQgaXNuJ3QgYWN0dWFsbHkgYSB0ZXh0YXJlYS5cbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBtYXRjaGVkIGVsZW1lbnQgaXNuJ3QgYWN0dWFsbHkgYSB0ZXh0YXJlYVxuICAgKi9cbiAgdGV4dGFyZWEoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IFRlc3RUZXh0QXJlYSB8IG51bGwge1xuICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IHRoaXMucXVlcnkoc2VsZWN0b3IpO1xuICAgIGlmICghY2hpbGRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKCEoY2hpbGRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IHdpdGggc2VsZWN0b3IgJHtzZWxlY3Rvcn0gaXMgbm90IGFuIEhUTUxUZXh0QXJlYUVsZW1lbnRgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUZXN0VGV4dEFyZWEodGhpcy50ZXN0ZXIsIGNoaWxkRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZmlyc3QgYnV0dG9uIG1hdGNoZWQgYnkgdGhlIGdpdmVuIHNlbGVjdG9yLiBUaHJvd3MgYW4gRXJyb3IgaWYgdGhlIG1hdGNoZWQgZWxlbWVudCBpc24ndCBhY3R1YWxseSBhIGJ1dHRvbi5cbiAgICogQHBhcmFtIHNlbGVjdG9yIGEgQ1NTIG9yIGRpcmVjdGl2ZSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB0aGUgd3JhcHBlZCBidXR0b24sIG9yIG51bGwgaWYgbm8gZWxlbWVudCB3YXMgbWF0Y2hlZFxuICAgKi9cbiAgYnV0dG9uKHNlbGVjdG9yOiBzdHJpbmcgfCBUeXBlPGFueT4pOiBUZXN0QnV0dG9uIHwgbnVsbCB7XG4gICAgY29uc3QgY2hpbGRFbGVtZW50ID0gdGhpcy5xdWVyeShzZWxlY3Rvcik7XG4gICAgaWYgKCFjaGlsZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gZWxzZSBpZiAoIShjaGlsZEVsZW1lbnQubmF0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IHdpdGggc2VsZWN0b3IgJHtzZWxlY3Rvcn0gaXMgbm90IGFuIEhUTUxCdXR0b25FbGVtZW50YCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGVzdEJ1dHRvbih0aGlzLnRlc3RlciwgY2hpbGRFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcXVlcnkoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IERlYnVnRWxlbWVudCB8IG51bGwge1xuICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290LnF1ZXJ5KEJ5LmNzcyhzZWxlY3RvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290LnF1ZXJ5KEJ5LmRpcmVjdGl2ZShzZWxlY3RvcikpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcXVlcnlBbGwoc2VsZWN0b3I6IHN0cmluZyB8IFR5cGU8YW55Pik6IEFycmF5PERlYnVnRWxlbWVudD4ge1xuICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290LnF1ZXJ5QWxsKEJ5LmNzcyhzZWxlY3RvcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yb290LnF1ZXJ5QWxsKEJ5LmRpcmVjdGl2ZShzZWxlY3RvcikpO1xuICAgIH1cbiAgfVxufVxuIl19